1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19 package org.apache.maven.model.building;
20
21 import java.io.File;
22 import java.util.Date;
23 import java.util.List;
24 import java.util.Properties;
25 import org.apache.maven.model.Model;
26 import org.apache.maven.model.Profile;
27 import org.apache.maven.model.resolution.ModelResolver;
28 import org.apache.maven.model.resolution.WorkspaceModelResolver;
29
30 /**
31 * Collects settings that control the building of effective models.
32 *
33 * @author Benjamin Bentmann
34 */
35 public interface ModelBuildingRequest {
36
37 /**
38 * Denotes minimal validation of POMs. This validation level is meant for processing of POMs from repositories
39 * during metadata retrieval.
40 */
41 int VALIDATION_LEVEL_MINIMAL = 0;
42
43 /**
44 * Denotes validation as performed by Maven 2.0. This validation level is meant as a compatibility mode to allow
45 * users to migrate their projects.
46 */
47 int VALIDATION_LEVEL_MAVEN_2_0 = 20;
48
49 /**
50 * Denotes validation as performed by Maven 3.0. This validation level is meant for existing projects.
51 */
52 int VALIDATION_LEVEL_MAVEN_3_0 = 30;
53
54 /**
55 * Denotes validation as performed by Maven 3.1. This validation level is meant for new projects.
56 */
57 int VALIDATION_LEVEL_MAVEN_3_1 = 31;
58
59 /**
60 * Denotes strict validation as recommended by the current Maven version.
61 */
62 int VALIDATION_LEVEL_STRICT = VALIDATION_LEVEL_MAVEN_3_1;
63
64 /**
65 * Gets the file model to build (with profile activation).
66 * If not set, model source will be used to load file model.
67 *
68 * @return The file model to build or {@code null} if not set.
69 * @since 4.0.0
70 */
71 Model getFileModel();
72
73 /**
74 * Set the file model with profile activation
75 *
76 * @param fileModel
77 * @return This request, never {@code null}.
78 * @since 4.0.0
79 */
80 ModelBuildingRequest setFileModel(Model fileModel);
81
82 /**
83 * @deprecated rawModel is never set, instead the fileModel is set
84 */
85 @Deprecated
86 Model getRawModel();
87
88 /**
89 * @deprecated setting the rawModel has no effect, instead the fileModel of phase one will be set
90 */
91 @Deprecated
92 ModelBuildingRequest setRawModel(Model rawModel);
93
94 /**
95 * Gets the source of the POM to process.
96 *
97 * @return The source of the POM or {@code null} if not set.
98 */
99 ModelSource getModelSource();
100
101 /**
102 * Sets the source of the POM to process. Eventually, either {@link #setModelSource(ModelSource)} or
103 * {@link #setPomFile(File)} must be set.
104 *
105 * @param modelSource The source of the POM to process, may be {@code null}.
106 * @return This request, never {@code null}.
107 */
108 ModelBuildingRequest setModelSource(ModelSource modelSource);
109
110 /**
111 * Gets the POM file of the project to build.
112 *
113 * @return The POM file of the project or {@code null} if not applicable (i.e. when processing a POM from the
114 * repository).
115 */
116 File getPomFile();
117
118 /**
119 * Sets the POM file of the project to build. Note that providing the path to a POM file via this method will make
120 * the model builder operate in project mode. This mode is meant for effective models that are employed during the
121 * build process of a local project. Hence the effective model will support the notion of a project directory. To
122 * build the model for a POM from the repository, use {@link #setModelSource(ModelSource)} in combination with a
123 * {@link FileModelSource} instead.
124 *
125 * @param pomFile The POM file of the project to build the effective model for, may be {@code null} to build the
126 * model of some POM from the repository.
127 * @return This request, never {@code null}.
128 */
129 ModelBuildingRequest setPomFile(File pomFile);
130
131 /**
132 * Gets the level of validation to perform on processed models.
133 *
134 * @return The level of validation to perform on processed models.
135 */
136 int getValidationLevel();
137
138 /**
139 * Sets the level of validation to perform on processed models. For building of projects,
140 * {@link #VALIDATION_LEVEL_STRICT} should be used to ensure proper building. For the mere retrieval of dependencies
141 * during artifact resolution, {@link #VALIDATION_LEVEL_MINIMAL} should be used to account for models of poor
142 * quality. By default, models are validated in strict mode.
143 *
144 * @param validationLevel The level of validation to perform on processed models.
145 * @return This request, never {@code null}.
146 */
147 ModelBuildingRequest setValidationLevel(int validationLevel);
148
149 /**
150 * Indicates whether plugin executions and configurations should be processed. If enabled, lifecycle-induced plugin
151 * executions will be injected into the model and common plugin configuration will be propagated to individual
152 * executions.
153 *
154 * @return {@code true} if plugins should be processed, {@code false} otherwise.
155 */
156 boolean isProcessPlugins();
157
158 /**
159 * Controls the processing of plugin executions and configurations.
160 *
161 * @param processPlugins {@code true} to enable plugin processing, {@code false} otherwise.
162 * @return This request, never {@code null}.
163 */
164 ModelBuildingRequest setProcessPlugins(boolean processPlugins);
165
166 /**
167 * Indicates whether the model building should happen in two phases. If enabled, the initial invocation of the model
168 * builder will only produce an interim result which may be used to analyze inter-model dependencies before the
169 * final invocation of the model builder is performed.
170 *
171 * @return {@code true} if two-phase building is enabled, {@code false} if the model should be build in a single
172 * step.
173 */
174 boolean isTwoPhaseBuilding();
175
176 /**
177 * Enables/disables two-phase building. If enabled, the initial invocation of the model builder will only produce an
178 * interim result which may be used to analyze inter-model dependencies before the final invocation of the model
179 * builder is performed.
180 *
181 * @param twoPhaseBuilding {@code true} to enable two-phase building, {@code false} if the model should be build in
182 * a single step.
183 * @return This request, never {@code null}.
184 */
185 ModelBuildingRequest setTwoPhaseBuilding(boolean twoPhaseBuilding);
186
187 /**
188 * Indicates whether the model should track the line/column number of the model source from which it was parsed.
189 *
190 * @return {@code true} if location tracking is enabled, {@code false} otherwise.
191 */
192 boolean isLocationTracking();
193
194 /**
195 * Enables/disables the tracking of line/column numbers for the model source being parsed. By default, input
196 * locations are not tracked.
197 *
198 * @param locationTracking {@code true} to enable location tracking, {@code false} to disable it.
199 * @return This request, never {@code null}.
200 */
201 ModelBuildingRequest setLocationTracking(boolean locationTracking);
202
203 /**
204 * Gets the external profiles that should be considered for model building.
205 *
206 * @return The external profiles that should be considered for model building, never {@code null}.
207 */
208 List<Profile> getProfiles();
209
210 /**
211 * Sets the external profiles that should be considered for model building.
212 *
213 * @param profiles The external profiles that should be considered for model building, may be {@code null}.
214 * @return This request, never {@code null}.
215 */
216 ModelBuildingRequest setProfiles(List<Profile> profiles);
217
218 /**
219 * Gets the identifiers of those profiles that should be activated by explicit demand.
220 *
221 * @return The identifiers of those profiles to activate, never {@code null}.
222 */
223 List<String> getActiveProfileIds();
224
225 /**
226 * Sets the identifiers of those profiles that should be activated by explicit demand.
227 *
228 * @param activeProfileIds The identifiers of those profiles to activate, may be {@code null}.
229 * @return This request, never {@code null}.
230 */
231 ModelBuildingRequest setActiveProfileIds(List<String> activeProfileIds);
232
233 /**
234 * Gets the identifiers of those profiles that should be deactivated by explicit demand.
235 *
236 * @return The identifiers of those profiles to deactivate, never {@code null}.
237 */
238 List<String> getInactiveProfileIds();
239
240 /**
241 * Sets the identifiers of those profiles that should be deactivated by explicit demand.
242 *
243 * @param inactiveProfileIds The identifiers of those profiles to deactivate, may be {@code null}.
244 * @return This request, never {@code null}.
245 */
246 ModelBuildingRequest setInactiveProfileIds(List<String> inactiveProfileIds);
247
248 /**
249 * Gets the system properties to use for interpolation and profile activation. The system properties are collected
250 * from the runtime environment like {@link System#getProperties()} and environment variables.
251 *
252 * @return The system properties, never {@code null}.
253 */
254 Properties getSystemProperties();
255
256 /**
257 * Sets the system properties to use for interpolation and profile activation. The system properties are collected
258 * from the runtime environment like {@link System#getProperties()} and environment variables.
259 *
260 * @param systemProperties The system properties, may be {@code null}.
261 * @return This request, never {@code null}.
262 */
263 ModelBuildingRequest setSystemProperties(Properties systemProperties);
264
265 /**
266 * Gets the user properties to use for interpolation and profile activation. The user properties have been
267 * configured directly by the user on his discretion, e.g. via the {@code -Dkey=value} parameter on the command
268 * line.
269 *
270 * @return The user properties, never {@code null}.
271 */
272 Properties getUserProperties();
273
274 /**
275 * Sets the user properties to use for interpolation and profile activation. The user properties have been
276 * configured directly by the user on his discretion, e.g. via the {@code -Dkey=value} parameter on the command
277 * line.
278 *
279 * @param userProperties The user properties, may be {@code null}.
280 * @return This request, never {@code null}.
281 */
282 ModelBuildingRequest setUserProperties(Properties userProperties);
283
284 /**
285 * Gets the start time of the build.
286 *
287 * @return The start time of the build or {@code null} if unknown.
288 */
289 Date getBuildStartTime();
290
291 /**
292 * Sets the start time of the build.
293 *
294 * @param buildStartTime The start time of the build, may be {@code null}.
295 * @return This request, never {@code null}.
296 */
297 ModelBuildingRequest setBuildStartTime(Date buildStartTime);
298
299 /**
300 * Gets the model resolver to use for resolution of mixins or parents that are not locally reachable from the
301 * project directory.
302 *
303 * @return The model resolver or {@code null} if not set.
304 */
305 ModelResolver getModelResolver();
306
307 /**
308 * Sets the model resolver to use for resolution of mixins or parents that are not locally reachable from the
309 * project directory.
310 *
311 * @param modelResolver The model resolver to use, never {@code null}.
312 * @return This request, never {@code null}.
313 */
314 ModelBuildingRequest setModelResolver(ModelResolver modelResolver);
315
316 /**
317 * Gets the model building listener to notify during the build process.
318 *
319 * @return The model building listener to notify or {@code null} if none.
320 */
321 ModelBuildingListener getModelBuildingListener();
322
323 /**
324 * Sets the model building listener to notify during the build process.
325 *
326 * @param modelBuildingListener The model building listener to notify, may be {@code null}.
327 * @return This request, never {@code null}.
328 */
329 ModelBuildingRequest setModelBuildingListener(ModelBuildingListener modelBuildingListener);
330
331 /**
332 * Gets the model cache to use for reuse of previously built models.
333 *
334 * @return The model cache or {@code null} if not set.
335 */
336 ModelCache getModelCache();
337
338 /**
339 * Sets the model cache to use for reuse of previously built models. This is an optional component that serves
340 * performance optimizations.
341 *
342 * @param modelCache The model cache to use, may be {@code null}.
343 * @return This request, never {@code null}.
344 */
345 ModelBuildingRequest setModelCache(ModelCache modelCache);
346
347 WorkspaceModelResolver getWorkspaceModelResolver();
348
349 ModelBuildingRequest setWorkspaceModelResolver(WorkspaceModelResolver workspaceResolver);
350
351 TransformerContextBuilder getTransformerContextBuilder();
352
353 ModelBuildingRequest setTransformerContextBuilder(TransformerContextBuilder contextBuilder);
354 }