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.impl.model;
20  
21  import java.util.ArrayList;
22  import java.util.List;
23  import java.util.stream.Collectors;
24  import java.util.stream.Stream;
25  
26  import org.apache.maven.api.model.Model;
27  import org.apache.maven.api.model.Profile;
28  import org.apache.maven.api.services.ModelBuilderRequest;
29  import org.apache.maven.api.services.ModelBuilderResult;
30  import org.apache.maven.api.services.ModelProblem;
31  import org.apache.maven.api.services.ModelSource;
32  import org.apache.maven.api.services.ProblemCollector;
33  
34  /**
35   * Collects the output of the model builder.
36   */
37  class DefaultModelBuilderResult implements ModelBuilderResult {
38      private ModelBuilderRequest request;
39      private ModelSource source;
40      private Model fileModel;
41      private Model rawModel;
42      private Model parentModel;
43      private Model effectiveModel;
44      private List<Profile> activePomProfiles;
45      private List<Profile> activeExternalProfiles;
46      private final ProblemCollector<ModelProblem> problemCollector;
47      private final List<DefaultModelBuilderResult> children = new ArrayList<>();
48  
49      DefaultModelBuilderResult(ModelBuilderRequest request, ProblemCollector<ModelProblem> problemCollector) {
50          this.request = request;
51          this.problemCollector = problemCollector;
52      }
53  
54      @Override
55      public ModelBuilderRequest getRequest() {
56          return request;
57      }
58  
59      @Override
60      public ModelSource getSource() {
61          return source;
62      }
63  
64      public void setSource(ModelSource source) {
65          this.source = source;
66      }
67  
68      @Override
69      public Model getFileModel() {
70          return fileModel;
71      }
72  
73      public void setFileModel(Model fileModel) {
74          this.fileModel = fileModel;
75      }
76  
77      @Override
78      public Model getRawModel() {
79          return rawModel;
80      }
81  
82      public void setRawModel(Model rawModel) {
83          this.rawModel = rawModel;
84      }
85  
86      @Override
87      public Model getParentModel() {
88          return parentModel;
89      }
90  
91      public void setParentModel(Model parentModel) {
92          this.parentModel = parentModel;
93      }
94  
95      @Override
96      public Model getEffectiveModel() {
97          return effectiveModel;
98      }
99  
100     public void setEffectiveModel(Model model) {
101         this.effectiveModel = model;
102     }
103 
104     @Override
105     public List<Profile> getActivePomProfiles() {
106         return activePomProfiles;
107     }
108 
109     public void setActivePomProfiles(List<Profile> activeProfiles) {
110         this.activePomProfiles = activeProfiles;
111     }
112 
113     @Override
114     public List<Profile> getActiveExternalProfiles() {
115         return activeExternalProfiles;
116     }
117 
118     public void setActiveExternalProfiles(List<Profile> activeProfiles) {
119         this.activeExternalProfiles = activeProfiles;
120     }
121 
122     /**
123      * Returns an unmodifiable list of problems encountered during the model building process.
124      *
125      * @return a list of ModelProblem instances representing the encountered problems,
126      *         guaranteed to be non-null but possibly empty.
127      */
128     @Override
129     public ProblemCollector<ModelProblem> getProblemCollector() {
130         return problemCollector;
131     }
132 
133     @Override
134     public List<DefaultModelBuilderResult> getChildren() {
135         return children;
136     }
137 
138     @Override
139     public String toString() {
140         String modelId;
141         if (effectiveModel != null) {
142             modelId = effectiveModel.getId();
143         } else if (rawModel != null) {
144             modelId = rawModel.getId();
145         } else if (fileModel != null) {
146             modelId = fileModel.getId();
147         } else {
148             modelId = null;
149         }
150         if (problemCollector.hasWarningProblems()) {
151             int totalProblems = problemCollector.totalProblemsReported();
152             StringBuilder sb = new StringBuilder();
153             sb.append(totalProblems)
154                     .append(
155                             (totalProblems == 1)
156                                     ? " problem was "
157                                     : " problems were encountered while building the effective model");
158             if (modelId != null && !modelId.isEmpty()) {
159                 sb.append(" for ");
160                 sb.append(modelId);
161             }
162             for (ModelProblem problem : problemCollector.problems().toList()) {
163                 sb.append(System.lineSeparator());
164                 sb.append("    - [");
165                 sb.append(problem.getSeverity());
166                 sb.append("] ");
167                 if (problem.getMessage() != null && !problem.getMessage().isEmpty()) {
168                     sb.append(problem.getMessage());
169                 } else if (problem.getException() != null) {
170                     sb.append(problem.getException().toString());
171                 }
172                 String loc = Stream.of(
173                                 problem.getModelId().equals(modelId) ? problem.getModelId() : "",
174                                 problem.getModelId().equals(modelId) ? problem.getSource() : "",
175                                 problem.getLineNumber() > 0 ? "line " + problem.getLineNumber() : "",
176                                 problem.getColumnNumber() > 0 ? "column " + problem.getColumnNumber() : "")
177                         .filter(s -> !s.isEmpty())
178                         .collect(Collectors.joining(", "));
179                 if (!loc.isEmpty()) {
180                     sb.append(" @ ").append(loc);
181                 }
182             }
183             return sb.toString();
184         }
185         return modelId;
186     }
187 }