1 3 19 20 package com.sun.org.apache.xml.internal.resolver.tools; 21 22 import java.io.IOException ; 23 import java.io.InputStream ; 24 import java.net.MalformedURLException ; 25 import java.net.URL ; 26 27 import org.xml.sax.InputSource ; 28 import org.xml.sax.SAXException ; 29 import org.xml.sax.XMLReader ; 30 import org.xml.sax.Attributes ; 31 import org.xml.sax.helpers.XMLFilterImpl ; 32 33 import com.sun.org.apache.xml.internal.resolver.Catalog; 34 import com.sun.org.apache.xml.internal.resolver.CatalogManager; 35 36 import com.sun.org.apache.xml.internal.resolver.helpers.FileURL; 37 38 54 public class ResolvingXMLFilter extends XMLFilterImpl { 55 60 public static boolean suppressExplanation = false; 61 62 63 private CatalogManager catalogManager = CatalogManager.getStaticManager(); 64 65 66 private CatalogResolver catalogResolver = null; 67 68 69 private CatalogResolver piCatalogResolver = null; 70 71 72 private boolean allowXMLCatalogPI = false; 73 74 75 private boolean oasisXMLCatalogPI = false; 76 77 78 private URL baseURL = null; 79 80 81 public ResolvingXMLFilter() { 82 super(); 83 catalogResolver = new CatalogResolver(catalogManager); 84 } 85 86 87 public ResolvingXMLFilter(XMLReader parent) { 88 super(parent); 89 catalogResolver = new CatalogResolver(catalogManager); 90 } 91 92 93 public ResolvingXMLFilter(CatalogManager manager) { 94 super(); 95 catalogManager = manager; 96 catalogResolver = new CatalogResolver(catalogManager); 97 } 98 99 100 public ResolvingXMLFilter(XMLReader parent, CatalogManager manager) { 101 super(parent); 102 catalogManager = manager; 103 catalogResolver = new CatalogResolver(catalogManager); 104 } 105 106 109 public Catalog getCatalog() { 110 return catalogResolver.getCatalog(); 111 } 112 113 134 public void parse(InputSource input) 135 throws IOException , SAXException { 136 allowXMLCatalogPI = true; 137 138 setupBaseURI(input.getSystemId()); 139 140 try { 141 super.parse(input); 142 } catch (InternalError ie) { 143 explain(input.getSystemId()); 144 throw ie; 145 } 146 } 147 148 152 public void parse(String systemId) 153 throws IOException , SAXException { 154 allowXMLCatalogPI = true; 155 156 setupBaseURI(systemId); 157 158 try { 159 super.parse(systemId); 160 } catch (InternalError ie) { 161 explain(systemId); 162 throw ie; 163 } 164 } 165 166 171 public InputSource resolveEntity (String publicId, String systemId) { 172 allowXMLCatalogPI = false; 173 String resolved = catalogResolver.getResolvedEntity(publicId, systemId); 174 175 if (resolved == null && piCatalogResolver != null) { 176 resolved = piCatalogResolver.getResolvedEntity(publicId, systemId); 177 } 178 179 if (resolved != null) { 180 try { 181 InputSource iSource = new InputSource (resolved); 182 iSource.setPublicId(publicId); 183 184 URL url = new URL (resolved); 196 InputStream iStream = url.openStream(); 197 iSource.setByteStream(iStream); 198 199 return iSource; 200 } catch (Exception e) { 201 catalogManager.debug.message(1, "Failed to create InputSource", resolved); 202 return null; 203 } 204 } else { 205 return null; 206 } 207 } 208 209 215 public void notationDecl (String name, String publicId, String systemId) 216 throws SAXException { 217 allowXMLCatalogPI = false; 218 super.notationDecl(name,publicId,systemId); 219 } 220 221 227 public void unparsedEntityDecl (String name, 228 String publicId, 229 String systemId, 230 String notationName) 231 throws SAXException { 232 allowXMLCatalogPI = false; 233 super.unparsedEntityDecl (name, publicId, systemId, notationName); 234 } 235 236 242 public void startElement (String uri, String localName, String qName, 243 Attributes atts) 244 throws SAXException { 245 allowXMLCatalogPI = false; 246 super.startElement(uri,localName,qName,atts); 247 } 248 249 253 public void processingInstruction(String target, String pidata) 254 throws SAXException { 255 if (target.equals("oasis-xml-catalog")) { 256 URL catalog = null; 257 String data = pidata; 258 259 int pos = data.indexOf("catalog="); 260 if (pos >= 0) { 261 data = data.substring(pos+8); 262 if (data.length() > 1) { 263 String quote = data.substring(0,1); 264 data = data.substring(1); 265 pos = data.indexOf(quote); 266 if (pos >= 0) { 267 data = data.substring(0, pos); 268 try { 269 if (baseURL != null) { 270 catalog = new URL (baseURL, data); 271 } else { 272 catalog = new URL (data); 273 } 274 } catch (MalformedURLException mue) { 275 } 277 } 278 } 279 } 280 281 if (allowXMLCatalogPI) { 282 if (catalogManager.getAllowOasisXMLCatalogPI()) { 283 catalogManager.debug.message(4,"oasis-xml-catalog PI", pidata); 284 285 if (catalog != null) { 286 try { 287 catalogManager.debug.message(4,"oasis-xml-catalog", catalog.toString()); 288 oasisXMLCatalogPI = true; 289 290 if (piCatalogResolver == null) { 291 piCatalogResolver = new CatalogResolver(true); 292 } 293 294 piCatalogResolver.getCatalog().parseCatalog(catalog.toString()); 295 } catch (Exception e) { 296 catalogManager.debug.message(3, "Exception parsing oasis-xml-catalog: " 297 + catalog.toString()); 298 } 299 } else { 300 catalogManager.debug.message(3, "PI oasis-xml-catalog unparseable: " + pidata); 301 } 302 } else { 303 catalogManager.debug.message(4,"PI oasis-xml-catalog ignored: " + pidata); 304 } 305 } else { 306 catalogManager.debug.message(3, "PI oasis-xml-catalog occurred in an invalid place: " 307 + pidata); 308 } 309 } else { 310 super.processingInstruction(target, pidata); 311 } 312 } 313 314 315 private void setupBaseURI(String systemId) { 316 URL cwd = null; 317 318 try { 319 cwd = FileURL.makeURL("basename"); 320 } catch (MalformedURLException mue) { 321 cwd = null; 322 } 323 324 try { 325 baseURL = new URL (systemId); 326 } catch (MalformedURLException mue) { 327 if (cwd != null) { 328 try { 329 baseURL = new URL (cwd, systemId); 330 } catch (MalformedURLException mue2) { 331 baseURL = null; 333 } 334 } else { 335 baseURL = null; 337 } 338 } 339 } 340 341 342 private void explain(String systemId) { 343 if (!suppressExplanation) { 344 System.out.println("XMLReader probably encountered bad URI in " + systemId); 345 System.out.println("For example, replace '/some/uri' with 'file:/some/uri'."); 346 } 347 suppressExplanation = true; 348 } 349 } 350 351 | Popular Tags |