/*
* 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.databrowser;
import java.awt.Cursor;
import java.awt.GridBagConstraints;
import java.awt.Window;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Map;
import java.util.SortedSet;
import java.util.TreeMap;
import java.util.TreeSet;
import javax.swing.JLabel;
import net.sf.jailer.database.Session;
import net.sf.jailer.datamodel.DataModel;
import net.sf.jailer.datamodel.Table;
import net.sf.jailer.ui.CommandLineInstance;
import net.sf.jailer.ui.DbConnectionDialog;
import net.sf.jailer.ui.JComboBox;
/**
* Schema Mapping Dialog.
*
* @author Ralf Wisser
*/
public class SchemaMappingDialog extends javax.swing.JDialog {
private static final long serialVersionUID = 1L;
private static final String DEFAULT = "<default>";
private boolean ok = false;
private Map<String, JComboBox> comboboxes = new TreeMap<String, JComboBox>();
/** Creates new form SchemaMappingDialog
* @param mapping
* @throws Exception */
public SchemaMappingDialog(java.awt.Frame parent, DataModel dataModel, DbConnectionDialog connectionDialog, Session session, Map<String, String> mapping) throws Exception {
super(parent, true);
initComponents();
Window windowAncestor = parent; // SwingUtilities.getWindowAncestor(parent);
try {
if (windowAncestor != null) {
windowAncestor.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
}
SortedSet<String> modelSchemas = new TreeSet<String>();
for (Table table: new DataModel(CommandLineInstance.getExecutionContext()).getTables()) {
modelSchemas.add(table.getSchema(DEFAULT));
}
SortedSet<String> dbSchemas = new TreeSet<String>(connectionDialog.getDBSchemas(new String[1]));
dbSchemas.add(DEFAULT);
int y = 1;
for (String schema: modelSchemas) {
GridBagConstraints gridBagConstraints;
JComboBox comboBox = new JComboBox();
comboBox.setModel(new javax.swing.DefaultComboBoxModel(dbSchemas.toArray()));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = y;
getContentPane().add(comboBox, gridBagConstraints);
String v = mapping.containsKey(schema)? mapping.get(schema) : schema;
if (schema.equals(DEFAULT)) {
v = mapping.containsKey("")? mapping.get("") : schema;
}
if (dbSchemas.contains(v)) {
comboBox.setSelectedItem(v);
} else if (dbSchemas.contains(v.toUpperCase())) {
comboBox.setSelectedItem(v.toUpperCase());
} else if (dbSchemas.contains(v.toLowerCase())) {
comboBox.setSelectedItem(v.toLowerCase());
} else {
comboBox.setSelectedItem(DEFAULT);
}
comboboxes.put(schema, comboBox);
JLabel label = new JLabel();
label.setFont(new java.awt.Font("DejaVu Sans", 1, 13)); // NOI18N
label.setText(schema);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 4;
gridBagConstraints.gridy = y;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.weightx = 1.0;
getContentPane().add(label, gridBagConstraints);
++y;
}
} finally {
if (windowAncestor != null) {
windowAncestor.setCursor(Cursor.getDefaultCursor());
}
}
pack();
setLocation(300, 100);
setVisible(true);
}
/** 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.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
jPanel1 = new javax.swing.JPanel();
okButton = new javax.swing.JButton();
jButton2 = new javax.swing.JButton();
jLabel4 = new javax.swing.JLabel();
jLabel5 = new javax.swing.JLabel();
jLabel3 = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setTitle("Schema Mapping");
getContentPane().setLayout(new java.awt.GridBagLayout());
jLabel1.setText(" Read from ");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
getContentPane().add(jLabel1, gridBagConstraints);
jLabel2.setText(" instead of ");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 3;
gridBagConstraints.gridy = 1;
getContentPane().add(jLabel2, gridBagConstraints);
jPanel1.setLayout(new java.awt.GridBagLayout());
okButton.setText(" Ok ");
okButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
okButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTHEAST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.insets = new java.awt.Insets(0, 4, 4, 0);
jPanel1.add(okButton, gridBagConstraints);
jButton2.setText(" Cancel ");
jButton2.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton2ActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTH;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.insets = new java.awt.Insets(0, 4, 4, 4);
jPanel1.add(jButton2, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 200;
gridBagConstraints.gridwidth = 4;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
getContentPane().add(jPanel1, gridBagConstraints);
jLabel4.setText(" ");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
getContentPane().add(jLabel4, gridBagConstraints);
jLabel5.setText(" ");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 199;
getContentPane().add(jLabel5, gridBagConstraints);
jLabel3.setText(" ");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 5;
gridBagConstraints.gridy = 1;
getContentPane().add(jLabel3, gridBagConstraints);
pack();
}// </editor-fold>//GEN-END:initComponents
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
setVisible(false);
}//GEN-LAST:event_jButton2ActionPerformed
private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed
ok = true;
setVisible(false);
}//GEN-LAST:event_okButtonActionPerformed
/**
* Gets current mapping, or <code>null</code> if dialog was canceled.
*
* @return current mapping, or <code>null</code> if dialog was canceled
*/
public Map<String, String> getMapping() {
if (ok) {
Map<String, String> mapping = new TreeMap<String, String>();
for (Map.Entry<String, JComboBox> e: comboboxes.entrySet()) {
String selection = (String) e.getValue().getSelectedItem();
if (selection == DEFAULT) {
selection = "";
}
mapping.put(e.getKey() == DEFAULT? "" : e.getKey(), selection);
}
return mapping;
}
return null;
}
private final static String MAPPINGS_FILE = ".browserschemamaps.ser";
/**
* Restores all persisted schema mappings.
*
* @return all persisted schema mappings
*/
private static Map<String, Map<String, String>> restore() {
try {
File file = new File(MAPPINGS_FILE);
ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
@SuppressWarnings("unchecked")
Map<String, Map<String, String>> mappings = (Map<String, Map<String, String>>) in.readObject();
in.close();
return mappings;
} catch (Exception e) {
return new TreeMap<String, Map<String,String>>();
}
}
/**
* Restores all persisted schema mappings.
*
* @param connectionDialog to get mapping key
* @return all persisted schema mappings
*/
public static Map<String, String> restore(DbConnectionDialog connectionDialog) {
if (connectionDialog.currentConnection == null) {
return new TreeMap<String, String>();
}
Map<String, String> mapping = restore().get(connectionDialog.currentConnection.user + "@" + connectionDialog.currentConnection.url);
if (mapping == null) {
return new TreeMap<String, String>();
}
return mapping;
}
/**
* Stores a schema mapping.
*
* @param mapping the mapping
* @param connectionDialog to get mapping key
*/
public static void store(Map<String, String> mapping, DbConnectionDialog connectionDialog) {
try {
Map<String, Map<String, String>> mappings = restore();
File file = new File(MAPPINGS_FILE);
file.delete();
mappings.put(connectionDialog.currentConnection.user + "@" + connectionDialog.currentConnection.url, mapping);
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file));
out.writeObject(mappings);
out.close();
} catch (Exception e) {
// ignore
}
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton jButton2;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JPanel jPanel1;
private javax.swing.JButton okButton;
// End of variables declaration//GEN-END:variables
}