1 /* 2 * Copyright (C) 2007 The Android Open Source Project 3 * 4 * Licensed under the Eclipse Public License, Version 1.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.eclipse.org/org/documents/epl-v10.php 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.ide.eclipse.adt.internal.editors.mock; 18 19 import org.w3c.dom.DOMException; 20 import org.w3c.dom.Document; 21 import org.w3c.dom.NamedNodeMap; 22 import org.w3c.dom.Node; 23 import org.w3c.dom.NodeList; 24 import org.w3c.dom.UserDataHandler; 25 26 import java.util.HashMap; 27 28 29 /** 30 * A mock XML node with only a minimal set of information. 31 */ 32 public class MockXmlNode implements Node { 33 34 MockNodeList mNodeList; 35 private String mLocalName; 36 private String mNamespace; 37 private short mNodeType; 38 private MockXmlNode mParent; 39 private MockXmlNode mPreviousSibling; 40 private MockXmlNode mNextSibling; 41 private String mAttrValue; 42 private MockNamedNodeMap mAttributes; 43 44 // namespace stuff only set in the root node 45 /** map from namespace to prefix. */ 46 private HashMap<String, String> mNsMap = null; 47 48 /** 49 * Constructs a node from a given children list. 50 * 51 * @param namespace The namespace of the node or null if none 52 * @param localName The XML local node name. 53 * @param node_type One of Node.xxx_NODE constants, e.g. Node.ELEMENT_NODE 54 * @param children The children list. Can be null. 55 */ MockXmlNode(String namespace, String localName, short node_type, MockXmlNode[] children)56 public MockXmlNode(String namespace, String localName, short node_type, 57 MockXmlNode[] children) { 58 mLocalName = localName; 59 mNamespace = namespace; 60 mNodeType = node_type; 61 mNodeList = new MockNodeList(children); 62 fixNavigation(); 63 } 64 65 /** 66 * Constructs an attribute node 67 * 68 * @param namespace The namespace of the node or null if none 69 * @param localName The XML local node name. 70 * @param value the value of the attribute 71 */ MockXmlNode(String namespace, String localName, String value)72 public MockXmlNode(String namespace, String localName, String value) { 73 mLocalName = localName; 74 mNamespace = namespace; 75 mAttrValue = value; 76 mNodeType = Node.ATTRIBUTE_NODE; 77 mNodeList = new MockNodeList(new MockXmlNode[0]); 78 fixNavigation(); 79 } 80 fixNavigation()81 private void fixNavigation() { 82 MockXmlNode prev = null; 83 for (MockXmlNode n : mNodeList.getArrayList()) { 84 n.mParent = this; 85 n.mPreviousSibling = prev; 86 if (prev != null) { 87 prev.mNextSibling = n; 88 } 89 n.fixNavigation(); 90 prev = n; 91 } 92 } 93 addAttributes(String namespaceURI, String localName, String value)94 public void addAttributes(String namespaceURI, String localName, String value) { 95 if (mAttributes == null) { 96 mAttributes = new MockNamedNodeMap(); 97 } 98 99 MockXmlNode node = mAttributes.addAttribute(namespaceURI, localName, value); 100 node.mParent = this; 101 } 102 setPrefix(String namespace, String prefix)103 public void setPrefix(String namespace, String prefix) { 104 if (mNsMap == null) { 105 mNsMap = new HashMap<String, String>(); 106 } 107 108 mNsMap.put(namespace, prefix); 109 } 110 getPrefix(String namespace)111 public String getPrefix(String namespace) { 112 if (mNsMap != null) { 113 return mNsMap.get(namespace); 114 } 115 116 return mParent.getPrefix(namespace); 117 } 118 119 120 // ----------- Node methods 121 122 @Override appendChild(Node newChild)123 public Node appendChild(Node newChild) throws DOMException { 124 mNodeList.getArrayList().add((MockXmlNode) newChild); 125 return newChild; 126 } 127 128 @Override getAttributes()129 public NamedNodeMap getAttributes() { 130 return mAttributes; 131 } 132 133 @Override getChildNodes()134 public NodeList getChildNodes() { 135 return mNodeList; 136 } 137 138 @Override getFirstChild()139 public Node getFirstChild() { 140 if (mNodeList.getLength() > 0) { 141 return mNodeList.item(0); 142 } 143 return null; 144 } 145 146 @Override getLastChild()147 public Node getLastChild() { 148 if (mNodeList.getLength() > 0) { 149 return mNodeList.item(mNodeList.getLength() - 1); 150 } 151 return null; 152 } 153 154 @Override getNextSibling()155 public Node getNextSibling() { 156 return mNextSibling; 157 } 158 159 @Override getNodeName()160 public String getNodeName() { 161 return mLocalName; 162 } 163 164 @Override getLocalName()165 public String getLocalName() { 166 return mLocalName; 167 } 168 169 @Override getNodeType()170 public short getNodeType() { 171 return mNodeType; 172 } 173 174 @Override getParentNode()175 public Node getParentNode() { 176 return mParent; 177 } 178 179 @Override getPreviousSibling()180 public Node getPreviousSibling() { 181 return mPreviousSibling; 182 } 183 184 @Override hasChildNodes()185 public boolean hasChildNodes() { 186 return mNodeList.getLength() > 0; 187 } 188 189 @Override hasAttributes()190 public boolean hasAttributes() { 191 throw new UnsupportedOperationException("Operation not implemented."); //$NON-NLS-1$ 192 } 193 194 @Override isSameNode(Node other)195 public boolean isSameNode(Node other) { 196 return this == other; 197 } 198 199 @Override getNodeValue()200 public String getNodeValue() throws DOMException { 201 return mAttrValue; 202 } 203 204 @Override getPrefix()205 public String getPrefix() { 206 return getPrefix(getNamespaceURI()); 207 } 208 209 @Override getNamespaceURI()210 public String getNamespaceURI() { 211 return mNamespace; 212 } 213 214 215 // --- methods not implemented --- 216 217 @Override cloneNode(boolean deep)218 public Node cloneNode(boolean deep) { 219 throw new UnsupportedOperationException("Operation not implemented."); //$NON-NLS-1$ 220 } 221 222 @Override compareDocumentPosition(Node other)223 public short compareDocumentPosition(Node other) throws DOMException { 224 throw new UnsupportedOperationException("Operation not implemented."); //$NON-NLS-1$ 225 } 226 227 @Override getBaseURI()228 public String getBaseURI() { 229 throw new UnsupportedOperationException("Operation not implemented."); //$NON-NLS-1$ 230 } 231 232 @Override getFeature(String feature, String version)233 public Object getFeature(String feature, String version) { 234 throw new UnsupportedOperationException("Operation not implemented."); //$NON-NLS-1$ 235 } 236 237 @Override getOwnerDocument()238 public Document getOwnerDocument() { 239 throw new UnsupportedOperationException("Operation not implemented."); //$NON-NLS-1$ 240 } 241 242 @Override getTextContent()243 public String getTextContent() throws DOMException { 244 throw new UnsupportedOperationException("Operation not implemented."); //$NON-NLS-1$ 245 } 246 247 @Override getUserData(String key)248 public Object getUserData(String key) { 249 throw new UnsupportedOperationException("Operation not implemented."); //$NON-NLS-1$ 250 } 251 252 @Override insertBefore(Node newChild, Node refChild)253 public Node insertBefore(Node newChild, Node refChild) 254 throws DOMException { 255 throw new UnsupportedOperationException("Operation not implemented."); //$NON-NLS-1$ 256 } 257 258 @Override isDefaultNamespace(String namespaceURI)259 public boolean isDefaultNamespace(String namespaceURI) { 260 throw new UnsupportedOperationException("Operation not implemented."); //$NON-NLS-1$ 261 } 262 263 @Override isEqualNode(Node arg)264 public boolean isEqualNode(Node arg) { 265 throw new UnsupportedOperationException("Operation not implemented."); //$NON-NLS-1$ 266 } 267 268 @Override isSupported(String feature, String version)269 public boolean isSupported(String feature, String version) { 270 throw new UnsupportedOperationException("Operation not implemented."); //$NON-NLS-1$ 271 } 272 273 @Override lookupNamespaceURI(String prefix)274 public String lookupNamespaceURI(String prefix) { 275 throw new UnsupportedOperationException("Operation not implemented."); //$NON-NLS-1$ 276 } 277 278 @Override lookupPrefix(String namespaceURI)279 public String lookupPrefix(String namespaceURI) { 280 throw new UnsupportedOperationException("Operation not implemented."); //$NON-NLS-1$ 281 } 282 283 @Override normalize()284 public void normalize() { 285 throw new UnsupportedOperationException("Operation not implemented."); //$NON-NLS-1$ 286 } 287 288 @Override removeChild(Node oldChild)289 public Node removeChild(Node oldChild) throws DOMException { 290 throw new UnsupportedOperationException("Operation not implemented."); //$NON-NLS-1$ 291 } 292 293 @Override replaceChild(Node newChild, Node oldChild)294 public Node replaceChild(Node newChild, Node oldChild) 295 throws DOMException { 296 throw new UnsupportedOperationException("Operation not implemented."); //$NON-NLS-1$ 297 } 298 299 @Override setNodeValue(String nodeValue)300 public void setNodeValue(String nodeValue) throws DOMException { 301 throw new UnsupportedOperationException("Operation not implemented."); //$NON-NLS-1$ 302 } 303 304 @Override setPrefix(String prefix)305 public void setPrefix(String prefix) throws DOMException { 306 throw new UnsupportedOperationException("Operation not implemented."); //$NON-NLS-1$ 307 } 308 309 @Override setTextContent(String textContent)310 public void setTextContent(String textContent) throws DOMException { 311 throw new UnsupportedOperationException("Operation not implemented."); //$NON-NLS-1$ 312 } 313 314 @Override setUserData(String key, Object data, UserDataHandler handler)315 public Object setUserData(String key, Object data, 316 UserDataHandler handler) { 317 throw new UnsupportedOperationException("Operation not implemented."); //$NON-NLS-1$ 318 } 319 } 320