costin      01/04/21 22:37:31

  Modified:    src/share/org/apache/tomcat/modules/config AutoDeploy.java
  Log:
  #196 - support for re-deploying the WAR if a change is detected.
  
  That supports a certain operation mode, where you upload a new version of the WAR
  in the server. ( the old dir will be deleted ! - so it will not work if you change
  both the war and the files ).
  
  It is disabled by default, use redeploy=true to enable.
  
  Revision  Changes    Path
  1.5       +85 -14    
jakarta-tomcat/src/share/org/apache/tomcat/modules/config/AutoDeploy.java
  
  Index: AutoDeploy.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/config/AutoDeploy.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- AutoDeploy.java   2001/03/07 23:48:58     1.4
  +++ AutoDeploy.java   2001/04/22 05:37:31     1.5
  @@ -84,6 +84,10 @@
       String dest="webapps";
       boolean redeploy=false;
   
  +    File webappS;
  +    File webappD;
  +     
  +
       // map destination dir ( used in Ctx docBase ) -> File ( war source)
       Hashtable expanded=new Hashtable();
       
  @@ -146,9 +150,6 @@
        // expand all the wars from srcDir ( webapps/*.war ).
        String home=cm.getHome();
   
  -     File webappS;
  -     File webappD;
  -     
        if( src.startsWith( "/" ) ) 
            webappS=new File(src);
        else
  @@ -183,17 +184,26 @@
   
        File appDir=new File( destD, fname);
        File srcF=new File( srcD, name );
  -     File destF=new File( destD, fname );
  -     expanded.put( destF.getAbsolutePath(),  srcF );
  -
  +     expanded.put( appDir.getAbsolutePath(),
  +                   new DeployInfo( srcD, destD, srcF, appDir, name ) );
  +     if( redeploy ) {
  +         // if appDir is older than the war, and re-deploy enabled -
  +         if( appDir.exists() &&
  +             appDir.lastModified() < srcF.lastModified() ) {
  +             log( "WAR file is newer, removing old dir " + srcF + " " +name );
  +             FileUtil.clearDir( appDir );
  +         }
  +     }
  +     
        if( ! appDir.exists() ) {
            // no check if war file is "newer" than directory 
            // To update you need to "remove" the context first!!!
            appDir.mkdirs();
            // Expand war file
  +         log( "Expanding " + srcF );
            try {
                FileUtil.expand(srcF.getAbsolutePath(), 
  -                             destF.getAbsolutePath() );
  +                             appDir.getAbsolutePath() );
   
            } catch( IOException ex) {
                log("expanding webapp " + name, ex);
  @@ -202,15 +212,47 @@
        }
       }
   
  +    public void addContext( ContextManager cm, Context ctx )
  +     throws TomcatException 
  +    {
  +     // this may be called on a "full" reload ( stop/start ctx )
  +     if( redeploy ) {
  +         String ctxBase=ctx.getAbsolutePath();
  +         DeployInfo dInfo=(DeployInfo)expanded.get( ctxBase );
  +         if( dInfo == null || ! dInfo.srcF.exists() )
  +             return;
  +         if( dInfo.appDir.exists() &&
  +             dInfo.appDir.lastModified() < dInfo.srcF.lastModified() ) {
  +             log( "WAR file is newer, removing old dir " + dInfo.srcF
  +                  + " " + dInfo.name );
  +             FileUtil.clearDir( dInfo.appDir );
  +             
  +             dInfo.appDir.mkdirs();
  +             // Expand war file
  +             log( "Expanding " + dInfo.srcF );
  +             try {
  +                 FileUtil.expand(dInfo.srcF.getAbsolutePath(), 
  +                                 dInfo.appDir.getAbsolutePath() );
  +                 
  +             } catch( IOException ex) {
  +                 log("expanding webapp " + dInfo.name, ex);
  +                 // do what ?
  +             }
  +         }
  +         
  +     }
  +    }
  +
       public void contextInit( Context context)
        throws TomcatException
       {
        if( redeploy ) {
            String ctxBase=context.getAbsolutePath();
  -         File warFile=(File)expanded.get( ctxBase );
  -         if( warFile == null || ! warFile.exists() )
  +         DeployInfo dInfo=(DeployInfo)expanded.get( ctxBase );
  +         if( dInfo == null || ! dInfo.srcF.exists() )
                return;
  -         
  +
  +         File warFile=dInfo.srcF;
            DependManager dm=(DependManager)context.getContainer().
                getNote("DependManager");
            if( dm!=null ) {
  @@ -220,15 +262,44 @@
                dep.setOrigin( warFile );
                dep.setLastModified( warFile.lastModified() );
                dm.addDependency( dep );
  -             context.getContainer().setNote( "autoDeploy.war", warFile );
  +             context.getContainer().setNote( "autoDeploy.war", dInfo);
  +
  +         } else {
  +             log( "No reloading for " + context + " -> " +  warFile );
            }
        }
       }
       
       public void reload( Request req, Context context) throws TomcatException {
  -     File war=(File)context.getContainer().getNote( "autoDeploy.war" );
  -     if( war==null ) return;
  -     log( "XXX not implemented - need to re-expand " + war ); 
  +     log("Reloading " + redeploy );
  +     if( redeploy ) {
  +         DeployInfo dI=(DeployInfo)context.getContainer().getNote( "autoDeploy.war" 
);
  +         if( dI==null ) return;
  +         log( "Re-deploying " + dI.srcF );
  +         
  +         // First remove the old directory
  +         log( "Removing " + dI.appDir );
  +         FileUtil.clearDir( dI.appDir );
  +     
  +     // now expand again.
  +         expandWar( dI.srcD, dI.destD, dI.name );
  +     }
  +    }
  +
  +    static class DeployInfo {
  +     File srcD, destD, srcF, appDir;
  +     String name;
  +     
  +     DeployInfo(File srcD, File destD, File srcF, File appDir, String name)
  +     {
  +         this.srcD=srcD;
  +         this.srcF=srcF;
  +         this.destD=destD;
  +         this.appDir=appDir;
  +         this.name=name;
  +         
  +     }
  +
       }
   }
   
  
  
  

Reply via email to