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.toolchain;
20  
21  import java.util.HashMap;
22  import java.util.List;
23  import java.util.Map;
24  import java.util.Optional;
25  
26  import org.apache.maven.api.Session;
27  import org.apache.maven.api.annotations.Nonnull;
28  import org.apache.maven.api.annotations.Nullable;
29  import org.apache.maven.api.di.Inject;
30  import org.apache.maven.api.di.Named;
31  import org.apache.maven.api.di.Priority;
32  import org.apache.maven.api.di.Provides;
33  import org.apache.maven.api.di.Singleton;
34  import org.apache.maven.api.di.Typed;
35  import org.apache.maven.api.services.Lookup;
36  import org.apache.maven.api.services.ToolchainFactoryException;
37  import org.apache.maven.api.services.ToolchainManagerException;
38  import org.apache.maven.execution.MavenSession;
39  import org.apache.maven.impl.MappedList;
40  import org.apache.maven.toolchain.model.ToolchainModel;
41  import org.slf4j.Logger;
42  
43  @Named
44  @Singleton
45  @Deprecated(since = "4.0.0")
46  public class ToolchainManagerFactory {
47  
48      private final Lookup lookup;
49      private final Logger logger;
50  
51      @Inject
52      ToolchainManagerFactory(Lookup lookup) {
53          this(lookup, null);
54      }
55  
56      protected ToolchainManagerFactory(Lookup lookup, Logger logger) {
57          this.lookup = lookup;
58          this.logger = logger;
59      }
60  
61      @Provides
62      @Typed({ToolchainManager.class, ToolchainManagerPrivate.class})
63      @Named // qualifier is required for SiduDIBridge to work
64      DefaultToolchainManagerV3 v3Manager() {
65          return new DefaultToolchainManagerV3();
66      }
67  
68      @Provides
69      @Priority(10)
70      @Typed(org.apache.maven.api.services.ToolchainManager.class)
71      DefaultToolchainManagerV4 v4Manager() {
72          return new DefaultToolchainManagerV4();
73      }
74  
75      private org.apache.maven.impl.DefaultToolchainManager getDelegate() {
76          return getToolchainManager(lookup, logger);
77      }
78  
79      private org.apache.maven.impl.DefaultToolchainManager getToolchainManager(Lookup lookup, Logger logger) {
80          return getToolchainManager(
81                  lookup.lookupMap(ToolchainFactory.class),
82                  lookup.lookupMap(org.apache.maven.api.services.ToolchainFactory.class),
83                  logger);
84      }
85  
86      private org.apache.maven.impl.DefaultToolchainManager getToolchainManager(
87              Map<String, ToolchainFactory> v3Factories,
88              Map<String, org.apache.maven.api.services.ToolchainFactory> v4Factories,
89              Logger logger) {
90          Map<String, org.apache.maven.api.services.ToolchainFactory> allFactories = new HashMap<>();
91          for (Map.Entry<String, ToolchainFactory> entry : v3Factories.entrySet()) {
92              ToolchainFactory v3Factory = entry.getValue();
93              allFactories.put(entry.getKey(), new org.apache.maven.api.services.ToolchainFactory() {
94                  @Nonnull
95                  @Override
96                  public org.apache.maven.api.Toolchain createToolchain(
97                          @Nonnull org.apache.maven.api.toolchain.ToolchainModel model) throws ToolchainFactoryException {
98                      try {
99                          return getToolchainV4(v3Factory.createToolchain(new ToolchainModel(model)));
100                     } catch (MisconfiguredToolchainException e) {
101                         throw new RuntimeException(e);
102                     }
103                 }
104 
105                 @Nonnull
106                 @Override
107                 public Optional<org.apache.maven.api.Toolchain> createDefaultToolchain()
108                         throws ToolchainFactoryException {
109                     return Optional.ofNullable(v3Factory.createDefaultToolchain())
110                             .map(ToolchainManagerFactory.this::getToolchainV4);
111                 }
112             });
113         }
114         allFactories.putAll(v4Factories);
115         return new org.apache.maven.impl.DefaultToolchainManager(allFactories, logger) {};
116     }
117 
118     public class DefaultToolchainManagerV4 implements org.apache.maven.api.services.ToolchainManager {
119         @Nonnull
120         @Override
121         public List<org.apache.maven.api.Toolchain> getToolchains(
122                 @Nonnull Session session, @Nonnull String type, @Nullable Map<String, String> requirements)
123                 throws ToolchainManagerException {
124             return getDelegate().getToolchains(session, type, requirements);
125         }
126 
127         @Nonnull
128         @Override
129         public Optional<org.apache.maven.api.Toolchain> getToolchainFromBuildContext(
130                 @Nonnull Session session, @Nonnull String type) throws ToolchainManagerException {
131             return getDelegate().getToolchainFromBuildContext(session, type);
132         }
133 
134         @Override
135         public void storeToolchainToBuildContext(
136                 @Nonnull Session session, @Nonnull org.apache.maven.api.Toolchain toolchain) {
137             getDelegate().storeToolchainToBuildContext(session, toolchain);
138         }
139 
140         @Nonnull
141         @Override
142         public List<org.apache.maven.api.Toolchain> getToolchains(@Nonnull Session session, @Nonnull String type)
143                 throws ToolchainManagerException {
144             return getDelegate().getToolchains(session, type);
145         }
146     }
147 
148     public class DefaultToolchainManagerV3 implements ToolchainManager, ToolchainManagerPrivate {
149 
150         @Override
151         public Toolchain getToolchainFromBuildContext(String type, MavenSession session) {
152             return getDelegate()
153                     .getToolchainFromBuildContext(session.getSession(), type)
154                     .map(ToolchainManagerFactory.this::getToolchainV3)
155                     .orElse(null);
156         }
157 
158         @Override
159         public List<Toolchain> getToolchains(MavenSession session, String type, Map<String, String> requirements) {
160             return new MappedList<>(
161                     getDelegate().getToolchains(session.getSession(), type, requirements),
162                     ToolchainManagerFactory.this::getToolchainV3);
163         }
164 
165         @Override
166         public ToolchainPrivate[] getToolchainsForType(String type, MavenSession session)
167                 throws MisconfiguredToolchainException {
168             try {
169                 List<org.apache.maven.api.Toolchain> toolchains =
170                         getDelegate().getToolchains(session.getSession(), type);
171                 return toolchains.stream()
172                         .map(ToolchainManagerFactory.this::getToolchainV3)
173                         .toArray(ToolchainPrivate[]::new);
174             } catch (org.apache.maven.api.services.ToolchainManagerException e) {
175                 throw new MisconfiguredToolchainException(e.getMessage(), e);
176             }
177         }
178 
179         @Override
180         public void storeToolchainToBuildContext(ToolchainPrivate toolchain, MavenSession session) {
181             org.apache.maven.api.Toolchain tc = getToolchainV4(toolchain);
182             getDelegate().storeToolchainToBuildContext(session.getSession(), tc);
183         }
184     }
185 
186     private org.apache.maven.api.Toolchain getToolchainV4(ToolchainPrivate toolchain) {
187         return toolchain instanceof ToolchainWrapperV3 v3tc ? v3tc.delegate : new ToolchainWrapperV4(toolchain);
188     }
189 
190     private ToolchainPrivate getToolchainV3(org.apache.maven.api.Toolchain toolchain) {
191         return toolchain instanceof ToolchainWrapperV4 v3tc ? v3tc.delegate : new ToolchainWrapperV3(toolchain);
192     }
193 
194     private record ToolchainWrapperV4(ToolchainPrivate delegate) implements org.apache.maven.api.Toolchain {
195 
196         @Override
197         public String getType() {
198             return delegate.getType();
199         }
200 
201         @Override
202         public String findTool(String toolName) {
203             return delegate.findTool(toolName);
204         }
205 
206         @Override
207         public org.apache.maven.api.toolchain.ToolchainModel getModel() {
208             return delegate.getModel().getDelegate();
209         }
210 
211         @Override
212         public boolean matchesRequirements(Map<String, String> requirements) {
213             return delegate.matchesRequirements(requirements);
214         }
215     }
216 
217     private record ToolchainWrapperV3(org.apache.maven.api.Toolchain delegate) implements Toolchain, ToolchainPrivate {
218 
219         @Override
220         public String getType() {
221             return delegate.getType();
222         }
223 
224         @Override
225         public String findTool(String toolName) {
226             return delegate.findTool(toolName);
227         }
228 
229         @Override
230         public boolean matchesRequirements(Map<String, String> requirements) {
231             return delegate.matchesRequirements(requirements);
232         }
233 
234         @Override
235         public ToolchainModel getModel() {
236             return new ToolchainModel(delegate.getModel());
237         }
238     }
239 }