/*
* 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 org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.wizard.Wizard;
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.model.ITableFilter;
import org.hibernate.eclipse.console.utils.EclipseImages;
/**
* Creates a new reveng.xml
*/
public class NewReverseEngineeringFileWizard extends Wizard implements INewWizard {
private IStructuredSelection selection;
private WizardNewFileCreationPage cPage;
private TableFilterWizardPage tableFilterWizardPage;
private IPath createdFile;
private String selectedConfiguratonName;
/**
* Constructor for NewConfigurationWizard.
*/
public NewReverseEngineeringFileWizard() {
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);
}
boolean firstTime = true;
public void setVisible(boolean visible) {
super.setVisible(visible);
if(firstTime) {
validatePage();
firstTime = false;
}
}
}
/**
* Adding the page to the wizard.
*/
public void addPages() {
if (selection == null) {
selection = new StructuredSelection();
}
cPage = new ExtendedWizardNewFileCreationPage( "Ccfgxml", selection ); //$NON-NLS-1$
cPage.setTitle( HibernateConsoleMessages.NewReverseEngineeringFileWizard_create_hibernate_reverse_engineering_file );
cPage.setDescription( HibernateConsoleMessages.NewReverseEngineeringFileWizard_create_new_hibernate_reveng_xml );
cPage.setFileName("hibernate.reveng.xml"); //$NON-NLS-1$
addPage( cPage );
tableFilterWizardPage = new TableFilterWizardPage( "revengtable", selectedConfiguratonName ); //$NON-NLS-1$
addPage( tableFilterWizardPage );
}
/**
* 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() {
createdFile = cPage.getContainerFullPath().append(cPage.getFileName());
final IFile file = cPage.createNewFile();
IRunnableWithProgress op = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException {
try {
doFinish(file, 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.NewReverseEngineeringFileWizard_error, realException);
return false;
}
return true;
}
/**
* 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 doFinish(
final IFile file, IProgressMonitor monitor)
throws CoreException {
// create a sample file
monitor.beginTask(HibernateConsoleMessages.NewReverseEngineeringFileWizard_creating + file.getName(), 2);
try {
InputStream stream = openContentStream();
if (file.exists() ) {
file.setContents(stream, true, true, monitor);
} else {
file.create(stream, true, monitor);
}
stream.close();
} catch (IOException e) {
}
monitor.worked(1);
monitor.setTaskName(HibernateConsoleMessages.NewReverseEngineeringFileWizard_opening_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);
}
private InputStream openContentStream() {
StringWriter sw = new StringWriter();
sw.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" + //$NON-NLS-1$
"<!DOCTYPE hibernate-reverse-engineering PUBLIC \"-//Hibernate/Hibernate Reverse Engineering DTD 3.0//EN\" \"http://hibernate.sourceforge.net/hibernate-reverse-engineering-3.0.dtd\" >\r\n" + //$NON-NLS-1$
"\r\n" + //$NON-NLS-1$
"<hibernate-reverse-engineering>\r\n"); //$NON-NLS-1$
ITableFilter[] filters = tableFilterWizardPage.getTableFilters();
for (int i = 0; i < filters.length; i++) {
ITableFilter filter = filters[i];
sw.write(" <table-filter"); //$NON-NLS-1$
if(!".*".equals(filter.getMatchCatalog())) { //$NON-NLS-1$
sw.write(" match-catalog=\"" + filter.getMatchCatalog() + "\""); //$NON-NLS-1$//$NON-NLS-2$
}
if(!".*".equals(filter.getMatchSchema())) { //$NON-NLS-1$
sw.write(" match-schema=\"" + filter.getMatchSchema() + "\""); //$NON-NLS-1$ //$NON-NLS-2$
}
sw.write(" match-name=\"" + filter.getMatchName() + "\""); //$NON-NLS-1$//$NON-NLS-2$
if(filter.getExclude().booleanValue()) {
sw.write(" exclude=\"" + filter.getExclude().booleanValue() + "\""); //$NON-NLS-1$ //$NON-NLS-2$
}
sw.write("/>\r\n"); //$NON-NLS-1$
}
sw.write("</hibernate-reverse-engineering>"); //$NON-NLS-1$
try {
return new ByteArrayInputStream(sw.toString().getBytes("UTF-8") ); //$NON-NLS-1$
} catch (UnsupportedEncodingException uec) {
HibernateConsolePlugin.getDefault().logErrorMessage(HibernateConsoleMessages.NewReverseEngineeringFileWizard_problems_converting_to_utf8, uec);
return new ByteArrayInputStream(sw.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) {
if (selection == null) {
selection = new StructuredSelection();
}
this.selection = selection;
}
public IPath getCreatedFilePath() {
return createdFile;
}
public void setSelectConfiguration(String configurationName) {
this.selectedConfiguratonName = configurationName;
}
}