You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by ra...@apache.org on 2008/09/16 23:39:24 UTC
svn commit: r696076 - in /maven/archetype/trunk/archetype-common/src:
main/java/org/apache/maven/archetype/generator/
test/archetypes/fileset-1.0/archetype-resources/subproject/subsubproject/src/main/java/__rootArtifactId__/inner/__artifactId__/innest/...
Author: rafale
Date: Tue Sep 16 14:39:24 2008
New Revision: 696076
URL: http://svn.apache.org/viewvc?rev=696076&view=rev
Log:
applied patch for archetype-191 from Brad Szabo
Added:
maven/archetype/trunk/archetype-common/src/test/archetypes/fileset-1.0/archetype-resources/subproject/subsubproject/src/main/java/__rootArtifactId__/inner/__artifactId__/innest/ArbitraryProperty-__property-with-default-1__.java (with props)
maven/archetype/trunk/archetype-common/src/test/archetypes/fileset-1.0/archetype-resources/subproject/subsubproject/src/main/java/__rootArtifactId__/inner/__artifactId__/innest/SkipsUndefinedProperty-__undefined-property__-__property-with-default-2__.java (with props)
Modified:
maven/archetype/trunk/archetype-common/src/main/java/org/apache/maven/archetype/generator/DefaultFilesetArchetypeGenerator.java
maven/archetype/trunk/archetype-common/src/test/java/org/apache/maven/archetype/generator/DefaultArchetypeGeneratorTest.java
Modified: maven/archetype/trunk/archetype-common/src/main/java/org/apache/maven/archetype/generator/DefaultFilesetArchetypeGenerator.java
URL: http://svn.apache.org/viewvc/maven/archetype/trunk/archetype-common/src/main/java/org/apache/maven/archetype/generator/DefaultFilesetArchetypeGenerator.java?rev=696076&r1=696075&r2=696076&view=diff
==============================================================================
--- maven/archetype/trunk/archetype-common/src/main/java/org/apache/maven/archetype/generator/DefaultFilesetArchetypeGenerator.java (original)
+++ maven/archetype/trunk/archetype-common/src/main/java/org/apache/maven/archetype/generator/DefaultFilesetArchetypeGenerator.java Tue Sep 16 14:39:24 2008
@@ -54,6 +54,7 @@
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
+import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import org.apache.maven.archetype.ArchetypeGenerationRequest;
@@ -76,6 +77,17 @@
/** @plexus.requirement */
private VelocityComponent velocity;
+ /**
+ * Token delimiter.
+ */
+ private static final String DELIMITER = "__";
+
+ /**
+ * Pattern used to detect tokens in a string. Tokens are any text surrounded
+ * by the delimiter.
+ */
+ private static final Pattern TOKEN_PATTERN = Pattern.compile(".*" + DELIMITER + ".*" + DELIMITER + ".*");
+
public void generateArchetype( ArchetypeGenerationRequest request,
File archetypeFile,
String basedir )
@@ -369,13 +381,92 @@
String outputFileName = directory + "/" +
(packaged ? getPackageAsDirectory(packageName) : "") +
"/" + templateName.substring(moduleOffset.length() );
- outputFileName = StringUtils.replace(outputFileName, "__rootArtifactId__", (String)context.get("rootArtifactId"));
- outputFileName = StringUtils.replace(outputFileName, "__artifactId__", (String)context.get("artifactId"));
- File outputFile = new File(outputDirectoryFile, outputFileName);
+
+ if ( TOKEN_PATTERN.matcher(outputFileName).matches() )
+ {
+ outputFileName = replaceFilenameTokens( outputFileName, context );
+ }
+
+ File outputFile = new File( outputDirectoryFile, outputFileName );
return outputFile;
}
+ /**
+ * Replaces all tokens (text surrounded by the {@link #DELIMITER}) within
+ * the given string, using properties contained within the context. If a
+ * property does not exist in the context, the token is left unmodified
+ * and a warning is logged.
+ *
+ * @param filePath the file name and path to be interpolated
+ * @param context contains the available properties
+ */
+ private String replaceFilenameTokens( String filePath, Context context )
+ {
+ String interpolatedResult = filePath;
+ String propertyToken = null;
+ String contextPropertyValue = null;
+
+ int start = 0;
+ int end = 0;
+ int skipUndefinedPropertyIndex = 0;
+
+ int maxAttempts = StringUtils.countMatches( interpolatedResult,
+ DELIMITER ) / 2;
+
+ for ( int x = 0; x < maxAttempts && start != -1; x++ )
+ {
+ start = interpolatedResult.indexOf( DELIMITER, skipUndefinedPropertyIndex );
+
+ if ( start != -1 )
+ {
+ end = interpolatedResult.indexOf( DELIMITER,
+ start + DELIMITER.length() );
+
+ if ( end != -1 )
+ {
+ propertyToken = interpolatedResult.substring(
+ start + DELIMITER.length(), end );
+ }
+
+ contextPropertyValue = (String) context.get( propertyToken );
+
+ if ( contextPropertyValue != null &&
+ contextPropertyValue.trim().length() > 0 )
+ {
+ if (getLogger().isDebugEnabled())
+ {
+ getLogger().debug( "Replacing '" + DELIMITER + propertyToken
+ + DELIMITER + "' in file path '" +
+ interpolatedResult + "' with value '" +
+ contextPropertyValue + "'.");
+ }
+
+ interpolatedResult = StringUtils.replace(
+ interpolatedResult,
+ DELIMITER + propertyToken + DELIMITER,
+ contextPropertyValue );
+
+ } else
+ {
+ // Need to skip the undefined property
+ skipUndefinedPropertyIndex = end + DELIMITER.length() + 1;
+
+ getLogger().warn( "Property '" + propertyToken +
+ "' was not specified, so the token in '" +
+ interpolatedResult + "' is not being replaced." );
+ }
+ }
+ }
+
+ if (getLogger().isDebugEnabled())
+ {
+ getLogger().debug( "Final interpolated file path: '" + interpolatedResult + "'" );
+ }
+
+ return interpolatedResult;
+ }
+
private String getPackageInPathFormat( String aPackage )
{
return StringUtils.replace( aPackage, ".", "/" );
Added: maven/archetype/trunk/archetype-common/src/test/archetypes/fileset-1.0/archetype-resources/subproject/subsubproject/src/main/java/__rootArtifactId__/inner/__artifactId__/innest/ArbitraryProperty-__property-with-default-1__.java
URL: http://svn.apache.org/viewvc/maven/archetype/trunk/archetype-common/src/test/archetypes/fileset-1.0/archetype-resources/subproject/subsubproject/src/main/java/__rootArtifactId__/inner/__artifactId__/innest/ArbitraryProperty-__property-with-default-1__.java?rev=696076&view=auto
==============================================================================
--- maven/archetype/trunk/archetype-common/src/test/archetypes/fileset-1.0/archetype-resources/subproject/subsubproject/src/main/java/__rootArtifactId__/inner/__artifactId__/innest/ArbitraryProperty-__property-with-default-1__.java (added)
+++ maven/archetype/trunk/archetype-common/src/test/archetypes/fileset-1.0/archetype-resources/subproject/subsubproject/src/main/java/__rootArtifactId__/inner/__artifactId__/innest/ArbitraryProperty-__property-with-default-1__.java Tue Sep 16 14:39:24 2008
@@ -0,0 +1,14 @@
+groupId=${groupId}
+rootArtifactId=${rootArtifactId}
+artifactId=${artifactId}
+version=${version}
+package=${package}
+packageInPathFormat=${packageInPathFormat}
+property-without-default-1=${property-without-default-1}
+property-without-default-2=${property-without-default-2}
+property-without-default-3=${property-without-default-3}
+property-without-default-4=${property-without-default-4}
+property-with-default-1=${property-with-default-1}
+property-with-default-2=${property-with-default-2}
+property-with-default-3=${property-with-default-3}
+property-with-default-4=${property-with-default-4}
\ No newline at end of file
Propchange: maven/archetype/trunk/archetype-common/src/test/archetypes/fileset-1.0/archetype-resources/subproject/subsubproject/src/main/java/__rootArtifactId__/inner/__artifactId__/innest/ArbitraryProperty-__property-with-default-1__.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: maven/archetype/trunk/archetype-common/src/test/archetypes/fileset-1.0/archetype-resources/subproject/subsubproject/src/main/java/__rootArtifactId__/inner/__artifactId__/innest/SkipsUndefinedProperty-__undefined-property__-__property-with-default-2__.java
URL: http://svn.apache.org/viewvc/maven/archetype/trunk/archetype-common/src/test/archetypes/fileset-1.0/archetype-resources/subproject/subsubproject/src/main/java/__rootArtifactId__/inner/__artifactId__/innest/SkipsUndefinedProperty-__undefined-property__-__property-with-default-2__.java?rev=696076&view=auto
==============================================================================
--- maven/archetype/trunk/archetype-common/src/test/archetypes/fileset-1.0/archetype-resources/subproject/subsubproject/src/main/java/__rootArtifactId__/inner/__artifactId__/innest/SkipsUndefinedProperty-__undefined-property__-__property-with-default-2__.java (added)
+++ maven/archetype/trunk/archetype-common/src/test/archetypes/fileset-1.0/archetype-resources/subproject/subsubproject/src/main/java/__rootArtifactId__/inner/__artifactId__/innest/SkipsUndefinedProperty-__undefined-property__-__property-with-default-2__.java Tue Sep 16 14:39:24 2008
@@ -0,0 +1,14 @@
+groupId=${groupId}
+rootArtifactId=${rootArtifactId}
+artifactId=${artifactId}
+version=${version}
+package=${package}
+packageInPathFormat=${packageInPathFormat}
+property-without-default-1=${property-without-default-1}
+property-without-default-2=${property-without-default-2}
+property-without-default-3=${property-without-default-3}
+property-without-default-4=${property-without-default-4}
+property-with-default-1=${property-with-default-1}
+property-with-default-2=${property-with-default-2}
+property-with-default-3=${property-with-default-3}
+property-with-default-4=${property-with-default-4}
\ No newline at end of file
Propchange: maven/archetype/trunk/archetype-common/src/test/archetypes/fileset-1.0/archetype-resources/subproject/subsubproject/src/main/java/__rootArtifactId__/inner/__artifactId__/innest/SkipsUndefinedProperty-__undefined-property__-__property-with-default-2__.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: maven/archetype/trunk/archetype-common/src/test/java/org/apache/maven/archetype/generator/DefaultArchetypeGeneratorTest.java
URL: http://svn.apache.org/viewvc/maven/archetype/trunk/archetype-common/src/test/java/org/apache/maven/archetype/generator/DefaultArchetypeGeneratorTest.java?rev=696076&r1=696075&r2=696076&view=diff
==============================================================================
--- maven/archetype/trunk/archetype-common/src/test/java/org/apache/maven/archetype/generator/DefaultArchetypeGeneratorTest.java (original)
+++ maven/archetype/trunk/archetype-common/src/test/java/org/apache/maven/archetype/generator/DefaultArchetypeGeneratorTest.java Tue Sep 16 14:39:24 2008
@@ -722,6 +722,24 @@
"subsubproject"
);
+ template = "subproject/subsubproject/src/main/java/file/value/package/" +
+ "file-value/inner/subsubproject/innest/ArbitraryProperty-file-value.java";
+ assertTemplateContentGeneratedWithFileSetArchetype(
+ projectDirectory,
+ template,
+ "subsubproject"
+ );
+
+ // Test that undefined properties are safely ignored (and skipped)
+ template = "subproject/subsubproject/src/main/java/file/value/package/" +
+ "file-value/inner/subsubproject/innest/" +
+ "SkipsUndefinedProperty-__undefined-property__-file-value.java";
+ assertTemplateContentGeneratedWithFileSetArchetype(
+ projectDirectory,
+ template,
+ "subsubproject"
+ );
+
model =
readPom(
getProjectFile(
@@ -833,9 +851,9 @@
{
assertTrue(
"Exception not correct",
- result.getCause().getMessage().startsWith(
+ result.getCause().getMessage().startsWith(
"Archetype archetypes:basic:1.0 is not configured" ) &&
- result.getCause().getMessage().endsWith(
+ result.getCause().getMessage().endsWith(
"Property property-without-default-4 is missing." )
);
}