1 package com.sun.tools.xjc.runtime; 2 3 import java.util.Enumeration ; 4 import java.util.HashMap ; 5 import java.util.HashSet ; 6 import java.util.Iterator ; 7 import java.util.Map ; 8 import java.util.Set ; 9 10 import javax.xml.XMLConstants ; 11 12 import org.xml.sax.SAXException ; 13 14 import com.sun.xml.bind.marshaller.NamespacePrefixMapper; 15 import com.sun.xml.bind.marshaller.NamespaceSupport; 16 17 26 public class NamespaceContextImpl implements NamespaceContext2 27 { 28 32 private int iota = 1; 33 34 37 private final NamespaceSupport nss = new NamespaceSupport(); 38 39 42 private boolean inCollectingMode; 43 44 45 private final NamespacePrefixMapper prefixMapper; 46 47 53 private final Map decls = new HashMap (); 54 55 private final Map reverseDecls = new HashMap (); 56 57 58 public NamespaceContextImpl(NamespacePrefixMapper _prefixMapper) { 59 this.prefixMapper = _prefixMapper; 60 nss.declarePrefix("",""); 63 nss.declarePrefix( "xmlns", XMLConstants.XMLNS_ATTRIBUTE_NS_URI ); 64 } 67 68 public final NamespacePrefixMapper getNamespacePrefixMapper() { 69 return prefixMapper; 70 } 71 72 81 public String declareNamespace( String namespaceUri, String preferedPrefix, boolean requirePrefix ) { 82 if( !inCollectingMode ) { 83 if( !requirePrefix && nss.getURI("").equals(namespaceUri) ) 84 return ""; 86 if (requirePrefix) 91 return nss.getPrefix2(namespaceUri); 92 else 93 return nss.getPrefix(namespaceUri); 94 } else { 95 if( requirePrefix && namespaceUri.length()==0 ) 96 return ""; 97 98 String prefix = (String )reverseDecls.get(namespaceUri); 100 if( prefix!=null ) { 101 if( !requirePrefix || prefix.length()!=0 ) { 102 return prefix; 105 } else { 106 109 decls.remove(prefix); 111 reverseDecls.remove(namespaceUri); 112 } 113 } 114 115 116 if( namespaceUri.length()==0 ) { 117 prefix = ""; 119 } else { 120 prefix = nss.getPrefix(namespaceUri); 122 if( prefix==null ) 123 prefix = (String )reverseDecls.get(namespaceUri); 124 125 if( prefix==null ) { 126 128 if( prefixMapper!=null ) 132 prefix = prefixMapper.getPreferredPrefix( 133 namespaceUri,preferedPrefix,requirePrefix); 134 else 135 prefix = preferedPrefix; 136 137 if( prefix==null ) 138 prefix = "ns"+(iota++); 140 } 141 } 142 143 145 if( requirePrefix && prefix.length()==0 ) 146 prefix = "ns"+(iota++); 148 149 150 while(true) { 151 String existingUri = (String )decls.get(prefix); 152 153 if( existingUri==null ) { 154 decls.put( prefix, namespaceUri ); 156 reverseDecls.put( namespaceUri, prefix ); 157 return prefix; 158 } 159 160 if( existingUri.length()==0 ) { 161 ; 165 } else { 166 170 decls.put( prefix, namespaceUri ); 172 reverseDecls.put( namespaceUri, prefix ); 173 174 namespaceUri = existingUri; 175 } 176 177 prefix = "ns"+(iota++); 180 181 } 183 } 184 } 185 186 187 public String getPrefix( String namespaceUri ) { 188 191 return declareNamespace(namespaceUri,null,false); 196 } 197 198 202 public String getNamespaceURI( String prefix ) { 203 String uri = (String )decls.get(prefix); 204 if(uri!=null) return uri; 205 206 return nss.getURI(prefix); 207 } 208 209 public Iterator getPrefixes( String namespaceUri ) { 210 Set s = new HashSet (); 212 213 String prefix = (String )reverseDecls.get(namespaceUri); 214 if(prefix!=null) s.add(prefix); 215 216 if( nss.getURI("").equals(namespaceUri) ) 217 s.add(""); 218 219 for( Enumeration e=nss.getPrefixes(namespaceUri); e.hasMoreElements(); ) 220 s.add(e.nextElement()); 221 222 return s.iterator(); 223 } 224 225 231 public void startElement() { 232 nss.pushContext(); 233 inCollectingMode = true; 234 } 235 236 244 public void endNamespaceDecls() { 245 if(!decls.isEmpty()) { 246 for( Iterator itr=decls.entrySet().iterator(); itr.hasNext(); ) { 248 Map.Entry e = (Map.Entry )itr.next(); 249 String prefix = (String )e.getKey(); 250 String uri = (String )e.getValue(); 251 if(!uri.equals(nss.getURI(prefix))) nss.declarePrefix( prefix, uri ); 253 } 254 decls.clear(); 255 reverseDecls.clear(); 256 } 257 inCollectingMode = false; 258 } 259 260 266 public void endElement() { 267 nss.popContext(); 268 } 269 270 271 272 273 public void iterateDeclaredPrefixes( PrefixCallback callback ) throws SAXException { 274 for( Enumeration e=nss.getDeclaredPrefixes(); e.hasMoreElements(); ) { 275 String p = (String )e.nextElement(); 276 String uri = nss.getURI(p); 277 278 callback.onPrefixMapping( p, uri ); 279 } 280 } 281 282 283 } 284 | Popular Tags |