You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2007/12/02 18:15:26 UTC
svn commit: r600341 - in /cayenne/main/trunk/framework:
cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/gen/
cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/tools/
maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/
Author: aadamchik
Date: Sun Dec 2 09:15:25 2007
New Revision: 600341
URL: http://svn.apache.org/viewvc?rev=600341&view=rev
Log:
CAY-926 Refactoring class generator classes
(replacing CayenneGeneratorUtil with CayenneGeneratorMapLoader to streamline generation flow)
Added:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/gen/TemplateProcessor.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/gen/TemplateProcessor1_1.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/tools/CayenneGenerationMapLoader.java
cayenne/main/trunk/framework/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/MavenLogger.java
Removed:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/tools/CayenneGeneratorUtil.java
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/gen/ClassGenerator.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/gen/DefaultClassGenerator.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/gen/MapClassGenerator.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/tools/CayenneGeneratorTask.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/tools/NamePatternMatcher.java
cayenne/main/trunk/framework/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/gen/ClassGenerator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/gen/ClassGenerator.java?rev=600341&r1=600340&r2=600341&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/gen/ClassGenerator.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/gen/ClassGenerator.java Sun Dec 2 09:15:25 2007
@@ -41,6 +41,7 @@
* "classGen".
*
* @author Andrus Adamchik
+ * @deprecated since 3.0 use {@link TemplateProcessor}.
*/
public class ClassGenerator {
@@ -146,7 +147,7 @@
* Generates Java code for the ObjEntity. Output is written to the provided Writer.
*/
public void generateClass(Writer out, ObjEntity entity) throws Exception {
-
+
if (!VERSION_1_1.equals(versionString)) {
throw new IllegalStateException(
"Illegal Version in generateClass(Writer,ObjEntity): "
@@ -167,7 +168,7 @@
String fqnBaseClass,
String fqnSuperClass,
String fqnSubClass) throws Exception {
-
+
if (!VERSION_1_2.equals(versionString)) {
throw new IllegalStateException(
"Illegal Version in generateClass(Writer,ObjEntity,String,String,String): "
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/gen/DefaultClassGenerator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/gen/DefaultClassGenerator.java?rev=600341&r1=600340&r2=600341&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/gen/DefaultClassGenerator.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/gen/DefaultClassGenerator.java Sun Dec 2 09:15:25 2007
@@ -40,6 +40,8 @@
*/
public class DefaultClassGenerator extends MapClassGenerator {
+ private static final String WILDCARD = "*";
+
protected File destDir;
protected boolean overwrite;
protected boolean usePkgPath = true;
@@ -47,7 +49,6 @@
protected String template;
protected String superTemplate;
protected long timestamp = System.currentTimeMillis();
- private static final String WILDCARD = "*";
protected String outputPattern = "*.java";
/**
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/gen/MapClassGenerator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/gen/MapClassGenerator.java?rev=600341&r1=600340&r2=600341&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/gen/MapClassGenerator.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/gen/MapClassGenerator.java Sun Dec 2 09:15:25 2007
@@ -88,6 +88,9 @@
public MapClassGenerator() {
}
+ /**
+ * @deprecated since 3.0 - unused.
+ */
public MapClassGenerator(DataMap dataMap) {
this(dataMap, new ArrayList<ObjEntity>(dataMap.getObjEntities()));
}
@@ -379,6 +382,8 @@
/**
* Runs class generation. Produces a single Java class for each ObjEntity in the map.
* Uses default Cayenne templates for classes.
+ *
+ * @deprecated since 3.0 - unused.
*/
public void generateSingleClasses() throws Exception {
generateSingleClasses(defaultSingleClassTemplate(), SUPERCLASS_PREFIX);
Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/gen/TemplateProcessor.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/gen/TemplateProcessor.java?rev=600341&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/gen/TemplateProcessor.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/gen/TemplateProcessor.java Sun Dec 2 09:15:25 2007
@@ -0,0 +1,130 @@
+/*****************************************************************
+ * 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.gen;
+
+import java.io.Writer;
+import java.util.Properties;
+
+import org.apache.cayenne.CayenneRuntimeException;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.velocity.Template;
+import org.apache.velocity.VelocityContext;
+import org.apache.velocity.app.VelocityEngine;
+import org.apache.velocity.context.Context;
+import org.apache.velocity.runtime.RuntimeConstants;
+import org.apache.velocity.runtime.log.NullLogSystem;
+
+import foundrylogic.vpp.VPPConfig;
+
+/**
+ * Encapsulates a class generation template that can be used repeatedly to generate a set
+ * of classes.
+ *
+ * @since 3.0
+ * @author Andrus Adamchik
+ */
+// This class is used for version 1.2 of the class generation. Backwards compatibility (v
+// 1.1) is implemented via subclasses.
+public class TemplateProcessor {
+
+ protected Template classTemplate;
+ protected Context velocityContext;
+
+ /**
+ * Only used by deprecated subclasses.
+ *
+ * @deprecated since 3.0.
+ */
+ protected TemplateProcessor() throws Exception {
+ }
+
+ public TemplateProcessor(String template, VPPConfig vppConfig) throws Exception {
+
+ if (vppConfig != null) {
+ velocityContext = vppConfig.getVelocityContext();
+ }
+ else {
+ velocityContext = new VelocityContext();
+ }
+
+ initializeClassTemplate(template);
+ }
+
+ /**
+ * Sets up VelocityEngine properties, creates a VelocityEngine instance, and fetches a
+ * template using the VelocityEngine instance.
+ *
+ * @since 1.2
+ */
+ protected void initializeClassTemplate(String template)
+ throws CayenneRuntimeException {
+
+ Properties props = new Properties();
+
+ // null logger that will prevent velocity.log from being generated
+ props.put(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS, NullLogSystem.class
+ .getName());
+ props.put("resource.loader", "cayenne");
+ props.put("cayenne.resource.loader.class", ClassGeneratorResourceLoader.class
+ .getName());
+
+ VelocityEngine velocityEngine = new VelocityEngine();
+ try {
+ velocityEngine.init(props);
+ }
+ catch (Exception ex) {
+ throw new CayenneRuntimeException("Can't initialize Velocity", ex);
+ }
+
+ try {
+ classTemplate = velocityEngine.getTemplate(template);
+ }
+ catch (Exception ex) {
+ throw new CayenneRuntimeException("Can't create template: " + template, ex);
+ }
+ }
+
+ /**
+ * Generates Java code for the ObjEntity, writing output to the provided Writer.
+ */
+ public void generateClass(
+ Writer out,
+ DataMap dataMap,
+ ObjEntity entity,
+ String fqnBaseClass,
+ String fqnSuperClass,
+ String fqnSubClass) throws Exception {
+
+ if (dataMap == null) {
+ throw new IllegalStateException("DataMap is null.");
+ }
+
+ velocityContext.put("objEntity", entity);
+ velocityContext.put("stringUtils", StringUtils.getInstance());
+ velocityContext.put("entityUtils", new EntityUtils(
+ dataMap,
+ entity,
+ fqnBaseClass,
+ fqnSuperClass,
+ fqnSubClass));
+ velocityContext.put("importUtils", new ImportUtils());
+ classTemplate.merge(velocityContext, out);
+ }
+}
Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/gen/TemplateProcessor1_1.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/gen/TemplateProcessor1_1.java?rev=600341&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/gen/TemplateProcessor1_1.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/gen/TemplateProcessor1_1.java Sun Dec 2 09:15:25 2007
@@ -0,0 +1,56 @@
+/*****************************************************************
+ * 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.gen;
+
+import java.io.Writer;
+
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.velocity.VelocityContext;
+
+/**
+ * Encapsulates a legacy class generation template.
+ *
+ * @deprecated since 3.0
+ * @author Andrus Adamchik
+ */
+class TemplateProcessor1_1 extends TemplateProcessor {
+
+ private ClassGenerationInfo classGenerationInfo;
+
+ TemplateProcessor1_1(String template) throws Exception {
+
+ this.classGenerationInfo = new ClassGenerationInfo();
+ this.velocityContext = new VelocityContext();
+ velocityContext.put("classGen", classGenerationInfo);
+
+ initializeClassTemplate(template);
+ }
+
+ /**
+ * Generates Java code for the ObjEntity. Output is written to the provided Writer.
+ */
+ void generateClass(Writer out, ObjEntity entity) throws Exception {
+ classGenerationInfo.setObjEntity(entity);
+ classTemplate.merge(velocityContext, out);
+ }
+
+ ClassGenerationInfo getClassGenerationInfo() {
+ return classGenerationInfo;
+ }
+}
Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/tools/CayenneGenerationMapLoader.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/tools/CayenneGenerationMapLoader.java?rev=600341&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/tools/CayenneGenerationMapLoader.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/tools/CayenneGenerationMapLoader.java Sun Dec 2 09:15:25 2007
@@ -0,0 +1,120 @@
+/*****************************************************************
+ * 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 java.io.File;
+import java.net.MalformedURLException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.EntityResolver;
+import org.apache.cayenne.map.MapLoader;
+import org.apache.cayenne.map.ObjEntity;
+import org.xml.sax.InputSource;
+
+/**
+ * Provides DataMap loading and ObjEntity filtering functionality to the class generation tasks.
+ *
+ * @since 3.0
+ * @author Andrus Adamchik
+ */
+class CayenneGenerationMapLoader {
+
+ private File mainDataMapFile;
+ private File[] additionalDataMapFiles;
+ private NamePatternMatcher nameFilter;
+ private boolean client;
+
+ private DataMap mainDataMap;
+
+ DataMap getMainDataMap() throws MalformedURLException {
+ if (mainDataMap == null) {
+ MapLoader mapLoader = new MapLoader();
+
+ DataMap mainDataMap = loadDataMap(mapLoader, mainDataMapFile);
+
+ if (additionalDataMapFiles != null) {
+
+ EntityResolver entityResolver = new EntityResolver();
+ entityResolver.addDataMap(mainDataMap);
+ mainDataMap.setNamespace(entityResolver);
+
+ for (int i = 0; i < additionalDataMapFiles.length; i++) {
+
+ DataMap dataMap = loadDataMap(mapLoader, additionalDataMapFiles[i]);
+ entityResolver.addDataMap(dataMap);
+ dataMap.setNamespace(entityResolver);
+ }
+ }
+
+ this.mainDataMap = mainDataMap;
+ }
+
+ return mainDataMap;
+ }
+
+ Collection<ObjEntity> getFilteredEntities() throws MalformedURLException {
+
+ List<ObjEntity> entities = new ArrayList<ObjEntity>(getMainDataMap()
+ .getObjEntities());
+
+ // filter out excluded entities...
+ Iterator<ObjEntity> it = entities.iterator();
+
+ while (it.hasNext()) {
+ ObjEntity e = it.next();
+ if (e.isGeneric()) {
+ it.remove();
+ }
+ else if (client && !e.isClientAllowed()) {
+ it.remove();
+ }
+ else if (!nameFilter.isIncluded(e.getName())) {
+ it.remove();
+ }
+ }
+
+ return entities;
+ }
+
+ protected DataMap loadDataMap(MapLoader mapLoader, File dataMapFile)
+ throws MalformedURLException {
+ InputSource in = new InputSource(dataMapFile.toURL().toString());
+ return mapLoader.loadDataMap(in);
+ }
+
+ void setMainDataMapFile(File mainDataMapFile) {
+ this.mainDataMapFile = mainDataMapFile;
+ }
+
+ void setAdditionalDataMapFiles(File[] additionalDataMapFiles) {
+ this.additionalDataMapFiles = additionalDataMapFiles;
+ }
+
+ void setClient(boolean client) {
+ this.client = client;
+ }
+
+ public void setNameFilter(NamePatternMatcher nameFilter) {
+ this.nameFilter = nameFilter;
+ }
+}
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/tools/CayenneGeneratorTask.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/tools/CayenneGeneratorTask.java?rev=600341&r1=600340&r2=600341&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/tools/CayenneGeneratorTask.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/tools/CayenneGeneratorTask.java Sun Dec 2 09:15:25 2007
@@ -19,9 +19,11 @@
package org.apache.cayenne.tools;
import java.io.File;
+import java.util.List;
import org.apache.cayenne.gen.ClassGenerator;
import org.apache.cayenne.gen.DefaultClassGenerator;
+import org.apache.cayenne.map.ObjEntity;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.types.Path;
@@ -42,11 +44,8 @@
protected File additionalMaps[];
protected DefaultClassGenerator generator;
- protected CayenneGeneratorUtil generatorUtil;
-
public CayenneGeneratorTask() {
generator = createGenerator();
- generatorUtil = new CayenneGeneratorUtil();
}
/**
@@ -70,16 +69,21 @@
generator.setVppConfig(vppConfig);
}
- // Initialize the util generator state.
- generatorUtil.setAdditionalMaps(additionalMaps);
- generatorUtil.setExcludeEntitiesPattern(excludeEntitiesPattern);
- generatorUtil.setGenerator(generator);
- generatorUtil.setIncludeEntitiesPattern(includeEntitiesPattern);
- generatorUtil.setLogger(new AntTaskLogger(this));
- generatorUtil.setMap(map);
+ ILog logger = new AntTaskLogger(this);
+ CayenneGenerationMapLoader mapLoader = new CayenneGenerationMapLoader();
+ mapLoader.setNameFilter(new NamePatternMatcher(
+ logger,
+ includeEntitiesPattern,
+ excludeEntitiesPattern));
+ mapLoader.setMainDataMapFile(map);
+ mapLoader.setAdditionalDataMapFiles(additionalMaps);
try {
- generatorUtil.execute();
+ generator.setTimestamp(map.lastModified());
+ generator.setDataMap(mapLoader.getMainDataMap());
+ generator.setObjEntities((List<ObjEntity>) mapLoader.getFilteredEntities());
+ generator.validateAttributes();
+ generator.execute();
}
catch (Exception e) {
throw new BuildException(e);
@@ -87,8 +91,8 @@
}
/**
- * Validates attributes that are not related to internal DefaultClassGenerator.
- * Throws BuildException if attributes are invalid.
+ * Validates attributes that are not related to internal DefaultClassGenerator. Throws
+ * BuildException if attributes are invalid.
*/
protected void validateAttributes() throws BuildException {
if (map == null && this.getProject() == null) {
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/tools/NamePatternMatcher.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/tools/NamePatternMatcher.java?rev=600341&r1=600340&r2=600341&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/tools/NamePatternMatcher.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/tools/NamePatternMatcher.java Sun Dec 2 09:15:25 2007
@@ -41,9 +41,8 @@
protected Pattern[] itemIncludeFilters;
protected Pattern[] itemExcludeFilters;
- public NamePatternMatcher(ILog parentTask, String includePattern,
- String excludePattern) {
- this.logger = parentTask;
+ public NamePatternMatcher(ILog logger, String includePattern, String excludePattern) {
+ this.logger = logger;
this.itemIncludeFilters = createPatterns(includePattern);
this.itemExcludeFilters = createPatterns(excludePattern);
}
@@ -128,10 +127,34 @@
}
/**
+ * Returns true if a given object property satisfies the include/exclude patterns.
+ *
+ * @since 3.0
+ */
+ public boolean isIncluded(String string) {
+
+ if ((itemIncludeFilters.length == 0) && (itemExcludeFilters.length == 0)) {
+ return true;
+ }
+
+ if (!passedIncludeFilter(string)) {
+ return false;
+ }
+
+ if (!passedExcludeFilter(string)) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
* Applies preconfigured list of filters to the list, removing entities that do not
* pass the filter.
+ *
+ * @deprecated since 3.0
*/
- protected List filter(List items) {
+ protected List<?> filter(List<?> items) {
if (items == null || items.isEmpty()) {
return items;
}
@@ -140,7 +163,7 @@
return items;
}
- Iterator it = items.iterator();
+ Iterator<?> it = items.iterator();
while (it.hasNext()) {
CayenneMapEntry entity = (CayenneMapEntry) it.next();
@@ -159,8 +182,50 @@
}
/**
+ * Returns true if an object matches any one of the "include" patterns, or if there is
+ * no "include" patterns defined.
+ *
+ * @since 3.0
+ */
+ boolean passedIncludeFilter(String item) {
+ if (itemIncludeFilters.length == 0) {
+ return true;
+ }
+
+ for (int i = 0; i < itemIncludeFilters.length; i++) {
+ if (itemIncludeFilters[i].matcher(item).find()) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Returns true if an object does not match any one of the "exclude" patterns, or if
+ * there is no "exclude" patterns defined.
+ *
+ * @since 3.0
+ */
+ boolean passedExcludeFilter(String item) {
+ if (itemExcludeFilters.length == 0) {
+ return true;
+ }
+
+ for (int i = 0; i < itemExcludeFilters.length; i++) {
+ if (itemExcludeFilters[i].matcher(item).find()) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
* Returns true if the entity matches any one of the "include" patterns, or if there
* is no "include" patterns defined.
+ *
+ * @deprecated since 3.0
*/
protected boolean passedIncludeFilter(CayenneMapEntry item) {
if (itemIncludeFilters.length == 0) {
@@ -180,6 +245,8 @@
/**
* Returns true if the entity does not match any one of the "exclude" patterns, or if
* there is no "exclude" patterns defined.
+ *
+ * @deprecated since 3.0
*/
protected boolean passedExcludeFilter(CayenneMapEntry item) {
if (itemExcludeFilters.length == 0) {
Modified: cayenne/main/trunk/framework/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java?rev=600341&r1=600340&r2=600341&view=diff
==============================================================================
--- cayenne/main/trunk/framework/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java (original)
+++ cayenne/main/trunk/framework/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java Sun Dec 2 09:15:25 2007
@@ -19,281 +19,256 @@
package org.apache.cayenne.tools;
+import java.io.File;
+import java.util.List;
+
+import org.apache.cayenne.gen.DefaultClassGenerator;
+import org.apache.cayenne.map.ObjEntity;
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.gen.DefaultClassGenerator;
-
-import java.io.File;
/**
- * Maven mojo to perform class generation from data map. This class is an Maven adapter to
- * DefaultClassGenerator class.
- *
+ * 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. "entity" performs one iteration for each selected entity.
- * "datamap" performs one iteration per datamap (This is always one iteration since cgen
- * currently supports specifying one-and-only-one datamap). (Default is "entity")
- *
- * @parameter expression="${cgen.mode}" default-value="entity"
- */
- private String mode;
-
- /**
- * Name of file for generated output. (Default is "*.java")
- *
- * @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 "destDir" ignoring their package.
- *
- * @parameter expression="${cgen.usePkgPath}" default-value="true"
- */
- private boolean usePkgPath;
-
- /**
- * Specifies template location and generator behavior. "1.1" is the old behavior,
- * with templates located in "dotemplates" and "classgen" as the only
- * velocity context attribute. "1.2" is the new behavior, with templates located
- * in "dotemplates/v1.2" and "objEntity", "entityUtils",
- * "stringUtils", and "importUtils" in the velocity context. (Default is "1.2".)
- *
- * @parameter expression="${cgen.version}" default-value="1.1"
- */
- private String version;
-
- private DefaultClassGenerator generator;
- protected CayenneGeneratorUtil generatorUtil;
-
- public void execute() throws MojoExecutionException, MojoFailureException
- {
- // Create the destination directory if necessary.
- // TODO: (KJM 11/2/06) The destDir really should be added as a compilation resource for maven.
- if (!destDir.exists())
- {
- destDir.mkdirs();
- }
-
- generator = createGenerator();
- generatorUtil = new CayenneGeneratorUtil();
-
- generatorUtil.setExcludeEntitiesPattern(excludeEntitiesPattern);
- generatorUtil.setGenerator(generator);
- generatorUtil.setIncludeEntitiesPattern(includeEntitiesPattern);
- generatorUtil.setLogger(new MavenLogger(this));
- generatorUtil.setMap(map);
-
- try {
- generatorUtil.setAdditionalMaps(convertAdditionalDataMaps());
- generatorUtil.execute();
- }
- catch (Exception e) {
- throw new MojoExecutionException("Error generating classes: ", e);
- }
- }
-
- /**
- * Loads and returns DataMap based on <code>map</code> attribute.
- */
- protected File[] convertAdditionalDataMaps() throws Exception {
-
- if (null == additionalMaps) {
- return new File[0];
- }
-
- if (!additionalMaps.isDirectory()) {
- throw new MojoFailureException("'additionalMaps' must be a directory containing only datamap files.");
- }
-
- String[] maps = additionalMaps.list();
- File[] dataMaps = new File[maps.length];
- for (int i = 0; i < maps.length; i++) {
- dataMaps[i] = 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);
+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. "entity" performs one
+ * iteration for each selected entity. "datamap" performs one
+ * iteration per datamap (This is always one iteration since cgen currently
+ * supports specifying one-and-only-one datamap). (Default is
+ * "entity")
+ *
+ * @parameter expression="${cgen.mode}" default-value="entity"
+ */
+ private String mode;
+
+ /**
+ * Name of file for generated output. (Default is "*.java")
+ *
+ * @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
+ * "destDir" ignoring their package.
+ *
+ * @parameter expression="${cgen.usePkgPath}" default-value="true"
+ */
+ private boolean usePkgPath;
+
+ /**
+ * Specifies template location and generator behavior. "1.1" is
+ * the old behavior, with templates located in "dotemplates" and
+ * "classgen" as the only velocity context attribute.
+ * "1.2" is the new behavior, with templates located in
+ * "dotemplates/v1.2" and "objEntity",
+ * "entityUtils", "stringUtils", and
+ * "importUtils" in the velocity context. (Default is
+ * "1.2".)
+ *
+ * @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.
+ // TODO: (KJM 11/2/06) The destDir really should be added as a
+ // compilation resource for maven.
+ if (!destDir.exists()) {
+ destDir.mkdirs();
+ }
- return gen;
- }
-}
+ generator = createGenerator();
-class MavenLogger implements ILog {
-
- private Log logger;
-
- public MavenLogger(AbstractMojo parent) {
- this.logger = parent.getLog();
- }
-
- public void log(String msg) {
- logger.debug(msg);
+ ILog logger = new MavenLogger(this);
+ CayenneGenerationMapLoader mapLoader = new CayenneGenerationMapLoader();
+ mapLoader.setNameFilter(new NamePatternMatcher(logger,
+ includeEntitiesPattern, excludeEntitiesPattern));
+ mapLoader.setMainDataMapFile(map);
+
+ try {
+ mapLoader.setAdditionalDataMapFiles(convertAdditionalDataMaps());
+
+ generator.setTimestamp(map.lastModified());
+ generator.setDataMap(mapLoader.getMainDataMap());
+ generator.setObjEntities((List<ObjEntity>) mapLoader
+ .getFilteredEntities());
+ generator.validateAttributes();
+ generator.execute();
+ } catch (Exception e) {
+ throw new MojoExecutionException("Error generating classes: ", e);
+ }
}
- public void log(String msg, int msgLevel) {
-
- switch (msgLevel) {
- case ILog.MSG_DEBUG:
- logger.debug(msg);
- break;
-
- case ILog.MSG_ERR:
- logger.error(msg);
- break;
-
- case ILog.MSG_INFO:
- logger.info(msg);
- break;
-
- case ILog.MSG_VERBOSE:
- logger.info(msg);
- break;
-
- case ILog.MSG_WARN:
- logger.warn(msg);
- break;
-
- default:
- logger.debug(msg);
+ /**
+ * Loads and returns DataMap based on <code>map</code> attribute.
+ */
+ protected File[] convertAdditionalDataMaps() throws Exception {
+
+ if (null == additionalMaps) {
+ return new File[0];
+ }
+
+ if (!additionalMaps.isDirectory()) {
+ throw new MojoFailureException(
+ "'additionalMaps' must be a directory containing only datamap files.");
+ }
+
+ String[] maps = additionalMaps.list();
+ File[] dataMaps = new File[maps.length];
+ for (int i = 0; i < maps.length; i++) {
+ dataMaps[i] = new File(maps[i]);
}
+ return dataMaps;
}
-}
\ No newline at end of file
+
+ /**
+ * 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;
+ }
+}
Added: cayenne/main/trunk/framework/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/MavenLogger.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/MavenLogger.java?rev=600341&view=auto
==============================================================================
--- cayenne/main/trunk/framework/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/MavenLogger.java (added)
+++ cayenne/main/trunk/framework/maven-cayenne-plugin/src/main/java/org/apache/cayenne/tools/MavenLogger.java Sun Dec 2 09:15:25 2007
@@ -0,0 +1,66 @@
+/*****************************************************************
+ * 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.logging.Log;
+
+/**
+ * @since 3.0
+ */
+class MavenLogger implements ILog {
+
+ private Log logger;
+
+ public MavenLogger(AbstractMojo parent) {
+ this.logger = parent.getLog();
+ }
+
+ public void log(String msg) {
+ logger.debug(msg);
+ }
+
+ public void log(String msg, int msgLevel) {
+
+ switch (msgLevel) {
+ case ILog.MSG_DEBUG:
+ logger.debug(msg);
+ break;
+
+ case ILog.MSG_ERR:
+ logger.error(msg);
+ break;
+
+ case ILog.MSG_INFO:
+ logger.info(msg);
+ break;
+
+ case ILog.MSG_VERBOSE:
+ logger.info(msg);
+ break;
+
+ case ILog.MSG_WARN:
+ logger.warn(msg);
+ break;
+
+ default:
+ logger.debug(msg);
+ }
+ }
+}
\ No newline at end of file