http://git-wip-us.apache.org/repos/asf/cayenne/blob/fe82b47e/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 new file mode 100644 index 0000000..287e703 --- /dev/null +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java @@ -0,0 +1,77 @@ +/***************************************************************** + * 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.action; + +import java.awt.event.ActionEvent; +import java.sql.Connection; + +import javax.swing.SwingUtilities; + +import org.apache.cayenne.configuration.DataChannelDescriptor; +import org.apache.cayenne.configuration.event.DataMapEvent; +import org.apache.cayenne.dba.DbAdapter; +import org.apache.cayenne.map.DataMap; +import org.apache.cayenne.map.event.MapEvent; +import org.apache.cayenne.map.naming.DefaultUniqueNameGenerator; +import org.apache.cayenne.map.naming.NameCheckers; +import org.apache.cayenne.modeler.Application; +import org.apache.cayenne.modeler.CayenneModelerController; +import org.apache.cayenne.modeler.ProjectController; +import org.apache.cayenne.modeler.dialog.db.ReverseEngineeringController; +import org.apache.cayenne.modeler.dialog.db.DbLoaderHelper; +import org.apache.cayenne.modeler.dialog.db.ReverseEngineeringScrollPane; +import org.apache.cayenne.modeler.pref.DBConnectionInfo; +import org.apache.cayenne.modeler.util.CayenneAction; + +/** + * Action that imports database structure into a DataMap. + */ +public class ReverseEngineeringAction extends CayenneAction { + + public static String getActionName() { + return "Reengineer Database Schema"; + } + + public ReverseEngineeringAction(Application application) { + super(getActionName(), application); + } + + /** + * Connects to DB and delegates processing to DbLoaderController, starting it + * asynchronously. + */ + @Override + public void performAction(ActionEvent event) { + ProjectController projectController = getProjectController(); + DataMap dataMap = projectController.getCurrentDataMap(); + DataChannelDescriptor dataChannelDescriptor = projectController.getCurrentDataChanel(); + if (dataMap == null) { + dataMap = new DataMap(DefaultUniqueNameGenerator.generate(NameCheckers.dataMap)); + dataMap.setName(DefaultUniqueNameGenerator.generate(NameCheckers.dataMap, projectController.getProject().getRootNode())); + dataChannelDescriptor.getDataMaps().add(dataMap); + getProjectController().fireDataMapEvent(new DataMapEvent(this, dataMap, MapEvent.ADD)); + } + + ((CayenneModelerController) projectController.getParent()) + .getEditorView() + .getDataMapView() + .setSelectedIndex(1); + } +}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/fe82b47e/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 dfe24b3..0000000 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ConnectionWizard.java +++ /dev/null @@ -1,89 +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.sql.Connection; - -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; - -/** - * 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; - } - - // set success flag, and unblock the caller... - canceled = false; - view.dispose(); - } - - /** - * 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/fe82b47e/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 index 4e277d1..1747c87 100644 --- 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 @@ -249,7 +249,7 @@ public class DBGeneratorOptions extends CayenneController { */ public void generateSchemaAction() { - DataSourceWizard connectWizard = new DataSourceWizard( + DataSourceController connectWizard = new DataSourceController( this.getParent(), "Generate DB Schema: Connect to Database", null, http://git-wip-us.apache.org/repos/asf/cayenne/blob/fe82b47e/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataMapViewModel.java ---------------------------------------------------------------------- diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataMapViewModel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataMapViewModel.java new file mode 100644 index 0000000..1748207 --- /dev/null +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataMapViewModel.java @@ -0,0 +1,51 @@ +/* + * 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.modeler.dialog.db.model.DBModel; + +/** + * @since 4.0 + */ +public class DataMapViewModel { + private final String dataMapName; + + private String reverseEngineeringText; + private DBModel reverseEngineeringTree; + + public DataMapViewModel(String dataMapName) { + this.dataMapName = dataMapName; + } + + public String getReverseEngineeringText() { + return reverseEngineeringText; + } + + public void setReverseEngineeringText(String reverseEngineeringText) { + this.reverseEngineeringText = reverseEngineeringText; + } + + public DBModel getReverseEngineeringTree() { + return reverseEngineeringTree; + } + + public void setReverseEngineeringTree(DBModel reverseEngineeringTree) { + this.reverseEngineeringTree = reverseEngineeringTree; + } +} http://git-wip-us.apache.org/repos/asf/cayenne/blob/fe82b47e/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 new file mode 100644 index 0000000..2ba7819 --- /dev/null +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceController.java @@ -0,0 +1,219 @@ +/***************************************************************** + * 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/fe82b47e/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 new file mode 100644 index 0000000..3258a54 --- /dev/null +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceView.java @@ -0,0 +1,100 @@ +/***************************************************************** + * 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/fe82b47e/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 deleted file mode 100644 index 3ca4a9f..0000000 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceWizard.java +++ /dev/null @@ -1,224 +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 javax.swing.DefaultComboBoxModel; -import javax.swing.WindowConstants; - -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; - -/** - * A subclass of ConnectionWizard that tests configured DataSource, but does not - * keep an open connection. - * - */ -public class DataSourceWizard extends CayenneController { - - protected DataSourceWizardView 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 DataSourceWizard(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 DataSourceWizardView createView() { - return new DataSourceWizardView(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(); - } - } -} http://git-wip-us.apache.org/repos/asf/cayenne/blob/fe82b47e/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceWizardView.java ---------------------------------------------------------------------- diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceWizardView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceWizardView.java deleted file mode 100644 index 10cf0d7..0000000 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceWizardView.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 DataSourceWizardView extends JDialog { - - protected JComboBox dataSources; - protected JButton configButton; - protected JButton okButton; - protected JButton cancelButton; - protected DBConnectionInfoEditor connectionInfo; - - public DataSourceWizardView(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; - } -} http://git-wip-us.apache.org/repos/asf/cayenne/blob/fe82b47e/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbImportActionModeler.java ---------------------------------------------------------------------- diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbImportActionModeler.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbImportActionModeler.java new file mode 100644 index 0000000..b131dd8 --- /dev/null +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbImportActionModeler.java @@ -0,0 +1,120 @@ +package org.apache.cayenne.modeler.dialog.db; /***************************************************************** + * 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. + ****************************************************************/ + + +import org.apache.cayenne.configuration.DataChannelDescriptor; +import org.apache.cayenne.configuration.event.DataMapEvent; +import org.apache.cayenne.configuration.server.DataSourceFactory; +import org.apache.cayenne.configuration.server.DbAdapterFactory; +import org.apache.cayenne.dba.DbAdapter; +import org.apache.cayenne.di.Inject; +import org.apache.cayenne.map.DataMap; +import org.apache.cayenne.map.MapLoader; +import org.apache.cayenne.map.event.MapEvent; +import org.apache.cayenne.modeler.Application; +import org.apache.cayenne.modeler.ProjectController; +import org.apache.cayenne.modeler.event.DataMapDisplayEvent; +import org.apache.cayenne.project.ProjectSaver; +import org.apache.cayenne.resource.Resource; +import org.apache.cayenne.tools.dbimport.DbImportAction; +import org.apache.cayenne.tools.dbimport.DbImportActionDefault; +import org.apache.cayenne.tools.dbimport.DbImportConfiguration; +import org.apache.commons.logging.Log; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.sql.Connection; + +public class DbImportActionModeler implements DbImportAction { + + private final Log logger; + + private final DbLoaderHelper dbLoaderHelper; + + @Inject + private ProjectSaver projectSaver; + + @Inject + private DataSourceFactory dataSourceFactory; + + @Inject + private DbAdapterFactory adapterFactory; + + @Inject + private MapLoader mapLoader; + + public DbImportActionModeler(Log logger, DbLoaderHelper dbLoaderHelper) { + this.logger = logger; + this.dbLoaderHelper = dbLoaderHelper; + } + + @Override + public void execute(DbImportConfiguration config) throws Exception { + if (dbLoaderHelper == null) { + throw new IllegalStateException("Before using execute method you must set dbLoaderHelper"); + } + + new DbImportActionDefault(logger, projectSaver, dataSourceFactory, adapterFactory, mapLoader) { + + @Override + protected DataMap loadExistingDataMap(File dataMapFile) { + return dbLoaderHelper.getDataMap(); + } + + @Override + protected void saveLoaded(DataMap dataMap) { + dbLoaderHelper.cleanup(); + + ProjectController mediator = dbLoaderHelper.getMediator(); + + if (mediator.getCurrentDataMap() != null) { + mediator.fireDataMapEvent(new DataMapEvent(Application.getFrame(), dataMap, MapEvent.REMOVE)); + mediator.fireDataMapEvent(new DataMapEvent(Application.getFrame(), dataMap, MapEvent.ADD)); + } else { + DataChannelDescriptor currentDomain = (DataChannelDescriptor) mediator.getProject().getRootNode(); + Resource baseResource = currentDomain.getConfigurationSource(); + + // this will be new data map so need to set configuration source + // for it + if (baseResource != null) { + Resource dataMapResource = baseResource.getRelativeResource(dataMap.getName()); + dataMap.setConfigurationSource(dataMapResource); + } + mediator.addDataMap(Application.getFrame(), dataMap); + } + } + + @Override + protected DataMap load(DbImportConfiguration config, DbAdapter adapter, Connection connection) throws Exception { + DataMap dataMap; + + try { + dataMap = dbLoaderHelper.getLoader().load(config.getDbLoaderConfig()); + } finally { + if (connection != null) { + connection.close(); + } + } + + return dataMap; + } + }.execute(config); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/cayenne/blob/fe82b47e/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 index d81e498..721bf76 100644 --- 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 @@ -21,13 +21,13 @@ package org.apache.cayenne.modeler.dialog.db; import org.apache.cayenne.CayenneRuntimeException; import org.apache.cayenne.access.DbLoader; -import org.apache.cayenne.access.loader.DbLoaderConfiguration; import org.apache.cayenne.access.loader.DefaultDbLoaderDelegate; -import org.apache.cayenne.access.loader.filters.OldFilterConfigBridge; import org.apache.cayenne.configuration.DataChannelDescriptor; -import org.apache.cayenne.configuration.DefaultConfigurationNameMapper; -import org.apache.cayenne.configuration.event.DataMapEvent; import org.apache.cayenne.dba.DbAdapter; +import org.apache.cayenne.dbimport.FiltersConfigBuilder; +import org.apache.cayenne.dbimport.ReverseEngineering; +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; @@ -38,12 +38,11 @@ import org.apache.cayenne.map.naming.DefaultUniqueNameGenerator; import org.apache.cayenne.map.naming.NameCheckers; import org.apache.cayenne.modeler.Application; import org.apache.cayenne.modeler.ProjectController; -import org.apache.cayenne.modeler.event.DataMapDisplayEvent; +import org.apache.cayenne.modeler.pref.DBConnectionInfo; import org.apache.cayenne.modeler.util.LongRunningTask; -import org.apache.cayenne.resource.Resource; -import org.apache.cayenne.tools.dbimport.config.FiltersConfigBuilder; -import org.apache.cayenne.tools.dbimport.config.ReverseEngineering; -import org.apache.cayenne.util.DeleteRuleUpdater; +import org.apache.cayenne.tools.configuration.ToolsModule; +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; @@ -51,16 +50,15 @@ import org.apache.commons.logging.LogFactory; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; +import java.io.File; import java.sql.Connection; import java.sql.SQLException; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; /** * Stateful helper class that encapsulates access to DbLoader. - * */ public class DbLoaderHelper { @@ -75,17 +73,14 @@ public class DbLoaderHelper { protected boolean existingMap; protected ProjectController mediator; - protected String dbUserName; protected String dbCatalog; protected DbLoader loader; protected DataMap dataMap; - protected boolean meaningfulPk; protected List<String> schemas; protected List<String> catalogs; protected DbAdapter adapter; - - private final OldFilterConfigBridge filterBuilder = new OldFilterConfigBridge(); - + protected DbImportConfiguration config; + protected ReverseEngineering reverseEngineering; protected String loadStatusNote; /** @@ -93,8 +88,8 @@ public class DbLoaderHelper { */ protected List<ObjEntity> addedObjEntities; - public DbLoaderHelper(ProjectController mediator, Connection connection, DbAdapter adapter, String dbUserName) { - this.dbUserName = dbUserName; + public DbLoaderHelper(ProjectController mediator, Connection connection, DbAdapter adapter, + DBConnectionInfo dbConnectionInfo, ReverseEngineering reverseEngineering) { this.mediator = mediator; try { this.dbCatalog = connection.getCatalog(); @@ -102,7 +97,24 @@ public class DbLoaderHelper { logObj.warn("Error getting catalog.", e); } this.adapter = adapter; - this.loader = new DbLoader(connection, adapter, new LoaderDelegate()); + this.reverseEngineering = reverseEngineering; + + 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()); + try { + this.dbCatalog = connection.getCatalog(); + } catch (SQLException e) { + logObj.warn("Error getting catalog.", e); + } + try { + this.loader = config.createLoader(adapter, connection, new LoaderDelegate()); + } catch (Throwable th) { + processException(th, "Error creating DbLoader."); + } } public void setStoppingReverseEngineering(boolean stopReverseEngineering) { @@ -113,6 +125,10 @@ public class DbLoaderHelper { return stoppingReverseEngineering; } + 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 @@ -139,41 +155,11 @@ public class DbLoaderHelper { return; } - final DbLoaderOptionsDialog dialog = new DbLoaderOptionsDialog(schemas, catalogs, dbUserName, dbCatalog, false); - - 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; - } - - this.filterBuilder.catalog(dialog.getSelectedCatalog()); - this.filterBuilder.schema(dialog.getSelectedSchema()); - this.filterBuilder.includeTables(dialog.getTableNamePattern()); - this.filterBuilder.setProceduresFilters(dialog.isLoadingProcedures()); - this.filterBuilder.includeProcedures(dialog.getProcedureNamePattern()); + this.loader.setCreatingMeaningfulPK(true); - this.meaningfulPk = dialog.isMeaningfulPk(); - this.addedObjEntities = new ArrayList<ObjEntity>(); - - this.loader.setNameGenerator(dialog.getNamingStrategy()); - - // load DataMap... LongRunningTask loadDataMapTask = new LoadDataMapTask(Application.getFrame(), "Reengineering DB"); loadDataMapTask.startAndWait(); + } protected void processException(final Throwable th, final String message) { @@ -222,7 +208,6 @@ public class DbLoaderHelper { checkCanceled(); loadStatusNote = "Creating ObjEntity '" + entity.getName() + "'..."; - addedObjEntities.add(entity); if (existingMap) { mediator.fireObjEntityEvent(new EntityEvent(this, entity, MapEvent.ADD)); @@ -346,7 +331,8 @@ public class DbLoaderHelper { } } - final class LoadDataMapTask extends DbLoaderTask { + + public final class LoadDataMapTask extends DbLoaderTask { public LoadDataMapTask(JFrame frame, String title) { super(frame, title); @@ -363,80 +349,49 @@ public class DbLoaderHelper { if (!existingMap) { dataMap = new DataMap(DefaultUniqueNameGenerator.generate(NameCheckers.dataMap)); dataMap.setName(DefaultUniqueNameGenerator.generate(NameCheckers.dataMap, mediator.getProject().getRootNode())); - dataMap.setDefaultCatalog(filterBuilder.catalog()); - dataMap.setDefaultSchema(filterBuilder.schema()); } if (isCanceled()) { return; } - importingTables(); - importingProcedures(); - - cleanup(); - - // fire up events - loadStatusNote = "Updating view..."; - if (mediator.getCurrentDataMap() != null) { - mediator.fireDataMapEvent(new DataMapEvent(Application.getFrame(), dataMap, MapEvent.CHANGE)); - mediator.fireDataMapDisplayEvent(new DataMapDisplayEvent(Application.getFrame(), dataMap, - (DataChannelDescriptor) mediator.getProject().getRootNode(), mediator.getCurrentDataNode())); - } else { - DataChannelDescriptor currentDomain = (DataChannelDescriptor) mediator.getProject().getRootNode(); - Resource baseResource = currentDomain.getConfigurationSource(); - - // this will be new data map so need to set configuration source - // for it - if (baseResource != null) { - DefaultConfigurationNameMapper nameMapper = new DefaultConfigurationNameMapper(); - Resource dataMapResource = baseResource.getRelativeResource(nameMapper.configurationLocation(dataMap)); - dataMap.setConfigurationSource(dataMapResource); + DataMap dataMap = mediator.getCurrentDataMap(); + DataChannelDescriptor dataChannelDescriptor = mediator.getCurrentDataChanel(); + if (dataMap.getReverseEngineering() != null) { + if (dataMap.getReverseEngineering().getName() != null) { + reverseEngineering.setName(dataMap.getReverseEngineering().getName()); + reverseEngineering.setConfigurationSource(dataMap.getReverseEngineering().getConfigurationSource()); } - mediator.addDataMap(Application.getFrame(), dataMap); + } else { + reverseEngineering.setName(DefaultUniqueNameGenerator.generate(NameCheckers.reverseEngineering, dataChannelDescriptor)); } - } - private void importingProcedures() { - if (!filterBuilder.isLoadProcedures()) { - return; + if (dataMap.getConfigurationSource() != null) { + config.setDataMapFile(new File(dataMap.getConfigurationSource().getURL().getPath())); } - loadStatusNote = "Importing procedures..."; - try { - DbLoaderConfiguration configuration = new DbLoaderConfiguration(); - configuration.setFiltersConfig(new FiltersConfigBuilder(new ReverseEngineering()) - .add(filterBuilder).filtersConfig()); + FiltersConfigBuilder filtersConfigBuilder = new FiltersConfigBuilder(reverseEngineering); + config.getDbLoaderConfig().setFiltersConfig(filtersConfigBuilder.filtersConfig()); - loader.loadProcedures(dataMap, new DbLoaderConfiguration()); - } catch (Throwable th) { - if (!isCanceled()) { - processException(th, "Error Reengineering Database"); - } - } - } - private void importingTables() { - loadStatusNote = "Importing tables..."; + DbImportActionModeler importAction = new DbImportActionModeler(logObj, DbLoaderHelper.this); + Injector injector = DIBootstrap.createInjector(new ToolsModule(logObj), new DbImportModule()); + injector.injectMembers(importAction); try { - loader.setCreatingMeaningfulPK(meaningfulPk); - - DbLoaderConfiguration configuration = new DbLoaderConfiguration(); - configuration.setFiltersConfig(new FiltersConfigBuilder(new ReverseEngineering()) - .add(filterBuilder).filtersConfig()); - loader.load(dataMap, configuration); - - /** - * Update default rules for relationships - */ - for (ObjEntity addedObjEntity : addedObjEntities) { - DeleteRuleUpdater.updateObjEntity(addedObjEntity); - } - } catch (Throwable th) { - if (!isCanceled()) { - processException(th, "Error Reengineering Database"); - } + importAction.execute(config); + dataMap.setReverseEngineering(reverseEngineering); + } catch (Exception e) { + processException(e, "Error importing database schema."); } } } + + protected ProjectController getMediator() { + return mediator; + } + + protected DbLoader getLoader() { + return loader; + } + } http://git-wip-us.apache.org/repos/asf/cayenne/blob/fe82b47e/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 713e459..0000000 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderOptionsDialog.java +++ /dev/null @@ -1,308 +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.access.DbLoader; -import org.apache.cayenne.map.naming.ObjectNameGenerator; -import org.apache.cayenne.modeler.Application; -import org.apache.cayenne.modeler.ClassLoadingService; -import org.apache.cayenne.modeler.util.CayenneDialog; -import org.apache.cayenne.modeler.util.NameGeneratorPreferences; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import javax.swing.DefaultComboBoxModel; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JDialog; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JTextField; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import java.awt.BorderLayout; -import java.awt.FlowLayout; -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 { - - private static final Log logObj = LogFactory.getLog(DbLoaderOptionsDialog.class); - - public static final int CANCEL = 0; - public static final int SELECT = 1; - - protected JLabel catalogLabel; - protected JComboBox catalogSelector; - protected JLabel schemaLabel; - protected JComboBox schemaSelector; - protected JTextField tableNamePatternField; - protected JCheckBox loadProcedures; - protected JCheckBox meaningfulPk; - protected JTextField procNamePatternField; - protected JLabel procedureLabel; - protected JButton selectButton; - protected JButton cancelButton; - - /** - * Combobox for naming strategy - */ - protected JComboBox strategyCombo; - - protected ObjectNameGenerator strategy; - - protected int choice; - - /** - * Creates and initializes new ChooseSchemaDialog. - */ - public DbLoaderOptionsDialog(Collection<String> schemas, Collection<String> catalogs, String dbUserName, - String dbCatalog, boolean loadProcedures) { - super(Application.getFrame(), "Reengineer DB Schema: Select Options"); - - init(); - initController(); - initFromModel(schemas, catalogs, dbUserName, dbCatalog, loadProcedures); - - 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(); - procNamePatternField = new JTextField(); - loadProcedures = new JCheckBox(); - meaningfulPk = new JCheckBox(); - 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); - builder.append("Load Procedures:", loadProcedures); - procedureLabel = builder.append("Procedure Name Pattern:", procNamePatternField); - builder.append("Naming Strategy:", strategyCombo); - builder.append("Meaningful PK", 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(); - } - }); - - loadProcedures.addChangeListener(new ChangeListener() { - - public void stateChanged(ChangeEvent e) { - procNamePatternField.setEnabled(loadProcedures.isSelected()); - procedureLabel.setEnabled(loadProcedures.isSelected()); - } - }); - } - - protected void initFromModel( - Collection<String> schemas, - Collection<String> catalogs, - String dbUserName, - String dbCatalog, - boolean shouldLoadProcedures) { - - this.choice = CANCEL; - this.tableNamePatternField.setText(DbLoader.WILDCARD_PATTERN); - this.loadProcedures.setSelected(shouldLoadProcedures); - this.procNamePatternField.setText(DbLoader.WILDCARD_PATTERN); - this.procNamePatternField.setEnabled(shouldLoadProcedures); - this.procedureLabel.setEnabled(shouldLoadProcedures); - - 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())); - - // select schema belonging to the user - if (dbUserName != null) { - for (String schema : schemas) { - if (dbUserName.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())); - - if (dbCatalog != null && !dbCatalog.isEmpty()) { - for (String catalog : catalogs) { - if (dbCatalog.equalsIgnoreCase(catalog)) { - catalogSelector.setSelectedItem(catalog); - break; - } - } - } - } - - } - - public int getChoice() { - return choice; - } - - private void processSelect() { - try { - ClassLoadingService classLoader = Application - .getInstance() - .getClassLoadingService(); - String strategyClass = (String) strategyCombo.getSelectedItem(); - - this.strategy = classLoader - .loadClass(ObjectNameGenerator.class, strategyClass) - .newInstance(); - - /** - * Be user-friendly and update preferences with specified strategy - */ - NameGeneratorPreferences - .getInstance() - .addToLastUsedStrategies(strategyClass); - } - catch (Throwable th) { - logObj.error("Error in " + getClass().getName(), th); - - JOptionPane.showMessageDialog( - this, - "Naming Strategy Initialization Error: " + th.getMessage(), - "Naming Strategy Initialization Error", - JOptionPane.ERROR_MESSAGE); - - return; - } - - 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 boolean isLoadingProcedures() { - return loadProcedures.isSelected(); - } - - public boolean isMeaningfulPk() { - return meaningfulPk.isSelected(); - } - - /** - * Returns the procedure name pattern. - */ - public String getProcedureNamePattern() { - return "".equals(procNamePatternField.getText()) ? null : procNamePatternField - .getText(); - } - - /** - * Returns configured naming strategy - */ - public ObjectNameGenerator getNamingStrategy() { - return strategy; - } -} http://git-wip-us.apache.org/repos/asf/cayenne/blob/fe82b47e/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 index bd2cf69..b18fe9c 100644 --- 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 @@ -68,15 +68,11 @@ 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.config.FiltersConfigBuilder; -import org.apache.cayenne.tools.dbimport.config.ReverseEngineering; -import org.apache.cayenne.tools.dbimport.config.Schema; import org.apache.cayenne.validation.ValidationResult; public class MergerOptions extends CayenneController { protected MergerOptionsView view; - // protected ObjectBinding[] optionBindings; protected ObjectBinding sqlBinding; protected DBConnectionInfo connectionInfo; http://git-wip-us.apache.org/repos/asf/cayenne/blob/fe82b47e/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ReverseEngineeringController.java ---------------------------------------------------------------------- diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ReverseEngineeringController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ReverseEngineeringController.java new file mode 100644 index 0000000..f084187 --- /dev/null +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ReverseEngineeringController.java @@ -0,0 +1,362 @@ +/***************************************************************** + * 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 + * <p/> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p/> + * 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.DbLoader; +import org.apache.cayenne.access.loader.DbLoaderConfiguration; +import org.apache.cayenne.access.loader.DefaultDbLoaderDelegate; +import org.apache.cayenne.access.loader.filters.CatalogFilter; +import org.apache.cayenne.access.loader.filters.SchemaFilter; +import org.apache.cayenne.dba.DbAdapter; +import org.apache.cayenne.dbimport.FiltersConfigBuilder; +import org.apache.cayenne.dbimport.ReverseEngineering; +import org.apache.cayenne.dbimport.ReverseEngineeringLoaderException; +import org.apache.cayenne.map.DataMap; +import org.apache.cayenne.map.DbAttribute; +import org.apache.cayenne.map.DbEntity; +import org.apache.cayenne.map.Procedure; +import org.apache.cayenne.modeler.ClassLoadingService; +import org.apache.cayenne.modeler.ProjectController; +import org.apache.cayenne.modeler.dialog.db.model.DBCatalog; +import org.apache.cayenne.modeler.dialog.db.model.DBColumn; +import org.apache.cayenne.modeler.dialog.db.model.DBElement; +import org.apache.cayenne.modeler.dialog.db.model.DBEntity; +import org.apache.cayenne.modeler.dialog.db.model.DBModel; +import org.apache.cayenne.modeler.dialog.db.model.DBProcedure; +import org.apache.cayenne.modeler.dialog.db.model.DBSchema; +import org.apache.cayenne.modeler.dialog.pref.PreferenceDialog; +import org.apache.cayenne.modeler.dialog.pref.TreeEditor; +import org.apache.cayenne.modeler.dialog.pref.XMLFileEditor; +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 org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import javax.swing.DefaultComboBoxModel; +import javax.swing.SwingUtilities; +import java.awt.Component; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +/** + * A component for performing reverse engineering. Users can choose required dataMap and execute + * reverse engineering. Also they can see tree view of db objects clicking on sync button. + */ +public class ReverseEngineeringController extends CayenneController { + private static final Log LOGGER = LogFactory.getLog(ReverseEngineeringController.class); + + protected ProjectController projectController; + protected ReverseEngineeringView view; + protected Map<String, DataMapViewModel> reverseEngineeringMap; + protected DBModel dbModel; + + protected Connection connection; + protected DbAdapter adapter; + + protected DBConnectionInfo connectionInfo; + protected ObjectBinding dataSourceBinding; + protected Map dataSources; + protected String dataSourceKey; + protected boolean canceled; + + public ReverseEngineeringController(ProjectController controller, + ReverseEngineeringView source) { + super(controller); + this.projectController = controller; + this.view = source; + + this.connectionInfo = new DBConnectionInfo(); + this.reverseEngineeringMap = view.getReverseEngineeringViewMap(); + initBindings(); + refreshDataSources(); + } + + protected void initBindings() { + BindingBuilder builder = new BindingBuilder(getApplication().getBindingFactory(), this); + + dataSourceBinding = builder.bindToComboSelection(view.getDataSources(), "dataSourceKey"); + + builder.bindToAction(view.getSyncButton(), "syncAction()"); + builder.bindToAction(view.getExecuteButton(), "executeAction()"); + builder.bindToAction(view.getConfigButton(), "dataSourceConfigAction()"); + } + + private void buildDBProperties() throws Exception { + ClassLoadingService classLoader = getApplication().getClassLoadingService(); + this.connection = connectionInfo.makeDataSource(classLoader).getConnection(); + this.adapter = connectionInfo.makeAdapter(classLoader); + } + + public void syncAction() throws SQLException { + final TreeEditor treeEditor = view.getTreeEditor(); + XMLFileEditor xmlFileEditor = view.getXmlFileEditor(); + xmlFileEditor.removeAlertMessage(); + try { + buildDBProperties(); + + DbLoader dbLoader = new DbLoader(connection, adapter, new DefaultDbLoaderDelegate()) { + @Override + public DataMap load(DbLoaderConfiguration config) throws SQLException { + DataMap dataMap = new DataMap(); + Map<String, Procedure> procedureMap = loadProcedures(dataMap, config); + load(dataMap, config, procedureMap); + return dataMap; + } + + public void load(DataMap dataMap, DbLoaderConfiguration config, Map<String, Procedure> procedureMap + ) + throws SQLException { + LOGGER.info("Schema loading..."); + + String[] types = config.getTableTypes(); + if (types == null || types.length == 0) { + types = getDefaultTableTypes(); + } + + treeEditor.setRoot(dataSourceKey); + dbModel = new DBModel(dataSourceKey); + boolean catalogSetted = false; + DBElement currentDBCatalog = null; + DBElement currentDBSchema = null; + + for (CatalogFilter catalog : config.getFiltersConfig().catalogs) { + for (SchemaFilter schema : catalog.schemas) { + boolean entityChecked = false; + List<DbEntity> entityList = createTableLoader(catalog.name, schema.name, schema.tables).loadDbEntities( + dataMap, config, types); + DbEntity entityFromLoader = entityList.get(0); + + if (entityFromLoader != null) { + if (catalogSetted == false && entityFromLoader.getCatalog() != null) { + currentDBCatalog = new DBCatalog(entityFromLoader.getCatalog()); + dbModel.addElement(currentDBCatalog); + catalogSetted = true; + } + + if (entityFromLoader.getSchema() != null) { + currentDBSchema = new DBSchema(entityFromLoader.getSchema()); + if(currentDBCatalog != null) { + currentDBCatalog.addElement(currentDBSchema); + } else { + dbModel.addElement(currentDBSchema); + } + } + entityChecked = true; + } + + if (!entityChecked && !procedureMap.isEmpty()) { + Map.Entry<String, Procedure> entry = procedureMap.entrySet().iterator().next(); + Procedure procedure = entry.getValue(); + + if (catalogSetted && procedure.getCatalog() != null) { + currentDBCatalog = new DBCatalog(procedure.getCatalog()); + dbModel.addElement(currentDBCatalog); + catalogSetted = true; + } + + if (procedure.getSchema() != null) { + currentDBSchema = new DBSchema(procedure.getSchema()); + if(currentDBCatalog != null) { + currentDBCatalog.addElement(currentDBSchema); + } else { + dbModel.addElement(currentDBSchema); + } + } + } + + DBEntity currentDBEntity; + if (currentDBSchema != null) { + for (DbEntity dbEntity : entityList) { + currentDBEntity = new DBEntity(dbEntity.getName()); + currentDBSchema.addElement(currentDBEntity); + for (DbAttribute dbColumn : dbEntity.getAttributes()) { + currentDBEntity.addElement(new DBColumn(dbColumn.getName())); + } + } + } else { + for (DbEntity dbEntity : entityList) { + currentDBEntity = new DBEntity(dbEntity.getName()); + for (DbAttribute dbColumn : dbEntity.getAttributes()) { + currentDBEntity.addElement(new DBColumn(dbColumn.getName())); + } + currentDBCatalog.addElement(currentDBEntity); + } + } + + if (currentDBSchema != null) { + for (Map.Entry<String, Procedure> entry : procedureMap.entrySet()) { + currentDBSchema.addElement(new DBProcedure(entry.getValue().getName())); + } + } else { + for (Map.Entry<String, Procedure> entry : procedureMap.entrySet()) { + currentDBCatalog.addElement(new DBProcedure(entry.getValue().getName())); + } + } + currentDBSchema = null; + } + catalogSetted = false; + currentDBCatalog = null; + } + } + }; + + ReverseEngineering reverseEngineering = xmlFileEditor.convertTextIntoReverseEngineering(); + + FiltersConfigBuilder filtersConfigBuilder = new FiltersConfigBuilder(reverseEngineering); + DbLoaderConfiguration dbLoaderConfiguration = new DbLoaderConfiguration(); + dbLoaderConfiguration.setFiltersConfig(filtersConfigBuilder.filtersConfig()); + + dbLoader.load(dbLoaderConfiguration); + + String mapName = projectController.getCurrentDataMap().getName(); + + DataMapViewModel dataMapViewModel = new DataMapViewModel(mapName); + dataMapViewModel.setReverseEngineeringTree(dbModel); + dataMapViewModel.setReverseEngineeringText(xmlFileEditor.getView().getEditorPane().getText()); + reverseEngineeringMap.put(mapName, dataMapViewModel); + treeEditor.convertTreeViewIntoTreeNode(dbModel); + } catch (ReverseEngineeringLoaderException e) { + xmlFileEditor.addAlertMessage(e.getMessage()); + } catch (Exception e) { + xmlFileEditor.addAlertMessage(e.getMessage()); + } + } + + public void executeAction() { + XMLFileEditor xmlFileEditor = view.getXmlFileEditor(); + xmlFileEditor.removeAlertMessage(); + try { + buildDBProperties(); + + ReverseEngineering reverseEngineering = xmlFileEditor.convertTextIntoReverseEngineering(); + + final DbLoaderHelper helper = new DbLoaderHelper( + projectController, + connection, + adapter, + connectionInfo, reverseEngineering); + Thread th = new Thread(new Runnable() { + + public void run() { + helper.execute(); + + SwingUtilities.invokeLater(new Runnable() { + + public void run() { + application.getUndoManager().discardAllEdits(); + } + }); + } + }); + + th.start(); + view.setTempDataMap(projectController.getCurrentDataMap()); + } catch (ReverseEngineeringLoaderException e) { + xmlFileEditor.addAlertMessage(e.getMessage()); + } catch (Exception e) { + xmlFileEditor.addAlertMessage(e.getMessage()); + } + } + + /** + * Returns configured DB connection. + */ + public Connection getConnection() { + return connection; + } + + /** + * Returns configured DbAdapter. + */ + public DbAdapter getAdapter() { + return adapter; + } + + + public String getDataSourceKey() { + return dataSourceKey; + } + + public void setDataSourceKey(String dataSourceKey) { + XMLFileEditor xmlFileEditor = view.getXmlFileEditor(); + xmlFileEditor.removeAlertMessage(); + + this.dataSourceKey = dataSourceKey; + + DBConnectionInfo currentInfo = (DBConnectionInfo) dataSources.get(dataSourceKey); + if (currentInfo != null) { + currentInfo.copyTo(connectionInfo); + } else { + connectionInfo = new DBConnectionInfo(); + } + } + + /** + * 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())); + } + } + + Object[] keys = dataSources.keySet().toArray(); + Arrays.sort(keys); + view.getDataSources().setModel(new DefaultComboBoxModel(keys)); + + if (dataSources.isEmpty()) { + dataSourceKey = null; + } + String key = null; + if (keys.length > 0) { + key = keys[0].toString(); + } + setDataSourceKey(key); + + if (getDataSourceKey() == null) { + dataSourceBinding.updateView(); + } + } +} http://git-wip-us.apache.org/repos/asf/cayenne/blob/fe82b47e/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ReverseEngineeringScrollPane.java ---------------------------------------------------------------------- diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ReverseEngineeringScrollPane.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ReverseEngineeringScrollPane.java new file mode 100644 index 0000000..bc8c466 --- /dev/null +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ReverseEngineeringScrollPane.java @@ -0,0 +1,34 @@ +/***************************************************************** + * 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 javax.swing.JScrollPane; + +/** + * @since 4.0 + */ +public class ReverseEngineeringScrollPane extends JScrollPane { + + private ReverseEngineeringView reverseEngineeringView; + + public ReverseEngineeringScrollPane(ReverseEngineeringView reverseEngineeringView) { + super(reverseEngineeringView); + this.reverseEngineeringView = reverseEngineeringView; + } +}