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")
+		);
 	}
 
 	/**