costin      01/06/06 23:59:08

  Modified:    jasper34/generator/org/apache/jasper34/core Compiler.java
                        ContainerLiaison.java JspCompilationContext.java
               jasper34/generator/org/apache/jasper34/generator
                        JspParseEventListener.java JspUtil.java
                        ServletWriter.java
               jasper34/generator/org/apache/jasper34/jsptree
                        JspPageInfo.java TagLibraries.java
                        TagLibraryInfoImpl.java package.html
  Removed:     jasper34/generator/org/apache/jasper34/jsptree TreeUtil.java
  Log:
  Few changes in TagLibrary reading.
  
  Removed all the code that reads the web.xml/tld, moved to liaison
  ( you can plug any piece that does the same thing without touching
  the generator ).
  
  This simplifies a lot the code in jsptree.
  
  Next step will be to refactor JspCompilationContext - part will be a
  singleton ( per webapp ), the ContainerLiaison, and part will go into
  JspPageInfo ( the servlet name, jsp page, etc )
  
  Revision  Changes    Path
  1.2       +3 -1      
jakarta-tomcat-jasper/jasper34/generator/org/apache/jasper34/core/Compiler.java
  
  Index: Compiler.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper34/generator/org/apache/jasper34/core/Compiler.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- Compiler.java     2001/06/06 06:25:11     1.1
  +++ Compiler.java     2001/06/07 06:58:55     1.2
  @@ -94,9 +94,11 @@
       protected JavaCompiler javac;
       protected Mangler mangler;
       protected JspCompilationContext ctxt;
  +    protected ContainerLiaison liaison;
   
  -    public Compiler(JspCompilationContext ctxt) {
  +    public Compiler(ContainerLiaison liaison, JspCompilationContext ctxt) {
           this.ctxt = ctxt;
  +     this.liaison=liaison;
       }
       
       /** 
  
  
  
  1.2       +43 -0     
jakarta-tomcat-jasper/jasper34/generator/org/apache/jasper34/core/ContainerLiaison.java
  
  Index: ContainerLiaison.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper34/generator/org/apache/jasper34/core/ContainerLiaison.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ContainerLiaison.java     2001/06/06 06:27:02     1.1
  +++ ContainerLiaison.java     2001/06/07 06:58:55     1.2
  @@ -107,6 +107,49 @@
        */
       public abstract String getRealPath(String path);
   
  +    // -------------------- WEB-INF access --------------------
  +
  +    /** Read web.xml and add all the taglib locations to the
  +     TagLibraries ( if it wasn't done already ).
  +     It'll call back addTaglibLocation.
  +     You can use the default implementation ( TagLibReader )
  +     or container specific code.
  +    */
  +    public void readWebXml( TagLibraries tli )
  +     throws IOException, JasperException;
  +
  +    /** Read a tag lib descriptor ( tld ). You can use the default
  +     implementation ( TagLibReader ).
  +    */
  +    public void readTLD( TagLibraries libs, TagLibraryInfoImpl tl,
  +                      String prefix, String uri )
  +     throws IOException, JasperException;
  +
  +
  +    // -------------------- Classpath and class loader
  +
  +    /**
  +     * The classpath that is passed off to the Java compiler. 
  +     */
  +    public String getClassPath();
  +
  +    /**
  +     * What class loader to use for loading classes while compiling
  +     * this JSP? I don't think this is used right now -- akv. 
  +     */
  +    public ClassLoader getClassLoader();
  +
  +    // -------------------- Locations --------------------
  +
  +    /**
  +     * What is the scratch directory we are generating code into?
  +     * FIXME: In some places this is called scratchDir and in some
  +     * other places it is called outputDir.
  +     */
  +    public String getOutputDir();
  +
  +
  +    
       // -------------------- messages --------------------
       /**
        * Get hold of a "message" or any string from our resources
  
  
  
  1.3       +46 -26    
jakarta-tomcat-jasper/jasper34/generator/org/apache/jasper34/core/JspCompilationContext.java
  
  Index: JspCompilationContext.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper34/generator/org/apache/jasper34/core/JspCompilationContext.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- JspCompilationContext.java        2001/06/06 06:27:38     1.2
  +++ JspCompilationContext.java        2001/06/07 06:58:56     1.3
  @@ -63,6 +63,7 @@
   
   import org.apache.jasper34.generator.*;
   import org.apache.jasper34.parser.*;
  +import org.apache.jasper34.jsptree.*;
   import java.io.IOException;
   import org.apache.jasper34.runtime.JasperException;
   
  @@ -85,10 +86,17 @@
   public interface JspCompilationContext {
   
       /**
  -     * The classpath that is passed off to the Java compiler. 
  +     * Get hold of the Options object for this context. 
        */
  -    public String getClassPath();
  -    
  +    public Options getOptions();
  +
  +    /**
  +     * Create a "Compiler" object based on some init param data. This
  +     * is not done yet. Right now we're just hardcoding the actual
  +     * compilers that are created. 
  +     */
  +    public Compiler createCompiler() throws JasperException;
  +
       /**
        * Get the input reader for the JSP text. 
        */
  @@ -99,16 +107,13 @@
        */
       public ServletWriter getWriter();
       
  -    /**
  -     * What class loader to use for loading classes while compiling
  -     * this JSP? I don't think this is used right now -- akv. 
  -     */
  -    public ClassLoader getClassLoader();
  -
       /** Add a jar to the classpath used by the loader
        */
       public void addJar( String jar ) throws IOException ;
   
  +
  +    // -------------------- This goes to pageinfo --------------------
  +    
       /**
        * Are we processing something that has been declared as an
        * errorpage? 
  @@ -116,13 +121,6 @@
       public boolean isErrorPage();
       
       /**
  -     * What is the scratch directory we are generating code into?
  -     * FIXME: In some places this is called scratchDir and in some
  -     * other places it is called outputDir.
  -     */
  -    public String getOutputDir();
  -    
  -    /**
        * Path of the JSP URI. Note that this is not a file name. This is
        * the context rooted URI of the JSP file. 
        */
  @@ -162,11 +160,6 @@
        */
       public String getContentType();
   
  -    /**
  -     * Get hold of the Options object for this context. 
  -     */
  -    public Options getOptions();
  -
       public void setContentType(String contentType);
   
       public void setReader(JspReader reader);
  @@ -181,14 +174,26 @@
       
       public void setErrorPage(boolean isErrPage);
   
  +    // XXX move to ContainerLiaison --------------------
  +    
       /**
  -     * Create a "Compiler" object based on some init param data. This
  -     * is not done yet. Right now we're just hardcoding the actual
  -     * compilers that are created. 
  +     * The classpath that is passed off to the Java compiler. 
        */
  -    public Compiler createCompiler() throws JasperException;
  -
  +    public String getClassPath();
  +    
  +    /**
  +     * What class loader to use for loading classes while compiling
  +     * this JSP? I don't think this is used right now -- akv. 
  +     */
  +    public ClassLoader getClassLoader();
   
  +    /**
  +     * What is the scratch directory we are generating code into?
  +     * FIXME: In some places this is called scratchDir and in some
  +     * other places it is called outputDir.
  +     */
  +    public String getOutputDir();
  +    
       /** 
        * Get the full value of a URI relative to this compilations context
        */
  @@ -208,5 +213,20 @@
        */
       public String getRealPath(String path);
   
  +    /** Read web.xml and add all the taglib locations to the
  +     TagLibraries ( if it wasn't done already ).
  +     It'll call back addTaglibLocation.
  +     You can use the default implementation ( TagLibReader )
  +     or container specific code.
  +    */
  +    public void readWebXml( TagLibraries tli )
  +     throws IOException, JasperException;
  +
  +    /** Read a tag lib descriptor ( tld ). You can use the default
  +     implementation ( TagLibReader ).
  +    */
  +    public void readTLD( TagLibraries libs, TagLibraryInfoImpl tl,
  +                      String prefix, String uri )
  +     throws IOException, JasperException;
   }
   
  
  
  
  1.4       +1 -4      
jakarta-tomcat-jasper/jasper34/generator/org/apache/jasper34/generator/JspParseEventListener.java
  
  Index: JspParseEventListener.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper34/generator/org/apache/jasper34/generator/JspParseEventListener.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- JspParseEventListener.java        2001/06/06 06:10:40     1.3
  +++ JspParseEventListener.java        2001/06/07 06:59:00     1.4
  @@ -149,10 +149,7 @@
               String uri = (String) attrs.get("uri");
               String prefix = (String) attrs.get("prefix");
               try {
  -                TagLibraryInfo tl = new TagLibraryInfoImpl(ctxt,
  -                                                               prefix,
  -                                                               uri);
  -                pageInfo.libraries.addTagLibrary(prefix, tl);
  +             pageInfo.libraries.addTagLibrary( prefix, uri );
               } catch (Exception ex) {
                   Object[] args = new Object[] { uri, ex.getMessage() };
                   throw new CompileException(start, 
Constants.getString("jsp.error.badtaglib",
  
  
  
  1.3       +0 -7      
jakarta-tomcat-jasper/jasper34/generator/org/apache/jasper34/generator/JspUtil.java
  
  Index: JspUtil.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper34/generator/org/apache/jasper34/generator/JspUtil.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- JspUtil.java      2001/06/06 06:16:56     1.2
  +++ JspUtil.java      2001/06/07 06:59:01     1.3
  @@ -69,13 +69,6 @@
   import org.apache.jasper34.core.*;
   import org.apache.jasper34.runtime.JasperException;
   
  -import org.w3c.dom.*;
  -import javax.xml.parsers.DocumentBuilder;
  -import javax.xml.parsers.DocumentBuilderFactory;
  -import javax.xml.parsers.ParserConfigurationException;
  -import org.xml.sax.EntityResolver;
  -import org.xml.sax.SAXException;
  -import org.xml.sax.InputSource;
   
   import org.apache.jasper34.jsptree.*;
   
  
  
  
  1.3       +6 -1      
jakarta-tomcat-jasper/jasper34/generator/org/apache/jasper34/generator/ServletWriter.java
  
  Index: ServletWriter.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper34/generator/org/apache/jasper34/generator/ServletWriter.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- ServletWriter.java        2001/06/06 06:12:45     1.2
  +++ ServletWriter.java        2001/06/07 06:59:02     1.3
  @@ -312,6 +312,7 @@
        this.println();
        this.println("JspFactory _jspxFactory = JspFactory.getDefaultFactory();");
        this.println("PageContext pageContext = null;");
  +     this.println("JspWriter out=null;");
        
        this.println("try {");
        this.pushIndent();
  @@ -322,6 +323,7 @@
           this.println("_jspx_init();");
        
        this.println("pageContext = _getPageContext(request, response);");
  +     this.println("out=pageContext.getOut();");
        this.println();
        this.println("_jspService( pageContext, request, response );");
        //writer.println("} catch (Throwable t) {");
  @@ -348,9 +350,12 @@
        
        // Use flush buffer ( which just empty JspWriterImpl buffer )
        // instead of commiting the response.
  -     this.println("JspWriter out=pageContext.getOut();");
  +     this.println("if( out instanceof " + Constants.JSP_RUNTIME_PACKAGE +
  +                  ".JspWriterImpl )");
  +     this.pushIndent();
        this.println("((" +  Constants.JSP_RUNTIME_PACKAGE +
                     ".JspWriterImpl)out).flushBuffer();");
  +     this.popIndent();
        this.println("if (_jspxFactory != null) 
_jspxFactory.releasePageContext(pageContext);");
        this.popIndent();
        this.println("}");
  
  
  
  1.2       +1 -1      
jakarta-tomcat-jasper/jasper34/generator/org/apache/jasper34/jsptree/JspPageInfo.java
  
  Index: JspPageInfo.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper34/generator/org/apache/jasper34/jsptree/JspPageInfo.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- JspPageInfo.java  2001/06/06 05:50:28     1.1
  +++ JspPageInfo.java  2001/06/07 06:59:05     1.2
  @@ -138,7 +138,7 @@
   
       public JspPageInfo(JspCompilationContext ctxt) {
        this.beanInfo = new BeanRepository(ctxt.getClassLoader());
  -        this.libraries = new TagLibraries(ctxt.getClassLoader());
  +        this.libraries = new TagLibraries(ctxt);
           this.ctxt = ctxt;
   
           // FIXME: Is this good enough? (I'm just taking the easy way out - akv)
  
  
  
  1.3       +53 -29    
jakarta-tomcat-jasper/jasper34/generator/org/apache/jasper34/jsptree/TagLibraries.java
  
  Index: TagLibraries.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper34/generator/org/apache/jasper34/jsptree/TagLibraries.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- TagLibraries.java 2001/06/06 06:54:02     1.2
  +++ TagLibraries.java 2001/06/07 06:59:05     1.3
  @@ -57,6 +57,7 @@
   import java.lang.reflect.Constructor;
   
   import java.util.Hashtable;
  +import java.io.IOException;
   
   import javax.servlet.jsp.tagext.TagLibraryInfo;
   import javax.servlet.jsp.tagext.TagInfo;
  @@ -79,13 +80,62 @@
    * @author Mandar Raje
    */
   public class TagLibraries {
  +
  +    private Hashtable tagLibInfos;
  +    private JspCompilationContext ctxt;
  +
  +    // used to keep web.xml taglib-locations
  +    private Hashtable locations=null;
       
  -    public TagLibraries(ClassLoader cl) {
  +    public TagLibraries(JspCompilationContext ctxt)
  +    {
           this.tagLibInfos = new Hashtable();
  -     //      this.tagCaches = new Hashtable();
  -        this.cl = cl;
  +     this.ctxt=ctxt;
  +    }
  +
  +    /** Add a location mapping. The container may do so if it
  +     has parsed web.xml ( and wants to share this info with
  +     us ), so we'll not have to do that again.
  +    */
  +    public void addTaglibLocation( String uri, String loc ) {
  +     if(locations==null )
  +         locations=new Hashtable();
  +     locations.put( uri, loc );
       }
  +
  +    // Get the taglib uri from web.xml data
  +    public String findLocation( String uriIn )
  +     throws IOException, JasperException
  +    {
  +     if( locations==null )
  +         ctxt.readWebXml( this );
  +     
  +     // ignorecase or toLowerCase
  +     return (String)locations.get( uriIn );
  +    }
  +
  +
       
  +    /** Add a taglib prefix and the associated URI.
  +     This is the result of a taglib directive, we'll need to
  +     read the descriptor if not already there.
  +    */
  +    public void addTagLibrary( String prefix, String uri )
  +     throws JasperException, IOException
  +    {
  +     if( tagLibInfos.get( prefix ) != null ) {
  +         return;
  +         // we already parsed this 
  +     }
  +
  +     TagLibraryInfoImpl tl = new TagLibraryInfoImpl(prefix, uri);
  +
  +     ctxt.readTLD(  this, tl, prefix, uri );
  +
  +
  +     addTagLibrary(prefix, tl);
  +    }
  +    
       public void addTagLibrary(String prefix, TagLibraryInfo tli) {
           tagLibInfos.put(prefix, tli);
       }
  @@ -110,31 +160,5 @@
           return (TagLibraryInfo) tagLibInfos.get(prefix);
       }
   
  -//     public TagInfoImpl getTagInfoImpl(String prefix, String shortTagName) {
  -//   // Should use TagLibraryInfoImpl
  -//   Hashtable tagLib=(Hashtable)tagCaches.get( prefix );
  -//   if( tagLib==null ) return null;
  -     
  -//   return (TagInfoImpl) tagLib.get( shortTagName );
  -//     }
  -
  -//     public Class getTagHandlerClass( String prefix, String shortTagName ) {
  -//   return getTagInfoImpl( prefix, shortTagName ).getTagHandlerClass();
  -//     }
  -
  -//     public void putTagInfoImpl(String prefix, String shortTagName,
  -//                          TagInfoImpl tc)
  -//     {
  -//   Hashtable tagLib=(Hashtable)tagCaches.get( prefix );
  -//   if( tagLib==null ) {
  -//       tagLib=new Hashtable();
  -//       tagCaches.put( prefix, tagLib );
  -//   }
  -//   tagLib.put( shortTagName, tc);
  -//     }
  -
  -    private Hashtable tagLibInfos;
  -    //    private Hashtable tagCaches;
  -    private ClassLoader cl;
   }
   
  
  
  
  1.2       +73 -410   
jakarta-tomcat-jasper/jasper34/generator/org/apache/jasper34/jsptree/TagLibraryInfoImpl.java
  
  Index: TagLibraryInfoImpl.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper34/generator/org/apache/jasper34/jsptree/TagLibraryInfoImpl.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- TagLibraryInfoImpl.java   2001/06/06 05:52:10     1.1
  +++ TagLibraryInfoImpl.java   2001/06/07 06:59:06     1.2
  @@ -70,6 +70,7 @@
   import java.io.FileNotFoundException;
   import java.util.Vector;
   import java.util.Hashtable;
  +import java.util.Enumeration;
   
   import javax.servlet.jsp.tagext.TagLibraryInfo;
   import javax.servlet.jsp.tagext.TagInfo;
  @@ -93,25 +94,81 @@
    * @author Mandar Raje
    */
   public class TagLibraryInfoImpl extends TagLibraryInfo {
  -    static private final String TLD = "META-INF/taglib.tld";
  -    static private final String WEBAPP_INF = "/WEB-INF/web.xml";
   
  -    Document tld;
  +    public TagLibraryInfoImpl(String prefix, String uriIn) 
  +        throws IOException, JasperException
  +    {
  +        super(prefix, uriIn);
  +    }
  +
  +    // -------------------- Setter methods --------------------
  +    // Used by the tag reader to set the fields
  +    // May be used by XmlMapper, or container-specific code
  +
  +    public void setURI( String uri ) {
  +     this.uri=uri;
  +    }
  +
  +    public void setPrefixString( String p ) {
  +     prefix=p;
  +    }
   
  -    Hashtable jarEntries;
  +    public void setShortName( String s ) {
  +     shortname=s;
  +    }
   
  -    JspCompilationContext ctxt;
  +    public void setReliableURN( String s ) {
  +     urn=s;
  +    }
   
  +    public void setInfoString( String s ) {
  +     info=s;
  +    }
  +
  +    public void setRequiredVersion( String s ) {
  +     jspversion=s;
  +    }
  +
  +    // We can add only TagInfoImpl, we need the extra fields
  +    // for correct processing. You can't mix other implementations,
  +    // those things work togheter
  +    public void addTagInfo( TagInfoImpl ti ) {
  +     tagsH.put( ti.getTagName(), ti );
  +     tags=null; // clear previous cached values
  +    }
  +
  +    // override the base method in javax.servlet.jsp
  +    public TagInfo getTag( String shortname ) {
  +     return (TagInfo)tagsH.get( shortname );
  +    }
       
  +    // overrid base method 
  +    public TagInfo[] getTagInfo() {
  +     if( tags==null ) {
  +         int size=tagsH.size();
  +         if( size==0 ) return null;
  +         tags=new TagInfo[ size ];
  +         Enumeration els=tagsH.elements();
  +         for( int i=0; els.hasMoreElements(); i++ ) {
  +             tags[i]=(TagInfo)els.nextElement();
  +         }
  +     }
  +     return tags;
  +    }
   
  -    private final void print(String name, String value, PrintWriter w) {
  -        if (value != null) {
  -            w.print(name+" = {\n\t");
  -            w.print(value);
  -            w.print("\n}\n");
  -        }
  +    public void setVersion( String s ) {
  +     tlibversion=s;
       }
  +    
  +    // Special internal representation for tags[]
  +    // Use a hashtable instead of linear search
  +    // 
   
  +    Hashtable tagsH=new Hashtable();
  +    
  +    
  +    // -------------------- Debug info --------------------
  +    
       public String toString() {
           StringWriter sw = new StringWriter();
           PrintWriter out = new PrintWriter(sw);
  @@ -128,407 +185,13 @@
           return sw.toString();
       }
       
  -    // XXX FIXME
  -    // resolveRelativeUri and/or getResourceAsStream don't seem to properly
  -    // handle relative paths when dealing when home and getDocBase are set
  -    // the following is a workaround until these problems are resolved.
  -    private InputStream getResourceAsStream(String uri) 
  -        throws FileNotFoundException 
  -    {
  -        if (uri.indexOf(":") > 0) {
  -            // may be fully qualified (Windows) or may be a URL.  Let
  -            // getResourceAsStream deal with it.
  -            return ctxt.getResourceAsStream(uri);
  -        } else {
  -            // assume it translates to a real file, and use getRealPath
  -            String real = ctxt.getRealPath(uri);
  -            return (real == null) ? null : new FileInputStream(real);
  -        }
  -    }
  -
  -    public TagLibraryInfoImpl(JspCompilationContext ctxt, String prefix, String 
uriIn) 
  -        throws IOException, JasperException
  -    {
  -        super(prefix, uriIn);
  -
  -     this.ctxt = ctxt;
  -        ZipInputStream zin;
  -        InputStream in = null;
  -        URL url = null;
  -        boolean relativeURL = false;
  -     this.uri = uriIn;
  -
  -        // Parse web.xml.
  -        InputStream is = getResourceAsStream(WEBAPP_INF);
  -
  -        if (is != null) {
  -            Document webtld =
  -                TreeUtil.parseXMLDoc(is,
  -                                    Constants.WEBAPP_DTD_RESOURCE,
  -                                    Constants.WEBAPP_DTD_PUBLIC_ID);
  -            NodeList nList =  webtld.getElementsByTagName("taglib");
  -
  -            if (nList.getLength() != 0) {
  -                for(int i = 0; i < nList.getLength(); i++) {
  -                    String tagLoc = null;
  -                    boolean match = false;
  -                    Element e =  (Element) nList.item(i);
  -
  -                    // Assume only one entry for location and uri.
  -                    NodeList uriList = e.getElementsByTagName("taglib-uri");
  -                    Element uriElem = (Element) uriList.item(0);
  -                    Text t = (Text) uriElem.getFirstChild();
  -
  -                    if (t != null) {
  -                        String tmpUri = t.getData();
  -                        if (tmpUri != null) {
  -                            tmpUri = tmpUri.trim();
  -                            if (tmpUri.equals(uriIn)) {
  -                                match = true;
  -                                NodeList locList = e.getElementsByTagName
  -                                    ("taglib-location");
  -                                Element locElem = (Element) locList.item(0);
  -                                Text tl = (Text) locElem.getFirstChild();
  -                                if (tl != null) {
  -                                    tagLoc = tl.getData();
  -                                    if (tagLoc != null)
  -                                        tagLoc = tagLoc.trim();
  -                                }
  -                            }
  -                        }
  -                    }
  -                    if (match == true && tagLoc != null) {
  -                        this.uri = tagLoc;
  -
  -                        // If this is a relative path, then it has to be
  -                        // relative to where web.xml is.
  -
  -                        // I'm taking the simple way out. Since web.xml 
  -                        // has to be directly under WEB-INF, I'm making 
  -                        // an absolute URI out of it by prepending WEB-INF
  -
  -                        if (!uri.startsWith("/") && isRelativeURI(uri))
  -                            uri = "/WEB-INF/"+uri;
  -                    }
  -                }
  -            }
  -        }
  -
  -        // Try to resolve URI relative to the current JSP page
  -        if (!uri.startsWith("/") && isRelativeURI(uri))
  -            uri = ctxt.resolveRelativeUri(uri);
  -
  -
  -        if (!uri.endsWith("jar")) {
  -         in = getResourceAsStream(uri);
  -         
  -         if (in == null)
  -             throw new 
JasperException(Constants.getString("jsp.error.tld_not_found",
  -                                                           new Object[] {uri}));
  -         // Now parse the tld.
  -         parseTLD(in);
  -     }
  -         
  -     // FIXME Take this stuff out when taglib changes are thoroughly tested.
  -        // 2000.11.15 commented out the 'copy to work dir' section,
  -        // which I believe is what this FIXME comment referred to. (pierred)
  -     if (uri.endsWith("jar")) {
  -         
  -         if (!isRelativeURI(uri)) {
  -             url = new URL(uri);
  -             in = url.openStream();
  -         } else {
  -             relativeURL = true;
  -             in = getResourceAsStream(uri);
  -         }
  -         
  -         zin = new ZipInputStream(in);
  -         this.jarEntries = new Hashtable();
  -         this.ctxt = ctxt;
  -         
  -            /* NOT COMPILED
  -         // First copy this file into our work directory! 
  -         {
  -             File jspFile = new File(ctxt.getJspFile());
  -                String parent = jspFile.getParent();
  -                String jarFileName = ctxt.getOutputDir();
  -                if (parent != null) {
  -                   jarFileName = jarFileName + File.separatorChar +
  -                       parent;
  -                }
  -                File jspDir = new File(jarFileName);
  -             jspDir.mkdirs();
  -         
  -             if (relativeURL)
  -                 jarFileName = jarFileName+File.separatorChar+new 
File(uri).getName();
  -             else                    
  -                 jarFileName = jarFileName+File.separatorChar+
  -                     new File(url.getFile()).getName();
  -         
  -             Constants.message("jsp.message.copyinguri", 
  -                               new Object[] { uri, jarFileName },
  -                               Log.DEBUG);
  -         
  -             if (relativeURL)
  -                 copy(getResourceAsStream(uri),
  -                      jarFileName);
  -             else
  -                 copy(url.openStream(), jarFileName);
  -         
  -             ctxt.addJar(jarFileName);
  -         }
  -            */ // END NOT COMPILED
  -         boolean tldFound = false;
  -         ZipEntry entry;
  -         while ((entry = zin.getNextEntry()) != null) {
  -             if (entry.getName().equals(TLD)) {
  -                 /*******
  -                  * This hack is necessary because XML reads until the end 
  -                  * of an inputstream -- does not use available()
  -                  * -- and closes the inputstream when it can't
  -                  * read no more.
  -                  */
  -                 
  -                 // BEGIN HACK
  -                 ByteArrayOutputStream baos = new ByteArrayOutputStream();
  -                 int b;
  -                 while (zin.available() != 0) {
  -                     b = zin.read();
  -                     if (b == -1)
  -                         break;
  -                     baos.write(b);
  -                 }
  -
  -                 baos.close();
  -                 ByteArrayInputStream bais 
  -                     = new ByteArrayInputStream(baos.toByteArray());
  -                 // END HACK
  -                 tldFound = true;
  -                 parseTLD(bais);
  -             } else {
  -                 ByteArrayOutputStream baos = new ByteArrayOutputStream();
  -                 int b;
  -                 while (zin.available() != 0) {
  -                     b = zin.read();
  -                     if (b == -1)
  -                         break;
  -                     baos.write(b);
  -                 }
  -                 baos.close();
  -                 jarEntries.put(entry.getName(), baos.toByteArray());
  -             }
  -             zin.closeEntry();
  -         }
  -         
  -         if (!tldFound)
  -             throw new 
JasperException(Constants.getString("jsp.error.tld_not_found",
  -                                                           new Object[] {
  -                 TLD
  -                     }
  -                                                           ));
  -     } // Take this out (END of if(endsWith("jar")))
  -    }
  -    
  -    /** Returns true if the given URI is relative in this web application, false if 
it is an internet URI.
  -     */
  -    private boolean isRelativeURI(String uri) {
  -        return (uri.indexOf(':') == -1);
  -    }
  -    
  -        
  -    private void parseTLD(InputStream in) 
  -        throws JasperException
  -    {
  -     tld = TreeUtil.parseXMLDoc(in,
  -                               Constants.TAGLIB_DTD_RESOURCE,
  -                               Constants.TAGLIB_DTD_PUBLIC_ID);
  -     
  -        Vector tagVector = new Vector();
  -        NodeList list = tld.getElementsByTagName("taglib");
  -
  -        if (list.getLength() != 1)
  -            throw new 
JasperException(Constants.getString("jsp.error.more.than.one.taglib"));
  -
  -        Element elem = (Element) list.item(0);
  -        list = elem.getChildNodes();
  -
  -        for(int i = 0; i < list.getLength(); i++) {
  -         Node tmp = list.item(i);
  -         if (! (tmp instanceof Element)) continue;
  -            Element e = (Element) tmp;
  -            String tname = e.getTagName();
  -            if (tname.equals("tlibversion")) {
  -                Text t = (Text) e.getFirstChild();
  -                if (t != null)
  -                    this.tlibversion = t.getData().trim();
  -            } else if (tname.equals("jspversion")) {
  -                Text t = (Text) e.getFirstChild();
  -                if (t != null)
  -                    this.jspversion = t.getData().trim();
  -            } else if (tname.equals("shortname")) {
  -                Text t = (Text) e.getFirstChild();
  -                if (t != null)
  -                    this.shortname = t.getData().trim();
  -            } else if (tname.equals("uri")) {
  -                Text t = (Text) e.getFirstChild();
  -                if (t != null)
  -                    this.urn = t.getData().trim();
  -            } else if (tname.equals("info")) {
  -                Text t = (Text) e.getFirstChild();
  -                if (t != null)
  -                    this.info = t.getData().trim();
  -            } else if (tname.equals("tag"))
  -                tagVector.addElement(createTagInfo(e));
  -            else
  -                Constants.message("jsp.warning.unknown.element.in.TLD", 
  -                                  new Object[] {
  -                                      e.getTagName()
  -                                  },
  -                                  Log.WARNING
  -                                  );
  -        }
  -
  -        this.tags = new TagInfo[tagVector.size()];
  -        tagVector.copyInto (this.tags);
  -    }
  -
  -    private TagInfoImpl createTagInfo(Element elem) throws JasperException {
  -        String name = null, tagclass = null, teiclass = null;
  -        String bodycontent = "JSP"; // Default body content is JSP
  -     String info = null;
  -        
  -        Vector attributeVector = new Vector();
  -        NodeList list = elem.getChildNodes();
  -        for(int i = 0; i < list.getLength(); i++) {
  -            Node tmp  =  list.item(i);
  -         if (! (tmp instanceof Element)) continue;
  -         Element e = (Element) tmp;
  -            String tname = e.getTagName();
  -            if (tname.equals("name")) {
  -                Text t = (Text) e.getFirstChild();
  -                if (t != null)
  -                    name = t.getData().trim();
  -            } else if (tname.equals("tagclass")) {
  -                Text t = (Text) e.getFirstChild();
  -                if (t != null)
  -                    tagclass = t.getData().trim();
  -            } else if (tname.equals("teiclass")) {
  -                Text t = (Text) e.getFirstChild();
  -                if (t != null)
  -                    teiclass = t.getData().trim();
  -            } else if (tname.equals("bodycontent")) {
  -                Text t = (Text) e.getFirstChild();
  -                if (t != null)
  -                    bodycontent = t.getData().trim();
  -            } else if (tname.equals("info")) {
  -                Text t = (Text) e.getFirstChild();
  -                if (t != null)
  -                    info = t.getData().trim();
  -            } else if (tname.equals("attribute"))
  -                attributeVector.addElement(createAttribute(e));
  -            else 
  -                Constants.message("jsp.warning.unknown.element.in.tag", 
  -                                  new Object[] {
  -                                      e.getTagName()
  -                                  },
  -                                  Log.WARNING
  -                                  );
  -        }
  -     TagAttributeInfo[] tagAttributeInfo 
  -            = new TagAttributeInfo[attributeVector.size()];
  -     attributeVector.copyInto (tagAttributeInfo);
  -
  -        TagExtraInfo tei = null;
  -
  -        if (teiclass != null && !teiclass.equals(""))
  -            try {
  -                Class teiClass = ctxt.getClassLoader().loadClass(teiclass);
  -                tei = (TagExtraInfo) teiClass.newInstance();
  -         } catch (ClassNotFoundException cex) {
  -                Constants.message("jsp.warning.teiclass.is.null",
  -                                  new Object[] {
  -                                      teiclass, cex.getMessage()
  -                                  },
  -                                  Log.WARNING
  -                                  );
  -            } catch (IllegalAccessException iae) {
  -                Constants.message("jsp.warning.teiclass.is.null",
  -                                  new Object[] {
  -                                      teiclass, iae.getMessage()
  -                                  },
  -                                  Log.WARNING
  -                                  );
  -            } catch (InstantiationException ie) {
  -                Constants.message("jsp.warning.teiclass.is.null",
  -                                  new Object[] {
  -                                      teiclass, ie.getMessage()
  -                                  },
  -                                  Log.WARNING
  -                                  );
  -            }
  -
  -        TagInfoImpl taginfo = new TagInfoImpl(name, tagclass, bodycontent,
  -                                           info, this, 
  -                                           tei,
  -                                           tagAttributeInfo);
  -        return taginfo;
  -    }
  -
  -    TagAttributeInfo createAttribute(Element elem) {
  -        String name = null;
  -        boolean required = false, rtexprvalue = false, reqTime = false;
  -        String type = null;
  -        
  -        NodeList list = elem.getChildNodes();
  -        for(int i = 0; i < list.getLength(); i++) {
  -            Node tmp  = list.item(i);
  -         if (! (tmp instanceof Element)) continue;
  -         Element e = (Element) tmp;
  -            String tname = e.getTagName();
  -            if (tname.equals("name"))  {
  -                Text t = (Text) e.getFirstChild();
  -                if (t != null)
  -                    name = t.getData().trim();
  -            } else if (tname.equals("required"))  {
  -                Text t = (Text) e.getFirstChild();
  -                if (t != null) {
  -                    required = Boolean.valueOf(t.getData().trim()).booleanValue();
  -                    if( t.getData().equalsIgnoreCase("yes") )
  -                        required = true;
  -                }
  -            } else if (tname.equals("rtexprvalue")) {
  -                Text t = (Text) e.getFirstChild();
  -                if (t != null) {
  -                    rtexprvalue = 
Boolean.valueOf(t.getData().trim()).booleanValue();
  -                    if( t.getData().equalsIgnoreCase("yes") )
  -                        rtexprvalue = true;
  -                }
  -            } else if (tname.equals("type")) {
  -                Text t = (Text) e.getFirstChild();
  -                if (t != null)
  -                    type = t.getData().trim();
  -            } else 
  -                Constants.message("jsp.warning.unknown.element.in.attribute", 
  -                                  new Object[] {
  -                                      e.getTagName()
  -                                  },
  -                                  Log.WARNING
  -                                  );
  +    private final void print(String name, String value, PrintWriter w) {
  +        if (value != null) {
  +            w.print(name+" = {\n\t");
  +            w.print(value);
  +            w.print("\n}\n");
           }
  -        
  -     //     return new TagAttributeInfo(name, required, rtexprvalue, type);
  -        return new TagAttributeInfo(name, required, type, rtexprvalue);
       }
   
  -    static void copy(InputStream in, String fileName) 
  -        throws IOException, FileNotFoundException 
  -    {
  -        byte[] buf = new byte[1024];
  -
  -        FileOutputStream out = new FileOutputStream(fileName);
  -        int nRead;
  -        while ((nRead = in.read(buf, 0, buf.length)) != -1)
  -            out.write(buf, 0, nRead);
  -    }
   
   }
  
  
  
  1.2       +20 -0     
jakarta-tomcat-jasper/jasper34/generator/org/apache/jasper34/jsptree/package.html
  
  Index: package.html
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-jasper/jasper34/generator/org/apache/jasper34/jsptree/package.html,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- package.html      2001/06/06 05:55:56     1.1
  +++ package.html      2001/06/07 06:59:06     1.2
  @@ -1,5 +1,25 @@
   <h2>Tree representation of a JSP page</h2>
   
  +JspPageInfo is the main class, collecting all the informations about a page.
  +It contains a tree of JspNode ( TODO - right now it's a tree of Generators).
  +It also contains informations about all the tag libs and all the tags.
  +
  +<h2>Tags</h2>
  +
  +Tags are special because they affect the way the source is parsed. This is 
  +a very tricky thing, and the reason the parser needs to depend on the 
  +jsptree and implement/use the directive processing.
  +
  +<p>
  +
  +We keep all the informations available in TagLibraries, which collects 
  +all the taglibs for a webapps ( TODO: make sure it's singeleton/webapp ).
  +This avoids re-reading the tlds and allows the container to push 
  +the information into jasper ( if it has it already - like from parsing
  +web.xml or preprocessing at deployment time ). The liaison also makes callbacks
  +to the container, which could implement a more efficient reading or use
  +the default ( which now is quite bad - DOM and quite complex )
  +
   <h2>History</h2>
   
   jasper33 and 40 creates a tree of Generators, and then it traverses the
  
  
  

Reply via email to