/*******************************************************************************
* Copyright (c) 2010 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributor:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.hibernate.eclipse.codegen;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IWorkspace;
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.debug.core.ILaunchConfiguration;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.ComboDialogField;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
import org.eclipse.ui.ide.undo.CreateFileOperation;
import org.eclipse.ui.ide.undo.WorkspaceUndoUtil;
import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
import org.hibernate.console.ConsoleConfiguration;
import org.hibernate.console.KnownConfigurations;
import org.hibernate.console.preferences.ConsoleConfigurationPreferences;
import org.hibernate.eclipse.console.HibernateConsoleMessages;
import org.hibernate.eclipse.console.utils.LaunchHelper;
import org.hibernate.eclipse.launch.CodeGenXMLFactory;
import org.hibernate.eclipse.launch.ExporterAttributes;
/**
* @author Vitali Yemialyanchyk
*/
@SuppressWarnings("restriction")
public class ExportAntCodeGenWizardPage extends WizardNewFileCreationPage implements Listener {
protected ComboDialogField consoleConfigurationName;
protected CodeGenXMLFactory codeGenXMLFactory = null;
/**
* Creates a new file creation (Ant code generation) wizard page. If the initial resource
* selection contains exactly one container resource then it will be used as the default
* container resource.
*
* @param pageName
* the name of the page
* @param selection
* the current resource selection
*/
public ExportAntCodeGenWizardPage(String pageName, IStructuredSelection selection) {
super(pageName, selection);
setPageComplete(false);
}
/**
* @see #setControl(Control)
*/
protected void setControl(Control newControl) {
newControl.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL
| GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));
super.setControl(newControl);
}
/**
* @see #createControl(Composite)
*/
public void createControl(Composite parent) {
initializeDialogUnits(parent);
Composite topLevel = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.numColumns = 1;
layout.marginWidth = 0;
topLevel.setLayout(layout);
topLevel.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL
| GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));
topLevel.setFont(parent.getFont());
setControlCombo(topLevel);
super.createControl(topLevel);
setControl(topLevel);
}
protected void setControlCombo(Control newControl) {
consoleConfigurationName = new ComboDialogField(SWT.READ_ONLY);
consoleConfigurationName
.setLabelText(HibernateConsoleMessages.ExportAntCodeGenWizardPage_hibernate_code_generation_configurations);
ILaunchConfiguration[] launchCfgs;
try {
launchCfgs = LaunchHelper.findFilteredCodeGenerationConfigsSorted();
} catch (CoreException e) {
launchCfgs = new ILaunchConfiguration[0];
}
String[] names = new String[launchCfgs.length];
for (int i = 0; i < launchCfgs.length; i++) {
ILaunchConfiguration launchCfg = launchCfgs[i];
names[i] = launchCfg.getName();
}
consoleConfigurationName.setItems(names);
IDialogFieldListener fieldlistener = new IDialogFieldListener() {
public void dialogFieldChanged(DialogField field) {
setPageComplete(validatePage());
}
};
consoleConfigurationName.setDialogFieldListener(fieldlistener);
consoleConfigurationName.doFillIntoGrid((Composite) newControl, 2);
}
/**
* @see #validatePage()
*/
protected boolean validatePage() {
boolean res = super.validatePage();
if (res) {
if (consoleConfigurationName.getSelectionIndex() == -1) {
setErrorMessage(HibernateConsoleMessages.ExportAntCodeGenWizardPage_empty_hibernate_code_generation_configuration);
res = false;
} else {
ILaunchConfiguration lc = getSelectedLaunchConfig();
if (lc == null) {
setErrorMessage(HibernateConsoleMessages.ExportAntCodeGenWizardPage_cannot_find_selected_hibernate_code_generation_configuration);
res = false;
} else {
String checkMessage = checkCodeGenLaunchConfig(lc);
if (checkMessage != null) {
setMessage(checkMessage, IMessageProvider.WARNING);
}
}
}
}
return res;
}
protected ConsoleConfigurationPreferences getConsoleConfigPreferences(String consoleConfigName) {
ConsoleConfiguration consoleConfig = KnownConfigurations.getInstance().find(consoleConfigName);
if (consoleConfig == null) {
return null;
}
return consoleConfig.getPreferences();
}
protected String checkCodeGenLaunchConfig(ILaunchConfiguration lc) {
String checkMessage = null;
ExporterAttributes attributes = null;
try {
attributes = new ExporterAttributes(lc);
checkMessage = attributes.checkExporterAttributes();
} catch (CoreException e) {
checkMessage = e.getMessage();
}
if (checkMessage != null) {
checkMessage = NLS.bind(HibernateConsoleMessages.ExportAntCodeGenWizardPage_error_in_hibernate_code_generation_configuration,
checkMessage);
}
if (checkMessage == null && attributes != null) {
String consoleConfigName = attributes.getConsoleConfigurationName();
ConsoleConfigurationPreferences consoleConfigPrefs =
getConsoleConfigPreferences(consoleConfigName);
String connProfileName = consoleConfigPrefs == null ? null :
consoleConfigPrefs.getConnectionProfileName();
if (!CodeGenXMLFactory.isEmpty(connProfileName)) {
IWorkspace workspace = ResourcesPlugin.getWorkspace();
String externalPropFileName = CodeGenXMLFactory.propFileNameSuffix;
externalPropFileName = getFileName() + "." + externalPropFileName; //$NON-NLS-1$
String problemMessage = NLS.bind(HibernateConsoleMessages.ExportAntCodeGenWizardPage_warning,
externalPropFileName);
IPath resourcePath = getContainerFullPath().append(externalPropFileName);
if (workspace.getRoot().getFile(resourcePath).exists()) {
checkMessage = problemMessage;
}
}
}
return checkMessage;
}
public ILaunchConfiguration getSelectedLaunchConfig() {
ILaunchConfiguration[] launchCfgs;
try {
launchCfgs = LaunchHelper.findFilteredCodeGenerationConfigsSorted();
} catch (CoreException e) {
launchCfgs = new ILaunchConfiguration[0];
}
int n = consoleConfigurationName.getSelectionIndex();
if (0 <= n && n < launchCfgs.length) {
return launchCfgs[n];
}
return null;
}
protected InputStream getInitialContents() {
ILaunchConfiguration lc = getSelectedLaunchConfig();
if (lc == null) {
return null;
}
codeGenXMLFactory = new CodeGenXMLFactory(lc);
String externalPropFileName = CodeGenXMLFactory.getExternalPropFileNameStandard(getFileName());
codeGenXMLFactory.setExternalPropFileName(externalPropFileName);
codeGenXMLFactory.setPlace2Generate(getContainerFullPath().toString());
IWorkspace workspace = ResourcesPlugin.getWorkspace();
if (workspace != null && workspace.getRoot() != null && workspace.getRoot().getLocation() != null) {
codeGenXMLFactory.setWorkspacePath(workspace.getRoot().getLocation().toString());
}
String buildXml = codeGenXMLFactory.createCodeGenXML();
return new ByteArrayInputStream(buildXml.getBytes());
}
public IFile createNewFile() {
codeGenXMLFactory = null;
IFile res = super.createNewFile();
if (codeGenXMLFactory != null && res != null) {
final String propFileContentPreSave = codeGenXMLFactory.getPropFileContentPreSave();
if (!CodeGenXMLFactory.isEmpty(propFileContentPreSave)) {
IPath path = res.getFullPath();
path = path.removeLastSegments(1);
path = path.append(codeGenXMLFactory.getExternalPropFileName());
final IFile newFileHandle = createFileHandle(path);
final InputStream initialContents = new ByteArrayInputStream(
propFileContentPreSave.getBytes());
IRunnableWithProgress op = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) {
CreateFileOperation op = new CreateFileOperation(newFileHandle, null,
initialContents,
IDEWorkbenchMessages.WizardNewFileCreationPage_title);
try {
// see bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=219901
// directly execute the operation so that the undo state is
// not preserved. Making this undoable resulted in too many
// accidental file deletions.
op.execute(monitor, WorkspaceUndoUtil.getUIInfoAdapter(getShell()));
} catch (final ExecutionException e) {
getContainer().getShell().getDisplay().syncExec(new Runnable() {
public void run() {
if (e.getCause() instanceof CoreException) {
ErrorDialog
.openError(
getContainer().getShell(), // Was
// Utilities.getFocusShell()
IDEWorkbenchMessages.WizardNewFileCreationPage_errorTitle,
null, // no special
// message
((CoreException) e.getCause()).getStatus());
} else {
IDEWorkbenchPlugin.log(getClass(),
"createNewFile()", e.getCause()); //$NON-NLS-1$
MessageDialog
.openError(
getContainer().getShell(),
IDEWorkbenchMessages.WizardNewFileCreationPage_internalErrorTitle,
NLS.bind(
IDEWorkbenchMessages.WizardNewFileCreationPage_internalErrorMessage,
e.getCause().getMessage()));
}
}
});
}
}
};
try {
getContainer().run(true, true, op);
} catch (InterruptedException e) {
} catch (InvocationTargetException e) {
// Execution Exceptions are handled above but we may still get
// unexpected runtime errors.
IDEWorkbenchPlugin.log(getClass(), "createNewFile()", e.getTargetException()); //$NON-NLS-1$
MessageDialog
.open(MessageDialog.ERROR,
getContainer().getShell(),
IDEWorkbenchMessages.WizardNewFileCreationPage_internalErrorTitle,
NLS.bind(
IDEWorkbenchMessages.WizardNewFileCreationPage_internalErrorMessage,
e.getTargetException().getMessage()), SWT.SHEET);
}
}
}
return res;
}
}