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     public String toString() {
139         String modelId;
140         if (effectiveModel != null) {
141             modelId = effectiveModel.getId();
142         } else if (rawModel != null) {
143             modelId = rawModel.getId();
144         } else if (fileModel != null) {
145             modelId = fileModel.getId();
146         } else {
147             modelId = null;
148         }
149         if (problemCollector.hasWarningProblems()) {
150             int totalProblems = problemCollector.totalProblemsReported();
151             StringBuilder sb = new StringBuilder();
152             sb.append(totalProblems)
153                     .append(
154                             (totalProblems == 1)
155                                     ? " problem was "
156                                     : " problems were encountered while building the effective model");
157             if (modelId != null && !modelId.isEmpty()) {
158                 sb.append(" for ");
159                 sb.append(modelId);
160             }
161             for (ModelProblem problem : problemCollector.problems().toList()) {
162                 sb.append(System.lineSeparator());
163                 sb.append("    - [");
164                 sb.append(problem.getSeverity());
165                 sb.append("] ");
166                 if (problem.getMessage() != null && !problem.getMessage().isEmpty()) {
167                     sb.append(problem.getMessage());
168                 } else if (problem.getException() != null) {
169                     sb.append(problem.getException().toString());
170                 }
171                 String loc = Stream.of(
172                                 problem.getModelId().equals(modelId) ? problem.getModelId() : "",
173                                 problem.getModelId().equals(modelId) ? problem.getSource() : "",
174                                 problem.getLineNumber() > 0 ? "line " + problem.getLineNumber() : "",
175                                 problem.getColumnNumber() > 0 ? "column " + problem.getColumnNumber() : "")
176                         .filter(s -> !s.isEmpty())
177                         .collect(Collectors.joining(", "));
178                 if (!loc.isEmpty()) {
179                     sb.append(" @ ").append(loc);
180                 }
181             }
182             return sb.toString();
183         }
184         return modelId;
185     }
186 }