/** * SAX ContentHandler API. * * <p>Detect and use the oasis-xml-catalog PI if it occurs. */ public void processingInstruction(String target, String pidata) throws SAXException { if (target.equals("oasis-xml-catalog")) { URL catalog = null; String data = pidata; int pos = data.indexOf("catalog="); if (pos >= 0) { data = data.substring(pos + 8); if (data.length() > 1) { String quote = data.substring(0, 1); data = data.substring(1); pos = data.indexOf(quote); if (pos >= 0) { data = data.substring(0, pos); try { if (baseURL != null) { catalog = new URL(baseURL, data); } else { catalog = new URL(data); } } catch (MalformedURLException mue) { // nevermind } } } } if (allowXMLCatalogPI) { if (catalogManager.getAllowOasisXMLCatalogPI()) { catalogManager.debug.message(4, "oasis-xml-catalog PI", pidata); if (catalog != null) { try { catalogManager.debug.message(4, "oasis-xml-catalog", catalog.toString()); oasisXMLCatalogPI = true; if (piCatalogResolver == null) { piCatalogResolver = new CatalogResolver(true); } piCatalogResolver.getCatalog().parseCatalog(catalog.toString()); } catch (Exception e) { catalogManager.debug.message( 3, "Exception parsing oasis-xml-catalog: " + catalog.toString()); } } else { catalogManager.debug.message(3, "PI oasis-xml-catalog unparseable: " + pidata); } } else { catalogManager.debug.message(4, "PI oasis-xml-catalog ignored: " + pidata); } } else { catalogManager.debug.message( 3, "PI oasis-xml-catalog occurred in an invalid place: " + pidata); } } else { super.processingInstruction(target, pidata); } }
/** * Implements the <code>resolveEntity</code> method for the SAX interface, using an underlying * CatalogResolver to do the real work. */ public InputSource resolveEntity(String publicId, String systemId) { allowXMLCatalogPI = false; String resolved = catalogResolver.getResolvedEntity(publicId, systemId); if (resolved == null && piCatalogResolver != null) { resolved = piCatalogResolver.getResolvedEntity(publicId, systemId); } if (resolved != null) { try { InputSource iSource = new InputSource(resolved); iSource.setPublicId(publicId); // Ideally this method would not attempt to open the // InputStream, but there is a bug (in Xerces, at least) // that causes the parser to mistakenly open the wrong // system identifier if the returned InputSource does // not have a byteStream. // // It could be argued that we still shouldn't do this here, // but since the purpose of calling the entityResolver is // almost certainly to open the input stream, it seems to // do little harm. // URL url = new URL(resolved); InputStream iStream = url.openStream(); iSource.setByteStream(iStream); return iSource; } catch (Exception e) { catalogManager.debug.message(1, "Failed to create InputSource", resolved); return null; } } else { return null; } }
/** Provide accessto the underlying Catalog. */ public Catalog getCatalog() { return catalogResolver.getCatalog(); }