/*
* Copyright 2007 - 2017 the original author or authors.
*
* Licensed 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 net.sf.jailer.ui;
import java.awt.CardLayout;
import java.awt.Cursor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URI;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.ToolTipManager;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
import net.sf.jailer.CommandLine;
import net.sf.jailer.ExecutionContext;
import net.sf.jailer.JailerVersion;
import net.sf.jailer.database.BasicDataSource;
import net.sf.jailer.database.DMLTransformer;
import net.sf.jailer.database.Session;
import net.sf.jailer.database.WorkingTableScope;
import net.sf.jailer.datamodel.Association;
import net.sf.jailer.datamodel.DataModel;
import net.sf.jailer.datamodel.DataModel.NoPrimaryKeyException;
import net.sf.jailer.ddl.DDLCreator;
import net.sf.jailer.datamodel.Table;
import net.sf.jailer.extractionmodel.ExtractionModel;
import net.sf.jailer.extractionmodel.ExtractionModel.AdditionalSubject;
import net.sf.jailer.modelbuilder.ModelBuilder;
import net.sf.jailer.render.HtmlDataModelRenderer;
import net.sf.jailer.subsetting.ScriptFormat;
import net.sf.jailer.ui.databrowser.DataBrowser;
import net.sf.jailer.ui.progress.ExportAndDeleteStageProgressListener;
import net.sf.jailer.util.LayoutStorage;
/**
* Main frame of Extraction-Model-Editor.
*
* @author Ralf Wisser
*/
public class ExtractionModelFrame extends javax.swing.JFrame {
/**
* The embedded editor.
*/
ExtractionModelEditor extractionModelEditor;
/**
* Dialog for DB-connects.
*/
private DbConnectionDialog dbConnectionDialog;
/**
* The filter editor.
*/
private final FilterEditorDialog filterEditorDialog;
/**
* The border browser.
*/
final ClosureBorderDialog restrictedDependenciesView;
/**
* The "Cycle View" dialog.
*/
final CyclesView cycleViewDialog;
/**
* File in which plaf-setting is stored.
*/
private static final String PLAFSETTING = ".plaf2.ui";
/**
* File in which orientation is stored.
*/
private static final String ORIENTATIONSETTING = ".orientation.ui";
/**
* The execution context.
*/
private final ExecutionContext executionContext = CommandLineInstance.getExecutionContext();
/**
* Creates new form ExtractionModelFrame.
*
* @param extractionModelFile file containing the model, <code>null</code> for new model
* @param isHorizonal
*/
public ExtractionModelFrame(String extractionModelFile, boolean isHorizonal) {
initComponents();
initAnimationSteptime();
isHorizontalLayout = isHorizonal;
horizontalLayoutMenuItem.setSelected(isHorizontalLayout);
editorPanel.add(extractionModelEditor = new ExtractionModelEditor(extractionModelFile, this, isHorizontalLayout, getConnectivityState(), getConnectivityStateToolTip()), "editor");
extractionModelEditor.extractionModelFile = extractionModelFile;
pack();
updateTitle(extractionModelEditor.needsSave);
dbConnectionDialog = new DbConnectionDialog(this, JailerVersion.APPLICATION_NAME, null);
// L&F can no longer be changed
view.setVisible(false);
try {
for (final LookAndFeelInfo lfInfo: UIManager.getInstalledLookAndFeels()) {
JMenuItem mItem = new JMenuItem();
mItem.setText(lfInfo.getName());
view.add(mItem);
mItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
setPLAF(lfInfo.getClassName());
}
});
}
} catch (Throwable t) {
}
updateMenuItems();
restrictedDependenciesView = new RestrictedDependenciesListDialog(this) {
private static final long serialVersionUID = -7426280043553389753L;
@Override
protected Table getRoot() {
return extractionModelEditor == null? null : extractionModelEditor.root;
}
@Override
protected DataModel getDataModel() {
return extractionModelEditor == null? null : extractionModelEditor.dataModel;
}
@Override
protected void removeRestrictions(Collection<Association> associations) {
if (extractionModelEditor != null) {
extractionModelEditor.removeRestrictions(associations);
}
}
@Override
protected void onSelect(Association association) {
extractionModelEditor.select(association);
}
};
cycleViewDialog = new CyclesView(this);
filterEditorDialog = new FilterEditorDialog(this, new ParameterSelector.ParametersGetter() {
@Override
public Set<String> getParameters() {
return extractionModelEditor.dataModel.getParameters(extractionModelEditor.condition.getText(), extractionModelEditor.extractionModel.additionalSubjects);
}
});
}
/**
* Updates state of some menu items.
*/
private void updateMenuItems() {
connectDb.setSelected(dbConnectionDialog.isConnected);
extractionModelEditor.connectivityState.setText(getConnectivityState());
extractionModelEditor.connectivityState.setToolTipText(getConnectivityStateToolTip());
}
private String getConnectivityState() {
if (dbConnectionDialog != null && dbConnectionDialog.isConnected) {
return dbConnectionDialog.currentConnection.user + "@" + (dbConnectionDialog.currentConnection.alias);
} else {
return "offline";
}
}
private String getConnectivityStateToolTip() {
if (dbConnectionDialog != null && dbConnectionDialog.isConnected) {
return (dbConnectionDialog.currentConnection.url);
} else {
return "offline";
}
}
/**
* Opens the filter editor for a given table.
*
* @param table the table
*/
public void openFilterEditor(Table table) {
filterEditorDialog.open(table);
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("deprecation")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
steptimeGroup = new javax.swing.ButtonGroup();
editorPanel = new javax.swing.JPanel();
jMenuBar2 = new javax.swing.JMenuBar();
fileMenu = new javax.swing.JMenu();
newModel = new javax.swing.JMenuItem();
load = new javax.swing.JMenuItem();
jSeparator1 = new javax.swing.JSeparator();
save = new javax.swing.JMenuItem();
saveAs = new javax.swing.JMenuItem();
exportDisplay = new javax.swing.JMenuItem();
jSeparator2 = new javax.swing.JSeparator();
connectDb = new javax.swing.JCheckBoxMenuItem();
disconnectDb = new javax.swing.JMenuItem();
jSeparator10 = new javax.swing.JSeparator();
exit = new javax.swing.JMenuItem();
editMenu = new javax.swing.JMenu();
ignoreAll = new javax.swing.JMenuItem();
removeAllRestrictions = new javax.swing.JMenuItem();
jSeparator12 = new javax.swing.JSeparator();
jMenuItem2 = new javax.swing.JMenuItem();
viewMenu = new javax.swing.JMenu();
collapseAll = new javax.swing.JMenuItem();
expandAll = new javax.swing.JMenuItem();
expandAllVisible = new javax.swing.JMenuItem();
jMenuItem3 = new javax.swing.JMenuItem();
jMenuItem4 = new javax.swing.JMenuItem();
refresh = new javax.swing.JMenuItem();
zoomToFit = new javax.swing.JMenuItem();
jSeparator4 = new javax.swing.JSeparator();
showIgnored = new javax.swing.JCheckBoxMenuItem();
showTableDetails = new javax.swing.JCheckBoxMenuItem();
jSeparator11 = new javax.swing.JSeparator();
horizontalLayoutMenuItem = new javax.swing.JCheckBoxMenuItem();
view = new javax.swing.JMenu();
jMenu4 = new javax.swing.JMenu();
steptime0 = new javax.swing.JRadioButtonMenuItem();
steptime10 = new javax.swing.JRadioButtonMenuItem();
steptime20 = new javax.swing.JRadioButtonMenuItem();
steptime30 = new javax.swing.JRadioButtonMenuItem();
steptime50 = new javax.swing.JRadioButtonMenuItem();
steptime75 = new javax.swing.JRadioButtonMenuItem();
steptime100 = new javax.swing.JRadioButtonMenuItem();
steptime200 = new javax.swing.JRadioButtonMenuItem();
steptime500 = new javax.swing.JRadioButtonMenuItem();
jMenu1 = new javax.swing.JMenu();
updateDataModel = new javax.swing.JMenuItem();
openDataModelEditor = new javax.swing.JMenuItem();
jMenu3 = new javax.swing.JMenu();
dataExport = new javax.swing.JMenuItem();
dataImport = new javax.swing.JMenuItem();
jSeparator5 = new javax.swing.JSeparator();
openDataBrowserItem = new javax.swing.JMenuItem();
queryBuilder = new javax.swing.JMenuItem();
cycleView = new javax.swing.JMenuItem();
restrictedDependenciesToolMenuItem = new javax.swing.JMenuItem();
renderHtml = new javax.swing.JMenuItem();
jMenu2 = new javax.swing.JMenu();
helpContent = new javax.swing.JMenuItem();
tutorial = new javax.swing.JMenuItem();
jSeparator7 = new javax.swing.JSeparator();
helpForum = new javax.swing.JMenuItem();
jSeparator8 = new javax.swing.JSeparator();
jMenuItem1 = new javax.swing.JMenuItem();
setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
setTitle("Extraction Model Editor");
addWindowFocusListener(new java.awt.event.WindowFocusListener() {
public void windowGainedFocus(java.awt.event.WindowEvent evt) {
formWindowGainedFocus(evt);
}
public void windowLostFocus(java.awt.event.WindowEvent evt) {
formWindowLostFocus(evt);
}
});
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
formWindowClosing(evt);
}
});
getContentPane().setLayout(new java.awt.GridBagLayout());
editorPanel.setLayout(new java.awt.CardLayout());
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
getContentPane().add(editorPanel, gridBagConstraints);
fileMenu.setText("File");
fileMenu.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
fileMenuActionPerformed(evt);
}
});
newModel.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_N, java.awt.event.InputEvent.CTRL_MASK));
newModel.setText("New");
newModel.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
newModelActionPerformed(evt);
}
});
fileMenu.add(newModel);
load.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_O, java.awt.event.InputEvent.CTRL_MASK));
load.setText("Load");
load.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
loadActionPerformed(evt);
}
});
fileMenu.add(load);
fileMenu.add(jSeparator1);
save.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.CTRL_MASK));
save.setText("Save");
save.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
saveActionPerformed(evt);
}
});
fileMenu.add(save);
saveAs.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_A, java.awt.event.InputEvent.CTRL_MASK));
saveAs.setText("Save as...");
saveAs.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
saveAsActionPerformed(evt);
}
});
fileMenu.add(saveAs);
exportDisplay.setText("Export graph as image");
exportDisplay.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
exportDisplayActionPerformed(evt);
}
});
fileMenu.add(exportDisplay);
fileMenu.add(jSeparator2);
connectDb.setText("Connect database");
connectDb.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
connectDbActionPerformed(evt);
}
});
fileMenu.add(connectDb);
disconnectDb.setText("Disconnect");
disconnectDb.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
disconnectDbActionPerformed(evt);
}
});
fileMenu.add(disconnectDb);
fileMenu.add(jSeparator10);
exit.setText("Exit");
exit.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
exitActionPerformed(evt);
}
});
fileMenu.add(exit);
jMenuBar2.add(fileMenu);
editMenu.setText("Edit");
ignoreAll.setActionCommand("Disable all associations");
ignoreAll.setLabel("Disable all associations");
ignoreAll.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
ignoreAllActionPerformed(evt);
}
});
editMenu.add(ignoreAll);
removeAllRestrictions.setLabel("Remove all restrictions");
removeAllRestrictions.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
removeAllRestrictionsActionPerformed(evt);
}
});
editMenu.add(removeAllRestrictions);
editMenu.add(jSeparator12);
jMenuItem2.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_T, java.awt.event.InputEvent.CTRL_MASK));
jMenuItem2.setText("Filter editor...");
jMenuItem2.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem2ActionPerformed(evt);
}
});
editMenu.add(jMenuItem2);
jMenuBar2.add(editMenu);
viewMenu.setText("View");
collapseAll.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_L, java.awt.event.InputEvent.CTRL_MASK));
collapseAll.setText("Collapse all");
collapseAll.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
collapseAllActionPerformed(evt);
}
});
viewMenu.add(collapseAll);
expandAll.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_E, java.awt.event.InputEvent.CTRL_MASK));
expandAll.setLabel("Expand all");
expandAll.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
expandAllActionPerformed(evt);
}
});
viewMenu.add(expandAll);
expandAllVisible.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_W, java.awt.event.InputEvent.CTRL_MASK));
expandAllVisible.setText("Expand all visible tables");
expandAllVisible.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
expandAllVisibleActionPerformed(evt);
}
});
viewMenu.add(expandAllVisible);
jMenuItem3.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F, java.awt.event.InputEvent.CTRL_MASK));
jMenuItem3.setText("Fix all");
jMenuItem3.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem3ActionPerformed(evt);
}
});
viewMenu.add(jMenuItem3);
jMenuItem4.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_U, java.awt.event.InputEvent.CTRL_MASK));
jMenuItem4.setText("Unfix all");
jMenuItem4.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem4ActionPerformed(evt);
}
});
viewMenu.add(jMenuItem4);
refresh.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_R, java.awt.event.InputEvent.CTRL_MASK));
refresh.setText("Reset");
refresh.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
refreshActionPerformed(evt);
}
});
viewMenu.add(refresh);
zoomToFit.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_Z, java.awt.event.InputEvent.CTRL_MASK));
zoomToFit.setText("Zoom to fit");
zoomToFit.setVerifyInputWhenFocusTarget(false);
zoomToFit.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
zoomToFitActionPerformed(evt);
}
});
viewMenu.add(zoomToFit);
viewMenu.add(jSeparator4);
showIgnored.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_H, java.awt.event.InputEvent.CTRL_MASK));
showIgnored.setText("Show disabled associations");
showIgnored.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
showIgnoredActionPerformed(evt);
}
});
viewMenu.add(showIgnored);
showTableDetails.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_D, java.awt.event.InputEvent.CTRL_MASK));
showTableDetails.setText("Show table details");
showTableDetails.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
showTableDetailsActionPerformed(evt);
}
});
viewMenu.add(showTableDetails);
viewMenu.add(jSeparator11);
horizontalLayoutMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_I, java.awt.event.InputEvent.CTRL_MASK));
horizontalLayoutMenuItem.setSelected(true);
horizontalLayoutMenuItem.setText("Horizontal layout");
horizontalLayoutMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
horizontalLayoutMenuItemActionPerformed(evt);
}
});
viewMenu.add(horizontalLayoutMenuItem);
view.setLabel("Look&Feel");
viewMenu.add(view);
jMenu4.setText("Animation step time");
steptimeGroup.add(steptime0);
steptime0.setSelected(true);
steptime0.setText("default");
steptime0.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
steptime0ActionPerformed(evt);
}
});
jMenu4.add(steptime0);
steptimeGroup.add(steptime10);
steptime10.setText("10");
steptime10.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
steptime10ActionPerformed(evt);
}
});
jMenu4.add(steptime10);
steptimeGroup.add(steptime20);
steptime20.setText("20");
steptime20.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
steptime20ActionPerformed(evt);
}
});
jMenu4.add(steptime20);
steptimeGroup.add(steptime30);
steptime30.setText("30");
steptime30.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
steptime30ActionPerformed(evt);
}
});
jMenu4.add(steptime30);
steptimeGroup.add(steptime50);
steptime50.setText("50");
steptime50.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
steptime50ActionPerformed(evt);
}
});
jMenu4.add(steptime50);
steptimeGroup.add(steptime75);
steptime75.setText("75");
steptime75.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
steptime75ActionPerformed(evt);
}
});
jMenu4.add(steptime75);
steptimeGroup.add(steptime100);
steptime100.setText("100");
steptime100.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
steptime100ActionPerformed(evt);
}
});
jMenu4.add(steptime100);
steptimeGroup.add(steptime200);
steptime200.setText("200");
steptime200.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
steptime200ActionPerformed(evt);
}
});
jMenu4.add(steptime200);
steptimeGroup.add(steptime500);
steptime500.setText("500");
steptime500.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
steptime500ActionPerformed(evt);
}
});
jMenu4.add(steptime500);
viewMenu.add(jMenu4);
jMenuBar2.add(viewMenu);
jMenu1.setText("DataModel");
updateDataModel.setText("Analyze Database");
updateDataModel.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
updateDataModelActionPerformed(evt);
}
});
jMenu1.add(updateDataModel);
openDataModelEditor.setLabel("Data Model Editor");
openDataModelEditor.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
openDataModelEditorActionPerformed(evt);
}
});
jMenu1.add(openDataModelEditor);
jMenuBar2.add(jMenu1);
jMenu3.setText("Tools");
dataExport.setLabel("Export Data");
dataExport.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
dataExportActionPerformed(evt);
}
});
jMenu3.add(dataExport);
dataImport.setLabel("Import SQL Data");
dataImport.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
dataImportActionPerformed(evt);
}
});
jMenu3.add(dataImport);
jMenu3.add(jSeparator5);
openDataBrowserItem.setText("Data Browser");
openDataBrowserItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
openDataBrowserItemActionPerformed(evt);
}
});
jMenu3.add(openDataBrowserItem);
queryBuilder.setText("Query Builder");
queryBuilder.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
queryBuilderActionPerformed(evt);
}
});
jMenu3.add(queryBuilder);
cycleView.setText("Cycle View");
cycleView.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cycleViewActionPerformed(evt);
}
});
jMenu3.add(cycleView);
restrictedDependenciesToolMenuItem.setText("Restricted Dependencies View");
restrictedDependenciesToolMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
restrictedDependenciesToolMenuItemActionPerformed(evt);
}
});
jMenu3.add(restrictedDependenciesToolMenuItem);
renderHtml.setText("HTML Rendering");
renderHtml.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
renderHtmlActionPerformed(evt);
}
});
jMenu3.add(renderHtml);
jMenuBar2.add(jMenu3);
jMenu2.setText("Help");
helpContent.setText("Manual");
helpContent.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
helpContentActionPerformed(evt);
}
});
jMenu2.add(helpContent);
tutorial.setLabel("Tutorial");
tutorial.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
tutorialActionPerformed(evt);
}
});
jMenu2.add(tutorial);
jMenu2.add(jSeparator7);
helpForum.setLabel("Help Forum");
helpForum.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
helpForumActionPerformed(evt);
}
});
jMenu2.add(helpForum);
jMenu2.add(jSeparator8);
jMenuItem1.setText("About Jailer");
jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem1ActionPerformed(evt);
}
});
jMenu2.add(jMenuItem1);
jMenuBar2.add(jMenu2);
setJMenuBar(jMenuBar2);
pack();
}// </editor-fold>//GEN-END:initComponents
/**
* <code>true</code> if find-dialog was hidden due to lost focus.
*/
// private boolean findDialogWasVisible = false;
private void formWindowLostFocus(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowLostFocus
// if (findDialog.isVisible()) {
// findDialogWasVisible = findDialog.isVisible();
// findDialog.setVisible(false);
// }
}//GEN-LAST:event_formWindowLostFocus
private void formWindowGainedFocus(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowGainedFocus
// if (findDialogWasVisible && !findDialog.isVisible()) {
// findDialogWasVisible = false;
// findDialog.setVisible(true);
// }
}//GEN-LAST:event_formWindowGainedFocus
private void queryBuilderActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_queryBuilderActionPerformed
extractionModelEditor.graphView.openQueryBuilder(extractionModelEditor.root, true);
}//GEN-LAST:event_queryBuilderActionPerformed
private void expandAllVisibleActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_expandAllVisibleActionPerformed
extractionModelEditor.expandAllVisibleTables();
}//GEN-LAST:event_expandAllVisibleActionPerformed
private void showTableDetailsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_showTableDetailsActionPerformed
extractionModelEditor.graphView.updateTableDetailsMode();
}//GEN-LAST:event_showTableDetailsActionPerformed
private void helpForumActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_helpForumActionPerformed
try {
BrowserLauncher.openURL(new URI("https://sourceforge.net/forum/?group_id=197260"));
} catch (Exception e) {
UIUtil.showException(this, "Error", e);
}
}//GEN-LAST:event_helpForumActionPerformed
private void zoomToFitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_zoomToFitActionPerformed
extractionModelEditor.zoomToFit();
}//GEN-LAST:event_zoomToFitActionPerformed
private void tutorialActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tutorialActionPerformed
try {
BrowserLauncher.openURL(new URI("http://jailer.sourceforge.net/doc/exporting-data.htm"));
} catch (Exception e) {
UIUtil.showException(this, "Error", e);
}
}//GEN-LAST:event_tutorialActionPerformed
private void helpContentActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_helpContentActionPerformed
try {
BrowserLauncher.openURL(new URI("http://jailer.sourceforge.net/doc/home.htm"));
} catch (Exception e) {
UIUtil.showException(this, "Error", e);
}
}//GEN-LAST:event_helpContentActionPerformed
private void removeAllRestrictionsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removeAllRestrictionsActionPerformed
if (JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(this, "Remove all restrictions?", "Remove restrictions", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE)) {
extractionModelEditor.removeAllRestrictions(null);
}
}//GEN-LAST:event_removeAllRestrictionsActionPerformed
private void ignoreAllActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ignoreAllActionPerformed
if (JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(this, "Disable each association (except dependencies)?", "Add restrictions", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE)) {
extractionModelEditor.ignoreAll(null);
}
}//GEN-LAST:event_ignoreAllActionPerformed
private void dataImportActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_dataImportActionPerformed
try {
String sqlFile = UIUtil.choseFile(null, ".", "Data Import", ".sql", this, false, true);
if (sqlFile != null) {
disconnect();
if (connectToDBIfNeeded("Data Import")) {
List<String> args = new ArrayList<String>();
args.add("import");
args.add(sqlFile);
dbConnectionDialog.addDbArgs(args);
ImportDialog importDialog = new ImportDialog(this, sqlFile, args, dbConnectionDialog.getPassword(), true);
if (importDialog.isOk) {
disconnect();
importDialog.fillCLIArgs(args);
UIUtil.runJailer(this, args, false, true, false, false, null, dbConnectionDialog.getPassword(), null, null, false, true, false);
}
}
}
} catch (Exception e) {
UIUtil.showException(this, "Error", e);
}
}//GEN-LAST:event_dataImportActionPerformed
/**
* Looks up "show disabled associations" setting.
*
* @return true if "show disabled associations" is set
*/
public boolean showDisabledAssociations() {
return !hideIgnored();
}
/**
* Opens the closure view.
*
* @param tableToSelect the table to select initially or <code>null</code> to keep the current selection
*/
public void openClosureView(Table tableToSelect) {
// closureView.refresh(tableToSelect);
// closureView.setVisible(true);
// closureView.toFront();
}
/**
* Opens the closure view.
*
* @param root the table to open initially
*/
public void openDataBrowser(Table root, String condition) {
if (dbConnectionDialog.isConnected || dbConnectionDialog.connect("Data Browser")) {
updateMenuItems();
DataBrowser dataBrowser;
try {
dataBrowser = new DataBrowser(extractionModelEditor.dataModel, root, condition, dbConnectionDialog, true, executionContext);
dataBrowser.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
dataBrowser.setVisible(true);
} catch (Exception e) {
UIUtil.showException(this, "Error", e);
}
}
}
/**
* Sets Look&Feel.
*
* @param plaf the l&f
*/
private void setPLAF(String plaf) {
try {
UIManager.setLookAndFeel(plaf);
SwingUtilities.updateComponentTreeUI(this);
try {
File file = new File(PLAFSETTING);
file.delete();
} catch (Exception e) {
}
try {
File plafSetting = new File(PLAFSETTING);
PrintWriter out = new PrintWriter(plafSetting);
out.println(plaf);
out.close();
} catch (Exception x) {
}
}
catch (Exception e) {
UIUtil.showException(this, "Error", e);
}
}
/**
* Stores orientation.
*/
private void storeOrientation() {
try {
try {
File file = new File(ORIENTATIONSETTING);
file.delete();
} catch (Exception e) {
}
try {
File setting = new File(ORIENTATIONSETTING);
PrintWriter out = new PrintWriter(setting);
out.println(isHorizontalLayout);
out.close();
} catch (Exception x) {
}
}
catch (Exception e) {
UIUtil.showException(this, "Error", e);
}
}
private void openDataModelEditorActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_openDataModelEditorActionPerformed
openDataModelEditor(null);
}//GEN-LAST:event_openDataModelEditorActionPerformed
/**
* Opens the data model editor.
*/
private void openDataModelEditor(Table toEdit) {
try {
if (saveIfNeeded("edit data model", true, false)) {
String modelname = extractionModelEditor.dataModel == null? DataModel.DEFAULT_NAME : extractionModelEditor.dataModel.getName();
DataModelEditor dataModelEditor = new DataModelEditor(this, false, false, toEdit, null, null, modelname, null);
dataModelEditor.setVisible(true);
// if (dataModelEditor.saved) {
reload();
// }
askForDataModel(this);
extractionModelEditor.closureBorderView.refresh();
restrictedDependenciesView.refresh();
}
} catch (Exception e) {
UIUtil.showException(this, "Error", e);
}
}
private void updateDataModelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_updateDataModelActionPerformed
try {
if (saveIfNeeded("Analyze Database", true, false)) {
if (connectToDBIfNeeded("Analyze Database")) {
List<String> args = new ArrayList<String>();
args.add("build-model-wo-merge");
dbConnectionDialog.addDbArgs(args);
AnalyseOptionsDialog analyseOptionsDialog = new AnalyseOptionsDialog(this, extractionModelEditor.dataModel);
boolean[] isDefaultSchema = new boolean[1];
String[] defaultSchema = new String[1];
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
List<String> schemas;
try {
schemas = dbConnectionDialog.getDBSchemas(defaultSchema);
} finally {
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
if (analyseOptionsDialog.edit(schemas, defaultSchema[0], isDefaultSchema, dbConnectionDialog.currentConnection.user)) {
String schema = analyseOptionsDialog.getSelectedSchema();
if (schema != null) {
args.add("-schema");
args.add(schema);
}
if (!isDefaultSchema[0]) {
args.add("-qualifyNames");
}
analyseOptionsDialog.appendAnalyseCLIOptions(args);
ModelBuilder.assocFilter = analyseOptionsDialog.getAssociationLineFilter();
if (UIUtil.runJailer(this, args, false, true, false, true, null, dbConnectionDialog.getPassword(), null, null, false, true, false)) {
ModelBuilder.assocFilter = null;
String modelname = extractionModelEditor.dataModel == null? DataModel.DEFAULT_NAME : extractionModelEditor.dataModel.getName();
DataModelEditor dataModelEditor = new DataModelEditor(this, true, analyseOptionsDialog.isRemoving(), null, analyseOptionsDialog.getTableLineFilter(), analyseOptionsDialog.getAssociationLineFilter(), modelname, schema == null? dbConnectionDialog.getName() : schema);
if (dataModelEditor.dataModelHasChanged()) {
dataModelEditor.setVisible(true);
}
// if (dataModelEditor.saved) {
reload();
// }
askForDataModel(this);
}
}
}
askForDataModel(this);
}
} catch (Exception e) {
UIUtil.showException(this, "Error", e);
} finally {
ModelBuilder.assocFilter = null;
}
}//GEN-LAST:event_updateDataModelActionPerformed
void dataExportActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_dataExportActionPerformed
openExportDialog(true, null);
}//GEN-LAST:event_dataExportActionPerformed
private String createTempFileName() {
String file;
String ts = new SimpleDateFormat("HH-mm-ss-SSS").format(new Date());
File newFile;
for (int i = 1; ; ++i) {
file = "tmp";
newFile = new File(file);
newFile.mkdirs();
file += File.separator + "em" + "-" + ts + (i > 1? "-" + Integer.toString(i) : "") + ".csv";
newFile = new File(file);
if (!newFile.exists()) {
break;
}
}
return file;
}
public void openExportDialog(boolean checkRI, Runnable onDataModelUpdate) {
String tmpFileName = null;
try {
if (checkRI && extractionModelEditor.dataModel != null && !ScriptFormat.XML.equals(extractionModelEditor.scriptFormat)) {
Association restrictedDependency = findRestrictedDependency(extractionModelEditor.dataModel);
if (restrictedDependency != null) {
switch (JOptionPane.showOptionDialog(this,
"Dependency from '" + restrictedDependency.source.getName() + "' to '" + restrictedDependency.destination.getName() + "'\n" +
"is restricted.\nReferential integrity is not guaranteed!", "Restricted Dependency", JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE, null, new Object[] { "Ok", "Cancel", "Show Dependency" }, "Cancel")) {
case 1: return;
case 2:
restrictedDependenciesView.setVisible(true);
restrictedDependenciesView.toFront();
return;
}
}
}
if (extractionModelEditor.subject == null) {
askForDataModel(this);
return;
}
if (extractionModelEditor.extractionModelFile == null) {
tmpFileName = createTempFileName();
if (!extractionModelEditor.save(tmpFileName)) {
tmpFileName = null;
}
}
if (tmpFileName != null || saveIfNeeded("Export data", false, true)) {
if (tmpFileName != null || (extractionModelEditor.extractionModelFile != null || extractionModelEditor.save(true, "Export data"))) {
if (connectToDBIfNeeded("Export data")) {
List<String> args = new ArrayList<String>();
args.add(tmpFileName != null? tmpFileName : extractionModelEditor.extractionModelFile);
dbConnectionDialog.addDbArgs(args);
Session.closeTemporaryTableSession();
BasicDataSource dataSource = new BasicDataSource(dbConnectionDialog.currentConnection.driverClass, dbConnectionDialog.currentConnection.url, dbConnectionDialog.currentConnection.user, dbConnectionDialog.getPassword(), 0, dbConnectionDialog.currentJarURLs());
Session session = new Session(dataSource, dataSource.dbms);
if (extractionModelEditor.dataModel != null && session.dbms.getRowidName() == null) {
Set<Table> toCheck = new HashSet<Table>();
if (extractionModelEditor.extractionModel != null) {
if (extractionModelEditor.extractionModel.additionalSubjects != null) {
for (AdditionalSubject as: extractionModelEditor.extractionModel.additionalSubjects) {
toCheck.add(as.getSubject());
}
}
}
toCheck.add(extractionModelEditor.subject);
extractionModelEditor.dataModel.checkForPrimaryKey(toCheck, false);
}
ExportDialog exportDialog = new ExportDialog(this, extractionModelEditor.dataModel, extractionModelEditor.getSubject(), extractionModelEditor.getSubjectCondition(), extractionModelEditor.extractionModel.additionalSubjects, session, args, dbConnectionDialog.getPassword(), checkRI, dbConnectionDialog);
session.shutDown();
Session.closeTemporaryTableSession();
if (exportDialog.isOk()) {
exportDialog.fillCLIArgs(args);
List<String> ddlArgs = new ArrayList<String>();
ddlArgs.add("create-ddl");
dbConnectionDialog.addDbArgs(ddlArgs);
if (!exportDialog.isUseRowId()) {
ddlArgs.add("-no-rowid");
}
if (exportDialog.getWorkingTableSchema() != null) {
ddlArgs.add("-working-table-schema");
ddlArgs.add(exportDialog.getWorkingTableSchema());
}
DMLTransformer.numberOfExportedLOBs = 0;
DDLCreator ddlCreator = new DDLCreator(executionContext);
dataSource = new BasicDataSource(ddlArgs.get(1), ddlArgs.get(2), ddlArgs.get(3), ddlArgs.get(4), 0, dbConnectionDialog.currentJarURLs());
String tableInConflict = ddlCreator.getTableInConflict(dataSource, dataSource.dbms);
if (tableInConflict != null && exportDialog.getTemporaryTableScope().equals(WorkingTableScope.GLOBAL)) {
JOptionPane.showMessageDialog(this, "Can't drop table '" + tableInConflict + "' as it is not created by Jailer.\nDrop or rename this table first.", "Error", JOptionPane.ERROR_MESSAGE);
}
else {
if (!exportDialog.getTemporaryTableScope().equals(WorkingTableScope.GLOBAL) || ddlCreator.isUptodate(dataSource, dataSource.dbms, exportDialog.isUseRowId(), exportDialog.getWorkingTableSchema()) || UIUtil.runJailer(this, ddlArgs, true, true, false, true,
"Automatic creation of working-tables failed!\n" +
"Please execute the Jailer-DDL manually (jailer_ddl.sql)\n" +
"or try another \"Working table schema\"\n\n" +
"Continue Data Export?", dbConnectionDialog.getPassword(), null, null, true, false, true)) {
ProgressTable progressTable = new ProgressTable();
ProgressTable progressTableForDelete = new ProgressTable();
ProgressPanel progressPanel = new ProgressPanel(progressTable, progressTableForDelete, exportDialog.hasDeleteScript());
boolean confirm = exportDialog.scriptFormat == ScriptFormat.INTRA_DATABASE && exportDialog.getConfirmExport();
ExportAndDeleteStageProgressListener progressListener = new ExportAndDeleteStageProgressListener(progressTable, progressTableForDelete, progressPanel, extractionModelEditor.dataModel, confirm, exportDialog.getTargetSchemaSet());
try {
UIUtil.runJailer(this, args, true, true, exportDialog.explain.isSelected(), false /* !exportDialog.explain.isSelected() */, null, dbConnectionDialog.getPassword(), progressListener, progressPanel, true, true, false);
} finally {
progressListener.stop();
}
}
}
}
}
}
}
} catch (Exception e) {
if (e instanceof DataModel.NoPrimaryKeyException) {
if (JOptionPane.showOptionDialog(this, e.getMessage(), "No Primary Key", JOptionPane.YES_NO_OPTION, JOptionPane.ERROR_MESSAGE, null, new Object[] { "Edit Table", "Cancel" }, null) == 0) {
openDataModelEditor(((NoPrimaryKeyException) e).table);
if (onDataModelUpdate != null) {
onDataModelUpdate.run();
}
}
} else {
UIUtil.showException(this, "Error", e);
}
} finally {
if (tmpFileName != null) {
new File(tmpFileName).delete();
}
}
}
/**
* Finds restricted dependency.
*/
private Association findRestrictedDependency(DataModel dataModel) {
for (Association association: dataModel.namedAssociations.values()) {
if (association.isInsertDestinationBeforeSource() && association.isRestricted()) {
return association;
}
}
return null;
}
private void disconnectDbActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_disconnectDbActionPerformed
disconnect();
}//GEN-LAST:event_disconnectDbActionPerformed
private void disconnect() {
dbConnectionDialog.isConnected = false;
updateMenuItems();
}
private void connectDbActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_connectDbActionPerformed
disconnect();
connectToDBIfNeeded(null);
}//GEN-LAST:event_connectDbActionPerformed
private void renderHtmlActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_renderHtmlActionPerformed
openHTMLRender(null);
}//GEN-LAST:event_renderHtmlActionPerformed
/**
* Opens browser to render a given table.
*
* @param table the table
*/
public void openHTMLRender(Table table) {
try {
List<String> args = new ArrayList<String>();
args.add("render-datamodel");
File file = saveRestrictions();
args.add(file.getName());
UIUtil.runJailer(this, args, false, true, false, true, null, null /* dbConnectionDialog.getPassword() */, null, null, false, true, false);
BrowserLauncher.openURL(table == null? "render/index.html" : ("render/" + HtmlDataModelRenderer.toFileName(table)));
} catch (Exception e) {
UIUtil.showException(this, "Error", e);
}
}
/**
* Shows shortest path between two given table.
*/
public void showShortestPath(Table from, Table to) {
if (from != null && to != null) {
try {
List<String> args = new ArrayList<String>();
args.add("find-association");
args.add(from.getName());
args.add(to.getName());
File file = saveRestrictions();
args.add(file.getName());
UIUtil.runJailer(this, args, false, false, false, false, null, dbConnectionDialog.getPassword(), null, null, false, true, false);
} catch (Exception e) {
UIUtil.showException(this, "Error", e);
}
}
}
/**
* Saves restrictions of current extraction model.
*
* @return restrictions file
*/
private File saveRestrictions() throws Exception {
File file;
String extractionModelFile = extractionModelEditor.extractionModelFile;
if (extractionModelFile == null) {
file = new File("tmp_restrictions.csv");
} else {
extractionModelFile = new File(extractionModelFile).getName();
if (extractionModelFile.toLowerCase().endsWith(".csv")) {
file = new File(extractionModelFile.substring(0, extractionModelFile.length() - 4) + "-restrictions.csv");
} else {
file = new File(extractionModelFile + "-restrictions.csv");
}
}
extractionModelEditor.saveRestrictions(file);
return file;
}
/**
* Opens connection dialog to establish DB-connection.
*
* @return <code>false</code> if connection fails
*/
private boolean connectToDBIfNeeded(String reason) {
try {
if (!dbConnectionDialog.isConnected) {
return dbConnectionDialog.connect(reason);
}
return true;
} finally {
updateMenuItems();
}
}
/**
* Sets a clone of a given {@link DbConnectionDialog}.
*/
public void setDbConnectionDialogClone(DbConnectionDialog dbConnectionDialog) {
try {
this.dbConnectionDialog = new DbConnectionDialog(this, dbConnectionDialog, JailerVersion.APPLICATION_NAME);
} finally {
updateMenuItems();
}
}
private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem1ActionPerformed
About about = new About(this, true);
about.setTitle("Jailer " + JailerVersion.VERSION);
about.pack();
about.setLocation(getLocation().x + (getSize().width - about.getPreferredSize().width) / 2, getLocation().y + (getSize().height - about.getPreferredSize().height) / 2);
about.setVisible(true);
}//GEN-LAST:event_jMenuItem1ActionPerformed
private void loadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_loadActionPerformed
if (saveIfNeeded("loading", true, true)) {
String modelFile = UIUtil.choseFile(null, "extractionmodel", "Load Extraction Model", ".csv", this, true, true, false);
if (modelFile != null) {
load(modelFile);
}
}
}//GEN-LAST:event_loadActionPerformed
/**
* Loads an extraction model.
*
* @param modelFile name of model file
*/
private void load(String modelFile) {
try {
String dmf = ExtractionModel.loadDatamodelFolder(modelFile, executionContext);
if (dmf == null && DataModelManager.getCurrentModelSubfolder() != null
||
dmf != null && !dmf.equals(DataModelManager.getCurrentModelSubfolder())) {
JOptionPane.showMessageDialog(this, "Unable to load \"" + new File(modelFile).getName() + "\"\nExtraction model is assigned to data model \"" + DataModelManager.getModelDetails(dmf).a + "\"", "Wrong Data Model", JOptionPane.ERROR_MESSAGE);
return;
}
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
extractionModelEditor.extractionModelFrame = null;
editorPanel.remove(extractionModelEditor);
extractionModelEditor = null;
editorPanel.add(extractionModelEditor = new ExtractionModelEditor(modelFile, this, isHorizontalLayout, getConnectivityState(), getConnectivityStateToolTip()), "editor");
((CardLayout) editorPanel.getLayout()).show(editorPanel, "editor");
validate();
extractionModelEditor.closureBorderView.refresh();
restrictedDependenciesView.refresh();
updateTitle(extractionModelEditor.needsSave);
} catch (Throwable t) {
UIUtil.showException(this, "Error", t);
} finally {
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
}
private void newModelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_newModelActionPerformed
try {
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
if (saveIfNeeded("creating new model", true, true)) {
extractionModelEditor.extractionModelFrame = null;
editorPanel.remove(extractionModelEditor);
extractionModelEditor = null;
editorPanel.add(extractionModelEditor = new ExtractionModelEditor(null, this, isHorizontalLayout, getConnectivityState(), getConnectivityStateToolTip()), "editor");
((CardLayout) editorPanel.getLayout()).show(editorPanel, "editor");
validate();
extractionModelEditor.closureBorderView.refresh();
restrictedDependenciesView.refresh();
updateTitle(extractionModelEditor.needsSave);
}
} catch (Throwable t) {
UIUtil.showException(this, "Error", t);
} finally {
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
}//GEN-LAST:event_newModelActionPerformed
private void reload() {
try {
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
extractionModelEditor.extractionModelFrame = null;
editorPanel.remove(extractionModelEditor);
editorPanel.add(extractionModelEditor = new ExtractionModelEditor(extractionModelEditor.extractionModelFile, this, isHorizontalLayout, getConnectivityState(), getConnectivityStateToolTip()), "editor");
((CardLayout) editorPanel.getLayout()).show(editorPanel, "editor");
validate();
extractionModelEditor.closureBorderView.refresh();
restrictedDependenciesView.refresh();
updateTitle(extractionModelEditor.needsSave);
} catch (Throwable t) {
UIUtil.showException(this, "Error", t);
} finally {
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
}
private void expandAllActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_expandAllActionPerformed
expandAll();
}//GEN-LAST:event_expandAllActionPerformed
public void expandAll() {
extractionModelEditor.expand();
}
private void showIgnoredActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_showIgnoredActionPerformed
// extractionModelEditor.refresh(true, false);
extractionModelEditor.resetGraphEditor(false, true, true, true);
}//GEN-LAST:event_showIgnoredActionPerformed
private void collapseAllActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_collapseAllActionPerformed
extractionModelEditor.captureLayout();
try {
LayoutStorage.enabled = false;
extractionModelEditor.refresh(false, true, false, true);
extractionModelEditor.resetGraphEditor(true, false, true, true);
} finally {
LayoutStorage.enabled = true;
extractionModelEditor.checkLayoutStack();
}
}//GEN-LAST:event_collapseAllActionPerformed
private void refreshActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_refreshActionPerformed
extractionModelEditor.captureLayout();
try {
extractionModelEditor.refresh(false, true, false, false);
} finally {
extractionModelEditor.checkLayoutStack();
}
}//GEN-LAST:event_refreshActionPerformed
private void saveAsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveAsActionPerformed
extractionModelEditor.save(true, null);
}//GEN-LAST:event_saveAsActionPerformed
private void saveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveActionPerformed
extractionModelEditor.save(false, null);
}//GEN-LAST:event_saveActionPerformed
private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
onExit();
}//GEN-LAST:event_formWindowClosing
private void exitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exitActionPerformed
onExit();
}//GEN-LAST:event_exitActionPerformed
/**
* Saves model if needed.
*
* @return <code>false</code> if user cancels saving
*/
private boolean saveIfNeeded(String cause, boolean ask, boolean withNoOption) {
if (!extractionModelEditor.needsSave) {
return true;
}
if (ask) {
int option = JOptionPane.showConfirmDialog(this, "Save changes before " + cause + "?", "", withNoOption? JOptionPane.YES_NO_CANCEL_OPTION : JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
if (option == JOptionPane.CANCEL_OPTION) {
return false;
}
if (option == JOptionPane.NO_OPTION) {
return withNoOption;
}
}
return extractionModelEditor.save(false, cause);
}
/**
* Exits GUI.
*/
private void onExit() {
if (extractionModelEditor.needsSave) {
if (0 == JOptionPane.showConfirmDialog(
this,
"Exit without saving?",
"",
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE)) {
dispose();
}
} else {
dispose();
UIUtil.checkTermination();
}
}
private void fileMenuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fileMenuActionPerformed
}//GEN-LAST:event_fileMenuActionPerformed
private void jMenuItem3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem3ActionPerformed
extractionModelEditor.graphView.setFix(true);
}//GEN-LAST:event_jMenuItem3ActionPerformed
private void jMenuItem4ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem4ActionPerformed
extractionModelEditor.graphView.setFix(false);
}//GEN-LAST:event_jMenuItem4ActionPerformed
public int animationStepTime = 0;
/**
* Initializes the "step time" menu items.
*/
private void initAnimationSteptime() {
try {
BufferedReader in = new BufferedReader(new FileReader(".steptime"));
try {
animationStepTime = Integer.parseInt(in.readLine());
} catch (Exception e) {
}
in.close();
} catch (FileNotFoundException e) {
} catch (IOException e) {
}
switch (animationStepTime) {
case 0: steptime0.setSelected(true); break;
case 10: steptime10.setSelected(true); break;
case 20: steptime20.setSelected(true); break;
case 30: steptime30.setSelected(true); break;
case 50: steptime50.setSelected(true); break;
case 75: steptime75.setSelected(true); break;
case 100: steptime100.setSelected(true); break;
case 200: steptime200.setSelected(true); break;
case 500: steptime500.setSelected(true); break;
}
}
private void setAnimationSteptime(int steptime) {
animationStepTime = steptime;
FileWriter out;
try {
out = new FileWriter(".steptime");
out.write("" + animationStepTime);
out.close();
} catch (IOException e) {
}
extractionModelEditor.refresh(false, true, true, true);
}
private void steptime0ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_steptime0ActionPerformed
setAnimationSteptime(0);
}//GEN-LAST:event_steptime0ActionPerformed
private void steptime10ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_steptime10ActionPerformed
setAnimationSteptime(10);
}//GEN-LAST:event_steptime10ActionPerformed
private void steptime20ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_steptime20ActionPerformed
setAnimationSteptime(20);
}//GEN-LAST:event_steptime20ActionPerformed
private void steptime30ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_steptime30ActionPerformed
setAnimationSteptime(30);
}//GEN-LAST:event_steptime30ActionPerformed
private void steptime50ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_steptime50ActionPerformed
setAnimationSteptime(50);
}//GEN-LAST:event_steptime50ActionPerformed
private void steptime75ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_steptime75ActionPerformed
setAnimationSteptime(75);
}//GEN-LAST:event_steptime75ActionPerformed
private void steptime100ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_steptime100ActionPerformed
setAnimationSteptime(100);
}//GEN-LAST:event_steptime100ActionPerformed
private void steptime200ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_steptime200ActionPerformed
setAnimationSteptime(200);
}//GEN-LAST:event_steptime200ActionPerformed
private void steptime500ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_steptime500ActionPerformed
setAnimationSteptime(500);
}//GEN-LAST:event_steptime500ActionPerformed
private void jMenuItem2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem2ActionPerformed
openFilterEditor(null);
}//GEN-LAST:event_jMenuItem2ActionPerformed
private void exportDisplayActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exportDisplayActionPerformed
try {
extractionModelEditor.graphView.exportDisplayToImage();
} catch (Throwable e) {
UIUtil.showException(this, "Error", e);
}
}//GEN-LAST:event_exportDisplayActionPerformed
private void horizontalLayoutMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_horizontalLayoutMenuItemActionPerformed
isHorizontalLayout = !isHorizontalLayout;
extractionModelEditor.setOrientation(isHorizontalLayout);
horizontalLayoutMenuItem.setSelected(isHorizontalLayout);
storeOrientation();
jMenuBar2.grabFocus();
}//GEN-LAST:event_horizontalLayoutMenuItemActionPerformed
private void cycleViewActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cycleViewActionPerformed
cycleViewDialog.refresh();
// cycleViewDialog.setVisible(true);
cycleViewDialog.toFront();
cycleViewDialog.findCycles();
}//GEN-LAST:event_cycleViewActionPerformed
private void openDataBrowserItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_openDataBrowserItemActionPerformed
openDataBrowser(extractionModelEditor.root, "");
}//GEN-LAST:event_openDataBrowserItemActionPerformed
private void closureToolMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_closureToolMenuItemActionPerformed
openClosureView(extractionModelEditor.root);
}//GEN-LAST:event_closureToolMenuItemActionPerformed
private void closureBorderToolMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_closureBorderToolMenuItemActionPerformed
extractionModelEditor.closureBorderView.setVisible(true);
extractionModelEditor.closureBorderView.toFront();
}//GEN-LAST:event_closureBorderToolMenuItemActionPerformed
private void restrictedDependenciesToolMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_restrictedDependenciesToolMenuItemActionPerformed
restrictedDependenciesView.setVisible(true);
restrictedDependenciesView.toFront();
}//GEN-LAST:event_restrictedDependenciesToolMenuItemActionPerformed
boolean isHorizontalLayout = false;
/**
* Updates title.
*/
public void updateTitle(boolean needsSave) {
if (extractionModelEditor == null) {
return;
}
String title = "Jailer " + JailerVersion.VERSION + " Extraction Model Editor";
// if (!"datamodel".equals(CommandLineParser.getInstance().getDataModelFolder())) {
// title += " (" + new File(CommandLineParser.getInstance().getDataModelFolder()).getName() + ")";
// }
if (extractionModelEditor.extractionModelFile == null) {
title = "New Model - " + title;
} else {
title = new File(extractionModelEditor.extractionModelFile).getName() + " - " + title;
}
if (needsSave) {
title = "*" + title;
}
setTitle(title);
}
boolean hideIgnored() {
return !showIgnored.isSelected();
}
public boolean showTableDetails() {
return showTableDetails.isSelected();
}
/**
* Changes some nimbus LAF defaults.
*/
public static void customizeNimbus() {
try {
ToolTipManager.sharedInstance().setInitialDelay(400);
ToolTipManager.sharedInstance().setDismissDelay(20000);
} catch (Exception x) {
x.printStackTrace();
}
}
/**
* @param args the command line arguments
*/
public static void main(final String args[]) {
// turn off logging for prefuse library
try {
Logger.getLogger("prefuse").setLevel(Level.OFF);
} catch (Exception e1) {
e1.printStackTrace();
}
try {
CommandLineInstance.init(args);
} catch (Exception e) {
UIUtil.showException(null, "Illegal arguments", e);
return;
}
try {
// create initial data-model files
File file = new File(DataModel.getDatamodelFolder(CommandLineInstance.getExecutionContext()));
if (!file.exists()) {
file.mkdir();
}
} catch (Exception e) {
}
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
try {
// L&F can no longer be changed
// File plafSetting = new File(PLAFSETTING);
String plaf;
// if (!plafSetting.exists()) {
plaf = "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel";
// } else {
// BufferedReader in = new BufferedReader(new FileReader(plafSetting));
// plaf = in.readLine();
// in.close();
// }
UIManager.setLookAndFeel(plaf);
customizeNimbus();
} catch (Exception x) {
}
try {
UIUtil.initSyntaxKit();
} catch(Throwable t) {
t.printStackTrace();
}
String file = null;
try {
CommandLine commandLine = CommandLineInstance.getInstance();
if (commandLine.arguments != null) {
if (commandLine.arguments.size() > 0) {
file = commandLine.arguments.get(0);
}
}
final String finalFile = file;
if (file != null && new File(file).exists()) {
DataModelManager.setCurrentModelSubfolder(ExtractionModel.loadDatamodelFolder(file, CommandLineInstance.getExecutionContext()));
createFrame(finalFile, true, true);
} else {
DataModelManagerDialog dataModelManagerDialog = new DataModelManagerDialog(JailerVersion.APPLICATION_NAME + " " + JailerVersion.VERSION + " - Database Subsetting Tool") {
@Override
protected void onSelect() {
ExtractionModelFrame extractionModelFrame = null;
try {
extractionModelFrame = createFrame(finalFile, true, true);
final ExtractionModelFrame finalExtractionModelFrame = extractionModelFrame;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
askForDataModel(finalExtractionModelFrame);
} catch (Exception e) {
UIUtil.showException(finalExtractionModelFrame, "Error", e);
}
StartupWizzardDialog suw = new StartupWizzardDialog(finalExtractionModelFrame);
if (suw.loadModel) {
finalExtractionModelFrame.loadActionPerformed(null);
}
if (suw.newModelWithRestrictions) {
finalExtractionModelFrame.extractionModelEditor.ignoreAll(null);
finalExtractionModelFrame.extractionModelEditor.needsSave = false;
finalExtractionModelFrame.extractionModelEditor.extractionModelFrame.updateTitle(false);
}
}
});
} catch (Exception e) {
UIUtil.showException(extractionModelFrame, "Error", e);
}
}
private static final long serialVersionUID = 1L;
};
dataModelManagerDialog.setVisible(true);
}
} catch (Throwable e) {
UIUtil.showException(null, "Error", e);
}
}
});
}
private static void askForDataModel(
ExtractionModelFrame extractionModelFrame) throws Exception {
if (extractionModelFrame.extractionModelEditor == null || extractionModelFrame.extractionModelEditor.dataModel == null || extractionModelFrame.extractionModelEditor.dataModel.getTables().isEmpty()) {
switch (JOptionPane.showOptionDialog(extractionModelFrame, "Data model \"" + DataModelManager.getModelDetails(DataModelManager.getCurrentModelSubfolder()).a + "\" is empty.", "Jailer " + JailerVersion.VERSION, JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE, null, new Object[] { "Analyze Database", "Data Model Editor" }, null)) {
case 0: extractionModelFrame.updateDataModelActionPerformed(null); break;
case 1: extractionModelFrame.openDataModelEditorActionPerformed(null); break;
}
} else if (!new File(DataModel.getColumnsFile(CommandLineInstance.getExecutionContext())).exists()) {
switch (JOptionPane.showOptionDialog(extractionModelFrame, "No column definition found.", "Jailer " + JailerVersion.VERSION, JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE, null, new Object[] { "Analyze Database", "Data Model Editor" }, null)) {
case 0: extractionModelFrame.updateDataModelActionPerformed(null); break;
case 1: extractionModelFrame.openDataModelEditorActionPerformed(null); break;
}
}
if (extractionModelFrame.extractionModelEditor != null) {
if (extractionModelFrame.extractionModelEditor.closureBorderView != null) {
extractionModelFrame.extractionModelEditor.closureBorderView.refresh();
}
}
if (extractionModelFrame.restrictedDependenciesView != null) {
extractionModelFrame.restrictedDependenciesView.refresh();
}
}
public static ExtractionModelFrame createFrame(String file, boolean maximize, boolean visible) {
boolean isHorizonal = false;
try {
File setting = new File(ORIENTATIONSETTING);
BufferedReader in = new BufferedReader(new FileReader(setting));
String or = in.readLine();
in.close();
isHorizonal = Boolean.valueOf(or);
} catch (Exception x) {
}
ExtractionModelFrame extractionModelFrame = new ExtractionModelFrame(file, isHorizonal);
try {
extractionModelFrame.setIconImage(new ImageIcon(extractionModelFrame.getClass().getResource("/net/sf/jailer/ui/resource/jailer.png")).getImage());
} catch (Throwable t) {
try {
extractionModelFrame.setIconImage(new ImageIcon(extractionModelFrame.getClass().getResource("/net/sf/jailer/ui/resource/jailer.gif")).getImage());
} catch (Throwable t2) {
}
}
extractionModelFrame.setLocation(40, 40);
extractionModelFrame.setSize(1100, 640);
extractionModelFrame.setVisible(visible);
// if (maximize) {
// extractionModelFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);
// }
return extractionModelFrame;
}
/**
* Marks the model as dirty (needs save)
*/
public void markDirty() {
extractionModelEditor.markDirty();
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JMenuItem collapseAll;
private javax.swing.JCheckBoxMenuItem connectDb;
private javax.swing.JMenuItem cycleView;
private javax.swing.JMenuItem dataExport;
private javax.swing.JMenuItem dataImport;
private javax.swing.JMenuItem disconnectDb;
private javax.swing.JMenu editMenu;
private javax.swing.JPanel editorPanel;
private javax.swing.JMenuItem exit;
private javax.swing.JMenuItem expandAll;
private javax.swing.JMenuItem expandAllVisible;
private javax.swing.JMenuItem exportDisplay;
private javax.swing.JMenu fileMenu;
private javax.swing.JMenuItem helpContent;
private javax.swing.JMenuItem helpForum;
private javax.swing.JCheckBoxMenuItem horizontalLayoutMenuItem;
private javax.swing.JMenuItem ignoreAll;
private javax.swing.JMenu jMenu1;
private javax.swing.JMenu jMenu2;
private javax.swing.JMenu jMenu3;
private javax.swing.JMenu jMenu4;
private javax.swing.JMenuBar jMenuBar2;
private javax.swing.JMenuItem jMenuItem1;
private javax.swing.JMenuItem jMenuItem2;
private javax.swing.JMenuItem jMenuItem3;
private javax.swing.JMenuItem jMenuItem4;
private javax.swing.JSeparator jSeparator1;
private javax.swing.JSeparator jSeparator10;
private javax.swing.JSeparator jSeparator11;
private javax.swing.JSeparator jSeparator12;
private javax.swing.JSeparator jSeparator2;
private javax.swing.JSeparator jSeparator4;
private javax.swing.JSeparator jSeparator5;
private javax.swing.JSeparator jSeparator7;
private javax.swing.JSeparator jSeparator8;
private javax.swing.JMenuItem load;
private javax.swing.JMenuItem newModel;
private javax.swing.JMenuItem openDataBrowserItem;
private javax.swing.JMenuItem openDataModelEditor;
private javax.swing.JMenuItem queryBuilder;
private javax.swing.JMenuItem refresh;
private javax.swing.JMenuItem removeAllRestrictions;
private javax.swing.JMenuItem renderHtml;
private javax.swing.JMenuItem restrictedDependenciesToolMenuItem;
private javax.swing.JMenuItem save;
private javax.swing.JMenuItem saveAs;
private javax.swing.JCheckBoxMenuItem showIgnored;
private javax.swing.JCheckBoxMenuItem showTableDetails;
private javax.swing.JRadioButtonMenuItem steptime0;
private javax.swing.JRadioButtonMenuItem steptime10;
private javax.swing.JRadioButtonMenuItem steptime100;
private javax.swing.JRadioButtonMenuItem steptime20;
private javax.swing.JRadioButtonMenuItem steptime200;
private javax.swing.JRadioButtonMenuItem steptime30;
private javax.swing.JRadioButtonMenuItem steptime50;
private javax.swing.JRadioButtonMenuItem steptime500;
private javax.swing.JRadioButtonMenuItem steptime75;
private javax.swing.ButtonGroup steptimeGroup;
private javax.swing.JMenuItem tutorial;
private javax.swing.JMenuItem updateDataModel;
private javax.swing.JMenu view;
private javax.swing.JMenu viewMenu;
private javax.swing.JMenuItem zoomToFit;
// End of variables declaration//GEN-END:variables
private static final long serialVersionUID = -2252377308370736756L;
}