/* * 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.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.StringWriter; import java.io.UnsupportedEncodingException; import java.lang.reflect.InvocationTargetException; import java.util.Properties; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.wizard.IWizardPage; import org.eclipse.jface.wizard.Wizard; import org.eclipse.osgi.util.NLS; import org.eclipse.ui.INewWizard; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWizard; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.WizardNewFileCreationPage; import org.eclipse.ui.ide.IDE; import org.hibernate.console.ImageConstants; import org.hibernate.eclipse.console.HibernateConsoleMessages; import org.hibernate.eclipse.console.HibernateConsolePlugin; import org.hibernate.eclipse.console.actions.AddConfigurationAction; import org.hibernate.eclipse.console.utils.EclipseImages; import org.jboss.tools.hibernate.runtime.spi.IExporter; import org.jboss.tools.hibernate.runtime.spi.IService; import org.jboss.tools.hibernate.runtime.spi.ServiceLookup; /** * Creates a new hibernate.cfg.xml */ public class NewConfigurationWizard extends Wizard implements INewWizard { private NewConfigurationWizardPage connectionInfoPage; private ISelection selection; private WizardNewFileCreationPage cPage; private ConsoleConfigurationWizardPage confPage; /** * Constructor for NewConfigurationWizard. */ public NewConfigurationWizard() { super(); setDefaultPageImageDescriptor(EclipseImages.getImageDescriptor(ImageConstants.NEW_WIZARD) ); setNeedsProgressMonitor(true); } /** extended to update status messages on first show **/ static class ExtendedWizardNewFileCreationPage extends WizardNewFileCreationPage { public ExtendedWizardNewFileCreationPage(String pageName, IStructuredSelection selection) { super(pageName, selection); setAllowExistingResources(false); } boolean firstTime = true; public void setVisible(boolean visible) { super.setVisible(visible); if(firstTime) { validatePage(); firstTime = false; } } @Override protected boolean validatePage() { if (super.validatePage()){ String fileName = getFileName(); if (!fileName.endsWith(".cfg.xml") ) { //$NON-NLS-1$ setMessage(HibernateConsoleMessages.NewConfigurationWizardPage_file_extension_should_be_cfgxml, WARNING); } else if (!fileName.equals(HibernateConsoleMessages.NewConfigurationWizardPage_filefile_name)){ setMessage(NLS.bind(HibernateConsoleMessages.NewConfigurationWizardPage_fileshould_pass_configuration, fileName), WARNING); } IPath path = getContainerFullPath().append(getFileName()); IContainer container = ResourcesPlugin.getWorkspace().getRoot().getFolder(path); try { if (container != null && container.getProject().hasNature(JavaCore.NATURE_ID)) { IJavaProject proj = JavaCore.create(container.getProject()); IPath projRelPath = container.getProjectRelativePath(); IPackageFragmentRoot[] roots; roots = proj.getAllPackageFragmentRoots(); boolean found = false; for (IPackageFragmentRoot root : roots) { if (root.isArchive()) continue; if (root.getResource() != null && root.getResource().getProjectRelativePath().isPrefixOf(projRelPath)){ if (!root.getResource().getProjectRelativePath().equals(projRelPath)){ //this is not "src" folder setMessage(NLS.bind(HibernateConsoleMessages.NewConfigurationWizardPage_fileshould_pass_configuration, fileName), WARNING); } found = true; break; } } if (!found){ setMessage(HibernateConsoleMessages.NewConfigurationWizardPage_fileoutside_classpath, WARNING); } } } catch (CoreException e) { HibernateConsolePlugin.getDefault().log(e); } return true; } return false; } } /** * Adding the page to the wizard. */ public void addPages() { cPage = new ExtendedWizardNewFileCreationPage( "Ccfgxml", (IStructuredSelection) selection ) { //$NON-NLS-1$ protected InputStream getInitialContents() { final Properties props = new Properties(); putIfNotNull(props, "hibernate.session_factory_name", connectionInfoPage.getSessionFactoryName() ); //$NON-NLS-1$ putIfNotNull(props, "hibernate.dialect", connectionInfoPage.getDialect() ); //$NON-NLS-1$ putIfNotNull(props, "hibernate.connection.driver_class", connectionInfoPage.getDriver() ); //$NON-NLS-1$ putIfNotNull(props, "hibernate.connection.url", connectionInfoPage.getConnectionURL() ); //$NON-NLS-1$ putIfNotNull(props, "hibernate.connection.username", connectionInfoPage.getUsername() ); //$NON-NLS-1$ putIfNotNull(props, "hibernate.connection.password", connectionInfoPage.getPassword() ); //$NON-NLS-1$ putIfNotNull(props, "hibernate.default_catalog", connectionInfoPage.getDefaultCatalog() ); //$NON-NLS-1$ putIfNotNull(props, "hibernate.default_schema", connectionInfoPage.getDefaultSchema() ); //$NON-NLS-1$ return openContentStream(props); } }; cPage.setTitle( HibernateConsoleMessages.NewConfigurationWizard_create_hibernate_cfg_file ); cPage.setDescription( HibernateConsoleMessages.NewConfigurationWizard_create_new_hibernate_cfg_xml ); cPage.setFileName("hibernate.cfg.xml"); //$NON-NLS-1$ cPage.setFileExtension("cfg.xml"); //$NON-NLS-1$ addPage( cPage ); connectionInfoPage = new NewConfigurationWizardPage(selection, cPage); addPage(connectionInfoPage); confPage = new ConsoleConfigurationWizardPage(selection); addPage(confPage); } /** * This method is called when 'Finish' button is pressed in * the wizard. We will create an operation and run it * using wizard as execution context. */ public boolean performFinish() { connectionInfoPage.saveHibernateVersion(); final Properties props = new Properties(); putIfNotNull(props, "hibernate.session_factory_name", connectionInfoPage.getSessionFactoryName() ); //$NON-NLS-1$ putIfNotNull(props, "hibernate.dialect", connectionInfoPage.getDialect() ); //$NON-NLS-1$ putIfNotNull(props, "hibernate.default_catalog", connectionInfoPage.getDefaultCatalog() ); //$NON-NLS-1$ putIfNotNull(props, "hibernate.default_schema", connectionInfoPage.getDefaultSchema() ); //$NON-NLS-1$ putIfNotNull(props, "hibernate.connection.driver_class", connectionInfoPage.getDriver() ); //$NON-NLS-1$ putIfNotNull(props, "hibernate.connection.url", connectionInfoPage.getConnectionURL() ); //$NON-NLS-1$ putIfNotNull(props, "hibernate.connection.username", connectionInfoPage.getUsername() ); //$NON-NLS-1$ putIfNotNull(props, "hibernate.connection.password", connectionInfoPage.getPassword() ); //$NON-NLS-1$ final IFile file = cPage.createNewFile(); IRunnableWithProgress op = new IRunnableWithProgress() { public void run(IProgressMonitor monitor) throws InvocationTargetException { try { createHibernateCfgXml(file, props, monitor); } catch (CoreException e) { throw new InvocationTargetException(e); } finally { monitor.done(); } } }; try { getContainer().run(true, false, op); } catch (InterruptedException e) { return false; } catch (InvocationTargetException e) { Throwable realException = e.getTargetException(); HibernateConsolePlugin.getDefault().showError(getShell(), HibernateConsoleMessages.NewConfigurationWizard_error, realException); return false; } try { if (connectionInfoPage.isCreateConsoleConfigurationEnabled()) { confPage.performFinish(); } else { AddConfigurationAction.deleteTemporaryLaunchConfigurations(); } } catch (CoreException ce) { HibernateConsolePlugin.getDefault().showError(getShell(), HibernateConsoleMessages.AddConfigurationAction_problem_add_console_config, ce); } return true; } public boolean performCancel() { try { confPage.performCancel(); } catch (CoreException ce) { HibernateConsolePlugin.getDefault().showError(getShell(), HibernateConsoleMessages.AddConfigurationAction_problem_add_console_config, ce); } return true; } /** * @param props * @param dialect * @param dialect2 */ private void putIfNotNull(Properties props, String key, String value) { if(value!=null) { props.put(key,value); } } /** * The worker method. It will find the container, create the * file if missing or just replace its contents, and open * the editor on the newly created file. * @param file * @param props */ private void createHibernateCfgXml( final IFile file, Properties props, IProgressMonitor monitor) throws CoreException { // create a sample file monitor.beginTask(HibernateConsoleMessages.NewConfigurationWizard_creating + file.getName(), 2); InputStream stream = openContentStream(props); if (file.exists() ) { file.setContents(stream, true, true, monitor); } else { file.create(stream, true, monitor); } try { stream.close(); } catch (IOException e) { } monitor.worked(1); monitor.setTaskName(HibernateConsoleMessages.NewConfigurationWizard_open_file_for_editing); getShell().getDisplay().asyncExec(new Runnable() { public void run() { IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); try { IDE.openEditor(page, file, true); } catch (PartInitException e) { } } }); monitor.worked(1); } /** * We will initialize file contents with a sample text. * @throws UnsupportedEncodingException */ private InputStream openContentStream(Properties props) { StringWriter stringWriter = new StringWriter(); IService service = ServiceLookup.findService(connectionInfoPage.getHibernateVersion()); IExporter hce = service.createExporter("org.hibernate.tool.hbm2x.HibernateConfigurationExporter"); //$NON-NLS-1$ hce.setCustomProperties(props); hce.setOutput(stringWriter); hce.start(); try { return new ByteArrayInputStream(stringWriter.toString().getBytes("UTF-8") ); //$NON-NLS-1$ } catch (UnsupportedEncodingException uec) { HibernateConsolePlugin.getDefault().logErrorMessage(HibernateConsoleMessages.NewConfigurationWizard_problems_converting_to_utf8, uec); return new ByteArrayInputStream(stringWriter.toString().getBytes() ); } } /** * We will accept the selection in the workbench to see if * we can initialize from it. * @see IWorkbenchWizard#init(IWorkbench, IStructuredSelection) */ public void init(IWorkbench workbench, IStructuredSelection selection) { this.selection = selection; if (!selection.isEmpty()){ IJavaProject jproj = null; if (selection.getFirstElement() instanceof IJavaProject) { jproj = (IJavaProject) selection.getFirstElement(); } if (selection.getFirstElement() instanceof IProject){ try { if (((IProject)selection.getFirstElement()).getNature(JavaCore.NATURE_ID) != null) { jproj = (IJavaProject)((IProject)selection.getFirstElement()).getNature(JavaCore.NATURE_ID); } } catch (CoreException e) { HibernateConsolePlugin.getDefault().log(e); } } if (jproj != null){ IPackageFragmentRoot[] roots; try { roots = jproj.getAllPackageFragmentRoots(); if (roots.length > 0){ this.selection = new StructuredSelection(roots[0]); } } catch (JavaModelException e) { HibernateConsolePlugin.getDefault().log(e); } }; } } public IWizardPage getNextPage(IWizardPage page) { if(page==connectionInfoPage) { if(!connectionInfoPage.isCreateConsoleConfigurationEnabled()) { return null; } confPage.setConfigurationFilePath(cPage.getContainerFullPath().append(cPage.getFileName())); } return super.getNextPage( page ); } public boolean canFinish() { if(!connectionInfoPage.isCreateConsoleConfigurationEnabled()) { return connectionInfoPage.isPageComplete(); } return super.canFinish(); } }