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

lkishalmi pushed a commit to branch release160
in repository https://gitbox.apache.org/repos/asf/netbeans.git

commit c7b7d4a09f9e62c30fb8f84b17d4b59462319b44
Author: Laszlo Kishalmi <laszlo.kisha...@gmail.com>
AuthorDate: Mon Dec 5 20:11:25 2022 -0800

    Use Project Dictated JVM for Gradle Discovery (#4985)
---
 .../gradle/GradleJavaCompatProblemsProvider.java   | 90 ++++++++++++++++++----
 .../modules/gradle/GradleProjectConnection.java    | 61 +++++++++------
 .../api/execute/GradleDistributionManager.java     | 29 ++-----
 .../gradle/execute/GradleDaemonExecutor.java       |  1 -
 .../modules/gradle/spi/execute/package-info.java   | 35 +++++++++
 5 files changed, 154 insertions(+), 62 deletions(-)

diff --git 
a/extide/gradle/src/org/netbeans/modules/gradle/GradleJavaCompatProblemsProvider.java
 
b/extide/gradle/src/org/netbeans/modules/gradle/GradleJavaCompatProblemsProvider.java
index 52c7d2e382..66711bb0bd 100644
--- 
a/extide/gradle/src/org/netbeans/modules/gradle/GradleJavaCompatProblemsProvider.java
+++ 
b/extide/gradle/src/org/netbeans/modules/gradle/GradleJavaCompatProblemsProvider.java
@@ -21,17 +21,23 @@ package org.netbeans.modules.gradle;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 import java.beans.PropertyChangeSupport;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Properties;
 import org.netbeans.api.project.Project;
 import org.netbeans.modules.gradle.api.NbGradleProject;
 import org.netbeans.modules.gradle.api.execute.GradleDistributionManager;
 import 
org.netbeans.modules.gradle.api.execute.GradleDistributionManager.GradleDistribution;
 import org.netbeans.modules.gradle.spi.execute.GradleDistributionProvider;
+import org.netbeans.modules.gradle.spi.execute.GradleJavaPlatformProvider;
 import org.netbeans.spi.project.ProjectServiceProvider;
 import org.netbeans.spi.project.ui.ProjectProblemsProvider;
 import static 
org.netbeans.spi.project.ui.ProjectProblemsProvider.PROP_PROBLEMS;
-import org.openide.util.NbBundle;
 import org.openide.util.NbBundle.Messages;
 
 /**
@@ -71,26 +77,82 @@ public final class GradleJavaCompatProblemsProvider 
implements ProjectProblemsPr
         "# {1} - Supported Java Version",
         "# {2} - Required Gradle Version",
         "# {3} - Forced Gradle Version",
-        "TXT_JavaVersionMismatch=The IDE is running on Java {0} that is not 
supported by Gradle {2}.\n"
-                + "The IDE will attempt to use Gradle {3} to gather the 
project information.\n\n"
-                + "Either upgrade your Gradle version on your project or run 
the IDE on "
-                + "Java {1} to avoid this problem!"
+        "TXT_JavaVersionMismatch=<html>The Java version: {0}, that is seletced 
for the project "
+                + "is not supported by Gradle {2}."
+                + "The IDE will attempt to use Gradle {3} to gather the 
project information.<p>"
+                + "Possible solutions:"
+                + "<ul><li>Upgrade your Gradle version on your project"
+                + "<li>Select Java Platform {1} (or below), on 
Build&nbsp;>&nbsp;Compile settings, to avoid this problem!"
+                + "</ul>"
     })
     @Override
     public Collection<? extends ProjectProblem> getProblems() {
+        GradleDistribution dist = getGradleDistribution();
+        int javaVersion = getJavaVersion();
+        if (!dist.isCompatibleWithJava(javaVersion)) {
+            GradleDistribution compatDist = 
GradleDistributionManager.get(dist.getGradleUserHome()).defaultDistribution();
+            ProjectProblem problem = ProjectProblem.createWarning(
+                    Bundle.LBL_JavaVersionMismatch(), 
+                    Bundle.TXT_JavaVersionMismatch(javaVersion, 
dist.lastSupportedJava(),dist.getVersion(), compatDist.getVersion()));
+            return Collections.singleton(problem);
+        }
+        return Collections.emptySet();
+    }
+
+    private GradleDistribution getGradleDistribution() {
+        GradleDistribution dist = null;
         GradleDistributionProvider pvd = 
project.getLookup().lookup(GradleDistributionProvider.class);
         if (pvd != null) {
-            GradleDistribution dist = pvd.getGradleDistribution();
-            if ((dist != null) && !dist.isCompatibleWithSystemJava()) {
-                String javaVersion = 
System.getProperty("java.specification.version", 
System.getProperty("java.version")); //NOI18N
-                GradleDistribution compatDist = 
GradleDistributionManager.get(dist.getGradleUserHome()).defaultDistribution();
-                ProjectProblem problem = ProjectProblem.createWarning(
-                        Bundle.LBL_JavaVersionMismatch(), 
-                        Bundle.TXT_JavaVersionMismatch(javaVersion, 
dist.lastSupportedJava(),dist.getVersion(), compatDist.getVersion()));
-                return Collections.singleton(problem);
+            dist = pvd.getGradleDistribution();
+        }
+        return dist != null ? dist : 
GradleDistributionManager.get().defaultDistribution();
+    }
+
+    private int getJavaVersion() {
+        File javaHome = null;
+        GradleJavaPlatformProvider pvd = 
project.getLookup().lookup(GradleJavaPlatformProvider.class);
+        try {
+            javaHome = pvd != null ? pvd.getJavaHome() : null;
+        } catch (FileNotFoundException ex) {
+            // That's a broken Java Home, other Problem Provider should pick 
that up
+        }
+
+        if (javaHome == null) {
+            String javaVersion = 
System.getProperty("java.specification.version");
+            int dot = javaVersion.indexOf('.');
+            if (dot > 0) {
+                javaVersion = javaVersion.substring(0, dot);
             }
+            return Integer.parseInt(javaVersion);
+        } else {
+            return getJavaMajorVersion(javaHome);
         }
-        return Collections.emptySet();
+    }
+
+    private static int getJavaMajorVersion(File javaHome) {
+        // If anything goes wrong just assume Java 8
+        int ret = 8;
+
+        // The release file was introduced in JDK 9 and provided ever since
+        File release = new File(javaHome, "release"); //NOI18N
+        if (release.isFile()) {
+            Properties releasePros = new Properties();
+            try (InputStream is = new FileInputStream(release)) {
+                releasePros.load(is);
+            } catch (IOException ex) {
+
+            }
+            String javaVersion = releasePros.getProperty("JAVA_VERSION"); 
//NOI18N
+            if ((javaVersion != null) && javaVersion.startsWith("\"") && 
javaVersion.endsWith("\"")) {
+                javaVersion = javaVersion.substring(1, 
javaVersion.indexOf('.'));
+                try {
+                    ret = Integer.parseInt(javaVersion);
+                } catch (NumberFormatException ex) {
+                    // Do nothing return empty
+                }
+            }
+        }
+        return ret;
     }
 
 }
diff --git 
a/extide/gradle/src/org/netbeans/modules/gradle/GradleProjectConnection.java 
b/extide/gradle/src/org/netbeans/modules/gradle/GradleProjectConnection.java
index b0a40c65fa..d74535dcd9 100644
--- a/extide/gradle/src/org/netbeans/modules/gradle/GradleProjectConnection.java
+++ b/extide/gradle/src/org/netbeans/modules/gradle/GradleProjectConnection.java
@@ -19,13 +19,17 @@
 package org.netbeans.modules.gradle;
 
 import java.io.File;
+import java.io.FileNotFoundException;
 import java.nio.file.Path;
 import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
 import org.gradle.tooling.BuildAction;
 import org.gradle.tooling.BuildActionExecuter;
 import org.gradle.tooling.BuildLauncher;
+import org.gradle.tooling.ConfigurableLauncher;
 import org.gradle.tooling.GradleConnectionException;
 import org.gradle.tooling.GradleConnector;
 import org.gradle.tooling.ModelBuilder;
@@ -37,6 +41,7 @@ import org.netbeans.modules.gradle.api.NbGradleProject;
 import org.netbeans.modules.gradle.api.execute.GradleDistributionManager;
 import 
org.netbeans.modules.gradle.api.execute.GradleDistributionManager.GradleDistribution;
 import org.netbeans.modules.gradle.spi.execute.GradleDistributionProvider;
+import org.netbeans.modules.gradle.spi.execute.GradleJavaPlatformProvider;
 import org.netbeans.spi.project.ProjectServiceProvider;
 import org.openide.filesystems.FileUtil;
 import org.openide.util.WeakListeners;
@@ -48,9 +53,11 @@ import org.openide.util.WeakListeners;
 @ProjectServiceProvider(service = ProjectConnection.class, projectType = 
NbGradleProject.GRADLE_PROJECT_TYPE)
 public final class GradleProjectConnection implements ProjectConnection {
 
+    private static final Logger LOG = 
Logger.getLogger(GradleProjectConnection.class.getName());
+
     final Project project;
     ProjectConnection conn;
-    ProjectConnection compatConn;
+
     final ChangeListener listener = (ChangeEvent e) -> {
         close();
     };
@@ -61,42 +68,42 @@ public final class GradleProjectConnection implements 
ProjectConnection {
     
     @Override
     public <T> T getModel(Class<T> type) throws GradleConnectionException, 
IllegalStateException {
-        return getConnection(true).getModel(type);
+        return getConnection().getModel(type);
     }
 
     @Override
     public <T> void getModel(Class<T> type, ResultHandler<? super T> rh) 
throws IllegalStateException {
-        getConnection(true).getModel(type, rh);
+        getConnection().getModel(type, rh);
     }
 
     @Override
     public BuildLauncher newBuild() {
-        return getConnection(false).newBuild();
+        return setJavaHome(getConnection().newBuild());
     }
 
     @Override
     public TestLauncher newTestLauncher() {
-        return getConnection(false).newTestLauncher();
+        return setJavaHome(getConnection().newTestLauncher());
     }
 
     @Override
     public <T> ModelBuilder<T> model(Class<T> type) {
-        return getConnection(true).model(type);
+        return setJavaHome(getConnection().model(type));
     }
 
     @Override
     public <T> BuildActionExecuter<T> action(BuildAction<T> action) {
-        return getConnection(true).action(action);
+        return setJavaHome(getConnection().action(action));
     }
 
     @Override
     public BuildActionExecuter.Builder action() {
-        return getConnection(true).action();
+        return getConnection().action();
     }
 
     @Override
     public void notifyDaemonsAboutChangedPaths(List<Path> list) {
-        getConnection(false).notifyDaemonsAboutChangedPaths(list);
+        getConnection().notifyDaemonsAboutChangedPaths(list);
     }
 
     @Override
@@ -104,41 +111,44 @@ public final class GradleProjectConnection implements 
ProjectConnection {
         if (conn != null) {
             conn.close();
         }
-        if (conn != compatConn) {
-            compatConn.close();
-        }
         conn = null;
-        compatConn = null;
     }
 
     synchronized boolean hasConnection() {
-        return conn != null || compatConn != null;
+        return conn != null;
     }
     
-    private synchronized ProjectConnection getConnection(boolean compatible) {
+    private synchronized ProjectConnection getConnection() {
         if (conn == null) {
             File projectDir = FileUtil.toFile(project.getProjectDirectory());
-            GradleConnector gconn = GradleConnector.newConnector();
             GradleDistributionProvider pvd = 
project.getLookup().lookup(GradleDistributionProvider.class);
+
             if (pvd != null) {
                 pvd.addChangeListener(WeakListeners.change(listener, pvd));
                 GradleDistribution dist = pvd.getGradleDistribution();
                 if (dist != null) {
                     conn = createConnection(dist, projectDir);
-                    if (dist.isCompatibleWithSystemJava()) {
-                        compatConn = conn;
-                    } else {
-                        GradleDistribution compatDist = 
GradleDistributionManager.get(dist.getGradleUserHome()).defaultDistribution();
-                        compatConn = createConnection(compatDist, projectDir);
-                    }
                 }
             }
             if (conn == null) {
-                conn = gconn.forProjectDirectory(projectDir).connect();
-                compatConn = conn;
+                conn = 
createConnection(GradleDistributionManager.get().defaultDistribution(), 
projectDir);
             }
         }
-        return compatible ? compatConn : conn;
+        return conn;
+    }
+
+    private <T extends ConfigurableLauncher<?>> T setJavaHome(T launcher) {
+        GradleJavaPlatformProvider pvd = 
project.getLookup().lookup(GradleJavaPlatformProvider.class);
+        if (pvd != null) {
+            try {
+                File javaHome = pvd.getJavaHome();
+                launcher.setJavaHome(javaHome);
+                LOG.log(Level.FINE, "Using JAVA_HOME=''{0}'' for project info 
load for: {1}", new Object[]{javaHome, project});
+            } catch (FileNotFoundException ex) {
+                LOG.log(Level.WARNING, "JAVA_HOME for project " + project + " 
not found.", ex);
+            }
+        }
+        return launcher;
     }
 
     private static ProjectConnection createConnection(GradleDistribution dist, 
File projectDir) {
@@ -151,4 +161,5 @@ public final class GradleProjectConnection implements 
ProjectConnection {
         }
         return gconn.forProjectDirectory(projectDir).connect();
     }
+
 }
diff --git 
a/extide/gradle/src/org/netbeans/modules/gradle/api/execute/GradleDistributionManager.java
 
b/extide/gradle/src/org/netbeans/modules/gradle/api/execute/GradleDistributionManager.java
index 6228015b2f..28ec81b85a 100644
--- 
a/extide/gradle/src/org/netbeans/modules/gradle/api/execute/GradleDistributionManager.java
+++ 
b/extide/gradle/src/org/netbeans/modules/gradle/api/execute/GradleDistributionManager.java
@@ -69,7 +69,6 @@ import org.netbeans.modules.gradle.spi.GradleFiles;
 import org.netbeans.modules.gradle.spi.GradleSettings;
 import org.openide.awt.Notification;
 import org.openide.awt.NotificationDisplayer;
-import org.openide.util.Exceptions;
 import org.openide.util.NbBundle;
 import org.openide.util.RequestProcessor;
 
@@ -99,25 +98,8 @@ public final class GradleDistributionManager {
         GradleVersion.version("7.0"), // JDK-16
         GradleVersion.version("7.3"), // JDK-17
         GradleVersion.version("7.5"), // JDK-18
+        GradleVersion.version("7.6"), // JDK-19
     };
-    private static final int JAVA_VERSION;
-
-    static {
-        int ver = 8;
-        String version = System.getProperty("java.specification.version", 
System.getProperty("java.version")); //NOI18N
-        try {
-            int dot = version.indexOf('.');
-            ver = dot > 0 ? Integer.parseInt(version.substring(0, dot)) : 
Integer.parseInt(version);
-            if (ver == 1) {
-                version = version.substring(dot + 1);
-                dot = version.indexOf('.');
-                ver = dot > 0 ? Integer.parseInt(version.substring(0, dot)) : 
Integer.parseInt(version);
-            }
-        } catch (NumberFormatException ex) {
-            Exceptions.printStackTrace(ex);
-        }
-        JAVA_VERSION = ver;
-    }
 
     final File gradleUserHome;
 
@@ -379,7 +361,7 @@ public final class GradleDistributionManager {
         return new File(dist.getDistributionDir(), "gradle-" + version);
     }
 
-    
+    @SuppressWarnings("PackageVisibleInnerClass")
     static final class GradleVersionRange {
 
         public final GradleVersion lowerBound;
@@ -528,10 +510,12 @@ public final class GradleDistributionManager {
          * Checks if this Gradle distribution is compatible the NetBeans
          * runtime JDK.
          *
-         * @return <code>true</code> if this version is supported with the 
runtime JDK.
+         * @return <code>true</code>.
+         * @deprecated shall be no reason to be used.
          */
+        @Deprecated
         public boolean isCompatibleWithSystemJava() {
-            return isCompatibleWithJava(JAVA_VERSION);
+            return true;
         }
 
         /**
@@ -668,6 +652,7 @@ public final class GradleDistributionManager {
         }
 
         @Override
+        @SuppressWarnings("NestedAssignment")
         public void download(URI uri, File file) throws Exception {
             URL url = uri.toURL();
             URLConnection conn = url.openConnection();
diff --git 
a/extide/gradle/src/org/netbeans/modules/gradle/execute/GradleDaemonExecutor.java
 
b/extide/gradle/src/org/netbeans/modules/gradle/execute/GradleDaemonExecutor.java
index cd10f28c59..a16f530139 100644
--- 
a/extide/gradle/src/org/netbeans/modules/gradle/execute/GradleDaemonExecutor.java
+++ 
b/extide/gradle/src/org/netbeans/modules/gradle/execute/GradleDaemonExecutor.java
@@ -283,7 +283,6 @@ public final class GradleDaemonExecutor extends 
AbstractGradleExecutor {
         String javaHome = null;
         if (platformProvider != null) {
             try {
-                buildLauncher.setJavaHome(platformProvider.getJavaHome());
                 javaHome = platformProvider.getJavaHome().getCanonicalPath();
             } catch (IOException ex) {
                 io.getErr().println(Bundle.NO_PLATFORM(ex.getMessage()));
diff --git 
a/extide/gradle/src/org/netbeans/modules/gradle/spi/execute/package-info.java 
b/extide/gradle/src/org/netbeans/modules/gradle/spi/execute/package-info.java
new file mode 100644
index 0000000000..b798cae9b1
--- /dev/null
+++ 
b/extide/gradle/src/org/netbeans/modules/gradle/spi/execute/package-info.java
@@ -0,0 +1,35 @@
+/*
+ * 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.
+ */
+/**
+ * If a project needs direct access to Gradle, there is a
+ * {@link org.gradle.tooling.ProjectConnection}
+ * can be retrieved from the project's lookup. The returned implementation
+ * takes account the {@link 
org.netbeans.modules.gradle.spi.execute.GradleJavaPlatformProvider} and the 
{@link org.netbeans.modules.gradle.spi.execute.GradleDistributionProvider}
+ * implementations if they are available in the project lookup.
+ * <pre>
+ *  ProjectConnection connection = 
project.getLookup().lookup(ProjectConnection.class);
+ *
+ *  connection.newBuild()
+ *    .forTasks("tasks")
+ *    .setStandardOutput(System.out)
+ *    .run();
+ *
+ * </pre>
+ */
+package org.netbeans.modules.gradle.spi.execute;


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@netbeans.apache.org
For additional commands, e-mail: commits-h...@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists

Reply via email to