glenn       01/02/03 17:07:00

  Modified:    jasper/src/share/org/apache/jasper/runtime
                        JspFactoryImpl.java
  Log:
  - Implemented Java SecurityManager
  - Switched to using URLClassLoader
  
  Jasper now creates a URLClassLoader for each JSP page and defers any other
  class loading to the web app context class loader.  Using a single class
  loader per JSP allowed me to remove all the code that increments the
  class version number, i.e. the work directory no longer has multiple
  *.java and *.class files for the same JSP page.  These changes also made
  it easy for me to put the java source and class files in the same directory
  tree as found in the web app context.  When Jasper is run in a servlet
  container it no longer puts the class files in a package, they are now
  in the default package.
  
  Revision  Changes    Path
  1.2       +93 -9     
jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/runtime/JspFactoryImpl.java
  
  Index: JspFactoryImpl.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/runtime/JspFactoryImpl.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- JspFactoryImpl.java       2000/08/12 00:52:12     1.1
  +++ JspFactoryImpl.java       2001/02/04 01:07:00     1.2
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/runtime/JspFactoryImpl.java,v
 1.1 2000/08/12 00:52:12 pierred Exp $
  - * $Revision: 1.1 $
  - * $Date: 2000/08/12 00:52:12 $
  + * $Header: 
/home/cvs/jakarta-tomcat-4.0/jasper/src/share/org/apache/jasper/runtime/JspFactoryImpl.java,v
 1.2 2001/02/04 01:07:00 glenn Exp $
  + * $Revision: 1.2 $
  + * $Date: 2001/02/04 01:07:00 $
    *
    * ====================================================================
    * 
  @@ -68,6 +68,9 @@
   import javax.servlet.jsp.JspEngineInfo;
   import javax.servlet.jsp.PageContext;
   
  +import java.security.AccessController;
  +import java.security.PrivilegedAction;
  +
   import org.apache.jasper.util.SimplePool;
   import org.apache.jasper.logging.Logger;
   
  @@ -78,12 +81,82 @@
    * @author Anil K. Vijendran
    */
   public class JspFactoryImpl extends JspFactory {
  +
  +    protected class PrivilegedGetPageContext implements PrivilegedAction {
  +     private JspFactoryImpl factory;
  +     private Servlet servlet;
  +     private ServletRequest request;
  +     private ServletResponse response;
  +     private String errorPageURL;
  +     private boolean needsSession;
  +     private int bufferSize;
  +     private boolean autoflush;
  +
  +     PrivilegedGetPageContext(JspFactoryImpl factory,
  +         Servlet servlet,
  +         ServletRequest request,
  +         ServletResponse response,
  +         String errorPageURL,
  +         boolean needsSession, int bufferSize,
  +         boolean autoflush)
  +     {
  +         this.factory = factory;
  +         this.servlet = servlet;
  +         this.request = request;
  +         this.response = response;
  +         this.errorPageURL = errorPageURL;
  +         this.needsSession = needsSession;
  +         this.bufferSize = bufferSize;
  +         this.autoflush = autoflush;
  +     }
  + 
  +     public Object run() {
  +         return factory.internalGetPageContext(servlet,request,
  +             response,errorPageURL,
  +             needsSession,bufferSize,autoflush);
  +     }
  +    }
  +
  +    protected class PrivilegedReleasePageContext implements PrivilegedAction {
  +        private JspFactoryImpl factory;
  +     private PageContext pageContext;
  +
  +        PrivilegedReleasePageContext(JspFactoryImpl factory,
  +            PageContext pageContext)
  +        {
  +            this.factory = factory;
  +            this.pageContext = pageContext;
  +        }
  +
  +        public Object run() {
  +            factory.internalReleasePageContext(pageContext);
  +         return null;
  +        }
  +    }
  +
       private SimplePool pool=new SimplePool( 100 );
       private static final boolean usePool=true;
  -    
  +
       Logger.Helper loghelper = new Logger.Helper("JASPER_LOG", "JspFactoryImpl");
       
       public PageContext getPageContext(Servlet servlet, ServletRequest request,
  +                                      ServletResponse response,
  +                                      String errorPageURL,                    
  +                                      boolean needsSession, int bufferSize,
  +                                      boolean autoflush)
  +    {
  +     if( System.getSecurityManager() != null ) {
  +         PrivilegedGetPageContext dp = new PrivilegedGetPageContext(
  +             (JspFactoryImpl)this,servlet,request,response,errorPageURL,
  +                needsSession,bufferSize,autoflush);
  +         return (PageContext)AccessController.doPrivileged(dp);
  +     }
  +     return internalGetPageContext(servlet,request,response,errorPageURL,
  +                                   needsSession,bufferSize,autoflush);
  +
  +    }
  +
  +    protected PageContext internalGetPageContext(Servlet servlet, ServletRequest 
request,
                                         ServletResponse response, 
                                      String errorPageURL, 
                                         boolean needsSession, int bufferSize, 
  @@ -93,24 +166,35 @@
            PageContext pc;
            if( usePool ) {
                pc=(PageContextImpl)pool.get();
  -             if( pc == null ) pc= new PageContextImpl(this);
  +             if( pc == null ) {
  +                 pc= new PageContextImpl(this);
  +             }
            } else {
                pc =  new PageContextImpl(this);
            }
  -
  -         //      System.out.println("JspFactoryImpl.getPC"  + pc);
            pc.initialize(servlet, request, response, errorPageURL, 
                             needsSession, bufferSize, autoflush);
  -         
               return pc;
           } catch (Throwable ex) {
               /* FIXME: need to do something reasonable here!! */
  -         loghelper.log("Exception initializing page context", ex);
  +            loghelper.log("Exception initializing page context", ex);
               return null;
           }
       }
   
       public void releasePageContext(PageContext pc) {
  +     if( pc == null )
  +         return;
  +        if( System.getSecurityManager() != null ) {
  +            PrivilegedReleasePageContext dp = new PrivilegedReleasePageContext(
  +                (JspFactoryImpl)this,pc);
  +            AccessController.doPrivileged(dp);
  +        } else {
  +            internalReleasePageContext(pc);
  +     }
  +    }
  +
  +    private void internalReleasePageContext(PageContext pc) {
           pc.release();
        if( usePool) {
            pool.put( pc );
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, email: [EMAIL PROTECTED]

Reply via email to