FileDocCategorySizeDatePackage
DOMCatalogReader.javaAPI DocJava SE 6 API8822Tue Jun 10 00:23:00 BST 2008com.sun.org.apache.xml.internal.resolver.readers

DOMCatalogReader

public class DOMCatalogReader extends Object implements com.sun.org.apache.xml.internal.resolver.readers.CatalogReader
A DOM-based CatalogReader.

This class is used to read XML Catalogs using the DOM. This reader has an advantage over the SAX-based reader that it can analyze the DOM tree rather than simply a series of SAX events. It has the disadvantage that it requires all of the code necessary to build and walk a DOM tree.

Since the choice of CatalogReaders (in the InputStream case) can only be made on the basis of MIME type, the following problem occurs: only one CatalogReader can exist for all XML mime types. In order to get around this problem, the DOMCatalogReader relies on a set of external CatalogParsers to actually build the catalog.

The selection of CatalogParsers is made on the basis of the QName of the root element of the document.

This class requires the Java API for XML Parsing.

see
Catalog
see
CatalogReader
see
SAXCatalogReader
see
TextCatalogReader
see
DOMCatalogParser
author
Norman Walsh Norman.Walsh@Sun.COM
version
1.0

Fields Summary
protected Hashtable
namespaceMap
Mapping table from QNames to CatalogParser classes.

Each key in this hash table has the form "elementname" or "{namespaceuri}elementname". The former is used if the namespace URI is null.

Constructors Summary
public DOMCatalogReader()
Null constructor; something for subclasses to call.

 
Methods Summary
public java.lang.StringgetCatalogParser(java.lang.String namespaceURI, java.lang.String rootElement)
Get the name of the parser class for a given catalog type.

This method returns the parserClass associated with the namespaceURI/rootElement names specified.

param
namespaceURI The namespace URI. Not the prefix.
param
rootElement The name of the root element.
return
The parser class.

    if (namespaceURI == null) {
      return (String) namespaceMap.get(rootElement);
    } else {
      return (String) namespaceMap.get("{"+namespaceURI+"}"+rootElement);
    }
  
public voidreadCatalog(com.sun.org.apache.xml.internal.resolver.Catalog catalog, java.io.InputStream is)
Read a catalog from an input stream.

This class reads a catalog from an input stream:

  • Based on the QName of the root element, it determines which parser to instantiate for this catalog.
  • It constructs a DOM Document from the catalog and
  • For each child of the root node, it calls the parser's parseCatalogEntry method. This method is expected to make appropriate calls back into the catalog to add entries for the entries in the catalog. It is free to do this in whatever manner is appropriate (perhaps using just the node passed in, perhaps wandering arbitrarily throughout the tree).

param
catalog The catalog for which this reader is called.
param
is The input stream that is to be read.
throws
IOException if the URL cannot be read.
throws
UnknownCatalogFormatException if the catalog format is not recognized.
throws
UnparseableCatalogException if the catalog cannot be parsed. (For example, if it is supposed to be XML and isn't well-formed or if the parser class cannot be instantiated.)


    DocumentBuilderFactory factory = null;
    DocumentBuilder builder = null;

    factory = DocumentBuilderFactory.newInstance();
    factory.setNamespaceAware(false);
    factory.setValidating(false);
    try {
      builder = factory.newDocumentBuilder();
    } catch (ParserConfigurationException pce) {
      throw new CatalogException(CatalogException.UNPARSEABLE);
    }

    Document doc = null;

    try {
      doc = builder.parse(is);
    } catch (SAXException se) {
      throw new CatalogException(CatalogException.UNKNOWN_FORMAT);
    }

    Element root = doc.getDocumentElement();

    String namespaceURI = Namespaces.getNamespaceURI(root);
    String localName    = Namespaces.getLocalName(root);

    String domParserClass = getCatalogParser(namespaceURI,
					     localName);

    if (domParserClass == null) {
      if (namespaceURI == null) {
	catalog.getCatalogManager().debug.message(1, "No Catalog parser for "
						  + localName);
      } else {
	catalog.getCatalogManager().debug.message(1, "No Catalog parser for "
						  + "{" + namespaceURI + "}"
						  + localName);
      }
      return;
    }

    DOMCatalogParser domParser = null;

    try {
      domParser = (DOMCatalogParser) Class.forName(domParserClass).newInstance();
    } catch (ClassNotFoundException cnfe) {
      catalog.getCatalogManager().debug.message(1, "Cannot load XML Catalog Parser class", domParserClass);
      throw new CatalogException(CatalogException.UNPARSEABLE);
    } catch (InstantiationException ie) {
      catalog.getCatalogManager().debug.message(1, "Cannot instantiate XML Catalog Parser class", domParserClass);
      throw new CatalogException(CatalogException.UNPARSEABLE);
    } catch (IllegalAccessException iae) {
      catalog.getCatalogManager().debug.message(1, "Cannot access XML Catalog Parser class", domParserClass);
      throw new CatalogException(CatalogException.UNPARSEABLE);
    } catch (ClassCastException cce ) {
      catalog.getCatalogManager().debug.message(1, "Cannot cast XML Catalog Parser class", domParserClass);
      throw new CatalogException(CatalogException.UNPARSEABLE);
    }

    Node node = root.getFirstChild();
    while (node != null) {
      domParser.parseCatalogEntry(catalog, node);
      node = node.getNextSibling();
    }
  
public voidreadCatalog(com.sun.org.apache.xml.internal.resolver.Catalog catalog, java.lang.String fileUrl)
Read the catalog behind the specified URL.

see
#readCatalog(Catalog, InputStream)
param
catalog The catalog for which we are reading.
param
fileUrl The URL of the document that should be read.
throws
MalformedURLException if the specified URL cannot be turned into a URL object.
throws
IOException if the URL cannot be read.
throws
UnknownCatalogFormatException if the catalog format is not recognized.
throws
UnparseableCatalogException if the catalog cannot be parsed. (For example, if it is supposed to be XML and isn't well-formed.)

    URL url = new URL(fileUrl);
    URLConnection urlCon = url.openConnection();
    readCatalog(catalog, urlCon.getInputStream());
  
public voidsetCatalogParser(java.lang.String namespaceURI, java.lang.String rootElement, java.lang.String parserClass)
Add a new parser to the reader.

This method associates the specified parserClass with the namespaceURI/rootElement names specified.

param
namespaceURI The namespace URI. Not the prefix.
param
rootElement The name of the root element.
param
parserClass The name of the parserClass to instantiate for this kind of catalog.


                                                     
     
			        
			         
    if (namespaceURI == null) {
      namespaceMap.put(rootElement, parserClass);
    } else {
      namespaceMap.put("{"+namespaceURI+"}"+rootElement, parserClass);
    }