You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by re...@apache.org on 2006/10/31 17:28:56 UTC

svn commit: r469542 - in /tomcat/tc6.0.x/trunk/java/org/apache/jasper: compiler/ImplicitTagLibraryInfo.java resources/LocalStrings.properties

Author: remm
Date: Tue Oct 31 08:28:55 2006
New Revision: 469542

URL: http://svn.apache.org/viewvc?view=rev&rev=469542
Log:
- Add parsing of implicit.tld for tag files.

Modified:
    tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/ImplicitTagLibraryInfo.java
    tomcat/tc6.0.x/trunk/java/org/apache/jasper/resources/LocalStrings.properties

Modified: tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/ImplicitTagLibraryInfo.java
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/ImplicitTagLibraryInfo.java?view=diff&rev=469542&r1=469541&r2=469542
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/ImplicitTagLibraryInfo.java (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/jasper/compiler/ImplicitTagLibraryInfo.java Tue Oct 31 08:28:55 2006
@@ -17,13 +17,22 @@
 
 package org.apache.jasper.compiler;
 
-import java.util.*;
+import java.io.InputStream;
+import java.util.Collection;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.Vector;
+
 import javax.servlet.jsp.tagext.FunctionInfo;
-import javax.servlet.jsp.tagext.TagLibraryInfo;
-import javax.servlet.jsp.tagext.TagInfo;
 import javax.servlet.jsp.tagext.TagFileInfo;
-import org.apache.jasper.JspCompilationContext;
+import javax.servlet.jsp.tagext.TagInfo;
+import javax.servlet.jsp.tagext.TagLibraryInfo;
+
 import org.apache.jasper.JasperException;
+import org.apache.jasper.JspCompilationContext;
+import org.apache.jasper.xmlparser.ParserUtils;
+import org.apache.jasper.xmlparser.TreeNode;
 
 /**
  * Class responsible for generating an implicit tag library containing tag
@@ -40,6 +49,7 @@
     private static final String TAGS_SHORTNAME = "tags";
     private static final String TLIB_VERSION = "1.0";
     private static final String JSP_VERSION = "2.0";
+    private static final String IMPLICIT_TLD = "implicit.tld";
 
     // Maps tag names to tag file paths
     private Hashtable tagFileMap;
@@ -52,59 +62,115 @@
      * Constructor.
      */
     public ImplicitTagLibraryInfo(JspCompilationContext ctxt,
-				  ParserController pc,
-                  PageInfo pi,
-				  String prefix,
-				  String tagdir,
-				  ErrorDispatcher err) throws JasperException {
+            ParserController pc,
+            PageInfo pi,
+            String prefix,
+            String tagdir,
+            ErrorDispatcher err) throws JasperException {
         super(prefix, null);
-	this.pc = pc;
-    this.pi = pi;
-	this.tagFileMap = new Hashtable();
-	this.vec = new Vector();
+        this.pc = pc;
+        this.pi = pi;
+        this.tagFileMap = new Hashtable();
+        this.vec = new Vector();
 
         // Implicit tag libraries have no functions:
         this.functions = new FunctionInfo[0];
 
-	tlibversion = TLIB_VERSION;
-	jspversion = JSP_VERSION;
+        tlibversion = TLIB_VERSION;
+        jspversion = JSP_VERSION;
 
-	if (!tagdir.startsWith(WEB_INF_TAGS)) {
-	    err.jspError("jsp.error.invalid.tagdir", tagdir);
-	}
-	
-	// Determine the value of the <short-name> subelement of the
-	// "imaginary" <taglib> element
-	if (tagdir.equals(WEB_INF_TAGS)
-	        || tagdir.equals( WEB_INF_TAGS + "/")) {
-	    shortname = TAGS_SHORTNAME;
-	} else {
-	    shortname = tagdir.substring(WEB_INF_TAGS.length());
-	    shortname = shortname.replace('/', '-');
-	}
-
-	// Populate mapping of tag names to tag file paths
-	Set dirList = ctxt.getResourcePaths(tagdir);
-	if (dirList != null) {
-	    Iterator it = dirList.iterator();
-	    while (it.hasNext()) {
-		String path = (String) it.next();
-		if (path.endsWith(TAG_FILE_SUFFIX)
-		        || path.endsWith(TAGX_FILE_SUFFIX)) {
-		    /*
-		     * Use the filename of the tag file, without the .tag or
-		     * .tagx extension, respectively, as the <name> subelement
-		     * of the "imaginary" <tag-file> element
-		     */
-		    String suffix = path.endsWith(TAG_FILE_SUFFIX) ?
-			TAG_FILE_SUFFIX : TAGX_FILE_SUFFIX; 
-		    String tagName = path.substring(path.lastIndexOf("/") + 1);
-		    tagName = tagName.substring(0,
-						tagName.lastIndexOf(suffix));
-		    tagFileMap.put(tagName, path);
-		}
-	    }
-	}
+        if (!tagdir.startsWith(WEB_INF_TAGS)) {
+            err.jspError("jsp.error.invalid.tagdir", tagdir);
+        }
+
+        // Determine the value of the <short-name> subelement of the
+        // "imaginary" <taglib> element
+        if (tagdir.equals(WEB_INF_TAGS)
+                || tagdir.equals( WEB_INF_TAGS + "/")) {
+            shortname = TAGS_SHORTNAME;
+        } else {
+            shortname = tagdir.substring(WEB_INF_TAGS.length());
+            shortname = shortname.replace('/', '-');
+        }
+
+        // Populate mapping of tag names to tag file paths
+        Set dirList = ctxt.getResourcePaths(tagdir);
+        if (dirList != null) {
+            Iterator it = dirList.iterator();
+            while (it.hasNext()) {
+                String path = (String) it.next();
+                if (path.endsWith(TAG_FILE_SUFFIX)
+                        || path.endsWith(TAGX_FILE_SUFFIX)) {
+                    /*
+                     * Use the filename of the tag file, without the .tag or
+                     * .tagx extension, respectively, as the <name> subelement
+                     * of the "imaginary" <tag-file> element
+                     */
+                    String suffix = path.endsWith(TAG_FILE_SUFFIX) ?
+                            TAG_FILE_SUFFIX : TAGX_FILE_SUFFIX; 
+                    String tagName = path.substring(path.lastIndexOf("/") + 1);
+                    tagName = tagName.substring(0,
+                            tagName.lastIndexOf(suffix));
+                    tagFileMap.put(tagName, path);
+                } else if (path.endsWith(IMPLICIT_TLD)) {
+                    InputStream in = null;
+                    try {
+                        in = ctxt.getResourceAsStream(path);
+                        if (in != null) {
+                            
+                            // Add implicit TLD to dependency list
+                            if (pi != null) {
+                                pi.addDependant(path);
+                            }
+                            
+                            ParserUtils pu = new ParserUtils();
+                            TreeNode tld = pu.parseXMLDocument(uri, in);
+
+                            if (tld.findAttribute("version") != null) {
+                                this.jspversion = tld.findAttribute("version");
+                            }
+
+                            // Process each child element of our <taglib> element
+                            Iterator list = tld.findChildren();
+
+                            while (list.hasNext()) {
+                                TreeNode element = (TreeNode) list.next();
+                                String tname = element.getName();
+
+                                if ("tlibversion".equals(tname) // JSP 1.1
+                                        || "tlib-version".equals(tname)) { // JSP 1.2
+                                    this.tlibversion = element.getBody();
+                                } else if ("jspversion".equals(tname)
+                                        || "jsp-version".equals(tname)) {
+                                    this.jspversion = element.getBody();
+                                } else if ("shortname".equals(tname) || "short-name".equals(tname)) {
+                                    // Ignore
+                                } else {
+                                    // All other elements are invalid
+                                    err.jspError("jsp.error.invalid.implicit", path);
+                                }
+                            }
+                            try {
+                                double version = Double.parseDouble(this.jspversion);
+                                if (version < 2.0) {
+                                    err.jspError("jsp.error.invalid.implicit.version", path);
+                                }
+                            } catch (NumberFormatException e) {
+                                err.jspError("jsp.error.invalid.implicit.version", path);
+                            }
+                        }
+                    } finally {
+                        if (in != null) {
+                            try {
+                                in.close();
+                            } catch (Throwable t) {
+                            }
+                        }
+                    }
+                }
+            }
+        }        
+        
     }
 
     /**
@@ -116,36 +182,36 @@
      */
     public TagFileInfo getTagFile(String shortName) {
 
-	TagFileInfo tagFile = super.getTagFile(shortName);
-	if (tagFile == null) {
-	    String path = (String) tagFileMap.get(shortName);
-	    if (path == null) {
-		return null;
-	    }
-
-	    TagInfo tagInfo = null;
-	    try {
-		tagInfo = TagFileProcessor.parseTagFileDirectives(pc,
-								  shortName,
-								  path,
-								  this);
-	    } catch (JasperException je) {
-		throw new RuntimeException(je.toString(), je);
-	    }
-
-	    tagFile = new TagFileInfo(shortName, path, tagInfo);
-	    vec.addElement(tagFile);
-
-	    this.tagFiles = new TagFileInfo[vec.size()];
-	    vec.copyInto(this.tagFiles);
-	}
+        TagFileInfo tagFile = super.getTagFile(shortName);
+        if (tagFile == null) {
+            String path = (String) tagFileMap.get(shortName);
+            if (path == null) {
+                return null;
+            }
+
+            TagInfo tagInfo = null;
+            try {
+                tagInfo = TagFileProcessor.parseTagFileDirectives(pc,
+                        shortName,
+                        path,
+                        this);
+            } catch (JasperException je) {
+                throw new RuntimeException(je.toString(), je);
+            }
+
+            tagFile = new TagFileInfo(shortName, path, tagInfo);
+            vec.addElement(tagFile);
+
+            this.tagFiles = new TagFileInfo[vec.size()];
+            vec.copyInto(this.tagFiles);
+        }
 
-	return tagFile;
+        return tagFile;
     }
-    
+
     public TagLibraryInfo[] getTagLibraryInfos() {
         Collection coll = pi.getTaglibs();
         return (TagLibraryInfo[]) coll.toArray(new TagLibraryInfo[0]);
     }
-    
+
 }

Modified: tomcat/tc6.0.x/trunk/java/org/apache/jasper/resources/LocalStrings.properties
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/jasper/resources/LocalStrings.properties?view=diff&rev=469542&r1=469541&r2=469542
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/jasper/resources/LocalStrings.properties (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/jasper/resources/LocalStrings.properties Tue Oct 31 08:28:55 2006
@@ -77,6 +77,8 @@
 jsp.error.unknownException=Unhandled error! You might want to consider having an error page \
 to report such errors more gracefully
 jsp.error.invalid.directive=Invalid directive
+jsp.error.invalid.implicit=Invalid implicit TLD for tag file at {0}
+jsp.error.invalid.implicit.version=Invalid JSP version defined in implicit TLD for tag file at {0}
 jsp.error.directive.istagfile={0} directive cannot be used in a tag file
 jsp.error.directive.isnottagfile={0} directive can only be used in a tag file
 jsp.error.tagfile.tld.name=The \"name\" attribute of the tag directive has a value {0} while the \"name\" tag of the \"tag-file\" element in the TLD is {1}



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org