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 org.apache.maven.model.Model;
023    import org.apache.maven.model.composition.DefaultDependencyManagementImporter;
024    import org.apache.maven.model.composition.DependencyManagementImporter;
025    import org.apache.maven.model.inheritance.DefaultInheritanceAssembler;
026    import org.apache.maven.model.inheritance.InheritanceAssembler;
027    import org.apache.maven.model.interpolation.ModelInterpolator;
028    import org.apache.maven.model.interpolation.StringSearchModelInterpolator;
029    import org.apache.maven.model.io.DefaultModelReader;
030    import org.apache.maven.model.io.ModelReader;
031    import org.apache.maven.model.locator.DefaultModelLocator;
032    import org.apache.maven.model.locator.ModelLocator;
033    import org.apache.maven.model.management.DefaultDependencyManagementInjector;
034    import org.apache.maven.model.management.DefaultPluginManagementInjector;
035    import org.apache.maven.model.management.DependencyManagementInjector;
036    import org.apache.maven.model.management.PluginManagementInjector;
037    import org.apache.maven.model.normalization.DefaultModelNormalizer;
038    import org.apache.maven.model.normalization.ModelNormalizer;
039    import org.apache.maven.model.path.DefaultModelPathTranslator;
040    import org.apache.maven.model.path.DefaultModelUrlNormalizer;
041    import org.apache.maven.model.path.DefaultPathTranslator;
042    import org.apache.maven.model.path.DefaultUrlNormalizer;
043    import org.apache.maven.model.path.ModelPathTranslator;
044    import org.apache.maven.model.path.ModelUrlNormalizer;
045    import org.apache.maven.model.path.PathTranslator;
046    import org.apache.maven.model.path.UrlNormalizer;
047    import org.apache.maven.model.plugin.DefaultPluginConfigurationExpander;
048    import org.apache.maven.model.plugin.DefaultReportConfigurationExpander;
049    import org.apache.maven.model.plugin.DefaultReportingConverter;
050    import org.apache.maven.model.plugin.LifecycleBindingsInjector;
051    import org.apache.maven.model.plugin.PluginConfigurationExpander;
052    import org.apache.maven.model.plugin.ReportConfigurationExpander;
053    import org.apache.maven.model.plugin.ReportingConverter;
054    import org.apache.maven.model.profile.DefaultProfileInjector;
055    import org.apache.maven.model.profile.DefaultProfileSelector;
056    import org.apache.maven.model.profile.ProfileInjector;
057    import org.apache.maven.model.profile.ProfileSelector;
058    import org.apache.maven.model.profile.activation.FileProfileActivator;
059    import org.apache.maven.model.profile.activation.JdkVersionProfileActivator;
060    import org.apache.maven.model.profile.activation.OperatingSystemProfileActivator;
061    import org.apache.maven.model.profile.activation.ProfileActivator;
062    import org.apache.maven.model.profile.activation.PropertyProfileActivator;
063    import org.apache.maven.model.superpom.DefaultSuperPomProvider;
064    import org.apache.maven.model.superpom.SuperPomProvider;
065    import org.apache.maven.model.validation.DefaultModelValidator;
066    import org.apache.maven.model.validation.ModelValidator;
067    
068    /**
069     * A factory to create model builder instances when no dependency injection is available. <em>Note:</em> This class is
070     * only meant as a utility for developers that want to employ the model builder outside of the Maven build system, Maven
071     * plugins should always acquire model builder instances via dependency injection. Developers might want to subclass
072     * this factory to provide custom implementations for some of the components used by the model builder.
073     * 
074     * @author Benjamin Bentmann
075     */
076    public class DefaultModelBuilderFactory
077    {
078    
079        protected ModelProcessor newModelProcessor()
080        {
081            DefaultModelProcessor processor = new DefaultModelProcessor();
082            processor.setModelLocator( newModelLocator() );
083            processor.setModelReader( newModelReader() );
084            return processor;
085        }
086    
087        protected ModelLocator newModelLocator()
088        {
089            return new DefaultModelLocator();
090        }
091    
092        protected ModelReader newModelReader()
093        {
094            return new DefaultModelReader();
095        }
096    
097        protected ProfileSelector newProfileSelector()
098        {
099            DefaultProfileSelector profileSelector = new DefaultProfileSelector();
100    
101            for ( ProfileActivator activator : newProfileActivators() )
102            {
103                profileSelector.addProfileActivator( activator );
104            }
105    
106            return profileSelector;
107        }
108    
109        protected ProfileActivator[] newProfileActivators()
110        {
111            return new ProfileActivator[] { new JdkVersionProfileActivator(), new OperatingSystemProfileActivator(),
112                new PropertyProfileActivator(), new FileProfileActivator().setPathTranslator( newPathTranslator() ) };
113        }
114    
115        protected UrlNormalizer newUrlNormalizer()
116        {
117            return new DefaultUrlNormalizer();
118        }
119    
120        protected PathTranslator newPathTranslator()
121        {
122            return new DefaultPathTranslator();
123        }
124    
125        protected ModelInterpolator newModelInterpolator()
126        {
127            UrlNormalizer urlNormalizer = newUrlNormalizer();
128            PathTranslator pathTranslator = newPathTranslator();
129            return new StringSearchModelInterpolator().setPathTranslator( pathTranslator ).setUrlNormalizer( urlNormalizer );
130        }
131    
132        protected ModelValidator newModelValidator()
133        {
134            return new DefaultModelValidator();
135        }
136    
137        protected ModelNormalizer newModelNormalizer()
138        {
139            return new DefaultModelNormalizer();
140        }
141    
142        protected ModelPathTranslator newModelPathTranslator()
143        {
144            return new DefaultModelPathTranslator().setPathTranslator( newPathTranslator() );
145        }
146    
147        protected ModelUrlNormalizer newModelUrlNormalizer()
148        {
149            return new DefaultModelUrlNormalizer().setUrlNormalizer( newUrlNormalizer() );
150        }
151    
152        protected InheritanceAssembler newInheritanceAssembler()
153        {
154            return new DefaultInheritanceAssembler();
155        }
156    
157        protected ProfileInjector newProfileInjector()
158        {
159            return new DefaultProfileInjector();
160        }
161    
162        protected SuperPomProvider newSuperPomProvider()
163        {
164            return new DefaultSuperPomProvider().setModelProcessor( newModelProcessor() );
165        }
166    
167        protected DependencyManagementImporter newDependencyManagementImporter()
168        {
169            return new DefaultDependencyManagementImporter();
170        }
171    
172        protected DependencyManagementInjector newDependencyManagementInjector()
173        {
174            return new DefaultDependencyManagementInjector();
175        }
176    
177        protected LifecycleBindingsInjector newLifecycleBindingsInjector()
178        {
179            return new StubLifecycleBindingsInjector();
180        }
181    
182        protected PluginManagementInjector newPluginManagementInjector()
183        {
184            return new DefaultPluginManagementInjector();
185        }
186    
187        protected PluginConfigurationExpander newPluginConfigurationExpander()
188        {
189            return new DefaultPluginConfigurationExpander();
190        }
191    
192        protected ReportConfigurationExpander newReportConfigurationExpander()
193        {
194            return new DefaultReportConfigurationExpander();
195        }
196    
197        protected ReportingConverter newReportingConverter()
198        {
199            return new DefaultReportingConverter();
200        }
201    
202        /**
203         * Creates a new model builder instance.
204         * 
205         * @return The new model builder instance, never {@code null}.
206         */
207        public DefaultModelBuilder newInstance()
208        {
209            DefaultModelBuilder modelBuilder = new DefaultModelBuilder();
210    
211            modelBuilder.setModelProcessor( newModelProcessor() );
212            modelBuilder.setModelValidator( newModelValidator() );
213            modelBuilder.setModelNormalizer( newModelNormalizer() );
214            modelBuilder.setModelPathTranslator( newModelPathTranslator() );
215            modelBuilder.setModelUrlNormalizer( newModelUrlNormalizer() );
216            modelBuilder.setModelInterpolator( newModelInterpolator() );
217            modelBuilder.setInheritanceAssembler( newInheritanceAssembler() );
218            modelBuilder.setProfileInjector( newProfileInjector() );
219            modelBuilder.setProfileSelector( newProfileSelector() );
220            modelBuilder.setSuperPomProvider( newSuperPomProvider() );
221            modelBuilder.setDependencyManagementImporter( newDependencyManagementImporter() );
222            modelBuilder.setDependencyManagementInjector( newDependencyManagementInjector() );
223            modelBuilder.setLifecycleBindingsInjector( newLifecycleBindingsInjector() );
224            modelBuilder.setPluginManagementInjector( newPluginManagementInjector() );
225            modelBuilder.setPluginConfigurationExpander( newPluginConfigurationExpander() );
226            modelBuilder.setReportConfigurationExpander( newReportConfigurationExpander() );
227            modelBuilder.setReportingConverter( newReportingConverter() );
228    
229            return modelBuilder;
230        }
231    
232        private static class StubLifecycleBindingsInjector
233            implements LifecycleBindingsInjector
234        {
235    
236            public void injectLifecycleBindings( Model model, ModelBuildingRequest request, ModelProblemCollector problems )
237            {
238            }
239    
240        }
241    
242    }