View Javadoc

1   package org.apache.maven.plugin.eclipse.writers.myeclipse;
2   
3   import java.io.File;
4   import java.io.FileWriter;
5   import java.io.IOException;
6   
7   import org.apache.maven.plugin.MojoExecutionException;
8   import org.apache.maven.plugin.eclipse.Constants;
9   import org.apache.maven.plugin.eclipse.Messages;
10  import org.apache.maven.plugin.eclipse.writers.AbstractEclipseWriter;
11  import org.apache.maven.plugin.ide.IdeUtils;
12  import org.apache.maven.plugin.ide.JeeDescriptor;
13  import org.apache.maven.plugin.ide.JeeUtils;
14  import org.codehaus.plexus.util.IOUtil;
15  import org.codehaus.plexus.util.xml.PrettyPrintXMLWriter;
16  import org.codehaus.plexus.util.xml.XMLWriter;
17  
18  /**
19   * MyEclipse .mymetadata configuration file writer
20   * 
21   * @author Olivier Jacob
22   */
23  public class MyEclipseMetadataWriter
24      extends AbstractEclipseWriter
25  {
26  
27      private static final String MYECLIPSE_MYMETADATA_FILENAME = ".mymetadata";
28  
29      private static final String MYECLIPSE_METADATA_PROJECT = "project-module";
30  
31      private static final String MYECLIPSE_METADATA_PROJECT_TYPE = "type";
32  
33      private static final String MYECLIPSE_METADATA_PROJECT_NAME = "name";
34  
35      private static final String MYECLIPSE_METADATA_PROJECT_ID = "id";
36  
37      private static final String MYECLIPSE_METADATA_PROJECT_CONTEXT_ROOT = "context-root";
38  
39      private static final String MYECLIPSE_METADATA_PROJECT_J2EE_SPEC = "j2ee-spec";
40  
41      private static final String MYECLIPSE_METADATA_PROJECT_ARCHIVE = "archive";
42  
43      private static final String MYECLIPSE_METADATA_PROJECT_TYPE_WAR = "WEB";
44  
45      private static final String MYECLIPSE_METADATA_PROJECT_TYPE_EAR = "EAR";
46  
47      private static final String MYECLIPSE_METADATA_PROJECT_TYPE_EJB = "EJB";
48  
49      private static final String MYECLIPSE_METADATA_PROJECT_ATTRIBUTES = "attributes";
50  
51      private static final String MYECLIPSE_METADATA_PROJECT_ATTRIBUTE = "attribute";
52  
53      /**
54       * Writer entry point
55       * 
56       * @throws MojoExecutionException
57       */
58      public void write()
59          throws MojoExecutionException
60      {
61          String packaging = config.getProject().getPackaging();
62  
63          if ( !Constants.PROJECT_PACKAGING_EAR.equalsIgnoreCase( packaging ) &&
64              !Constants.PROJECT_PACKAGING_WAR.equalsIgnoreCase( packaging ) &&
65              !Constants.PROJECT_PACKAGING_EJB.equalsIgnoreCase( packaging ) )
66          {
67              return;
68          }
69  
70          FileWriter w;
71  
72          try
73          {
74              w = new FileWriter( new File( config.getEclipseProjectDirectory(), MYECLIPSE_MYMETADATA_FILENAME ) );
75          }
76          catch ( IOException ex )
77          {
78              throw new MojoExecutionException( Messages.getString( "EclipsePlugin.erroropeningfile" ), ex ); //$NON-NLS-1$
79          }
80  
81          XMLWriter writer = new PrettyPrintXMLWriter( w, "UTF-8", null );
82  
83          writer.startElement( MYECLIPSE_METADATA_PROJECT );
84          writer.addAttribute( MYECLIPSE_METADATA_PROJECT_TYPE, getMyEclipseProjectType( packaging ) );
85          writer.addAttribute( MYECLIPSE_METADATA_PROJECT_NAME, config.getEclipseProjectName() );
86          writer.addAttribute( MYECLIPSE_METADATA_PROJECT_ID, config.getEclipseProjectName() );
87  
88          if ( Constants.PROJECT_PACKAGING_WAR.equalsIgnoreCase( packaging ) )
89          {
90              // Find web application context root from maven-war-plugin configuration.
91              // ArtifactId is used as the default value
92              String warContextRoot =
93                  IdeUtils.getPluginSetting( config.getProject(), JeeUtils.ARTIFACT_MAVEN_WAR_PLUGIN, "warContextRoot",//$NON-NLS-1$
94                                             "/" + config.getProject().getArtifactId() );
95  
96              writer.addAttribute( MYECLIPSE_METADATA_PROJECT_CONTEXT_ROOT, warContextRoot );
97  
98              writer.addAttribute( MYECLIPSE_METADATA_PROJECT_J2EE_SPEC, getJeeVersion() );
99              // TODO : use maven final name
100             writer.addAttribute( MYECLIPSE_METADATA_PROJECT_ARCHIVE, config.getEclipseProjectName() + ".war" );
101         }
102 
103         if ( Constants.PROJECT_PACKAGING_EAR.equalsIgnoreCase( packaging ) )
104         {
105             // TODO : use maven final name
106             writer.addAttribute( MYECLIPSE_METADATA_PROJECT_ARCHIVE, config.getEclipseProjectName() + ".ear" );
107         }
108 
109         writer.startElement( MYECLIPSE_METADATA_PROJECT_ATTRIBUTES );
110         if ( Constants.PROJECT_PACKAGING_WAR.equalsIgnoreCase( packaging ) )
111         {
112             writer.startElement( MYECLIPSE_METADATA_PROJECT_ATTRIBUTE );
113             writer.addAttribute( "name", "webrootdir" );
114             // TODO : retrieve this from project configuration
115             writer.addAttribute( "value", "src/main/webapp" );
116             writer.endElement();
117         }
118         // Close <attributes>
119         writer.endElement();
120 
121         // Close <project-module>
122         writer.endElement();
123 
124         IOUtil.close( w );
125     }
126 
127     /**
128      * @param packaging maven project packaging
129      * @return MyEclipse project type (EAR, WAR, EJB)
130      */
131     private String getMyEclipseProjectType( String packaging )
132     {
133         if ( Constants.PROJECT_PACKAGING_WAR.equalsIgnoreCase( packaging ) )
134         {
135             return MYECLIPSE_METADATA_PROJECT_TYPE_WAR;
136         }
137         if ( Constants.PROJECT_PACKAGING_EAR.equalsIgnoreCase( packaging ) )
138         {
139             return MYECLIPSE_METADATA_PROJECT_TYPE_EAR;
140         }
141         if ( Constants.PROJECT_PACKAGING_EJB.equalsIgnoreCase( packaging ) )
142         {
143             return MYECLIPSE_METADATA_PROJECT_TYPE_EJB;
144         }
145         // Should never be reached
146         return null;
147     }
148 
149     /**
150      * Find JEE version from the project dependencies : find version from 'j2ee.jar' artifact or from 'servlet-api'
151      * 
152      * @return the JEE version for the project (1.2, 1.3, 1.4, 1.5)
153      * @see org.apache.maven.plugin.ide.JeeUtils#resolveJeeVersion(org.apache.maven.project.MavenProject)
154      */
155     private String getJeeVersion()
156     {
157         String jeeVersion =
158             JeeUtils.getJeeDescriptorFromServletVersion( JeeUtils.resolveServletVersion( config.getProject() ) ).getJeeVersion();
159 
160         if ( jeeVersion == null )
161         {
162             return JeeDescriptor.JEE_1_4;
163         }
164 
165         return jeeVersion;
166     }
167 }