You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2015/01/16 10:38:42 UTC

incubator-ignite git commit: # IGNITE-32 WIP: Overwrite confirmation.

Repository: incubator-ignite
Updated Branches:
  refs/heads/ignite-32 9b65ff00a -> c021ac7e3


# IGNITE-32 WIP: Overwrite confirmation.


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

Branch: refs/heads/ignite-32
Commit: c021ac7e39d8afb6886415b17760a76e9cb0c84c
Parents: 9b65ff0
Author: AKuznetsov <ak...@gridgain.com>
Authored: Fri Jan 16 16:39:07 2015 +0700
Committer: AKuznetsov <ak...@gridgain.com>
Committed: Fri Jan 16 16:39:07 2015 +0700

----------------------------------------------------------------------
 .../ignite/schema/pojo/PojoCodeGenerator.java   |  19 +++-
 .../ignite/schema/ui/ConfirmCallable.java       |  84 ++++++++++++++
 .../org/apache/ignite/schema/ui/GridPaneEx.java |   9 ++
 .../org/apache/ignite/schema/ui/MessageBox.java | 109 +++++++++++++------
 .../apache/ignite/schema/ui/SchemaLoadApp.java  |   9 +-
 .../ignite/schema/xml/XmlTransformer.java       |  13 ++-
 6 files changed, 197 insertions(+), 46 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/c021ac7e/modules/schema-load/src/main/java/org/apache/ignite/schema/pojo/PojoCodeGenerator.java
----------------------------------------------------------------------
diff --git a/modules/schema-load/src/main/java/org/apache/ignite/schema/pojo/PojoCodeGenerator.java b/modules/schema-load/src/main/java/org/apache/ignite/schema/pojo/PojoCodeGenerator.java
index 414cb0d..0a2754a 100644
--- a/modules/schema-load/src/main/java/org/apache/ignite/schema/pojo/PojoCodeGenerator.java
+++ b/modules/schema-load/src/main/java/org/apache/ignite/schema/pojo/PojoCodeGenerator.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.schema.pojo;
 
+import org.apache.ignite.schema.ui.*;
 import org.gridgain.grid.cache.query.*;
 
 import java.io.*;
@@ -82,10 +83,16 @@ public class PojoCodeGenerator {
      * @param type Type name.
      * @param descs Type descriptors.
      * @param constructor If {@code true} then generate empty and full constructors.
+     * @param askOverwrite Callback to ask user to confirm file overwrite.
      * @throws IOException If failed to write generated code into file.
      */
     private static void generateCode(String pkg, String type, Collection<GridCacheQueryTypeDescriptor> descs,
-        File pkgFolder, boolean constructor) throws IOException {
+        File pkgFolder, boolean constructor, ConfirmCallable askOverwrite) throws IOException {
+        File out = new File(pkgFolder, type + ".java");
+
+        if (out.exists() && !askOverwrite.confirm(out.getName()))
+            return;
+
         Collection<String> src = new ArrayList<>(256);
 
         add0(src, "/*");
@@ -260,7 +267,7 @@ public class PojoCodeGenerator {
 
         add0(src, "}");
 
-        try (Writer writer = new BufferedWriter(new FileWriter(new File(pkgFolder, type + ".java")))) {
+        try (Writer writer = new BufferedWriter(new FileWriter(out))) {
             for (String line : src)
                 writer.write(line + '\n');
         }
@@ -273,17 +280,19 @@ public class PojoCodeGenerator {
      * @param outFolder Output folder.
      * @param pkg Types package.
      * @param constructor If {@code true} then generate empty and full constructors.
+     * @param askOverwrite Callback to ask user to confirm file overwrite.
      * @throws IOException If failed to write generated code into file.
      */
-    public static void generate(GridCacheQueryTypeMetadata meta, String outFolder, String pkg, boolean constructor)
+    public static void generate(GridCacheQueryTypeMetadata meta, String outFolder, String pkg, boolean constructor,
+        ConfirmCallable askOverwrite)
         throws IOException {
         File pkgFolder = new File(outFolder, pkg.replace('.', File.separatorChar));
 
         if (!pkgFolder.exists() && !pkgFolder.mkdirs())
             throw new IOException("Failed to create folders for package: " + pkg);
 
-        generateCode(pkg, meta.getKeyType(), meta.getKeyDescriptors(), pkgFolder, constructor);
+        generateCode(pkg, meta.getKeyType(), meta.getKeyDescriptors(), pkgFolder, constructor, askOverwrite);
 
-        generateCode(pkg, meta.getType(), meta.getValueDescriptors(), pkgFolder, constructor);
+        generateCode(pkg, meta.getType(), meta.getValueDescriptors(), pkgFolder, constructor, askOverwrite);
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/c021ac7e/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/ConfirmCallable.java
----------------------------------------------------------------------
diff --git a/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/ConfirmCallable.java b/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/ConfirmCallable.java
new file mode 100644
index 0000000..d00ac3f
--- /dev/null
+++ b/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/ConfirmCallable.java
@@ -0,0 +1,84 @@
+/*
+ * 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.ignite.schema.ui;
+
+import javafx.application.*;
+import javafx.stage.*;
+
+import java.util.concurrent.*;
+
+import static org.apache.ignite.schema.ui.MessageBox.Result.*;
+
+/**
+ * Callable to ask user for confirmation from non EDT thread.
+ */
+public class ConfirmCallable implements Callable<Boolean> {
+    /** Owner window. */
+    private final Stage owner;
+
+    /** Message template. */
+    private final String template;
+
+    /** Message to show in confirmation dialog. */
+    private String msg;
+
+    /** User choice. */
+    private MessageBox.Result choice = NO;
+
+    /**
+     * @param owner Owner window.
+     * @param template Message template.
+     */
+    public ConfirmCallable(Stage owner, String template) {
+        this.owner = owner;
+        this.template = template;
+    }
+
+    /** {@inheritDoc} */
+    @Override public Boolean call() throws Exception {
+        choice = MessageBox.confirmRememberChoiceDialog(owner, String.format(template, msg));
+
+        return choice == YES || choice == YES_TO_ALL;
+    }
+
+    /**
+     * Execute confirmation in EDT thread.
+     *
+     * @return {@code true} If user confirm.
+     */
+    public boolean confirm(String msg) {
+        this.msg = msg;
+
+        if (choice == YES_TO_ALL)
+            return true;
+
+        if (choice == NO_TO_ALL)
+            return false;
+
+        FutureTask<Boolean> fut = new FutureTask<>(this);
+
+        Platform.runLater(fut);
+
+        try {
+            return fut.get();
+        }
+        catch (Exception ignored) {
+            return false;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/c021ac7e/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/GridPaneEx.java
----------------------------------------------------------------------
diff --git a/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/GridPaneEx.java b/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/GridPaneEx.java
index 0db92e6..be1aae9 100644
--- a/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/GridPaneEx.java
+++ b/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/GridPaneEx.java
@@ -107,6 +107,15 @@ public class GridPaneEx extends GridPane {
     }
 
     /**
+     * Skip columns.
+     *
+     * @param span How many columns should be skipped.
+     */
+    public void skip(int span) {
+        add(new Label(""), span);
+    }
+
+    /**
      * Move to next column.
      */
     private void nextCol(int span) {

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/c021ac7e/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/MessageBox.java
----------------------------------------------------------------------
diff --git a/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/MessageBox.java b/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/MessageBox.java
index bdba017..337d72f 100644
--- a/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/MessageBox.java
+++ b/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/MessageBox.java
@@ -19,6 +19,7 @@ package org.apache.ignite.schema.ui;
 
 import javafx.event.*;
 import javafx.geometry.*;
+import javafx.scene.control.*;
 import javafx.scene.layout.*;
 import javafx.stage.*;
 
@@ -40,17 +41,22 @@ public class MessageBox extends ModalDialog {
         CONFIRM
     }
 
-    /** Return value if YES is chosen. */
-    public static final int YES_OPTION = 0;
-
-    /** Return value if NO is chosen. */
-    public static final int NO_OPTION = 1;
-
-    /** Return value if CANCEL is chosen. */
-    public static final int CANCEL_OPTION = 2;
+    /** Message box type. */
+    public enum Result {
+        /** Return value if YES is chosen. */
+        YES,
+        /** Return value if YES_TO_ALL is chosen. */
+        YES_TO_ALL,
+        /** Return value if NO is chosen. */
+        NO,
+        /** Return value if NO_TO_ALL is chosen. */
+        NO_TO_ALL,
+        /** Return value if CANCEL is chosen. */
+        CANCEL
+    }
 
     /** Dialog result. */
-    private int res = CANCEL_OPTION;
+    private Result res = Result.CANCEL;
 
     /**
      * Create message box.
@@ -58,8 +64,9 @@ public class MessageBox extends ModalDialog {
      * @param owner Owner window.
      * @param type Message box type.
      * @param msg Message to show.
+     * @param rememberChoice If {@code true} then add &quot;Remember choice&quot; check box.
      */
-    private MessageBox(Stage owner, MessageType type, String msg) {
+    private MessageBox(Stage owner, MessageType type, String msg, final boolean rememberChoice) {
         super(owner, 480, 180);
 
         String title;
@@ -93,25 +100,48 @@ public class MessageBox extends ModalDialog {
         initOwner(owner);
         setResizable(false);
 
-        HBox btns = hBox(10, true);
-        btns.setAlignment(Pos.CENTER);
+        GridPaneEx contentPnl = paneEx(10, 10, 0, 10);
 
-        if (type == MessageType.CONFIRM) {
-            res = NO_OPTION;
+        contentPnl.addColumn();
+        contentPnl.addColumn(100, 100, Double.MAX_VALUE, Priority.ALWAYS);
 
-            btns.getChildren().addAll(button("Yes", "Approve the request", new EventHandler<ActionEvent>() {
-                @Override public void handle(ActionEvent e) {
-                    res = YES_OPTION;
+        contentPnl.add(hBox(0, true, imageView(iconFile, 48)));
+        contentPnl.add(text(msg, 350));
 
-                    close();
-                }
-            }), button("No", "Reject the request", new EventHandler<ActionEvent>() {
-                @Override public void handle(ActionEvent e) {
-                    res = NO_OPTION;
+        final CheckBox rememberChoiceCh = checkBox("Remember choice", "", false);
 
-                    close();
-                }
-            }));
+        if (rememberChoice) {
+            contentPnl.skip(1);
+            contentPnl.add(rememberChoiceCh);
+        }
+
+        HBox btns = hBox(10, true);
+        btns.setAlignment(Pos.CENTER);
+
+        if (type == MessageType.CONFIRM) {
+            res = Result.NO;
+
+            btns.getChildren().addAll(
+                button("Yes", "Approve the request", new EventHandler<ActionEvent>() {
+                    @Override public void handle(ActionEvent e) {
+                        if (rememberChoice && rememberChoiceCh.isSelected())
+                            res = Result.YES_TO_ALL;
+                        else
+                            res = Result.YES;
+
+                        close();
+                    }
+                }),
+                button("No", "Reject the request", new EventHandler<ActionEvent>() {
+                    @Override public void handle(ActionEvent e) {
+                        res = Result.NO;
+                        if (rememberChoice && rememberChoiceCh.isSelected())
+                            res = Result.NO_TO_ALL;
+                        else
+
+                            close();
+                    }
+                }));
         }
         else
             btns.getChildren().add(button("OK", "Close dialog", new EventHandler<ActionEvent>() {
@@ -120,10 +150,7 @@ public class MessageBox extends ModalDialog {
                 }
             }));
 
-        HBox box = hBox(10, true, imageView(iconFile, 48), text(msg, 350));
-        box.setAlignment(Pos.CENTER_LEFT);
-
-        setScene(scene(borderPane(null, box, btns, null, null)));
+        setScene(scene(borderPane(null, contentPnl, btns, null, null)));
     }
 
     /**
@@ -134,8 +161,8 @@ public class MessageBox extends ModalDialog {
      * @param msg Message to show.
      * @return Option selected by the user.
      */
-    private static int showDialog(Stage owner, MessageType type, String msg) {
-        MessageBox dlg = new MessageBox(owner, type, msg);
+    private static Result showDialog(Stage owner, MessageType type, String msg, boolean rememberChoice) {
+        MessageBox dlg = new MessageBox(owner, type, msg, rememberChoice);
 
         dlg.showModal();
 
@@ -150,7 +177,18 @@ public class MessageBox extends ModalDialog {
      * @return {@code true} If user confirm.
      */
     public static boolean confirmDialog(Stage owner, String msg) {
-        return showDialog(owner, MessageType.CONFIRM, msg) == YES_OPTION;
+        return showDialog(owner, MessageType.CONFIRM, msg, true) == Result.YES;
+    }
+
+    /**
+     * Show confirmation dialog.
+     *
+     * @param owner Owner window.
+     * @param msg Message to show.
+     * @return User confirmation result.
+     */
+    public static Result confirmRememberChoiceDialog(Stage owner, String msg) {
+        return showDialog(owner, MessageType.CONFIRM, msg, true);
     }
 
     /**
@@ -160,7 +198,7 @@ public class MessageBox extends ModalDialog {
      * @param msg Message to show.
      */
     public static void informationDialog(Stage owner, String msg) {
-        showDialog(owner, MessageType.INFO, msg);
+        showDialog(owner, MessageType.INFO, msg, false);
     }
 
     /**
@@ -170,7 +208,7 @@ public class MessageBox extends ModalDialog {
      * @param msg Message to show.
      */
     public static void warningDialog(Stage owner, String msg) {
-        showDialog(owner, MessageType.WARN, msg);
+        showDialog(owner, MessageType.WARN, msg, false);
     }
 
     /**
@@ -181,6 +219,7 @@ public class MessageBox extends ModalDialog {
      * @param e Optional exception to show.
      */
     public static void errorDialog(Stage owner, String msg, Throwable e) {
-        showDialog(owner, MessageType.ERROR, (e != null && e.getMessage() != null) ? msg + "\n" + e.getMessage() : msg);
+        showDialog(owner, MessageType.ERROR,
+            (e != null && e.getMessage() != null) ? msg + "\n" + e.getMessage() : msg, false);
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/c021ac7e/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/SchemaLoadApp.java
----------------------------------------------------------------------
diff --git a/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/SchemaLoadApp.java b/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/SchemaLoadApp.java
index e7ffc1a..9f1848a 100644
--- a/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/SchemaLoadApp.java
+++ b/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/SchemaLoadApp.java
@@ -322,6 +322,8 @@ public class SchemaLoadApp extends Application {
                 boolean include = pojoIncludeKeysCh.isSelected();
                 boolean singleXml = xmlSingleFileCh.isSelected();
 
+                ConfirmCallable askOverwrite = new ConfirmCallable(owner, "File already exists: %s\nOverwrite?");
+
                 // Generate POJO and XML.
                 for (TreeItem<String> schemeItem : rootItem.getChildren()) {
                     for (TreeItem<String> tblItem : schemeItem.getChildren()) {
@@ -362,9 +364,10 @@ public class SchemaLoadApp extends Application {
                             all.add(meta);
 
                             if (!singleXml)
-                                XmlTransformer.transform(pkg, meta, new File(destFolder, meta.getType() + ".xml"));
+                                XmlTransformer.transform(pkg, meta, new File(destFolder, meta.getType() + ".xml"),
+                                    askOverwrite);
 
-                            PojoCodeGenerator.generate(meta, outFolder, pkg, constructor);
+                            PojoCodeGenerator.generate(meta, outFolder, pkg, constructor, askOverwrite);
                         }
                     }
                 }
@@ -372,7 +375,7 @@ public class SchemaLoadApp extends Application {
                 if (all.isEmpty())
                     throw new IllegalStateException("Nothing selected!");
                 else if (singleXml)
-                    XmlTransformer.transform(pkg, all, new File(outFolder, "Ignite.xml"));
+                    XmlTransformer.transform(pkg, all, new File(outFolder, "Ignite.xml"), askOverwrite);
 
                 perceptualDelay(started);
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/c021ac7e/modules/schema-load/src/main/java/org/apache/ignite/schema/xml/XmlTransformer.java
----------------------------------------------------------------------
diff --git a/modules/schema-load/src/main/java/org/apache/ignite/schema/xml/XmlTransformer.java b/modules/schema-load/src/main/java/org/apache/ignite/schema/xml/XmlTransformer.java
index 7c83f71..3171521 100644
--- a/modules/schema-load/src/main/java/org/apache/ignite/schema/xml/XmlTransformer.java
+++ b/modules/schema-load/src/main/java/org/apache/ignite/schema/xml/XmlTransformer.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.schema.xml;
 
 import org.apache.ignite.lang.*;
+import org.apache.ignite.schema.ui.*;
 import org.gridgain.grid.cache.query.*;
 import org.gridgain.grid.util.typedef.*;
 import org.w3c.dom.*;
@@ -254,9 +255,10 @@ public class XmlTransformer {
      * @param pkg Package fo types.
      * @param meta Metadata to transform.
      * @param out File to output result.
+     * @param askOverwrite Callback to ask user to confirm file overwrite.
      */
-    public static void transform(String pkg, GridCacheQueryTypeMetadata meta, File out) {
-        transform(pkg, Collections.singleton(meta), out);
+    public static void transform(String pkg, GridCacheQueryTypeMetadata meta, File out, ConfirmCallable askOverwrite) {
+        transform(pkg, Collections.singleton(meta), out, askOverwrite);
     }
 
     /**
@@ -265,9 +267,14 @@ public class XmlTransformer {
      * @param pkg Package fo types.
      * @param meta Metadata to transform.
      * @param out File to output result.
+     * @param askOverwrite Callback to ask user to confirm file overwrite.
      */
-    public static void transform(String pkg, Collection<GridCacheQueryTypeMetadata> meta, File out) {
+    public static void transform(String pkg, Collection<GridCacheQueryTypeMetadata> meta, File out,
+        ConfirmCallable askOverwrite) {
         try {
+            if (out.exists() && !askOverwrite.confirm(out.getName()))
+                return;
+
             DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
 
             DocumentBuilder docBuilder = docFactory.newDocumentBuilder();