You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2018/02/01 09:39:21 UTC
cayenne git commit: CAY-2334 cgen: option to force run from
maven/gradle
Repository: cayenne
Updated Branches:
refs/heads/master 05d279d8e -> 023547e6a
CAY-2334 cgen: option to force run from maven/gradle
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/023547e6
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/023547e6
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/023547e6
Branch: refs/heads/master
Commit: 023547e6a0faeeb7f151cff3028ff1552c7158c1
Parents: 05d279d
Author: Nikita Timofeev <st...@gmail.com>
Authored: Thu Feb 1 12:37:40 2018 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Thu Feb 1 12:37:40 2018 +0300
----------------------------------------------------------------------
RELEASE-NOTES.txt | 1 +
cayenne-cgen/pom.xml | 6 ++
.../cayenne/gen/ClassGenerationAction.java | 101 +++++++++----------
.../cayenne/gen/ClassGenerationActionTest.java | 42 ++++++++
.../java/org/apache/cayenne/tools/CgenTask.java | 34 +++++--
.../cayenne/tools/CayenneGeneratorMojo.java | 32 +++---
6 files changed, 141 insertions(+), 75 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cayenne/blob/023547e6/RELEASE-NOTES.txt
----------------------------------------------------------------------
diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index a41b221..746012c 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -13,6 +13,7 @@ Date:
----------------------------------
Changes/New Features:
+CAY-2334 cgen: option to force run from maven/gradle
CAY-2372 Extract new modules from cayenne-server
CAY-2377 Cleanup deprecated code.
CAY-2391 cdbimport: add option to skip user-defined relationships
http://git-wip-us.apache.org/repos/asf/cayenne/blob/023547e6/cayenne-cgen/pom.xml
----------------------------------------------------------------------
diff --git a/cayenne-cgen/pom.xml b/cayenne-cgen/pom.xml
index d95761d..518b319 100644
--- a/cayenne-cgen/pom.xml
+++ b/cayenne-cgen/pom.xml
@@ -59,6 +59,12 @@
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
+
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-core</artifactId>
+ <scope>test</scope>
+ </dependency>
</dependencies>
<build>
http://git-wip-us.apache.org/repos/asf/cayenne/blob/023547e6/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java
index eb122be..253ca06 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java
@@ -19,7 +19,6 @@
package org.apache.cayenne.gen;
-import org.apache.cayenne.CayenneException;
import org.apache.cayenne.CayenneRuntimeException;
import org.apache.cayenne.map.DataMap;
import org.apache.cayenne.map.Embeddable;
@@ -81,6 +80,7 @@ public class ClassGenerationAction {
protected String outputPattern;
protected String encoding;
protected boolean createPropertyNames;
+ protected boolean force; // force run generator
// runtime ivars
protected VelocityContext context;
@@ -88,7 +88,7 @@ public class ClassGenerationAction {
public ClassGenerationAction() {
this.outputPattern = "*.java";
- this.timestamp = System.currentTimeMillis();
+ this.timestamp = 0L;
this.usePkgPath = true;
this.makePairs = true;
this.context = new VelocityContext();
@@ -240,18 +240,16 @@ public class ClassGenerationAction {
}
}
- protected Template getTemplate(TemplateType type) throws Exception {
+ protected Template getTemplate(TemplateType type) {
String templateName = customTemplateName(type);
if (templateName == null) {
templateName = defaultTemplateName(type);
}
- // Velocity < 1.5 has some memory problems, so we will create a
- // VelocityEngine
- // every time, and store templates in an internal cache, to avoid
- // uncontrolled
- // memory leaks... Presumably 1.5 fixes it.
+ // Velocity < 1.5 has some memory problems, so we will create a VelocityEngine every time,
+ // and store templates in an internal cache, to avoid uncontrolled memory leaks...
+ // Presumably 1.5 fixes it.
Template template = templateCache.get(templateName);
@@ -274,9 +272,9 @@ public class ClassGenerationAction {
}
/**
- * Validates the state of this class generator. Throws
- * CayenneRuntimeException if it is in an inconsistent state. Called
- * internally from "execute".
+ * Validates the state of this class generator.
+ * Throws CayenneRuntimeException if it is in an inconsistent state.
+ * Called internally from "execute".
*/
protected void validateAttributes() {
if (destDir == null) {
@@ -393,19 +391,8 @@ public class ClassGenerationAction {
String filename = StringUtils.getInstance().replaceWildcardInStringWithString(WILDCARD, outputPattern, className);
File dest = new File(mkpath(destDir, packageName), filename);
- // Ignore if the destination is newer than the map
- // (internal timestamp), i.e. has been generated after the map was
- // last saved AND the template is older than the destination file
- if (dest.exists() && !isOld(dest)) {
-
- if (superTemplate == null) {
- return null;
- }
-
- File superTemplateFile = new File(superTemplate);
- if (superTemplateFile.lastModified() < dest.lastModified()) {
- return null;
- }
+ if (dest.exists() && !fileNeedUpdate(dest, superTemplate)) {
+ return null;
}
return dest;
@@ -434,19 +421,8 @@ public class ClassGenerationAction {
return null;
}
- // Ignore if the destination is newer than the map
- // (internal timestamp), i.e. has been generated after the map was
- // last saved AND the template is older than the destination file
- if (!isOld(dest)) {
-
- if (template == null) {
- return null;
- }
-
- File templateFile = new File(template);
- if (templateFile.lastModified() < dest.lastModified()) {
- return null;
- }
+ if (!fileNeedUpdate(dest, template)) {
+ return null;
}
}
@@ -454,11 +430,31 @@ public class ClassGenerationAction {
}
/**
- * Returns true if <code>file</code> parameter is older than internal
- * timestamp of this class generator.
+ * Ignore if the destination is newer than the map
+ * (internal timestamp), i.e. has been generated after the map was
+ * last saved AND the template is older than the destination file
+ */
+ protected boolean fileNeedUpdate(File dest, String templateFileName) {
+ if(force) {
+ return true;
+ }
+
+ if (isOld(dest)) {
+ if (templateFileName == null) {
+ return false;
+ }
+
+ File templateFile = new File(templateFileName);
+ return templateFile.lastModified() >= dest.lastModified();
+ }
+ return true;
+ }
+
+ /**
+ * Is file modified after internal timestamp (usually equal to mtime of datamap file)
*/
protected boolean isOld(File file) {
- return file.lastModified() <= timestamp;
+ return file.lastModified() > timestamp;
}
/**
@@ -500,8 +496,7 @@ public class ClassGenerationAction {
}
/**
- * @param dataMap
- * The dataMap to set.
+ * @param dataMap The dataMap to set.
*/
public void setDataMap(DataMap dataMap) {
this.dataMap = dataMap;
@@ -509,16 +504,11 @@ public class ClassGenerationAction {
/**
* Adds entities to the internal entity list.
- */
-
- /**
- *
- * @param entities
- * @throws CayenneException
+ * @param entities collection
*
* @since 4.0 throws exception
*/
- public void addEntities(Collection<ObjEntity> entities) throws CayenneRuntimeException {
+ public void addEntities(Collection<ObjEntity> entities) {
if (artifactsGenerationMode == ArtifactsGenerationMode.ENTITY
|| artifactsGenerationMode == ArtifactsGenerationMode.ALL) {
if (entities != null) {
@@ -544,9 +534,8 @@ public class ClassGenerationAction {
if (artifactsGenerationMode == ArtifactsGenerationMode.DATAMAP
|| artifactsGenerationMode == ArtifactsGenerationMode.ALL) {
- // TODO: andrus 10.12.2010 - why not also check for empty query
- // list?? Or
- // create a better API for enabling DataMapArtifact
+ // TODO: andrus 10.12.2010 - why not also check for empty query list??
+ // Or create a better API for enabling DataMapArtifact
if (queries != null) {
artifacts.add(new DataMapArtifact(dataMap, queries));
}
@@ -586,4 +575,12 @@ public class ClassGenerationAction {
this.artifactsGenerationMode = ArtifactsGenerationMode.ALL;
}
}
+
+ public boolean isForce() {
+ return force;
+ }
+
+ public void setForce(boolean force) {
+ this.force = force;
+ }
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/023547e6/cayenne-cgen/src/test/java/org/apache/cayenne/gen/ClassGenerationActionTest.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/test/java/org/apache/cayenne/gen/ClassGenerationActionTest.java b/cayenne-cgen/src/test/java/org/apache/cayenne/gen/ClassGenerationActionTest.java
index 8a1fbd6..721a129 100644
--- a/cayenne-cgen/src/test/java/org/apache/cayenne/gen/ClassGenerationActionTest.java
+++ b/cayenne-cgen/src/test/java/org/apache/cayenne/gen/ClassGenerationActionTest.java
@@ -29,6 +29,7 @@ import org.junit.After;
import org.junit.Before;
import org.junit.Test;
+import java.io.File;
import java.io.StringWriter;
import java.io.Writer;
import java.util.ArrayList;
@@ -36,8 +37,11 @@ import java.util.Collection;
import java.util.List;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
public class ClassGenerationActionTest {
@@ -251,4 +255,42 @@ public class ClassGenerationActionTest {
}
return strings;
}
+
+ @Test
+ public void testIsOld() {
+ File file = mock(File.class);
+ when(file.lastModified()).thenReturn(1000L);
+
+ action.setTimestamp(0);
+ assertTrue(action.isOld(file));
+
+ action.setTimestamp(2000L);
+ assertFalse(action.isOld(file));
+ }
+
+ @Test
+ public void testFileNeedUpdate() {
+ File file = mock(File.class);
+ when(file.lastModified()).thenReturn(1000L);
+
+ action.setTimestamp(0);
+ action.setForce(false);
+
+ assertFalse(action.fileNeedUpdate(file, null));
+
+ action.setTimestamp(2000L);
+ action.setForce(false);
+
+ assertTrue(action.fileNeedUpdate(file, null));
+
+ action.setTimestamp(0);
+ action.setForce(true);
+
+ assertTrue(action.fileNeedUpdate(file, null));
+
+ action.setTimestamp(2000L);
+ action.setForce(true);
+
+ assertTrue(action.fileNeedUpdate(file, null));
+ }
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/023547e6/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java
----------------------------------------------------------------------
diff --git a/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java b/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java
index ee39a1c..b6b376e 100644
--- a/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java
+++ b/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java
@@ -20,7 +20,6 @@
package org.apache.cayenne.tools;
import java.io.File;
-import java.io.FilenameFilter;
import java.util.Set;
import groovy.lang.Reference;
@@ -108,6 +107,13 @@ public class CgenTask extends BaseCayenneTask {
@Input
private boolean createPropertyNames;
+ /**
+ * Force run (skip check for files modification time)
+ * @since 4.1
+ */
+ @Input
+ private boolean force;
+
private String destDirName;
@TaskAction
@@ -130,6 +136,10 @@ public class CgenTask extends BaseCayenneTask {
DataMap dataMap = loaderAction.getMainDataMap();
generator.setLogger(getLogger());
+
+ if(this.force || (getProject().findProperty("force") != null)) {
+ generator.setForce(true);
+ }
generator.setTimestamp(dataMapFile.lastModified());
generator.setDataMap(dataMap);
generator.addEntities(filterAction.getFilteredEntities(dataMap));
@@ -150,13 +160,9 @@ public class CgenTask extends BaseCayenneTask {
throw new GradleException("'additionalMaps' must be a directory.");
}
- FilenameFilter mapFilter = new FilenameFilter() {
- public boolean accept(File dir, String name) {
- return name != null && name.toLowerCase().endsWith(".map.xml");
- }
-
- };
- return additionalMaps.listFiles(mapFilter);
+ return additionalMaps.listFiles(
+ (dir, name) -> name != null && name.toLowerCase().endsWith(".map.xml")
+ );
}
ClassGenerationAction newGeneratorInstance() {
@@ -447,4 +453,16 @@ public class CgenTask extends BaseCayenneTask {
setCreatePropertyNames(createPropertyNames);
}
+ public boolean isForce() {
+ return force;
+ }
+
+ public void setForce(boolean force) {
+ this.force = force;
+ }
+
+ public void force(boolean force) {
+ setForce(force);
+ }
+
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cayenne/blob/023547e6/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java
----------------------------------------------------------------------
diff --git a/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java b/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java
index 6af8b0a..72c39b4 100644
--- a/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java
+++ b/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java
@@ -36,7 +36,6 @@ import org.apache.maven.plugins.annotations.Parameter;
import org.slf4j.LoggerFactory;
import java.io.File;
-import java.io.FilenameFilter;
/**
* Maven mojo to perform class generation from data map. This class is an Maven
@@ -185,6 +184,15 @@ public class CayenneGeneratorMojo extends AbstractMojo {
@Parameter(defaultValue = "false")
private boolean createPropertyNames;
+ /**
+ * If set to <code>true</code>, will skip file modification time validation and regenerate all.
+ * Default is <code>false</code>.
+ *
+ * @since 4.1
+ */
+ @Parameter(defaultValue = "false", property = "force")
+ private boolean force;
+
private transient Injector injector;
public void execute() throws MojoExecutionException, MojoFailureException {
@@ -212,14 +220,14 @@ public class CayenneGeneratorMojo extends AbstractMojo {
ClassGenerationAction generator = createGenerator();
generator.setLogger(logger);
+ if(force) {
+ // will (re-)generate all files
+ generator.setForce(true);
+ }
generator.setTimestamp(map.lastModified());
generator.setDataMap(dataMap);
generator.addEntities(filterAction.getFilteredEntities(dataMap));
- // ksenia khailenko 15.10.2010
- // TODO add the "includeEmbeddables" and "excludeEmbeddables"
- // attributes
generator.addEmbeddables(dataMap.getEmbeddables());
- // TODO add the "includeQueries" and "excludeQueries" attributes
generator.addQueries(dataMap.getQueryDescriptors());
generator.execute();
} catch (Exception e) {
@@ -237,18 +245,12 @@ public class CayenneGeneratorMojo extends AbstractMojo {
}
if (!additionalMaps.isDirectory()) {
- throw new MojoFailureException(
- "'additionalMaps' must be a directory.");
+ throw new MojoFailureException("'additionalMaps' must be a directory.");
}
- FilenameFilter mapFilter = new FilenameFilter() {
- @Override
- public boolean accept(File dir, String name) {
- return name != null &&
- name.toLowerCase().endsWith(".map.xml");
- }
- };
- return additionalMaps.listFiles(mapFilter);
+ return additionalMaps.listFiles(
+ (dir, name) -> name != null && name.toLowerCase().endsWith(".map.xml")
+ );
}
/**