blob: c958915b21d8c24994101c4521b977727a21a499 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2008 Oracle. All rights reserved.
* This program and the accompanying materials are 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.
*
* Contributors:
* Oracle - initial API and implementation
******************************************************************************/
package org.eclipse.jpt.ui.internal.platform.base;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.WorkspaceJob;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.jpt.core.JpaProject;
import org.eclipse.jpt.core.context.persistence.PersistenceXml;
import org.eclipse.jpt.core.internal.synch.SynchronizeClassesJob;
import org.eclipse.jpt.gen.internal.old.EntityGenerator;
import org.eclipse.jpt.gen.internal.old.PackageGenerator;
import org.eclipse.jpt.ui.internal.JptUiMessages;
import org.eclipse.jpt.ui.internal.wizards.GenerateEntitiesWizard;
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.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
/**
* EntitiesGenerator
*/
public class EntitiesGenerator {
private JpaProject project;
private IStructuredSelection selection;
// ********** construction **********
static public void generate(JpaProject project, IStructuredSelection selection) {
new EntitiesGenerator(project, selection).generate();
}
private EntitiesGenerator(JpaProject project, IStructuredSelection selection) {
super();
if (project == null) {
throw new NullPointerException();
}
this.project = project;
this.selection = selection;
}
// ********** generate **********
/**
* prompt the user with a wizard;
* schedule a job to generate the entities;
* optionally schedule a job to synchronize persistence.xml to
* run afterwards
*/
protected void generate() {
GenerateEntitiesWizard wizard = new GenerateEntitiesWizard(this.project, this.selection);
WizardDialog dialog = new WizardDialog(this.getCurrentShell(), wizard);
dialog.create();
int returnCode = dialog.open();
if (returnCode != Window.OK) {
return;
}
PackageGenerator.Config pConfig = wizard.getPackageGeneratorConfig();
EntityGenerator.Config eConfig = wizard.getEntityGeneratorConfig();
eConfig.setOverwriteConfirmer(new OverwriteConfirmer(this.getCurrentShell()));
WorkspaceJob genEntitiesJob = new GenerateEntitiesJob(pConfig, eConfig);
WorkspaceJob synchClassesJob = null;
if (wizard.synchronizePersistenceXml()) {
// we currently only support *one* persistence.xml file per project
PersistenceXml persistenceXml = this.project.getRootContextNode().getPersistenceXml();
if (persistenceXml != null) {
// TODO casting to IFile - just trying to get rid of all compiler errors for now
synchClassesJob = new SynchronizeClassesJob((IFile) persistenceXml.getResource());
}
}
genEntitiesJob.schedule();
if (synchClassesJob != null) {
synchClassesJob.schedule();
}
}
private Shell getCurrentShell() {
return Display.getCurrent().getActiveShell();
}
// ********** generate entities job **********
static class GenerateEntitiesJob extends WorkspaceJob {
private final PackageGenerator.Config packageConfig;
private final EntityGenerator.Config entityConfig;
GenerateEntitiesJob(
PackageGenerator.Config packageConfig,
EntityGenerator.Config entityConfig
) {
super(JptUiMessages.EntitiesGenerator_jobName);
this.packageConfig = packageConfig;
this.entityConfig = entityConfig;
this.setRule(packageConfig.getPackageFragment().getJavaProject().getProject());
}
@Override
public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
PackageGenerator.generateEntities(this.packageConfig, this.entityConfig, monitor);
return Status.OK_STATUS;
}
}
// ********** overwrite confirmer **********
static class OverwriteConfirmer implements EntityGenerator.OverwriteConfirmer {
private Shell shell;
private boolean overwriteAll = false;
private boolean skipAll = false;
OverwriteConfirmer(Shell shell) {
super();
this.shell = shell;
}
public boolean overwrite(final String className) {
if (this.overwriteAll) {
return true;
}
if (this.skipAll) {
return false;
}
return this.promptUser(className);
}
private boolean promptUser(String className) {
final OverwriteConfirmerDialog dialog = new OverwriteConfirmerDialog(this.shell, className);
// get on the UI thread synchronously, need feedback before continuing
this.shell.getDisplay().syncExec(new Runnable() {
public void run() {
dialog.open();
}
});
if (dialog.getReturnCode() == Window.CANCEL) {
throw new OperationCanceledException();
}
if (dialog.yes()) {
return true;
}
if (dialog.yesToAll()) {
this.overwriteAll = true;
return true;
}
if (dialog.no()) {
return false;
}
if (dialog.noToAll()) {
this.skipAll = true;
return false;
}
throw new IllegalStateException();
}
}
// ********** overwrite dialog **********
static class OverwriteConfirmerDialog extends Dialog {
private final String className;
private boolean yes = false;
private boolean yesToAll = false;
private boolean no = false;
private boolean noToAll = false;
OverwriteConfirmerDialog(Shell parent, String className) {
super(parent);
this.className = className;
}
@Override
protected void configureShell(Shell shell) {
super.configureShell(shell);
shell.setText(JptUiMessages.OverwriteConfirmerDialog_title);
}
@Override
protected Control createDialogArea(Composite parent) {
Composite composite = (Composite) super.createDialogArea(parent);
GridLayout gridLayout = (GridLayout) composite.getLayout();
gridLayout.numColumns = 2;
Label text = new Label(composite, SWT.LEFT);
text.setText(NLS.bind(JptUiMessages.OverwriteConfirmerDialog_text, this.className));
text.setLayoutData(new GridData());
return composite;
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
this.createButton(parent, IDialogConstants.YES_ID, IDialogConstants.YES_LABEL, false);
this.createButton(parent, IDialogConstants.YES_TO_ALL_ID, IDialogConstants.YES_TO_ALL_LABEL, false);
this.createButton(parent, IDialogConstants.NO_ID, IDialogConstants.NO_LABEL, true);
this.createButton(parent, IDialogConstants.NO_TO_ALL_ID, IDialogConstants.NO_TO_ALL_LABEL, false);
this.createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
}
@Override
protected void buttonPressed(int buttonId) {
switch (buttonId) {
case IDialogConstants.YES_ID :
this.yesPressed();
break;
case IDialogConstants.YES_TO_ALL_ID :
this.yesToAllPressed();
break;
case IDialogConstants.NO_ID :
this.noPressed();
break;
case IDialogConstants.NO_TO_ALL_ID :
this.noToAllPressed();
break;
case IDialogConstants.CANCEL_ID :
this.cancelPressed();
break;
default :
break;
}
}
private void yesPressed() {
this.yes = true;
this.setReturnCode(OK);
this.close();
}
private void yesToAllPressed() {
this.yesToAll = true;
this.setReturnCode(OK);
this.close();
}
private void noPressed() {
this.no = true;
this.setReturnCode(OK);
this.close();
}
private void noToAllPressed() {
this.noToAll = true;
this.setReturnCode(OK);
this.close();
}
boolean yes() {
return this.yes;
}
boolean yesToAll() {
return this.yesToAll;
}
boolean no() {
return this.no;
}
boolean noToAll() {
return this.noToAll;
}
}
}