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

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


The following commit(s) were added to refs/heads/master by this push:
     new 31271ed15 CAY-2872 CayenneModeler "Documentation" link is broken
31271ed15 is described below

commit 31271ed159620877f7c2e041066d532ff8887bee
Author: Nikita Timofeev <stari...@gmail.com>
AuthorDate: Thu Oct 31 17:38:38 2024 +0400

    CAY-2872 CayenneModeler "Documentation" link is broken
---
 RELEASE-NOTES.txt                                  |  1 +
 .../modeler/action/DocumentationAction.java        | 32 ++++++++++++---
 .../cayenne/modeler/util/BrowserControl.java       | 45 +++++++++-------------
 .../cayenne/modeler/util/OperatingSystem.java      | 11 ++----
 4 files changed, 51 insertions(+), 38 deletions(-)

diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index 3fdddfe2d..27fac82bf 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -13,6 +13,7 @@ Date:
 ----------------------------------
 Changes/New Features:
 
+CAY-2872 CayenneModeler "Documentation" link is broken
 CAY-2873 Change Orderings.orderedList() to accept a Collection rather than a 
List
 
 Bug Fixes:
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DocumentationAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DocumentationAction.java
index 7c01a3e2c..a691398e3 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DocumentationAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DocumentationAction.java
@@ -38,12 +38,34 @@ public class DocumentationAction extends CayenneAction {
 
     @Override
     public void performAction(ActionEvent e) {
-        String version = LocalizedStringsHandler.getString("cayenne.version");
-        String url = "https://cayenne.apache.org";;
-        if(!"".equals(version)) {
-            String majorVersion = version.substring(0, 
version.lastIndexOf('.'));
-            url = url + "/docs/" + majorVersion + "/cayenne-guide/";
+        String url = "https://cayenne.apache.org/docs/";;
+        String majorVersion = getMajorVersion();
+        if(!majorVersion.isEmpty()) {
+            url = url + majorVersion + "/cayenne-guide/";
         }
         BrowserControl.displayURL(url);
     }
+
+    private static String getMajorVersion() {
+        String version = LocalizedStringsHandler.getString("cayenne.version");
+        if(version.isEmpty()) {
+            return "";
+        }
+        String majorVersion = version;
+        int dash = version.indexOf('-');
+        if (dash != -1) {
+            // trim down snapshot part
+            majorVersion = version.substring(0, dash);
+        }
+        // build a major version in form of 'X.Y'
+        String[] components = majorVersion.split("\\.");
+        switch (components.length) {
+            case 0:
+                return "";
+            case 1:
+                return components[0] + ".0";
+            default:
+                return String.join(".", components[0], components[1]);
+        }
+    }
 }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/BrowserControl.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/BrowserControl.java
index aed20761a..1936e36a8 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/BrowserControl.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/BrowserControl.java
@@ -19,54 +19,47 @@
 
 package org.apache.cayenne.modeler.util;
 
-import java.lang.reflect.Method;
+import java.awt.Desktop;
+import java.net.URI;
 
 /**
  * Opens a URL in the system default browser.
  */
 public class BrowserControl {
-
-    private static final String WIN_PATH = "rundll32";
-    private static final String WIN_FLAG = "url.dll,FileProtocolHandler";
-
     /**
      * Display a file in the system browser. If you want to display a file, 
you must
      * include the absolute path name.
-     * 
+     *
      * @param url the file's url (the url must start with either "http://"; or 
"file://").
      */
     // see public domain code at
     // http://www.centerkey.com/java/browser/myapp/BareBonesBrowserLaunch.java
     public static void displayURL(String url) {
         try {
-            if (OperatingSystem.getOS() == OperatingSystem.WINDOWS) {
-                // cmd = 'rundll32 url.dll,FileProtocolHandler http://...'
-                String cmd = WIN_PATH + " " + WIN_FLAG + " " + url;
+            // use direct Java support for the Desktop if available
+            if (Desktop.isDesktopSupported() && 
Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) {
+                Desktop.getDesktop().browse(new URI(url));
+            // failover to a platform-specific hacks
+            } else if (OperatingSystem.getOS() == OperatingSystem.WINDOWS) {
+                String cmd = "rundll32 url.dll,FileProtocolHandler " + url;
                 Runtime.getRuntime().exec(cmd);
-            }
-            else if (OperatingSystem.getOS() == OperatingSystem.MAC_OS_X) {
-                Class<?> fileManager = 
Class.forName("com.apple.eio.FileManager");
-                Method openURL = fileManager.getDeclaredMethod("openURL", 
String.class);
-                openURL.invoke(null, url);
-            }
-            else { // assume Unix or Linux
+            } else if (OperatingSystem.getOS() == OperatingSystem.MAC_OS_X) {
+                String cmd = "open " + url;
+                Runtime.getRuntime().exec(cmd);
+            } else { // assume Unix or Linux
                 String[] browsers = {
-                        "firefox", "opera", "konqueror", "epiphany", "mozilla",
-                        "netscape"
+                        "google-chrome", "firefox", "mozilla",
+                        "epiphany", "konqueror", "netscape",
+                        "opera", "links", "lynx"
                 };
                 for (String browser : browsers) {
-                    if (Runtime.getRuntime().exec(new String[] {
-                            "which", browser
-                    }).waitFor() == 0) {
-                        Runtime.getRuntime().exec(new String[] {
-                                browser, url
-                        });
+                    if (Runtime.getRuntime().exec(new String[]{"which", 
browser}).waitFor() == 0) {
+                        Runtime.getRuntime().exec(new String[]{browser, url});
                         break;
                     }
                 }
             }
-        }
-        catch (Exception ex) {
+        } catch (Exception ex) {
             // could not open browser. Fail silently.
         }
     }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/OperatingSystem.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/OperatingSystem.java
index 66704623b..e0503a5ca 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/OperatingSystem.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/OperatingSystem.java
@@ -16,6 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
+
 package org.apache.cayenne.modeler.util;
 
 /**
@@ -26,21 +27,17 @@ public enum OperatingSystem {
     MAC_OS_X, WINDOWS, OTHER;
 
     private static final OperatingSystem os;
-
     static {
         String osName = System.getProperty("os.name");
 
         if (osName == null) {
             os = OTHER;
-        }
-        else {
+        } else {
             if (osName.startsWith("Windows")) {
                 os = WINDOWS;
-            }
-            else if (osName.startsWith("Mac OS X")) {
+            } else if (osName.startsWith("Mac OS X")) {
                 os = MAC_OS_X;
-            }
-            else {
+            } else {
                 os = OTHER;
             }
         }

Reply via email to