remm        2002/09/29 08:21:21

  Modified:    catalina/src/share/org/apache/catalina/core
                        StandardContext.java
  Log:
  - Merge refactored resources lifecycle handling from 4.1 branch.
  
  Revision  Changes    Path
  1.8       +94 -40    
jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/StandardContext.java
  
  Index: StandardContext.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/core/StandardContext.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- StandardContext.java      24 Aug 2002 02:27:27 -0000      1.7
  +++ StandardContext.java      29 Sep 2002 15:21:21 -0000      1.8
  @@ -499,6 +499,12 @@
       protected boolean cachingAllowed = true;
   
   
  +    /**
  +     * Non proxied resources.
  +     */
  +    protected DirContext webappResources = null;
  +
  +
       // ----------------------------------------------------- Context Properties
   
   
  @@ -1148,16 +1154,28 @@
        */
       public synchronized void setResources(DirContext resources) {
   
  +        if (started) {
  +            throw new IllegalStateException
  +                (sm.getString("standardContext.resources.started"));
  +        }
  +
  +        DirContext oldResources = this.webappResources;
  +        if (oldResources == resources)
  +            return;
  +
           if (resources instanceof BaseDirContext) {
  -            ((BaseDirContext) resources).setDocBase(getBasePath());
               ((BaseDirContext) resources).setCached(isCachingAllowed());
           }
           if (resources instanceof FileDirContext) {
               filesystemBased = true;
           }
  -        super.setResources(resources);
  -        if (started)
  -            postResources(); // As a servlet context attribute
  +        this.webappResources = resources;
  +
  +        // The proxied resources will be refreshed on start
  +        this.resources = null;
  +
  +        support.firePropertyChange("resources", oldResources, 
  +                                   this.webappResources);
   
       }
   
  @@ -3446,6 +3464,66 @@
   
   
       /**
  +     * Allocate resources, including proxy.
  +     * Return <code>true</code> if initialization was successfull,
  +     * or <code>false</code> otherwise.
  +     */
  +    public boolean resourcesStart() {
  +
  +        boolean ok = true;
  +
  +        Hashtable env = new Hashtable();
  +        if (getParent() != null)
  +            env.put(ProxyDirContext.HOST, getParent().getName());
  +        env.put(ProxyDirContext.CONTEXT, getName());
  +
  +        try {
  +            ProxyDirContext proxyDirContext = 
  +                new ProxyDirContext(env, webappResources);
  +            if (webappResources instanceof BaseDirContext) {
  +                ((BaseDirContext) webappResources).setDocBase(getBasePath());
  +                ((BaseDirContext) webappResources).allocate();
  +            }
  +            this.resources = proxyDirContext;
  +        } catch (Throwable t) {
  +            log(sm.getString("standardContext.resourcesStart", t));
  +            ok = false;
  +        }
  +
  +        return (ok);
  +
  +    }
  +
  +
  +    /**
  +     * Deallocate resources and destroy proxy.
  +     */
  +    public boolean resourcesStop() {
  +
  +        boolean ok = true;
  +
  +        try {
  +            if (resources != null) {
  +                if (resources instanceof Lifecycle) {
  +                    ((Lifecycle) resources).stop();
  +                }
  +                if (webappResources instanceof BaseDirContext) {
  +                    ((BaseDirContext) webappResources).release();
  +                }
  +            }
  +        } catch (Throwable t) {
  +            log(sm.getString("standardContext.resourcesStop", t));
  +            ok = false;
  +        }
  +
  +        this.resources = null;
  +
  +        return (ok);
  +
  +    }
  +
  +
  +    /**
        * Load and initialize all servlets marked "load on startup" in the
        * web application deployment descriptor.
        *
  @@ -3519,7 +3597,7 @@
           boolean ok = true;
   
           // Add missing components as necessary
  -        if (getResources() == null) {   // (1) Required by Loader
  +        if (webappResources == null) {   // (1) Required by Loader
               if (debug >= 1)
                   log("Configuring default Resources");
               try {
  @@ -3531,14 +3609,10 @@
                   log("Error initializing resources: " + e.getMessage());
                   ok = false;
               }
  -            if (ok) {
  -                DirContext dirContext =
  -                    ((ProxyDirContext) resources).getDirContext();
  -                if ((dirContext != null)
  -                    && (dirContext instanceof BaseDirContext)) {
  -                    ((BaseDirContext) dirContext).allocate();
  -                }
  -            }
  +        }
  +        if (ok) {
  +            if (!resourcesStart())
  +                ok = false;
           }
           if (getLoader() == null) {      // (2) Required by Manager
               if (getPrivileged()) {
  @@ -3780,29 +3854,9 @@
               // Stop our application listeners
               listenerStop();
   
  -            // Stop our subordinate components, if any
  -            if (resources != null) {
  -                if (resources instanceof Lifecycle) {
  -                    ((Lifecycle) resources).stop();
  -                } else if (resources instanceof ProxyDirContext) {
  -                    DirContext dirContext =
  -                        ((ProxyDirContext) resources).getDirContext();
  -                    if (dirContext != null) {
  -                        if (debug >= 1) {
  -                            log("Releasing document base " + docBase);
  -                        }
  -                        if (dirContext instanceof BaseDirContext) {
  -                            ((BaseDirContext) dirContext).release();
  -                            if ((dirContext instanceof WARDirContext)
  -                                || (dirContext instanceof FileDirContext)) {
  -                                resources = null;
  -                            }
  -                        } else {
  -                            log("Cannot release " + resources);
  -                        }
  -                    }
  -                }
  -            }
  +            // Stop resources
  +            resourcesStop();
  +
               if ((realm != null) && (realm instanceof Lifecycle)) {
                   ((Lifecycle) realm).stop();
               }
  
  
  

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

Reply via email to