http://git-wip-us.apache.org/repos/asf/ignite/blob/bd50bdf8/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 4f419e6..cbcddc2 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 @@ -22,16 +22,11 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; -import java.net.URL; -import java.net.URLClassLoader; import java.sql.Connection; -import java.sql.Driver; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.Properties; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -45,6 +40,7 @@ import javafx.beans.value.ObservableValue; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.concurrent.Task; +import javafx.embed.swing.SwingFXUtils; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.Insets; @@ -81,34 +77,7 @@ import org.apache.ignite.schema.model.PojoDescriptor; import org.apache.ignite.schema.model.PojoField; import org.apache.ignite.schema.model.SchemaDescriptor; import org.apache.ignite.schema.parser.DatabaseMetadataParser; - -import static javafx.embed.swing.SwingFXUtils.fromFXImage; -import static org.apache.ignite.schema.ui.Controls.booleanColumn; -import static org.apache.ignite.schema.ui.Controls.borderPane; -import static org.apache.ignite.schema.ui.Controls.button; -import static org.apache.ignite.schema.ui.Controls.buttonsPane; -import static org.apache.ignite.schema.ui.Controls.checkBox; -import static org.apache.ignite.schema.ui.Controls.comboBox; -import static org.apache.ignite.schema.ui.Controls.customColumn; -import static org.apache.ignite.schema.ui.Controls.hBox; -import static org.apache.ignite.schema.ui.Controls.image; -import static org.apache.ignite.schema.ui.Controls.imageView; -import static org.apache.ignite.schema.ui.Controls.label; -import static org.apache.ignite.schema.ui.Controls.list; -import static org.apache.ignite.schema.ui.Controls.paneEx; -import static org.apache.ignite.schema.ui.Controls.passwordField; -import static org.apache.ignite.schema.ui.Controls.progressIndicator; -import static org.apache.ignite.schema.ui.Controls.scene; -import static org.apache.ignite.schema.ui.Controls.splitPane; -import static org.apache.ignite.schema.ui.Controls.stackPane; -import static org.apache.ignite.schema.ui.Controls.tableColumn; -import static org.apache.ignite.schema.ui.Controls.tableView; -import static org.apache.ignite.schema.ui.Controls.text; -import static org.apache.ignite.schema.ui.Controls.textColumn; -import static org.apache.ignite.schema.ui.Controls.textField; -import static org.apache.ignite.schema.ui.Controls.titledPane; -import static org.apache.ignite.schema.ui.Controls.tooltip; -import static org.apache.ignite.schema.ui.Controls.vBox; +import org.apache.ignite.schema.parser.DbMetadataReader; /** * Schema Import utility application. @@ -117,68 +86,6 @@ import static org.apache.ignite.schema.ui.Controls.vBox; public class SchemaImportApp extends Application { /** Logger. */ private static final Logger log = Logger.getLogger(SchemaImportApp.class.getName()); - - /** Presets for database settings. */ - private static class Preset { - /** Name in preferences. */ - private String pref; - - /** RDBMS name to show on screen. */ - private String name; - - /** Path to JDBC driver jar. */ - private String jar; - - /** JDBC driver class name. */ - private String drv; - - /** JDBC URL. */ - private String url; - - /** User name. */ - private String user; - - /** - * Preset constructor. - * - * @param pref Name in preferences. - * @param name RDBMS name to show on screen. - * @param jar Path to JDBC driver jar.. - * @param drv JDBC driver class name. - * @param url JDBC URL. - * @param user User name. - */ - Preset(String pref, String name, String jar, String drv, String url, String user) { - this.pref = pref; - this.name = name; - this.jar = jar; - this.drv = drv; - this.url = url; - this.user = user; - } - - /** {@inheritDoc} */ - @Override public String toString() { - return name; - } - } - - /** Default presets for popular databases. */ - private final Preset[] presets = { - new Preset("h2", "H2 Database", "h2.jar", "org.h2.Driver", "jdbc:h2:[database]", "sa"), - new Preset("db2", "DB2", "db2jcc4.jar", "com.ibm.db2.jcc.DB2Driver", "jdbc:db2://[host]:[port]/[database]", - "db2admin"), - new Preset("oracle", "Oracle", "ojdbc6.jar", "oracle.jdbc.OracleDriver", - "jdbc:oracle:thin:@[host]:[port]:[database]", "system"), - new Preset("mysql", "MySQL", "mysql-connector-java-5-bin.jar", "com.mysql.jdbc.Driver", - "jdbc:mysql://[host]:[port]/[database]", "root"), - new Preset("mssql", "Microsoft SQL Server", "sqljdbc41.jar", "com.microsoft.sqlserver.jdbc.SQLServerDriver", - "jdbc:sqlserver://[host]:[port][;databaseName=database]", "sa"), - new Preset("postgresql", "PostgreSQL", "postgresql-9.3.jdbc4.jar", "org.postgresql.Driver", - "jdbc:postgresql://[host]:[port]/[database]", "sa"), - new Preset("custom", "Custom server...", "custom-jdbc.jar", "org.custom.Driver", "jdbc:custom", "sa") - }; - /** */ private static final String PREF_WINDOW_X = "window.x"; /** */ @@ -187,7 +94,6 @@ public class SchemaImportApp extends Application { private static final String PREF_WINDOW_WIDTH = "window.width"; /** */ private static final String PREF_WINDOW_HEIGHT = "window.height"; - /** */ private static final String PREF_JDBC_DB_PRESET = "jdbc.db.preset"; /** */ @@ -198,151 +104,154 @@ public class SchemaImportApp extends Application { private static final String PREF_JDBC_URL = "jdbc.url"; /** */ private static final String PREF_JDBC_USER = "jdbc.user"; - /** */ private static final String PREF_OUT_FOLDER = "out.folder"; - /** */ private static final String PREF_POJO_PACKAGE = "pojo.package"; /** */ private static final String PREF_POJO_INCLUDE = "pojo.include"; /** */ private static final String PREF_POJO_CONSTRUCTOR = "pojo.constructor"; - /** */ private static final String PREF_XML_SINGLE = "xml.single"; - /** */ private static final String PREF_NAMING_PATTERN = "naming.pattern"; /** */ private static final String PREF_NAMING_REPLACE = "naming.replace"; + /** Empty POJO fields model. */ + private static final ObservableList<PojoField> NO_FIELDS = FXCollections.emptyObservableList(); + /** Default presets for popular databases. */ + private final Preset[] presets = { + new Preset("h2", "H2 Database", "h2.jar", "org.h2.Driver", "jdbc:h2:[database]", "sa"), + new Preset("db2", "DB2", "db2jcc4.jar", "com.ibm.db2.jcc.DB2Driver", "jdbc:db2://[host]:[port]/[database]", + "db2admin"), + new Preset("oracle", "Oracle", "ojdbc6.jar", "oracle.jdbc.OracleDriver", + "jdbc:oracle:thin:@[host]:[port]:[database]", "system"), + new Preset("mysql", "MySQL", "mysql-connector-java-5-bin.jar", "com.mysql.jdbc.Driver", + "jdbc:mysql://[host]:[port]/[database]", "root"), + new Preset("mssql", "Microsoft SQL Server", "sqljdbc41.jar", "com.microsoft.sqlserver.jdbc.SQLServerDriver", + "jdbc:sqlserver://[host]:[port][;databaseName=database]", "sa"), + new Preset("postgresql", "PostgreSQL", "postgresql-9.3.jdbc4.jar", "org.postgresql.Driver", + "jdbc:postgresql://[host]:[port]/[database]", "sa"), + new Preset("custom", "Custom server...", "custom-jdbc.jar", "org.custom.Driver", "jdbc:custom", "sa") + }; + /** Application preferences. */ + private final Properties prefs = new Properties(); + /** File path for storing on local file system. */ + private final File prefsFile = new File(System.getProperty("user.home"), ".ignite-schema-import"); + /** */ + private final ExecutorService exec = Executors.newSingleThreadExecutor(new ThreadFactory() { + @Override public Thread newThread(Runnable r) { + Thread t = new Thread(r, "ignite-schema-import-worker"); + + t.setDaemon(true); + return t; + } + }); /** */ private Stage owner; - /** */ private BorderPane rootPane; - /** Header pane. */ private BorderPane hdrPane; - /** */ private HBox dbIcon; - /** */ private HBox genIcon; - /** */ private Label titleLb; - /** */ private Label subTitleLb; - /** */ private Button prevBtn; - /** */ private Button nextBtn; - /** */ private ComboBox<Preset> rdbmsCb; - /** */ private TextField jdbcDrvJarTf; - /** */ private TextField jdbcDrvClsTf; - /** */ private TextField jdbcUrlTf; - /** */ private TextField userTf; - /** */ private PasswordField pwdTf; - /** */ private ComboBox<String> parseCb; - /** */ private ListView<SchemaDescriptor> schemaLst; - /** */ private GridPaneEx connPnl; - /** */ private StackPane connLayerPnl; - /** */ private TableView<PojoDescriptor> pojosTbl; - /** */ private TableView<PojoField> fieldsTbl; - /** */ private Node curTbl; - /** */ private TextField outFolderTf; - /** */ private TextField pkgTf; - /** */ private CheckBox pojoConstructorCh; - /** */ private CheckBox pojoIncludeKeysCh; - /** */ private CheckBox xmlSingleFileCh; - /** */ private TextField regexTf; - /** */ private TextField replaceTf; - /** */ private GridPaneEx genPnl; - /** */ private StackPane genLayerPnl; - /** */ private ProgressIndicator pi; - + /** */ private ObservableList<SchemaDescriptor> schemas = FXCollections.emptyObservableList(); - /** List with POJOs descriptors. */ private ObservableList<PojoDescriptor> pojos = FXCollections.emptyObservableList(); - /** Currently selected POJO. */ private PojoDescriptor curPojo; - /** */ - private final Map<String, Driver> drivers = new HashMap<>(); - - /** Application preferences. */ - private final Properties prefs = new Properties(); + /** + * Schema Import utility launcher. + * + * @param args Command line arguments passed to the application. + */ + public static void main(String[] args) { + // Workaround for JavaFX ugly text AA. + System.setProperty("prism.lcdtext", "false"); + System.setProperty("prism.text", "t2k"); - /** File path for storing on local file system. */ - private final File prefsFile = new File(System.getProperty("user.home"), ".ignite-schema-import"); + // Workaround for AWT + JavaFX: we should initialize AWT before JavaFX. + java.awt.Toolkit.getDefaultToolkit(); - /** Empty POJO fields model. */ - private static final ObservableList<PojoField> NO_FIELDS = FXCollections.emptyObservableList(); + // Workaround for JavaFX + Mac OS dock icon. + if (System.getProperty("os.name").toLowerCase().contains("mac os")) { + System.setProperty("javafx.macosx.embedded", "true"); - /** */ - private final ExecutorService exec = Executors.newSingleThreadExecutor(new ThreadFactory() { - @Override public Thread newThread(Runnable r) { - Thread t = new Thread(r, "ignite-schema-import-worker"); + try { + Class<?> appCls = Class.forName("com.apple.eawt.Application"); - t.setDaemon(true); + Object osxApp = appCls.getDeclaredMethod("getApplication").invoke(null); - return t; + appCls.getDeclaredMethod("setDockIconImage", java.awt.Image.class) + .invoke(osxApp, SwingFXUtils.fromFXImage(Controls.image("ignite", 128), null)); + } + catch (Exception ignore) { + // No-op. + } } - }); + + launch(args); + } /** * Lock UI before start long task. @@ -412,7 +321,7 @@ public class SchemaImportApp extends Application { if (!pwd.isEmpty()) jdbcInfo.put("password", pwd); - return connect(jdbcDrvJarPath, jdbcDrvCls, jdbcUrl, jdbcInfo); + return DbMetadataReader.getInstance().connect(jdbcDrvJarPath, jdbcDrvCls, jdbcUrl, jdbcInfo); } /** @@ -478,7 +387,7 @@ public class SchemaImportApp extends Application { prevBtn.setDisable(false); nextBtn.setText("Generate"); - tooltip(nextBtn, "Generate XML and POJO files"); + Controls.tooltip(nextBtn, "Generate XML and POJO files"); } finally { unlockUI(connLayerPnl, connPnl, nextBtn); @@ -701,15 +610,16 @@ public class SchemaImportApp extends Application { * @return Header pane with title label. */ private BorderPane createHeaderPane() { - dbIcon = hBox(0, true, imageView("data_connection", 48)); - genIcon = hBox(0, true, imageView("text_tree", 48)); + dbIcon = Controls.hBox(0, true, Controls.imageView("data_connection", 48)); + genIcon = Controls.hBox(0, true, Controls.imageView("text_tree", 48)); - titleLb = label(""); + titleLb = Controls.label(""); titleLb.setId("banner"); - subTitleLb = label(""); + subTitleLb = Controls.label(""); - BorderPane bp = borderPane(null, vBox(5, titleLb, subTitleLb), null, dbIcon, hBox(0, true, imageView("ignite", 48))); + BorderPane bp = Controls.borderPane(null, Controls.vBox(5, titleLb, subTitleLb), null, dbIcon, + Controls.hBox(0, true, Controls.imageView("ignite", 48))); bp.setId("banner"); return bp; @@ -719,19 +629,19 @@ public class SchemaImportApp extends Application { * @return Panel with control buttons. */ private Pane createButtonsPane() { - prevBtn = button("Prev", "Go to \"Database connection\" page", new EventHandler<ActionEvent>() { + prevBtn = Controls.button("Prev", "Go to \"Database connection\" page", new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent evt) { prev(); } }); - nextBtn = button("Next", "Go to \"POJO and XML generation\" page", new EventHandler<ActionEvent>() { + nextBtn = Controls.button("Next", "Go to \"POJO and XML generation\" page", new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent evt) { next(); } }); - return buttonsPane(Pos.BOTTOM_RIGHT, true, prevBtn, nextBtn); + return Controls.buttonsPane(Pos.BOTTOM_RIGHT, true, prevBtn, nextBtn); } /** @@ -762,7 +672,7 @@ public class SchemaImportApp extends Application { prevBtn.setDisable(true); nextBtn.setText("Next"); - tooltip(nextBtn, "Go to \"XML and POJO generation\" page"); + Controls.tooltip(nextBtn, "Go to \"XML and POJO generation\" page"); } /** @@ -805,57 +715,12 @@ public class SchemaImportApp extends Application { } /** - * Connect to database. - * - * @param jdbcDrvJarPath Path to JDBC driver. - * @param jdbcDrvCls JDBC class name. - * @param jdbcUrl JDBC connection URL. - * @param jdbcInfo Connection properties. - * @return Connection to database. - * @throws SQLException if connection failed. - */ - private Connection connect(String jdbcDrvJarPath, String jdbcDrvCls, String jdbcUrl, Properties jdbcInfo) - throws SQLException { - Driver drv = drivers.get(jdbcDrvCls); - - if (drv == null) { - if (jdbcDrvJarPath.isEmpty()) - throw new IllegalStateException("Driver jar file name is not specified."); - - File drvJar = new File(jdbcDrvJarPath); - - 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(jdbcDrvCls, true, ucl).newInstance(); - - drivers.put(jdbcDrvCls, drv); - } - catch (Exception e) { - throw new IllegalStateException(e); - } - } - - Connection conn = drv.connect(jdbcUrl, jdbcInfo); - - if (conn == null) - throw new IllegalStateException("Connection was not established (JDBC driver returned null value)."); - - return conn; - } - - /** * Create connection pane with controls. * * @return Pane with connection controls. */ private Pane createConnectionPane() { - connPnl = paneEx(10, 10, 0, 10); + connPnl = Controls.paneEx(10, 10, 0, 10); connPnl.addColumn(); connPnl.addColumn(100, 100, Double.MAX_VALUE, Priority.ALWAYS); @@ -864,18 +729,18 @@ public class SchemaImportApp extends Application { connPnl.addRows(9); connPnl.addRow(100, 100, Double.MAX_VALUE, Priority.ALWAYS); - connPnl.add(text("This utility is designed to automatically generate configuration XML files and" + + connPnl.add(Controls.text("This utility is designed to automatically generate configuration XML files and" + " POJO classes from database schema information.", 550), 3); connPnl.wrap(); - GridPaneEx presetPnl = paneEx(0, 0, 0, 0); + GridPaneEx presetPnl = Controls.paneEx(0, 0, 0, 0); presetPnl.addColumn(100, 100, Double.MAX_VALUE, Priority.ALWAYS); presetPnl.addColumn(); - rdbmsCb = presetPnl.add(comboBox("Select database server to get predefined settings", presets)); + rdbmsCb = presetPnl.add(Controls.comboBox("Select database server to get predefined settings", presets)); - presetPnl.add(button("Save preset", "Save current settings in preferences", new EventHandler<ActionEvent>() { + presetPnl.add(Controls.button("Save preset", "Save current settings in preferences", new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent evt) { Preset preset = rdbmsCb.getSelectionModel().getSelectedItem(); @@ -883,12 +748,12 @@ public class SchemaImportApp extends Application { } })); - connPnl.add(label("DB Preset:")); + connPnl.add(Controls.label("DB Preset:")); connPnl.add(presetPnl, 2); - jdbcDrvJarTf = connPnl.addLabeled("Driver JAR:", textField("Path to driver jar")); + jdbcDrvJarTf = connPnl.addLabeled("Driver JAR:", Controls.textField("Path to driver jar")); - connPnl.add(button("...", "Select JDBC driver jar or zip", new EventHandler<ActionEvent>() { + connPnl.add(Controls.button("...", "Select JDBC driver jar or zip", new EventHandler<ActionEvent>() { /** {@inheritDoc} */ @Override public void handle(ActionEvent evt) { FileChooser fc = new FileChooser(); @@ -916,9 +781,9 @@ public class SchemaImportApp extends Application { } })); - jdbcDrvClsTf = connPnl.addLabeled("JDBC Driver:", textField("Enter class name for JDBC driver"), 2); + jdbcDrvClsTf = connPnl.addLabeled("JDBC Driver:", Controls.textField("Enter class name for JDBC driver"), 2); - jdbcUrlTf = connPnl.addLabeled("JDBC URL:", textField("JDBC URL of the database connection string"), 2); + jdbcUrlTf = connPnl.addLabeled("JDBC URL:", Controls.textField("JDBC URL of the database connection string"), 2); rdbmsCb.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Preset>() { @Override public void changed(ObservableValue<? extends Preset> val, Preset oldVal, Preset newVal) { @@ -929,34 +794,33 @@ public class SchemaImportApp extends Application { } }); - userTf = connPnl.addLabeled("User:", textField("User name"), 2); + userTf = connPnl.addLabeled("User:", Controls.textField("User name"), 2); - pwdTf = connPnl.addLabeled("Password:", passwordField("User password"), 2); + pwdTf = connPnl.addLabeled("Password:", Controls.passwordField("User password"), 2); - parseCb = connPnl.addLabeled("Parse:", comboBox("Type of tables to parse", "Tables only", "Tables and Views"), 2); + parseCb = connPnl.addLabeled("Parse:", Controls.comboBox("Type of tables to parse", "Tables only", "Tables and Views"), 2); - GridPaneEx schemaPnl = paneEx(5, 5, 5, 5); + GridPaneEx schemaPnl = Controls.paneEx(5, 5, 5, 5); schemaPnl.addColumn(100, 100, Double.MAX_VALUE, Priority.ALWAYS); schemaPnl.addColumn(); - schemaLst = schemaPnl.add(list("Select schemas to load", new SchemaCell())); + schemaLst = schemaPnl.add(Controls.list("Select schemas to load", new SchemaCell())); schemaPnl.wrap(); - schemaPnl.add(button("Load schemas", "Load schemas for specified database", new EventHandler<ActionEvent>() { - @Override - public void handle(ActionEvent evt) { + schemaPnl.add(Controls.button("Load schemas", "Load schemas for specified database", new EventHandler<ActionEvent>() { + @Override public void handle(ActionEvent evt) { loadSchemas(); } })); - TitledPane titledPnl = connPnl.add(titledPane("Schemas", schemaPnl, false), 3); + TitledPane titledPnl = connPnl.add(Controls.titledPane("Schemas", schemaPnl, false), 3); titledPnl.setExpanded(true); GridPaneEx.setValignment(titledPnl, VPos.TOP); - connLayerPnl = stackPane(connPnl); + connLayerPnl = Controls.stackPane(connPnl); return connLayerPnl; } @@ -1020,7 +884,7 @@ public class SchemaImportApp extends Application { * Create generate pane with controls. */ private void createGeneratePane() { - genPnl = paneEx(10, 10, 0, 10); + genPnl = Controls.paneEx(10, 10, 0, 10); genPnl.addColumn(); genPnl.addColumn(100, 100, Double.MAX_VALUE, Priority.ALWAYS); @@ -1029,10 +893,10 @@ public class SchemaImportApp extends Application { genPnl.addRow(100, 100, Double.MAX_VALUE, Priority.ALWAYS); genPnl.addRows(7); - TableColumn<PojoDescriptor, Boolean> useCol = customColumn("Schema / Table", "use", + TableColumn<PojoDescriptor, Boolean> useCol = Controls.customColumn("Schema / Table", "use", "If checked then this table will be used for XML and POJOs generation", PojoDescriptorCell.cellFactory()); - TableColumn<PojoDescriptor, String> keyClsCol = textColumn("Key Class Name", "keyClassName", "Key class name", + TableColumn<PojoDescriptor, String> keyClsCol = Controls.textColumn("Key Class Name", "keyClassName", "Key class name", new TextColumnValidator<PojoDescriptor>() { @Override public boolean valid(PojoDescriptor rowVal, String newVal) { boolean valid = checkClassName(rowVal, newVal, true); @@ -1044,7 +908,7 @@ public class SchemaImportApp extends Application { } }); - TableColumn<PojoDescriptor, String> valClsCol = textColumn("Value Class Name", "valueClassName", "Value class name", + TableColumn<PojoDescriptor, String> valClsCol = Controls.textColumn("Value Class Name", "valueClassName", "Value class name", new TextColumnValidator<PojoDescriptor>() { @Override public boolean valid(PojoDescriptor rowVal, String newVal) { boolean valid = checkClassName(rowVal, newVal, false); @@ -1056,26 +920,26 @@ public class SchemaImportApp extends Application { } }); - pojosTbl = tableView("Tables not found in database", useCol, keyClsCol, valClsCol); + pojosTbl = Controls.tableView("Tables not found in database", useCol, keyClsCol, valClsCol); - TableColumn<PojoField, Boolean> useFldCol = customColumn("Use", "use", + TableColumn<PojoField, Boolean> useFldCol = Controls.customColumn("Use", "use", "Check to use this field for XML and POJO generation\n" + - "Note that NOT NULL columns cannot be unchecked", PojoFieldUseCell.cellFactory()); + "Note that NOT NULL columns cannot be unchecked", PojoFieldUseCell.cellFactory()); useFldCol.setMinWidth(50); useFldCol.setMaxWidth(50); - TableColumn<PojoField, Boolean> keyCol = booleanColumn("Key", "key", + TableColumn<PojoField, Boolean> keyCol = Controls.booleanColumn("Key", "key", "Check to include this field into key object"); - TableColumn<PojoField, Boolean> akCol = booleanColumn("AK", "affinityKey", + TableColumn<PojoField, Boolean> akCol = Controls.booleanColumn("AK", "affinityKey", "Check to annotate key filed with @AffinityKeyMapped annotation in generated POJO class\n" + - "Note that a class can have only ONE key field annotated with @AffinityKeyMapped annotation"); + "Note that a class can have only ONE key field annotated with @AffinityKeyMapped annotation"); - TableColumn<PojoField, String> dbNameCol = tableColumn("DB Name", "dbName", "Field name in database"); + TableColumn<PojoField, String> dbNameCol = Controls.tableColumn("DB Name", "dbName", "Field name in database"); - TableColumn<PojoField, String> dbTypeNameCol = tableColumn("DB Type", "dbTypeName", "Field type in database"); + TableColumn<PojoField, String> dbTypeNameCol = Controls.tableColumn("DB Type", "dbTypeName", "Field type in database"); - TableColumn<PojoField, String> javaNameCol = textColumn("Java Name", "javaName", "Field name in POJO class", + TableColumn<PojoField, String> javaNameCol = Controls.textColumn("Java Name", "javaName", "Field name in POJO class", new TextColumnValidator<PojoField>() { @Override public boolean valid(PojoField rowVal, String newVal) { if (newVal.trim().isEmpty()) { @@ -1097,25 +961,25 @@ public class SchemaImportApp extends Application { } }); - TableColumn<PojoField, String> javaTypeNameCol = customColumn("Java Type", "javaTypeName", + TableColumn<PojoField, String> javaTypeNameCol = Controls.customColumn("Java Type", "javaTypeName", "Field java type in POJO class", JavaTypeCell.cellFactory()); - fieldsTbl = tableView("Select table to see table columns", + fieldsTbl = Controls.tableView("Select table to see table columns", useFldCol, keyCol, akCol, dbNameCol, dbTypeNameCol, javaNameCol, javaTypeNameCol); - genPnl.add(splitPane(pojosTbl, fieldsTbl, 0.6), 3); + genPnl.add(Controls.splitPane(pojosTbl, fieldsTbl, 0.6), 3); - final GridPaneEx keyValPnl = paneEx(0, 0, 0, 0); + final GridPaneEx keyValPnl = Controls.paneEx(0, 0, 0, 0); keyValPnl.addColumn(100, 100, Double.MAX_VALUE, Priority.ALWAYS); keyValPnl.addColumn(); keyValPnl.addColumn(100, 100, Double.MAX_VALUE, Priority.ALWAYS); keyValPnl.addColumn(); - pkgTf = genPnl.addLabeled("Package:", textField("Package that will be used for POJOs generation"), 2); + pkgTf = genPnl.addLabeled("Package:", Controls.textField("Package that will be used for POJOs generation"), 2); - outFolderTf = genPnl.addLabeled("Output Folder:", textField("Output folder for XML and POJOs files")); + outFolderTf = genPnl.addLabeled("Output Folder:", Controls.textField("Output folder for XML and POJOs files")); - genPnl.add(button("...", "Select output folder", new EventHandler<ActionEvent>() { + genPnl.add(Controls.button("...", "Select output folder", new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent evt) { DirectoryChooser dc = new DirectoryChooser(); @@ -1136,30 +1000,30 @@ public class SchemaImportApp extends Application { } })); - pojoIncludeKeysCh = genPnl.add(checkBox("Include key fields into value POJOs", + pojoIncludeKeysCh = genPnl.add(Controls.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", + pojoConstructorCh = genPnl.add(Controls.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 XML file", + xmlSingleFileCh = genPnl.add(Controls.checkBox("Write all configurations to a single XML file", "If selected then all configurations will be saved into the file 'ignite-type-metadata.xml'", true), 3); - GridPaneEx regexPnl = paneEx(5, 5, 5, 5); + GridPaneEx regexPnl = Controls.paneEx(5, 5, 5, 5); regexPnl.addColumn(); regexPnl.addColumn(100, 100, Double.MAX_VALUE, Priority.ALWAYS); regexPnl.addColumn(); regexPnl.addColumn(100, 100, Double.MAX_VALUE, Priority.ALWAYS); - regexTf = regexPnl.addLabeled(" Regexp:", textField("Regular expression. For example: (\\w+)")); + regexTf = regexPnl.addLabeled(" Regexp:", Controls.textField("Regular expression. For example: (\\w+)")); - replaceTf = regexPnl.addLabeled(" Replace with:", textField("Replace text. For example: $1_SomeText")); + replaceTf = regexPnl.addLabeled(" Replace with:", Controls.textField("Replace text. For example: $1_SomeText")); - final ComboBox<String> replaceCb = regexPnl.addLabeled(" Replace:", comboBox("Replacement target", + final ComboBox<String> replaceCb = regexPnl.addLabeled(" Replace:", Controls.comboBox("Replacement target", "Key class names", "Value class names", "Java names")); - regexPnl.add(buttonsPane(Pos.CENTER_LEFT, false, - button("Rename Selected", "Replaces each substring of this string that matches the given regular expression" + + regexPnl.add(Controls.buttonsPane(Pos.CENTER_LEFT, false, + Controls.button("Rename Selected", "Replaces each substring of this string that matches the given regular expression" + " with the given replacement", new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent evt) { @@ -1216,7 +1080,7 @@ public class SchemaImportApp extends Application { } } }), - button("Reset Selected", "Revert changes for selected items to initial auto-generated values", new EventHandler<ActionEvent>() { + Controls.button("Reset Selected", "Revert changes for selected items to initial auto-generated values", new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent evt) { String sel = replaceCb.getSelectionModel().getSelectedItem(); @@ -1312,10 +1176,10 @@ public class SchemaImportApp extends Application { } }); - genPnl.add(titledPane("Rename \"Key class name\", \"Value class name\" or \"Java name\" for selected tables", + genPnl.add(Controls.titledPane("Rename \"Key class name\", \"Value class name\" or \"Java name\" for selected tables", regexPnl, true), 3); - genLayerPnl = stackPane(genPnl); + genLayerPnl = Controls.stackPane(genPnl); } /** @@ -1548,7 +1412,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(); @@ -1577,21 +1441,21 @@ public class SchemaImportApp extends Application { primaryStage.setTitle("Apache Ignite Auto Schema Import Utility"); primaryStage.getIcons().addAll( - image("ignite", 16), - image("ignite", 24), - image("ignite", 32), - image("ignite", 48), - image("ignite", 64), - image("ignite", 128)); + Controls.image("ignite", 16), + Controls.image("ignite", 24), + Controls.image("ignite", 32), + Controls.image("ignite", 48), + Controls.image("ignite", 64), + Controls.image("ignite", 128)); - pi = progressIndicator(50); + pi = Controls.progressIndicator(50); createGeneratePane(); hdrPane = createHeaderPane(); - rootPane = borderPane(hdrPane, createConnectionPane(), createButtonsPane(), null, null); + rootPane = Controls.borderPane(hdrPane, createConnectionPane(), createButtonsPane(), null, null); - primaryStage.setScene(scene(rootPane)); + primaryStage.setScene(Controls.scene(rootPane)); primaryStage.setWidth(650); primaryStage.setMinWidth(650); @@ -1709,37 +1573,49 @@ public class SchemaImportApp extends Application { savePreferences(); } - /** - * Schema Import utility launcher. - * - * @param args Command line arguments passed to the application. - */ - public static void main(String[] args) { - // Workaround for JavaFX ugly text AA. - System.setProperty("prism.lcdtext", "false"); - System.setProperty("prism.text", "t2k"); + /** Presets for database settings. */ + private static class Preset { + /** Name in preferences. */ + private String pref; - // Workaround for AWT + JavaFX: we should initialize AWT before JavaFX. - java.awt.Toolkit.getDefaultToolkit(); + /** RDBMS name to show on screen. */ + private String name; - // Workaround for JavaFX + Mac OS dock icon. - if (System.getProperty("os.name").toLowerCase().contains("mac os")) { - System.setProperty("javafx.macosx.embedded", "true"); + /** Path to JDBC driver jar. */ + private String jar; - try { - Class<?> appCls = Class.forName("com.apple.eawt.Application"); + /** JDBC driver class name. */ + private String drv; - Object osxApp = appCls.getDeclaredMethod("getApplication").invoke(null); + /** JDBC URL. */ + private String url; - appCls.getDeclaredMethod("setDockIconImage", java.awt.Image.class) - .invoke(osxApp, fromFXImage(image("ignite", 128), null)); - } - catch (Exception ignore) { - // No-op. - } + /** User name. */ + private String user; + + /** + * Preset constructor. + * + * @param pref Name in preferences. + * @param name RDBMS name to show on screen. + * @param jar Path to JDBC driver jar.. + * @param drv JDBC driver class name. + * @param url JDBC URL. + * @param user User name. + */ + Preset(String pref, String name, String jar, String drv, String url, String user) { + this.pref = pref; + this.name = name; + this.jar = jar; + this.drv = drv; + this.url = url; + this.user = user; } - launch(args); + /** {@inheritDoc} */ + @Override public String toString() { + return name; + } } /** @@ -1750,19 +1626,6 @@ public class SchemaImportApp extends Application { private final ComboBox<String> comboBox; /** - * Creates a ComboBox cell factory for use in TableColumn controls. - * - * @return Cell factory for cell with java types combobox. - */ - public static Callback<TableColumn<PojoField, String>, TableCell<PojoField, String>> cellFactory() { - return new Callback<TableColumn<PojoField, String>, TableCell<PojoField, String>>() { - @Override public TableCell<PojoField, String> call(TableColumn<PojoField, String> col) { - return new JavaTypeCell(); - } - }; - } - - /** * Default constructor. */ private JavaTypeCell() { @@ -1778,6 +1641,19 @@ public class SchemaImportApp extends Application { getStyleClass().add("combo-box-table-cell"); } + /** + * Creates a ComboBox cell factory for use in TableColumn controls. + * + * @return Cell factory for cell with java types combobox. + */ + public static Callback<TableColumn<PojoField, String>, TableCell<PojoField, String>> cellFactory() { + return new Callback<TableColumn<PojoField, String>, TableCell<PojoField, String>>() { + @Override public TableCell<PojoField, String> call(TableColumn<PojoField, String> col) { + return new JavaTypeCell(); + } + }; + } + /** {@inheritDoc} */ @Override public void startEdit() { if (comboBox.getItems().size() > 1) { @@ -1827,8 +1703,8 @@ public class SchemaImportApp extends Application { * Special list view cell to select loaded schemas. */ private static class SchemaCell implements Callback<SchemaDescriptor, ObservableValue<Boolean>> { - @Override - public ObservableValue<Boolean> call(SchemaDescriptor item) { + /** {@inheritDoc} */ + @Override public ObservableValue<Boolean> call(SchemaDescriptor item) { return item.selected(); } } @@ -1837,6 +1713,11 @@ public class SchemaImportApp extends Application { * Special table cell to select schema or table. */ private static class PojoDescriptorCell extends TableCell<PojoDescriptor, Boolean> { + /** Previous POJO bound to cell. */ + private PojoDescriptor prevPojo; + /** Previous cell graphic. */ + private Pane prevGraphic; + /** * Creates a ComboBox cell factory for use in TableColumn controls. * @@ -1850,12 +1731,6 @@ public class SchemaImportApp extends Application { }; } - /** Previous POJO bound to cell. */ - private PojoDescriptor prevPojo; - - /** Previous cell graphic. */ - private Pane prevGraphic; - /** {@inheritDoc} */ @Override public void updateItem(Boolean item, boolean empty) { super.updateItem(item, empty); @@ -1898,6 +1773,11 @@ public class SchemaImportApp extends Application { * Special table cell to select "used" fields for code generation. */ private static class PojoFieldUseCell extends TableCell<PojoField, Boolean> { + /** Previous POJO field bound to cell. */ + private PojoField prevField; + /** Previous cell graphic. */ + private CheckBox prevGraphic; + /** * Creates a ComboBox cell factory for use in TableColumn controls. * @@ -1911,12 +1791,6 @@ public class SchemaImportApp extends Application { }; } - /** Previous POJO field bound to cell. */ - private PojoField prevField; - - /** Previous cell graphic. */ - private CheckBox prevGraphic; - /** {@inheritDoc} */ @Override public void updateItem(Boolean item, boolean empty) { super.updateItem(item, empty); @@ -1947,4 +1821,4 @@ public class SchemaImportApp extends Application { } } } -} \ No newline at end of file +}
http://git-wip-us.apache.org/repos/asf/ignite/blob/bd50bdf8/parent/pom.xml ---------------------------------------------------------------------- diff --git a/parent/pom.xml b/parent/pom.xml index ba44c85..5a1d385 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -21,8 +21,8 @@ POM file. --> <project - xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> @@ -708,6 +708,7 @@ <exclude>dev-tools/.gradle/**/*</exclude> <exclude>dev-tools/gradle/wrapper/**/*</exclude> <exclude>dev-tools/gradlew</exclude> + <exclude>src/main/js/package.json</exclude> <!--shmem--> <exclude>ipc/shmem/**/Makefile.in</exclude><!--auto generated files--> <exclude>ipc/shmem/**/Makefile</exclude><!--auto generated files--> http://git-wip-us.apache.org/repos/asf/ignite/blob/bd50bdf8/pom.xml ---------------------------------------------------------------------- diff --git a/pom.xml b/pom.xml index 208dbbc..a2e61cd 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ <!-- POM file. --> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> +<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> @@ -660,6 +660,7 @@ </activation> <modules> <module>modules/schema-import</module> + <module>modules/schema-import-db</module> </modules> <build> <plugins> @@ -716,6 +717,7 @@ </activation> <modules> <module>modules/schema-import</module> + <module>modules/schema-import-db</module> </modules> <build> <plugins> @@ -764,6 +766,42 @@ </profile> <profile> + <id>control-center</id> + <modules> + <module>modules/control-center-agent</module> + <module>modules/control-center-web</module> + <module>modules/schema-import-db</module> + </modules> + </profile> + + <profile> + <id>ignite-npm</id> + <build> + <plugins> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>exec-maven-plugin</artifactId> + <executions> + <execution> + <phase>compile</phase> + <goals> + <goal>exec</goal> + </goals> + </execution> + </executions> + <configuration> + <executable>npm</executable> + <arguments> + <argument>publish</argument> + <argument>modules/nodejs/src/main/js</argument> + </arguments> + </configuration> + </plugin> + </plugins> + </build> + </profile> + + <profile> <id>update-versions</id> <!-- updates dotnet & cpp versions --> <build>
