This is an automated email from the ASF dual-hosted git repository.

gnodet pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven.git


The following commit(s) were added to refs/heads/master by this push:
     new cfb7ce8f75 [MNG-8558] Move JavaToolchain (#2107)
cfb7ce8f75 is described below

commit cfb7ce8f75a55ff0005654334db86d63b5e313a9
Author: Guillaume Nodet <gno...@gmail.com>
AuthorDate: Wed Feb 12 14:13:28 2025 +0100

    [MNG-8558] Move JavaToolchain (#2107)
    
    * move JavaToolchain support to maven-impl
    * deprecate Maven 3 toolchain support classes
    * add a factory to create toolchain managers wrapping both v3 and v4 
toolchains
---
 .../apache/maven/toolchain/DefaultToolchain.java   |   2 +
 .../toolchain/MisconfiguredToolchainException.java |   1 +
 .../apache/maven/toolchain/RequirementMatcher.java |   1 +
 .../maven/toolchain/RequirementMatcherFactory.java |   1 +
 .../java/org/apache/maven/toolchain/Toolchain.java |   2 +
 .../apache/maven/toolchain/ToolchainFactory.java   |   2 +
 .../apache/maven/toolchain/ToolchainManager.java   |   2 +
 ...inManager.java => ToolchainManagerFactory.java} | 114 ++++++++---
 .../maven/toolchain/ToolchainManagerPrivate.java   |   2 +
 .../apache/maven/toolchain/ToolchainPrivate.java   |   3 +
 .../apache/maven/toolchain/java/JavaToolchain.java |   2 +
 .../maven/toolchain/java/JavaToolchainFactory.java |   7 +-
 .../maven/toolchain/java/JavaToolchainImpl.java    |   2 +
 .../toolchain/DefaultToolchainManagerTest.java     |   4 +-
 .../maven/impl/DefaultJavaToolchainFactory.java    | 216 +++++++++++++++++++++
 15 files changed, 326 insertions(+), 35 deletions(-)

diff --git 
a/compat/maven-compat/src/main/java/org/apache/maven/toolchain/DefaultToolchain.java
 
b/compat/maven-compat/src/main/java/org/apache/maven/toolchain/DefaultToolchain.java
index 5bb7e5a48e..ef89cee08f 100644
--- 
a/compat/maven-compat/src/main/java/org/apache/maven/toolchain/DefaultToolchain.java
+++ 
b/compat/maven-compat/src/main/java/org/apache/maven/toolchain/DefaultToolchain.java
@@ -32,7 +32,9 @@
  * to avoid rewriting usual code.
  *
  * @since 2.0.9
+ * @deprecated Use {@link org.apache.maven.api.Toolchain} instead.
  */
+@Deprecated(since = "4.0.0")
 public abstract class DefaultToolchain // should have been AbstractToolchain...
 implements Toolchain, ToolchainPrivate {
     private final Logger logger;
diff --git 
a/compat/maven-compat/src/main/java/org/apache/maven/toolchain/MisconfiguredToolchainException.java
 
b/compat/maven-compat/src/main/java/org/apache/maven/toolchain/MisconfiguredToolchainException.java
index 1cffaf9020..f0cc46dfd7 100644
--- 
a/compat/maven-compat/src/main/java/org/apache/maven/toolchain/MisconfiguredToolchainException.java
+++ 
b/compat/maven-compat/src/main/java/org/apache/maven/toolchain/MisconfiguredToolchainException.java
@@ -21,6 +21,7 @@
 /**
  *
  */
+@Deprecated(since = "4.0.0")
 public class MisconfiguredToolchainException extends Exception {
 
     public MisconfiguredToolchainException(String message) {
diff --git 
a/compat/maven-compat/src/main/java/org/apache/maven/toolchain/RequirementMatcher.java
 
b/compat/maven-compat/src/main/java/org/apache/maven/toolchain/RequirementMatcher.java
index 131a91a7bc..b7008b00cd 100644
--- 
a/compat/maven-compat/src/main/java/org/apache/maven/toolchain/RequirementMatcher.java
+++ 
b/compat/maven-compat/src/main/java/org/apache/maven/toolchain/RequirementMatcher.java
@@ -21,6 +21,7 @@
 /**
  *
  */
+@Deprecated(since = "4.0.0")
 public interface RequirementMatcher {
 
     boolean matches(String requirement);
diff --git 
a/compat/maven-compat/src/main/java/org/apache/maven/toolchain/RequirementMatcherFactory.java
 
b/compat/maven-compat/src/main/java/org/apache/maven/toolchain/RequirementMatcherFactory.java
index 228aed21e3..96344952ef 100644
--- 
a/compat/maven-compat/src/main/java/org/apache/maven/toolchain/RequirementMatcherFactory.java
+++ 
b/compat/maven-compat/src/main/java/org/apache/maven/toolchain/RequirementMatcherFactory.java
@@ -25,6 +25,7 @@
 /**
  *
  */
+@Deprecated(since = "4.0.0")
 public final class RequirementMatcherFactory {
     private RequirementMatcherFactory() {}
 
diff --git 
a/compat/maven-compat/src/main/java/org/apache/maven/toolchain/Toolchain.java 
b/compat/maven-compat/src/main/java/org/apache/maven/toolchain/Toolchain.java
index 13a6135852..787df33db2 100644
--- 
a/compat/maven-compat/src/main/java/org/apache/maven/toolchain/Toolchain.java
+++ 
b/compat/maven-compat/src/main/java/org/apache/maven/toolchain/Toolchain.java
@@ -22,7 +22,9 @@
  * Toolchain interface.
  *
  * @since 2.0.9
+ * @deprecated Use {@link org.apache.maven.api.Toolchain} instead.
  */
+@Deprecated(since = "4.0.0")
 public interface Toolchain {
 
     /**
diff --git 
a/compat/maven-compat/src/main/java/org/apache/maven/toolchain/ToolchainFactory.java
 
b/compat/maven-compat/src/main/java/org/apache/maven/toolchain/ToolchainFactory.java
index ab5c73ad2c..8342cb96ae 100644
--- 
a/compat/maven-compat/src/main/java/org/apache/maven/toolchain/ToolchainFactory.java
+++ 
b/compat/maven-compat/src/main/java/org/apache/maven/toolchain/ToolchainFactory.java
@@ -24,7 +24,9 @@
  * Internal toolchain factory, to prepare toolchains instances.
  *
  * @since 2.0.9
+ * @deprecated Use {@link org.apache.maven.api.services.ToolchainFactory} 
instead.
  */
+@Deprecated(since = "4.0.0")
 public interface ToolchainFactory {
     /**
      * Create instance of toolchain.
diff --git 
a/compat/maven-compat/src/main/java/org/apache/maven/toolchain/ToolchainManager.java
 
b/compat/maven-compat/src/main/java/org/apache/maven/toolchain/ToolchainManager.java
index 61a81f6620..310ebabb55 100644
--- 
a/compat/maven-compat/src/main/java/org/apache/maven/toolchain/ToolchainManager.java
+++ 
b/compat/maven-compat/src/main/java/org/apache/maven/toolchain/ToolchainManager.java
@@ -27,7 +27,9 @@
  * Public API for a toolchain-aware plugin to get expected toolchain instance.
  *
  * @since 2.0.9
+ * @deprecated Use {@link org.apache.maven.api.services.ToolchainManager} 
instead.
  */
+@Deprecated(since = "4.0.0")
 public interface ToolchainManager {
 
     // NOTE: Some plugins like Surefire access this field directly!
diff --git 
a/compat/maven-compat/src/main/java/org/apache/maven/toolchain/DefaultToolchainManager.java
 
b/compat/maven-compat/src/main/java/org/apache/maven/toolchain/ToolchainManagerFactory.java
similarity index 57%
rename from 
compat/maven-compat/src/main/java/org/apache/maven/toolchain/DefaultToolchainManager.java
rename to 
compat/maven-compat/src/main/java/org/apache/maven/toolchain/ToolchainManagerFactory.java
index 7f8ae326c0..4f9c0b8c0d 100644
--- 
a/compat/maven-compat/src/main/java/org/apache/maven/toolchain/DefaultToolchainManager.java
+++ 
b/compat/maven-compat/src/main/java/org/apache/maven/toolchain/ToolchainManagerFactory.java
@@ -23,12 +23,18 @@
 import java.util.Map;
 import java.util.Optional;
 
+import org.apache.maven.api.Session;
 import org.apache.maven.api.annotations.Nonnull;
+import org.apache.maven.api.annotations.Nullable;
 import org.apache.maven.api.di.Inject;
 import org.apache.maven.api.di.Named;
+import org.apache.maven.api.di.Priority;
+import org.apache.maven.api.di.Provides;
 import org.apache.maven.api.di.Singleton;
+import org.apache.maven.api.di.Typed;
 import org.apache.maven.api.services.Lookup;
 import org.apache.maven.api.services.ToolchainFactoryException;
+import org.apache.maven.api.services.ToolchainManagerException;
 import org.apache.maven.execution.MavenSession;
 import org.apache.maven.impl.MappedList;
 import org.apache.maven.toolchain.model.ToolchainModel;
@@ -36,21 +42,36 @@
 
 @Named
 @Singleton
-public class DefaultToolchainManager implements ToolchainManager, 
ToolchainManagerPrivate {
+@Deprecated(since = "4.0.0")
+public class ToolchainManagerFactory {
 
     private final Lookup lookup;
     private final Logger logger;
 
     @Inject
-    public DefaultToolchainManager(Lookup lookup) {
+    ToolchainManagerFactory(Lookup lookup) {
         this(lookup, null);
     }
 
-    protected DefaultToolchainManager(Lookup lookup, Logger logger) {
+    protected ToolchainManagerFactory(Lookup lookup, Logger logger) {
         this.lookup = lookup;
         this.logger = logger;
     }
 
+    @Provides
+    @Typed({ToolchainManager.class, ToolchainManagerPrivate.class})
+    @Named // qualifier is required for SiduDIBridge to work
+    DefaultToolchainManagerV3 v3Manager() {
+        return new DefaultToolchainManagerV3();
+    }
+
+    @Provides
+    @Priority(10)
+    @Typed(org.apache.maven.api.services.ToolchainManager.class)
+    DefaultToolchainManagerV4 v4Manager() {
+        return new DefaultToolchainManagerV4();
+    }
+
     private org.apache.maven.impl.DefaultToolchainManager getDelegate() {
         return getToolchainManager(lookup, logger);
     }
@@ -86,7 +107,7 @@ public org.apache.maven.api.Toolchain createToolchain(
                 public Optional<org.apache.maven.api.Toolchain> 
createDefaultToolchain()
                         throws ToolchainFactoryException {
                     return 
Optional.ofNullable(v3Factory.createDefaultToolchain())
-                            .map(DefaultToolchainManager.this::getToolchainV4);
+                            .map(ToolchainManagerFactory.this::getToolchainV4);
                 }
             });
         }
@@ -94,35 +115,72 @@ public Optional<org.apache.maven.api.Toolchain> 
createDefaultToolchain()
         return new org.apache.maven.impl.DefaultToolchainManager(allFactories, 
logger) {};
     }
 
-    @Override
-    public Toolchain getToolchainFromBuildContext(String type, MavenSession 
session) {
-        return getDelegate()
-                .getToolchainFromBuildContext(session.getSession(), type)
-                .map(this::getToolchainV3)
-                .orElse(null);
-    }
+    public class DefaultToolchainManagerV4 implements 
org.apache.maven.api.services.ToolchainManager {
+        @Nonnull
+        @Override
+        public List<org.apache.maven.api.Toolchain> getToolchains(
+                @Nonnull Session session, @Nonnull String type, @Nullable 
Map<String, String> requirements)
+                throws ToolchainManagerException {
+            return getDelegate().getToolchains(session, type, requirements);
+        }
 
-    @Override
-    public List<Toolchain> getToolchains(MavenSession session, String type, 
Map<String, String> requirements) {
-        return new MappedList<>(
-                getDelegate().getToolchains(session.getSession(), type, 
requirements), this::getToolchainV3);
-    }
+        @Nonnull
+        @Override
+        public Optional<org.apache.maven.api.Toolchain> 
getToolchainFromBuildContext(
+                @Nonnull Session session, @Nonnull String type) throws 
ToolchainManagerException {
+            return getDelegate().getToolchainFromBuildContext(session, type);
+        }
+
+        @Override
+        public void storeToolchainToBuildContext(
+                @Nonnull Session session, @Nonnull 
org.apache.maven.api.Toolchain toolchain) {
+            getDelegate().storeToolchainToBuildContext(session, toolchain);
+        }
 
-    @Override
-    public ToolchainPrivate[] getToolchainsForType(String type, MavenSession 
session)
-            throws MisconfiguredToolchainException {
-        try {
-            List<org.apache.maven.api.Toolchain> toolchains = 
getDelegate().getToolchains(session.getSession(), type);
-            return 
toolchains.stream().map(this::getToolchainV3).toArray(ToolchainPrivate[]::new);
-        } catch (org.apache.maven.api.services.ToolchainManagerException e) {
-            throw new MisconfiguredToolchainException(e.getMessage(), e);
+        @Nonnull
+        @Override
+        public List<org.apache.maven.api.Toolchain> getToolchains(@Nonnull 
Session session, @Nonnull String type)
+                throws ToolchainManagerException {
+            return getDelegate().getToolchains(session, type);
         }
     }
 
-    @Override
-    public void storeToolchainToBuildContext(ToolchainPrivate toolchain, 
MavenSession session) {
-        org.apache.maven.api.Toolchain tc = getToolchainV4(toolchain);
-        getDelegate().storeToolchainToBuildContext(session.getSession(), tc);
+    public class DefaultToolchainManagerV3 implements ToolchainManager, 
ToolchainManagerPrivate {
+
+        @Override
+        public Toolchain getToolchainFromBuildContext(String type, 
MavenSession session) {
+            return getDelegate()
+                    .getToolchainFromBuildContext(session.getSession(), type)
+                    .map(ToolchainManagerFactory.this::getToolchainV3)
+                    .orElse(null);
+        }
+
+        @Override
+        public List<Toolchain> getToolchains(MavenSession session, String 
type, Map<String, String> requirements) {
+            return new MappedList<>(
+                    getDelegate().getToolchains(session.getSession(), type, 
requirements),
+                    ToolchainManagerFactory.this::getToolchainV3);
+        }
+
+        @Override
+        public ToolchainPrivate[] getToolchainsForType(String type, 
MavenSession session)
+                throws MisconfiguredToolchainException {
+            try {
+                List<org.apache.maven.api.Toolchain> toolchains =
+                        getDelegate().getToolchains(session.getSession(), 
type);
+                return toolchains.stream()
+                        .map(ToolchainManagerFactory.this::getToolchainV3)
+                        .toArray(ToolchainPrivate[]::new);
+            } catch (org.apache.maven.api.services.ToolchainManagerException 
e) {
+                throw new MisconfiguredToolchainException(e.getMessage(), e);
+            }
+        }
+
+        @Override
+        public void storeToolchainToBuildContext(ToolchainPrivate toolchain, 
MavenSession session) {
+            org.apache.maven.api.Toolchain tc = getToolchainV4(toolchain);
+            getDelegate().storeToolchainToBuildContext(session.getSession(), 
tc);
+        }
     }
 
     private org.apache.maven.api.Toolchain getToolchainV4(ToolchainPrivate 
toolchain) {
diff --git 
a/compat/maven-compat/src/main/java/org/apache/maven/toolchain/ToolchainManagerPrivate.java
 
b/compat/maven-compat/src/main/java/org/apache/maven/toolchain/ToolchainManagerPrivate.java
index 989f5a4b52..f0c93a6906 100644
--- 
a/compat/maven-compat/src/main/java/org/apache/maven/toolchain/ToolchainManagerPrivate.java
+++ 
b/compat/maven-compat/src/main/java/org/apache/maven/toolchain/ToolchainManagerPrivate.java
@@ -29,7 +29,9 @@
  *
  * @since 2.0.9
  * @see ToolchainManager#getToolchainFromBuildContext(String, MavenSession)
+ * @deprecated Use {@link org.apache.maven.api.services.ToolchainManager} 
instead.
  */
+@Deprecated(since = "4.0.0")
 public interface ToolchainManagerPrivate {
 
     /**
diff --git 
a/compat/maven-compat/src/main/java/org/apache/maven/toolchain/ToolchainPrivate.java
 
b/compat/maven-compat/src/main/java/org/apache/maven/toolchain/ToolchainPrivate.java
index b52a571536..66a6657d30 100644
--- 
a/compat/maven-compat/src/main/java/org/apache/maven/toolchain/ToolchainPrivate.java
+++ 
b/compat/maven-compat/src/main/java/org/apache/maven/toolchain/ToolchainPrivate.java
@@ -24,7 +24,10 @@
 
 /**
  * a private contract between the toolchains plugin and the components.
+ *
+ * @deprecated Use {@link org.apache.maven.api.Toolchain} instead.
  */
+@Deprecated(since = "4.0.0")
 public interface ToolchainPrivate extends Toolchain {
 
     /**
diff --git 
a/compat/maven-compat/src/main/java/org/apache/maven/toolchain/java/JavaToolchain.java
 
b/compat/maven-compat/src/main/java/org/apache/maven/toolchain/java/JavaToolchain.java
index 0979221562..41f1da2413 100644
--- 
a/compat/maven-compat/src/main/java/org/apache/maven/toolchain/java/JavaToolchain.java
+++ 
b/compat/maven-compat/src/main/java/org/apache/maven/toolchain/java/JavaToolchain.java
@@ -24,7 +24,9 @@
  * JDK toolchain interface.
  *
  * @since 2.0.9, renamed from JavaToolChain in 3.2.4
+ * @deprecated Use {@link org.apache.maven.api.JavaToolchain} instead.
  */
+@Deprecated(since = "4.0.0")
 public interface JavaToolchain extends Toolchain {
     //    /**
     //     * Returns a list of {@link java.io.File}s which represents the 
bootstrap libraries for the
diff --git 
a/compat/maven-compat/src/main/java/org/apache/maven/toolchain/java/JavaToolchainFactory.java
 
b/compat/maven-compat/src/main/java/org/apache/maven/toolchain/java/JavaToolchainFactory.java
index e9ddf15b5b..de8414935c 100644
--- 
a/compat/maven-compat/src/main/java/org/apache/maven/toolchain/java/JavaToolchainFactory.java
+++ 
b/compat/maven-compat/src/main/java/org/apache/maven/toolchain/java/JavaToolchainFactory.java
@@ -18,9 +18,6 @@
  */
 package org.apache.maven.toolchain.java;
 
-import javax.inject.Named;
-import javax.inject.Singleton;
-
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -43,9 +40,9 @@
  * <code>jdk</code> hint.
  *
  * @since 2.0.9, renamed from <code>DefaultJavaToolchainFactory</code> in 3.2.4
+ * @deprecated Use {@link org.apache.maven.api.services.ToolchainFactory} 
instead.
  */
-@Named("jdk")
-@Singleton
+@Deprecated(since = "4.0.0")
 public class JavaToolchainFactory implements ToolchainFactory {
     private final Logger logger = LoggerFactory.getLogger(getClass());
 
diff --git 
a/compat/maven-compat/src/main/java/org/apache/maven/toolchain/java/JavaToolchainImpl.java
 
b/compat/maven-compat/src/main/java/org/apache/maven/toolchain/java/JavaToolchainImpl.java
index 5a7b331757..0f6fc5c25d 100644
--- 
a/compat/maven-compat/src/main/java/org/apache/maven/toolchain/java/JavaToolchainImpl.java
+++ 
b/compat/maven-compat/src/main/java/org/apache/maven/toolchain/java/JavaToolchainImpl.java
@@ -31,7 +31,9 @@
  * JDK toolchain implementation.
  *
  * @since 2.0.9, renamed from DefaultJavaToolChain in 3.2.4
+ * @deprecated Use {@link org.apache.maven.api.services.ToolchainFactory} 
instead.
  */
+@Deprecated(since = "4.0.0")
 public class JavaToolchainImpl extends DefaultToolchain implements 
JavaToolchain {
     private String javaHome;
 
diff --git 
a/compat/maven-compat/src/test/java/org/apache/maven/toolchain/DefaultToolchainManagerTest.java
 
b/compat/maven-compat/src/test/java/org/apache/maven/toolchain/DefaultToolchainManagerTest.java
index cc5b514a33..82148b964e 100644
--- 
a/compat/maven-compat/src/test/java/org/apache/maven/toolchain/DefaultToolchainManagerTest.java
+++ 
b/compat/maven-compat/src/test/java/org/apache/maven/toolchain/DefaultToolchainManagerTest.java
@@ -54,7 +54,7 @@ class DefaultToolchainManagerTest {
     @Mock
     private Logger logger;
 
-    private DefaultToolchainManager toolchainManager;
+    private ToolchainManagerFactory.DefaultToolchainManagerV3 toolchainManager;
 
     @Mock
     private ToolchainFactory toolchainFactory_basicType;
@@ -77,7 +77,7 @@ void onSetup() throws Exception {
         
when(lookup.lookupMap(org.apache.maven.toolchain.ToolchainFactory.class))
                 .thenReturn(Map.of());
 
-        toolchainManager = new DefaultToolchainManager(lookup, logger);
+        toolchainManager = new ToolchainManagerFactory(lookup, 
logger).v3Manager();
     }
 
     @Test
diff --git 
a/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultJavaToolchainFactory.java
 
b/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultJavaToolchainFactory.java
new file mode 100644
index 0000000000..e5ef0db561
--- /dev/null
+++ 
b/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultJavaToolchainFactory.java
@@ -0,0 +1,216 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.maven.impl;
+
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Map;
+import java.util.Optional;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+
+import org.apache.maven.api.JavaToolchain;
+import org.apache.maven.api.Toolchain;
+import org.apache.maven.api.Version;
+import org.apache.maven.api.VersionConstraint;
+import org.apache.maven.api.annotations.Nonnull;
+import org.apache.maven.api.di.Inject;
+import org.apache.maven.api.di.Named;
+import org.apache.maven.api.di.Singleton;
+import org.apache.maven.api.services.ToolchainFactory;
+import org.apache.maven.api.services.ToolchainFactoryException;
+import org.apache.maven.api.services.VersionParser;
+import org.apache.maven.api.services.VersionParserException;
+import org.apache.maven.api.toolchain.ToolchainModel;
+import org.apache.maven.api.xml.XmlNode;
+import org.apache.maven.impl.util.Os;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Named("jdk")
+@Singleton
+public class DefaultJavaToolchainFactory implements ToolchainFactory {
+
+    public static final String KEY_JAVAHOME = "jdkHome"; // NOI18N
+
+    private static final Logger LOGGER = 
LoggerFactory.getLogger(DefaultJavaToolchainFactory.class);
+
+    final VersionParser versionParser;
+
+    @Inject
+    public DefaultJavaToolchainFactory(VersionParser versionParser) {
+        this.versionParser = versionParser;
+    }
+
+    @Nonnull
+    @Override
+    public JavaToolchain createToolchain(@Nonnull ToolchainModel model) {
+        // populate the provides section
+        Map<String, Predicate<String>> matchers = 
model.getProvides().entrySet().stream()
+                .collect(Collectors.toUnmodifiableMap(Map.Entry::getKey, entry 
-> {
+                    String key = entry.getKey();
+                    String value = entry.getValue();
+                    if (value == null) {
+                        throw new ToolchainFactoryException(
+                                "Provides token '" + key + "' doesn't have any 
value configured.");
+                    }
+                    return "version".equals(key) ? new 
VersionMatcher(versionParser, value) : new ExactMatcher(value);
+                }));
+
+        // compute and normalize the java home
+        XmlNode dom = model.getConfiguration();
+        XmlNode javahome = dom != null ? dom.getChild(KEY_JAVAHOME) : null;
+        if (javahome == null || javahome.getValue() == null) {
+            throw new ToolchainFactoryException(
+                    "Java toolchain without the " + KEY_JAVAHOME + " 
configuration element.");
+        }
+        Path normal = Paths.get(javahome.getValue()).normalize();
+        if (!Files.exists(normal)) {
+            throw new ToolchainFactoryException("Non-existing JDK home 
configuration at " + normal.toAbsolutePath());
+        }
+        String javaHome = normal.toString();
+
+        return new DefaultJavaToolchain(model, javaHome, matchers);
+    }
+
+    @Nonnull
+    @Override
+    public Optional<Toolchain> createDefaultToolchain() {
+        return Optional.empty();
+    }
+
+    static class DefaultJavaToolchain implements JavaToolchain {
+
+        final ToolchainModel model;
+        final String javaHome;
+        final Map<String, Predicate<String>> matchers;
+
+        DefaultJavaToolchain(ToolchainModel model, String javaHome, 
Map<String, Predicate<String>> matchers) {
+            this.model = model;
+            this.javaHome = javaHome;
+            this.matchers = matchers;
+        }
+
+        @Override
+        public String getJavaHome() {
+            return javaHome;
+        }
+
+        @Override
+        public String getType() {
+            return "jdk";
+        }
+
+        @Override
+        public ToolchainModel getModel() {
+            return model;
+        }
+
+        @Override
+        public String findTool(String toolName) {
+            Path toRet = findTool(toolName, 
Paths.get(getJavaHome()).normalize());
+            if (toRet != null) {
+                return toRet.toAbsolutePath().toString();
+            }
+            return null;
+        }
+
+        private static Path findTool(String toolName, Path installDir) {
+            Path bin = installDir.resolve("bin"); // NOI18N
+            if (Files.isDirectory(bin)) {
+                if (Os.IS_WINDOWS) {
+                    Path tool = bin.resolve(toolName + ".exe");
+                    if (Files.exists(tool)) {
+                        return tool;
+                    }
+                }
+                Path tool = bin.resolve(toolName);
+                if (Files.exists(tool)) {
+                    return tool;
+                }
+            }
+            return null;
+        }
+
+        @Override
+        public boolean matchesRequirements(Map<String, String> requirements) {
+            for (Map.Entry<String, String> requirement : 
requirements.entrySet()) {
+                String key = requirement.getKey();
+
+                Predicate<String> matcher = matchers.get(key);
+
+                if (matcher == null) {
+                    LOGGER.debug("Toolchain {} is missing required property: 
{}", this, key);
+                    return false;
+                }
+                if (!matcher.test(requirement.getValue())) {
+                    LOGGER.debug("Toolchain {} doesn't match required 
property: {}", this, key);
+                    return false;
+                }
+            }
+            return true;
+        }
+    }
+
+    static final class ExactMatcher implements Predicate<String> {
+
+        final String provides;
+
+        ExactMatcher(String provides) {
+            this.provides = provides;
+        }
+
+        @Override
+        public boolean test(String requirement) {
+            return provides.equalsIgnoreCase(requirement);
+        }
+
+        @Override
+        public String toString() {
+            return provides;
+        }
+    }
+
+    static final class VersionMatcher implements Predicate<String> {
+
+        final VersionParser versionParser;
+        final Version version;
+
+        VersionMatcher(VersionParser versionParser, String version) {
+            this.versionParser = versionParser;
+            this.version = versionParser.parseVersion(version);
+        }
+
+        @Override
+        public boolean test(String requirement) {
+            try {
+                VersionConstraint constraint = 
versionParser.parseVersionConstraint(requirement);
+                return constraint.contains(version);
+            } catch (VersionParserException ex) {
+                return false;
+            }
+        }
+
+        @Override
+        public String toString() {
+            return version.toString();
+        }
+    }
+}

Reply via email to