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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to