Author: olamy
Date: Sat Oct 29 13:56:59 2011
New Revision: 1194889

URL: http://svn.apache.org/viewvc?rev=1194889&view=rev
Log:
[ARCHETYPE-383] Use velocity expressions in descriptor properties
Submitted by Emmanuel Hugonnet.

Modified:
    
maven/archetype/trunk/archetype-common/src/main/java/org/apache/maven/archetype/generator/DefaultFilesetArchetypeGenerator.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=1194889&r1=1194888&r2=1194889&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
 Sat Oct 29 13:56:59 2011
@@ -19,6 +19,7 @@ package org.apache.maven.archetype.gener
  * under the License.
  */
 
+import org.apache.maven.archetype.ArchetypeGenerationRequest;
 import org.apache.maven.archetype.common.ArchetypeArtifactManager;
 import org.apache.maven.archetype.common.ArchetypeFilesResolver;
 import org.apache.maven.archetype.common.Constants;
@@ -34,7 +35,9 @@ import org.apache.maven.archetype.metada
 import org.apache.maven.archetype.metadata.ArchetypeDescriptor;
 import org.apache.maven.archetype.metadata.FileSet;
 import org.apache.maven.archetype.metadata.ModuleDescriptor;
+import org.apache.maven.archetype.metadata.RequiredProperty;
 import org.apache.velocity.VelocityContext;
+import org.apache.velocity.app.Velocity;
 import org.apache.velocity.context.Context;
 import org.codehaus.plexus.component.annotations.Component;
 import org.codehaus.plexus.component.annotations.Requirement;
@@ -61,8 +64,6 @@ 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;
-import org.apache.maven.archetype.metadata.RequiredProperty;
 
 @Component( role = FilesetArchetypeGenerator.class )
 public class DefaultFilesetArchetypeGenerator
@@ -110,9 +111,9 @@ public class DefaultFilesetArchetypeGene
                     throw new ArchetypeNotConfigured( "No archetype was 
chosen.", null );
                 }
 
-                StringBuffer exceptionMessage =
-                    new StringBuffer( "Archetype " + 
request.getArchetypeGroupId() + ":"
-                        + request.getArchetypeArtifactId() + ":" + 
request.getArchetypeVersion() + " is not configured" );
+                StringBuffer exceptionMessage = new StringBuffer(
+                    "Archetype " + request.getArchetypeGroupId() + ":" + 
request.getArchetypeArtifactId() + ":"
+                        + request.getArchetypeVersion() + " is not configured" 
);
 
                 List<String> missingProperties = new ArrayList<String>( 0 );
                 for ( RequiredProperty requiredProperty : 
archetypeDescriptor.getRequiredProperties() )
@@ -156,8 +157,8 @@ public class DefaultFilesetArchetypeGene
 
                     processPomWithMerge( context, pom, "" );
 
-                    processArchetypeTemplatesWithWarning( archetypeDescriptor, 
archetypeResources, archetypeZipFile,
-                                                          "", context, 
packageName, outputDirectoryFile );
+                    processArchetypeTemplatesWithWarning( archetypeDescriptor, 
archetypeResources, archetypeZipFile, "",
+                                                          context, 
packageName, outputDirectoryFile );
                 }
                 else
                 {
@@ -165,8 +166,8 @@ public class DefaultFilesetArchetypeGene
                     {
                         processPomWithMerge( context, basedirPom, "" );
 
-                        processArchetypeTemplatesWithWarning( 
archetypeDescriptor, archetypeResources,
-                                                              
archetypeZipFile, "", context, packageName,
+                        processArchetypeTemplatesWithWarning( 
archetypeDescriptor, archetypeResources, archetypeZipFile,
+                                                              "", context, 
packageName,
                                                               new File( 
request.getOutputDirectory() ) );
                     }
                     else
@@ -188,8 +189,8 @@ public class DefaultFilesetArchetypeGene
                 getLogger().debug( "Processing complete archetype " + 
archetypeDescriptor.getName() );
                 if ( outputDirectoryFile.exists() && pom.exists() )
                 {
-                    throw new ProjectDirectoryExists( "A Maven 2 project 
already exists in the directory "
-                        + outputDirectoryFile.getPath() );
+                    throw new ProjectDirectoryExists(
+                        "A Maven 2 project already exists in the directory " + 
outputDirectoryFile.getPath() );
                 }
 
                 if ( outputDirectoryFile.exists() )
@@ -199,8 +200,8 @@ public class DefaultFilesetArchetypeGene
 
                 context.put( "rootArtifactId", artifactId );
 
-                processFilesetModule( artifactId, artifactId, 
archetypeResources, pom, archetypeZipFile, "",
-                                      basedirPom, outputDirectoryFile, 
packageName, archetypeDescriptor, context );
+                processFilesetModule( artifactId, artifactId, 
archetypeResources, pom, archetypeZipFile, "", basedirPom,
+                                      outputDirectoryFile, packageName, 
archetypeDescriptor, context );
             }
 
             // 
----------------------------------------------------------------------
@@ -247,7 +248,7 @@ public class DefaultFilesetArchetypeGene
     }
 
     private boolean copyFile( final File outFile, final String template, final 
boolean failIfExists,
-                           final ZipFile archetypeZipFile )
+                              final ZipFile archetypeZipFile )
         throws FileNotFoundException, OutputFileExists, IOException
     {
         getLogger().debug( "Copying file " + template );
@@ -330,8 +331,8 @@ public class DefaultFilesetArchetypeGene
         String templateName = StringUtils.replaceOnce( template, directory, "" 
);
 
         String outputFileName =
-            directory + "/" + ( packaged ? getPackageAsDirectory( packageName 
) : "" ) + "/"
-                + templateName.substring( moduleOffset.length() );
+            directory + "/" + ( packaged ? getPackageAsDirectory( packageName 
) : "" ) + "/" + templateName.substring(
+                moduleOffset.length() );
 
         if ( TOKEN_PATTERN.matcher( outputFileName ).matches() )
         {
@@ -348,7 +349,7 @@ public class DefaultFilesetArchetypeGene
      * and a warning is logged.
      *
      * @param filePath the file name and path to be interpolated
-     * @param context contains the available properties
+     * @param context  contains the available properties
      */
     private String replaceFilenameTokens( final String filePath, final Context 
context )
     {
@@ -382,8 +383,9 @@ public class DefaultFilesetArchetypeGene
 
                 if ( getLogger().isDebugEnabled() )
                 {
-                    getLogger().debug( "Replacing '" + search + "' in file 
path '" + interpolatedResult
-                                           + "' with value '" + 
contextPropertyValue + "'." );
+                    getLogger().debug(
+                        "Replacing '" + search + "' in file path '" + 
interpolatedResult + "' with value '"
+                            + contextPropertyValue + "'." );
                 }
 
                 interpolatedResult = StringUtils.replace( interpolatedResult, 
search, contextPropertyValue );
@@ -393,8 +395,9 @@ public class DefaultFilesetArchetypeGene
             else
             {
                 // Need to skip the undefined property
-                getLogger().warn( "Property '" + propertyToken + "' was not 
specified, so the token in '"
-                                      + interpolatedResult + "' is not being 
replaced." );
+                getLogger().warn(
+                    "Property '" + propertyToken + "' was not specified, so 
the token in '" + interpolatedResult
+                        + "' is not being replaced." );
             }
 
             start = end + DELIMITER.length() + 1;
@@ -445,8 +448,9 @@ public class DefaultFilesetArchetypeGene
         {
             getLogger().info( 
"----------------------------------------------------------------------------" 
);
 
-            getLogger().info( "Using following parameters for creating project 
from Archetype: "
-                                  + request.getArchetypeArtifactId() + ":" + 
request.getArchetypeVersion() );
+            getLogger().info(
+                "Using following parameters for creating project from 
Archetype: " + request.getArchetypeArtifactId()
+                    + ":" + request.getArchetypeVersion() );
 
             getLogger().info( 
"----------------------------------------------------------------------------" 
);
             getLogger().info( "Parameter: " + Constants.GROUP_ID + ", Value: " 
+ request.getGroupId() );
@@ -460,7 +464,12 @@ public class DefaultFilesetArchetypeGene
         {
             String key = (String) iterator.next();
 
-            Object value = request.getProperties().getProperty( key );
+            String value = request.getProperties().getProperty( key );
+
+            if ( maybeVelocityExpression( value ) )
+            {
+                value =  evaluateExpression( context, key, value );
+            }
 
             context.put( key, value );
 
@@ -472,6 +481,30 @@ public class DefaultFilesetArchetypeGene
         return context;
     }
 
+    private boolean maybeVelocityExpression( String value )
+    {
+        return value != null && value.contains( "${" );
+    }
+
+    private String evaluateExpression( Context context, String key, String 
value )
+    {
+        StringWriter stringWriter = new StringWriter();
+        try
+        {
+            Velocity.evaluate( context, stringWriter, key, value );
+            return stringWriter.toString();
+        }
+        catch ( Exception ex )
+        {
+            return value;
+        }
+        finally
+        {
+            IOUtil.close( stringWriter );
+        }
+
+    }
+
     private void processArchetypeTemplates( AbstractArchetypeDescriptor 
archetypeDescriptor,
                                             List<String> archetypeResources, 
ZipFile archetypeZipFile,
                                             String moduleOffset, Context 
context, String packageName,
@@ -548,17 +581,17 @@ public class DefaultFilesetArchetypeGene
         {
             ModuleDescriptor project = subprojects.next();
 
-            File moduleOutputDirectoryFile =
-                new File( outputDirectoryFile,
-                          StringUtils.replace( project.getDir(), 
"__rootArtifactId__", rootArtifactId ) );
+            File moduleOutputDirectoryFile = new File( outputDirectoryFile,
+                                                       StringUtils.replace( 
project.getDir(), "__rootArtifactId__",
+                                                                            
rootArtifactId ) );
 
             context.put( Constants.ARTIFACT_ID,
                          StringUtils.replace( project.getId(), 
"${rootArtifactId}", rootArtifactId ) );
 
             processFilesetModule( rootArtifactId,
                                   StringUtils.replace( project.getDir(), 
"__rootArtifactId__", rootArtifactId ),
-                                  archetypeResources,
-                                  new File( moduleOutputDirectoryFile, 
Constants.ARCHETYPE_POM ), archetypeZipFile,
+                                  archetypeResources, new File( 
moduleOutputDirectoryFile, Constants.ARCHETYPE_POM ),
+                                  archetypeZipFile,
                                   ( StringUtils.isEmpty( moduleOffset ) ? "" : 
( moduleOffset + "/" ) )
                                       + StringUtils.replace( project.getDir(), 
"${rootArtifactId}", rootArtifactId ),
                                   pom, moduleOutputDirectoryFile, packageName, 
project, context );
@@ -572,7 +605,8 @@ public class DefaultFilesetArchetypeGene
     private void processFilesetProject( final AbstractArchetypeDescriptor 
archetypeDescriptor, final String moduleId,
                                         final List<String> archetypeResources, 
final File pom,
                                         final ZipFile archetypeZipFile, String 
moduleOffset, final Context context,
-                                        final String packageName, final File 
outputDirectoryFile, final File basedirPom )
+                                        final String packageName, final File 
outputDirectoryFile,
+                                        final File basedirPom )
         throws DocumentException, XmlPullParserException, 
ArchetypeGenerationFailure, InvalidPackaging, IOException,
         FileNotFoundException, OutputFileExists
     {
@@ -600,8 +634,9 @@ public class DefaultFilesetArchetypeGene
     {
         getLogger().debug( "Processing pom " + pom );
 
-        processTemplate( pom, context, Constants.ARCHETYPE_RESOURCES + 
getOffsetSeparator( moduleOffset )
-            + Constants.ARCHETYPE_POM, getEncoding( null ), true );
+        processTemplate( pom, context,
+                         Constants.ARCHETYPE_RESOURCES + getOffsetSeparator( 
moduleOffset ) + Constants.ARCHETYPE_POM,
+                         getEncoding( null ), true );
     }
 
     private void processPomWithMerge( Context context, File pom, String 
moduleOffset )
@@ -611,8 +646,9 @@ public class DefaultFilesetArchetypeGene
 
         File temporaryPom = getTemporaryFile( pom );
 
-        processTemplate( temporaryPom, context, Constants.ARCHETYPE_RESOURCES 
+ getOffsetSeparator( moduleOffset )
-            + Constants.ARCHETYPE_POM, getEncoding( null ), true );
+        processTemplate( temporaryPom, context,
+                         Constants.ARCHETYPE_RESOURCES + getOffsetSeparator( 
moduleOffset ) + Constants.ARCHETYPE_POM,
+                         getEncoding( null ), true );
 
         pomManager.mergePoms( pom, temporaryPom );
 
@@ -628,14 +664,16 @@ public class DefaultFilesetArchetypeGene
         }
     }
 
-    private void processPomWithParent( Context context, File pom, String 
moduleOffset, File basedirPom, String moduleId )
+    private void processPomWithParent( Context context, File pom, String 
moduleOffset, File basedirPom,
+                                       String moduleId )
         throws OutputFileExists, XmlPullParserException, DocumentException, 
IOException, InvalidPackaging,
         ArchetypeGenerationFailure
     {
         getLogger().debug( "Processing pom " + pom + " with parent " + 
basedirPom );
 
-        processTemplate( pom, context, Constants.ARCHETYPE_RESOURCES + 
getOffsetSeparator( moduleOffset )
-            + Constants.ARCHETYPE_POM, getEncoding( null ), true );
+        processTemplate( pom, context,
+                         Constants.ARCHETYPE_RESOURCES + getOffsetSeparator( 
moduleOffset ) + Constants.ARCHETYPE_POM,
+                         getEncoding( null ), true );
 
         getLogger().debug( "Adding module " + moduleId );
 
@@ -652,9 +690,8 @@ public class DefaultFilesetArchetypeGene
         templateFileName = templateFileName.replace( File.separatorChar, '/' );
 
         String localTemplateFileName = templateFileName.replace( '/', 
File.separatorChar );
-        if ( !templateFileName.equals( localTemplateFileName )
-            && !velocity.getEngine().templateExists( templateFileName )
-            && velocity.getEngine().templateExists( localTemplateFileName ) )
+        if ( !templateFileName.equals( localTemplateFileName ) && 
!velocity.getEngine().templateExists(
+            templateFileName ) && velocity.getEngine().templateExists( 
localTemplateFileName ) )
         {
             templateFileName = localTemplateFileName;
         }
@@ -737,8 +774,8 @@ public class DefaultFilesetArchetypeGene
 
             // This creates an empty directory, even if there is no file to 
process
             // Fix for ARCHETYPE-57
-            getOutputFile( moduleOffset, fileSet.getDirectory(), 
outputDirectoryFile, fileSet.isPackaged(),
-                           packageName, moduleOffset, context ).mkdirs();
+            getOutputFile( moduleOffset, fileSet.getDirectory(), 
outputDirectoryFile, fileSet.isPackaged(), packageName,
+                           moduleOffset, context ).mkdirs();
 
             if ( fileSet.isFiltered() )
             {
@@ -757,9 +794,8 @@ public class DefaultFilesetArchetypeGene
                 getLogger().debug( "    Copying fileset " + fileSet + " -> " + 
fileSetResources.size() + ":\n      "
                                        + fileSetResources );
 
-                int copied =
-                    copyFiles( fileSet.getDirectory(), fileSetResources, 
fileSet.isPackaged(), packageName,
-                               outputDirectoryFile, archetypeZipFile, 
moduleOffset, failIfExists, context );
+                int copied = copyFiles( fileSet.getDirectory(), 
fileSetResources, fileSet.isPackaged(), packageName,
+                                        outputDirectoryFile, archetypeZipFile, 
moduleOffset, failIfExists, context );
 
                 getLogger().debug( "    Copied " + copied + " files." );
             }


Reply via email to