From 994aa035928ed4e90d8ea3fe18ae32f9be4e0057 Mon Sep 17 00:00:00 2001
From: Simon Barner <barner@fortiss.org>
Date: Mon, 6 Sep 2021 17:07:35 +0200
Subject: [PATCH] Eliminate incorrect
 AnnotationInstSpec.getAnnotatedSpecification()

Issue-Ref: 4140
Issue-Url: #4140

Signed-off-by: Simon Barner <barner@fortiss.org>
---
 .../base/ui/annotation/view/fx/.ratings       |  8 ++---
 .../fx/AnnotationTreeTableUIProvider.java     | 35 +++++++++++--------
 .../view/fx/AnnotationViewFXController.java   | 14 ++++----
 .../ui/annotation/view/fx/ColumnHandle.java   |  4 +--
 .../fx/FXAnnotationFilterContentProvider.java | 10 +++---
 .../base/annotation/valueprovider/.ratings    |  2 +-
 .../valueprovider/AnnotationInstSpec.java     | 19 +++-------
 7 files changed, 44 insertions(+), 48 deletions(-)

diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/annotation/view/fx/.ratings b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/annotation/view/fx/.ratings
index d7f9efa40..074f71046 100644
--- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/annotation/view/fx/.ratings
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/annotation/view/fx/.ratings
@@ -1,6 +1,6 @@
 AnnotationFxViewPart.java ca1548c49aa3842a9436262531464ba345b83688 GREEN
-AnnotationTreeTableUIProvider.java 8a6be639582f761db85908cca42533ab9289808d YELLOW
-AnnotationViewFXController.java 87d70534cde579cbd5f6470e729783306a139324 GREEN
+AnnotationTreeTableUIProvider.java 85dfcf003c79d45f82c901b0f3f6bb30db59effa YELLOW
+AnnotationViewFXController.java 4351373c216d0aa4539784c9742f4db8bbf161e6 YELLOW
 AnnotationsFXUtils.java 754152735e037da59a4c40fa045602c3ed85a40f GREEN
-ColumnHandle.java 761c2517b3f3e4725feb7ce7e8d5927ba191a4bb GREEN
-FXAnnotationFilterContentProvider.java 2d3b32115f47bea44279e8bdf54691b93311d27b GREEN
+ColumnHandle.java 7b0fe536d4eb9faa63c4d812f0c078cf83d0fd42 YELLOW
+FXAnnotationFilterContentProvider.java ca4587ef5dce1288ee4d7bf3bea5bd544ce6b89e YELLOW
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/annotation/view/fx/AnnotationTreeTableUIProvider.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/annotation/view/fx/AnnotationTreeTableUIProvider.java
index 8a6be6395..85dfcf003 100644
--- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/annotation/view/fx/AnnotationTreeTableUIProvider.java
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/annotation/view/fx/AnnotationTreeTableUIProvider.java
@@ -58,10 +58,11 @@ import javafx.scene.paint.Color;
 				}
 				return "";
 			default:
-				IAnnotatedSpecification columnSpec = this.viewController.colIdxAnnotationMap
-						.get(column).getAnnotatedSpecification();
+				Class<? extends IAnnotatedSpecification> columnSpecType =
+						this.viewController.colIdxAnnotationMap.get(column)
+								.getAnnotatedSpecificationType();
 
-				Object specificationValue = entry.getSpecificationValue(columnSpec.getClass());
+				Object specificationValue = entry.getSpecificationValue(columnSpecType);
 				if(specificationValue != null) {
 					return specificationValue.toString();
 				}
@@ -89,9 +90,8 @@ import javafx.scene.paint.Color;
 	/** {@inheritDoc} */
 	@Override
 	public void updateValue(AnnotationEntry element, int column, Object value) {
-		IAnnotatedSpecification specification =
-				this.viewController.colIdxAnnotationMap.get(column).getAnnotatedSpecification();
-		this.viewController.setAnnotationEntryValue(specification, element, (String)value);
+		IAnnotatedSpecification spec = getAnnotation(column, element);
+		this.viewController.setAnnotationEntryValue(spec, element, (String)value);
 
 		super.updateValue(element, column, value);
 	}
@@ -99,24 +99,29 @@ import javafx.scene.paint.Color;
 	/** {@inheritDoc} */
 	@Override
 	public boolean isEditable(int column, AnnotationEntry ae) {
+		IAnnotatedSpecification spec = getAnnotation(column, ae);
+
+		// Check 'editable' predicate for specification/annotation contained by model element
+		// associated to given annotation entry (if it exists)
+		IAnnotationValueProvider<IAnnotatedSpecification> valueProvider =
+				spec != null ? ae.getAnnotationValueProvider(spec.getClass()) : null;
+		return valueProvider != null && valueProvider.canEdit(spec);
+	}
+
+	/** Get annotation specification associated to given annotation entry and column. */
+	private IAnnotatedSpecification getAnnotation(int column, AnnotationEntry ae) {
+
 		if(column > 1 && this.viewController.colIdxAnnotationMap.containsKey(column)) {
 			ColumnHandle<IAnnotatedSpecification> columnHandle =
 					this.viewController.colIdxAnnotationMap.get(column);
 
-			// Get annotation value provider for specification associated to given annotation entry
 			Class<IAnnotatedSpecification> specType = columnHandle.getAnnotatedSpecificationType();
 			IAnnotationValueService as = IAnnotationValueService.getInstance();
 			IAnnotatedSpecification spec =
 					as.getAnnotationEntry(ae.getModelElement()).getSpecification(specType);
-
-			// Check 'editable' predicate for specification/annotation contained by model element
-			// associated to given annotation entry (if it exists)
-			IAnnotationValueProvider<IAnnotatedSpecification> valueProvider =
-					spec != null ? ae.getAnnotationValueProvider(spec.getClass()) : null;
-			return valueProvider != null && valueProvider.canEdit(spec);
+			return spec;
 		}
-
-		return false;
+		return null;
 	}
 
 	/** {@inheritDoc} */
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/annotation/view/fx/AnnotationViewFXController.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/annotation/view/fx/AnnotationViewFXController.java
index 87d70534c..4351373c2 100644
--- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/annotation/view/fx/AnnotationViewFXController.java
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/annotation/view/fx/AnnotationViewFXController.java
@@ -250,7 +250,8 @@ public class AnnotationViewFXController extends CompositeFXControllerBase<SplitP
 		for(AnnotationEntry entry : annotationEntries) {
 			for(IAnnotatedSpecification spec : entry.getSpecificationsList()) {
 				ColumnHandle<IAnnotatedSpecification> columnHandle =
-						new ColumnHandle<IAnnotatedSpecification>(entry, spec);
+						new ColumnHandle<IAnnotatedSpecification>(entry,
+								(Class<IAnnotatedSpecification>)spec.getClass());
 				columnHandles.add(columnHandle);
 				colNameToSpecification.put(columnHandle.getColumnName(), spec);
 			}
@@ -390,12 +391,11 @@ public class AnnotationViewFXController extends CompositeFXControllerBase<SplitP
 	/** Creates the annotation column for the given handle. */
 	private TreeTableColumn<AnnotationEntry, ?> createColumnForHandle(int columnIdx,
 			ColumnHandle<IAnnotatedSpecification> handle) {
-		Class<IAnnotatedSpecification> annotationClass =
-				(Class<IAnnotatedSpecification>)handle.getAnnotatedSpecification().getClass();
+		Class<IAnnotatedSpecification> annotationType = handle.getAnnotatedSpecificationType();
 		AnnotationEntry entry = handle.getEntry();
 		IAnnotationValueProvider<IAnnotatedSpecification> valueProvider =
-				entry.getAnnotationValueProvider(annotationClass);
-		IAnnotatedSpecification specification = entry.getSpecification(annotationClass);
+				entry.getAnnotationValueProvider(annotationType);
+		IAnnotatedSpecification specification = entry.getSpecification(annotationType);
 		EClassifier valueType =
 				valueProvider.getEStructuralFeatureDescriptor().getEType(specification);
 
@@ -418,11 +418,11 @@ public class AnnotationViewFXController extends CompositeFXControllerBase<SplitP
 			column = annotationViewer.addComboColumn(columnName, 150, rowEntry -> {
 				ValueProviderBase<IAnnotatedSpecification> annotationValueProvider =
 						(ValueProviderBase<IAnnotatedSpecification>)rowEntry
-								.getAnnotationValueProvider(annotationClass);
+								.getAnnotationValueProvider(annotationType);
 				EStructuralFeatureDescriptor structuralFeature =
 						annotationValueProvider.getEStructuralFeatureDescriptor();
 				EClassifier type =
-						structuralFeature.getEType(rowEntry.getSpecification(annotationClass));
+						structuralFeature.getEType(rowEntry.getSpecification(annotationType));
 
 				// Get the enum literals again, as it might be different for each row.
 				if(type instanceof EEnum) {
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/annotation/view/fx/ColumnHandle.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/annotation/view/fx/ColumnHandle.java
index 761c2517b..7b0fe536d 100644
--- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/annotation/view/fx/ColumnHandle.java
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/annotation/view/fx/ColumnHandle.java
@@ -30,8 +30,8 @@ public class ColumnHandle<T extends IAnnotatedSpecification> extends AnnotationI
 		implements Comparable<ColumnHandle<T>> {
 
 	/** Constructs a new {@link ColumnHandle}. */
-	public ColumnHandle(AnnotationEntry entry, T annotatedSpecification) {
-		super(entry, annotatedSpecification);
+	public ColumnHandle(AnnotationEntry entry, Class<T> specType) {
+		super(entry, specType);
 	}
 
 	/**
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/annotation/view/fx/FXAnnotationFilterContentProvider.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/annotation/view/fx/FXAnnotationFilterContentProvider.java
index 2d3b32115..ca4587ef5 100644
--- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/annotation/view/fx/FXAnnotationFilterContentProvider.java
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/annotation/view/fx/FXAnnotationFilterContentProvider.java
@@ -175,8 +175,8 @@ public class FXAnnotationFilterContentProvider
 	 * Returns true if the given specification passes the current annotation type
 	 * filter.
 	 */
-	private boolean passesAnnotationTypeFilter(IAnnotatedSpecification spec) {
-		return annotationTypeFilter == null || spec.getClass().equals(annotationTypeFilter);
+	private boolean passesAnnotationTypeFilter(Class<? extends IAnnotatedSpecification> specType) {
+		return annotationTypeFilter == null || specType.equals(annotationTypeFilter);
 	}
 
 	/**
@@ -186,8 +186,8 @@ public class FXAnnotationFilterContentProvider
 	public boolean passesColumnFilter(ColumnHandle<?> columnHandle) {
 		// Whether the annotation is visible (i.e., not principally hidden from any
 		// view)
-		boolean passesHiddenFilter = !columnHandle.getEntry()
-				.isHidden(columnHandle.getAnnotatedSpecification().getClass());
+		boolean passesHiddenFilter =
+				!columnHandle.getEntry().isHidden(columnHandle.getAnnotatedSpecificationType());
 
 		// Pass name filter, if: name is not filtered, or the condition is met
 		boolean passesNameFilter =
@@ -196,7 +196,7 @@ public class FXAnnotationFilterContentProvider
 		// Check if column passes all tests
 		// @CodeFormatterOff
 		return passesHiddenFilter && passesNameFilter && passesSelectedElementTypeFilter(columnHandle.getEntry())
-				&& passesAnnotationTypeFilter(columnHandle.getAnnotatedSpecification());
+				&& passesAnnotationTypeFilter(columnHandle.getAnnotatedSpecificationType());
 		// @CodeFormatterOn
 	}
 
diff --git a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/annotation/valueprovider/.ratings b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/annotation/valueprovider/.ratings
index 871aae58b..23a7ffec9 100644
--- a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/annotation/valueprovider/.ratings
+++ b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/annotation/valueprovider/.ratings
@@ -1,4 +1,4 @@
-AnnotationInstSpec.java b4f2ed47a8984e751e04049de5bdb3cad2c0a933 GREEN
+AnnotationInstSpec.java 7a6cb55bfa9cafa9ead1f72089e554ee8142e8bf YELLOW
 DerivedAnnotationValueProviderBase.java afedd21d3469127bbb20adb34c191b5c9c980f6c GREEN
 EStructuralFeatureDescriptor.java 9665d0d3040278243dd37591535e411a90fa63bf GREEN
 EStructuralFeatureValueProviderBase.java 287facbbce47c16d892bae82a214f64ceeef2263 GREEN
diff --git a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/annotation/valueprovider/AnnotationInstSpec.java b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/annotation/valueprovider/AnnotationInstSpec.java
index b4f2ed47a..7a6cb55bf 100644
--- a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/annotation/valueprovider/AnnotationInstSpec.java
+++ b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/annotation/valueprovider/AnnotationInstSpec.java
@@ -35,12 +35,12 @@ public class AnnotationInstSpec<T extends IAnnotatedSpecification> {
 	 * {@link IAnnotatedSpecification} from {@code entry} to be displayed in the column
 	 * represented by this {@link AnnotationInstSpec}.
 	 */
-	private IAnnotatedSpecification annotatedSpecification;
+	private Class<T> specType;
 
 	/** Constructor. */
-	public AnnotationInstSpec(AnnotationEntry entry, T annotatedSpecification) {
+	public AnnotationInstSpec(AnnotationEntry entry, Class<T> specType) {
 		this.entry = entry;
-		this.annotatedSpecification = annotatedSpecification;
+		this.specType = specType;
 	}
 
 	/**
@@ -52,20 +52,11 @@ public class AnnotationInstSpec<T extends IAnnotatedSpecification> {
 	}
 
 	/**
-	 * Returns the {@link IAnnotatedSpecification} from {@code entry} to be displayed in the
+	 * Returns the type of {@link IAnnotatedSpecification} from {@code entry} to be displayed in the
 	 * column represented by this {@link AnnotationInstSpec}.
 	 */
-	@SuppressWarnings("unchecked")
 	public Class<T> getAnnotatedSpecificationType() {
-		return (Class<T>)annotatedSpecification.getClass();
-	}
-
-	/**
-	 * Returns the {@link IAnnotatedSpecification} from {@code entry} to be displayed in the
-	 * column represented by this {@link AnnotationInstSpec}.
-	 */
-	public IAnnotatedSpecification getAnnotatedSpecification() {
-		return annotatedSpecification;
+		return specType;
 	}
 
 	/**
-- 
GitLab