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