You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tiles.apache.org by nl...@apache.org on 2014/12/07 07:48:00 UTC

svn commit: r1643653 [1/2] - in /tiles/autotag/trunk: maven-autotag-plugin/ maven-autotag-plugin/src/main/java/org/apache/tiles/autotag/plugin/ maven-autotag-plugin/src/main/resources/ maven-autotag-plugin/src/main/resources/META-INF/ maven-autotag-plu...

Author: nlebas
Date: Sun Dec  7 06:47:59 2014
New Revision: 1643653

URL: http://svn.apache.org/r1643653
Log:
AUTOTAG-20 Add support for Eclipse's M2E plugin

Added:
    tiles/autotag/trunk/maven-autotag-plugin/src/main/resources/
    tiles/autotag/trunk/maven-autotag-plugin/src/main/resources/META-INF/
    tiles/autotag/trunk/maven-autotag-plugin/src/main/resources/META-INF/m2e/
    tiles/autotag/trunk/maven-autotag-plugin/src/main/resources/META-INF/m2e/lifecycle-mapping-metadata.xml
    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
Modified:
    tiles/autotag/trunk/maven-autotag-plugin/pom.xml
    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/main/java/org/apache/tiles/autotag/plugin/GenerateFreemarkerMojo.java
    tiles/autotag/trunk/maven-autotag-plugin/src/main/java/org/apache/tiles/autotag/plugin/GenerateJspMojo.java
    tiles/autotag/trunk/maven-autotag-plugin/src/main/java/org/apache/tiles/autotag/plugin/GenerateVelocityMojo.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/AutotagRuntimeException.java
    tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/ClassParseException.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
    tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/BasicTemplateGenerator.java
    tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/TemplateClassGenerator.java
    tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/TemplateGeneratorBuilder.java
    tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/TemplateSuiteGenerator.java
    tiles/autotag/trunk/tiles-autotag-core/src/test/java/org/apache/tiles/autotag/generate/AbstractTemplateClassGeneratorTest.java
    tiles/autotag/trunk/tiles-autotag-core/src/test/java/org/apache/tiles/autotag/generate/AbstractTemplateSuiteGeneratorTest.java
    tiles/autotag/trunk/tiles-autotag-core/src/test/java/org/apache/tiles/autotag/generate/BasicTemplateGeneratorTest.java
    tiles/autotag/trunk/tiles-autotag-core/src/test/java/org/apache/tiles/autotag/generate/TemplateGeneratorBuilderTest.java
    tiles/autotag/trunk/tiles-autotag-freemarker/src/main/java/org/apache/tiles/autotag/freemarker/FMModelGenerator.java
    tiles/autotag/trunk/tiles-autotag-freemarker/src/main/java/org/apache/tiles/autotag/freemarker/FMModelRepositoryGenerator.java
    tiles/autotag/trunk/tiles-autotag-freemarker/src/main/java/org/apache/tiles/autotag/freemarker/FMTemplateGeneratorFactory.java
    tiles/autotag/trunk/tiles-autotag-freemarker/src/test/java/org/apache/tiles/autotag/freemarker/FMModelGeneratorTest.java
    tiles/autotag/trunk/tiles-autotag-freemarker/src/test/java/org/apache/tiles/autotag/freemarker/FMModelRepositoryGeneratorTest.java
    tiles/autotag/trunk/tiles-autotag-freemarker/src/test/java/org/apache/tiles/autotag/freemarker/FMTemplateGeneratorFactoryTest.java
    tiles/autotag/trunk/tiles-autotag-jsp/src/main/java/org/apache/tiles/autotag/jsp/JspTemplateGeneratorFactory.java
    tiles/autotag/trunk/tiles-autotag-jsp/src/main/java/org/apache/tiles/autotag/jsp/TLDGenerator.java
    tiles/autotag/trunk/tiles-autotag-jsp/src/main/java/org/apache/tiles/autotag/jsp/TagClassGenerator.java
    tiles/autotag/trunk/tiles-autotag-jsp/src/test/java/org/apache/tiles/autotag/jsp/JspTemplateGeneratorFactoryTest.java
    tiles/autotag/trunk/tiles-autotag-jsp/src/test/java/org/apache/tiles/autotag/jsp/TLDGeneratorTest.java
    tiles/autotag/trunk/tiles-autotag-jsp/src/test/java/org/apache/tiles/autotag/jsp/TagClassGeneratorTest.java
    tiles/autotag/trunk/tiles-autotag-velocity/src/main/java/org/apache/tiles/autotag/velocity/VelocityDirectiveGenerator.java
    tiles/autotag/trunk/tiles-autotag-velocity/src/main/java/org/apache/tiles/autotag/velocity/VelocityPropertiesGenerator.java
    tiles/autotag/trunk/tiles-autotag-velocity/src/main/java/org/apache/tiles/autotag/velocity/VelocityTemplateGeneratorFactory.java
    tiles/autotag/trunk/tiles-autotag-velocity/src/test/java/org/apache/tiles/autotag/velocity/VelocityDirectiveGeneratorTest.java
    tiles/autotag/trunk/tiles-autotag-velocity/src/test/java/org/apache/tiles/autotag/velocity/VelocityPropertiesGeneratorTest.java
    tiles/autotag/trunk/tiles-autotag-velocity/src/test/java/org/apache/tiles/autotag/velocity/VelocityTemplateGeneratorFactoryTest.java

Modified: tiles/autotag/trunk/maven-autotag-plugin/pom.xml
URL: http://svn.apache.org/viewvc/tiles/autotag/trunk/maven-autotag-plugin/pom.xml?rev=1643653&r1=1643652&r2=1643653&view=diff
==============================================================================
--- tiles/autotag/trunk/maven-autotag-plugin/pom.xml (original)
+++ tiles/autotag/trunk/maven-autotag-plugin/pom.xml Sun Dec  7 06:47:59 2014
@@ -38,15 +38,21 @@ under the License.
       <version>2.2.1</version>
     </dependency>
     <dependency>
+      <groupId>org.apache.maven.plugin-tools</groupId>
+      <artifactId>maven-plugin-annotations</artifactId>
+      <version>3.2</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <version>4.8.1</version>
       <scope>test</scope>
     </dependency>
     <dependency>
-    	<groupId>org.codehaus.plexus</groupId>
-    	<artifactId>plexus-compiler-api</artifactId>
-    	<version>1.7</version>
+    	<groupId>org.sonatype.plexus</groupId>
+    	<artifactId>plexus-build-api</artifactId>
+    	<version>0.0.7</version>
     </dependency>
     <dependency>
     	<groupId>org.apache.tiles</groupId>
@@ -65,10 +71,25 @@ under the License.
     </dependency>
     <dependency>
     	<groupId>org.apache.maven</groupId>
+    	<artifactId>maven-core</artifactId>
+    	<version>2.2.1</version>
+    </dependency>
+    <dependency>
+    	<groupId>org.apache.maven</groupId>
+    	<artifactId>maven-model</artifactId>
+    	<version>2.2.1</version>
+    </dependency>
+    <dependency>
+    	<groupId>org.apache.maven</groupId>
     	<artifactId>maven-project</artifactId>
     	<version>2.2.1</version>
     </dependency>
     <dependency>
+    	<groupId>org.apache.maven</groupId>
+    	<artifactId>maven-artifact</artifactId>
+    	<version>2.2.1</version>
+    </dependency>
+    <dependency>
     	<groupId>org.apache.tiles</groupId>
     	<artifactId>tiles-autotag-freemarker</artifactId>
     	<version>1.2-SNAPSHOT</version>
@@ -92,4 +113,65 @@ under the License.
     	<scope>test</scope>
     </dependency>
   </dependencies>
+  <build>
+  	<pluginManagement>
+  		<plugins>
+	      <plugin>
+	        <artifactId>maven-plugin-plugin</artifactId>
+	        <version>3.2</version>
+	        <configuration>
+	          <!-- see http://jira.codehaus.org/browse/MNG-5346 -->
+	          <skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound>
+	        </configuration>
+	        <executions>
+	          <execution>
+	            <id>default-descriptor</id>
+	            <phase>process-classes</phase>
+	            <goals>
+	              <goal>descriptor</goal>
+	            </goals>
+	          </execution>
+	          <execution>
+	            <id>default-addPluginArtifactMetadata</id>
+	            <phase>package</phase>
+	            <goals>
+	              <goal>addPluginArtifactMetadata</goal>
+	            </goals>
+	          </execution>
+	        </executions>
+	      </plugin>
+  			<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+  			<plugin>
+  				<groupId>org.eclipse.m2e</groupId>
+  				<artifactId>lifecycle-mapping</artifactId>
+  				<version>1.0.0</version>
+  				<configuration>
+  					<lifecycleMappingMetadata>
+  						<pluginExecutions>
+  							<pluginExecution>
+  								<pluginExecutionFilter>
+  									<groupId>
+  										org.apache.maven.plugins
+  									</groupId>
+  									<artifactId>
+  										maven-plugin-plugin
+  									</artifactId>
+  									<versionRange>
+  										[3.2,)
+  									</versionRange>
+  									<goals>
+  										<goal>descriptor</goal>
+  									</goals>
+  								</pluginExecutionFilter>
+  								<action>
+  									<ignore></ignore>
+  								</action>
+  							</pluginExecution>
+  						</pluginExecutions>
+  					</lifecycleMappingMetadata>
+  				</configuration>
+  			</plugin>
+  		</plugins>
+  	</pluginManagement>
+  </build>
 </project>

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=1643653&r1=1643652&r2=1643653&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 Sun Dec  7 06:47:59 2014
@@ -21,23 +21,27 @@
 package org.apache.tiles.autotag.plugin;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URL;
+import java.net.URLClassLoader;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
-import java.util.jar.JarFile;
-import java.util.zip.ZipEntry;
 
 import org.apache.maven.model.Resource;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugins.annotations.Component;
+import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.project.MavenProject;
+import org.apache.tiles.autotag.core.OutputLocator;
 import org.apache.tiles.autotag.generate.TemplateGenerator;
 import org.apache.tiles.autotag.generate.TemplateGeneratorFactory;
 import org.apache.tiles.autotag.model.TemplateSuite;
 import org.apache.velocity.app.VelocityEngine;
+import org.sonatype.plexus.build.incremental.BuildContext;
 
 import com.thoughtworks.xstream.XStream;
 import com.thoughtworks.xstream.converters.reflection.Sun14ReflectionProvider;
@@ -48,65 +52,63 @@ import com.thoughtworks.xstream.converte
  * @version $Rev$ $Date$
  */
 public abstract class AbstractGenerateMojo extends AbstractMojo {
-    /**
+	/**
      * The position of the template suite XML descriptor.
      */
     static final String META_INF_TEMPLATE_SUITE_XML = "META-INF/template-suite.xml";
 
     /**
      * The classpath elements.
-     *
-     * @parameter expression="${project.compileClasspathElements}"
-     * @required
-     * @readonly
      */
+    @Parameter(property = "project.compileClasspathElements", required = true, readonly = true)
     List<String> classpathElements;
 
     /**
      * Location of the generated classes.
-     *
-     * @parameter expression="${project.build.directory}/autotag-classes"
-     * @required
      */
-    File classesOutputDirectory;
+	@Parameter(defaultValue = "${project.build.directory}/autotag-classes", required = true)
+	File classesOutputDirectory;
 
     /**
      * Location of the generated resources.
-     *
-     * @parameter expression="${project.build.directory}/autotag-resources"
-     * @required
      */
+	@Parameter(defaultValue = "${project.build.directory}/autotag-resources", required = true)
     File resourcesOutputDirectory;
 
     /**
      * Name of the request class.
-     * @parameter expression="org.apache.tiles.request.Request"
-     * @required
      */
+	@Parameter(defaultValue = "org.apache.tiles.request.Request", required = true)
     String requestClass;
 
     /**
      * Name of the package.
-     * @parameter expression="sample"
-     * @required
      */
+	@Parameter(required = true)
     String packageName;
 
-    /**
-     * @parameter expression="${project}"
-     * @required
-     * @readonly
-     */
+	@Component
     MavenProject project;
 
+	@Component
+    BuildContext buildContext;
+    
+	OutputLocator classesOutputLocator;
+	OutputLocator resourcesOutputLocator;
+	
     /** {@inheritDoc} */
     public void execute() throws MojoExecutionException {
         try {
-            InputStream stream = findTemplateSuiteDescriptor();
-            XStream xstream = new XStream(new Sun14ReflectionProvider());
-            TemplateSuite suite = (TemplateSuite) xstream.fromXML(stream);
-            stream.close();
-
+        	TemplateSuite suite;
+        	InputStream stream = findTemplateSuiteDescriptor();
+            try {
+	            XStream xstream = new XStream(new Sun14ReflectionProvider());
+	            suite = (TemplateSuite) xstream.fromXML(stream);
+            } finally {
+	            stream.close();
+            }
+            classesOutputLocator = new MavenOutputLocator(classesOutputDirectory);
+            resourcesOutputLocator = new MavenOutputLocator(resourcesOutputDirectory);
             Properties props = new Properties();
             InputStream propsStream = getClass().getResourceAsStream("/org/apache/tiles/autotag/velocity.properties");
             props.load(propsStream);
@@ -115,11 +117,13 @@ public abstract class AbstractGenerateMo
                     new VelocityEngine(props)).createTemplateGenerator();
             generator.generate(packageName, suite, getParameters(), getRuntimeClass(), requestClass);
             if (generator.isGeneratingResources()) {
+            	buildContext.refresh(resourcesOutputDirectory);
                 Resource resource = new Resource();
                 resource.setDirectory(resourcesOutputDirectory.getAbsolutePath());
                 project.addResource(resource);
             }
             if (generator.isGeneratingClasses()) {
+            	buildContext.refresh(classesOutputDirectory);
                 project.addCompileSourceRoot(classesOutputDirectory.getAbsolutePath());
             }
         } catch (IOException e) {
@@ -153,25 +157,15 @@ public abstract class AbstractGenerateMo
      * @throws IOException If something goes wrong.
      */
     private InputStream findTemplateSuiteDescriptor() throws IOException {
-        InputStream retValue = null;
-
-        for (String path : classpathElements) {
-            File file = new File(path);
-            if (file.isDirectory()) {
-                File candidate = new File(file, META_INF_TEMPLATE_SUITE_XML);
-                if (candidate.exists()) {
-                    return new FileInputStream(candidate);
-                }
-            } else if (file.getPath().endsWith(".jar")) {
-                JarFile jar = new JarFile(file);
-                ZipEntry entry = jar.getEntry(META_INF_TEMPLATE_SUITE_XML);
-                if (entry != null) {
-                    return jar.getInputStream(entry);
-                }
-            }
+        URL[] urls = new URL[classpathElements.size()];
+        int i = 0;
+        for ( String classpathElement: classpathElements )
+        {
+            urls[i++] = new File(classpathElement).toURI().toURL();
         }
 
-        return retValue;
+        ClassLoader cl = new URLClassLoader( urls );
+        return cl.getResourceAsStream(META_INF_TEMPLATE_SUITE_XML);
     }
 
     /**
@@ -179,4 +173,21 @@ public abstract class AbstractGenerateMo
      * @return The name of the Runtime class.
      */
     protected abstract String getRuntimeClass();
+
+    private final class MavenOutputLocator implements OutputLocator {
+    	
+    	private File outputDirectory;
+    	
+    	private MavenOutputLocator(File outputDirectory) {
+    		this.outputDirectory = outputDirectory;
+    	}
+    	
+		@Override
+		public OutputStream getOutputStream(String resourcePath)
+				throws IOException {
+			File target = new File(outputDirectory, resourcePath);
+			target.getParentFile().mkdirs();
+			return buildContext.newFileOutputStream(target);
+		}
+	}
 }

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=1643653&r1=1643652&r2=1643653&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 Sun Dec  7 06:47:59 2014
@@ -37,97 +37,90 @@ package org.apache.tiles.autotag.plugin;
  */
 
 import java.io.File;
-import java.io.FileWriter;
 import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
 import java.io.Writer;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
 
 import org.apache.maven.model.Resource;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugins.annotations.Component;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.project.MavenProject;
 import org.apache.tiles.autotag.core.QDoxTemplateSuiteFactory;
 import org.apache.tiles.autotag.model.TemplateSuite;
-import org.codehaus.plexus.compiler.util.scan.InclusionScanException;
-import org.codehaus.plexus.compiler.util.scan.SimpleSourceInclusionScanner;
-import org.codehaus.plexus.compiler.util.scan.SourceInclusionScanner;
-import org.codehaus.plexus.compiler.util.scan.mapping.SourceMapping;
+import org.codehaus.plexus.util.Scanner;
+import org.sonatype.plexus.build.incremental.BuildContext;
 
 import com.thoughtworks.xstream.XStream;
 
 /**
  * Creates a descriptor for the template model in XML format.
- *
- * @goal create-descriptor
- *
- * @phase generate-resources
  */
+@Mojo(name = "create-descriptor", defaultPhase = LifecyclePhase.GENERATE_RESOURCES)
 public class CreateDescriptorMojo extends AbstractMojo {
     /**
      * Location of the file.
-     *
-     * @parameter expression="${project.build.directory}/autotag-template-suite"
-     * @required
      */
+	@Parameter(defaultValue = "${project.build.directory}/autotag-template-suite", required = true)
     File outputDirectory;
 
     /**
      * Location of the file.
-     *
-     * @parameter expression="${project.build.sourceDirectory}"
-     * @required
      */
+	@Parameter(property = "project.build.sourceDirectory", required = true)
     File sourceDirectory;
 
     /**
-     * @parameter
+     * included files.
      */
+	@Parameter
     Set<String> includes;
 
     /**
      * The name of the template.
-     *
-     * @parameter
-     * @required
      */
+	@Parameter(required = true)
     String name;
 
     /**
      * The documentation of the suite.
-     *
-     * @parameter
      */
+	@Parameter
     String documentation;
 
     /**
-     * @parameter
+     * Excluded files.
      */
+	@Parameter
     Set<String> excludes;
 
     /**
      * Name of the request class.
-     * @parameter expression="org.apache.tiles.request.Request"
-     * @required
      */
+	@Parameter(defaultValue="org.apache.tiles.request.Request", required = true)
     String requestClass;
 
-    /**
-     * @parameter expression="${project}"
-     * @required
-     * @readonly
-     */
+	@Parameter(property = "project", required = true, readonly = true)
     MavenProject project;
 
+	@Component
+    BuildContext buildContext;
+    
     /** {@inheritDoc} */
-    @SuppressWarnings("unchecked")
     public void execute() throws MojoExecutionException {
         try {
-            Set<File> filesSet = getSourceInclusionScanner().getIncludedSources(
-                    sourceDirectory, outputDirectory);
-            File[] files = new File[filesSet.size()];
-            QDoxTemplateSuiteFactory factory = new QDoxTemplateSuiteFactory(filesSet.toArray(files));
+            String[] fileNames = getSourceInclusionScanner().getIncludedFiles();
+            File[] files = new File[fileNames.length];
+            for(int i=0; i<fileNames.length; i++) {
+            	files[i] = new File(sourceDirectory, fileNames[i]);
+            }
+            QDoxTemplateSuiteFactory factory = new QDoxTemplateSuiteFactory(files);
             factory.setSuiteName(name);
             factory.setSuiteDocumentation(documentation);
             factory.setRequestClass(requestClass);
@@ -136,15 +129,14 @@ public class CreateDescriptorMojo extend
             File dir = new File(outputDirectory, "META-INF");
             dir.mkdirs();
             File outputFile = new File(dir, "template-suite.xml");
-            outputFile.createNewFile();
-            Writer writer = new FileWriter(outputFile);
+            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);
-        } catch (InclusionScanException e) {
-            throw new MojoExecutionException("error", e);
         } catch (IOException e) {
             throw new MojoExecutionException("error", e);
         }
@@ -155,8 +147,8 @@ public class CreateDescriptorMojo extend
      *
      * @return The inclusion scanner.
      */
-    private SourceInclusionScanner getSourceInclusionScanner() {
-        SourceInclusionScanner scanner = null;
+    private Scanner getSourceInclusionScanner() {
+    	Scanner scanner = buildContext.newScanner( sourceDirectory );
         if (includes == null) {
             includes = new HashSet<String>();
         }
@@ -164,24 +156,16 @@ public class CreateDescriptorMojo extend
             excludes = new HashSet<String>();
         }
 
-        if (includes.isEmpty() && excludes.isEmpty()) {
-            includes = Collections.singleton("**/*Model.java");
-            scanner = new SimpleSourceInclusionScanner(includes, excludes);
-        } else {
-            if (includes.isEmpty()) {
-                includes = Collections.singleton("**/*Model.java");
-            }
-            scanner = new SimpleSourceInclusionScanner(includes, excludes);
+        if (includes.isEmpty()) {
+            scanner.setIncludes(new String[] {"**/*Model.java"});
         }
-        scanner.addSourceMapping(new SourceMapping() {
-
-            @SuppressWarnings("rawtypes")
-            @Override
-            public Set getTargetFiles(File targetDir, String source) {
-                return null;
-            }
-        });
-
+        else {
+        	scanner.setIncludes(includes.toArray(new String[includes.size()]));
+        }
+        if (!excludes.isEmpty()) {
+        	scanner.setExcludes(excludes.toArray(new String[excludes.size()]));
+        }
+        scanner.scan();
         return scanner;
     }
 }

Modified: tiles/autotag/trunk/maven-autotag-plugin/src/main/java/org/apache/tiles/autotag/plugin/GenerateFreemarkerMojo.java
URL: http://svn.apache.org/viewvc/tiles/autotag/trunk/maven-autotag-plugin/src/main/java/org/apache/tiles/autotag/plugin/GenerateFreemarkerMojo.java?rev=1643653&r1=1643652&r2=1643653&view=diff
==============================================================================
--- tiles/autotag/trunk/maven-autotag-plugin/src/main/java/org/apache/tiles/autotag/plugin/GenerateFreemarkerMojo.java (original)
+++ tiles/autotag/trunk/maven-autotag-plugin/src/main/java/org/apache/tiles/autotag/plugin/GenerateFreemarkerMojo.java Sun Dec  7 06:47:59 2014
@@ -22,6 +22,10 @@ package org.apache.tiles.autotag.plugin;
 
 import java.util.Map;
 
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+import org.apache.maven.plugins.annotations.ResolutionScope;
 import org.apache.tiles.autotag.freemarker.FMTemplateGeneratorFactory;
 import org.apache.tiles.autotag.generate.TemplateGeneratorBuilder;
 import org.apache.tiles.autotag.generate.TemplateGeneratorFactory;
@@ -29,19 +33,17 @@ import org.apache.velocity.app.VelocityE
 
 /**
  * Generates Freemarker code.
- *
- * @goal generate-freemarker
- *
- * @phase generate-sources
- * @requiresDependencyResolution compile
  */
+@Mojo(
+	name = "generate-freemarker", 
+	defaultPhase = LifecyclePhase.GENERATE_SOURCES,
+	requiresDependencyResolution = ResolutionScope.COMPILE)
 public class GenerateFreemarkerMojo extends AbstractGenerateMojo {
 
     /**
      * Name of the Runtime.
-     * @parameter expression="org.apache.tiles.autotag.freemarker.runtime.Runtime"
-     * @required
      */
+	@Parameter(defaultValue = "org.apache.tiles.autotag.freemarker.runtime.Runtime", required = true)
     String freemarkerRuntime;
 
     /** {@inheritDoc} */
@@ -59,7 +61,7 @@ public class GenerateFreemarkerMojo exte
     @Override
     protected TemplateGeneratorFactory createTemplateGeneratorFactory(
             VelocityEngine velocityEngine) {
-        return new FMTemplateGeneratorFactory(classesOutputDirectory,
+        return new FMTemplateGeneratorFactory(classesOutputLocator,
                 velocityEngine, TemplateGeneratorBuilder.createNewInstance());
     }
 }

Modified: tiles/autotag/trunk/maven-autotag-plugin/src/main/java/org/apache/tiles/autotag/plugin/GenerateJspMojo.java
URL: http://svn.apache.org/viewvc/tiles/autotag/trunk/maven-autotag-plugin/src/main/java/org/apache/tiles/autotag/plugin/GenerateJspMojo.java?rev=1643653&r1=1643652&r2=1643653&view=diff
==============================================================================
--- tiles/autotag/trunk/maven-autotag-plugin/src/main/java/org/apache/tiles/autotag/plugin/GenerateJspMojo.java (original)
+++ tiles/autotag/trunk/maven-autotag-plugin/src/main/java/org/apache/tiles/autotag/plugin/GenerateJspMojo.java Sun Dec  7 06:47:59 2014
@@ -39,6 +39,10 @@ package org.apache.tiles.autotag.plugin;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+import org.apache.maven.plugins.annotations.ResolutionScope;
 import org.apache.tiles.autotag.generate.TemplateGeneratorBuilder;
 import org.apache.tiles.autotag.generate.TemplateGeneratorFactory;
 import org.apache.tiles.autotag.jsp.JspTemplateGeneratorFactory;
@@ -47,26 +51,23 @@ import org.apache.velocity.app.VelocityE
 
 /**
  * Goal which touches a timestamp file.
- *
- * @goal generate-jsp
- *
- * @phase generate-sources
- * @requiresDependencyResolution compile
  */
+@Mojo(
+	name = "generate-jsp", 
+	defaultPhase = LifecyclePhase.GENERATE_SOURCES,
+	requiresDependencyResolution = ResolutionScope.COMPILE)
 public class GenerateJspMojo extends AbstractGenerateMojo {
 
     /**
      * URI of the tag library.
-     *
-     * @parameter expression="http://www.example.com/tags/example"
      */
+	@Parameter(required = true)
     String taglibURI;
 
     /**
      * Name of the Runtime.
-     * @parameter expression="org.apache.tiles.autotag.jsp.runtime.Runtime"
-     * @required
      */
+	@Parameter(defaultValue = "org.apache.tiles.autotag.jsp.runtime.Runtime", required = true)
     String jspRuntime;
 
     /** {@inheritDoc} */
@@ -86,8 +87,8 @@ public class GenerateJspMojo extends Abs
     @Override
     protected TemplateGeneratorFactory createTemplateGeneratorFactory(
             VelocityEngine velocityEngine) {
-        return new JspTemplateGeneratorFactory(classesOutputDirectory,
-                resourcesOutputDirectory, velocityEngine,
+        return new JspTemplateGeneratorFactory(classesOutputLocator,
+                resourcesOutputLocator, velocityEngine,
                 TemplateGeneratorBuilder.createNewInstance());
     }
 }

Modified: tiles/autotag/trunk/maven-autotag-plugin/src/main/java/org/apache/tiles/autotag/plugin/GenerateVelocityMojo.java
URL: http://svn.apache.org/viewvc/tiles/autotag/trunk/maven-autotag-plugin/src/main/java/org/apache/tiles/autotag/plugin/GenerateVelocityMojo.java?rev=1643653&r1=1643652&r2=1643653&view=diff
==============================================================================
--- tiles/autotag/trunk/maven-autotag-plugin/src/main/java/org/apache/tiles/autotag/plugin/GenerateVelocityMojo.java (original)
+++ tiles/autotag/trunk/maven-autotag-plugin/src/main/java/org/apache/tiles/autotag/plugin/GenerateVelocityMojo.java Sun Dec  7 06:47:59 2014
@@ -38,6 +38,10 @@ package org.apache.tiles.autotag.plugin;
 
 import java.util.Map;
 
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+import org.apache.maven.plugins.annotations.ResolutionScope;
 import org.apache.tiles.autotag.generate.TemplateGeneratorBuilder;
 import org.apache.tiles.autotag.generate.TemplateGeneratorFactory;
 import org.apache.tiles.autotag.velocity.VelocityTemplateGeneratorFactory;
@@ -46,19 +50,17 @@ import org.apache.velocity.app.VelocityE
 
 /**
  * Generates Velocity code.
- *
- * @goal generate-velocity
- *
- * @phase generate-sources
- * @requiresDependencyResolution compile
  */
+@Mojo(
+	name = "generate-velocity",
+	defaultPhase = LifecyclePhase.GENERATE_SOURCES,
+	requiresDependencyResolution = ResolutionScope.COMPILE)
 public class GenerateVelocityMojo extends AbstractGenerateMojo {
 
     /**
      * Name of the Runtime.
-     * @parameter expression="org.apache.tiles.autotag.velocity.runtime.Runtime"
-     * @required
      */
+	@Parameter(defaultValue = "org.apache.tiles.autotag.velocity.runtime.Runtime", required = true)
     String velocityRuntime;
 
     /** {@inheritDoc} */
@@ -76,8 +78,8 @@ public class GenerateVelocityMojo extend
     @Override
     protected TemplateGeneratorFactory createTemplateGeneratorFactory(
             VelocityEngine velocityEngine) {
-        return new VelocityTemplateGeneratorFactory(classesOutputDirectory,
-                resourcesOutputDirectory, velocityEngine,
+        return new VelocityTemplateGeneratorFactory(classesOutputLocator,
+                resourcesOutputLocator, velocityEngine,
                 TemplateGeneratorBuilder.createNewInstance());
     }
 }

Added: tiles/autotag/trunk/maven-autotag-plugin/src/main/resources/META-INF/m2e/lifecycle-mapping-metadata.xml
URL: http://svn.apache.org/viewvc/tiles/autotag/trunk/maven-autotag-plugin/src/main/resources/META-INF/m2e/lifecycle-mapping-metadata.xml?rev=1643653&view=auto
==============================================================================
--- tiles/autotag/trunk/maven-autotag-plugin/src/main/resources/META-INF/m2e/lifecycle-mapping-metadata.xml (added)
+++ tiles/autotag/trunk/maven-autotag-plugin/src/main/resources/META-INF/m2e/lifecycle-mapping-metadata.xml Sun Dec  7 06:47:59 2014
@@ -0,0 +1,56 @@
+<lifecycleMappingMetadata>
+  <pluginExecutions>
+    <pluginExecution>
+      <pluginExecutionFilter>
+        <goals>
+          <goal>create-descriptor</goal>
+        </goals>
+      </pluginExecutionFilter>
+      <action>
+        <execute>
+          <runOnConfiguration>true</runOnConfiguration>
+          <runOnIncremental>true</runOnIncremental>
+        </execute>
+      </action>
+    </pluginExecution>
+    <pluginExecution>
+      <pluginExecutionFilter>
+        <goals>
+          <goal>generate-freemarker</goal>
+        </goals>
+      </pluginExecutionFilter>
+      <action>
+        <execute>
+          <runOnConfiguration>true</runOnConfiguration>
+          <runOnIncremental>true</runOnIncremental>
+        </execute>
+      </action>
+    </pluginExecution>
+    <pluginExecution>
+      <pluginExecutionFilter>
+        <goals>
+          <goal>generate-jsp</goal>
+        </goals>
+      </pluginExecutionFilter>
+      <action>
+        <execute>
+          <runOnConfiguration>true</runOnConfiguration>
+          <runOnIncremental>true</runOnIncremental>
+        </execute>
+      </action>
+    </pluginExecution>
+    <pluginExecution>
+      <pluginExecutionFilter>
+        <goals>
+          <goal>generate-velocity</goal>
+        </goals>
+      </pluginExecutionFilter>
+      <action>
+        <execute>
+          <runOnConfiguration>true</runOnConfiguration>
+          <runOnIncremental>true</runOnIncremental>
+        </execute>
+      </action>
+    </pluginExecution>
+  </pluginExecutions>
+</lifecycleMappingMetadata>
\ No newline at end of file

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=1643653&r1=1643652&r2=1643653&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 Sun Dec  7 06:47:59 2014
@@ -37,6 +37,7 @@ import org.apache.tiles.autotag.generate
 import org.apache.tiles.autotag.model.TemplateSuite;
 import org.apache.velocity.app.VelocityEngine;
 import org.junit.Test;
+import org.sonatype.plexus.build.incremental.BuildContext;
 
 /**
  * Tests {@link AbstractGenerateMojo}.
@@ -53,6 +54,7 @@ public class AbstractGenerateMojoTest {
     @Test
     public void testExecute() throws IOException, MojoExecutionException {
         MavenProject mavenProject = createMock(MavenProject.class);
+        BuildContext buildContext = createMock(BuildContext.class);
         TemplateGeneratorFactory factory = createMock(TemplateGeneratorFactory.class);
         TemplateGenerator generator = createMock(TemplateGenerator.class);
         @SuppressWarnings("unchecked")
@@ -74,7 +76,10 @@ public class AbstractGenerateMojoTest {
         mojo.packageName = "my.package";
         mojo.project = mavenProject;
         mojo.requestClass = "my.package.Request";
+        mojo.buildContext = buildContext;
 
+        buildContext.refresh(isA(File.class));
+        buildContext.refresh(isA(File.class));
         expect(mojo.createTemplateGeneratorFactory(isA(VelocityEngine.class))).andReturn(factory);
         expect(factory.createTemplateGenerator()).andReturn(generator);
         expect(mojo.getParameters()).andReturn(params);
@@ -85,10 +90,10 @@ public class AbstractGenerateMojoTest {
         mavenProject.addResource(isA(Resource.class));
         mavenProject.addCompileSourceRoot(classesOutputDirectory.getAbsolutePath());
 
-        replay(mavenProject, mojo, factory, generator, params);
+        replay(mavenProject, buildContext, mojo, factory, generator, params);
         mojo.execute();
         FileUtils.deleteDirectory(temp);
-        verify(mavenProject, mojo, factory, generator, params);
+        verify(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=1643653&r1=1643652&r2=1643653&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 Sun Dec  7 06:47:59 2014
@@ -20,11 +20,20 @@
  */
 package org.apache.tiles.autotag.plugin;
 
-import static org.easymock.EasyMock.*;
-import static org.junit.Assert.*;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
 
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.FilenameFilter;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
@@ -44,7 +53,9 @@ import org.apache.tiles.autotag.plugin.i
 import org.apache.tiles.autotag.plugin.internal.ExampleModel;
 import org.apache.tiles.autotag.plugin.internal.ExampleRequest;
 import org.apache.tiles.autotag.plugin.internal.NotFeasibleExampleModel;
+import org.codehaus.plexus.util.Scanner;
 import org.junit.Test;
+import org.sonatype.plexus.build.incremental.BuildContext;
 
 import com.thoughtworks.xstream.XStream;
 import com.thoughtworks.xstream.converters.reflection.Sun14ReflectionProvider;
@@ -64,9 +75,12 @@ public class CreateDescriptorMojoTest {
     @Test
     public void testExecute() throws IOException, MojoExecutionException {
         MavenProject mavenProject = createMock(MavenProject.class);
+        BuildContext buildContext = createMock(BuildContext.class);
+        Scanner scanner = createMock(Scanner.class);
 
         CreateDescriptorMojo mojo = new CreateDescriptorMojo();
         mojo.sourceDirectory = new File(System.getProperty("basedir"), "src/test/java");
+        String[] models = getModels(mojo.sourceDirectory);
         File temp = File.createTempFile("autotagmojo", ".tmp");
         temp.delete();
         temp.mkdirs();
@@ -75,10 +89,18 @@ public class CreateDescriptorMojoTest {
         mojo.documentation = "This are the docs";
         mojo.project = mavenProject;
         mojo.requestClass = ExampleRequest.class.getName();
+        mojo.buildContext = buildContext;
 
         mavenProject.addResource(isA(Resource.class));
-
-        replay(mavenProject);
+        expect(buildContext.newScanner(isA(File.class))).andReturn(scanner);
+        scanner.setIncludes(isA(String[].class));
+        scanner.scan();
+        expect(scanner.getIncludedFiles()).andReturn(models);
+        File file = new File(temp, "META-INF/template-suite.xml");
+        file.getParentFile().mkdirs();
+        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"));
         XStream xstream = new XStream(new Sun14ReflectionProvider());
@@ -158,7 +180,22 @@ public class CreateDescriptorMojoTest {
 
         assertNull(suite.getTemplateClassByName(NotFeasibleExampleModel.class.getName()));
         FileUtils.deleteDirectory(temp);
-        verify(mavenProject);
+        verify(mavenProject, buildContext);
     }
 
+	private String[] getModels(File sourceDirectory) {
+		File modelDir = new File(sourceDirectory, "org/apache/tiles/autotag/plugin/internal/");
+        String[] models = modelDir.list(new FilenameFilter() {
+			
+			@Override
+			public boolean accept(File dir, String name) {
+				return name.endsWith("Model.java");
+			}
+		});
+        for(int i = 0; i<models.length; i++) {
+        	models[i] = "org/apache/tiles/autotag/plugin/internal/" + models[i];
+        }
+		return models;
+	}
+
 }

Modified: tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/AutotagRuntimeException.java
URL: http://svn.apache.org/viewvc/tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/AutotagRuntimeException.java?rev=1643653&r1=1643652&r2=1643653&view=diff
==============================================================================
--- tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/AutotagRuntimeException.java (original)
+++ tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/AutotagRuntimeException.java Sun Dec  7 06:47:59 2014
@@ -27,7 +27,9 @@ package org.apache.tiles.autotag.core;
  */
 public class AutotagRuntimeException extends RuntimeException {
 
-    /**
+	private static final long serialVersionUID = -7265964601637841559L;
+
+	/**
      * Constructor.
      */
     public AutotagRuntimeException() {

Modified: tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/ClassParseException.java
URL: http://svn.apache.org/viewvc/tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/ClassParseException.java?rev=1643653&r1=1643652&r2=1643653&view=diff
==============================================================================
--- tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/ClassParseException.java (original)
+++ tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/ClassParseException.java Sun Dec  7 06:47:59 2014
@@ -27,7 +27,9 @@ package org.apache.tiles.autotag.core;
  */
 public class ClassParseException extends AutotagRuntimeException {
 
-    /**
+	private static final long serialVersionUID = -8579521283073016196L;
+
+	/**
      * Constructor.
      */
     public ClassParseException() {

Added: 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=1643653&view=auto
==============================================================================
--- tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/DirectoryOutputLocator.java (added)
+++ tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/DirectoryOutputLocator.java Sun Dec  7 06:47:59 2014
@@ -0,0 +1,46 @@
+/*
+ * $Id$
+ *
+ * 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.tiles.autotag.core;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+/**
+ * Outputs the files in the test directory.
+ */
+public class DirectoryOutputLocator implements OutputLocator {
+
+	private File directory;
+
+	public DirectoryOutputLocator(File directory) {
+		this.directory = directory;
+	}
+
+	@Override
+	public OutputStream getOutputStream(String resourcePath) throws IOException {
+		File file = new File(directory, resourcePath);
+		file.getParentFile().mkdirs();
+		return new FileOutputStream(file);
+	}
+
+}

Added: 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=1643653&view=auto
==============================================================================
--- tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/OutputLocator.java (added)
+++ tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/core/OutputLocator.java Sun Dec  7 06:47:59 2014
@@ -0,0 +1,36 @@
+/*
+ * $Id$
+ *
+ * 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.tiles.autotag.core;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+/**
+ * Decouples the autotag generator from the actual location of the files.
+ */
+public interface OutputLocator {
+	/**
+	 * Returns a writer for the file at this path.
+	 * @param resourcePath the path of the file to write
+	 * @return a Writer for the file.
+	 */
+	OutputStream getOutputStream(String resourcePath) throws IOException;
+}

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=1643653&r1=1643652&r2=1643653&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 Sun Dec  7 06:47:59 2014
@@ -21,12 +21,13 @@
 package org.apache.tiles.autotag.generate;
 
 import java.io.File;
-import java.io.FileWriter;
 import java.io.IOException;
+import java.io.OutputStreamWriter;
 import java.io.Writer;
 import java.util.Map;
 
 import org.apache.tiles.autotag.core.AutotagRuntimeException;
+import org.apache.tiles.autotag.core.OutputLocator;
 import org.apache.tiles.autotag.model.TemplateClass;
 import org.apache.tiles.autotag.model.TemplateSuite;
 import org.apache.tiles.autotag.tool.StringTool;
@@ -59,13 +60,13 @@ public abstract class AbstractTemplateCl
     }
 
     @Override
-    public void generate(File directory, String packageName,
+    public void generate(OutputLocator outputLocator, String packageName,
             TemplateSuite suite, TemplateClass clazz, Map<String, String> parameters,
             String runtimeClass, String requestClass) {
-        File dir = new File(directory, getDirectoryName(directory, packageName,
-                suite, clazz, parameters, runtimeClass, requestClass));
-        dir.mkdirs();
-        File file = new File(dir, getFilename(dir, packageName, suite, clazz, parameters, runtimeClass, requestClass));
+        String filePath = 
+        		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);
@@ -75,10 +76,9 @@ public abstract class AbstractTemplateCl
         context.put("runtimeClass", runtimeClass);
         context.put("requestClass", requestClass);
         try {
-            file.createNewFile();
-            Template template = velocityEngine.getTemplate(getTemplatePath(dir,
+            Template template = velocityEngine.getTemplate(getTemplatePath(
                     packageName, suite, clazz, parameters, runtimeClass, requestClass));
-            Writer writer = new FileWriter(file);
+            Writer writer = new OutputStreamWriter(outputLocator.getOutputStream(filePath));
             try {
                 template.merge(context, writer);
             } finally {
@@ -105,42 +105,39 @@ public abstract class AbstractTemplateCl
     /**
      * Calculates and returns the template path.
      *
-     * @param directory The directory where the file will be written.
      * @param packageName The name of the package.
      * @param suite The template suite.
      * @param clazz The template class.
      * @param parameters The map of parameters.
      * @return The template path.
      */
-    protected abstract String getTemplatePath(File directory,
+    protected abstract String getTemplatePath(
             String packageName, TemplateSuite suite, TemplateClass clazz, Map<String, String> parameters,
             String runtimeClass, String requestClass);
 
     /**
      * Calculates and returns the filename of the generated file.
      *
-     * @param directory The directory where the file will be written.
      * @param packageName The name of the package.
      * @param suite The template suite.
      * @param clazz The template class.
      * @param parameters The map of parameters.
      * @return The template path.
      */
-    protected abstract String getFilename(File directory, String packageName,
+    protected abstract String getFilename(String packageName,
             TemplateSuite suite, TemplateClass clazz, Map<String, String> parameters, String runtimeClass,
             String requestClass);
 
     /**
      * Calculates and returns the directory where the file will be written..
      *
-     * @param directory The directory where the file will be written.
      * @param packageName The name of the package.
      * @param suite The template suite.
      * @param clazz The template class.
      * @param parameters The map of parameters.
      * @return The template path.
      */
-    protected abstract String getDirectoryName(File directory,
+    protected abstract String getDirectoryName(
             String packageName, TemplateSuite suite, TemplateClass clazz, Map<String, String> parameters, 
             String runtimeClass, String requestClass);
     

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=1643653&r1=1643652&r2=1643653&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 Sun Dec  7 06:47:59 2014
@@ -21,12 +21,13 @@
 package org.apache.tiles.autotag.generate;
 
 import java.io.File;
-import java.io.FileWriter;
 import java.io.IOException;
+import java.io.OutputStreamWriter;
 import java.io.Writer;
 import java.util.Map;
 
 import org.apache.tiles.autotag.core.AutotagRuntimeException;
+import org.apache.tiles.autotag.core.OutputLocator;
 import org.apache.tiles.autotag.model.TemplateSuite;
 import org.apache.tiles.autotag.tool.StringTool;
 import org.apache.velocity.Template;
@@ -57,20 +58,20 @@ public abstract class AbstractTemplateSu
     }
 
     @Override
-    public void generate(File directory, String packageName, TemplateSuite suite, Map<String, String> parameters) {
-        File dir = new File(directory, getDirectoryName(directory, packageName, suite, parameters));
-        dir.mkdirs();
-        File file = new File(dir, getFilename(dir, packageName, suite, parameters));
+    public void generate(OutputLocator outputLocator, String packageName, TemplateSuite suite, Map<String, String> parameters) {
+        String filePath = 
+        		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 {
-            file.createNewFile();
-            Template template = velocityEngine.getTemplate(getTemplatePath(dir,
+            Template template = velocityEngine.getTemplate(getTemplatePath(
                     packageName, suite, parameters));
-            Writer writer = new FileWriter(file);
+            Writer writer = new OutputStreamWriter(outputLocator.getOutputStream(filePath));
             try {
                 template.merge(context, writer);
             } finally {
@@ -95,38 +96,35 @@ public abstract class AbstractTemplateSu
     /**
      * Calculates and returns the template path.
      *
-     * @param directory The directory where the file will be written.
      * @param packageName The name of the package.
      * @param suite The template suite.
      * @param parameters The map of parameters.
      * @return The template path.
      */
-    protected abstract String getTemplatePath(File directory,
+    protected abstract String getTemplatePath(
             String packageName, TemplateSuite suite,
             Map<String, String> parameters);
 
     /**
      * Calculates and returns the filename of the generated file.
      *
-     * @param directory The directory where the file will be written.
      * @param packageName The name of the package.
      * @param suite The template suite.
      * @param parameters The map of parameters.
      * @return The template path.
      */
-    protected abstract String getFilename(File directory, String packageName,
+    protected abstract String getFilename(String packageName,
             TemplateSuite suite, Map<String, String> parameters);
 
     /**
      * Calculates and returns the directory where the file will be written..
      *
-     * @param directory The directory where the file will be written.
      * @param packageName The name of the package.
      * @param suite The template suite.
      * @param parameters The map of parameters.
      * @return The template path.
      */
-    protected abstract String getDirectoryName(File directory,
+    protected abstract String getDirectoryName(
             String packageName, TemplateSuite suite,
             Map<String, String> parameters);
 }

Modified: tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/BasicTemplateGenerator.java
URL: http://svn.apache.org/viewvc/tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/BasicTemplateGenerator.java?rev=1643653&r1=1643652&r2=1643653&view=diff
==============================================================================
--- tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/BasicTemplateGenerator.java (original)
+++ tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/BasicTemplateGenerator.java Sun Dec  7 06:47:59 2014
@@ -20,10 +20,10 @@
  */
 package org.apache.tiles.autotag.generate;
 
-import java.io.File;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.tiles.autotag.core.OutputLocator;
 import org.apache.tiles.autotag.model.TemplateClass;
 import org.apache.tiles.autotag.model.TemplateSuite;
 
@@ -79,11 +79,11 @@ class BasicTemplateGenerator implements
     public void generate(String packageName, TemplateSuite suite, Map<String, String> parameters, 
         String runtimeClass, String requestClass) {
         for (TSGeneratorDirectoryPair pair : templateSuiteGenerators) {
-            pair.getGenerator().generate(pair.getDirectory(), packageName, suite, parameters);
+            pair.getGenerator().generate(pair.getOutputLocator(), packageName, suite, parameters);
         }
         for (TemplateClass templateClass : suite.getTemplateClasses()) {
             for (TCGeneratorDirectoryPair pair : templateClassGenerators) {
-                pair.getGenerator().generate(pair.getDirectory(), packageName,
+                pair.getGenerator().generate(pair.getOutputLocator(), packageName,
                         suite, templateClass, parameters, runtimeClass, requestClass);
             }
         }
@@ -98,7 +98,7 @@ class BasicTemplateGenerator implements
         /**
          * The directory where files are generated.
          */
-        private File directory;
+        private OutputLocator outputLocator;
 
         /**
          * The generator.
@@ -111,9 +111,9 @@ class BasicTemplateGenerator implements
          * @param directory The directory where files are generated.
          * @param generator The generator.
          */
-        public TSGeneratorDirectoryPair(File directory,
+        public TSGeneratorDirectoryPair(OutputLocator outputLocator,
                 TemplateSuiteGenerator generator) {
-            this.directory = directory;
+            this.outputLocator = outputLocator;
             this.generator = generator;
         }
 
@@ -122,8 +122,8 @@ class BasicTemplateGenerator implements
          *
          * @return The directory where files are generated.
          */
-        public File getDirectory() {
-            return directory;
+        public OutputLocator getOutputLocator() {
+            return outputLocator;
         }
 
         /**
@@ -145,7 +145,7 @@ class BasicTemplateGenerator implements
         /**
          * The directory where files are generated.
          */
-        private File directory;
+        private OutputLocator outputLocator;
 
         /**
          * The generator.
@@ -158,9 +158,9 @@ class BasicTemplateGenerator implements
          * @param directory The directory where files are generated.
          * @param generator The generator.
          */
-        public TCGeneratorDirectoryPair(File directory,
+        public TCGeneratorDirectoryPair(OutputLocator outputLocator,
                 TemplateClassGenerator generator) {
-            this.directory = directory;
+            this.outputLocator = outputLocator;
             this.generator = generator;
         }
 
@@ -169,8 +169,8 @@ class BasicTemplateGenerator implements
          *
          * @return The directory where files are generated.
          */
-        public File getDirectory() {
-            return directory;
+        public OutputLocator getOutputLocator() {
+            return outputLocator;
         }
 
         /**

Modified: tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/TemplateClassGenerator.java
URL: http://svn.apache.org/viewvc/tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/TemplateClassGenerator.java?rev=1643653&r1=1643652&r2=1643653&view=diff
==============================================================================
--- tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/TemplateClassGenerator.java (original)
+++ tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/TemplateClassGenerator.java Sun Dec  7 06:47:59 2014
@@ -20,9 +20,9 @@
  */
 package org.apache.tiles.autotag.generate;
 
-import java.io.File;
 import java.util.Map;
 
+import org.apache.tiles.autotag.core.OutputLocator;
 import org.apache.tiles.autotag.model.TemplateClass;
 import org.apache.tiles.autotag.model.TemplateSuite;
 
@@ -43,7 +43,7 @@ public interface TemplateClassGenerator
      * @param parameters Configuration parameters.
      * @param runtimeClass The RequestBuilder implementation.
      */
-    void generate(File directory, String packageName, TemplateSuite suite,
+    void generate(OutputLocator directory, String packageName, TemplateSuite suite,
             TemplateClass clazz, Map<String, String> parameters,
             String runtimeClass, String requestClass);
 }

Modified: tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/TemplateGeneratorBuilder.java
URL: http://svn.apache.org/viewvc/tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/TemplateGeneratorBuilder.java?rev=1643653&r1=1643652&r2=1643653&view=diff
==============================================================================
--- tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/TemplateGeneratorBuilder.java (original)
+++ tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/TemplateGeneratorBuilder.java Sun Dec  7 06:47:59 2014
@@ -20,10 +20,10 @@
  */
 package org.apache.tiles.autotag.generate;
 
-import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.tiles.autotag.core.OutputLocator;
 import org.apache.tiles.autotag.generate.BasicTemplateGenerator.TCGeneratorDirectoryPair;
 import org.apache.tiles.autotag.generate.BasicTemplateGenerator.TSGeneratorDirectoryPair;
 
@@ -57,12 +57,12 @@ public class TemplateGeneratorBuilder {
     /**
      * The classes output directory.
      */
-    private File classesOutputDirectory;
+    private OutputLocator classesOutputLocator;
 
     /**
      * The resources output directory.
      */
-    private File resourcesOutputDirectory;
+    private OutputLocator resourcesOutputLocator;
 
     /**
      * Constructor.
@@ -87,8 +87,8 @@ public class TemplateGeneratorBuilder {
      * @param classesOutputDirectory The classes output directory.
      * @return This instance.
      */
-    public TemplateGeneratorBuilder setClassesOutputDirectory(File classesOutputDirectory) {
-        this.classesOutputDirectory = classesOutputDirectory;
+    public TemplateGeneratorBuilder setClassesOutputLocator(OutputLocator classesOutputLocator) {
+        this.classesOutputLocator = classesOutputLocator;
         return this;
     }
 
@@ -98,8 +98,8 @@ public class TemplateGeneratorBuilder {
      * @param resourcesOutputDirectory The resources output directory.
      * @return This instance.
      */
-    public TemplateGeneratorBuilder setResourcesOutputDirectory(File resourcesOutputDirectory) {
-        this.resourcesOutputDirectory = resourcesOutputDirectory;
+    public TemplateGeneratorBuilder setResourcesOutputLocator(OutputLocator resourcesOutputLocator) {
+        this.resourcesOutputLocator = resourcesOutputLocator;
         return this;
     }
 
@@ -110,12 +110,12 @@ public class TemplateGeneratorBuilder {
      * @return This instance.
      */
     public TemplateGeneratorBuilder addClassesTemplateSuiteGenerator(TemplateSuiteGenerator generator) {
-        if (classesOutputDirectory == null) {
+        if (classesOutputLocator == null) {
             throw new NullPointerException(
-                    "Classes output directory not specified, call 'setClassesOutputDirectory' first");
+                    "Classes output locator not specified, call 'setClassesOutputLocator' first");
         }
         templateSuiteGenerators.add(new TSGeneratorDirectoryPair(
-                classesOutputDirectory, generator));
+                classesOutputLocator, generator));
         generatingClasses = true;
         return this;
     }
@@ -127,12 +127,12 @@ public class TemplateGeneratorBuilder {
      * @return This instance.
      */
     public TemplateGeneratorBuilder addClassesTemplateClassGenerator(TemplateClassGenerator generator) {
-        if (classesOutputDirectory == null) {
+        if (classesOutputLocator == null) {
             throw new NullPointerException(
-                    "Classes output directory not specified, call 'setClassesOutputDirectory' first");
+                    "Classes output locator not specified, call 'setClassesOutputLocator' first");
         }
         templateClassGenerators.add(new TCGeneratorDirectoryPair(
-                classesOutputDirectory, generator));
+                classesOutputLocator, generator));
         generatingClasses = true;
         return this;
     }
@@ -144,12 +144,12 @@ public class TemplateGeneratorBuilder {
      * @return This instance.
      */
     public TemplateGeneratorBuilder addResourcesTemplateSuiteGenerator(TemplateSuiteGenerator generator) {
-        if (resourcesOutputDirectory == null) {
+        if (resourcesOutputLocator == null) {
             throw new NullPointerException(
-                    "Resources output directory not specified, call 'setClassesOutputDirectory' first");
+                    "Resources output locator not specified, call 'setClassesOutputLocator' first");
         }
         templateSuiteGenerators.add(new TSGeneratorDirectoryPair(
-                resourcesOutputDirectory, generator));
+                resourcesOutputLocator, generator));
         generatingResources = true;
         return this;
     }
@@ -161,12 +161,12 @@ public class TemplateGeneratorBuilder {
      * @return This instance.
      */
     public TemplateGeneratorBuilder addResourcesTemplateClassGenerator(TemplateClassGenerator generator) {
-        if (resourcesOutputDirectory == null) {
+        if (resourcesOutputLocator == null) {
             throw new NullPointerException(
-                    "Resources output directory not specified, call 'setClassesOutputDirectory' first");
+                    "Resources output locator not specified, call 'setClassesOutputLocator' first");
         }
         templateClassGenerators.add(new TCGeneratorDirectoryPair(
-                resourcesOutputDirectory, generator));
+        		resourcesOutputLocator, generator));
         generatingResources = true;
         return this;
     }

Modified: tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/TemplateSuiteGenerator.java
URL: http://svn.apache.org/viewvc/tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/TemplateSuiteGenerator.java?rev=1643653&r1=1643652&r2=1643653&view=diff
==============================================================================
--- tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/TemplateSuiteGenerator.java (original)
+++ tiles/autotag/trunk/tiles-autotag-core/src/main/java/org/apache/tiles/autotag/generate/TemplateSuiteGenerator.java Sun Dec  7 06:47:59 2014
@@ -20,9 +20,9 @@
  */
 package org.apache.tiles.autotag.generate;
 
-import java.io.File;
 import java.util.Map;
 
+import org.apache.tiles.autotag.core.OutputLocator;
 import org.apache.tiles.autotag.model.TemplateSuite;
 
 /**
@@ -35,10 +35,10 @@ public interface TemplateSuiteGenerator
     /**
      * Generates the code.
      *
-     * @param directory The base directory where the code will be put.
+     * @param outputLocator The base directory where the code will be put.
      * @param packageName The package name.
      * @param suite The template suite.
      * @param parameters Configuration parameters.
      */
-    void generate(File directory, String packageName, TemplateSuite suite, Map<String, String> parameters);
+    void generate(OutputLocator outputLocator, String packageName, TemplateSuite suite, Map<String, String> parameters);
 }

Modified: tiles/autotag/trunk/tiles-autotag-core/src/test/java/org/apache/tiles/autotag/generate/AbstractTemplateClassGeneratorTest.java
URL: http://svn.apache.org/viewvc/tiles/autotag/trunk/tiles-autotag-core/src/test/java/org/apache/tiles/autotag/generate/AbstractTemplateClassGeneratorTest.java?rev=1643653&r1=1643652&r2=1643653&view=diff
==============================================================================
--- tiles/autotag/trunk/tiles-autotag-core/src/test/java/org/apache/tiles/autotag/generate/AbstractTemplateClassGeneratorTest.java (original)
+++ tiles/autotag/trunk/tiles-autotag-core/src/test/java/org/apache/tiles/autotag/generate/AbstractTemplateClassGeneratorTest.java Sun Dec  7 06:47:59 2014
@@ -20,16 +20,24 @@
  */
 package org.apache.tiles.autotag.generate;
 
-import static org.easymock.EasyMock.*;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.createMockBuilder;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.expectLastCall;
+import static org.easymock.EasyMock.isA;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
 
 import java.io.File;
-import java.io.FileWriter;
 import java.io.IOException;
+import java.io.Writer;
 import java.util.Map;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.tiles.autotag.core.AutotagRuntimeException;
 import org.apache.tiles.autotag.core.ClassParseException;
+import org.apache.tiles.autotag.core.OutputLocator;
+import org.apache.tiles.autotag.core.DirectoryOutputLocator;
 import org.apache.tiles.autotag.model.TemplateClass;
 import org.apache.tiles.autotag.model.TemplateSuite;
 import org.apache.velocity.Template;
@@ -93,6 +101,7 @@ public class AbstractTemplateClassGenera
     public void testGenerate() throws Exception {
         directory.delete();
         directory.mkdir();
+        OutputLocator locator = new DirectoryOutputLocator(directory);
         TemplateSuite suite = createMock(TemplateSuite.class);
         TemplateClass clazz = createMock(TemplateClass.class);
         Template template = createMock(Template.class);
@@ -102,16 +111,15 @@ public class AbstractTemplateClassGenera
         String runtimeClass = "org.apache.tiles.autotag.test.DoStuffRuntime";
         String requestClass = "org.apache.tiles.autotag.test.DoStuffRequest";
 
-        expect(generator.getDirectoryName(directory, packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn("mydir");
-        File mydir = new File(directory, "mydir");
-        expect(generator.getFilename(mydir , packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn("myfile.txt");
+        expect(generator.getDirectoryName(packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn("mydir");
+        expect(generator.getFilename(packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn("myfile.txt");
         String sampleVmPath = "/sample.vm";
-        expect(generator.getTemplatePath(mydir, packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn(sampleVmPath);
+        expect(generator.getTemplatePath(packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn(sampleVmPath);
         expect(velocityEngine.getTemplate("/sample.vm")).andReturn(template);
-        template.merge(isA(VelocityContext.class), isA(FileWriter.class));
+        template.merge(isA(VelocityContext.class), isA(Writer.class));
 
         replay(velocityEngine, generator, suite, clazz, template, parameters);
-        generator.generate(directory, packageName, suite, clazz, parameters, runtimeClass, requestClass);
+        generator.generate(locator, packageName, suite, clazz, parameters, runtimeClass, requestClass);
         verify(velocityEngine, generator, suite, clazz, template, parameters);
     }
 
@@ -123,6 +131,7 @@ public class AbstractTemplateClassGenera
     public void testGenerateException1() throws Exception {
         directory.delete();
         directory.mkdir();
+        OutputLocator locator = new DirectoryOutputLocator(directory);
         TemplateSuite suite = createMock(TemplateSuite.class);
         TemplateClass clazz = createMock(TemplateClass.class);
         Template template = createMock(Template.class);
@@ -132,15 +141,14 @@ public class AbstractTemplateClassGenera
         String runtimeClass = "org.apache.tiles.autotag.test.DoStuffRuntime";
         String requestClass = "org.apache.tiles.autotag.test.DoStuffRequest";
 
-        expect(generator.getDirectoryName(directory, packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn("mydir");
-        File mydir = new File(directory, "mydir");
-        expect(generator.getFilename(mydir , packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn("myfile.txt");
+        expect(generator.getDirectoryName(packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn("mydir");
+        expect(generator.getFilename(packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn("myfile.txt");
         String sampleVmPath = "/sample.vm";
-        expect(generator.getTemplatePath(mydir, packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn(sampleVmPath);
+        expect(generator.getTemplatePath(packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn(sampleVmPath);
         expect(velocityEngine.getTemplate("/sample.vm")).andThrow(new ResourceNotFoundException("hello"));
 
         replay(velocityEngine, generator, suite, clazz, template, parameters);
-        generator.generate(directory, packageName, suite, clazz, parameters, runtimeClass, requestClass);
+        generator.generate(locator, packageName, suite, clazz, parameters, runtimeClass, requestClass);
         verify(velocityEngine, generator, suite, clazz, template, parameters);
     }
 
@@ -152,6 +160,7 @@ public class AbstractTemplateClassGenera
     public void testGenerateException2() throws Exception {
         directory.delete();
         directory.mkdir();
+        OutputLocator locator = new DirectoryOutputLocator(directory);
         TemplateSuite suite = createMock(TemplateSuite.class);
         TemplateClass clazz = createMock(TemplateClass.class);
         Template template = createMock(Template.class);
@@ -161,15 +170,14 @@ public class AbstractTemplateClassGenera
         String runtimeClass = "org.apache.tiles.autotag.test.DoStuffRuntime";
         String requestClass = "org.apache.tiles.autotag.test.DoStuffRequest";
 
-        expect(generator.getDirectoryName(directory, packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn("mydir");
-        File mydir = new File(directory, "mydir");
-        expect(generator.getFilename(mydir , packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn("myfile.txt");
+        expect(generator.getDirectoryName(packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn("mydir");
+        expect(generator.getFilename(packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn("myfile.txt");
         String sampleVmPath = "/sample.vm";
-        expect(generator.getTemplatePath(mydir, packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn(sampleVmPath);
+        expect(generator.getTemplatePath(packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn(sampleVmPath);
         expect(velocityEngine.getTemplate("/sample.vm")).andThrow(new ParseErrorException("hello"));
 
         replay(velocityEngine, generator, suite, clazz, template, parameters);
-        generator.generate(directory, packageName, suite, clazz, parameters, runtimeClass, requestClass);
+        generator.generate(locator, packageName, suite, clazz, parameters, runtimeClass, requestClass);
         verify(velocityEngine, generator, suite, clazz, template, parameters);
     }
 
@@ -181,6 +189,7 @@ public class AbstractTemplateClassGenera
     public void testGenerateException3() throws Exception {
         directory.delete();
         directory.mkdir();
+        OutputLocator locator = new DirectoryOutputLocator(directory);
         TemplateSuite suite = createMock(TemplateSuite.class);
         TemplateClass clazz = createMock(TemplateClass.class);
         Template template = createMock(Template.class);
@@ -190,15 +199,14 @@ public class AbstractTemplateClassGenera
         String runtimeClass = "org.apache.tiles.autotag.test.DoStuffRuntime";
         String requestClass = "org.apache.tiles.autotag.test.DoStuffRequest";
 
-        expect(generator.getDirectoryName(directory, packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn("mydir");
-        File mydir = new File(directory, "mydir");
-        expect(generator.getFilename(mydir , packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn("myfile.txt");
+        expect(generator.getDirectoryName(packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn("mydir");
+        expect(generator.getFilename(packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn("myfile.txt");
         String sampleVmPath = "/sample.vm";
-        expect(generator.getTemplatePath(mydir, packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn(sampleVmPath);
+        expect(generator.getTemplatePath(packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn(sampleVmPath);
         expect(velocityEngine.getTemplate("/sample.vm")).andThrow(new Exception());
 
         replay(velocityEngine, generator, suite, clazz, template, parameters);
-        generator.generate(directory, packageName, suite, clazz, parameters, runtimeClass, requestClass);
+        generator.generate(locator, packageName, suite, clazz, parameters, runtimeClass, requestClass);
         verify(velocityEngine, generator, suite, clazz, template, parameters);
     }
 
@@ -212,6 +220,7 @@ public class AbstractTemplateClassGenera
     public void testGenerateException4() throws Exception {
         directory.delete();
         directory.mkdir();
+        OutputLocator locator = new DirectoryOutputLocator(directory);
         TemplateSuite suite = createMock(TemplateSuite.class);
         TemplateClass clazz = createMock(TemplateClass.class);
         Template template = createMock(Template.class);
@@ -221,17 +230,16 @@ public class AbstractTemplateClassGenera
         String runtimeClass = "org.apache.tiles.autotag.test.DoStuffRuntime";
         String requestClass = "org.apache.tiles.autotag.test.DoStuffRequest";
 
-        expect(generator.getDirectoryName(directory, packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn("mydir");
-        File mydir = new File(directory, "mydir");
-        expect(generator.getFilename(mydir , packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn("myfile.txt");
+        expect(generator.getDirectoryName(packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn("mydir");
+        expect(generator.getFilename(packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn("myfile.txt");
         String sampleVmPath = "/sample.vm";
-        expect(generator.getTemplatePath(mydir, packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn(sampleVmPath);
+        expect(generator.getTemplatePath(packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn(sampleVmPath);
         expect(velocityEngine.getTemplate("/sample.vm")).andReturn(template);
-        template.merge(isA(VelocityContext.class), isA(FileWriter.class));
+        template.merge(isA(VelocityContext.class), isA(Writer.class));
         expectLastCall().andThrow(new IOException());
 
         replay(velocityEngine, generator, suite, clazz, template, parameters);
-        generator.generate(directory, packageName, suite, clazz, parameters, runtimeClass, requestClass);
+        generator.generate(locator, packageName, suite, clazz, parameters, runtimeClass, requestClass);
         verify(velocityEngine, generator, suite, clazz, template, parameters);
     }
 
@@ -245,6 +253,7 @@ public class AbstractTemplateClassGenera
     public void testGenerateException5() throws Exception {
         directory.delete();
         directory.mkdir();
+        OutputLocator locator = new DirectoryOutputLocator(directory);
         TemplateSuite suite = createMock(TemplateSuite.class);
         TemplateClass clazz = createMock(TemplateClass.class);
         Template template = createMock(Template.class);
@@ -254,17 +263,16 @@ public class AbstractTemplateClassGenera
         String runtimeClass = "org.apache.tiles.autotag.test.DoStuffRuntime";
         String requestClass = "org.apache.tiles.autotag.test.DoStuffRequest";
 
-        expect(generator.getDirectoryName(directory, packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn("mydir");
-        File mydir = new File(directory, "mydir");
-        expect(generator.getFilename(mydir , packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn("myfile.txt");
+        expect(generator.getDirectoryName(packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn("mydir");
+        expect(generator.getFilename(packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn("myfile.txt");
         String sampleVmPath = "/sample.vm";
-        expect(generator.getTemplatePath(mydir, packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn(sampleVmPath);
+        expect(generator.getTemplatePath(packageName, suite, clazz, parameters, runtimeClass, requestClass)).andReturn(sampleVmPath);
         expect(velocityEngine.getTemplate("/sample.vm")).andReturn(template);
-        template.merge(isA(VelocityContext.class), isA(FileWriter.class));
+        template.merge(isA(VelocityContext.class), isA(Writer.class));
         expectLastCall().andThrow(new ClassParseException());
 
         replay(velocityEngine, generator, suite, clazz, template, parameters);
-        generator.generate(directory, packageName, suite, clazz, parameters, runtimeClass, requestClass);
+        generator.generate(locator, packageName, suite, clazz, parameters, runtimeClass, requestClass);
         verify(velocityEngine, generator, suite, clazz, template, parameters);
     }