You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ak...@apache.org on 2016/03/03 10:17:24 UTC

ignite git commit: IGNITE-799 Fixed Desktop API is not supported on the current platform.

Repository: ignite
Updated Branches:
  refs/heads/master cba4f4c03 -> 28ea3433b


IGNITE-799 Fixed Desktop API is not supported on the current platform.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/28ea3433
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/28ea3433
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/28ea3433

Branch: refs/heads/master
Commit: 28ea3433bfbe64cd5166adc29c1badd8d601761e
Parents: cba4f4c
Author: vsisko <vs...@gridgain.com>
Authored: Thu Mar 3 16:17:57 2016 +0700
Committer: Alexey Kuznetsov <ak...@apache.org>
Committed: Thu Mar 3 16:17:57 2016 +0700

----------------------------------------------------------------------
 .../ignite/schema/ui/SchemaImportApp.java       | 205 ++++++++++++++++++-
 1 file changed, 202 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/28ea3433/modules/schema-import/src/main/java/org/apache/ignite/schema/ui/SchemaImportApp.java
----------------------------------------------------------------------
diff --git a/modules/schema-import/src/main/java/org/apache/ignite/schema/ui/SchemaImportApp.java b/modules/schema-import/src/main/java/org/apache/ignite/schema/ui/SchemaImportApp.java
index 6f9e05b..98ac357 100644
--- a/modules/schema-import/src/main/java/org/apache/ignite/schema/ui/SchemaImportApp.java
+++ b/modules/schema-import/src/main/java/org/apache/ignite/schema/ui/SchemaImportApp.java
@@ -17,14 +17,19 @@
 
 package org.apache.ignite.schema.ui;
 
+import java.awt.Desktop;
 import java.io.BufferedInputStream;
+import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.lang.reflect.Field;
 import java.net.URL;
 import java.net.URLClassLoader;
+import java.nio.charset.Charset;
 import java.sql.Connection;
 import java.sql.Driver;
 import java.sql.SQLException;
@@ -39,6 +44,8 @@ import java.util.concurrent.Executors;
 import java.util.concurrent.ThreadFactory;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import javafx.application.Application;
 import javafx.application.Platform;
 import javafx.beans.value.ChangeListener;
@@ -75,6 +82,7 @@ import javafx.stage.FileChooser;
 import javafx.stage.Screen;
 import javafx.stage.Stage;
 import javafx.util.Callback;
+import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.schema.generator.CodeGenerator;
 import org.apache.ignite.schema.generator.XmlGenerator;
@@ -119,6 +127,9 @@ public class SchemaImportApp extends Application {
     /** Logger. */
     private static final Logger log = Logger.getLogger(SchemaImportApp.class.getName());
 
+    /** Ability to use xdg-open utility flag. */
+    private static final boolean HAS_XDG_OPEN = U.isUnix() && new File("/usr/bin/xdg-open").canExecute();
+
     /** Presets for database settings. */
     private static class Preset {
         /** Name in preferences. */
@@ -661,6 +672,194 @@ public class SchemaImportApp extends Application {
                 return null;
             }
 
+            /**
+             * Running of command with reading of first printed line.
+             *
+             * @param cmdLine Process to run.
+             * @return First printed by command line.
+             */
+            private String execAndReadLine(Process cmdLine) {
+                InputStream stream = cmdLine.getInputStream();
+                Charset cs = Charset.defaultCharset();
+
+                try(BufferedReader reader = new BufferedReader(
+                        cs == null ? new InputStreamReader(stream) : new InputStreamReader(stream, cs))) {
+                    return reader.readLine();
+                }
+                catch (IOException ignored){
+                    return null;
+                }
+            }
+
+            /**
+             * Start specified command in separate process.
+             *
+             * @param commands Executable file and command parameters in array.
+             * @return Process instance for run command.
+             */
+            private Process startProcess(List<String> commands) throws IOException {
+                ProcessBuilder builder = new ProcessBuilder(commands);
+
+                Map<String, String> environment = builder.environment();
+
+                environment.clear();
+
+                environment.putAll(System.getenv());
+
+                return builder.start();
+            }
+
+            /**
+             * Convert specified command parameters to system specific parameters.
+             *
+             * @param cmd Path to executable file.
+             * @param parameters Params for created process.
+             * @return List of converted system specific parameters.
+             */
+            private List<String> toCommandLine(String cmd, String... parameters) {
+                boolean isWin = U.isWindows();
+
+                List<String> params = new ArrayList<>(parameters.length + 1);
+
+                params.add(cmd.replace('/', File.separatorChar).replace('\\', File.separatorChar));
+
+                for (String parameter: parameters) {
+                    if (isWin) {
+                        if (parameter.contains("\"")) params.add(parameter.replace("\"", "\\\""));
+                        else if (parameter.isEmpty()) params.add("\"\"");
+                        else params.add(parameter);
+                    }
+                    else
+                        params.add(parameter);
+                }
+
+                return params;
+            }
+
+            /**
+             * Create process for run specified command.
+             *
+             * @param execPath Path to executable file.
+             * @param params Params for created process.
+             * @return Process instance for run command.
+             */
+            private Process createProcess(String execPath, String... params) throws IOException {
+                if (F.isEmpty(execPath))
+                    throw new IllegalArgumentException("Executable not specified");
+
+                return startProcess(toCommandLine(execPath, params));
+            }
+
+            /**
+             * Compare two version strings.
+             *
+             * @param v1 Version string 1.
+             * @param v2 Version string 2.
+             * @return The value 0 if the argument version is equal to this version.
+             * A value less than 0 if this version is less than the version argument.
+             * A value greater than 0 if this version is greater than the version argument.
+             */
+            private int compareVersionNumbers(String v1, String v2) {
+                if (v1 == null && v2 == null)
+                    return 0;
+
+                if (v1 == null)
+                    return -1;
+
+                if (v2 == null)
+                    return 1;
+
+                String[] part1 = v1.split("[._-]");
+                String[] part2 = v2.split("[._-]");
+
+                int idx = 0;
+
+                while (idx < part1.length && idx < part2.length) {
+                    String p1 = part1[idx];
+                    String p2 = part2[idx];
+
+                    int cmp = p1.matches("\\d+") && p2.matches("\\d+") ? new Integer(p1).compareTo(new Integer(p2)) :
+                            part1[idx].compareTo(part2[idx]);
+
+                    if (cmp != 0)
+                        return cmp;
+
+                    idx += 1;
+                }
+
+                if (part1.length == part2.length)
+                    return 0;
+                else {
+                    boolean left = part1.length > idx;
+                    String[] parts = left ? part1 : part2;
+
+                    while (idx < parts.length) {
+                        String p = parts[idx];
+
+                        int cmp = p.matches("\\d+") ? new Integer(p).compareTo(0) : 1;
+
+                        if (cmp != 0) return left ? cmp : -cmp;
+
+                        idx += 1;
+                    }
+
+                    return 0;
+                }
+            }
+
+            /**
+             * Check that system has Nautilus.
+             * @return {@code True} when Nautilus is installed or {@code false} otherwise.
+             * @throws IOException
+             */
+            private boolean canUseNautilus() throws IOException {
+                if (U.isUnix() || new File("/usr/bin/xdg-mime").canExecute() || new File("/usr/bin/nautilus").canExecute()) {
+                    String appName = execAndReadLine(createProcess("xdg-mime", "query", "default", "inode/directory"));
+
+                    if (appName == null || !appName.matches("nautilus.*\\.desktop"))
+                        return false;
+                    else {
+                        String ver = execAndReadLine(createProcess("nautilus", "--version"));
+
+                        if (ver != null) {
+                            Matcher m = Pattern.compile("GNOME nautilus ([0-9.]+)").matcher(ver);
+
+                            return m.find() && compareVersionNumbers(m.group(1), "3") >= 0;
+                        }
+                        else
+                            return false;
+                    }
+                }
+                else
+                    return false;
+            }
+
+            /**
+             * Open specified folder with selection of specified file in system file manager.
+             *
+             * @param dir Opened folder.
+             */
+            private void openFolder(File dir) throws IOException {
+                if (U.isWindows())
+                    Runtime.getRuntime().exec("explorer /root," + dir.getAbsolutePath());
+                else if (U.isMacOs())
+                    createProcess("open", dir.getAbsolutePath());
+                else if (canUseNautilus())
+                    createProcess("nautilus", dir.getAbsolutePath());
+                else {
+                    String path = dir.getAbsolutePath();
+
+                    if (HAS_XDG_OPEN)
+                        createProcess("/usr/bin/xdg-open", path);
+                    else if (Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.OPEN))
+                        Desktop.getDesktop().open(new File(path));
+                    else
+                        MessageBox.warningDialog(owner, "This action isn't supported on the current platform" +
+                            ((U.isLinux() || U.isUnix() || U.isSolaris()) ?
+                            ".\nTo fix this issue you should install library libgnome2-0." : ""));
+                }
+            }
+
             /** {@inheritDoc} */
             @Override protected void succeeded() {
                 super.succeeded();
@@ -670,9 +869,9 @@ public class SchemaImportApp extends Application {
                 if (MessageBox.confirmDialog(owner, "Generation complete!\n\n" +
                     "Reveal output folder in system default file browser?"))
                     try {
-                        java.awt.Desktop.getDesktop().open(destFolder);
+                        openFolder(destFolder);
                     }
-                    catch (IOException e) {
+                    catch (Exception e) {
                         MessageBox.errorDialog(owner, "Failed to open folder with results.", e);
                     }
             }
@@ -1550,7 +1749,7 @@ public class SchemaImportApp extends Application {
 
                 if (customPrefsFile == null)
                     log.log(Level.WARNING, "Failed to resolve path to file with custom preferences: " +
-                        customPrefsFile);
+                        customPrefsFileName);
                 else {
                     Properties customPrefs = new Properties();