001    package org.apache.maven.model.building;
002    
003    /*
004     * Licensed to the Apache Software Foundation (ASF) under one
005     * or more contributor license agreements.  See the NOTICE file
006     * distributed with this work for additional information
007     * regarding copyright ownership.  The ASF licenses this file
008     * to you under the Apache License, Version 2.0 (the
009     * "License"); you may not use this file except in compliance
010     * with the License.  You may obtain a copy of the License at
011     *
012     *   http://www.apache.org/licenses/LICENSE-2.0
013     *
014     * Unless required by applicable law or agreed to in writing,
015     * software distributed under the License is distributed on an
016     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017     * KIND, either express or implied.  See the License for the
018     * specific language governing permissions and limitations
019     * under the License.
020     */
021    
022    import java.io.File;
023    import java.util.Date;
024    import java.util.List;
025    import java.util.Properties;
026    
027    import org.apache.maven.model.Profile;
028    import org.apache.maven.model.resolution.ModelResolver;
029    
030    /**
031     * Collects settings that control the building of effective models.
032     *
033     * @author Benjamin Bentmann
034     */
035    public interface ModelBuildingRequest
036    {
037    
038        /**
039         * Denotes minimal validation of POMs. This validation level is meant for processing of POMs from repositories
040         * during metadata retrieval.
041         */
042        int VALIDATION_LEVEL_MINIMAL = 0;
043    
044        /**
045         * Denotes validation as performed by Maven 2.0. This validation level is meant as a compatibility mode to allow
046         * users to migrate their projects.
047         */
048        int VALIDATION_LEVEL_MAVEN_2_0 = 20;
049    
050        /**
051         * Denotes validation as performed by Maven 3.0. This validation level is meant for existing projects.
052         */
053        int VALIDATION_LEVEL_MAVEN_3_0 = 30;
054    
055        /**
056         * Denotes validation as performed by Maven 3.1. This validation level is meant for new projects.
057         */
058        int VALIDATION_LEVEL_MAVEN_3_1 = 31;
059    
060        /**
061         * Denotes strict validation as recommended by the current Maven version.
062         */
063        int VALIDATION_LEVEL_STRICT = VALIDATION_LEVEL_MAVEN_3_0;
064    
065        /**
066         * Gets the source of the POM to process.
067         *
068         * @return The source of the POM or {@code null} if not set.
069         */
070        ModelSource getModelSource();
071    
072        /**
073         * Sets the source of the POM to process. Eventually, either {@link #setModelSource(ModelSource)} or
074         * {@link #setPomFile(File)} must be set.
075         *
076         * @param modelSource The source of the POM to process, may be {@code null}.
077         * @return This request, never {@code null}.
078         */
079        ModelBuildingRequest setModelSource( ModelSource modelSource );
080    
081        /**
082         * Gets the POM file of the project to build.
083         *
084         * @return The POM file of the project or {@code null} if not applicable (i.e. when processing a POM from the
085         *         repository).
086         */
087        File getPomFile();
088    
089        /**
090         * Sets the POM file of the project to build. Note that providing the path to a POM file via this method will make
091         * the model builder operate in project mode. This mode is meant for effective models that are employed during the
092         * build process of a local project. Hence the effective model will support the notion of a project directory. To
093         * build the model for a POM from the repository, use {@link #setModelSource(ModelSource)} in combination with a
094         * {@link FileModelSource} instead.
095         *
096         * @param pomFile The POM file of the project to build the effective model for, may be {@code null} to build the
097         *            model of some POM from the repository.
098         * @return This request, never {@code null}.
099         */
100        ModelBuildingRequest setPomFile( File pomFile );
101    
102        /**
103         * Gets the level of validation to perform on processed models.
104         *
105         * @return The level of validation to perform on processed models.
106         */
107        int getValidationLevel();
108    
109        /**
110         * Sets the level of validation to perform on processed models. For building of projects,
111         * {@link #VALIDATION_LEVEL_STRICT} should be used to ensure proper building. For the mere retrievel of dependencies
112         * during artifact resolution, {@link #VALIDATION_LEVEL_MINIMAL} should be used to account for models of poor
113         * quality. By default, models are validated in strict mode.
114         *
115         * @param validationLevel The level of validation to perform on processed models.
116         * @return This request, never {@code null}.
117         */
118        ModelBuildingRequest setValidationLevel( int validationLevel );
119    
120        /**
121         * Indicates whether plugin executions and configurations should be processed. If enabled, lifecycle-induced plugin
122         * executions will be injected into the model and common plugin configuration will be propagated to individual
123         * executions.
124         *
125         * @return {@code true} if plugins should be processed, {@code false} otherwise.
126         */
127        boolean isProcessPlugins();
128    
129        /**
130         * Controls the processing of plugin executions and configurations.
131         *
132         * @param processPlugins {@code true} to enable plugin processing, {@code false} otherwise.
133         * @return This request, never {@code null}.
134         */
135        ModelBuildingRequest setProcessPlugins( boolean processPlugins );
136    
137        /**
138         * Indicates whether the model building should happen in two phases. If enabled, the initial invocation of the model
139         * builder will only produce an interim result which may be used to analyze inter-model dependencies before the
140         * final invocation of the model builder is performed.
141         *
142         * @return {@code true} if two-phase building is enabled, {@code false} if the model should be build in a single
143         *         step.
144         */
145        boolean isTwoPhaseBuilding();
146    
147        /**
148         * Enables/disables two-phase building. If enabled, the initial invocation of the model builder will only produce an
149         * interim result which may be used to analyze inter-model dependencies before the final invocation of the model
150         * builder is performed.
151         *
152         * @param twoPhaseBuilding {@code true} to enable two-phase building, {@code false} if the model should be build in
153         *            a single step.
154         * @return This request, never {@code null}.
155         */
156        ModelBuildingRequest setTwoPhaseBuilding( boolean twoPhaseBuilding );
157    
158        /**
159         * Indicates whether the model should track the line/column number of the model source from which it was parsed.
160         * 
161         * @return {@code true} if location tracking is enabled, {@code false} otherwise.
162         */
163        boolean isLocationTracking();
164    
165        /**
166         * Enables/disables the tracking of line/column numbers for the model source being parsed. By default, input
167         * locations are not tracked.
168         * 
169         * @param locationTracking {@code true} to enable location tracking, {@code false} to disable it.
170         * @return This request, never {@code null}.
171         */
172        ModelBuildingRequest setLocationTracking( boolean locationTracking );
173    
174        /**
175         * Gets the external profiles that should be considered for model building.
176         *
177         * @return The external profiles that should be considered for model building, never {@code null}.
178         */
179        List<Profile> getProfiles();
180    
181        /**
182         * Sets the external profiles that should be considered for model building.
183         *
184         * @param profiles The external profiles that should be considered for model building, may be {@code null}.
185         * @return This request, never {@code null}.
186         */
187        ModelBuildingRequest setProfiles( List<Profile> profiles );
188    
189        /**
190         * Gets the identifiers of those profiles that should be activated by explicit demand.
191         *
192         * @return The identifiers of those profiles to activate, never {@code null}.
193         */
194        List<String> getActiveProfileIds();
195    
196        /**
197         * Sets the identifiers of those profiles that should be activated by explicit demand.
198         *
199         * @param activeProfileIds The identifiers of those profiles to activate, may be {@code null}.
200         * @return This request, never {@code null}.
201         */
202        ModelBuildingRequest setActiveProfileIds( List<String> activeProfileIds );
203    
204        /**
205         * Gets the identifiers of those profiles that should be deactivated by explicit demand.
206         *
207         * @return The identifiers of those profiles to deactivate, never {@code null}.
208         */
209        List<String> getInactiveProfileIds();
210    
211        /**
212         * Sets the identifiers of those profiles that should be deactivated by explicit demand.
213         *
214         * @param inactiveProfileIds The identifiers of those profiles to deactivate, may be {@code null}.
215         * @return This request, never {@code null}.
216         */
217        ModelBuildingRequest setInactiveProfileIds( List<String> inactiveProfileIds );
218    
219        /**
220         * Gets the system properties to use for interpolation and profile activation. The system properties are collected
221         * from the runtime environment like {@link System#getProperties()} and environment variables.
222         *
223         * @return The system properties, never {@code null}.
224         */
225        Properties getSystemProperties();
226    
227        /**
228         * Sets the system properties to use for interpolation and profile activation. The system properties are collected
229         * from the runtime environment like {@link System#getProperties()} and environment variables.
230         *
231         * @param systemProperties The system properties, may be {@code null}.
232         * @return This request, never {@code null}.
233         */
234        ModelBuildingRequest setSystemProperties( Properties systemProperties );
235    
236        /**
237         * Gets the user properties to use for interpolation and profile activation. The user properties have been
238         * configured directly by the user on his discretion, e.g. via the {@code -Dkey=value} parameter on the command
239         * line.
240         *
241         * @return The user properties, never {@code null}.
242         */
243        Properties getUserProperties();
244    
245        /**
246         * Sets the user properties to use for interpolation and profile activation. The user properties have been
247         * configured directly by the user on his discretion, e.g. via the {@code -Dkey=value} parameter on the command
248         * line.
249         *
250         * @param userProperties The user properties, may be {@code null}.
251         * @return This request, never {@code null}.
252         */
253        ModelBuildingRequest setUserProperties( Properties userProperties );
254    
255        /**
256         * Gets the start time of the build.
257         *
258         * @return The start time of the build or {@code null} if unknown.
259         */
260        Date getBuildStartTime();
261    
262        /**
263         * Sets the start time of the build.
264         *
265         * @param buildStartTime The start time of the build, may be {@code null}.
266         * @return This request, never {@code null}.
267         */
268        ModelBuildingRequest setBuildStartTime( Date buildStartTime );
269    
270        /**
271         * Gets the model resolver to use for resolution of mixins or parents that are not locally reachable from the
272         * project directory.
273         *
274         * @return The model resolver or {@code null} if not set.
275         */
276        ModelResolver getModelResolver();
277    
278        /**
279         * Sets the model resolver to use for resolution of mixins or parents that are not locally reachable from the
280         * project directory.
281         *
282         * @param modelResolver The model resolver to use, may be {@code null}.
283         * @return This request, never {@code null}.
284         */
285        ModelBuildingRequest setModelResolver( ModelResolver modelResolver );
286    
287        /**
288         * Gets the model building listener to notify during the build process.
289         *
290         * @return The model building listener to notify or {@code null} if none.
291         */
292        ModelBuildingListener getModelBuildingListener();
293    
294        /**
295         * Sets the model building listener to notify during the build process.
296         *
297         * @param modelBuildingListener The model building listener to notify, may be {@code null}.
298         * @return This request, never {@code null}.
299         */
300        ModelBuildingRequest setModelBuildingListener( ModelBuildingListener modelBuildingListener );
301    
302        /**
303         * Gets the model cache to use for reuse of previously built models.
304         *
305         * @return The model cache or {@code null} if not set.
306         */
307        ModelCache getModelCache();
308    
309        /**
310         * Sets the model cache to use for reuse of previously built models. This is an optional component that serves
311         * performance optimizations.
312         *
313         * @param modelCache The model cache to use, may be {@code null}.
314         * @return This request, never {@code null}.
315         */
316        ModelBuildingRequest setModelCache( ModelCache modelCache );
317    
318    }