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  import java.util.Objects;
24  
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 = Objects.requireNonNull( project, "project cannot be null" );
59          this.projectBuildingHelper =
60              Objects.requireNonNull( projectBuildingHelper, "projectBuildingHelper cannot be null" );
61          this.projectBuildingRequest =
62              Objects.requireNonNull( projectBuildingRequest, "projectBuildingRequest cannot be null" );
63          this.remoteRepositories = projectBuildingRequest.getRemoteRepositories();
64          this.pluginRepositories = projectBuildingRequest.getPluginArtifactRepositories();
65      }
66  
67      /**
68       * Gets the project whose model is being built.
69       *
70       * @return The project, never {@code null}.
71       */
72      public MavenProject getProject()
73      {
74          return project;
75      }
76  
77      @Override
78      public void buildExtensionsAssembled( ModelBuildingEvent event )
79      {
80          Model model = event.getModel();
81  
82          try
83          {
84              pluginRepositories =
85                  projectBuildingHelper.createArtifactRepositories( model.getPluginRepositories(), pluginRepositories,
86                                                                    projectBuildingRequest );
87          }
88          catch ( Exception e )
89          {
90              event.getProblems().add( new ModelProblemCollectorRequest( Severity.ERROR, Version.BASE )
91                      .setMessage( "Invalid plugin repository: " + e.getMessage() )
92                      .setException( e ) );
93          }
94          project.setPluginArtifactRepositories( pluginRepositories );
95  
96          if ( event.getRequest().isProcessPlugins() )
97          {
98              try
99              {
100                 ProjectRealmCache.CacheRecord record =
101                     projectBuildingHelper.createProjectRealm( project, model, projectBuildingRequest );
102 
103                 project.setClassRealm( record.getRealm() );
104                 project.setExtensionDependencyFilter( record.getExtensionArtifactFilter() );
105             }
106             catch ( PluginResolutionException | PluginManagerException | PluginVersionResolutionException e )
107             {
108                 event.getProblems().add( new ModelProblemCollectorRequest( Severity.ERROR, Version.BASE )
109                         .setMessage( "Unresolveable build extension: " + e.getMessage() )
110                         .setException( e ) );
111             }
112 
113             projectBuildingHelper.selectProjectRealm( project );
114         }
115 
116         // build the regular repos after extensions are loaded to allow for custom layouts
117         try
118         {
119             remoteRepositories =
120                 projectBuildingHelper.createArtifactRepositories( model.getRepositories(), remoteRepositories,
121                                                                   projectBuildingRequest );
122         }
123         catch ( Exception e )
124         {
125             event.getProblems().add( new ModelProblemCollectorRequest( Severity.ERROR, Version.BASE )
126                     .setMessage( "Invalid artifact repository: " + e.getMessage() )
127                     .setException( e ) );
128         }
129         project.setRemoteArtifactRepositories( remoteRepositories );
130     }
131 
132 }