View Javadoc

1   package org.apache.maven.plugin.ear;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *  http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import org.apache.maven.plugin.MojoExecutionException;
23  import org.apache.maven.plugin.MojoFailureException;
24  import org.codehaus.plexus.configuration.PlexusConfiguration;
25  import org.codehaus.plexus.configuration.PlexusConfigurationException;
26  import org.codehaus.plexus.util.FileUtils;
27  
28  import java.io.File;
29  import java.io.IOException;
30  import java.util.ArrayList;
31  import java.util.List;
32  
33  /**
34   * A Mojo that generates the EAR deployment descriptor file(s).
35   *
36   * @author <a href="snicoll@apache.org">Stephane Nicoll</a>
37   * @version $Id: GenerateApplicationXmlMojo.java 942855 2010-05-10 19:13:52Z krosenvold $
38   * @goal generate-application-xml
39   * @phase generate-resources
40   * @threadSafe
41   * @requiresDependencyResolution test
42   */
43  public class GenerateApplicationXmlMojo
44      extends AbstractEarMojo
45  {
46  
47  
48  
49      /**
50       * Whether the application.xml should be generated or not.
51       *
52       * @parameter
53       */
54      private Boolean generateApplicationXml = Boolean.TRUE;
55  
56      /**
57       * Display name of the application to be used when application.xml
58       * file is autogenerated.
59       *
60       * @parameter expression="${project.artifactId}"
61       */
62      private String displayName;
63  
64      /**
65       * Description of the application to be used when application.xml
66       * file is autogenerated.
67       *
68       * @parameter expression="${project.description}"
69       */
70      private String description;
71  
72      /**
73       * The security-roles to be added to the auto-generated
74       * application.xml file.
75       *
76       * @parameter
77       */
78      private PlexusConfiguration security;
79  
80  
81      public void execute()
82          throws MojoExecutionException, MojoFailureException
83      {
84          // Initializes ear modules
85          super.execute();
86  
87          // Handle application.xml
88          if ( !generateApplicationXml.booleanValue() )
89          {
90              getLog().debug( "Generation of application.xml is disabled" );
91          }
92          else
93          {
94              // Check version
95              if ( !version.equals( VERSION_1_3 ) && !version.equals( VERSION_1_4 ) && 
96                   !version.equals( VERSION_5 ) && !version.equals( VERSION_6 ) )
97              {
98                  throw new MojoExecutionException( "Invalid version[" + version + "]" );
99              }
100 
101             // Generate deployment descriptor and copy it to the build directory
102             getLog().info( "Generating application.xml" );
103             try
104             {
105                 generateStandardDeploymentDescriptor();
106             }
107             catch ( EarPluginException e )
108             {
109                 throw new MojoExecutionException( "Failed to generate application.xml", e );
110             }
111 
112             try
113             {
114                 FileUtils.copyFileToDirectory( new File( generatedDescriptorLocation, "application.xml" ),
115                                                new File( getWorkDirectory(), "META-INF" ) );
116             }
117             catch ( IOException e )
118             {
119                 throw new MojoExecutionException( "Unable to copy application.xml to final destination", e );
120             }
121         }
122 
123         // Handle jboss-app.xml
124         if ( getJbossConfiguration() == null )
125         {
126             getLog().debug( "Generation of jboss-app.xml is disabled" );
127             return;
128         }
129         else
130         {
131             // Generate deployment descriptor and copy it to the build directory
132             getLog().info( "Generating jboss-app.xml" );
133             try
134             {
135                 generateJbossDeploymentDescriptor();
136             }
137             catch ( EarPluginException e )
138             {
139                 throw new MojoExecutionException( "Failed to generate jboss-app.xml", e );
140             }
141 
142             try
143             {
144                 FileUtils.copyFileToDirectory( new File( generatedDescriptorLocation, "jboss-app.xml" ),
145                                                new File( getWorkDirectory(), "META-INF" ) );
146             }
147             catch ( IOException e )
148             {
149                 throw new MojoExecutionException( "Unable to copy jboss-app.xml to final destination", e );
150             }
151         }
152     }
153 
154     /**
155      * Generates the deployment descriptor.
156      */
157     protected void generateStandardDeploymentDescriptor()
158         throws EarPluginException
159     {
160         File outputDir = new File( generatedDescriptorLocation );
161         if ( !outputDir.exists() )
162         {
163             outputDir.mkdirs();
164         }
165 
166         File descriptor = new File( outputDir, "application.xml" );
167 
168         final ApplicationXmlWriter writer = new ApplicationXmlWriter( version, encoding );
169         final ApplicationXmlWriterContext context = new ApplicationXmlWriterContext(descriptor, getModules(), 
170                 buildSecurityRoles(), displayName, description, defaultLibBundleDir);
171         writer.write( context );
172     }
173 
174     /**
175      * Generates the jboss deployment descriptor.
176      */
177     protected void generateJbossDeploymentDescriptor()
178         throws EarPluginException
179     {
180         File outputDir = new File( generatedDescriptorLocation );
181         if ( !outputDir.exists() )
182         {
183             outputDir.mkdirs();
184         }
185 
186         File descriptor = new File( outputDir, "jboss-app.xml" );
187 
188         JbossAppXmlWriter writer = new JbossAppXmlWriter( encoding );
189         writer.write( descriptor, getJbossConfiguration(), getModules() );
190     }
191 
192     /**
193      * Builds the security roles based on the configuration.
194      *
195      * @return a list of SecurityRole object(s)
196      * @throws EarPluginException if the configuration is invalid
197      */
198     private List buildSecurityRoles()
199         throws EarPluginException
200     {
201         final List result = new ArrayList();
202         if ( security == null )
203         {
204             return result;
205         }
206         try
207         {
208             final PlexusConfiguration[] securityRoles = security.getChildren( SecurityRole.SECURITY_ROLE );
209 
210             for ( int i = 0; i < securityRoles.length; i++ )
211             {
212                 PlexusConfiguration securityRole = securityRoles[i];
213                 final String id = securityRole.getAttribute( SecurityRole.ID_ATTRIBUTE );
214                 final String roleName = securityRole.getChild( SecurityRole.ROLE_NAME ).getValue();
215                 final String roleNameId =
216                     securityRole.getChild( SecurityRole.ROLE_NAME ).getAttribute( SecurityRole.ID_ATTRIBUTE );
217                 final String description = securityRole.getChild( SecurityRole.DESCRIPTION ).getValue();
218                 final String descriptionId =
219                     securityRole.getChild( SecurityRole.DESCRIPTION ).getAttribute( SecurityRole.ID_ATTRIBUTE );
220 
221                 if ( roleName == null )
222                 {
223                     throw new EarPluginException( "Invalid security-role configuration, role-name could not be null." );
224                 }
225                 else
226                 {
227                     result.add( new SecurityRole( roleName, roleNameId, id, description, descriptionId ) );
228                 }
229             }
230             return result;
231         }
232         catch ( PlexusConfigurationException e )
233         {
234             throw new EarPluginException( "Invalid security-role configuration", e );
235         }
236 
237     }
238 }