You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by sk...@apache.org on 2016/12/19 11:46:17 UTC
[01/10] cayenne git commit: CAY-2172 Split DB actions to different
packages Clean up ReverseEngineeringAction Clean up DataSource select dialogs
Repository: cayenne
Updated Branches:
refs/heads/master 1a647b252 -> 27138761c
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenTableModel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenTableModel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenTableModel.java
new file mode 100644
index 0000000..4fc78f0
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenTableModel.java
@@ -0,0 +1,129 @@
+/*****************************************************************
+ * 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.cayenne.modeler.dialog.db.merge;
+
+import org.apache.cayenne.dbsync.merge.MergeDirection;
+import org.apache.cayenne.dbsync.merge.MergerToken;
+
+import javax.swing.table.AbstractTableModel;
+import java.util.List;
+
+
+public class MergerTokenTableModel extends AbstractTableModel {
+
+ public static final int COL_SELECT = 0;
+ public static final int COL_DIRECTION = 1;
+ public static final int COL_NAME = 2;
+ public static final int COL_VALUE = 3;
+
+ private MergerTokenSelectorController controller;
+
+ private List<MergerToken> tokens;
+
+ public MergerTokenTableModel(MergerTokenSelectorController controller) {
+ this.controller = controller;
+ this.tokens = controller.getSelectableTokens();
+ }
+
+ private MergerTokenSelectorController getController() {
+ return controller;
+ }
+
+ public Class getColumnClass(int columnIndex) {
+ switch (columnIndex) {
+ case COL_SELECT:
+ return Boolean.class;
+ case COL_DIRECTION:
+ // TODO: correct?
+ return String.class;
+ case COL_NAME:
+ case COL_VALUE:
+ return String.class;
+ }
+
+ return null;
+ }
+
+ public int getColumnCount() {
+ return 4;
+ }
+
+ public String getColumnName(int columnIndex) {
+ switch (columnIndex) {
+ case COL_SELECT:
+ return "";
+ case COL_NAME:
+ return "Operation";
+ case COL_DIRECTION:
+ return "Direction";
+ case COL_VALUE:
+ return "";
+ }
+
+ return null;
+ }
+
+ public int getRowCount() {
+ return tokens.size();
+ }
+
+ public MergerToken getToken(int rowIndex) {
+ return tokens.get(rowIndex);
+ }
+
+ public Object getValueAt(int rowIndex, int columnIndex) {
+ MergerToken token = getToken(rowIndex);
+ switch (columnIndex) {
+ case COL_SELECT:
+ return Boolean.valueOf(getController().isSelected(token));
+ case COL_NAME:
+ return token.getTokenName();
+ case COL_DIRECTION:
+ return token.getDirection();
+ case COL_VALUE:
+ return token.getTokenValue();
+ }
+ return null;
+ }
+
+ public boolean isCellEditable(int rowIndex, int columnIndex) {
+ switch (columnIndex) {
+ case COL_SELECT:
+ case COL_DIRECTION:
+ return true;
+ }
+ return false;
+ }
+
+ public void setValueAt(Object value, int rowIndex, int columnIndex) {
+ MergerToken token = getToken(rowIndex);
+ switch (columnIndex) {
+ case COL_SELECT:
+ Boolean val = (Boolean) value;
+ getController().select(token, val.booleanValue());
+ break;
+ case COL_DIRECTION:
+ MergeDirection direction = (MergeDirection) value;
+ getController().setDirection(token, direction);
+ break;
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbAdapterInfo.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbAdapterInfo.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbAdapterInfo.java
index 8ca4269..59a0197 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbAdapterInfo.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbAdapterInfo.java
@@ -82,7 +82,7 @@ public final class DbAdapterInfo {
return new DbAdapterListRenderer(DEFAULT_ADAPTER_LABELS);
}
- public static Object[] getStandardAdapters() {
+ public static String[] getStandardAdapters() {
return standardAdapters;
}
[08/10] cayenne git commit: Exclude table settings in reverse
engineering dialog Added @since tag to new public classes
Posted by sk...@apache.org.
Exclude table settings in reverse engineering dialog
Added @since tag to new public classes
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/06c91830
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/06c91830
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/06c91830
Branch: refs/heads/master
Commit: 06c918302310430952ea145d2f046d0210b6dc19
Parents: 163a871
Author: Nikita Timofeev <st...@gmail.com>
Authored: Thu Dec 15 12:10:00 2016 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Thu Dec 15 12:10:00 2016 +0300
----------------------------------------------------------------------
docs/doc/src/main/resources/RELEASE-NOTES.txt | 1 +
.../cayenne/modeler/action/MigrateAction.java | 13 ++++---
.../action/ReverseEngineeringAction.java | 3 +-
.../dialog/db/DbActionOptionsDialog.java | 13 ++++---
.../modeler/dialog/db/load/DbLoaderContext.java | 9 ++++-
.../dialog/db/load/DbLoaderOptionsDialog.java | 29 +++++++++++----
.../modeler/dialog/db/load/LoadDataMapTask.java | 3 ++
.../dialog/db/merge/DbMigrateOptionsDialog.java | 39 --------------------
8 files changed, 50 insertions(+), 60 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cayenne/blob/06c91830/docs/doc/src/main/resources/RELEASE-NOTES.txt
----------------------------------------------------------------------
diff --git a/docs/doc/src/main/resources/RELEASE-NOTES.txt b/docs/doc/src/main/resources/RELEASE-NOTES.txt
index 07dcd5b..0c1637d 100644
--- a/docs/doc/src/main/resources/RELEASE-NOTES.txt
+++ b/docs/doc/src/main/resources/RELEASE-NOTES.txt
@@ -18,6 +18,7 @@ CAY-2164 Relocate builder bootstrap methods from ServerRuntimeBuilder to ServerR
CAY-2165 Explicit "contribution" API for easier expansion of DI collections and maps
CAY-2166 Auto-loading of Cayenne modules
CAY-2168 Split DbLoader to parts and clean it up
+CAY-2172 Cleanup Modeler import and migrate db actions
Bug Fixes:
http://git-wip-us.apache.org/repos/asf/cayenne/blob/06c91830/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
index af0dcd0..e6b7a8d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
@@ -20,11 +20,10 @@
package org.apache.cayenne.modeler.action;
import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
-import org.apache.cayenne.dbsync.reverse.dbload.DbLoader;
import org.apache.cayenne.map.DataMap;
import org.apache.cayenne.modeler.Application;
import org.apache.cayenne.modeler.dialog.db.DataSourceWizard;
-import org.apache.cayenne.modeler.dialog.db.merge.DbMigrateOptionsDialog;
+import org.apache.cayenne.modeler.dialog.db.DbActionOptionsDialog;
import org.apache.cayenne.modeler.dialog.db.merge.MergerOptions;
import java.awt.event.ActionEvent;
@@ -33,7 +32,7 @@ import java.util.Collection;
/**
* Action that alter database schema to match a DataMap.
*/
-public class MigrateAction extends DBWizardAction<DbMigrateOptionsDialog> {
+public class MigrateAction extends DBWizardAction<DbActionOptionsDialog> {
public MigrateAction(Application application) {
super(getActionName(), application);
@@ -55,7 +54,7 @@ public class MigrateAction extends DBWizardAction<DbMigrateOptionsDialog> {
throw new IllegalStateException("No current DataMap selected.");
}
- DbMigrateOptionsDialog optionsDialog = loaderOptionDialog(connectWizard);
+ DbActionOptionsDialog optionsDialog = loaderOptionDialog(connectWizard);
String selectedCatalog = optionsDialog == null ? null : optionsDialog.getSelectedCatalog();
String selectedSchema = optionsDialog == null ? null : optionsDialog.getSelectedSchema();
@@ -71,7 +70,9 @@ public class MigrateAction extends DBWizardAction<DbMigrateOptionsDialog> {
}
@Override
- protected DbMigrateOptionsDialog createDialog(Collection<String> catalogs, Collection<String> schemas, String currentCatalog, String currentSchema) {
- return new DbMigrateOptionsDialog(catalogs, schemas, currentCatalog, currentSchema);
+ protected DbActionOptionsDialog createDialog(Collection<String> catalogs, Collection<String> schemas,
+ String currentCatalog, String currentSchema) {
+ return new DbActionOptionsDialog(Application.getFrame(), "Migrate DB Schema: Select Catalog and Schema",
+ catalogs, schemas, currentCatalog, currentSchema);
}
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/06c91830/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
index a2fefb7..de1c75e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
@@ -91,7 +91,8 @@ public class ReverseEngineeringAction extends DBWizardAction<DbLoaderOptionsDial
}
@Override
- protected DbLoaderOptionsDialog createDialog(Collection<String> catalogs, Collection<String> schemas, String currentCatalog, String currentSchema) {
+ protected DbLoaderOptionsDialog createDialog(Collection<String> catalogs, Collection<String> schemas,
+ String currentCatalog, String currentSchema) {
return new DbLoaderOptionsDialog(catalogs, schemas, currentCatalog, currentSchema);
}
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/06c91830/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbActionOptionsDialog.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbActionOptionsDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbActionOptionsDialog.java
index 19c479b..20eb185 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbActionOptionsDialog.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbActionOptionsDialog.java
@@ -38,7 +38,10 @@ import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.FormLayout;
import org.apache.cayenne.modeler.util.CayenneDialog;
-public abstract class DbActionOptionsDialog extends CayenneDialog {
+/**
+ * @since 4.0
+ */
+public class DbActionOptionsDialog extends CayenneDialog {
protected static final String WILDCARD_PATTERN = ".*";
public static final int CANCEL = 0;
@@ -78,9 +81,6 @@ public abstract class DbActionOptionsDialog extends CayenneDialog {
DefaultFormBuilder builder = new DefaultFormBuilder(layout);
builder.setDefaultDialogBorder();
- catalogLabel = builder.append("Select Catalog:", catalogSelector, true);
- schemaLabel = builder.append("Select Schema:", schemaSelector);
-
initForm(builder);
JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
@@ -141,7 +141,10 @@ public abstract class DbActionOptionsDialog extends CayenneDialog {
}
}
- protected abstract void initForm(DefaultFormBuilder builder);
+ protected void initForm(DefaultFormBuilder builder) {
+ catalogLabel = builder.append("Select Catalog:", catalogSelector, true);
+ schemaLabel = builder.append("Select Schema:", schemaSelector);
+ }
public int getChoice() {
return choice;
http://git-wip-us.apache.org/repos/asf/cayenne/blob/06c91830/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderContext.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderContext.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderContext.java
index 65b9b6e..d11691a 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderContext.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderContext.java
@@ -44,6 +44,9 @@ import org.apache.cayenne.util.Util;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+/**
+ * @since 4.0
+ */
public class DbLoaderContext {
private static Log LOGGER = LogFactory.getLog(DbLoaderContext.class);
@@ -116,7 +119,11 @@ public class DbLoaderContext {
ReverseEngineering reverseEngineering = new ReverseEngineering();
reverseEngineering.addCatalog(new Catalog(dialog.getSelectedCatalog()));
reverseEngineering.addSchema(new Schema(dialog.getSelectedSchema()));
- reverseEngineering.addIncludeTable(new IncludeTable(dialog.getTableNamePattern()));
+ reverseEngineering.addIncludeTable(new IncludeTable(dialog.getTableIncludePattern()));
+ if(dialog.getTableExcludePattern() != null) {
+ reverseEngineering.addExcludeTable(new ExcludeTable(dialog.getTableExcludePattern()));
+ }
+ // Add here auto_pk_support table
reverseEngineering.addExcludeTable(new ExcludeTable("auto_pk_support|AUTO_PK_SUPPORT"));
reverseEngineering.addIncludeProcedure(new IncludeProcedure(dialog.getProcedureNamePattern()));
FiltersConfigBuilder filtersConfigBuilder = new FiltersConfigBuilder(reverseEngineering);
http://git-wip-us.apache.org/repos/asf/cayenne/blob/06c91830/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderOptionsDialog.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderOptionsDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderOptionsDialog.java
index e1c422e..192a5aa 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderOptionsDialog.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderOptionsDialog.java
@@ -35,7 +35,8 @@ import javax.swing.JTextField;
*/
public class DbLoaderOptionsDialog extends DbActionOptionsDialog {
- private JTextField tableNamePatternField;
+ private JTextField tableIncludePatternField;
+ private JTextField tableExcludePatternField;
private JTextField meaningfulPk;
private JTextField procNamePatternField;
private JComboBox<String> strategyCombo;
@@ -52,9 +53,13 @@ public class DbLoaderOptionsDialog extends DbActionOptionsDialog {
@Override
protected void initForm(DefaultFormBuilder builder) {
- tableNamePatternField = new JTextField();
- tableNamePatternField.setToolTipText("<html>Regular expression to filter table names.<br>" +
+ super.initForm(builder);
+ tableIncludePatternField = new JTextField();
+ tableIncludePatternField.setToolTipText("<html>Regular expression to filter table names.<br>" +
"Default expression <b>.*</b> includes all tables.</html>");
+ tableExcludePatternField = new JTextField();
+ tableExcludePatternField.setToolTipText("<html>Regular expression to filter table names.<br>" +
+ "Empty by default excludes nothing.</html>");
procNamePatternField = new JTextField();
procNamePatternField.setToolTipText("<html>Regular expression to filter stored procedures names.<br>" +
"Default expression <b>.*</b> includes all stored procedures.</html>");
@@ -65,7 +70,8 @@ public class DbLoaderOptionsDialog extends DbActionOptionsDialog {
strategyCombo = new JComboBox<>();
strategyCombo.setEditable(true);
- builder.append("Table Name Pattern:", tableNamePatternField);
+ builder.append("Table Name Include Pattern:", tableIncludePatternField);
+ builder.append("Table Name Exclude Pattern:", tableExcludePatternField);
builder.append("Procedure Name Pattern:", procNamePatternField);
builder.append("Naming Strategy:", strategyCombo);
builder.append("Tables with Meaningful PK Pattern:", meaningfulPk);
@@ -74,7 +80,7 @@ public class DbLoaderOptionsDialog extends DbActionOptionsDialog {
protected void initFromModel(Collection<String> catalogs, Collection<String> schemas, String currentCatalog, String currentSchema) {
super.initFromModel(catalogs, schemas, currentCatalog, currentSchema);
- this.tableNamePatternField.setText(WILDCARD_PATTERN);
+ this.tableIncludePatternField.setText(WILDCARD_PATTERN);
this.procNamePatternField.setText(WILDCARD_PATTERN);
Vector<String> arr = NameGeneratorPreferences
@@ -83,9 +89,16 @@ public class DbLoaderOptionsDialog extends DbActionOptionsDialog {
strategyCombo.setModel(new DefaultComboBoxModel<>(arr));
}
- String getTableNamePattern() {
- return "".equals(tableNamePatternField.getText()) ? null : tableNamePatternField
- .getText();
+ String getTableIncludePattern() {
+ return "".equals(tableIncludePatternField.getText()) ?
+ null :
+ tableIncludePatternField.getText();
+ }
+
+ String getTableExcludePattern() {
+ return "".equals(tableExcludePatternField.getText()) ?
+ null :
+ tableExcludePatternField.getText();
}
String getMeaningfulPk() {
http://git-wip-us.apache.org/repos/asf/cayenne/blob/06c91830/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoadDataMapTask.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoadDataMapTask.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoadDataMapTask.java
index ceb0d44..d592385 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoadDataMapTask.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoadDataMapTask.java
@@ -32,6 +32,9 @@ import org.apache.cayenne.tools.dbimport.DbImportModule;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+/**
+ * @since 4.0
+ */
final public class LoadDataMapTask extends LongRunningTask {
private static Log LOGGER = LogFactory.getLog(DbLoaderContext.class);
http://git-wip-us.apache.org/repos/asf/cayenne/blob/06c91830/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/DbMigrateOptionsDialog.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/DbMigrateOptionsDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/DbMigrateOptionsDialog.java
deleted file mode 100644
index d044b30..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/DbMigrateOptionsDialog.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*****************************************************************
- * 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.cayenne.modeler.dialog.db.merge;
-
-import java.util.Collection;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.dialog.db.DbActionOptionsDialog;
-
-public class DbMigrateOptionsDialog extends DbActionOptionsDialog {
-
- public DbMigrateOptionsDialog(Collection<String> catalogs, Collection<String> schemas,
- String defaultCatalog, String defaultSchema) {
- super(Application.getFrame(), "Migrate DB Schema: Select Catalog and Schema",
- catalogs, schemas, defaultCatalog, defaultSchema);
- }
-
- @Override
- protected void initForm(DefaultFormBuilder builder) {
- }
-}
[05/10] cayenne git commit: Unify logic of Merge and ReverseEngineer
actions
Posted by sk...@apache.org.
Unify logic of Merge and ReverseEngineer actions
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/190ab7c7
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/190ab7c7
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/190ab7c7
Branch: refs/heads/master
Commit: 190ab7c7b72eb846ed39c7c80e4fa9a51046adf1
Parents: 7da0e89
Author: Nikita Timofeev <st...@gmail.com>
Authored: Wed Dec 14 10:56:59 2016 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Wed Dec 14 10:56:59 2016 +0300
----------------------------------------------------------------------
.../cayenne/modeler/action/DBWizardAction.java | 61 +++++-
.../modeler/action/GenerateDBAction.java | 3 +-
.../cayenne/modeler/action/MigrateAction.java | 50 +----
.../action/ReverseEngineeringAction.java | 53 +----
.../modeler/dialog/DbImportProjectSaver.java | 77 --------
.../dialog/db/DbActionOptionsDialog.java | 175 +++++++++++++++++
.../dialog/db/load/DbLoaderOptionsDialog.java | 193 +++----------------
.../dialog/db/merge/DbMigrateOptionsDialog.java | 155 +--------------
8 files changed, 283 insertions(+), 484 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cayenne/blob/190ab7c7/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java
index a3e652a..4002d58 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java
@@ -19,13 +19,20 @@
package org.apache.cayenne.modeler.action;
+import java.sql.Connection;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import javax.swing.JOptionPane;
+
+import org.apache.cayenne.dbsync.reverse.db.DbLoader;
import org.apache.cayenne.modeler.Application;
import org.apache.cayenne.modeler.dialog.db.DataSourceWizard;
+import org.apache.cayenne.modeler.dialog.db.DbActionOptionsDialog;
import org.apache.cayenne.modeler.util.CayenneAction;
-/**
- */
-public abstract class DBWizardAction extends CayenneAction {
+public abstract class DBWizardAction<T extends DbActionOptionsDialog> extends CayenneAction {
public DBWizardAction(String name, Application application) {
super(name, application);
@@ -40,4 +47,52 @@ public abstract class DBWizardAction extends CayenneAction {
return connectWizard;
}
+
+ protected abstract T createDialog(Collection<String> catalogs, Collection<String> schemas, String currentCatalog, String currentSchema);
+
+ protected T loaderOptionDialog(DataSourceWizard connectWizard) {
+
+ // use this catalog as the default...
+ List<String> catalogs;
+ List<String> schemas;
+ String currentCatalog;
+ String currentSchema;
+ try(Connection connection = connectWizard.getDataSource().getConnection()) {
+ catalogs = getCatalogs(connectWizard, connection);
+ schemas = getSchemas(connection);
+ if (catalogs.isEmpty() && schemas.isEmpty()) {
+ return null;
+ }
+ currentCatalog = connection.getCatalog();
+ currentSchema = connection.getSchema();
+ } catch (Exception ex) {
+ JOptionPane.showMessageDialog(
+ Application.getFrame(),
+ ex.getMessage(),
+ "Error loading schemas dialog",
+ JOptionPane.ERROR_MESSAGE);
+ return null;
+ }
+
+ final T optionsDialog = createDialog(catalogs, schemas, currentCatalog, currentSchema);
+ optionsDialog.setVisible(true);
+ if (optionsDialog.getChoice() == DbActionOptionsDialog.SELECT) {
+ return optionsDialog;
+ }
+
+ return null;
+ }
+
+ @SuppressWarnings("unchecked")
+ private List<String> getCatalogs(DataSourceWizard connectWizard, Connection connection) throws Exception {
+ if(!connectWizard.getAdapter().supportsCatalogsOnReverseEngineering()) {
+ return (List<String>) Collections.EMPTY_LIST;
+ }
+
+ return DbLoader.loadCatalogs(connection);
+ }
+
+ private List<String> getSchemas(Connection connection) throws Exception {
+ return DbLoader.loadSchemas(connection);
+ }
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/190ab7c7/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GenerateDBAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GenerateDBAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GenerateDBAction.java
index 1cf6301..93c6409 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GenerateDBAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GenerateDBAction.java
@@ -23,6 +23,7 @@ import org.apache.cayenne.configuration.DataChannelDescriptor;
import org.apache.cayenne.map.DataMap;
import org.apache.cayenne.modeler.Application;
import org.apache.cayenne.modeler.dialog.db.gen.DBGeneratorOptions;
+import org.apache.cayenne.modeler.util.CayenneAction;
import org.apache.cayenne.project.Project;
import java.awt.event.ActionEvent;
@@ -32,7 +33,7 @@ import java.util.Collection;
/**
* Action that generates database tables from a DataMap.
*/
-public class GenerateDBAction extends DBWizardAction {
+public class GenerateDBAction extends CayenneAction {
public static String getActionName() {
return "Generate Database Schema";
http://git-wip-us.apache.org/repos/asf/cayenne/blob/190ab7c7/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
index 29cd6a7..ccf6d3e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
@@ -20,23 +20,19 @@
package org.apache.cayenne.modeler.action;
import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
-import org.apache.cayenne.dbsync.reverse.db.DbLoader;
import org.apache.cayenne.map.DataMap;
import org.apache.cayenne.modeler.Application;
import org.apache.cayenne.modeler.dialog.db.DataSourceWizard;
import org.apache.cayenne.modeler.dialog.db.merge.DbMigrateOptionsDialog;
import org.apache.cayenne.modeler.dialog.db.merge.MergerOptions;
-import javax.sql.DataSource;
-import javax.swing.JOptionPane;
import java.awt.event.ActionEvent;
-import java.util.Collections;
-import java.util.List;
+import java.util.Collection;
/**
* Action that alter database schema to match a DataMap.
*/
-public class MigrateAction extends DBWizardAction {
+public class MigrateAction extends DBWizardAction<DbMigrateOptionsDialog> {
public MigrateAction(Application application) {
super(getActionName(), application);
@@ -58,29 +54,9 @@ public class MigrateAction extends DBWizardAction {
throw new IllegalStateException("No current DataMap selected.");
}
- //showOptions dialog
- String selectedSchema = null;
- String selectedCatalog = null;
- try {
- List<String> schemas = getSchemas(connectWizard);
- List<String> catalogs = getCatalogs(connectWizard);
- if (!catalogs.isEmpty() || !schemas.isEmpty()) {
- DbMigrateOptionsDialog optionsDialog = new DbMigrateOptionsDialog(catalogs, schemas, connectWizard.getConnectionInfo().getUserName());
- optionsDialog.showDialog();
- if (optionsDialog.getChoice() == DbMigrateOptionsDialog.SELECT) {
- selectedSchema = optionsDialog.getSelectedSchema();
- selectedCatalog = optionsDialog.getSelectedCatalog();
- } else {
- return;
- }
- }
- } catch (Exception ex) {
- JOptionPane.showMessageDialog(
- Application.getFrame(),
- ex.getMessage(),
- "Error loading schemas dialog",
- JOptionPane.ERROR_MESSAGE);
- }
+ DbMigrateOptionsDialog optionsDialog = loaderOptionDialog(connectWizard);
+ String selectedCatalog = optionsDialog == null ? null : optionsDialog.getSelectedCatalog();
+ String selectedSchema = optionsDialog == null ? null : optionsDialog.getSelectedSchema();
MergerTokenFactoryProvider mergerTokenFactoryProvider =
getApplication().getInjector().getInstance(MergerTokenFactoryProvider.class);
@@ -93,18 +69,8 @@ public class MigrateAction extends DBWizardAction {
map, selectedCatalog, selectedSchema, mergerTokenFactoryProvider).startupAction();
}
- @SuppressWarnings("unchecked")
- private List<String> getCatalogs(DataSourceWizard connectWizard) throws Exception {
- if(!connectWizard.getAdapter().supportsCatalogsOnReverseEngineering()) {
- return (List<String>)Collections.EMPTY_LIST;
- }
-
- DataSource dataSource = connectWizard.getDataSource();
- return DbLoader.loadCatalogs(dataSource.getConnection());
- }
-
- private List<String> getSchemas(DataSourceWizard connectWizard) throws Exception {
- DataSource dataSource = connectWizard.getDataSource();
- return DbLoader.loadSchemas(dataSource.getConnection());
+ @Override
+ protected DbMigrateOptionsDialog createDialog(Collection<String> catalogs, Collection<String> schemas, String currentCatalog, String currentSchema) {
+ return new DbMigrateOptionsDialog(catalogs, schemas, currentCatalog, currentSchema);
}
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/190ab7c7/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
index 8088639..a2fefb7 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
@@ -19,7 +19,6 @@
package org.apache.cayenne.modeler.action;
-import org.apache.cayenne.dbsync.reverse.db.DbLoader;
import org.apache.cayenne.modeler.Application;
import org.apache.cayenne.modeler.dialog.db.DataSourceWizard;
import org.apache.cayenne.modeler.dialog.db.load.DbLoaderContext;
@@ -28,14 +27,13 @@ import org.apache.cayenne.modeler.dialog.db.load.LoadDataMapTask;
import java.awt.event.ActionEvent;
import java.sql.SQLException;
-import java.util.Collections;
-import java.util.List;
+import java.util.Collection;
import javax.swing.SwingUtilities;
/**
* Action that imports database structure into a DataMap.
*/
-public class ReverseEngineeringAction extends DBWizardAction {
+public class ReverseEngineeringAction extends DBWizardAction<DbLoaderOptionsDialog> {
ReverseEngineeringAction(Application application) {
super(getActionName(), application);
@@ -63,7 +61,7 @@ public class ReverseEngineeringAction extends DBWizardAction {
return;
}
- final DbLoaderOptionsDialog loaderOptionsDialog = loaderOptionDialog(connectWizard, context);
+ final DbLoaderOptionsDialog loaderOptionsDialog = loaderOptionDialog(connectWizard);
if(!context.buildConfig(connectWizard, loaderOptionsDialog)) {
return;
}
@@ -92,47 +90,8 @@ public class ReverseEngineeringAction extends DBWizardAction {
th.start();
}
- private DbLoaderOptionsDialog loaderOptionDialog(DataSourceWizard connectWizard, DbLoaderContext context) {
- if(connectWizard == null) {
- return null;
- }
-
- List<String> catalogs = Collections.emptyList();
- List<String> schemas = Collections.emptyList();
- try {
- schemas = DbLoader.loadSchemas(context.getConnection());
- if (connectWizard.getAdapter().supportsCatalogsOnReverseEngineering()) {
- catalogs = DbLoader.loadCatalogs(context.getConnection());
- }
- } catch (SQLException ex) {
- context.processWarn(ex, "Error Loading catalogs and schemas");
- }
-
- if (context.isStopping()) {
- return null;
- }
-
- // use this catalog as the default...
- String currentCatalog = null;
- String currentSchema = null;
- try {
- currentCatalog = context.getConnection().getCatalog();
- currentSchema = context.getConnection().getSchema();
- } catch (SQLException e) {
- context.processWarn(e, "Error getting catalog or schema");
- }
-
- final DbLoaderOptionsDialog dialog = new DbLoaderOptionsDialog(
- schemas, catalogs,
- currentSchema, currentCatalog
- );
- dialog.setVisible(true);
- dialog.dispose();
-
- if (dialog.getChoice() == DbLoaderOptionsDialog.CANCEL) {
- return null;
- }
-
- return dialog;
+ @Override
+ protected DbLoaderOptionsDialog createDialog(Collection<String> catalogs, Collection<String> schemas, String currentCatalog, String currentSchema) {
+ return new DbLoaderOptionsDialog(catalogs, schemas, currentCatalog, currentSchema);
}
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/190ab7c7/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/DbImportProjectSaver.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/DbImportProjectSaver.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/DbImportProjectSaver.java
deleted file mode 100644
index a422143..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/DbImportProjectSaver.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * 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.cayenne.modeler.dialog;
-
-import org.apache.cayenne.configuration.ConfigurationNameMapper;
-import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.configuration.event.DataMapEvent;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ProjectController;
-import org.apache.cayenne.project.Project;
-import org.apache.cayenne.project.ProjectSaver;
-import org.apache.cayenne.resource.Resource;
-
-public class DbImportProjectSaver implements ProjectSaver {
-
- //@Inject // unfortunate we are not in DI context for now
- protected ConfigurationNameMapper nameMapper;
-
- private ProjectController projectController;
-
- public DbImportProjectSaver(ProjectController projectController, ConfigurationNameMapper nameMapper) {
- this.projectController = projectController;
- this.nameMapper = nameMapper;
- }
-
- @Override
- public String getSupportedVersion() {
- // not important in the context of non-saving saver
- return "-1";
- }
-
- @Override
- public void save(Project project) {
-
- DataMap dataMap = (DataMap) project.getRootNode();
-
- if (projectController.getCurrentDataMap() != null) {
-
- projectController.fireDataMapEvent(new DataMapEvent(Application.getFrame(), dataMap, MapEvent.REMOVE));
- projectController.fireDataMapEvent(new DataMapEvent(Application.getFrame(), dataMap, MapEvent.ADD));
- } else {
-
- DataChannelDescriptor currentDomain = (DataChannelDescriptor) projectController.getProject().getRootNode();
- Resource baseResource = currentDomain.getConfigurationSource();
-
- // a new DataMap, so need to set configuration source for it
- if (baseResource != null) {
- Resource dataMapResource = baseResource.getRelativeResource(nameMapper.configurationLocation(dataMap));
- dataMap.setConfigurationSource(dataMapResource);
- }
- projectController.addDataMap(Application.getFrame(), dataMap);
- }
- }
-
- @Override
- public void saveAs(Project project, Resource baseDirectory) {
- save(project);
- }
-}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/190ab7c7/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbActionOptionsDialog.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbActionOptionsDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbActionOptionsDialog.java
new file mode 100644
index 0000000..19c479b
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbActionOptionsDialog.java
@@ -0,0 +1,175 @@
+/*****************************************************************
+ * 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.cayenne.modeler.dialog.db;
+
+import java.awt.BorderLayout;
+import java.awt.FlowLayout;
+import java.awt.Frame;
+import java.awt.HeadlessException;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.Collection;
+
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+import com.jgoodies.forms.layout.FormLayout;
+import org.apache.cayenne.modeler.util.CayenneDialog;
+
+public abstract class DbActionOptionsDialog extends CayenneDialog {
+
+ protected static final String WILDCARD_PATTERN = ".*";
+ public static final int CANCEL = 0;
+ public static final int SELECT = 1;
+
+ private int choice;
+ private JLabel schemaLabel;
+ private JLabel catalogLabel;
+ private JComboBox<String> catalogSelector;
+ private JComboBox<String> schemaSelector;
+ private JButton selectButton;
+ private JButton cancelButton;
+
+ public DbActionOptionsDialog(Frame owner, String title, Collection<String> catalogs, Collection<String> schemas,
+ String currentCatalog, String currentSchema) throws HeadlessException {
+ super(owner, title);
+ init();
+ initController();
+ initFromModel(catalogs, schemas, currentCatalog, currentSchema);
+
+ pack();
+ setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
+ setModal(true);
+ centerWindow();
+ }
+
+ protected void init() {
+ // create widgets...
+ selectButton = new JButton("Continue");
+ cancelButton = new JButton("Cancel");
+ catalogSelector = new JComboBox<>();
+ schemaSelector = new JComboBox<>();
+
+ FormLayout layout = new FormLayout(
+ "right:pref, 3dlu, fill:max(170dlu;pref):grow",
+ "");
+ DefaultFormBuilder builder = new DefaultFormBuilder(layout);
+ builder.setDefaultDialogBorder();
+
+ catalogLabel = builder.append("Select Catalog:", catalogSelector, true);
+ schemaLabel = builder.append("Select Schema:", schemaSelector);
+
+ initForm(builder);
+
+ JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
+ buttons.add(selectButton);
+ buttons.add(cancelButton);
+
+ getContentPane().setLayout(new BorderLayout());
+ getContentPane().add(builder.getPanel(), BorderLayout.CENTER);
+ getContentPane().add(buttons, BorderLayout.SOUTH);
+ }
+
+ protected void initController() {
+ selectButton.addActionListener(new ActionListener() {
+
+ public void actionPerformed(ActionEvent e) {
+ processSelect();
+ }
+ });
+ cancelButton.addActionListener(new ActionListener() {
+
+ public void actionPerformed(ActionEvent e) {
+ processCancel();
+ }
+ });
+ }
+
+ protected void initFromModel(Collection<String> catalogs, Collection<String> schemas, String currentCatalog, String currentSchema) {
+ this.choice = CANCEL;
+
+ boolean showSchemaSelector = schemas != null && !schemas.isEmpty();
+ schemaSelector.setVisible(showSchemaSelector);
+ schemaLabel.setVisible(showSchemaSelector);
+ if (showSchemaSelector) {
+ schemaSelector.setModel(new DefaultComboBoxModel<>(schemas.toArray(new String[0])));
+ if (currentSchema != null) {
+ for (String schema : schemas) {
+ if (currentSchema.equalsIgnoreCase(schema)) {
+ schemaSelector.setSelectedItem(schema);
+ break;
+ }
+ }
+ }
+ }
+
+ boolean showCatalogSelector = catalogs != null && !catalogs.isEmpty();
+ catalogSelector.setVisible(showCatalogSelector);
+ catalogLabel.setVisible(showCatalogSelector);
+ if (showCatalogSelector) {
+ catalogSelector.setModel(new DefaultComboBoxModel<>(catalogs.toArray(new String[0])));
+ if (currentCatalog != null && !currentCatalog.isEmpty()) {
+ for (String catalog : catalogs) {
+ if (currentCatalog.equalsIgnoreCase(catalog)) {
+ catalogSelector.setSelectedItem(catalog);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ protected abstract void initForm(DefaultFormBuilder builder);
+
+ public int getChoice() {
+ return choice;
+ }
+
+ private void processSelect() {
+ choice = SELECT;
+ setVisible(false);
+ }
+
+ private void processCancel() {
+ choice = CANCEL;
+ setVisible(false);
+ }
+
+ /**
+ * Returns selected catalog.
+ */
+ public String getSelectedCatalog() {
+ String catalog = (String) catalogSelector.getSelectedItem();
+ return "".equals(catalog) ? null : catalog;
+ }
+
+ /**
+ * Returns selected schema.
+ */
+ public String getSelectedSchema() {
+ String schema = (String) schemaSelector.getSelectedItem();
+ return "".equals(schema) ? null : schema;
+ }
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/190ab7c7/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderOptionsDialog.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderOptionsDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderOptionsDialog.java
index 1ccc7aa..e1c422e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderOptionsDialog.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderOptionsDialog.java
@@ -20,127 +20,60 @@
package org.apache.cayenne.modeler.dialog.db.load;
import com.jgoodies.forms.builder.DefaultFormBuilder;
-import com.jgoodies.forms.layout.FormLayout;
import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.util.CayenneDialog;
+import org.apache.cayenne.modeler.dialog.db.DbActionOptionsDialog;
import org.apache.cayenne.modeler.util.NameGeneratorPreferences;
-import javax.swing.*;
-import java.awt.*;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
import java.util.Collection;
import java.util.Vector;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JComboBox;
+import javax.swing.JTextField;
/**
* Dialog for selecting database reverse-engineering parameters.
*/
-public class DbLoaderOptionsDialog extends CayenneDialog {
+public class DbLoaderOptionsDialog extends DbActionOptionsDialog {
- public static final String WILDCARD_PATTERN = ".*";
-
- public static final int CANCEL = 0;
- public static final int SELECT = 1;
-
- protected JLabel catalogLabel;
- protected JComboBox<String> catalogSelector;
- protected JLabel schemaLabel;
- protected JComboBox<String> schemaSelector;
- protected JTextField tableNamePatternField;
- protected JTextField meaningfulPk;
- protected JTextField procNamePatternField;
- protected JLabel procedureLabel;
- protected JButton selectButton;
- protected JButton cancelButton;
-
-
- protected JComboBox<String> strategyCombo;
+ private JTextField tableNamePatternField;
+ private JTextField meaningfulPk;
+ private JTextField procNamePatternField;
+ private JComboBox<String> strategyCombo;
protected String strategy;
- protected int choice;
/**
* Creates and initializes new ChooseSchemaDialog.
*/
- public DbLoaderOptionsDialog(Collection<String> schemas, Collection<String> catalogs, String currentSchema,
- String dbCatalog) {
- super(Application.getFrame(), "Reengineer DB Schema: Select Options");
-
- init();
- initController();
- initFromModel(schemas, catalogs, currentSchema, dbCatalog);
-
- pack();
- setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
- setModal(true);
- centerWindow();
+ public DbLoaderOptionsDialog(Collection<String> catalogs, Collection<String> schemas,
+ String dbCatalog, String currentSchema) {
+ super(Application.getFrame(), "Reengineer DB Schema: Select Options",
+ catalogs, schemas, dbCatalog, currentSchema);
}
- /** Sets up the graphical components. */
- protected void init() {
-
- // create widgets...
- selectButton = new JButton("Continue");
- cancelButton = new JButton("Cancel");
- catalogSelector = new JComboBox<>();
- schemaSelector = new JComboBox<>();
+ @Override
+ protected void initForm(DefaultFormBuilder builder) {
tableNamePatternField = new JTextField();
tableNamePatternField.setToolTipText("<html>Regular expression to filter table names.<br>" +
"Default expression <b>.*</b> includes all tables.</html>");
procNamePatternField = new JTextField();
procNamePatternField.setToolTipText("<html>Regular expression to filter stored procedures names.<br>" +
- "Default expression .* includes all stored procedures.</html>");
+ "Default expression <b>.*</b> includes all stored procedures.</html>");
meaningfulPk = new JTextField();
meaningfulPk.setToolTipText("<html>Regular expression to filter tables with meaningful primary keys.<br>" +
"Multiple expressions divided by comma can be used.<br>" +
- "Example: <b>^table1,^table2,^prefix.*</b></html>");
+ "Example: <b>^table1|^table2|^prefix.*|table_name</b></html>");
strategyCombo = new JComboBox<>();
strategyCombo.setEditable(true);
- // assemble
- FormLayout layout = new FormLayout(
- "right:pref, 3dlu, fill:max(170dlu;pref):grow",
- "");
- DefaultFormBuilder builder = new DefaultFormBuilder(layout);
- builder.setDefaultDialogBorder();
-
- catalogLabel = builder.append("Select Catalog:", catalogSelector);
- schemaLabel = builder.append("Select Schema:", schemaSelector);
builder.append("Table Name Pattern:", tableNamePatternField);
- procedureLabel = builder.append("Procedure Name Pattern:", procNamePatternField);
+ builder.append("Procedure Name Pattern:", procNamePatternField);
builder.append("Naming Strategy:", strategyCombo);
builder.append("Tables with Meaningful PK Pattern:", meaningfulPk);
-
- JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
- buttons.add(cancelButton);
- buttons.add(selectButton);
-
- getContentPane().setLayout(new BorderLayout());
- getContentPane().add(builder.getPanel(), BorderLayout.CENTER);
- getContentPane().add(buttons, BorderLayout.SOUTH);
}
- protected void initController() {
- selectButton.addActionListener(new ActionListener() {
-
- public void actionPerformed(ActionEvent e) {
- processSelect();
- }
- });
- cancelButton.addActionListener(new ActionListener() {
+ protected void initFromModel(Collection<String> catalogs, Collection<String> schemas, String currentCatalog, String currentSchema) {
+ super.initFromModel(catalogs, schemas, currentCatalog, currentSchema);
- public void actionPerformed(ActionEvent e) {
- processCancel();
- }
- });
- }
-
- protected void initFromModel(
- Collection<String> schemas,
- Collection<String> catalogs,
- String currentSchema,
- String currentCatalog) {
-
- this.choice = CANCEL;
this.tableNamePatternField.setText(WILDCARD_PATTERN);
this.procNamePatternField.setText(WILDCARD_PATTERN);
@@ -148,100 +81,24 @@ public class DbLoaderOptionsDialog extends CayenneDialog {
.getInstance()
.getLastUsedStrategies();
strategyCombo.setModel(new DefaultComboBoxModel<>(arr));
-
- boolean showSchemaSelector = schemas != null && !schemas.isEmpty();
- schemaSelector.setVisible(showSchemaSelector);
- schemaLabel.setVisible(showSchemaSelector);
-
- if (showSchemaSelector) {
-
- schemaSelector.setModel(new DefaultComboBoxModel<>(schemas.toArray(new String[0])));
-
- if (currentSchema != null) {
- for (String schema : schemas) {
- if (currentSchema.equalsIgnoreCase(schema)) {
- schemaSelector.setSelectedItem(schema);
- break;
- }
- }
- }
- }
-
- boolean showCatalogSelector = catalogs != null && !catalogs.isEmpty();
- catalogSelector.setVisible(showCatalogSelector);
- catalogLabel.setVisible(showCatalogSelector);
-
- if (showCatalogSelector) {
- catalogSelector.setModel(new DefaultComboBoxModel<>(catalogs.toArray(new String[0])));
-
- if (currentCatalog != null && !currentCatalog.isEmpty()) {
- for (String catalog : catalogs) {
- if (currentCatalog.equalsIgnoreCase(catalog)) {
- catalogSelector.setSelectedItem(catalog);
- break;
- }
- }
- }
- }
}
- public int getChoice() {
- return choice;
- }
-
- private void processSelect() {
- strategy = (String) strategyCombo.getSelectedItem();
-
- choice = SELECT;
- setVisible(false);
- }
-
- private void processCancel() {
- choice = CANCEL;
- setVisible(false);
- }
-
- /**
- * Returns selected catalog.
- */
- public String getSelectedCatalog() {
- String catalog = (String) catalogSelector.getSelectedItem();
- return "".equals(catalog) ? null : catalog;
- }
-
- /**
- * Returns selected schema.
- */
- public String getSelectedSchema() {
- String schema = (String) schemaSelector.getSelectedItem();
- return "".equals(schema) ? null : schema;
- }
-
- /**
- * Returns the tableNamePattern.
- */
- public String getTableNamePattern() {
+ String getTableNamePattern() {
return "".equals(tableNamePatternField.getText()) ? null : tableNamePatternField
.getText();
}
- public String getMeaningfulPk() {
+ String getMeaningfulPk() {
return "".equals(meaningfulPk.getText()) ? null : meaningfulPk
.getText();
}
- /**
- * Returns the procedure name pattern.
- */
- public String getProcedureNamePattern() {
+ String getProcedureNamePattern() {
return "".equals(procNamePatternField.getText()) ? null : procNamePatternField
.getText();
}
- /**
- * Returns configured naming strategy
- */
- public String getNamingStrategy() {
- return strategy;
+ String getNamingStrategy() {
+ return (String) strategyCombo.getSelectedItem();
}
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/190ab7c7/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/DbMigrateOptionsDialog.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/DbMigrateOptionsDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/DbMigrateOptionsDialog.java
index b3fb929..d044b30 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/DbMigrateOptionsDialog.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/DbMigrateOptionsDialog.java
@@ -19,158 +19,21 @@
package org.apache.cayenne.modeler.dialog.db.merge;
-import java.awt.BorderLayout;
-import java.awt.FlowLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
import java.util.Collection;
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.JButton;
-import javax.swing.JComboBox;
-import javax.swing.JDialog;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.util.CayenneDialog;
-
import com.jgoodies.forms.builder.DefaultFormBuilder;
-import com.jgoodies.forms.layout.FormLayout;
-
-public class DbMigrateOptionsDialog extends CayenneDialog {
- private static final long serialVersionUID = 1L;
- public static final int CANCEL = 0;
- public static final int SELECT = 1;
-
- protected JLabel schemaLabel;
- protected JLabel catalogLabel;
- protected JComboBox<String> catalogSelector;
- protected JComboBox<String> schemaSelector;
- protected JButton selectButton;
- protected JButton cancelButton;
- protected int choice;
-
- public DbMigrateOptionsDialog(Collection<String> catalogs, Collection<String> schemas, String dbUserName) {
- super(Application.getFrame(), "Migrate DB Schema: Select Catalog and Schema");
- init();
- initController();
- initFromModel(catalogs, schemas, dbUserName);
-
- pack();
- setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
- setModal(true);
- centerWindow();
- }
-
- protected void init() {
- selectButton = new JButton("Continue");
- cancelButton = new JButton("Cancel");
- catalogSelector = new JComboBox<>();
- schemaSelector = new JComboBox<>();
- FormLayout layout = new FormLayout(
- "right:pref, 3dlu, fill:max(170dlu;pref):grow",
- "");
- DefaultFormBuilder builder = new DefaultFormBuilder(layout);
- builder.setDefaultDialogBorder();
-
- catalogLabel = builder.append("Select Catalog:", catalogSelector, true);
- schemaLabel = builder.append("Select Schema:", schemaSelector);
-
- JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
- buttons.add(selectButton);
- buttons.add(cancelButton);
-
- getContentPane().setLayout(new BorderLayout());
- getContentPane().add(builder.getPanel(), BorderLayout.CENTER);
- getContentPane().add(buttons, BorderLayout.SOUTH);
- }
-
- protected void initController() {
- selectButton.addActionListener(new ActionListener() {
-
- public void actionPerformed(ActionEvent e) {
- processSelect();
- }
- });
-
- cancelButton.addActionListener(new ActionListener() {
-
- public void actionPerformed(ActionEvent e) {
- processCancel();
- }
- });
- }
-
- private void processSelect() {
- choice = SELECT;
- setVisible(false);
- }
-
- private void processCancel() {
- schemaSelector.setSelectedItem(null);
- choice = CANCEL;
- setVisible(false);
- }
-
- protected void initFromModel(Collection<String> catalogs, Collection<String> schemas, String dbUserName) {
-
- this.choice = CANCEL;
-
- if(!schemas.isEmpty()) {
- schemaLabel.setVisible(true);
- schemaSelector.setModel(new DefaultComboBoxModel<>(schemas.toArray(new String[0])));
- schemaSelector.setVisible(true);
- } else {
- schemaLabel.setVisible(false);
- schemaSelector.setVisible(false);
- }
-
- if(!catalogs.isEmpty()) {
- catalogLabel.setVisible(true);
- catalogSelector.setModel(new DefaultComboBoxModel<>(catalogs.toArray(new String[0])));
- catalogSelector.setVisible(true);
- } else {
- catalogLabel.setVisible(false);
- catalogSelector.setVisible(false);
- }
-
- if (dbUserName == null) {
- return;
- }
-
- // select schema belonging to the user
- for (String schema : schemas) {
- if (dbUserName.equalsIgnoreCase(schema)) {
- schemaSelector.setSelectedItem(schema);
- break;
- }
- }
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.dialog.db.DbActionOptionsDialog;
- for(String catalog : catalogs) {
- if(dbUserName.equalsIgnoreCase(catalog)) {
- catalogSelector.setSelectedItem(catalog);
- break;
- }
- }
- }
+public class DbMigrateOptionsDialog extends DbActionOptionsDialog {
- /**
- * Returns selected schema.
- */
- public String getSelectedSchema() {
- return (String) schemaSelector.getSelectedItem();
+ public DbMigrateOptionsDialog(Collection<String> catalogs, Collection<String> schemas,
+ String defaultCatalog, String defaultSchema) {
+ super(Application.getFrame(), "Migrate DB Schema: Select Catalog and Schema",
+ catalogs, schemas, defaultCatalog, defaultSchema);
}
- public String getSelectedCatalog() {
- return (String) catalogSelector.getSelectedItem();
- }
-
- public int getChoice() {
- return choice;
- }
-
- public void showDialog() {
- setVisible(true);
+ @Override
+ protected void initForm(DefaultFormBuilder builder) {
}
}
[07/10] cayenne git commit: Merge branch 'master' into CAY-2172
Posted by sk...@apache.org.
Merge branch 'master' into CAY-2172
# Conflicts:
# modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
# modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderHelper.java
# modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ModelerDbImportAction.java
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/163a8715
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/163a8715
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/163a8715
Branch: refs/heads/master
Commit: 163a871542e1cd54c929961cdc52f6fdf6a477ac
Parents: 391c564
Author: stariy <st...@gmail.com>
Authored: Wed Dec 14 22:50:00 2016 +0300
Committer: stariy <st...@gmail.com>
Committed: Wed Dec 14 22:50:00 2016 +0300
----------------------------------------------------------------------
.../java/org/apache/cayenne/modeler/action/DBWizardAction.java | 2 +-
.../org/apache/cayenne/modeler/dialog/db/load/DbLoaderContext.java | 2 +-
.../org/apache/cayenne/modeler/dialog/db/load/LoaderDelegate.java | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cayenne/blob/163a8715/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java
index 4002d58..25a912f 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java
@@ -26,7 +26,7 @@ import java.util.List;
import javax.swing.JOptionPane;
-import org.apache.cayenne.dbsync.reverse.db.DbLoader;
+import org.apache.cayenne.dbsync.reverse.dbload.DbLoader;
import org.apache.cayenne.modeler.Application;
import org.apache.cayenne.modeler.dialog.db.DataSourceWizard;
import org.apache.cayenne.modeler.dialog.db.DbActionOptionsDialog;
http://git-wip-us.apache.org/repos/asf/cayenne/blob/163a8715/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderContext.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderContext.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderContext.java
index 6a550a6..65b9b6e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderContext.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderContext.java
@@ -32,7 +32,7 @@ import org.apache.cayenne.dbimport.IncludeTable;
import org.apache.cayenne.dbimport.ReverseEngineering;
import org.apache.cayenne.dbimport.Schema;
import org.apache.cayenne.dbsync.naming.NameBuilder;
-import org.apache.cayenne.dbsync.reverse.db.DbLoaderDelegate;
+import org.apache.cayenne.dbsync.reverse.dbload.DbLoaderDelegate;
import org.apache.cayenne.dbsync.reverse.filters.FiltersConfigBuilder;
import org.apache.cayenne.map.DataMap;
import org.apache.cayenne.modeler.Application;
http://git-wip-us.apache.org/repos/asf/cayenne/blob/163a8715/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoaderDelegate.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoaderDelegate.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoaderDelegate.java
index 92043fc..a49f3b6 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoaderDelegate.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoaderDelegate.java
@@ -20,7 +20,7 @@
package org.apache.cayenne.modeler.dialog.db.load;
import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.dbsync.reverse.db.DefaultDbLoaderDelegate;
+import org.apache.cayenne.dbsync.reverse.dbload.DefaultDbLoaderDelegate;
import org.apache.cayenne.map.DbEntity;
import org.apache.cayenne.map.DbRelationship;
import org.apache.cayenne.map.event.EntityEvent;
[03/10] cayenne git commit: CAY-2172 Split DB actions to different
packages Clean up ReverseEngineeringAction Clean up DataSource select dialogs
Posted by sk...@apache.org.
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbMigrateOptionsDialog.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbMigrateOptionsDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbMigrateOptionsDialog.java
deleted file mode 100644
index f53bf9c..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbMigrateOptionsDialog.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*****************************************************************
- * 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.cayenne.modeler.dialog.db;
-
-import java.awt.BorderLayout;
-import java.awt.FlowLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.util.Collection;
-
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.JButton;
-import javax.swing.JComboBox;
-import javax.swing.JDialog;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.util.CayenneDialog;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-import com.jgoodies.forms.layout.FormLayout;
-
-public class DbMigrateOptionsDialog extends CayenneDialog {
- private static final long serialVersionUID = 1L;
- public static final int CANCEL = 0;
- public static final int SELECT = 1;
-
- protected JLabel schemaLabel;
- protected JLabel catalogLabel;
- protected JComboBox<String> catalogSelector;
- protected JComboBox<String> schemaSelector;
- protected JButton selectButton;
- protected JButton cancelButton;
- protected int choice;
-
- public DbMigrateOptionsDialog(Collection<String> catalogs, Collection<String> schemas, String dbUserName) {
- super(Application.getFrame(), "Migrate DB Schema: Select Catalog and Schema");
- init();
- initController();
- initFromModel(catalogs, schemas, dbUserName);
-
- pack();
- setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
- setModal(true);
- centerWindow();
- }
-
- protected void init() {
- selectButton = new JButton("Continue");
- cancelButton = new JButton("Cancel");
- catalogSelector = new JComboBox<>();
- schemaSelector = new JComboBox<>();
- FormLayout layout = new FormLayout(
- "right:pref, 3dlu, fill:max(170dlu;pref):grow",
- "");
- DefaultFormBuilder builder = new DefaultFormBuilder(layout);
- builder.setDefaultDialogBorder();
-
- catalogLabel = builder.append("Select Catalog:", catalogSelector, true);
- schemaLabel = builder.append("Select Schema:", schemaSelector);
-
- JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
- buttons.add(selectButton);
- buttons.add(cancelButton);
-
- getContentPane().setLayout(new BorderLayout());
- getContentPane().add(builder.getPanel(), BorderLayout.CENTER);
- getContentPane().add(buttons, BorderLayout.SOUTH);
- }
-
- protected void initController() {
- selectButton.addActionListener(new ActionListener() {
-
- public void actionPerformed(ActionEvent e) {
- processSelect();
- }
- });
-
- cancelButton.addActionListener(new ActionListener() {
-
- public void actionPerformed(ActionEvent e) {
- processCancel();
- }
- });
- }
-
- private void processSelect() {
- choice = SELECT;
- setVisible(false);
- }
-
- private void processCancel() {
- schemaSelector.setSelectedItem(null);
- choice = CANCEL;
- setVisible(false);
- }
-
- protected void initFromModel(Collection<String> catalogs, Collection<String> schemas, String dbUserName) {
-
- this.choice = CANCEL;
-
- if(!schemas.isEmpty()) {
- schemaLabel.setVisible(true);
- schemaSelector.setModel(new DefaultComboBoxModel<>(schemas.toArray(new String[0])));
- schemaSelector.setVisible(true);
- } else {
- schemaLabel.setVisible(false);
- schemaSelector.setVisible(false);
- }
-
- if(!catalogs.isEmpty()) {
- catalogLabel.setVisible(true);
- catalogSelector.setModel(new DefaultComboBoxModel<>(catalogs.toArray(new String[0])));
- catalogSelector.setVisible(true);
- } else {
- catalogLabel.setVisible(false);
- catalogSelector.setVisible(false);
- }
-
- if (dbUserName == null) {
- return;
- }
-
- // select schema belonging to the user
- for (String schema : schemas) {
- if (dbUserName.equalsIgnoreCase(schema)) {
- schemaSelector.setSelectedItem(schema);
- break;
- }
- }
-
- for(String catalog : catalogs) {
- if(dbUserName.equalsIgnoreCase(catalog)) {
- catalogSelector.setSelectedItem(catalog);
- break;
- }
- }
- }
-
- /**
- * Returns selected schema.
- */
- public String getSelectedSchema() {
- return (String) schemaSelector.getSelectedItem();
- }
-
- public String getSelectedCatalog() {
- return (String) catalogSelector.getSelectedItem();
- }
-
- public int getChoice() {
- return choice;
- }
-
- public void showDialog() {
- setVisible(true);
- }
-}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java
deleted file mode 100644
index 52a3666..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java
+++ /dev/null
@@ -1,395 +0,0 @@
-/*
- * 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.cayenne.modeler.dialog.db;
-
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.configuration.event.DataMapEvent;
-import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.dbsync.merge.AbstractToDbToken;
-import org.apache.cayenne.dbsync.merge.DbMerger;
-import org.apache.cayenne.dbsync.merge.DefaultModelMergeDelegate;
-import org.apache.cayenne.dbsync.merge.MergeDirection;
-import org.apache.cayenne.dbsync.merge.MergerContext;
-import org.apache.cayenne.dbsync.merge.MergerToken;
-import org.apache.cayenne.dbsync.merge.ModelMergeDelegate;
-import org.apache.cayenne.dbsync.merge.ProxyModelMergeDelegate;
-import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
-import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
-import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
-import org.apache.cayenne.dbsync.naming.NoStemStemmer;
-import org.apache.cayenne.dbsync.reverse.db.DbLoader;
-import org.apache.cayenne.dbsync.reverse.db.DbLoaderConfiguration;
-import org.apache.cayenne.dbsync.reverse.db.LoggingDbLoaderDelegate;
-import org.apache.cayenne.dbsync.reverse.filters.FiltersConfig;
-import org.apache.cayenne.dbsync.reverse.filters.PatternFilter;
-import org.apache.cayenne.dbsync.reverse.filters.TableFilter;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ProjectController;
-import org.apache.cayenne.modeler.dialog.ValidationResultBrowser;
-import org.apache.cayenne.modeler.pref.DBConnectionInfo;
-import org.apache.cayenne.modeler.util.CayenneController;
-import org.apache.cayenne.project.Project;
-import org.apache.cayenne.resource.Resource;
-import org.apache.cayenne.swing.BindingBuilder;
-import org.apache.cayenne.swing.ObjectBinding;
-import org.apache.cayenne.tools.dbimport.DefaultDbImportAction;
-import org.apache.cayenne.validation.ValidationResult;
-import org.apache.commons.logging.LogFactory;
-
-import javax.sql.DataSource;
-import javax.swing.JFileChooser;
-import javax.swing.JOptionPane;
-import javax.swing.WindowConstants;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-import java.awt.Component;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-
-public class MergerOptions extends CayenneController {
-
- protected MergerOptionsView view;
- protected ObjectBinding sqlBinding;
-
- protected DBConnectionInfo connectionInfo;
- protected DataMap dataMap;
- protected DbAdapter adapter;
- protected String textForSQL;
-
- protected MergerTokenSelectorController tokens;
- protected String defaultCatalog;
- protected String defaultSchema;
- private MergerTokenFactoryProvider mergerTokenFactoryProvider;
-
- public MergerOptions(ProjectController parent,
- String title,
- DBConnectionInfo connectionInfo,
- DataMap dataMap,
- String defaultCatalog,
- String defaultSchema,
- MergerTokenFactoryProvider mergerTokenFactoryProvider) {
- super(parent);
-
- this.mergerTokenFactoryProvider = mergerTokenFactoryProvider;
- this.dataMap = dataMap;
- this.tokens = new MergerTokenSelectorController(parent);
- this.view = new MergerOptionsView(tokens.getView());
- this.connectionInfo = connectionInfo;
- this.defaultCatalog = defaultCatalog;
- this.defaultSchema = defaultSchema;
- this.view.setTitle(title);
- initController();
-
- prepareMigrator();
- createSQL();
- refreshView();
- }
-
- public Component getView() {
- return view;
- }
-
- public String getTextForSQL() {
- return textForSQL;
- }
-
- protected void initController() {
-
- BindingBuilder builder = new BindingBuilder(
- getApplication().getBindingFactory(),
- this);
-
- sqlBinding = builder.bindToTextArea(view.getSql(), "textForSQL");
-
- builder.bindToAction(view.getGenerateButton(), "generateSchemaAction()");
- builder.bindToAction(view.getSaveSqlButton(), "storeSQLAction()");
- builder.bindToAction(view.getCancelButton(), "closeAction()");
-
- // refresh SQL if different tables were selected
- view.getTabs().addChangeListener(new ChangeListener() {
-
- public void stateChanged(ChangeEvent e) {
- if (view.getTabs().getSelectedIndex() == 1) {
- // this assumes that some tables where checked/unchecked... not very
- // efficient
- refreshGeneratorAction();
- }
- }
- });
- }
-
- /**
- * check database and create the {@link List} of {@link MergerToken}s
- */
- protected void prepareMigrator() {
- try {
- adapter = connectionInfo.makeAdapter(getApplication().getClassLoadingService());
-
- MergerTokenFactory mergerTokenFactory = mergerTokenFactoryProvider.get(adapter);
- tokens.setMergerTokenFactory(mergerTokenFactory);
-
-
- FiltersConfig filters = FiltersConfig.create(defaultCatalog, defaultSchema, TableFilter.everything(),
- PatternFilter.INCLUDE_NOTHING);
-
- DbMerger merger = DbMerger.builder(mergerTokenFactory)
- .filters(filters)
- .build();
-
- DbLoaderConfiguration config = new DbLoaderConfiguration();
- config.setFiltersConfig(filters);
-
- DataSource dataSource = connectionInfo.makeDataSource(getApplication().getClassLoadingService());
-
- DataMap dbImport = new DataMap();
- try (Connection conn = dataSource.getConnection();) {
- new DbLoader(conn,
- adapter,
- new LoggingDbLoaderDelegate(LogFactory.getLog(DbLoader.class)),
- new DefaultObjectNameGenerator(NoStemStemmer.getInstance()))
- .load(dbImport, config);
-
- } catch (SQLException e) {
- throw new CayenneRuntimeException("Can't doLoad dataMap from db.", e);
- }
-
- tokens.setTokens(merger.createMergeTokens(dataMap, dbImport));
- } catch (Exception ex) {
- reportError("Error loading adapter", ex);
- }
- }
-
- /**
- * Returns SQL statements generated for selected schema generation options.
- */
- protected void createSQL() {
- // convert them to string representation for display
- StringBuilder buf = new StringBuilder();
-
- Iterator<MergerToken> it = tokens.getSelectedTokens().iterator();
- String batchTerminator = adapter.getBatchTerminator();
-
- String lineEnd = batchTerminator != null ? "\n" + batchTerminator + "\n\n" : "\n\n";
- while (it.hasNext()) {
- MergerToken token = it.next();
-
- if (token instanceof AbstractToDbToken) {
- AbstractToDbToken tdb = (AbstractToDbToken) token;
- for (String sql : tdb.createSql(adapter)) {
- buf.append(sql);
- buf.append(lineEnd);
- }
- }
- }
-
- textForSQL = buf.toString();
- }
-
- protected void refreshView() {
- sqlBinding.updateView();
- }
-
- // ===============
- // Actions
- // ===============
-
- /**
- * Starts options dialog.
- */
- public void startupAction() {
- view.pack();
- view.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
- view.setModal(true);
- makeCloseableOnEscape();
- centerView();
- view.setVisible(true);
- }
-
- public void refreshGeneratorAction() {
- refreshSQLAction();
- }
-
- /**
- * Updates a text area showing generated SQL.
- */
- public void refreshSQLAction() {
- createSQL();
- sqlBinding.updateView();
- }
-
- /**
- * Performs configured schema operations via DbGenerator.
- */
- public void generateSchemaAction() {
- refreshGeneratorAction();
-
- // sanity check...
- List<MergerToken> tokensToMigrate = tokens.getSelectedTokens();
- if (tokensToMigrate.isEmpty()) {
- JOptionPane.showMessageDialog(getView(), "Nothing to migrate.");
- return;
- }
-
- DataSource dataSource;
- try {
- dataSource = connectionInfo.makeDataSource(getApplication()
- .getClassLoadingService());
- } catch (SQLException ex) {
- reportError("Migration Error", ex);
- return;
- }
-
- final Collection<ObjEntity> loadedObjEntities = new LinkedList<>();
-
- MergerContext mergerContext = MergerContext.builder(dataMap)
- .syntheticDataNode(dataSource, adapter)
- .delegate(createDelegate(loadedObjEntities))
- .build();
-
- boolean modelChanged = applyTokens(tokensToMigrate, mergerContext);
-
- DefaultDbImportAction.flattenManyToManyRelationships(
- dataMap,
- loadedObjEntities,
- mergerContext.getNameGenerator());
-
- notifyProjectModified(modelChanged);
-
- reportFailures(mergerContext);
- }
-
- private ModelMergeDelegate createDelegate(final Collection<ObjEntity> loadedObjEntities) {
- return new ProxyModelMergeDelegate(new DefaultModelMergeDelegate()) {
- @Override
- public void objEntityAdded(ObjEntity ent) {
- loadedObjEntities.add(ent);
- super.objEntityAdded(ent);
- }
- };
- }
-
- private boolean applyTokens(List<MergerToken> tokensToMigrate, MergerContext mergerContext) {
- boolean modelChanged = false;
-
- try {
- for (MergerToken tok : tokensToMigrate) {
- int numOfFailuresBefore = getFailuresCount(mergerContext);
-
- tok.execute(mergerContext);
-
- if (!modelChanged && tok.getDirection().equals(MergeDirection.TO_MODEL)) {
- modelChanged = true;
- }
- if (numOfFailuresBefore == getFailuresCount(mergerContext)) {
- // looks like the token executed without failures
- tokens.removeToken(tok);
- }
- }
- } catch (Throwable th) {
- reportError("Migration Error", th);
- }
-
- return modelChanged;
- }
-
- private int getFailuresCount(MergerContext mergerContext) {
- return mergerContext.getValidationResult().getFailures().size();
- }
-
- private void reportFailures(MergerContext mergerContext) {
- ValidationResult failures = mergerContext.getValidationResult();
- if (failures == null || !failures.hasFailures()) {
- JOptionPane.showMessageDialog(getView(), "Migration Complete.");
- } else {
- new ValidationResultBrowser(this).startupAction(
- "Migration Complete",
- "Migration finished. The following problem(s) were ignored.",
- failures);
- }
- }
-
- private void notifyProjectModified(boolean modelChanged) {
- if(!modelChanged) {
- return;
- }
-
- // mark the model as unsaved
- Project project = getApplication().getProject();
- project.setModified(true);
-
- ProjectController projectController = getProjectController();
- projectController.setDirty(true);
-
- projectController.fireDataMapEvent(new DataMapEvent(Application.getFrame(),
- dataMap, MapEvent.REMOVE));
- projectController.fireDataMapEvent(new DataMapEvent(Application.getFrame(),
- dataMap, MapEvent.ADD));
- }
-
- /**
- * Allows user to save generated SQL in a file.
- */
- public void storeSQLAction() {
- JFileChooser fc = new JFileChooser();
- fc.setDialogType(JFileChooser.SAVE_DIALOG);
- fc.setDialogTitle("Save SQL Script");
-
- Resource projectDir = getApplication().getProject().getConfigurationResource();
-
- if (projectDir != null) {
- fc.setCurrentDirectory(new File(projectDir.getURL().getPath()));
- }
-
- if (fc.showSaveDialog(getView()) == JFileChooser.APPROVE_OPTION) {
- refreshGeneratorAction();
-
- try {
- File file = fc.getSelectedFile();
- FileWriter fw = new FileWriter(file);
- PrintWriter pw = new PrintWriter(fw);
- pw.print(textForSQL);
- pw.flush();
- pw.close();
- } catch (IOException ex) {
- reportError("Error Saving SQL", ex);
- }
- }
- }
-
- private ProjectController getProjectController() {
- return getApplication().getFrameController().getProjectController();
- }
-
- public void closeAction() {
- view.dispose();
- }
-
-}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptionsView.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptionsView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptionsView.java
deleted file mode 100644
index 24069da..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptionsView.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*****************************************************************
- * 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.cayenne.modeler.dialog.db;
-
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Dimension;
-import java.awt.FlowLayout;
-
-import javax.swing.Box;
-import javax.swing.JButton;
-import javax.swing.JDialog;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTabbedPane;
-import javax.swing.JTextArea;
-import javax.swing.ScrollPaneConstants;
-import javax.swing.SwingConstants;
-
-import org.apache.cayenne.modeler.Application;
-
-import com.jgoodies.forms.builder.PanelBuilder;
-import com.jgoodies.forms.layout.CellConstraints;
-import com.jgoodies.forms.layout.FormLayout;
-
-/**
- * Wizard for altering the database to match the data map.
- */
-public class MergerOptionsView extends JDialog {
-
- protected JTextArea sql;
- protected JButton generateButton;
- protected JButton cancelButton;
- protected JButton saveSqlButton;
-
- protected Component tables;
- protected JTabbedPane tabs;
-
- public MergerOptionsView(Component tables) {
- super(Application.getFrame());
-
- // create widgets
- this.generateButton = new JButton("Migrate");
- this.cancelButton = new JButton("Close");
- this.saveSqlButton = new JButton("Save SQL");
-
- this.tables = tables;
- this.tabs = new JTabbedPane(SwingConstants.TOP);
- this.sql = new JTextArea();
- sql.setEditable(false);
- sql.setLineWrap(true);
- sql.setWrapStyleWord(true);
-
- JPanel sqlTextPanel = new JPanel(new BorderLayout());
- sqlTextPanel.add(new JScrollPane(
- sql,
- ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
- ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), BorderLayout.CENTER);
-
- CellConstraints cc = new CellConstraints();
- PanelBuilder builder = new PanelBuilder(new FormLayout(
- "fill:min(50dlu;pref):grow",
- "p, 9dlu, p, 3dlu, fill:40dlu:grow"));
- builder.setDefaultDialogBorder();
- builder.addSeparator("Generated SQL", cc.xywh(1, 3, 1, 1));
- builder.add(sqlTextPanel, cc.xy(1, 5));
-
- tabs.addTab("Operations", new JScrollPane(
- tables,
- ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
- ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED));
- tabs.addTab("Generated SQL", builder.getPanel());
-
- // we need the right preferred size so that dialog "pack()" produces decent
- // default size...
- tabs.setPreferredSize(new Dimension(600, 350));
-
- JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
- buttons.add(saveSqlButton);
- buttons.add(Box.createHorizontalStrut(20));
- buttons.add(cancelButton);
- buttons.add(generateButton);
-
- Container contentPane = this.getContentPane();
- contentPane.setLayout(new BorderLayout());
- contentPane.add(tabs, BorderLayout.CENTER);
- contentPane.add(buttons, BorderLayout.SOUTH);
- }
-
- public JButton getCancelButton() {
- return cancelButton;
- }
-
- public JTabbedPane getTabs() {
- return tabs;
- }
-
- /*
- * public JCheckBox getCreateFK() { return createFK; } public JCheckBox getCreatePK() {
- * return createPK; } public JCheckBox getCreateTables() { return createTables; }
- * public JCheckBox getDropPK() { return dropPK; } public JCheckBox getDropTables() {
- * return dropTables; }
- */
-
- public JButton getGenerateButton() {
- return generateButton;
- }
-
- public JButton getSaveSqlButton() {
- return saveSqlButton;
- }
-
- public JTextArea getSql() {
- return sql;
- }
-}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenSelectorController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenSelectorController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenSelectorController.java
deleted file mode 100644
index 666b113..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenSelectorController.java
+++ /dev/null
@@ -1,239 +0,0 @@
-/*****************************************************************
- * 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.cayenne.modeler.dialog.db;
-
-import org.apache.cayenne.dbsync.merge.MergeDirection;
-import org.apache.cayenne.dbsync.merge.MergerToken;
-import org.apache.cayenne.dbsync.merge.TokenComparator;
-import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.util.CayenneController;
-import org.apache.cayenne.swing.BindingBuilder;
-import org.apache.cayenne.swing.ObjectBinding;
-
-import javax.swing.*;
-import javax.swing.table.AbstractTableModel;
-import javax.swing.table.TableColumn;
-import javax.swing.table.TableColumnModel;
-import javax.swing.table.TableModel;
-import java.awt.*;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-public class MergerTokenSelectorController extends CayenneController {
-
- protected MergerTokenSelectorView view;
- protected ObjectBinding tableBinding;
-
- protected MergerToken token;
- protected int permanentlyExcludedCount;
- protected Set<MergerToken> excludedTokens;
- protected List<MergerToken> selectableTokensList;
- protected MergerTokenFactory mergerTokenFactory;
-
- public MergerTokenSelectorController(CayenneController parent) {
- super(parent);
- this.view = new MergerTokenSelectorView();
- this.excludedTokens = new HashSet<MergerToken>();
- this.selectableTokensList = new ArrayList<MergerToken>();
- initController();
- }
-
- public void setMergerTokenFactory(MergerTokenFactory mergerTokenFactory) {
- this.mergerTokenFactory = mergerTokenFactory;
- }
-
- public void setTokens(List<MergerToken> tokens) {
- selectableTokensList.clear();
- selectableTokensList.addAll(tokens);
- excludedTokens.addAll(tokens);
- }
-
- public List<MergerToken> getSelectedTokens() {
- List<MergerToken> t = new ArrayList<MergerToken>(selectableTokensList);
- t.removeAll(excludedTokens);
- return Collections.unmodifiableList(t);
- }
-
- public List<MergerToken> getSelectableTokens() {
- return Collections.unmodifiableList(selectableTokensList);
- }
-
- public void removeToken(MergerToken token) {
- selectableTokensList.remove(token);
- excludedTokens.remove(token);
-
- AbstractTableModel model = (AbstractTableModel) view.getTokens().getModel();
- model.fireTableDataChanged();
- }
-
- // ----- properties -----
-
- public Component getView() {
- return view;
- }
-
- /**
- * Called by table binding script to set current token.
- */
- public void setToken(MergerToken token) {
- this.token = token;
- }
-
- /**
- * Returns {@link MergerToken}s that are excluded from DB generation.
- */
- /*
- * public Collection getExcludedTokens() { return excludedTokens; }
- */
-
- public boolean isIncluded() {
- if (token == null) {
- return false;
- }
-
- return !excludedTokens.contains(token);
- }
-
- public void setIncluded(boolean b) {
- if (token == null) {
- return;
- }
-
- if (b) {
- excludedTokens.remove(token);
- }
- else {
- excludedTokens.add(token);
- }
-
- tableSelectedAction();
- }
-
- /**
- * A callback action that updates the state of Select All checkbox.
- */
- public void tableSelectedAction() {
- int unselectedCount = excludedTokens.size() - permanentlyExcludedCount;
-
- if (unselectedCount == selectableTokensList.size()) {
- view.getCheckAll().setSelected(false);
- }
- else if (unselectedCount == 0) {
- view.getCheckAll().setSelected(true);
- }
- }
-
- // ------ other stuff ------
-
- protected void initController() {
- BindingBuilder builder = new BindingBuilder(
- getApplication().getBindingFactory(),
- this);
-
- builder.bindToAction(view.getCheckAll(), "checkAllAction()");
- builder.bindToAction(view.getReverseAll(), "reverseAllAction()");
-
- TableModel model = new MergerTokenTableModel(this);
-
- MergeDirection[] dirs = new MergeDirection[] {
- MergeDirection.TO_DB, MergeDirection.TO_MODEL
- };
-
- view.getTokens().setModel(model);
-
- TableColumnModel columnModel = view.getTokens().getColumnModel();
-
- // dropdown for direction column
- JComboBox directionCombo = Application.getWidgetFactory().createComboBox(dirs, false);
- directionCombo.setEditable(false);
- TableColumn directionColumn = columnModel.getColumn(
- MergerTokenTableModel.COL_DIRECTION);
- directionColumn.setCellEditor(new DefaultCellEditor(directionCombo));
-
- columnModel.getColumn(MergerTokenTableModel.COL_SELECT).setPreferredWidth(50);
- columnModel.getColumn(MergerTokenTableModel.COL_DIRECTION).setPreferredWidth(100);
- columnModel.getColumn(MergerTokenTableModel.COL_SELECT).setMaxWidth(50);
- columnModel.getColumn(MergerTokenTableModel.COL_DIRECTION).setMaxWidth(100);
- }
-
- public boolean isSelected(MergerToken token) {
- return (selectableTokensList.contains(token) && !excludedTokens.contains(token));
- }
-
- public void select(MergerToken token, boolean select) {
- if (select) {
- excludedTokens.remove(token);
- }
- else {
- excludedTokens.add(token);
- }
- }
-
- public void setDirection(MergerToken token, MergeDirection direction) {
- if (token.getDirection().equals(direction)) {
- return;
- }
- int i = selectableTokensList.indexOf(token);
- MergerToken reverse = token.createReverse(mergerTokenFactory);
- selectableTokensList.set(i, reverse);
- if (excludedTokens.remove(token)) {
- excludedTokens.add(reverse);
- }
-
- /**
- * Repaint, so that "Operation" column updates properly
- */
- view.getTokens().repaint();
- }
-
- public void checkAllAction() {
-
- boolean isCheckAllSelected = view.getCheckAll().isSelected();
-
- if (isCheckAllSelected) {
- excludedTokens.clear();
- }
- else {
- excludedTokens.addAll(selectableTokensList);
- }
-
- AbstractTableModel model = (AbstractTableModel) view.getTokens().getModel();
- model.fireTableDataChanged();
- }
-
- public void reverseAllAction() {
-
- for (int i = 0; i < selectableTokensList.size(); i++) {
- MergerToken token = selectableTokensList.get(i);
- MergerToken reverse = token.createReverse(mergerTokenFactory);
- selectableTokensList.set(i, reverse);
- if (excludedTokens.remove(token)) {
- excludedTokens.add(reverse);
- }
- }
-
- Collections.sort(selectableTokensList, new TokenComparator());
- AbstractTableModel model = (AbstractTableModel) view.getTokens().getModel();
- model.fireTableDataChanged();
- }
-}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenSelectorView.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenSelectorView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenSelectorView.java
deleted file mode 100644
index a644a48..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenSelectorView.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*****************************************************************
- * 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.cayenne.modeler.dialog.db;
-
-import java.awt.BorderLayout;
-import java.awt.FlowLayout;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
-
-import javax.swing.JButton;
-import javax.swing.JCheckBox;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTable;
-
-import com.jgoodies.forms.builder.PanelBuilder;
-import com.jgoodies.forms.factories.ButtonBarFactory;
-import com.jgoodies.forms.layout.CellConstraints;
-import com.jgoodies.forms.layout.FormLayout;
-
-/**
- */
-public class MergerTokenSelectorView extends JPanel {
-
- protected JTable tokens;
- protected JCheckBox checkAll;
- protected JLabel checkAllLabel;
- protected JButton reverseAll;
-
- public MergerTokenSelectorView() {
-
- this.checkAll = new JCheckBox();
- this.checkAllLabel = new JLabel("Check All Operations");
- this.reverseAll = new JButton("Reverse All Operations");
-
- checkAll.addItemListener(new ItemListener() {
-
- public void itemStateChanged(ItemEvent event) {
- if (checkAll.isSelected()) {
- checkAllLabel.setText("Uncheck All Operations");
- }
- else {
- checkAllLabel.setText("Check All Operations");
- }
- }
- });
-
- // assemble
- JPanel checkAllPanel = new JPanel(new FlowLayout(FlowLayout.LEADING));
- checkAllPanel.add(checkAll);
- checkAllPanel.add(checkAllLabel);
- JPanel topPanel = new JPanel();
- topPanel.setLayout(new BorderLayout());
- topPanel.add(checkAllPanel, BorderLayout.WEST);
- topPanel.add(ButtonBarFactory.buildRightAlignedBar(reverseAll), BorderLayout.EAST);
-
- tokens = new JTable();
- tokens.setRowHeight(25);
- tokens.setRowMargin(3);
-
- CellConstraints cc = new CellConstraints();
- PanelBuilder builder = new PanelBuilder(new FormLayout(
- "fill:min(50dlu;pref):grow",
- "p, 3dlu, fill:40dlu:grow"));
- builder.setDefaultDialogBorder();
- builder.addSeparator("Select Operations", cc.xy(1, 1));
- builder.add(new JScrollPane(
- tokens,
- JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
- JScrollPane.HORIZONTAL_SCROLLBAR_NEVER), cc.xy(1, 3));
-
- setLayout(new BorderLayout());
- add(topPanel, BorderLayout.NORTH);
- add(builder.getPanel(), BorderLayout.CENTER);
- }
-
- public JTable getTokens() {
- return tokens;
- }
-
- public JCheckBox getCheckAll() {
- return checkAll;
- }
-
- public JButton getReverseAll() {
- return reverseAll;
- }
-}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenTableModel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenTableModel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenTableModel.java
deleted file mode 100644
index 488b1e8..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenTableModel.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*****************************************************************
- * 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.cayenne.modeler.dialog.db;
-
-import org.apache.cayenne.dbsync.merge.MergeDirection;
-import org.apache.cayenne.dbsync.merge.MergerToken;
-
-import javax.swing.table.AbstractTableModel;
-import java.util.List;
-
-
-public class MergerTokenTableModel extends AbstractTableModel {
-
- public static final int COL_SELECT = 0;
- public static final int COL_DIRECTION = 1;
- public static final int COL_NAME = 2;
- public static final int COL_VALUE = 3;
-
- private MergerTokenSelectorController controller;
-
- private List<MergerToken> tokens;
-
- public MergerTokenTableModel(MergerTokenSelectorController controller) {
- this.controller = controller;
- this.tokens = controller.getSelectableTokens();
- }
-
- private MergerTokenSelectorController getController() {
- return controller;
- }
-
- public Class getColumnClass(int columnIndex) {
- switch (columnIndex) {
- case COL_SELECT:
- return Boolean.class;
- case COL_DIRECTION:
- // TODO: correct?
- return String.class;
- case COL_NAME:
- case COL_VALUE:
- return String.class;
- }
-
- return null;
- }
-
- public int getColumnCount() {
- return 4;
- }
-
- public String getColumnName(int columnIndex) {
- switch (columnIndex) {
- case COL_SELECT:
- return "";
- case COL_NAME:
- return "Operation";
- case COL_DIRECTION:
- return "Direction";
- case COL_VALUE:
- return "";
- }
-
- return null;
- }
-
- public int getRowCount() {
- return tokens.size();
- }
-
- public MergerToken getToken(int rowIndex) {
- return tokens.get(rowIndex);
- }
-
- public Object getValueAt(int rowIndex, int columnIndex) {
- MergerToken token = getToken(rowIndex);
- switch (columnIndex) {
- case COL_SELECT:
- return Boolean.valueOf(getController().isSelected(token));
- case COL_NAME:
- return token.getTokenName();
- case COL_DIRECTION:
- return token.getDirection();
- case COL_VALUE:
- return token.getTokenValue();
- }
- return null;
- }
-
- public boolean isCellEditable(int rowIndex, int columnIndex) {
- switch (columnIndex) {
- case COL_SELECT:
- case COL_DIRECTION:
- return true;
- }
- return false;
- }
-
- public void setValueAt(Object value, int rowIndex, int columnIndex) {
- MergerToken token = getToken(rowIndex);
- switch (columnIndex) {
- case COL_SELECT:
- Boolean val = (Boolean) value;
- getController().select(token, val.booleanValue());
- break;
- case COL_DIRECTION:
- MergeDirection direction = (MergeDirection) value;
- getController().setDirection(token, direction);
- break;
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ModelerDbImportAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ModelerDbImportAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ModelerDbImportAction.java
deleted file mode 100644
index 1b271bb..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ModelerDbImportAction.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * 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.cayenne.modeler.dialog.db;
-
-import org.apache.cayenne.configuration.server.DataSourceFactory;
-import org.apache.cayenne.configuration.server.DbAdapterFactory;
-import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
-import org.apache.cayenne.dbsync.naming.ObjectNameGenerator;
-import org.apache.cayenne.dbsync.reverse.db.DbLoader;
-import org.apache.cayenne.dbsync.reverse.db.DbLoaderDelegate;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.MapLoader;
-import org.apache.cayenne.project.ProjectSaver;
-import org.apache.cayenne.tools.dbimport.DbImportConfiguration;
-import org.apache.cayenne.tools.dbimport.DefaultDbImportAction;
-import org.apache.commons.logging.Log;
-
-import java.io.IOException;
-import java.sql.Connection;
-
-public class ModelerDbImportAction extends DefaultDbImportAction {
-
- private DataMap targetMap;
- private DbLoader dbLoader;
-
- public ModelerDbImportAction(Log logger,
- ProjectSaver projectSaver,
- DataSourceFactory dataSourceFactory,
- DbAdapterFactory adapterFactory,
- MapLoader mapLoader,
- MergerTokenFactoryProvider mergerTokenFactoryProvider,
- DataMap targetMap,
- DbLoader dbLoader
- ) {
-
- super(logger, projectSaver, dataSourceFactory, adapterFactory, mapLoader, mergerTokenFactoryProvider);
-
- this.targetMap = targetMap;
- this.dbLoader = dbLoader;
- }
-
- @Override
- protected DbLoader createDbLoader(DbAdapter adapter,
- Connection connection,
- DbLoaderDelegate dbLoaderDelegate,
- ObjectNameGenerator objectNameGenerator) {
- return dbLoader;
- }
-
- @Override
- protected DataMap existingTargetMap(DbImportConfiguration configuration) throws IOException {
- return targetMap;
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/TableSelectorController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/TableSelectorController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/TableSelectorController.java
deleted file mode 100644
index f9690c2..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/TableSelectorController.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*****************************************************************
- * 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.cayenne.modeler.dialog.db;
-
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.DbAttribute;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.modeler.ProjectController;
-import org.apache.cayenne.modeler.util.CayenneController;
-import org.apache.cayenne.project.Project;
-import org.apache.cayenne.project.validation.ProjectValidator;
-import org.apache.cayenne.swing.BindingBuilder;
-import org.apache.cayenne.swing.ObjectBinding;
-import org.apache.cayenne.swing.TableBindingBuilder;
-import org.apache.cayenne.validation.ValidationFailure;
-import org.apache.cayenne.validation.ValidationResult;
-
-import java.awt.Component;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- */
-public class TableSelectorController extends CayenneController {
-
- protected TableSelectorView view;
- protected ObjectBinding tableBinding;
-
- protected DbEntity table;
- protected List<DbEntity> tables;
- protected int permanentlyExcludedCount;
- protected Map<String, DbEntity> excludedTables;
- protected List<DbEntity> selectableTablesList;
-
- protected Map<String, String> validationMessages;
-
- public TableSelectorController(ProjectController parent) {
- super(parent);
- this.view = new TableSelectorView();
- this.excludedTables = new HashMap<>();
- this.selectableTablesList = new ArrayList<>();
- this.validationMessages = new HashMap<>();
- initController();
- }
-
- public Component getView() {
- return view;
- }
-
- /**
- * Called by table binding script to set current table.
- */
- public void setTable(DbEntity table) {
- this.table = table;
- }
-
- /**
- * Returns DbEntities that are excluded from DB generation.
- */
- public Collection<DbEntity> getExcludedTables() {
- return excludedTables.values();
- }
-
- public List<DbEntity> getTables() {
- return tables;
- }
-
- public boolean isIncluded() {
- if (table == null) {
- return false;
- }
-
- return !excludedTables.containsKey(table.getName());
- }
-
- public void setIncluded(boolean b) {
- if (table == null) {
- return;
- }
-
- if (b) {
- excludedTables.remove(table.getName());
- }
- else {
- excludedTables.put(table.getName(), table);
- }
-
- tableSelectedAction();
- }
-
- /**
- * A callback action that updates the state of Select All checkbox.
- */
- public void tableSelectedAction() {
- int unselectedCount = excludedTables.size() - permanentlyExcludedCount;
-
- if (unselectedCount == selectableTablesList.size()) {
- view.getCheckAll().setSelected(false);
- }
- else if (unselectedCount == 0) {
- view.getCheckAll().setSelected(true);
- }
- }
-
- public Object getProblem() {
- return (table != null) ? validationMessages.get(table.getName()) : null;
- }
-
- // ------ other stuff ------
-
- protected void initController() {
-
- BindingBuilder builder = new BindingBuilder(
- getApplication().getBindingFactory(),
- this);
-
- builder.bindToAction(view.getCheckAll(), "checkAllAction()");
-
- TableBindingBuilder tableBuilder = new TableBindingBuilder(builder);
-
- tableBuilder.addColumn(
- "",
- "setTable(#item), included",
- Boolean.class,
- true,
- Boolean.TRUE);
- tableBuilder.addColumn(
- "Table",
- "#item.name",
- String.class,
- false,
- "XXXXXXXXXXXXXXXX");
- tableBuilder.addColumn(
- "Problems",
- "setTable(#item), problem",
- String.class,
- false,
- "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
-
- this.tableBinding = tableBuilder.bindToTable(view.getTables(), "tables");
- }
-
- /**
- * Performs validation of DbEntities in the current DataMap. Returns a collection of
- * ValidationInfo objects describing the problems.
- */
- public void updateTables(Collection<DataMap> dataMaps) {
- this.tables = new ArrayList<DbEntity>();
-
- for (DataMap dataMap : dataMaps) {
- this.tables.addAll(dataMap.getDbEntities());
- }
-
- excludedTables.clear();
- validationMessages.clear();
-
- // if there were errors, filter out those related to
- // non-derived DbEntities...
-
- // TODO: this is inefficient.. we need targeted validation
- // instead of doing it on the whole project
-
- Project project = getApplication().getProject();
-
- ProjectValidator projectValidator = getApplication().getInjector().getInstance(
- ProjectValidator.class);
- ValidationResult validationResult = projectValidator.validate(project
- .getRootNode());
-
- if (validationResult.getFailures().size() > 0) {
-
- for (ValidationFailure nextProblem : validationResult.getFailures()) {
- DbEntity failedEntity = null;
-
- if (nextProblem.getSource() instanceof DbAttribute) {
- DbAttribute failedAttribute = (DbAttribute) nextProblem.getSource();
- failedEntity = (DbEntity) failedAttribute.getEntity();
- }
- else if (nextProblem.getSource() instanceof DbRelationship) {
- DbRelationship failedRelationship = (DbRelationship) nextProblem
- .getSource();
- failedEntity = (DbEntity) failedRelationship.getSourceEntity();
- }
- else if (nextProblem.getSource() instanceof DbEntity) {
- failedEntity = (DbEntity) nextProblem.getSource();
- }
-
- if (failedEntity == null) {
- continue;
- }
-
- excludedTables.put(failedEntity.getName(), failedEntity);
- validationMessages.put(failedEntity.getName(), nextProblem
- .getDescription());
- }
- }
-
- // Find selectable tables
- permanentlyExcludedCount = excludedTables.size();
- selectableTablesList.clear();
- for (DbEntity table : tables) {
- if (false == excludedTables.containsKey(table.getName())) {
- selectableTablesList.add(table);
- }
- }
-
- tableBinding.updateView();
- tableSelectedAction();
- }
-
- public void checkAllAction() {
-
- boolean isCheckAllSelected = view.getCheckAll().isSelected();
-
- if (isCheckAllSelected) {
- selectableTablesList.clear();
- selectableTablesList.addAll(tables);
- excludedTables.clear();
- }
- else {
- excludedTables.clear();
- for (DbEntity table : tables) {
- excludedTables.put(table.getName(), table);
- }
- selectableTablesList.clear();
- }
-
- tableBinding.updateView();
- }
-}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/TableSelectorView.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/TableSelectorView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/TableSelectorView.java
deleted file mode 100644
index 80bab48..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/TableSelectorView.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*****************************************************************
- * 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.cayenne.modeler.dialog.db;
-
-import java.awt.BorderLayout;
-import java.awt.FlowLayout;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
-
-import javax.swing.JCheckBox;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTable;
-
-import com.jgoodies.forms.builder.PanelBuilder;
-import com.jgoodies.forms.layout.CellConstraints;
-import com.jgoodies.forms.layout.FormLayout;
-
-/**
- */
-public class TableSelectorView extends JPanel {
-
- protected JTable tables;
- protected JCheckBox checkAll;
- protected JLabel checkAllLabel;
-
- public TableSelectorView() {
-
- this.checkAll = new JCheckBox();
- this.checkAllLabel = new JLabel("Check All Tables");
-
- checkAll.addItemListener(new ItemListener() {
-
- public void itemStateChanged(ItemEvent event) {
- if (checkAll.isSelected()) {
- checkAllLabel.setText("Uncheck All Tables");
- }
- else {
- checkAllLabel.setText("Check All Tables");
- }
- }
- });
-
- // assemble
- JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.LEADING));
- topPanel.add(checkAll);
- topPanel.add(checkAllLabel);
-
- tables = new JTable();
- tables.setRowHeight(25);
- tables.setRowMargin(3);
-
- CellConstraints cc = new CellConstraints();
- PanelBuilder builder = new PanelBuilder(new FormLayout(
- "fill:min(50dlu;pref):grow",
- "p, 3dlu, fill:40dlu:grow"));
- builder.setDefaultDialogBorder();
- builder.addSeparator("Select Tables", cc.xy(1, 1));
- builder.add(new JScrollPane(
- tables,
- JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
- JScrollPane.HORIZONTAL_SCROLLBAR_NEVER), cc.xy(1, 3));
-
- setLayout(new BorderLayout());
- add(topPanel, BorderLayout.NORTH);
- add(builder.getPanel(), BorderLayout.CENTER);
- }
-
- public JTable getTables() {
- return tables;
- }
-
- public JCheckBox getCheckAll() {
- return checkAll;
- }
-}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/DBGeneratorOptions.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/DBGeneratorOptions.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/DBGeneratorOptions.java
new file mode 100644
index 0000000..441aba7
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/DBGeneratorOptions.java
@@ -0,0 +1,332 @@
+/*****************************************************************
+ * 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.cayenne.modeler.dialog.db.gen;
+
+import org.apache.cayenne.access.DbGenerator;
+import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.log.NoopJdbcEventLogger;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.modeler.dialog.ValidationResultBrowser;
+import org.apache.cayenne.modeler.dialog.db.DataSourceWizard;
+import org.apache.cayenne.modeler.pref.DBConnectionInfo;
+import org.apache.cayenne.modeler.pref.DBGeneratorDefaults;
+import org.apache.cayenne.modeler.util.CayenneController;
+import org.apache.cayenne.modeler.util.DbAdapterInfo;
+import org.apache.cayenne.swing.BindingBuilder;
+import org.apache.cayenne.swing.ObjectBinding;
+import org.apache.cayenne.validation.ValidationResult;
+
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JFileChooser;
+import javax.swing.JOptionPane;
+import javax.swing.WindowConstants;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import java.awt.Component;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+
+/**
+ */
+public class DBGeneratorOptions extends CayenneController {
+
+ protected DBGeneratorOptionsView view;
+ protected ObjectBinding[] optionBindings;
+ protected ObjectBinding sqlBinding;
+ protected ObjectBinding adapterBinding;
+
+ protected DBConnectionInfo connectionInfo;
+ protected Collection<DataMap> dataMaps;
+ protected DBGeneratorDefaults generatorDefaults;
+ protected Collection<DbGenerator> generators;
+ protected String textForSQL;
+
+ protected TableSelectorController tables;
+
+ public DBGeneratorOptions(ProjectController parent, String title, Collection<DataMap> dataMaps) {
+ super(parent);
+
+ this.dataMaps = dataMaps;
+ this.tables = new TableSelectorController(parent);
+ this.view = new DBGeneratorOptionsView(tables.getView());
+ this.connectionInfo = new DBConnectionInfo();
+ this.generatorDefaults = new DBGeneratorDefaults(parent
+ .getPreferenceForProject()
+ .node("DbGenerator"));
+
+ this.view.setTitle(title);
+ initController();
+ connectionInfo.setDbAdapter((String) view.getAdapters().getSelectedItem());
+
+ tables.updateTables(dataMaps);
+ prepareGenerator();
+ generatorDefaults.configureGenerator(generators);
+ createSQL();
+ refreshView();
+ }
+
+ public Component getView() {
+ return view;
+ }
+
+ public DBGeneratorDefaults getGeneratorDefaults() {
+ return generatorDefaults;
+ }
+
+ public String getTextForSQL() {
+ return textForSQL;
+ }
+
+ protected void initController() {
+
+ DefaultComboBoxModel<String> adapterModel = new DefaultComboBoxModel<>(
+ DbAdapterInfo.getStandardAdapters());
+ view.getAdapters().setModel(adapterModel);
+ view.getAdapters().setSelectedIndex(0);
+
+ BindingBuilder builder = new BindingBuilder(
+ getApplication().getBindingFactory(),
+ this);
+
+ sqlBinding = builder.bindToTextArea(view.getSql(), "textForSQL");
+ adapterBinding = builder.bindToComboSelection(
+ view.getAdapters(),
+ "connectionInfo.dbAdapter",
+ "refreshSQLAction()",
+ "org.apache.cayenne.dba.JdbcAdapter");
+
+ optionBindings = new ObjectBinding[5];
+ optionBindings[0] = builder.bindToStateChangeAndAction(
+ view.getCreateFK(),
+ "generatorDefaults.createFK",
+ "refreshSQLAction()");
+ optionBindings[1] = builder.bindToStateChangeAndAction(
+ view.getCreatePK(),
+ "generatorDefaults.createPK",
+ "refreshSQLAction()");
+ optionBindings[2] = builder.bindToStateChangeAndAction(
+ view.getCreateTables(),
+ "generatorDefaults.createTables",
+ "refreshSQLAction()");
+ optionBindings[3] = builder.bindToStateChangeAndAction(
+ view.getDropPK(),
+ "generatorDefaults.dropPK",
+ "refreshSQLAction()");
+ optionBindings[4] = builder.bindToStateChangeAndAction(
+ view.getDropTables(),
+ "generatorDefaults.dropTables",
+ "refreshSQLAction()");
+
+ builder.bindToAction(view.getGenerateButton(), "generateSchemaAction()");
+ builder.bindToAction(view.getSaveSqlButton(), "storeSQLAction()");
+ builder.bindToAction(view.getCancelButton(), "closeAction()");
+
+ // refresh SQL if different tables were selected
+ view.getTabs().addChangeListener(new ChangeListener() {
+
+ public void stateChanged(ChangeEvent e) {
+ if (view.getTabs().getSelectedIndex() == 0) {
+ // this assumes that some tables where checked/unchecked... not very
+ // efficient
+ refreshGeneratorAction();
+ }
+ }
+ });
+ }
+
+ /**
+ * Creates new internal DbGenerator instance.
+ */
+ protected void prepareGenerator() {
+ try {
+ DbAdapter adapter = connectionInfo.makeAdapter(getApplication()
+ .getClassLoadingService());
+ generators = new ArrayList<>();
+ for (DataMap dataMap : dataMaps) {
+ this.generators.add(new DbGenerator(
+ adapter,
+ dataMap,
+ tables.getExcludedTables(),
+ null,
+ NoopJdbcEventLogger.getInstance()));
+ }
+ } catch (Exception ex) {
+ reportError("Error loading adapter", ex);
+ }
+ }
+
+ /**
+ * Returns SQL statements generated for selected schema generation options.
+ */
+ protected void createSQL() {
+ // convert them to string representation for display
+ StringBuilder buf = new StringBuilder();
+ for (DbGenerator generator : generators) {
+ Iterator<String> it = generator.configuredStatements().iterator();
+ String batchTerminator = generator.getAdapter().getBatchTerminator();
+
+ String lineEnd = (batchTerminator != null)
+ ? "\n" + batchTerminator + "\n\n"
+ : "\n\n";
+
+ while (it.hasNext()) {
+ buf.append(it.next()).append(lineEnd);
+ }
+ }
+
+ textForSQL = buf.toString();
+ }
+
+ protected void refreshView() {
+ getView().setEnabled(connectionInfo != null);
+
+ for (ObjectBinding optionBinding : optionBindings) {
+ optionBinding.updateView();
+ }
+
+ sqlBinding.updateView();
+ }
+
+ // ===============
+ // Actions
+ // ===============
+
+ /**
+ * Starts options dialog.
+ */
+ public void startupAction() {
+ view.pack();
+ view.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
+ view.setModal(true);
+ makeCloseableOnEscape();
+ centerView();
+ view.setVisible(true);
+ }
+
+ public void refreshGeneratorAction() {
+ prepareGenerator();
+ refreshSQLAction();
+ }
+
+ /**
+ * Updates a text area showing generated SQL.
+ */
+ public void refreshSQLAction() {
+ // sync generator with defaults, make SQL, then sync the view...
+ adapterBinding.updateView();
+ connectionInfo.setDbAdapter((String) view.getAdapters().getSelectedItem());
+ prepareGenerator();
+ generatorDefaults.configureGenerator(generators);
+ createSQL();
+ sqlBinding.updateView();
+ }
+
+ /**
+ * Performs configured schema operations via DbGenerator.
+ */
+ public void generateSchemaAction() {
+
+ DataSourceWizard connectWizard = new DataSourceWizard(
+ this.getParent(),
+ "Generate DB Schema: Connect to Database");
+ if (!connectWizard.startupAction()) {
+ return;
+ }
+
+ this.connectionInfo = connectWizard.getConnectionInfo();
+
+ refreshGeneratorAction();
+
+ Collection<ValidationResult> failures = new ArrayList<ValidationResult>();
+
+ // sanity check...
+ for (DbGenerator generator : generators) {
+ if (generator.isEmpty(true)) {
+ JOptionPane.showMessageDialog(getView(), "Nothing to generate.");
+ return;
+ }
+
+ try {
+ generator.runGenerator(connectWizard.getDataSource());
+ failures.add(generator.getFailures());
+ } catch (Throwable th) {
+ reportError("Schema Generation Error", th);
+ }
+ }
+
+ if (failures.size() == 0) {
+ JOptionPane.showMessageDialog(getView(), "Schema Generation Complete.");
+ } else {
+ new ValidationResultBrowser(this)
+ .startupAction(
+ "Schema Generation Complete",
+ "Schema generation finished. The following problem(s) were ignored.",
+ failures);
+ }
+ }
+
+ /**
+ * Allows user to save generated SQL in a file.
+ */
+ public void storeSQLAction() {
+ JFileChooser fc = new JFileChooser();
+ fc.setDialogType(JFileChooser.SAVE_DIALOG);
+ fc.setDialogTitle("Save SQL Script");
+
+ File projectDir = new File(getApplication()
+ .getProject()
+ .getConfigurationResource()
+ .getURL()
+ .getPath());
+ fc.setCurrentDirectory(projectDir);
+ if (fc.showSaveDialog(getView()) == JFileChooser.APPROVE_OPTION) {
+ refreshGeneratorAction();
+ try {
+ File file = fc.getSelectedFile();
+ FileWriter fw = new FileWriter(file);
+ PrintWriter pw = new PrintWriter(fw);
+ pw.print(textForSQL);
+ pw.flush();
+ pw.close();
+ } catch (IOException ex) {
+ reportError("Error Saving SQL", ex);
+ }
+ }
+ }
+
+ public void closeAction() {
+ view.dispose();
+ }
+
+ public DBConnectionInfo getConnectionInfo() {
+ return this.connectionInfo;
+ }
+
+ public void setConnectionInfo(DBConnectionInfo connectionInfo) {
+ this.connectionInfo = connectionInfo;
+ refreshView();
+ }
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/DBGeneratorOptionsView.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/DBGeneratorOptionsView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/DBGeneratorOptionsView.java
new file mode 100644
index 0000000..724d3f1
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/DBGeneratorOptionsView.java
@@ -0,0 +1,178 @@
+/*****************************************************************
+ * 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.cayenne.modeler.dialog.db.gen;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.GridLayout;
+
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTabbedPane;
+import javax.swing.JTextArea;
+import javax.swing.ScrollPaneConstants;
+import javax.swing.SwingConstants;
+
+import com.jgoodies.forms.builder.PanelBuilder;
+import com.jgoodies.forms.layout.CellConstraints;
+import com.jgoodies.forms.layout.FormLayout;
+
+/**
+ * Wizard for generating the database from the data map.
+ */
+public class DBGeneratorOptionsView extends JDialog {
+
+ protected JTextArea sql;
+ protected JButton generateButton;
+ protected JButton cancelButton;
+ protected JButton saveSqlButton;
+ protected JCheckBox dropTables;
+ protected JCheckBox createTables;
+ protected JCheckBox createFK;
+ protected JCheckBox createPK;
+ protected JCheckBox dropPK;
+ protected Component tables;
+ protected JTabbedPane tabs;
+ protected JComboBox<String> adapters;
+
+ public DBGeneratorOptionsView(Component tables) {
+ // create widgets
+ this.generateButton = new JButton("Generate");
+ this.cancelButton = new JButton("Close");
+ this.saveSqlButton = new JButton("Save SQL");
+ this.dropTables = new JCheckBox("Drop Tables");
+ this.createTables = new JCheckBox("Create Tables");
+ this.createFK = new JCheckBox("Create FK Support");
+ this.createPK = new JCheckBox("Create Primary Key Support");
+ this.dropPK = new JCheckBox("Drop Primary Key Support");
+ this.tables = tables;
+ this.tabs = new JTabbedPane(SwingConstants.TOP);
+ this.adapters = new JComboBox<>();
+ adapters.setEditable(true);
+ this.sql = new JTextArea();
+ sql.setEditable(false);
+ sql.setLineWrap(true);
+ sql.setWrapStyleWord(true);
+
+ // assemble...
+ JPanel optionsPane = new JPanel(new GridLayout(3, 2));
+ optionsPane.add(dropTables);
+ optionsPane.add(createTables);
+ optionsPane.add(new JLabel());
+ optionsPane.add(createFK);
+ optionsPane.add(dropPK);
+ optionsPane.add(createPK);
+
+ JPanel sqlTextPanel = new JPanel(new BorderLayout());
+ sqlTextPanel.add(new JScrollPane(
+ sql,
+ ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
+ ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), BorderLayout.CENTER);
+
+ JPanel adapterPanel = new JPanel(new BorderLayout());
+ adapterPanel.add(adapters);
+
+ CellConstraints cc = new CellConstraints();
+ PanelBuilder builder = new PanelBuilder(new FormLayout(
+ "fill:min(50dlu;pref):grow",
+ "p, 3dlu, p, 9dlu, p, 3dlu, p, 3dlu, p, 3dlu, fill:40dlu:grow"));
+ builder.setDefaultDialogBorder();
+ builder.addSeparator("Options", cc.xywh(1, 1, 1, 1));
+ builder.add(optionsPane, cc.xy(1, 3, "left,fill"));
+ builder.addSeparator("Adapter", cc.xywh(1, 5, 1, 1));
+ builder.add(adapterPanel, cc.xy(1, 7));
+ builder.addSeparator("Generated SQL", cc.xywh(1, 9, 1, 1));
+ builder.add(sqlTextPanel, cc.xy(1, 11));
+
+ tabs.addTab("SQL Options", builder.getPanel());
+ tabs.addTab("Tables", new JScrollPane(
+ tables,
+ ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
+ ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED));
+
+ // we need the right preferred size so that dialog "pack()" produces decent
+ // default size...
+ tabs.setPreferredSize(new Dimension(450, 500));
+
+ JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
+ buttons.add(saveSqlButton);
+ buttons.add(Box.createHorizontalStrut(20));
+ buttons.add(cancelButton);
+ buttons.add(generateButton);
+
+ Container contentPane = this.getContentPane();
+ contentPane.setLayout(new BorderLayout());
+ contentPane.add(tabs, BorderLayout.CENTER);
+ contentPane.add(buttons, BorderLayout.SOUTH);
+ }
+
+ public JButton getCancelButton() {
+ return cancelButton;
+ }
+
+ public JTabbedPane getTabs() {
+ return tabs;
+ }
+
+ public JCheckBox getCreateFK() {
+ return createFK;
+ }
+
+ public JCheckBox getCreatePK() {
+ return createPK;
+ }
+
+ public JCheckBox getCreateTables() {
+ return createTables;
+ }
+
+ public JCheckBox getDropPK() {
+ return dropPK;
+ }
+
+ public JCheckBox getDropTables() {
+ return dropTables;
+ }
+
+ public JButton getGenerateButton() {
+ return generateButton;
+ }
+
+ public JButton getSaveSqlButton() {
+ return saveSqlButton;
+ }
+
+ public JTextArea getSql() {
+ return sql;
+ }
+
+ public JComboBox<String> getAdapters() {
+ return adapters;
+ }
+}
[02/10] cayenne git commit: CAY-2172 Split DB actions to different
packages Clean up ReverseEngineeringAction Clean up DataSource select dialogs
Posted by sk...@apache.org.
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/TableSelectorController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/TableSelectorController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/TableSelectorController.java
new file mode 100644
index 0000000..9304e52
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/TableSelectorController.java
@@ -0,0 +1,251 @@
+/*****************************************************************
+ * 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.cayenne.modeler.dialog.db.gen;
+
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.DbAttribute;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.DbRelationship;
+import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.modeler.util.CayenneController;
+import org.apache.cayenne.project.Project;
+import org.apache.cayenne.project.validation.ProjectValidator;
+import org.apache.cayenne.swing.BindingBuilder;
+import org.apache.cayenne.swing.ObjectBinding;
+import org.apache.cayenne.swing.TableBindingBuilder;
+import org.apache.cayenne.validation.ValidationFailure;
+import org.apache.cayenne.validation.ValidationResult;
+
+import java.awt.Component;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ */
+public class TableSelectorController extends CayenneController {
+
+ protected TableSelectorView view;
+ protected ObjectBinding tableBinding;
+
+ protected DbEntity table;
+ protected List<DbEntity> tables;
+ protected int permanentlyExcludedCount;
+ protected Map<String, DbEntity> excludedTables;
+ protected List<DbEntity> selectableTablesList;
+
+ protected Map<String, String> validationMessages;
+
+ public TableSelectorController(ProjectController parent) {
+ super(parent);
+ this.view = new TableSelectorView();
+ this.excludedTables = new HashMap<>();
+ this.selectableTablesList = new ArrayList<>();
+ this.validationMessages = new HashMap<>();
+ initController();
+ }
+
+ public Component getView() {
+ return view;
+ }
+
+ /**
+ * Called by table binding script to set current table.
+ */
+ public void setTable(DbEntity table) {
+ this.table = table;
+ }
+
+ /**
+ * Returns DbEntities that are excluded from DB generation.
+ */
+ public Collection<DbEntity> getExcludedTables() {
+ return excludedTables.values();
+ }
+
+ public List<DbEntity> getTables() {
+ return tables;
+ }
+
+ public boolean isIncluded() {
+ if (table == null) {
+ return false;
+ }
+
+ return !excludedTables.containsKey(table.getName());
+ }
+
+ public void setIncluded(boolean b) {
+ if (table == null) {
+ return;
+ }
+
+ if (b) {
+ excludedTables.remove(table.getName());
+ }
+ else {
+ excludedTables.put(table.getName(), table);
+ }
+
+ tableSelectedAction();
+ }
+
+ /**
+ * A callback action that updates the state of Select All checkbox.
+ */
+ public void tableSelectedAction() {
+ int unselectedCount = excludedTables.size() - permanentlyExcludedCount;
+
+ if (unselectedCount == selectableTablesList.size()) {
+ view.getCheckAll().setSelected(false);
+ }
+ else if (unselectedCount == 0) {
+ view.getCheckAll().setSelected(true);
+ }
+ }
+
+ public Object getProblem() {
+ return (table != null) ? validationMessages.get(table.getName()) : null;
+ }
+
+ // ------ other stuff ------
+
+ protected void initController() {
+
+ BindingBuilder builder = new BindingBuilder(
+ getApplication().getBindingFactory(),
+ this);
+
+ builder.bindToAction(view.getCheckAll(), "checkAllAction()");
+
+ TableBindingBuilder tableBuilder = new TableBindingBuilder(builder);
+
+ tableBuilder.addColumn(
+ "",
+ "setTable(#item), included",
+ Boolean.class,
+ true,
+ Boolean.TRUE);
+ tableBuilder.addColumn(
+ "Table",
+ "#item.name",
+ String.class,
+ false,
+ "XXXXXXXXXXXXXXXX");
+ tableBuilder.addColumn(
+ "Problems",
+ "setTable(#item), problem",
+ String.class,
+ false,
+ "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
+
+ this.tableBinding = tableBuilder.bindToTable(view.getTables(), "tables");
+ }
+
+ /**
+ * Performs validation of DbEntities in the current DataMap. Returns a collection of
+ * ValidationInfo objects describing the problems.
+ */
+ public void updateTables(Collection<DataMap> dataMaps) {
+ this.tables = new ArrayList<DbEntity>();
+
+ for (DataMap dataMap : dataMaps) {
+ this.tables.addAll(dataMap.getDbEntities());
+ }
+
+ excludedTables.clear();
+ validationMessages.clear();
+
+ // if there were errors, filter out those related to
+ // non-derived DbEntities...
+
+ // TODO: this is inefficient.. we need targeted validation
+ // instead of doing it on the whole project
+
+ Project project = getApplication().getProject();
+
+ ProjectValidator projectValidator = getApplication().getInjector().getInstance(
+ ProjectValidator.class);
+ ValidationResult validationResult = projectValidator.validate(project
+ .getRootNode());
+
+ if (validationResult.getFailures().size() > 0) {
+
+ for (ValidationFailure nextProblem : validationResult.getFailures()) {
+ DbEntity failedEntity = null;
+
+ if (nextProblem.getSource() instanceof DbAttribute) {
+ DbAttribute failedAttribute = (DbAttribute) nextProblem.getSource();
+ failedEntity = (DbEntity) failedAttribute.getEntity();
+ }
+ else if (nextProblem.getSource() instanceof DbRelationship) {
+ DbRelationship failedRelationship = (DbRelationship) nextProblem
+ .getSource();
+ failedEntity = (DbEntity) failedRelationship.getSourceEntity();
+ }
+ else if (nextProblem.getSource() instanceof DbEntity) {
+ failedEntity = (DbEntity) nextProblem.getSource();
+ }
+
+ if (failedEntity == null) {
+ continue;
+ }
+
+ excludedTables.put(failedEntity.getName(), failedEntity);
+ validationMessages.put(failedEntity.getName(), nextProblem
+ .getDescription());
+ }
+ }
+
+ // Find selectable tables
+ permanentlyExcludedCount = excludedTables.size();
+ selectableTablesList.clear();
+ for (DbEntity table : tables) {
+ if (false == excludedTables.containsKey(table.getName())) {
+ selectableTablesList.add(table);
+ }
+ }
+
+ tableBinding.updateView();
+ tableSelectedAction();
+ }
+
+ public void checkAllAction() {
+
+ boolean isCheckAllSelected = view.getCheckAll().isSelected();
+
+ if (isCheckAllSelected) {
+ selectableTablesList.clear();
+ selectableTablesList.addAll(tables);
+ excludedTables.clear();
+ }
+ else {
+ excludedTables.clear();
+ for (DbEntity table : tables) {
+ excludedTables.put(table.getName(), table);
+ }
+ selectableTablesList.clear();
+ }
+
+ tableBinding.updateView();
+ }
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/TableSelectorView.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/TableSelectorView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/TableSelectorView.java
new file mode 100644
index 0000000..f618e65
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/TableSelectorView.java
@@ -0,0 +1,94 @@
+/*****************************************************************
+ * 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.cayenne.modeler.dialog.db.gen;
+
+import java.awt.BorderLayout;
+import java.awt.FlowLayout;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+
+import javax.swing.JCheckBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+
+import com.jgoodies.forms.builder.PanelBuilder;
+import com.jgoodies.forms.layout.CellConstraints;
+import com.jgoodies.forms.layout.FormLayout;
+
+/**
+ */
+public class TableSelectorView extends JPanel {
+
+ protected JTable tables;
+ protected JCheckBox checkAll;
+ protected JLabel checkAllLabel;
+
+ public TableSelectorView() {
+
+ this.checkAll = new JCheckBox();
+ this.checkAllLabel = new JLabel("Check All Tables");
+
+ checkAll.addItemListener(new ItemListener() {
+
+ public void itemStateChanged(ItemEvent event) {
+ if (checkAll.isSelected()) {
+ checkAllLabel.setText("Uncheck All Tables");
+ }
+ else {
+ checkAllLabel.setText("Check All Tables");
+ }
+ }
+ });
+
+ // assemble
+ JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.LEADING));
+ topPanel.add(checkAll);
+ topPanel.add(checkAllLabel);
+
+ tables = new JTable();
+ tables.setRowHeight(25);
+ tables.setRowMargin(3);
+
+ CellConstraints cc = new CellConstraints();
+ PanelBuilder builder = new PanelBuilder(new FormLayout(
+ "fill:min(50dlu;pref):grow",
+ "p, 3dlu, fill:40dlu:grow"));
+ builder.setDefaultDialogBorder();
+ builder.addSeparator("Select Tables", cc.xy(1, 1));
+ builder.add(new JScrollPane(
+ tables,
+ JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
+ JScrollPane.HORIZONTAL_SCROLLBAR_NEVER), cc.xy(1, 3));
+
+ setLayout(new BorderLayout());
+ add(topPanel, BorderLayout.NORTH);
+ add(builder.getPanel(), BorderLayout.CENTER);
+ }
+
+ public JTable getTables() {
+ return tables;
+ }
+
+ public JCheckBox getCheckAll() {
+ return checkAll;
+ }
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbImportProjectSaver.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbImportProjectSaver.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbImportProjectSaver.java
new file mode 100644
index 0000000..2a58363
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbImportProjectSaver.java
@@ -0,0 +1,74 @@
+/*****************************************************************
+ * 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.cayenne.modeler.dialog.db.load;
+
+import org.apache.cayenne.configuration.ConfigurationNameMapper;
+import org.apache.cayenne.configuration.DataChannelDescriptor;
+import org.apache.cayenne.configuration.event.DataMapEvent;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.event.MapEvent;
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.project.Project;
+import org.apache.cayenne.project.ProjectSaver;
+import org.apache.cayenne.resource.Resource;
+
+public class DbImportProjectSaver implements ProjectSaver {
+
+ private ConfigurationNameMapper nameMapper;
+
+ private ProjectController projectController;
+
+ public DbImportProjectSaver(@Inject ProjectController projectController, @Inject ConfigurationNameMapper nameMapper) {
+ this.projectController = projectController;
+ this.nameMapper = nameMapper;
+ }
+
+ @Override
+ public String getSupportedVersion() {
+ // not important in the context of non-saving saver
+ return "-1";
+ }
+
+ @Override
+ public void save(Project project) {
+
+ DataMap dataMap = (DataMap) project.getRootNode();
+
+ if (projectController.getCurrentDataMap() != null) {
+ projectController.fireDataMapEvent(new DataMapEvent(Application.getFrame(), dataMap, MapEvent.REMOVE));
+ projectController.fireDataMapEvent(new DataMapEvent(Application.getFrame(), dataMap, MapEvent.ADD));
+ } else {
+ DataChannelDescriptor currentDomain = (DataChannelDescriptor) projectController.getProject().getRootNode();
+ Resource baseResource = currentDomain.getConfigurationSource();
+ // a new DataMap, so need to set configuration source for it
+ if (baseResource != null) {
+ Resource dataMapResource = baseResource.getRelativeResource(nameMapper.configurationLocation(dataMap));
+ dataMap.setConfigurationSource(dataMapResource);
+ }
+ projectController.addDataMap(Application.getFrame(), dataMap);
+ }
+ }
+
+ @Override
+ public void saveAs(Project project, Resource baseDirectory) {
+ save(project);
+ }
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderContext.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderContext.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderContext.java
new file mode 100644
index 0000000..6a550a6
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderContext.java
@@ -0,0 +1,176 @@
+/*****************************************************************
+ * 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.cayenne.modeler.dialog.db.load;
+
+import java.io.File;
+import java.sql.Connection;
+import javax.swing.JOptionPane;
+import javax.swing.SwingUtilities;
+
+import org.apache.cayenne.configuration.ConfigurationNode;
+import org.apache.cayenne.dbimport.Catalog;
+import org.apache.cayenne.dbimport.ExcludeTable;
+import org.apache.cayenne.dbimport.IncludeProcedure;
+import org.apache.cayenne.dbimport.IncludeTable;
+import org.apache.cayenne.dbimport.ReverseEngineering;
+import org.apache.cayenne.dbimport.Schema;
+import org.apache.cayenne.dbsync.naming.NameBuilder;
+import org.apache.cayenne.dbsync.reverse.db.DbLoaderDelegate;
+import org.apache.cayenne.dbsync.reverse.filters.FiltersConfigBuilder;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.modeler.dialog.db.DataSourceWizard;
+import org.apache.cayenne.modeler.pref.DBConnectionInfo;
+import org.apache.cayenne.tools.dbimport.DbImportConfiguration;
+import org.apache.cayenne.util.Util;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public class DbLoaderContext {
+
+ private static Log LOGGER = LogFactory.getLog(DbLoaderContext.class);
+
+ private DbImportConfiguration config;
+ private Connection connection;
+ private ProjectController projectController;
+ private boolean existingMap;
+ private DataMap dataMap;
+ private boolean stopping;
+ private String loadStatusNote;
+
+ public DbLoaderContext() {
+ }
+
+ DataMap getDataMap() {
+ return dataMap;
+ }
+
+ boolean isExistingDataMap() {
+ return existingMap;
+ }
+
+ public void setProjectController(ProjectController projectController) {
+ this.projectController = projectController;
+ }
+
+ ProjectController getProjectController() {
+ return projectController;
+ }
+
+ void setConfig(DbImportConfiguration config) {
+ this.config = config;
+ }
+
+ DbImportConfiguration getConfig() {
+ return config;
+ }
+
+ public void setConnection(Connection connection) {
+ this.connection = connection;
+ }
+
+ public Connection getConnection() {
+ return connection;
+ }
+
+ public boolean isStopping() {
+ return stopping;
+ }
+
+ void setStopping(boolean stopping) {
+ this.stopping = stopping;
+ }
+
+ String getStatusNote() {
+ return loadStatusNote;
+ }
+
+ void setStatusNote(String loadStatusNote) {
+ this.loadStatusNote = loadStatusNote;
+ }
+
+ public boolean buildConfig(DataSourceWizard connectionWizard, DbLoaderOptionsDialog dialog) {
+ if (dialog == null || connectionWizard == null) {
+ return false;
+ }
+
+ // Build filters
+ ReverseEngineering reverseEngineering = new ReverseEngineering();
+ reverseEngineering.addCatalog(new Catalog(dialog.getSelectedCatalog()));
+ reverseEngineering.addSchema(new Schema(dialog.getSelectedSchema()));
+ reverseEngineering.addIncludeTable(new IncludeTable(dialog.getTableNamePattern()));
+ reverseEngineering.addExcludeTable(new ExcludeTable("auto_pk_support|AUTO_PK_SUPPORT"));
+ reverseEngineering.addIncludeProcedure(new IncludeProcedure(dialog.getProcedureNamePattern()));
+ FiltersConfigBuilder filtersConfigBuilder = new FiltersConfigBuilder(reverseEngineering);
+
+ DbImportConfiguration config = new DbImportConfiguration() {
+ @Override
+ public DbLoaderDelegate createLoaderDelegate() {
+ return new LoaderDelegate(DbLoaderContext.this);
+ }
+ };
+
+ // Build config
+ DBConnectionInfo connectionInfo = connectionWizard.getConnectionInfo();
+ config.setAdapter(connectionWizard.getAdapter().getClass().getName());
+ config.setUsername(connectionInfo.getUserName());
+ config.setPassword(connectionInfo.getPassword());
+ config.setDriver(connectionInfo.getJdbcDriver());
+ config.setUrl(connectionInfo.getUrl());
+ config.getDbLoaderConfig().setFiltersConfig(filtersConfigBuilder.build());
+ config.setMeaningfulPkTables(dialog.getMeaningfulPk());
+ config.setNamingStrategy(dialog.getNamingStrategy());
+ setConfig(config);
+
+ prepareDataMap();
+
+ return true;
+ }
+
+ private void prepareDataMap() {
+ dataMap = getProjectController().getCurrentDataMap();
+ existingMap = dataMap != null;
+
+ if (!existingMap) {
+ ConfigurationNode root = getProjectController().getProject().getRootNode();
+ dataMap = new DataMap();
+ dataMap.setName(NameBuilder.builder(dataMap, root).name());
+ }
+ if (dataMap.getConfigurationSource() != null) {
+ getConfig().setTargetDataMap(new File(dataMap.getConfigurationSource().getURL().getPath()));
+ }
+ }
+
+ public void processWarn(final Throwable th, final String message) {
+ LOGGER.warn(message, Util.unwindException(th));
+ }
+
+ public void processException(final Throwable th, final String message) {
+ LOGGER.info("Exception on reverse engineering", Util.unwindException(th));
+ SwingUtilities.invokeLater(new Runnable() {
+
+ public void run() {
+ JOptionPane.showMessageDialog(Application.getFrame(), th.getMessage(), message,
+ JOptionPane.ERROR_MESSAGE);
+ }
+ });
+ }
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderOptionsDialog.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderOptionsDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderOptionsDialog.java
new file mode 100644
index 0000000..1ccc7aa
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderOptionsDialog.java
@@ -0,0 +1,247 @@
+/*****************************************************************
+ * 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.cayenne.modeler.dialog.db.load;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+import com.jgoodies.forms.layout.FormLayout;
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.util.CayenneDialog;
+import org.apache.cayenne.modeler.util.NameGeneratorPreferences;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.Collection;
+import java.util.Vector;
+
+/**
+ * Dialog for selecting database reverse-engineering parameters.
+ */
+public class DbLoaderOptionsDialog extends CayenneDialog {
+
+ public static final String WILDCARD_PATTERN = ".*";
+
+ public static final int CANCEL = 0;
+ public static final int SELECT = 1;
+
+ protected JLabel catalogLabel;
+ protected JComboBox<String> catalogSelector;
+ protected JLabel schemaLabel;
+ protected JComboBox<String> schemaSelector;
+ protected JTextField tableNamePatternField;
+ protected JTextField meaningfulPk;
+ protected JTextField procNamePatternField;
+ protected JLabel procedureLabel;
+ protected JButton selectButton;
+ protected JButton cancelButton;
+
+
+ protected JComboBox<String> strategyCombo;
+ protected String strategy;
+ protected int choice;
+
+ /**
+ * Creates and initializes new ChooseSchemaDialog.
+ */
+ public DbLoaderOptionsDialog(Collection<String> schemas, Collection<String> catalogs, String currentSchema,
+ String dbCatalog) {
+ super(Application.getFrame(), "Reengineer DB Schema: Select Options");
+
+ init();
+ initController();
+ initFromModel(schemas, catalogs, currentSchema, dbCatalog);
+
+ pack();
+ setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
+ setModal(true);
+ centerWindow();
+ }
+
+ /** Sets up the graphical components. */
+ protected void init() {
+
+ // create widgets...
+ selectButton = new JButton("Continue");
+ cancelButton = new JButton("Cancel");
+ catalogSelector = new JComboBox<>();
+ schemaSelector = new JComboBox<>();
+ tableNamePatternField = new JTextField();
+ tableNamePatternField.setToolTipText("<html>Regular expression to filter table names.<br>" +
+ "Default expression <b>.*</b> includes all tables.</html>");
+ procNamePatternField = new JTextField();
+ procNamePatternField.setToolTipText("<html>Regular expression to filter stored procedures names.<br>" +
+ "Default expression .* includes all stored procedures.</html>");
+ meaningfulPk = new JTextField();
+ meaningfulPk.setToolTipText("<html>Regular expression to filter tables with meaningful primary keys.<br>" +
+ "Multiple expressions divided by comma can be used.<br>" +
+ "Example: <b>^table1,^table2,^prefix.*</b></html>");
+ strategyCombo = new JComboBox<>();
+ strategyCombo.setEditable(true);
+
+ // assemble
+ FormLayout layout = new FormLayout(
+ "right:pref, 3dlu, fill:max(170dlu;pref):grow",
+ "");
+ DefaultFormBuilder builder = new DefaultFormBuilder(layout);
+ builder.setDefaultDialogBorder();
+
+ catalogLabel = builder.append("Select Catalog:", catalogSelector);
+ schemaLabel = builder.append("Select Schema:", schemaSelector);
+ builder.append("Table Name Pattern:", tableNamePatternField);
+ procedureLabel = builder.append("Procedure Name Pattern:", procNamePatternField);
+ builder.append("Naming Strategy:", strategyCombo);
+ builder.append("Tables with Meaningful PK Pattern:", meaningfulPk);
+
+ JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
+ buttons.add(cancelButton);
+ buttons.add(selectButton);
+
+ getContentPane().setLayout(new BorderLayout());
+ getContentPane().add(builder.getPanel(), BorderLayout.CENTER);
+ getContentPane().add(buttons, BorderLayout.SOUTH);
+ }
+
+ protected void initController() {
+ selectButton.addActionListener(new ActionListener() {
+
+ public void actionPerformed(ActionEvent e) {
+ processSelect();
+ }
+ });
+ cancelButton.addActionListener(new ActionListener() {
+
+ public void actionPerformed(ActionEvent e) {
+ processCancel();
+ }
+ });
+ }
+
+ protected void initFromModel(
+ Collection<String> schemas,
+ Collection<String> catalogs,
+ String currentSchema,
+ String currentCatalog) {
+
+ this.choice = CANCEL;
+ this.tableNamePatternField.setText(WILDCARD_PATTERN);
+ this.procNamePatternField.setText(WILDCARD_PATTERN);
+
+ Vector<String> arr = NameGeneratorPreferences
+ .getInstance()
+ .getLastUsedStrategies();
+ strategyCombo.setModel(new DefaultComboBoxModel<>(arr));
+
+ boolean showSchemaSelector = schemas != null && !schemas.isEmpty();
+ schemaSelector.setVisible(showSchemaSelector);
+ schemaLabel.setVisible(showSchemaSelector);
+
+ if (showSchemaSelector) {
+
+ schemaSelector.setModel(new DefaultComboBoxModel<>(schemas.toArray(new String[0])));
+
+ if (currentSchema != null) {
+ for (String schema : schemas) {
+ if (currentSchema.equalsIgnoreCase(schema)) {
+ schemaSelector.setSelectedItem(schema);
+ break;
+ }
+ }
+ }
+ }
+
+ boolean showCatalogSelector = catalogs != null && !catalogs.isEmpty();
+ catalogSelector.setVisible(showCatalogSelector);
+ catalogLabel.setVisible(showCatalogSelector);
+
+ if (showCatalogSelector) {
+ catalogSelector.setModel(new DefaultComboBoxModel<>(catalogs.toArray(new String[0])));
+
+ if (currentCatalog != null && !currentCatalog.isEmpty()) {
+ for (String catalog : catalogs) {
+ if (currentCatalog.equalsIgnoreCase(catalog)) {
+ catalogSelector.setSelectedItem(catalog);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ public int getChoice() {
+ return choice;
+ }
+
+ private void processSelect() {
+ strategy = (String) strategyCombo.getSelectedItem();
+
+ choice = SELECT;
+ setVisible(false);
+ }
+
+ private void processCancel() {
+ choice = CANCEL;
+ setVisible(false);
+ }
+
+ /**
+ * Returns selected catalog.
+ */
+ public String getSelectedCatalog() {
+ String catalog = (String) catalogSelector.getSelectedItem();
+ return "".equals(catalog) ? null : catalog;
+ }
+
+ /**
+ * Returns selected schema.
+ */
+ public String getSelectedSchema() {
+ String schema = (String) schemaSelector.getSelectedItem();
+ return "".equals(schema) ? null : schema;
+ }
+
+ /**
+ * Returns the tableNamePattern.
+ */
+ public String getTableNamePattern() {
+ return "".equals(tableNamePatternField.getText()) ? null : tableNamePatternField
+ .getText();
+ }
+
+ public String getMeaningfulPk() {
+ return "".equals(meaningfulPk.getText()) ? null : meaningfulPk
+ .getText();
+ }
+
+ /**
+ * Returns the procedure name pattern.
+ */
+ public String getProcedureNamePattern() {
+ return "".equals(procNamePatternField.getText()) ? null : procNamePatternField
+ .getText();
+ }
+
+ /**
+ * Returns configured naming strategy
+ */
+ public String getNamingStrategy() {
+ return strategy;
+ }
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoadDataMapTask.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoadDataMapTask.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoadDataMapTask.java
new file mode 100644
index 0000000..ceb0d44
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoadDataMapTask.java
@@ -0,0 +1,94 @@
+/*****************************************************************
+ * 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.cayenne.modeler.dialog.db.load;
+
+import javax.swing.JFrame;
+
+import org.apache.cayenne.dbsync.DbSyncModule;
+import org.apache.cayenne.di.DIBootstrap;
+import org.apache.cayenne.di.Injector;
+import org.apache.cayenne.modeler.util.LongRunningTask;
+import org.apache.cayenne.modeler.util.ProjectUtil;
+import org.apache.cayenne.tools.configuration.ToolsModule;
+import org.apache.cayenne.tools.dbimport.DbImportAction;
+import org.apache.cayenne.tools.dbimport.DbImportModule;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+final public class LoadDataMapTask extends LongRunningTask {
+
+ private static Log LOGGER = LogFactory.getLog(DbLoaderContext.class);
+
+ private DbLoaderContext context;
+
+ public LoadDataMapTask(JFrame frame, String title, DbLoaderContext context) {
+ super(frame, title);
+ setMinValue(0);
+ setMaxValue(10);
+ this.context = context;
+ }
+
+ @Override
+ protected void execute() {
+ context.setStatusNote("Preparing...");
+ try {
+ createAction().execute(context.getConfig());
+ } catch (Exception e) {
+ context.processException(e, "Error importing database schema.");
+ }
+ ProjectUtil.cleanObjMappings(context.getDataMap());
+ }
+
+ private DbImportAction createAction() {
+ Injector injector = DIBootstrap.createInjector(new DbSyncModule(),
+ new ToolsModule(LOGGER),
+ new DbImportModule(),
+ new ModelerSyncModule(context));
+ return injector.getInstance(DbImportAction.class);
+ }
+
+ @Override
+ protected String getCurrentNote() {
+ return context.getStatusNote();
+ }
+
+ @Override
+ protected int getCurrentValue() {
+ return getMinValue();
+ }
+
+ @Override
+ protected boolean isIndeterminate() {
+ return true;
+ }
+
+ @Override
+ public boolean isCanceled() {
+ return context.isStopping();
+ }
+
+ @Override
+ public void setCanceled(boolean canceled) {
+ if (canceled) {
+ context.setStatusNote("Canceling..");
+ }
+ context.setStopping(canceled);
+ }
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoaderDelegate.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoaderDelegate.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoaderDelegate.java
new file mode 100644
index 0000000..92043fc
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoaderDelegate.java
@@ -0,0 +1,71 @@
+/*****************************************************************
+ * 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.cayenne.modeler.dialog.db.load;
+
+import org.apache.cayenne.CayenneRuntimeException;
+import org.apache.cayenne.dbsync.reverse.db.DefaultDbLoaderDelegate;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.DbRelationship;
+import org.apache.cayenne.map.event.EntityEvent;
+import org.apache.cayenne.map.event.MapEvent;
+import org.apache.cayenne.modeler.Application;
+
+final class LoaderDelegate extends DefaultDbLoaderDelegate {
+
+ private DbLoaderContext context;
+
+ LoaderDelegate(DbLoaderContext dbLoaderContext) {
+ this.context = dbLoaderContext;
+ }
+
+ @Override
+ public void dbEntityAdded(DbEntity entity) {
+ checkCanceled();
+ context.setStatusNote("Importing table '" + entity.getName() + "'...");
+ }
+
+ @Override
+ public void dbEntityRemoved(DbEntity entity) {
+ checkCanceled();
+ if (context.isExistingDataMap()) {
+ context.getProjectController().fireDbEntityEvent(new EntityEvent(Application.getFrame(), entity, MapEvent.REMOVE));
+ }
+ }
+
+ @Override
+ public boolean dbRelationship(DbEntity entity) {
+ checkCanceled();
+ context.setStatusNote("Load relationships for '" + entity.getName() + "'...");
+ return true;
+ }
+
+ @Override
+ public boolean dbRelationshipLoaded(DbEntity entity, DbRelationship relationship) {
+ checkCanceled();
+ context.setStatusNote("Load relationship: '" + entity.getName() + "'; '" + relationship.getName() + "'...");
+ return true;
+ }
+
+ private void checkCanceled() {
+ if (context.isStopping()) {
+ throw new CayenneRuntimeException("Reengineering was canceled.");
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/ModelerDbImportAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/ModelerDbImportAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/ModelerDbImportAction.java
new file mode 100644
index 0000000..34ad1b5
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/ModelerDbImportAction.java
@@ -0,0 +1,53 @@
+/*****************************************************************
+ * 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.cayenne.modeler.dialog.db.load;
+
+import org.apache.cayenne.configuration.server.DataSourceFactory;
+import org.apache.cayenne.configuration.server.DbAdapterFactory;
+import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.MapLoader;
+import org.apache.cayenne.project.ProjectSaver;
+import org.apache.cayenne.tools.dbimport.DbImportConfiguration;
+import org.apache.cayenne.tools.dbimport.DefaultDbImportAction;
+import org.apache.commons.logging.Log;
+
+import java.io.IOException;
+
+public class ModelerDbImportAction extends DefaultDbImportAction {
+
+ @Inject
+ private DataMap targetMap;
+
+ public ModelerDbImportAction(@Inject Log logger,
+ @Inject ProjectSaver projectSaver,
+ @Inject DataSourceFactory dataSourceFactory,
+ @Inject DbAdapterFactory adapterFactory,
+ @Inject MapLoader mapLoader,
+ @Inject MergerTokenFactoryProvider mergerTokenFactoryProvider
+ ) {
+ super(logger, projectSaver, dataSourceFactory, adapterFactory, mapLoader, mergerTokenFactoryProvider);
+ }
+
+ @Override
+ protected DataMap existingTargetMap(DbImportConfiguration configuration) throws IOException {
+ return targetMap;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/ModelerSyncModule.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/ModelerSyncModule.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/ModelerSyncModule.java
new file mode 100644
index 0000000..24fdfcf
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/ModelerSyncModule.java
@@ -0,0 +1,44 @@
+/*****************************************************************
+ * 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.cayenne.modeler.dialog.db.load;
+
+import org.apache.cayenne.di.Binder;
+import org.apache.cayenne.di.Module;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.project.ProjectSaver;
+import org.apache.cayenne.tools.dbimport.DbImportAction;
+
+class ModelerSyncModule implements Module {
+
+ private DbLoaderContext dbLoaderContext;
+
+ ModelerSyncModule(DbLoaderContext dbLoaderHelper) {
+ this.dbLoaderContext = dbLoaderHelper;
+ }
+
+ @Override
+ public void configure(Binder binder) {
+ binder.bind(ProjectController.class).toInstance(dbLoaderContext.getProjectController());
+ binder.bind(ProjectSaver.class).to(DbImportProjectSaver.class);
+ binder.bind(DbImportAction.class).to(ModelerDbImportAction.class);
+ binder.bind(DataMap.class).toInstance(dbLoaderContext.getDataMap());
+ }
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/DbMigrateOptionsDialog.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/DbMigrateOptionsDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/DbMigrateOptionsDialog.java
new file mode 100644
index 0000000..b3fb929
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/DbMigrateOptionsDialog.java
@@ -0,0 +1,176 @@
+/*****************************************************************
+ * 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.cayenne.modeler.dialog.db.merge;
+
+import java.awt.BorderLayout;
+import java.awt.FlowLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.Collection;
+
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.util.CayenneDialog;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+import com.jgoodies.forms.layout.FormLayout;
+
+public class DbMigrateOptionsDialog extends CayenneDialog {
+ private static final long serialVersionUID = 1L;
+ public static final int CANCEL = 0;
+ public static final int SELECT = 1;
+
+ protected JLabel schemaLabel;
+ protected JLabel catalogLabel;
+ protected JComboBox<String> catalogSelector;
+ protected JComboBox<String> schemaSelector;
+ protected JButton selectButton;
+ protected JButton cancelButton;
+ protected int choice;
+
+ public DbMigrateOptionsDialog(Collection<String> catalogs, Collection<String> schemas, String dbUserName) {
+ super(Application.getFrame(), "Migrate DB Schema: Select Catalog and Schema");
+ init();
+ initController();
+ initFromModel(catalogs, schemas, dbUserName);
+
+ pack();
+ setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
+ setModal(true);
+ centerWindow();
+ }
+
+ protected void init() {
+ selectButton = new JButton("Continue");
+ cancelButton = new JButton("Cancel");
+ catalogSelector = new JComboBox<>();
+ schemaSelector = new JComboBox<>();
+ FormLayout layout = new FormLayout(
+ "right:pref, 3dlu, fill:max(170dlu;pref):grow",
+ "");
+ DefaultFormBuilder builder = new DefaultFormBuilder(layout);
+ builder.setDefaultDialogBorder();
+
+ catalogLabel = builder.append("Select Catalog:", catalogSelector, true);
+ schemaLabel = builder.append("Select Schema:", schemaSelector);
+
+ JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
+ buttons.add(selectButton);
+ buttons.add(cancelButton);
+
+ getContentPane().setLayout(new BorderLayout());
+ getContentPane().add(builder.getPanel(), BorderLayout.CENTER);
+ getContentPane().add(buttons, BorderLayout.SOUTH);
+ }
+
+ protected void initController() {
+ selectButton.addActionListener(new ActionListener() {
+
+ public void actionPerformed(ActionEvent e) {
+ processSelect();
+ }
+ });
+
+ cancelButton.addActionListener(new ActionListener() {
+
+ public void actionPerformed(ActionEvent e) {
+ processCancel();
+ }
+ });
+ }
+
+ private void processSelect() {
+ choice = SELECT;
+ setVisible(false);
+ }
+
+ private void processCancel() {
+ schemaSelector.setSelectedItem(null);
+ choice = CANCEL;
+ setVisible(false);
+ }
+
+ protected void initFromModel(Collection<String> catalogs, Collection<String> schemas, String dbUserName) {
+
+ this.choice = CANCEL;
+
+ if(!schemas.isEmpty()) {
+ schemaLabel.setVisible(true);
+ schemaSelector.setModel(new DefaultComboBoxModel<>(schemas.toArray(new String[0])));
+ schemaSelector.setVisible(true);
+ } else {
+ schemaLabel.setVisible(false);
+ schemaSelector.setVisible(false);
+ }
+
+ if(!catalogs.isEmpty()) {
+ catalogLabel.setVisible(true);
+ catalogSelector.setModel(new DefaultComboBoxModel<>(catalogs.toArray(new String[0])));
+ catalogSelector.setVisible(true);
+ } else {
+ catalogLabel.setVisible(false);
+ catalogSelector.setVisible(false);
+ }
+
+ if (dbUserName == null) {
+ return;
+ }
+
+ // select schema belonging to the user
+ for (String schema : schemas) {
+ if (dbUserName.equalsIgnoreCase(schema)) {
+ schemaSelector.setSelectedItem(schema);
+ break;
+ }
+ }
+
+ for(String catalog : catalogs) {
+ if(dbUserName.equalsIgnoreCase(catalog)) {
+ catalogSelector.setSelectedItem(catalog);
+ break;
+ }
+ }
+ }
+
+ /**
+ * Returns selected schema.
+ */
+ public String getSelectedSchema() {
+ return (String) schemaSelector.getSelectedItem();
+ }
+
+ public String getSelectedCatalog() {
+ return (String) catalogSelector.getSelectedItem();
+ }
+
+ public int getChoice() {
+ return choice;
+ }
+
+ public void showDialog() {
+ setVisible(true);
+ }
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerOptions.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerOptions.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerOptions.java
new file mode 100644
index 0000000..a914cf1
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerOptions.java
@@ -0,0 +1,395 @@
+/*****************************************************************
+ * 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.cayenne.modeler.dialog.db.merge;
+
+import org.apache.cayenne.CayenneRuntimeException;
+import org.apache.cayenne.configuration.event.DataMapEvent;
+import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.dbsync.merge.AbstractToDbToken;
+import org.apache.cayenne.dbsync.merge.DbMerger;
+import org.apache.cayenne.dbsync.merge.DefaultModelMergeDelegate;
+import org.apache.cayenne.dbsync.merge.MergeDirection;
+import org.apache.cayenne.dbsync.merge.MergerContext;
+import org.apache.cayenne.dbsync.merge.MergerToken;
+import org.apache.cayenne.dbsync.merge.ModelMergeDelegate;
+import org.apache.cayenne.dbsync.merge.ProxyModelMergeDelegate;
+import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
+import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
+import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
+import org.apache.cayenne.dbsync.naming.NoStemStemmer;
+import org.apache.cayenne.dbsync.reverse.db.DbLoader;
+import org.apache.cayenne.dbsync.reverse.db.DbLoaderConfiguration;
+import org.apache.cayenne.dbsync.reverse.db.LoggingDbLoaderDelegate;
+import org.apache.cayenne.dbsync.reverse.filters.FiltersConfig;
+import org.apache.cayenne.dbsync.reverse.filters.PatternFilter;
+import org.apache.cayenne.dbsync.reverse.filters.TableFilter;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.event.MapEvent;
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.modeler.dialog.ValidationResultBrowser;
+import org.apache.cayenne.modeler.pref.DBConnectionInfo;
+import org.apache.cayenne.modeler.util.CayenneController;
+import org.apache.cayenne.project.Project;
+import org.apache.cayenne.resource.Resource;
+import org.apache.cayenne.swing.BindingBuilder;
+import org.apache.cayenne.swing.ObjectBinding;
+import org.apache.cayenne.tools.dbimport.DefaultDbImportAction;
+import org.apache.cayenne.validation.ValidationResult;
+import org.apache.commons.logging.LogFactory;
+
+import javax.sql.DataSource;
+import javax.swing.JFileChooser;
+import javax.swing.JOptionPane;
+import javax.swing.WindowConstants;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import java.awt.Component;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+public class MergerOptions extends CayenneController {
+
+ protected MergerOptionsView view;
+ protected ObjectBinding sqlBinding;
+
+ protected DBConnectionInfo connectionInfo;
+ protected DataMap dataMap;
+ protected DbAdapter adapter;
+ protected String textForSQL;
+
+ protected MergerTokenSelectorController tokens;
+ protected String defaultCatalog;
+ protected String defaultSchema;
+ private MergerTokenFactoryProvider mergerTokenFactoryProvider;
+
+ public MergerOptions(ProjectController parent,
+ String title,
+ DBConnectionInfo connectionInfo,
+ DataMap dataMap,
+ String defaultCatalog,
+ String defaultSchema,
+ MergerTokenFactoryProvider mergerTokenFactoryProvider) {
+ super(parent);
+
+ this.mergerTokenFactoryProvider = mergerTokenFactoryProvider;
+ this.dataMap = dataMap;
+ this.tokens = new MergerTokenSelectorController(parent);
+ this.view = new MergerOptionsView(tokens.getView());
+ this.connectionInfo = connectionInfo;
+ this.defaultCatalog = defaultCatalog;
+ this.defaultSchema = defaultSchema;
+ this.view.setTitle(title);
+ initController();
+
+ prepareMigrator();
+ createSQL();
+ refreshView();
+ }
+
+ public Component getView() {
+ return view;
+ }
+
+ public String getTextForSQL() {
+ return textForSQL;
+ }
+
+ protected void initController() {
+
+ BindingBuilder builder = new BindingBuilder(
+ getApplication().getBindingFactory(),
+ this);
+
+ sqlBinding = builder.bindToTextArea(view.getSql(), "textForSQL");
+
+ builder.bindToAction(view.getGenerateButton(), "generateSchemaAction()");
+ builder.bindToAction(view.getSaveSqlButton(), "storeSQLAction()");
+ builder.bindToAction(view.getCancelButton(), "closeAction()");
+
+ // refresh SQL if different tables were selected
+ view.getTabs().addChangeListener(new ChangeListener() {
+
+ public void stateChanged(ChangeEvent e) {
+ if (view.getTabs().getSelectedIndex() == 1) {
+ // this assumes that some tables where checked/unchecked... not very
+ // efficient
+ refreshGeneratorAction();
+ }
+ }
+ });
+ }
+
+ /**
+ * check database and create the {@link List} of {@link MergerToken}s
+ */
+ protected void prepareMigrator() {
+ try {
+ adapter = connectionInfo.makeAdapter(getApplication().getClassLoadingService());
+
+ MergerTokenFactory mergerTokenFactory = mergerTokenFactoryProvider.get(adapter);
+ tokens.setMergerTokenFactory(mergerTokenFactory);
+
+
+ FiltersConfig filters = FiltersConfig.create(defaultCatalog, defaultSchema, TableFilter.everything(),
+ PatternFilter.INCLUDE_NOTHING);
+
+ DbMerger merger = DbMerger.builder(mergerTokenFactory)
+ .filters(filters)
+ .build();
+
+ DbLoaderConfiguration config = new DbLoaderConfiguration();
+ config.setFiltersConfig(filters);
+
+ DataSource dataSource = connectionInfo.makeDataSource(getApplication().getClassLoadingService());
+
+ DataMap dbImport = new DataMap();
+ try (Connection conn = dataSource.getConnection();) {
+ new DbLoader(conn,
+ adapter,
+ new LoggingDbLoaderDelegate(LogFactory.getLog(DbLoader.class)),
+ new DefaultObjectNameGenerator(NoStemStemmer.getInstance()))
+ .load(dbImport, config);
+
+ } catch (SQLException e) {
+ throw new CayenneRuntimeException("Can't doLoad dataMap from db.", e);
+ }
+
+ tokens.setTokens(merger.createMergeTokens(dataMap, dbImport));
+ } catch (Exception ex) {
+ reportError("Error loading adapter", ex);
+ }
+ }
+
+ /**
+ * Returns SQL statements generated for selected schema generation options.
+ */
+ protected void createSQL() {
+ // convert them to string representation for display
+ StringBuilder buf = new StringBuilder();
+
+ Iterator<MergerToken> it = tokens.getSelectedTokens().iterator();
+ String batchTerminator = adapter.getBatchTerminator();
+
+ String lineEnd = batchTerminator != null ? "\n" + batchTerminator + "\n\n" : "\n\n";
+ while (it.hasNext()) {
+ MergerToken token = it.next();
+
+ if (token instanceof AbstractToDbToken) {
+ AbstractToDbToken tdb = (AbstractToDbToken) token;
+ for (String sql : tdb.createSql(adapter)) {
+ buf.append(sql);
+ buf.append(lineEnd);
+ }
+ }
+ }
+
+ textForSQL = buf.toString();
+ }
+
+ protected void refreshView() {
+ sqlBinding.updateView();
+ }
+
+ // ===============
+ // Actions
+ // ===============
+
+ /**
+ * Starts options dialog.
+ */
+ public void startupAction() {
+ view.pack();
+ view.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
+ view.setModal(true);
+ makeCloseableOnEscape();
+ centerView();
+ view.setVisible(true);
+ }
+
+ public void refreshGeneratorAction() {
+ refreshSQLAction();
+ }
+
+ /**
+ * Updates a text area showing generated SQL.
+ */
+ public void refreshSQLAction() {
+ createSQL();
+ sqlBinding.updateView();
+ }
+
+ /**
+ * Performs configured schema operations via DbGenerator.
+ */
+ public void generateSchemaAction() {
+ refreshGeneratorAction();
+
+ // sanity check...
+ List<MergerToken> tokensToMigrate = tokens.getSelectedTokens();
+ if (tokensToMigrate.isEmpty()) {
+ JOptionPane.showMessageDialog(getView(), "Nothing to migrate.");
+ return;
+ }
+
+ DataSource dataSource;
+ try {
+ dataSource = connectionInfo.makeDataSource(getApplication()
+ .getClassLoadingService());
+ } catch (SQLException ex) {
+ reportError("Migration Error", ex);
+ return;
+ }
+
+ final Collection<ObjEntity> loadedObjEntities = new LinkedList<>();
+
+ MergerContext mergerContext = MergerContext.builder(dataMap)
+ .syntheticDataNode(dataSource, adapter)
+ .delegate(createDelegate(loadedObjEntities))
+ .build();
+
+ boolean modelChanged = applyTokens(tokensToMigrate, mergerContext);
+
+ DefaultDbImportAction.flattenManyToManyRelationships(
+ dataMap,
+ loadedObjEntities,
+ mergerContext.getNameGenerator());
+
+ notifyProjectModified(modelChanged);
+
+ reportFailures(mergerContext);
+ }
+
+ private ModelMergeDelegate createDelegate(final Collection<ObjEntity> loadedObjEntities) {
+ return new ProxyModelMergeDelegate(new DefaultModelMergeDelegate()) {
+ @Override
+ public void objEntityAdded(ObjEntity ent) {
+ loadedObjEntities.add(ent);
+ super.objEntityAdded(ent);
+ }
+ };
+ }
+
+ private boolean applyTokens(List<MergerToken> tokensToMigrate, MergerContext mergerContext) {
+ boolean modelChanged = false;
+
+ try {
+ for (MergerToken tok : tokensToMigrate) {
+ int numOfFailuresBefore = getFailuresCount(mergerContext);
+
+ tok.execute(mergerContext);
+
+ if (!modelChanged && tok.getDirection().equals(MergeDirection.TO_MODEL)) {
+ modelChanged = true;
+ }
+ if (numOfFailuresBefore == getFailuresCount(mergerContext)) {
+ // looks like the token executed without failures
+ tokens.removeToken(tok);
+ }
+ }
+ } catch (Throwable th) {
+ reportError("Migration Error", th);
+ }
+
+ return modelChanged;
+ }
+
+ private int getFailuresCount(MergerContext mergerContext) {
+ return mergerContext.getValidationResult().getFailures().size();
+ }
+
+ private void reportFailures(MergerContext mergerContext) {
+ ValidationResult failures = mergerContext.getValidationResult();
+ if (failures == null || !failures.hasFailures()) {
+ JOptionPane.showMessageDialog(getView(), "Migration Complete.");
+ } else {
+ new ValidationResultBrowser(this).startupAction(
+ "Migration Complete",
+ "Migration finished. The following problem(s) were ignored.",
+ failures);
+ }
+ }
+
+ private void notifyProjectModified(boolean modelChanged) {
+ if(!modelChanged) {
+ return;
+ }
+
+ // mark the model as unsaved
+ Project project = getApplication().getProject();
+ project.setModified(true);
+
+ ProjectController projectController = getProjectController();
+ projectController.setDirty(true);
+
+ projectController.fireDataMapEvent(new DataMapEvent(Application.getFrame(),
+ dataMap, MapEvent.REMOVE));
+ projectController.fireDataMapEvent(new DataMapEvent(Application.getFrame(),
+ dataMap, MapEvent.ADD));
+ }
+
+ /**
+ * Allows user to save generated SQL in a file.
+ */
+ public void storeSQLAction() {
+ JFileChooser fc = new JFileChooser();
+ fc.setDialogType(JFileChooser.SAVE_DIALOG);
+ fc.setDialogTitle("Save SQL Script");
+
+ Resource projectDir = getApplication().getProject().getConfigurationResource();
+
+ if (projectDir != null) {
+ fc.setCurrentDirectory(new File(projectDir.getURL().getPath()));
+ }
+
+ if (fc.showSaveDialog(getView()) == JFileChooser.APPROVE_OPTION) {
+ refreshGeneratorAction();
+
+ try {
+ File file = fc.getSelectedFile();
+ FileWriter fw = new FileWriter(file);
+ PrintWriter pw = new PrintWriter(fw);
+ pw.print(textForSQL);
+ pw.flush();
+ pw.close();
+ } catch (IOException ex) {
+ reportError("Error Saving SQL", ex);
+ }
+ }
+ }
+
+ private ProjectController getProjectController() {
+ return getApplication().getFrameController().getProjectController();
+ }
+
+ public void closeAction() {
+ view.dispose();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerOptionsView.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerOptionsView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerOptionsView.java
new file mode 100644
index 0000000..ba68857
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerOptionsView.java
@@ -0,0 +1,134 @@
+/*****************************************************************
+ * 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.cayenne.modeler.dialog.db.merge;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTabbedPane;
+import javax.swing.JTextArea;
+import javax.swing.ScrollPaneConstants;
+import javax.swing.SwingConstants;
+
+import org.apache.cayenne.modeler.Application;
+
+import com.jgoodies.forms.builder.PanelBuilder;
+import com.jgoodies.forms.layout.CellConstraints;
+import com.jgoodies.forms.layout.FormLayout;
+
+/**
+ * Wizard for altering the database to match the data map.
+ */
+public class MergerOptionsView extends JDialog {
+
+ protected JTextArea sql;
+ protected JButton generateButton;
+ protected JButton cancelButton;
+ protected JButton saveSqlButton;
+
+ protected Component tables;
+ protected JTabbedPane tabs;
+
+ public MergerOptionsView(Component tables) {
+ super(Application.getFrame());
+
+ // create widgets
+ this.generateButton = new JButton("Migrate");
+ this.cancelButton = new JButton("Close");
+ this.saveSqlButton = new JButton("Save SQL");
+
+ this.tables = tables;
+ this.tabs = new JTabbedPane(SwingConstants.TOP);
+ this.sql = new JTextArea();
+ sql.setEditable(false);
+ sql.setLineWrap(true);
+ sql.setWrapStyleWord(true);
+
+ JPanel sqlTextPanel = new JPanel(new BorderLayout());
+ sqlTextPanel.add(new JScrollPane(
+ sql,
+ ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
+ ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), BorderLayout.CENTER);
+
+ CellConstraints cc = new CellConstraints();
+ PanelBuilder builder = new PanelBuilder(new FormLayout(
+ "fill:min(50dlu;pref):grow",
+ "p, 9dlu, p, 3dlu, fill:40dlu:grow"));
+ builder.setDefaultDialogBorder();
+ builder.addSeparator("Generated SQL", cc.xywh(1, 3, 1, 1));
+ builder.add(sqlTextPanel, cc.xy(1, 5));
+
+ tabs.addTab("Operations", new JScrollPane(
+ tables,
+ ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
+ ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED));
+ tabs.addTab("Generated SQL", builder.getPanel());
+
+ // we need the right preferred size so that dialog "pack()" produces decent
+ // default size...
+ tabs.setPreferredSize(new Dimension(600, 350));
+
+ JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
+ buttons.add(saveSqlButton);
+ buttons.add(Box.createHorizontalStrut(20));
+ buttons.add(cancelButton);
+ buttons.add(generateButton);
+
+ Container contentPane = this.getContentPane();
+ contentPane.setLayout(new BorderLayout());
+ contentPane.add(tabs, BorderLayout.CENTER);
+ contentPane.add(buttons, BorderLayout.SOUTH);
+ }
+
+ public JButton getCancelButton() {
+ return cancelButton;
+ }
+
+ public JTabbedPane getTabs() {
+ return tabs;
+ }
+
+ /*
+ * public JCheckBox getCreateFK() { return createFK; } public JCheckBox getCreatePK() {
+ * return createPK; } public JCheckBox getCreateTables() { return createTables; }
+ * public JCheckBox getDropPK() { return dropPK; } public JCheckBox getDropTables() {
+ * return dropTables; }
+ */
+
+ public JButton getGenerateButton() {
+ return generateButton;
+ }
+
+ public JButton getSaveSqlButton() {
+ return saveSqlButton;
+ }
+
+ public JTextArea getSql() {
+ return sql;
+ }
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenSelectorController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenSelectorController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenSelectorController.java
new file mode 100644
index 0000000..52d6ce3
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenSelectorController.java
@@ -0,0 +1,240 @@
+/*****************************************************************
+ * 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.cayenne.modeler.dialog.db.merge;
+
+import org.apache.cayenne.dbsync.merge.MergeDirection;
+import org.apache.cayenne.dbsync.merge.MergerToken;
+import org.apache.cayenne.dbsync.merge.TokenComparator;
+import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.util.CayenneController;
+import org.apache.cayenne.swing.BindingBuilder;
+import org.apache.cayenne.swing.ObjectBinding;
+
+import javax.swing.*;
+import javax.swing.table.AbstractTableModel;
+import javax.swing.table.TableColumn;
+import javax.swing.table.TableColumnModel;
+import javax.swing.table.TableModel;
+import java.awt.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class MergerTokenSelectorController extends CayenneController {
+
+ protected MergerTokenSelectorView view;
+ protected ObjectBinding tableBinding;
+
+ protected MergerToken token;
+ protected int permanentlyExcludedCount;
+ protected Set<MergerToken> excludedTokens;
+ protected List<MergerToken> selectableTokensList;
+ protected MergerTokenFactory mergerTokenFactory;
+
+ public MergerTokenSelectorController(CayenneController parent) {
+ super(parent);
+ this.view = new MergerTokenSelectorView();
+ this.excludedTokens = new HashSet<MergerToken>();
+ this.selectableTokensList = new ArrayList<MergerToken>();
+ initController();
+ }
+
+ public void setMergerTokenFactory(MergerTokenFactory mergerTokenFactory) {
+ this.mergerTokenFactory = mergerTokenFactory;
+ }
+
+ public void setTokens(List<MergerToken> tokens) {
+ selectableTokensList.clear();
+ selectableTokensList.addAll(tokens);
+ excludedTokens.addAll(tokens);
+ }
+
+ public List<MergerToken> getSelectedTokens() {
+ List<MergerToken> t = new ArrayList<MergerToken>(selectableTokensList);
+ t.removeAll(excludedTokens);
+ return Collections.unmodifiableList(t);
+ }
+
+ public List<MergerToken> getSelectableTokens() {
+ return Collections.unmodifiableList(selectableTokensList);
+ }
+
+ public void removeToken(MergerToken token) {
+ selectableTokensList.remove(token);
+ excludedTokens.remove(token);
+
+ AbstractTableModel model = (AbstractTableModel) view.getTokens().getModel();
+ model.fireTableDataChanged();
+ }
+
+ // ----- properties -----
+
+ public Component getView() {
+ return view;
+ }
+
+ /**
+ * Called by table binding script to set current token.
+ */
+ public void setToken(MergerToken token) {
+ this.token = token;
+ }
+
+ /**
+ * Returns {@link MergerToken}s that are excluded from DB generation.
+ */
+ /*
+ * public Collection getExcludedTokens() { return excludedTokens; }
+ */
+
+ public boolean isIncluded() {
+ if (token == null) {
+ return false;
+ }
+
+ return !excludedTokens.contains(token);
+ }
+
+ public void setIncluded(boolean b) {
+ if (token == null) {
+ return;
+ }
+
+ if (b) {
+ excludedTokens.remove(token);
+ }
+ else {
+ excludedTokens.add(token);
+ }
+
+ tableSelectedAction();
+ }
+
+ /**
+ * A callback action that updates the state of Select All checkbox.
+ */
+ public void tableSelectedAction() {
+ int unselectedCount = excludedTokens.size() - permanentlyExcludedCount;
+
+ if (unselectedCount == selectableTokensList.size()) {
+ view.getCheckAll().setSelected(false);
+ }
+ else if (unselectedCount == 0) {
+ view.getCheckAll().setSelected(true);
+ }
+ }
+
+ // ------ other stuff ------
+
+ protected void initController() {
+ BindingBuilder builder = new BindingBuilder(
+ getApplication().getBindingFactory(),
+ this);
+
+ builder.bindToAction(view.getCheckAll(), "checkAllAction()");
+ builder.bindToAction(view.getReverseAll(), "reverseAllAction()");
+
+ TableModel model = new MergerTokenTableModel(this);
+
+ MergeDirection[] dirs = new MergeDirection[] {
+ MergeDirection.TO_DB, MergeDirection.TO_MODEL
+ };
+
+ view.getTokens().setModel(model);
+
+ TableColumnModel columnModel = view.getTokens().getColumnModel();
+
+ // dropdown for direction column
+ JComboBox directionCombo = Application.getWidgetFactory().createComboBox(dirs, false);
+ directionCombo.setEditable(false);
+ TableColumn directionColumn = columnModel.getColumn(
+ MergerTokenTableModel.COL_DIRECTION);
+ directionColumn.setCellEditor(new DefaultCellEditor(directionCombo));
+
+ columnModel.getColumn(MergerTokenTableModel.COL_SELECT).setPreferredWidth(50);
+ columnModel.getColumn(MergerTokenTableModel.COL_DIRECTION).setPreferredWidth(100);
+ columnModel.getColumn(MergerTokenTableModel.COL_SELECT).setMaxWidth(50);
+ columnModel.getColumn(MergerTokenTableModel.COL_DIRECTION).setMaxWidth(100);
+ }
+
+ public boolean isSelected(MergerToken token) {
+ return (selectableTokensList.contains(token) && !excludedTokens.contains(token));
+ }
+
+ public void select(MergerToken token, boolean select) {
+ if (select) {
+ excludedTokens.remove(token);
+ }
+ else {
+ excludedTokens.add(token);
+ }
+ }
+
+ public void setDirection(MergerToken token, MergeDirection direction) {
+ if (token.getDirection().equals(direction)) {
+ return;
+ }
+ int i = selectableTokensList.indexOf(token);
+ MergerToken reverse = token.createReverse(mergerTokenFactory);
+ selectableTokensList.set(i, reverse);
+ if (excludedTokens.remove(token)) {
+ excludedTokens.add(reverse);
+ }
+
+ /**
+ * Repaint, so that "Operation" column updates properly
+ */
+ view.getTokens().repaint();
+ }
+
+ public void checkAllAction() {
+
+ boolean isCheckAllSelected = view.getCheckAll().isSelected();
+
+ if (isCheckAllSelected) {
+ excludedTokens.clear();
+ }
+ else {
+ excludedTokens.addAll(selectableTokensList);
+ }
+
+ AbstractTableModel model = (AbstractTableModel) view.getTokens().getModel();
+ model.fireTableDataChanged();
+ }
+
+ public void reverseAllAction() {
+
+ for (int i = 0; i < selectableTokensList.size(); i++) {
+ MergerToken token = selectableTokensList.get(i);
+ MergerToken reverse = token.createReverse(mergerTokenFactory);
+ selectableTokensList.set(i, reverse);
+ if (excludedTokens.remove(token)) {
+ excludedTokens.add(reverse);
+ }
+ }
+
+ Collections.sort(selectableTokensList, new TokenComparator());
+ AbstractTableModel model = (AbstractTableModel) view.getTokens().getModel();
+ model.fireTableDataChanged();
+ }
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenSelectorView.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenSelectorView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenSelectorView.java
new file mode 100644
index 0000000..263fb7c
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenSelectorView.java
@@ -0,0 +1,106 @@
+/*****************************************************************
+ * 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.cayenne.modeler.dialog.db.merge;
+
+import java.awt.BorderLayout;
+import java.awt.FlowLayout;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+
+import com.jgoodies.forms.builder.PanelBuilder;
+import com.jgoodies.forms.factories.ButtonBarFactory;
+import com.jgoodies.forms.layout.CellConstraints;
+import com.jgoodies.forms.layout.FormLayout;
+
+/**
+ */
+public class MergerTokenSelectorView extends JPanel {
+
+ protected JTable tokens;
+ protected JCheckBox checkAll;
+ protected JLabel checkAllLabel;
+ protected JButton reverseAll;
+
+ public MergerTokenSelectorView() {
+
+ this.checkAll = new JCheckBox();
+ this.checkAllLabel = new JLabel("Check All Operations");
+ this.reverseAll = new JButton("Reverse All Operations");
+
+ checkAll.addItemListener(new ItemListener() {
+
+ public void itemStateChanged(ItemEvent event) {
+ if (checkAll.isSelected()) {
+ checkAllLabel.setText("Uncheck All Operations");
+ }
+ else {
+ checkAllLabel.setText("Check All Operations");
+ }
+ }
+ });
+
+ // assemble
+ JPanel checkAllPanel = new JPanel(new FlowLayout(FlowLayout.LEADING));
+ checkAllPanel.add(checkAll);
+ checkAllPanel.add(checkAllLabel);
+ JPanel topPanel = new JPanel();
+ topPanel.setLayout(new BorderLayout());
+ topPanel.add(checkAllPanel, BorderLayout.WEST);
+ topPanel.add(ButtonBarFactory.buildRightAlignedBar(reverseAll), BorderLayout.EAST);
+
+ tokens = new JTable();
+ tokens.setRowHeight(25);
+ tokens.setRowMargin(3);
+
+ CellConstraints cc = new CellConstraints();
+ PanelBuilder builder = new PanelBuilder(new FormLayout(
+ "fill:min(50dlu;pref):grow",
+ "p, 3dlu, fill:40dlu:grow"));
+ builder.setDefaultDialogBorder();
+ builder.addSeparator("Select Operations", cc.xy(1, 1));
+ builder.add(new JScrollPane(
+ tokens,
+ JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
+ JScrollPane.HORIZONTAL_SCROLLBAR_NEVER), cc.xy(1, 3));
+
+ setLayout(new BorderLayout());
+ add(topPanel, BorderLayout.NORTH);
+ add(builder.getPanel(), BorderLayout.CENTER);
+ }
+
+ public JTable getTokens() {
+ return tokens;
+ }
+
+ public JCheckBox getCheckAll() {
+ return checkAll;
+ }
+
+ public JButton getReverseAll() {
+ return reverseAll;
+ }
+}
[04/10] cayenne git commit: CAY-2172 Split DB actions to different
packages Clean up ReverseEngineeringAction Clean up DataSource select dialogs
Posted by sk...@apache.org.
CAY-2172
Split DB actions to different packages
Clean up ReverseEngineeringAction
Clean up DataSource select dialogs
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/7da0e897
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/7da0e897
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/7da0e897
Branch: refs/heads/master
Commit: 7da0e8975da0eb266962ade0162f245b5dbc4978
Parents: 43b3080
Author: Nikita Timofeev <st...@gmail.com>
Authored: Tue Dec 13 18:15:02 2016 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Tue Dec 13 18:15:02 2016 +0300
----------------------------------------------------------------------
.../cayenne/modeler/action/DBWizardAction.java | 95 +----
.../modeler/action/GenerateDBAction.java | 8 +-
.../cayenne/modeler/action/MigrateAction.java | 42 +-
.../action/ReverseEngineeringAction.java | 123 ++++--
.../modeler/dialog/db/ConnectionWizard.java | 87 ----
.../modeler/dialog/db/DBGeneratorOptions.java | 345 ----------------
.../dialog/db/DBGeneratorOptionsView.java | 178 --------
.../modeler/dialog/db/DataSourceController.java | 219 ----------
.../modeler/dialog/db/DataSourceView.java | 100 -----
.../modeler/dialog/db/DataSourceWizard.java | 80 ++--
.../modeler/dialog/db/DbLoaderHelper.java | 401 -------------------
.../dialog/db/DbLoaderOptionsDialog.java | 247 ------------
.../dialog/db/DbMigrateOptionsDialog.java | 175 --------
.../modeler/dialog/db/MergerOptions.java | 395 ------------------
.../modeler/dialog/db/MergerOptionsView.java | 134 -------
.../db/MergerTokenSelectorController.java | 239 -----------
.../dialog/db/MergerTokenSelectorView.java | 106 -----
.../dialog/db/MergerTokenTableModel.java | 128 ------
.../dialog/db/ModelerDbImportAction.java | 71 ----
.../dialog/db/TableSelectorController.java | 251 ------------
.../modeler/dialog/db/TableSelectorView.java | 94 -----
.../dialog/db/gen/DBGeneratorOptions.java | 332 +++++++++++++++
.../dialog/db/gen/DBGeneratorOptionsView.java | 178 ++++++++
.../dialog/db/gen/TableSelectorController.java | 251 ++++++++++++
.../dialog/db/gen/TableSelectorView.java | 94 +++++
.../dialog/db/load/DbImportProjectSaver.java | 74 ++++
.../modeler/dialog/db/load/DbLoaderContext.java | 176 ++++++++
.../dialog/db/load/DbLoaderOptionsDialog.java | 247 ++++++++++++
.../modeler/dialog/db/load/LoadDataMapTask.java | 94 +++++
.../modeler/dialog/db/load/LoaderDelegate.java | 71 ++++
.../dialog/db/load/ModelerDbImportAction.java | 53 +++
.../dialog/db/load/ModelerSyncModule.java | 44 ++
.../dialog/db/merge/DbMigrateOptionsDialog.java | 176 ++++++++
.../modeler/dialog/db/merge/MergerOptions.java | 395 ++++++++++++++++++
.../dialog/db/merge/MergerOptionsView.java | 134 +++++++
.../db/merge/MergerTokenSelectorController.java | 240 +++++++++++
.../db/merge/MergerTokenSelectorView.java | 106 +++++
.../dialog/db/merge/MergerTokenTableModel.java | 129 ++++++
.../cayenne/modeler/util/DbAdapterInfo.java | 2 +-
39 files changed, 2936 insertions(+), 3378 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java
index 1d2b32f..a3e652a 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java
@@ -19,16 +19,8 @@
package org.apache.cayenne.modeler.action;
-import java.util.Collection;
-
-import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.configuration.DataNodeDescriptor;
-import org.apache.cayenne.configuration.server.XMLPoolingDataSourceFactory;
-import org.apache.cayenne.map.DataMap;
import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ProjectController;
-import org.apache.cayenne.modeler.pref.DBConnectionInfo;
-import org.apache.cayenne.modeler.pref.DataNodeDefaults;
+import org.apache.cayenne.modeler.dialog.db.DataSourceWizard;
import org.apache.cayenne.modeler.util.CayenneAction;
/**
@@ -39,88 +31,13 @@ public abstract class DBWizardAction extends CayenneAction {
super(name, application);
}
- // ==== Guessing user preferences... *****
-
- protected DataNodeDescriptor getPreferredNode() {
- ProjectController projectController = getProjectController();
- DataNodeDescriptor node = projectController.getCurrentDataNode();
-
- // try a node that belongs to the current DataMap ...
- if (node == null) {
- DataMap map = projectController.getCurrentDataMap();
- if (map != null) {
- Collection<DataNodeDescriptor> nodes = ((DataChannelDescriptor) projectController
- .getProject()
- .getRootNode()).getNodeDescriptors();
- for (DataNodeDescriptor n : nodes) {
- if (n.getDataMapNames().contains(map.getName())) {
- node = n;
- break;
- }
- }
- }
- }
-
- return node;
- }
-
- protected String preferredDataSourceLabel(DBConnectionInfo nodeInfo) {
- if (nodeInfo == null) {
-
- // only driver nodes have meaningful connection info set
- DataNodeDescriptor node = getPreferredNode();
- return (node != null && XMLPoolingDataSourceFactory.class.getName().equals(
- node.getDataSourceFactoryType())) ? "DataNode Connection Info" : null;
- }
-
- return nodeInfo.getNodeName();
- }
-
- /**
- * Determines the most reasonable default DataSource choice.
- */
- protected DBConnectionInfo preferredDataSource() {
- DataNodeDescriptor node = getPreferredNode();
-
- // no current node...
- if (node == null) {
- return null;
- }
-
- // if node has local DS set, use it
- DataNodeDefaults nodeDefaults = (DataNodeDefaults) getApplication()
- .getCayenneProjectPreferences()
- .getProjectDetailObject(
- DataNodeDefaults.class,
- getProjectController().getPreferenceForDataDomain().node(
- "DataNode").node(node.getName()));
-
- String key = (nodeDefaults != null) ? nodeDefaults.getLocalDataSource() : null;
- if (key != null) {
- DBConnectionInfo info = (DBConnectionInfo) getApplication()
- .getCayenneProjectPreferences()
- .getDetailObject(DBConnectionInfo.class)
- .getObject(key);
-
- if (info != null) {
- return info;
- }
- }
-
- // extract data from the node
- if (!XMLPoolingDataSourceFactory.class.getName().equals(
- node.getDataSourceFactoryType())) {
+ protected DataSourceWizard dataSourceWizardDialog(String title) {
+ // connect
+ DataSourceWizard connectWizard = new DataSourceWizard(getProjectController(), title);
+ if (!connectWizard.startupAction()) {
return null;
}
- // create transient object..
- DBConnectionInfo nodeInfo = new DBConnectionInfo();
-
- nodeInfo.copyFrom(node.getDataSourceDescriptor());
-
- nodeInfo.setDbAdapter(node.getAdapterType());
-
- return nodeInfo;
+ return connectWizard;
}
-
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GenerateDBAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GenerateDBAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GenerateDBAction.java
index 0173304..1cf6301 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GenerateDBAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GenerateDBAction.java
@@ -22,7 +22,7 @@ package org.apache.cayenne.modeler.action;
import org.apache.cayenne.configuration.DataChannelDescriptor;
import org.apache.cayenne.map.DataMap;
import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.dialog.db.DBGeneratorOptions;
+import org.apache.cayenne.modeler.dialog.db.gen.DBGeneratorOptions;
import org.apache.cayenne.project.Project;
import java.awt.event.ActionEvent;
@@ -48,13 +48,13 @@ public class GenerateDBAction extends DBWizardAction {
DataMap dataMap = getProjectController().getCurrentDataMap();
if (dataMap != null) {
- dataMaps = new ArrayList<DataMap>();
+ dataMaps = new ArrayList<>();
dataMaps.add(dataMap);
- new DBGeneratorOptions(getProjectController(), "Generate DB Schema: Options", dataMaps).startupAction();
} else {
Project project = getProjectController().getProject();
dataMaps = ((DataChannelDescriptor) project.getRootNode()).getDataMaps();
- new DBGeneratorOptions(getProjectController(), "Generate DB Schema: Options", dataMaps).startupAction();
}
+ new DBGeneratorOptions(getProjectController(), "Generate DB Schema: Options", dataMaps)
+ .startupAction();
}
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
index 00e27bf..29cd6a7 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
@@ -19,18 +19,16 @@
package org.apache.cayenne.modeler.action;
-import org.apache.cayenne.dba.DbAdapter;
import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
import org.apache.cayenne.dbsync.reverse.db.DbLoader;
import org.apache.cayenne.map.DataMap;
import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.dialog.db.DataSourceController;
-import org.apache.cayenne.modeler.dialog.db.DbMigrateOptionsDialog;
-import org.apache.cayenne.modeler.dialog.db.MergerOptions;
-import org.apache.cayenne.modeler.pref.DBConnectionInfo;
+import org.apache.cayenne.modeler.dialog.db.DataSourceWizard;
+import org.apache.cayenne.modeler.dialog.db.merge.DbMigrateOptionsDialog;
+import org.apache.cayenne.modeler.dialog.db.merge.MergerOptions;
import javax.sql.DataSource;
-import javax.swing.*;
+import javax.swing.JOptionPane;
import java.awt.event.ActionEvent;
import java.util.Collections;
import java.util.List;
@@ -50,27 +48,16 @@ public class MigrateAction extends DBWizardAction {
public void performAction(ActionEvent e) {
- DBConnectionInfo nodeInfo = preferredDataSource();
- String nodeKey = preferredDataSourceLabel(nodeInfo);
-
- DataSourceController connectWizard = new DataSourceController(
- getProjectController(),
- "Migrate DB Schema: Connect to Database",
- nodeKey,
- nodeInfo);
-
- if (!connectWizard.startupAction()) {
- // canceled
+ DataSourceWizard connectWizard = dataSourceWizardDialog("Migrate DB Schema: Connect to Database");
+ if(connectWizard == null) {
return;
}
DataMap map = getProjectController().getCurrentDataMap();
- //migarte options
-
- // sanity check
if (map == null) {
throw new IllegalStateException("No current DataMap selected.");
}
+
//showOptions dialog
String selectedSchema = null;
String selectedCatalog = null;
@@ -107,22 +94,17 @@ public class MigrateAction extends DBWizardAction {
}
@SuppressWarnings("unchecked")
- private List<String> getCatalogs(DataSourceController connectWizard) throws Exception {
- DbAdapter adapter = connectWizard.getConnectionInfo()
- .makeAdapter(getApplication().getClassLoadingService());
- if(!adapter.supportsCatalogsOnReverseEngineering()) {
+ private List<String> getCatalogs(DataSourceWizard connectWizard) throws Exception {
+ if(!connectWizard.getAdapter().supportsCatalogsOnReverseEngineering()) {
return (List<String>)Collections.EMPTY_LIST;
}
- DataSource dataSource = connectWizard.getConnectionInfo()
- .makeDataSource(getApplication().getClassLoadingService());
+ DataSource dataSource = connectWizard.getDataSource();
return DbLoader.loadCatalogs(dataSource.getConnection());
}
- private List<String> getSchemas(DataSourceController connectWizard) throws Exception {
- DataSource dataSource = connectWizard.getConnectionInfo()
- .makeDataSource(getApplication().getClassLoadingService());
-
+ private List<String> getSchemas(DataSourceWizard connectWizard) throws Exception {
+ DataSource dataSource = connectWizard.getDataSource();
return DbLoader.loadSchemas(dataSource.getConnection());
}
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
index 183b00b..8088639 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
@@ -19,22 +19,25 @@
package org.apache.cayenne.modeler.action;
-import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.dbsync.reverse.db.DbLoader;
import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.dialog.db.ConnectionWizard;
-import org.apache.cayenne.modeler.dialog.db.DbLoaderHelper;
-import org.apache.cayenne.modeler.pref.DBConnectionInfo;
+import org.apache.cayenne.modeler.dialog.db.DataSourceWizard;
+import org.apache.cayenne.modeler.dialog.db.load.DbLoaderContext;
+import org.apache.cayenne.modeler.dialog.db.load.DbLoaderOptionsDialog;
+import org.apache.cayenne.modeler.dialog.db.load.LoadDataMapTask;
-import javax.swing.*;
import java.awt.event.ActionEvent;
-import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Collections;
+import java.util.List;
+import javax.swing.SwingUtilities;
/**
* Action that imports database structure into a DataMap.
*/
public class ReverseEngineeringAction extends DBWizardAction {
- public ReverseEngineeringAction(Application application) {
+ ReverseEngineeringAction(Application application) {
super(getActionName(), application);
}
@@ -47,49 +50,89 @@ public class ReverseEngineeringAction extends DBWizardAction {
*/
@Override
public void performAction(ActionEvent event) {
- // guess node connection
- DBConnectionInfo nodeInfo = preferredDataSource();
- String nodeKey = preferredDataSourceLabel(nodeInfo);
-
- // connect
- ConnectionWizard connectWizard = new ConnectionWizard(
- getProjectController(),
- "Reengineer DB Schema: Connect to Database",
- nodeKey,
- nodeInfo);
-
- if (!connectWizard.startupAction()) {
- // canceled
+ final DbLoaderContext context = new DbLoaderContext();
+ final DataSourceWizard connectWizard = dataSourceWizardDialog("Reengineer DB Schema: Connect to Database");
+ if(connectWizard == null) {
return;
}
- // TODO: doesn't look like we are closing this connection anywhere...
- Connection connection = connectWizard.getConnection();
- DbAdapter adapter = connectWizard.getAdapter();
- DBConnectionInfo dataSourceInfo = connectWizard.getConnectionInfo();
+ context.setProjectController(getProjectController());
+ try {
+ context.setConnection(connectWizard.getDataSource().getConnection());
+ } catch (SQLException ex) {
+ return;
+ }
- // from here pass control to DbLoaderHelper, running it from a thread separate
- // from EventDispatch
+ final DbLoaderOptionsDialog loaderOptionsDialog = loaderOptionDialog(connectWizard, context);
+ if(!context.buildConfig(connectWizard, loaderOptionsDialog)) {
+ return;
+ }
- final DbLoaderHelper helper = new DbLoaderHelper(
- getProjectController(),
- connection,
- adapter,
- dataSourceInfo);
- Thread th = new Thread(new Runnable() {
+ runLoaderInThread(context, new Runnable() {
+ @Override
+ public void run() {
+ application.getUndoManager().discardAllEdits();
+ try {
+ context.getConnection().close();
+ } catch (SQLException ignored) {
+ }
+ }
+ });
+ }
+ private void runLoaderInThread(final DbLoaderContext context,
+ final Runnable callback) {
+ Thread th = new Thread(new Runnable() {
public void run() {
- helper.execute();
+ LoadDataMapTask task = new LoadDataMapTask(Application.getFrame(), "Reengineering DB", context);
+ task.startAndWait();
+ SwingUtilities.invokeLater(callback);
+ }
+ });
+ th.start();
+ }
- SwingUtilities.invokeLater(new Runnable() {
+ private DbLoaderOptionsDialog loaderOptionDialog(DataSourceWizard connectWizard, DbLoaderContext context) {
+ if(connectWizard == null) {
+ return null;
+ }
- public void run() {
- application.getUndoManager().discardAllEdits();
- }
- });
+ List<String> catalogs = Collections.emptyList();
+ List<String> schemas = Collections.emptyList();
+ try {
+ schemas = DbLoader.loadSchemas(context.getConnection());
+ if (connectWizard.getAdapter().supportsCatalogsOnReverseEngineering()) {
+ catalogs = DbLoader.loadCatalogs(context.getConnection());
}
- });
+ } catch (SQLException ex) {
+ context.processWarn(ex, "Error Loading catalogs and schemas");
+ }
- th.start();
+ if (context.isStopping()) {
+ return null;
+ }
+
+ // use this catalog as the default...
+ String currentCatalog = null;
+ String currentSchema = null;
+ try {
+ currentCatalog = context.getConnection().getCatalog();
+ currentSchema = context.getConnection().getSchema();
+ } catch (SQLException e) {
+ context.processWarn(e, "Error getting catalog or schema");
+ }
+
+ final DbLoaderOptionsDialog dialog = new DbLoaderOptionsDialog(
+ schemas, catalogs,
+ currentSchema, currentCatalog
+ );
+ dialog.setVisible(true);
+ dialog.dispose();
+
+ if (dialog.getChoice() == DbLoaderOptionsDialog.CANCEL) {
+ return null;
+ }
+
+ return dialog;
}
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ConnectionWizard.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ConnectionWizard.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ConnectionWizard.java
deleted file mode 100644
index 45a8bca..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ConnectionWizard.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*****************************************************************
- * 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.cayenne.modeler.dialog.db;
-
-import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.modeler.ClassLoadingService;
-import org.apache.cayenne.modeler.pref.DBConnectionInfo;
-import org.apache.cayenne.modeler.util.CayenneController;
-
-import java.sql.Connection;
-
-/**
- * A component for choosing a DataSource. Users can choose from the DataSources configured
- * in preferences, and one extra set of connection settings. This object will create and
- * keep open a JDBC connection. It is caller responsibility to dispose of it properly.
- *
- */
-// TODO: after refactoring DbLoader to accept a DataSource instead of connection this
-// dialog should be merged with superclass - DataSourceWizard.
-public class ConnectionWizard extends DataSourceWizard {
- protected Connection connection;
- protected DbAdapter adapter;
-
- public ConnectionWizard(CayenneController parent, String title,
- String altDataSourceKey, DBConnectionInfo altDataSource) {
- super(parent, title, altDataSourceKey, altDataSource);
- }
-
- /**
- * Overrides superclass to keep an open connection around for the caller's use.
- */
- public void okAction() {
- // build connection and adapter...
-
- DBConnectionInfo info = getConnectionInfo();
- ClassLoadingService classLoader = getApplication().getClassLoadingService();
-
- try {
- this.adapter = info.makeAdapter(classLoader);
- }
- catch (Throwable th) {
- reportError("DbAdapter Error", th);
- return;
- }
-
- try {
- this.connection = info.makeDataSource(classLoader).getConnection();
- }
- catch (Throwable th) {
- reportError("Connection Error", th);
- return;
- }
-
- onClose(false);
- }
-
- /**
- * Returns configured DB connection.
- */
- public Connection getConnection() {
- return connection;
- }
-
- /**
- * Returns configured DbAdapter.
- */
- public DbAdapter getAdapter() {
- return adapter;
- }
-}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DBGeneratorOptions.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DBGeneratorOptions.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DBGeneratorOptions.java
deleted file mode 100644
index 1747c87..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DBGeneratorOptions.java
+++ /dev/null
@@ -1,345 +0,0 @@
-/*****************************************************************
- * 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.cayenne.modeler.dialog.db;
-
-import org.apache.cayenne.access.DbGenerator;
-import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.log.NoopJdbcEventLogger;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.modeler.ProjectController;
-import org.apache.cayenne.modeler.dialog.ValidationResultBrowser;
-import org.apache.cayenne.modeler.pref.DBConnectionInfo;
-import org.apache.cayenne.modeler.pref.DBGeneratorDefaults;
-import org.apache.cayenne.modeler.util.CayenneController;
-import org.apache.cayenne.modeler.util.DbAdapterInfo;
-import org.apache.cayenne.swing.BindingBuilder;
-import org.apache.cayenne.swing.ObjectBinding;
-import org.apache.cayenne.validation.ValidationResult;
-
-import javax.sql.DataSource;
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.JFileChooser;
-import javax.swing.JOptionPane;
-import javax.swing.WindowConstants;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-import java.awt.Component;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-/**
- */
-public class DBGeneratorOptions extends CayenneController {
-
- protected DBGeneratorOptionsView view;
- protected ObjectBinding[] optionBindings;
- protected ObjectBinding sqlBinding;
- protected ObjectBinding adapterBinding;
-
- protected DBConnectionInfo connectionInfo;
- protected Collection<DataMap> dataMaps;
- protected DBGeneratorDefaults generatorDefaults;
- protected Collection<DbGenerator> generators;
- protected String textForSQL;
-
- protected TableSelectorController tables;
-
- public DBGeneratorOptions(ProjectController parent, String title, Collection<DataMap> dataMaps) {
- super(parent);
-
- this.dataMaps = dataMaps;
- this.tables = new TableSelectorController(parent);
- this.view = new DBGeneratorOptionsView(tables.getView());
- this.connectionInfo = new DBConnectionInfo();
- this.generatorDefaults = new DBGeneratorDefaults(parent
- .getPreferenceForProject()
- .node("DbGenerator"));
-
- this.view.setTitle(title);
- initController();
- connectionInfo.setDbAdapter((String) view.getAdapters().getSelectedItem());
-
- tables.updateTables(dataMaps);
- prepareGenerator();
- generatorDefaults.configureGenerator(generators);
- createSQL();
- refreshView();
- }
-
- public Component getView() {
- return view;
- }
-
- public DBGeneratorDefaults getGeneratorDefaults() {
- return generatorDefaults;
- }
-
- public String getTextForSQL() {
- return textForSQL;
- }
-
- protected void initController() {
-
- DefaultComboBoxModel adapterModel = new DefaultComboBoxModel(
- DbAdapterInfo.getStandardAdapters());
- view.getAdapters().setModel(adapterModel);
- view.getAdapters().setSelectedIndex(0);
-
- BindingBuilder builder = new BindingBuilder(
- getApplication().getBindingFactory(),
- this);
-
- sqlBinding = builder.bindToTextArea(view.getSql(), "textForSQL");
- adapterBinding = builder.bindToComboSelection(
- view.getAdapters(),
- "connectionInfo.dbAdapter",
- "refreshSQLAction()",
- "org.apache.cayenne.dba.JdbcAdapter");
-
- optionBindings = new ObjectBinding[5];
- optionBindings[0] = builder.bindToStateChangeAndAction(
- view.getCreateFK(),
- "generatorDefaults.createFK",
- "refreshSQLAction()");
- optionBindings[1] = builder.bindToStateChangeAndAction(
- view.getCreatePK(),
- "generatorDefaults.createPK",
- "refreshSQLAction()");
- optionBindings[2] = builder.bindToStateChangeAndAction(
- view.getCreateTables(),
- "generatorDefaults.createTables",
- "refreshSQLAction()");
- optionBindings[3] = builder.bindToStateChangeAndAction(
- view.getDropPK(),
- "generatorDefaults.dropPK",
- "refreshSQLAction()");
- optionBindings[4] = builder.bindToStateChangeAndAction(
- view.getDropTables(),
- "generatorDefaults.dropTables",
- "refreshSQLAction()");
-
- builder.bindToAction(view.getGenerateButton(), "generateSchemaAction()");
- builder.bindToAction(view.getSaveSqlButton(), "storeSQLAction()");
- builder.bindToAction(view.getCancelButton(), "closeAction()");
-
- // refresh SQL if different tables were selected
- view.getTabs().addChangeListener(new ChangeListener() {
-
- public void stateChanged(ChangeEvent e) {
- if (view.getTabs().getSelectedIndex() == 0) {
- // this assumes that some tables where checked/unchecked... not very
- // efficient
- refreshGeneratorAction();
- }
- }
- });
- }
-
- /**
- * Creates new internal DbGenerator instance.
- */
- protected void prepareGenerator() {
- try {
- DbAdapter adapter = connectionInfo.makeAdapter(getApplication()
- .getClassLoadingService());
- generators = new ArrayList<DbGenerator>();
- for (DataMap dataMap : dataMaps) {
- this.generators.add(new DbGenerator(
- adapter,
- dataMap,
- tables.getExcludedTables(),
- null,
- NoopJdbcEventLogger.getInstance()));
- }
- } catch (Exception ex) {
- reportError("Error loading adapter", ex);
- }
- }
-
- /**
- * Returns SQL statements generated for selected schema generation options.
- */
- protected void createSQL() {
- // convert them to string representation for display
- StringBuffer buf = new StringBuffer();
- for (DbGenerator generator : generators) {
- Iterator<String> it = generator.configuredStatements().iterator();
- String batchTerminator = generator.getAdapter().getBatchTerminator();
-
- String lineEnd = (batchTerminator != null)
- ? "\n" + batchTerminator + "\n\n"
- : "\n\n";
-
- while (it.hasNext()) {
- buf.append(it.next()).append(lineEnd);
- }
- }
-
- textForSQL = buf.toString();
- }
-
- protected void refreshView() {
- getView().setEnabled(connectionInfo != null);
-
- for (ObjectBinding optionBinding : optionBindings) {
- optionBinding.updateView();
- }
-
- sqlBinding.updateView();
- }
-
- // ===============
- // Actions
- // ===============
-
- /**
- * Starts options dialog.
- */
- public void startupAction() {
- view.pack();
- view.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
- view.setModal(true);
- makeCloseableOnEscape();
- centerView();
- view.setVisible(true);
- }
-
- public void refreshGeneratorAction() {
- prepareGenerator();
- refreshSQLAction();
- }
-
- /**
- * Updates a text area showing generated SQL.
- */
- public void refreshSQLAction() {
- // sync generator with defaults, make SQL, then sync the view...
- adapterBinding.updateView();
- connectionInfo.setDbAdapter((String) view.getAdapters().getSelectedItem());
- prepareGenerator();
- generatorDefaults.configureGenerator(generators);
- createSQL();
- sqlBinding.updateView();
- }
-
- /**
- * Performs configured schema operations via DbGenerator.
- */
- public void generateSchemaAction() {
-
- DataSourceController connectWizard = new DataSourceController(
- this.getParent(),
- "Generate DB Schema: Connect to Database",
- null,
- null);
-
- if (!connectWizard.startupAction()) {
- // canceled
- return;
- }
-
- this.connectionInfo = connectWizard.getConnectionInfo();
-
- refreshGeneratorAction();
-
- Collection<ValidationResult> failures = new ArrayList<ValidationResult>();
-
- // sanity check...
- for (DbGenerator generator : generators) {
- if (generator.isEmpty(true)) {
- JOptionPane.showMessageDialog(getView(), "Nothing to generate.");
- return;
- }
-
- try {
-
- DataSource dataSource = connectionInfo.makeDataSource(getApplication()
- .getClassLoadingService());
- generator.runGenerator(dataSource);
- failures.add(generator.getFailures());
- } catch (Throwable th) {
- reportError("Schema Generation Error", th);
- }
- }
-
- if (failures.size() == 0) {
- JOptionPane.showMessageDialog(getView(), "Schema Generation Complete.");
- } else {
- new ValidationResultBrowser(this)
- .startupAction(
- "Schema Generation Complete",
- "Schema generation finished. The following problem(s) were ignored.",
- failures);
- }
- }
-
- /**
- * Allows user to save generated SQL in a file.
- */
- public void storeSQLAction() {
- JFileChooser fc = new JFileChooser();
- fc.setDialogType(JFileChooser.SAVE_DIALOG);
- fc.setDialogTitle("Save SQL Script");
-
- File projectDir = new File(getApplication()
- .getProject()
- .getConfigurationResource()
- .getURL()
- .getPath());
-
- if (projectDir != null) {
- fc.setCurrentDirectory(projectDir);
- }
-
- if (fc.showSaveDialog(getView()) == JFileChooser.APPROVE_OPTION) {
- refreshGeneratorAction();
-
- try {
- File file = fc.getSelectedFile();
- FileWriter fw = new FileWriter(file);
- PrintWriter pw = new PrintWriter(fw);
- pw.print(textForSQL);
- pw.flush();
- pw.close();
- }
- catch (IOException ex) {
- reportError("Error Saving SQL", ex);
- }
- }
- }
-
- public void closeAction() {
- view.dispose();
- }
-
- public DBConnectionInfo getConnectionInfo() {
- return this.connectionInfo;
- }
-
- public void setConnectionInfo(DBConnectionInfo connectionInfo) {
- this.connectionInfo = connectionInfo;
- refreshView();
- }
-}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DBGeneratorOptionsView.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DBGeneratorOptionsView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DBGeneratorOptionsView.java
deleted file mode 100644
index 0c54f9e..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DBGeneratorOptionsView.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*****************************************************************
- * 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.cayenne.modeler.dialog.db;
-
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Dimension;
-import java.awt.FlowLayout;
-import java.awt.GridLayout;
-
-import javax.swing.Box;
-import javax.swing.JButton;
-import javax.swing.JCheckBox;
-import javax.swing.JComboBox;
-import javax.swing.JDialog;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTabbedPane;
-import javax.swing.JTextArea;
-import javax.swing.ScrollPaneConstants;
-import javax.swing.SwingConstants;
-
-import com.jgoodies.forms.builder.PanelBuilder;
-import com.jgoodies.forms.layout.CellConstraints;
-import com.jgoodies.forms.layout.FormLayout;
-
-/**
- * Wizard for generating the database from the data map.
- */
-public class DBGeneratorOptionsView extends JDialog {
-
- protected JTextArea sql;
- protected JButton generateButton;
- protected JButton cancelButton;
- protected JButton saveSqlButton;
- protected JCheckBox dropTables;
- protected JCheckBox createTables;
- protected JCheckBox createFK;
- protected JCheckBox createPK;
- protected JCheckBox dropPK;
- protected Component tables;
- protected JTabbedPane tabs;
- protected JComboBox adapters;
-
- public DBGeneratorOptionsView(Component tables) {
- // create widgets
- this.generateButton = new JButton("Generate");
- this.cancelButton = new JButton("Close");
- this.saveSqlButton = new JButton("Save SQL");
- this.dropTables = new JCheckBox("Drop Tables");
- this.createTables = new JCheckBox("Create Tables");
- this.createFK = new JCheckBox("Create FK Support");
- this.createPK = new JCheckBox("Create Primary Key Support");
- this.dropPK = new JCheckBox("Drop Primary Key Support");
- this.tables = tables;
- this.tabs = new JTabbedPane(SwingConstants.TOP);
- this.adapters = new JComboBox();
- adapters.setEditable(true);
- this.sql = new JTextArea();
- sql.setEditable(false);
- sql.setLineWrap(true);
- sql.setWrapStyleWord(true);
-
- // assemble...
- JPanel optionsPane = new JPanel(new GridLayout(3, 2));
- optionsPane.add(dropTables);
- optionsPane.add(createTables);
- optionsPane.add(new JLabel());
- optionsPane.add(createFK);
- optionsPane.add(dropPK);
- optionsPane.add(createPK);
-
- JPanel sqlTextPanel = new JPanel(new BorderLayout());
- sqlTextPanel.add(new JScrollPane(
- sql,
- ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
- ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), BorderLayout.CENTER);
-
- JPanel adapterPanel = new JPanel(new BorderLayout());
- adapterPanel.add(adapters);
-
- CellConstraints cc = new CellConstraints();
- PanelBuilder builder = new PanelBuilder(new FormLayout(
- "fill:min(50dlu;pref):grow",
- "p, 3dlu, p, 9dlu, p, 3dlu, p, 3dlu, p, 3dlu, fill:40dlu:grow"));
- builder.setDefaultDialogBorder();
- builder.addSeparator("Options", cc.xywh(1, 1, 1, 1));
- builder.add(optionsPane, cc.xy(1, 3, "left,fill"));
- builder.addSeparator("Adapter", cc.xywh(1, 5, 1, 1));
- builder.add(adapterPanel, cc.xy(1, 7));
- builder.addSeparator("Generated SQL", cc.xywh(1, 9, 1, 1));
- builder.add(sqlTextPanel, cc.xy(1, 11));
-
- tabs.addTab("SQL Options", builder.getPanel());
- tabs.addTab("Tables", new JScrollPane(
- tables,
- ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
- ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED));
-
- // we need the right preferred size so that dialog "pack()" produces decent
- // default size...
- tabs.setPreferredSize(new Dimension(450, 500));
-
- JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
- buttons.add(saveSqlButton);
- buttons.add(Box.createHorizontalStrut(20));
- buttons.add(cancelButton);
- buttons.add(generateButton);
-
- Container contentPane = this.getContentPane();
- contentPane.setLayout(new BorderLayout());
- contentPane.add(tabs, BorderLayout.CENTER);
- contentPane.add(buttons, BorderLayout.SOUTH);
- }
-
- public JButton getCancelButton() {
- return cancelButton;
- }
-
- public JTabbedPane getTabs() {
- return tabs;
- }
-
- public JCheckBox getCreateFK() {
- return createFK;
- }
-
- public JCheckBox getCreatePK() {
- return createPK;
- }
-
- public JCheckBox getCreateTables() {
- return createTables;
- }
-
- public JCheckBox getDropPK() {
- return dropPK;
- }
-
- public JCheckBox getDropTables() {
- return dropTables;
- }
-
- public JButton getGenerateButton() {
- return generateButton;
- }
-
- public JButton getSaveSqlButton() {
- return saveSqlButton;
- }
-
- public JTextArea getSql() {
- return sql;
- }
-
- public JComboBox getAdapters() {
- return adapters;
- }
-}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceController.java
deleted file mode 100644
index 2ba7819..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceController.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*****************************************************************
- * 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.cayenne.modeler.dialog.db;
-
-import java.awt.Component;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.apache.cayenne.modeler.ClassLoadingService;
-import org.apache.cayenne.modeler.dialog.pref.PreferenceDialog;
-import org.apache.cayenne.modeler.pref.DBConnectionInfo;
-import org.apache.cayenne.modeler.util.CayenneController;
-import org.apache.cayenne.swing.BindingBuilder;
-import org.apache.cayenne.swing.ObjectBinding;
-
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.WindowConstants;
-
-public class DataSourceController extends CayenneController {
-
- protected DataSourceView view;
-
- protected DBConnectionInfo altDataSource;
- protected String altDataSourceKey;
- protected ObjectBinding dataSourceBinding;
- protected Map dataSources;
-
- protected String dataSourceKey;
-
- // this object is a clone of an object selected from the dropdown, as we
- // need to allow
- // local temporary modifications
- protected DBConnectionInfo connectionInfo;
-
- protected boolean canceled;
-
- public DataSourceController(CayenneController parent, String title, String altDataSourceKey,
- DBConnectionInfo altDataSource) {
- super(parent);
-
- this.view = createView();
- this.view.setTitle(title);
- this.altDataSource = altDataSource;
- this.altDataSourceKey = altDataSourceKey;
- this.connectionInfo = new DBConnectionInfo();
-
- initBindings();
- }
-
- /**
- * Creates swing dialog for this wizard
- */
- protected DataSourceView createView() {
- return new DataSourceView(this);
- }
-
- protected void initBindings() {
- BindingBuilder builder = new BindingBuilder(getApplication().getBindingFactory(), this);
-
- dataSourceBinding = builder.bindToComboSelection(view.getDataSources(), "dataSourceKey");
-
- builder.bindToAction(view.getCancelButton(), "cancelAction()");
- builder.bindToAction(view.getOkButton(), "okAction()");
- builder.bindToAction(view.getConfigButton(), "dataSourceConfigAction()");
- }
-
- public String getDataSourceKey() {
- return dataSourceKey;
- }
-
- public void setDataSourceKey(String dataSourceKey) {
- this.dataSourceKey = dataSourceKey;
-
- // update a clone object that will be used to obtain connection...
- DBConnectionInfo currentInfo = (DBConnectionInfo) dataSources.get(dataSourceKey);
- if (currentInfo != null) {
- currentInfo.copyTo(connectionInfo);
- } else {
- connectionInfo = new DBConnectionInfo();
- }
-
- view.getConnectionInfo().setConnectionInfo(connectionInfo);
- }
-
- /**
- * Main action method that pops up a dialog asking for user selection.
- * Returns true if the selection was confirmed, false - if canceled.
- */
- public boolean startupAction() {
- this.canceled = true;
-
- refreshDataSources();
-
- view.pack();
- view.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
- view.setModal(true);
- makeCloseableOnEscape();
- centerView();
- view.setVisible(true);
-
- return !canceled;
- }
-
- public DBConnectionInfo getConnectionInfo() {
- return connectionInfo;
- }
-
- /**
- * Tests that the entered information is valid and can be used to open a
- * conneciton. Does not store the open connection.
- */
- public void okAction() {
- DBConnectionInfo info = getConnectionInfo();
- ClassLoadingService classLoader = getApplication().getClassLoadingService();
-
- // try making an adapter...
- try {
- info.makeAdapter(classLoader);
- } catch (Throwable th) {
- reportError("DbAdapter Error", th);
- return;
- }
-
- // doing connection testing...
- // attempt opening the connection, and close it right away
- try {
-
- try (Connection connection = info.makeDataSource(classLoader).getConnection();) {
- //
- } catch (SQLException ex) {
- // ignore close error
- }
- } catch (Throwable th) {
- reportError("Connection Error", th);
- return;
- }
-
- // set success flag, and unblock the caller...
- canceled = false;
- view.dispose();
- }
-
- public void cancelAction() {
- canceled = true;
- view.dispose();
- }
-
- /**
- * Opens preferences panel to allow configuration of DataSource presets.
- */
- public void dataSourceConfigAction() {
- PreferenceDialog prefs = new PreferenceDialog(this);
- prefs.showDataSourceEditorAction(dataSourceKey);
- refreshDataSources();
- }
-
- public Component getView() {
- return view;
- }
-
- protected void refreshDataSources() {
- this.dataSources = getApplication().getCayenneProjectPreferences().getDetailObject(DBConnectionInfo.class)
- .getChildrenPreferences();
-
- // 1.2 migration fix - update data source adapter names
- Iterator it = dataSources.values().iterator();
-
- final String _12package = "org.objectstyle.cayenne.";
- while (it.hasNext()) {
- DBConnectionInfo info = (DBConnectionInfo) it.next();
- if (info.getDbAdapter() != null && info.getDbAdapter().startsWith(_12package)) {
- info.setDbAdapter("org.apache.cayenne." + info.getDbAdapter().substring(_12package.length()));
-
- // info.getObjectContext().commitChanges();
- }
- }
-
- if (altDataSourceKey != null && !dataSources.containsKey(altDataSourceKey) && altDataSource != null) {
- dataSources.put(altDataSourceKey, altDataSource);
- }
-
- Object[] keys = dataSources.keySet().toArray();
- Arrays.sort(keys);
- view.getDataSources().setModel(new DefaultComboBoxModel(keys));
-
- if (getDataSourceKey() == null) {
- String key = null;
-
- if (altDataSourceKey != null) {
- key = altDataSourceKey;
- } else if (keys.length > 0) {
- key = keys[0].toString();
- }
-
- setDataSourceKey(key);
- dataSourceBinding.updateView();
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceView.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceView.java
deleted file mode 100644
index 3258a54..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceView.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*****************************************************************
- * 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.cayenne.modeler.dialog.db;
-
-import java.awt.BorderLayout;
-import java.awt.FlowLayout;
-
-import javax.swing.JButton;
-import javax.swing.JComboBox;
-import javax.swing.JDialog;
-import javax.swing.JPanel;
-
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.dialog.pref.DBConnectionInfoEditor;
-import org.apache.cayenne.modeler.util.CayenneController;
-
-import com.jgoodies.forms.builder.PanelBuilder;
-import com.jgoodies.forms.layout.CellConstraints;
-import com.jgoodies.forms.layout.FormLayout;
-
-/**
- */
-public class DataSourceView extends JDialog {
-
- protected JComboBox dataSources;
- protected JButton configButton;
- protected JButton okButton;
- protected JButton cancelButton;
- protected DBConnectionInfoEditor connectionInfo;
-
- public DataSourceView(CayenneController controller) {
- super(Application.getFrame());
-
- this.dataSources = new JComboBox();
-
- this.configButton = new JButton("...");
- this.configButton.setToolTipText("configure local DataSource");
- this.okButton = new JButton("Continue");
- this.cancelButton = new JButton("Cancel");
- this.connectionInfo = new DBConnectionInfoEditor(controller);
-
- CellConstraints cc = new CellConstraints();
- PanelBuilder builder = new PanelBuilder(new FormLayout(
- "20dlu:grow, pref, 3dlu, fill:max(150dlu;pref), 3dlu, fill:20dlu",
- "p"));
- builder.setDefaultDialogBorder();
-
- builder.addLabel("Saved DataSources:", cc.xy(2, 1));
- builder.add(dataSources, cc.xy(4, 1));
- builder.add(configButton, cc.xy(6, 1));
-
- JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
- buttons.add(cancelButton);
- buttons.add(okButton);
-
- getContentPane().setLayout(new BorderLayout());
- getContentPane().add(builder.getPanel(), BorderLayout.NORTH);
- getContentPane().add(connectionInfo.getView(), BorderLayout.CENTER);
- getContentPane().add(buttons, BorderLayout.SOUTH);
-
- setTitle("DB Connection Info");
- }
-
- public JComboBox getDataSources() {
- return dataSources;
- }
-
- public JButton getCancelButton() {
- return cancelButton;
- }
-
- public JButton getConfigButton() {
- return configButton;
- }
-
- public JButton getOkButton() {
- return okButton;
- }
-
- public DBConnectionInfoEditor getConnectionInfo() {
- return connectionInfo;
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceWizard.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceWizard.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceWizard.java
index 5fa3987..814f589 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceWizard.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceWizard.java
@@ -19,6 +19,7 @@
package org.apache.cayenne.modeler.dialog.db;
+import org.apache.cayenne.dba.DbAdapter;
import org.apache.cayenne.modeler.ClassLoadingService;
import org.apache.cayenne.modeler.dialog.pref.GeneralPreferences;
import org.apache.cayenne.modeler.dialog.pref.PreferenceDialog;
@@ -29,6 +30,7 @@ import org.apache.cayenne.modeler.util.CayenneController;
import org.apache.cayenne.swing.BindingBuilder;
import org.apache.cayenne.swing.ObjectBinding;
+import javax.sql.DataSource;
import javax.swing.*;
import java.awt.*;
import java.sql.Connection;
@@ -44,32 +46,28 @@ import java.util.prefs.Preferences;
*/
public class DataSourceWizard extends CayenneController {
- protected DataSourceWizardView view;
-
- protected DBConnectionInfo altDataSource;
- protected String altDataSourceKey;
- protected ObjectBinding dataSourceBinding;
- protected Map<String, DBConnectionInfo> dataSources;
-
- protected String dataSourceKey;
+ private DataSourceWizardView view;
+ private ObjectBinding dataSourceBinding;
+ private Map<String, DBConnectionInfo> dataSources;
+ private String dataSourceKey;
// this object is a clone of an object selected from the dropdown, as we
// need to allow
// local temporary modifications
- protected DBConnectionInfo connectionInfo;
+ private DBConnectionInfo connectionInfo;
+
+ private boolean canceled;
- protected boolean canceled;
+ private DataSourceModificationListener dataSourceListener;
- protected DataSourceModificationListener dataSourceListener;
+ private DbAdapter adapter;
+ private DataSource dataSource;
- public DataSourceWizard(CayenneController parent, String title, String altDataSourceKey,
- DBConnectionInfo altDataSource) {
+ public DataSourceWizard(CayenneController parent, String title) {
super(parent);
this.view = createView();
this.view.setTitle(title);
- this.altDataSource = altDataSource;
- this.altDataSourceKey = altDataSourceKey;
this.connectionInfo = new DBConnectionInfo();
initBindings();
@@ -79,7 +77,7 @@ public class DataSourceWizard extends CayenneController {
/**
* Creates swing dialog for this wizard
*/
- protected DataSourceWizardView createView() {
+ private DataSourceWizardView createView() {
return new DataSourceWizardView(this);
}
@@ -93,7 +91,7 @@ public class DataSourceWizard extends CayenneController {
builder.bindToAction(view.getConfigButton(), "dataSourceConfigAction()");
}
- protected void initDataSourceListener() {
+ private void initDataSourceListener() {
dataSourceListener = new DataSourceModificationListener() {
@Override
public void callbackDataSourceRemoved(DataSourceModificationEvent e) {}
@@ -108,7 +106,7 @@ public class DataSourceWizard extends CayenneController {
.addDataSourceModificationListener(dataSourceListener);
}
- protected void initFavouriteDataSource() {
+ private void initFavouriteDataSource() {
Preferences pref = getApplication().getPreferencesNode(GeneralPreferences.class, "");
String favouriteDataSource = pref.get(GeneralPreferences.FAVOURITE_DATA_SOURCE, null);
if(favouriteDataSource != null && dataSources.containsKey(favouriteDataSource)) {
@@ -117,7 +115,7 @@ public class DataSourceWizard extends CayenneController {
}
}
- protected void removeDataSourceListener() {
+ private void removeDataSourceListener() {
getApplication().getFrameController().getProjectController()
.removeDataSourceModificationListener(dataSourceListener);
}
@@ -172,28 +170,17 @@ public class DataSourceWizard extends CayenneController {
DBConnectionInfo info = getConnectionInfo();
ClassLoadingService classLoader = getApplication().getClassLoadingService();
- // try making an adapter...
- try {
- info.makeAdapter(classLoader);
- } catch (Throwable th) {
- reportError("DbAdapter Error", th);
- return;
- }
-
// doing connection testing...
- // attempt opening the connection, and close it right away
try {
-
- try (Connection connection = info.makeDataSource(classLoader).getConnection();) {
- //
- } catch (SQLException ex) {
- // ignore close error
+ this.adapter = info.makeAdapter(classLoader);
+ this.dataSource = info.makeDataSource(classLoader);
+ try (Connection connection = dataSource.getConnection()) {
+ } catch (SQLException ignore) {
}
} catch (Throwable th) {
reportError("Connection Error", th);
return;
}
-
onClose(false);
}
@@ -228,8 +215,9 @@ public class DataSourceWizard extends CayenneController {
return view;
}
- protected void refreshDataSources() {
- this.dataSources = getApplication().getCayenneProjectPreferences().getDetailObject(DBConnectionInfo.class)
+ @SuppressWarnings("unchecked")
+ private void refreshDataSources() {
+ this.dataSources = (Map<String, DBConnectionInfo>)getApplication().getCayenneProjectPreferences().getDetailObject(DBConnectionInfo.class)
.getChildrenPreferences();
// 1.2 migration fix - update data source adapter names
@@ -237,23 +225,16 @@ public class DataSourceWizard extends CayenneController {
for(DBConnectionInfo info : dataSources.values()) {
if (info.getDbAdapter() != null && info.getDbAdapter().startsWith(_12package)) {
info.setDbAdapter("org.apache.cayenne." + info.getDbAdapter().substring(_12package.length()));
- // info.getObjectContext().commitChanges();
}
}
- if (altDataSourceKey != null && !dataSources.containsKey(altDataSourceKey) && altDataSource != null) {
- dataSources.put(altDataSourceKey, altDataSource);
- }
-
String[] keys = dataSources.keySet().toArray(new String[0]);
Arrays.sort(keys);
view.getDataSources().setModel(new DefaultComboBoxModel<>(keys));
String key = null;
if (getDataSourceKey() == null || !dataSources.containsKey(getDataSourceKey())) {
- if (altDataSourceKey != null) {
- key = altDataSourceKey;
- } else if (keys.length > 0) {
+ if (keys.length > 0) {
key = keys[0];
}
}
@@ -261,4 +242,15 @@ public class DataSourceWizard extends CayenneController {
setDataSourceKey(key != null ? key : getDataSourceKey());
dataSourceBinding.updateView();
}
+
+ public DataSource getDataSource() {
+ return dataSource;
+ }
+
+ /**
+ * Returns configured DbAdapter.
+ */
+ public DbAdapter getAdapter() {
+ return adapter;
+ }
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderHelper.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderHelper.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderHelper.java
deleted file mode 100644
index d314214..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderHelper.java
+++ /dev/null
@@ -1,401 +0,0 @@
-/*
- * 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.cayenne.modeler.dialog.db;
-
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.configuration.ConfigurationNameMapper;
-import org.apache.cayenne.configuration.ConfigurationNode;
-import org.apache.cayenne.configuration.server.DataSourceFactory;
-import org.apache.cayenne.configuration.server.DbAdapterFactory;
-import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.dbimport.Catalog;
-import org.apache.cayenne.dbimport.IncludeProcedure;
-import org.apache.cayenne.dbimport.IncludeTable;
-import org.apache.cayenne.dbimport.ReverseEngineering;
-import org.apache.cayenne.dbimport.Schema;
-import org.apache.cayenne.dbsync.DbSyncModule;
-import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
-import org.apache.cayenne.dbsync.naming.NameBuilder;
-import org.apache.cayenne.dbsync.reverse.db.DbLoader;
-import org.apache.cayenne.dbsync.reverse.db.DefaultDbLoaderDelegate;
-import org.apache.cayenne.dbsync.reverse.filters.FiltersConfigBuilder;
-import org.apache.cayenne.di.DIBootstrap;
-import org.apache.cayenne.di.Injector;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.map.MapLoader;
-import org.apache.cayenne.map.event.EntityEvent;
-import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ProjectController;
-import org.apache.cayenne.modeler.dialog.DbImportProjectSaver;
-import org.apache.cayenne.modeler.pref.DBConnectionInfo;
-import org.apache.cayenne.modeler.util.LongRunningTask;
-import org.apache.cayenne.modeler.util.ProjectUtil;
-import org.apache.cayenne.tools.configuration.ToolsModule;
-import org.apache.cayenne.tools.dbimport.DbImportAction;
-import org.apache.cayenne.tools.dbimport.DbImportConfiguration;
-import org.apache.cayenne.tools.dbimport.DbImportModule;
-import org.apache.cayenne.util.Util;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import javax.swing.*;
-import java.io.File;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Stateful helper class that encapsulates access to DbLoader.
- */
-public class DbLoaderHelper {
-
- // TODO: this is a temp hack... need to delegate to DbAdapter, or
- // configurable in preferences...
- private static final Collection<String> EXCLUDED_TABLES = Arrays.asList("AUTO_PK_SUPPORT", "auto_pk_support");
-
- private static Log LOGGER = LogFactory.getLog(DbLoaderHelper.class);
-
- protected boolean stoppingReverseEngineering;
- protected boolean existingMap;
- protected ProjectController projectController;
- protected Connection connection;
- protected DataMap dataMap;
- protected DbAdapter adapter;
- protected DbImportConfiguration config;
- protected String loadStatusNote;
-
- public DbLoaderHelper(ProjectController projectController,
- Connection connection,
- DbAdapter adapter,
- DBConnectionInfo dbConnectionInfo) {
-
- this.projectController = projectController;
- this.adapter = adapter;
-
- this.config = new DbImportConfiguration();
- this.config.setAdapter(adapter.getClass().getName());
- this.config.setUsername(dbConnectionInfo.getUserName());
- this.config.setPassword(dbConnectionInfo.getPassword());
- this.config.setDriver(dbConnectionInfo.getJdbcDriver());
- this.config.setUrl(dbConnectionInfo.getUrl());
-
- this.connection = connection;
- }
-
- public boolean isStoppingReverseEngineering() {
- return stoppingReverseEngineering;
- }
-
- public void setStoppingReverseEngineering(boolean stopReverseEngineering) {
- this.stoppingReverseEngineering = stopReverseEngineering;
- }
-
- public DataMap getDataMap() {
- return dataMap;
- }
-
- /**
- * Performs reverse engineering of the DB using internal DbLoader. This
- * method should be invoked outside EventDispatchThread, or it will throw an
- * exception.
- */
- public void execute() {
- stoppingReverseEngineering = false;
-
- // load catalogs...
- List<String> catalogs = Collections.emptyList();
- if (adapter.supportsCatalogsOnReverseEngineering()) {
- catalogs = new LoadCatalogsTask(Application.getFrame(), "Loading Catalogs").startAndWait();
- }
-
- if (stoppingReverseEngineering) {
- return;
- }
-
- // load schemas...
- List<String> schemas = new LoadSchemasTask(Application.getFrame(), "Loading Schemas").startAndWait();
-
- if (stoppingReverseEngineering) {
- return;
- }
-
- // use this catalog as the default...
- String currentCatalog = null;
- try {
- currentCatalog = connection.getCatalog();
- } catch (SQLException e) {
- LOGGER.warn("Error getting catalog.", e);
- }
-
- String currentSchema = null;
- try {
- // 'getSchema' is Java 1.7 API ... hope this works with all drivers...
- currentSchema = connection.getSchema();
- } catch (SQLException e) {
- LOGGER.warn("Error getting schema.", e);
- }
-
- final DbLoaderOptionsDialog dialog = new DbLoaderOptionsDialog(
- schemas,
- catalogs,
- currentSchema,
- currentCatalog);
-
- try {
- // since we are not inside EventDispatcher Thread, must run it via SwingUtilities
- SwingUtilities.invokeAndWait(new Runnable() {
-
- public void run() {
- dialog.setVisible(true);
- dialog.dispose();
- }
- });
- } catch (Throwable th) {
- processException(th, "Error Reengineering Database");
- return;
- }
-
- if (dialog.getChoice() == DbLoaderOptionsDialog.CANCEL) {
- return;
- }
-
- ReverseEngineering reverseEngineering = new ReverseEngineering();
-
- reverseEngineering.addCatalog(new Catalog(dialog.getSelectedCatalog()));
- reverseEngineering.addSchema(new Schema(dialog.getSelectedSchema()));
- reverseEngineering.addIncludeTable(new IncludeTable(dialog.getTableNamePattern()));
- reverseEngineering.addIncludeProcedure(new IncludeProcedure(dialog.getProcedureNamePattern()));
-
- config.setMeaningfulPkTables(dialog.getMeaningfulPk());
- config.setNamingStrategy(dialog.getNamingStrategy());
-
- new LoadDataMapTask(Application.getFrame(), "Reengineering DB", reverseEngineering).startAndWait();
- }
-
- protected void processException(final Throwable th, final String message) {
- LOGGER.info("Exception on reverse engineering", Util.unwindException(th));
- SwingUtilities.invokeLater(new Runnable() {
-
- public void run() {
- JOptionPane.showMessageDialog(Application.getFrame(), th.getMessage(), message,
- JOptionPane.ERROR_MESSAGE);
- }
- });
- }
-
-
- private final class LoaderDelegate extends DefaultDbLoaderDelegate {
-
- @Override
- public void dbEntityAdded(DbEntity entity) {
- checkCanceled();
-
- loadStatusNote = "Importing table '" + entity.getName() + "'...";
-
- // TODO: hack to prevent PK tables from being visible... this should
- // really be delegated to DbAdapter to decide...
- if (EXCLUDED_TABLES.contains(entity.getName()) && entity.getDataMap() != null) {
- entity.getDataMap().removeDbEntity(entity.getName());
- } else if (existingMap) {
- projectController.fireDbEntityEvent(new EntityEvent(this, entity, MapEvent.ADD));
- }
- }
-
- @Override
- public void dbEntityRemoved(DbEntity entity) {
- checkCanceled();
-
- if (existingMap) {
- projectController.fireDbEntityEvent(new EntityEvent(Application.getFrame(), entity, MapEvent.REMOVE));
- }
- }
-
- @Override
- public boolean dbRelationship(DbEntity entity) {
- checkCanceled();
-
- loadStatusNote = "Load relationships for '" + entity.getName() + "'...";
-
- return true;
- }
-
- @Override
- public boolean dbRelationshipLoaded(DbEntity entity, DbRelationship relationship) {
- checkCanceled();
-
- loadStatusNote = "Load relationship: '" + entity.getName() + "'; '" + relationship.getName() + "'...";
-
- return true;
- }
-
- void checkCanceled() {
- if (isStoppingReverseEngineering()) {
- throw new CayenneRuntimeException("Reengineering was canceled.");
- }
- }
- }
-
- abstract class DbLoaderTask<T> extends LongRunningTask<T> {
-
- public DbLoaderTask(JFrame frame, String title) {
- super(frame, title);
- setMinValue(0);
- setMaxValue(10);
- }
-
- @Override
- protected String getCurrentNote() {
- return loadStatusNote;
- }
-
- @Override
- protected int getCurrentValue() {
- return getMinValue();
- }
-
- @Override
- protected boolean isIndeterminate() {
- return true;
- }
-
- @Override
- public boolean isCanceled() {
- return isStoppingReverseEngineering();
- }
-
- @Override
- public void setCanceled(boolean b) {
- if (b) {
- loadStatusNote = "Canceling..";
- }
-
- setStoppingReverseEngineering(b);
- }
- }
-
- final class LoadCatalogsTask extends DbLoaderTask<List<String>> {
-
- public LoadCatalogsTask(JFrame frame, String title) {
- super(frame, title);
- }
-
- @Override
- protected void execute() {
- loadStatusNote = "Loading available catalogs...";
-
- try {
- result = DbLoader.loadCatalogs(connection);
- } catch (Throwable th) {
- processException(th, "Error Loading Catalogs");
- }
- }
- }
-
- final class LoadSchemasTask extends DbLoaderTask<List<String>> {
-
- public LoadSchemasTask(JFrame frame, String title) {
- super(frame, title);
- }
-
- @Override
- protected void execute() {
- loadStatusNote = "Loading available schemas...";
-
- try {
- result = DbLoader.loadSchemas(connection);
- } catch (Throwable th) {
- processException(th, "Error Loading Schemas");
- }
- }
- }
-
- public final class LoadDataMapTask extends DbLoaderTask {
-
- private ReverseEngineering reverseEngineering;
-
- public LoadDataMapTask(JFrame frame, String title, ReverseEngineering reverseEngineering) {
- super(frame, title);
- this.reverseEngineering = reverseEngineering;
- }
-
- @Override
- protected void execute() {
-
- loadStatusNote = "Preparing...";
-
- DbLoaderHelper.this.dataMap = projectController.getCurrentDataMap();
- DbLoaderHelper.this.existingMap = dataMap != null;
-
- if (!existingMap) {
-
- ConfigurationNode root = projectController.getProject().getRootNode();
-
- dataMap = new DataMap();
- dataMap.setName(NameBuilder.builder(dataMap, root).name());
- }
-
- if (isCanceled()) {
- return;
- }
-
- if (dataMap.getConfigurationSource() != null) {
- config.setTargetDataMap(new File(dataMap.getConfigurationSource().getURL().getPath()));
- }
-
- FiltersConfigBuilder filtersConfigBuilder = new FiltersConfigBuilder(reverseEngineering);
- config.getDbLoaderConfig().setFiltersConfig(filtersConfigBuilder.build());
-
- DbImportAction importAction = createAction(dataMap);
- try {
- importAction.execute(config);
- } catch (Exception e) {
- processException(e, "Error importing database schema.");
- }
- ProjectUtil.cleanObjMappings(dataMap);
- }
-
- protected DbImportAction createAction(DataMap targetDataMap) {
- Injector injector = DIBootstrap.createInjector(new DbSyncModule(),
- new ToolsModule(LOGGER),
- new DbImportModule());
-
- return new ModelerDbImportAction(
- LOGGER,
- new DbImportProjectSaver(projectController, injector.getInstance(ConfigurationNameMapper.class)),
- injector.getInstance(DataSourceFactory.class),
- injector.getInstance(DbAdapterFactory.class),
- injector.getInstance(MapLoader.class),
- injector.getInstance(MergerTokenFactoryProvider.class),
- targetDataMap,
- createDbLoader(config));
- }
-
- protected DbLoader createDbLoader(DbImportConfiguration configuration) {
- return new DbLoader(connection, adapter, new LoaderDelegate(), configuration.createNameGenerator());
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderOptionsDialog.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderOptionsDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderOptionsDialog.java
deleted file mode 100644
index 6911586..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderOptionsDialog.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*****************************************************************
- * 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.cayenne.modeler.dialog.db;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-import com.jgoodies.forms.layout.FormLayout;
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.util.CayenneDialog;
-import org.apache.cayenne.modeler.util.NameGeneratorPreferences;
-
-import javax.swing.*;
-import java.awt.*;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.util.Collection;
-import java.util.Vector;
-
-/**
- * Dialog for selecting database reverse-engineering parameters.
- */
-public class DbLoaderOptionsDialog extends CayenneDialog {
-
- public static final String WILDCARD_PATTERN = ".*";
-
- public static final int CANCEL = 0;
- public static final int SELECT = 1;
-
- protected JLabel catalogLabel;
- protected JComboBox<String> catalogSelector;
- protected JLabel schemaLabel;
- protected JComboBox<String> schemaSelector;
- protected JTextField tableNamePatternField;
- protected JTextField meaningfulPk;
- protected JTextField procNamePatternField;
- protected JLabel procedureLabel;
- protected JButton selectButton;
- protected JButton cancelButton;
-
-
- protected JComboBox<String> strategyCombo;
- protected String strategy;
- protected int choice;
-
- /**
- * Creates and initializes new ChooseSchemaDialog.
- */
- public DbLoaderOptionsDialog(Collection<String> schemas, Collection<String> catalogs, String currentSchema,
- String dbCatalog) {
- super(Application.getFrame(), "Reengineer DB Schema: Select Options");
-
- init();
- initController();
- initFromModel(schemas, catalogs, currentSchema, dbCatalog);
-
- pack();
- setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
- setModal(true);
- centerWindow();
- }
-
- /** Sets up the graphical components. */
- protected void init() {
-
- // create widgets...
- selectButton = new JButton("Continue");
- cancelButton = new JButton("Cancel");
- catalogSelector = new JComboBox<>();
- schemaSelector = new JComboBox<>();
- tableNamePatternField = new JTextField();
- tableNamePatternField.setToolTipText("<html>Regular expression to filter table names.<br>" +
- "Default expression <b>.*</b> includes all tables.</html>");
- procNamePatternField = new JTextField();
- procNamePatternField.setToolTipText("<html>Regular expression to filter stored procedures names.<br>" +
- "Default expression .* includes all stored procedures.</html>");
- meaningfulPk = new JTextField();
- meaningfulPk.setToolTipText("<html>Regular expression to filter tables with meaningful primary keys.<br>" +
- "Multiple expressions divided by comma can be used.<br>" +
- "Example: <b>^table1,^table2,^prefix.*</b></html>");
- strategyCombo = new JComboBox<>();
- strategyCombo.setEditable(true);
-
- // assemble
- FormLayout layout = new FormLayout(
- "right:pref, 3dlu, fill:max(170dlu;pref):grow",
- "");
- DefaultFormBuilder builder = new DefaultFormBuilder(layout);
- builder.setDefaultDialogBorder();
-
- catalogLabel = builder.append("Select Catalog:", catalogSelector);
- schemaLabel = builder.append("Select Schema:", schemaSelector);
- builder.append("Table Name Pattern:", tableNamePatternField);
- procedureLabel = builder.append("Procedure Name Pattern:", procNamePatternField);
- builder.append("Naming Strategy:", strategyCombo);
- builder.append("Tables with Meaningful PK Pattern:", meaningfulPk);
-
- JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
- buttons.add(cancelButton);
- buttons.add(selectButton);
-
- getContentPane().setLayout(new BorderLayout());
- getContentPane().add(builder.getPanel(), BorderLayout.CENTER);
- getContentPane().add(buttons, BorderLayout.SOUTH);
- }
-
- protected void initController() {
- selectButton.addActionListener(new ActionListener() {
-
- public void actionPerformed(ActionEvent e) {
- processSelect();
- }
- });
- cancelButton.addActionListener(new ActionListener() {
-
- public void actionPerformed(ActionEvent e) {
- processCancel();
- }
- });
- }
-
- protected void initFromModel(
- Collection<String> schemas,
- Collection<String> catalogs,
- String currentSchema,
- String currentCatalog) {
-
- this.choice = CANCEL;
- this.tableNamePatternField.setText(WILDCARD_PATTERN);
- this.procNamePatternField.setText(WILDCARD_PATTERN);
-
- Vector<String> arr = NameGeneratorPreferences
- .getInstance()
- .getLastUsedStrategies();
- strategyCombo.setModel(new DefaultComboBoxModel<>(arr));
-
- boolean showSchemaSelector = schemas != null && !schemas.isEmpty();
- schemaSelector.setVisible(showSchemaSelector);
- schemaLabel.setVisible(showSchemaSelector);
-
- if (showSchemaSelector) {
-
- schemaSelector.setModel(new DefaultComboBoxModel<>(schemas.toArray(new String[0])));
-
- if (currentSchema != null) {
- for (String schema : schemas) {
- if (currentSchema.equalsIgnoreCase(schema)) {
- schemaSelector.setSelectedItem(schema);
- break;
- }
- }
- }
- }
-
- boolean showCatalogSelector = catalogs != null && !catalogs.isEmpty();
- catalogSelector.setVisible(showCatalogSelector);
- catalogLabel.setVisible(showCatalogSelector);
-
- if (showCatalogSelector) {
- catalogSelector.setModel(new DefaultComboBoxModel<>(catalogs.toArray(new String[0])));
-
- if (currentCatalog != null && !currentCatalog.isEmpty()) {
- for (String catalog : catalogs) {
- if (currentCatalog.equalsIgnoreCase(catalog)) {
- catalogSelector.setSelectedItem(catalog);
- break;
- }
- }
- }
- }
- }
-
- public int getChoice() {
- return choice;
- }
-
- private void processSelect() {
- strategy = (String) strategyCombo.getSelectedItem();
-
- choice = SELECT;
- setVisible(false);
- }
-
- private void processCancel() {
- choice = CANCEL;
- setVisible(false);
- }
-
- /**
- * Returns selected catalog.
- */
- public String getSelectedCatalog() {
- String catalog = (String) catalogSelector.getSelectedItem();
- return "".equals(catalog) ? null : catalog;
- }
-
- /**
- * Returns selected schema.
- */
- public String getSelectedSchema() {
- String schema = (String) schemaSelector.getSelectedItem();
- return "".equals(schema) ? null : schema;
- }
-
- /**
- * Returns the tableNamePattern.
- */
- public String getTableNamePattern() {
- return "".equals(tableNamePatternField.getText()) ? null : tableNamePatternField
- .getText();
- }
-
- public String getMeaningfulPk() {
- return "".equals(meaningfulPk.getText()) ? null : meaningfulPk
- .getText();
- }
-
- /**
- * Returns the procedure name pattern.
- */
- public String getProcedureNamePattern() {
- return "".equals(procNamePatternField.getText()) ? null : procNamePatternField
- .getText();
- }
-
- /**
- * Returns configured naming strategy
- */
- public String getNamingStrategy() {
- return strategy;
- }
-}
[10/10] cayenne git commit: Merge branch '157'
Posted by sk...@apache.org.
Merge branch '157'
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/27138761
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/27138761
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/27138761
Branch: refs/heads/master
Commit: 27138761c90564ce772b9370ce9bb4f5a222156a
Parents: 1a647b2 a1f10f4
Author: Savva Kolbachev <s....@gmail.com>
Authored: Mon Dec 19 14:45:45 2016 +0300
Committer: Savva Kolbachev <s....@gmail.com>
Committed: Mon Dec 19 14:45:45 2016 +0300
----------------------------------------------------------------------
docs/doc/src/main/resources/RELEASE-NOTES.txt | 1 +
.../cayenne/modeler/action/DBWizardAction.java | 130 +++---
.../modeler/action/GenerateDBAction.java | 9 +-
.../cayenne/modeler/action/MigrateAction.java | 82 +---
.../action/ReverseEngineeringAction.java | 85 ++--
.../modeler/dialog/DbImportProjectSaver.java | 77 ----
.../modeler/dialog/db/ConnectionWizard.java | 87 ----
.../modeler/dialog/db/DBGeneratorOptions.java | 345 ----------------
.../dialog/db/DBGeneratorOptionsView.java | 178 --------
.../modeler/dialog/db/DataSourceController.java | 219 ----------
.../modeler/dialog/db/DataSourceView.java | 100 -----
.../modeler/dialog/db/DataSourceWizard.java | 80 ++--
.../dialog/db/DbActionOptionsDialog.java | 178 ++++++++
.../modeler/dialog/db/DbLoaderHelper.java | 401 -------------------
.../dialog/db/DbLoaderOptionsDialog.java | 247 ------------
.../dialog/db/DbMigrateOptionsDialog.java | 175 --------
.../modeler/dialog/db/MergerOptions.java | 394 ------------------
.../modeler/dialog/db/MergerOptionsView.java | 134 -------
.../db/MergerTokenSelectorController.java | 239 -----------
.../dialog/db/MergerTokenSelectorView.java | 106 -----
.../dialog/db/MergerTokenTableModel.java | 128 ------
.../dialog/db/ModelerDbImportAction.java | 67 ----
.../dialog/db/TableSelectorController.java | 251 ------------
.../modeler/dialog/db/TableSelectorView.java | 94 -----
.../dialog/db/gen/DBGeneratorOptions.java | 332 +++++++++++++++
.../dialog/db/gen/DBGeneratorOptionsView.java | 178 ++++++++
.../dialog/db/gen/TableSelectorController.java | 251 ++++++++++++
.../dialog/db/gen/TableSelectorView.java | 94 +++++
.../dialog/db/load/DbImportProjectSaver.java | 74 ++++
.../modeler/dialog/db/load/DbLoaderContext.java | 183 +++++++++
.../dialog/db/load/DbLoaderOptionsDialog.java | 117 ++++++
.../modeler/dialog/db/load/LoadDataMapTask.java | 97 +++++
.../modeler/dialog/db/load/LoaderDelegate.java | 71 ++++
.../dialog/db/load/ModelerDbImportAction.java | 53 +++
.../dialog/db/load/ModelerSyncModule.java | 44 ++
.../modeler/dialog/db/merge/MergerOptions.java | 394 ++++++++++++++++++
.../dialog/db/merge/MergerOptionsView.java | 134 +++++++
.../db/merge/MergerTokenSelectorController.java | 240 +++++++++++
.../db/merge/MergerTokenSelectorView.java | 106 +++++
.../dialog/db/merge/MergerTokenTableModel.java | 129 ++++++
.../cayenne/modeler/util/DbAdapterInfo.java | 2 +-
41 files changed, 2829 insertions(+), 3477 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cayenne/blob/27138761/docs/doc/src/main/resources/RELEASE-NOTES.txt
----------------------------------------------------------------------
diff --cc docs/doc/src/main/resources/RELEASE-NOTES.txt
index 7281967,ca2395c..55b2757
--- a/docs/doc/src/main/resources/RELEASE-NOTES.txt
+++ b/docs/doc/src/main/resources/RELEASE-NOTES.txt
@@@ -19,7 -19,7 +19,8 @@@ CAY-2165 Explicit "contribution" API fo
CAY-2166 Auto-loading of Cayenne modules
CAY-2168 Split DbLoader to parts and clean it up
CAY-2169 Split DbMerger to parts and clean it up
+ CAY-2172 Cleanup Modeler import and migrate db actions
+CAY-2176 Java 7 diamond class generation templates
Bug Fixes:
[06/10] cayenne git commit: Merge branch 'master' into CAY-2172
Posted by sk...@apache.org.
Merge branch 'master' into CAY-2172
# Conflicts:
# modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
# modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderHelper.java
# modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ModelerDbImportAction.java
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/391c564b
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/391c564b
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/391c564b
Branch: refs/heads/master
Commit: 391c564be288412898c3861bc08305fabb1403b8
Parents: 190ab7c 25ae44a
Author: stariy <st...@gmail.com>
Authored: Wed Dec 14 22:47:27 2016 +0300
Committer: stariy <st...@gmail.com>
Committed: Wed Dec 14 22:47:27 2016 +0300
----------------------------------------------------------------------
.../cayenne/dbsync/merge/AbstractMerger.java | 92 ++++
.../cayenne/dbsync/merge/AbstractToDbToken.java | 130 -----
.../dbsync/merge/AbstractToModelToken.java | 125 -----
.../cayenne/dbsync/merge/AddColumnToDb.java | 74 ---
.../cayenne/dbsync/merge/AddColumnToModel.java | 52 --
.../dbsync/merge/AddRelationshipToDb.java | 87 ---
.../dbsync/merge/AddRelationshipToModel.java | 89 ----
.../cayenne/dbsync/merge/ChainMerger.java | 71 +++
.../cayenne/dbsync/merge/CreateTableToDb.java | 86 ---
.../dbsync/merge/CreateTableToModel.java | 98 ----
.../cayenne/dbsync/merge/DataMapMerger.java | 156 ++++++
.../dbsync/merge/DbAttributeDictionary.java | 44 ++
.../cayenne/dbsync/merge/DbAttributeMerger.java | 168 ++++++
.../dbsync/merge/DbEntityDictionary.java | 66 +++
.../cayenne/dbsync/merge/DbEntityMerger.java | 127 +++++
.../apache/cayenne/dbsync/merge/DbMerger.java | 396 --------------
.../dbsync/merge/DbRelationshipDictionary.java | 83 +++
.../dbsync/merge/DbRelationshipMerger.java | 133 +++++
.../dbsync/merge/DefaultModelMergeDelegate.java | 89 ----
.../merge/DefaultValueForNullProvider.java | 62 ---
.../cayenne/dbsync/merge/DropColumnToDb.java | 61 ---
.../cayenne/dbsync/merge/DropColumnToModel.java | 77 ---
.../dbsync/merge/DropRelationshipToDb.java | 83 ---
.../dbsync/merge/DropRelationshipToModel.java | 49 --
.../cayenne/dbsync/merge/DropTableToDb.java | 51 --
.../cayenne/dbsync/merge/DropTableToModel.java | 51 --
.../cayenne/dbsync/merge/DummyReverseToken.java | 65 ---
.../dbsync/merge/EmptyValueForNullProvider.java | 40 --
.../dbsync/merge/EntityMergeSupport.java | 515 ------------------
.../cayenne/dbsync/merge/MergeDirection.java | 70 ---
.../org/apache/cayenne/dbsync/merge/Merger.java | 30 ++
.../cayenne/dbsync/merge/MergerContext.java | 170 ------
.../cayenne/dbsync/merge/MergerDictionary.java | 54 ++
.../dbsync/merge/MergerDictionaryDiff.java | 117 ++++
.../cayenne/dbsync/merge/MergerDiffPair.java | 39 ++
.../cayenne/dbsync/merge/MergerToken.java | 57 --
.../dbsync/merge/ModelMergeDelegate.java | 62 ---
.../dbsync/merge/ProxyModelMergeDelegate.java | 108 ----
.../cayenne/dbsync/merge/SetAllowNullToDb.java | 58 --
.../dbsync/merge/SetAllowNullToModel.java | 45 --
.../cayenne/dbsync/merge/SetColumnTypeToDb.java | 111 ----
.../dbsync/merge/SetColumnTypeToModel.java | 95 ----
.../cayenne/dbsync/merge/SetNotNullToDb.java | 52 --
.../cayenne/dbsync/merge/SetNotNullToModel.java | 45 --
.../cayenne/dbsync/merge/SetPrimaryKeyToDb.java | 87 ---
.../dbsync/merge/SetPrimaryKeyToModel.java | 80 ---
.../dbsync/merge/SetValueForNullToDb.java | 48 --
.../cayenne/dbsync/merge/TokenComparator.java | 46 --
.../dbsync/merge/ValueForNullProvider.java | 41 --
.../merge/context/EntityMergeSupport.java | 516 ++++++++++++++++++
.../dbsync/merge/context/MergeDirection.java | 71 +++
.../dbsync/merge/context/MergerContext.java | 174 ++++++
.../merge/factory/DB2MergerTokenFactory.java | 4 +-
.../factory/DefaultMergerTokenFactory.java | 46 +-
.../merge/factory/DerbyMergerTokenFactory.java | 8 +-
.../factory/FirebirdMergerTokenFactory.java | 10 +-
.../merge/factory/H2MergerTokenFactory.java | 8 +-
.../merge/factory/HSQLMergerTokenFactory.java | 10 +-
.../merge/factory/IngresMergerTokenFactory.java | 14 +-
.../merge/factory/MergerTokenFactory.java | 4 +-
.../merge/factory/MySQLMergerTokenFactory.java | 12 +-
.../factory/OpenBaseMergerTokenFactory.java | 12 +-
.../merge/factory/OracleMergerTokenFactory.java | 10 +-
.../factory/PostgresMergerTokenFactory.java | 4 +-
.../factory/SQLServerMergerTokenFactory.java | 10 +-
.../merge/factory/SybaseMergerTokenFactory.java | 12 +-
.../token/DefaultValueForNullProvider.java | 63 +++
.../dbsync/merge/token/DummyReverseToken.java | 68 +++
.../merge/token/EmptyValueForNullProvider.java | 41 ++
.../cayenne/dbsync/merge/token/MergerToken.java | 58 ++
.../dbsync/merge/token/TokenComparator.java | 58 ++
.../merge/token/ValueForNullProvider.java | 42 ++
.../merge/token/db/AbstractToDbToken.java | 134 +++++
.../dbsync/merge/token/db/AddColumnToDb.java | 76 +++
.../merge/token/db/AddRelationshipToDb.java | 84 +++
.../dbsync/merge/token/db/CreateTableToDb.java | 89 ++++
.../dbsync/merge/token/db/DropColumnToDb.java | 63 +++
.../merge/token/db/DropRelationshipToDb.java | 85 +++
.../dbsync/merge/token/db/DropTableToDb.java | 53 ++
.../dbsync/merge/token/db/SetAllowNullToDb.java | 60 +++
.../merge/token/db/SetColumnTypeToDb.java | 113 ++++
.../dbsync/merge/token/db/SetNotNullToDb.java | 54 ++
.../merge/token/db/SetPrimaryKeyToDb.java | 89 ++++
.../merge/token/db/SetValueForNullToDb.java | 52 ++
.../merge/token/model/AbstractToModelToken.java | 129 +++++
.../merge/token/model/AddColumnToModel.java | 56 ++
.../token/model/AddRelationshipToModel.java | 92 ++++
.../merge/token/model/CreateTableToModel.java | 101 ++++
.../merge/token/model/DropColumnToModel.java | 80 +++
.../token/model/DropRelationshipToModel.java | 52 ++
.../merge/token/model/DropTableToModel.java | 54 ++
.../merge/token/model/SetAllowNullToModel.java | 48 ++
.../merge/token/model/SetColumnTypeToModel.java | 98 ++++
.../merge/token/model/SetNotNullToModel.java | 48 ++
.../merge/token/model/SetPrimaryKeyToModel.java | 83 +++
.../reverse/db/DbAttributesBaseLoader.java | 107 ----
.../dbsync/reverse/db/DbAttributesLoader.java | 43 --
.../reverse/db/DbAttributesPerSchemaLoader.java | 131 -----
.../cayenne/dbsync/reverse/db/DbLoader.java | 534 -------------------
.../reverse/db/DbLoaderConfiguration.java | 84 ---
.../dbsync/reverse/db/DbLoaderDelegate.java | 63 ---
.../reverse/db/DbRelationshipDetected.java | 53 --
.../dbsync/reverse/db/DbTableLoader.java | 183 -------
.../reverse/db/DefaultDbLoaderDelegate.java | 63 ---
.../cayenne/dbsync/reverse/db/ExportedKey.java | 233 --------
.../reverse/db/LoggingDbLoaderDelegate.java | 61 ---
.../dbsync/reverse/dbload/AbstractLoader.java | 43 ++
.../dbsync/reverse/dbload/AttributeLoader.java | 137 +++++
.../dbsync/reverse/dbload/DbLoadDataStore.java | 90 ++++
.../cayenne/dbsync/reverse/dbload/DbLoader.java | 118 ++++
.../reverse/dbload/DbLoaderConfiguration.java | 85 +++
.../dbsync/reverse/dbload/DbLoaderDelegate.java | 63 +++
.../reverse/dbload/DbRelationshipDetected.java | 54 ++
.../reverse/dbload/DefaultDbLoaderDelegate.java | 64 +++
.../dbload/DefaultModelMergeDelegate.java | 90 ++++
.../dbsync/reverse/dbload/EntityLoader.java | 106 ++++
.../dbsync/reverse/dbload/ExportedKey.java | 220 ++++++++
.../reverse/dbload/ExportedKeyLoader.java | 74 +++
.../reverse/dbload/LoggingDbLoaderDelegate.java | 61 +++
.../reverse/dbload/ModelMergeDelegate.java | 65 +++
.../dbload/PerCatalogAndSchemaLoader.java | 58 ++
.../dbsync/reverse/dbload/PerEntityLoader.java | 64 +++
.../dbsync/reverse/dbload/PrimaryKeyLoader.java | 60 +++
.../reverse/dbload/ProcedureColumnLoader.java | 127 +++++
.../dbsync/reverse/dbload/ProcedureLoader.java | 77 +++
.../reverse/dbload/ProxyModelMergeDelegate.java | 109 ++++
.../reverse/dbload/RelationshipLoader.java | 168 ++++++
.../dbsync/reverse/filters/TableFilter.java | 7 +-
.../dbsync/merge/AddColumnToModelIT.java | 98 ----
.../dbsync/merge/CreateTableToModelIT.java | 97 ----
.../cayenne/dbsync/merge/DataMapMergerTest.java | 400 ++++++++++++++
.../cayenne/dbsync/merge/DbMergerTest.java | 334 ------------
.../dbsync/merge/DropColumnToModelIT.java | 235 --------
.../dbsync/merge/DropRelationshipToModelIT.java | 190 -------
.../dbsync/merge/DropTableToModelIT.java | 94 ----
.../dbsync/merge/EntityMergeSupportIT.java | 1 +
.../apache/cayenne/dbsync/merge/MergeCase.java | 21 +-
.../dbsync/merge/SetAllowNullToDbIT.java | 66 ---
.../cayenne/dbsync/merge/SetNotNullToDbIT.java | 62 ---
.../dbsync/merge/SetPrimaryKeyToDbIT.java | 58 --
.../dbsync/merge/TokenComparatorTest.java | 101 ----
.../cayenne/dbsync/merge/TokensReverseTest.java | 90 ----
.../merge/TokensToModelExecutionTest.java | 80 ---
.../cayenne/dbsync/merge/ValueForNullIT.java | 126 -----
.../dbsync/merge/token/TokenComparatorTest.java | 113 ++++
.../dbsync/merge/token/TokensReverseTest.java | 90 ++++
.../merge/token/TokensToModelExecutionTest.java | 82 +++
.../dbsync/merge/token/ValueForNullIT.java | 129 +++++
.../merge/token/db/SetAllowNullToDbIT.java | 68 +++
.../dbsync/merge/token/db/SetNotNullToDbIT.java | 64 +++
.../merge/token/db/SetPrimaryKeyToDbIT.java | 60 +++
.../merge/token/model/AddColumnToModelIT.java | 101 ++++
.../merge/token/model/CreateTableToModelIT.java | 100 ++++
.../merge/token/model/DropColumnToModelIT.java | 238 +++++++++
.../token/model/DropRelationshipToModelIT.java | 192 +++++++
.../merge/token/model/DropTableToModelIT.java | 97 ++++
.../cayenne/dbsync/reverse/db/DbLoaderIT.java | 408 --------------
.../reverse/dbload/AttributeLoaderIT.java | 154 ++++++
.../dbsync/reverse/dbload/BaseLoaderIT.java | 91 ++++
.../dbsync/reverse/dbload/DbLoaderIT.java | 122 +++++
.../dbsync/reverse/dbload/EntityLoaderIT.java | 98 ++++
.../reverse/dbload/ExportedKeyLoaderIT.java | 85 +++
.../reverse/dbload/PrimaryKeyLoaderIT.java | 60 +++
.../reverse/dbload/RelationshipsLoaderIT.java | 98 ++++
.../dbsync/reverse/filters/TableFilterTest.java | 81 ++-
.../java/org/apache/cayenne/map/DbEntity.java | 4 +-
.../tools/dbimport/DbImportConfiguration.java | 12 +-
.../tools/dbimport/DefaultDbImportAction.java | 42 +-
.../dbimport/DefaultDbImportActionTest.java | 151 +++---
docs/doc/src/main/resources/RELEASE-NOTES.txt | 1 +
.../getting-started/src/docbkx/delete.xml | 10 +-
.../getting-started/src/docbkx/index.xml | 4 +-
.../getting-started/src/docbkx/java-classes.xml | 32 +-
.../src/docbkx/object-context.xml | 39 +-
.../src/docbkx/object-relational-mapping.xml | 69 ++-
.../getting-started/src/docbkx/part1.xml | 4 +-
.../getting-started/src/docbkx/part2.xml | 4 +-
.../getting-started/src/docbkx/part3.xml | 4 +-
.../getting-started/src/docbkx/part4.xml | 4 +-
.../src/docbkx/persistent-objects.xml | 37 +-
.../getting-started/src/docbkx/select-query.xml | 24 +-
.../getting-started/src/docbkx/setup.xml | 28 +-
.../src/docbkx/starting-project.xml | 98 ++--
.../getting-started/src/docbkx/webapp.xml | 119 +++--
.../getting-started/src/images/base-datamap.png | Bin 91074 -> 94872 bytes
.../src/images/base-datanode.png | Bin 81748 -> 96978 bytes
.../src/images/chrome-webapp.png | Bin 0 -> 42124 bytes
.../src/images/eclipse-generatedclasses.png | Bin 141000 -> 0 bytes
.../src/images/eclipse-mvnrun.png | Bin 147012 -> 0 bytes
.../src/images/eclipse-xmlfiles.png | Bin 27801 -> 0 bytes
.../src/images/firefox-webapp.png | Bin 25898 -> 0 bytes
.../src/images/icon-attribute.gif | Bin 0 -> 1171 bytes
.../getting-started/src/images/icon-datamap.gif | Bin 0 -> 755 bytes
.../src/images/icon-dbentity.gif | Bin 0 -> 1171 bytes
.../getting-started/src/images/icon-info.gif | Bin 0 -> 755 bytes
.../getting-started/src/images/icon-info.png | Bin 0 -> 1098 bytes
.../getting-started/src/images/icon-node.gif | Bin 0 -> 331 bytes
.../src/images/icon-objentity.gif | Bin 0 -> 755 bytes
.../src/images/icon-relationship.gif | Bin 0 -> 1171 bytes
.../src/images/icon-relationship.png | Bin 0 -> 835 bytes
.../getting-started/src/images/icon-sync.gif | Bin 0 -> 331 bytes
.../src/images/idea-configuration-menu.png | Bin 0 -> 32911 bytes
.../src/images/idea-generated-classes.png | Bin 0 -> 198808 bytes
.../src/images/idea-run-configuration.png | Bin 0 -> 93059 bytes
.../src/images/idea-xmlfiles.png | Bin 0 -> 27783 bytes
.../src/images/maven-plugin-install.png | Bin 97455 -> 0 bytes
.../src/images/modeler-artistid.png | Bin 59372 -> 65879 bytes
.../src/images/modeler-dbrelationship.png | Bin 42245 -> 41730 bytes
.../src/images/modeler-deleterule.png | Bin 69992 -> 83349 bytes
.../src/images/modeler-started.png | Bin 133410 -> 98815 bytes
.../src/images/tutorial-eclipse-project.png | Bin 70937 -> 0 bytes
.../src/images/tutorial-idea-project.png | Bin 0 -> 48037 bytes
.../modeler/action/CreateObjEntityAction.java | 2 +-
.../modeler/action/DbEntitySyncAction.java | 2 +-
.../cayenne/modeler/action/MigrateAction.java | 1 +
.../modeler/action/ObjEntitySyncAction.java | 2 +-
.../modeler/dialog/db/merge/MergerOptions.java | 33 +-
.../db/merge/MergerTokenSelectorController.java | 6 +-
.../dialog/db/merge/MergerTokenTableModel.java | 4 +-
.../dialog/objentity/EntitySyncController.java | 2 +-
220 files changed, 8975 insertions(+), 7525 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cayenne/blob/391c564b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
----------------------------------------------------------------------
diff --cc modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
index ccf6d3e,0648d2c..af0dcd0
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
@@@ -19,15 -19,21 +19,16 @@@
package org.apache.cayenne.modeler.action;
-import org.apache.cayenne.dba.DbAdapter;
import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
+ import org.apache.cayenne.dbsync.reverse.dbload.DbLoader;
import org.apache.cayenne.map.DataMap;
import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.dialog.db.DataSourceController;
-import org.apache.cayenne.modeler.dialog.db.DbMigrateOptionsDialog;
-import org.apache.cayenne.modeler.dialog.db.MergerOptions;
-import org.apache.cayenne.modeler.pref.DBConnectionInfo;
+import org.apache.cayenne.modeler.dialog.db.DataSourceWizard;
+import org.apache.cayenne.modeler.dialog.db.merge.DbMigrateOptionsDialog;
+import org.apache.cayenne.modeler.dialog.db.merge.MergerOptions;
-import javax.sql.DataSource;
-import javax.swing.*;
import java.awt.event.ActionEvent;
-import java.util.Collections;
-import java.util.List;
+import java.util.Collection;
/**
* Action that alter database schema to match a DataMap.
http://git-wip-us.apache.org/repos/asf/cayenne/blob/391c564b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerOptions.java
----------------------------------------------------------------------
diff --cc modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerOptions.java
index a914cf1,0000000..26564a3
mode 100644,000000..100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerOptions.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerOptions.java
@@@ -1,395 -1,0 +1,394 @@@
+/*****************************************************************
+ * 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.cayenne.modeler.dialog.db.merge;
+
+import org.apache.cayenne.CayenneRuntimeException;
+import org.apache.cayenne.configuration.event.DataMapEvent;
+import org.apache.cayenne.dba.DbAdapter;
- import org.apache.cayenne.dbsync.merge.AbstractToDbToken;
- import org.apache.cayenne.dbsync.merge.DbMerger;
- import org.apache.cayenne.dbsync.merge.DefaultModelMergeDelegate;
- import org.apache.cayenne.dbsync.merge.MergeDirection;
- import org.apache.cayenne.dbsync.merge.MergerContext;
- import org.apache.cayenne.dbsync.merge.MergerToken;
- import org.apache.cayenne.dbsync.merge.ModelMergeDelegate;
- import org.apache.cayenne.dbsync.merge.ProxyModelMergeDelegate;
++import org.apache.cayenne.dbsync.merge.token.db.AbstractToDbToken;
++import org.apache.cayenne.dbsync.merge.DataMapMerger;
++import org.apache.cayenne.dbsync.reverse.dbload.DefaultModelMergeDelegate;
++import org.apache.cayenne.dbsync.merge.context.MergeDirection;
++import org.apache.cayenne.dbsync.merge.context.MergerContext;
++import org.apache.cayenne.dbsync.merge.token.MergerToken;
++import org.apache.cayenne.dbsync.reverse.dbload.ModelMergeDelegate;
++import org.apache.cayenne.dbsync.reverse.dbload.ProxyModelMergeDelegate;
+import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
+import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
+import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
+import org.apache.cayenne.dbsync.naming.NoStemStemmer;
- import org.apache.cayenne.dbsync.reverse.db.DbLoader;
- import org.apache.cayenne.dbsync.reverse.db.DbLoaderConfiguration;
- import org.apache.cayenne.dbsync.reverse.db.LoggingDbLoaderDelegate;
++import org.apache.cayenne.dbsync.reverse.dbload.DbLoader;
++import org.apache.cayenne.dbsync.reverse.dbload.DbLoaderConfiguration;
++import org.apache.cayenne.dbsync.reverse.dbload.LoggingDbLoaderDelegate;
+import org.apache.cayenne.dbsync.reverse.filters.FiltersConfig;
+import org.apache.cayenne.dbsync.reverse.filters.PatternFilter;
+import org.apache.cayenne.dbsync.reverse.filters.TableFilter;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.event.MapEvent;
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.modeler.dialog.ValidationResultBrowser;
+import org.apache.cayenne.modeler.pref.DBConnectionInfo;
+import org.apache.cayenne.modeler.util.CayenneController;
+import org.apache.cayenne.project.Project;
+import org.apache.cayenne.resource.Resource;
+import org.apache.cayenne.swing.BindingBuilder;
+import org.apache.cayenne.swing.ObjectBinding;
+import org.apache.cayenne.tools.dbimport.DefaultDbImportAction;
+import org.apache.cayenne.validation.ValidationResult;
+import org.apache.commons.logging.LogFactory;
+
+import javax.sql.DataSource;
+import javax.swing.JFileChooser;
+import javax.swing.JOptionPane;
+import javax.swing.WindowConstants;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import java.awt.Component;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+public class MergerOptions extends CayenneController {
+
+ protected MergerOptionsView view;
+ protected ObjectBinding sqlBinding;
+
+ protected DBConnectionInfo connectionInfo;
+ protected DataMap dataMap;
+ protected DbAdapter adapter;
+ protected String textForSQL;
+
+ protected MergerTokenSelectorController tokens;
+ protected String defaultCatalog;
+ protected String defaultSchema;
+ private MergerTokenFactoryProvider mergerTokenFactoryProvider;
+
+ public MergerOptions(ProjectController parent,
+ String title,
+ DBConnectionInfo connectionInfo,
+ DataMap dataMap,
+ String defaultCatalog,
+ String defaultSchema,
+ MergerTokenFactoryProvider mergerTokenFactoryProvider) {
+ super(parent);
+
+ this.mergerTokenFactoryProvider = mergerTokenFactoryProvider;
+ this.dataMap = dataMap;
+ this.tokens = new MergerTokenSelectorController(parent);
+ this.view = new MergerOptionsView(tokens.getView());
+ this.connectionInfo = connectionInfo;
+ this.defaultCatalog = defaultCatalog;
+ this.defaultSchema = defaultSchema;
+ this.view.setTitle(title);
+ initController();
+
+ prepareMigrator();
+ createSQL();
+ refreshView();
+ }
+
+ public Component getView() {
+ return view;
+ }
+
+ public String getTextForSQL() {
+ return textForSQL;
+ }
+
+ protected void initController() {
+
+ BindingBuilder builder = new BindingBuilder(
+ getApplication().getBindingFactory(),
+ this);
+
+ sqlBinding = builder.bindToTextArea(view.getSql(), "textForSQL");
+
+ builder.bindToAction(view.getGenerateButton(), "generateSchemaAction()");
+ builder.bindToAction(view.getSaveSqlButton(), "storeSQLAction()");
+ builder.bindToAction(view.getCancelButton(), "closeAction()");
+
+ // refresh SQL if different tables were selected
+ view.getTabs().addChangeListener(new ChangeListener() {
+
+ public void stateChanged(ChangeEvent e) {
+ if (view.getTabs().getSelectedIndex() == 1) {
+ // this assumes that some tables where checked/unchecked... not very
+ // efficient
+ refreshGeneratorAction();
+ }
+ }
+ });
+ }
+
+ /**
+ * check database and create the {@link List} of {@link MergerToken}s
+ */
+ protected void prepareMigrator() {
+ try {
+ adapter = connectionInfo.makeAdapter(getApplication().getClassLoadingService());
+
+ MergerTokenFactory mergerTokenFactory = mergerTokenFactoryProvider.get(adapter);
+ tokens.setMergerTokenFactory(mergerTokenFactory);
+
+
+ FiltersConfig filters = FiltersConfig.create(defaultCatalog, defaultSchema, TableFilter.everything(),
+ PatternFilter.INCLUDE_NOTHING);
+
- DbMerger merger = DbMerger.builder(mergerTokenFactory)
++ DataMapMerger merger = DataMapMerger.builder(mergerTokenFactory)
+ .filters(filters)
+ .build();
+
+ DbLoaderConfiguration config = new DbLoaderConfiguration();
+ config.setFiltersConfig(filters);
+
+ DataSource dataSource = connectionInfo.makeDataSource(getApplication().getClassLoadingService());
+
- DataMap dbImport = new DataMap();
++ DataMap dbImport;
+ try (Connection conn = dataSource.getConnection();) {
- new DbLoader(conn,
- adapter,
++ dbImport = new DbLoader(adapter, conn,
++ config,
+ new LoggingDbLoaderDelegate(LogFactory.getLog(DbLoader.class)),
+ new DefaultObjectNameGenerator(NoStemStemmer.getInstance()))
- .load(dbImport, config);
-
++ .load();
+ } catch (SQLException e) {
+ throw new CayenneRuntimeException("Can't doLoad dataMap from db.", e);
+ }
+
+ tokens.setTokens(merger.createMergeTokens(dataMap, dbImport));
+ } catch (Exception ex) {
+ reportError("Error loading adapter", ex);
+ }
+ }
+
+ /**
+ * Returns SQL statements generated for selected schema generation options.
+ */
+ protected void createSQL() {
+ // convert them to string representation for display
+ StringBuilder buf = new StringBuilder();
+
+ Iterator<MergerToken> it = tokens.getSelectedTokens().iterator();
+ String batchTerminator = adapter.getBatchTerminator();
+
+ String lineEnd = batchTerminator != null ? "\n" + batchTerminator + "\n\n" : "\n\n";
+ while (it.hasNext()) {
+ MergerToken token = it.next();
+
+ if (token instanceof AbstractToDbToken) {
+ AbstractToDbToken tdb = (AbstractToDbToken) token;
+ for (String sql : tdb.createSql(adapter)) {
+ buf.append(sql);
+ buf.append(lineEnd);
+ }
+ }
+ }
+
+ textForSQL = buf.toString();
+ }
+
+ protected void refreshView() {
+ sqlBinding.updateView();
+ }
+
+ // ===============
+ // Actions
+ // ===============
+
+ /**
+ * Starts options dialog.
+ */
+ public void startupAction() {
+ view.pack();
+ view.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
+ view.setModal(true);
+ makeCloseableOnEscape();
+ centerView();
+ view.setVisible(true);
+ }
+
+ public void refreshGeneratorAction() {
+ refreshSQLAction();
+ }
+
+ /**
+ * Updates a text area showing generated SQL.
+ */
+ public void refreshSQLAction() {
+ createSQL();
+ sqlBinding.updateView();
+ }
+
+ /**
+ * Performs configured schema operations via DbGenerator.
+ */
+ public void generateSchemaAction() {
+ refreshGeneratorAction();
+
+ // sanity check...
+ List<MergerToken> tokensToMigrate = tokens.getSelectedTokens();
+ if (tokensToMigrate.isEmpty()) {
+ JOptionPane.showMessageDialog(getView(), "Nothing to migrate.");
+ return;
+ }
+
+ DataSource dataSource;
+ try {
+ dataSource = connectionInfo.makeDataSource(getApplication()
+ .getClassLoadingService());
+ } catch (SQLException ex) {
+ reportError("Migration Error", ex);
+ return;
+ }
+
+ final Collection<ObjEntity> loadedObjEntities = new LinkedList<>();
+
+ MergerContext mergerContext = MergerContext.builder(dataMap)
+ .syntheticDataNode(dataSource, adapter)
+ .delegate(createDelegate(loadedObjEntities))
+ .build();
+
+ boolean modelChanged = applyTokens(tokensToMigrate, mergerContext);
+
+ DefaultDbImportAction.flattenManyToManyRelationships(
+ dataMap,
+ loadedObjEntities,
+ mergerContext.getNameGenerator());
+
+ notifyProjectModified(modelChanged);
+
+ reportFailures(mergerContext);
+ }
+
+ private ModelMergeDelegate createDelegate(final Collection<ObjEntity> loadedObjEntities) {
+ return new ProxyModelMergeDelegate(new DefaultModelMergeDelegate()) {
+ @Override
+ public void objEntityAdded(ObjEntity ent) {
+ loadedObjEntities.add(ent);
+ super.objEntityAdded(ent);
+ }
+ };
+ }
+
+ private boolean applyTokens(List<MergerToken> tokensToMigrate, MergerContext mergerContext) {
+ boolean modelChanged = false;
+
+ try {
+ for (MergerToken tok : tokensToMigrate) {
+ int numOfFailuresBefore = getFailuresCount(mergerContext);
+
+ tok.execute(mergerContext);
+
+ if (!modelChanged && tok.getDirection().equals(MergeDirection.TO_MODEL)) {
+ modelChanged = true;
+ }
+ if (numOfFailuresBefore == getFailuresCount(mergerContext)) {
+ // looks like the token executed without failures
+ tokens.removeToken(tok);
+ }
+ }
+ } catch (Throwable th) {
+ reportError("Migration Error", th);
+ }
+
+ return modelChanged;
+ }
+
+ private int getFailuresCount(MergerContext mergerContext) {
+ return mergerContext.getValidationResult().getFailures().size();
+ }
+
+ private void reportFailures(MergerContext mergerContext) {
+ ValidationResult failures = mergerContext.getValidationResult();
+ if (failures == null || !failures.hasFailures()) {
+ JOptionPane.showMessageDialog(getView(), "Migration Complete.");
+ } else {
+ new ValidationResultBrowser(this).startupAction(
+ "Migration Complete",
+ "Migration finished. The following problem(s) were ignored.",
+ failures);
+ }
+ }
+
+ private void notifyProjectModified(boolean modelChanged) {
+ if(!modelChanged) {
+ return;
+ }
+
+ // mark the model as unsaved
+ Project project = getApplication().getProject();
+ project.setModified(true);
+
+ ProjectController projectController = getProjectController();
+ projectController.setDirty(true);
+
+ projectController.fireDataMapEvent(new DataMapEvent(Application.getFrame(),
+ dataMap, MapEvent.REMOVE));
+ projectController.fireDataMapEvent(new DataMapEvent(Application.getFrame(),
+ dataMap, MapEvent.ADD));
+ }
+
+ /**
+ * Allows user to save generated SQL in a file.
+ */
+ public void storeSQLAction() {
+ JFileChooser fc = new JFileChooser();
+ fc.setDialogType(JFileChooser.SAVE_DIALOG);
+ fc.setDialogTitle("Save SQL Script");
+
+ Resource projectDir = getApplication().getProject().getConfigurationResource();
+
+ if (projectDir != null) {
+ fc.setCurrentDirectory(new File(projectDir.getURL().getPath()));
+ }
+
+ if (fc.showSaveDialog(getView()) == JFileChooser.APPROVE_OPTION) {
+ refreshGeneratorAction();
+
+ try {
+ File file = fc.getSelectedFile();
+ FileWriter fw = new FileWriter(file);
+ PrintWriter pw = new PrintWriter(fw);
+ pw.print(textForSQL);
+ pw.flush();
+ pw.close();
+ } catch (IOException ex) {
+ reportError("Error Saving SQL", ex);
+ }
+ }
+ }
+
+ private ProjectController getProjectController() {
+ return getApplication().getFrameController().getProjectController();
+ }
+
+ public void closeAction() {
+ view.dispose();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/391c564b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenSelectorController.java
----------------------------------------------------------------------
diff --cc modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenSelectorController.java
index 52d6ce3,0000000..7f6d4da
mode 100644,000000..100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenSelectorController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenSelectorController.java
@@@ -1,240 -1,0 +1,240 @@@
+/*****************************************************************
+ * 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.cayenne.modeler.dialog.db.merge;
+
- import org.apache.cayenne.dbsync.merge.MergeDirection;
- import org.apache.cayenne.dbsync.merge.MergerToken;
- import org.apache.cayenne.dbsync.merge.TokenComparator;
++import org.apache.cayenne.dbsync.merge.context.MergeDirection;
++import org.apache.cayenne.dbsync.merge.token.MergerToken;
++import org.apache.cayenne.dbsync.merge.token.TokenComparator;
+import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.util.CayenneController;
+import org.apache.cayenne.swing.BindingBuilder;
+import org.apache.cayenne.swing.ObjectBinding;
+
+import javax.swing.*;
+import javax.swing.table.AbstractTableModel;
+import javax.swing.table.TableColumn;
+import javax.swing.table.TableColumnModel;
+import javax.swing.table.TableModel;
+import java.awt.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class MergerTokenSelectorController extends CayenneController {
+
+ protected MergerTokenSelectorView view;
+ protected ObjectBinding tableBinding;
+
+ protected MergerToken token;
+ protected int permanentlyExcludedCount;
+ protected Set<MergerToken> excludedTokens;
+ protected List<MergerToken> selectableTokensList;
+ protected MergerTokenFactory mergerTokenFactory;
+
+ public MergerTokenSelectorController(CayenneController parent) {
+ super(parent);
+ this.view = new MergerTokenSelectorView();
+ this.excludedTokens = new HashSet<MergerToken>();
+ this.selectableTokensList = new ArrayList<MergerToken>();
+ initController();
+ }
+
+ public void setMergerTokenFactory(MergerTokenFactory mergerTokenFactory) {
+ this.mergerTokenFactory = mergerTokenFactory;
+ }
+
+ public void setTokens(List<MergerToken> tokens) {
+ selectableTokensList.clear();
+ selectableTokensList.addAll(tokens);
+ excludedTokens.addAll(tokens);
+ }
+
+ public List<MergerToken> getSelectedTokens() {
+ List<MergerToken> t = new ArrayList<MergerToken>(selectableTokensList);
+ t.removeAll(excludedTokens);
+ return Collections.unmodifiableList(t);
+ }
+
+ public List<MergerToken> getSelectableTokens() {
+ return Collections.unmodifiableList(selectableTokensList);
+ }
+
+ public void removeToken(MergerToken token) {
+ selectableTokensList.remove(token);
+ excludedTokens.remove(token);
+
+ AbstractTableModel model = (AbstractTableModel) view.getTokens().getModel();
+ model.fireTableDataChanged();
+ }
+
+ // ----- properties -----
+
+ public Component getView() {
+ return view;
+ }
+
+ /**
+ * Called by table binding script to set current token.
+ */
+ public void setToken(MergerToken token) {
+ this.token = token;
+ }
+
+ /**
+ * Returns {@link MergerToken}s that are excluded from DB generation.
+ */
+ /*
+ * public Collection getExcludedTokens() { return excludedTokens; }
+ */
+
+ public boolean isIncluded() {
+ if (token == null) {
+ return false;
+ }
+
+ return !excludedTokens.contains(token);
+ }
+
+ public void setIncluded(boolean b) {
+ if (token == null) {
+ return;
+ }
+
+ if (b) {
+ excludedTokens.remove(token);
+ }
+ else {
+ excludedTokens.add(token);
+ }
+
+ tableSelectedAction();
+ }
+
+ /**
+ * A callback action that updates the state of Select All checkbox.
+ */
+ public void tableSelectedAction() {
+ int unselectedCount = excludedTokens.size() - permanentlyExcludedCount;
+
+ if (unselectedCount == selectableTokensList.size()) {
+ view.getCheckAll().setSelected(false);
+ }
+ else if (unselectedCount == 0) {
+ view.getCheckAll().setSelected(true);
+ }
+ }
+
+ // ------ other stuff ------
+
+ protected void initController() {
+ BindingBuilder builder = new BindingBuilder(
+ getApplication().getBindingFactory(),
+ this);
+
+ builder.bindToAction(view.getCheckAll(), "checkAllAction()");
+ builder.bindToAction(view.getReverseAll(), "reverseAllAction()");
+
+ TableModel model = new MergerTokenTableModel(this);
+
+ MergeDirection[] dirs = new MergeDirection[] {
+ MergeDirection.TO_DB, MergeDirection.TO_MODEL
+ };
+
+ view.getTokens().setModel(model);
+
+ TableColumnModel columnModel = view.getTokens().getColumnModel();
+
+ // dropdown for direction column
+ JComboBox directionCombo = Application.getWidgetFactory().createComboBox(dirs, false);
+ directionCombo.setEditable(false);
+ TableColumn directionColumn = columnModel.getColumn(
+ MergerTokenTableModel.COL_DIRECTION);
+ directionColumn.setCellEditor(new DefaultCellEditor(directionCombo));
+
+ columnModel.getColumn(MergerTokenTableModel.COL_SELECT).setPreferredWidth(50);
+ columnModel.getColumn(MergerTokenTableModel.COL_DIRECTION).setPreferredWidth(100);
+ columnModel.getColumn(MergerTokenTableModel.COL_SELECT).setMaxWidth(50);
+ columnModel.getColumn(MergerTokenTableModel.COL_DIRECTION).setMaxWidth(100);
+ }
+
+ public boolean isSelected(MergerToken token) {
+ return (selectableTokensList.contains(token) && !excludedTokens.contains(token));
+ }
+
+ public void select(MergerToken token, boolean select) {
+ if (select) {
+ excludedTokens.remove(token);
+ }
+ else {
+ excludedTokens.add(token);
+ }
+ }
+
+ public void setDirection(MergerToken token, MergeDirection direction) {
+ if (token.getDirection().equals(direction)) {
+ return;
+ }
+ int i = selectableTokensList.indexOf(token);
+ MergerToken reverse = token.createReverse(mergerTokenFactory);
+ selectableTokensList.set(i, reverse);
+ if (excludedTokens.remove(token)) {
+ excludedTokens.add(reverse);
+ }
+
+ /**
+ * Repaint, so that "Operation" column updates properly
+ */
+ view.getTokens().repaint();
+ }
+
+ public void checkAllAction() {
+
+ boolean isCheckAllSelected = view.getCheckAll().isSelected();
+
+ if (isCheckAllSelected) {
+ excludedTokens.clear();
+ }
+ else {
+ excludedTokens.addAll(selectableTokensList);
+ }
+
+ AbstractTableModel model = (AbstractTableModel) view.getTokens().getModel();
+ model.fireTableDataChanged();
+ }
+
+ public void reverseAllAction() {
+
+ for (int i = 0; i < selectableTokensList.size(); i++) {
+ MergerToken token = selectableTokensList.get(i);
+ MergerToken reverse = token.createReverse(mergerTokenFactory);
+ selectableTokensList.set(i, reverse);
+ if (excludedTokens.remove(token)) {
+ excludedTokens.add(reverse);
+ }
+ }
+
+ Collections.sort(selectableTokensList, new TokenComparator());
+ AbstractTableModel model = (AbstractTableModel) view.getTokens().getModel();
+ model.fireTableDataChanged();
+ }
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/391c564b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenTableModel.java
----------------------------------------------------------------------
diff --cc modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenTableModel.java
index 4fc78f0,0000000..7a04f16
mode 100644,000000..100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenTableModel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenTableModel.java
@@@ -1,129 -1,0 +1,129 @@@
+/*****************************************************************
+ * 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.cayenne.modeler.dialog.db.merge;
+
- import org.apache.cayenne.dbsync.merge.MergeDirection;
- import org.apache.cayenne.dbsync.merge.MergerToken;
++import org.apache.cayenne.dbsync.merge.context.MergeDirection;
++import org.apache.cayenne.dbsync.merge.token.MergerToken;
+
+import javax.swing.table.AbstractTableModel;
+import java.util.List;
+
+
+public class MergerTokenTableModel extends AbstractTableModel {
+
+ public static final int COL_SELECT = 0;
+ public static final int COL_DIRECTION = 1;
+ public static final int COL_NAME = 2;
+ public static final int COL_VALUE = 3;
+
+ private MergerTokenSelectorController controller;
+
+ private List<MergerToken> tokens;
+
+ public MergerTokenTableModel(MergerTokenSelectorController controller) {
+ this.controller = controller;
+ this.tokens = controller.getSelectableTokens();
+ }
+
+ private MergerTokenSelectorController getController() {
+ return controller;
+ }
+
+ public Class getColumnClass(int columnIndex) {
+ switch (columnIndex) {
+ case COL_SELECT:
+ return Boolean.class;
+ case COL_DIRECTION:
+ // TODO: correct?
+ return String.class;
+ case COL_NAME:
+ case COL_VALUE:
+ return String.class;
+ }
+
+ return null;
+ }
+
+ public int getColumnCount() {
+ return 4;
+ }
+
+ public String getColumnName(int columnIndex) {
+ switch (columnIndex) {
+ case COL_SELECT:
+ return "";
+ case COL_NAME:
+ return "Operation";
+ case COL_DIRECTION:
+ return "Direction";
+ case COL_VALUE:
+ return "";
+ }
+
+ return null;
+ }
+
+ public int getRowCount() {
+ return tokens.size();
+ }
+
+ public MergerToken getToken(int rowIndex) {
+ return tokens.get(rowIndex);
+ }
+
+ public Object getValueAt(int rowIndex, int columnIndex) {
+ MergerToken token = getToken(rowIndex);
+ switch (columnIndex) {
+ case COL_SELECT:
+ return Boolean.valueOf(getController().isSelected(token));
+ case COL_NAME:
+ return token.getTokenName();
+ case COL_DIRECTION:
+ return token.getDirection();
+ case COL_VALUE:
+ return token.getTokenValue();
+ }
+ return null;
+ }
+
+ public boolean isCellEditable(int rowIndex, int columnIndex) {
+ switch (columnIndex) {
+ case COL_SELECT:
+ case COL_DIRECTION:
+ return true;
+ }
+ return false;
+ }
+
+ public void setValueAt(Object value, int rowIndex, int columnIndex) {
+ MergerToken token = getToken(rowIndex);
+ switch (columnIndex) {
+ case COL_SELECT:
+ Boolean val = (Boolean) value;
+ getController().select(token, val.booleanValue());
+ break;
+ case COL_DIRECTION:
+ MergeDirection direction = (MergeDirection) value;
+ getController().setDirection(token, direction);
+ break;
+ }
+ }
+
+}
[09/10] cayenne git commit: Merge with master
Posted by sk...@apache.org.
Merge with master
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/a1f10f42
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/a1f10f42
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/a1f10f42
Branch: refs/heads/master
Commit: a1f10f42e9da3fe7df3c91c14536a25526f3c691
Parents: 06c9183 d8b17c1
Author: Nikita Timofeev <st...@gmail.com>
Authored: Thu Dec 15 12:11:25 2016 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Thu Dec 15 12:11:25 2016 +0300
----------------------------------------------------------------------
docs/doc/src/main/resources/RELEASE-NOTES.txt | 1 +
1 file changed, 1 insertion(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cayenne/blob/a1f10f42/docs/doc/src/main/resources/RELEASE-NOTES.txt
----------------------------------------------------------------------
diff --cc docs/doc/src/main/resources/RELEASE-NOTES.txt
index 0c1637d,740698c..ca2395c
--- a/docs/doc/src/main/resources/RELEASE-NOTES.txt
+++ b/docs/doc/src/main/resources/RELEASE-NOTES.txt
@@@ -18,7 -18,7 +18,8 @@@ CAY-2164 Relocate builder bootstrap met
CAY-2165 Explicit "contribution" API for easier expansion of DI collections and maps
CAY-2166 Auto-loading of Cayenne modules
CAY-2168 Split DbLoader to parts and clean it up
+ CAY-2169 Split DbMerger to parts and clean it up
+CAY-2172 Cleanup Modeler import and migrate db actions
Bug Fixes: