Author: jdcasey Date: Mon Feb 18 13:06:33 2008 New Revision: 628867 URL: http://svn.apache.org/viewvc?rev=628867&view=rev Log: [MASSEMBLY-278] Adding parameter ignoreMissingDescriptor (default value: false) to allow reuse of a single assembly configuration throughout a multimodule build, without failing on submodules that don't contain the assembly descriptor referenced by the configuration...instead, simply don't run for these cases.
Patch submitted by: Sejal Patel NOTE: I added two unit tests to DefaultAssemblyReaderTest to test this new functionality. Modified: maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/AssemblerConfigurationSource.java maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/io/DefaultAssemblyReader.java maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/mojos/AbstractAssemblyMojo.java maven/plugins/trunk/maven-assembly-plugin/src/test/java/org/apache/maven/plugin/assembly/io/DefaultAssemblyReaderTest.java Modified: maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/AssemblerConfigurationSource.java URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/AssemblerConfigurationSource.java?rev=628867&r1=628866&r2=628867&view=diff ============================================================================== --- maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/AssemblerConfigurationSource.java (original) +++ maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/AssemblerConfigurationSource.java Mon Feb 18 13:06:33 2008 @@ -80,4 +80,5 @@ boolean isIgnoreDirFormatExtensions(); + boolean isIgnoreMissingDescriptor(); } Modified: maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/io/DefaultAssemblyReader.java URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/io/DefaultAssemblyReader.java?rev=628867&r1=628866&r2=628867&view=diff ============================================================================== --- maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/io/DefaultAssemblyReader.java (original) +++ maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/io/DefaultAssemblyReader.java Mon Feb 18 13:06:33 2008 @@ -122,13 +122,13 @@ if ( descriptor != null ) { locator.setStrategies( strategies ); - assemblies.add( getAssemblyFromDescriptor( descriptor, locator, configSource ) ); + addAssemblyFromDescriptor( descriptor, locator, configSource, assemblies ); } if ( descriptorId != null ) { locator.setStrategies( refStrategies ); - assemblies.add( getAssemblyForDescriptorReference( descriptorId, configSource ) ); + addAssemblyForDescriptorReference( descriptorId, configSource, assemblies ); } if ( ( descriptors != null ) && ( descriptors.length > 0 ) ) @@ -137,7 +137,7 @@ for ( int i = 0; i < descriptors.length; i++ ) { getLogger().info( "Reading assembly descriptor: " + descriptors[i] ); - assemblies.add( getAssemblyFromDescriptor( descriptors[i], locator, configSource ) ); + addAssemblyFromDescriptor( descriptors[i], locator, configSource, assemblies ); } } @@ -146,7 +146,7 @@ locator.setStrategies( refStrategies ); for ( int i = 0; i < descriptorRefs.length; i++ ) { - assemblies.add( getAssemblyForDescriptorReference( descriptorRefs[i], configSource ) ); + addAssemblyForDescriptorReference( descriptorRefs[i], configSource, assemblies ); } } @@ -190,14 +190,21 @@ { for ( int i = 0; i < paths.length; i++ ) { - assemblies.add( getAssemblyFromDescriptor( paths[i], locator, configSource ) ); + addAssemblyFromDescriptor( paths[i], locator, configSource, assemblies ); } } } if ( assemblies.isEmpty() ) { - throw new AssemblyReadException( "No assembly descriptors found." ); + if ( configSource.isIgnoreMissingDescriptor() ) + { + getLogger().debug( "Ignoring missing assembly descriptors per configuration. See messages above for specifics." ); + } + else + { + throw new AssemblyReadException( "No assembly descriptors found." ); + } } // check unique IDs @@ -217,17 +224,40 @@ public Assembly getAssemblyForDescriptorReference( String ref, AssemblerConfigurationSource configSource ) throws AssemblyReadException, InvalidAssemblerConfigurationException { + return addAssemblyForDescriptorReference( ref, configSource, new ArrayList( 1 ) ); + } + + public Assembly getAssemblyFromDescriptorFile( File file, AssemblerConfigurationSource configSource ) + throws AssemblyReadException, InvalidAssemblerConfigurationException + { + return addAssemblyFromDescriptorFile( file, configSource, new ArrayList( 1 ) ); + } + + private Assembly addAssemblyForDescriptorReference( String ref, AssemblerConfigurationSource configSource, List assemblies ) + throws AssemblyReadException, InvalidAssemblerConfigurationException + { InputStream resourceAsStream = getClass().getResourceAsStream( "/assemblies/" + ref + ".xml" ); if ( resourceAsStream == null ) { - throw new AssemblyReadException( "Descriptor with ID '" + ref + "' not found" ); + if ( configSource.isIgnoreMissingDescriptor() ) + { + getLogger().debug( "Ignoring missing assembly descriptor with ID '" + ref + "' per configuration." ); + return null; + } + else + { + throw new AssemblyReadException( "Descriptor with ID '" + ref + "' not found" ); + } } try { // TODO use ReaderFactory.newXmlReader() when plexus-utils is upgraded to 1.4.5+ - return readAssembly( new InputStreamReader( resourceAsStream, "UTF-8" ), ref, configSource ); + Assembly assembly = readAssembly( new InputStreamReader( resourceAsStream, "UTF-8" ), ref, configSource ); + + assemblies.add( assembly ); + return assembly; } catch ( UnsupportedEncodingException e ) { @@ -236,15 +266,32 @@ } } - public Assembly getAssemblyFromDescriptorFile( File descriptor, AssemblerConfigurationSource configSource ) + private Assembly addAssemblyFromDescriptorFile( File descriptor, AssemblerConfigurationSource configSource, List assemblies ) throws AssemblyReadException, InvalidAssemblerConfigurationException { + if ( !descriptor.exists() ) + { + if ( configSource.isIgnoreMissingDescriptor() ) + { + getLogger().debug( "Ignoring missing assembly descriptor: '" + descriptor + "' per configuration." ); + return null; + } + else + { + throw new AssemblyReadException( "Descriptor: '" + descriptor + "' not found" ); + } + } + Reader r = null; try { // TODO use ReaderFactory.newXmlReader() when plexus-utils is upgraded to 1.4.5+ r = new InputStreamReader( new FileInputStream( descriptor ), "UTF-8" ); - return readAssembly( r, descriptor.getAbsolutePath(), configSource ); + Assembly assembly = readAssembly( r, descriptor.getAbsolutePath(), configSource ); + + assemblies.add( assembly ); + + return assembly; } catch ( IOException e ) { @@ -256,14 +303,25 @@ } } - public Assembly getAssemblyFromDescriptor( String spec, Locator locator, AssemblerConfigurationSource configSource ) + private Assembly addAssemblyFromDescriptor( String spec, Locator locator, AssemblerConfigurationSource configSource, List assemblies ) throws AssemblyReadException, InvalidAssemblerConfigurationException { Location location = locator.resolve( spec ); if ( location == null ) { - throw new AssemblyReadException( "Error locating assembly descriptor: " + spec + "\n\n" + locator.getMessageHolder().render() ); + if ( configSource.isIgnoreMissingDescriptor() ) + { + getLogger().debug( "Ignoring missing assembly descriptor with ID '" + spec + + "' per configuration.\nLocator output was:\n\n" + + locator.getMessageHolder().render() ); + return null; + } + else + { + throw new AssemblyReadException( "Error locating assembly descriptor: " + spec + + "\n\n" + locator.getMessageHolder().render() ); + } } Reader r = null; @@ -271,7 +329,11 @@ { // TODO use ReaderFactory.newXmlReader() when plexus-utils is upgraded to 1.4.5+ r = new InputStreamReader( location.getInputStream(), "UTF-8" ); - return readAssembly( r, spec, configSource ); + Assembly assembly = readAssembly( r, spec, configSource ); + + assemblies.add( assembly ); + + return assembly; } catch ( IOException e ) { Modified: maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/mojos/AbstractAssemblyMojo.java URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/mojos/AbstractAssemblyMojo.java?rev=628867&r1=628866&r2=628867&view=diff ============================================================================== --- maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/mojos/AbstractAssemblyMojo.java (original) +++ maven/plugins/trunk/maven-assembly-plugin/src/main/java/org/apache/maven/plugin/assembly/mojos/AbstractAssemblyMojo.java Mon Feb 18 13:06:33 2008 @@ -238,6 +238,12 @@ protected boolean appendAssemblyId; /** + * Set to true in order to not fail when a descriptor is missing. + * @parameter expression="${ignoreMissingDescriptor}" default-value="false" + */ + protected boolean ignoreMissingDescriptor; + + /** * This is a set of instructions to the archive builder, especially for building .jar files. It enables you to * specify a Manifest file for the jar, in addition to other options. * @@ -625,4 +631,11 @@ return ignoreDirFormatExtensions; } + public boolean isIgnoreMissingDescriptor() { + return ignoreMissingDescriptor; + } + + public void setIgnoreMissingDescriptor(boolean ignoreMissingDescriptor) { + this.ignoreMissingDescriptor = ignoreMissingDescriptor; + } } Modified: maven/plugins/trunk/maven-assembly-plugin/src/test/java/org/apache/maven/plugin/assembly/io/DefaultAssemblyReaderTest.java URL: http://svn.apache.org/viewvc/maven/plugins/trunk/maven-assembly-plugin/src/test/java/org/apache/maven/plugin/assembly/io/DefaultAssemblyReaderTest.java?rev=628867&r1=628866&r2=628867&view=diff ============================================================================== --- maven/plugins/trunk/maven-assembly-plugin/src/test/java/org/apache/maven/plugin/assembly/io/DefaultAssemblyReaderTest.java (original) +++ maven/plugins/trunk/maven-assembly-plugin/src/test/java/org/apache/maven/plugin/assembly/io/DefaultAssemblyReaderTest.java Mon Feb 18 13:06:33 2008 @@ -935,6 +935,57 @@ assertEquals( assembly.getId(), result.getId() ); } + public void testReadAssemblies_ShouldFailWhenSingleDescriptorFileMissing() + throws IOException, InvalidAssemblerConfigurationException + { + File basedir = fileManager.createTempDir(); + + File assemblyFile = new File( basedir, "test.xml" ); + assemblyFile.delete(); + + try + { + performReadAssemblies( basedir, + assemblyFile.getAbsolutePath(), + null, + null, + null, + null, + false ); + + fail( "Should fail when descriptor file is missing and ignoreDescriptors == false" ); + } + catch ( AssemblyReadException e ) + { + // expected. + } + } + + public void testReadAssemblies_ShouldIgnoreMissingSingleDescriptorFileWhenIgnoreIsConfigured() + throws IOException, InvalidAssemblerConfigurationException + { + File basedir = fileManager.createTempDir(); + + File assemblyFile = new File( basedir, "test.xml" ); + assemblyFile.delete(); + + try + { + performReadAssemblies( basedir, + assemblyFile.getAbsolutePath(), + null, + null, + null, + null, + true ); + } + catch ( AssemblyReadException e ) + { + e.printStackTrace(); + fail( "Setting ignoreMissingDescriptor == true (true flag in performReadAssemblies, above) should NOT produce an exception." ); + } + } + public void testReadAssemblies_ShouldGetAssemblyDescriptorFromSingleRef() throws IOException, AssemblyReadException, InvalidAssemblerConfigurationException { @@ -1056,7 +1107,9 @@ writeAssembliesToFile( assemblies, basedir ); - fileManager.createFile( basedir, "readme.txt", "This is just a readme file, not a descriptor." ); + fileManager.createFile( basedir, + "readme.txt", + "This is just a readme file, not a descriptor." ); List results = performReadAssemblies( basedir, null, null, null, null, basedir ); @@ -1109,6 +1162,24 @@ File descriptorDir ) throws AssemblyReadException, InvalidAssemblerConfigurationException { + return performReadAssemblies( basedir, + descriptor, + descriptorRef, + descriptors, + descriptorRefs, + descriptorDir, + false ); + } + + private List performReadAssemblies( File basedir, + String descriptor, + String descriptorRef, + String[] descriptors, + String[] descriptorRefs, + File descriptorDir, + boolean ignoreMissing ) + throws AssemblyReadException, InvalidAssemblerConfigurationException + { configSource.getDescriptor(); configSourceControl.setReturnValue( descriptor ); @@ -1133,6 +1204,9 @@ configSource.isSiteIncluded(); configSourceControl.setReturnValue( false, MockControl.ZERO_OR_MORE ); + + configSource.isIgnoreMissingDescriptor(); + configSourceControl.setReturnValue( ignoreMissing, MockControl.ZERO_OR_MORE ); mockManager.replayAll();