FileDocCategorySizeDatePackage
TagLibFactory.javaAPI DocGlassfish v2 API11955Fri May 04 22:34:18 BST 2007com.sun.enterprise.tools.verifier.web

TagLibFactory

public class TagLibFactory extends Object
This is the factory class used for obtainig the TagLibDescriptor objects for the tag libraries defined in the war archive.
author
Sudipto Ghosh

Fields Summary
private DocumentBuilder
builder
private com.sun.enterprise.tools.verifier.Context
context
private com.sun.enterprise.tools.verifier.FrameworkContext
frameworkContext
private Logger
logger
private boolean
uninitialised
private final com.sun.enterprise.util.LocalStringManagerImpl
smh
Constructors Summary
public TagLibFactory(com.sun.enterprise.tools.verifier.Context context, com.sun.enterprise.tools.verifier.FrameworkContext frameworkContext)
Constructor to create a factory object.

param
context
param
frameworkContext



                   
         
        this.context = context;
        this.frameworkContext = frameworkContext;
    
Methods Summary
private org.w3c.dom.DocumentcreateDocument(java.lang.String location, com.sun.enterprise.deployment.WebBundleDescriptor webd)
Helper method to create the document object from the tld files specified by the location in web.xml of the war archive.

param
location location of jsp tlds
param
webd has all the information about the web.xml of the war archive
return
document object created from tlds specified at the given location
throws
IOException
throws
SAXException

        Document document = null;
        InputSource source = null;
        if (location.startsWith("/")) // NOI18N
            location = location.substring(1);
        else
            location = "WEB-INF/" + location; // NOI18N
        ModuleDescriptor moduleDesc = webd.getModuleDescriptor();
        String archBase = context.getAbstractArchive().getArchiveUri();
        String uri = null;
        if(moduleDesc.isStandalone()){
            uri = archBase;
        } else {
            uri = archBase + File.separator + 
                FileUtils.makeFriendlyFileName(moduleDesc.getArchiveUri());
        }
        FileArchive arch = new FileArchive();
        arch.open(uri);
        InputStream is = arch.getEntry(location);
        try {
        // is can be null if wrong location of tld is specified in web.xml
            if (is == null)
                throw new IOException(smh.getLocalString
                        (getClass().getName() + ".exception1", // NOI18N
                                "Wrong tld [ {0} ] specified in the web.xml of [ {1} ]", // NOI18N
                                new Object[]{location, moduleDesc.getArchiveUri()}));
            source = new InputSource(is);
            document = builder.parse(source);
        } finally {
            try{
                if(is != null)
                    is.close();
            } catch(Exception e) {}
        }

        return document;
    
private java.lang.StringgetTLDSpecVersion(org.w3c.dom.Document doc)
Returns the spec version of the tag lib descriptor file.

param
doc document object created from tlds
return
spec version of the tag lib descriptor file defined by this doc.

        String str = null;
        if (doc.getDoctype() != null) {
            NodeList nl = doc.getElementsByTagName("jsp-version"); // NOI18N
            if (nl != null && nl.getLength() != 0) {
                str = nl.item(0).getFirstChild().getNodeValue(); // web-jsptaglib dtd vesion 1.2
            } else {
                nl = doc.getElementsByTagName("jspversion"); // NOI18N
                if (nl.getLength() != 0) {
                    str = nl.item(0).getFirstChild().getNodeValue(); // web-jsptaglib dtd vesion 1.1
                } else
                    return "1.1"; // NOI18N
            }
        } else
            str = doc.getElementsByTagName("taglib").item(0).getAttributes() // NOI18N
                    .getNamedItem("version") // NOI18N
                    .getNodeValue();

        return str;
    
public com.sun.enterprise.tools.verifier.TagLibDescriptor[]getTagLibDescriptors(com.sun.enterprise.deployment.WebBundleDescriptor descriptor)
This method is responsible for creating a document object from the tld files and then returning the array TagLibDescriptor objects based on tld version.

param
descriptor the web bundle descriptor giving the tlds contained in the war.
return
the tag lib descriptor array for all the tlds defined in the war.

        ArrayList<TagLibDescriptor> tmp = new ArrayList<TagLibDescriptor>();
        Enumeration taglibConfig = null;

        if (descriptor.getJspConfigDescriptor() != null) {
            taglibConfig = descriptor.getJspConfigDescriptor().getTagLibs();
        } else {
            return null;
        }
        init();
        while (taglibConfig.hasMoreElements()) {
            // test all the Tag lib descriptors.
            TagLibConfigurationDescriptor taglibDescriptor = (TagLibConfigurationDescriptor) taglibConfig.nextElement();

            String taglibLocation = taglibDescriptor.getTagLibLocation();
            Document d = null;
            try {
                d = createDocument(taglibLocation, descriptor);
            } catch (Exception e) {
                logger.log(Level.WARNING, smh.getLocalString
                        (getClass().getName() + ".exception", // NOI18N
                                "Continuing, though problem in creating taglib document. Cause: {0}", // NOI18N
                                new Object[]{e.getMessage()}));
                if (e instanceof SAXParseException) {
                    LogRecord logRecord = new LogRecord(Level.SEVERE,
                                            smh.getLocalString
                                                (getClass().getName() + ".exception2", // NOI18N
                                                "XML Error line : {0} in [ {1} ]. {2}", // NOI18N
                                                new Object[] {((SAXParseException) e).getLineNumber(),
                                                        taglibLocation,
                                                        e.getLocalizedMessage()}));
                    logRecord.setThrown(e);
                    frameworkContext.getResultManager().log(logRecord);
                }
                continue; // we are continuing with creating the next document.
            }
            String version = getTLDSpecVersion(d);
            TagLibDescriptor taglib = null;
            taglib = new TagLibDescriptor(d, version, taglibLocation);
            tmp.add(taglib);
        }

        int count = tmp.size();
        TagLibDescriptor arr[] = new TagLibDescriptor[count];
        int i = 0;
        for (Iterator e = tmp.iterator(); e.hasNext(); i++) {
            arr[i] = (TagLibDescriptor) e.next();
        }
        return arr;
    
private voidinit()
this method is called once to create the Documentbuilder required for creating documen objects from tlds

        if (!uninitialised) {
            synchronized (this) {
                if (!uninitialised) {
                    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                    String W3C_XML_SCHEMA = "http://www.w3c.org/2001/XMLSchema"; // NOI18N
                    String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage"; // NOI18N
                    factory.setNamespaceAware(true);
                    factory.setValidating(true);
                    factory.setAttribute(
                            "http://apache.org/xml/features/validation/schema", // NOI18N
                            Boolean.TRUE);
                    factory.setAttribute(
                            "http://xml.org/sax/features/validation", // NOI18N
                            Boolean.TRUE);
                    factory.setAttribute(
                            "http://apache.org/xml/features/allow-java-encodings", // NOI18N
                            Boolean.TRUE);
                    factory.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
                    try {
                        builder = factory.newDocumentBuilder();
                    } catch (ParserConfigurationException e) {
                        logger.log(Level.SEVERE, e.getMessage());
                    }
                    EntityResolver dh = new XMLValidationHandler(true);
                    ErrorHandler eh = new XMLValidationHandler(true);
                    builder.setErrorHandler(eh);
                    builder.setEntityResolver(dh);
                    uninitialised = true;
                }
            }
        }