1 9 10 package org.ozoneDB.xml.dom4j.o3impl; 11 12 import org.dom4j.*; 13 14 import java.util.ArrayList ; 15 import java.util.HashMap ; 16 import java.util.Map ; 17 18 26 public class NamespaceStack { 27 28 29 private NodeFactory nodeFactory; 30 31 32 private ArrayList namespaceStack = new ArrayList (); 33 34 35 private ArrayList namespaceCacheList = new ArrayList (); 36 37 38 private Map currentNamespaceCache; 39 40 41 private Map rootNamespaceCache = new HashMap (); 42 43 44 45 private Namespace defaultNamespace; 46 47 48 52 55 public NamespaceStack(DocumentFactory documentFactory) { 56 this.nodeFactory = documentFactory; 57 } 58 59 public NamespaceStack(NodeFactory nodeFactory) { 60 this.nodeFactory = nodeFactory; 61 } 62 63 68 public void push(Namespace namespace) { 69 namespaceStack.add(namespace); 70 namespaceCacheList.add(null); 71 currentNamespaceCache = null; 72 String prefix = namespace.getPrefix(); 73 if (prefix == null || prefix.length() == 0) { 74 defaultNamespace = namespace; 75 } 76 } 77 78 83 public Namespace pop() { 84 return remove(namespaceStack.size() - 1); 85 } 86 87 89 public int size() { 90 return namespaceStack.size(); 91 } 92 93 95 public void clear() { 96 namespaceStack.clear(); 97 namespaceCacheList.clear(); 98 rootNamespaceCache.clear(); 99 currentNamespaceCache = null; 100 } 101 102 104 public AbstractNamespace getNamespace(int index) { 105 return (AbstractNamespace) namespaceStack.get(index); 106 } 107 108 111 public Namespace getNamespaceForPrefix(String prefix) { 112 if (prefix == null) { 113 prefix = ""; 114 } 115 for (int i = namespaceStack.size() - 1; i >= 0; i--) { 116 Namespace namespace = (Namespace) namespaceStack.get(i); 117 if (prefix.equals(namespace.getPrefix())) { 118 return namespace; 119 } 120 } 121 return null; 122 } 123 124 127 public String getURI(String prefix) { 128 Namespace namespace = getNamespaceForPrefix(prefix); 129 return (namespace != null) ? namespace.getURI() : null; 130 } 131 132 134 public boolean contains(Namespace namespace) { 135 String prefix = namespace.getPrefix(); 136 Namespace current = null; 137 if (prefix == null || prefix.length() == 0) { 138 current = getDefaultNamespace(); 139 } else { 140 current = getNamespaceForPrefix(prefix); 141 } 142 if (current == null) { 143 return false; 144 } 145 if (current == namespace) { 146 return true; 147 } 148 return namespace.getURI().equals(current.getURI()); 149 } 150 151 public QName getQName(String namespaceURI, String localName, String qualifiedName) { 152 if (localName == null) { 153 localName = qualifiedName; 154 } else if (qualifiedName == null) { 155 qualifiedName = localName; 156 } 157 if (namespaceURI == null) { 158 namespaceURI = ""; 159 } 160 String prefix = ""; 161 int index = qualifiedName.indexOf(":"); 162 if (index > 0) { 163 prefix = qualifiedName.substring(0, index); 164 if (localName.trim().length() == 0) { 165 localName = qualifiedName.substring(index + 1); 166 } 167 } else if (localName.trim().length() == 0) { 168 localName = qualifiedName; 169 } 170 Namespace namespace = createNamespace(prefix, namespaceURI); 171 return pushQName(localName, qualifiedName, namespace, prefix); 172 } 173 174 public QName getAttributeQName(String namespaceURI, String localName, String qualifiedName) { 175 if (qualifiedName == null) { 176 qualifiedName = localName; 177 } 178 Map map = getNamespaceCache(); 179 QName answer = (QName) map.get(qualifiedName); 180 if (answer != null) { 181 return answer; 182 } 183 if (localName == null) { 184 localName = qualifiedName; 185 } 186 if (namespaceURI == null) { 187 namespaceURI = ""; 188 } 189 Namespace namespace = null; 190 String prefix = ""; 191 int index = qualifiedName.indexOf(":"); 192 if (index > 0) { 193 prefix = qualifiedName.substring(0, index); 194 namespace = createNamespace(prefix, namespaceURI); 195 if (localName.trim().length() == 0) { 196 localName = qualifiedName.substring(index + 1); 197 } 198 } else { 199 namespace = nodeFactory.getNoNamespace(); 201 if (localName.trim().length() == 0) { 203 localName = qualifiedName; 204 } 205 } 206 answer = pushQName(localName, qualifiedName, namespace, prefix); 207 map.put(qualifiedName, answer); 208 return answer; 209 } 210 211 212 public void push(String prefix, String uri) { 213 if (uri == null) { 214 uri = ""; 215 } 216 Namespace namespace = createNamespace(prefix, uri); 217 push(namespace); 218 } 219 220 221 public Namespace addNamespace(String prefix, String uri) { 222 Namespace namespace = createNamespace(prefix, uri); 223 push(namespace); 224 return namespace; 225 } 226 227 228 public Namespace pop(String prefix) { 229 if (prefix == null) { 230 prefix = ""; 231 } 232 Namespace namespace = null; 233 for (int i = namespaceStack.size() - 1; i >= 0; i--) { 234 Namespace ns = (Namespace) namespaceStack.get(i); 235 if (prefix.equals(ns.getPrefix())) { 236 remove(i); 237 namespace = ns; 238 break; 239 } 240 } 241 if (namespace == null) { 242 System.out.println("Warning: missing namespace prefix ignored: " + prefix); 243 } 244 return namespace; 245 } 246 247 public String toString() { 248 return super.toString() + " Stack: " + namespaceStack.toString(); 249 } 250 251 254 public DocumentFactory getDocumentFactory() { 255 if (getNodeFactory() instanceof XPathFactory) { 256 return new DelegateDocumentFactory(getNodeFactory(), (XPathFactory) getNodeFactory()); 257 } else { 258 return new DelegateDocumentFactory(getNodeFactory(), DocumentFactory.getInstance()); 259 } 260 } 261 262 265 public void setDocumentFactory(DocumentFactory documentFactory) { 266 this.nodeFactory = documentFactory; 267 } 268 269 public NodeFactory getNodeFactory() { 270 return nodeFactory; 271 } 272 273 public void setNodeFactory(NodeFactory nodeFactory) { 274 this.nodeFactory = nodeFactory; 275 } 276 277 public Namespace getDefaultNamespace() { 278 if (defaultNamespace == null) { 279 defaultNamespace = findDefaultNamespace(); 280 } 281 return defaultNamespace; 282 } 283 284 287 289 protected QName pushQName(String localName, String qualifiedName, Namespace namespace, String prefix) { 290 if (prefix == null || prefix.length() == 0) { 291 this.defaultNamespace = null; 292 } 293 return createQName(localName, qualifiedName, namespace); 294 } 295 296 299 protected QName createQName(String localName, String qualifiedName, Namespace namespace) { 300 return getNodeFactory().createQName(localName, namespace); 301 } 302 303 306 protected Namespace createNamespace(String prefix, String namespaceURI) { 307 return getNodeFactory().createNamespace(prefix, namespaceURI); 308 } 309 310 313 protected Namespace findDefaultNamespace() { 314 for (int i = namespaceStack.size() - 1; i >= 0; i--) { 315 Namespace namespace = (Namespace) namespaceStack.get(i); 316 if (namespace != null) { 317 String prefix = namespace.getPrefix(); 318 if (prefix == null || namespace.getPrefix().length() == 0) { 319 return namespace; 320 } 321 } 322 } 323 return null; 324 } 325 326 327 protected Namespace remove(int index) { 328 Namespace namespace = (Namespace) namespaceStack.remove(index); 329 namespaceCacheList.remove(index); 330 defaultNamespace = null; 331 currentNamespaceCache = null; 332 return namespace; 333 } 334 335 protected Map getNamespaceCache() { 336 if (currentNamespaceCache == null) { 337 int index = namespaceStack.size() - 1; 338 if (index < 0) { 339 currentNamespaceCache = rootNamespaceCache; 340 } else { 341 currentNamespaceCache = (Map ) namespaceCacheList.get(index); 342 if (currentNamespaceCache == null) { 343 currentNamespaceCache = new HashMap (); 344 namespaceCacheList.set(index, currentNamespaceCache); 345 } 346 } 347 } 348 return currentNamespaceCache; 349 } 350 } 351 352 353 397 | Popular Tags |