diff options
4 files changed, 44 insertions, 30 deletions
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaProject.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaProject.java index 789167e137..e168e0165a 100644 --- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaProject.java +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/JpaProject.java @@ -196,6 +196,9 @@ public class JpaProject extends JpaEObject implements IJpaProject } }; + if (this.project == null) { + throw new IllegalStateException("Project can not be null when the Resynch Job is built"); + } job.setRule(this.project); return job; } diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/PersistenceUnitContext.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/PersistenceUnitContext.java index becb682b17..d2f38cdc05 100644 --- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/PersistenceUnitContext.java +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/platform/PersistenceUnitContext.java @@ -37,6 +37,7 @@ import org.eclipse.jpt.core.internal.validation.JpaValidationMessages; import org.eclipse.jpt.utility.internal.CollectionTools; import org.eclipse.jpt.utility.internal.HashBag; import org.eclipse.jpt.utility.internal.StringTools; +import org.eclipse.jpt.utility.internal.iterators.CloneIterator; import org.eclipse.jpt.utility.internal.iterators.CompositeIterator; import org.eclipse.jpt.utility.internal.iterators.EmptyIterator; import org.eclipse.jpt.utility.internal.iterators.TransformationIterator; @@ -191,7 +192,7 @@ public class PersistenceUnitContext extends BaseContext } protected Iterator<JavaPersistentType> listedJavaPersistentTypes() { - return new TransformationIterator<JavaClassRef, JavaPersistentType>(persistenceUnit.getClasses().iterator()) { + return new TransformationIterator<JavaClassRef, JavaPersistentType>(new CloneIterator<JavaClassRef>(persistenceUnit.getClasses())) { @Override protected JavaPersistentType transform(JavaClassRef next) { return javaPersistentTypeFor(next); diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/synch/SynchronizeClassesJob.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/synch/SynchronizeClassesJob.java index 36cf1455d1..5c77aaea8d 100644 --- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/synch/SynchronizeClassesJob.java +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/synch/SynchronizeClassesJob.java @@ -50,6 +50,7 @@ public class SynchronizeClassesJob extends Job public SynchronizeClassesJob(IFile file) { super(JptCoreMessages.SYNCHRONIZE_CLASSES_JOB); + setRule(file.getProject()); persistenceXmlFile = file; } diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/generic/EntitiesGenerator.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/generic/EntitiesGenerator.java index 05fe71c01b..ee8cbe0ed2 100644 --- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/generic/EntitiesGenerator.java +++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/generic/EntitiesGenerator.java @@ -9,16 +9,19 @@ *******************************************************************************/ package org.eclipse.jpt.ui.internal.generic; +import java.lang.reflect.InvocationTargetException; import java.util.Collection; - -import org.eclipse.core.resources.IWorkspaceRunnable; import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.resources.WorkspaceJob; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.OperationCanceledException; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.window.Window; import org.eclipse.jface.wizard.WizardDialog; @@ -38,6 +41,9 @@ import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.actions.WorkspaceModifyOperation; +import org.eclipse.ui.progress.IProgressService; /** * EntitiesGenerator @@ -75,7 +81,7 @@ public class EntitiesGenerator dialog.create(); int returnCode = dialog.open(); if (returnCode == Window.OK) { - IWorkspaceRunnable runnable = new GenerateEntitiesRunnable( + WorkspaceJob runnable = new GenerateEntitiesRunnable( wizard.getPackageGeneratorConfig(), wizard.getEntityGeneratorConfig(), wizard.getSelectedTables(), @@ -83,12 +89,8 @@ public class EntitiesGenerator project, new OverwriteConfirmer(this.getCurrentShell()) ); - try { - // TODO pass in real ProgressMonitor - ResourcesPlugin.getWorkspace().run(runnable, new NullProgressMonitor()); - } catch (CoreException ex) { - throw new RuntimeException(ex); - } + + runnable.schedule(); } } @@ -98,7 +100,7 @@ public class EntitiesGenerator // ********** runnable ********** - static class GenerateEntitiesRunnable implements IWorkspaceRunnable { + static class GenerateEntitiesRunnable extends WorkspaceJob { private final PackageGenerator.Config packageConfig; private final EntityGenerator.Config entityConfig; private final Collection selectedTables; @@ -114,31 +116,31 @@ public class EntitiesGenerator IJpaProject project, EntityGenerator.OverwriteConfirmer overwriteConfirmer ) { - super(); + super("Generating Entities"); this.packageConfig = packageConfig; this.entityConfig = entityConfig; this.selectedTables = selectedTables; this.synchronizePersistenceXml = synchronizePersistenceXml; this.overwriteConfirmer = overwriteConfirmer; this.project = project; + setRule(project.getProject()); } - public void run(IProgressMonitor monitor) throws CoreException { - monitor.beginTask("", 1000); - try { - PackageGenerator.generateEntities(this.packageConfig, this.entityConfig, this.selectedTables, this.overwriteConfirmer, monitor); - if (synchronizePersistenceXml) { - // we currently only support *one* persistence.xml file per project - IJpaFile resource = project.getPlatform().validPersistenceXmlFiles().next(); - if (resource != null) { - SynchronizeClassesJob job = new SynchronizeClassesJob(resource.getFile()); - job.schedule(); - } + @Override + public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException { + PackageGenerator.generateEntities(this.packageConfig, this.entityConfig, this.selectedTables, this.overwriteConfirmer, monitor); + //force resourceChangeEvents to be posted before synchronizing persistence.xml + ResourcesPlugin.getWorkspace().checkpoint(false); + if (synchronizePersistenceXml) { + // we currently only support *one* persistence.xml file per project + IJpaFile resource = project.getPlatform().validPersistenceXmlFiles().next(); + if (resource != null) { + SynchronizeClassesJob job = new SynchronizeClassesJob(resource.getFile()); + job.schedule(); } - } catch (OperationCanceledException ex) { - // fall through and tell monitor we are done } - monitor.done(); + + return Status.OK_STATUS; } } @@ -155,7 +157,7 @@ public class EntitiesGenerator this.shell = shell; } - public boolean overwrite(String className) { + public boolean overwrite(final String className) { if (this.overwriteAll) { return true; } @@ -166,8 +168,15 @@ public class EntitiesGenerator } private boolean promptUser(String className) { - OverwriteConfirmerDialog dialog = new OverwriteConfirmerDialog(this.shell, className); - if (dialog.open() == Window.CANCEL) { + + final OverwriteConfirmerDialog dialog = new OverwriteConfirmerDialog(this.shell, className); + //get on the UI thread synchronously, need feedback before continuing + shell.getDisplay().syncExec(new Runnable() { + public void run() { + dialog.open(); + } + }); + if (dialog.getReturnCode() == Window.CANCEL) { throw new OperationCanceledException(); } if (dialog.yes()) { |