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.Session;
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      Session 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 Session session, @Nonnull Source installationSettingsSource, @Nonnull Source userSettingsSource) {
80          return build(session, installationSettingsSource, null, userSettingsSource);
81      }
82  
83      @Nonnull
84      static SettingsBuilderRequest build(
85              @Nonnull Session session, @Nonnull Path installationSettingsPath, @Nonnull Path userSettingsPath) {
86          return build(session, Source.fromPath(installationSettingsPath), null, Source.fromPath(userSettingsPath));
87      }
88  
89      @Nonnull
90      static SettingsBuilderRequest build(
91              @Nonnull Session session,
92              @Nullable Source installationSettingsSource,
93              @Nullable Source projectSettingsSource,
94              @Nullable Source userSettingsSource) {
95          return builder()
96                  .session(nonNull(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 Session session,
106             @Nullable Path installationSettingsPath,
107             @Nullable Path projectSettingsPath,
108             @Nullable Path userSettingsPath) {
109         return builder()
110                 .session(nonNull(session, "session cannot be null"))
111                 .installationSettingsSource(
112                         installationSettingsPath != null && Files.exists(installationSettingsPath)
113                                 ? Source.fromPath(installationSettingsPath)
114                                 : null)
115                 .projectSettingsSource(
116                         projectSettingsPath != null && Files.exists(projectSettingsPath)
117                                 ? Source.fromPath(projectSettingsPath)
118                                 : null)
119                 .userSettingsSource(
120                         userSettingsPath != null && Files.exists(userSettingsPath)
121                                 ? Source.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         Session session;
134         Source installationSettingsSource;
135         Source projectSettingsSource;
136         Source userSettingsSource;
137         Function<String, String> interpolationSource;
138 
139         public SettingsBuilderRequestBuilder session(Session session) {
140             this.session = session;
141             return this;
142         }
143 
144         public SettingsBuilderRequestBuilder installationSettingsSource(Source installationSettingsSource) {
145             this.installationSettingsSource = installationSettingsSource;
146             return this;
147         }
148 
149         public SettingsBuilderRequestBuilder projectSettingsSource(Source projectSettingsSource) {
150             this.projectSettingsSource = projectSettingsSource;
151             return this;
152         }
153 
154         public SettingsBuilderRequestBuilder userSettingsSource(Source userSettingsSource) {
155             this.userSettingsSource = userSettingsSource;
156             return this;
157         }
158 
159         public SettingsBuilderRequestBuilder interpolationSource(Function<String, String> interpolationSource) {
160             this.interpolationSource = interpolationSource;
161             return this;
162         }
163 
164         public SettingsBuilderRequest build() {
165             return new DefaultSettingsBuilderRequest(
166                     session,
167                     installationSettingsSource,
168                     projectSettingsSource,
169                     userSettingsSource,
170                     interpolationSource);
171         }
172 
173         private static class DefaultSettingsBuilderRequest extends BaseRequest implements SettingsBuilderRequest {
174             private final Source installationSettingsSource;
175             private final Source projectSettingsSource;
176             private final Source userSettingsSource;
177             private final Function<String, String> interpolationSource;
178 
179             @SuppressWarnings("checkstyle:ParameterNumber")
180             DefaultSettingsBuilderRequest(
181                     @Nonnull Session session,
182                     @Nullable Source installationSettingsSource,
183                     @Nullable Source projectSettingsSource,
184                     @Nullable Source userSettingsSource,
185                     @Nullable Function<String, String> interpolationSource) {
186                 super(session);
187                 this.installationSettingsSource = installationSettingsSource;
188                 this.projectSettingsSource = projectSettingsSource;
189                 this.userSettingsSource = userSettingsSource;
190                 this.interpolationSource = interpolationSource;
191             }
192 
193             @Nonnull
194             @Override
195             public Optional<Source> getInstallationSettingsSource() {
196                 return Optional.ofNullable(installationSettingsSource);
197             }
198 
199             @Nonnull
200             @Override
201             public Optional<Source> getProjectSettingsSource() {
202                 return Optional.ofNullable(projectSettingsSource);
203             }
204 
205             @Nonnull
206             @Override
207             public Optional<Source> getUserSettingsSource() {
208                 return Optional.ofNullable(userSettingsSource);
209             }
210 
211             @Nonnull
212             @Override
213             public Optional<Function<String, String>> getInterpolationSource() {
214                 return Optional.ofNullable(interpolationSource);
215             }
216         }
217     }
218 }