luehe       2002/12/18 15:18:21

  Modified:    jasper2/src/share/org/apache/jasper
                        JspCompilationContext.java
               jasper2/src/share/org/apache/jasper/compiler
                        ImplicitTagLibraryInfo.java JspDocumentParser.java
                        Parser.java ParserController.java
                        TagFileProcessor.java TagLibraryInfoImpl.java
               jasper2/src/share/org/apache/jasper/servlet
                        JspServletWrapper.java
  Log:
  If a tag file is packaged in a JAR, any of its include directives must
  be resolved against the JAR as opposed to the filesystem.
  
  Revision  Changes    Path
  1.28      +24 -11    
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/JspCompilationContext.java
  
  Index: JspCompilationContext.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/JspCompilationContext.java,v
  retrieving revision 1.27
  retrieving revision 1.28
  diff -u -r1.27 -r1.28
  --- JspCompilationContext.java        8 Dec 2002 13:42:52 -0000       1.27
  +++ JspCompilationContext.java        18 Dec 2002 23:18:20 -0000      1.28
  @@ -64,6 +64,7 @@
   import java.io.*;
   import java.net.*;
   import java.util.*;
  +import java.util.jar.JarFile;
   import javax.servlet.ServletContext;
   import javax.servlet.jsp.tagext.TagInfo;
   import javax.servlet.jsp.tagext.TagData;
  @@ -122,6 +123,7 @@
       private boolean isTagFile;
       private boolean protoTypeMode;
       private TagInfo tagInfo;
  +    private JarFile tagFileJar;
   
       // jspURI _must_ be relative to the context
       public JspCompilationContext(String jspUri,
  @@ -162,13 +164,12 @@
                                    ServletContext context,
                                 JspServletWrapper jsw,
                                    JspRuntimeContext rctxt,
  -                              Hashtable tagFileJars) {
  -
  +                              JarFile tagFileJar) {
           this(tagfile, false, options, context, jsw, rctxt);
           this.isTagFile = true;
           this.tagInfo = tagInfo;
  -     this.tagFileJars = tagFileJars;
  -     if (tagFileJars != null && tagFileJars.get(tagfile) != null) {
  +     this.tagFileJar = tagFileJar;
  +     if (tagFileJar != null) {
            isPackagedTagFile = true;
        }
       }
  @@ -284,13 +285,25 @@
       }
   
       /**
  -     * Returns the tag-file-to-JAR-file mapping for tag files packaged in JARs.
  +     * Returns the tag-file-name-to-JAR-file map of this compilation unit,
  +     * which maps tag file names to the JAR files in which the tag files are
  +     * packaged.
        *
  -     * The mapping uses the tag file name as the key, and the JAR file 
  -     * containing the tag file as the value. 
  +     * The map is populated when parsing the tag-file elements of the TLDs
  +     * of any imported taglibs. 
        */
       public Hashtable getTagFileJars() {
  -     return tagFileJars;
  +     return this.tagFileJars;
  +    }
  +
  +    /**
  +     * Returns the JAR file in which the tag file for which this
  +     * JspCompilationContext was created is packaged, or null if this
  +     * JspCompilationContext does not correspond to a tag file, or if the
  +     * corresponding tag file is not packaged in a JAR.
  +     */
  +    public JarFile getTagFileJar() {
  +     return this.tagFileJar;
       }
   
       /* ==================== Common implementation ==================== */
  
  
  
  1.18      +7 -5      
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/ImplicitTagLibraryInfo.java
  
  Index: ImplicitTagLibraryInfo.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/ImplicitTagLibraryInfo.java,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- ImplicitTagLibraryInfo.java       14 Dec 2002 14:16:07 -0000      1.17
  +++ ImplicitTagLibraryInfo.java       18 Dec 2002 23:18:20 -0000      1.18
  @@ -159,8 +159,10 @@
   
            TagInfo tagInfo = null;
            try {
  -             tagInfo = TagFileProcessor.parseTagFile(pc, shortName, path,
  -                                                     this);
  +             tagInfo = TagFileProcessor.parseTagFileDirectives(pc,
  +                                                               shortName,
  +                                                               path,
  +                                                               this);
            } catch (JasperException je) {
                throw new RuntimeException(je.toString());
            }
  
  
  
  1.34      +4 -4      
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/JspDocumentParser.java
  
  Index: JspDocumentParser.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/JspDocumentParser.java,v
  retrieving revision 1.33
  retrieving revision 1.34
  diff -u -r1.33 -r1.34
  --- JspDocumentParser.java    12 Dec 2002 03:30:58 -0000      1.33
  +++ JspDocumentParser.java    18 Dec 2002 23:18:20 -0000      1.34
  @@ -759,7 +759,7 @@
        }
   
        try {
  -         parserController.parse(fname, includeDir);
  +         parserController.parse(fname, includeDir, null);
        } catch (FileNotFoundException fnfe) {
            throw new SAXParseException(err.getString(
                                               "jsp.error.file.not.found", fname),
  
  
  
  1.52      +14 -9     
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Parser.java
  
  Index: Parser.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Parser.java,v
  retrieving revision 1.51
  retrieving revision 1.52
  diff -u -r1.51 -r1.52
  --- Parser.java       18 Dec 2002 17:37:50 -0000      1.51
  +++ Parser.java       18 Dec 2002 23:18:21 -0000      1.52
  @@ -65,6 +65,7 @@
   import java.util.Hashtable;
   import java.util.List;
   import java.util.Iterator;
  +import java.util.jar.JarFile;
   import javax.servlet.jsp.tagext.TagLibraryInfo;
   import javax.servlet.jsp.tagext.TagInfo;
   import javax.servlet.jsp.tagext.TagFileInfo;
  @@ -98,7 +99,8 @@
       private int scriptlessCount;
       private boolean isTagFile;
       private boolean directivesOnly;
  -    
  +    private JarFile jarFile;
  +
       // Virtual body content types, to make parsing a little easier.
       // These are not accessible from outside the parser.
       private static final String JAVAX_BODY_CONTENT_PARAM = 
  @@ -112,7 +114,7 @@
        * The constructor
        */
       private Parser(ParserController pc, JspReader reader, boolean isTagFile,
  -                boolean directivesOnly) {
  +                boolean directivesOnly, JarFile jarFile) {
        this.parserController = pc;
        this.ctxt = pc.getJspCompilationContext();
        this.taglibs = pc.getCompiler().getPageInfo().getTagLibraries();
  @@ -122,6 +124,7 @@
           this.scriptlessCount = 0;
        this.isTagFile = isTagFile;
        this.directivesOnly = directivesOnly;
  +     this.jarFile = jarFile;
           start = reader.mark();
       }
   
  @@ -138,10 +141,12 @@
                                   JspReader reader,
                                   Node parent,
                                   boolean isTagFile,
  -                                boolean directivesOnly)
  +                                boolean directivesOnly,
  +                                JarFile jarFile)
                throws JasperException {
   
  -     Parser parser = new Parser(pc, reader, isTagFile, directivesOnly);
  +     Parser parser = new Parser(pc, reader, isTagFile, directivesOnly,
  +                                jarFile);
   
        Node.Root root = new Node.Root(null, reader.mark(), parent);
   
  @@ -185,7 +190,7 @@
       public static Attributes parseAttributes(ParserController pc,
                                             JspReader reader)
                throws JasperException {
  -     Parser tmpParser = new Parser(pc, reader, false, false);
  +     Parser tmpParser = new Parser(pc, reader, false, false, null);
        return tmpParser.parseAttributes();
       }
   
  @@ -361,7 +366,7 @@
        }
   
        try {
  -         parserController.parse(file, parent);
  +         parserController.parse(file, parent, jarFile);
        } catch (FileNotFoundException ex) {
            err.jspError(start, "jsp.error.file.not.found", file);
        } catch (Exception ex) {
  
  
  
  1.28      +35 -24    
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/ParserController.java
  
  Index: ParserController.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/ParserController.java,v
  retrieving revision 1.27
  retrieving revision 1.28
  diff -u -r1.27 -r1.28
  --- ParserController.java     27 Nov 2002 16:42:26 -0000      1.27
  +++ ParserController.java     18 Dec 2002 23:18:21 -0000      1.28
  @@ -115,7 +115,7 @@
        * Constructor
        */
       public ParserController(JspCompilationContext ctxt, Compiler compiler) {
  -        this.ctxt = ctxt; // @@@ can we assert that ctxt is not null?
  +        this.ctxt = ctxt; 
        this.compiler = compiler;
        this.pageInfo = compiler.getPageInfo();
        this.err = compiler.getErrorDispatcher();
  @@ -130,60 +130,71 @@
       }
   
       /**
  -     * Parses a jsp file.  This is invoked by the compiler.
  +     * Parses a JSP page or tag file. This is invoked by the compiler.
        *
  -     * @param inFileName The name of the JSP file to be parsed.
  +     * @param inFileName The path to the JSP page or tag file to be parsed.
        */
       public Node.Nodes parse(String inFileName)
                throws FileNotFoundException, JasperException, IOException {
  -     return parse(inFileName, null);
  +     // If we're parsing a packaged tag file or a resource included by it
  +     // (using an include directive), ctxt.getTagFileJar() returns the 
  +     // JAR file from which to read the tag file or included resource,
  +     // respectively.
  +     return parse(inFileName, null, ctxt.getTagFileJar());
       }
   
       /**
  -     * Parses a jsp file.  This is invoked to process an include file.
  +     * Processes an include directive with the given path.
        *
  -     * @param inFileName The name of the JSP file to be parsed.
  -     * @param parent The node for the 'include' directive.
  +     * @param inFileName The path to the resource to be included.
  +     * @param parent The parent node of the include directive.
  +     * @param jarFile The JAR file from which to read the included resource,
  +     * or null of the included resource is to be read from the filesystem
        */
  -    public Node.Nodes parse(String inFileName, Node parent)
  +    public Node.Nodes parse(String inFileName, Node parent, JarFile jarFile)
                throws FileNotFoundException, JasperException, IOException {
  -     return parseFile(inFileName, parent, ctxt.isTagFile(), false);
  +     return parse(inFileName, parent, ctxt.isTagFile(), false, jarFile);
       }
   
       /**
  -     * Parses a tag file.  This is invoked by the compiler to extract tag
  -     * file directive information.
  +     * Extracts tag file directive information from the tag file with the
  +     * given name.
  +     *
  +     * This is invoked by the compiler 
        *
        * @param inFileName The name of the tag file to be parsed.
        */
  -    public Node.Nodes parseTagFile(String inFileName)
  +    public Node.Nodes parseTagFileDirectives(String inFileName)
                throws FileNotFoundException, JasperException, IOException {
        isTopFile = true;
  -     return parseFile(inFileName, null, true, true);
  +     return parse(inFileName, null, true, true,
  +                  (JarFile) ctxt.getTagFileJars().get(inFileName));
       }
   
       /**
  -     * Parse the JSP page provided as an argument.
  -     * This is invoked recursively to handle 'include' directives.
  +     * Parses the JSP page or tag file with the given path name.
        *
  -     * @param inFileName The name of the jsp file to be parsed.
  -     * @param parent The parent node for the parser, and is non-null when
  -     *               parsing an included file
  +     * @param inFileName The name of the JSP page or tag file to be parsed.
  +     * @param parent The parent node (non-null when processing an include
  +     * directive)
        * @param isTagFile true if file to be parsed is tag file, and false if it
  -     * is a regular jsp page
  +     * is a regular JSP page
        * @param directivesOnly true if the file to be parsed is a tag file and
        * we are only interested in the directives needed for constructing a
        * TagFileInfo.
  +     * @param jarFile The JAR file from which to read the JSP page or tag file,
  +     * or null if the JSP page or tag file is to be read from the filesystem
        */
  -    private Node.Nodes parseFile(String inFileName, Node parent,
  -                              boolean isTagFile, boolean directivesOnly)
  +    private Node.Nodes parse(String inFileName,
  +                          Node parent,
  +                          boolean isTagFile,
  +                          boolean directivesOnly,
  +                          JarFile jarFile)
                throws FileNotFoundException, JasperException, IOException {
   
        Node.Nodes parsedPage = null;
        String absFileName = resolveFileName(inFileName);
   
  -     JarFile jarFile = (JarFile) ctxt.getTagFileJars().get(inFileName);
  -
        // Figure out what type of JSP document and encoding type we are
        // dealing with
        String encoding = figureOutJspDocument(absFileName, jarFile);
  @@ -222,7 +233,7 @@
                                                    encoding, inStreamReader,
                                                    err);
                   parsedPage = Parser.parse(this, jspReader, parent, isTagFile,
  -                                       directivesOnly);
  +                                       directivesOnly, jarFile);
               } finally {
                if (inStreamReader != null) {
                    try {
  
  
  
  1.37      +17 -16    
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/TagFileProcessor.java
  
  Index: TagFileProcessor.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/TagFileProcessor.java,v
  retrieving revision 1.36
  retrieving revision 1.37
  diff -u -r1.36 -r1.37
  --- TagFileProcessor.java     28 Nov 2002 04:18:08 -0000      1.36
  +++ TagFileProcessor.java     18 Dec 2002 23:18:21 -0000      1.37
  @@ -63,6 +63,7 @@
   package org.apache.jasper.compiler;
   
   import java.util.*;
  +import java.util.jar.JarFile;
   import java.io.*;
   
   import javax.servlet.ServletException;
  @@ -299,17 +300,17 @@
        * @param tagLibInfo the TagLibraryInfo object associated with this TagInfo
        * @return a TagInfo object assembled from the directives in the tag file.
        */
  -    public static TagInfo parseTagFile(ParserController pc,
  -                                       String name,
  -                                       String path,
  -                                    TagLibraryInfo tagLibInfo)
  -                throws JasperException {
  +    public static TagInfo parseTagFileDirectives(ParserController pc,
  +                                              String name,
  +                                              String path,
  +                                              TagLibraryInfo tagLibInfo)
  +                        throws JasperException {
   
        ErrorDispatcher err = pc.getCompiler().getErrorDispatcher();
   
           Node.Nodes page = null;
        try {
  -         page = pc.parseTagFile(path);
  +         page = pc.parseTagFileDirectives(path);
        } catch (FileNotFoundException e) {
            err.jspError("jsp.error.file.not.found", path);
        } catch (IOException e) {
  @@ -361,7 +362,7 @@
                                                tagFilePath,
                                                tagInfo,
                                                ctxt.getRuntimeContext(),
  -                                             ctxt.getTagFileJars());
  +                                             (JarFile) 
ctxt.getTagFileJars().get(tagFilePath));
                rctxt.addWrapper(tagFilePath,wrapper);
            }
   
  @@ -374,13 +375,13 @@
                    // file is compiled in prototype mode, to avoid infinite
                    // recursion.
   
  -                 JspServletWrapper tempWrapper = new JspServletWrapper(
  -                                         ctxt.getServletContext(),
  -                                            ctxt.getOptions(),
  -                                            tagFilePath,
  -                                            tagInfo,
  -                                            ctxt.getRuntimeContext(),
  -                                            ctxt.getTagFileJars());
  +                 JspServletWrapper tempWrapper
  +                     = new JspServletWrapper(ctxt.getServletContext(),
  +                                             ctxt.getOptions(),
  +                                             tagFilePath,
  +                                             tagInfo,
  +                                             ctxt.getRuntimeContext(),
  +                                             (JarFile) 
ctxt.getTagFileJars().get(tagFilePath));
                    tagClazz = tempWrapper.loadTagFilePrototype();
                    tempVector.add(
                        tempWrapper.getJspEngineContext().getCompiler());
  
  
  
  1.31      +6 -6      
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/TagLibraryInfoImpl.java
  
  Index: TagLibraryInfoImpl.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/TagLibraryInfoImpl.java,v
  retrieving revision 1.30
  retrieving revision 1.31
  diff -u -r1.30 -r1.31
  --- TagLibraryInfoImpl.java   16 Dec 2002 20:39:17 -0000      1.30
  +++ TagLibraryInfoImpl.java   18 Dec 2002 23:18:21 -0000      1.31
  @@ -452,9 +452,9 @@
            err.jspError("jsp.error.tagfile.illegalPath", path);
        }
   
  -     TagInfo tagInfo = TagFileProcessor.parseTagFile(parserController,
  -                                                     name, path,
  -                                                     this);
  +     TagInfo tagInfo
  +         = TagFileProcessor.parseTagFileDirectives(parserController, name,
  +                                                   path, this);
        return new TagFileInfo(name, path, tagInfo);
       }
   
  
  
  
  1.24      +6 -5      
jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/servlet/JspServletWrapper.java
  
  Index: JspServletWrapper.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/servlet/JspServletWrapper.java,v
  retrieving revision 1.23
  retrieving revision 1.24
  diff -u -r1.23 -r1.24
  --- JspServletWrapper.java    8 Dec 2002 13:42:53 -0000       1.23
  +++ JspServletWrapper.java    18 Dec 2002 23:18:21 -0000      1.24
  @@ -63,6 +63,7 @@
   import java.io.File;
   import java.io.FileNotFoundException;
   import java.util.Hashtable;
  +import java.util.jar.JarFile;
   import java.net.URL;
   import java.net.URLClassLoader;
   import java.net.MalformedURLException;
  @@ -144,7 +145,7 @@
                             String tagFilePath,
                             TagInfo tagInfo,
                             JspRuntimeContext rctxt,
  -                          Hashtable tagFileJars)
  +                          JarFile tagFileJar)
            throws JasperException {
   
        this.isTagFile = true;
  @@ -154,7 +155,7 @@
        this.tripCount = 0;
           ctxt = new JspCompilationContext(jspUri, tagInfo, options,
                                         servletContext, this, rctxt,
  -                                      tagFileJars);
  +                                      tagFileJar);
           ctxt.createOutdir("/tags/"
                          + tagInfo.getTagClassName().replace('.', '/'));
       }
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to