Author: tchemit Date: 2010-05-16 14:19:55 +0200 (Sun, 16 May 2010) New Revision: 906 Url: http://nuiton.org/repositories/revision/eugene/906 Log: - Anomalie #613: Files are generated even if they are up to date - Evolution #614: Improve template configuration design - Evolution #615: Improve plugin console messages Added: trunk/eugene/src/main/java/org/nuiton/eugene/writer/WriterReport.java Modified: trunk/ant-eugene-task/src/main/java/org/nuiton/eugene/GeneratorTask.java trunk/eugene/src/main/java/org/nuiton/eugene/AbstractGenerator.java trunk/eugene/src/main/java/org/nuiton/eugene/AbstractMetaTransformer.java trunk/eugene/src/main/java/org/nuiton/eugene/DefaultTemplateConfiguration.java trunk/eugene/src/main/java/org/nuiton/eugene/ModelReader.java trunk/eugene/src/main/java/org/nuiton/eugene/Template.java trunk/eugene/src/main/java/org/nuiton/eugene/TemplateConfiguration.java trunk/eugene/src/main/java/org/nuiton/eugene/Transformer.java trunk/eugene/src/main/java/org/nuiton/eugene/java/JavaGenerator.java trunk/eugene/src/main/java/org/nuiton/eugene/models/object/ObjectModelGenerator.java trunk/eugene/src/main/java/org/nuiton/eugene/models/object/ObjectModelReader.java trunk/eugene/src/main/java/org/nuiton/eugene/writer/AbstractChainedFileWriter.java trunk/eugene/src/main/java/org/nuiton/eugene/writer/ChainedFileWriter.java trunk/eugene/src/main/java/org/nuiton/eugene/writer/ChainedFileWriterConfiguration.java trunk/eugene/src/test/java/org/nuiton/eugene/GeneratorUtilTest.java trunk/eugene/src/test/java/org/nuiton/eugene/models/object/ObjectModelGeneratorTest.java trunk/eugene/src/test/java/org/nuiton/eugene/models/object/XMI12ToObjectModelTest.java trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/EugenePlugin.java trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/SmartGenerateMojo.java trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/BaseChainedFileWriter.java trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/ModelChainedFileWriter.java trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/XmiChainedFileWriter.java trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/ZargoChainedFileWriter.java Modified: trunk/ant-eugene-task/src/main/java/org/nuiton/eugene/GeneratorTask.java =================================================================== --- trunk/ant-eugene-task/src/main/java/org/nuiton/eugene/GeneratorTask.java 2010-05-14 13:44:45 UTC (rev 905) +++ trunk/ant-eugene-task/src/main/java/org/nuiton/eugene/GeneratorTask.java 2010-05-16 12:19:55 UTC (rev 906) @@ -274,10 +274,12 @@ for (int i = 0; i < templateGenerators.length; i++) { String templateName = templateGenerators[i].trim(); try { - generators[i] = (Template<Model>)Class.forName(templateName).newInstance(); - properties.setProperty(Template.PROP_OVERWRITE, String.valueOf(overwrite)); + Template<Model> template = (Template<Model>) + Class.forName(templateName).newInstance(); + generators[i] = template; + properties.put(Template.PROP_OVERWRITE, overwrite); properties.setProperty(Template.PROP_ENCODING, encoding); - generators[i].setProperties(properties); + template.getConfiguration().getProperties().putAll(properties); } catch (ClassCastException e) { log("Generator don't inherit Template Class", e, Project.MSG_ERR); @@ -329,7 +331,7 @@ * @param destDir destination directory * @param generators generators to apply * @throws BuildException if can't generate - * @throws IOException + * @throws BuildException if io errors while generation */ protected void doExecute(List<File> srcFiles, File destDir, Template<Model>[] generators) throws BuildException { Modified: trunk/eugene/src/main/java/org/nuiton/eugene/AbstractGenerator.java =================================================================== --- trunk/eugene/src/main/java/org/nuiton/eugene/AbstractGenerator.java 2010-05-14 13:44:45 UTC (rev 905) +++ trunk/eugene/src/main/java/org/nuiton/eugene/AbstractGenerator.java 2010-05-16 12:19:55 UTC (rev 906) @@ -28,12 +28,14 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.eugene.models.Model; +import org.nuiton.eugene.writer.WriterReport; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; +import java.util.List; /** * AbstractGenerator @@ -76,12 +78,6 @@ return super.getEncoding(); } - /** - * Permet de recuperer la proprieté passé en argument - * - * @param name le nom de la propriete - * @return la valeur de la propriété - */ @Override public String getProperty(String name) { if (parent != null) { @@ -98,6 +94,14 @@ return super.getLastModifiedSource(); } + @Override + public <V> V getProperty(String key, Class<V> type) { + if (parent != null) { + return parent.getConfiguration().getProperty(key, type); + } + return getConfiguration().getProperty(key, type); + } + /** * @param file fichier a tester * @return vrai si le fichier passé en parametre est plus recent que @@ -131,14 +135,15 @@ return parent.canGeneratePackage(packageName); } // if not generation restriction, generate everything - if (getGeneratedPackages() != null && - !getGeneratedPackages().isEmpty()) { + List<String> generatedPackages = getGeneratedPackages(); + + if (generatedPackages != null && !generatedPackages.isEmpty()) { canGenerate = false; // on doit donc tester que le package courant // soit est egal a un des element de la liste // soit commence par ca - for (String generatedPackage : getGeneratedPackages()) { + for (String generatedPackage : generatedPackages) { // cas egalité parfaites if (packageName != null && @@ -182,6 +187,12 @@ } } + WriterReport writerReport = getWriterReport(); + + if (writerReport != null) { + writerReport.addFile(getClass().getName(), outputFile, false); + } + Writer output = getWriter(outputFile); try { if (log.isDebugEnabled()) { @@ -201,7 +212,7 @@ } protected Writer getWriter(File outputFile) throws IOException { - + FileOutputStream stream = new FileOutputStream(outputFile); Writer output; String encoding = getEncoding(); Modified: trunk/eugene/src/main/java/org/nuiton/eugene/AbstractMetaTransformer.java =================================================================== --- trunk/eugene/src/main/java/org/nuiton/eugene/AbstractMetaTransformer.java 2010-05-14 13:44:45 UTC (rev 905) +++ trunk/eugene/src/main/java/org/nuiton/eugene/AbstractMetaTransformer.java 2010-05-16 12:19:55 UTC (rev 906) @@ -90,7 +90,9 @@ Template<M> generator; if (getExcludeTemplates().contains(generatorClass.getName())) { // exclude generator - log.info("exclude generator " + generatorClass); + if (log.isInfoEnabled()) { + log.info("exclude generator " + generatorClass); + } continue; } try { @@ -98,12 +100,14 @@ // init template + generator.setConfiguration(getConfiguration()); + if (generator instanceof AbstractGenerator) { ((AbstractGenerator<M>) generator).setParent(this); } - if (generator instanceof Transformer) { - generator.setProperties(properties); - } +// if (generator instanceof Transformer) { +// generator.setProperties(properties); +// } // will use it result.add(generator); Modified: trunk/eugene/src/main/java/org/nuiton/eugene/DefaultTemplateConfiguration.java =================================================================== --- trunk/eugene/src/main/java/org/nuiton/eugene/DefaultTemplateConfiguration.java 2010-05-14 13:44:45 UTC (rev 905) +++ trunk/eugene/src/main/java/org/nuiton/eugene/DefaultTemplateConfiguration.java 2010-05-16 12:19:55 UTC (rev 906) @@ -24,6 +24,10 @@ */ package org.nuiton.eugene; +import org.nuiton.eugene.writer.WriterReport; + +import java.util.Properties; + /** * Default template configuration * @@ -32,31 +36,124 @@ */ public class DefaultTemplateConfiguration implements TemplateConfiguration { - protected boolean overwrite = true; + public static final String DEFAULT_ENCONDING = "UTF-8"; - protected boolean verbose; + protected Properties properties; - protected String encoding = "UTF-8"; + public DefaultTemplateConfiguration() { + } - protected ClassLoader loader = getClass().getClassLoader(); + public DefaultTemplateConfiguration(Properties properties) { + this.properties = new Properties(); + this.properties.putAll(properties); + } @Override public boolean isOverwrite() { - return overwrite; + Boolean value = getProperty(PROP_OVERWRITE, Boolean.class); + if (value == null) { + value = true; + setProperty(PROP_OVERWRITE, value); + } + return value; } @Override public boolean isVerbose() { - return verbose; + Boolean value = getProperty(PROP_VERBOSE, Boolean.class); + if (value == null) { + value = false; + setProperty(PROP_VERBOSE, value); + } + return value; } @Override public String getEncoding() { - return encoding; + String value = getProperty(PROP_ENCODING, String.class); + if (value == null) { + value = DEFAULT_ENCONDING; + setProperty(PROP_ENCODING, value); + } + return value; } @Override public ClassLoader getClassLoader() { - return loader; + ClassLoader value = getProperty(PROP_CLASS_LOADER, ClassLoader.class); + if (value == null) { + value = getClass().getClassLoader(); + setProperty(PROP_CLASS_LOADER, value); + } + return value; } + + @Override + public WriterReport getWriterReport() { + WriterReport report = + getProperty(PROP_WRITER_REPORT, WriterReport.class); + return report; + } + + @Override + public long getLastModifiedSource() { + Long value = getProperty(PROP_LAST_MODIFIED_SOURCE, Long.class); + if (value == null) { + value = 0l; + setProperty(PROP_LAST_MODIFIED_SOURCE, value); + } + return value; + } + + @Override + public Properties getProperties() { + if (properties == null) { + properties = new Properties(); + } + return properties; + } + + @Override + public String getProperty(String key) { + return getProperty(key, String.class); + } + + @Override + public <V> V getProperty(String key, Class<V> type) { + Object o = getProperties().get(key); + if (o != null && !type.isAssignableFrom(type)) { + throw new IllegalArgumentException("property [" + key + "] is not of type " + type.getName() + ", but : " + o.getClass().getName()); + } + return (V) o; + } + + @Override + public void setProperty(String key, Object value) { + getProperties().put(key, value); + } + + public void setOverwrite(boolean overwrite) { + setProperty(PROP_OVERWRITE, overwrite); + } + + public void setVerbose(boolean verbose) { + setProperty(PROP_VERBOSE, verbose); + } + + public void setEncoding(String encoding) { + setProperty(PROP_ENCODING, encoding); + } + + public void setLoader(ClassLoader loader) { + setProperty(PROP_CLASS_LOADER, loader); + } + + public void setLastModifiedSource(long lastModifiedSource) { + setProperty(PROP_LAST_MODIFIED_SOURCE, lastModifiedSource); + } + + public void setProperties(Properties properties) { + this.properties = properties; + } + } Modified: trunk/eugene/src/main/java/org/nuiton/eugene/ModelReader.java =================================================================== --- trunk/eugene/src/main/java/org/nuiton/eugene/ModelReader.java 2010-05-14 13:44:45 UTC (rev 905) +++ trunk/eugene/src/main/java/org/nuiton/eugene/ModelReader.java 2010-05-16 12:19:55 UTC (rev 906) @@ -32,8 +32,8 @@ import java.io.File; /** - * FileReader TODO real doc :) - * + * ModelReader TODO real doc :) + * <p/> * Created: 26 oct. 2009 * * @author fdesbois <fdesbois@codelutin.com> @@ -45,30 +45,35 @@ private static final Log log = LogFactory.getLog(ModelReader.class); /** date de derniere modification de la source la plus recente */ - protected long lastModifiedSource = 0; + protected long lastModifiedSource; protected void setLastModifiedSource(File... files) { for (File file : files) { if (file.lastModified() > getLastModifiedSource()) { lastModifiedSource = file.lastModified(); - log.debug("source date: " + lastModifiedSource - + " files[i] date: " + file.lastModified() + "(" + file - + ")"); + + if (log.isDebugEnabled()) { + log.debug("source date: " + lastModifiedSource + + " files[i] date: " + file.lastModified() + + "(" + file + ")"); + } } } } + /** + * @return the last modified file source (says the newer incoming file) + */ public long getLastModifiedSource() { return lastModifiedSource; } - //TODO-TC : il vaut mieux directement un type dit variable - // example : public abstract M read(File... file) {} - -// public M read(File file) { -// return read(new File[] { file }); -// } - + /** + * Read files to produce a memory model. + * + * @param file files to read + * @return the new model builded from files + */ public abstract M read(File... file); } Modified: trunk/eugene/src/main/java/org/nuiton/eugene/Template.java =================================================================== --- trunk/eugene/src/main/java/org/nuiton/eugene/Template.java 2010-05-14 13:44:45 UTC (rev 905) +++ trunk/eugene/src/main/java/org/nuiton/eugene/Template.java 2010-05-16 12:19:55 UTC (rev 906) @@ -27,6 +27,7 @@ import org.apache.commons.lang.StringUtils; import org.nuiton.eugene.models.Model; +import org.nuiton.eugene.writer.WriterReport; import java.io.File; import java.io.IOException; @@ -37,32 +38,21 @@ /** * Generator. TODO javadoc - * + * <p/> * Created: 5 août 2004 * - * @param <M> Model associated to the generator (input model) - * * @author Cedric Pineau <pineau@codelutin.com> + * @param <M> Model associated to the generator (input model) */ public abstract class Template<M extends Model> implements TemplateConfiguration { - public static final String PROP_OVERWRITE = "overwrite"; - public static final String PROP_ENCODING = "encoding"; - - public static final String PROP_DEFAULT_PACKAGE = "defaultPackage"; - public static final String PROP_LAST_MODIFIED_SOURCE = "lastModifiedSource"; - public static final String PROP_GENERATED_PACKAGES = "generatedPackages"; - public static final String PROP_EXCLUDE_TEMPLATES = "excludeTemplates"; - protected TemplateConfiguration configuration; - - protected Properties properties = new Properties(); protected List<String> excludeTemplates; - /** + /** * List of package to allow generation. - * + * <p/> * If {@code null} or empty, generate all packages. */ protected List<String> generatedPackages; @@ -70,17 +60,8 @@ /** Model */ protected M model; -// /** -// * Old method from EUGene 1.0.1 used to generate files. Now, you have to -// * use a Reader instead of directly use a Template. -// * -// * @param file list of tiles -// * @param destDir destination folder -// * @deprecated since 2.0.0 -// */ -// @Deprecated -// public abstract void generate(File[] file, File destDir); + public abstract void applyTemplate(M model, File destDir) throws IOException; public TemplateConfiguration getConfiguration() { @@ -95,7 +76,6 @@ } /** - * * @return {@code true} if must overwrite ouput * @deprecated since 2.0.2, prefer use the {@link #isOverwrite()} method */ @@ -108,8 +88,9 @@ public boolean isOverwrite() { return getConfiguration().isOverwrite(); } + @Override - public boolean isVerbose() { + public boolean isVerbose() { return getConfiguration().isVerbose(); } @@ -123,43 +104,51 @@ return getConfiguration().getClassLoader(); } - /** - * @param encoding encoding value - * @deprecated since 2.0.0, use a Properties object to add the - * {@link Template#PROP_ENCODING} value - * @see Template#setProperties(Properties) - */ - @Deprecated - public void setEncoding(String encoding) { - //this.encoding = encoding; - properties.setProperty(PROP_ENCODING, encoding); + @Override + public long getLastModifiedSource() { + return getConfiguration().getLastModifiedSource(); } - public void setProperties(Properties p) { - properties = p; + @Override + public Properties getProperties() { + return getConfiguration().getProperties(); } + @Override + public <V> V getProperty(String key, Class<V> type) { + return getConfiguration().getProperty(key, type); + } + + public String getProperty(String key) { + return getConfiguration().getProperty(key); + } + + @Override + public WriterReport getWriterReport() { + return getConfiguration().getWriterReport(); + } + + @Override + public void setProperty(String key, Object value) { + getConfiguration().setProperty(key, value); + if (PROP_GENERATED_PACKAGES.equals(key)) { + // reset cache value + generatedPackages = null; + } else if (PROP_EXCLUDE_TEMPLATES.equals(key)) { + // reset cache value + excludeTemplates = null; + } + } + /** - * Permet de recuperer la proprieté passé en argument + * Set the properties configuration. * - * @param name le nom de la propriete - * @return la valeur de la propriété + * @param p the configuration + * @deprecated since 2.0.2, prefer use the {@link TemplateConfiguration} api. */ - public String getProperty(String name) { - return properties.getProperty(name); - } - - /** - * Set list of package to allow generation. - * - * If {@code null} or empty, generate all packages. - * - * @param generatedPackages list of package to generate - * @deprecated - */ @Deprecated - public void setGeneratedPackages(List<String> generatedPackages) { - this.generatedPackages = generatedPackages; + public void setProperties(Properties p) { + getConfiguration().getProperties().putAll(p); } protected List<String> getGeneratedPackages() { @@ -170,27 +159,10 @@ //TC-20091125 avoid manual array copy generatedPackages.addAll(Arrays.asList(genPackages.split(","))); } - } + } return generatedPackages; } - /** - * @param lastModifiedSource lastModifiedSource value - * @deprecated since 2.0.0, use a Properties object to add the - * {@link Template#PROP_LAST_MODIFIED_SOURCE} value - * @see Template#setProperties(Properties) - */ - @Deprecated - public void setLastModifiedSource(long lastModifiedSource) { - properties.setProperty(PROP_LAST_MODIFIED_SOURCE, - String.valueOf(lastModifiedSource)); - } - - public long getLastModifiedSource() { - return Long.parseLong( - properties.getProperty(PROP_LAST_MODIFIED_SOURCE, "0")); - } - public List<String> getExcludeTemplates() { if (excludeTemplates == null) { excludeTemplates = new ArrayList<String>(); @@ -203,11 +175,6 @@ return excludeTemplates; } - @Deprecated - public void setExcludeTemplates(List<String> excludeTemplates) { - this.excludeTemplates = excludeTemplates; - } - public M getModel() { return model; } Modified: trunk/eugene/src/main/java/org/nuiton/eugene/TemplateConfiguration.java =================================================================== --- trunk/eugene/src/main/java/org/nuiton/eugene/TemplateConfiguration.java 2010-05-14 13:44:45 UTC (rev 905) +++ trunk/eugene/src/main/java/org/nuiton/eugene/TemplateConfiguration.java 2010-05-16 12:19:55 UTC (rev 906) @@ -24,6 +24,10 @@ */ package org.nuiton.eugene; +import org.nuiton.eugene.writer.WriterReport; + +import java.util.Properties; + /** * Contract of a {@link Template} configuration * @@ -32,6 +36,24 @@ */ public interface TemplateConfiguration { + String PROP_OVERWRITE = "overwrite"; + + String PROP_VERBOSE = "verbose"; + + String PROP_ENCODING = "encoding"; + + String PROP_CLASS_LOADER = "classLoader"; + + String PROP_DEFAULT_PACKAGE = "defaultPackage"; + + String PROP_LAST_MODIFIED_SOURCE = "lastModifiedSource"; + + String PROP_GENERATED_PACKAGES = "generatedPackages"; + + String PROP_EXCLUDE_TEMPLATES = "excludeTemplates"; + + String PROP_WRITER_REPORT = "writerReport"; + /** * @return {@code true} if must regenerate files even if they are up to * date @@ -47,4 +69,17 @@ /** @return the classloader to use to seek for resources */ ClassLoader getClassLoader(); + WriterReport getWriterReport(); + + long getLastModifiedSource(); + + Properties getProperties(); + + String getProperty(String key); + + <V> V getProperty(String key, Class<V> type); + + void setProperty(String key, Object value); + + } Modified: trunk/eugene/src/main/java/org/nuiton/eugene/Transformer.java =================================================================== --- trunk/eugene/src/main/java/org/nuiton/eugene/Transformer.java 2010-05-14 13:44:45 UTC (rev 905) +++ trunk/eugene/src/main/java/org/nuiton/eugene/Transformer.java 2010-05-16 12:19:55 UTC (rev 906) @@ -82,7 +82,20 @@ this.model = model; previousTransformer = initPreviousTransformer(); outputTemplate = initOutputTemplate(); - outputTemplate.setProperties(getOutputProperties()); + + // build output template configuration + // merge input configuration + output properties + Properties properties = getConfiguration().getProperties(); + properties.putAll(getOutputProperties()); + + TemplateConfiguration outconfig = + new DefaultTemplateConfiguration(properties); + + // push back to outputPropertie the all configuration + //FIXME tchemit 20100516 Should rethink this... + outputProperties = properties; + + outputTemplate.setConfiguration(outconfig); outputModel = initOutputModel(); } Modified: trunk/eugene/src/main/java/org/nuiton/eugene/java/JavaGenerator.java =================================================================== --- trunk/eugene/src/main/java/org/nuiton/eugene/java/JavaGenerator.java 2010-05-14 13:44:45 UTC (rev 905) +++ trunk/eugene/src/main/java/org/nuiton/eugene/java/JavaGenerator.java 2010-05-16 12:19:55 UTC (rev 906) @@ -102,8 +102,8 @@ public void generateFromClass(Writer output, ObjectModelClass input) throws IOException { - if (log.isDebugEnabled()) { - log.debug("Will generate class "+ input.getQualifiedName()); + if (isVerbose()) { + log.info("Will generate class "+ input.getQualifiedName()); } preparePrefix(input); @@ -170,8 +170,8 @@ public void generateFromInterface(Writer output, ObjectModelInterface input) throws IOException { - if (log.isDebugEnabled()) { - log.debug(input.getQualifiedName()); + if (isVerbose()) { + log.info("Will generate interface "+ input.getQualifiedName()); } preparePrefix(input); @@ -238,8 +238,8 @@ @Override public void generateFromEnum(Writer output, ObjectModelEnumeration input) throws IOException { - if (log.isDebugEnabled()) { - log.debug(input.getQualifiedName()); + if (isVerbose()) { + log.info("Will generate enumeration "+ input.getQualifiedName()); } preparePrefix(input); generateHeader(output, input); // Imports, package et documentation Modified: trunk/eugene/src/main/java/org/nuiton/eugene/models/object/ObjectModelGenerator.java =================================================================== --- trunk/eugene/src/main/java/org/nuiton/eugene/models/object/ObjectModelGenerator.java 2010-05-14 13:44:45 UTC (rev 905) +++ trunk/eugene/src/main/java/org/nuiton/eugene/models/object/ObjectModelGenerator.java 2010-05-16 12:19:55 UTC (rev 906) @@ -187,13 +187,13 @@ File outputFile = getDestinationFile(destDir, filename); if (!isOverwrite() && isNewerThanSource(outputFile)) { - if (log.isTraceEnabled()) { - log.trace("file " + outputFile + " is up-to-date"); + if (isVerbose()) { + log.info("Will not generate " + outputFile + " (up-to-date)."); } return; } - if (!outputFile.exists() && log.isTraceEnabled()) { - log.trace("not up-to-date " + outputFile.lastModified() + if (!outputFile.exists() && log.isDebugEnabled()) { + log.debug("not up-to-date " + outputFile.lastModified() + " <" + outputFile + ">"); } try { Modified: trunk/eugene/src/main/java/org/nuiton/eugene/models/object/ObjectModelReader.java =================================================================== --- trunk/eugene/src/main/java/org/nuiton/eugene/models/object/ObjectModelReader.java 2010-05-14 13:44:45 UTC (rev 905) +++ trunk/eugene/src/main/java/org/nuiton/eugene/models/object/ObjectModelReader.java 2010-05-16 12:19:55 UTC (rev 906) @@ -30,6 +30,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Enumeration; import java.util.List; import java.util.regex.Matcher; @@ -38,10 +39,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.eugene.ModelReader; -import org.nuiton.eugene.models.object.ObjectModel; -import org.nuiton.eugene.models.object.ObjectModelClass; -import org.nuiton.eugene.models.object.ObjectModelClassifier; -import org.nuiton.eugene.models.object.ObjectModelElement; import org.nuiton.eugene.models.object.xml.DigesterObjectModelRuleSet; import org.nuiton.eugene.models.object.xml.ObjectModelClassifierImpl; import org.nuiton.eugene.models.object.xml.ObjectModelElementImpl; @@ -65,7 +62,17 @@ public class ObjectModelReader extends ModelReader<ObjectModel> { private static final Log log = LogFactory.getLog(ObjectModelReader.class); - + + public static final String TAGVALUE = "tagvalue"; + + public static final String STEREOTYPE = "stereotype"; + + public static final String OPERATION = "operation"; + + public static final String ATTRIBUTE = "attribute"; + + public static final String CLASS = "class"; + /** * L'expression réguliere match les chaines de type * <package.ClassName>.<class|attribute|operation>.[name].<stereotype|tagvalue>.[tag] @@ -79,6 +86,7 @@ protected Pattern propertiesPattern = Pattern .compile("((?:[_a-zA-Z0-9]+\\.)+(?:_?[A-Z][_a-zA-Z0-9]*\\.)+)(?:(class|attribute|operation)\\.)(?:([_a-z0-9][_a-zA-Z0-9]*)\\.)?(?:(stereotype|tagvalue)\\.?)([_a-z0-9][_a-zA-Z0-9]*)?"); + public static final String MODEL = "model"; /** * @param files les noms des fichiers existant contenant du XML représentant @@ -89,6 +97,11 @@ @Override public ObjectModel read(File... files) { setLastModifiedSource(files); + if (log.isDebugEnabled()) { + log.debug("LastModifiedSource = " + getLastModifiedSource() + + " for files " + Arrays.toString(files)); + } + ObjectModel objectModel = new ObjectModelImpl(); // Digester parser configuration @@ -122,7 +135,12 @@ + " associé au model"); } try { - prop.load(new FileInputStream(propFile)); + FileInputStream inStream = new FileInputStream(propFile); + try { + prop.load(inStream); + } finally { + inStream.close(); + } } catch (IOException eee) { log.warn("Impossible de lire le fichier de propriete " + propFile, eee); @@ -133,9 +151,11 @@ String key = (String) e.nextElement(); String value = prop.getProperty(key); - if (key.startsWith("model")) { + if (key.startsWith(MODEL)) { if (!key.startsWith("model.tagvalue.")) { - log.warn("only tagvalue is allowed on model in properties"); + if (log.isWarnEnabled()) { + log.warn("only tagvalue is allowed on model in properties"); + } } else { String tag = key.substring("model.tagvalue." .length()); @@ -175,22 +195,27 @@ ObjectModelClassifier omc = objectModel .getClassifier(fqn); + if (omc == null) { + log.warn("Could not find classifier for " + fqn+" from tag value " + key); + continue; + } + if (omc instanceof ObjectModelClassifierImpl) { // on utilise une liste car il peut y avoir plusieur // operation avec le nom donné List<ObjectModelElement> elems = new ArrayList<ObjectModelElement>(); - if ("class".equals(target)) { + if (CLASS.equals(target)) { elems.add(omc); - } else if ("attribute".equals(target)) { + } else if (ATTRIBUTE.equals(target)) { ObjectModelClass classmodel = (ObjectModelClass) omc; elems.add(classmodel .getAttribute(targetName)); - } else if ("operation".equals(target)) { + } else if (OPERATION.equals(target)) { elems.addAll(omc.getOperations(targetName)); } for (Object elem1 : elems) { ObjectModelElementImpl elem = (ObjectModelElementImpl) elem1; - if ("stereotype".equals(type)) { + if (STEREOTYPE.equals(type)) { // pour les stereotypes ObjectModelImplRef stereotype = new ObjectModelImplRef(); stereotype.setName(value); @@ -198,7 +223,7 @@ continue; } - if ("tagvalue".equals(type)) { + if (TAGVALUE.equals(type)) { // pour les tagvalues ObjectModelImplTagValue tagvalue = new ObjectModelImplTagValue(); tagvalue.setName(tag); @@ -221,7 +246,7 @@ // TODO il faudra avoir des methodes d'acces en // Set sur l'interface pour eviter ce message if (log.isWarnEnabled()) { - log.warn("Can't add properties to model, it's not an ObjectModelClassifierImpl"); + log.warn("Can't add properties to model, it's not an ObjectModelClassifierImpl : " + omc.getQualifiedName()); } } } Modified: trunk/eugene/src/main/java/org/nuiton/eugene/writer/AbstractChainedFileWriter.java =================================================================== --- trunk/eugene/src/main/java/org/nuiton/eugene/writer/AbstractChainedFileWriter.java 2010-05-14 13:44:45 UTC (rev 905) +++ trunk/eugene/src/main/java/org/nuiton/eugene/writer/AbstractChainedFileWriter.java 2010-05-16 12:19:55 UTC (rev 906) @@ -27,10 +27,18 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.util.StringUtil; import java.io.File; import java.io.IOException; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; /** * Abstract implementation of the {@link ChainedFileWriter}. @@ -39,25 +47,33 @@ * @since 2.0.0 */ public abstract class AbstractChainedFileWriter implements ChainedFileWriter { + /** Logger */ private static final Log log = LogFactory.getLog(AbstractChainedFileWriter.class); + /** entries to treate with this writer */ protected List<ChainedFileWriterEntry> entries; + /** previous writer (can be null) */ protected ChainedFileWriter previousWriter; + /** next writer (can be null) */ protected ChainedFileWriter nextWriter; + /** * universe of authorized properties (keys are property names, values are * property descriptions). */ protected final Map<String, String> authorizedPropertyDescriptions; + /** * real properties obtained fro a configuration in {@link * #initWriter(ChainedFileWriterConfiguration)} method */ protected Map<String, Object> properties; + + private WriterReport writerReport; protected AbstractChainedFileWriter(String... propertyNameAndDescriptions) { if (propertyNameAndDescriptions.length % 2 != 0) { @@ -126,10 +142,9 @@ @Override public void generate(ChainedFileWriterConfiguration configuration) throws IOException { - if (log.isDebugEnabled()) { - log.debug("[" + getInputProtocol() + - "] Start generate with writer " + this); - } + + long t0 = System.nanoTime(); + initWriter(configuration); try { @@ -150,23 +165,53 @@ } } - for (ChainedFileWriterEntry e : entries) { - if (log.isDebugEnabled()) { - log.debug("[" + getInputProtocol() + - "] Will generate entry " + e.getInputDirectory() - + " : " + e.getIncludePattern()); - } - generate(configuration, - outputDir, - e.getInputDirectory(), - e.getIncludePattern() - ); - } + Map<File, List<String>> mergeEntries = mergeEntries(entries); + + generateEntries(configuration, outputDir, mergeEntries); + } finally { clear(); } } + protected Map<File, List<String>> mergeEntries(List<ChainedFileWriterEntry> entries) { + // merge entries if required + Map<File, List<String>> merge = new HashMap<File, List<String>>(); + for (ChainedFileWriterEntry e : entries) { + File input = e.getInputDirectory(); + List<String> includes = merge.get(input); + if (includes == null) { + includes = new ArrayList<String>(); + merge.put(input, includes); + } + includes.add(e.getIncludePattern()); + } + return merge; + } + + protected void generateEntries(ChainedFileWriterConfiguration configuration, + File outputDir, + Map<File, List<String>> entries) throws IOException { + + // apply from merge entries + for (Map.Entry<File, List<String>> e : entries.entrySet()) { + File input = e.getKey(); + List<String> includes = e.getValue(); + String includePattern = StringUtil.join(includes, ",", true); + if (log.isDebugEnabled()) { + log.debug("[" + getInputProtocol() + + "] Will generate entry " + input + + " : " + includePattern); + } + generate(configuration, + outputDir, + input, + includePattern + ); + } + } + + @Override public String getInputProtocol(String modelType) { // input protocol is the same for all model @@ -215,4 +260,14 @@ } } } + + @Override + public void setWriterReport(WriterReport writerReport) { + this.writerReport = writerReport; + } + + @Override + public WriterReport getWriterReport() { + return writerReport; + } } Modified: trunk/eugene/src/main/java/org/nuiton/eugene/writer/ChainedFileWriter.java =================================================================== --- trunk/eugene/src/main/java/org/nuiton/eugene/writer/ChainedFileWriter.java 2010-05-14 13:44:45 UTC (rev 905) +++ trunk/eugene/src/main/java/org/nuiton/eugene/writer/ChainedFileWriter.java 2010-05-16 12:19:55 UTC (rev 906) @@ -159,4 +159,11 @@ /** @return the list of all entries registered */ List<ChainedFileWriterEntry> getEntries(); + + + /** @return the writer report (to save generated file to later report) */ + WriterReport getWriterReport(); + + void setWriterReport(WriterReport writerReport); + } Modified: trunk/eugene/src/main/java/org/nuiton/eugene/writer/ChainedFileWriterConfiguration.java =================================================================== --- trunk/eugene/src/main/java/org/nuiton/eugene/writer/ChainedFileWriterConfiguration.java 2010-05-14 13:44:45 UTC (rev 905) +++ trunk/eugene/src/main/java/org/nuiton/eugene/writer/ChainedFileWriterConfiguration.java 2010-05-16 12:19:55 UTC (rev 906) @@ -27,7 +27,6 @@ import org.nuiton.eugene.ModelReader; import org.nuiton.eugene.Template; -import org.nuiton.eugene.TemplateConfiguration; import java.io.File; import java.util.Map; @@ -39,7 +38,7 @@ * @author tchemit <chemit@codelutin.com> * @since 2.0.0 */ -public interface ChainedFileWriterConfiguration extends TemplateConfiguration{ +public interface ChainedFileWriterConfiguration { /** @return the type of model used */ String getModelType(); Added: trunk/eugene/src/main/java/org/nuiton/eugene/writer/WriterReport.java =================================================================== --- trunk/eugene/src/main/java/org/nuiton/eugene/writer/WriterReport.java (rev 0) +++ trunk/eugene/src/main/java/org/nuiton/eugene/writer/WriterReport.java 2010-05-16 12:19:55 UTC (rev 906) @@ -0,0 +1,66 @@ +/* + * #%L + * EUGene :: EUGene + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2004 - 2010 CodeLutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/lgpl-3.0.html>. + * #L% + */ +package org.nuiton.eugene.writer; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +/** + * A class to save generated files in {@link ChainedFileWriter}. + * + * @author tchemit <chemit@codelutin.com> + * @since 2.0.2 + */ +public class WriterReport { + + protected Map<String, List<File>> datas; + + public Map<String, List<File>> getDatas() { + if (datas == null) { + datas = new TreeMap<String, List<File>>(); + } + return datas; + } + + public void addFile(String entry, File file, boolean verbose) { + List<File> files = getDatas().get(entry); + if (files == null) { + files = new ArrayList<File>(); + getDatas().put(entry, files); + } + files.add(file); + } + + public int getFilesCount() { + int tot = 0; + for (List<File> files : getDatas().values()) { + tot += files.size(); + } + return tot; + } +} Property changes on: trunk/eugene/src/main/java/org/nuiton/eugene/writer/WriterReport.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Modified: trunk/eugene/src/test/java/org/nuiton/eugene/GeneratorUtilTest.java =================================================================== --- trunk/eugene/src/test/java/org/nuiton/eugene/GeneratorUtilTest.java 2010-05-14 13:44:45 UTC (rev 905) +++ trunk/eugene/src/test/java/org/nuiton/eugene/GeneratorUtilTest.java 2010-05-16 12:19:55 UTC (rev 906) @@ -27,7 +27,6 @@ package org.nuiton.eugene; import java.util.Set; -import org.apache.commons.lang.time.DurationFormatUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.After; @@ -127,7 +126,7 @@ */ @Test public void testGetSimpleName() { - System.out.println("getSimpleName"); + log.info("getSimpleName"); String str = "List"; String expResult = "List"; Modified: trunk/eugene/src/test/java/org/nuiton/eugene/models/object/ObjectModelGeneratorTest.java =================================================================== --- trunk/eugene/src/test/java/org/nuiton/eugene/models/object/ObjectModelGeneratorTest.java 2010-05-14 13:44:45 UTC (rev 905) +++ trunk/eugene/src/test/java/org/nuiton/eugene/models/object/ObjectModelGeneratorTest.java 2010-05-16 12:19:55 UTC (rev 906) @@ -31,6 +31,7 @@ import junit.framework.Assert; import org.junit.Test; +import org.nuiton.eugene.Template; import org.nuiton.eugene.models.object.xml.ObjectModelClassImpl; import org.nuiton.eugene.models.object.xml.ObjectModelElementImpl; @@ -53,15 +54,17 @@ Assert.assertTrue(generator.canGenerateElement(new ObjectModelElementImpl())); Assert.assertTrue(generator.canGenerateElement(new ObjectModelClassImpl())); - List<String> generatedPackages = new ArrayList<String>(); - generatedPackages.add("org.nuiton.eugene"); +// List<String> generatedPackages = new ArrayList<String>(); +// generatedPackages.add("org.nuiton.eugene"); - generator.setGeneratedPackages(generatedPackages); - + generator.setProperty(Template.PROP_GENERATED_PACKAGES , "org.nuiton.eugene"); +// generator.setGeneratedPackages(generatedPackages); + // Still true Assert.assertTrue(generator.canGenerateElement(new ObjectModelElementImpl())); // become false - Assert.assertFalse(generator.canGenerateElement(new ObjectModelClassImpl())); + boolean b = generator.canGenerateElement(new ObjectModelClassImpl()); + Assert.assertFalse(b); ObjectModelClassImpl testClass = new ObjectModelClassImpl(); testClass.setPackage("org.nuiton.eugene"); Modified: trunk/eugene/src/test/java/org/nuiton/eugene/models/object/XMI12ToObjectModelTest.java =================================================================== --- trunk/eugene/src/test/java/org/nuiton/eugene/models/object/XMI12ToObjectModelTest.java 2010-05-14 13:44:45 UTC (rev 905) +++ trunk/eugene/src/test/java/org/nuiton/eugene/models/object/XMI12ToObjectModelTest.java 2010-05-16 12:19:55 UTC (rev 906) @@ -115,13 +115,10 @@ * Apply XSL stylesheet on a topcased model. * And make test on it. * - * @throws URISyntaxException - * @throws IOException - * @throws TransformerException + * @throws Exception */ @Test - public void testXSLIsis() throws URISyntaxException, IOException, - TransformerException { + public void testXSLIsis() throws Exception { File xmiFile = new File(Resource.getURL("xmi/1.2/isis-fish.xmi") .toURI()); @@ -139,13 +136,10 @@ * Apply XSL stylesheet on a topcased model. * And make test on it. * - * @throws URISyntaxException - * @throws IOException - * @throws TransformerException + * @throws Exception */ @Test - public void testXSLTopia() throws URISyntaxException, IOException, - TransformerException { + public void testXSLTopia() throws Exception { File xmiFile = new File(Resource.getURL("xmi/1.2/topiatest.xmi") .toURI()); @@ -183,13 +177,10 @@ * Apply XSL stylesheet on an Argouml model. * And make test on it. * - * @throws URISyntaxException - * @throws IOException - * @throws TransformerException + * @throws Exception */ @Test - public void testXSLDependency() throws URISyntaxException, IOException, - TransformerException { + public void testXSLDependency() throws Exception { File xmiFile = new File(Resource.getURL("xmi/1.2/dependency.xmi") .toURI()); @@ -217,13 +208,10 @@ * Apply XSL stylesheet on an Argouml model. * And make test on it. * - * @throws URISyntaxException - * @throws IOException - * @throws TransformerException + * @throws Exception */ @Test - public void testXSLEnumeration() throws URISyntaxException, IOException, - TransformerException { + public void testXSLEnumeration() throws Exception { File xmiFile = new File(Resource.getURL("xmi/1.2/enumeration.xmi") .toURI()); Modified: trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/EugenePlugin.java =================================================================== --- trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/EugenePlugin.java 2010-05-14 13:44:45 UTC (rev 905) +++ trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/EugenePlugin.java 2010-05-16 12:19:55 UTC (rev 906) @@ -31,6 +31,7 @@ import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.project.MavenProject; +import org.nuiton.eugene.DefaultTemplateConfiguration; import org.nuiton.eugene.ModelReader; import org.nuiton.eugene.Template; import org.nuiton.eugene.models.Model; @@ -311,7 +312,8 @@ Template<M> template = (Template<M>) Class.forName(templateName, true, fixedClassLoader).newInstance(); // configuration - template.setProperties(templateProperties); + template.setConfiguration(new DefaultTemplateConfiguration(templateProperties)); +// template.setProperties(templateProperties); templatesList.add(template); } catch (InstantiationException e) { throw new MojoFailureException("Can't instantiate generator : " Modified: trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/SmartGenerateMojo.java =================================================================== --- trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/SmartGenerateMojo.java 2010-05-14 13:44:45 UTC (rev 905) +++ trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/SmartGenerateMojo.java 2010-05-16 12:19:55 UTC (rev 906) @@ -31,9 +31,9 @@ import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.project.MavenProject; import org.apache.maven.settings.Settings; +import org.nuiton.eugene.DefaultTemplateConfiguration; import org.nuiton.eugene.ModelReader; import org.nuiton.eugene.Template; -import org.nuiton.eugene.TemplateConfiguration; import org.nuiton.eugene.models.Model; import org.nuiton.eugene.plugin.writer.BaseChainedFileWriter; import org.nuiton.eugene.plugin.writer.ModelChainedFileWriter; @@ -42,13 +42,21 @@ import org.nuiton.eugene.writer.ChainedFileWriterConfiguration; import org.nuiton.eugene.writer.ChainedFileWriterEntry; import org.nuiton.eugene.writer.ChainedWriterEngine; +import org.nuiton.eugene.writer.WriterReport; import org.nuiton.plugin.AbstractPlugin; +import org.nuiton.util.StringUtil; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; /** * Smart file generator. @@ -92,10 +100,10 @@ * <input>zargo:src/main/xmi:**\/*.zargo2</input> * </inputs> * </pre> - * + * <p/> * <b>Note:</b> If your using a single input, you can just write : * <pre> - * <inputs>zargo</inputs> + * <inputs>zargo</inputs> * </pre> * * @parameter expression="${eugene.inputs}" @@ -103,6 +111,7 @@ * @since 2.0.0 */ protected String[] inputs; + /** * List of input (protocol) not to treate separated by comma. * <p/> @@ -116,6 +125,7 @@ * @since 2.0.0 */ protected String skipInputs; + /** * Where to generate files. * @@ -124,6 +134,7 @@ * @since 2.0.0 */ protected File outputDirectory; + /** * Ecrase les fichiers générés. * @@ -131,6 +142,7 @@ * @since 2.0.0 */ protected boolean overwrite; + /** * Pour activer le mode verbeux. * @@ -138,6 +150,7 @@ * @since 2.0.0 */ protected boolean verbose; + /** * Encoding to be used for generation of files. * @@ -145,6 +158,7 @@ * @since 2.0.0 */ protected String encoding; + /** * A flag to mark the mojo to be used in a test phase. This will permits * to add generated sources in test compile roots. @@ -153,6 +167,7 @@ * @since 2.0.0 */ protected boolean testPhase; + /** * The type of model to be used. * <p/> @@ -163,6 +178,7 @@ * @since 2.0.0 */ protected String modelType; + /** * Properties to pass to writer. * @@ -170,6 +186,7 @@ * @since 2.0.0 */ protected Map<String, Object> properties; + /** * Ne génère rien, analyse juste la configuration. * @@ -177,6 +194,7 @@ * @since 2.0.0 */ protected boolean dryRun; + /** * Nom du paquetage pour les fichiers générés (xmi input sepcific). * @@ -184,6 +202,7 @@ * @since 2.0.0 */ protected String fullPackagePath; + /** * Nom du resolver a utiliser pour les transformations xmi vers model * (xmi input sepcific). @@ -192,14 +211,16 @@ * @since 2.0.0 */ protected String resolver; + /** * Templates à utiliser, séparés par des virgules pour les transformations - * depuis les models (model input sepcific). + * depuis les models (model input sepcific). * * @parameter expression="${eugene.templates}" * @since 0.50 */ protected String templates; + /** * Templates à ne pas utiliser lors de la transformations des models * (model input sepcific). @@ -208,6 +229,7 @@ * @since 0.63 */ protected String[] excludeTemplates; + /** * Nom par défaut du paquetage généré (model input sepcific). * @@ -215,6 +237,7 @@ * @since 0.50 */ protected String defaultPackage; + /** * List of packages to generate (comma separated). (model input sepcific). * <p/> @@ -224,6 +247,7 @@ * @since 1.0.0-rc-8 */ protected String generatedPackages; + /** * Maven project. * @@ -232,6 +256,7 @@ * @since 2.0.0 */ protected MavenProject project; + /** * Le settings (pour obtenir le mode offline). * @@ -248,40 +273,49 @@ * @component role="org.nuiton.eugene.models.Model" */ protected Map<String, Model> _models; + /** * All available writers introspects via plexus * * @component role="org.nuiton.eugene.writer.ChainedFileWriter" */ protected Map<String, ChainedFileWriter> writers; + /** * All available writers introspects via plexus * * @component role="org.nuiton.eugene.ModelReader" */ protected Map<String, ModelReader<?>> modelReaders; + /** * All available templates introspects via plexus * * @component role="org.nuiton.eugene.Template" */ protected Map<String, Template<?>> modelTemplates; + /** * The engine to compute {@link ChainedFileWriter} from inputs entries. * * @component role="org.nuiton.eugene.writer.ChainedWriterEngine" */ protected ChainedWriterEngine engine; - /** - * fixed classloader - */ + + /** fixed classloader */ protected ClassLoader fixedClassLoader; + private WriterReport writerReport; + @Override protected void init() throws Exception { + if (getLog().isDebugEnabled()) { + verbose = true; + } + modelType = modelType.trim().toLowerCase(); - + // Check model type is accepted // pouvoir associé un nom à un type de service). Model model = _models.get(modelType); @@ -313,12 +347,26 @@ // add log support ((BaseChainedFileWriter) writer).setLog(getLog()); } + writer.setWriterReport(new WriterReport() { + @Override + public void addFile(String entry, File file, boolean b) { + super.addFile(entry, file, b); + if (b || isVerbose()) { + getLog().info(String.format("[%1$s] Will generate %2$s", entry, file)); + } + if (getLog().isDebugEnabled()) { + getLog().debug(String.format("[%1$s] Will generate %2$s", entry, file)); + } + } + }); } // detect top level writers for (String include : inputs) { - getLog().info("Register include : " + include); + if (isVerbose()) { + getLog().info("Register include : " + include); + } engine.registerInclude(include); } @@ -351,6 +399,15 @@ properties.put(ModelChainedFileWriter.PROP_TEMPLATES, templates); properties.put(ModelChainedFileWriter.PROP_EXCLUDE_TEMPLATES, getExcludeTemplatesAsString()); + + DefaultTemplateConfiguration configuration = + new DefaultTemplateConfiguration(); + configuration.setEncoding(getEncoding()); + configuration.setLoader(getClassLoader()); + configuration.setOverwrite(isOverwrite()); + configuration.setVerbose(isVerbose()); + properties.put(ModelChainedFileWriter.PROP_TEMPLATE_CONFIGURATION, + configuration); } } @@ -392,6 +449,7 @@ "] as required in skipInputs configuration."); continue; } + long t0 = System.nanoTime(); int size = writer.getEntries().size(); if (size == 1) { getLog().info( @@ -416,6 +474,8 @@ } writer.generate(this); + String message = reportGeneratedFiles(writer, t0); + getLog().info(message); if ("model".equals(writer.getInputProtocol())) { @@ -435,9 +495,25 @@ } } + + public String reportGeneratedFiles(ChainedFileWriter writer, long t0) { + WriterReport writerReport = writer.getWriterReport(); + int nbFiles = writerReport.getFilesCount(); + + if (nbFiles == 0) { + return "No file generated."; + } + + long delay = System.nanoTime() - t0; + if (nbFiles == 1) { + return "Generate one file in " + StringUtil.convertTime(delay) + "."; + } + return "Generate " + nbFiles + " files in " + StringUtil.convertTime(delay) + "."; + } + /** * Add a single input to the {@link #inputs} property. - * + * <p/> * <b>Note:</b> This is a convinient way to allow in pom to write * <pre> * <inputs>zargo</inputs> @@ -576,10 +652,10 @@ if (testPhase) { File extraClassPathDirectory = new File( getProject().getBuild().getOutputDirectory()); -// if (verbose) { - getLog().info("Add in generator's classLoader : " + - extraClassPathDirectory); -// } + if (verbose) { + getLog().info("Add in generator's classLoader : " + + extraClassPathDirectory); + } addDirectoryToUrlsList( extraClassPathDirectory, urls, @@ -600,7 +676,6 @@ ); } - if (project.getProjectReferences() != null) { // this case is for multi-module when calling from a // parent module Modified: trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/BaseChainedFileWriter.java =================================================================== --- trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/BaseChainedFileWriter.java 2010-05-14 13:44:45 UTC (rev 905) +++ trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/BaseChainedFileWriter.java 2010-05-16 12:19:55 UTC (rev 906) @@ -44,9 +44,7 @@ */ public abstract class BaseChainedFileWriter extends AbstractChainedFileWriter { - /** - * Logger - */ + /** Logger */ private Log log; protected BaseChainedFileWriter(String... propertyNameAndDescriptions) { @@ -69,8 +67,13 @@ protected void initWriter(ChainedFileWriterConfiguration configuration) { super.initWriter(configuration); + if (!configuration.isVerbose()) { + + // nothing else to do + return; + } + // log writer config - StringBuilder buffer = new StringBuilder(); Set<Map.Entry<String, String>> set = getAuthorizedPropertyDescriptions().entrySet(); Modified: trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/ModelChainedFileWriter.java =================================================================== --- trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/ModelChainedFileWriter.java 2010-05-14 13:44:45 UTC (rev 905) +++ trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/ModelChainedFileWriter.java 2010-05-16 12:19:55 UTC (rev 906) @@ -26,8 +26,10 @@ package org.nuiton.eugene.plugin.writer; import org.apache.commons.lang.StringUtils; +import org.nuiton.eugene.DefaultTemplateConfiguration; import org.nuiton.eugene.ModelReader; import org.nuiton.eugene.Template; +import org.nuiton.eugene.TemplateConfiguration; import org.nuiton.eugene.models.Model; import org.nuiton.eugene.writer.ChainedFileWriterConfiguration; import org.nuiton.plugin.PluginHelper; @@ -63,6 +65,8 @@ public static final String PROP_READER = "reader"; + public static final String PROP_TEMPLATE_CONFIGURATION = "templateConfiguration"; + public ModelChainedFileWriter() { super( PROP_TEMPLATES, "templates", @@ -71,7 +75,8 @@ PROP_READER, "reader", PROP_MODEL_READER, "modelReader", PROP_GENERATED_PACKAGES, "generatedPackages", - PROP_DEFAULT_PACKAGE, "defaultPackage" + PROP_DEFAULT_PACKAGE, "defaultPackage", + PROP_TEMPLATE_CONFIGURATION, "templateConfiguration" ); } @@ -144,6 +149,10 @@ return getProperty(PROP_TEMPLATES, String.class); } + public TemplateConfiguration getTemplateConfiguration() { + return getProperty(PROP_TEMPLATE_CONFIGURATION, TemplateConfiguration.class); + } + protected ModelReader<?> getModelReader() { return getProperty(PROP_MODEL_READER, ModelReader.class); } @@ -189,24 +198,27 @@ } } + boolean verbose = configuration.isVerbose(); + Properties templateProperties = new Properties(); - templateProperties.setProperty(Template.PROP_DEFAULT_PACKAGE, - getDefaultPackage()); - templateProperties.setProperty( - Template.PROP_OVERWRITE, - String.valueOf(configuration.isOverwrite())); - templateProperties.setProperty(Template.PROP_ENCODING, - configuration.getEncoding()); - templateProperties.setProperty( - Template.PROP_LAST_MODIFIED_SOURCE, - String.valueOf(getModelReader().getLastModifiedSource())); + + templateProperties.put(Template.PROP_DEFAULT_PACKAGE, getDefaultPackage()); + templateProperties.put(Template.PROP_ENCODING, configuration.getEncoding()); + templateProperties.put(Template.PROP_VERBOSE, verbose); + templateProperties.put(Template.PROP_OVERWRITE, configuration.isOverwrite()); + templateProperties.put(Template.PROP_CLASS_LOADER, configuration.getClassLoader()); + String generatedPackages = getGeneratedPackages(); if (StringUtils.isEmpty(generatedPackages)) { - getLog().info(" generating all packages"); + if (verbose) { + getLog().info("generating all packages"); + } } else { templateProperties.put(Template.PROP_GENERATED_PACKAGES, generatedPackages); - getLog().info(" generating only for packages " + generatedPackages); + if (verbose) { + getLog().info("generating only for packages " + generatedPackages); + } } // init templates @@ -230,7 +242,9 @@ "Can't obtain template [" + templateName + "] for reason " + e.getMessage(), e); } - } else { + } + + if (verbose) { getLog().info("will use the template [" + templateName + "]"); } @@ -238,7 +252,8 @@ templatesList.add(template); // set the properties of the template - template.setProperties(templateProperties); + template.setConfiguration( + new DefaultTemplateConfiguration(templateProperties)); } properties.put(PROP_TEMPLATES_LIST, templatesList); @@ -260,13 +275,15 @@ List<File> modelFiles = new ArrayList<File>(); String[] includePatterns = includePattern.split(","); - getLog().info("Generating from " + inputDirectory + " : " + - includePattern); + if (configuration.isVerbose()) { + getLog().info("Generating from " + inputDirectory + " : " + + includePattern); + } if (configuration.isVerbose()) { - getLog().info("Will use classLoader "+configuration.getClassLoader()); + getLog().info("Will use classLoader " + configuration.getClassLoader()); } - + for (File srcDirGen : ioContext.getInputs()) { if (configuration.isVerbose()) { @@ -275,28 +292,46 @@ } List<File> currentFiles = PluginHelper.getIncludedFiles( srcDirGen, includePatterns, null); + if (currentFiles.size() == 1) { + getLog().info("Using one model :"); + } else { + getLog().info("Using " + currentFiles.size() + " models :"); + } + for (File currentFile : currentFiles) { + getLog().info(" " + currentFile.getAbsolutePath()); + } modelFiles.addAll(currentFiles); } // read the model - Model model = getModelReader().read(modelFiles.toArray( - new File[modelFiles.size()])); + File[] filesToRead = modelFiles.toArray(new File[modelFiles.size()]); + Model model = getModelReader().read(filesToRead); + + // get the last modified source timestamp from reader + long lastModifiedSource = getModelReader().getLastModifiedSource(); + // apply all templates to the model for (Template<Model> template : getTemplatesList()) { - getLog().info("Apply " + template.getClass().getSimpleName() + - " generator"); + getLog().info("Apply generator " + template.getClass().getSimpleName()); - template.setConfiguration(configuration); - + // set the lastModified source property + template.setProperty(Template.PROP_LAST_MODIFIED_SOURCE, lastModifiedSource); + + template.setProperty(Template.PROP_WRITER_REPORT, getWriterReport()); + + if (configuration.isVerbose()) { + getLog().info(" overwrite = " + template.isOverwrite()); + getLog ().info(" encoding = " + template.getEncoding()); + getLog().info(" lastModifiedSource = " + template.getLastModifiedSource()); + } + // apply template template.applyTemplate(model, ioContext.getOutput()); - } - } } Modified: trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/XmiChainedFileWriter.java =================================================================== --- trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/XmiChainedFileWriter.java 2010-05-14 13:44:45 UTC (rev 905) +++ trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/XmiChainedFileWriter.java 2010-05-16 12:19:55 UTC (rev 906) @@ -28,6 +28,7 @@ import org.nuiton.eugene.models.object.ObjectModel; import org.nuiton.eugene.models.state.StateModel; import org.nuiton.eugene.writer.ChainedFileWriterConfiguration; +import org.nuiton.eugene.writer.WriterReport; import org.nuiton.plugin.PluginHelper; import org.nuiton.plugin.PluginIOContext; import org.nuiton.util.FasterCachedResourceResolver; @@ -58,8 +59,8 @@ * vers du model). * * @author tchemit + * @plexus.component role="org.nuiton.eugene.writer.ChainedFileWriter" role-hint="xmi" * @since 2.0.0 - * @plexus.component role="org.nuiton.eugene.writer.ChainedFileWriter" role-hint="xmi" */ public class XmiChainedFileWriter extends BaseChainedFileWriter { @@ -144,50 +145,44 @@ File outputDir, File inputDirectory, String includePattern) throws IOException { - long t0 = System.nanoTime(); - boolean overwrite = configuration.isOverwrite(); - try { - getLog().info("Processing XSL tranformation on " + - inputDirectory + " for " + includePattern); + getLog().info("Processing XSL tranformation on " + + inputDirectory + " for " + includePattern); + if (configuration.isVerbose()) { getLog().info(" with fullPackagePath : " + getFullPackagePath()); getLog().info(" with resolver : " + getResolver()); + } + // recuperation des fichiers a traiter + List<File> files = PluginHelper.getIncludedFiles( + inputDirectory, new String[]{includePattern}, null); - // recuperation des fichiers a traiter - List<File> files = PluginHelper.getIncludedFiles( - inputDirectory, new String[]{includePattern}, null); + // lancement des traitements xsl sur les fichiers trouvés + // dans le repertoire + actionXsl(configuration, + outputDir, + inputDirectory, + files + ); - // lancement des traitements xsl sur les fichiers trouvés - // dans le repertoire - actionXsl(configuration, - outputDir, - inputDirectory, - files, - overwrite - ); - } finally { - getLog().info("xsl done in " + - PluginHelper.convertTime(System.nanoTime() - t0)); + if (configuration.isVerbose()) { + getLog().info("Copy resources files."); } - getLog().info("Copy resources files"); - PluginIOContext ioContext = new PluginIOContext(); ioContext.setInput(inputDirectory); ioContext.setOutput(outputDir); PluginHelper.copyFiles(ioContext, null, new String[]{includePattern}, - overwrite + configuration.isOverwrite() ); } protected void actionXsl(ChainedFileWriterConfiguration configuration, - File outputDir, - File dir, - List<File> files, - boolean overwrite) throws IOException { + File outputDir, + File dir, + List<File> files) throws IOException { for (File file : files) { try { @@ -212,21 +207,26 @@ File dstDir = outputDir; if (!relatifPath.isEmpty()) { dstDir = new File(dstDir, relatifPath); - if (!dstDir.exists()) { - boolean b = dstDir.mkdirs(); - if (!b) { - throw new IOException( - "could not create directory " + dstDir); - } - } + PluginHelper.createDirectoryIfNecessary(dstDir); } File result = new File(dstDir, filename); - if (!overwrite && file.lastModified() < result.lastModified()) { - getLog().info("file up-to-date : " + result); + if (!configuration.isOverwrite() && file.lastModified() < result.lastModified()) { + + if (configuration.isVerbose()) { + getLog().info("Will not generate " + result + + " (up-to-date)."); + } continue; } - if (getLog().isDebugEnabled()) { - getLog().debug("generate " + result); + + WriterReport writerReport = getWriterReport(); + if (writerReport != null) { + + writerReport.addFile( + getClass().getName(), + result, + true + ); } // Create the xsl transformer and set parameters @@ -238,11 +238,18 @@ ); transformer.setURIResolver(fileResolver); - transformer.transform( - new StreamSource(file), - new StreamResult(new FileOutputStream(result)) - ); + FileOutputStream output = new FileOutputStream(result); + try { + transformer.transform( + new StreamSource(file), + new StreamResult(output) + ); + } finally { + output.close(); + } + } catch (IOException e) { + throw e; } catch (Exception e) { throw new IOException(e.getMessage(), e); } @@ -284,7 +291,9 @@ ((ResourceResolver) result).setCl(loader); if (result instanceof FasterCachedResourceResolver) { boolean offline = configuration.isOffline(); - getLog().debug("using offline mode ? : " + offline); + if (getLog().isDebugEnabled()) { + getLog().debug("using offline mode ? : " + offline); + } ((FasterCachedResourceResolver) result).setOffline(offline); } } @@ -348,9 +357,7 @@ return version; } - /** - * Sax handler to find xmi version into xmi document. - */ + /** Sax handler to find xmi version into xmi document. */ protected class XmiVersionHandler extends DefaultHandler { protected String version; @@ -370,12 +377,16 @@ if (qName.equals("XMI")) { version = attributes.getValue("xmi.version"); - getLog().debug("XMI version found : " + version); + if (getLog().isDebugEnabled()) { + getLog().debug("XMI version found : " + version); + } } if (version == null) { version = attributes.getValue("xmi:version"); - getLog().debug("XMI version found : " + version); + if (getLog().isDebugEnabled()) { + getLog().debug("XMI version found : " + version); + } } } Modified: trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/ZargoChainedFileWriter.java =================================================================== --- trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/ZargoChainedFileWriter.java 2010-05-14 13:44:45 UTC (rev 905) +++ trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/ZargoChainedFileWriter.java 2010-05-16 12:19:55 UTC (rev 906) @@ -25,12 +25,20 @@ package org.nuiton.eugene.plugin.writer; +import org.codehaus.plexus.util.DirectoryScanner; +import org.codehaus.plexus.util.IOUtil; import org.nuiton.eugene.writer.ChainedFileWriterConfiguration; +import org.nuiton.eugene.writer.WriterReport; import org.nuiton.plugin.PluginHelper; import org.nuiton.plugin.PluginIOContext; import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; +import java.util.Enumeration; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; /** * To write model files from zargo files. @@ -107,11 +115,11 @@ getLog().info("Expanding xmi from " + inputDirectory + " : " + includePattern); - PluginHelper.expandFiles(ioContext, - new String[]{includePattern}, - null, - XMI_FILE_FILTER, - overwrite + expandFiles(ioContext, + new String[]{includePattern}, + null, + XMI_FILE_FILTER, + configuration ); getLog().info("Copying resources from " + inputDirectory + " : " + @@ -123,4 +131,76 @@ overwrite ); } + + public void expandFiles(PluginIOContext p, + String[] includes, + String[] excludes, + String[] zipIncludes, + ChainedFileWriterConfiguration configuration) throws IOException { + + DirectoryScanner ds = new DirectoryScanner(); + + for (File input : p.getInputs()) { + ds.setBasedir(input); + if (includes != null) { + ds.setIncludes(includes); + } + if (excludes != null) { + + ds.setExcludes(excludes); + } + ds.addDefaultExcludes(); + ds.scan(); + for (String file : ds.getIncludedFiles()) { + File in = new File(input, file); + File out = new File(p.getOutput(), file).getParentFile(); + expandFile(in, out, zipIncludes, configuration); + } + } + } + + public void expandFile(File src, + File dst, + String[] includes, + ChainedFileWriterConfiguration configuration) throws IOException { + ZipFile zipFile = new ZipFile(src); + Enumeration<? extends ZipEntry> entries = zipFile.entries(); + while (entries.hasMoreElements()) { + ZipEntry nextElement = entries.nextElement(); + String name = nextElement.getName(); + for (String include : includes) { + if (DirectoryScanner.match(include, name)) { + if (configuration.isVerbose()) { + getLog().info("matching name : " + name + + " with pattern " + include); + } + File dstFile = new File(dst, name); + if (configuration.isOverwrite() || + !dstFile.exists() || + nextElement.getTime() > dstFile.lastModified()) { + + if (configuration.isVerbose()) { + getLog().info("will expand : " + name + " to " + dstFile); + } + + WriterReport writerReport = getWriterReport(); + if (writerReport != null) { + writerReport.addFile(getClass().getName(), dstFile, true); + } + + InputStream inputStream = + zipFile.getInputStream(nextElement); + FileOutputStream outStream = + new FileOutputStream(dstFile); + try { + IOUtil.copy(inputStream, outStream, 2048); + } finally { + outStream.close(); + } + } + + } + } + } + } }