[Lutingenerator-commits] r463 - lutingenerator/trunk/src/main/java/org/codelutin/generator
Author: nrannou Date: 2009-03-06 10:51:39 +0000 (Fri, 06 Mar 2009) New Revision: 463 Modified: lutingenerator/trunk/src/main/java/org/codelutin/generator/GeneratorTask.java Log: Chaine de conversion ZIP -> XMI -> ObjectModel -> Java Modified: lutingenerator/trunk/src/main/java/org/codelutin/generator/GeneratorTask.java =================================================================== --- lutingenerator/trunk/src/main/java/org/codelutin/generator/GeneratorTask.java 2009-03-04 09:38:47 UTC (rev 462) +++ lutingenerator/trunk/src/main/java/org/codelutin/generator/GeneratorTask.java 2009-03-06 10:51:39 UTC (rev 463) @@ -15,26 +15,42 @@ * License along with this program. If not, see * <http://www.gnu.org/licenses/lgpl-3.0.html>. ##%*/ -/* * - * .java - * - * - */ - package org.codelutin.generator; -import org.apache.tools.ant.BuildException; -import org.apache.tools.ant.DirectoryScanner; -import org.apache.tools.ant.taskdefs.MatchingTask; - import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; +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 org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.DirectoryScanner; +import org.apache.tools.ant.taskdefs.MatchingTask; +import org.apache.tools.ant.types.Path; +import org.codelutin.util.Resource; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + /** * Ant generator Task. * @@ -42,21 +58,24 @@ * * <pre> * <taskdef name="generator" classname="org.codelutin.generator.GeneratorTask" - * classpath="lib/lutingenerator-0.64.jar" /> + * classpath="${compile.classpath}:${targetbuild}:${resources}" /> * - * <generator - * template="org.codelutin.generator.generators.persistence.TopiaModelToDTOGenerator.java,org.codelutin.generator.generators.persistence.TopiaModelToTJDOGenerator.java" - * destdir="target/gen/java" srcdir="target/gen/model" /> + * <target name="generate" depends="pre-compile" description="generate"> + * <generator srcdir="${modelDir}" destdir="${targetgen}" + * resolver="ResourceResolver" + * templates="ClassInfoGenerator,JavaBeanGenerator" + * properties="defaultPackage=org.codelutin,fullPackagePath=org.codelutin,extraPackages=org.codelutin" + * classpath="${compile.classpath}:${targetbuild}:${resources}" /> + * </target> * </pre> * * Created: 14 janv. 2004 - * - * @author Benjamin Poussin <poussin@codelutin.com> - * Copyright Code Lutin + * + * @author Benjamin Poussin <poussin@codelutin.com> Copyright Code Lutin * @version $Revision$ - * - * Mise a jour: $Date$ - * par : $Author$ + * + * Mise a jour: $Date$ + * par : $Author$ */ public class GeneratorTask extends MatchingTask { // GeneratorTask @@ -75,20 +94,28 @@ /** Destination directory. */ protected File destDir = null; + /** URI Resolver. */ + protected String resolver = null; + /** Additional generator properties. */ protected Properties properties = new Properties(); /** Overwrite already existing generated files. */ protected boolean overwrite = true; - /** customized classloader. */ - protected ClassLoader loader; + /** + * Ant classpath to use. + */ + private Path classpath = null; /** Enconding. Default to UTF-8. */ protected String encoding = "UTF-8"; - + + /** log. */ + private static final Log log = LogFactory.getLog(GeneratorTask.class); + public GeneratorTask() { - + } protected void doExecute(File srcFile, File destDir, Generator[] generators) @@ -99,13 +126,20 @@ protected void doExecute(File[] srcFiles, File destDir, Generator[] generators) throws BuildException { + + srcFiles = doConvertFiles(srcFiles, destDir); + for (Generator generator : generators) { if (generator != null) { log("Applying " + generator.getClass().getName() + " into " + destDir); generator.setProperties(properties); generator.setOverwrite(overwrite); - generator.generate(srcFiles, destDir); + for (int i = 0; i < srcFiles.length; i++) { + if (srcFiles[i].getName().endsWith(".objectmodel")) { + generator.generate(srcFiles[i], destDir); + } + } } } } @@ -127,8 +161,32 @@ } /** + * Set the optional classpath to the XSL processor + * + * @param classpath + * the classpath to use when loading the XSL processor + */ + public void setClasspath(Path classpath) { + createClasspath().append(classpath); + } + + /** + * Set the optional classpath to the XSL processor + * + * @return a path instance to be configured by the Ant core. + */ + public Path createClasspath() { + if (classpath == null) { + classpath = new Path(getProject()); + } + return classpath.createPath(); + } + + /** * Permet d'ajouter des properties. exemple: toto=1,package=org.codelutin - * @param properties properties + * + * @param properties + * properties */ public void setProperties(String properties) { String[] props = properties.split(","); @@ -152,8 +210,8 @@ this.srcFile = srcFile; } - public void setLoader(ClassLoader loader) { - this.loader = loader; + public void setResolver(String resolver) { + this.resolver = resolver; } @Override @@ -166,7 +224,8 @@ List<String> templateGenerators = Arrays.asList(templates.split(",")); for (Iterator<String> it = templateGenerators.iterator(); it.hasNext();) { String templateGenerator = it.next(); - if (excludeTemplates != null && excludeTemplates.contains(templateGenerator)) { + if (excludeTemplates != null + && excludeTemplates.contains(templateGenerator)) { it.remove(); } } @@ -176,7 +235,8 @@ try { generators[i] = newGeneratorInstance(templateName); - //generators[i] = (Generator) Class.forName(templateName).newInstance(); + // generators[i] = (Generator) + // Class.forName(templateName).newInstance(); generators[i].setExcludeTemplates(excludeTemplates); generators[i].setEncoding(encoding); @@ -237,16 +297,208 @@ } } + private File[] doConvertFiles(File[] srcFiles, File destDir) { + List<File> result = new ArrayList<File>(); + for (File file : srcFiles) { + if (file.getName().endsWith(".objectmodel")) { + result.add(file); + } else { + + File xmiFile = null; + String xmiVersion = null; + String destFileName = file.getName().substring(0, + file.getName().lastIndexOf('.')); + File destUnZipDir = new File("tmp-" + destFileName); + + // unzip files + if (file.getName().endsWith(".zargo") + || file.getName().endsWith(".zuml")) { + + // destination folder + destUnZipDir.mkdir(); + + unzip(file, destUnZipDir); + + xmiFile = new File(destUnZipDir.getAbsolutePath() + + File.separator + destFileName + ".xmi"); + } else if (file.getName().endsWith(".uml") + || file.getName().endsWith(".xmi")) { + xmiFile = file; + } + + System.out.println(xmiFile); + + // XMI to ObjectModel + xmiVersion = getXmiVersion(xmiFile); + String omFileName = srcDir + File.separator + destFileName + + ".objectmodel"; + if (xmiVersion.equals("1.2")) { + XMLtransform(xmiFile.getAbsolutePath(), omFileName, + "xmi1.2ToObjectModel.xsl"); + } else if (xmiVersion.equals("2.1")) { + XMLtransform(xmiFile.getAbsolutePath(), omFileName, + "xmi2.1ToObjectModel.xsl"); + } + + result.add(new File(omFileName)); + + // delete unzipped files + if (file.getName().endsWith(".zargo") + || file.getName().endsWith(".zuml")) { + + delete(destUnZipDir); + } + + } + } + return result.toArray(new File[result.size()]); + } + + private void unzip(File zipFile, File destFile) { + try { + + // uncompress zip archive + ZipInputStream zipin = new ZipInputStream(new FileInputStream( + zipFile)); + ZipEntry zipe = null; + while ((zipe = zipin.getNextEntry()) != null) { + FileOutputStream fileout = new FileOutputStream(destFile + .getAbsolutePath() + + File.separator + zipe.getName()); + + // write current file + byte[] buf = new byte[1024]; + int rsize; + while ((rsize = zipin.read(buf)) > -1) + fileout.write(buf, 0, rsize); + + zipin.closeEntry(); + fileout.close(); + } + zipin.close(); + } catch (Exception e) { + System.out.println("Unzip error"); + e.printStackTrace(); + } + } + + private void delete(File dir) { + if (dir.exists()) { + File[] files = dir.listFiles(); + for (int i = 0; i < files.length; i++) { + if (files[i].isDirectory()) { + delete(files[i]); + } else { + files[i].delete(); + } + } + } + dir.delete(); + } + + private String getXmiVersion(File XMIFile) { + String version = null; + try { + SAXParserFactory fabrique = SAXParserFactory.newInstance(); + SAXParser parser = fabrique.newSAXParser(); + + DefaultHandler handler = new XmiVersionHandler(); + parser.parse(XMIFile, handler); + + } catch (Exception e) { + version = e.getMessage(); + } + return version; + } + + private class XmiVersionHandler extends DefaultHandler { + public String version = null; + + public XmiVersionHandler() { + super(); + } + + public void startElement(String uri, String localName, String qName, + Attributes attributes) throws SAXException { + + if (qName.equals("XMI")) { + version = attributes.getValue("xmi.version"); + } + if (version == null) { + version = attributes.getValue("xmi:version"); + } + + if (log.isInfoEnabled()) { + log.info("XMI version found : " + version); + } + throw new SAXException(version); + } + + public void startDocument() throws SAXException { + if (log.isInfoEnabled()) { + log.info("Parsing XMI version..."); + } + } + + public void endDocument() throws SAXException { + if (log.isInfoEnabled()) { + log.info("XMI version not found"); + } + } + } + + private void XMLtransform(String xmlFrom, String xmlTo, String xsl) { + + if (log.isDebugEnabled()) { + log.debug("XMLtransform : java.class.path = " + + System.getProperty("java.class.path")); + } + + // Transformation XSL + try { + //AntClassLoader loader = getProject().createClassLoader(classpath); + //loader.setThreadContextLoader(); + String[] jars = classpath.list(); + URL[] jarsURL = new URL[jars.length]; + for (int i = 0; i < jars.length; i++) { + jarsURL[i] = new File(jars[i]).toURI().toURL(); + } + + URLClassLoader urlLoader = new URLClassLoader(jarsURL); + + URIResolver tresolver = (URIResolver) Class.forName(resolver, true, + urlLoader).newInstance(); + + // FIXME remove hard coded factory name + TransformerFactory tfabrique = TransformerFactory.newInstance( + "org.apache.xalan.processor.TransformerFactoryImpl", + urlLoader); + + URL uxsl = Resource.getURL(xsl); + StreamSource stylesource = new StreamSource(uxsl.openStream()); + Transformer transformer = tfabrique.newTransformer(stylesource); + transformer.setParameter("fullPackagePath", properties + .getProperty("fullPackagePath")); + transformer.setParameter("extraPackages", properties + .getProperty("extraPackages")); + transformer.setURIResolver(tresolver); + if (log.isInfoEnabled()) { + log.info("FROM: " + xmlFrom); + log.info("TO: " + xmlTo); + } + transformer.transform(new StreamSource(xmlFrom), new StreamResult( + xmlTo)); + } catch (Exception e) { + System.out.println("Transformation error"); + e.printStackTrace(); + } + } + protected Generator newGeneratorInstance(String fqn) throws ClassNotFoundException, IllegalAccessException, InstantiationException { - Generator newInstance = null; - if (loader == null) { - newInstance = (Generator) Class.forName(fqn).newInstance(); - } else { - newInstance = (Generator) Class.forName(fqn, true, loader) - .newInstance(); - } + Generator newInstance = (Generator) Class.forName(fqn).newInstance(); + return newInstance; } } // GeneratorTask
participants (1)
-
nrannouļ¼ users.labs.libre-entreprise.org