/* * Copyright (c) 1998-2011 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * Free SoftwareFoundation, Inc. * 59 Temple Place, Suite 330 * Boston, MA 02111-1307 USA * * @author Scott Ferguson */ package com.caucho.jsp; import com.caucho.jsp.cfg.TldFunction; import com.caucho.jsp.cfg.TldTag; import com.caucho.jsp.cfg.TldTagFile; import com.caucho.jsp.cfg.TldTaglib; import com.caucho.jsp.cfg.TldValidator; import com.caucho.server.util.CauchoSystem; import com.caucho.util.L10N; import com.caucho.vfs.*; import javax.servlet.jsp.tagext.FunctionInfo; import javax.servlet.jsp.tagext.TagExtraInfo; import javax.servlet.jsp.tagext.TagFileInfo; import javax.servlet.jsp.tagext.TagInfo; import javax.servlet.jsp.tagext.TagLibraryInfo; import javax.servlet.jsp.tagext.TagLibraryValidator; import java.util.ArrayList; import java.util.logging.Logger; /** * Stores the entire information for a tag library. */ public class Taglib extends TagLibraryInfo { private static final Logger log = Logger.getLogger(Taglib.class.getName()); static final L10N L = new L10N(Taglib.class); private TldTaglib _tldTaglib; private TagFileManager _tagFileManager; TagLibraryValidator _validator; private ArrayList<TldFunction> _functionList = new ArrayList<TldFunction>(); private ArrayList<Taglib> _libraryList = new ArrayList<Taglib>(); Taglib(String prefix, String uri, TldTaglib tldTaglib, TagFileManager tagFileManager) throws JspParseException { super(prefix, uri); try { _tldTaglib = tldTaglib; _tagFileManager = tagFileManager; fillTagLibraryInfo(tldTaglib, tagFileManager); _libraryList.add(this); } catch (JspParseException e) { throw e; } catch (Exception e) { throw new JspParseException(e); } } Taglib(Taglib taglib, String prefix) throws JspParseException { this(prefix, taglib.getURI(), taglib._tldTaglib, taglib._tagFileManager); } public Taglib create(String prefix) throws JspParseException { if (prefix.equals(getPrefixString())) return this; else return new Taglib(this, prefix); } /** * Gets a new instance of the validator to check the page. */ public TagLibraryValidator getValidator() throws JspParseException { return _validator; } /** * Returns the functions. */ public ArrayList<TldFunction> getFunctionList() { return _functionList; } /** * Gets the path. */ public Path getPath() { if (_tldTaglib != null) return _tldTaglib.getJarPath(); else return null; } /** * Fills the tag library info from the tld * * <pre> * taglib ::= tlib-version, jsp-version?, short-name, uri?, * display-name?, small-icon?, large-icon?, description?, * validator?, listener*, tag+, function* * </pre> */ private void fillTagLibraryInfo(TldTaglib taglib, TagFileManager tagFileManager) throws Exception { this.tlibversion = taglib.getTlibVersion(); this.jspversion = taglib.getJspVersion(); this.shortname = taglib.getShortName(); this.urn = taglib.getURI(); this.info = taglib.getInfo(); if (taglib.getDescription() != null) this.info = taglib.getDescription(); TldValidator validator = taglib.getValidator(); if (validator != null) _validator = validator.getValidator(); ArrayList<TldTag> tagList = taglib.getTagList(); tags = new TagInfo[tagList.size()]; for (int i = 0; i < tagList.size(); i++) { TldTag tag = tagList.get(i); TagInfo tagInfo; if (tag.getBaseTag() != null) tagInfo = new TagInfoImpl(tag, tag.getBaseTag(), this); else tagInfo = new TagInfoImpl(tag, this); tags[i] = tagInfo; } ArrayList<TldTagFile> tagFileList = taglib.getTagFileList(); this.tagFiles = new TagFileInfo[tagFileList.size()]; for (int i = 0; i < tagFileList.size(); i++) { TldTagFile tagFile = tagFileList.get(i); TagFileInfo tagFileInfo = new TagFileInfoExt(tagFileManager, tagFile.getName(), tagFile.getPath()); this.tagFiles[i] = tagFileInfo; } _functionList = taglib.getFunctionList(); this.functions = new FunctionInfo[_functionList.size()]; for (int i = 0; i < _functionList.size(); i++) { this.functions[i] = _functionList.get(i).toFunctionInfo(); } } /** * Returns the tag class for the given tag qname * * @param tagName the tag's qname * * @return the matching class or null */ public Class getClass(String tagName) throws Exception { TagInfo info = getTag(tagName); String className = info == null ? null : info.getTagClassName(); if (className != null) return CauchoSystem.loadClass(className); else return null; } /** * Return the class names of all tags that are outside of packages. */ public ArrayList<String> getSingleTagClassNames() { ArrayList<String> singleTags = new ArrayList<String>(); TagInfo []tags = getTags(); for (int i = 0; tags != null && i < tags.length; i++) { String name = tags[i].getTagClassName(); if (name != null && name.indexOf('.') < 0) singleTags.add(name); } return singleTags; } /** * Returns the TagExtraInfo structure for the named tag. */ TagExtraInfo getTagExtraInfo(String tagName) { TagInfo info = getTag(tagName); return info != null ? info.getTagExtraInfo() : null; } /** * Hack to avoid JSDK problem. */ public TagInfo getTag(String name) { if (tags == null) return null; for (int i = 0; i < tags.length; i++) { if (tags[i].getTagName().equals(name)) return tags[i]; } return null; } /** * Returns a matching tag file. */ public String getTagFilePath(String name) { if (_tldTaglib == null) return null; ArrayList<TldTagFile> tagFiles = _tldTaglib.getTagFileList(); for (int i = 0; i < tagFiles.size(); i++) { TldTagFile tagFile = tagFiles.get(i); if (tagFile.getName().equals(name)) return tagFile.getPath(); } /* String uri = getURI(); if (uri != null && uri.startsWith("urn:jsptagdir:")) return Vfs.lookup().lookup("./" + uri.substring("urn:jsptagdir:".length()) + "/" + name + ".tag").getNativePath(); */ return null; } public void addTaglib(Taglib taglib) { if (! _libraryList.contains(taglib)) _libraryList.add(taglib); } public Taglib copy() throws JspParseException { return new Taglib(getPrefixString(), getURI(), _tldTaglib, _tagFileManager); } @Override public TagLibraryInfo []getTagLibraryInfos() { TagLibraryInfo []infoArray = new TagLibraryInfo[_libraryList.size()]; _libraryList.toArray(infoArray); return infoArray; } public String toString() { return "Taglib[prefix=" + this.prefix + ",uri=" + this.uri + "]"; } class TagFileInfoExt extends TagFileInfo { private TagFileManager _manager; private TagInfo _tagInfo; TagFileInfoExt(TagFileManager manager, String name, String path) { super(name, path, null); _manager = manager; } public TagInfo getTagInfo() { if (_tagInfo == null) { try { _tagInfo = _manager.getTag("", getName(), getPath()); } catch (JspParseException e) { throw new RuntimeException(e); } } return _tagInfo; } } }