Author: tchemit Date: 2010-12-11 20:56:37 +0100 (Sat, 11 Dec 2010) New Revision: 1023 Url: http://nuiton.org/repositories/revision/eugene/1023 Log: improve use of ModelPropertiesProvider Modified: trunk/eugene/src/main/java/org/nuiton/eugene/ModelPropertiesUtil.java trunk/eugene/src/main/java/org/nuiton/eugene/ModelReader.java trunk/eugene/src/main/java/org/nuiton/eugene/models/object/ObjectModelReader.java trunk/eugene/src/test/java/org/nuiton/eugene/EugeneModelPropertiesProviderTest.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/ModelChainedFileWriter.java Modified: trunk/eugene/src/main/java/org/nuiton/eugene/ModelPropertiesUtil.java =================================================================== --- trunk/eugene/src/main/java/org/nuiton/eugene/ModelPropertiesUtil.java 2010-12-11 17:01:02 UTC (rev 1022) +++ trunk/eugene/src/main/java/org/nuiton/eugene/ModelPropertiesUtil.java 2010-12-11 19:56:37 UTC (rev 1023) @@ -1,3 +1,27 @@ +/* + * #%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; import org.apache.commons.logging.Log; @@ -52,9 +76,30 @@ } /** + * Obtain a new store of tag values and stereotypes. + * + * @param providers the list of providers to use in the store + * @param verbose a verbose flag + * @return the aggregate store of all atomic one detected in the class-path + */ + public static ModelPropertiesProvider newStore(Iterable<ModelPropertiesProvider> providers, + boolean verbose) { + + ModelPropertiesProvider store = new AggregateModelPropertiesProvider(providers); + store.setVerbose(verbose || log.isDebugEnabled()); + try { + store.init(); + } catch (Exception e) { + throw new RuntimeException("Could not init store of tag values and stereotypes", e); + } + return store; + } + + /** * The Eugene provider of tag values and stereotypes. * * @author tchemit <chemit@codelutin.com> + * @plexus.component role="org.nuiton.eugene.ModelPropertiesUtil$ModelPropertiesProvider" role-hint="eugene" * @since 2.3 */ public static class EugeneModelPropertiesProvider extends ModelPropertiesProvider { @@ -77,16 +122,25 @@ protected ClassLoader loader; + private Iterable<ModelPropertiesProvider> providers; + public AggregateModelPropertiesProvider(ClassLoader loader) { this.loader = loader; } + public AggregateModelPropertiesProvider(Iterable<ModelPropertiesProvider> providers) { + this.providers = providers; + } + @Override public void init() throws Exception { - ServiceLoader<ModelPropertiesProvider> loader; - loader = ServiceLoader.load(ModelPropertiesProvider.class, - this.loader); - for (ModelPropertiesProvider provider : loader) { + + if (providers == null) { + + providers = ServiceLoader.load(ModelPropertiesProvider.class, loader); + } + + for (ModelPropertiesProvider provider : providers) { if (isVerbose()) { log.info("Will init model properties provider " + provider); } Modified: trunk/eugene/src/main/java/org/nuiton/eugene/ModelReader.java =================================================================== --- trunk/eugene/src/main/java/org/nuiton/eugene/ModelReader.java 2010-12-11 17:01:02 UTC (rev 1022) +++ trunk/eugene/src/main/java/org/nuiton/eugene/ModelReader.java 2010-12-11 19:56:37 UTC (rev 1023) @@ -37,9 +37,9 @@ * <p/> * Created: 26 oct. 2009 * + * @param <M> Model to create from reading input files * @author fdesbois <fdesbois@codelutin.com> * @version $Id$ - * @param <M> Model to create from reading input files */ public abstract class ModelReader<M extends Model> { @@ -65,11 +65,11 @@ protected boolean strictLoading; /** - * The classloader to use to obtain {@link ModelPropertiesUtil.ModelPropertiesProvider}. + * The provider of safe tag values and stereotypes. * * @since 2.3 */ - protected ClassLoader loader; + protected ModelPropertiesUtil.ModelPropertiesProvider modelPropertiesProvider; public boolean isVerbose() { return verbose; @@ -87,14 +87,6 @@ this.strictLoading = strictLoading; } - public ClassLoader getLoader() { - return loader; - } - - public void setLoader(ClassLoader loader) { - this.loader = loader; - } - protected void setLastModifiedSource(File... files) { for (File file : files) { if (file.lastModified() > getLastModifiedSource()) { @@ -123,4 +115,21 @@ */ public abstract M read(File... file) throws IOException; + /** + * @return the provider of controled tagvalues and stereotypes. + * @since 2.3 + */ + public ModelPropertiesUtil.ModelPropertiesProvider getModelPropertiesProvider() { + return modelPropertiesProvider; + } + + /** + * Sets the provider of tag values and stereotypes availables. + * + * @param modelPropertiesProvider the provider to use + * @since 2.3 + */ + public void setModelPropertiesProvider(ModelPropertiesUtil.ModelPropertiesProvider modelPropertiesProvider) { + this.modelPropertiesProvider = modelPropertiesProvider; + } } 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-12-11 17:01:02 UTC (rev 1022) +++ trunk/eugene/src/main/java/org/nuiton/eugene/models/object/ObjectModelReader.java 2010-12-11 19:56:37 UTC (rev 1023) @@ -109,8 +109,6 @@ public static final String MODEL = "model"; - ModelPropertiesUtil.ModelPropertiesProvider propertiesProvider; - /** * @param files les noms des fichiers existant contenant du XML représentant * des ObjectModel. Il est automatiquement recherche un fichier de @@ -125,6 +123,13 @@ " for files " + Arrays.toString(files)); } + if (modelPropertiesProvider == null) { + if (log.isWarnEnabled()) { + log.warn("No properties provider filled, will instanciate a new default one"); + } + setModelPropertiesProvider(ModelPropertiesUtil.newStore(getClass().getClassLoader(), false)); + } + ObjectModel model = new ObjectModelImpl(); // Digester parser configuration @@ -200,11 +205,9 @@ return result; } - public Properties loadModelProperties(File propFile, ObjectModel model) throws IOException { + public Properties loadModelProperties(File propFile, + ObjectModel model) throws IOException { - // init ModelProperties store - propertiesProvider = ModelPropertiesUtil.newStore(getLoader(), isVerbose()); - Properties prop = new RecursiveProperties(); // try { FileInputStream inStream = new FileInputStream(propFile); @@ -288,14 +291,14 @@ } String tag = matcher.group(2); - boolean safe = propertiesProvider.containsTagValue(tag); + boolean safe = modelPropertiesProvider.containsTagValue(tag); if (!safe) { if (log.isWarnEnabled()) { log.warn("Invalid model tag value [" + key + "] : the tagvalue '" + tag + "' is unkown."); } } else { - safe = propertiesProvider.acceptTagValue(tag, ObjectModel.class); + safe = modelPropertiesProvider.acceptTagValue(tag, ObjectModel.class); if (!safe) { @@ -347,7 +350,7 @@ // target real type Class<?> targetType = getTargetType(target); - boolean safe = propertiesProvider.containsStereotype(value); + boolean safe = modelPropertiesProvider.containsStereotype(value); if (!safe) { @@ -357,7 +360,7 @@ } } else { - safe = propertiesProvider.acceptStereotype(value, targetType); + safe = modelPropertiesProvider.acceptStereotype(value, targetType); if (!safe) { @@ -451,7 +454,7 @@ + " type:" + type + " tag:" + tag); } - boolean safe = propertiesProvider.containsTagValue(tag); + boolean safe = modelPropertiesProvider.containsTagValue(tag); if (!safe) { @@ -461,7 +464,7 @@ } } else { - safe = propertiesProvider.acceptTagValue(tag, targetType); + safe = modelPropertiesProvider.acceptTagValue(tag, targetType); if (!safe) { Modified: trunk/eugene/src/test/java/org/nuiton/eugene/EugeneModelPropertiesProviderTest.java =================================================================== --- trunk/eugene/src/test/java/org/nuiton/eugene/EugeneModelPropertiesProviderTest.java 2010-12-11 17:01:02 UTC (rev 1022) +++ trunk/eugene/src/test/java/org/nuiton/eugene/EugeneModelPropertiesProviderTest.java 2010-12-11 19:56:37 UTC (rev 1023) @@ -1,3 +1,27 @@ +/* + * #%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; import org.junit.Assert; 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-12-11 17:01:02 UTC (rev 1022) +++ trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/SmartGenerateMojo.java 2010-12-11 19:56:37 UTC (rev 1023) @@ -32,6 +32,7 @@ import org.apache.maven.project.MavenProject; import org.apache.maven.settings.Settings; import org.nuiton.eugene.DefaultTemplateConfiguration; +import org.nuiton.eugene.ModelPropertiesUtil; import org.nuiton.eugene.ModelReader; import org.nuiton.eugene.Template; import org.nuiton.eugene.models.Model; @@ -261,7 +262,7 @@ * @since 1.0.0-rc-8 */ protected String generatedPackages; - + /** * List of package to extract from xmi to models. (model input specific). * <p/> @@ -320,6 +321,14 @@ protected Map<String, Template<?>> modelTemplates; /** + * All available model properties providers introspects via plexus + * + * @component role="org.nuiton.eugene.ModelPropertiesUtil$ModelPropertiesProvider" + * @since 2.3 + */ + protected Map<String, ModelPropertiesUtil.ModelPropertiesProvider> modelPropertiesProviders; + + /** * The engine to compute {@link ChainedFileWriter} from inputs entries. * * @component role="org.nuiton.eugene.writer.ChainedWriterEngine" @@ -421,6 +430,8 @@ properties.put(ModelChainedFileWriter.PROP_TEMPLATES, templates); properties.put(ModelChainedFileWriter.PROP_EXCLUDE_TEMPLATES, getExcludeTemplatesAsString()); + properties.put(ModelChainedFileWriter.PROP_MODEL_PROPERTIES_PROVIDER, + getModelPropertiesProvider()); DefaultTemplateConfiguration configuration = new DefaultTemplateConfiguration(); @@ -500,7 +511,7 @@ // launch generation writer.generate(this, data); - + String message = reportGeneratedFiles(writer, t0); getLog().info(message); @@ -838,4 +849,28 @@ } } } + + protected ModelPropertiesUtil.ModelPropertiesProvider getModelPropertiesProvider() throws MojoExecutionException { + + ModelPropertiesUtil.ModelPropertiesProvider provider; + + if (modelPropertiesProviders == null || + modelPropertiesProviders.isEmpty() || + isTestPhase()) { + + // could not find any model properties via plexus + // try to obtain them by ServiceLoader + + provider = ModelPropertiesUtil.newStore( + getFixedClassLoader(), + verbose + ); + } else { + provider = ModelPropertiesUtil.newStore( + modelPropertiesProviders.values(), + verbose + ); + } + return provider; + } } 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-12-11 17:01:02 UTC (rev 1022) +++ trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/ModelChainedFileWriter.java 2010-12-11 19:56:37 UTC (rev 1023) @@ -27,6 +27,7 @@ import org.apache.commons.lang.StringUtils; import org.nuiton.eugene.DefaultTemplateConfiguration; +import org.nuiton.eugene.ModelPropertiesUtil; import org.nuiton.eugene.ModelReader; import org.nuiton.eugene.Template; import org.nuiton.eugene.TemplateConfiguration; @@ -63,6 +64,8 @@ public static final String PROP_MODEL_READER = "modelReader"; + public static final String PROP_MODEL_PROPERTIES_PROVIDER = "modelPropertiesProvider"; + public static final String PROP_READER = "reader"; public static final String PROP_TEMPLATE_CONFIGURATION = "templateConfiguration"; @@ -76,7 +79,8 @@ PROP_MODEL_READER, "modelReader", PROP_GENERATED_PACKAGES, "generatedPackages", PROP_DEFAULT_PACKAGE, "defaultPackage", - PROP_TEMPLATE_CONFIGURATION, "templateConfiguration" + PROP_TEMPLATE_CONFIGURATION, "templateConfiguration", + PROP_MODEL_PROPERTIES_PROVIDER, "modelPropertiesProvider" ); } @@ -162,12 +166,17 @@ return getProperty(PROP_READER, String.class); } + protected ModelPropertiesUtil.ModelPropertiesProvider getModelPropertiesProvider() { + return getProperty(PROP_MODEL_PROPERTIES_PROVIDER, ModelPropertiesUtil.ModelPropertiesProvider .class); + } + @Override protected void initWriter(ChainedFileWriterConfiguration configuration) { super.initWriter(configuration); // obtain a reader - ClassLoader loader = configuration.getClassLoader(); + ClassLoader classLoader = configuration.getClassLoader(); + ClassLoader loader = classLoader; if (getModelReader() == null) { if (getReader() != null) { @@ -201,13 +210,23 @@ boolean verbose = configuration.isVerbose(); + // gets the provider of safe tag values and stereotypes + ModelPropertiesUtil.ModelPropertiesProvider propertiesProvider = + getModelPropertiesProvider(); + + // affect it to the model reader + getModelReader().setModelPropertiesProvider(propertiesProvider); + + // set the verbose level of the model reader + getModelReader().setVerbose(verbose); + Properties templateProperties = new Properties(); 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()); + templateProperties.put(Template.PROP_CLASS_LOADER, loader); templateProperties.put(Template.PROP_EXCLUDE_TEMPLATES, configuration.getProperties().get(PROP_EXCLUDE_TEMPLATES)); String generatedPackages = getGeneratedPackages(); @@ -280,9 +299,8 @@ getLog().info("Will read " + filesToRead.length + " model(s)."); } - getModelReader().setVerbose(configuration.isVerbose()); - getModelReader().setLoader(configuration.getClassLoader()); + // read memory model from all files models Model model = getModelReader().read(filesToRead);