User: vharcq  
  Date: 02/04/01 01:30:48

  Modified:    core/src/xdoclet GenerationManager.java TemplateSubTask.java
  Log:
  Construct a DB with merge files involved in the generation of a file based on a 
templaet (ejb-jar.j needs ejb-body.j, ...)
  This reduces the time of a RE-generation to its minimum
  
  Revision  Changes    Path
  1.4       +176 -70   xdoclet/core/src/xdoclet/GenerationManager.java
  
  Index: GenerationManager.java
  ===================================================================
  RCS file: /cvsroot/xdoclet/xdoclet/core/src/xdoclet/GenerationManager.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -w -r1.3 -r1.4
  --- GenerationManager.java    30 Mar 2002 11:17:36 -0000      1.3
  +++ GenerationManager.java    1 Apr 2002 09:30:46 -0000       1.4
  @@ -1,43 +1,49 @@
  -/*
  - * Created by IntelliJ IDEA.
  - * User: Vincent
  - * Date: Mar 30, 2002
  - * Time: 10:59:13 AM
  - * To change template for new class use 
  - * Code Style | Class Templates options (Tools | IDE Options).
  - */
   package xdoclet;
   
   import xdoclet.tags.AbstractProgramElementTagsHandler;
  +import xdoclet.tags.PackageTagsHandler;
  +import xdoclet.tags.ClassTagsHandler;
   import xdoclet.template.TemplateException;
  -import xdoclet.template.TemplateParser;
   import xdoclet.util.Log;
   
   import java.io.File;
  +import java.io.FileOutputStream;
  +import java.io.IOException;
  +import java.io.FileInputStream;
   import java.net.URL;
  -import java.util.Map;
  +import java.text.MessageFormat;
  +import java.util.Properties;
  +import java.util.Iterator;
  +import java.util.StringTokenizer;
  +import java.util.List;
  +import java.util.ArrayList;
   import java.util.HashMap;
  +import java.util.Map;
  +import java.util.Arrays;
   
   import xjavadoc.XClass;
  +
   import org.apache.log4j.Category;
   
  -public class GenerationManager {
  +/**
  + * Verify if the generation is needed for Java files and Xml files based templates.
  + *
  + * @author    Vincent Harcq ([EMAIL PROTECTED])
  + * @created   March 30, 2002
  + * @version   $Revision: 1.4 $
  + */
  +public class GenerationManager
  +{
   
  -    private static               File xdocletJar = getXdocletJar();
  -    private static               File xjavadocJar = getXjavadocJar();
  +    private static final File xdocletJar = getXdocletJar();
  +    private static final File xjavadocJar = getXjavadocJar();
  +    private static final String TEMPLATE_FILES_DB = "xdoclet-template-db-" + 
DocletTask.XDOCLET_VERSION + ".properties";
       private boolean         guessGenerationNeeded = true;
  +    private TemplateSubTask subTask;
  +    private static Map parserDb = null;
   
  -    private URL             templateUrl;
  -    private TemplateParser  parser;
  -    private File            destDir;
  -    private boolean         isForce;
  -
  -
  -    public GenerationManager( URL templateUrl, TemplateParser parser, File destDir, 
boolean isForce){
  -        this.templateUrl = templateUrl;
  -        this.parser = parser;
  -        this.destDir = destDir;
  -        this.isForce = isForce;
  +    public GenerationManager( TemplateSubTask subTask){
  +        this.subTask = subTask;
       }
   
       public boolean isGuessGenerationNeeded()
  @@ -50,14 +56,6 @@
                this.guessGenerationNeeded = guessGenerationNeeded;
        }
   
  -    public URL getTemplateURL(){
  -        return templateUrl;
  -    }
  -
  -    public TemplateParser getParser(){
  -        return parser;
  -    }
  -
       /**
         * Test if a Java source mmust be generated or not depending of timestamp of
         * elements involved.
  @@ -71,9 +69,9 @@
        public boolean isGenerationNeeded( XClass clazz, File file, boolean 
withTemplate )
                 throws XDocletException
        {
  -             Category cat = Log.getCategory( TemplateSubTask.class, "generation" );
  +             Category cat = Log.getCategory( GenerationManager.class, "generation" 
);
   
  -        if( isForce )
  +        if( subTask.getContext().isForce() )
                {
                        if( cat.isDebugEnabled() )
                                cat.debug( "Force generation enabled" );
  @@ -141,7 +139,7 @@
                // 4. Check the timestamp of template file and merge files
                if( withTemplate )
                {
  -                     if( isGenerationNeeded( file, getTemplateURL() ) )
  +                     if( isGenerationNeeded( file, subTask.getTemplateURL() ) )
                                return true;
                }
   
  @@ -161,12 +159,12 @@
        public boolean isGenerationNeeded( File file )
                 throws XDocletException
        {
  -             Category cat = Log.getCategory( TemplateSubTask.class, "generation" );
  +             Category cat = Log.getCategory( GenerationManager.class, "generation" 
);
   
                if( cat.isDebugEnabled() )
                        cat.debug( "Generation need check for " + file.getName() );
   
  -        if( isForce )
  +        if( subTask.getContext().isForce() )
                {
                        if( cat.isDebugEnabled() )
                                cat.debug( "Force generation enabled" );
  @@ -189,12 +187,20 @@
                }
                if( cat.isDebugEnabled() )
                        cat.debug( "Reject file '"+file.getName()+"' because of 
timestamp of " + xdocletJar.getName() );
  +        if( file.lastModified() < xjavadocJar.lastModified() )
  +             {
  +                     if( cat.isDebugEnabled() )
  +                             cat.debug( "Generation needed for '" + file.getName() 
+ "' because of timestamp of " + xjavadocJar.getName() );
  +                     return true;
  +             }
  +             if( cat.isDebugEnabled() )
  +                     cat.debug( "Reject file '"+file.getName()+"' because of 
timestamp of " + xdocletJar.getName() );
   
                if( cat.isDebugEnabled() )
                        cat.debug( "Generation need check for " + file.getName() );
   
                // 2. Check the timestamp of template file and merge files
  -             if( isGenerationNeeded( file, getTemplateURL() ) )
  +             if( isGenerationNeeded( file, subTask.getTemplateURL() ) )
                        return true;
   
                if( cat.isDebugEnabled() )
  @@ -227,69 +233,95 @@
        private boolean isGenerationNeeded( File file, URL templateURL )
                 throws XDocletException
        {
  -             Category cat = Log.getCategory( TemplateSubTask.class, "generation" );
  +             Category cat = Log.getCategory( GenerationManager.class, "generation" 
);
   
                if( cat.isDebugEnabled() )
                        cat.debug( "Generation need check for " + file.getName() );
   
                // 1. Check Timestamp of Template file
  -             //if( cat.isDebugEnabled() )
  -                     cat.error( file.getName() + " " + getTemplateURL() );
  -             if( file.lastModified() < new File( getTemplateURL().getFile() 
).lastModified() )
  +             if( cat.isDebugEnabled() )
  +                     cat.debug( file.getName() + " " + subTask.getTemplateURL() );
  +             if( file.lastModified() < new File( subTask.getTemplateURL().getFile() 
).lastModified() )
                {
                        if( cat.isDebugEnabled() )
  -                             cat.debug( "Generation needed for '" + file.getName() 
+ "' because of timestamp of " + getTemplateURL() );
  +                             cat.debug( "Generation needed for '" + file.getName() 
+ "' because of timestamp of " + subTask.getTemplateURL() );
                        return true;
                }
                if( cat.isDebugEnabled() )
  -                     cat.debug( "Reject file '"+file.getName()+ "' because of 
timestamp of " + getTemplateURL() );
  +                     cat.debug( "Reject file '"+file.getName()+ "' because of 
timestamp of " + subTask.getTemplateURL() );
   
                // 2. Check timestamp of Merge files found inside Template
  -        File[] files;
  -        if (getParserDb() == null || getParserDb().get(templateURL) == null)
  +        String[] files;
  +        if (getParserDb().get(new File(templateURL.getFile()).getName()) == null)
           {
  -            getParser().setOutput( file );
  -            getParser().setTemplateURL( templateURL );
  +            if (cat.isDebugEnabled()) cat.debug("Not Found "+templateURL+ " Parse 
needed");
  +            subTask.getParser().setOutput( file );
  +            subTask.getParser().setTemplateURL( templateURL );
   
               try
               {
  -                getParser().start();
  +                subTask.getParser().start();
               }
               catch( TemplateException e )
               {
                   throw new XDocletException( e.toString() );
               }
   
  -            files = getParser().getMergeFiles();
  +            files = subTask.getParser().getMergeFiles();
               updateParserDb(templateURL, files);
           }
           else
           {
  -            files = (File[])getParserDb().get(templateURL);
  +            files = (String[])getParserDb().get(new 
File(templateURL.getFile()).getName());
  +            for (int i = 0; i < files.length; i++) {
  +                if (cat.isDebugEnabled())
  +                    cat.debug(templateURL.getFile() + " : " + files[i]);
  +            }
           }
   
                if( cat.isDebugEnabled() )
                        cat.debug( "Number of Merge files involved = " + files.length 
);
                for( int i = 0; i < files.length; i++ )
                {
  -                     if( files[i].exists() )
  +            String merge_file_pattern = files[i];
  +            List merge_files = new ArrayList();
  +            if( merge_file_pattern.indexOf( "{0}" ) != -1 )
  +                     {
  +                XClass[] classes = ClassTagsHandler.getAllClasses();
  +                for (int j = 0; j < classes.length; j++) {
  +                    XClass aClass = classes[j];
  +                    String ejb_name = MessageFormat.format( merge_file_pattern, new 
Object[]{AbstractProgramElementTagsHandler.getClassNameFor( aClass )} );
  +                    String merge_file_name = 
PackageTagsHandler.packageNameAsPathFor( aClass.containingPackage() ) + File.separator 
+ ejb_name;
  +                    merge_files.add( new File( subTask.getMergeDir(), 
merge_file_name ) );
  +                }
  +            }
  +            else
                        {
  -                             if( file.lastModified() < files[i].lastModified() )
  +                merge_files.add( new File( subTask.getMergeDir(), 
merge_file_pattern ));
  +            }
  +            for (Iterator iterator = merge_files.iterator(); iterator.hasNext();) {
  +                File merge_file = (File) iterator.next();
  +                if( cat.isDebugEnabled() )
  +                    cat.debug( "Generation check for '" + file.getName() + "' 
because of " + merge_file.getName() );
  +                if( merge_file.exists() )
  +                {
  +                    if( file.lastModified() < merge_file.lastModified() )
                                {
                                        if( cat.isDebugEnabled() )
  -                                             cat.debug( "Generation needed for '" + 
file.getName() + "' because of timestamp of " + files[i].getName() );
  +                            cat.debug( "Generation needed for '" + file.getName() + 
"' because of timestamp of " + merge_file.getName() );
                                        return true;
                                }
                                if( cat.isDebugEnabled() )
  -                                     cat.debug( "Reject file '"+file.getName()+"' 
because of timestamp of " + files[i].getName() );
  +                        cat.debug( "Reject file '"+file.getName()+"' because of 
timestamp of " + merge_file.getName() );
  +                }
                        }
                }
                return false;
        }
   
  -     private static File getXdocletJar()
  +     private static final File getXdocletJar()
        {
  -             String path_str = 
TemplateSubTask.class.getProtectionDomain().getCodeSource().getLocation().getFile().toString();
  +             String path_str = 
GenerationManager.class.getProtectionDomain().getCodeSource().getLocation().getFile().toString();
   
                if( path_str != null && path_str.startsWith( "/" ) )
                {
  @@ -298,7 +330,7 @@
                return new File( path_str );
        }
   
  -    private static File getXjavadocJar()
  +    private static final File getXjavadocJar()
        {
                String path_str = 
XClass.class.getProtectionDomain().getCodeSource().getLocation().getFile().toString();
   
  @@ -309,15 +341,89 @@
                return new File( path_str );
        }
   
  -    private final Map parserDb = new HashMap();
  -    private Map getParserDb(){
  +    /**
  +     * Return (and construct) the template database.  It is a map between a
  +     * <code>String</code> representing the template file and an array of <String>
  +     * representing the merge files that are part of the generation.
  +     *
  +     * @return the <code>Map</code>
  +     */
  +    private static Map getParserDb(){
  +        Category cat = Log.getCategory(GenerationManager.class,"parserdb");
  +        if (parserDb == null)
  +        {
  +            parserDb = new HashMap();
  +            try{
  +                FileInputStream fis = new FileInputStream(TEMPLATE_FILES_DB);
  +                Properties fileParserDb = new Properties();
  +                fileParserDb.load(fis);
  +                for (Iterator iterator = fileParserDb.keySet().iterator(); 
iterator.hasNext();) {
  +                    String urlStr = (String)iterator.next();
  +                    String filesStr = fileParserDb.getProperty(urlStr);
  +                    StringTokenizer st = new StringTokenizer(filesStr,",");
  +                    List filesList = new ArrayList();
  +                    while (st.hasMoreTokens()){
  +                        String tok = st.nextToken();
  +                        filesList.add(tok);
  +                        if (cat.isDebugEnabled()) cat.debug("Found "+urlStr+" : 
"+tok);
  +                    }
  +                    parserDb.put(urlStr,(String[])filesList.toArray(new 
String[filesList.size()]));
  +                }
  +            } catch (IOException e){
  +                // Db not found, not a problem, let's take the tme to build it
  +                if (cat.isDebugEnabled()) cat.debug("DB file not found",e);
  +            }
  +        }
           return parserDb;
       }
   
  -    private void updateParserDb(URL templateURL,File[] files){
  -        //if (parserDb == null)
  -//            parserDb = new HashMap();
  -        parserDb.put(templateURL, files);
  +    /**
  +     * During parsing we build the Template database.  We store it on file.
  +     *
  +     * @param templateURL the template file
  +     * @param files the merge files involved in the generation
  +     */
  +    public static void updateParserDb(URL templateURL,String[] files)
  +    throws XDocletException{
  +        // Merge existing list with new list
  +        String[] mergeFiles = (String[])getParserDb().get(new 
File(templateURL.getFile()).getName());
  +        List complete = Arrays.asList(files);
  +        if (mergeFiles != null)
  +        {
  +            for (int j = 0; j < mergeFiles.length; j++) {
  +                String file = mergeFiles[j];
  +                if ( ! complete.contains(file))
  +                    complete.add(file);
  +            }
  +        }
  +        getParserDb().put(new File(templateURL.getFile()).getName(), 
complete.toArray(new String[complete.size()]));
  +        flushParserDb();
  +    }
  +
  +    /**
  +     * Flush the database to disk.
  +     */
  +    private static void flushParserDb()
  +    throws XDocletException
  +    {
  +        try
  +        {
  +            Properties fileParserDb = new Properties();
  +            for (Iterator iterator = parserDb.keySet().iterator(); 
iterator.hasNext();) {
  +                String o = (String) iterator.next();
  +                String[] files = (String[])parserDb.get(o);
  +                StringBuffer filesList = new StringBuffer();
  +                for (int i = 0; i < files.length; i++) {
  +                    String file = files[i];
  +                    filesList.append(file).append(",");
  +                }
  +                fileParserDb.setProperty(o,filesList.toString());
  +            }
  +            FileOutputStream fos = new FileOutputStream(TEMPLATE_FILES_DB);
  +            fileParserDb.store(fos,"This file caches the list of merge files 
involved in the generation of a specific template.\n#It can safely be removed at any 
time to force a refresh.");
  +        }catch (IOException e){
  +            throw new XDocletException(e,"IO Exception");
  +        }
       }
   
   }
  
  
  
  1.35      +6 -3      xdoclet/core/src/xdoclet/TemplateSubTask.java
  
  Index: TemplateSubTask.java
  ===================================================================
  RCS file: /cvsroot/xdoclet/xdoclet/core/src/xdoclet/TemplateSubTask.java,v
  retrieving revision 1.34
  retrieving revision 1.35
  diff -u -w -r1.34 -r1.35
  --- TemplateSubTask.java      30 Mar 2002 11:17:36 -0000      1.34
  +++ TemplateSubTask.java      1 Apr 2002 09:30:47 -0000       1.35
  @@ -29,7 +29,7 @@
    *
    * @author    Ara Abrahamian ([EMAIL PROTECTED])
    * @created   Sep 25, 2001
  - * @version   $Revision: 1.34 $
  + * @version   $Revision: 1.35 $
    */
   public class TemplateSubTask extends SubTask
   {
  @@ -407,7 +407,7 @@
   
                        try
                        {
  -                setGenerationManager(new GenerationManager(getTemplateURL() , 
getParser(), getDestDir(), getContext().isForce()));
  +                setGenerationManager(new GenerationManager(this));
                                if( generationManager.isGenerationNeeded( output_file 
) )
                                {
                                        startEngine( getTemplateURL(), output_file );
  @@ -424,6 +424,9 @@
                                        throw new XDocletException( e, 
Translator.getString( "running_failed" ) );
                                }
                        }
  +
  +            GenerationManager.updateParserDb(getTemplateURL(), 
getParser().getMergeFiles());
  +
                }
        }
   
  @@ -496,7 +499,7 @@
                                cat.debug( "File exists." );
   
                        // Check modification timestamps
  -            setGenerationManager(new GenerationManager(getTemplateURL() , 
getParser(), getDestDir(), getContext().isForce()));
  +            setGenerationManager(new GenerationManager(this));
                        if( ! generationManager.isGenerationNeeded( clazz, file, true 
) )
                                return;
                }
  
  
  

_______________________________________________
Xdoclet-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/xdoclet-devel

Reply via email to