From 68c90ba6ecc4fb150ad3202f3d2c0565e8794dc2 Mon Sep 17 00:00:00 2001 From: Florian Hoelzl <hoelzl@fortiss.org> Date: Tue, 3 Jul 2012 14:37:10 +0000 Subject: [PATCH] bugfix refs 504 --- .../kernel/ui/internal/MarkerService.java | 34 ++++++++++++++++--- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/MarkerService.java b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/MarkerService.java index 17dea2197..922a10efa 100644 --- a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/MarkerService.java +++ b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/MarkerService.java @@ -17,6 +17,7 @@ $Id$ +--------------------------------------------------------------------------*/ package org.fortiss.tooling.kernel.ui.internal; +import static java.util.Collections.emptyList; import static org.fortiss.tooling.kernel.utils.EcoreUtils.postRefreshNotification; import java.util.ArrayList; @@ -58,7 +59,7 @@ import org.fortiss.tooling.kernel.ui.service.IMarkerService; * @author hoelzl * @author $Author$ * @version $Rev$ - * @ConQAT.Rating GREEN Hash: 4F42D5352BEE034F1D749E50A2E29437 + * @ConQAT.Rating YELLOW Hash: EFDAD4F40879A52F009A2D9DCFAC4181 */ public class MarkerService implements IMarkerService, IPersistencyServiceListener, ILightweightLabelDecorator { @@ -148,7 +149,12 @@ public class MarkerService implements IMarkerService, IPersistencyServiceListene if(top == null) { return Collections.emptyList(); } - return getCacheEntry(top).getCachedList(element); + CacheEntry ce = getCacheEntry(top); + Collection<IConstraintViolation<? extends EObject>> coll = ce.getCachedList(element); + if(coll.isEmpty()) { + return ce.getChildCachedList(element); + } + return coll; } /** {@inheritDoc} */ @@ -273,9 +279,7 @@ public class MarkerService implements IMarkerService, IPersistencyServiceListene } } - /** - * Marker service cache entry. - */ + /** Marker service cache entry. */ private static class CacheEntry { /** Stores the mapping from model elements to violation lists. */ @@ -286,6 +290,10 @@ public class MarkerService implements IMarkerService, IPersistencyServiceListene private final Map<EObject, ESeverity> highestSeverityMap = new ConcurrentHashMap<EObject, ESeverity>(); + /** Stores the child causing the highest severity value for each cached element. */ + private final Map<EObject, EObject> highestSeverityChildMap = + new ConcurrentHashMap<EObject, EObject>(); + /** Stores the top-level element. */ private ITopLevelElement topElement; @@ -331,9 +339,11 @@ public class MarkerService implements IMarkerService, IPersistencyServiceListene List<IConstraintViolation<? extends EObject>> list = violationsMap.get(eo); if(list.isEmpty()) { highestSeverityMap.put(eo, ESeverity.lowest()); + highestSeverityChildMap.remove(eo); } else { Collections.sort(list, IConstraintViolation.SEVERITY_COMPARATOR); highestSeverityMap.put(eo, list.get(0).getSeverity()); + highestSeverityChildMap.put(eo, list.get(0).getSource()); } } // project severity to parent @@ -345,13 +355,18 @@ public class MarkerService implements IMarkerService, IPersistencyServiceListene /** Recursively projects highest severity from children to parents. */ private ESeverity computeHighestSeverity(EObject element) { ESeverity severity = getHighestSeverity(element); + EObject causingChild = highestSeverityChildMap.get(element); for(EObject child : element.eContents()) { ESeverity childSeverity = computeHighestSeverity(child); if(ESeverity.getIntSeverity(severity) > ESeverity.getIntSeverity(childSeverity)) { severity = childSeverity; + causingChild = child; } } highestSeverityMap.put(element, severity); + if(causingChild != null) { + highestSeverityChildMap.put(element, causingChild); + } return severity; } @@ -365,6 +380,14 @@ public class MarkerService implements IMarkerService, IPersistencyServiceListene return list; } + /** Returns the cached list of child causing the violation of the given element. */ + public List<IConstraintViolation<? extends EObject>> getChildCachedList(EObject element) { + if(!highestSeverityChildMap.containsKey(element)) { + return emptyList(); + } + return getCachedList(highestSeverityChildMap.get(element)); + } + /** Returns all violations of the given severity. */ public List<IConstraintViolation<? extends EObject>> getAllViolationsWithSeverity( ESeverity severity) { @@ -387,6 +410,7 @@ public class MarkerService implements IMarkerService, IPersistencyServiceListene } for(EObject eo : highestSeverityMap.keySet()) { highestSeverityMap.put(eo, ESeverity.lowest()); + highestSeverityChildMap.remove(eo); } } } -- GitLab