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.api.services;
20  
21  import java.nio.file.Files;
22  import java.nio.file.Path;
23  import java.util.Objects;
24  import java.util.Optional;
25  import java.util.function.UnaryOperator;
26  
27  import org.apache.maven.api.ProtoSession;
28  import org.apache.maven.api.annotations.Experimental;
29  import org.apache.maven.api.annotations.Immutable;
30  import org.apache.maven.api.annotations.Nonnull;
31  import org.apache.maven.api.annotations.NotThreadSafe;
32  import org.apache.maven.api.annotations.Nullable;
33  
34  import static java.util.Objects.requireNonNull;
35  
36  /**
37   * Collects settings that control the building of effective settings.
38   */
39  @Experimental
40  @Immutable
41  public interface SettingsBuilderRequest extends Request<ProtoSession> {
42  
43      /**
44       * Gets the installation settings source.
45       *
46       * @return the installation settings source or {@code null} if none
47       */
48      @Nonnull
49      Optional<Source> getInstallationSettingsSource();
50  
51      /**
52       * Gets the project settings source.
53       *
54       * @return the project settings source or {@code null} if none
55       */
56      @Nonnull
57      Optional<Source> getProjectSettingsSource();
58  
59      /**
60       * Gets the user settings source.
61       *
62       * @return the user settings source or {@code null} if none
63       */
64      @Nonnull
65      Optional<Source> getUserSettingsSource();
66  
67      /**
68       * The optional interpolation source used for interpolation.
69       *
70       * @return the interpolation source for interpolation
71       */
72      @Nonnull
73      Optional<UnaryOperator<String>> getInterpolationSource();
74  
75      @Nonnull
76      static SettingsBuilderRequest build(
77              @Nonnull ProtoSession session,
78              @Nonnull Source installationSettingsSource,
79              @Nonnull Source userSettingsSource) {
80          return build(session, installationSettingsSource, null, userSettingsSource);
81      }
82  
83      @Nonnull
84      static SettingsBuilderRequest build(
85              @Nonnull ProtoSession session, @Nonnull Path installationSettingsPath, @Nonnull Path userSettingsPath) {
86          return build(session, Sources.fromPath(installationSettingsPath), null, Sources.fromPath(userSettingsPath));
87      }
88  
89      @Nonnull
90      static SettingsBuilderRequest build(
91              @Nonnull ProtoSession session,
92              @Nullable Source installationSettingsSource,
93              @Nullable Source projectSettingsSource,
94              @Nullable Source userSettingsSource) {
95          return builder()
96                  .session(requireNonNull(session, "session cannot be null"))
97                  .installationSettingsSource(installationSettingsSource)
98                  .projectSettingsSource(projectSettingsSource)
99                  .userSettingsSource(userSettingsSource)
100                 .build();
101     }
102 
103     @Nonnull
104     static SettingsBuilderRequest build(
105             @Nonnull ProtoSession session,
106             @Nullable Path installationSettingsPath,
107             @Nullable Path projectSettingsPath,
108             @Nullable Path userSettingsPath) {
109         return builder()
110                 .session(requireNonNull(session, "session cannot be null"))
111                 .installationSettingsSource(
112                         installationSettingsPath != null && Files.exists(installationSettingsPath)
113                                 ? Sources.fromPath(installationSettingsPath)
114                                 : null)
115                 .projectSettingsSource(
116                         projectSettingsPath != null && Files.exists(projectSettingsPath)
117                                 ? Sources.fromPath(projectSettingsPath)
118                                 : null)
119                 .userSettingsSource(
120                         userSettingsPath != null && Files.exists(userSettingsPath)
121                                 ? Sources.fromPath(userSettingsPath)
122                                 : null)
123                 .build();
124     }
125 
126     @Nonnull
127     static SettingsBuilderRequestBuilder builder() {
128         return new SettingsBuilderRequestBuilder();
129     }
130 
131     @NotThreadSafe
132     class SettingsBuilderRequestBuilder {
133         ProtoSession session;
134         RequestTrace trace;
135         Source installationSettingsSource;
136         Source projectSettingsSource;
137         Source userSettingsSource;
138         UnaryOperator<String> interpolationSource;
139 
140         public SettingsBuilderRequestBuilder session(ProtoSession session) {
141             this.session = session;
142             return this;
143         }
144 
145         public SettingsBuilderRequestBuilder trace(RequestTrace trace) {
146             this.trace = trace;
147             return this;
148         }
149 
150         public SettingsBuilderRequestBuilder installationSettingsSource(Source installationSettingsSource) {
151             this.installationSettingsSource = installationSettingsSource;
152             return this;
153         }
154 
155         public SettingsBuilderRequestBuilder projectSettingsSource(Source projectSettingsSource) {
156             this.projectSettingsSource = projectSettingsSource;
157             return this;
158         }
159 
160         public SettingsBuilderRequestBuilder userSettingsSource(Source userSettingsSource) {
161             this.userSettingsSource = userSettingsSource;
162             return this;
163         }
164 
165         public SettingsBuilderRequestBuilder interpolationSource(UnaryOperator<String> interpolationSource) {
166             this.interpolationSource = interpolationSource;
167             return this;
168         }
169 
170         public SettingsBuilderRequest build() {
171             return new DefaultSettingsBuilderRequest(
172                     session,
173                     trace,
174                     installationSettingsSource,
175                     projectSettingsSource,
176                     userSettingsSource,
177                     interpolationSource);
178         }
179 
180         private static class DefaultSettingsBuilderRequest extends BaseRequest<ProtoSession>
181                 implements SettingsBuilderRequest {
182             private final Source installationSettingsSource;
183             private final Source projectSettingsSource;
184             private final Source userSettingsSource;
185             private final UnaryOperator<String> interpolationSource;
186 
187             @SuppressWarnings("checkstyle:ParameterNumber")
188             DefaultSettingsBuilderRequest(
189                     @Nonnull ProtoSession session,
190                     @Nullable RequestTrace trace,
191                     @Nullable Source installationSettingsSource,
192                     @Nullable Source projectSettingsSource,
193                     @Nullable Source userSettingsSource,
194                     @Nullable UnaryOperator<String> interpolationSource) {
195                 super(session, trace);
196                 this.installationSettingsSource = installationSettingsSource;
197                 this.projectSettingsSource = projectSettingsSource;
198                 this.userSettingsSource = userSettingsSource;
199                 this.interpolationSource = interpolationSource;
200             }
201 
202             @Nonnull
203             @Override
204             public Optional<Source> getInstallationSettingsSource() {
205                 return Optional.ofNullable(installationSettingsSource);
206             }
207 
208             @Nonnull
209             @Override
210             public Optional<Source> getProjectSettingsSource() {
211                 return Optional.ofNullable(projectSettingsSource);
212             }
213 
214             @Nonnull
215             @Override
216             public Optional<Source> getUserSettingsSource() {
217                 return Optional.ofNullable(userSettingsSource);
218             }
219 
220             @Nonnull
221             @Override
222             public Optional<UnaryOperator<String>> getInterpolationSource() {
223                 return Optional.ofNullable(interpolationSource);
224             }
225 
226             @Override
227             public boolean equals(Object o) {
228                 return o instanceof DefaultSettingsBuilderRequest that
229                         && Objects.equals(installationSettingsSource, that.installationSettingsSource)
230                         && Objects.equals(projectSettingsSource, that.projectSettingsSource)
231                         && Objects.equals(userSettingsSource, that.userSettingsSource)
232                         && Objects.equals(interpolationSource, that.interpolationSource);
233             }
234 
235             @Override
236             public int hashCode() {
237                 return Objects.hash(
238                         installationSettingsSource, projectSettingsSource, userSettingsSource, interpolationSource);
239             }
240 
241             @Override
242             public String toString() {
243                 return "SettingsBuilderRequest[" + "installationSettingsSource="
244                         + installationSettingsSource + ", projectSettingsSource="
245                         + projectSettingsSource + ", userSettingsSource="
246                         + userSettingsSource + ", interpolationSource="
247                         + interpolationSource + ']';
248             }
249         }
250     }
251 }