/* * � Copyright IBM Corp. 2014 * * 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 com.ibm.xsp.extlib.designer.relational.jdbc.plugin.wizard; import java.io.File; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ColumnViewerToolTipSupport; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.window.ToolTip; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ControlEvent; import org.eclipse.swt.events.ControlListener; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.DirectoryDialog; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.Text; import com.ibm.commons.util.StringUtil; import com.ibm.designer.domino.navigator.NavigatorPlugin; import com.ibm.xsp.extlib.designer.relational.utils.Utils; import com.ibm.xsp.extlib.designer.tooling.utils.WizardUtils; /** * @author Gary Marjoram * */ public class JdbcPluginWizardPage extends WizardPage implements SelectionListener, ControlListener, ModifyListener { private static final Image JAR_IMAGE = NavigatorPlugin.getImage("design/jarelement.png"); // $NON-NLS-1$ private static final String PAGE_NAME = "MainPage"; // $NON-NLS-1$ private static final String PAGE_TITLE = "Wrap a JDBC Driver in a Domino OSGi Plug-in"; // $NLX-JdbcPluginWizardPage.JDBCDriverDominoOSGiPlugin-1$ private static final String INITIAL_MSG = "Create a Domino OSGi Plug-in from a JDBC Driver for deployment to a Domino Server."; // $NLX-JdbcPluginWizardPage.CreateaDominoOSGiPluginfromaJDBCD-1$ private static final String TYPE_TOOLTIP = "Choose the JDBC driver type to populate the Class and Plug-in name. This is optional."; // $NLX-JdbcPluginWizardPage.ChoosetheJDBCdrivertypetoautofill-1$ private static final String CLASS_TOOLTIP = "Set the driver Class for the JDBC driver. This can be obtained from the vendor documentation."; // $NLX-JdbcPluginWizardPage.SetthedriverClassfortheJDBCdriver-1$ private static final String JAR_TOOLTIP = "Specify the JAR files for the JDBC Driver."; // $NLX-JdbcPluginWizardPage.SpecifythejarfilesfortheJDBCDrive-1$ private static final String PLUGIN_TOOLTIP = "Specify a name for the Plug-in to be produced."; // $NLX-JdbcPluginWizardPage.SpecifyanameforthePlugintobeprodu-1$ private static final String DIR_TOOLTIP = "Specify the output directory for the produced Update Site or Plug-in."; // $NLX-JdbcPluginWizardPage.Specifytheoutputdirectoryforthepr-1$ private DriverDefs _driverDefs = new DriverDefs(); private List<String> _jarList = new ArrayList<String>(); private Button _addBtn; private Button _delBtn; private Button _clearBtn; private Button _dirBtn; private Combo _typeCombo; private Text _classText; private Text _pluginText; private Text _dirText; private TableViewer _tableViewer; private Button _updateSiteRadio; private Button _deleteCheck; // // Sets up the Driver vendor defs // public JdbcPluginWizardPage() { super(PAGE_NAME); _driverDefs.addDef("", "", ""); _driverDefs.addDef("Apache Derby", "org.apache.derby.jdbc.EmbeddedDriver", "com.apache.derby.jdbc.driver"); // $NON-NLS-1$ $NON-NLS-2$ $NON-NLS-3$ _driverDefs.addDef("IBM DB2", "com.ibm.db2.jcc.DB2Driver", "com.ibm.db2.jdbc.driver"); // $NON-NLS-1$ $NON-NLS-2$ $NON-NLS-3$ _driverDefs.addDef("IBM Informix", "com.informix.jdbc.IfxDriver", "com.ibm.informix.jdbc.driver"); // $NON-NLS-1$ $NON-NLS-2$ $NON-NLS-3$ _driverDefs.addDef("Ingres", "com.ingres.jdbc.IngresDriver", "com.ingres.jdbc.driver"); // $NON-NLS-1$ $NON-NLS-2$ $NON-NLS-3$ _driverDefs.addDef("Microsoft SQL Server", "com.microsoft.sqlserver.jdbc.SQLServerDriver", "com.microsoft.sqlserver.jdbc.driver"); // $NON-NLS-1$ $NON-NLS-2$ $NON-NLS-3$ _driverDefs.addDef("MySQL", "com.mysql.jdbc.Driver", "com.mysql.jdbc.driver"); // $NON-NLS-1$ $NON-NLS-2$ $NON-NLS-3$ _driverDefs.addDef("Oracle", "oracle.jdbc.OracleDriver", "com.oracle.jdbc.driver"); // $NON-NLS-1$ $NON-NLS-2$ $NON-NLS-3$ _driverDefs.addDef("PostgreSQL", "org.postgresql.Driver", "com.postgresql.jdbc.driver"); // $NON-NLS-1$ $NON-NLS-2$ $NON-NLS-3$ _driverDefs.addDef("Sybase", "com.sybase.jdbc3.jdbc.SybDriver", "com.sybase.jdbc.driver"); // $NON-NLS-1$ $NON-NLS-2$ $NON-NLS-3$ } // // Creates the layout for the Wizard // @Override public void createControl(Composite parent) { setTitle(PAGE_TITLE); setMessage(INITIAL_MSG, IMessageProvider.INFORMATION); Composite container = new Composite(parent, SWT.NONE); container.setLayoutData(new GridData(GridData.FILL_BOTH)); container.setLayout(WizardUtils.createGridLayout(1, 5)); // Create the Driver Details section Group group = WizardUtils.createGroup(container, "Driver Details", 1, 3); // $NLX-JdbcPluginWizardPage.DriverDetails-1$ group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); WizardUtils.createLabel(group, "Type:", 1).setToolTipText(TYPE_TOOLTIP); // $NLX-JdbcPluginWizardPage.Type-1$ _typeCombo = WizardUtils.createCombo(group, 2, _driverDefs.getNames(), 0, this); _typeCombo.setToolTipText(TYPE_TOOLTIP); WizardUtils.createLabel(group, "Class:", 1).setToolTipText(CLASS_TOOLTIP); // $NLX-JdbcPluginWizardPage.Class-1$ _classText = WizardUtils.createText(group, 2); _classText.setToolTipText(CLASS_TOOLTIP); _classText.addModifyListener(this); Label label = WizardUtils.createLabel(group, "JAR Files:", 1); // $NLX-JdbcPluginWizardPage.JarFiles-1$ // Top Align this label GridData gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING); gd.verticalIndent = 5; label.setLayoutData(gd); label.setToolTipText(JAR_TOOLTIP); _tableViewer = WizardUtils.createTableViewer(group, 1, 1, null, SWT.FULL_SELECTION | SWT.BORDER | SWT.V_SCROLL | SWT.MULTI); ColumnViewerToolTipSupport.enableFor(_tableViewer, ToolTip.NO_RECREATE); _tableViewer.getTable().setToolTipText(JAR_TOOLTIP); _tableViewer.getTable().setHeaderVisible(false); _tableViewer.getTable().setLinesVisible(false); _tableViewer.getTable().addControlListener(this); _tableViewer.setContentProvider(new ArrayContentProvider()); // Create the only column TableViewerColumn col = new TableViewerColumn(_tableViewer, SWT.LEFT); col.getColumn().setResizable(false); col.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { return new File((String) element).getName(); } @Override public Image getImage(Object element) { return JAR_IMAGE; } @Override public String getToolTipText(Object element) { return (String) element; } @Override public Point getToolTipShift(Object object) { return new Point(5, 5); } @Override public int getToolTipDisplayDelayTime(Object object) { return 100; // msec } @Override public int getToolTipTimeDisplayed(Object object) { return 5000; // msec } }); Composite buttonComposite = new Composite(group, SWT.NONE); buttonComposite.setLayout(WizardUtils.createGridLayout(1, 0)); buttonComposite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.VERTICAL_ALIGN_BEGINNING)); _addBtn = WizardUtils.createButton(buttonComposite, "Add JARs", this); // $NLX-JdbcPluginWizardPage.AddJars-1$ _delBtn = WizardUtils.createButton(buttonComposite, "Remove JARs", this); // $NLX-JdbcPluginWizardPage.RemoveJars-1$ _clearBtn = WizardUtils.createButton(buttonComposite, "Clear", this); // $NLX-JdbcPluginWizardPage.Clear-1$ group = WizardUtils.createGroup(container, "Output", 1, 3); // $NLX-JdbcPluginWizardPage.Output-1$ WizardUtils.createLabel(group, "Plug-in Name:", 1).setToolTipText(PLUGIN_TOOLTIP); // $NLX-JdbcPluginWizardPage.PluginName-1$ _pluginText = WizardUtils.createText(group, 2); _pluginText.setToolTipText(PLUGIN_TOOLTIP); _pluginText.addModifyListener(this); WizardUtils.createLabel(group, "Directory:", 1).setToolTipText(DIR_TOOLTIP); // $NLX-JdbcPluginWizardPage.Directory-1$ _dirText = WizardUtils.createText(group, 1); _dirText.setToolTipText(DIR_TOOLTIP); _dirText.addModifyListener(this); _dirBtn = WizardUtils.createButton(group, "Browse...", this); // $NLX-JdbcPluginWizardPage.Browse-1$ _dirBtn.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END)); WizardUtils.createLabel(group, "", 1); _updateSiteRadio = WizardUtils.createRadio(group, "Create full Update Site", 2, null); // $NLX-JdbcPluginWizardPage.CreatefullUpdateSite-1$ _updateSiteRadio.setSelection(true); WizardUtils.createLabel(group, "", 1); WizardUtils.createRadio(group, "Create Plug-in only", 2, null); // $NLX-JdbcPluginWizardPage.CreatePluginonly-1$ WizardUtils.createLabel(group, "", 1); _deleteCheck = WizardUtils.createCheckBox(group, "Delete temporary project on completion", 2, true); // $NLX-JdbcPluginWizardPage.Deletetemporaryprojectoncompletio-1$ setControl(container); setPageComplete(false); } // // NA // @Override public void widgetDefaultSelected(SelectionEvent arg0) { } // // Handles UI events // @Override public void widgetSelected(SelectionEvent event) { if (event.widget == _typeCombo) { int idx = _typeCombo.getSelectionIndex(); _pluginText.setText(_driverDefs.getPlugin(idx)); _classText.setText(_driverDefs.getClass(idx)); } else if (event.widget == _addBtn) { FileDialog dlg = new FileDialog(getShell(), SWT.MULTI); dlg.setFilterExtensions(new String[] { "*.jar", "*.zip" }); // $NON-NLS-1$ $NON-NLS-2$ String loc = dlg.open(); if (StringUtil.isNotEmpty(loc)) { for (String file : dlg.getFileNames()) { file = dlg.getFilterPath() + "\\" + file; if (_jarList.indexOf(file) == -1) { _jarList.add(file); } } refreshJarTable(-1); } validateJarFiles(); } else if (event.widget == _delBtn) { int sels[] = _tableViewer.getTable().getSelectionIndices(); if ((sels != null) && (sels.length > 0)) { for (int i = sels.length - 1; i >= 0; i--) { _jarList.remove(sels[i]); } refreshJarTable(sels[0] >= _jarList.size() ? sels[0] - 1 : sels[0]); } validateJarFiles(); } else if (event.widget == _clearBtn) { _jarList.clear(); refreshJarTable(-1); validateJarFiles(); } else if (event.widget == _dirBtn) { DirectoryDialog dlg = new DirectoryDialog(getShell()); dlg.setFilterPath(StringUtil.getNonNullString(_dirText.getText())); String loc = dlg.open(); if (StringUtil.isNotEmpty(loc)) { _dirText.setText(loc); } } } // // Refreshes the Jar tableViewer // private void refreshJarTable(int sel) { _tableViewer.setInput(_jarList.toArray()); _tableViewer.refresh(); _tableViewer.getTable().select(sel); } // // NA // @Override public void controlMoved(ControlEvent arg0) { } // // Function to handle resize events so that we can adjust // the tableViewer column // @Override public void controlResized(ControlEvent arg0) { for (TableColumn tc : _tableViewer.getTable().getColumns()) tc.setWidth(_tableViewer.getTable().getClientArea().width); }; // // Function to handle user keystrokes // @Override public void modifyText(ModifyEvent event) { if (event.widget == _classText) { if (_classText.getText().trim().length() == 0) { setError("Class cannot be blank."); // $NLX-JdbcPluginWizardPage.Classcannotbeblank-1$ return; } if (!Utils.isValidClassName(_classText.getText().trim())) { setError("Invalid Class name."); // $NLX-JdbcPluginWizardPage.InvalidClassname-1$ return; } } else if (event.widget == _pluginText) { if (_pluginText.getText().trim().length() == 0) { setError("Plug-in Name cannot be blank."); // $NLX-JdbcPluginWizardPage.PluginNamecannotbeblank-1$ return; } if (!Utils.isValidClassName(_pluginText.getText().trim())) { setError("Invalid Plug-in name."); // $NLX-JdbcPluginWizardPage.InvalidPluginname-1$ return; } } else if (event.widget == _dirText) { if (_dirText.getText().trim().length() == 0) { setError("Output directory cannot be blank."); // $NLX-JdbcPluginWizardPage.OutputDirectorycannotbeblank-1$ return; } } setError(null); checkFinished(); } // // Function to check if the Finish button can be enabled // protected void checkFinished() { if ((_classText.getText().trim().length() == 0) || (!Utils.isValidClassName(_classText.getText().trim()))) { setPageComplete(false); return; } if ((_pluginText.getText().trim().length() == 0) || (!Utils.isValidClassName(_pluginText.getText().trim()))) { setPageComplete(false); return; } if (_dirText.getText().trim().length() == 0) { setPageComplete(false); return; } if (_jarList.size() == 0) { setPageComplete(false); return; } setError(null); setPageComplete(true); } // // Function to check that the user has specified a Jar file // protected void validateJarFiles() { if (_jarList.size() == 0) { setError("You must add at least one valid JAR file."); // $NLX-JdbcPluginWizardPage.YoumustaddatleastonevalidJarfile-1$ return; } setError(null); checkFinished(); } // // Sets or clears the Error msg and sets the state of the Finish button // protected void setError(final String msg) { setErrorMessage(msg); if (msg != null) { setPageComplete(false); } } // // Retrieves the User defined plugin name // public String getPluginName() { return _pluginText.getText().trim(); } // // Retrieves the User defined class name // public String getClassName() { return _classText.getText().trim(); } // // Retrieves the User defined output directory // public String getOutputDir() { return this._dirText.getText().trim(); } // // Retrieves the User defined jar list // public List<String> getJarList() { return _jarList; } // // Rerieves the generate update site flag // public boolean getUpdateSite() { return _updateSiteRadio.getSelection(); } // // Rerieves the delete project flag // public boolean getDeleteProject() { return _deleteCheck.getSelection(); } // // Utility class used to store vendor driver mappings // private class DriverDefs { private ArrayList<String> _names = new ArrayList<String>(); private ArrayList<String> _clazzes = new ArrayList<String>(); private ArrayList<String> _plugins = new ArrayList<String>(); // // Adds a driver definition // public void addDef(final String name, final String clazz, final String plugin) { _names.add(name); _clazzes.add(clazz); _plugins.add(plugin); } // // Get the list of driver names // public String[] getNames() { return _names.toArray(new String[_names.size()]); } // // Gets a specific class // public String getClass(final int idx) { return _clazzes.get(idx); } // // Gets a specific plugin name // public String getPlugin(final int idx) { return _plugins.get(idx); } } }