Author: tchemit Date: 2009-12-20 14:01:03 +0100 (Sun, 20 Dec 2009) New Revision: 774 Added: trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/XmiChainedFileWriter.java Removed: trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/BaseXmiToChainedFileWriter.java trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/XmiToObjectModelChainedFileWriter.java trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/XmiToStateModelChainedFileWriter.java Modified: 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/main/java/org/nuiton/eugene/writer/ChainedWriterEngine.java trunk/eugene/src/main/java/org/nuiton/eugene/writer/DefaultChainedWriterEngine.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/ZargoChainedFileWriter.java Log: - simplify api (no more use of the modelClass but always base on the modelType a String) - using only one ChainedWriter to transform xmi to models Modified: trunk/eugene/src/main/java/org/nuiton/eugene/writer/AbstractChainedFileWriter.java =================================================================== --- trunk/eugene/src/main/java/org/nuiton/eugene/writer/AbstractChainedFileWriter.java 2009-12-20 12:59:50 UTC (rev 773) +++ trunk/eugene/src/main/java/org/nuiton/eugene/writer/AbstractChainedFileWriter.java 2009-12-20 13:01:03 UTC (rev 774) @@ -144,7 +144,7 @@ } @Override - public <M extends Model> String getInputProtocol(Class<M> modelType) { + public String getInputProtocol(String modelType) { // input protocol is the same for all model return acceptModel(modelType) ? getInputProtocol() : null; } Modified: trunk/eugene/src/main/java/org/nuiton/eugene/writer/ChainedFileWriter.java =================================================================== --- trunk/eugene/src/main/java/org/nuiton/eugene/writer/ChainedFileWriter.java 2009-12-20 12:59:50 UTC (rev 773) +++ trunk/eugene/src/main/java/org/nuiton/eugene/writer/ChainedFileWriter.java 2009-12-20 13:01:03 UTC (rev 774) @@ -20,8 +20,6 @@ */ package org.nuiton.eugene.writer; -import org.nuiton.eugene.models.Model; - import java.io.File; import java.io.IOException; import java.util.List; @@ -47,28 +45,25 @@ * Obtain the input protocol of this writer given the passed {@code modelType}. * * @param modelType the type of model used - * @param <M> the type of model used * @return the input protocol or {@code null} if this writer does not accept the type of model */ - <M extends Model> String getInputProtocol(Class<M> modelType); + String getInputProtocol(String modelType); /** * Obtain the output protocol of this writer given the passed {@code modelType}. * * @param modelType the type of model used - * @param <M> the type of model used * @return the output protocol or {@code null} if should not be chained */ - <M extends Model> String getOutputProtocol(Class<M> modelType); + String getOutputProtocol(String modelType); /** * Test if a type of model can be treated by this writer. * * @param modelType model type to test - * @param <M> model type to test * @return {@code true} if this writer accept the given type of model, {@code false} otherwise. */ - <M extends Model> boolean acceptModel(Class<M> modelType); + boolean acceptModel(String modelType); /** * Test in a entry can be treated by this writer. Modified: trunk/eugene/src/main/java/org/nuiton/eugene/writer/ChainedFileWriterConfiguration.java =================================================================== --- trunk/eugene/src/main/java/org/nuiton/eugene/writer/ChainedFileWriterConfiguration.java 2009-12-20 12:59:50 UTC (rev 773) +++ trunk/eugene/src/main/java/org/nuiton/eugene/writer/ChainedFileWriterConfiguration.java 2009-12-20 13:01:03 UTC (rev 774) @@ -22,7 +22,6 @@ import org.nuiton.eugene.ModelReader; import org.nuiton.eugene.Template; -import org.nuiton.eugene.models.Model; import java.io.File; import java.util.Map; @@ -41,10 +40,10 @@ */ String getModelType(); - /** - * @return the type of model used - */ - Class<? extends Model> getModelClass(); +// /** +// * @return the type of model used +// */ +// Class<? extends Model> getModelClass(); /** * @return project base directory Modified: trunk/eugene/src/main/java/org/nuiton/eugene/writer/ChainedWriterEngine.java =================================================================== --- trunk/eugene/src/main/java/org/nuiton/eugene/writer/ChainedWriterEngine.java 2009-12-20 12:59:50 UTC (rev 773) +++ trunk/eugene/src/main/java/org/nuiton/eugene/writer/ChainedWriterEngine.java 2009-12-20 13:01:03 UTC (rev 774) @@ -1,7 +1,5 @@ package org.nuiton.eugene.writer; -import org.nuiton.eugene.models.Model; - import java.util.List; import java.util.Map; import java.util.Set; @@ -34,11 +32,11 @@ boolean containsWriter(String inputProtocol); - Set<ChainedFileWriter> filterWriterForModelType(Map<String, ChainedFileWriter> universe, Class<? extends Model> modelType); + Set<ChainedFileWriter> filterWriterForModelType(Map<String, ChainedFileWriter> universe, String modelType); - ChainedFileWriter getWriterForInputProtocol(Set<ChainedFileWriter> universe, String inputProtocol, Class<? extends Model> modelType); + ChainedFileWriter getWriterForInputProtocol(Set<ChainedFileWriter> universe, String inputProtocol, String modelType); - ChainedFileWriter getWriterForInclude(Set<ChainedFileWriter> universe, String include, Class<? extends Model> modelType); + ChainedFileWriter getWriterForInclude(Set<ChainedFileWriter> universe, String include, String modelType); void registerInclude(String include); Modified: trunk/eugene/src/main/java/org/nuiton/eugene/writer/DefaultChainedWriterEngine.java =================================================================== --- trunk/eugene/src/main/java/org/nuiton/eugene/writer/DefaultChainedWriterEngine.java 2009-12-20 12:59:50 UTC (rev 773) +++ trunk/eugene/src/main/java/org/nuiton/eugene/writer/DefaultChainedWriterEngine.java 2009-12-20 13:01:03 UTC (rev 774) @@ -2,7 +2,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.nuiton.eugene.models.Model; import java.io.File; import java.util.*; @@ -74,7 +73,7 @@ public Set<ChainedFileWriter> getAvailableWriters() { if (availableWriters == null) { checkConfiguration("getAvailableWriters"); - availableWriters = filterWriterForModelType(getConfiguration().getWriters(), getConfiguration().getModelClass()); + availableWriters = filterWriterForModelType(getConfiguration().getWriters(), getConfiguration().getModelType()); } return availableWriters; } @@ -129,7 +128,7 @@ ChainedFileWriterConfiguration configuration = getConfiguration(); - Class<? extends Model> modelType = configuration.getModelClass(); + String modelType = configuration.getModelType(); String outpoutProtocol = writer.getOutputProtocol(modelType); @@ -194,7 +193,7 @@ } @Override - public Set<ChainedFileWriter> filterWriterForModelType(Map<String, ChainedFileWriter> universe, Class<? extends Model> modelType) { + public Set<ChainedFileWriter> filterWriterForModelType(Map<String, ChainedFileWriter> universe, String modelType) { Set<ChainedFileWriter> result = new HashSet<ChainedFileWriter>(); for (ChainedFileWriter w : universe.values()) { if (w.acceptModel(modelType)) { @@ -208,7 +207,7 @@ } @Override - public ChainedFileWriter getWriterForInputProtocol(Set<ChainedFileWriter> universe, String inputProtocol, Class<? extends Model> modelType) { + public ChainedFileWriter getWriterForInputProtocol(Set<ChainedFileWriter> universe, String inputProtocol, String modelType) { for (ChainedFileWriter writer : universe) { if (inputProtocol.equals(writer.getInputProtocol(modelType))) { return writer; @@ -218,7 +217,7 @@ } @Override - public ChainedFileWriter getWriterForInclude(Set<ChainedFileWriter> universe, String include, Class<? extends Model> modelType) { + public ChainedFileWriter getWriterForInclude(Set<ChainedFileWriter> universe, String include, String modelType) { for (ChainedFileWriter w : universe) { if (w.acceptInclude(include)) { return w; @@ -246,7 +245,7 @@ Set<ChainedFileWriter> universe = engine.getAvailableWriters(); String protocol = matcher.group(1).toLowerCase(); - ChainedFileWriter writer = engine.getWriterForInputProtocol(universe, protocol, configuration.getModelClass()); + ChainedFileWriter writer = engine.getWriterForInputProtocol(universe, protocol, configuration.getModelType()); if (writer == null) { throw new IllegalArgumentException("could not find the writer named '" + protocol + "', use one of " + universe); } @@ -277,7 +276,7 @@ ChainedFileWriterConfiguration configuration = engine.getConfiguration(); Set<ChainedFileWriter> universe = engine.getAvailableWriters(); - Class<? extends Model> modelType = configuration.getModelClass(); + String modelType = configuration.getModelType(); // with no protocol pattern // pattern is discover from the includes @@ -321,7 +320,7 @@ Set<ChainedFileWriter> universe = engine.getAvailableWriters(); String protocol = matcher.group(1).toLowerCase(); - ChainedFileWriter writer = engine.getWriterForInputProtocol(universe, protocol, configuration.getModelClass()); + ChainedFileWriter writer = engine.getWriterForInputProtocol(universe, protocol, configuration.getModelType()); if (writer == null) { throw new IllegalArgumentException("could not find the writer named '" + protocol + "', use one of " + universe); 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 2009-12-20 12:59:50 UTC (rev 773) +++ trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/SmartGenerateMojo.java 2009-12-20 13:01:03 UTC (rev 774) @@ -30,8 +30,8 @@ import org.nuiton.eugene.Template; import org.nuiton.eugene.models.Model; import org.nuiton.eugene.plugin.writer.BaseChainedFileWriter; -import org.nuiton.eugene.plugin.writer.BaseXmiToChainedFileWriter; import org.nuiton.eugene.plugin.writer.ModelChainedFileWriter; +import org.nuiton.eugene.plugin.writer.XmiChainedFileWriter; import org.nuiton.eugene.writer.ChainedFileWriter; import org.nuiton.eugene.writer.ChainedFileWriterConfiguration; import org.nuiton.eugene.writer.ChainedFileWriterEntry; @@ -276,11 +276,11 @@ * @component role="org.nuiton.eugene.writer.ChainedWriterEngine" */ protected ChainedWriterEngine engine; +// /** +// * class instance of the given {@link #modelType} +// */ +// protected Class<? extends Model> modelClass; /** - * class instance of the given {@link #modelType} - */ - protected Class<? extends Model> modelClass; - /** * fixed classloader */ protected ClassLoader fixedClassLoader; @@ -290,13 +290,13 @@ modelType = modelType.trim().toLowerCase(); - // on recupere le fqn du model à traiter via le container plexus (plus pratique dans ce cas où on veut + // Check model type is accepted // pouvoir associé un nom à un type de service). - Model model = _models.get(modelType.trim().toLowerCase()); + Model model = _models.get(modelType); if (model == null) { throw new MojoExecutionException("No modelType named '" + modelType + "', use one of " + _models.keySet()); } - modelClass = model.getClass(); +// modelClass = model.getClass(); if (inputs.length == 0) { throw new MojoExecutionException("Must specify something to include using the includes property"); @@ -338,9 +338,9 @@ // add xmi writer support - properties.put(BaseXmiToChainedFileWriter.PROP_FULL_PACKAGE_PATH, fullPackagePath); + properties.put(XmiChainedFileWriter.PROP_FULL_PACKAGE_PATH, fullPackagePath); //properties.put("extractedPackages", extractedPackages); - properties.put(BaseXmiToChainedFileWriter.PROP_RESOLVER, resolver); + properties.put(XmiChainedFileWriter.PROP_RESOLVER, resolver); } if (engine.containsWriter("model")) { @@ -508,10 +508,10 @@ return modelType; } - @Override - public Class<? extends Model> getModelClass() { - return modelClass; - } +// @Override +// public Class<? extends Model> getModelClass() { +// return modelClass; +// } @Override public Map<String, ChainedFileWriter> getWriters() { @@ -674,6 +674,4 @@ } } } - - } \ No newline at end of file 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 2009-12-20 12:59:50 UTC (rev 773) +++ trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/BaseChainedFileWriter.java 2009-12-20 13:01:03 UTC (rev 774) @@ -22,6 +22,8 @@ import org.apache.maven.plugin.logging.Log; import org.apache.maven.plugin.logging.SystemStreamLog; +import org.nuiton.eugene.models.object.ObjectModel; +import org.nuiton.eugene.models.state.StateModel; import org.nuiton.eugene.writer.AbstractChainedFileWriter; import org.nuiton.eugene.writer.ChainedFileWriterConfiguration; @@ -83,5 +85,10 @@ getLog().info(buffer.toString()); } + protected boolean acceptObjectModelOrStateModel(String modelType) { + modelType = modelType.trim().toLowerCase(); + return ObjectModel.NAME.equals(modelType) || StateModel.NAME.equals(modelType); + } + } Deleted: trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/BaseXmiToChainedFileWriter.java =================================================================== --- trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/BaseXmiToChainedFileWriter.java 2009-12-20 12:59:50 UTC (rev 773) +++ trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/BaseXmiToChainedFileWriter.java 2009-12-20 13:01:03 UTC (rev 774) @@ -1,270 +0,0 @@ -/* - * *##% - * EUGene :: Maven plugin - * Copyright (C) 2006 - 2009 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>. - * ##%* - */ -package org.nuiton.eugene.plugin.writer; - -import org.nuiton.eugene.models.Model; -import org.nuiton.eugene.writer.ChainedFileWriterConfiguration; -import org.nuiton.plugin.PluginHelper; -import org.nuiton.plugin.PluginIOContext; -import org.nuiton.util.FasterCachedResourceResolver; -import org.nuiton.util.FileUtil; -import org.nuiton.util.Resource; -import org.nuiton.util.ResourceResolver; - -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.URIResolver; -import javax.xml.transform.stream.StreamResult; -import javax.xml.transform.stream.StreamSource; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.lang.reflect.Constructor; -import java.net.URL; -import java.util.List; - -/** - * Implentation pour les writer to type xmi (qui transforme du xmi via xsl). - * - * @author tchemit - * @since 2.0.0 - */ -public abstract class BaseXmiToChainedFileWriter extends BaseChainedFileWriter { - - public static final String PROP_RESOLVER = "resolver"; - // public static final String PROP_EXTRACTED_PACKAGES = "extractedPackages"; - public static final String PROP_FULL_PACKAGE_PATH = "fullPackagePath"; - - public BaseXmiToChainedFileWriter() { - super( - PROP_RESOLVER, "resolver", PROP_FULL_PACKAGE_PATH, "fullPackagePath"); - } - - /** - * Get style sheet. - * - * @param model the model file used to determine the stylesheet to use - * @return the stylesheet name - */ - protected abstract String getStyleSheet(File model); - - /** - * Get extension. - * - * @return the extension - */ - protected abstract String getExtension(); - - @Override - public String getInputProtocol() { - return "xmi"; - } - - @Override - public <M extends Model> String getOutputProtocol(Class<M> modelType) { - // next writer : write from model files - return "model"; - } - - @Override - public boolean acceptInclude(String include) { - return include.startsWith("xmi:") || include.endsWith(".xmi") || include.endsWith(".uml"); - } - - @Override - public String getDefaultIncludes() { - return "**/*.xmi"; - } - - @Override - public String getDefaultInputDirectory() { - return "src/main/xmi"; - } - - @Override - public String getDefaultOutputDirectory() { - return "models"; - } - - @Override - public String getDefaultTestInputDirectory() { - return "src/test/xmi"; - } - - @Override - public String getDefaultTestOutputDirectory() { - return "test-models"; - } - - protected TransformerFactory transformerFactory; - - protected TransformerFactory getTransformerFactory() { - if (transformerFactory == null) { - transformerFactory = TransformerFactory.newInstance(); - } - return transformerFactory; - } - - public String getFullPackagePath() { - return getProperty(PROP_FULL_PACKAGE_PATH, String.class); - } - -// public String getExtractedPackages() { -// return getProperty(PROP_EXTRACTED_PACKAGES, String.class); -// } - - public String getResolver() { - return getProperty(PROP_RESOLVER, String.class); - } - - - @Override - public void generate(ChainedFileWriterConfiguration configuration, 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(" with fullPackagePath : " + getFullPackagePath()); -// getLog().info(" with extractedPackages : " + getExtractedPackages()); -// getLog().info(" with acceptedXmiTypes : " + getFullPackagePath()); - getLog().info(" with resolver : " + getResolver()); - - // 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, overwrite); - } finally { - getLog().info("xsl done in " + PluginHelper.convertTime(System.nanoTime() - t0)); - } - - getLog().info("Copy resources files"); - - PluginIOContext ioContext = new PluginIOContext(); - ioContext.setInput(inputDirectory); - ioContext.setOutput(outputDir); -// String[] excludes = getSuffixPattern("**/*"); - PluginHelper.copyFiles(ioContext, null, new String[]{includePattern}, overwrite); - } - - - protected void actionXsl(ChainedFileWriterConfiguration configuration, File outputDir, File dir, List<File> files, boolean overwrite) throws IOException { - - for (File file : files) { - try { - if (getLog().isDebugEnabled()) { - getLog().debug("treate file : " + file); - } - // Prepare resolver, stylesheet - URIResolver fileResolver = getUriResolver(configuration, file); - String styleSheet = getStyleSheet(file); - URL xsl = Resource.getURL(styleSheet); - - //TC-20090820 : using recursive for xmi -// File result = new File(destDirModel, FileUtil.basename(file, -// acceptedSuffixes).concat(".").concat(getExtension())); - - String extension = "." + FileUtil.extension(file); - String filename = FileUtil.basename(file, extension).concat(".").concat(getExtension()); - String relatifPath = file.getParentFile().getAbsolutePath().substring(dir.getAbsolutePath().length()); - 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); - } - } - } - File result = new File(dstDir, filename); - if (!overwrite && file.lastModified() < result.lastModified()) { - getLog().info("file up-to-date : " + result); - continue; - } - if (getLog().isDebugEnabled()) { - getLog().debug("generate " + result); - } - - // Create the xsl transformer and set parameters - Transformer transformer = getTransformerFactory().newTransformer(new StreamSource(xsl.openStream())); - - transformer.setParameter(PROP_FULL_PACKAGE_PATH, getFullPackagePath()); - //transformer.setParameter("extraPackages", getExtractedPackages()); - - transformer.setURIResolver(fileResolver); - transformer.transform(new StreamSource(file), new StreamResult( - new FileOutputStream(result))); - - } catch (Exception e) { - throw new IOException(e.getMessage(), e); - } - } - } - - protected URIResolver getUriResolver(ChainedFileWriterConfiguration configuration, File model) { - URIResolver result = null; - - try { - ClassLoader loader = configuration.getClassLoader(); - Class<?> clazz = Class.forName(getResolver(), true, loader); - - // Try to set the base using the constructor - try { - // Look for a constructor with a String parameter (base) - Constructor<?> withBaseConstructor = clazz.getConstructor(String.class); - // Set the xmi folder as the base - String base = model.getParentFile().getAbsolutePath(); - // Instantiate - result = (URIResolver) withBaseConstructor.newInstance(base); - } catch (Exception eee) { - getLog().warn("Unable to instantiate resolver with String parameter", - eee); - } - - // If resolver is still not created, create it using the default - // constructor - if (result == null) { - result = (URIResolver) clazz.newInstance(); - } - - if (result instanceof ResourceResolver) { - ((ResourceResolver) result).setVerbose(configuration.isVerbose()); - ((ResourceResolver) result).setCl(loader); - if (result instanceof FasterCachedResourceResolver) { - boolean offline = configuration.isOffline(); - getLog().debug("using offline mode ? : " + offline); - ((FasterCachedResourceResolver) result).setOffline(offline); - } - } - - } catch (Exception eee) { - getLog().warn("Unable to instantiate resolver using the default constructor", eee); - } - - return result; - } - - -} 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 2009-12-20 12:59:50 UTC (rev 773) +++ trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/ModelChainedFileWriter.java 2009-12-20 13:01:03 UTC (rev 774) @@ -70,15 +70,15 @@ } @Override - public <M extends Model> String getOutputProtocol(Class<M> modelType) { + public String getOutputProtocol(String modelType) { // nothing after java files return null; } @Override - public <M extends Model> boolean acceptModel(Class<M> modelType) { + public boolean acceptModel(String modelType) { // accept all models - return true; + return acceptObjectModelOrStateModel(modelType); } @Override Copied: trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/XmiChainedFileWriter.java (from rev 769, trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/BaseXmiToChainedFileWriter.java) =================================================================== --- trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/XmiChainedFileWriter.java (rev 0) +++ trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/XmiChainedFileWriter.java 2009-12-20 13:01:03 UTC (rev 774) @@ -0,0 +1,366 @@ +/* + * *##% + * EUGene :: Maven plugin + * Copyright (C) 2006 - 2009 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>. + * ##%* + */ +package org.nuiton.eugene.plugin.writer; + +import org.nuiton.eugene.models.Model; +import org.nuiton.eugene.models.object.ObjectModel; +import org.nuiton.eugene.models.state.StateModel; +import org.nuiton.eugene.writer.ChainedFileWriterConfiguration; +import org.nuiton.plugin.PluginHelper; +import org.nuiton.plugin.PluginIOContext; +import org.nuiton.util.FasterCachedResourceResolver; +import org.nuiton.util.FileUtil; +import org.nuiton.util.Resource; +import org.nuiton.util.ResourceResolver; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.URIResolver; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.lang.reflect.Constructor; +import java.net.URL; +import java.util.List; + +/** + * Implentation pour les writer to type xmi (qui transforme du xmi via xsl vers du model). + * + * @author tchemit + * @since 2.0.0 + * @plexus.component role="org.nuiton.eugene.writer.ChainedFileWriter" role-hint="xmi" + */ +public class XmiChainedFileWriter extends BaseChainedFileWriter { + + public static final String PROP_RESOLVER = "resolver"; + // public static final String PROP_EXTRACTED_PACKAGES = "extractedPackages"; + public static final String PROP_FULL_PACKAGE_PATH = "fullPackagePath"; + + public XmiChainedFileWriter() { + super(PROP_RESOLVER, "resolver", PROP_FULL_PACKAGE_PATH, "fullPackagePath"); + } + + @Override + public boolean acceptModel(String modelType) { + // supported by objectModel and stateModel + return acceptObjectModelOrStateModel(modelType); + } + +// /** +// * Get style sheet. +// * +// * @param modelType model type used +// * @param model the model file used to determine the stylesheet to use +// * @return the stylesheet name +// */ +// protected abstract String getStyleSheet(String modelType, File model); + +// /** +// * Get extension. +// * +// * @return the extension +// */ +// protected abstract String getExtension(); + + @Override + public String getInputProtocol() { + return "xmi"; + } + + @Override + public String getOutputProtocol(String modelType) { + // next writer : write from model files + return "model"; + } + + @Override + public boolean acceptInclude(String include) { + return include.startsWith("xmi:") || include.endsWith(".xmi") || include.endsWith(".uml"); + } + + @Override + public String getDefaultIncludes() { + return "**/*.xmi"; + } + + @Override + public String getDefaultInputDirectory() { + return "src/main/xmi"; + } + + @Override + public String getDefaultOutputDirectory() { + return "models"; + } + + @Override + public String getDefaultTestInputDirectory() { + return "src/test/xmi"; + } + + @Override + public String getDefaultTestOutputDirectory() { + return "test-models"; + } + + protected TransformerFactory transformerFactory; + + protected TransformerFactory getTransformerFactory() { + if (transformerFactory == null) { + transformerFactory = TransformerFactory.newInstance(); + } + return transformerFactory; + } + + public String getFullPackagePath() { + return getProperty(PROP_FULL_PACKAGE_PATH, String.class); + } + +// public String getExtractedPackages() { +// return getProperty(PROP_EXTRACTED_PACKAGES, String.class); +// } + + public String getResolver() { + return getProperty(PROP_RESOLVER, String.class); + } + + @Override + public void generate(ChainedFileWriterConfiguration configuration, 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(" with fullPackagePath : " + getFullPackagePath()); +// getLog().info(" with extractedPackages : " + getExtractedPackages()); +// getLog().info(" with acceptedXmiTypes : " + getFullPackagePath()); + getLog().info(" with resolver : " + getResolver()); + + // 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, overwrite); + } finally { + getLog().info("xsl done in " + PluginHelper.convertTime(System.nanoTime() - t0)); + } + + getLog().info("Copy resources files"); + + PluginIOContext ioContext = new PluginIOContext(); + ioContext.setInput(inputDirectory); + ioContext.setOutput(outputDir); +// String[] excludes = getSuffixPattern("**/*"); + PluginHelper.copyFiles(ioContext, null, new String[]{includePattern}, overwrite); + } + + protected void actionXsl(ChainedFileWriterConfiguration configuration, File outputDir, File dir, List<File> files, boolean overwrite) throws IOException { + + for (File file : files) { + try { + if (getLog().isDebugEnabled()) { + getLog().debug("treate file : " + file); + } + // Prepare resolver, stylesheet + URIResolver fileResolver = getUriResolver(configuration, file); + String styleSheet = getStyleSheet(configuration.getModelType(), file); + URL xsl = Resource.getURL(styleSheet); + + //TC-20090820 : using recursive for xmi +// File result = new File(destDirModel, FileUtil.basename(file, +// acceptedSuffixes).concat(".").concat(getExtension())); + + String extension = "." + FileUtil.extension(file); + String filename = FileUtil.basename(file, extension).concat(".").concat(configuration.getModelType()); +// String filename = FileUtil.basename(file, extension).concat(".").concat(getExtension()); + String relatifPath = file.getParentFile().getAbsolutePath().substring(dir.getAbsolutePath().length()); + 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); + } + } + } + File result = new File(dstDir, filename); + if (!overwrite && file.lastModified() < result.lastModified()) { + getLog().info("file up-to-date : " + result); + continue; + } + if (getLog().isDebugEnabled()) { + getLog().debug("generate " + result); + } + + // Create the xsl transformer and set parameters + Transformer transformer = getTransformerFactory().newTransformer(new StreamSource(xsl.openStream())); + + transformer.setParameter(PROP_FULL_PACKAGE_PATH, getFullPackagePath()); + //transformer.setParameter("extraPackages", getExtractedPackages()); + + transformer.setURIResolver(fileResolver); + transformer.transform(new StreamSource(file), new StreamResult( + new FileOutputStream(result))); + + } catch (Exception e) { + throw new IOException(e.getMessage(), e); + } + } + } + + protected URIResolver getUriResolver(ChainedFileWriterConfiguration configuration, File model) { + URIResolver result = null; + + try { + ClassLoader loader = configuration.getClassLoader(); + Class<?> clazz = Class.forName(getResolver(), true, loader); + + // Try to set the base using the constructor + try { + // Look for a constructor with a String parameter (base) + Constructor<?> withBaseConstructor = clazz.getConstructor(String.class); + // Set the xmi folder as the base + String base = model.getParentFile().getAbsolutePath(); + // Instantiate + result = (URIResolver) withBaseConstructor.newInstance(base); + } catch (Exception eee) { + getLog().warn("Unable to instantiate resolver with String parameter", + eee); + } + + // If resolver is still not created, create it using the default + // constructor + if (result == null) { + result = (URIResolver) clazz.newInstance(); + } + + if (result instanceof ResourceResolver) { + ((ResourceResolver) result).setVerbose(configuration.isVerbose()); + ((ResourceResolver) result).setCl(loader); + if (result instanceof FasterCachedResourceResolver) { + boolean offline = configuration.isOffline(); + getLog().debug("using offline mode ? : " + offline); + ((FasterCachedResourceResolver) result).setOffline(offline); + } + } + + } catch (Exception eee) { + getLog().warn("Unable to instantiate resolver using the default constructor", eee); + } + + return result; + } + + protected String getStyleSheet(String modelType, File model) { + if (ObjectModel.NAME.equals(modelType)) { + String version = getXmiVersion(model); + String styleSheet = null; + if (version.startsWith("1.")) { + styleSheet = "xmi1.2ToObjectModel.xsl"; + } else if (version.startsWith("2.")) { + styleSheet = "xmi2.1ToObjectModel.xsl"; + } else { + getLog().error("Unsupported xmi version [" + version + "]"); + } + return styleSheet; + } + if (StateModel.NAME.equals(modelType)) { + //TODO when StateModel will be supported in 2.1, compute the version to resolve the correct stylesheet + return "xmi1.2ToStateModel.xsl"; + } + + throw new IllegalStateException("unsupported modelType [" + modelType + "]"); + } + + /** + * Try to find xmi version on a file. + * + * @param xmiFile file to inspect + * @return version or null if version can't have been found + */ + protected String getXmiVersion(File xmiFile) { + String version = null; + + SAXParserFactory factory = SAXParserFactory.newInstance(); + + try { + SAXParser parser = factory.newSAXParser(); + + XmiVersionHandler handler = new XmiVersionHandler(); + parser.parse(xmiFile, handler); + + version = handler.getVersion(); + } catch (ParserConfigurationException e) { + getLog().debug("Can't parse file as xmi", e); + } catch (SAXException e) { + getLog().debug("Can't parse file as xmi", e); + } catch (IOException e) { + getLog().debug("Can't parse file as xmi", e); + } + + return version; + } + + /** + * Sax handler to find xmi version into xmi document. + */ + protected class XmiVersionHandler extends DefaultHandler { + + protected String version = null; + + public XmiVersionHandler() { + super(); + } + + public String getVersion() { + return version; + } + + @Override + public void startElement(String uri, String localName, String qName, + Attributes attributes) throws SAXException { + + if (qName.equals("XMI")) { + version = attributes.getValue("xmi.version"); + getLog().debug("XMI version found : " + version); + } + + if (version == null) { + version = attributes.getValue("xmi:version"); + getLog().debug("XMI version found : " + version); + } + + } + } + + +} \ No newline at end of file Deleted: trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/XmiToObjectModelChainedFileWriter.java =================================================================== --- trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/XmiToObjectModelChainedFileWriter.java 2009-12-20 12:59:50 UTC (rev 773) +++ trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/XmiToObjectModelChainedFileWriter.java 2009-12-20 13:01:03 UTC (rev 774) @@ -1,135 +0,0 @@ -/* - * *##% - * EUGene :: Maven plugin - * Copyright (C) 2006 - 2009 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>. - * ##%* - */ -package org.nuiton.eugene.plugin.writer; - -import org.nuiton.eugene.models.Model; -import org.nuiton.eugene.models.object.ObjectModel; -import org.xml.sax.Attributes; -import org.xml.sax.SAXException; -import org.xml.sax.helpers.DefaultHandler; - -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.parsers.SAXParser; -import javax.xml.parsers.SAXParserFactory; -import java.io.File; -import java.io.IOException; - -/** - * To write a object model files from xmi files. - * <p/> - * This {@link org.nuiton.eugene.writer.ChainedFileWriter} transform xmi files to object model file. - * - * @author tchemit - * @plexus.component role="org.nuiton.eugene.writer.ChainedFileWriter" role-hint="xmi2objectmodel" - * @since 2.0.0 - */ -public class XmiToObjectModelChainedFileWriter extends BaseXmiToChainedFileWriter { - - @Override - public <M extends Model> boolean acceptModel(Class<M> modelType) { - // accept only state models - return ObjectModel.class.isAssignableFrom(modelType); - } - - @Override - public String getExtension() { - return "objectmodel"; - } - - @Override - protected String getStyleSheet(File model) { - String styleSheet = null; - - String version = getXmiVersion(model); - if (version.startsWith("1.")) { - styleSheet = "xmi1.2ToObjectModel.xsl"; - } else if (version.startsWith("2.")) { - styleSheet = "xmi2.1ToObjectModel.xsl"; - } else { - getLog().error("Unsupported xmi version [" + version + "]"); - } - - return styleSheet; - } - - /** - * Try to find xmi version on a file. - * - * @param xmiFile file to inspect - * @return version or null if version can't have been found - */ - protected String getXmiVersion(File xmiFile) { - String version = null; - - SAXParserFactory factory = SAXParserFactory.newInstance(); - - try { - SAXParser parser = factory.newSAXParser(); - - XmiVersionHandler handler = new XmiVersionHandler(); - parser.parse(xmiFile, handler); - - version = handler.getVersion(); - } catch (ParserConfigurationException e) { - getLog().debug("Can't parse file as xmi", e); - } catch (SAXException e) { - getLog().debug("Can't parse file as xmi", e); - } catch (IOException e) { - getLog().debug("Can't parse file as xmi", e); - } - - return version; - } - - /** - * Sax handler to find xmi version into xmi document. - */ - protected class XmiVersionHandler extends DefaultHandler { - - protected String version = null; - - public XmiVersionHandler() { - super(); - } - - public String getVersion() { - return version; - } - - @Override - public void startElement(String uri, String localName, String qName, - Attributes attributes) throws SAXException { - - if (qName.equals("XMI")) { - version = attributes.getValue("xmi.version"); - getLog().debug("XMI version found : " + version); - } - - if (version == null) { - version = attributes.getValue("xmi:version"); - getLog().debug("XMI version found : " + version); - } - - } - } - - -} Deleted: trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/XmiToStateModelChainedFileWriter.java =================================================================== --- trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/XmiToStateModelChainedFileWriter.java 2009-12-20 12:59:50 UTC (rev 773) +++ trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/XmiToStateModelChainedFileWriter.java 2009-12-20 13:01:03 UTC (rev 774) @@ -1,53 +0,0 @@ -/* - * *##% - * EUGene :: Maven plugin - * Copyright (C) 2006 - 2009 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>. - * ##%* - */ -package org.nuiton.eugene.plugin.writer; - -import org.nuiton.eugene.models.Model; -import org.nuiton.eugene.models.state.StateModel; - -import java.io.File; - -/** - * To write state model files from xmi files. - * - * @author tchemit - * @plexus.component role="org.nuiton.eugene.writer.ChainedFileWriter" role-hint="xmi2statemodel" - * @since 2.0.0 - */ -public class XmiToStateModelChainedFileWriter extends BaseXmiToChainedFileWriter { - - @Override - public <M extends Model> boolean acceptModel(Class<M> modelType) { - // accept only state models - return StateModel.class.isAssignableFrom(modelType); - } - - @Override - protected String getExtension() { - return "statemodel"; - } - - @Override - protected String getStyleSheet(File model) { - //TODO when StateModel will be supported in 2.1, compute the version to resolve the correct stylesheet - return "xmi1.2ToStateModel.xsl"; - } -} 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 2009-12-20 12:59:50 UTC (rev 773) +++ trunk/maven-eugene-plugin/src/main/java/org/nuiton/eugene/plugin/writer/ZargoChainedFileWriter.java 2009-12-20 13:01:03 UTC (rev 774) @@ -45,15 +45,15 @@ } @Override - public <M extends Model> String getOutputProtocol(Class<M> modelType) { + public String getOutputProtocol(String modelType) { // next writer to use is a xmi to model one return "xmi"; } @Override - public <M extends Model> boolean acceptModel(Class<M> modelType) { + public boolean acceptModel(String modelType) { // accept all models - return true; + return acceptObjectModelOrStateModel(modelType); } @Override