cayenne-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From kmen...@apache.org
Subject svn commit: r452701 - in /incubator/cayenne/main/trunk/other: ./ maven-plugin/ maven-plugin/src/ maven-plugin/src/main/ maven-plugin/src/main/java/ maven-plugin/src/main/java/org/ maven-plugin/src/main/java/org/apache/ maven-plugin/src/main/java/org/ap...
Date Wed, 04 Oct 2006 02:47:05 GMT
Author: kmenard
Date: Tue Oct  3 19:47:04 2006
New Revision: 452701

URL: http://svn.apache.org/viewvc?view=rev&rev=452701
Log:
Initial work on CAY-591: Add a class generator plugin for Maven 2.

Added:
    incubator/cayenne/main/trunk/other/maven-plugin/
    incubator/cayenne/main/trunk/other/maven-plugin/pom.xml
    incubator/cayenne/main/trunk/other/maven-plugin/src/
    incubator/cayenne/main/trunk/other/maven-plugin/src/main/
    incubator/cayenne/main/trunk/other/maven-plugin/src/main/java/
    incubator/cayenne/main/trunk/other/maven-plugin/src/main/java/org/
    incubator/cayenne/main/trunk/other/maven-plugin/src/main/java/org/apache/
    incubator/cayenne/main/trunk/other/maven-plugin/src/main/java/org/apache/cayenne/
    incubator/cayenne/main/trunk/other/maven-plugin/src/main/java/org/apache/cayenne/tools/
    incubator/cayenne/main/trunk/other/maven-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java
Modified:
    incubator/cayenne/main/trunk/other/pom.xml

Added: incubator/cayenne/main/trunk/other/maven-plugin/pom.xml
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/other/maven-plugin/pom.xml?view=auto&rev=452701
==============================================================================
--- incubator/cayenne/main/trunk/other/maven-plugin/pom.xml (added)
+++ incubator/cayenne/main/trunk/other/maven-plugin/pom.xml Tue Oct  3 19:47:04 2006
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+	Copyright 2006 The Apache Software Foundation
+
+	Licensed under the Apache License, Version 2.0 (the "License");
+	you may not use this file except in compliance with the License.
+	You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+	Unless required by applicable law or agreed to in writing, software
+	distributed under the License is distributed on an "AS IS" BASIS,
+	WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+	See the License for the specific language governing permissions and
+	limitations under the License.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	 <parent>
+		<artifactId>cayenne-other-parent</artifactId>
+		<groupId>org.apache.cayenne.other</groupId>
+		<version>3.0-incubating-SNAPSHOT</version>
+	</parent>
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>org.apache.cayenne.plugins</groupId>
+    <artifactId>cayenne-maven-plugin</artifactId>
+    <packaging>maven-plugin</packaging>
+    <name>Cayenne Maven Plugin</name>
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.maven</groupId>
+            <artifactId>maven-plugin-api</artifactId>
+            <version>2.0.4</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.maven</groupId>
+            <artifactId>maven-artifact</artifactId>
+            <version>2.0.4</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.maven</groupId>
+            <artifactId>maven-project</artifactId>
+            <version>2.0.4</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.maven</groupId>
+            <artifactId>maven-plugin-tools-api</artifactId>
+            <version>2.0.4</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.cayenne.core</groupId>
+            <artifactId>cayenne-jdk1.4</artifactId>
+            <version>${version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.cayenne.modeler</groupId>
+            <artifactId>cayenne-modeler</artifactId>
+            <version>${version}</version>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>foundrylogic.vpp</groupId>
+            <artifactId>vpp</artifactId>
+            <scope>compile</scope>
+        </dependency>
+
+        <!-- TODO: (KJM 10/03/2006) This should be a transitive dependency of vpp. -->
+        <dependency>
+            <groupId>ant</groupId>
+            <artifactId>ant</artifactId>
+            <scope>compile</scope>
+        </dependency>
+    </dependencies>
+</project>

Added: incubator/cayenne/main/trunk/other/maven-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/other/maven-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java?view=auto&rev=452701
==============================================================================
--- incubator/cayenne/main/trunk/other/maven-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java
(added)
+++ incubator/cayenne/main/trunk/other/maven-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java
Tue Oct  3 19:47:04 2006
@@ -0,0 +1,326 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.tools;
+
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugin.logging.Log;
+import org.apache.maven.project.MavenProject;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.EntityResolver;
+import org.apache.cayenne.map.MapLoader;
+import org.apache.cayenne.gen.DefaultClassGenerator;
+import org.apache.cayenne.util.Util;
+import org.xml.sax.InputSource;
+
+import java.io.File;
+import java.util.*;
+
+/**
+ * Maven mojo to perform class generation from data map. This class is an Maven adapter to
+ * DefaultClassGenerator class.
+ *
+ * @author Andrus Adamchik, Kevin Menard
+ * @since 3.0
+ *
+ * @phase generate-sources
+ * @goal cgen
+ */
+public class CayenneGeneratorMojo extends AbstractMojo
+{
+    /**
+     * Project instance used to add generated source code to the build.
+     *
+     * @parameter default-value="${project}"
+     * @required
+     * @readonly
+     */
+    private MavenProject project;
+
+    /**
+     * Path to additional DataMap XML files to use for class generation.
+     *
+     * @parameter expression="${cgen.additionalMaps}"
+     */
+    private File additionalMaps;
+
+    /**
+     * Whether we are generating classes for the client tier in a
+     * Remote Object Persistence application. Default is <code>false</code>.
+     *
+     * @parameter expression="${cgen.client}" default-value="false"
+     */
+    private boolean client;
+
+    /**
+     * 	Destination directory for Java classes (ignoring their package names).
+     *
+     * @parameter expression="${cgen.destDir}" default-value="${project.build.sourceDirectory}/java/generated-sources/cayenne"
+     */
+    private File destDir;
+
+    /**
+     * Specify generated file encoding if different from the default on current platform.
+     * Target encoding must be supported by the JVM running Maven build. Standard encodings
+     * supported by Java on all platforms are US-ASCII, ISO-8859-1, UTF-8, UTF-16BE,
+     * UTF-16LE, UTF-16. See Sun Java Docs for java.nio.charset.Charset for more information.
+     *
+     * @parameter expression="${cgen.encoding}"
+     */
+    private String encoding;
+
+    /**
+     * Entities (expressed as a perl5 regex) to exclude from template
+     * generation. (Default is to include all entities in the DataMap).
+     *
+     * @parameter expression="${cgen.excludeEntitiesPattern}"
+     */
+    private String excludeEntitiesPattern;
+
+    /**
+     * Entities (expressed as a perl5 regex) to include in template
+     * generation. (Default is to include all entities in the DataMap).
+     *
+     * @parameter expression="${cgen.includeEntitiesPattern}"
+     */
+    private String includeEntitiesPattern;
+
+    /**
+     * If set to <code>true</code>, will generate subclass/superclass pairs,
+     * with all generated code included in superclass (default is <code>true</code>).
+     *
+     * @parameter expression="${cgen.makePairs}" default-value="true"
+     */
+    private boolean makePairs;
+
+    /**
+     * DataMap XML file to use as a base for class generation.
+     *
+     * @parameter expression="${cgen.map}"
+     * @required
+     */
+    private File map;
+
+    /**
+     * Specifies generator iteration target. &quot;entity&quot; performs one iteration
for each selected entity.
+     * &quot;datamap&quot; performs one iteration per datamap (This is always one
iteration since cgen
+     * currently supports specifying one-and-only-one datamap). (Default is &quot;entity&quot;)
+     *
+     * @parameter expression="${cgen.mode}" default-value="entity"
+     */
+    private String mode;
+
+    /**
+     * Name of file for generated output. (Default is &quot;*.java&quot;)
+     *
+     * @parameter expression="${cgen.outputPattern}" default-value="*.java"
+     */
+    private String outputPattern;
+
+    /**
+     * 	If set to <code>true</code>, will overwrite older versions of generated
classes.
+     *  Ignored unless makepairs is set to <code>false</code>.
+     *
+     * @parameter expression="${cgen.overwrite}" default-value="false"
+     */
+    private boolean overwrite;
+
+    /**
+     * Java package name of generated superclasses. Ignored unless <code>makepairs</code>
+     * set to <code>true</code>.  If omitted, each superclass will be assigned
the same
+     * package as subclass. Note that having superclass in a different package would only
+     * make sense when <code>usepkgpath</code> is set to <code>true</code>.
Otherwise
+     * classes from different packages will end up in the same directory.
+     *
+     * @parameter expression="${cgen.superPkg}"
+     */
+    private String superPkg;
+
+    /**
+     * Location of Velocity template file for Java superclass generation. Ignored unless
+     * <code>makepairs</code> set to <code>true</code>. If omitted,
default template is used.
+     *
+     * @parameter expression="${cgen.superTemplate}"
+     */
+    private String superTemplate;
+
+    /**
+     * Location of Velocity template file for Java class generation. If omitted, default
template is used.
+     *
+     * @parameter expression="${cgen.template}"
+     */
+    private String template;
+
+    /**
+     * If set to <code>true</code> (default), a directory tree will be generated
in "destDir"
+     * corresponding to the class package structure, if set to <code>false</code>,
classes will
+     * be generated in &quot;destDir&quot; ignoring their package.
+     *
+     * @parameter expression="${cgen.usePkgPath}" default-value="true"
+     */
+    private boolean usePkgPath;
+
+    /**
+     * Specifies template location and generator behavior. &quot;1.1&quot; is the
old behavior,
+     * with templates located in &quot;dotemplates&quot; and &quot;classgen&quot;
as the only
+     * velocity context attribute. &quot;1.2&quot; is the new behavior, with templates
located
+     * in &quot;dotemplates/v1.2&quot; and &quot;objEntity&quot;, &quot;entityUtils&quot;,
+     * &quot;stringUtils&quot;, and &quot;importUtils&quot; in the velocity
context. (Default is &quot;1.2&quot;.)
+     *
+     * @parameter expression="${cgen.version}" default-value="1.1"
+     */
+    private String version;
+
+    private DefaultClassGenerator generator;
+
+    public void execute() throws MojoExecutionException, MojoFailureException
+    {
+        // Create the destination directory if necessary.
+        if (!destDir.exists())
+        {
+            destDir.mkdirs();
+        }
+
+        generator = createGenerator();
+
+        try {
+            processMap();
+        }
+        catch (Throwable th) {
+            th = Util.unwindException(th);
+
+            String thMessage = th.getLocalizedMessage();
+            String message = "Error generating classes: ";
+            message += (!Util.isEmptyString(thMessage)) ? thMessage : th
+                    .getClass()
+                    .getName();
+
+            this.getLog().error(message);
+
+            throw new MojoExecutionException(message, th);
+        }
+    }
+
+
+    protected void processMap() throws Exception {
+
+        DataMap dataMap = loadDataMap();
+        DataMap additionalDataMaps[] = loadAdditionalDataMaps();
+
+        // Create MappingNamespace for maps.
+        EntityResolver entityResolver = new EntityResolver(Collections.singleton(dataMap));
+        dataMap.setNamespace(entityResolver);
+        for (int i = 0; i < additionalDataMaps.length; i++) {
+            entityResolver.addDataMap(additionalDataMaps[i]);
+            additionalDataMaps[i].setNamespace(entityResolver);
+        }
+
+        Collection allEntities = dataMap.getObjEntities();
+        List filteredEntities = new ArrayList(allEntities.size());
+
+        // filter client entities
+        if (generator.isClient()) {
+            if (dataMap.isClientSupported()) {
+                Iterator it = allEntities.iterator();
+                while (it.hasNext()) {
+                    ObjEntity entity = (ObjEntity) it.next();
+                    if (entity.isClientAllowed()) {
+                        filteredEntities.add(entity);
+                    }
+                }
+            }
+        } else {
+            filteredEntities.addAll(allEntities);
+        }
+
+        // filter names according to the specified pattern
+        NamePatternMatcher namePatternMatcher = new NamePatternMatcher(
+                // TODO: (KJM 10/03/2006) NamePatternMatcher should be updated to not depend
on Ant.
+                null,
+                includeEntitiesPattern,
+                excludeEntitiesPattern);
+        namePatternMatcher.filter(filteredEntities);
+
+        generator.setTimestamp(map.lastModified());
+        generator.setDataMap(dataMap);
+        generator.setObjEntities(filteredEntities);
+        generator.validateAttributes();
+        generator.execute();
+    }
+
+    /**
+     * Loads and returns a DataMap by File.
+     */
+    protected DataMap loadDataMap(File mapName) throws Exception {
+        InputSource in = new InputSource(mapName.getCanonicalPath());
+        return new MapLoader().loadDataMap(in);
+    }
+
+    /**
+     * Loads and returns DataMap based on <code>map</code> attribute.
+     */
+    protected DataMap loadDataMap() throws Exception {
+        return loadDataMap(map);
+    }
+
+    /**
+     * Loads and returns DataMap based on <code>map</code> attribute.
+     */
+    protected DataMap[] loadAdditionalDataMaps() throws Exception {
+        if (null == additionalMaps) {
+            return new DataMap[0];
+        }
+
+        if (!additionalMaps.isDirectory()) {
+            throw new MojoFailureException("'additionalMaps' must be a directory containing
only datamap files.");
+        }
+
+        String[] maps = additionalMaps.list();
+        DataMap dataMaps[] = new DataMap[maps.length];
+        for (int i = 0; i < maps.length; i++) {
+            dataMaps[i] = loadDataMap(new File(maps[i]));
+        }
+        return dataMaps;
+    }
+
+    /**
+     * Factory method to create internal class generator. Called from constructor.
+     */
+    protected DefaultClassGenerator createGenerator() {
+        DefaultClassGenerator gen = new DefaultClassGenerator();
+
+        gen.setClient(client);
+        gen.setDestDir(destDir);
+        gen.setEncoding(encoding);
+        gen.setMakePairs(makePairs);
+        gen.setMode(mode);
+        gen.setOutputPattern(outputPattern);
+        gen.setOverwrite(overwrite);
+        gen.setSuperPkg(superPkg);
+        gen.setSuperTemplate(superTemplate);
+        gen.setTemplate(template);
+        gen.setUsePkgPath(usePkgPath);
+        gen.setVersionString(version);
+
+        return gen;
+    }
+}

Modified: incubator/cayenne/main/trunk/other/pom.xml
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/other/pom.xml?view=diff&rev=452701&r1=452700&r2=452701
==============================================================================
--- incubator/cayenne/main/trunk/other/pom.xml (original)
+++ incubator/cayenne/main/trunk/other/pom.xml Tue Oct  3 19:47:04 2006
@@ -37,6 +37,7 @@
       <module>cayenne-regression-profiler</module>
       <module>cayenne-build-tools</module>
       <module>confluence-maven-plugin</module>
+      <module>maven-plugin</module>
     </modules>
 
 </project>



Mime
View raw message