View Javadoc
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 org.apache.maven.model.Model;
22  import org.apache.maven.model.composition.DefaultDependencyManagementImporter;
23  import org.apache.maven.model.composition.DependencyManagementImporter;
24  import org.apache.maven.model.inheritance.DefaultInheritanceAssembler;
25  import org.apache.maven.model.inheritance.InheritanceAssembler;
26  import org.apache.maven.model.interpolation.DefaultModelVersionProcessor;
27  import org.apache.maven.model.interpolation.ModelInterpolator;
28  import org.apache.maven.model.interpolation.ModelVersionProcessor;
29  import org.apache.maven.model.interpolation.StringVisitorModelInterpolator;
30  import org.apache.maven.model.io.DefaultModelReader;
31  import org.apache.maven.model.io.ModelReader;
32  import org.apache.maven.model.locator.DefaultModelLocator;
33  import org.apache.maven.model.locator.ModelLocator;
34  import org.apache.maven.model.management.DefaultDependencyManagementInjector;
35  import org.apache.maven.model.management.DefaultPluginManagementInjector;
36  import org.apache.maven.model.management.DependencyManagementInjector;
37  import org.apache.maven.model.management.PluginManagementInjector;
38  import org.apache.maven.model.normalization.DefaultModelNormalizer;
39  import org.apache.maven.model.normalization.ModelNormalizer;
40  import org.apache.maven.model.path.DefaultModelPathTranslator;
41  import org.apache.maven.model.path.DefaultModelUrlNormalizer;
42  import org.apache.maven.model.path.DefaultPathTranslator;
43  import org.apache.maven.model.path.DefaultUrlNormalizer;
44  import org.apache.maven.model.path.ModelPathTranslator;
45  import org.apache.maven.model.path.ModelUrlNormalizer;
46  import org.apache.maven.model.path.PathTranslator;
47  import org.apache.maven.model.path.ProfileActivationFilePathInterpolator;
48  import org.apache.maven.model.path.UrlNormalizer;
49  import org.apache.maven.model.plugin.DefaultPluginConfigurationExpander;
50  import org.apache.maven.model.plugin.DefaultReportConfigurationExpander;
51  import org.apache.maven.model.plugin.DefaultReportingConverter;
52  import org.apache.maven.model.plugin.LifecycleBindingsInjector;
53  import org.apache.maven.model.plugin.PluginConfigurationExpander;
54  import org.apache.maven.model.plugin.ReportConfigurationExpander;
55  import org.apache.maven.model.plugin.ReportingConverter;
56  import org.apache.maven.model.profile.DefaultProfileInjector;
57  import org.apache.maven.model.profile.DefaultProfileSelector;
58  import org.apache.maven.model.profile.ProfileInjector;
59  import org.apache.maven.model.profile.ProfileSelector;
60  import org.apache.maven.model.profile.activation.FileProfileActivator;
61  import org.apache.maven.model.profile.activation.JdkVersionProfileActivator;
62  import org.apache.maven.model.profile.activation.OperatingSystemProfileActivator;
63  import org.apache.maven.model.profile.activation.ProfileActivator;
64  import org.apache.maven.model.profile.activation.PropertyProfileActivator;
65  import org.apache.maven.model.root.DefaultRootLocator;
66  import org.apache.maven.model.root.RootLocator;
67  import org.apache.maven.model.superpom.DefaultSuperPomProvider;
68  import org.apache.maven.model.superpom.SuperPomProvider;
69  import org.apache.maven.model.validation.DefaultModelValidator;
70  import org.apache.maven.model.validation.ModelValidator;
71  
72  /**
73   * A factory to create model builder instances when no dependency injection is available. <em>Note:</em> This class is
74   * only meant as a utility for developers that want to employ the model builder outside of the Maven build system, Maven
75   * plugins should always acquire model builder instances via dependency injection. Developers might want to subclass
76   * this factory to provide custom implementations for some of the components used by the model builder.
77   *
78   * @author Benjamin Bentmann
79   */
80  public class DefaultModelBuilderFactory {
81  
82      protected ModelProcessor newModelProcessor() {
83          DefaultModelProcessor processor = new DefaultModelProcessor();
84          processor.setModelLocator(newModelLocator());
85          processor.setModelReader(newModelReader());
86          return processor;
87      }
88  
89      protected ModelLocator newModelLocator() {
90          return new DefaultModelLocator();
91      }
92  
93      protected ModelReader newModelReader() {
94          return new DefaultModelReader();
95      }
96  
97      protected ProfileSelector newProfileSelector() {
98          DefaultProfileSelector profileSelector = new DefaultProfileSelector();
99  
100         for (ProfileActivator activator : newProfileActivators()) {
101             profileSelector.addProfileActivator(activator);
102         }
103 
104         return profileSelector;
105     }
106 
107     protected ProfileActivator[] newProfileActivators() {
108         return new ProfileActivator[] {
109             new JdkVersionProfileActivator(),
110             new OperatingSystemProfileActivator(),
111             new PropertyProfileActivator(),
112             new FileProfileActivator()
113                     .setProfileActivationFilePathInterpolator(newProfileActivationFilePathInterpolator())
114         };
115     }
116 
117     protected ProfileActivationFilePathInterpolator newProfileActivationFilePathInterpolator() {
118         return new ProfileActivationFilePathInterpolator()
119                 .setPathTranslator(newPathTranslator())
120                 .setRootLocator(newRootLocator());
121     }
122 
123     protected UrlNormalizer newUrlNormalizer() {
124         return new DefaultUrlNormalizer();
125     }
126 
127     protected PathTranslator newPathTranslator() {
128         return new DefaultPathTranslator();
129     }
130 
131     private RootLocator newRootLocator() {
132         return new DefaultRootLocator();
133     }
134 
135     protected ModelInterpolator newModelInterpolator() {
136         UrlNormalizer normalizer = newUrlNormalizer();
137         PathTranslator pathTranslator = newPathTranslator();
138         return new StringVisitorModelInterpolator()
139                 .setPathTranslator(pathTranslator)
140                 .setUrlNormalizer(normalizer)
141                 .setVersionPropertiesProcessor(newModelVersionPropertiesProcessor())
142                 .setRootLocator(newRootLocator());
143     }
144 
145     protected ModelVersionProcessor newModelVersionPropertiesProcessor() {
146         return new DefaultModelVersionProcessor();
147     }
148 
149     protected ModelValidator newModelValidator() {
150         return new DefaultModelValidator(newModelVersionPropertiesProcessor());
151     }
152 
153     protected ModelNormalizer newModelNormalizer() {
154         return new DefaultModelNormalizer();
155     }
156 
157     protected ModelPathTranslator newModelPathTranslator() {
158         return new DefaultModelPathTranslator().setPathTranslator(newPathTranslator());
159     }
160 
161     protected ModelUrlNormalizer newModelUrlNormalizer() {
162         return new DefaultModelUrlNormalizer().setUrlNormalizer(newUrlNormalizer());
163     }
164 
165     protected InheritanceAssembler newInheritanceAssembler() {
166         return new DefaultInheritanceAssembler();
167     }
168 
169     protected ProfileInjector newProfileInjector() {
170         return new DefaultProfileInjector();
171     }
172 
173     protected SuperPomProvider newSuperPomProvider() {
174         return new DefaultSuperPomProvider().setModelProcessor(newModelProcessor());
175     }
176 
177     protected DependencyManagementImporter newDependencyManagementImporter() {
178         return new DefaultDependencyManagementImporter();
179     }
180 
181     protected DependencyManagementInjector newDependencyManagementInjector() {
182         return new DefaultDependencyManagementInjector();
183     }
184 
185     protected LifecycleBindingsInjector newLifecycleBindingsInjector() {
186         return new StubLifecycleBindingsInjector();
187     }
188 
189     protected PluginManagementInjector newPluginManagementInjector() {
190         return new DefaultPluginManagementInjector();
191     }
192 
193     protected PluginConfigurationExpander newPluginConfigurationExpander() {
194         return new DefaultPluginConfigurationExpander();
195     }
196 
197     protected ReportConfigurationExpander newReportConfigurationExpander() {
198         return new DefaultReportConfigurationExpander();
199     }
200 
201     protected ReportingConverter newReportingConverter() {
202         return new DefaultReportingConverter();
203     }
204 
205     /**
206      * Creates a new model builder instance.
207      *
208      * @return The new model builder instance, never {@code null}.
209      */
210     public DefaultModelBuilder newInstance() {
211         DefaultModelBuilder modelBuilder = new DefaultModelBuilder();
212 
213         modelBuilder.setModelProcessor(newModelProcessor());
214         modelBuilder.setModelValidator(newModelValidator());
215         modelBuilder.setModelNormalizer(newModelNormalizer());
216         modelBuilder.setModelPathTranslator(newModelPathTranslator());
217         modelBuilder.setModelUrlNormalizer(newModelUrlNormalizer());
218         modelBuilder.setModelInterpolator(newModelInterpolator());
219         modelBuilder.setInheritanceAssembler(newInheritanceAssembler());
220         modelBuilder.setProfileInjector(newProfileInjector());
221         modelBuilder.setProfileSelector(newProfileSelector());
222         modelBuilder.setSuperPomProvider(newSuperPomProvider());
223         modelBuilder.setDependencyManagementImporter(newDependencyManagementImporter());
224         modelBuilder.setDependencyManagementInjector(newDependencyManagementInjector());
225         modelBuilder.setLifecycleBindingsInjector(newLifecycleBindingsInjector());
226         modelBuilder.setPluginManagementInjector(newPluginManagementInjector());
227         modelBuilder.setPluginConfigurationExpander(newPluginConfigurationExpander());
228         modelBuilder.setReportConfigurationExpander(newReportConfigurationExpander());
229         modelBuilder.setReportingConverter(newReportingConverter());
230         modelBuilder.setProfileActivationFilePathInterpolator(newProfileActivationFilePathInterpolator());
231 
232         return modelBuilder;
233     }
234 
235     private static class StubLifecycleBindingsInjector implements LifecycleBindingsInjector {
236 
237         @Override
238         public void injectLifecycleBindings(
239                 Model model, ModelBuildingRequest request, ModelProblemCollector problems) {}
240     }
241 }