From 8889beda568545b87d3df5afa45e2e93ba87dd96 Mon Sep 17 00:00:00 2001
From: Vincent Aravantinos <aravantinos@fortiss.org>
Date: Thu, 14 Jul 2016 14:11:30 +0000
Subject: [PATCH] IConstraint -> Constraint in service implementation adds
 cancellation refs 2553

---
 .../ConstraintVerificationService.java        | 145 ++++++++++++------
 1 file changed, 95 insertions(+), 50 deletions(-)

diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ConstraintVerificationService.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ConstraintVerificationService.java
index 30456ee64..19c5ea595 100644
--- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ConstraintVerificationService.java
+++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ConstraintVerificationService.java
@@ -1,7 +1,13 @@
 package org.fortiss.tooling.kernel.internal;
 
+import static java.util.Collections.emptyList;
 import static org.eclipse.emf.ecore.xmi.XMLResource.OPTION_PROCESS_DANGLING_HREF;
 import static org.eclipse.emf.ecore.xmi.XMLResource.OPTION_PROCESS_DANGLING_HREF_DISCARD;
+import static org.fortiss.tooling.kernel.utils.ExtensionPointUtils.getBundle;
+import static org.fortiss.tooling.kernel.utils.ExtensionPointUtils.getConfigurationElements;
+import static org.fortiss.tooling.kernel.utils.ExtensionPointUtils.loadClass;
+import static org.fortiss.tooling.kernel.utils.LoggingUtils.error;
+import static org.fortiss.tooling.kernel.utils.LoggingUtils.warning;
 
 import java.io.ByteArrayOutputStream;
 import java.io.FileOutputStream;
@@ -9,10 +15,12 @@ import java.io.ObjectOutputStream;
 import java.math.BigInteger;
 import java.security.MessageDigest;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.EObject;
@@ -23,18 +31,20 @@ import org.fortiss.tooling.kernel.ToolingKernelActivator;
 import org.fortiss.tooling.kernel.extension.IConstraintVerifier;
 import org.fortiss.tooling.kernel.extension.data.ITopLevelElement;
 import org.fortiss.tooling.kernel.introspection.IIntrospectionDetailsItem;
+import org.fortiss.tooling.kernel.introspection.IIntrospectionItem;
+import org.fortiss.tooling.kernel.introspection.IIntrospectiveKernelService;
 import org.fortiss.tooling.kernel.introspection.items.ConstraintVerificationServiceIntrospectionDetailsItem;
 import org.fortiss.tooling.kernel.model.INamedElement;
 import org.fortiss.tooling.kernel.model.constraints.ConstrainedWithChecksum;
+import org.fortiss.tooling.kernel.model.constraints.Constraint;
 import org.fortiss.tooling.kernel.model.constraints.ConstraintsFactory;
 import org.fortiss.tooling.kernel.model.constraints.IConstrained;
-import org.fortiss.tooling.kernel.model.constraints.IConstraint;
 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.utils.EcoreUtils;
 import org.fortiss.tooling.kernel.utils.LoggingUtils;
+import org.osgi.framework.Bundle;
 
 /**
  * Implementation of {@link IConstraintVerificationService}.
@@ -42,32 +52,66 @@ import org.fortiss.tooling.kernel.utils.LoggingUtils;
  * @author aravantinos
  * @author $Author$
  * @version $Rev$
- * @ConQAT.Rating YELLOW Hash: DBE8840892D099FA011822EF6EB4ED9E
+ * @ConQAT.Rating YELLOW Hash: 28F933A29C87BB09AD7E9B8A74313878
  */
-public final class ConstraintVerificationService extends
-		EObjectAwareServiceBase<IConstraintVerifier<IConstraint>> implements
+public final class ConstraintVerificationService implements IIntrospectiveKernelService,
 		IConstraintVerificationService {
+
 	/** The singleton instance. */
 	private static final ConstraintVerificationService INSTANCE =
 			new ConstraintVerificationService();
 
+	/** Stores the class to handler map. */
+	protected final Map<String, IConstraintVerifier> handlerMap =
+			new HashMap<String, IConstraintVerifier>();
+
 	/** Returns singleton instance of the service. */
 	public static ConstraintVerificationService getInstance() {
 		return INSTANCE;
 	}
 
-	/** {@inheritDoc} */
-	@Override
+	/** Starts the service. */
 	public void startService() {
 		IKernelIntrospectionSystemService.getInstance().registerService(this);
 	}
 
+	/** Initializes the service by setting up the handler map. */
+	public void initializeService() {
+		setupHandlerMap();
+	}
+
+	/** Initializes the handler map from plugin extensions. */
+	private void setupHandlerMap() {
+		for(IConfigurationElement ce : getConfigurationElements(getExtensionPointName(),
+				getConfigurationElementName())) {
+			Bundle bundle = getBundle(ce);
+			try {
+				Class<?> handlerClass =
+						loadClass(ce.getAttribute(getHandlerClassAttribute()), bundle);
+				IConstraintVerifier handler =
+						(IConstraintVerifier)handlerClass.getConstructor().newInstance();
+				addHandler(handler.getID(), handler);
+			} catch(Exception ex) {
+				error(ToolingKernelActivator.getDefault(), ex.getMessage(), ex);
+			}
+		}
+	}
+
+	/** Adds the given handler to the map and the set. */
+	protected void addHandler(String id, IConstraintVerifier handler) {
+		IConstraintVerifier existingVerifier = handlerMap.get(id);
+		if(existingVerifier != null) {
+			warning(ToolingKernelActivator.getDefault(),
+					"Encountered more than one handler registered with " + getExtensionPointName() +
+							"(" + handler.getClass() + "," + existingVerifier.getClass() + ")");
+		}
+		handlerMap.put(id, handler);
+	}
+
 	/** {@inheritDoc} */
 	@Override
-	@SuppressWarnings("unchecked")
-	public <T extends IConstraint> void registerConstraintVerifier(IConstraintVerifier<T> verifier,
-			Class<T> constraintElementClass) {
-		addHandler(constraintElementClass, (IConstraintVerifier<IConstraint>)verifier);
+	public void registerConstraintVerifier(IConstraintVerifier verifier) {
+		addHandler(verifier.getID(), verifier);
 	}
 
 	/** {@inheritDoc} */
@@ -97,8 +141,8 @@ public final class ConstraintVerificationService extends
 
 	/** {@inheritDoc} */
 	@Override
-	public void verify(IConstraint constraint) {
-		IConstraintVerifier<IConstraint> verifier = getFirstVerifier(constraint);
+	public void verify(Constraint constraint) {
+		IConstraintVerifier verifier = getFirstVerifier(constraint);
 		if(verifier != null) {
 			ITopLevelElement modelContext =
 					IPersistencyService.getInstance().getTopLevelElementFor(constraint);
@@ -127,9 +171,9 @@ public final class ConstraintVerificationService extends
 
 	/** {@inheritDoc} */
 	@Override
-	public <T extends IConstraint> List<IFix> fixes(T c) {
+	public List<IFix> fixes(Constraint c) {
 		List<IFix> fixes = null;
-		IConstraintVerifier<IConstraint> verifier = getFirstVerifier(c);
+		IConstraintVerifier verifier = getFirstVerifier(c);
 		if(verifier != null) {
 			fixes = verifier.fixes(c, c.getVerificationStatus());
 		}
@@ -138,7 +182,7 @@ public final class ConstraintVerificationService extends
 
 	/** {@inheritDoc} */
 	@Override
-	public boolean isUpToDate(IConstraint constraint) {
+	public boolean isUpToDate(Constraint constraint) {
 		for(ConstrainedWithChecksum cwc : constraint.getConstrainedsWithChecksum()) {
 			BigInteger computeCheckSum = computeCheckSum(cwc.getConstrained(), constraint);
 			if(computeCheckSum == null || !computeCheckSum.equals(cwc.getChecksum())) {
@@ -152,7 +196,7 @@ public final class ConstraintVerificationService extends
 	 * @param constraint
 	 *            Updates all the checksums of <code>constraint</code>.
 	 */
-	private void updateChecksums(IConstraint constraint) {
+	private void updateChecksums(Constraint constraint) {
 		List<ConstrainedWithChecksum> newCwcs = new ArrayList<ConstrainedWithChecksum>();
 		for(ConstrainedWithChecksum cwc : constraint.getConstrainedsWithChecksum()) {
 			ConstrainedWithChecksum newCwc =
@@ -184,7 +228,7 @@ public final class ConstraintVerificationService extends
 	 *         necessary because it has a potential impact on what is relevant for the checksum or
 	 *         not.
 	 */
-	protected BigInteger computeCheckSum(IConstrained constrained, IConstraint constraint) {
+	protected BigInteger computeCheckSum(IConstrained constrained, Constraint constraint) {
 		if(constrained == null) {
 			return null;
 		}
@@ -238,9 +282,9 @@ public final class ConstraintVerificationService extends
 	 *         Generally, all verification statuses and checksums are removed. Each verifier can
 	 *         also provide per-constraint adaptations.
 	 */
-	protected EObject getChecksumRelevantEObject(IConstrained constrained, IConstraint constraint) {
+	protected EObject getChecksumRelevantEObject(IConstrained constrained, Constraint constraint) {
 		EObject res = EcoreUtils.copy(constrained);
-		IConstraintVerifier<IConstraint> verifier = getFirstVerifier(constraint);
+		IConstraintVerifier verifier = getFirstVerifier(constraint);
 		if(verifier != null) {
 			verifier.removeConstraintIrrelevantContent(res);
 		}
@@ -248,62 +292,45 @@ public final class ConstraintVerificationService extends
 	}
 
 	/**
-	 * @param clazz
-	 * @return the first registered verifier which can verify a constraint of class
-	 *         <code>clazz</code>.
+	 * @param id
+	 * @return the first registered verifier which can verify a constraint of type <code>id</code>.
 	 */
-	protected IConstraintVerifier<IConstraint> getFirstVerifier(Class<?> clazz) {
-		List<IConstraintVerifier<IConstraint>> list = getRegisteredHandlers(clazz);
-		if(list == null || list.isEmpty()) {
+	protected IConstraintVerifier getFirstVerifier(String id) {
+		IConstraintVerifier existingVerifier = handlerMap.get(id);
+		if(existingVerifier == null) {
 			LoggingUtils.error(ToolingKernelActivator.getDefault(),
-					String.format("Cannot find verifier for constraint %s", clazz));
+					String.format("Cannot find verifier for constraint %s", id));
 			return null;
 		}
-		// get(0) because we know the list is not empty and because we want the first element
-		return list.get(0);
+		return existingVerifier;
 	}
 
 	/**
 	 * @param constraint
 	 * @return The first registered verifier which can verify <code>constraint</code>.
 	 */
-	protected IConstraintVerifier<IConstraint> getFirstVerifier(IConstraint constraint) {
-		return getFirstVerifier(constraint.getClass());
+	protected IConstraintVerifier getFirstVerifier(Constraint constraint) {
+		return getFirstVerifier(constraint.getConstraintTypeID());
 	}
 
-	/** {@inheritDoc} */
-	@Override
+	/** Returns the extension point name. */
 	protected String getExtensionPointName() {
 		return "org.fortiss.tooling.kernel.constraintVerifier";
 	}
 
-	/** {@inheritDoc} */
-	@Override
+	/** Returns the configuration element name. */
 	protected String getConfigurationElementName() {
 		return "constraintVerifier";
 	}
 
-	/** {@inheritDoc} */
-	@Override
+	/** Returns the handler class attribute name. */
 	protected String getHandlerClassAttribute() {
 		return "constraintVerifier";
 	}
 
 	/** {@inheritDoc} */
 	@Override
-	protected String getClassAttribute() {
-		return "constraint";
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	protected String getClassConfigurationElement() {
-		return "constraint";
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public void setConstrained(IConstraint constraint, IConstrained constrained, int index) {
+	public void setConstrained(Constraint constraint, IConstrained constrained, int index) {
 		EList<ConstrainedWithChecksum> cwcs = constraint.getConstrainedsWithChecksum();
 		if(cwcs.size() <= index) {
 			for(int i = cwcs.size(); i <= index; i++) {
@@ -318,6 +345,12 @@ public final class ConstraintVerificationService extends
 		cwc.setChecksum(computeCheckSum(constrained, constraint));
 	}
 
+	/** {@inheritDoc} */
+	@Override
+	public void cancel(Constraint constraint) {
+		getFirstVerifier(constraint.getConstraintTypeID()).cancel(constraint);
+	}
+
 	/** {@inheritDoc} */
 	@Override
 	public String getIntrospectionLabel() {
@@ -329,4 +362,16 @@ public final class ConstraintVerificationService extends
 	public IIntrospectionDetailsItem getDetailsItem() {
 		return new ConstraintVerificationServiceIntrospectionDetailsItem(handlerMap);
 	}
+
+	/** {@inheritDoc} */
+	@Override
+	public boolean showInIntrospectionNavigation() {
+		return true;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Collection<IIntrospectionItem> getIntrospectionItems() {
+		return emptyList();
+	}
 }
-- 
GitLab