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/09 16:47:08 UTC
incubator-ignite git commit: # IGNITE-32 WIP: Implemented custom
naming.
Repository: incubator-ignite
Updated Branches:
refs/heads/ignite-32 2238d6fd4 -> 356d3311c
# IGNITE-32 WIP: Implemented custom naming.
Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/356d3311
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/356d3311
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/356d3311
Branch: refs/heads/ignite-32
Commit: 356d3311c79345a9224791a4bf9e6273a8f7faba
Parents: 2238d6f
Author: AKuznetsov <ak...@gridgain.com>
Authored: Fri Jan 9 22:47:05 2015 +0700
Committer: AKuznetsov <ak...@gridgain.com>
Committed: Fri Jan 9 22:47:05 2015 +0700
----------------------------------------------------------------------
.../org/apache/ignite/schema/ui/Controls.java | 25 +++-
.../org/apache/ignite/schema/ui/GridPaneEx.java | 18 ---
.../apache/ignite/schema/ui/NamingDialog.java | 113 +++++++++++++++++-
.../apache/ignite/schema/ui/SchemaLoadApp.java | 117 ++++++++++++++-----
4 files changed, 216 insertions(+), 57 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/356d3311/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/Controls.java
----------------------------------------------------------------------
diff --git a/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/Controls.java b/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/Controls.java
index 99a60b3..864861d 100644
--- a/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/Controls.java
+++ b/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/Controls.java
@@ -204,10 +204,17 @@ public class Controls {
/**
* Create text field.
*
+ * @param txt Textual content of this text field.
+ * @param tip Tooltip text.
* @return New {@code TextField} instance.
*/
- public static TextField textField() {
- return new TextField();
+ public static TextField textField(String txt, String tip) {
+ TextField tf = new TextField();
+
+ tf.setText(txt);
+ tf.setTooltip(new Tooltip(tip));
+
+ return tf;
}
/**
@@ -227,6 +234,20 @@ public class Controls {
}
/**
+ * Create password field.
+ *
+ * @param tip Tooltip text.
+ * @return New {@code PasswordField} instance.
+ */
+ public static PasswordField passwordField(String tip) {
+ PasswordField pf = new PasswordField();
+
+ pf.setTooltip(new Tooltip(tip));
+
+ return pf;
+ }
+
+ /**
* Create split pane for provided nodes.
*
* @param node1 First node.
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/356d3311/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 6d847ce..c57ce75 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
@@ -28,15 +28,6 @@ public class GridPaneEx extends GridPane {
}
/**
- * Add fixed width column.
- *
- * @param width Column width.
- */
- public void addColumn(double width) {
- getColumnConstraints().add(new ColumnConstraints(width));
- }
-
- /**
* Add default column.
*/
public void addColumn() {
@@ -60,15 +51,6 @@ public class GridPaneEx extends GridPane {
}
/**
- * Add fixed height row.
- *
- * @param height Row height.
- */
- public void addRow(double height) {
- getRowConstraints().add(new RowConstraints(height));
- }
-
- /**
* Add default row.
*/
public void addRow() {
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/356d3311/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/NamingDialog.java
----------------------------------------------------------------------
diff --git a/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/NamingDialog.java b/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/NamingDialog.java
index e4269ee..1c94cdf 100644
--- a/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/NamingDialog.java
+++ b/modules/schema-load/src/main/java/org/apache/ignite/schema/ui/NamingDialog.java
@@ -3,6 +3,7 @@
package org.apache.ignite.schema.ui;
import javafx.event.*;
+import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.*;
@@ -15,12 +16,36 @@ public class NamingDialog extends Stage {
/** Owner window. */
private final Stage owner;
+ /** */
+ private final TextField prefixTf;
+
+ /** */
+ private final TextField suffixTf;
+
+ /** */
+ private final CheckBox regexCh;
+
+ /** */
+ private final TextField ptrnTf;
+
+ /** */
+ private final TextField replaceTf;
+
+ /** */
+ private boolean ok;
+
/**
* Create naming dialog.
*
* @param owner Owner window.
+ * @param prefix Prefix.
+ * @param suffix Suffix.
+ * @param regex {@code true} if regular expression should be applied to DB names.
+ * @param ptrn Regular expression pattern.
+ * @param replace Text to replace.
*/
- public NamingDialog(Stage owner) {
+ public NamingDialog(final Stage owner, final String prefix, String suffix, boolean regex, final String ptrn,
+ final String replace) {
this.owner = owner;
setTitle("Custom Naming");
@@ -34,18 +59,57 @@ public class NamingDialog extends Stage {
pane.addColumn();
pane.addColumn(200, 200, Double.MAX_VALUE, Priority.ALWAYS);
- pane.addLabeled("Prefix:", textField());
- pane.addLabeled("Suffix:", textField());
+ prefixTf = pane.addLabeled("Prefix:", textField(prefix, "Optional text to add before each DB name"));
+
+ suffixTf = pane.addLabeled("Suffix:", textField(suffix, "Optional text to add after each DB name"));
+
+ regexCh = pane.add(checkBox("Regular expression",
+ "If selected than DB names will be processed with specified pattern", regex), 2);
+
+ ptrnTf = pane.addLabeled("Pattern:", textField(ptrn, "Regular expression pattern. For example: (.*)-(.*)"));
+ ptrnTf.setDisable(!regex);
+
+ replaceTf = pane.addLabeled("Replace with:", textField(replace, "Replace text. For example: $1_$2"));
+ replaceTf.setDisable(!regex);
+
+ regexCh.setOnAction(new EventHandler<ActionEvent>() {
+ @Override public void handle(ActionEvent evt) {
+ boolean f = !regexCh.isSelected();
+
+ ptrnTf.setDisable(f);
+ replaceTf.setDisable(f);
+ }
+ });
pane.add(buttonsPane(
button("OK", new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent evt) {
- // TODO: CODE: implement.
+ if (regexCh.isSelected()) {
+ if (pattern().isEmpty()) {
+ MessageBox.warningDialog(owner, "Regular expression pattern should not be empty!");
+
+ ptrnTf.requestFocus();
+
+ return;
+ }
+
+ if (replace().isEmpty()) {
+ MessageBox.warningDialog(owner, "Replace expression should not be empty!");
+
+ replaceTf.requestFocus();
+
+ return;
+ }
+ }
+
+ ok = true;
+
+ close();
}
}),
button("Cancel", new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent evt) {
- // TODO: CODE: implement.
+ close();
}
})), 2);
@@ -53,14 +117,51 @@ public class NamingDialog extends Stage {
}
/**
+ * @return Prefix.
+ */
+ public String prefix() {
+ return prefixTf.getText().trim();
+ }
+
+ /**
+ * @return Suffix.
+ */
+ public String suffix() {
+ return suffixTf.getText().trim();
+ }
+
+ /**
+ * @return {@code true} if regexp should be applied to DB name.
+ */
+ public boolean regexp() {
+ return regexCh.isSelected();
+ }
+
+ /**
+ * @return Regex pattern.
+ */
+ public String pattern() {
+ return ptrnTf.getText().trim();
+ }
+
+ /**
+ * @return Replace text.
+ */
+ public String replace() {
+ return replaceTf.getText().trim();
+ }
+
+ /**
* Show modal dialog.
*/
- public void showDialog() {
+ public boolean showDialog() {
sizeToScene();
setX(owner.getX() + owner.getWidth() / 6);
setY(owner.getY() + owner.getHeight() / 4);
showAndWait();
+
+ return ok;
}
}
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/356d3311/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 5547fdf..16fe000 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
@@ -32,9 +32,11 @@ import java.util.*;
import java.util.List;
import java.util.concurrent.*;
import java.util.prefs.*;
+import java.util.regex.*;
import static javafx.embed.swing.SwingFXUtils.*;
import static org.apache.ignite.schema.ui.Controls.*;
+import static org.apache.ignite.schema.util.SchemaUtils.*;
/**
* Schema load application.
@@ -115,17 +117,29 @@ public class SchemaLoadApp extends Application {
/** */
private ProgressIndicator pi;
+ /** */
+ private String prefix;
+
+ /** */
+ private String suffix;
+
+ /** */
+ private boolean regex;
+
+ /** */
+ private String ptrn;
+
+ /** */
+ private String replace;
+
/** Map with types metadata. */
private LinkedHashMap<String, LinkedHashMap<String, GridCacheQueryTypeMetadata>> metas;
/** Map with fields descriptors. */
- private Map<String, Map<String, List<Field>>> fields;
-
- /** Fields collection of currently selected table. */
- private List<Field> curFields;
+ private Map<String, Map<String, ObservableList<Field>>> fields;
/** */
- private final ObservableList<Field> noData = FXCollections.emptyObservableList();
+ private static final ObservableList<Field> NO_DATA = FXCollections.emptyObservableList();
/** */
private final Map<String, Driver> drivers = new HashMap<>();
@@ -207,7 +221,7 @@ public class SchemaLoadApp extends Application {
LinkedHashMap<String, GridCacheQueryTypeMetadata> tbls = meta.getValue();
- Map<String, List<Field>> tblsFields = U.newHashMap(tbls.size());
+ Map<String, ObservableList<Field>> tblsFields = U.newHashMap(tbls.size());
fields.put(schema, tblsFields);
@@ -220,13 +234,13 @@ public class SchemaLoadApp extends Application {
List<Field> tblFields = new ArrayList<>(keys.size() + vals.size());
- tblsFields.put(type.getTableName(), tblFields);
-
for (GridCacheQueryTypeDescriptor key : keys)
tblFields.add(new Field(true, key));
for (GridCacheQueryTypeDescriptor val : vals)
tblFields.add(new Field(false, val));
+
+ tblsFields.put(type.getTableName(), FXCollections.observableList(tblFields));
}
}
@@ -241,7 +255,7 @@ public class SchemaLoadApp extends Application {
rootItem.getChildren().clear();
- for (Map.Entry<String, Map<String, List<Field>>> schema : fields.entrySet()) {
+ for (Map.Entry<String, Map<String, ObservableList<Field>>> schema : fields.entrySet()) {
CheckBoxTreeItem<String> schemaItem = new CheckBoxTreeItem<>(schema.getKey());
for (String tbl : schema.getValue().keySet())
@@ -338,10 +352,33 @@ public class SchemaLoadApp extends Application {
Collection<GridCacheQueryTypeDescriptor> vals = new ArrayList<>();
+ boolean customNaming = !dfltNamingCh.isSelected();
+
// Fill list with key and value type descriptors.
for (Field fld : tblFields) {
GridCacheQueryTypeDescriptor desc = fld.descriptor();
+ if (customNaming) {
+ String javaName = toJavaFieldName(desc.getDbName());
+
+ if (!prefix.isEmpty())
+ javaName = prefix + capitalizeFirst(javaName);
+
+ if (!suffix.isEmpty())
+ javaName += suffix;
+
+ try {
+ if (regex)
+ javaName = javaName.replaceAll(ptrn, replace);
+ }
+ catch (PatternSyntaxException e) {
+ throw new IllegalStateException("Failed to apply regexp [" + ptrn + "] to [" +
+ javaName + "]", e);
+ }
+
+ desc.setJavaName(javaName);
+ }
+
if (fld.isKey()) {
keys.add(desc);
@@ -536,14 +573,16 @@ public class SchemaLoadApp extends Application {
connPnl.addColumn(100, 100, Double.MAX_VALUE, Priority.ALWAYS);
connPnl.addColumn(35, 35, 35, Priority.NEVER);
- jdbcDrvJarTf = connPnl.addLabeled("Driver JAR:", textField());
+ jdbcDrvJarTf = connPnl.addLabeled("Driver JAR:", textField("", "Path to driver jar"));
connPnl.add(button("...", new EventHandler<ActionEvent>() {
/** {@inheritDoc} */
@Override public void handle(ActionEvent evt) {
FileChooser fc = new FileChooser();
- fc.getExtensionFilters().add(new FileChooser.ExtensionFilter("JDBC Drivers (*.jar)", "*.jar"));
+ fc.getExtensionFilters().addAll(
+ new FileChooser.ExtensionFilter("JDBC Drivers (*.jar)", "*.jar"),
+ new FileChooser.ExtensionFilter("ZIP archives (*.zip)", "*.zip"));
File drvJar = fc.showOpenDialog(owner);
@@ -552,13 +591,13 @@ public class SchemaLoadApp extends Application {
}
}));
- jdbcDrvClsTf = connPnl.addLabeled("JDBC Driver:", textField(), 2);
+ jdbcDrvClsTf = connPnl.addLabeled("JDBC Driver:", textField("", "Class name for JDBC driver"), 2);
- jdbcUrlTf = connPnl.addLabeled("URL:", textField(), 2);
+ jdbcUrlTf = connPnl.addLabeled("URL:", textField("", "URL of the database connection string"), 2);
- userTf = connPnl.addLabeled("User:", textField(), 2);
+ userTf = connPnl.addLabeled("User:", textField("", "User name"), 2);
- pwdTf = connPnl.addLabeled("Password:", new PasswordField(), 2);
+ pwdTf = connPnl.addLabeled("Password:", passwordField("User password"), 2);
connLayerPnl = stackPane(connPnl);
@@ -614,7 +653,6 @@ public class SchemaLoadApp extends Application {
ObservableList<Field> items = tbl.getItems();
items.add(selIdx - 1, items.remove(selIdx));
- curFields.add(selIdx - 1, curFields.remove(selIdx));
selMdl.select(selIdx - 1);
}
@@ -634,7 +672,6 @@ public class SchemaLoadApp extends Application {
if (selIdx < items.size() - 1) {
items.add(selIdx + 1, items.remove(selIdx));
- curFields.add(selIdx + 1, curFields.remove(selIdx));
selMdl.select(selIdx + 1);
}
@@ -661,28 +698,23 @@ public class SchemaLoadApp extends Application {
@Override public void changed(ObservableValue<? extends TreeItem<String>> val, TreeItem<String> oldItem,
TreeItem<String> newItem) {
if (newItem != null && newItem.getParent() != null && newItem.isLeaf()) {
- curFields = fields.get(newItem.getParent().getValue()).get(newItem.getValue());
-
- tbl.setItems(FXCollections.observableArrayList(curFields));
+ tbl.setItems(fields.get(newItem.getParent().getValue()).get(newItem.getValue()));
tbl.getSelectionModel().select(0);
}
else {
- tbl.setItems(noData);
+ tbl.setItems(NO_DATA);
upBtn.setDisable(true);
downBtn.setDisable(true);
}
-
}
});
genPnl.add(splitPane(tree, borderPane(null, tbl, null, null, vBox(10, upBtn, downBtn)), 0.6), 3);
- pkgTf = genPnl.addLabeled("Package:", textField());
+ pkgTf = genPnl.addLabeled("Package:", textField("", "Package that will be used for POJOs generation"), 2);
- genPnl.wrap();
-
- outFolderTf = genPnl.addLabeled("Output Folder:", textField());
+ outFolderTf = genPnl.addLabeled("Output Folder:", textField("", "Output folder for POJOs and XML files"));
genPnl.add(button("...", new EventHandler<ActionEvent>() {
/** {@inheritDoc} */
@@ -711,9 +743,15 @@ public class SchemaLoadApp extends Application {
btnNaming = button("Configure Naming", new EventHandler<ActionEvent>() {
/** {@inheritDoc} */
@Override public void handle(ActionEvent evt) {
- NamingDialog dlg = new NamingDialog(owner);
-
- dlg.showDialog();
+ NamingDialog dlg = new NamingDialog(owner, prefix, suffix, regex, ptrn, replace);
+
+ if (dlg.showDialog()) {
+ prefix = dlg.prefix();
+ suffix = dlg.suffix();
+ regex = dlg.regexp();
+ ptrn = dlg.pattern();
+ replace = dlg.replace();
+ }
}
});
@@ -724,10 +762,10 @@ public class SchemaLoadApp extends Application {
}
});
- genPnl.add(hBox(10, false, dfltNamingCh, btnNaming), 3);
+ genPnl.add(hBox(10, false, dfltNamingCh, btnNaming), 3).setAlignment(Pos.CENTER_LEFT);
openFolderCh = genPnl.add(checkBox("Reveal output folder",
- "Open output folder in system file manager after generation complete", true));
+ "Open output folder in system file manager after generation complete", true), 3);
genLayerPnl = stackPane(genPnl);
}
@@ -800,11 +838,20 @@ public class SchemaLoadApp extends Application {
// Restore generation pane settings.
outFolderTf.setText(userPrefs.get("out.folder", userHome + "/schema-load/out"));
openFolderCh.setSelected(userPrefs.getBoolean("out.folder.open", true));
+
pkgTf.setText(userPrefs.get("pojo.package", "org.apache.ignite"));
pojoIncludeKeysCh.setSelected(userPrefs.getBoolean("pojo.include", true));
pojoConstructorCh.setSelected(userPrefs.getBoolean("pojo.constructor", false));
+
xmlSingleFileCh.setSelected(userPrefs.getBoolean("xml.single", true));
+
dfltNamingCh.setSelected(userPrefs.getBoolean("naming.default", true));
+ prefix = userPrefs.get("naming.prefix", "");
+ suffix = userPrefs.get("naming.suffix", "");
+ regex = userPrefs.getBoolean("naming.regex", false);
+ ptrn = userPrefs.get("naming.pattern", "");
+ replace = userPrefs.get("naming.replace", "");
+
btnNaming.setDisable(dfltNamingCh.isSelected());
primaryStage.show();
@@ -829,11 +876,19 @@ public class SchemaLoadApp extends Application {
// Save generation pane settings.
userPrefs.put("out.folder", outFolderTf.getText());
userPrefs.putBoolean("out.folder.open", openFolderCh.isSelected());
+
userPrefs.put("pojo.package", pkgTf.getText());
userPrefs.putBoolean("pojo.include", pojoIncludeKeysCh.isSelected());
userPrefs.putBoolean("pojo.constructor", pojoConstructorCh.isSelected());
+
userPrefs.putBoolean("xml.single", xmlSingleFileCh.isSelected());
+
userPrefs.putBoolean("naming.default", dfltNamingCh.isSelected());
+ userPrefs.put("naming.prefix", prefix);
+ userPrefs.put("naming.suffix", suffix);
+ userPrefs.putBoolean("naming.regex", regex);
+ userPrefs.put("naming.pattern", ptrn);
+ userPrefs.put("naming.replace", replace);
}
/**