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.cling.invoker.mvn;
20  
21  import java.util.ArrayList;
22  import java.util.Collection;
23  import java.util.List;
24  import java.util.Map;
25  import java.util.Objects;
26  import java.util.Optional;
27  
28  import org.apache.maven.api.cli.mvn.MavenOptions;
29  import org.apache.maven.cling.invoker.LayeredOptions;
30  
31  /**
32   * Options that are "layered" by precedence order.
33   *
34   * @param <O> the specific type of Maven Options that are layered
35   */
36  public class LayeredMavenOptions<O extends MavenOptions> extends LayeredOptions<O> implements MavenOptions {
37      public static MavenOptions layerMavenOptions(Collection<MavenOptions> options) {
38          List<MavenOptions> o = options.stream().filter(Objects::nonNull).toList();
39          if (o.isEmpty()) {
40              throw new IllegalArgumentException("No options specified (or all were null)");
41          } else if (o.size() == 1) {
42              return o.get(0);
43          } else {
44              return new LayeredMavenOptions<>(o);
45          }
46      }
47  
48      protected LayeredMavenOptions(List<O> options) {
49          super(options);
50      }
51  
52      @Override
53      public Optional<String> alternatePomFile() {
54          return returnFirstPresentOrEmpty(MavenOptions::alternatePomFile);
55      }
56  
57      @Override
58      public Optional<Boolean> offline() {
59          return returnFirstPresentOrEmpty(MavenOptions::offline);
60      }
61  
62      @Override
63      public Optional<Boolean> nonRecursive() {
64          return returnFirstPresentOrEmpty(MavenOptions::nonRecursive);
65      }
66  
67      @Override
68      public Optional<Boolean> updateSnapshots() {
69          return returnFirstPresentOrEmpty(MavenOptions::updateSnapshots);
70      }
71  
72      @Override
73      public Optional<List<String>> activatedProfiles() {
74          return collectListIfPresentOrEmpty(MavenOptions::activatedProfiles);
75      }
76  
77      @Override
78      public Optional<Boolean> suppressSnapshotUpdates() {
79          return returnFirstPresentOrEmpty(MavenOptions::suppressSnapshotUpdates);
80      }
81  
82      @Override
83      public Optional<Boolean> strictChecksums() {
84          return returnFirstPresentOrEmpty(MavenOptions::strictChecksums);
85      }
86  
87      @Override
88      public Optional<Boolean> relaxedChecksums() {
89          return returnFirstPresentOrEmpty(MavenOptions::relaxedChecksums);
90      }
91  
92      @Override
93      public Optional<Boolean> failFast() {
94          return returnFirstPresentOrEmpty(MavenOptions::failFast);
95      }
96  
97      @Override
98      public Optional<Boolean> failAtEnd() {
99          return returnFirstPresentOrEmpty(MavenOptions::failAtEnd);
100     }
101 
102     @Override
103     public Optional<Boolean> failNever() {
104         return returnFirstPresentOrEmpty(MavenOptions::failNever);
105     }
106 
107     @Override
108     public Optional<Boolean> resume() {
109         return returnFirstPresentOrEmpty(MavenOptions::resume);
110     }
111 
112     @Override
113     public Optional<String> resumeFrom() {
114         return returnFirstPresentOrEmpty(MavenOptions::resumeFrom);
115     }
116 
117     @Override
118     public Optional<List<String>> projects() {
119         return collectListIfPresentOrEmpty(MavenOptions::projects);
120     }
121 
122     @Override
123     public Optional<Boolean> alsoMake() {
124         return returnFirstPresentOrEmpty(MavenOptions::alsoMake);
125     }
126 
127     @Override
128     public Optional<Boolean> alsoMakeDependents() {
129         return returnFirstPresentOrEmpty(MavenOptions::alsoMakeDependents);
130     }
131 
132     @Override
133     public Optional<String> threads() {
134         return returnFirstPresentOrEmpty(MavenOptions::threads);
135     }
136 
137     @Override
138     public Optional<String> builder() {
139         return returnFirstPresentOrEmpty(MavenOptions::builder);
140     }
141 
142     @Override
143     public Optional<Boolean> noTransferProgress() {
144         return returnFirstPresentOrEmpty(MavenOptions::noTransferProgress);
145     }
146 
147     @Override
148     public Optional<Boolean> cacheArtifactNotFound() {
149         return returnFirstPresentOrEmpty(MavenOptions::cacheArtifactNotFound);
150     }
151 
152     @Override
153     public Optional<Boolean> strictArtifactDescriptorPolicy() {
154         return returnFirstPresentOrEmpty(MavenOptions::strictArtifactDescriptorPolicy);
155     }
156 
157     @Override
158     public Optional<Boolean> ignoreTransitiveRepositories() {
159         return returnFirstPresentOrEmpty(MavenOptions::ignoreTransitiveRepositories);
160     }
161 
162     @Override
163     public Optional<List<String>> goals() {
164         return collectListIfPresentOrEmpty(MavenOptions::goals);
165     }
166 
167     @Override
168     public MavenOptions interpolate(Collection<Map<String, String>> properties) {
169         ArrayList<MavenOptions> interpolatedOptions = new ArrayList<>(options.size());
170         for (MavenOptions o : options) {
171             interpolatedOptions.add(o.interpolate(properties));
172         }
173         return layerMavenOptions(interpolatedOptions);
174     }
175 }