Repository: incubator-ignite Updated Branches: refs/heads/ignite-32 01d2d5867 -> 232c70d10
# IGNITE-32 WIP: Implemented loading driver from jar. Minor changes for GUI, POJO and XML generation. Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/232c70d1 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/232c70d1 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/232c70d1 Branch: refs/heads/ignite-32 Commit: 232c70d107738f28e7cf9aeec9e80b200941862c Parents: 01d2d58 Author: AKuznetsov <akuznet...@gridgain.com> Authored: Wed Jan 7 16:55:59 2015 +0700 Committer: AKuznetsov <akuznet...@gridgain.com> Committed: Wed Jan 7 16:55:59 2015 +0700 ---------------------------------------------------------------------- modules/schema-load/pom.xml | 1 + .../ignite/schema/db/DbMetadataParser.java | 18 +- .../org/apache/ignite/schema/ui/Controls.java | 54 ++- .../org/apache/ignite/schema/ui/GridPaneEx.java | 26 +- .../org/apache/ignite/schema/ui/MessageBox.java | 72 +++- .../apache/ignite/schema/ui/SchemaLoadApp.java | 411 ++++++++++++++----- modules/schema-load/src/test/sql/sample.sql | 14 + 7 files changed, 457 insertions(+), 139 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/232c70d1/modules/schema-load/pom.xml ---------------------------------------------------------------------- diff --git a/modules/schema-load/pom.xml b/modules/schema-load/pom.xml index 8a34b6f..6bee181 100644 --- a/modules/schema-load/pom.xml +++ b/modules/schema-load/pom.xml @@ -53,6 +53,7 @@ <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>1.3.175</version> + <scope>test</scope> </dependency> </dependencies> http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/232c70d1/modules/schema-load/src/main/java/org/apache/ignite/schema/db/DbMetadataParser.java ---------------------------------------------------------------------- diff --git a/modules/schema-load/src/main/java/org/apache/ignite/schema/db/DbMetadataParser.java b/modules/schema-load/src/main/java/org/apache/ignite/schema/db/DbMetadataParser.java index 352be7e..e9a0ee2 100644 --- a/modules/schema-load/src/main/java/org/apache/ignite/schema/db/DbMetadataParser.java +++ b/modules/schema-load/src/main/java/org/apache/ignite/schema/db/DbMetadataParser.java @@ -96,12 +96,11 @@ public class DbMetadataParser { * @param catalog Catalog name. * @param schema Schema name. * @param tbl Table name. - * @param include If {@code true} then include key fields into value fields. * @return New initialized instance of {@code GridCacheQueryTypeMetadata}. * @throws SQLException If parsing failed. */ - private static GridCacheQueryTypeMetadata parse(DatabaseMetaData meta, String catalog, String schema, String tbl, - boolean include) throws SQLException { + private static GridCacheQueryTypeMetadata parse(DatabaseMetaData meta, String catalog, String schema, String tbl) + throws SQLException { GridCacheQueryTypeMetadata res = new GridCacheQueryTypeMetadata(); res.setSchema(schema); @@ -135,12 +134,8 @@ public class DbMetadataParser { GridCacheQueryTypeDescriptor desc = new GridCacheQueryTypeDescriptor(javaName, javaType, dbName, dbType); - if (pkFlds.contains(dbName)) { + if (pkFlds.contains(dbName)) keyDescs.add(desc); - - if (include) - valDescs.add(desc); - } else valDescs.add(desc); @@ -184,12 +179,11 @@ public class DbMetadataParser { * Parse database metadata. * * @param conn Connection to database. - * @param include If {@code true} then include key fields into value fields. * @return Map with schemes and tables metadata. * @throws SQLException If parsing failed. */ - public static LinkedHashMap<String, LinkedHashMap<String, GridCacheQueryTypeMetadata>> parse(Connection conn, - boolean include) throws SQLException { + public static LinkedHashMap<String, LinkedHashMap<String, GridCacheQueryTypeMetadata>> parse(Connection conn) + throws SQLException { DatabaseMetaData meta = conn.getMetaData(); LinkedHashMap<String, LinkedHashMap<String, GridCacheQueryTypeMetadata>> res = new LinkedHashMap<>(); @@ -205,7 +199,7 @@ public class DbMetadataParser { while (tbls.next()) { String tbl = tbls.getString(3); - items.put(tbl, parse(meta, catalog, schema, tbl, include)); + items.put(tbl, parse(meta, catalog, schema, tbl)); } } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/232c70d1/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 edec0b8..0de9898 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 @@ -6,6 +6,7 @@ import javafx.event.*; import javafx.geometry.*; import javafx.scene.*; import javafx.scene.control.*; +import javafx.scene.control.cell.*; import javafx.scene.image.*; import javafx.scene.layout.*; import javafx.scene.text.*; @@ -30,12 +31,14 @@ public class Controls { * Create new {@code HBox} with default padding. * * @param spacing Amount of horizontal space between each child. + * @param dfltPadding If {@code true} than set default padding for pane. * @return New {@code HBox} instance. */ - public static HBox hBox(int spacing) { + public static HBox hBox(int spacing, boolean dfltPadding) { HBox hb = new HBox(spacing); - hb.setPadding(DFLT_PADDING); + if (dfltPadding) + hb.setPadding(DFLT_PADDING); return hb; } @@ -44,11 +47,12 @@ public class Controls { * Create new {@code HBox} with default padding and add controls. * * @param spacing Amount of horizontal space between each child. + * @param dfltPadding If {@code true} than set default padding for pane. * @param controls Controls to add. * @return New {@code HBox} instance. */ - public static HBox hBox(int spacing, Node... controls) { - HBox hb = hBox(spacing); + public static HBox hBox(int spacing, boolean dfltPadding, Node... controls) { + HBox hb = hBox(spacing, dfltPadding); hb.getChildren().addAll(controls); @@ -134,6 +138,7 @@ public class Controls { */ public static Text text(String text, int wrap) { Text t = new Text(text); + t.setFont(new Font(14)); t.setWrappingWidth(wrap); @@ -141,6 +146,47 @@ public class Controls { } /** + * Create split pane for provided nodes. + * + * @param node1 First node. + * @param node2 Second node. + * @param pos Initial divider position. + * @return New split pane instance. + */ + public static SplitPane splitPane(Node node1, Node node2, double pos) { + SplitPane sp = new SplitPane(); + + sp.setOrientation(Orientation.VERTICAL); + sp.getItems().addAll(node1, node2); + sp.setDividerPosition(0, pos); + + return sp; + } + + /** + * Create table column. + * + * @param colName Column name to display. + * @param propName Property name column is bound to. + * @param minWidth The minimum width column is permitted to be resized to. + * @param maxWidth The maximum width column is permitted to be resized to. + * @return New table column instance. + */ + public static <S, T> TableColumn<S, T> tableColumn(String colName, String propName, int minWidth, int maxWidth) { + TableColumn<S, T> col = new TableColumn<>(colName); + + if (minWidth > 0) + col.setMinWidth(minWidth); + + if (maxWidth > 0) + col.setMaxWidth(maxWidth); + + col.setCellValueFactory(new PropertyValueFactory<S, T>(propName)); + + return col; + } + + /** * Create image view. * * @param imgFileName Image filename. http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/232c70d1/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 3dfe975..6d847ce 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 @@ -76,6 +76,16 @@ public class GridPaneEx extends GridPane { } /** + * Add default rows. + * + * @param n Number of rows to add. + */ + public void addRows(int n) { + for (int i = 0; i < n; i++) + addRow(); + } + + /** * Add row with constraints and vertical grow priority for the row. * * @param min Row minimum size. @@ -140,11 +150,23 @@ public class GridPaneEx extends GridPane { * * @param text Label text. * @param ctrl Control to add. + * @param span How many columns control should take. * @return Added control. */ - public <T extends Node> T addLabeled(String text, T ctrl) { + public <T extends Node> T addLabeled(String text, T ctrl, int span) { add(new Label(text)); - return add(ctrl); + return add(ctrl, span); + } + + /** + * Add control with label. + * + * @param text Label text. + * @param ctrl Control to add. + * @return Added control. + */ + public <T extends Node> T addLabeled(String text, T ctrl) { + return addLabeled(text, ctrl, 1); } } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/232c70d1/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 151fe13..dfd48bf 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 @@ -14,6 +14,18 @@ import static org.apache.ignite.schema.ui.Controls.*; * Message box functionality. */ public class MessageBox extends Stage { + /** Message box type. */ + private enum MessageType { + /** Information. */ + INFO, + /** Warning. */ + WARN, + /** Error. */ + ERROR, + /** Confirm. */ + CONFIRM + } + /** Return value if YES is chosen. */ public static final int YES_OPTION = 0; /** Return value if NO is chosen. */ @@ -28,23 +40,45 @@ public class MessageBox extends Stage { * Create message box. * * @param owner Owner window. - * @param title Title text. + * @param type Message box type. * @param msg Message to show. - * @param iconFile Message icon. - * @param yesNo If {@code true} show "yes" and "no" buttons - * otherwise show "ok" button. */ - private MessageBox(Stage owner, String title, String msg, String iconFile, boolean yesNo) { + private MessageBox(Stage owner, MessageType type, String msg) { + String title; + String iconFile; + + switch (type) { + case WARN: + title = "Warning"; + iconFile = "sign_warning"; + break; + + case ERROR: + title = "Error"; + iconFile = "error"; + break; + + case CONFIRM: + title = "Confirmation"; + iconFile = "question"; + break; + + default: + title = "Information"; + iconFile = "information"; + break; + } + setTitle(title); initStyle(StageStyle.UTILITY); initModality(Modality.APPLICATION_MODAL); initOwner(owner); setResizable(false); - HBox btns = hBox(10); + HBox btns = hBox(10, true); btns.setAlignment(Pos.CENTER); - if (yesNo) { + if (type == MessageType.CONFIRM) { res = NO_OPTION; btns.getChildren().addAll(button("Yes", new EventHandler<ActionEvent>() { @@ -68,7 +102,7 @@ public class MessageBox extends Stage { } })); - setScene(new Scene(vBox(10, hBox(10, imageView(iconFile, 48), text(msg, 250)), btns))); + setScene(new Scene(vBox(10, hBox(10, true, imageView(iconFile, 48), text(msg, 250)), btns))); } /** @@ -86,15 +120,12 @@ public class MessageBox extends Stage { * Show message in modal dialog. * * @param owner Owner window. - * @param title Title text. + * @param type Message box type. * @param msg Message to show. - * @param iconFile Message icon. - * @param yesNo If {@code true} show "yes" and "no" buttons - * otherwise show "ok" button. * @return Option selected by the user. */ - private static int showDialog(Stage owner, String title, String msg, String iconFile, boolean yesNo) { - MessageBox dlg = new MessageBox(owner, title, msg, iconFile, yesNo); + private static int showDialog(Stage owner, MessageType type, String msg) { + MessageBox dlg = new MessageBox(owner, type, msg); dlg.showDialog(); @@ -109,7 +140,7 @@ public class MessageBox extends Stage { * @return Option selected by the user. */ public static int confirmDialog(Stage owner, String msg) { - return showDialog(owner, "Confirmation", msg, "question", true); + return showDialog(owner, MessageType.CONFIRM, msg); } /** @@ -119,7 +150,7 @@ public class MessageBox extends Stage { * @param msg Message to show. */ public static void informationDialog(Stage owner, String msg) { - showDialog(owner, "Information", msg, "information", false); + showDialog(owner, MessageType.INFO, msg); } /** @@ -129,7 +160,7 @@ public class MessageBox extends Stage { * @param msg Message to show. */ public static void warningDialog(Stage owner, String msg) { - showDialog(owner, "Warning", msg, "sign_warning", false); + showDialog(owner, MessageType.WARN, msg); } @@ -137,9 +168,10 @@ public class MessageBox extends Stage { * Show error dialog. * * @param owner Owner window. - * @param msg Message to show. + * @param msg Error message to show. + * @param e Optional exception to show. */ - public static void errorDialog(Stage owner, String msg) { - showDialog(owner, "Error", msg, "error", false); + public static void errorDialog(Stage owner, String msg, Throwable e) { + showDialog(owner, MessageType.ERROR, (e != null && e.getMessage() != null) ? msg + "\n" + e.getMessage() : msg); } } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/232c70d1/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 4f162bf..148cfb3 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 @@ -3,6 +3,9 @@ package org.apache.ignite.schema.ui; import javafx.application.*; +import javafx.beans.property.*; +import javafx.beans.value.*; +import javafx.collections.*; import javafx.event.*; import javafx.geometry.*; import javafx.scene.*; @@ -10,14 +13,17 @@ import javafx.scene.control.*; import javafx.scene.control.cell.*; import javafx.scene.image.*; import javafx.scene.layout.*; -import javafx.scene.text.*; import javafx.stage.*; +import javafx.util.*; import org.apache.ignite.schema.db.*; import org.apache.ignite.schema.pojo.*; import org.apache.ignite.schema.xml.*; import org.gridgain.grid.cache.query.*; +import org.gridgain.grid.util.typedef.*; +import org.gridgain.grid.util.typedef.internal.*; import java.io.*; +import java.net.*; import java.sql.*; import java.util.*; @@ -28,6 +34,102 @@ import static org.apache.ignite.schema.ui.Controls.*; * Schema load application. */ public class SchemaLoadApp extends Application { + /** + * Field descriptor. + */ + @SuppressWarnings("PublicInnerClass") + public static class Field { + /** If this field belongs to primary key. */ + private final BooleanProperty key; + + /** Field name for POJO. */ + private final StringProperty javaName; + + /** Field name in database. */ + private final StringProperty dbName; + + /** Field type descriptor. */ + private final GridCacheQueryTypeDescriptor desc; + + /** + * @param key {@code true} if this field belongs to primary key. + * @param desc Field type descriptor. + */ + private Field(boolean key, GridCacheQueryTypeDescriptor desc) { + this.desc = desc; + this.key = new SimpleBooleanProperty(key); + javaName = new SimpleStringProperty(desc.getJavaName()); + dbName = new SimpleStringProperty(desc.getDbName()); + } + + /** + * @return {@code true} if this field belongs to primary key. + */ + public boolean isKey() { + return key.get(); + } + + /** + * @param pk {@code true} if this field belongs to primary key. + */ + public void setKey(boolean pk) { + key.set(pk); + } + + /** + * @return Field name of corresponding POJO. + */ + public String getJavaName() { + return javaName.get(); + } + + /** + * @param name Field name of corresponding POJO. + */ + public void setJavaName(String name) { + desc.setJavaName(name); + + javaName.set(name); + } + + /** + * @return Field name in database. + */ + public String getDbName() { + return dbName.get(); + } + + /** + * @param name Field name in database. + */ + public void setDbName(String name) { + desc.setDbName(name); + + dbName.set(name); + } + + /** + * @return Boolean property support for {@code key} property. + */ + public BooleanProperty keyProperty() { + return key; + } + + /** + * @return String property support for {@code javaName} property. + */ + public StringProperty javaNameProperty() { + return javaName; + } + + /** + * @return String property support for {@code dbName} property. + */ + public StringProperty dbNameProperty() { + return dbName; + } + } + /** TODO: IGNITE 32 remove before release */ private static final String PATH = "C:/Temp/ignite"; @@ -50,6 +152,9 @@ public class SchemaLoadApp extends Application { private TextField jdbcTf; /** */ + private TextField drvTf; + + /** */ private TextField urlTf; /** */ @@ -65,6 +170,9 @@ public class SchemaLoadApp extends Application { private CheckBoxTreeItem<String> rootItem; /** */ + private TableView<Field> tbl; + + /** */ private TextField pkgTf; /** */ @@ -74,7 +182,7 @@ public class SchemaLoadApp extends Application { private CheckBox pojoConstructorCh; /** */ - private CheckBox pojoSeparateKeyCh; + private CheckBox pojoIncludeKeysCh; /** */ private CheckBox xmlSingleFileCh; @@ -82,6 +190,18 @@ public class SchemaLoadApp extends Application { /** */ private GridPaneEx genPnl; + /** */ + private LinkedHashMap<String, LinkedHashMap<String, GridCacheQueryTypeMetadata>> metas; + + /** */ + private Map<String, Map<String, Collection<Field>>> fields; + + /** */ + private final ObservableList<Field> noData = FXCollections.emptyObservableList(); + + /** */ + private final Map<String, Driver> drivers = new HashMap<>(); + /** * Fill tree with database metadata. */ @@ -89,41 +209,50 @@ public class SchemaLoadApp extends Application { rootItem.getChildren().clear(); try { - String driver = jdbcTf.getText(); - - try { - Class.forName(driver); + try (Connection conn = connect()) { + metas = DbMetadataParser.parse(conn); } - catch (Throwable e) { - MessageBox.errorDialog(owner, "Failed to load JDBC driver: " + e.getMessage()); - return false; - } + fields = U.newHashMap(metas.size()); - try (Connection conn = DriverManager.getConnection(urlTf.getText(), userTf.getText(), pwdTf.getText())) { - DatabaseMetaData meta = conn.getMetaData(); + for (Map.Entry<String, LinkedHashMap<String, GridCacheQueryTypeMetadata>> meta : metas.entrySet()) { + String schema = meta.getKey(); - try (ResultSet schemas = meta.getSchemas()) { - while(schemas.next()) { - String schema = schemas.getString(1); - String catalog = schemas.getString(2); + LinkedHashMap<String, GridCacheQueryTypeMetadata> tbls = meta.getValue(); - CheckBoxTreeItem<String> schemaItem = new CheckBoxTreeItem<>(schema); + Map<String, Collection<Field>> tblsFields = U.newHashMap(tbls.size()); - rootItem.getChildren().add(schemaItem); + fields.put(schema, tblsFields); - try (ResultSet tbls = meta.getTables(catalog, schema, "%", null)) { - while(tbls.next()) - schemaItem.getChildren().add(new CheckBoxTreeItem<>(tbls.getString(3))); - } - } + CheckBoxTreeItem<String> schemaItem = new CheckBoxTreeItem<>(schema); + + rootItem.getChildren().add(schemaItem); + + for(Map.Entry<String, GridCacheQueryTypeMetadata> tbl : tbls.entrySet()) { + GridCacheQueryTypeMetadata type = tbl.getValue(); + + Collection<GridCacheQueryTypeDescriptor> keys = type.getKeyDescriptors(); + + Collection<GridCacheQueryTypeDescriptor> vals = type.getValueDescriptors(); + + Collection<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)); + + schemaItem.getChildren().add(new CheckBoxTreeItem<>(tbl.getKey())); } } return true; } catch (Throwable e) { - MessageBox.errorDialog(owner, "Failed to get tables list: " + e.getMessage()); + MessageBox.errorDialog(owner, "Failed to get tables list from database.", e); return false; } @@ -139,21 +268,25 @@ public class SchemaLoadApp extends Application { File destFolder = new File(outFolder); - List<GridCacheQueryTypeMetadata> all = new ArrayList<>(); - - LinkedHashMap<String, LinkedHashMap<String, GridCacheQueryTypeMetadata>> metas; + if (!destFolder.exists() && !destFolder.mkdirs()) + throw new IOException("Failed to create output folder: " + destFolder); - try (Connection conn = DriverManager.getConnection(urlTf.getText(), userTf.getText(), pwdTf.getText())) { - metas = DbMetadataParser.parse(conn, pojoSeparateKeyCh.isSelected()); - } + List<GridCacheQueryTypeMetadata> all = new ArrayList<>(); boolean constructor = pojoConstructorCh.isSelected(); + boolean include = pojoIncludeKeysCh.isSelected(); for (TreeItem<String> schemeItem : rootItem.getChildren()) { for (TreeItem<String> tblItem : schemeItem.getChildren()) { if (((CheckBoxTreeItem)tblItem).isSelected()) { GridCacheQueryTypeMetadata meta = metas.get(schemeItem.getValue()).get(tblItem.getValue()); + if (include) { + meta = new GridCacheQueryTypeMetadata(meta); + + meta.setValueDescriptors(F.concat(false, meta.getKeyDescriptors(), meta.getValueDescriptors())); + } + all.add(meta); XmlTransformer.transform(pkg, meta, new File(destFolder, meta.getType() + ".xml")); @@ -173,7 +306,7 @@ public class SchemaLoadApp extends Application { } } catch (Throwable e) { - MessageBox.errorDialog(owner, "Generation failed: " + e.getMessage()); + MessageBox.errorDialog(owner, "Generation failed.", e); } } @@ -181,7 +314,7 @@ public class SchemaLoadApp extends Application { * @return Header pane with title label. */ private Pane createHeaderPane() { - HBox hb = hBox(0); + HBox hb = hBox(0, true); titleLb = new Label(""); titleLb.setId("banner"); @@ -208,9 +341,8 @@ public class SchemaLoadApp extends Application { } }); - HBox hb = hBox(10); + HBox hb = hBox(10, true, prevBtn, nextBtn); hb.setAlignment(Pos.BOTTOM_RIGHT); - hb.getChildren().addAll(prevBtn, nextBtn); return hb; } @@ -248,6 +380,57 @@ public class SchemaLoadApp extends Application { } /** + * Connect to database. + * + * @return Connection to database. + * @throws SQLException if connection failed. + */ + private Connection connect() throws SQLException { + String drvCls = jdbcTf.getText(); + + Driver drv = drivers.get(drvCls); + + if (drv == null) { + String path = drvTf.getText().trim(); + + if (path.isEmpty()) + throw new IllegalStateException("Driver jar file name is not specified"); + + File drvJar = new File(drvTf.getText()); + + if (!drvJar.exists()) + throw new IllegalStateException("Driver jar file is not found"); + + try { + URL u = new URL("jar:" + drvJar.toURI() + "!/"); + + URLClassLoader ucl = URLClassLoader.newInstance(new URL[] { u }); + + drv = (Driver)Class.forName(drvCls, true, ucl).newInstance(); + + drivers.put(drvCls, drv); + } + catch (Throwable e) { + throw new IllegalStateException(e); + } + } + + String user = userTf.getText().trim(); + + String pwd = pwdTf.getText().trim(); + + Properties info = new Properties(); + + if (!user.isEmpty()) + info.put("user", user); + + if (!pwd.isEmpty()) + info.put("password", pwd); + + return drv.connect(urlTf.getText(), info); + } + + /** * Create connection pane with controls. */ private void createConnectionPane() { @@ -255,19 +438,35 @@ public class SchemaLoadApp extends Application { connPnl.addColumn(); connPnl.addColumn(100, 100, Double.MAX_VALUE, Priority.ALWAYS); + connPnl.addColumn(35, 35, 35, Priority.NEVER); + + drvTf = connPnl.addLabeled("Driver JAR:", textField()); + drvTf.setText("C:/GridGain/h2/bin/h2-1.3.176.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")); + + File drvJar = fc.showOpenDialog(owner); - jdbcTf = connPnl.addLabeled("JDBC Driver:", textField()); + if (drvJar != null) + drvTf.setText(drvJar.getAbsolutePath()); + } + })); + + jdbcTf = connPnl.addLabeled("JDBC Driver:", textField(), 2); jdbcTf.setText("org.h2.Driver"); - urlTf = connPnl.addLabeled("URL:", textField()); - urlTf.setText("jdbc:h2:mem:test"); + urlTf = connPnl.addLabeled("URL:", textField(), 2); + urlTf.setText("jdbc:h2:c:/Temp/test"); - userTf = connPnl.addLabeled("User:", textField()); + userTf = connPnl.addLabeled("User:", textField(), 2); userTf.setText("sa"); - pwdTf = connPnl.addLabeled("Password:", new PasswordField()); - - connPnl.add(new Text("Put JDBC driver jar file into '/drivers' folder."), 2); + pwdTf = connPnl.addLabeled("Password:", new PasswordField(), 2); } /** @@ -281,32 +480,49 @@ public class SchemaLoadApp extends Application { genPnl.addColumn(35, 35, 35, Priority.NEVER); genPnl.addRow(100, 100, Double.MAX_VALUE, Priority.ALWAYS); - genPnl.addRow(100, 100, 100, Priority.NEVER); - genPnl.addRow(); - genPnl.addRow(); - genPnl.addRow(); - genPnl.addRow(); - genPnl.addRow(); + genPnl.addRows(6); rootItem = new CheckBoxTreeItem<>("Database"); rootItem.setExpanded(true); TreeView<String> tree = new TreeView<>(rootItem); + tree.setCellFactory(CheckBoxTreeCell.<String>forTreeView()); - genPnl.add(tree, 3); + tree.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<TreeItem<String>>() { + /** {@inheritDoc} */ + @Override public void changed(ObservableValue<? extends TreeItem<String>> val, TreeItem<String> oldItem, + TreeItem<String> newItem) { + onTreeSelectionChanged(newItem); + } + }); - TableView<String> tbl = new TableView<>(); + TableColumn<Field, Boolean> keyCol = tableColumn("Key", "key", 70, 70); - TableColumn<String, Boolean> keyCol = new TableColumn<>("Key"); - TableColumn<String, String> dbNameCol = new TableColumn<>("DB Name"); - TableColumn<String, String> javaNameCol = new TableColumn<>("Ignite Name"); + keyCol.setCellFactory(new Callback<TableColumn<Field, Boolean>, TableCell<Field, Boolean>>() { + /** {@inheritDoc} */ + @Override public TableCell<Field, Boolean> call(TableColumn<Field, Boolean> col) { + CheckBoxTableCell<Field, Boolean> cell = new CheckBoxTableCell<>(); - tbl.getColumns().addAll(keyCol, dbNameCol, javaNameCol); + cell.setAlignment(Pos.CENTER); + + return cell; + } + }); + + keyCol.setEditable(true); + + TableColumn<Field, String> dbNameCol = tableColumn("DB Name", "dbName", 0, 0); + + TableColumn<Field, String> javaNameCol = tableColumn("Ignite Name", "javaName", 0, 0); + tbl = new TableView<>(); + + tbl.getColumns().addAll(keyCol, dbNameCol, javaNameCol); tbl.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); + tbl.setEditable(true); - genPnl.add(tbl, 3); + genPnl.add(splitPane(tree, tbl, 0.6), 3); pkgTf = genPnl.addLabeled("Package:", textField()); pkgTf.setText("org.apache.ignite"); @@ -317,6 +533,7 @@ public class SchemaLoadApp extends Application { outFolderTf.setText(PATH); genPnl.add(button("...", new EventHandler<ActionEvent>() { + /** {@inheritDoc} */ @Override public void handle(ActionEvent evt) { DirectoryChooser dc = new DirectoryChooser(); @@ -327,19 +544,55 @@ public class SchemaLoadApp extends Application { } })); - pojoSeparateKeyCh = genPnl.add(checkBox("Include key fields into value POJOs", + pojoIncludeKeysCh = genPnl.add(checkBox("Include key fields into value POJOs", "If selected then include key fields into value object", true), 3); pojoConstructorCh = genPnl.add(checkBox("Generate constructors for POJOs", "If selected then generate empty and full constructors for POJOs", false), 3); - xmlSingleFileCh = genPnl.add(checkBox("Write all configurations to a single file", "" + + xmlSingleFileCh = genPnl.add(checkBox("Write all configurations to a single file", "If selected then all configurations will be saved into the file 'ignite.xml'", true), 3); + + final CheckBox dfltNamingCh = checkBox("Default naming conversions", + "If selected then DB names will be converted to default java names", true); + + final Button btnNaming = button("Configure Naming", new EventHandler<ActionEvent>() { + /** {@inheritDoc} */ + @Override public void handle(ActionEvent evt) { + MessageBox.informationDialog(owner, "TODO: implement."); + } + }); + + btnNaming.setDisable(true); + + dfltNamingCh.setOnAction(new EventHandler<ActionEvent>() { + /** {@inheritDoc} */ + @Override public void handle(ActionEvent evt) { + btnNaming.setDisable(dfltNamingCh.isSelected()); + } + }); + + genPnl.add(hBox(10, false, dfltNamingCh, btnNaming), 3); } + /** + * Action on tree selection changed. + * + * @param item Selected tree item. + */ + private void onTreeSelectionChanged(TreeItem<String> item) { + if (item != null && item.getParent() != null && item.isLeaf()) + tbl.setItems(FXCollections.observableArrayList( + fields.get(item.getParent().getValue()).get(item.getValue()))); + else + tbl.setItems(noData); + } /** {@inheritDoc} */ @Override public void start(Stage primaryStage) { + System.setProperty("prism.lcdtext", "false"); + System.setProperty("prism.text", "t2k"); + owner = primaryStage; primaryStage.setTitle("Schema Load"); @@ -384,7 +637,7 @@ public class SchemaLoadApp extends Application { primaryStage.setWidth(w); primaryStage.setMinWidth(w); - int h = 540; + int h = 600; primaryStage.setHeight(h); primaryStage.setMinHeight(h); @@ -395,54 +648,10 @@ public class SchemaLoadApp extends Application { /** * Schema load utility launcher. - */ - private static void sampleDb() { - // TODO: IGNITE 32 remove before release - try { - Class.forName("org.h2.Driver"); - - try (Connection conn = DriverManager.getConnection("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1", "sa", "")) { - try (Statement stmt = conn.createStatement()) { - stmt.executeUpdate("CREATE TABLE IF NOT EXISTS Organization(" + - "id integer primary key, name varchar(50), city varchar(50))"); - stmt.executeUpdate("CREATE TABLE IF NOT EXISTS Person(" + - "id integer primary key, org_id integer, name varchar(50))"); - - stmt.executeUpdate("CREATE INDEX IF NOT EXISTS Org_Name_IDX On Organization (name)"); - stmt.executeUpdate("CREATE INDEX IF NOT EXISTS Org_Name_City_IDX On Organization (name, city)"); - stmt.executeUpdate("CREATE INDEX IF NOT EXISTS Person_Name_IDX1 On Person (name)"); - stmt.executeUpdate("CREATE INDEX IF NOT EXISTS Person_Name_IDX2 On Person (name desc)"); - - conn.commit(); - - try { - stmt.executeUpdate("INSERT INTO Organization(id, name, city) VALUES (1, 'Test1', 'Test2')"); - stmt.executeUpdate("INSERT INTO Organization(id, name, city) VALUES (2, 'Test3'), 'Test4'"); - - stmt.executeUpdate("INSERT INTO Person(id, org_id, name) VALUES (1, 1, 'Test5')"); - stmt.executeUpdate("INSERT INTO Person(id, org_id, name) VALUES (2, 2, 'Test6')"); - - conn.commit(); - } - catch (SQLException ignore) { - // No-op. - } - } - } - } - catch (Throwable e) { - e.printStackTrace(); - } - } - - /** - * Schema load utility launcher. * * @param args Command line arguments passed to the application. */ public static void main(String[] args) { - sampleDb(); - launch(args); } } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/232c70d1/modules/schema-load/src/test/sql/sample.sql ---------------------------------------------------------------------- diff --git a/modules/schema-load/src/test/sql/sample.sql b/modules/schema-load/src/test/sql/sample.sql new file mode 100644 index 0000000..c9f02d7 --- /dev/null +++ b/modules/schema-load/src/test/sql/sample.sql @@ -0,0 +1,14 @@ +-- Script to create sample H2 database. +CREATE TABLE IF NOT EXISTS Organization(id integer primary key, name varchar(50), city varchar(50)); +CREATE TABLE IF NOT EXISTS Person(id integer primary key, org_id integer, name varchar(50)); + +CREATE INDEX IF NOT EXISTS Org_Name_IDX On Organization (name); +CREATE INDEX IF NOT EXISTS Org_Name_City_IDX On Organization (name, city); +CREATE INDEX IF NOT EXISTS Person_Name_IDX1 On Person (name); +CREATE INDEX IF NOT EXISTS Person_Name_IDX2 On Person (name desc); + +INSERT INTO Organization(id, name, city) VALUES (1, 'Test1', 'Test2'); +INSERT INTO Organization(id, name, city) VALUES (2, 'Test3', 'Test4'); + +INSERT INTO Person(id, org_id, name) VALUES (1, 1, 'Test5'); +INSERT INTO Person(id, org_id, name) VALUES (2, 2, 'Test6');