1 package org.apache.maven.plugin.war.packaging;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.apache.maven.artifact.Artifact;
23 import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter;
24 import org.apache.maven.plugin.MojoExecutionException;
25 import org.apache.maven.plugin.war.Overlay;
26 import org.codehaus.plexus.interpolation.InterpolationException;
27
28 import java.io.IOException;
29 import java.util.ArrayList;
30 import java.util.Iterator;
31 import java.util.List;
32 import java.util.Set;
33
34
35
36
37
38
39
40
41 public class ArtifactsPackagingTask
42 extends AbstractWarPackagingTask
43 {
44
45 public static final String TLD_PATH = "WEB-INF/tld/";
46
47 public static final String SERVICES_PATH = "WEB-INF/services/";
48
49 public static final String MODULES_PATH = "WEB-INF/modules/";
50
51 public static final String EXTENSIONS_PATH = "WEB-INF/extensions/";
52
53 private final Set artifacts;
54
55 private final String id;
56
57
58 public ArtifactsPackagingTask( Set artifacts, Overlay currentProjectOverlay )
59 {
60 this.artifacts = artifacts;
61 this.id = currentProjectOverlay.getId();
62 }
63
64
65 public void performPackaging( WarPackagingContext context )
66 throws MojoExecutionException
67 {
68 try
69 {
70 final ScopeArtifactFilter filter = new ScopeArtifactFilter( Artifact.SCOPE_RUNTIME );
71 final List duplicates = findDuplicates( context, artifacts );
72
73 for ( Iterator iter = artifacts.iterator(); iter.hasNext(); )
74 {
75 Artifact artifact = (Artifact) iter.next();
76 String targetFileName = getArtifactFinalName( context, artifact );
77
78 context.getLog().debug( "Processing: " + targetFileName );
79
80 if ( duplicates.contains( targetFileName ) )
81 {
82 context.getLog().debug( "Duplicate found: " + targetFileName );
83 targetFileName = artifact.getGroupId() + "-" + targetFileName;
84 context.getLog().debug( "Renamed to: " + targetFileName );
85 }
86 context.getWebappStructure().registerTargetFileName( artifact, targetFileName );
87
88 if ( !artifact.isOptional() && filter.include( artifact ) )
89 {
90 try
91 {
92 String type = artifact.getType();
93 if ( "tld".equals( type ) )
94 {
95 copyFile( id, context, artifact.getFile(), TLD_PATH + targetFileName );
96 }
97 else if ( "aar".equals( type ) )
98 {
99 copyFile( id, context, artifact.getFile(), SERVICES_PATH + targetFileName );
100 }
101 else if ( "mar".equals( type ) )
102 {
103 copyFile( id, context, artifact.getFile(), MODULES_PATH + targetFileName );
104 }
105 else if ( "xar".equals( type ) )
106 {
107 copyFile( id, context, artifact.getFile(), EXTENSIONS_PATH + targetFileName );
108 }
109 else if ( "jar".equals( type ) || "ejb".equals( type ) || "ejb-client".equals( type )
110 || "test-jar".equals( type ) )
111 {
112 copyFile( id, context, artifact.getFile(), LIB_PATH + targetFileName );
113 }
114 else if ( "par".equals( type ) )
115 {
116 targetFileName = targetFileName.substring( 0, targetFileName.lastIndexOf( '.' ) ) + ".jar";
117 copyFile( id, context, artifact.getFile(), LIB_PATH + targetFileName );
118 }
119 else if ( "war".equals( type ) )
120 {
121
122 context.getLog().debug( "war artifacts are handled as overlays, ignoring [" + artifact + "]" );
123 }
124 else if ( "zip".equals( type ) )
125 {
126
127 context.getLog().debug( "zip artifacts are handled as overlays, ignoring [" + artifact + "]" );
128 }
129 else
130 {
131 context.getLog().debug(
132 "Artifact of type [" + type + "] is not supported, ignoring [" + artifact + "]" );
133 }
134 }
135 catch ( IOException e )
136 {
137 throw new MojoExecutionException( "Failed to copy file for artifact [" + artifact + "]", e );
138 }
139 }
140 }
141 }
142 catch ( InterpolationException e )
143 {
144 throw new MojoExecutionException( e.getMessage(), e );
145 }
146 }
147
148
149
150
151
152
153
154
155
156 private List findDuplicates( WarPackagingContext context, Set artifacts )
157 throws InterpolationException
158 {
159 List duplicates = new ArrayList();
160 List identifiers = new ArrayList();
161 for ( Iterator iter = artifacts.iterator(); iter.hasNext(); )
162 {
163 Artifact artifact = (Artifact) iter.next();
164 String candidate = getArtifactFinalName( context, artifact );
165 if ( identifiers.contains( candidate ) )
166 {
167 duplicates.add( candidate );
168 }
169 else
170 {
171 identifiers.add( candidate );
172 }
173 }
174 return duplicates;
175 }
176 }