/* * reserved comment block * DO NOT REMOVE OR ALTER! */ // ExtendedXMLCatalogReader.java - Read XML Catalog files /* * Copyright 2001-2004 The Apache Software Foundation or its licensors, * as applicable. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.sun.org.apache.xml.internal.resolver.readers; import java.util.Vector; import com.sun.org.apache.xml.internal.resolver.Catalog; import com.sun.org.apache.xml.internal.resolver.Resolver; import com.sun.org.apache.xml.internal.resolver.CatalogEntry; import com.sun.org.apache.xml.internal.resolver.CatalogException; import org.xml.sax.*; import org.w3c.dom.*; /** * Parse Extended OASIS Entity Resolution Technical Committee * XML Catalog files. * * @see Catalog * * @author Norman Walsh * <a href="mailto:Norman.Walsh@Sun.COM">Norman.Walsh@Sun.COM</a> * */ public class ExtendedXMLCatalogReader extends OASISXMLCatalogReader { /** The namespace name of extended catalog elements */ public static final String extendedNamespaceName = "http://nwalsh.com/xcatalog/1.0"; /** * The SAX <code>startElement</code> method recognizes elements * from the plain catalog format and instantiates CatalogEntry * objects for them. * * @param namespaceURI The namespace name of the element. * @param localName The local name of the element. * @param qName The QName of the element. * @param atts The list of attributes on the element. * * @see CatalogEntry */ public void startElement (String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { // Check before calling the super because super will report our // namespace as an extension namespace, but that doesn't count // for this element. boolean inExtension = inExtensionNamespace(); super.startElement(namespaceURI, localName, qName, atts); int entryType = -1; Vector entryArgs = new Vector(); if (namespaceURI != null && extendedNamespaceName.equals(namespaceURI) && !inExtension) { // This is an Extended XML Catalog entry if (atts.getValue("xml:base") != null) { String baseURI = atts.getValue("xml:base"); entryType = Catalog.BASE; entryArgs.add(baseURI); baseURIStack.push(baseURI); debug.message(4, "xml:base", baseURI); try { CatalogEntry ce = new CatalogEntry(entryType, entryArgs); catalog.addEntry(ce); } catch (CatalogException cex) { if (cex.getExceptionType() == CatalogException.INVALID_ENTRY_TYPE) { debug.message(1, "Invalid catalog entry type", localName); } else if (cex.getExceptionType() == CatalogException.INVALID_ENTRY) { debug.message(1, "Invalid catalog entry (base)", localName); } } entryType = -1; entryArgs = new Vector(); } else { baseURIStack.push(baseURIStack.peek()); } if (localName.equals("uriSuffix")) { if (checkAttributes(atts, "suffix", "uri")) { entryType = Resolver.URISUFFIX; entryArgs.add(atts.getValue("suffix")); entryArgs.add(atts.getValue("uri")); debug.message(4, "uriSuffix", atts.getValue("suffix"), atts.getValue("uri")); } } else if (localName.equals("systemSuffix")) { if (checkAttributes(atts, "suffix", "uri")) { entryType = Resolver.SYSTEMSUFFIX; entryArgs.add(atts.getValue("suffix")); entryArgs.add(atts.getValue("uri")); debug.message(4, "systemSuffix", atts.getValue("suffix"), atts.getValue("uri")); } } else { // This is equivalent to an invalid catalog entry type debug.message(1, "Invalid catalog entry type", localName); } if (entryType >= 0) { try { CatalogEntry ce = new CatalogEntry(entryType, entryArgs); catalog.addEntry(ce); } catch (CatalogException cex) { if (cex.getExceptionType() == CatalogException.INVALID_ENTRY_TYPE) { debug.message(1, "Invalid catalog entry type", localName); } else if (cex.getExceptionType() == CatalogException.INVALID_ENTRY) { debug.message(1, "Invalid catalog entry", localName); } } } } } /** The SAX <code>endElement</code> method does nothing. */ public void endElement (String namespaceURI, String localName, String qName) throws SAXException { super.endElement(namespaceURI, localName, qName); // Check after popping the stack so we don't erroneously think we // are our own extension namespace... boolean inExtension = inExtensionNamespace(); int entryType = -1; Vector entryArgs = new Vector(); if (namespaceURI != null && (extendedNamespaceName.equals(namespaceURI)) && !inExtension) { String popURI = (String) baseURIStack.pop(); String baseURI = (String) baseURIStack.peek(); if (!baseURI.equals(popURI)) { entryType = catalog.BASE; entryArgs.add(baseURI); debug.message(4, "(reset) xml:base", baseURI); try { CatalogEntry ce = new CatalogEntry(entryType, entryArgs); catalog.addEntry(ce); } catch (CatalogException cex) { if (cex.getExceptionType() == CatalogException.INVALID_ENTRY_TYPE) { debug.message(1, "Invalid catalog entry type", localName); } else if (cex.getExceptionType() == CatalogException.INVALID_ENTRY) { debug.message(1, "Invalid catalog entry (rbase)", localName); } } } } } }