1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
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 }