/* * JBoss, Home of Professional Open Source * Copyright 2005, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.hibernate.eclipse.console.wizards; import java.util.Arrays; import java.util.Comparator; import java.util.Properties; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.Path; import org.eclipse.datatools.connectivity.IConnectionProfile; import org.eclipse.datatools.connectivity.ProfileManager; import org.eclipse.datatools.connectivity.drivers.jdbc.IJDBCDriverDefinitionConstants; import org.eclipse.jface.dialogs.IDialogPage; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.window.Window; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; 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.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Link; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.WizardNewFileCreationPage; import org.hibernate.console.ConnectionProfileUtil; import org.hibernate.eclipse.console.HibernateConsoleMessages; import org.hibernate.eclipse.console.utils.DriverClassHelpers; import org.jboss.tools.hibernate.runtime.spi.ServiceLookup; /** * Wizard for creating basic hibernate.cfg.xml */ public class NewConfigurationWizardPage extends WizardPage { final private DriverClassHelpers helper = new DriverClassHelpers(); private Label containerText; private Label fileText; private Combo hibernateVersionCombo; private String hibernateVersion; private Text sessionFactoryNameText; private Combo dialectCombo; private Combo driver_classCombo; private Text usernameText; private Text passwordText; private Text defaultSchemaText; private Text defaultCatalogText; private Combo urlCombo; private Button createConsoleConfiguration; private final WizardNewFileCreationPage fileCreation; private boolean beenShown = false; private String defaultConnectionProfile = null; /** * Constructor for SampleNewWizardPage. * @param page * * @param pageName */ public NewConfigurationWizardPage(ISelection selection, WizardNewFileCreationPage page) { super("wizardPage"); //$NON-NLS-1$ this.fileCreation = page; setTitle(HibernateConsoleMessages.NewConfigurationWizardPage_hibernate_config_file); setDescription(HibernateConsoleMessages.NewConfigurationWizardPage_this_wizard_creates); } private static final Comparator<String> STRING_REVERSE_ALPHABETICAL = new Comparator<String>() { @Override public int compare(String s1, String s2) { return s2.compareTo(s1); } }; /** * @see IDialogPage#createControl(Composite) */ public void createControl(Composite parent) { ModifyListener listener = new ModifyListener() { public void modifyText(ModifyEvent e) { dialogChanged(); } }; SelectionListener selectionListener = new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { dialogChanged(); getContainer().updateButtons(); } public void widgetSelected(SelectionEvent e) { dialogChanged(); getContainer().updateButtons(); } }; final ScrolledComposite sc = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL); sc.setExpandHorizontal(true); sc.setExpandVertical(true); Composite container = new Composite(sc, SWT.NULL); sc.setContent(container); GridLayout layout = new GridLayout(); container.setLayout(layout); layout.numColumns = 2; layout.verticalSpacing = 9; Label label = new Label(container, SWT.NULL); label.setText(HibernateConsoleMessages.NewConfigurationWizardPage_container); containerText = new Label(container, SWT.BORDER | SWT.SINGLE); GridData gd = new GridData(GridData.FILL_HORIZONTAL); containerText.setLayoutData(gd); label = new Label(container, SWT.NULL); label.setText(HibernateConsoleMessages.NewConfigurationWizardPage_file_name); fileText = new Label(container, SWT.BORDER | SWT.SINGLE); gd = new GridData(GridData.FILL_HORIZONTAL); fileText.setLayoutData(gd); Label hLabel = new Label(container, SWT.NULL); hLabel.setText(HibernateConsoleMessages.NewConfigurationWizardPage_file_hibernate_version); hibernateVersionCombo = new Combo(container, SWT.READ_ONLY); String[] versions = ServiceLookup.getVersions(); Arrays.sort(versions, STRING_REVERSE_ALPHABETICAL); hibernateVersionCombo.setItems(versions); hibernateVersionCombo.select(0); label = new Label(container, SWT.NULL); label.setText(HibernateConsoleMessages.NewConfigurationWizardPage_session_factory_name); sessionFactoryNameText = new Text(container, SWT.BORDER | SWT.SINGLE); gd = new GridData(GridData.FILL_HORIZONTAL); sessionFactoryNameText.setLayoutData(gd); sessionFactoryNameText.addModifyListener(listener); Link link = new Link(container, SWT.RIGHT); link.setText(HibernateConsoleMessages.NewConfigurationWizardPage_getValuesFromConnection); link.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); SelectConnectionProfileDialog dialog = new SelectConnectionProfileDialog(shell); if (defaultConnectionProfile != null) dialog.setDefaultValue(defaultConnectionProfile); if (dialog.open() == Window.OK){ defaultConnectionProfile = dialog.getConnectionProfileName(); fillPropertiesFromConnectionProfile(defaultConnectionProfile); } } }); gd = new GridData(GridData.FILL_HORIZONTAL); gd.grabExcessHorizontalSpace = true; gd.horizontalSpan = 2; link.setLayoutData(gd); label = new Label(container, SWT.NULL); label.setText(HibernateConsoleMessages.NewConfigurationWizardPage_database_dialect); dialectCombo = new Combo(container, SWT.NULL); fillHerUp(dialectCombo, helper.getDialectNames() ); gd = new GridData(GridData.FILL_HORIZONTAL); gd.grabExcessHorizontalSpace = true; dialectCombo.setLayoutData(gd); dialectCombo.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { String[] driverClasses = helper.getDriverClasses(helper .getDialectClass(dialectCombo.getText() ) ); fillHerUp(driver_classCombo, driverClasses); dialogChanged(); } }); gd = new GridData(GridData.BEGINNING, GridData.CENTER, false,false); gd.horizontalAlignment = SWT.TOP; gd.verticalAlignment = SWT.TOP; label.setLayoutData(gd); Composite driverManagerTabContainer = container; label = new Label(driverManagerTabContainer, SWT.NULL); label.setText(HibernateConsoleMessages.NewConfigurationWizardPage_driver_class); driver_classCombo = new Combo(driverManagerTabContainer, SWT.NULL); driver_classCombo.select(0); gd = new GridData(GridData.FILL_HORIZONTAL); gd.grabExcessHorizontalSpace = true; driver_classCombo.setLayoutData(gd); driver_classCombo.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { String[] connectionURLS = helper .getConnectionURLS(driver_classCombo.getText() ); fillHerUp(urlCombo, connectionURLS); dialogChanged(); } }); label = new Label(driverManagerTabContainer, SWT.NULL); label.setText(HibernateConsoleMessages.NewConfigurationWizardPage_connection_url); urlCombo = new Combo(driverManagerTabContainer, SWT.NULL); urlCombo.select(0); gd = new GridData(GridData.FILL_HORIZONTAL); gd.grabExcessHorizontalSpace = true; urlCombo.setLayoutData(gd); urlCombo.addModifyListener(listener); label = new Label(driverManagerTabContainer, SWT.NULL); label.setText(HibernateConsoleMessages.NewConfigurationWizardPage_default_schema); defaultSchemaText = new Text(driverManagerTabContainer, SWT.BORDER | SWT.SINGLE); gd = new GridData(GridData.FILL_HORIZONTAL); defaultSchemaText.setLayoutData(gd); defaultSchemaText.addModifyListener(listener); label = new Label(driverManagerTabContainer, SWT.NULL); label.setText(HibernateConsoleMessages.NewConfigurationWizardPage_default_catalog); defaultCatalogText = new Text(driverManagerTabContainer, SWT.BORDER | SWT.SINGLE); gd = new GridData(GridData.FILL_HORIZONTAL); defaultCatalogText.setLayoutData(gd); defaultCatalogText.addModifyListener(listener); label = new Label(driverManagerTabContainer, SWT.NULL); label.setText(HibernateConsoleMessages.NewConfigurationWizardPage_user_name); usernameText = new Text(driverManagerTabContainer, SWT.BORDER | SWT.SINGLE); gd = new GridData(GridData.FILL_HORIZONTAL); usernameText.setLayoutData(gd); usernameText.addModifyListener(listener); label = new Label(driverManagerTabContainer, SWT.NULL); label.setText(HibernateConsoleMessages.NewConfigurationWizardPage_password); passwordText = new Text(driverManagerTabContainer, SWT.BORDER | SWT.SINGLE); gd = new GridData(GridData.FILL_HORIZONTAL); passwordText.setLayoutData(gd); passwordText.addModifyListener(listener); fillLabel(container); fillLabel(container); fillLabel(container); createConsoleConfiguration = new Button(container, SWT.CHECK); gd = new GridData(GridData.FILL_HORIZONTAL); createConsoleConfiguration.setLayoutData(gd); createConsoleConfiguration.setText(HibernateConsoleMessages.NewConfigurationWizardPage_create_console_configuration); createConsoleConfiguration.addSelectionListener(selectionListener); sc.setMinSize(container.computeSize(SWT.DEFAULT, SWT.DEFAULT)); initialize(); dialogChanged(); setControl(sc); sc.pack(); } /** * @param urlCombo2 */ private void fillHerUp(Combo combo, String[] newContent) { String original = combo.getText(); combo.removeAll(); for (int i = 0; i < newContent.length; i++) { String name = newContent[i]; combo.add(name); } combo.setText(original); } /** * @param container */ private void fillLabel(Composite container) { new Label(container, SWT.NULL); } /** * Tests if the current workbench selection is a suitable container to use. */ private void initialize() { updateStatus(null); /*if (selection != null && selection.isEmpty() == false && selection instanceof IStructuredSelection) { IStructuredSelection ssel = (IStructuredSelection) selection; if (ssel.size() > 1) return; Object obj = ssel.getFirstElement(); if (obj instanceof IResource) { IContainer container; if (obj instanceof IContainer) container = (IContainer) obj; else container = ( (IResource) obj).getParent(); containerText.setText(container.getFullPath().toString() ); } } fileText.setText("hibernate.cfg.xml");*/ } /** * Ensures that contents is ok. */ private void dialogChanged() { IResource container = ResourcesPlugin.getWorkspace().getRoot() .findMember(new Path(getContainerName() ) ); String fileName = getFileName(); if (getContainerName().length() == 0) { updateStatus(HibernateConsoleMessages.NewConfigurationWizardPage_file_container_must_be_specified); return; } if (container == null || (container.getType() & (IResource.PROJECT | IResource.FOLDER) ) == 0) { updateStatus(HibernateConsoleMessages.NewConfigurationWizardPage_file_container_must_exist); return; } if (!container.isAccessible() ) { updateStatus(HibernateConsoleMessages.NewConfigurationWizardPage_project_must_be_writable); return; } if (fileName.length() == 0) { updateStatus(HibernateConsoleMessages.NewConfigurationWizardPage_file_name_must_be_specified); return; } if (fileName.replace('\\', '/').indexOf('/', 1) > 0) { updateStatus(HibernateConsoleMessages.NewConfigurationWizardPage_file_name_must_be_valid); return; } // TODO: check for driver class availability. updateStatus(null); } private void updateStatus(String message) { setErrorMessage(message); setPageComplete(message == null && beenShown); } private String getContainerName() { return containerText.getText(); } private String getFileName() { return fileText.getText(); } /** * @return */ public String getSessionFactoryName() { return nullIfEmpty(sessionFactoryNameText.getText() ); } /** * @param text * @return */ private String nullIfEmpty(String text) { if (text != null && text.trim().length() > 0) { return text.trim(); } return null; } /** * @return */ public String getDialect() { return nullIfEmpty(helper.getDialectClass(dialectCombo.getText() ) ); } /** * @return */ public String getDriver() { return nullIfEmpty(driver_classCombo.getText() ); } /** * @return */ public String getConnectionURL() { return nullIfEmpty(urlCombo.getText() ); } /** * @return */ public String getUsername() { return nullIfEmpty(usernameText.getText() ); } /** * @return */ public String getPassword() { return nullIfEmpty(passwordText.getText() ); } /* (non-Javadoc) * @see org.eclipse.jface.dialogs.DialogPage#setVisible(boolean) */ public void setVisible(boolean visible) { containerText.setText(fileCreation.getContainerFullPath().toPortableString() ); fileText.setText(fileCreation.getFileName() ); super.setVisible(visible); if(visible) { sessionFactoryNameText.setFocus(); } beenShown = true; dialogChanged(); } public boolean isCreateConsoleConfigurationEnabled() { return createConsoleConfiguration.getSelection(); } public void setCreateConsoleConfigurationVisible(boolean isVisible) { // update visibility if button was created if (createConsoleConfiguration != null){ createConsoleConfiguration.setVisible(isVisible); } } public String getDefaultCatalog() { return nullIfEmpty(defaultCatalogText.getText()); } public String getDefaultSchema() { return nullIfEmpty(defaultSchemaText.getText()); } public String getConnectionProfileName() { return defaultConnectionProfile; } public void setConnectionProfileName(String selectedConnectionName) { this.defaultConnectionProfile = selectedConnectionName; } public void saveHibernateVersion() { hibernateVersion = hibernateVersionCombo.getText(); } public String getHibernateVersion() { return hibernateVersion; } private void fillPropertiesFromConnectionProfile(String cpName){ IConnectionProfile profile = ProfileManager.getInstance().getProfileByName(cpName); Properties p = getHibernateConnectionProperties(profile); driver_classCombo.setText(p.getProperty("hibernate.connection.driver_class")); //$NON-NLS-1$ urlCombo.setText(p.getProperty("hibernate.connection.url")); //$NON-NLS-1$ if (p.containsKey("hibernate.connection.username")){ //$NON-NLS-1$ usernameText.setText(p.getProperty("hibernate.connection.username")); //$NON-NLS-1$ } if (p.containsKey("hibernate.connection.password")){ //$NON-NLS-1$ passwordText.setText(p.getProperty("hibernate.connection.password")); //$NON-NLS-1$ } /*this causes very long timeouts when db is not started String dialect = ConnectionProfileUtil.autoDetectDialect(p); if (dialect != null){ dialectCombo.setText(dialect); }*/ } private Properties getHibernateConnectionProperties(IConnectionProfile profile){ Properties props = new Properties(); if (profile != null) { final Properties cpProperties = profile.getProperties(profile.getProviderId()); String driverClass = ConnectionProfileUtil.getDriverClass(profile.getName()); props.setProperty("hibernate.connection.driver_class", driverClass); //$NON-NLS-1$ String url = cpProperties.getProperty(IJDBCDriverDefinitionConstants.URL_PROP_ID); props.setProperty("hibernate.connection.url", url); //$NON-NLS-1$ String user = cpProperties.getProperty(IJDBCDriverDefinitionConstants.USERNAME_PROP_ID); if (null != user && user.length() > 0) { props.setProperty("hibernate.connection.username", user); //$NON-NLS-1$ } String pass = cpProperties.getProperty(IJDBCDriverDefinitionConstants.PASSWORD_PROP_ID); if (null != pass && pass.length() > 0) { props.setProperty("hibernate.connection.password", pass); //$NON-NLS-1$ } } return props; } }