View Javadoc

1   package org.apache.maven.plugin.tools.model;
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 java.io.File;
23  import java.io.IOException;
24  import java.io.Reader;
25  import java.util.HashSet;
26  import java.util.List;
27  import java.util.Set;
28  
29  import org.apache.maven.plugin.descriptor.DuplicateParameterException;
30  import org.apache.maven.plugin.descriptor.MojoDescriptor;
31  import org.apache.maven.plugin.descriptor.Parameter;
32  import org.apache.maven.plugin.tools.model.io.xpp3.PluginMetadataXpp3Reader;
33  import org.codehaus.plexus.component.repository.ComponentRequirement;
34  import org.codehaus.plexus.util.IOUtil;
35  import org.codehaus.plexus.util.ReaderFactory;
36  import org.codehaus.plexus.util.StringUtils;
37  import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
38  
39  /**
40   * Parser for plugin metadata.
41   *
42   * @version $Id: PluginMetadataParser.java 1133707 2011-06-09 08:28:59Z stephenc $
43   */
44  public class PluginMetadataParser
45  {
46      /** Default implementation path which will be replaced in
47       * AbstractScriptedMojoDescriptorExtractor#extractMojoDescriptorsFromMetadata(Map, PluginDescriptor) */
48      public static final String IMPL_BASE_PLACEHOLDER = "<REPLACE-WITH-MOJO-PATH>";
49  
50      /**
51       * @param metadataFile the metadata file to be parse
52       * @return a set of <code>MojoDescriptor</code>
53       * @throws PluginMetadataParseException if any
54       */
55      public Set<MojoDescriptor> parseMojoDescriptors( File metadataFile )
56          throws PluginMetadataParseException
57      {
58          Set<MojoDescriptor> descriptors = new HashSet<MojoDescriptor>();
59  
60          Reader reader = null;
61  
62          try
63          {
64              reader = ReaderFactory.newXmlReader( metadataFile );
65  
66              PluginMetadataXpp3Reader metadataReader = new PluginMetadataXpp3Reader();
67  
68              PluginMetadata pluginMetadata = metadataReader.read( reader );
69  
70              List<Mojo> mojos = pluginMetadata.getMojos();
71  
72              if ( mojos != null && !mojos.isEmpty() )
73              {
74                  for ( Mojo mojo :mojos )
75                  {
76                      MojoDescriptor descriptor = asDescriptor( metadataFile, mojo );
77  
78                      descriptors.add( descriptor );
79                  }
80              }
81          }
82          catch ( IOException e )
83          {
84              throw new PluginMetadataParseException( metadataFile, "Cannot parse plugin metadata from file.", e );
85          }
86          catch ( XmlPullParserException e )
87          {
88              throw new PluginMetadataParseException( metadataFile, "Cannot parse plugin metadata from file.", e );
89          }
90          finally
91          {
92              IOUtil.close( reader );
93          }
94  
95          return descriptors;
96      }
97  
98      /**
99       * @param metadataFile not null
100      * @param mojo not null
101      * @return a mojo descriptor instance
102      * @throws PluginMetadataParseException if any
103      */
104     private MojoDescriptor asDescriptor( File metadataFile, Mojo mojo )
105         throws PluginMetadataParseException
106     {
107         MojoDescriptor descriptor = new MojoDescriptor();
108 
109         if ( mojo.getCall() != null )
110         {
111             descriptor.setImplementation( IMPL_BASE_PLACEHOLDER + ":" + mojo.getCall() );
112         }
113         else
114         {
115             descriptor.setImplementation( IMPL_BASE_PLACEHOLDER );
116         }
117 
118         descriptor.setGoal( mojo.getGoal() );
119         descriptor.setPhase( mojo.getPhase() );
120         descriptor.setDependencyResolutionRequired( mojo.getRequiresDependencyResolution() );
121         descriptor.setAggregator( mojo.isAggregator() );
122         descriptor.setInheritedByDefault( mojo.isInheritByDefault() );
123         descriptor.setDirectInvocationOnly( mojo.isRequiresDirectInvocation() );
124         descriptor.setOnlineRequired( mojo.isRequiresOnline() );
125         descriptor.setProjectRequired( mojo.isRequiresProject() );
126         descriptor.setRequiresReports( mojo.isRequiresReports() );
127         descriptor.setDescription( mojo.getDescription() );
128         descriptor.setDeprecated( mojo.getDeprecation() );
129 
130         LifecycleExecution le = mojo.getExecution();
131         if ( le != null )
132         {
133             descriptor.setExecuteLifecycle( le.getLifecycle() );
134             descriptor.setExecutePhase( le.getPhase() );
135         }
136 
137         List<org.apache.maven.plugin.tools.model.Parameter> parameters = mojo.getParameters();
138 
139         if ( parameters != null && !parameters.isEmpty() )
140         {
141             for ( org.apache.maven.plugin.tools.model.Parameter param : parameters )
142             {
143                 Parameter dParam = new Parameter();
144                 dParam.setAlias( param.getAlias() );
145                 dParam.setDeprecated( param.getDeprecation() );
146                 dParam.setDescription( param.getDescription() );
147                 dParam.setEditable( !param.isReadonly() );
148                 dParam.setExpression( param.getExpression() );
149                 dParam.setDefaultValue( param.getDefaultValue() );
150 
151                 String property = param.getProperty();
152                 if ( StringUtils.isNotEmpty( property ) )
153                 {
154                     dParam.setName( property );
155                 }
156                 else
157                 {
158                     dParam.setName( param.getName() );
159                 }
160 
161                 if ( StringUtils.isEmpty( dParam.getName() ) )
162                 {
163                     throw new PluginMetadataParseException( metadataFile, "Mojo: \'" + mojo.getGoal()
164                         + "\' has a parameter without either property or name attributes. Please specify one." );
165                 }
166 
167                 dParam.setRequired( param.isRequired() );
168                 dParam.setType( param.getType() );
169 
170                 try
171                 {
172                     descriptor.addParameter( dParam );
173                 }
174                 catch ( DuplicateParameterException e )
175                 {
176                     throw new PluginMetadataParseException( metadataFile,
177                                                             "Duplicate parameters detected for mojo: "
178                                                                 + mojo.getGoal(), e );
179                 }
180             }
181         }
182 
183         List<Component> components = mojo.getComponents();
184 
185         if ( components != null && !components.isEmpty() )
186         {
187             for ( Component component : components )
188             {
189                 ComponentRequirement cr = new ComponentRequirement();
190                 cr.setRole( component.getRole() );
191                 cr.setRoleHint( component.getHint() );
192 
193                 descriptor.addRequirement( cr );
194             }
195         }
196 
197         return descriptor;
198     }
199 }