FileDocCategorySizeDatePackage
SchemaResolver.javaAPI DocGlassfish v2 API6728Fri May 04 22:32:30 BST 2007org.apache.catalina.util

SchemaResolver

public class SchemaResolver extends Object implements EntityResolver
This class implements a local SAX's EntityResolver. All DTDs and schemas used to validate the web.xml file will re-directed to a local file stored in the servlet-api.jar and jsp-api.jar.
author
Jean-Francois Arcand

Fields Summary
protected com.sun.org.apache.commons.digester.Digester
digester
The disgester instance for which this class is the entity resolver.
protected HashMap
entityValidator
The URLs of dtds and schemas that have been registered, keyed by the public identifier that corresponds.
protected String
publicId
The public identifier of the DTD we are currently parsing under (if any).
protected String
schemaExtension
Extension to make the difference between DTD and Schema.
private static boolean
forceLocalSchema
Attribute value used to turn on/off network access of dtd/schema
Constructors Summary
public SchemaResolver(com.sun.org.apache.commons.digester.Digester digester)
Create a new EntityResolver that will redirect all remote dtds and schema to a locat destination.

param
schemaLocation the XML Schema used to validate xml instance.

    // END PWC 6457880

                                   
       
        this.digester = digester;
    
Methods Summary
public voidregister(java.lang.String publicId, java.lang.String entityURL)
Register the specified DTD/Schema URL for the specified public identifier. This must be called before the first call to parse(). When adding a schema file (*.xsd), only the name of the file will get added. If two schemas with the same name are added, only the last one will be stored.

param
publicId Public identifier of the DTD to be resolved
param
entityURL The URL to use for reading this DTD

         String key = publicId;
         if (publicId.indexOf(schemaExtension) != -1)
             key = publicId.substring(publicId.lastIndexOf('/")+1);
         entityValidator.put(key, entityURL);
     
public org.xml.sax.InputSourceresolveEntity(java.lang.String publicId, java.lang.String systemId)
Resolve the requested external entity.

param
publicId The public identifier of the entity being referenced
param
systemId The system identifier of the entity being referenced
exception
SAXException if a parsing exception occurs


        if (publicId != null) {
            this.publicId = publicId;
            digester.setPublicId(publicId);
        }

        // Has this system identifier been registered?
        String entityURL = null;
        if (publicId != null) {
            entityURL = (String) entityValidator.get(publicId);
        }

        // Redirect the schema location to a local destination
        String key = null;
        if (entityURL == null && systemId != null) {
            key = systemId.substring(systemId.lastIndexOf('/")+1);
            entityURL = (String)entityValidator.get(key);
        }

/* PWC 6457880
        if (entityURL == null) {
           return (null);
        }

*/
        // START PWC 6457880
        if (entityURL == null) {
            if (forceLocalSchema) {
                URI u;
                try {
                    u  = new URI(systemId);
                } catch (URISyntaxException e) {
                    throw new SAXException(e);
                }
                String scheme = u.getScheme();
                // if the scheme is local, let the digester look it up
                // otherwise, throw an exception
                if (scheme != null && (scheme.equals("file") ||
                    scheme.equals("jar"))) {
                    return (null);
                }
                else {
                    throw new SAXException("Unable to find local schema for "+key);
                }
            }
            else {
                return (null);
            }
        }
        // END PWC 6457880
        try {
            return (new InputSource(entityURL));
        } catch (Exception e) {
            throw new SAXException(e);
        }

    
public static voidsetForceLocalSchema(boolean flag)

        forceLocalSchema = flag;