1 package org.apache.maven.plugin.idea;
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.artifact.manager.WagonManager;
23 import org.apache.maven.plugin.MojoExecutionException;
24 import org.apache.maven.project.MavenProject;
25
26 import java.util.HashSet;
27 import java.util.List;
28 import java.util.Set;
29
30 /**
31 * Goal for generating IDEA files from a POM.
32 * This plug-in provides the ability to generate project files (.ipr, .iml and .iws files) for IDEA.
33 *
34 * @goal idea
35 * @execute phase="generate-resources"
36 */
37 public class IdeaMojo
38 extends AbstractIdeaMojo
39 {
40 /**
41 * The reactor projects in a multi-module build.
42 *
43 * @parameter expression="${reactorProjects}"
44 * @required
45 * @readonly
46 */
47 private List reactorProjects;
48
49 /**
50 * @component
51 */
52 private WagonManager wagonManager;
53
54 /**
55 * Whether to link the reactor projects as dependency modules or as libraries.
56 *
57 * @parameter expression="${linkModules}" default-value="true"
58 */
59 private boolean linkModules;
60
61 /**
62 * Specify the location of the deployment descriptor file, if one is provided.
63 *
64 * @parameter expression="${deploymentDescriptorFile}"
65 */
66 private String deploymentDescriptorFile;
67
68 /**
69 * Whether to use full artifact names when referencing libraries.
70 *
71 * @parameter expression="${useFullNames}" default-value="false"
72 */
73 private boolean useFullNames;
74
75 /**
76 * Enables/disables the downloading of source attachments.
77 *
78 * @parameter expression="${downloadSources}" default-value="false"
79 */
80 private boolean downloadSources;
81
82 /**
83 * Enables/disables the downloading of javadoc attachments.
84 *
85 * @parameter expression="${downloadJavadocs}" default-value="false"
86 */
87 private boolean downloadJavadocs;
88
89 /**
90 * Sets the classifier string attached to an artifact source archive name.
91 *
92 * @parameter expression="${sourceClassifier}" default-value="sources"
93 */
94 private String sourceClassifier;
95
96 /**
97 * Sets the classifier string attached to an artifact javadoc archive name.
98 *
99 * @parameter expression="${javadocClassifier}" default-value="javadoc"
100 */
101 private String javadocClassifier;
102
103 /**
104 * Specify the name of the registered IDEA JDK to use
105 * for the project.
106 *
107 * @parameter expression="${jdkName}"
108 */
109 private String jdkName;
110
111 /**
112 * Specify the version of the JDK to use for the project for the purpose of
113 * enabled assertions and Java 5.0 language features.
114 * The default value is the specification version of the executing JVM.
115 *
116 * @parameter expression="${jdkLevel}"
117 * @todo would be good to use the compilation source if possible
118 */
119 private String jdkLevel;
120
121 /**
122 * An optional set of Library objects that allow you to specify a comma separated list of source dirs, class dirs,
123 * or to indicate that the library should be excluded from the module. For example:
124 * <p/>
125 * <pre>
126 * <libraries>
127 * <library>
128 * <name>webwork</name>
129 * <sources>file://$webwork$/src/java</sources>
130 * <!--
131 * <classes>...</classes>
132 * <exclude>true</exclude>
133 * -->
134 * </library>
135 * </libraries>
136 * </pre>
137 *
138 * @parameter
139 */
140 private Library[] libraries;
141
142 /**
143 * A comma-separated list of directories that should be excluded. These directories are in addition to those
144 * already excluded, such as target/classes. A common use of this is to exclude the entire target directory.
145 *
146 * @parameter
147 */
148 private String exclude;
149
150 /**
151 * Specify the resource pattern in wildcard format, for example "?*.xml;?*.properties".
152 * Currently supports 4.x and 5.x.
153 * Because IDEA doesn't distinguish between source and resources directories, this is needed.
154 * The default value corresponds to any file without a java extension.
155 * Please note that the default value includes package.html files as it's not possible to exclude those.
156 *
157 * @parameter expression="${wildcardResourcePatterns}" default-value="!?*.java"
158 */
159 private String wildcardResourcePatterns;
160
161 /**
162 * Specify the version of IDEA to target. This is needed to identify the default formatting of
163 * project-jdk-name used by IDEA. Currently supports 4.x and 5.x.
164 * <p/>
165 * This will only be used when parameter jdkName is not set.
166 *
167 * @parameter expression="${ideaVersion}" default-value="5.x"
168 */
169 private String ideaVersion;
170
171 /**
172 * Causes the module libraries to use a short name for all dependencies. This is very convenient but has been
173 * reported to cause problems with IDEA.
174 *
175 * @parameter default-value="false"
176 */
177 private boolean dependenciesAsLibraries;
178
179 /**
180 * Tell IntelliJ IDEA that this module is an IntelliJ IDEA Plugin.
181 *
182 * @parameter default-value="false"
183 */
184 private boolean ideaPlugin;
185
186
187 public void execute()
188 throws MojoExecutionException
189 {
190 try
191 {
192 doDependencyResolution( executedProject, localRepo );
193 }
194 catch ( Exception e )
195 {
196 throw new MojoExecutionException( "Unable to build project dependencies.", e );
197 }
198
199 Set macros = new HashSet();
200 rewriteModule( macros );
201
202 if ( executedProject.isExecutionRoot() )
203 {
204 rewriteProject( macros );
205
206 rewriteWorkspace();
207 }
208 }
209
210 private void rewriteModule( Set macros )
211 throws MojoExecutionException
212 {
213 IdeaModuleMojo mojo = new IdeaModuleMojo();
214
215 mojo.initParam( executedProject, artifactFactory, localRepo, artifactResolver, artifactMetadataSource, getLog(),
216 overwrite, executedProject, reactorProjects, wagonManager, linkModules, useFullNames,
217 downloadSources, sourceClassifier, downloadJavadocs, javadocClassifier, libraries, macros,
218 exclude, dependenciesAsLibraries, deploymentDescriptorFile, ideaPlugin, ideaVersion );
219
220 mojo.rewriteModule();
221 }
222
223 private void rewriteProject( Set macros )
224 throws MojoExecutionException
225 {
226 IdeaProjectMojo mojo = new IdeaProjectMojo();
227
228 mojo.initParam( executedProject, artifactFactory, localRepo, artifactResolver, artifactMetadataSource, getLog(),
229 overwrite, jdkName, jdkLevel, wildcardResourcePatterns, ideaVersion, macros );
230
231 mojo.rewriteProject();
232 }
233
234 private void rewriteWorkspace()
235 throws MojoExecutionException
236 {
237 IdeaWorkspaceMojo mojo = new IdeaWorkspaceMojo();
238
239 mojo.initParam( executedProject, artifactFactory, localRepo, artifactResolver, artifactMetadataSource, getLog(),
240 overwrite );
241
242 mojo.rewriteWorkspace();
243 }
244
245 public void setProject( MavenProject project )
246 {
247 this.executedProject = project;
248 }
249 }