diff --git a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/ConstraintVerificationUIService.java b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/ConstraintVerificationUIService.java index 85b6d6f18a280f477acc55188d7f17a81091a941..e99261f98f4f3e88a400950f133e30ad61ca2613 100644 --- a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/ConstraintVerificationUIService.java +++ b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/ConstraintVerificationUIService.java @@ -1,8 +1,10 @@ package org.fortiss.tooling.kernel.ui.internal; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import org.eclipse.emf.common.notify.Adapter; import org.eclipse.emf.common.notify.Notification; @@ -18,16 +20,18 @@ import org.fortiss.tooling.kernel.model.constraints.ConstrainedWithChecksum; import org.fortiss.tooling.kernel.model.constraints.ConstraintsPackage; import org.fortiss.tooling.kernel.model.constraints.IConstrained; import org.fortiss.tooling.kernel.model.constraints.IConstraint; +import org.fortiss.tooling.kernel.model.constraints.IConstraintContainer; import org.fortiss.tooling.kernel.model.constraints.IConstraintVerificationStatus; +import org.fortiss.tooling.kernel.model.constraints.OutdatedVerificationStatus; import org.fortiss.tooling.kernel.service.IConstraintVerificationService; import org.fortiss.tooling.kernel.service.IKernelIntrospectionSystemService; import org.fortiss.tooling.kernel.service.IPersistencyService; import org.fortiss.tooling.kernel.service.base.EObjectAwareServiceBase; +import org.fortiss.tooling.kernel.ui.ToolingKernelUIActivator; import org.fortiss.tooling.kernel.ui.extension.IConstraintVerifierUI; import org.fortiss.tooling.kernel.ui.internal.introspection.items.ConstraintVerificationUIServiceIntrospectionDetailsItem; import org.fortiss.tooling.kernel.ui.service.IConstraintVerificationUIService; import org.fortiss.tooling.kernel.ui.util.ConstraintsUIUtils; -import org.fortiss.tooling.kernel.utils.ConstraintsUtils; import org.fortiss.tooling.kernel.utils.EcoreUtils; import org.fortiss.tooling.kernel.utils.LoggingUtils; @@ -37,7 +41,7 @@ import org.fortiss.tooling.kernel.utils.LoggingUtils; * @author aravantinos * @author $Author$ * @version $Rev$ - * @ConQAT.Rating YELLOW Hash: DFD84F252FBC3A66B43232EFD9AE172A + * @ConQAT.Rating YELLOW Hash: 4D293B01D041A43D10556052E8754848 */ public final class ConstraintVerificationUIService extends EObjectAwareServiceBase<IConstraintVerifierUI<IConstraint>> implements @@ -50,21 +54,13 @@ public final class ConstraintVerificationUIService extends return INSTANCE; } + /** Activates logging to observe when constraints get outdated. */ + private static final boolean DEBUG = false; + /** {@inheritDoc} */ @Override public void startService() { IKernelIntrospectionSystemService.getInstance().registerService(this); - } - - /** Map ID -> Verifier. */ - private HashMap<String, IConstraintVerifierUI<IConstraint>> idMap = new HashMap<>(); - - /** Registers the verifier UI part with the service. */ - @Override - @SuppressWarnings("unchecked") - public <T extends IConstraint> void registerConstraintVerifierUI( - IConstraintVerifierUI<T> verifier, Class<T> constraintElementClass) { - addHandler(constraintElementClass, (IConstraintVerifierUI<IConstraint>)verifier); List<ITopLevelElement> tops = IPersistencyService.getInstance().getTopLevelElements(); for(ITopLevelElement top : tops) { TreeIterator<EObject> tree = top.getRootModelElement().eAllContents(); @@ -77,12 +73,12 @@ public final class ConstraintVerificationUIService extends } } - /** {@inheritDoc} */ + /** Registers the verifier UI part with the service. */ @Override - protected void - addHandler(Class<?> modelElementClass, IConstraintVerifierUI<IConstraint> handler) { - super.addHandler(modelElementClass, handler); - idMap.put(handler.getID(), handler); + @SuppressWarnings("unchecked") + public <T extends IConstraint> void registerConstraintVerifierUI( + IConstraintVerifierUI<T> verifier, Class<T> constraintElementClass) { + addHandler(constraintElementClass, (IConstraintVerifierUI<IConstraint>)verifier); } /** {@inheritDoc} */ @@ -131,33 +127,28 @@ public final class ConstraintVerificationUIService extends /** {@inheritDoc} */ @Override - public void openStatus(IConstraintVerificationStatus status) { - IConstraintVerifierUI<IConstraint> verifier = getFirstVerifier(status.getConstraint()); - verifier.openStatus(status); - ConstraintsUIUtils.triggerMarkersRefresh(status.getConstraint()); + public void openStatus(IConstraint c) { + IConstraintVerifierUI<IConstraint> verifier = getFirstVerifier(c); + verifier.openStatus(c, getStatus(c)); + ConstraintsUIUtils.triggerMarkersRefresh(c); } /** {@inheritDoc} */ @Override - public boolean canOpen(IConstraintVerificationStatus status) { - if(status != null) { - IConstraintVerifierUI<IConstraint> verifier = getFirstVerifier(status.getConstraint()); - return verifier.canOpen(status); - } - return false; + public boolean canOpen(IConstraint c) { + IConstraintVerifierUI<IConstraint> verifier = getFirstVerifier(c); + return verifier.canOpen(c, getStatus(c)); } /** {@inheritDoc} */ @Override public void install(IConstraint constraint) { - if(constraint.getVerificationStatus() == null) { - ConstraintsUtils.createOutdatedVerificationStatus(constraint); - } - if(constraint.getVerificationStatus().getConstraint() == null) { - constraint.getVerificationStatus().setConstraint(constraint); + if(constraint.getVerificationStatus() != null && + constraint.getVerificationStatus().getConstraint() == null) { + ITopLevelElement top = + IPersistencyService.getInstance().getTopLevelElementFor(constraint); + top.runAsCommand(() -> constraint.getVerificationStatus().setConstraint(constraint)); } - IConstraintVerifierUI<IConstraint> verifier = getFirstVerifier(constraint); - verifier.onOutdate(constraint); ConstraintsUIUtils.triggerMarkersRefresh(constraint); new ConstrainedAdapters(constraint); } @@ -206,6 +197,10 @@ public final class ConstraintVerificationUIService extends return false; } if(!IConstraintVerificationService.getInstance().isUpToDate(constraint)) { + if(DEBUG) { + String msg = "Constraint " + constraint.toString() + " is outdated."; + LoggingUtils.info(ToolingKernelUIActivator.getDefault(), msg); + } IConstraintVerifierUI<IConstraint> verifier = getFirstVerifier(constraint); verifier.onOutdate(constraint); return true; @@ -313,21 +308,78 @@ public final class ConstraintVerificationUIService extends return "Constraint Verification UI Service"; } + /** Activated constraints per top loevel element. */ + private static Map<ITopLevelElement, Set<Class<IConstraint>>> activatedConstraints = + new HashMap<>(); + /** {@inheritDoc} */ @Override - public <T extends IConstraint> void activate(String id, EObject context) { - IConstraintVerifierUI<IConstraint> verifier = this.idMap.get(id); - if(verifier != null) { - verifier.activate(context); + public IConstraintVerificationStatus getStatus(IConstraint constraint) { + ITopLevelElement top = IPersistencyService.getInstance().getTopLevelElementFor(constraint); + boolean isActivated = false; + Set<Class<IConstraint>> set = activatedConstraints.get(top); + if(set != null) { + for(Class<IConstraint> activeCstrType : set) { + if(activeCstrType.isAssignableFrom(constraint.getClass())) { + isActivated = true; + } + } + } + return isActivated ? constraint.getVerificationStatus() : null; + } + + /** {@inheritDoc} */ + @SuppressWarnings("unchecked") + @Override + public Set<Class<IConstraint>> getAvailableConstraintTypes() { + // In principle, we do could return <code>handlerMap.keySet()</code> directly but we miss + // the type information to satisfy Java's type checker. + HashSet<Class<IConstraint>> res = new HashSet<Class<IConstraint>>(); + for(Class<?> type : handlerMap.keySet()) { + res.add((Class<IConstraint>)type); } + return res; } /** {@inheritDoc} */ + @SuppressWarnings("unchecked") @Override - public <T extends IConstraint> void deactivate(String id, EObject context) { - IConstraintVerifierUI<IConstraint> verifier = this.idMap.get(id); - if(verifier != null) { - verifier.deactivate(context); + public <T extends IConstraint> void activate(Class<T> constraintType, + IConstraintContainer cstrContainer) { + ITopLevelElement top = + IPersistencyService.getInstance().getTopLevelElementFor(cstrContainer); + if(!activatedConstraints.containsKey(top)) { + activatedConstraints.put(top, new HashSet<>()); + } + activatedConstraints.get(top).add((Class<IConstraint>)constraintType); + IConstraintVerifierUI<IConstraint> verifier = getFirstVerifier(constraintType); + verifier.onActivate(cstrContainer); + for(IConstraint c : cstrContainer.getConstraints()) { + if(constraintType.isInstance(c)) { + if(!IConstraintVerificationService.getInstance().isUpToDate(c) || + c.getVerificationStatus() == null || + c.getVerificationStatus() instanceof OutdatedVerificationStatus) { + verifier.onOutdate(c); + } + } } + ConstraintsUIUtils.triggerMarkerRefresh(constraintType, cstrContainer); + } + + /** {@inheritDoc} */ + @Override + public <T extends IConstraint> void deactivate(Class<T> constraintType, + IConstraintContainer cstrContainer) { + ITopLevelElement top = + IPersistencyService.getInstance().getTopLevelElementFor(cstrContainer); + activatedConstraints.get(top).remove(constraintType); + ConstraintsUIUtils.triggerMarkerRefresh(constraintType, cstrContainer); + } + + /** {@inheritDoc} */ + @Override + public <T extends IConstraint> String getDescription(Class<T> constraintType) { + IConstraintVerifierUI<IConstraint> verifier = getFirstVerifier(constraintType); + return verifier == null ? null : verifier.getDescription(); } } diff --git a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/service/IConstraintVerificationUIService.java b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/service/IConstraintVerificationUIService.java index 36b812c48264a54700e60a7aec4fad1e23e428df..b609e9018a112dfea806113dfa2c366b5e48f5b6 100644 --- a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/service/IConstraintVerificationUIService.java +++ b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/service/IConstraintVerificationUIService.java @@ -1,7 +1,9 @@ package org.fortiss.tooling.kernel.ui.service; -import org.eclipse.emf.ecore.EObject; +import java.util.Set; + import org.fortiss.tooling.kernel.model.constraints.IConstraint; +import org.fortiss.tooling.kernel.model.constraints.IConstraintContainer; import org.fortiss.tooling.kernel.model.constraints.IConstraintVerificationStatus; import org.fortiss.tooling.kernel.service.IConstraintVerificationService; import org.fortiss.tooling.kernel.ui.extension.IConstraintVerifierUI; @@ -13,7 +15,7 @@ import org.fortiss.tooling.kernel.ui.internal.ConstraintVerificationUIService; * @author aravantinos * @author $Author$ * @version $Rev$ - * @ConQAT.Rating YELLOW Hash: 7219766068C024D972B4871A0891118D + * @ConQAT.Rating YELLOW Hash: 088353619375F645ACA70AD1C2990CE1 */ public interface IConstraintVerificationUIService { /** Returns the service instance. */ @@ -21,11 +23,11 @@ public interface IConstraintVerificationUIService { return ConstraintVerificationUIService.getInstance(); } - /** Action to take when trying to open the given status. */ - void openStatus(IConstraintVerificationStatus status); + /** Action to take when trying to open the (status of the given) constraint. */ + void openStatus(IConstraint c); - /** True if the given status can be open. */ - boolean canOpen(IConstraintVerificationStatus status); + /** True if the (status of the) the given constraint can be open. */ + boolean canOpen(IConstraint c); /** Install the given constraint: install notifiers and triggers an "onOutdate" event. */ void install(IConstraint constraint); @@ -40,9 +42,23 @@ public interface IConstraintVerificationUIService { * EXPERIMENTAL. */ - /** Activates the constraint type. */ - <T extends IConstraint> void activate(String id, EObject context); + /** + * Returns the status of the constraint, possibly returns <code>null</code> if the constraint is + * not activated. + */ + IConstraintVerificationStatus getStatus(IConstraint constraint); + + /** Returns a list of all available constraint types. */ + Set<Class<IConstraint>> getAvailableConstraintTypes(); + + /** Activates the constraint type in the context of the given constraints container. */ + <T extends IConstraint> void activate(Class<T> constraintType, + IConstraintContainer cstrContainer); + + /** Deactivates the constraint type in the context of the given constraints container. */ + <T extends IConstraint> void deactivate(Class<T> constraintType, + IConstraintContainer cstrContainer); - /** Deactivates the constraint type. */ - <T extends IConstraint> void deactivate(String id, EObject context); + /** Returns a description for the given constraint type. */ + <T extends IConstraint> String getDescription(Class<T> constraintType); }