Просмотр исходного кода

Task Markers #706 (#1711)

* Task Markers #706

* #706 : ensure issue listeners will update on severity change

* Update DefaultValidationIssueStore.java

typo fixed
Andreas Mülder 7 лет назад
Родитель
Сommit
99d50e84fe

+ 6 - 0
plugins/org.yakindu.sct.model.resource/src/org/yakindu/sct/model/resource/SCTXtextIntegrationModule.java

@@ -20,6 +20,8 @@ import org.eclipse.xtext.ui.editor.validation.MarkerCreator;
 import org.eclipse.xtext.ui.label.DefaultDescriptionLabelProvider;
 import org.eclipse.xtext.ui.markers.IMarkerContributor;
 import org.eclipse.xtext.ui.tasks.TaskMarkerContributor;
+import org.eclipse.xtext.ui.tasks.TaskMarkerCreator;
+import org.eclipse.xtext.ui.tasks.TaskMarkerTypeProvider;
 import org.eclipse.xtext.ui.validation.MarkerTypeProvider;
 import org.eclipse.xtext.validation.IDiagnosticConverter;
 import org.eclipse.xtext.validation.IResourceValidator;
@@ -30,6 +32,8 @@ import org.yakindu.sct.model.sgraph.ui.validation.SCTMarkerTypeProvider;
 import org.yakindu.sct.model.stext.naming.StextNameProvider;
 import org.yakindu.sct.model.stext.resource.SCTResourceDescriptionStrategy;
 import org.yakindu.sct.model.stext.resource.SCTResourceValidatorImpl;
+import org.yakindu.sct.model.stext.ui.tasks.SCTTaskMarkerCreator;
+import org.yakindu.sct.model.stext.ui.tasks.SCTTaskMarkerTypeProvider;
 import org.yakindu.sct.ui.editor.editor.SCTFileEditorOpener;
 
 import com.google.inject.Binder;
@@ -58,5 +62,7 @@ public class SCTXtextIntegrationModule implements Module {
 		
 		binder.bind(IMarkerContributor.class).to(TaskMarkerContributor.class);
 		binder.bind(ITaskFinder.class).to(DomainSpecificTaskFinder.class);
+		binder.bind(TaskMarkerCreator.class).to(SCTTaskMarkerCreator.class);
+		binder.bind(TaskMarkerTypeProvider.class).to(SCTTaskMarkerTypeProvider.class);
 	}
 }

+ 1 - 0
plugins/org.yakindu.sct.model.sgraph.ui/src/org/yakindu/sct/model/sgraph/ui/validation/SCTMarkerType.java

@@ -18,6 +18,7 @@ public interface SCTMarkerType {
 	public final static String FAST_VALIDATION = "org.yakindu.sct.ui.editor.diagnostic.fast"; //$NON-NLS-1$
 	public final static String NORMAL_VALIDATION = "org.yakindu.sct.ui.editor.diagnostic.normal"; //$NON-NLS-1$
 	public final static String EXPENSIVE_VALIDATION = "org.yakindu.sct.ui.editor.diagnostic.expensive"; //$NON-NLS-1$
+	public static final String SCT_TASK_TYPE = "org.yakindu.sct.ui.editor.task"; //$NON-NLS-1$
 	
 	public static final String SEMANTIC_ELEMENT_ID = org.eclipse.gmf.runtime.common.core.resources.IMarker.ELEMENT_ID;
 			

+ 2 - 1
plugins/org.yakindu.sct.model.stext.ui/META-INF/MANIFEST.MF

@@ -51,5 +51,6 @@ Export-Package: org.yakindu.sct.model.stext.ui;
  org.yakindu.sct.model.stext.ui.internal;uses:="org.eclipse.ui.plugin,org.osgi.framework,com.google.inject",
  org.yakindu.sct.model.stext.ui.labeling;uses:="org.eclipse.emf.edit.ui.provider,org.eclipse.xtext.ui.label",
  org.yakindu.sct.model.stext.ui.outline;uses:="org.eclipse.xtext.ui.editor.outline.impl",
- org.yakindu.sct.model.stext.ui.quickfix;uses:="org.eclipse.xtext.ui.editor.quickfix"
+ org.yakindu.sct.model.stext.ui.quickfix;uses:="org.eclipse.xtext.ui.editor.quickfix",
+ org.yakindu.sct.model.stext.ui.tasks
 Bundle-Activator: org.yakindu.sct.model.stext.ui.internal.STextActivator

+ 6 - 0
plugins/org.yakindu.sct.model.stext.ui/src/org/yakindu/sct/model/stext/ui/STextUiModule.java

@@ -32,6 +32,8 @@ import org.eclipse.xtext.ui.resource.IResourceSetProvider;
 import org.eclipse.xtext.ui.resource.SimpleResourceSetProvider;
 import org.eclipse.xtext.ui.resource.XtextResourceSetProvider;
 import org.eclipse.xtext.ui.shared.Access;
+import org.eclipse.xtext.ui.tasks.TaskMarkerCreator;
+import org.eclipse.xtext.ui.tasks.TaskMarkerTypeProvider;
 import org.yakindu.base.utils.jface.help.CrossRefObjectTextHover;
 import org.yakindu.base.xtext.utils.jface.viewers.ParallelReadXtextDocument;
 import org.yakindu.sct.model.stext.ui.contentassist.AsyncContentAssistContextFactory;
@@ -41,6 +43,8 @@ import org.yakindu.sct.model.stext.ui.help.CustomCSSHelpHoverProvider;
 import org.yakindu.sct.model.stext.ui.help.STextUserHelpDocumentationProvider;
 import org.yakindu.sct.model.stext.ui.highlighting.SCTHighlightingConfiguration;
 import org.yakindu.sct.model.stext.ui.hyperlink.PackageImportHyperlinkHelper;
+import org.yakindu.sct.model.stext.ui.tasks.SCTTaskMarkerCreator;
+import org.yakindu.sct.model.stext.ui.tasks.SCTTaskMarkerTypeProvider;
 import org.yakindu.sct.model.stext.ui.tasks.STextTaskFinder;
 
 import com.google.inject.Binder;
@@ -84,6 +88,8 @@ public class STextUiModule extends org.yakindu.sct.model.stext.ui.AbstractSTextU
 		super.configure(binder);
 		binder.bind(String.class).annotatedWith(Names.named("stylesheet")).toInstance("/StextHoverStyleSheet.css");
 		binder.bind(XtextDocument.class).to(ParallelReadXtextDocument.class);
+		binder.bind(TaskMarkerCreator.class).to(SCTTaskMarkerCreator.class);
+		binder.bind(TaskMarkerTypeProvider.class).to(SCTTaskMarkerTypeProvider.class);
 	}
 
 	public com.google.inject.Provider<org.eclipse.xtext.resource.containers.IAllContainersState> provideIAllContainersState() {

+ 39 - 0
plugins/org.yakindu.sct.model.stext.ui/src/org/yakindu/sct/model/stext/ui/tasks/SCTTaskMarkerCreator.java

@@ -0,0 +1,39 @@
+/** 
+ * Copyright (c) 2017 committers of YAKINDU and others. 
+ * 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:
+ * committers of YAKINDU - initial API and implementation
+ *
+*/
+package org.yakindu.sct.model.stext.ui.tasks;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.xtext.tasks.Task;
+import org.eclipse.xtext.ui.tasks.TaskMarkerCreator;
+import org.yakindu.sct.model.stext.tasks.SCTTask;
+
+/**
+ * 
+ * @author andreas muelder - Initial contribution and API
+ * 
+ */
+@SuppressWarnings("restriction")
+public class SCTTaskMarkerCreator extends TaskMarkerCreator {
+
+	public static final String SCT_TASK_TYPE = "org.yakindu.sct.ui.editor.task"; //$NON-NLS-1$
+	public static final String SEMANTIC_ELEMENT_ID = org.eclipse.gmf.runtime.common.core.resources.IMarker.ELEMENT_ID;
+	
+	@Override
+	protected void setMarkerAttributes(Task task, IResource resource, IMarker marker) throws CoreException {
+		super.setMarkerAttributes(task, resource, marker);
+		if (task instanceof SCTTask) {
+			marker.setAttribute(SEMANTIC_ELEMENT_ID, ((SCTTask) task).getSemanticURI());
+		}
+	}
+
+}

+ 30 - 0
plugins/org.yakindu.sct.model.stext.ui/src/org/yakindu/sct/model/stext/ui/tasks/SCTTaskMarkerTypeProvider.java

@@ -0,0 +1,30 @@
+/** 
+ * Copyright (c) 2017 committers of YAKINDU and others. 
+ * 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:
+ * committers of YAKINDU - initial API and implementation
+ *
+*/
+package org.yakindu.sct.model.stext.ui.tasks;
+
+import org.eclipse.xtext.tasks.Task;
+import org.eclipse.xtext.ui.tasks.TaskMarkerTypeProvider;
+
+/**
+ * 
+ * @author andreas muelder - Initial contribution and API
+ * 
+ */
+@SuppressWarnings("restriction")
+public class SCTTaskMarkerTypeProvider extends TaskMarkerTypeProvider {
+
+	public static final String SCT_TASK_TYPE = "org.yakindu.sct.ui.editor.task"; //$NON-NLS-1$
+	
+	public String getMarkerType(Task task) {
+		return SCT_TASK_TYPE;
+	}
+
+}

+ 12 - 4
plugins/org.yakindu.sct.model.stext.ui/src/org/yakindu/sct/model/stext/ui/tasks/STextTaskFinder.java

@@ -17,6 +17,7 @@ import org.eclipse.emf.common.util.TreeIterator;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.xtext.tasks.DefaultTaskFinder;
 import org.eclipse.xtext.tasks.ITaskParser;
 import org.eclipse.xtext.tasks.ITaskTagProvider;
@@ -27,6 +28,7 @@ import org.yakindu.base.base.DocumentedElement;
 import org.yakindu.sct.model.sgraph.SGraphPackage;
 import org.yakindu.sct.model.sgraph.SpecificationElement;
 import org.yakindu.sct.model.stext.resource.StextResource;
+import org.yakindu.sct.model.stext.tasks.SCTTask;
 
 import com.google.common.collect.Lists;
 import com.google.inject.Inject;
@@ -52,7 +54,6 @@ public class STextTaskFinder extends DefaultTaskFinder {
 		return super.findTasks(resource);
 	}
 
-	//TODO: Extend the Task class to provide element id for MarkerNavigatorService 
 	public List<Task> findTasks(StextResource resource) {
 		TaskTags taskTags = taskTagProvider.getTaskTags(resource);
 		List<Task> result = Lists.newArrayList();
@@ -60,8 +61,8 @@ public class STextTaskFinder extends DefaultTaskFinder {
 		while (allContents.hasNext()) {
 			EObject eObject = (EObject) allContents.next();
 			if (eObject instanceof SpecificationElement) {
-				List<Task> parseTasks = parseTasks(eObject,
-						SGraphPackage.Literals.SPECIFICATION_ELEMENT__SPECIFICATION, taskTags);
+				List<Task> parseTasks = parseTasks(eObject, SGraphPackage.Literals.SPECIFICATION_ELEMENT__SPECIFICATION,
+						taskTags);
 				result.addAll(parseTasks);
 			}
 			if (eObject instanceof DocumentedElement) {
@@ -75,6 +76,13 @@ public class STextTaskFinder extends DefaultTaskFinder {
 		String expression = (String) element.eGet(feature);
 		if (expression == null)
 			return Collections.emptyList();
-		return parser.parseTasks(expression, tags);
+		List<Task> tasks = parser.parseTasks(expression, tags);
+		List<Task> result = Lists.newArrayList();
+		for (Task task : tasks) {
+			SCTTask sctTask = new SCTTask(task);
+			sctTask.setSemanticURI(EcoreUtil.getURI(element).fragment());
+			result.add(sctTask);
+		}
+		return result;
 	}
 }

+ 1 - 0
plugins/org.yakindu.sct.model.stext/META-INF/MANIFEST.MF

@@ -42,6 +42,7 @@ Export-Package: org.yakindu.sct.model.stext,
  org.yakindu.sct.model.stext.stext,
  org.yakindu.sct.model.stext.stext.impl,
  org.yakindu.sct.model.stext.stext.util,
+ org.yakindu.sct.model.stext.tasks,
  org.yakindu.sct.model.stext.terminals,
  org.yakindu.sct.model.stext.validation
 Bundle-ClassPath: .

+ 85 - 0
plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/tasks/SCTTask.java

@@ -0,0 +1,85 @@
+/**
+ * Copyright (c) 2017 committers of YAKINDU and others.
+ * 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:
+ *     committers of YAKINDU - initial API and implementation
+ */
+package org.yakindu.sct.model.stext.tasks;
+
+import org.eclipse.xtext.tasks.Task;
+import org.eclipse.xtext.tasks.TaskTag;
+
+/**
+ * 
+ * @author andreas muelder - Initial contribution and API
+ * 
+ */
+@SuppressWarnings("restriction")
+public class SCTTask extends Task {
+
+	private String semanticURI;
+	private Task delgate;
+
+	public SCTTask(Task delgate) {
+		this.delgate = delgate;
+	}
+
+	public String getSemanticURI() {
+		return semanticURI;
+	}
+
+	public void setSemanticURI(String semanticURI) {
+		this.semanticURI = semanticURI;
+	}
+
+	public String getFullText() {
+		return delgate.getFullText();
+	}
+
+	public int getTotalLength() {
+		return delgate.getTotalLength();
+	}
+
+	public int getTagLength() {
+		return delgate.getTagLength();
+	}
+
+	public TaskTag getTag() {
+		return delgate.getTag();
+	}
+
+	public void setTag(TaskTag tag) {
+		delgate.setTag(tag);
+	}
+
+	public String getDescription() {
+		return delgate.getDescription();
+	}
+
+	public void setDescription(String description) {
+		delgate.setDescription(description);
+	}
+
+	public int getLineNumber() {
+		return delgate.getLineNumber();
+	}
+
+	public void setLineNumber(int lineNumber) {
+		delgate.setLineNumber(lineNumber);
+	}
+
+	public int getOffset() {
+		return delgate.getOffset();
+	}
+
+	public void setOffset(int offset) {
+		delgate.setOffset(offset);
+	}
+	
+	
+
+}

+ 7 - 0
plugins/org.yakindu.sct.ui.editor/plugin.xml

@@ -446,7 +446,13 @@
       <super type="org.yakindu.sct.ui.editor.diagnostic"/>
       <super type="org.eclipse.xtext.ui.check.expensive"/>
       <persistent value="true"/>
+   </extension>
+     <extension id="org.yakindu.sct.ui.editor.task" name="Statechart Task" point="org.eclipse.core.resources.markers">
+      <super type="org.eclipse.xtext.ui.task"/>
+      <super type="org.eclipse.core.resources.taskmarker"/>
+      <persistent value="true"/>
    </extension>   
+      
   
    <extension point="org.eclipse.gmf.runtime.common.ui.services.markerNavigationProviders" id="markers-navigation">
       <MarkerNavigationProvider class="org.yakindu.sct.ui.editor.providers.StatechartMarkerNavigationProvider">
@@ -455,6 +461,7 @@
          <MarkerType name="org.yakindu.sct.ui.editor.diagnostic.normal"/>
          <MarkerType name="org.yakindu.sct.ui.editor.diagnostic.expensive"/>
          <MarkerType name="org.yakindu.sct.ui.editor.xtext.diagnostic"/>
+         <MarkerType name="org.yakindu.sct.ui.editor.task"/>
          <Priority name="Medium"/>
       </MarkerNavigationProvider>
    </extension>

+ 31 - 5
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/validation/DefaultValidationIssueStore.java

@@ -11,6 +11,7 @@
 package org.yakindu.sct.ui.editor.validation;
 
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.List;
 
 import org.eclipse.core.resources.IFile;
@@ -23,12 +24,12 @@ import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
+import org.eclipse.xtext.diagnostics.Severity;
 import org.eclipse.xtext.validation.CheckType;
 import org.eclipse.xtext.validation.Issue;
 import org.yakindu.sct.model.sgraph.ui.validation.ISctIssueCreator;
 import org.yakindu.sct.model.sgraph.ui.validation.SCTIssue;
 import org.yakindu.sct.model.sgraph.ui.validation.SCTMarkerType;
-import org.yakindu.sct.ui.editor.validation.IValidationIssueStore;
 import org.yakindu.sct.ui.editor.validation.IResourceChangeToIssueProcessor.ResourceDeltaToIssueResult;
 
 import com.google.common.base.Predicate;
@@ -134,6 +135,8 @@ public class DefaultValidationIssueStore implements IValidationIssueStore, IReso
 			if ((file != null) && file.isAccessible()) {
 				markers.addAll(
 						Arrays.asList(file.findMarkers(SCTMarkerType.SUPERTYPE, true, IResource.DEPTH_INFINITE)));
+				markers.addAll(
+						Arrays.asList(file.findMarkers(SCTMarkerType.SCT_TASK_TYPE, true, IResource.DEPTH_INFINITE)));
 			}
 		} catch (CoreException e) {
 			e.printStackTrace();
@@ -171,7 +174,10 @@ public class DefaultValidationIssueStore implements IValidationIssueStore, IReso
 			// validation, so persistent markers have to be copied
 			Iterable<SCTIssue> persistentIssues = Iterables.filter(visibleIssues.values(), new Predicate<SCTIssue>() {
 				public boolean apply(SCTIssue input) {
-					return input.getType() == CheckType.NORMAL || input.getType() == CheckType.EXPENSIVE;
+					CheckType type = input.getType();
+					Severity severity = input.getSeverity();
+					return CheckType.NORMAL == type || CheckType.EXPENSIVE == type 
+							|| Severity.INFO == severity;
 				}
 			});
 			for (SCTIssue sctIssue : persistentIssues) {
@@ -180,11 +186,31 @@ public class DefaultValidationIssueStore implements IValidationIssueStore, IReso
 			visibleIssues.clear();
 			visibleIssues.putAll(newVisibleIssues);
 		}
-		
+
+
 		SetView<String> changes = Sets.symmetricDifference(oldVisibleIssues.keySet(), newVisibleIssues.keySet());
-		for (String semanticElementID : changes) {
-			notifyListeners(semanticElementID);
+		for (String semanticElementID : newVisibleIssues.keySet()) {
+			if (changes.contains(semanticElementID)
+					|| changedSeverity(semanticElementID, oldVisibleIssues, newVisibleIssues))
+				notifyListeners(semanticElementID);
+		}
+	}
+
+	protected boolean changedSeverity(String semanticElementID, Multimap<String, SCTIssue> oldVisibleIssues,
+			Multimap<String, SCTIssue> newVisibleIssues) {
+		Severity minOldSeverity = getMinSeverity(oldVisibleIssues.get(semanticElementID));
+		Severity minNewSeverity = getMinSeverity(newVisibleIssues.get(semanticElementID));
+		return minNewSeverity.ordinal() != minOldSeverity.ordinal();
+	}
+
+	protected Severity getMinSeverity(Collection<SCTIssue> issues) {
+		Severity minNewSeverity = Severity.IGNORE;
+		for (SCTIssue sctIssue : issues) {
+			minNewSeverity = minNewSeverity.ordinal() > sctIssue.getSeverity().ordinal()
+					? sctIssue.getSeverity()
+					: minNewSeverity;
 		}
+		return minNewSeverity;
 	}
 
 	@Override