View Javadoc
1   package org.apache.maven.project;
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 java.util.List;
23  
24  import org.apache.maven.artifact.repository.ArtifactRepository;
25  import org.apache.maven.model.Model;
26  import org.apache.maven.model.building.AbstractModelBuildingListener;
27  import org.apache.maven.model.building.ModelBuildingEvent;
28  import org.apache.maven.model.building.ModelProblem.Severity;
29  import org.apache.maven.model.building.ModelProblem.Version;
30  import org.apache.maven.model.building.ModelProblemCollectorRequest;
31  import org.apache.maven.plugin.PluginResolutionException;
32  import org.apache.maven.plugin.version.PluginVersionResolutionException;
33  
34  /**
35   * Processes events from the model builder while building the effective model for a {@link MavenProject} instance.
36   * 
37   * @author Benjamin Bentmann
38   */
39  class DefaultModelBuildingListener
40      extends AbstractModelBuildingListener
41  {
42  
43      private MavenProject project;
44  
45      private ProjectBuildingHelper projectBuildingHelper;
46  
47      private ProjectBuildingRequest projectBuildingRequest;
48  
49      private List<ArtifactRepository> remoteRepositories;
50  
51      private List<ArtifactRepository> pluginRepositories;
52  
53      public DefaultModelBuildingListener( MavenProject project, ProjectBuildingHelper projectBuildingHelper,
54                                           ProjectBuildingRequest projectBuildingRequest )
55      {
56          if ( project == null )
57          {
58              throw new IllegalArgumentException( "project missing" );
59          }
60          this.project = project;
61  
62          if ( projectBuildingHelper == null )
63          {
64              throw new IllegalArgumentException( "project building helper missing" );
65          }
66          this.projectBuildingHelper = projectBuildingHelper;
67  
68          if ( projectBuildingRequest == null )
69          {
70              throw new IllegalArgumentException( "project building request missing" );
71          }
72          this.projectBuildingRequest = projectBuildingRequest;
73          this.remoteRepositories = projectBuildingRequest.getRemoteRepositories();
74          this.pluginRepositories = projectBuildingRequest.getPluginArtifactRepositories();
75      }
76  
77      /**
78       * Gets the project whose model is being built.
79       * 
80       * @return The project, never {@code null}.
81       */
82      public MavenProject getProject()
83      {
84          return project;
85      }
86  
87      @Override
88      public void buildExtensionsAssembled( ModelBuildingEvent event )
89      {
90          Model model = event.getModel();
91  
92          try
93          {
94              pluginRepositories =
95                  projectBuildingHelper.createArtifactRepositories( model.getPluginRepositories(), pluginRepositories,
96                                                                    projectBuildingRequest );
97          }
98          catch ( Exception e )
99          {
100             event.getProblems().add( new ModelProblemCollectorRequest( Severity.ERROR, Version.BASE )
101                     .setMessage( "Invalid plugin repository: " + e.getMessage() )
102                     .setException( e ) );
103         }
104         project.setPluginArtifactRepositories( pluginRepositories );
105 
106         if ( event.getRequest().isProcessPlugins() )
107         {
108             try
109             {
110                 ProjectRealmCache.CacheRecord record =
111                     projectBuildingHelper.createProjectRealm( project, model, projectBuildingRequest );
112 
113                 project.setClassRealm( record.realm );
114                 project.setExtensionDependencyFilter( record.extensionArtifactFilter );
115             }
116             catch ( PluginResolutionException e )
117             {
118                 event.getProblems().add( new ModelProblemCollectorRequest( Severity.ERROR, Version.BASE )
119                         .setMessage( "Unresolveable build extension: " + e.getMessage() )
120                         .setException( e ) );
121             }
122             catch ( PluginVersionResolutionException e )
123             {
124                 event.getProblems().add( new ModelProblemCollectorRequest( Severity.ERROR, Version.BASE )
125                         .setMessage( "Unresolveable build extension: " + e.getMessage() )
126                         .setException( e ) );
127             }
128 
129             projectBuildingHelper.selectProjectRealm( project );
130         }
131 
132         // build the regular repos after extensions are loaded to allow for custom layouts
133         try
134         {
135             remoteRepositories =
136                 projectBuildingHelper.createArtifactRepositories( model.getRepositories(), remoteRepositories,
137                                                                   projectBuildingRequest );
138         }
139         catch ( Exception e )
140         {
141             event.getProblems().add( new ModelProblemCollectorRequest( Severity.ERROR, Version.BASE )
142                     .setMessage( "Invalid artifact repository: " + e.getMessage() )
143                     .setException( e ) );
144         }
145         project.setRemoteArtifactRepositories( remoteRepositories );
146     }
147 
148 }