Author: hboutemy Date: Sun Aug 21 00:18:42 2011 New Revision: 1159926 URL: http://svn.apache.org/viewvc?rev=1159926&view=rev Log: [ARCHETYPE-289] add empty directory support (restricted to non-filtered filesets for the moment)
Added: maven/archetype/trunk/maven-archetype-plugin/src/it/build-archetype/src/main/resources/archetype-resources/src/main/resources/empty-directory/ Modified: maven/archetype/trunk/archetype-common/src/main/java/org/apache/maven/archetype/DefaultArchetypeManager.java maven/archetype/trunk/archetype-common/src/main/java/org/apache/maven/archetype/common/DefaultArchetypeArtifactManager.java maven/archetype/trunk/archetype-common/src/main/java/org/apache/maven/archetype/common/DefaultArchetypeFilesResolver.java maven/archetype/trunk/archetype-common/src/main/java/org/apache/maven/archetype/generator/DefaultFilesetArchetypeGenerator.java maven/archetype/trunk/maven-archetype-plugin/src/it/build-archetype/pom.xml maven/archetype/trunk/maven-archetype-plugin/src/it/build-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml maven/archetype/trunk/maven-archetype-plugin/src/it/build-archetype/verify.bsh Modified: maven/archetype/trunk/archetype-common/src/main/java/org/apache/maven/archetype/DefaultArchetypeManager.java URL: http://svn.apache.org/viewvc/maven/archetype/trunk/archetype-common/src/main/java/org/apache/maven/archetype/DefaultArchetypeManager.java?rev=1159926&r1=1159925&r2=1159926&view=diff ============================================================================== --- maven/archetype/trunk/archetype-common/src/main/java/org/apache/maven/archetype/DefaultArchetypeManager.java (original) +++ maven/archetype/trunk/archetype-common/src/main/java/org/apache/maven/archetype/DefaultArchetypeManager.java Sun Aug 21 00:18:42 2011 @@ -118,6 +118,19 @@ public class DefaultArchetypeManager { File[] files = currentSourceDirectory.listFiles(); + if ( files.length == 0 ) + { + // add an empty directory + String dirName = currentSourceDirectory.getAbsolutePath().substring( offset + 1 ); + + if ( File.separatorChar != '/' ) + { + dirName = dirName.replace( '\\', '/' ); + } + + zos.putNextEntry( new ZipEntry( dirName + '/' ) ); + } + for ( int i = 0; i < files.length; i++ ) { if ( files[i].isDirectory() ) Modified: maven/archetype/trunk/archetype-common/src/main/java/org/apache/maven/archetype/common/DefaultArchetypeArtifactManager.java URL: http://svn.apache.org/viewvc/maven/archetype/trunk/archetype-common/src/main/java/org/apache/maven/archetype/common/DefaultArchetypeArtifactManager.java?rev=1159926&r1=1159925&r2=1159926&view=diff ============================================================================== --- maven/archetype/trunk/archetype-common/src/main/java/org/apache/maven/archetype/common/DefaultArchetypeArtifactManager.java (original) +++ maven/archetype/trunk/archetype-common/src/main/java/org/apache/maven/archetype/common/DefaultArchetypeArtifactManager.java Sun Aug 21 00:18:42 2011 @@ -348,9 +348,9 @@ public class DefaultArchetypeArtifactMan { ZipEntry entry = (ZipEntry) enumeration.nextElement(); - if ( !entry.isDirectory() && entry.getName().startsWith( Constants.ARCHETYPE_RESOURCES ) ) + if ( entry.getName().startsWith( Constants.ARCHETYPE_RESOURCES ) ) { - // not supposed to be file.seperator + // not supposed to be file.separator String resource = entry.getName().substring( Constants.ARCHETYPE_RESOURCES.length() + 1 ); getLogger().debug( " - found resource (" + Constants.ARCHETYPE_RESOURCES + "/)" + resource ); // TODO:FIXME Modified: maven/archetype/trunk/archetype-common/src/main/java/org/apache/maven/archetype/common/DefaultArchetypeFilesResolver.java URL: http://svn.apache.org/viewvc/maven/archetype/trunk/archetype-common/src/main/java/org/apache/maven/archetype/common/DefaultArchetypeFilesResolver.java?rev=1159926&r1=1159925&r2=1159926&view=diff ============================================================================== --- maven/archetype/trunk/archetype-common/src/main/java/org/apache/maven/archetype/common/DefaultArchetypeFilesResolver.java (original) +++ maven/archetype/trunk/archetype-common/src/main/java/org/apache/maven/archetype/common/DefaultArchetypeFilesResolver.java Sun Aug 21 00:18:42 2011 @@ -60,6 +60,7 @@ public class DefaultArchetypeFilesResolv List<String> result = scanner.scan( files ); getLogger().debug( "Scanned " + result.size() + " filtered files in " + files.size() + " files" ); + System.out.println( "Scanned " + result.size() + " filtered files in " + files.size() + " files: " + StringUtils.join( result.iterator(), ", " ) ); return result; } 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=1159926&r1=1159925&r2=1159926&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 Sun Aug 21 00:18:42 2011 @@ -134,14 +134,11 @@ public class DefaultFilesetArchetypeGene File basedirPom = new File( request.getOutputDirectory(), Constants.ARCHETYPE_POM ); File pom = new File( outputDirectoryFile, Constants.ARCHETYPE_POM ); - List<String> archetypeResources = - archetypeArtifactManager.getFilesetArchetypeResources( archetypeFile ); + List<String> archetypeResources = archetypeArtifactManager.getFilesetArchetypeResources( archetypeFile ); - ZipFile archetypeZipFile = - archetypeArtifactManager.getArchetypeZipFile( archetypeFile ); + ZipFile archetypeZipFile = archetypeArtifactManager.getArchetypeZipFile( archetypeFile ); - ClassLoader archetypeJarLoader = - archetypeArtifactManager.getArchetypeJarLoader( archetypeFile ); + ClassLoader archetypeJarLoader = archetypeArtifactManager.getArchetypeJarLoader( archetypeFile ); Thread.currentThread().setContextClassLoader( archetypeJarLoader ); @@ -154,14 +151,11 @@ public class DefaultFilesetArchetypeGene { throw new PomFileExists( "This is a partial archetype and the pom.xml file doesn't exist." ); } - else - { - processPomWithMerge( context, pom, "" ); - processArchetypeTemplatesWithWarning( archetypeDescriptor, archetypeResources, - archetypeZipFile, "", context, packageName, - outputDirectoryFile ); - } + processPomWithMerge( context, pom, "" ); + + processArchetypeTemplatesWithWarning( archetypeDescriptor, archetypeResources, archetypeZipFile, + "", context, packageName, outputDirectoryFile ); } else { @@ -195,18 +189,16 @@ public class DefaultFilesetArchetypeGene throw new ProjectDirectoryExists( "A Maven 2 project already exists in the directory " + outputDirectoryFile.getPath() ); } - else + + if ( outputDirectoryFile.exists() ) { - if ( outputDirectoryFile.exists() ) - { - getLogger().warn( "The directory " + outputDirectoryFile.getPath() + " already exists." ); - } + getLogger().warn( "The directory " + outputDirectoryFile.getPath() + " already exists." ); + } - context.put( "rootArtifactId", artifactId ); + 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 ); } // ---------------------------------------------------------------------- @@ -252,7 +244,7 @@ public class DefaultFilesetArchetypeGene return StringUtils.replace( packageName, ".", "/" ); } - private void copyFile( final File outFile, final String template, final boolean failIfExists, + private boolean copyFile( final File outFile, final String template, final boolean failIfExists, final ZipFile archetypeZipFile ) throws FileNotFoundException, OutputFileExists, IOException { @@ -265,12 +257,18 @@ public class DefaultFilesetArchetypeGene else if ( outFile.exists() ) { getLogger().warn( "CP Don't override file " + outFile ); + + return false; + } + + ZipEntry input = archetypeZipFile.getEntry( Constants.ARCHETYPE_RESOURCES + "/" + template ); + + if ( input.isDirectory() ) + { + outFile.mkdirs(); } else { - ZipEntry input = - archetypeZipFile.getEntry( Constants.ARCHETYPE_RESOURCES + "/" + template ); - InputStream inputStream = null; OutputStream out = null; try @@ -289,20 +287,29 @@ public class DefaultFilesetArchetypeGene IOUtil.close( out ); } } + + return true; } - private void copyFiles( String directory, List<String> fileSetResources, boolean packaged, String packageName, - File outputDirectoryFile, ZipFile archetypeZipFile, String moduleOffset, - boolean failIfExists, Context context ) + private int copyFiles( String directory, List<String> fileSetResources, boolean packaged, String packageName, + File outputDirectoryFile, ZipFile archetypeZipFile, String moduleOffset, + boolean failIfExists, Context context ) throws OutputFileExists, FileNotFoundException, IOException { + int count = 0; + for ( String template : fileSetResources ) { File outputFile = getOutputFile( template, directory, outputDirectoryFile, packaged, packageName, moduleOffset, context ); - copyFile( outputFile, template, failIfExists, archetypeZipFile ); + if ( copyFile( outputFile, template, failIfExists, archetypeZipFile ) ) + { + count++; + } } + + return count; } private String getEncoding( String archetypeEncoding ) @@ -329,9 +336,7 @@ public class DefaultFilesetArchetypeGene outputFileName = replaceFilenameTokens( outputFileName, context ); } - File outputFile = new File( outputDirectoryFile, outputFileName ); - - return outputFile; + return new File( outputDirectoryFile, outputFileName ); } /** @@ -488,19 +493,26 @@ public class DefaultFilesetArchetypeGene archetypeZipFile, moduleOffset, true ); } - private void processFileSet( String directory, List<String> fileSetResources, boolean packaged, String packageName, - Context context, File outputDirectoryFile, String moduleOffset, - String archetypeEncoding, boolean failIfExists ) + private int processFileSet( String directory, List<String> fileSetResources, boolean packaged, String packageName, + Context context, File outputDirectoryFile, String moduleOffset, + String archetypeEncoding, boolean failIfExists ) throws OutputFileExists, ArchetypeGenerationFailure { + int count = 0; + for ( String template : fileSetResources ) { File outputFile = getOutputFile( template, directory, outputDirectoryFile, packaged, packageName, moduleOffset, context ); - processTemplate( outputFile, context, Constants.ARCHETYPE_RESOURCES + "/" + template, archetypeEncoding, - failIfExists ); + if ( processTemplate( outputFile, context, Constants.ARCHETYPE_RESOURCES + "/" + template, + archetypeEncoding, failIfExists ) ) + { + count++; + } } + + return count; } private void processFilesetModule( String rootArtifactId, String artifactId, final List<String> archetypeResources, @@ -634,8 +646,8 @@ public class DefaultFilesetArchetypeGene } @SuppressWarnings( "deprecation" ) - private void processTemplate( File outFile, Context context, String templateFileName, String encoding, - boolean failIfExists ) + private boolean processTemplate( File outFile, Context context, String templateFileName, String encoding, + boolean failIfExists ) throws OutputFileExists, ArchetypeGenerationFailure { templateFileName = templateFileName.replace( File.separatorChar, '/' ); @@ -656,43 +668,43 @@ public class DefaultFilesetArchetypeGene { throw new OutputFileExists( "Don't override file " + outFile.getAbsolutePath() ); } - else - { - getLogger().warn( "Don't override file " + outFile ); - } + + getLogger().warn( "Don't override file " + outFile ); + + return false; } - else + + if ( !outFile.getParentFile().exists() ) { - if ( !outFile.getParentFile().exists() ) - { - outFile.getParentFile().mkdirs(); - } + outFile.getParentFile().mkdirs(); + } - getLogger().debug( "Merging into " + outFile ); + getLogger().debug( "Merging into " + outFile ); - Writer writer = null; + Writer writer = null; - try - { - StringWriter stringWriter = new StringWriter(); + try + { + StringWriter stringWriter = new StringWriter(); - velocity.getEngine().mergeTemplate( templateFileName, encoding, context, stringWriter ); + velocity.getEngine().mergeTemplate( templateFileName, encoding, context, stringWriter ); - writer = new OutputStreamWriter( new FileOutputStream( outFile ), encoding ); + writer = new OutputStreamWriter( new FileOutputStream( outFile ), encoding ); - writer.write( StringUtils.unifyLineSeparators( stringWriter.toString() ) ); + writer.write( StringUtils.unifyLineSeparators( stringWriter.toString() ) ); - writer.flush(); - } - catch ( Exception e ) - { - throw new ArchetypeGenerationFailure( "Error merging velocity templates: " + e.getMessage(), e ); - } - finally - { - IOUtil.close( writer ); - } + writer.flush(); + } + catch ( Exception e ) + { + throw new ArchetypeGenerationFailure( "Error merging velocity templates: " + e.getMessage(), e ); + } + finally + { + IOUtil.close( writer ); } + + return true; } private void processTemplates( String packageName, File outputDirectoryFile, Context context, @@ -703,12 +715,14 @@ public class DefaultFilesetArchetypeGene Iterator<FileSet> iterator = archetypeDescriptor.getFileSets().iterator(); if ( iterator.hasNext() ) { - getLogger().debug( "Processing filesets" ); + getLogger().debug( "Processing filesets" + "\n " + archetypeResources ); } + int count = 0; while ( iterator.hasNext() ) { FileSet fileSet = iterator.next(); + count++; List<String> fileSetResources = archetypeFilesResolver.filterFiles( moduleOffset, fileSet, archetypeResources ); @@ -720,25 +734,30 @@ public class DefaultFilesetArchetypeGene if ( fileSet.isFiltered() ) { - getLogger().debug( - "Processing fileset " + fileSet + "\n\n\n\n" + fileSetResources + "\n\n" - + archetypeResources + "\n\n" ); + getLogger().debug( " Processing fileset " + fileSet + " -> " + fileSetResources.size() + ":\n " + + fileSetResources ); - processFileSet( fileSet.getDirectory(), fileSetResources, fileSet.isPackaged(), packageName, context, - outputDirectoryFile, moduleOffset, getEncoding( fileSet.getEncoding() ), failIfExists ); + int processed = + processFileSet( fileSet.getDirectory(), fileSetResources, fileSet.isPackaged(), packageName, + context, outputDirectoryFile, moduleOffset, getEncoding( fileSet.getEncoding() ), + failIfExists ); - getLogger().debug( "Processed " + fileSetResources.size() + " files." ); + getLogger().debug( " Processed " + processed + " files." ); } else { - getLogger().debug( "Copying fileset " + fileSet ); + getLogger().debug( " Copying fileset " + fileSet + " -> " + fileSetResources.size() + ":\n " + + fileSetResources ); - 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 " + fileSetResources.size() + " files." ); + getLogger().debug( " Copied " + copied + " files." ); } } + + getLogger().debug( "Processed " + count + " filesets" ); } private void restoreParentArtifactId( Context context, String parentArtifactId ) Modified: maven/archetype/trunk/maven-archetype-plugin/src/it/build-archetype/pom.xml URL: http://svn.apache.org/viewvc/maven/archetype/trunk/maven-archetype-plugin/src/it/build-archetype/pom.xml?rev=1159926&r1=1159925&r2=1159926&view=diff ============================================================================== --- maven/archetype/trunk/maven-archetype-plugin/src/it/build-archetype/pom.xml (original) +++ maven/archetype/trunk/maven-archetype-plugin/src/it/build-archetype/pom.xml Sun Aug 21 00:18:42 2011 @@ -46,6 +46,12 @@ under the License. <artifactId>maven-archetype-plugin</artifactId> <version>@project.version@</version> </plugin> + <plugin> + <artifactId>maven-resources-plugin</artifactId> + <configuration> + <includeEmptyDirs>true</includeEmptyDirs> + </configuration> + </plugin> </plugins> </pluginManagement> </build> Modified: maven/archetype/trunk/maven-archetype-plugin/src/it/build-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml URL: http://svn.apache.org/viewvc/maven/archetype/trunk/maven-archetype-plugin/src/it/build-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml?rev=1159926&r1=1159925&r2=1159926&view=diff ============================================================================== --- maven/archetype/trunk/maven-archetype-plugin/src/it/build-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml (original) +++ maven/archetype/trunk/maven-archetype-plugin/src/it/build-archetype/src/main/resources/META-INF/maven/archetype-metadata.xml Sun Aug 21 00:18:42 2011 @@ -43,5 +43,11 @@ under the License. <include>**/*.properties</include> </includes> </fileSet> + <fileSet filtered="false" packaged="false" encoding="UTF-8"> + <directory>src/main/resources</directory> + <includes> + <include>**</include> + </includes> + </fileSet> </fileSets> </archetype-descriptor> Modified: maven/archetype/trunk/maven-archetype-plugin/src/it/build-archetype/verify.bsh URL: http://svn.apache.org/viewvc/maven/archetype/trunk/maven-archetype-plugin/src/it/build-archetype/verify.bsh?rev=1159926&r1=1159925&r2=1159926&view=diff ============================================================================== --- maven/archetype/trunk/maven-archetype-plugin/src/it/build-archetype/verify.bsh (original) +++ maven/archetype/trunk/maven-archetype-plugin/src/it/build-archetype/verify.bsh Sun Aug 21 00:18:42 2011 @@ -42,4 +42,11 @@ if ( !packageInPathFormat.isFile() ) throw new Exception( packageInPathFormat + " file is missing or not a file." ); } +// ARCHETYPE-289 check empty directory creation +File artifactId = new File( main, "resources/empty-directory" ); +if ( !artifactId.isDirectory() ) +{ + throw new Exception( artifactId + " directory is missing or not a directory." ); +} + return true;