1 29 30 package com.caucho.xml2; 31 32 import com.caucho.vfs.WriteStream; 33 34 import javax.xml.XMLConstants ; 35 import javax.xml.namespace.NamespaceContext ; 36 import javax.xml.namespace.QName ; 37 import java.io.IOException ; 38 import java.util.ArrayList ; 39 import java.util.HashMap ; 40 import java.util.Iterator ; 41 import java.util.Map ; 42 43 46 public class NamespaceContextImpl 47 { 48 private final HashMap <String ,NamespaceBinding> _bindings 50 = new HashMap <String ,NamespaceBinding>(); 51 52 private ElementBinding []_stack = new ElementBinding[32]; 54 private int _stackTop; 55 56 private NamespaceBinding _nullEltBinding; 57 private NamespaceBinding _nullAttrBinding; 58 59 private int _uniqueId = 0; 60 private int _version = 0; 61 62 NamespaceContextImpl() 63 { 64 _nullEltBinding = new NamespaceBinding(null, null, 0); 65 _nullAttrBinding = new NamespaceBinding(null, null, 0); 66 67 _stackTop = 1; 68 } 69 70 73 public void push(SaxIntern.Entry entry) 74 { 75 ElementBinding elt = _stack[_stackTop]; 76 77 if (elt == null) { 78 elt = new ElementBinding(); 79 _stack[_stackTop] = elt; 80 } 81 82 _stackTop++; 83 84 elt.setName(entry); 85 } 86 87 90 public void pop(SaxIntern.Entry entry) 91 { 92 ElementBinding eltBinding = _stack[--_stackTop]; 93 94 if (eltBinding != null) { 95 ArrayList <Decl> oldBinding = eltBinding.getOldBindingList(); 96 97 for (int i = 0; oldBinding != null && i < oldBinding.size(); i++) { 98 Decl decl = oldBinding.get(i); 99 NamespaceBinding binding = decl.getBinding(); 100 101 _version++; 102 103 binding.setUri(decl.getOldUri()); 104 binding.setVersion(_version); 105 } 106 107 eltBinding.clear(); 108 } 109 } 110 111 public int getDepth() 112 { 113 return _stackTop - 1; 114 } 115 116 119 public void declare(String prefix, String uri) 120 { 121 NamespaceBinding binding = getElementNamespace(prefix); 122 123 ElementBinding eltBinding = _stack[_stackTop - 1]; 124 125 if (eltBinding == null) { 126 eltBinding = new ElementBinding(); 127 128 _stack[_stackTop - 1] = eltBinding; 129 } 130 131 eltBinding.addOldBinding(binding, prefix, binding.getUri(), uri); 132 133 _version++; 134 binding.setUri(uri); 135 binding.setVersion(_version); 136 } 137 138 142 public String declare(String uri) 143 { 144 String prefix = "ns"+ _uniqueId++; 145 146 declare(prefix, uri); 147 148 return prefix; 149 } 150 151 154 public String getUri(String prefix) 155 { 156 NamespaceBinding binding = _bindings.get(prefix); 157 158 if (binding != null) 159 return binding.getUri(); 160 else 161 return null; 162 } 163 164 public String getNamespaceURI(String prefix) 165 { 166 NamespaceBinding binding = _bindings.get(prefix); 167 168 if (binding != null) 169 return binding.getUri(); 170 171 String uri = null; 172 173 if (XMLConstants.XML_NS_PREFIX.equals(prefix)) 174 uri = XMLConstants.XML_NS_URI; 175 else if (XMLConstants.XMLNS_ATTRIBUTE.equals(prefix)) 176 uri = XMLConstants.XMLNS_ATTRIBUTE_NS_URI; 177 178 return uri; 179 } 180 181 public Iterator getPrefixes(String uri) 182 { 183 return null; 184 } 185 186 public String getUri(int i) 187 { 188 ElementBinding eltBinding = _stack[_stackTop - 1]; 189 190 if (eltBinding != null) { 191 return eltBinding.getOldBindingList().get(i).getNewUri(); 192 } 193 else 194 return null; 195 } 196 197 public String getPrefix(int i) 198 { 199 ElementBinding eltBinding = _stack[_stackTop - 1]; 200 201 if (eltBinding != null) { 202 return eltBinding.getOldBindingList().get(i).getPrefix(); 203 } 204 205 return null; 206 } 207 208 public int getNumDecls() 209 { 210 ElementBinding eltBinding = _stack[_stackTop - 1]; 211 212 if (eltBinding != null) 213 return eltBinding.getOldBindingList().size(); 214 else 215 return 0; 216 } 217 218 NamespaceBinding getElementNamespace(String prefix) 219 { 220 NamespaceBinding binding; 221 222 if (prefix == null) 223 binding = _nullEltBinding; 224 else 225 binding = _bindings.get(prefix); 226 227 if (binding != null) 228 return binding; 229 else { 230 binding = new NamespaceBinding(prefix, null, _version); 231 232 _bindings.put(prefix, binding); 233 234 return binding; 235 } 236 } 237 238 NamespaceBinding getAttributeNamespace(String prefix) 239 { 240 NamespaceBinding binding; 241 242 if (prefix == null) 243 binding = _nullAttrBinding; 244 else 245 binding = _bindings.get(prefix); 246 247 if (binding != null) 248 return binding; 249 else { 250 binding = new NamespaceBinding(prefix, null, _version); 251 252 _bindings.put(prefix, binding); 253 254 return binding; 255 } 256 } 257 258 static class ElementBinding 259 { 260 private SaxIntern.Entry _name; 261 private ArrayList <Decl> _declList; 262 263 public void setName(SaxIntern.Entry name) 264 { 265 _name = name; 266 } 267 268 public SaxIntern.Entry getName() 269 { 270 return _name; 271 } 272 273 public void addOldBinding(NamespaceBinding binding, String prefix, 274 String oldUri, String newUri) 275 { 276 if (_declList == null) 277 _declList = new ArrayList <Decl>(); 278 279 _declList.add(new Decl(binding, prefix, oldUri, newUri)); 280 } 281 282 public ArrayList <Decl> getOldBindingList() 283 { 284 return _declList; 285 } 286 287 public void clear() 288 { 289 _declList = null; 290 } 291 } 292 293 static class Decl { 294 private final NamespaceBinding _binding; 295 private final String _prefix; 296 private final String _oldUri; 297 private final String _newUri; 298 299 Decl(NamespaceBinding binding, String prefix, 300 String oldUri, String newUri) 301 { 302 _binding = binding; 303 _prefix = prefix; 304 _oldUri = oldUri; 305 _newUri = newUri; 306 } 307 308 NamespaceBinding getBinding() 309 { 310 return _binding; 311 } 312 313 String getPrefix() 314 { 315 return _prefix; 316 } 317 318 String getOldUri() 319 { 320 return _oldUri; 321 } 322 323 String getNewUri() 324 { 325 return _newUri; 326 } 327 } 328 } 329 | Popular Tags |