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