Skip to content
Snippets Groups Projects
Commit 07034df2 authored by Vincent Aravantinos's avatar Vincent Aravantinos
Browse files

moves CBDP-specific aspsects to the UI service

refs 2620
parent a1433408
No related branches found
No related tags found
No related merge requests found
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();
}
}
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);
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment