Author: nlebas
Date: Wed Feb 4 02:27:40 2015
New Revision: 1656976
URL: http://svn.apache.org/r1656976
Log:
AUTOTAG-20 make the build really incremental whenever possible
Modified:
tiles/autotag/trunk/maven-autotag-plugin/src/main/java/org/apache/tiles/autotag/plugin/AbstractGenerateMojo.java
tiles/autotag/trunk/maven-autotag-plugin/src/main/java/org/apache/tiles/autotag/plugin/CreateDescriptorMojo.java
tiles/autotag/trunk/maven-autotag-plugin/src/test/java/org/apache/tiles/autotag/plugin/AbstractGenerateMojoTest.java
tiles/autotag/trunk/maven-autotag-plugin/src/test/java/org/apache/tiles/autotag/plugin/CreateDescriptorMojoTest.java
tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/DirectoryOutputLocator.java
tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/OutputLocator.java
tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/AbstractTemplateClassGenerator.java
tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/AbstractTemplateSuiteGenerator.java
Modified:
tiles/autotag/trunk/maven-autotag-plugin/src/main/java/org/apache/tiles/autotag/plugin/AbstractGenerateMojo.java
URL:
http://svn.apache.org/viewvc/tiles/autotag/trunk/maven-autotag-plugin/src/main/java/org/apache/tiles/autotag/plugin/AbstractGenerateMojo.java?rev=1656976&r1=1656975&r2=1656976&view=diff
==============================================================================
---
tiles/autotag/trunk/maven-autotag-plugin/src/main/java/org/apache/tiles/autotag/plugin/AbstractGenerateMojo.java
(original)
+++
tiles/autotag/trunk/maven-autotag-plugin/src/main/java/org/apache/tiles/autotag/plugin/AbstractGenerateMojo.java
Wed Feb 4 02:27:40 2015
@@ -26,6 +26,7 @@ import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLClassLoader;
+import java.net.URLConnection;
import java.util.List;
import java.util.Map;
import java.util.Properties;
@@ -100,15 +101,17 @@ public abstract class AbstractGenerateMo
public void execute() throws MojoExecutionException {
try {
TemplateSuite suite;
- InputStream stream = findTemplateSuiteDescriptor();
+ URLConnection templateSuite = findTemplateSuiteDescriptor();
+ long lastModified = templateSuite.getLastModified();
+ InputStream stream = templateSuite.getInputStream();
try {
XStream xstream = new XStream(new
Sun14ReflectionProvider());
suite = (TemplateSuite) xstream.fromXML(stream);
} finally {
stream.close();
}
- classesOutputLocator = new
MavenOutputLocator(classesOutputDirectory);
- resourcesOutputLocator = new
MavenOutputLocator(resourcesOutputDirectory);
+ classesOutputLocator = new
MavenOutputLocator(classesOutputDirectory, lastModified);
+ resourcesOutputLocator = new
MavenOutputLocator(resourcesOutputDirectory, lastModified);
Properties props = new Properties();
InputStream propsStream =
getClass().getResourceAsStream("/org/apache/tiles/autotag/velocity.properties");
props.load(propsStream);
@@ -118,13 +121,11 @@ public abstract class AbstractGenerateMo
generator.generate(packageName, suite, getParameters(),
getRuntimeClass(), requestClass);
if (generator.isGeneratingResources()) {
buildContext.refresh(resourcesOutputDirectory);
- Resource resource = new Resource();
-
resource.setDirectory(resourcesOutputDirectory.getAbsolutePath());
- project.addResource(resource);
+
addResourceDirectory(resourcesOutputDirectory.getAbsolutePath());
}
if (generator.isGeneratingClasses()) {
buildContext.refresh(classesOutputDirectory);
-
project.addCompileSourceRoot(classesOutputDirectory.getAbsolutePath());
+ addCompileSourceRoot(classesOutputDirectory.getAbsolutePath());
}
} catch (IOException e) {
throw new MojoExecutionException("error", e);
@@ -135,7 +136,38 @@ public abstract class AbstractGenerateMo
}
}
- /**
+ private void addResourceDirectory(String directory) {
+ boolean addResource = true;
+ @SuppressWarnings("unchecked")
+ List<Resource> resources = project.getResources();
+ for(Resource resource: resources) {
+ if(directory.equals(resource.getDirectory())) {
+ addResource = false;
+ }
+ }
+ if(addResource) {
+ Resource resource = new Resource();
+ resource.setDirectory(directory);
+ project.addResource(resource);
+ }
+ }
+
+ private void addCompileSourceRoot(String directory) {
+ boolean addResource = true;
+ @SuppressWarnings("unchecked")
+ List<String> roots = project.getCompileSourceRoots();
+ for(String root: roots) {
+ if(directory.equals(root)) {
+ addResource = false;
+ }
+ }
+ if(addResource) {
+ project.addCompileSourceRoot(directory);
+ }
+ }
+
+
+ /**
* Creates a template generator factory.
*
* @param velocityEngine The Velocity engine.
@@ -156,7 +188,7 @@ public abstract class AbstractGenerateMo
* @return The inputstream of the identified descriptor.
* @throws IOException If something goes wrong.
*/
- private InputStream findTemplateSuiteDescriptor() throws IOException {
+ private URLConnection findTemplateSuiteDescriptor() throws IOException {
URL[] urls = new URL[classpathElements.size()];
int i = 0;
for ( String classpathElement: classpathElements )
@@ -165,7 +197,7 @@ public abstract class AbstractGenerateMo
}
ClassLoader cl = new URLClassLoader( urls );
- return cl.getResourceAsStream(META_INF_TEMPLATE_SUITE_XML);
+ return cl.getResource(META_INF_TEMPLATE_SUITE_XML).openConnection();
}
/**
@@ -177,9 +209,11 @@ public abstract class AbstractGenerateMo
private final class MavenOutputLocator implements OutputLocator {
private File outputDirectory;
+ private long sourceLastModified;
- private MavenOutputLocator(File outputDirectory) {
+ private MavenOutputLocator(File outputDirectory, long
sourceLastModified) {
this.outputDirectory = outputDirectory;
+ this.sourceLastModified = sourceLastModified;
}
@Override
@@ -189,5 +223,11 @@ public abstract class AbstractGenerateMo
target.getParentFile().mkdirs();
return buildContext.newFileOutputStream(target);
}
+
+ @Override
+ public boolean isUptodate(String resourcePath) {
+ File target = new File(outputDirectory, resourcePath);
+ return target.exists() && target.lastModified() >
sourceLastModified;
+ }
}
}
Modified:
tiles/autotag/trunk/maven-autotag-plugin/src/main/java/org/apache/tiles/autotag/plugin/CreateDescriptorMojo.java
URL:
http://svn.apache.org/viewvc/tiles/autotag/trunk/maven-autotag-plugin/src/main/java/org/apache/tiles/autotag/plugin/CreateDescriptorMojo.java?rev=1656976&r1=1656975&r2=1656976&view=diff
==============================================================================
---
tiles/autotag/trunk/maven-autotag-plugin/src/main/java/org/apache/tiles/autotag/plugin/CreateDescriptorMojo.java
(original)
+++
tiles/autotag/trunk/maven-autotag-plugin/src/main/java/org/apache/tiles/autotag/plugin/CreateDescriptorMojo.java
Wed Feb 4 02:27:40 2015
@@ -42,6 +42,7 @@ import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashSet;
+import java.util.List;
import java.util.Set;
import org.apache.maven.model.Resource;
@@ -116,32 +117,58 @@ public class CreateDescriptorMojo extend
public void execute() throws MojoExecutionException {
try {
String[] fileNames =
getSourceInclusionScanner().getIncludedFiles();
+ File dir = new File(outputDirectory, "META-INF");
+ if(!dir.exists()) {
+ dir.mkdirs();
+ buildContext.refresh(dir);
+ }
+ File outputFile = new File(dir, "template-suite.xml");
+ boolean uptodate = outputFile.exists();
File[] files = new File[fileNames.length];
for(int i=0; i<fileNames.length; i++) {
files[i] = new File(sourceDirectory, fileNames[i]);
+ uptodate &= buildContext.isUptodate(outputFile, files[i]);
}
- QDoxTemplateSuiteFactory factory = new
QDoxTemplateSuiteFactory(files);
- factory.setSuiteName(name);
- factory.setSuiteDocumentation(documentation);
- factory.setRequestClass(requestClass);
- TemplateSuite suite = factory.createTemplateSuite();
- XStream xstream = new XStream();
- File dir = new File(outputDirectory, "META-INF");
- dir.mkdirs();
- File outputFile = new File(dir, "template-suite.xml");
- OutputStream os = buildContext.newFileOutputStream(outputFile);
- Writer writer = new OutputStreamWriter(os);
- xstream.toXML(suite, writer);
- writer.close();
- buildContext.refresh(outputDirectory);
- Resource resource = new Resource();
- resource.setDirectory(outputDirectory.getAbsolutePath());
- project.addResource(resource);
+ if(!uptodate) {
+ createDescriptor(outputFile, files);
+ }
+ addResourceDirectory(outputDirectory.getAbsolutePath());
} catch (IOException e) {
throw new MojoExecutionException("error", e);
}
}
+ private void createDescriptor(File outputFile, File[] files)
+ throws IOException {
+ QDoxTemplateSuiteFactory factory = new
QDoxTemplateSuiteFactory(files);
+ factory.setSuiteName(name);
+ factory.setSuiteDocumentation(documentation);
+ factory.setRequestClass(requestClass);
+ TemplateSuite suite = factory.createTemplateSuite();
+ XStream xstream = new XStream();
+ OutputStream os = buildContext.newFileOutputStream(outputFile);
+ Writer writer = new OutputStreamWriter(os);
+ xstream.toXML(suite, writer);
+ writer.close();
+ os.close();
+ }
+
+ private void addResourceDirectory(String directory) {
+ boolean addResource = true;
+ @SuppressWarnings("unchecked")
+ List<Resource> resources = project.getResources();
+ for(Resource resource: resources) {
+ if(directory.equals(resource.getDirectory())) {
+ addResource = false;
+ }
+ }
+ if(addResource) {
+ Resource resource = new Resource();
+ resource.setDirectory(directory);
+ project.addResource(resource);
+ }
+ }
+
/**
* Creates a source inclusion scanner.
*
Modified:
tiles/autotag/trunk/maven-autotag-plugin/src/test/java/org/apache/tiles/autotag/plugin/AbstractGenerateMojoTest.java
URL:
http://svn.apache.org/viewvc/tiles/autotag/trunk/maven-autotag-plugin/src/test/java/org/apache/tiles/autotag/plugin/AbstractGenerateMojoTest.java?rev=1656976&r1=1656975&r2=1656976&view=diff
==============================================================================
---
tiles/autotag/trunk/maven-autotag-plugin/src/test/java/org/apache/tiles/autotag/plugin/AbstractGenerateMojoTest.java
(original)
+++
tiles/autotag/trunk/maven-autotag-plugin/src/test/java/org/apache/tiles/autotag/plugin/AbstractGenerateMojoTest.java
Wed Feb 4 02:27:40 2015
@@ -25,6 +25,7 @@ import static org.easymock.EasyMock.*;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -79,7 +80,7 @@ public class AbstractGenerateMojoTest {
mojo.buildContext = buildContext;
buildContext.refresh(isA(File.class));
- buildContext.refresh(isA(File.class));
+ expectLastCall().times(2);
expect(mojo.createTemplateGeneratorFactory(isA(VelocityEngine.class))).andReturn(factory);
expect(factory.createTemplateGenerator()).andReturn(generator);
expect(mojo.getParameters()).andReturn(params);
@@ -87,7 +88,9 @@ public class AbstractGenerateMojoTest {
generator.generate(eq("my.package"), isA(TemplateSuite.class),
eq(params), eq("my.package.Runtime"), eq("my.package.Request"));
expect(generator.isGeneratingClasses()).andReturn(true);
expect(generator.isGeneratingResources()).andReturn(true);
+ expect(mavenProject.getResources()).andReturn(Collections.emptyList());
mavenProject.addResource(isA(Resource.class));
+
expect(mavenProject.getCompileSourceRoots()).andReturn(Collections.emptyList());
mavenProject.addCompileSourceRoot(classesOutputDirectory.getAbsolutePath());
replay(mavenProject, buildContext, mojo, factory, generator, params);
Modified:
tiles/autotag/trunk/maven-autotag-plugin/src/test/java/org/apache/tiles/autotag/plugin/CreateDescriptorMojoTest.java
URL:
http://svn.apache.org/viewvc/tiles/autotag/trunk/maven-autotag-plugin/src/test/java/org/apache/tiles/autotag/plugin/CreateDescriptorMojoTest.java?rev=1656976&r1=1656975&r2=1656976&view=diff
==============================================================================
---
tiles/autotag/trunk/maven-autotag-plugin/src/test/java/org/apache/tiles/autotag/plugin/CreateDescriptorMojoTest.java
(original)
+++
tiles/autotag/trunk/maven-autotag-plugin/src/test/java/org/apache/tiles/autotag/plugin/CreateDescriptorMojoTest.java
Wed Feb 4 02:27:40 2015
@@ -37,6 +37,7 @@ import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import org.apache.commons.io.FileUtils;
@@ -91,6 +92,7 @@ public class CreateDescriptorMojoTest {
mojo.requestClass = ExampleRequest.class.getName();
mojo.buildContext = buildContext;
+ expect(mavenProject.getResources()).andReturn(Collections.emptyList());
mavenProject.addResource(isA(Resource.class));
expect(buildContext.newScanner(isA(File.class))).andReturn(scanner);
scanner.setIncludes(isA(String[].class));
@@ -98,8 +100,8 @@ public class CreateDescriptorMojoTest {
expect(scanner.getIncludedFiles()).andReturn(models);
File file = new File(temp, "META-INF/template-suite.xml");
file.getParentFile().mkdirs();
+ expect(buildContext.isUptodate(isA(File.class),
isA(File.class))).andReturn(false).times(models.length);
expect(buildContext.newFileOutputStream(isA(File.class))).andReturn(new
FileOutputStream(file));
- buildContext.refresh(isA(File.class));
replay(mavenProject, buildContext, scanner);
mojo.execute();
InputStream sis = new FileInputStream(new File(temp,
"META-INF/template-suite.xml"));
Modified:
tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/DirectoryOutputLocator.java
URL:
http://svn.apache.org/viewvc/tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/DirectoryOutputLocator.java?rev=1656976&r1=1656975&r2=1656976&view=diff
==============================================================================
---
tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/DirectoryOutputLocator.java
(original)
+++
tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/DirectoryOutputLocator.java
Wed Feb 4 02:27:40 2015
@@ -31,9 +31,16 @@ import java.io.OutputStream;
public class DirectoryOutputLocator implements OutputLocator {
private File directory;
+ private long sourceLastModified;
public DirectoryOutputLocator(File directory) {
this.directory = directory;
+ this.sourceLastModified = System.currentTimeMillis();
+ }
+
+ public DirectoryOutputLocator(File directory, long sourceLastModified) {
+ this.directory = directory;
+ this.sourceLastModified = sourceLastModified;
}
@Override
@@ -43,4 +50,10 @@ public class DirectoryOutputLocator impl
return new FileOutputStream(file);
}
+ @Override
+ public boolean isUptodate(String resourcePath) {
+ File file = new File(directory, resourcePath);
+ return file.exists() && file.lastModified() >
sourceLastModified;
+ }
+
}
Modified:
tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/OutputLocator.java
URL:
http://svn.apache.org/viewvc/tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/OutputLocator.java?rev=1656976&r1=1656975&r2=1656976&view=diff
==============================================================================
---
tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/OutputLocator.java
(original)
+++
tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/OutputLocator.java
Wed Feb 4 02:27:40 2015
@@ -33,4 +33,11 @@ public interface OutputLocator {
* @return a Writer for the file.
*/
OutputStream getOutputStream(String resourcePath) throws IOException;
+
+ /**
+ * Checks if the output is up to date.
+ * @param resourcePath the path of the file to write.
+ * @return true if the output doesn't need to be generated again.
+ */
+ boolean isUptodate(String resourcePath);
}
Modified:
tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/AbstractTemplateClassGenerator.java
URL:
http://svn.apache.org/viewvc/tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/AbstractTemplateClassGenerator.java?rev=1656976&r1=1656975&r2=1656976&view=diff
==============================================================================
---
tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/AbstractTemplateClassGenerator.java
(original)
+++
tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/AbstractTemplateClassGenerator.java
Wed Feb 4 02:27:40 2015
@@ -67,39 +67,41 @@ public abstract class AbstractTemplateCl
getDirectoryName(packageName, suite, clazz, parameters,
runtimeClass, requestClass)
+ File.separator
+ getFilename(packageName, suite, clazz, parameters,
runtimeClass, requestClass);
- VelocityContext context = new VelocityContext();
- context.put("packageName", packageName);
- context.put("suite", suite);
- context.put("clazz", clazz);
- context.put("stringTool", new StringTool());
- context.put("parameters", parameters);
- context.put("runtimeClass", runtimeClass);
- context.put("requestClass", requestClass);
- try {
- Template template = velocityEngine.getTemplate(getTemplatePath(
- packageName, suite, clazz, parameters, runtimeClass,
requestClass));
- Writer writer = new
OutputStreamWriter(outputLocator.getOutputStream(filePath));
- try {
- template.merge(context, writer);
- } finally {
- writer.close();
- }
- } catch (ResourceNotFoundException e) {
- throw new AutotagRuntimeException("Cannot find template resource",
- e);
- } catch (ParseErrorException e) {
- throw new AutotagRuntimeException(
- "The template resource is not parseable", e);
- } catch (IOException e) {
- throw new AutotagRuntimeException(
- "I/O Exception when generating file", e);
- } catch (RuntimeException e) {
- throw e;
- } catch (Exception e) {
- throw new AutotagRuntimeException(
- "Another generic exception while parsing the template
resource",
- e);
- }
+ if (!outputLocator.isUptodate(filePath)) {
+ VelocityContext context = new VelocityContext();
+ context.put("packageName", packageName);
+ context.put("suite", suite);
+ context.put("clazz", clazz);
+ context.put("stringTool", new StringTool());
+ context.put("parameters", parameters);
+ context.put("runtimeClass", runtimeClass);
+ context.put("requestClass", requestClass);
+ try {
+ Template template =
velocityEngine.getTemplate(getTemplatePath(
+ packageName, suite, clazz, parameters,
runtimeClass, requestClass));
+ Writer writer = new
OutputStreamWriter(outputLocator.getOutputStream(filePath));
+ try {
+ template.merge(context, writer);
+ } finally {
+ writer.close();
+ }
+ } catch (ResourceNotFoundException e) {
+ throw new AutotagRuntimeException("Cannot find template
resource",
+ e);
+ } catch (ParseErrorException e) {
+ throw new AutotagRuntimeException(
+ "The template resource is not parseable", e);
+ } catch (IOException e) {
+ throw new AutotagRuntimeException(
+ "I/O Exception when generating file", e);
+ } catch (RuntimeException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new AutotagRuntimeException(
+ "Another generic exception while parsing the
template resource",
+ e);
+ }
+ }
}
/**
Modified:
tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/AbstractTemplateSuiteGenerator.java
URL:
http://svn.apache.org/viewvc/tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/AbstractTemplateSuiteGenerator.java?rev=1656976&r1=1656975&r2=1656976&view=diff
==============================================================================
---
tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/AbstractTemplateSuiteGenerator.java
(original)
+++
tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/AbstractTemplateSuiteGenerator.java
Wed Feb 4 02:27:40 2015
@@ -63,33 +63,35 @@ public abstract class AbstractTemplateSu
getDirectoryName(packageName, suite, parameters)
+ File.separator
+ getFilename(packageName, suite, parameters);
- VelocityContext context = new VelocityContext();
- context.put("packageName", packageName);
- context.put("suite", suite);
- context.put("stringTool", new StringTool());
- context.put("parameters", parameters);
- try {
- Template template = velocityEngine.getTemplate(getTemplatePath(
- packageName, suite, parameters));
- Writer writer = new
OutputStreamWriter(outputLocator.getOutputStream(filePath));
- try {
- template.merge(context, writer);
- } finally {
- writer.close();
- }
- } catch (ResourceNotFoundException e) {
- throw new AutotagRuntimeException("Cannot find template resource",
e);
- } catch (ParseErrorException e) {
- throw new AutotagRuntimeException("The template resource is not
parseable", e);
- } catch (IOException e) {
- throw new AutotagRuntimeException(
- "I/O Exception when generating file", e);
- } catch (RuntimeException e) {
- throw e;
- } catch (Exception e) {
- throw new AutotagRuntimeException(
- "Another generic exception while parsing the template
resource",
- e);
+ if (!outputLocator.isUptodate(filePath)) {
+ VelocityContext context = new VelocityContext();
+ context.put("packageName", packageName);
+ context.put("suite", suite);
+ context.put("stringTool", new StringTool());
+ context.put("parameters", parameters);
+ try {
+ Template template =
velocityEngine.getTemplate(getTemplatePath(
+ packageName, suite, parameters));
+ Writer writer = new
OutputStreamWriter(outputLocator.getOutputStream(filePath));
+ try {
+ template.merge(context, writer);
+ } finally {
+ writer.close();
+ }
+ } catch (ResourceNotFoundException e) {
+ throw new AutotagRuntimeException("Cannot find template
resource", e);
+ } catch (ParseErrorException e) {
+ throw new AutotagRuntimeException("The template resource is
not parseable", e);
+ } catch (IOException e) {
+ throw new AutotagRuntimeException(
+ "I/O Exception when generating file", e);
+ } catch (RuntimeException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new AutotagRuntimeException(
+ "Another generic exception while parsing the
template resource",
+ e);
+ }
}
}