Package org.eclipse.jst.jsp.core.internal.contentmodel.tld

Source Code of org.eclipse.jst.jsp.core.internal.contentmodel.tld.CMDocumentFactoryTLD

/*******************************************************************************
* Copyright (c) 2004, 2010 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*     IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.jsp.core.internal.contentmodel.tld;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jst.jsp.core.internal.Logger;
import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.JSP11TLDNames;
import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.JSP12TLDNames;
import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.JSP20TLDNames;
import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDFunction;
import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDInitParam;
import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDListener;
import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDValidator;
import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDVariable;
import org.eclipse.jst.jsp.core.internal.modelhandler.ModelHandlerForJSP;
import org.eclipse.jst.jsp.core.internal.provisional.JSP11Namespace;
import org.eclipse.jst.jsp.core.internal.provisional.JSP20Namespace;
import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;
import org.eclipse.jst.jsp.core.internal.util.DocumentProvider;
import org.eclipse.jst.jsp.core.internal.util.FacetModuleCoreSupport;
import org.eclipse.jst.jsp.core.taglib.IJarRecord;
import org.eclipse.jst.jsp.core.taglib.ITLDRecord;
import org.eclipse.jst.jsp.core.taglib.ITagDirRecord;
import org.eclipse.jst.jsp.core.taglib.ITaglibRecord;
import org.eclipse.jst.jsp.core.taglib.IURLRecord;
import org.eclipse.wst.common.uriresolver.internal.util.URIHelper;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList;
import org.eclipse.wst.sse.core.internal.util.JarUtilities;
import org.eclipse.wst.sse.core.utils.StringUtils;
import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
import org.eclipse.wst.xml.core.internal.contentmodel.factory.CMDocumentFactory;
import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
import org.w3c.dom.Element;
import org.w3c.dom.EntityReference;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
* CMDocumentBuilder for Tag Library Descriptors and tag files
*
* Returns namespace-less CMDocuments for a tag library descriptor, loading it
* directly from a file or extracted from a JAR archive. Content Model objects
* will implement the TLDCMDocument, TLDElementDeclaration, and
* TLDAttributeDeclaration interfaces for extended properties.
*/
public class CMDocumentFactoryTLD implements CMDocumentFactory {
  static final boolean _debug = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.jst.jsp.core/debug/tldcmdocument/factory")); //$NON-NLS-1$ //$NON-NLS-2$

  /**
   * CMDocumentFactoryTLD constructor comment.
   */
  public CMDocumentFactoryTLD() {
    super();
  }

  /**
   * NOT API
   *
   * @param baselocation
   * @param input
   * @return
   */
  public CMDocument buildCMDocument(String baselocation, InputStream input) {
    DocumentProvider provider = new DocumentProvider();
    provider.setValidating(false);
    provider.setRootElementName(JSP11TLDNames.TAGLIB);
    provider.setInputStream(input);
    if (baselocation != null)
      provider.setBaseReference(baselocation);
    return loadDocument(baselocation, provider.getRootElement());
  }

  /**
   * @param fileName
   * @return
   */
  private CMDocumentImpl buildCMDocumentFromFolder(IPath path) {
    if (_debug) {
      System.out.println("tagdir loading for " + path); //$NON-NLS-1$
    }
    // EBNF is listed at 1.3.10
    CMDocumentImpl document = new CMDocumentImpl();
    document.setBaseLocation(path.toString());
    document.setTlibversion("1.0"); //$NON-NLS-1$
    IFolder folder = ResourcesPlugin.getWorkspace().getRoot().getFolder(path);
    IResource[] tagfiles;
    try {
      tagfiles = folder.members();
      for (int i = 0; i < tagfiles.length; i++) {
        if (tagfiles[i].getType() == IResource.FILE) {
          if (tagfiles[i].getType() != IResource.FILE)
            continue;
          String extension = tagfiles[i].getFileExtension();
          if (extension != null && (extension.equals("tag") || extension.equals("tagx"))) {
            CMElementDeclaration ed = createElementDeclaration(document, (IFile) tagfiles[i]);
            if (ed != null) {
              document.fElements.setNamedItem(ed.getNodeName(), ed);
            }
          }
        }
      }
    }
    catch (CoreException e) {
      Logger.logException(e);
    }
    return document;
  }

  /**
   * NOT API
   *
   * @param fileName
   * @return
   */
  protected CMDocument buildCMDocumentFromFile(String fileName) {
    // load the taglib descriptor file
    DocumentProvider provider = new DocumentProvider();
    provider.setValidating(false);
    provider.setBaseReference(fileName);
    provider.setRootElementName(JSP11TLDNames.TAGLIB);
    provider.setFileName(fileName);
    Node rootElement = provider.getRootElement();
    return loadDocument(fileName, rootElement);
  }

  /**
   * Builds a CMDocument assuming the JSP v1.1 default path
   *
   * @param jarFileName -
   *            the name of the containing JAR file
   */
  protected CMDocument buildCMDocumentFromJar(String jarFileName) {
    // load the taglib descriptor file
    return buildCMDocumentFromJar(jarFileName, JarUtilities.JSP11_TAGLIB);
  }

  /**
   * Builds a CMDocument
   *
   * @param jarFileName -
   *            the name of the containing JAR file
   * @param contentFileName -
   *            the path within the JAR for a valid taglib descriptor
   */
  protected CMDocument buildCMDocumentFromJar(String jarFileName, String contentFileName) {
    // load the taglib descriptor file
    DocumentProvider provider = new DocumentProvider();
    provider.setValidating(false);
    provider.setBaseReference(jarFileName);
    provider.setRootElementName(JSP11TLDNames.TAGLIB);
    provider.setJarFileName(jarFileName);
    provider.setFileName(contentFileName);
    CMDocument document = loadDocument("jar:file://" + jarFileName + "!" + contentFileName, provider.getRootElement()); //$NON-NLS-1$ //$NON-NLS-2$
    // TODO: Add the tags declared in META-INF/tags, see JSP 2.0 section
    // 8.4.1
    return document;
  }

  protected CMAttributeDeclaration createAttributeDeclaration(CMDocument document, Node attrNode) {
    CMAttributeDeclarationImpl attr = new CMAttributeDeclarationImpl(document);

    Node child = attrNode.getFirstChild();
    while (child != null) {
      if (child.getNodeType() == Node.ELEMENT_NODE) {
        if (child.getNodeName().equals(JSP11TLDNames.NAME) && child.hasChildNodes()) {
          attr.setNodeName(getContainedText(child));
        }
        else if (child.getNodeName().equals(JSP12TLDNames.DESCRIPTION) && child.hasChildNodes()) {
          attr.setDescription(getContainedText(child));
        }
        else if (child.getNodeName().equals(JSP11TLDNames.ID) && child.hasChildNodes()) {
          attr.setId(getContainedText(child));
        }
        else if (child.getNodeName().equals(JSP11TLDNames.REQUIRED) && child.hasChildNodes()) {
          attr.setRequiredString(getContainedText(child));
        }
        else if (child.getNodeName().equals(JSP11TLDNames.RTEXPRVALUE) && child.hasChildNodes()) {
          attr.setRtexprvalue(getContainedText(child));
        }
        else if (child.getNodeName().equals(JSP20TLDNames.FRAGMENT) && child.hasChildNodes()) {
          attr.setFragment(Boolean.valueOf(getContainedText(child)).booleanValue());
        }
      }
      child = child.getNextSibling();
    }

    return attr;
  }

  /**
   * Builds a CMDocument from a taglib descriptor
   *
   * @param uri -
   *            the location of a valid taglib descriptor
   */
  public CMDocument createCMDocument(String uri) {
    CMDocument result = null;
    URL url = null;
    try {
      url = new URL(uri);
    }
    catch (MalformedURLException e) {
      result = createCMDocumentFromFile(uri);
    }
    if (result == null && url != null) {
      if (url.getProtocol().equals("file")) { //$NON-NLS-1$
        result = createCMDocumentFromFile(url.getFile());
      }
      else {
        /**
         * Skip anything else since trying to load a TLD from a remote
         * location has unpredictable performance impact.
         */
      }
    }
    if (result == null)
      result = new CMDocumentImpl();
    return result;
  }

  /**
   * @param fileName
   * @return
   */
  private CMDocument createCMDocumentFromFile(String fileName) {
    CMDocument result = null;
    if (fileName.endsWith(".jar")) { //$NON-NLS-1$
      result = buildCMDocumentFromJar(fileName);
    }
    else {
      File file = new File(fileName);
      try {
        if (file.isDirectory()) {
          result = buildCMDocumentFromDirectory(file);
        }
        else {
          result = buildCMDocumentFromFile(fileName);
        }
      }
      catch (SecurityException e) {
        result = null;
      }
    }
    return result;
  }

  private CMDocument buildCMDocumentFromDirectory(File file) {
    IFile[] foundFilesForLocation = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocation(new Path(file.getPath()));
    for (int i = 0; i < foundFilesForLocation.length; i++) {
      if (foundFilesForLocation[i].isAccessible() && foundFilesForLocation[i].getType() == IResource.FOLDER) {
        return buildCMDocumentFromFolder(foundFilesForLocation[i].getFullPath());
      }
    }
    return null;
  }

  protected CMElementDeclaration createElementDeclaration(CMDocumentImpl document, Element tagFileNode, String path) {
    CMElementDeclarationImpl ed = new CMElementDeclarationImpl(document);
    /*
     * Preload with information from the tag file--it can be overwritten
     * by the values from the TLD
     */
    IPath tagPath = FacetModuleCoreSupport.resolve(new Path(document.getBaseLocation()), path);
    if (tagPath.segmentCount() > 1) {
      IFile tagFile = ResourcesPlugin.getWorkspace().getRoot().getFile(tagPath);
      if (tagFile.isAccessible()) {
        ed.setPath(tagFile.getFullPath().toString());
        if (tagPath.getFileExtension().equals("tag")) {
          loadTagFile(ed, tagFile, true);
        }
        else if (tagPath.getFileExtension().equals("tagx")) {
          loadTagXFile(ed, tagFile, true);
        }

        if (tagFile.getLocation() != null && ed.getSmallIcon() != null) {
          ed.setSmallIconURL(URIHelper.normalize(ed.getSmallIcon(), "file:" + tagFile.getLocation().toString(), tagFile.getLocation().removeLastSegments(1).toString()));
        }
      }
      else if (isJarFile(document.getBaseLocation())) {
        String jarLocation = document.getBaseLocation();
        String[] entries = JarUtilities.getEntryNames(jarLocation);
        boolean tag;
        for (int jEntry = 0; jEntry < entries.length; jEntry++) {
          tag = false;
          if (((tag = entries[jEntry].endsWith(".tag")) || entries[jEntry].endsWith(".tagx")) && entries[jEntry].startsWith("META-INF/tags/")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
              InputStream contents = JarUtilities.getInputStream(jarLocation, entries[jEntry]);
              if (tag) {//$NON-NLS-1$
                loadTagFile(ed, tagFile, true, contents);
              }
              else {
                loadTagXFile(ed, tagFile, true, contents);
              }
              try {
                contents.close();
              }
              catch (IOException e) {
                Logger.log(Logger.ERROR_DEBUG, null, e);
              }
            }
          } 
      }
    }

    // load information declared within the .tld
    Node child = tagFileNode.getFirstChild();
    while (child != null) {
      if (child.getNodeType() == Node.ELEMENT_NODE) {
        String nodeName = child.getNodeName();
        if (nodeName.equals(JSP12TLDNames.DESCRIPTION) && child.hasChildNodes()) {
          ed.setDescription(getContainedText(child));
        }
        else if (nodeName.equals(JSP12TLDNames.DISPLAY_NAME) && child.hasChildNodes()) {
          ed.setDisplayName(getContainedText(child));
        }
        else if (nodeName.equals(JSP20TLDNames.EXAMPLE) && child.hasChildNodes()) {
          ed.setExample(getContainedText(child));
        }
        else if (nodeName.equals(JSP20TLDNames.ICON) && child.hasChildNodes()) {
          ed.setSmallIcon(getContainedText(child));
        }
        else if (nodeName.equals(JSP12TLDNames.NAME) && child.hasChildNodes()) {
          ed.setNodeName(getContainedText(child));
        }
        else if (nodeName.equals(JSP20TLDNames.PATH) && child.hasChildNodes()) {
          ed.setPath(getContainedText(child));
        }
        else if (nodeName.equals(JSP20TLDNames.TAG_EXTENSION)) {
          ed.getExtensions().add(child);
        }
      }
      child = child.getNextSibling();
    }
   
    return ed;
  }

  private boolean isJarFile(String path) {
    if (path == null)
      return false;
    final int idx = path.lastIndexOf('.');
    return idx >= 0 && idx < (path.length() - 1) && path.substring(idx + 1).equalsIgnoreCase("jar"); //$NON-NLS-1$
  }

  protected CMElementDeclaration createElementDeclaration(CMDocument document, Node tagNode) {
    CMElementDeclarationImpl ed = new CMElementDeclarationImpl(document);

    Node child = tagNode.getFirstChild();
    while (child != null) {
      if (child.getNodeType() == Node.ELEMENT_NODE) {
        // tag information
        String nodeName = child.getNodeName();
        if (nodeName.equals(JSP11TLDNames.NAME) && child.hasChildNodes()) {
          ed.setNodeName(getContainedText(child));
        }
        else if ((nodeName.equals(JSP11TLDNames.TAGCLASS) || nodeName.equals(JSP12TLDNames.TAG_CLASS)) && child.hasChildNodes()) {
          ed.setTagclass(getContainedText(child));
        }
        else if ((nodeName.equals(JSP11TLDNames.TEICLASS) || nodeName.equals(JSP12TLDNames.TEI_CLASS)) && child.hasChildNodes()) {
          ed.setTeiclass(getContainedText(child));
        }
        else if ((nodeName.equals(JSP11TLDNames.BODYCONTENT) || nodeName.equals(JSP12TLDNames.BODY_CONTENT)) && child.hasChildNodes()) {
          String bodycontent = getContainedText(child);
          // Apparently, Apache Tomcat is not case sensitive about
          // these values
          if (bodycontent.equalsIgnoreCase(JSP11TLDNames.CONTENT_JSP))
            ed.setBodycontent(JSP11TLDNames.CONTENT_JSP);
          else if (bodycontent.equalsIgnoreCase(JSP11TLDNames.CONTENT_TAGDEPENDENT))
            ed.setBodycontent(JSP11TLDNames.CONTENT_TAGDEPENDENT);
          else if (bodycontent.equalsIgnoreCase(JSP11TLDNames.CONTENT_EMPTY))
            ed.setBodycontent(JSP11TLDNames.CONTENT_EMPTY);
          else if (bodycontent.equalsIgnoreCase(JSP20TLDNames.CONTENT_SCRIPTLESS))
            ed.setBodycontent(JSP20TLDNames.CONTENT_SCRIPTLESS);
        }
        // info (1.1 only) or description (1.2 only)
        else if ((nodeName.equals(JSP11TLDNames.INFO) || nodeName.equals(JSP12TLDNames.DESCRIPTION)) && child.hasChildNodes()) {
          ed.setDescription(getContainedText(child));
        }
        // attributes
        else if (nodeName.equals(JSP11TLDNames.ATTRIBUTE)) {
          CMAttributeDeclaration attr = createAttributeDeclaration(document, child);
          ed.fAttributes.setNamedItem(attr.getAttrName(), attr);
        }
        // variables
        else if (nodeName.equals(JSP12TLDNames.VARIABLE)) {
          ed.getVariables().add(createVariable(child));
        }
        else if (nodeName.equals(JSP12TLDNames.LARGE_ICON) && child.hasChildNodes()) {
          ed.setLargeIcon(getContainedText(child));
        }
        else if (nodeName.equals(JSP12TLDNames.SMALL_ICON) && child.hasChildNodes()) {
          ed.setSmallIcon(getContainedText(child));
        }
        else if (nodeName.equals(JSP20TLDNames.TAG_EXTENSION) && child.getNodeType() == Node.ELEMENT_NODE) {
          ed.getExtensions().add(child);
        }
        else if (nodeName.equals(JSP20TLDNames.DYNAMIC_ATTRIBUTES) && child.hasChildNodes()) {
          ed.setDynamicAttributes(getContainedText(child));
        }
      }
      child = child.getNextSibling();
    }
    return ed;
  }

  private CMElementDeclaration createElementDeclaration(CMDocument document, IFile tagFile) {
    CMElementDeclarationImpl ed = new CMElementDeclarationImpl(document);
    // in tag files, the default body content is scriptless instead of JSP
    ed.setBodycontent(JSP20TLDNames.CONTENT_SCRIPTLESS);
    String shortFilename = tagFile.getName();
    String fileExtension = tagFile.getFileExtension();
    if (fileExtension != null && fileExtension.length() > 0) {
      shortFilename = shortFilename.substring(0, shortFilename.length() - fileExtension.length() - 1);
    }
    ed.setNodeName(shortFilename);
    ed.setPath(tagFile.getFullPath().toString());
    if (fileExtension.equals("tag")) {
      loadTagFile(ed, tagFile, true);
    }
    else if (fileExtension.equals("tagx")) {
      loadTagXFile(ed, tagFile, true);
    }

    if (tagFile.getLocation() != null && ed.getSmallIcon() != null) {
      ed.setSmallIconURL(URIHelper.normalize(ed.getSmallIcon(), "file:" + tagFile.getLocation().toString(), tagFile.getLocation().removeLastSegments(1).toString()));
    }
    return ed;
  }

  protected TLDFunction createFunction(CMDocument document, Node functionNode) {
    TLDFunctionImpl function = new TLDFunctionImpl(document);
    boolean hasName = false;

    Node child = functionNode.getFirstChild();
    while (child != null) {
      if (child.getNodeType() == Node.ELEMENT_NODE) {
        // tag information
        String nodeName = child.getNodeName();
        if (nodeName.equals(JSP12TLDNames.DESCRIPTION) && child.hasChildNodes()) {
          function.setDescription(getContainedText(child));
        }
        else if (nodeName.equals(JSP12TLDNames.DISPLAY_NAME) && child.hasChildNodes()) {
          function.setName(getContainedText(child));
        }
        else if (nodeName.equals(JSP20TLDNames.EXAMPLE) && child.hasChildNodes()) {
          function.setExample(getContainedText(child));
        }
        else if (nodeName.equals(JSP20TLDNames.FUNCTION_CLASS) && child.hasChildNodes()) {
          function.setClassName(getContainedText(child));
        }
        else if (nodeName.equals(JSP20TLDNames.FUNCTION_EXTENSION) && child.hasChildNodes()) {
          function.getExtensions().add(child);
        }
        else if (nodeName.equals(JSP20TLDNames.FUNCTION_SIGNATURE) && child.hasChildNodes()) {
          function.setSignature(getContainedText(child));
        }
        else if (nodeName.equals(JSP20TLDNames.ICON) && child.hasChildNodes()) {
          function.setIcon(getContainedText(child));
        }
        else if (nodeName.equals(JSP12TLDNames.NAME) && child.hasChildNodes()) {
          function.setName(getContainedText(child));
          hasName = function.getName().trim().length() > 0;
        }
      }
      child = child.getNextSibling();
    }
    if (hasName) {
      return function;
    }
    return null;
  }

  protected TLDInitParam createInitParam(Node initParamNode) {
    TLDInitParamImpl initParam = new TLDInitParamImpl();
    Node child = initParamNode.getFirstChild();
    while (child != null) {
      if (child.getNodeType() == Node.ELEMENT_NODE) {
        String nodeName = child.getNodeName();
        if (nodeName.equals(JSP12TLDNames.VALIDATOR_PARAM_NAME) && child.hasChildNodes()) {
          initParam.setName(getContainedText(child));
        }
        else if (nodeName.equals(JSP12TLDNames.VALIDATOR_PARAM_VALUE) && child.hasChildNodes()) {
          initParam.setValue(getContainedText(child));
        }
        else if (nodeName.equals(JSP12TLDNames.DESCRIPTION) && child.hasChildNodes()) {
          initParam.setDescription(getContainedText(child));
        }
      }
      child = child.getNextSibling();
    }
    return initParam;
  }

  protected TLDListener createListener(Node listenerNode) {
    TLDListenerImpl listener = new TLDListenerImpl();
    Node child = listenerNode.getFirstChild();
    while (child != null) {
      if (child.getNodeType() == Node.ELEMENT_NODE) {
        String nodeName = child.getNodeName();
        if (nodeName.equals(JSP12TLDNames.LISTENER_CLASS) && child.hasChildNodes()) {
          listener.setListenerClass(getContainedText(child));
        }
      }
      child = child.getNextSibling();
    }
    return listener;
  }

  protected TLDValidator createValidator(Node validatorNode) {
    TLDValidatorImpl validator = new TLDValidatorImpl();
    Node child = validatorNode.getFirstChild();
    while (child != null) {
      if (child.getNodeType() == Node.ELEMENT_NODE) {
        String nodeName = child.getNodeName();
        if (nodeName.equals(JSP12TLDNames.VALIDATOR_CLASS) && child.hasChildNodes()) {
          validator.setValidatorClass(getContainedText(child));
        }
        else if (nodeName.equals(JSP12TLDNames.VALIDATOR_INIT_PARAM) && child.hasChildNodes()) {
          validator.getInitParams().add(createInitParam(child));
        }
      }
      child = child.getNextSibling();
    }
    return validator;
  }

  protected TLDVariable createVariable(Node variableNode) {
    TLDVariableImpl variable = new TLDVariableImpl();
    Node child = variableNode.getFirstChild();
    while (child != null) {
      if (child.getNodeType() == Node.ELEMENT_NODE) {
        String nodeName = child.getNodeName();
        if (nodeName.equals(JSP12TLDNames.VARIABLE_CLASS) && child.hasChildNodes()) {
          variable.setVariableClass(getContainedText(child));
        }
        else if (nodeName.equals(JSP12TLDNames.VARIABLE_DECLARE) && child.hasChildNodes()) {
          variable.setDeclareString(getContainedText(child));
        }
        else if (nodeName.equals(JSP12TLDNames.VARIABLE_NAME_FROM_ATTRIBUTE) && child.hasChildNodes()) {
          variable.setNameFromAttribute(getContainedText(child));
        }
        else if (nodeName.equals(JSP12TLDNames.VARIABLE_NAME_GIVEN) && child.hasChildNodes()) {
          variable.setNameGiven(getContainedText(child));
        }
        else if (nodeName.equals(JSP12TLDNames.VARIABLE_SCOPE) && child.hasChildNodes()) {
          variable.setScope(getContainedText(child));
        }
        else if (nodeName.equals(JSP12TLDNames.DESCRIPTION) && child.hasChildNodes()) {
          variable.setDescription(getContainedText(child));
        }
      }
      child = child.getNextSibling();
    }
    return variable;
  }

  protected String getContainedText(Node parent) {
    NodeList children = parent.getChildNodes();
    if (children.getLength() == 1) {
      return getValue(children.item(0));
    }
    StringBuffer s = new StringBuffer();
    Node child = parent.getFirstChild();
    while (child != null) {
      if (child.getNodeType() == Node.ENTITY_REFERENCE_NODE) {
        String reference = ((EntityReference) child).getNodeValue();
        if (reference == null && child.getNodeName() != null) {
          reference = "&" + child.getNodeName() + ";"; //$NON-NLS-1$ //$NON-NLS-2$
        }
        if (reference != null) {
          s.append(reference.trim());
        }
      }
      else {
        s.append(getValue(child));
      }
      child = child.getNextSibling();
    }
    return s.toString().trim();
  }

  private String getValue(Node n) {
    if (n == null)
      return ""; //$NON-NLS-1$
    String value = n.getNodeValue();
    if (value == null)
      return ""; //$NON-NLS-1$
    return value.trim();
  }

  public boolean isBuilderForGrammar(String grammarFileName) {
    String fileName = grammarFileName.toLowerCase();
    return fileName.endsWith(".tld") || fileName.endsWith(".jar"); //$NON-NLS-2$//$NON-NLS-1$
  }

  private CMDocument loadDocument(String baseLocation, Node taglib) {
    Node root = taglib;

    // create the CMDocument
    CMDocumentImpl document = new CMDocumentImpl();
    document.setBaseLocation(baseLocation);

    if (root == null) {
      if (_debug) {
        System.out.println("null \"taglib\" element for TLD " + baseLocation); //$NON-NLS-1$
      }
      return document;
    }

    // populate the CMDocument
    Node child = root.getFirstChild();
    while (child != null) {
      if (child.getNodeType() != Node.ELEMENT_NODE) {
        child = child.getNextSibling();
        continue;
      }
      String nodeName = child.getNodeName();
      if(nodeName.indexOf(':') > 0) {
        nodeName = nodeName.substring(nodeName.indexOf(':'));
      }
      // tag
      if (nodeName.equals(JSP11TLDNames.TAG)) {
        CMElementDeclaration ed = createElementDeclaration(document, child);
        if (ed != null) {
          document.fElements.setNamedItem(ed.getNodeName(), ed);
        }
      }
      // tag-file
      else if (nodeName.equals(JSP20TLDNames.TAG_FILE) && child.getNodeType() == Node.ELEMENT_NODE && child.hasChildNodes()) {
        Element tagFileElement = (Element) child;
        Node path = tagFileElement.getFirstChild();
        while (path != null) {
          if (path.getNodeType() == Node.ELEMENT_NODE && (JSP20TLDNames.PATH.equals(path.getNodeName()) || JSP20TLDNames.PATH.equals(path.getLocalName()))) {
            String pathValue = getContainedText(path);
            if (pathValue != null && pathValue.length() > 0) {
              CMElementDeclarationImpl ed = (CMElementDeclarationImpl) createElementDeclaration(document, tagFileElement, pathValue);
              if (ed != null) {
                document.fElements.setNamedItem(ed.getNodeName(), ed);
              }
            }
          }
          path = path.getNextSibling();
        }
      }
      // other one-of-a-kind children
      // JSP version
      else if ((nodeName.equals(JSP11TLDNames.JSPVERSION) || nodeName.equals(JSP12TLDNames.JSP_VERSION)) && child.hasChildNodes()) {
        document.setJspversion(getContainedText(child));
      }
      // tag library version
      else if ((nodeName.equals(JSP11TLDNames.TLIBVERSION) || nodeName.equals(JSP12TLDNames.TLIB_VERSION)) && child.hasChildNodes()) {
        document.setTlibversion(getContainedText(child));
      }
      // short name
      else if ((nodeName.equals(JSP11TLDNames.SHORTNAME) || nodeName.equals(JSP12TLDNames.SHORT_NAME)) && child.hasChildNodes()) {
        document.setShortname(getContainedText(child));
      }
      // URI/URN
      else if ((nodeName.equals(JSP11TLDNames.URI) || nodeName.equals(JSP11TLDNames.URN)) && child.hasChildNodes()) { //$NON-NLS-1$
        document.setUri(getContainedText(child));
      }
      // info
      else if (nodeName.equals(JSP11TLDNames.INFO) && child.hasChildNodes()) {
        document.setInfo(getContainedText(child));
      }
      // New JSP 1.2
      // description
      else if (nodeName.equals(JSP12TLDNames.DESCRIPTION) && child.hasChildNodes()) {
        document.setDescription(getContainedText(child));
      }
      // display name
      else if (nodeName.equals(JSP12TLDNames.DISPLAY_NAME) && child.hasChildNodes()) {
        document.setDisplayName(getContainedText(child));
      }
      // large icon
      else if (nodeName.equals(JSP12TLDNames.LARGE_ICON) && child.hasChildNodes()) {
        document.setLargeIcon(getContainedText(child));
      }
      // small icon
      else if (nodeName.equals(JSP12TLDNames.SMALL_ICON) && child.hasChildNodes()) {
        document.setSmallIcon(getContainedText(child));
      }
      // validator
      else if (nodeName.equals(JSP12TLDNames.VALIDATOR)) {
        document.setValidator(createValidator(child));
      }
      // listener
      else if (nodeName.equals(JSP12TLDNames.LISTENER)) {
        document.getListeners().add(createListener(child));
      }
      else if (nodeName.equals(JSP20TLDNames.FUNCTION)) {
        TLDFunction function = createFunction(document, child);
        if (function != null) {
          document.getFunctions().add(function);
        }
      }
      else if (nodeName.equals(JSP20TLDNames.TAGLIB_EXTENSION)) {
        document.getExtensions().add(child);
      }

      child = child.getNextSibling();
    }
    return document;
  }

  void loadTagXFile(final CMElementDeclarationImpl ed, IFile tagxFile, boolean allowIncludes) {
    loadTagXFile(ed, tagxFile, allowIncludes, null);
  }
 
  void loadTagXFile(final CMElementDeclarationImpl ed, IFile tagxFile, boolean allowIncludes, InputStream inputStream) {
    ed.setPath(tagxFile.getFullPath().toString());
    ed.setTagSource(TLDElementDeclaration.SOURCE_TAG_FILE);
    try {
      SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
      InputSource inputSource = new InputSource(tagxFile.getFullPath().toString());
      InputStream input = inputStream != null ? inputStream : tagxFile.getContents(false);
      inputSource.setByteStream(input);
      parser.parse(inputSource, new DefaultHandler() {
        public InputSource resolveEntity(String publicId, String systemId) throws SAXException {
          InputSource inputSource2 = new InputSource(systemId);
          inputSource2.setByteStream(new ByteArrayInputStream(new byte[0]));
          return inputSource2;
        }

        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
          super.startElement(uri, localName, qName, attributes);
          if (qName.equals(JSP20Namespace.ElementName.DIRECTIVE_TAG)) {
            if (attributes.getIndex(JSP12TLDNames.DISPLAY_NAME) >= 0)
              ed.setDisplayName(attributes.getValue(JSP12TLDNames.DISPLAY_NAME));
            if (attributes.getIndex(JSP12TLDNames.BODY_CONTENT) >= 0)
              ed.setBodycontent(attributes.getValue(JSP12TLDNames.BODY_CONTENT));
            if (attributes.getIndex(JSP20TLDNames.DYNAMIC_ATTRIBUTES) >= 0)
              ed.setDynamicAttributes(attributes.getValue(JSP20TLDNames.DYNAMIC_ATTRIBUTES));
            if (attributes.getIndex(JSP12TLDNames.SMALL_ICON) >= 0)
              ed.setSmallIcon(attributes.getValue(JSP12TLDNames.SMALL_ICON));
            if (attributes.getIndex(JSP12TLDNames.LARGE_ICON) >= 0)
              ed.setLargeIcon(attributes.getValue(JSP12TLDNames.LARGE_ICON));
            if (attributes.getIndex(JSP12TLDNames.DESCRIPTION) >= 0)
              ed.setDescription(attributes.getValue(JSP12TLDNames.DESCRIPTION));
            if (attributes.getIndex(JSP20TLDNames.EXAMPLE) >= 0)
              ed.setExample(attributes.getValue(JSP20TLDNames.EXAMPLE));
            if (attributes.getIndex(JSP20TLDNames.SCRIPTING_LANGUAGE) >= 0)
              ed.setScriptingLanguage(attributes.getValue(JSP20TLDNames.SCRIPTING_LANGUAGE));
            if (attributes.getIndex(JSP20TLDNames.IMPORT) >= 0)
              ed.setImport(attributes.getValue(JSP20TLDNames.IMPORT));
            if (attributes.getIndex(JSP20TLDNames.PAGE_ENCODING) >= 0)
              ed.setPageEncoding(attributes.getValue(JSP20TLDNames.PAGE_ENCODING));
            if (attributes.getIndex(JSP20TLDNames.IS_EL_IGNORED) >= 0)
              ed.setIsELIgnored(attributes.getValue(JSP20TLDNames.IS_EL_IGNORED));
          }
          else if (qName.equals(JSP20Namespace.ElementName.DIRECTIVE_ATTRIBUTE)) {
            CMAttributeDeclarationImpl attribute = new CMAttributeDeclarationImpl(ed.getOwnerDocument());
            String nameValue = attributes.getValue(JSP12TLDNames.NAME);
            attribute.setNodeName(nameValue);
            if (attributes.getIndex(JSP20TLDNames.FRAGMENT) >= 0)
              attribute.setFragment(Boolean.valueOf(attributes.getValue(JSP20TLDNames.FRAGMENT)).booleanValue());
            if (attributes.getIndex(JSP12TLDNames.RTEXPRVALUE) >= 0)
              attribute.setRtexprvalue(attributes.getValue(JSP12TLDNames.RTEXPRVALUE));
            if (attributes.getIndex(JSP20TLDNames.TYPE) >= 0)
              attribute.setType(attributes.getValue(JSP20TLDNames.TYPE));
            if (attributes.getIndex(JSP12TLDNames.DESCRIPTION) >= 0)
              attribute.setDescription(attributes.getValue(JSP12TLDNames.DESCRIPTION));
            if (attributes.getIndex(JSP12TLDNames.REQUIRED) >= 0)
              attribute.setRequiredString(attributes.getValue(JSP12TLDNames.REQUIRED));
            if (nameValue != null && nameValue.length() > 0) {
              ed.fAttributes.setNamedItem(nameValue, attribute);
            }
          }
          else if (qName.equals(JSP20Namespace.ElementName.DIRECTIVE_VARIABLE)) {
            TLDVariableImpl variable = new TLDVariableImpl();
            if (attributes.getIndex(JSP12TLDNames.VARIABLE_NAME_GIVEN) >= 0)
              variable.setNameGiven(attributes.getValue(JSP12TLDNames.VARIABLE_NAME_GIVEN));
            if (attributes.getIndex(JSP12TLDNames.VARIABLE_NAME_FROM_ATTRIBUTE) >= 0)
              variable.setNameFromAttribute(attributes.getValue(JSP12TLDNames.VARIABLE_NAME_FROM_ATTRIBUTE));
            if (attributes.getIndex(JSP20TLDNames.VARIABLE_ALIAS) >= 0)
              variable.setAlias(attributes.getValue(JSP20TLDNames.VARIABLE_ALIAS));
            if (attributes.getIndex(JSP12TLDNames.VARIABLE_CLASS) >= 0)
              variable.setVariableClass(attributes.getValue(JSP12TLDNames.VARIABLE_CLASS));
            if (attributes.getIndex(JSP12TLDNames.VARIABLE_DECLARE) >= 0)
              variable.setDeclareString(attributes.getValue(JSP12TLDNames.VARIABLE_DECLARE));
            if (attributes.getIndex(JSP11Namespace.ATTR_NAME_SCOPE) >= 0)
              variable.setScope(attributes.getValue(JSP11Namespace.ATTR_NAME_SCOPE));
            if (attributes.getIndex(JSP12TLDNames.DESCRIPTION) >= 0)
              variable.setDescription(attributes.getValue(JSP12TLDNames.DESCRIPTION));
            if (variable.getAlias() != null || variable.getNameFromAttribute() != null || variable.getNameGiven() != null) {
              ed.getVariables().add(variable);
            }
          }
          else if (qName.equals(JSP11Namespace.ElementName.DIRECTIVE_INCLUDE)) {
            IPath filePath = null;
            String text = attributes.getValue(JSP11Namespace.ATTR_NAME_FILE);
            if (text != null) {
              filePath = FacetModuleCoreSupport.resolve(new Path(((CMDocumentImpl) ed.getOwnerDocument()).getBaseLocation()), text);
              IFile includedFile = ResourcesPlugin.getWorkspace().getRoot().getFile(filePath);
              if (includedFile.isAccessible()) {
                loadTagXFile(ed, includedFile, false);
              }
            }
          }
        }
      });
      input.close();
    }
    catch (ParserConfigurationException e) {
      Logger.log(Logger.ERROR_DEBUG, e.getMessage(), e);
    }
    catch (SAXException e) {
      Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
    }
    catch (IOException e) {
      Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
    }
    catch (CoreException e) {
      Logger.log(Logger.WARNING_DEBUG, e.getMessage(), e);
    }
    ed.setLocationString(tagxFile.getFullPath().toString());
  }

  private void loadTagFile(CMElementDeclarationImpl ed, IFile tagFile, boolean allowIncludes) {
    loadTagFile(ed, tagFile, allowIncludes, null);
  }
 
  private void loadTagFile(CMElementDeclarationImpl ed, IFile tagFile, boolean allowIncludes, InputStream inputStream) {
    try {
      ed.setPath(tagFile.getFullPath().toString());
      ed.setTagSource(TLDElementDeclaration.SOURCE_TAG_FILE);
      ed.setLocationString(tagFile.getFullPath().toString());
      IStructuredDocument document = null;
      if(inputStream != null) {
        document = (IStructuredDocument)new ModelHandlerForJSP().getDocumentLoader().createNewStructuredDocument(tagFile.getName(), inputStream);
      }
      else if(tagFile.isAccessible()) {
        document = (IStructuredDocument) new ModelHandlerForJSP().getDocumentLoader().createNewStructuredDocument(tagFile);
      }
      if (document == null)
        return;
      IStructuredDocumentRegion documentRegion = document.getFirstStructuredDocumentRegion();
      while (documentRegion != null) {
        if (documentRegion.getType().equals(DOMJSPRegionContexts.JSP_DIRECTIVE_NAME)) {
          if (documentRegion.getNumberOfRegions() > 2) {
            ITextRegionList regions = documentRegion.getRegions();
            String directiveName = documentRegion.getText(regions.get(1));
            if (JSP12TLDNames.TAG.equals(directiveName)) {
              // 8.5.1
              String attrName = null;
              for (int i = 2; i < documentRegion.getNumberOfRegions(); i++) {
                ITextRegion region = regions.get(i);
                String text = documentRegion.getText(region);
                if (region.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) {
                  attrName = text;
                }
                // process value
                else if (region.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) {
                  text = StringUtils.strip(text);
                  if (JSP12TLDNames.DISPLAY_NAME.equals(attrName)) {
                    ed.setDisplayName(text);
                  }
                  else if (JSP12TLDNames.BODY_CONTENT.equals(attrName)) {
                    ed.setBodycontent(text);
                  }
                  else if (JSP20TLDNames.DYNAMIC_ATTRIBUTES.equals(attrName)) {
                    ed.setDynamicAttributes(text);
                  }
                  else if (JSP12TLDNames.SMALL_ICON.equals(attrName)) {
                    ed.setSmallIcon(text);
                  }
                  else if (JSP12TLDNames.LARGE_ICON.equals(attrName)) {
                    ed.setLargeIcon(text);
                  }
                  else if (JSP12TLDNames.DESCRIPTION.equals(attrName)) {
                    ed.setDescription(text);
                  }
                  else if (JSP20TLDNames.EXAMPLE.equals(attrName)) {
                    ed.setExample(text);
                  }
                  else if (JSP20TLDNames.SCRIPTING_LANGUAGE.equals(attrName)) {
                    ed.setScriptingLanguage(text);
                  }
                  else if (JSP20TLDNames.IMPORT.equals(attrName)) {
                    ed.setImport(text);
                  }
                  else if (JSP20TLDNames.PAGE_ENCODING.equals(attrName)) {
                    ed.setPageEncoding(text);
                  }
                  else if (JSP20TLDNames.IS_EL_IGNORED.equals(attrName)) {
                    ed.setIsELIgnored(text);
                  }
                }
              }
            }
            else if (JSP12TLDNames.ATTRIBUTE.equals(directiveName)) {
              CMAttributeDeclarationImpl attribute = new CMAttributeDeclarationImpl(ed.getOwnerDocument());
              // 8.5.2
              String attrName = null;
              for (int i = 2; i < documentRegion.getNumberOfRegions(); i++) {
                ITextRegion region = regions.get(i);
                String text = documentRegion.getText(region);
                if (region.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) {
                  attrName = text;
                }
                // process value
                else if (region.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE && attrName != null) {
                  text = StringUtils.strip(text);
                  if (JSP12TLDNames.NAME.equals(attrName)) {
                    attribute.setNodeName(text);
                  }
                  else if (JSP20TLDNames.FRAGMENT.equals(attrName)) {
                    attribute.setFragment(Boolean.valueOf(text).booleanValue());
                  }
                  else if (JSP12TLDNames.RTEXPRVALUE.equals(attrName)) {
                    attribute.setRtexprvalue(text);
                  }
                  else if (JSP20TLDNames.TYPE.equals(attrName)) {
                    attribute.setType(text);
                  }
                  else if (JSP12TLDNames.DESCRIPTION.equals(attrName)) {
                    attribute.setDescription(text);
                  }
                  else if (JSP12TLDNames.REQUIRED.equals(attrName)) {
                    attribute.setRequiredString(text);
                  }
                }
              }
              if (attribute.getNodeName() != null) {
                ed.fAttributes.setNamedItem(attribute.getNodeName(), attribute);
              }
            }
            else if (JSP12TLDNames.VARIABLE.equals(directiveName)) {
              TLDVariableImpl variable = new TLDVariableImpl();
              String attrName = null;
              for (int i = 2; i < documentRegion.getNumberOfRegions(); i++) {
                ITextRegion region = regions.get(i);
                String text = documentRegion.getText(region);
                if (region.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) {
                  attrName = text;
                }
                // process value
                else if (region.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE && attrName != null) {
                  text = StringUtils.strip(text);
                  if (JSP12TLDNames.VARIABLE_NAME_GIVEN.equals(attrName)) {
                    variable.setNameGiven(text);
                  }
                  else if (JSP12TLDNames.VARIABLE_NAME_FROM_ATTRIBUTE.equals(attrName)) {
                    variable.setNameFromAttribute(text);
                  }
                  else if (JSP20TLDNames.VARIABLE_ALIAS.equals(attrName)) {
                    variable.setAlias(text);
                  }
                  else if (JSP12TLDNames.VARIABLE_CLASS.equals(attrName)) {
                    variable.setVariableClass(text);
                  }
                  else if (JSP12TLDNames.VARIABLE_DECLARE.equals(attrName)) {
                    variable.setDeclareString(text);
                  }
                  else if (JSP11Namespace.ATTR_NAME_SCOPE.equals(attrName)) {
                    variable.setScope(text);
                  }
                  else if (JSP12TLDNames.DESCRIPTION.equals(attrName)) {
                    variable.setDescription(text);
                  }
                }
              }
              if (variable.getAlias() != null || variable.getNameFromAttribute() != null || variable.getNameGiven() != null) {
                ed.getVariables().add(variable);
              }
            }
            else if ("include".equals(directiveName) && allowIncludes) {
              String attrName = null;
              for (int i = 2; i < documentRegion.getNumberOfRegions(); i++) {
                ITextRegion region = regions.get(i);
                String text = documentRegion.getText(region);
                if (region.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_NAME) {
                  attrName = text;
                }
                // process value
                else if (region.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE && attrName != null) {
                  text = StringUtils.strip(text);
                  if (JSP11Namespace.ATTR_NAME_FILE.equals(attrName)) {
                    IPath filePath = FacetModuleCoreSupport.resolve(new Path(((CMDocumentImpl) ed.getOwnerDocument()).getBaseLocation()), text);

                    IFile includedFile = ResourcesPlugin.getWorkspace().getRoot().getFile(filePath);
                    if (includedFile.isAccessible()) {
                      loadTagFile(ed, includedFile, false);
                    }
                  }
                }
              }
            }
          }
        }

        documentRegion = documentRegion.getNext();
      }

    }
    catch (IOException e) {
      // Logger.logException("problem parsing " + tagFile, e); // can be caused by a still-in-development file
    }
    catch (CoreException e) {
      // Logger.logException("problem parsing " + tagFile, e); // frequently out of sync
    }
  }

  /**
   * @param reference
   * @return
   */
  public CMDocument createCMDocument(ITaglibRecord reference) {
    CMDocumentImpl document = null;
    switch (reference.getRecordType()) {
      case (ITaglibRecord.TLD) : {
        ITLDRecord record = (ITLDRecord) reference;
        IResource file = ResourcesPlugin.getWorkspace().getRoot().getFile(record.getPath());
        if (file.getLocation() != null) {
          document = (CMDocumentImpl) buildCMDocumentFromFile(file.getLocation().toString());
          document.setLocationString(record.getPath().toString());
          if (_debug && document != null && document.getElements().getLength() == 0) {
            System.out.println("failure parsing " + record.getPath()); //$NON-NLS-1$
          }

          if (document.getSmallIcon() != null) {
            String iconPath = URIHelper.normalize(((TLDDocument) document).getSmallIcon(), file.getLocation().toString(), "/"); //$NON-NLS-1$
            document.setProperty(JSP12TLDNames.SMALL_ICON, "file:" + iconPath); //$NON-NLS-1$
          }
          if (document.getLargeIcon() != null) {
            String iconPath = URIHelper.normalize(((TLDDocument) document).getLargeIcon(), file.getLocation().toString(), "/"); //$NON-NLS-1$
            document.setProperty(JSP12TLDNames.LARGE_ICON, "file:" + iconPath); //$NON-NLS-1$
          }
        }
      }
        break;
      case (ITaglibRecord.JAR) : {
        IJarRecord record = (IJarRecord) reference;
        document = (CMDocumentImpl) buildCMDocumentFromJar(record.getLocation().toString());
        document.setLocationString("jar:file:" + record.getLocation().toString() + "!/META-INF/taglib.tld");
        if (document.getSmallIcon() != null) {
          String iconPath = URIHelper.normalize(((TLDDocument) document).getSmallIcon(), record.getLocation().toString() + "!/META-INF/", "/"); //$NON-NLS-1$ //$NON-NLS-2$
          document.setProperty(JSP12TLDNames.SMALL_ICON, "jar:file:" + iconPath); //$NON-NLS-1$
        }
        if (document.getLargeIcon() != null) {
          String iconPath = URIHelper.normalize(((TLDDocument) document).getLargeIcon(), record.getLocation().toString() + "!/META-INF/", "/"); //$NON-NLS-1$ //$NON-NLS-2$
          document.setProperty(JSP12TLDNames.LARGE_ICON, "jar:file:" + iconPath); //$NON-NLS-1$
        }
        if (_debug && document != null && document.getElements().getLength() == 0) {
          System.out.println("failure parsing " + record.getLocation()); //$NON-NLS-1$
        }
      }
        break;
      case (ITaglibRecord.TAGDIR) : {
        ITagDirRecord record = (ITagDirRecord) reference;
        document = buildCMDocumentFromFolder(record.getPath());
      }
        break;
      case (ITaglibRecord.URL) : {
        IURLRecord record = (IURLRecord) reference;
        URL url = record.getURL();
        InputStream urlContents = JarUtilities.getInputStream(url);
        if (urlContents != null) {
          document = (CMDocumentImpl) buildCMDocument(record.getBaseLocation(), urlContents);
          String urlString = url.toString();
          document.setLocationString(urlString);
          if (document.getSmallIcon() != null) {
            String iconPath = URIHelper.normalize(((TLDDocument) document).getSmallIcon(), urlString, "/"); //$NON-NLS-1$
            document.setProperty(JSP12TLDNames.SMALL_ICON, iconPath);
          }
          if (document.getLargeIcon() != null) {
            String iconPath = URIHelper.normalize(((TLDDocument) document).getLargeIcon(), urlString, "/"); //$NON-NLS-1$
            document.setProperty(JSP12TLDNames.LARGE_ICON, iconPath);
          }
        }
        if (urlContents != null) {
          try {
            urlContents.close();
          }
          catch (IOException e) {
          }
        }
      }
        break;
    }
    return document;
  }
}
TOP

Related Classes of org.eclipse.jst.jsp.core.internal.contentmodel.tld.CMDocumentFactoryTLD

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.