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