1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  package org.apache.maven.settings.building;
20  
21  import javax.inject.Inject;
22  import javax.inject.Named;
23  import javax.inject.Singleton;
24  
25  import java.io.File;
26  import java.io.IOException;
27  import java.io.InputStream;
28  import java.lang.reflect.Method;
29  import java.nio.file.Path;
30  import java.util.List;
31  import java.util.stream.Collectors;
32  
33  import org.apache.maven.api.Session;
34  import org.apache.maven.api.services.BuilderProblem;
35  import org.apache.maven.api.services.SettingsBuilderException;
36  import org.apache.maven.api.services.SettingsBuilderRequest;
37  import org.apache.maven.api.services.SettingsBuilderResult;
38  import org.apache.maven.api.services.xml.SettingsXmlFactory;
39  import org.apache.maven.building.FileSource;
40  import org.apache.maven.building.Source;
41  import org.apache.maven.settings.Settings;
42  
43  
44  
45  
46  
47  
48  @Named
49  @Singleton
50  @Deprecated(since = "4.0.0")
51  public class DefaultSettingsBuilder implements SettingsBuilder {
52  
53      private final org.apache.maven.internal.impl.DefaultSettingsBuilder builder;
54      private final org.apache.maven.internal.impl.DefaultSettingsXmlFactory settingsXmlFactory;
55  
56      @Inject
57      public DefaultSettingsBuilder(
58              org.apache.maven.internal.impl.DefaultSettingsBuilder builder,
59              org.apache.maven.internal.impl.DefaultSettingsXmlFactory settingsXmlFactory) {
60          this.builder = builder;
61          this.settingsXmlFactory = settingsXmlFactory;
62      }
63  
64      @Override
65      public SettingsBuildingResult build(SettingsBuildingRequest request) throws SettingsBuildingException {
66  
67          try {
68              SettingsBuilderResult result = builder.build(SettingsBuilderRequest.builder()
69                      .session((Session) java.lang.reflect.Proxy.newProxyInstance(
70                              Session.class.getClassLoader(),
71                              new Class[] {Session.class},
72                              (Object proxy, Method method, Object[] args) -> {
73                                  if ("getSystemProperties".equals(method.getName())) {
74                                      return request.getSystemProperties().entrySet().stream()
75                                              .collect(Collectors.toMap(
76                                                      e -> e.getKey().toString(),
77                                                      e -> e.getValue().toString()));
78                                  } else if ("getUserProperties".equals(method.getName())) {
79                                      return request.getUserProperties().entrySet().stream()
80                                              .collect(Collectors.toMap(
81                                                      e -> e.getKey().toString(),
82                                                      e -> e.getValue().toString()));
83                                  } else if ("getService".equals(method.getName())) {
84                                      if (args[0] == SettingsXmlFactory.class) {
85                                          return settingsXmlFactory;
86                                      }
87                                  }
88                                  return null;
89                              }))
90                      .installationSettingsSource(
91                              toSource(request.getGlobalSettingsFile(), request.getGlobalSettingsSource()))
92                      .projectSettingsSource(
93                              toSource(request.getProjectSettingsFile(), request.getProjectSettingsSource()))
94                      .userSettingsSource(toSource(request.getUserSettingsFile(), request.getUserSettingsSource()))
95                      .build());
96  
97              return new DefaultSettingsBuildingResult(
98                      new Settings(result.getEffectiveSettings()), convert(result.getProblems()));
99          } catch (SettingsBuilderException e) {
100             throw new SettingsBuildingException(convert(e.getProblems()));
101         }
102     }
103 
104     private org.apache.maven.api.services.Source toSource(File file, Source source) {
105         if (file != null && file.exists()) {
106             return org.apache.maven.api.services.Source.fromPath(file.toPath());
107         } else if (source instanceof FileSource fs) {
108             return org.apache.maven.api.services.Source.fromPath(fs.getPath());
109         } else if (source != null) {
110             return new org.apache.maven.api.services.Source() {
111                 @Override
112                 public Path getPath() {
113                     return null;
114                 }
115 
116                 @Override
117                 public InputStream openStream() throws IOException {
118                     return source.getInputStream();
119                 }
120 
121                 @Override
122                 public String getLocation() {
123                     return source.getLocation();
124                 }
125 
126                 @Override
127                 public org.apache.maven.api.services.Source resolve(String relative) {
128                     return null;
129                 }
130             };
131         } else {
132             return null;
133         }
134     }
135 
136     private List<SettingsProblem> convert(List<BuilderProblem> problems) {
137         return problems.stream().map(this::convert).toList();
138     }
139 
140     private SettingsProblem convert(BuilderProblem problem) {
141         return new DefaultSettingsProblem(
142                 problem.getMessage(),
143                 SettingsProblem.Severity.valueOf(problem.getSeverity().name()),
144                 problem.getSource(),
145                 problem.getLineNumber(),
146                 problem.getColumnNumber(),
147                 problem.getException());
148     }
149 }