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