Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCamille Letavernier2014-07-21 15:43:31 +0000
committerGerrit Code Review @ Eclipse.org2014-07-21 15:43:31 +0000
commita3846c88c1c9bb8764153a8b2162bad106d21a38 (patch)
tree3076c045059c3f0cc7d059246cbec46583814ff6 /extraplugins
parent5ab06e3232056fdea6708b153e2c22d4b99eaa14 (diff)
parentb254781fb01527bdab7a2bd6357825166f7e6b26 (diff)
downloadorg.eclipse.papyrus-a3846c88c1c9bb8764153a8b2162bad106d21a38.tar.gz
org.eclipse.papyrus-a3846c88c1c9bb8764153a8b2162bad106d21a38.tar.xz
org.eclipse.papyrus-a3846c88c1c9bb8764153a8b2162bad106d21a38.zip
Merge "431618: [Model Validation View] Problems on deleted elements become zombies https://bugs.eclipse.org/bugs/show_bug.cgi?id=431618"
Diffstat (limited to 'extraplugins')
-rw-r--r--extraplugins/cdo/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/markers/CDOMarkerProvider.java112
1 files changed, 110 insertions, 2 deletions
diff --git a/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/markers/CDOMarkerProvider.java b/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/markers/CDOMarkerProvider.java
index 59b26693f43..ea4a6ed3cd1 100644
--- a/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/markers/CDOMarkerProvider.java
+++ b/extraplugins/cdo/org.eclipse.papyrus.cdo.ui/src/org/eclipse/papyrus/cdo/internal/ui/markers/CDOMarkerProvider.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2013 CEA LIST.
+ * Copyright (c) 2013, 2014 CEA LIST and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
@@ -8,13 +8,17 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus (CEA) - bug 431618
+ *
*****************************************************************************/
package org.eclipse.papyrus.cdo.internal.ui.markers;
import java.util.Collection;
import java.util.Iterator;
+import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.emf.cdo.eresource.CDOResource;
@@ -28,6 +32,9 @@ import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.transaction.RunnableWithResult;
import org.eclipse.emf.transaction.util.TransactionUtil;
+import org.eclipse.gmf.runtime.common.core.command.AbstractCommand;
+import org.eclipse.gmf.runtime.common.core.command.CommandResult;
+import org.eclipse.gmf.runtime.common.core.command.ICommand;
import org.eclipse.papyrus.cdo.internal.ui.Activator;
import org.eclipse.papyrus.cdo.validation.problems.EProblem;
import org.eclipse.papyrus.cdo.validation.problems.edit.ProblemEditUtil;
@@ -35,6 +42,7 @@ import org.eclipse.papyrus.cdo.validation.problems.util.ProblemsManager;
import org.eclipse.papyrus.infra.core.resource.ModelSet;
import org.eclipse.papyrus.infra.services.markerlistener.IPapyrusMarker;
import org.eclipse.papyrus.infra.services.markerlistener.providers.AbstractMarkerProvider;
+import org.eclipse.papyrus.infra.services.markerlistener.providers.IMarkerProvider2;
import org.eclipse.papyrus.infra.services.markerlistener.util.MarkerListenerUtils;
import com.google.common.base.Predicate;
@@ -45,7 +53,7 @@ import com.google.common.collect.Lists;
/**
* This is the CDOMarkerProvider type. Enjoy.
*/
-public class CDOMarkerProvider extends AbstractMarkerProvider {
+public class CDOMarkerProvider extends AbstractMarkerProvider implements IMarkerProvider2 {
private final ProblemEditUtil defaultUtil = new ProblemEditUtil(new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE));
@@ -53,15 +61,18 @@ public class CDOMarkerProvider extends AbstractMarkerProvider {
super();
}
+ @Override
public boolean canProvideMarkersFor(Resource resource) {
return resource instanceof CDOResource;
}
+ @Override
public Collection<? extends IPapyrusMarker> getMarkers(final Resource resource, final String type, final boolean includeSubtypes) throws CoreException {
// run in a read-only transaction because the problems manager accesses
// a cross-reference adapter
return run(resource, CoreException.class, new RunnableWithResult.Impl<Collection<? extends IPapyrusMarker>>() {
+ @Override
public void run() {
setResult(Lists.newArrayList(Iterators.transform( //
getProblems(resource, type, includeSubtypes), //
@@ -78,6 +89,7 @@ public class CDOMarkerProvider extends AbstractMarkerProvider {
} else if(includeSubtypes) {
filter = new Predicate<EProblem>() {
+ @Override
public boolean apply(EProblem input) {
return MarkerListenerUtils.isMarkerTypeSubtypeOf(input.getType(), type);
}
@@ -85,6 +97,7 @@ public class CDOMarkerProvider extends AbstractMarkerProvider {
} else {
filter = new Predicate<EProblem>() {
+ @Override
public boolean apply(EProblem input) {
return type.equals(input.getType());
}
@@ -102,6 +115,7 @@ public class CDOMarkerProvider extends AbstractMarkerProvider {
// (the problems model is not stored in a resource)
run(resource, CoreException.class, new Runnable() {
+ @Override
public void run() {
try {
basicCreateMarkers(resource, diagnostic, monitor);
@@ -145,6 +159,7 @@ public class CDOMarkerProvider extends AbstractMarkerProvider {
// (the problems model is not stored in a resource)
run(object.eResource(), CoreException.class, new Runnable() {
+ @Override
public void run() {
try {
basicDeleteMarkers(object, monitor, type, includeSubtypes);
@@ -159,6 +174,7 @@ public class CDOMarkerProvider extends AbstractMarkerProvider {
super.deleteMarkers(object, monitor, type, includeSubtypes);
}
+ @Override
public void deleteMarkers(final Resource resource, IProgressMonitor monitor) {
try {
this.deleteMarkers(resource, monitor, null, true);
@@ -167,6 +183,7 @@ public class CDOMarkerProvider extends AbstractMarkerProvider {
}
}
+ @Override
public void deleteMarkers(final Resource resource, IProgressMonitor monitor, final String markerType, final boolean includeSubtypes) throws CoreException {
SubMonitor sub = SubMonitor.convert(monitor, IProgressMonitor.UNKNOWN);
@@ -176,6 +193,7 @@ public class CDOMarkerProvider extends AbstractMarkerProvider {
// (the problems model is not stored in a resource)
run(resource, new Runnable() {
+ @Override
public void run() {
ProblemsManager mgr = getProblemsManager(resource);
if(markerType == null) {
@@ -193,6 +211,18 @@ public class CDOMarkerProvider extends AbstractMarkerProvider {
sub.done();
}
+ @Override
+ public boolean hasMarkers(Resource context, EObject object) {
+ ProblemsManager manager = getProblemsManager(context);
+
+ return (manager != null) && manager.getAllProblems(object).hasNext();
+ }
+
+ @Override
+ public ICommand getMarkerDeletionCommand(Resource context, EObject object) {
+ return new MarkerDeletionCommand(context, object);
+ }
+
private ProblemsManager getProblemsManager(Resource resource) {
return ProblemsManager.getProblemsManager(resource.getResourceSet());
}
@@ -249,4 +279,82 @@ public class CDOMarkerProvider extends AbstractMarkerProvider {
return result;
}
+ //
+ // Nested types
+ //
+
+ private class MarkerDeletionCommand extends AbstractCommand {
+
+ private Resource context;
+
+ private EObject object;
+
+ private Collection<? extends EProblem> problemsForUndo;
+
+ public MarkerDeletionCommand(Resource context, EObject object) {
+ super("Delete markers");
+
+ this.context = context;
+ this.object = object;
+ }
+
+ @Override
+ public void dispose() {
+ context = null;
+ object = null;
+ problemsForUndo = null;
+
+ super.dispose();
+ }
+
+ @Override
+ protected CommandResult doExecuteWithResult(IProgressMonitor progressMonitor, IAdaptable info) throws ExecutionException {
+ ProblemsManager manager = getProblemsManager(context);
+ Collection<EProblem> problems = Lists.newArrayList(manager.getAllProblems(object));
+ if(problems.isEmpty()) {
+ // Nothing to do
+ return CommandResult.newOKCommandResult();
+ }
+
+ for(EProblem problem : problems) {
+ ProblemsManager.delete(problem);
+ }
+
+ // Initialize undo information
+ problemsForUndo = problems;
+
+ return CommandResult.newOKCommandResult();
+ }
+
+ @Override
+ protected CommandResult doUndoWithResult(IProgressMonitor progressMonitor, IAdaptable info) throws ExecutionException {
+ if(problemsForUndo == null) {
+ // Nothing to do
+ return CommandResult.newOKCommandResult();
+ }
+
+ // Detach undo information
+ final Collection<? extends EProblem> problems = problemsForUndo;
+ problemsForUndo = null;
+
+ Resource resource = object.eResource();
+ if(resource != null) { // Should have been reattached by now
+ context = resource;
+ ProblemsManager manager = getProblemsManager(resource);
+ for(EProblem problem : problems) {
+ problem.setElement(object);
+ manager.addProblem(problem);
+ }
+ }
+
+ return CommandResult.newOKCommandResult();
+ }
+
+ @Override
+ protected CommandResult doRedoWithResult(IProgressMonitor progressMonitor, IAdaptable info) throws ExecutionException {
+ return doExecuteWithResult(progressMonitor, info);
+ }
+
+ }
+
}

Back to the top