1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  package org.apache.maven.plugin.eclipse.writers.wtp;
20  
21  import java.io.File;
22  
23  import org.apache.maven.artifact.repository.ArtifactRepository;
24  import org.apache.maven.plugin.MojoExecutionException;
25  import org.apache.maven.plugin.eclipse.Constants;
26  import org.apache.maven.plugin.eclipse.Messages;
27  import org.apache.maven.plugin.eclipse.writers.AbstractEclipseWriter;
28  import org.apache.maven.plugin.ide.IdeDependency;
29  import org.apache.maven.plugin.ide.IdeUtils;
30  import org.apache.maven.plugin.ide.JeeUtils;
31  import org.apache.maven.project.MavenProject;
32  import org.codehaus.plexus.util.xml.XMLWriter;
33  
34  
35  
36  
37  
38  
39  
40  public abstract class AbstractWtpResourceWriter
41      extends AbstractEclipseWriter
42  {
43  
44      private static final String ELT_DEPENDENCY_OBJECT = "dependent-object"; 
45  
46      private static final String ELT_DEPENDENCY_TYPE = "dependency-type"; 
47  
48      private static final String ATTR_HANDLE = "handle"; 
49  
50      private static final String ELT_DEPENDENT_MODULE = "dependent-module"; 
51  
52      protected static final String ATTR_VALUE = "value"; 
53  
54      protected static final String ATTR_NAME = "name"; 
55  
56      protected static final String ELT_PROPERTY = "property"; 
57  
58      protected static final String ELT_VERSION = "version"; 
59  
60      protected static final String ATTR_MODULE_TYPE_ID = "module-type-id"; 
61  
62      protected static final String ATTR_SOURCE_PATH = "source-path"; 
63  
64      protected static final String ATTR_DEPLOY_PATH = "deploy-path"; 
65  
66      protected static final String ELT_WB_RESOURCE = "wb-resource"; 
67  
68      protected static final String ELT_MODULE_TYPE = "module-type"; 
69  
70      protected static final String ATTR_DEPLOY_NAME = "deploy-name"; 
71  
72      protected static final String ELT_WB_MODULE = "wb-module"; 
73  
74      protected static final String ATTR_MODULE_ID = "id"; 
75  
76      protected static final String ATTR_PROJECT_VERSION = "project-version"; 
77  
78      protected static final String ELT_PROJECT_MODULES = "project-modules"; 
79  
80      
81  
82  
83  
84  
85      protected void writeModuleTypeAccordingToPackaging( MavenProject project, XMLWriter writer,
86                                                          File buildOutputDirectory )
87          throws MojoExecutionException
88      {
89          if ( Constants.PROJECT_PACKAGING_WAR.equals( config.getPackaging() ) ) 
90          {
91              writer.addAttribute( ATTR_MODULE_TYPE_ID, "jst.web" ); 
92  
93              writer.startElement( ELT_VERSION );
94              String servletVersion;
95              if ( config.getJeeVersion() != null )
96              {
97                  servletVersion = JeeUtils.getJeeDescriptorFromJeeVersion( config.getJeeVersion() ).getServletVersion();
98              }
99              else
100             {
101                 servletVersion = JeeUtils.resolveServletVersion( config.getProject() );
102             }
103             writer.writeText( servletVersion );
104             writer.endElement();
105 
106             String contextRoot = config.getContextName();
107 
108             writer.startElement( ELT_PROPERTY );
109             writer.addAttribute( ATTR_NAME, "context-root" ); 
110             writer.addAttribute( ATTR_VALUE, contextRoot );
111             writer.endElement();
112         }
113         else if ( Constants.PROJECT_PACKAGING_EJB.equals( config.getPackaging() ) ) 
114         {
115             writer.addAttribute( ATTR_MODULE_TYPE_ID, "jst.ejb" ); 
116 
117             writer.startElement( ELT_VERSION );
118 
119             String ejbVersion;
120             if ( config.getJeeVersion() != null )
121             {
122                 ejbVersion = JeeUtils.getJeeDescriptorFromJeeVersion( config.getJeeVersion() ).getEjbVersion();
123             }
124             else
125             {
126                 ejbVersion = JeeUtils.resolveEjbVersion( config.getProject() );
127             }
128             writer.writeText( ejbVersion );
129 
130             writer.endElement();
131 
132             writer.startElement( ELT_PROPERTY );
133             writer.addAttribute( ATTR_NAME, "java-output-path" ); 
134             writer.addAttribute( ATTR_VALUE, "/" + 
135                 IdeUtils.toRelativeAndFixSeparator( config.getProject().getBasedir(), buildOutputDirectory, false ) );
136             writer.endElement();
137 
138         }
139         else if ( Constants.PROJECT_PACKAGING_EAR.equals( config.getPackaging() ) ) 
140         {
141             writer.addAttribute( ATTR_MODULE_TYPE_ID, "jst.ear" ); 
142 
143             writer.startElement( ELT_VERSION );
144             String jeeVersion;
145             if ( config.getJeeVersion() != null )
146             {
147                 jeeVersion = JeeUtils.getJeeDescriptorFromJeeVersion( config.getJeeVersion() ).getJeeVersion();
148             }
149             else
150             {
151                 jeeVersion = JeeUtils.resolveJeeVersion( config.getProject() );
152             }
153             writer.writeText( jeeVersion );
154             writer.endElement();
155         }
156         else
157         {
158             
159             writer.addAttribute( ATTR_MODULE_TYPE_ID, "jst.utility" ); 
160 
161             writer.startElement( ELT_PROPERTY );
162             writer.addAttribute( ATTR_NAME, "java-output-path" ); 
163             writer.addAttribute( ATTR_VALUE, "/" + 
164                 IdeUtils.toRelativeAndFixSeparator( config.getProject().getBasedir(), buildOutputDirectory, false ) );
165             writer.endElement();
166         }
167     }
168 
169     
170 
171 
172 
173 
174 
175 
176 
177 
178     protected void addDependency( XMLWriter writer, IdeDependency dep, ArtifactRepository localRepository,
179                                   File basedir, String deployPath )
180         throws MojoExecutionException
181     {
182         String handle;
183         String dependentObject = null;
184         String archiveName;
185 
186         
187         if ( Constants.PROJECT_PACKAGING_WAR.equals( dep.getType() )
188             || Constants.PROJECT_PACKAGING_EJB.equals( dep.getType() ) )
189         {
190             deployPath = "/";
191         }
192 
193         if ( dep.isReferencedProject() )
194         {
195             
196             
197             
198             
199 
200             handle = "module:/resource/" + dep.getEclipseProjectName() + "/" + dep.getEclipseProjectName(); 
201 
202             String archiveExtension = dep.getType();
203             if ( Constants.PROJECT_PACKAGING_EJB.equals( dep.getType() ) )
204             {
205                 dependentObject = "EjbModule_";
206                 
207                 archiveExtension = Constants.PROJECT_PACKAGING_JAR;
208             }
209             else if ( Constants.PROJECT_PACKAGING_WAR.equals( dep.getType() ) )
210             {
211                 dependentObject = "WebModule_";
212             }
213             archiveName = dep.getEclipseProjectName() + "." + archiveExtension;
214         }
215         else
216         {
217             
218             
219             
220             
221 
222             File artifactPath = dep.getFile();
223 
224             if ( artifactPath == null )
225             {
226                 log.error( Messages.getString( "EclipsePlugin.artifactpathisnull", dep.getId() ) ); 
227                 return;
228             }
229 
230             String fullPath = artifactPath.getPath();
231             File repoFile = new File( fullPath );
232 
233             if ( dep.isSystemScoped() )
234             {
235                 handle = "module:/classpath/lib/" 
236                     + IdeUtils.toRelativeAndFixSeparator( config.getEclipseProjectDirectory(), repoFile, false );
237             }
238             else
239             {
240                 File localRepositoryFile = new File( localRepository.getBasedir() );
241                 String relativePath = IdeUtils.toRelativeAndFixSeparator( localRepositoryFile, repoFile, false );
242 
243                 if ( !new File( relativePath ).isAbsolute() )
244                 {
245                     handle = "module:/classpath/var/M2_REPO/" 
246                         + relativePath;
247                 }
248                 else
249                 {
250                     handle = "module:/classpath/lib/" 
251                         + IdeUtils.toRelativeAndFixSeparator( config.getEclipseProjectDirectory(), repoFile, false );
252                 }
253             }
254             if ( Constants.PROJECT_PACKAGING_EAR.equals( this.config.getPackaging() ) && !"/".equals( deployPath ) )
255             {
256                 
257                 
258                 
259                 archiveName = "../" + artifactPath.getName();
260             }
261             else
262             {
263                 archiveName = artifactPath.getName();
264             }
265         }
266 
267         writer.startElement( ELT_DEPENDENT_MODULE );
268 
269         writer.addAttribute( "archiveName", archiveName );
270 
271         writer.addAttribute( ATTR_DEPLOY_PATH, deployPath ); 
272         writer.addAttribute( ATTR_HANDLE, handle );
273 
274         if ( dependentObject != null && config.getWtpVersion() >= 2.0f )
275         {
276             writer.startElement( ELT_DEPENDENCY_OBJECT );
277             writer.writeText( dependentObject + System.identityHashCode( dep ) );
278             writer.endElement();
279         }
280 
281         writer.startElement( ELT_DEPENDENCY_TYPE );
282         writer.writeText( "uses" ); 
283         writer.endElement();
284 
285         writer.endElement();
286     }
287 
288     protected void writeWarOrEarResources( XMLWriter writer, MavenProject project, ArtifactRepository localRepository )
289         throws MojoExecutionException
290     {
291         
292         String deployDir =
293             IdeUtils.getPluginSetting( config.getProject(), JeeUtils.ARTIFACT_MAVEN_EAR_PLUGIN, "defaultLibBundleDir",
294                                        "/" );
295 
296         if ( project.getPackaging().equals( Constants.PROJECT_PACKAGING_WAR ) )
297         {
298             deployDir = "/WEB-INF/lib";
299         }
300         
301         for ( int j = 0; j < config.getDeps().length; j++ )
302         {
303             IdeDependency dep = config.getDeps()[j];
304             String type = dep.getType();
305 
306             
307             
308             if ( ( !dep.isTestDependency() && !dep.isProvided() && !dep.isSystemScopedOutsideProject( project ) )
309                 && ( Constants.PROJECT_PACKAGING_JAR.equals( type ) || Constants.PROJECT_PACKAGING_EJB.equals( type )
310                     || "ejb-client".equals( type ) || Constants.PROJECT_PACKAGING_WAR.equals( type ) ) ) 
311             {
312                 addDependency( writer, dep, localRepository, config.getProject().getBasedir(), deployDir );
313             }
314         }
315     }
316 
317 }