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