Author: dkulp Date: Thu Nov 29 11:09:35 2007 New Revision: 599545 URL: http://svn.apache.org/viewvc?rev=599545&view=rev Log: Fix problems with ApacheNotices being mangled. Suppport the new 1.3 style Apache NOTICE files. Fix creation of dependency-reduced-pom.xml if deps use properties (like ${pom.groupId}) Allow promotion of transitive deps to actual deps
Modified: maven/sandbox/trunk/plugins/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/mojo/ShadeMojo.java maven/sandbox/trunk/plugins/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/resource/ApacheNoticeResourceTransformer.java Modified: maven/sandbox/trunk/plugins/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/mojo/ShadeMojo.java URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/plugins/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/mojo/ShadeMojo.java?rev=599545&r1=599544&r2=599545&view=diff ============================================================================== --- maven/sandbox/trunk/plugins/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/mojo/ShadeMojo.java (original) +++ maven/sandbox/trunk/plugins/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/mojo/ShadeMojo.java Thu Nov 29 11:09:35 2007 @@ -136,6 +136,16 @@ * @parameter expression="${keepDependenciesWithProvidedScope}" default-value="false" */ private boolean keepDependenciesWithProvidedScope; + + /** + * When true, transitive deps of removed dependencies are promoted to direct dependencies. + * This should allow the drop in replacement of the removed deps with the new shaded + * jar and everything should still work. + * + * @parameter expression="${promoteTransitiveDependencies}" default-value="false" + */ + private boolean promoteTransitiveDependencies; + /** * The name of the classifier used in case the shaded artifact is attached. @@ -334,13 +344,41 @@ List dependencies = new ArrayList(); boolean modified = false; + + List origDeps = getProject().getDependencies(); + if ( promoteTransitiveDependencies ) + { + origDeps = new ArrayList(); + for ( Iterator it = project.getArtifacts().iterator(); it.hasNext(); ) + { + Artifact artifact = (Artifact) it.next(); - for ( Iterator i = model.getDependencies().iterator(); i.hasNext(); ) + //promote + Dependency dep = new Dependency(); + dep.setArtifactId( artifact.getArtifactId() ); + if (artifact.hasClassifier()) + { + dep.setClassifier( artifact.getClassifier() ); + } + dep.setGroupId( artifact.getGroupId() ); + dep.setOptional( artifact.isOptional() ); + dep.setScope( artifact.getScope() ); + dep.setType( artifact.getType() ); + dep.setVersion( artifact.getVersion() ); + + // How to do these? + //dep.setSystemPath( .... ); + //dep.setExclusions( exclusions ); + origDeps.add( dep ); + } + } + + for ( Iterator i = origDeps.iterator(); i.hasNext(); ) { Dependency d = (Dependency) i.next(); dependencies.add( d ); - + String id = d.getGroupId() + ":" + d.getArtifactId(); if ( artifactsToRemove.contains( id ) ) @@ -363,9 +401,11 @@ { model.setDependencies( dependencies ); - File f = new File( getProject().getFile().getParentFile(), "dependency-reduced-pom.xml" ); - - f.deleteOnExit(); + File f = new File( outputDirectory, "dependency-reduced-pom.xml" ); + if (f.exists()) + { + f.delete(); + } Writer w = new FileWriter( f ); Modified: maven/sandbox/trunk/plugins/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/resource/ApacheNoticeResourceTransformer.java URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/plugins/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/resource/ApacheNoticeResourceTransformer.java?rev=599545&r1=599544&r2=599545&view=diff ============================================================================== --- maven/sandbox/trunk/plugins/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/resource/ApacheNoticeResourceTransformer.java (original) +++ maven/sandbox/trunk/plugins/maven-shade-plugin/src/main/java/org/apache/maven/plugins/shade/resource/ApacheNoticeResourceTransformer.java Thu Nov 29 11:09:35 2007 @@ -24,16 +24,23 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; -import java.util.HashSet; +import java.text.SimpleDateFormat; +import java.util.Date; import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.Map; import java.util.Set; +import java.util.TreeSet; import java.util.jar.JarEntry; import java.util.jar.JarOutputStream; public class ApacheNoticeResourceTransformer implements ResourceTransformer { - Set entries = new HashSet(); + Set entries = new LinkedHashSet(); + Map organizationEntries = new LinkedHashMap(); + String projectName; String preamble1 = @@ -41,13 +48,18 @@ + "// NOTICE file corresponding to the section 4d of The Apache License,\n" + "// Version 2.0, in this case for "; - String preamble2 = "\n// ------------------------------------------------------------------\n\n"; + String preamble2 = "\n// ------------------------------------------------------------------\n"; - String preamble3 = "This product includes software developed at\n" + - "Apache Software Foundation (http://www.apache.org/).\n"; - - String copyright; + String preamble3 = "This product includes software developed at\n"; + + //defaults overridable via config in pom + String organizationName = "The Apache Software Foundation"; + String organizationURL = "http://www.apache.org/"; + String inceptionYear = "2006"; + String copyright; + + public boolean canTransformResource( String resource ) { String s = resource.toLowerCase(); @@ -63,29 +75,84 @@ public void processResource( InputStream is ) throws IOException { - copyright = projectName + "\nCopyright 2006-2007 Apache Software Foundation\n"; + if ( entries.isEmpty() ) + { + String year = new SimpleDateFormat( "yyyy" ).format( new Date() ); + if ( !inceptionYear.equals( year ) ) + { + year = inceptionYear + "-" + year; + } + + + //add headers + entries.add( preamble1 + projectName + preamble2 ); + //fake second entry, we'll look for a real one later + entries.add( projectName + "\nCopyright " + year + " " + organizationName + "\n" ); + entries.add( preamble3 + organizationName + " ("+ organizationURL +").\n" ); + } + BufferedReader reader = new BufferedReader(new InputStreamReader(is)); String line = reader.readLine(); StringBuffer sb = new StringBuffer(); - while (line != null) { - line = line.trim(); + Set currentOrg = null; + int lineCount = 0; + while ( line != null ) + { + String trimedLine = line.trim(); - if (!line.startsWith("//")) { - if (line.length() > 0) { - sb.append(line).append("\n"); - } else { - entries.add(sb.toString()); + if ( !trimedLine.startsWith( "//" ) ) + { + if ( trimedLine.length() > 0 ) + { + if ( trimedLine.startsWith( "- " ) ) + { + //resource-bundle 1.3 mode + if ( lineCount == 1 + && sb.toString().contains( "This product includes/uses software(s) developed by" )) + { + currentOrg = (Set) organizationEntries.get( sb.toString().trim() ); + if ( currentOrg == null ) + { + currentOrg = new TreeSet(); + organizationEntries.put( sb.toString().trim(), currentOrg ); + } + sb = new StringBuffer(); + } + else if ( sb.length() > 0 && currentOrg != null ) + { + currentOrg.add( sb.toString() ); + sb = new StringBuffer(); + } + + } + sb.append( line ).append( "\n" ); + lineCount++; + } + else + { + String ent = sb.toString(); + if ( ent.startsWith( projectName ) && ent.contains( "Copyright " ) ) + { + copyright = ent; + } + if ( currentOrg == null ) + { + entries.add( ent ); + } + else + { + currentOrg.add( ent ); + } sb = new StringBuffer(); + lineCount = 0; + currentOrg = null; } } line = reader.readLine(); } - - entries.remove(preamble3); - entries.remove(copyright); } public boolean hasTransformedResource() @@ -98,21 +165,43 @@ { jos.putNextEntry( new JarEntry( "META-INF/NOTICE" ) ); - OutputStreamWriter writer = new OutputStreamWriter(jos); - writer.write(preamble1); - writer.write(projectName); - writer.write(preamble2); + OutputStreamWriter writer = new OutputStreamWriter( jos ); - writer.write(copyright); - writer.write("\n"); - - writer.write(preamble3); - writer.write("\n"); - - for (Iterator itr = entries.iterator(); itr.hasNext();) { + int count = 0; + for ( Iterator itr = entries.iterator() ; itr.hasNext() ; ) + { + ++count; String line = (String) itr.next(); - writer.append(line); - writer.append('\n'); + if ( line.equals( copyright ) && count != 2) + { + continue; + } + + if ( count == 2 && copyright != null ) + { + writer.append( copyright ); + writer.append( '\n' ); + } + else + { + writer.append( line ); + writer.append( '\n' ); + } + if (count == 3) + { + //do org stuff + for (Iterator oit = organizationEntries.entrySet().iterator() ; oit.hasNext();) + { + Map.Entry entry = (Map.Entry) oit.next(); + writer.append( entry.getKey().toString() ).append( '\n' ); + Set entrySet = (Set)entry.getValue(); + for (Iterator eit = entrySet.iterator() ; eit.hasNext() ;) + { + writer.append( eit.next().toString() ); + } + writer.append( '\n' ); + } + } } writer.flush();