From b80b560c7032acd4bcea690c547b91f6cd566f6a Mon Sep 17 00:00:00 2001
From: Florian Hoelzl <hoelzl@fortiss.org>
Date: Mon, 4 Jul 2011 12:07:07 +0000
Subject: [PATCH] refactored constraint checker service to use service base
 implementation

---
 org.fortiss.tooling.kernel/trunk/plugin.xml   |  2 +-
 ...xsd => modelElementConstraintChecker.exsd} |  4 +-
 .../kernel/interfaces/IConstraintChecker.java |  4 +-
 .../interfaces/IConstraintViolation.java      |  7 ++-
 .../kernel/internal/ConstraintService.java    | 52 ++++++++++++++++---
 .../kernel/services/IConstraintService.java   |  6 ++-
 6 files changed, 60 insertions(+), 15 deletions(-)
 rename org.fortiss.tooling.kernel/trunk/schema/{modelConstraintChecker.exsd => modelElementConstraintChecker.exsd} (94%)

diff --git a/org.fortiss.tooling.kernel/trunk/plugin.xml b/org.fortiss.tooling.kernel/trunk/plugin.xml
index 63eaaaa97..9f0b24f72 100644
--- a/org.fortiss.tooling.kernel/trunk/plugin.xml
+++ b/org.fortiss.tooling.kernel/trunk/plugin.xml
@@ -4,7 +4,7 @@
    <extension-point id="modelPrototypeProvider" name="Model Prototype Provider" schema="schema/modelPrototypeProvider.exsd"/>
    <extension-point id="modelElementCompositor" name="Model Element Compositor" schema="schema/modelElementCompositor.exsd"/>
    <extension-point id="modelStorageProvider" name="Model Storage Provider" schema="schema/modelStorageProvider.exsd"/>
-   <extension-point id="modelConstraintChecker" name="Model Constraint Checker" schema="schema/modelConstraintChecker.exsd"/>
+   <extension-point id="modelElementConstraintChecker" name="Model Element Constraint Checker" schema="schema/modelElementConstraintChecker.exsd"/>
    <extension-point id="eclipseResourceStorageLocationProvider" name="Eclipse Resource Storage Location Provider" schema="schema/eclipseResourceStorageLocationProvider.exsd"/>
    <extension-point id="modelConnectionCompositor" name="Model Connection Compositor" schema="schema/modelConnectionCompositor.exsd"/>
    <extension
diff --git a/org.fortiss.tooling.kernel/trunk/schema/modelConstraintChecker.exsd b/org.fortiss.tooling.kernel/trunk/schema/modelElementConstraintChecker.exsd
similarity index 94%
rename from org.fortiss.tooling.kernel/trunk/schema/modelConstraintChecker.exsd
rename to org.fortiss.tooling.kernel/trunk/schema/modelElementConstraintChecker.exsd
index bebe29d78..85dc11ee2 100644
--- a/org.fortiss.tooling.kernel/trunk/schema/modelConstraintChecker.exsd
+++ b/org.fortiss.tooling.kernel/trunk/schema/modelElementConstraintChecker.exsd
@@ -3,7 +3,7 @@
 <schema targetNamespace="org.fortiss.tooling.kernel" xmlns="http://www.w3.org/2001/XMLSchema">
 <annotation>
       <appinfo>
-         <meta.schema plugin="org.fortiss.tooling.kernel" id="modelConstraintChecker" name="Model Constraint Checker"/>
+         <meta.schema plugin="org.fortiss.tooling.kernel" id="modelElementConstraintChecker" name="Model Element Constraint Checker"/>
       </appinfo>
       <documentation>
          Registers a constraint checker for model elements.
@@ -46,7 +46,7 @@
       </complexType>
    </element>
 
-   <element name="modelConstraintChecker" type="string">
+   <element name="modelElementConstraintChecker" type="string">
    </element>
 
    <annotation>
diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/interfaces/IConstraintChecker.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/interfaces/IConstraintChecker.java
index d59b7682b..b4e190d58 100644
--- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/interfaces/IConstraintChecker.java
+++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/interfaces/IConstraintChecker.java
@@ -38,8 +38,8 @@ public interface IConstraintChecker<C extends EObject> extends IEObjectAware<C>
 	 * Determines whether the constraint checker is applicable to the given
 	 * model element.
 	 */
-	boolean isApplicable(C modelElement);
+	boolean isApplicable(EObject modelElement);
 
 	/** Applies the constraint checker to the given model element. */
-	IConstraintViolation apply(C modelElement);
+	IConstraintViolation<EObject> apply(EObject modelElement);
 }
diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/interfaces/IConstraintViolation.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/interfaces/IConstraintViolation.java
index 607493144..165df8104 100644
--- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/interfaces/IConstraintViolation.java
+++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/interfaces/IConstraintViolation.java
@@ -17,6 +17,8 @@ $Id$
 +--------------------------------------------------------------------------*/
 package org.fortiss.tooling.kernel.interfaces;
 
+import org.eclipse.emf.ecore.EObject;
+
 /**
  * This interface describes a constraint violation produced by some constraint
  * checker. A constraint violation has a severity of type {@link ESeverity}, an
@@ -28,7 +30,10 @@ package org.fortiss.tooling.kernel.interfaces;
  * @version $Rev$
  * @ConQAT.Rating YELLOW Hash: 0506883B3019B9D1DC5AC6C0AB2F35FB
  */
-public interface IConstraintViolation {
+public interface IConstraintViolation<T extends EObject> {
+
+	/** Returns the source of the constraint violation. */
+	T getSource();
 
 	/** Returns the severity of the constraint violation. */
 	ESeverity getSeverity();
diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ConstraintService.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ConstraintService.java
index 0281ecf60..1936883cb 100644
--- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ConstraintService.java
+++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/internal/ConstraintService.java
@@ -17,9 +17,11 @@ $Id$
 +--------------------------------------------------------------------------*/
 package org.fortiss.tooling.kernel.internal;
 
+import java.util.LinkedList;
 import java.util.List;
 
 import org.eclipse.emf.ecore.EObject;
+import org.fortiss.tooling.kernel.base.EObjectAwareServiceBase;
 import org.fortiss.tooling.kernel.interfaces.IConstraintChecker;
 import org.fortiss.tooling.kernel.interfaces.IConstraintViolation;
 import org.fortiss.tooling.kernel.services.IConstraintService;
@@ -32,21 +34,57 @@ import org.fortiss.tooling.kernel.services.IConstraintService;
  * @version $Rev$
  * @ConQAT.Rating RED Hash: 9E0D8411A1525AA3989DED2C0DC7A033
  */
-public class ConstraintService implements IConstraintService {
+public class ConstraintService extends
+		EObjectAwareServiceBase<IConstraintChecker<? extends EObject>>
+		implements IConstraintService {
+
+	/** The compositor extension point ID. */
+	private static final String EXTENSION_POINT_NAME = "org.fortiss.tooling.kernel.modelElementConstraintChecker";
+
+	/** The compositor configuration element name. */
+	private static final String CONFIGURATION_ELEMENT_NAME = "modelElementConstraintChecker";
+
+	/** The compositor class attribute name. */
+	private static final String HANDLER_CLASS_ATTRIBUTE_NAME = "checker";
 
 	/** {@inheritDoc} */
+	@SuppressWarnings("unchecked")
 	@Override
-	public List<IConstraintViolation> performAllConstraintChecks(
+	public List<IConstraintViolation<? extends EObject>> performAllConstraintChecks(
 			EObject modelElement) {
-		// TODO
-		return null;
+		List<IConstraintViolation<? extends EObject>> result = new LinkedList<IConstraintViolation<? extends EObject>>();
+		for (IConstraintChecker<? extends EObject> checker : getRegisteredHandlers(modelElement
+				.getClass())) {
+			if (checker.isApplicable(modelElement)) {
+				result.add(checker.apply(modelElement));
+			}
+		}
+		return result;
 	}
 
 	/** {@inheritDoc} */
+	@SuppressWarnings("unchecked")
 	@Override
-	public List<IConstraintChecker> getAllConstraintCheckers(
+	public List<IConstraintChecker<? extends EObject>> getAllConstraintCheckers(
 			EObject modelElement) {
-		// TODO
-		return null;
+		return getRegisteredHandlers(modelElement.getClass());
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected String getExtensionPointName() {
+		return EXTENSION_POINT_NAME;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected String getConfigurationElementName() {
+		return CONFIGURATION_ELEMENT_NAME;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected String getHandlerClassAttribute() {
+		return HANDLER_CLASS_ATTRIBUTE_NAME;
 	}
 }
diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/services/IConstraintService.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/services/IConstraintService.java
index a2fc3e368..9063b0594 100644
--- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/services/IConstraintService.java
+++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/services/IConstraintService.java
@@ -42,11 +42,13 @@ public interface IConstraintService {
 	 * Performs all constraint checks on the given model element and returns the
 	 * check results.
 	 */
-	List<IConstraintViolation> performAllConstraintChecks(EObject modelElement);
+	<T extends EObject> List<IConstraintViolation<T>> performAllConstraintChecks(
+			T modelElement);
 
 	/**
 	 * Returns the list of registered constraint checkers for the given model
 	 * element.
 	 */
-	List<IConstraintChecker> getAllConstraintCheckers(EObject modelElement);
+	<T extends EObject> List<IConstraintChecker<T>> getAllConstraintCheckers(
+			T modelElement);
 }
-- 
GitLab