View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.maven.internal.impl;
20  
21  import javax.inject.Inject;
22  import javax.inject.Named;
23  
24  import java.nio.file.Path;
25  import java.util.Collection;
26  import java.util.Collections;
27  import java.util.List;
28  import java.util.Optional;
29  import java.util.stream.Collectors;
30  
31  import org.apache.maven.RepositoryUtils;
32  import org.apache.maven.api.*;
33  import org.apache.maven.api.annotations.Nonnull;
34  import org.apache.maven.api.di.SessionScoped;
35  import org.apache.maven.api.model.Resource;
36  import org.apache.maven.api.services.*;
37  import org.apache.maven.project.MavenProject;
38  import org.eclipse.sisu.Typed;
39  
40  import static org.apache.maven.internal.impl.Utils.map;
41  
42  @Named
43  @Typed
44  @SessionScoped
45  public class DefaultProjectManager implements ProjectManager {
46  
47      private final InternalSession session;
48      private final ArtifactManager artifactManager;
49  
50      @Inject
51      public DefaultProjectManager(InternalSession session, ArtifactManager artifactManager) {
52          this.session = session;
53          this.artifactManager = artifactManager;
54      }
55  
56      @Nonnull
57      @Override
58      public Optional<Path> getPath(Project project) {
59          return artifactManager.getPath(project.getArtifact());
60      }
61  
62      @Nonnull
63      @Override
64      public Collection<Artifact> getAttachedArtifacts(Project project) {
65          InternalSession session = ((DefaultProject) project).getSession();
66          Collection<Artifact> attached = map(
67                  getMavenProject(project).getAttachedArtifacts(),
68                  a -> session.getArtifact(RepositoryUtils.toArtifact(a)));
69          return Collections.unmodifiableCollection(attached);
70      }
71  
72      @Override
73      public void attachArtifact(Project project, Artifact artifact, Path path) {
74          getMavenProject(project)
75                  .addAttachedArtifact(RepositoryUtils.toArtifact(
76                          ((DefaultProject) project).getSession().toArtifact(artifact)));
77          artifactManager.setPath(artifact, path);
78      }
79  
80      @Override
81      public List<String> getCompileSourceRoots(Project project) {
82          List<String> roots = getMavenProject(project).getCompileSourceRoots();
83          return Collections.unmodifiableList(roots);
84      }
85  
86      @Override
87      public void addCompileSourceRoot(Project project, String sourceRoot) {
88          List<String> roots = getMavenProject(project).getCompileSourceRoots();
89          roots.add(sourceRoot);
90      }
91  
92      @Override
93      public List<String> getTestCompileSourceRoots(Project project) {
94          List<String> roots = getMavenProject(project).getTestCompileSourceRoots();
95          return Collections.unmodifiableList(roots);
96      }
97  
98      @Override
99      public void addTestCompileSourceRoot(Project project, String sourceRoot) {
100         List<String> roots = getMavenProject(project).getTestCompileSourceRoots();
101         roots.add(sourceRoot);
102     }
103 
104     @Override
105     public List<Resource> getResources(Project project) {
106         return getMavenProject(project).getBuild().getDelegate().getResources();
107     }
108 
109     @Override
110     public void addResource(Project project, Resource resource) {
111         getMavenProject(project).addResource(new org.apache.maven.model.Resource(resource));
112     }
113 
114     @Override
115     public List<Resource> getTestResources(Project project) {
116         return getMavenProject(project).getBuild().getDelegate().getTestResources();
117     }
118 
119     @Override
120     public void addTestResource(Project project, Resource resource) {
121         getMavenProject(project).addTestResource(new org.apache.maven.model.Resource(resource));
122     }
123 
124     @Override
125     public List<RemoteRepository> getRepositories(Project project) {
126         return ((DefaultProject) project)
127                 .getProject().getRemoteProjectRepositories().stream()
128                         .map(session::getRemoteRepository)
129                         .collect(Collectors.toList());
130     }
131 
132     @Override
133     public void setProperty(Project project, String key, String value) {
134         getMavenProject(project).getProperties().setProperty(key, value);
135     }
136 
137     @Override
138     public Optional<Project> getExecutionProject(Project project) {
139         // Session keep tracks of the Project per project id,
140         // so we cannot use session.getProject(p) for forked projects
141         // which are temporary clones
142         return Optional.ofNullable(getMavenProject(project).getExecutionProject())
143                 .map(p -> new DefaultProject(session, p));
144     }
145 
146     private MavenProject getMavenProject(Project project) {
147         return ((DefaultProject) project).getProject();
148     }
149 }