/** * Copyright 2009 Red Hat, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package org.safehaus.penrose.studio.jdbc.connection.wizard; import java.io.File; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collection; import java.util.Map; import java.util.TreeMap; import org.apache.log4j.Logger; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableItem; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.framework.BundleException; import org.osgi.framework.ServiceReference; import org.osgi.service.packageadmin.PackageAdmin; import org.safehaus.penrose.studio.PenroseStudioPlugin; import org.safehaus.penrose.studio.dialog.ErrorDialog; import org.safehaus.penrose.studio.driver.Driver; import org.safehaus.penrose.studio.driver.DriverReader; import org.safehaus.penrose.studio.driver.DriverWizard; import org.safehaus.penrose.studio.driver.DriverWriter; import org.safehaus.penrose.config.Parameter; /** * @author Endi S. Dewata */ public class JDBCDriverWizardPage extends WizardPage implements SelectionListener { Logger log = Logger.getLogger(getClass()); public final static String NAME = "JDBC Driver"; Table adapterTable; Map<String,Driver> drivers = new TreeMap<String,Driver>(); String driverClass; public JDBCDriverWizardPage() { super(NAME); setDescription("Select the JDBC driver."); try { DriverReader reader = new DriverReader("conf/drivers.xml"); Collection<Driver> list = reader.getDrivers(); for (Driver driver : list) { if (!"JDBC".equals(driver.getAdapterName())) continue; addDriver(driver); } } catch (Exception e) { log.error(e.getMessage(), e); throw new RuntimeException(e.getMessage(), e); } } private Collection loadLibraries() throws Exception { // bundles will be children of the lib directory. eg: conf/lib/mysql File f = new File("conf/lib"); log.debug("Dynamically Loading libraries on " + f); String[] dirs = f.list(); for (String dir1 : dirs) { File dir = new File(f, dir1); log.debug("Installing bundle for " + dir); try { this.installBundle("file://" + dir.getAbsolutePath()); } catch (BundleException e) { log.error(e.getMessage(), e); throw new RuntimeException(e.getMessage(), e); } catch (ClassCastException e) { log.error(e.getMessage(), e); throw new RuntimeException(e.getMessage(), e); } Driver d = new Driver(); } // Class cl = Class.forName("com.mysql.jdbc.Driver"); // com.mysql.jdbc.Driver d = (com.mysql.jdbc.Driver)cl.newInstance(); return new ArrayList(); } private void installBundle(String dir) throws BundleException, ClassNotFoundException { BundleContext context = PenroseStudioPlugin.getInstance().getBundleContext(); Bundle bundle = context.installBundle(dir); /* * Enumeration e = bundle.getHeaders().elements(); * while(e.hasMoreElements()){ System.out.println(e.nextElement()); } */ ServiceReference packageAdminRef = context.getServiceReference(PackageAdmin.class.getName()); PackageAdmin packageAdmin = null; if (packageAdminRef != null) { packageAdmin = (PackageAdmin) context.getService(packageAdminRef); packageAdmin.refreshPackages(new Bundle[] { bundle }); } Class c = bundle.loadClass("com.mysql.jdbc.Driver"); Method[] m = c.getMethods(); for (Method method : m) { System.out.println(method.getName()); } } public void createControl(final Composite parent) { Composite composite = new Composite(parent, SWT.NONE); setControl(composite); GridLayout sectionLayout = new GridLayout(); sectionLayout.numColumns = 2; composite.setLayout(sectionLayout); Label adapterLabel = new Label(composite, SWT.NONE); adapterLabel.setText("Driver:"); GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 2; adapterLabel.setLayoutData(gd); adapterTable = new Table(composite, SWT.BORDER); adapterTable.setLayoutData(new GridData(GridData.FILL_BOTH)); adapterTable.addSelectionListener(this); Composite buttons = new Composite(composite, SWT.NONE); buttons.setLayoutData(new GridData(GridData.FILL_VERTICAL)); buttons.setLayout(new GridLayout()); Button addButton = new Button(buttons, SWT.PUSH); addButton.setText("Add"); addButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); addButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { try { DriverWizard wizard = new DriverWizard(); WizardDialog dialog = new WizardDialog(parent.getShell(), wizard); dialog.setPageSize(600, 300); int rc = dialog.open(); if (rc == Window.CANCEL) return; Driver driver = wizard.getDriver(); if (driver == null) return; addDriver(driver); saveDrivers(); refresh(); } catch (Exception e) { log.error(e.getMessage(), e); ErrorDialog.open(e); } } }); Button editButton = new Button(buttons, SWT.PUSH); editButton.setText("Edit"); editButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); editButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { try { if (adapterTable.getSelectionCount() == 0) return; TableItem item = adapterTable.getSelection()[0]; Driver driver = (Driver)item.getData(); DriverWizard wizard = new DriverWizard(driver); WizardDialog dialog = new WizardDialog(parent.getShell(), wizard); dialog.setPageSize(600, 300); int rc = dialog.open(); if (rc == Window.CANCEL) return; saveDrivers(); refresh(); } catch (Exception e) { log.error(e.getMessage(), e); ErrorDialog.open(e); } } }); Button removeButton = new Button(buttons, SWT.PUSH); removeButton.setText("Remove"); removeButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); removeButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { try { if (adapterTable.getSelectionCount() == 0) return; TableItem item = adapterTable.getSelection()[0]; String name = item.getText(); removeDriver(name); saveDrivers(); refresh(); setPageComplete(validatePage()); } catch (Exception e) { log.error(e.getMessage(), e); ErrorDialog.open(e); } } }); refresh(); if (driverClass != null) { for (TableItem item : adapterTable.getItems()) { Driver driver = (Driver)item.getData(); Parameter parameter = driver.getParameter("driver"); if (parameter == null) continue; if (!driverClass.equals(parameter.getDefaultValue())) continue; adapterTable.setSelection(item); break; } } setPageComplete(validatePage()); } public void refresh() { adapterTable.removeAll(); for (String name : drivers.keySet()) { Driver driver = drivers.get(name); TableItem item = new TableItem(adapterTable, SWT.NONE); item.setText(name); item.setData(driver); } } public Collection<Driver> getDrivers() { return drivers.values(); } public void addDriver(Driver driver) { drivers.put(driver.getName(), driver); } public Driver removeDriver(String name) { return drivers.remove(name); } public void saveDrivers() throws Exception { DriverWriter writer = new DriverWriter("conf/drivers.xml"); for (Driver driver : drivers.values()) { writer.write(driver); } writer.close(); } public Driver getDriver() { if (adapterTable.getSelectionCount() == 0) return null; TableItem item = adapterTable.getSelection()[0]; return (Driver)item.getData(); } public boolean validatePage() { return getDriver() != null; } public void widgetSelected(SelectionEvent event) { setPageComplete(validatePage()); } public void widgetDefaultSelected(SelectionEvent event) { } public String getDriverClass() { return driverClass; } public void setDriverClass(String driverClass) { this.driverClass = driverClass; } }