From 5c29401c19473afb40cfc3b5e315b853af243d4f Mon Sep 17 00:00:00 2001 From: Simon Barner <barner@fortiss.org> Date: Tue, 16 Jan 2018 16:35:55 +0000 Subject: [PATCH] Remove support to dynamically create annotation instances. The feature is unused. refs 2964 --- .../ui/annotation/editingsupport/.ratings | 3 +- .../editingsupport/EditingSupportFactory.java | 31 -- .../base/ui/annotation/view/generic/.ratings | 5 +- .../annotation/view/generic/ColumnHandle.java | 26 +- .../CreateAnnotationInstanceColumn.java | 313 ------------------ .../view/generic/GenericAnnotationView.java | 57 ++-- .../fortiss/tooling/base/annotation/.ratings | 3 +- .../base/annotation/AnnotationEntry.java | 27 +- .../base/annotation/valueprovider/.ratings | 6 +- ...icInstanceAnnotationValueProviderBase.java | 165 --------- .../IAnnotationValueProvider.java | 25 +- .../valueprovider/ValueProviderBase.java | 10 +- 12 files changed, 36 insertions(+), 635 deletions(-) delete mode 100644 org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/generic/CreateAnnotationInstanceColumn.java delete mode 100644 org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/annotation/valueprovider/DynamicInstanceAnnotationValueProviderBase.java diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/editingsupport/.ratings b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/editingsupport/.ratings index cd988797a..b36f90079 100644 --- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/editingsupport/.ratings +++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/editingsupport/.ratings @@ -1,8 +1,7 @@ - AnnotationEditingSupportBase.java 7a16abe842cb44918d75395947bb6561e468ca03 GREEN CheckBoxEditingSupport.java c7bc95da565bad53a125ff08982ea73ba06da3e5 GREEN ComboBoxEditingSupport.java 1c778b6017f791339483606a31b72d0f8a39098c GREEN -EditingSupportFactory.java df0d9c107a40165db19431cf33c297d52e8ebc73 GREEN +EditingSupportFactory.java c72b4847ba219755178b785ea80f91295f259760 YELLOW ElementCommentEditingSupport.java b7cbec5084aab81efc1da6b48647b172206f6256 GREEN ElementEditingSupportBase.java e04393748a0a0223b838fc59ef3c0e4f0960951b GREEN ElementNameEditingSupport.java 6393bb52ad1f7ff4823a3f0dd30128124b0e3347 GREEN diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/editingsupport/EditingSupportFactory.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/editingsupport/EditingSupportFactory.java index a888fa82e..66d37d1d4 100644 --- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/editingsupport/EditingSupportFactory.java +++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/editingsupport/EditingSupportFactory.java @@ -31,7 +31,6 @@ import org.eclipse.jface.viewers.ColumnViewer; import org.eclipse.jface.viewers.EditingSupport; import org.fortiss.tooling.base.annotation.AnnotationEntry; import org.fortiss.tooling.base.annotation.valueprovider.DerivedAnnotationValueProviderBase; -import org.fortiss.tooling.base.annotation.valueprovider.DynamicInstanceAnnotationValueProviderBase; import org.fortiss.tooling.base.annotation.valueprovider.EStructuralFeatureDescriptor; import org.fortiss.tooling.base.annotation.valueprovider.EStructuralFeatureDescriptor.EReferenceScope; import org.fortiss.tooling.base.annotation.valueprovider.EStructuralFeatureValueProviderBase; @@ -69,32 +68,6 @@ public class EditingSupportFactory { specification, instanceKey); } - /** - * Creates the {@link EditingSupport} for annotations that can be instantiated dynamically. - * - * @param valueProvider - * Annotation's {@link IAnnotationValueProvider} - * @param viewer - * {@link ColumnViewer} used to display annotation - * @param clazz - * Annotation type - * @param specification - * Annotation instance - * @param instanceKey - * Key identifying annotation instance - * - * @return {@link EditingSupport} for annotations that can be instantiated dynamically. - */ - private static - <T extends IAnnotatedSpecification, V extends DynamicInstanceAnnotationValueProviderBase<T>> - EditingSupport createEditingSupport4DynamicInstanceAnnotationValueProviderBase( - V valueProvider, ColumnViewer viewer, - Class<? extends IAnnotatedSpecification> clazz, T specification, - String instanceKey) throws Exception { - - return new TextEditingSupport(viewer, clazz, instanceKey); - } - /** * Creates the {@link EditingSupport} that is directly based on * {@link EStructuralFeatureValueProviderBase}. @@ -291,10 +264,6 @@ public class EditingSupportFactory { return createEditingSupport4DerivedAnnotationValueProviderBase( (DerivedAnnotationValueProviderBase)valueProvider, viewer, clazz, (IDerivedAnnotation)specification, instanceKey); - } else if(valueProvider instanceof DynamicInstanceAnnotationValueProviderBase<?>) { - return createEditingSupport4DynamicInstanceAnnotationValueProviderBase( - (DynamicInstanceAnnotationValueProviderBase)valueProvider, viewer, clazz, - specification, instanceKey); } else if(valueProvider instanceof EStructuralFeatureValueProviderBase<?>) { return createEditingSupport4EStructuralFeatureValueProviderBase( (EStructuralFeatureValueProviderBase<T>)valueProvider, viewer, clazz, diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/generic/.ratings b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/generic/.ratings index 7b9c70dd3..efb8d9074 100644 --- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/generic/.ratings +++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/generic/.ratings @@ -1,5 +1,4 @@ - -ColumnHandle.java cb484315e4830bd03301f3e920f0eaf4465d4e7d GREEN +ColumnHandle.java 7fac3dbdd7da328052cbee3fa180ac78f51987e8 YELLOW CreateAnnotationInstanceColumn.java f0e630afc37340c71d1afdf037b2df3c0f397a58 GREEN -GenericAnnotationView.java f1c6be1cac276280724bfcfb94b991f811f75928 GREEN +GenericAnnotationView.java 6b1bcf8e6a561aa586463cf6da9da8b2624a7c71 YELLOW HierarchicalNameViewerComparator.java edf1d012a3d18860d2ef7f9e07baf46cdfeec381 GREEN diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/generic/ColumnHandle.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/generic/ColumnHandle.java index 5c8c5a8bf..bfe2dd9b1 100644 --- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/generic/ColumnHandle.java +++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/generic/ColumnHandle.java @@ -34,24 +34,11 @@ public class ColumnHandle<T extends IAnnotatedSpecification> extends AnnotationI */ private final static String MULTIINSTANCE_NAME_SEPARATOR = ":"; - /** Flag if this {@link ColumnHandle} represents a {@link CreateAnnotationInstanceColumn}. */ - private boolean isCreateColumn; - /** Constructs a new {@link ColumnHandle}. */ @SuppressWarnings("unchecked") - public ColumnHandle(AnnotationEntry entry, T annotatedSpecification, String instanceKey, - boolean isCreateColumn) { + public ColumnHandle(AnnotationEntry entry, T annotatedSpecification, String instanceKey) { super(entry, (Class<T>)annotatedSpecification.getClass(), annotatedSpecification, instanceKey); - this.isCreateColumn = isCreateColumn; - } - - /** - * Returns a flag if this {@link ColumnHandle} represents a - * {@link CreateAnnotationInstanceColumn}. - */ - public boolean isCreateColumn() { - return isCreateColumn; } /** @@ -99,16 +86,7 @@ public class ColumnHandle<T extends IAnnotatedSpecification> extends AnnotationI // Place "create" columns (label: "<specification name>") after their instances // (which are labeled "<specification name>: <instance name>"). if(annotationName.equals(otherAnnotationName)) { - // Ensure uniqueness of "create" columns" - if(isCreateColumn && other.isCreateColumn) { - return 0; - } - if(isCreateColumn) { - return 1; - } - if(other.isCreateColumn) { - return -1; - } + return 0; } // Sort alphabetically by specification column label diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/generic/CreateAnnotationInstanceColumn.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/generic/CreateAnnotationInstanceColumn.java deleted file mode 100644 index 6bb42a2ae..000000000 --- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/generic/CreateAnnotationInstanceColumn.java +++ /dev/null @@ -1,313 +0,0 @@ -/*-------------------------------------------------------------------------+ -| Copyright 2014 fortiss GmbH | -| | -| Licensed under the Apache License, Version 2.0 (the "License"); | -| you may not use this file except in compliance with the License. | -| You may obtain a copy of the License at | -| | -| http://www.apache.org/licenses/LICENSE-2.0 | -| | -| Unless required by applicable law or agreed to in writing, software | -| distributed under the License is distributed on an "AS IS" BASIS, | -| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | -| See the License for the specific language governing permissions and | -| limitations under the License. | -+--------------------------------------------------------------------------*/ -package org.fortiss.tooling.base.ui.annotation.view.generic; - -import static org.eclipse.jface.dialogs.MessageDialog.openError; - -import org.eclipse.emf.common.notify.Notification; -import org.eclipse.emf.common.notify.impl.NotificationImpl; -import org.eclipse.emf.common.util.EMap; -import org.eclipse.emf.ecore.EClass; -import org.eclipse.emf.ecore.EStructuralFeature; -import org.eclipse.jface.dialogs.IInputValidator; -import org.eclipse.jface.dialogs.InputDialog; -import org.eclipse.jface.viewers.ColumnLabelProvider; -import org.eclipse.jface.viewers.TableViewer; -import org.eclipse.jface.viewers.TableViewerColumn; -import org.eclipse.jface.viewers.ViewerCell; -import org.eclipse.jface.viewers.ViewerColumn; -import org.eclipse.jface.window.Window; -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.TableEditor; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Listener; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Table; -import org.eclipse.swt.widgets.TableColumn; -import org.eclipse.swt.widgets.TableItem; -import org.fortiss.tooling.base.annotation.AnnotationEntry; -import org.fortiss.tooling.base.annotation.IAnnotationValueService; -import org.fortiss.tooling.base.model.element.IAnnotatedSpecification; -import org.fortiss.tooling.base.model.element.IModelElement; -import org.fortiss.tooling.kernel.extension.data.ITopLevelElement; -import org.fortiss.tooling.kernel.service.IPersistencyService; - -/** - * <p> - * This class is responsible to construct a column which holds a button that allows adding new - * instance for multi-instance annotations. - * </p> - * - * <p> - * This class is in part based on code from the class {@link TableViewerColumn} - * </p> - * . - * - * @author diewald, barner - */ -public class CreateAnnotationInstanceColumn extends ViewerColumn { - /** The column to be added to the table. */ - private TableColumn column; - - /** Annotation specification this column refers to. */ - private IAnnotatedSpecification columnSpec; - - /** Annotation entry the specification {@code columnSpec} is associated with. */ - private AnnotationEntry columnSpecAnnEntry; - - /** - * The button which opens a dialog to create new values for the specification {@code columnSpec} - * . - */ - private Button crButton; - - /** - * Creates a new viewer column for the given {@link TableViewer} on a new {@link TableColumn} - * with the given style bits. The column is added at the end of the list of columns. - * - * @param viewer - * the table viewer to which this column belongs. - * @param style - * the style used to create the column, for applicable style bits - * see {@link TableColumn}. - * @see TableColumn#TableColumn(Table, int) - */ - public CreateAnnotationInstanceColumn(TableViewer viewer, int style) { - this(viewer, style, -1); - } - - /** - * Creates a new viewer column for the given {@link TableViewer} on a new {@link TableColumn} - * with the given style bits. The column is inserted at the given index into the list of - * columns. - * - * @param viewer - * the table viewer to which this column belongs. - * @param style - * the style used to create the column, for applicable style bits - * see {@link TableColumn}. - * @param index - * the index at which to place the newly created column. - * @see TableColumn#TableColumn(Table, int, int) - */ - public CreateAnnotationInstanceColumn(TableViewer viewer, int style, int index) { - this(viewer, createColumn(viewer.getTable(), style, index)); - } - - /** - * This class creates a standard table columns by calling the default of this class which is - * taken form {@link TableViewerColumn}. Additionally, it sets some specific values that are - * associated with the given annotation specification {@code spec}. Furthermore, it manages the - * creation and the functionality of the 'create' button and the associated dialog. - * - * @param viewer - * the table in which the column shall appear. - * @param style - * the column's style. - * @param spec - * the annotation specification that this class shall refer to. - * @param entry - * the {@link AnnotationEntry} associated with the given specification {@code spec}. - */ - public CreateAnnotationInstanceColumn(TableViewer viewer, int style, - IAnnotatedSpecification spec, AnnotationEntry entry) { - this(viewer, style, -1); - - columnSpec = spec; - columnSpecAnnEntry = entry; - column.setText(entry.getSpecificationAnnotationName(spec.getClass())); - - setLabelProvider(new CreateNewAnnotationColumn()); - column.addDisposeListener(new DisposeListener() { - - @Override - public void widgetDisposed(DisposeEvent e) { - if(crButton != null) { - crButton.dispose(); - crButton = null; - } - } - }); - } - - /** - * Creates a new viewer column for the given {@link TableViewer} on the given - * {@link TableColumn}. - * - * @param viewer - * the table viewer to which this column belongs. - * @param column - * the underlying table column. - */ - public CreateAnnotationInstanceColumn(TableViewer viewer, TableColumn column) { - super(viewer, column); - this.column = column; - } - - /** Creates the column by instantiating {@link TableColumn}. */ - private static TableColumn createColumn(Table table, int style, int index) { - if(index >= 0) { - return new TableColumn(table, style, index); - } - - return new TableColumn(table, style); - } - - /** Returns the underlying SWT table column. */ - public TableColumn getColumn() { - return column; - } - - /** - * Creates the content of a new column via the update method of the table viewer to provide a - * "Create" button in the first row such that new values can be added to the table. - */ - private class CreateNewAnnotationColumn extends ColumnLabelProvider { - /** {@inheritDoc} */ - @Override - public void update(ViewerCell cell) { - - TableItem item = (TableItem)cell.getItem(); - - if(columnSpec != null && crButton == null) { - crButton = new Button((Composite)cell.getViewerRow().getControl(), SWT.NONE); - crButton.setText("Create"); - - crButton.addListener(SWT.Selection, new CreateButtonListener()); - - TableEditor editor = new TableEditor(item.getParent()); - editor.grabHorizontal = true; - editor.grabVertical = true; - editor.setEditor(crButton, item, cell.getColumnIndex()); - editor.layout(); - } - } - } - - /** - * This Listener watches the "Create" button such that a dialog is opened if pressed and a new - * key can be added to the specification type of this column. - */ - private class CreateButtonListener implements Listener { - /** {@inheritDoc} */ - @Override - public void handleEvent(Event event) { - if(event.widget == crButton) { - InputDialog dlg = - new InputDialog(Display.getCurrent().getActiveShell(), "Create Annotation", - "Enter the name of the new annotation", "", - new AnnotationNameValidator()); - if(dlg.open() == Window.OK) { - final String instanceKey = dlg.getValue(); - - // Register the new annotation instance with the model, by writing a null value - // for the input key provided by the user. A write transaction / a switch to the - // model context is required to modify the from the GUI context. - IModelElement modelElt = columnSpecAnnEntry.getModelElement(); - ITopLevelElement modelContext = - IPersistencyService.getInstance().getTopLevelElementFor(modelElt); - modelContext - .runAsCommand(() -> { - try { - String value = populateInstance(); - IAnnotationValueService avs = - IAnnotationValueService.getInstance(); - AnnotationEntry entry = avs.getAnnotationEntry(modelElt); - - entry.setSpecificationValue(value, columnSpec.getClass(), - instanceKey); - // Inform others, e.g. the respective annotation view that a new - // instance of this annotation has been created. - modelElt.eNotify(new NotificationImpl(Notification.SET, null, - null) { - @Override - public Object getNotifier() { - return modelElt; - } - }); - } catch(IllegalArgumentException e) { - openError( - new Shell(), - "ERROR", - "The value you entered does not have the desired type.\nDetailed message:\n" + - e.getMessage()); - } catch(Exception e) { - openError(new Shell(), "ERROR", e.getMessage()); - } - }); - } - } - } - } - - /** Populate new instance (in order to make the corresponding cells editable */ - private String populateInstance() { - String value = ""; - if(!columnSpec.eClass().getEStructuralFeatures().isEmpty()) { - // get(0) is safe because list is guaranteed to be non-empty. - // Furthermore, the first element is the one to use, since... - EStructuralFeature dynamicInstanceFeature = - columnSpec.eClass().getEStructuralFeatures().get(0); - - // ...annotations that can be dynamically instantiated are implemented using an - // appropriate EMap (which by convention has to be the first (and only)) feature of the - // corresponding annotation class. - if(dynamicInstanceFeature.getEType().getInstanceTypeName() - .equals("java.util.Map$Entry")) { - - // Determine value type - EStructuralFeature valueFeature = - ((EClass)dynamicInstanceFeature.getEType()).getEStructuralFeature("value"); - if(Number.class.isAssignableFrom(valueFeature.getEType().getInstanceClass())) { - - // Initialize numbers with 0 (initialization fails with "") - value = "0"; - } - } - } - return value; - } - - /** - * Provides a {@link IInputValidator} which checks if an input string is not an existing - * annotation name. - */ - class AnnotationNameValidator implements IInputValidator { - /** - * Validates the String. Returns null for no error, or an error message - * - * @param inputText - * the String to validate - * @return String - */ - @Override - public String isValid(String inputText) { - @SuppressWarnings("unchecked") EMap<String, ?> kVMap = - (EMap<String, ?>)columnSpecAnnEntry - .getSpecificationValue(columnSpec.getClass()); - if(kVMap != null) { - if(kVMap.containsKey(inputText)) - return "You cannot create a new key that already exists for the selected specification class."; - } - return null; - } - } -} diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/generic/GenericAnnotationView.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/generic/GenericAnnotationView.java index 466d946a1..211824281 100644 --- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/generic/GenericAnnotationView.java +++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/annotation/view/generic/GenericAnnotationView.java @@ -242,28 +242,21 @@ public class GenericAnnotationView extends AnnotationViewPartBase { // Create new column for each instance of the current multi-instance annotation Class<? extends IAnnotatedSpecification> specClass = spec.getClass(); boolean isSingleInstanceAnnotation = entry.getInstanceKeys(specClass).isEmpty(); - boolean allowsDynamicInstances = - entry.allowsDynamicAnnotationInstances(specClass); - if(allowsDynamicInstances || !isSingleInstanceAnnotation) { + if(!isSingleInstanceAnnotation) { for(String instanceKey : entry.getInstanceKeys(specClass)) { ColumnHandle<IAnnotatedSpecification> columnHandle = new ColumnHandle<IAnnotatedSpecification>(entry, spec, - instanceKey, false); + instanceKey); if(annotationFilter.passesColumnFilter(columnHandle)) { sortedColumnHandles.add(columnHandle); } } - } + } else { - // Create a new column for - // - ordinary (single-instance) annotations - // - "create" column for multi-instance annotations for which instances can be - // created dynamically - if(allowsDynamicInstances || isSingleInstanceAnnotation) { + // Create a new column for ordinary (single-instance) annotations ColumnHandle<IAnnotatedSpecification> columnHandle = - new ColumnHandle<IAnnotatedSpecification>(entry, spec, null, - allowsDynamicInstances); + new ColumnHandle<IAnnotatedSpecification>(entry, spec, null); if(annotationFilter.passesColumnFilter(columnHandle)) { sortedColumnHandles.add(columnHandle); @@ -687,34 +680,22 @@ public class GenericAnnotationView extends AnnotationViewPartBase { ColumnHandle<? extends IAnnotatedSpecification> columnHandle) { TableColumn tableColumn = null; - if(columnHandle.isCreateColumn()) { - // Create column that contains a button for adding new instances of the - // current annotation type. + @SuppressWarnings("unchecked") Class<IAnnotatedSpecification> annotationClass = + (Class<IAnnotatedSpecification>)columnHandle.getAnnotatedSpecification().getClass(); + + // Add new column + try { + @SuppressWarnings("unchecked") TableViewerColumn column = + createAnnotationTableViewerColumn( + (ColumnHandle<IAnnotatedSpecification>)columnHandle, annotationClass); - CreateAnnotationInstanceColumn column = - new CreateAnnotationInstanceColumn(tableViewer, SWT.NONE, - columnHandle.getAnnotatedSpecification(), columnHandle.getEntry()); tableColumn = column.getColumn(); - } else { - @SuppressWarnings("unchecked") Class<IAnnotatedSpecification> annotationClass = - (Class<IAnnotatedSpecification>)columnHandle.getAnnotatedSpecification() - .getClass(); - - // Add new column - try { - @SuppressWarnings("unchecked") TableViewerColumn column = - createAnnotationTableViewerColumn( - (ColumnHandle<IAnnotatedSpecification>)columnHandle, - annotationClass); - - tableColumn = column.getColumn(); - String specName = columnHandle.getColumnName(); - tableColumn.setText(specName); - } catch(Exception e) { - System.out.println("Failed to create table viewer column for annotation class " + - annotationClass.getCanonicalName() + - ((e.getMessage() != null) ? ": " + e.getMessage() : ".")); - } + String specName = columnHandle.getColumnName(); + tableColumn.setText(specName); + } catch(Exception e) { + System.out.println("Failed to create table viewer column for annotation class " + + annotationClass.getCanonicalName() + + ((e.getMessage() != null) ? ": " + e.getMessage() : ".")); } if(tableColumn != null) { diff --git a/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/annotation/.ratings b/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/annotation/.ratings index e04f2b87e..72b6497af 100644 --- a/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/annotation/.ratings +++ b/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/annotation/.ratings @@ -1,4 +1,3 @@ - -AnnotationEntry.java 653f23f2e90f8261aa09172cd3db24ba88e6777e GREEN +AnnotationEntry.java d3405f0bbc26452812b0bc65043291fdac805287 YELLOW AnnotationValueService.java 8e999ff1c54a15018f19117900822d2a749360e1 GREEN IAnnotationValueService.java ab22e1bf3e021f5f897d4d5a20e5fc51e084c734 GREEN diff --git a/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/annotation/AnnotationEntry.java b/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/annotation/AnnotationEntry.java index 2958f6ac7..ef468a265 100644 --- a/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/annotation/AnnotationEntry.java +++ b/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/annotation/AnnotationEntry.java @@ -15,9 +15,10 @@ +--------------------------------------------------------------------------*/ package org.fortiss.tooling.base.annotation; +import static java.util.Collections.emptyList; + import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -257,9 +258,7 @@ public final class AnnotationEntry { /** * Returns the instance keys supported by the respective {@link IAnnotationValueProvider}. - * {@link IAnnotationValueProvider}s can either define a static {@link List}, or enable the - * dynamic creation of instance keys using {@link #allowsDynamicAnnotationInstances(Class)}. In - * the latter case, this method returns current list of dynamic annotation instances. + * {@link IAnnotationValueProvider}s (defined a static {@link List}). */ public Collection<String> getInstanceKeys(Class<? extends IAnnotatedSpecification> clazz) { @@ -269,25 +268,7 @@ public final class AnnotationEntry { return getAnnotationValueProvider(clazz).getInstanceKeys(specification); } - return Collections.emptyList(); - } - - /** - * Indicates whether the given specification contains a value type allowing the storage of - * dynamically created instances of the annotation (like a list of strings). Static instances - * can be implemented by overriding - * {@link IAnnotationValueProvider#getInstanceKeys(IAnnotatedSpecification)} and returning the - * {@link List} of admissible instance keys. - */ - public boolean allowsDynamicAnnotationInstances(Class<? extends IAnnotatedSpecification> clazz) { - - IAnnotatedSpecification specification = getSpecification(clazz); - - if(isOperationEnabled(specification)) { - return getAnnotationValueProvider(clazz).allowsDynamicAnnotationInstances(); - } - - return false; + return emptyList(); } /** Returns {@link #modelElement}. */ diff --git a/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/annotation/valueprovider/.ratings b/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/annotation/valueprovider/.ratings index 21183bbc9..1b476cd92 100644 --- a/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/annotation/valueprovider/.ratings +++ b/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/annotation/valueprovider/.ratings @@ -1,8 +1,6 @@ - AnnotationInstSpec.java 86eaeb6f2f5b8d4a8322de69ff5196101b811b0a GREEN DerivedAnnotationValueProviderBase.java 79e0a62f9cafb2cf8eebb3af7b9597cab8b820bf GREEN -DynamicInstanceAnnotationValueProviderBase.java 223db3e74361b61bb5a71cbb61e218a294c31dbb GREEN EStructuralFeatureDescriptor.java b4093c8997472d0ab63a69c1d025d9aeb9b4f294 GREEN EStructuralFeatureValueProviderBase.java c09e93e99816d02176fe9ee6343269ac20883f30 GREEN -IAnnotationValueProvider.java 268398d84324d20bfc885ddf69f1f934a83f76c2 GREEN -ValueProviderBase.java f31d18aebcaf22bd29d5f897773d4a5fea9667e0 GREEN +IAnnotationValueProvider.java 40effc71478aa1429dfce90ac8ed6e1e462d0044 YELLOW +ValueProviderBase.java 3138017b6c19933551b5e46033107df5ad954352 YELLOW diff --git a/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/annotation/valueprovider/DynamicInstanceAnnotationValueProviderBase.java b/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/annotation/valueprovider/DynamicInstanceAnnotationValueProviderBase.java deleted file mode 100644 index 246115596..000000000 --- a/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/annotation/valueprovider/DynamicInstanceAnnotationValueProviderBase.java +++ /dev/null @@ -1,165 +0,0 @@ -/*-------------------------------------------------------------------------+ -| Copyright 2014 fortiss GmbH | -| | -| Licensed under the Apache License, Version 2.0 (the "License"); | -| you may not use this file except in compliance with the License. | -| You may obtain a copy of the License at | -| | -| http://www.apache.org/licenses/LICENSE-2.0 | -| | -| Unless required by applicable law or agreed to in writing, software | -| distributed under the License is distributed on an "AS IS" BASIS, | -| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | -| See the License for the specific language governing permissions and | -| limitations under the License. | -+--------------------------------------------------------------------------*/ -package org.fortiss.tooling.base.annotation.valueprovider; - -import static java.util.Collections.emptyList; -import static java.util.Collections.sort; - -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.emf.common.util.EMap; -import org.eclipse.emf.ecore.EAttribute; -import org.eclipse.emf.ecore.EClass; -import org.eclipse.emf.ecore.EDataType; -import org.eclipse.emf.ecore.EFactory; -import org.eclipse.emf.ecore.EReference; -import org.fortiss.tooling.base.model.element.IAnnotatedSpecification; - -/** - * <p> - * Base class for {@link IAnnotationValueProvider}s that support {@link IAnnotatedSpecification} for - * which multiple instances can be dynamically created. For each model element, a single instance of - * this {@link IAnnotatedSpecification} exists whose storage is implemented by a {@link EMap} - * {@code <EString, V>}, where the key is used as the instance name, and V is an EClass depicting - * the annotation type (e.g., {@code EString, EIntegerObject, ...}. - * </p> - * - * <p> - * The underlying {@link EMap} must be declared in the {@link IAnnotatedSpecification}'s metamodel - * as detailed here: <a href="http://wiki.eclipse.org/EMF/FAQ#How_do_I_create_a_Map_in_EMF.3F"> - * http://wiki.eclipse.org/EMF/FAQ#How_do_I_create_a_Map_in_EMF.3F</a>. - * </p> - * - * @author diewald, barner - */ -public abstract class DynamicInstanceAnnotationValueProviderBase<T extends IAnnotatedSpecification> - extends EStructuralFeatureValueProviderBase<T> { - - /** - * {@link EDataType} of the value type V of the underlying EMap<String, V> storing the - * annotation instances. - */ - EDataType valueDataType; - - /** - * {@link EFactory} to construct (in particular from a {@link String} representation instances - * of the value type V of the underlying EMap<String, V> storing the annotation instances. - */ - EFactory valueFactory; - - /** - * Constructs a multi-instance enabled {@link IAnnotationValueProvider} for a - * {@link IAnnotatedSpecification} whose storage is implemented by a single {@link EAttribute}. - */ - public DynamicInstanceAnnotationValueProviderBase(EClass annotatedSpecificationEClass, - EAttribute eAttribute, EDataType valueDataType, EFactory valueFactory) { - super(annotatedSpecificationEClass, eAttribute); - this.valueDataType = valueDataType; - this.valueFactory = valueFactory; - } - - /** - * Constructs a multi-instance enabled {@link IAnnotationValueProvider} for a - * {@link IAnnotatedSpecification} whose storage is implemented by a single {@link EReference}. - */ - public DynamicInstanceAnnotationValueProviderBase(EClass annotatedSpecificationEClass, - EReference eReference, EStructuralFeatureDescriptor.EReferenceScope eReferenceScope, - EDataType valueDataType, EFactory valueFactory) { - super(annotatedSpecificationEClass, eReference, eReferenceScope); - this.valueDataType = valueDataType; - this.valueFactory = valueFactory; - } - - /** {@inheritDoc} */ - @Override - public <V> V getAnnotationValue(T specification, String instanceKey) throws Exception { - // Return value of current instance (entry map containing all instances of the annotation) - EMap<String, V> map = super.getAnnotationValue(specification, DEFAULT_KEY); - - return map.get(instanceKey); - } - - /** - * Sets a value for a multi-instance {@link IAnnotatedSpecification} from a {@link String} - * representation of the input. - */ - @Override - @SuppressWarnings("unchecked") - protected <V> void setAnnotationValueFromString(String value, T specification, - String instanceKey) throws Exception { - EMap<String, V> map = super.getAnnotationValue(specification, DEFAULT_KEY); - - // Try to create annotation value from string representation - V val = (V)valueFactory.createFromString(valueDataType, value); - if(val == null) { - // If that fails, use the value types default value - val = (V)valueDataType.getDefaultValue(); - if(val == null) { - // in case that should be null, too, assume it is a number and initialize it to 0. - val = (V)valueFactory.createFromString(valueDataType, "0"); - } - } - - map.put(instanceKey, val); - } - - /** {@inheritDoc} */ - @Override - public <V> void setAnnotationValue(V value, T specification, String instanceKey) - throws Exception { - if(value instanceof String) { - setAnnotationValueFromString((String)value, specification, instanceKey); - } else { - EMap<String, V> map = super.getAnnotationValue(specification, DEFAULT_KEY); - map.put(instanceKey, value); - } - } - - /** {@inheritDoc} */ - @Override - public void setAnnotationValue(String value, T specification, String instanceKey) - throws Exception { - setAnnotationValueFromString(value, specification, instanceKey); - } - - /** {@inheritDoc} */ - @Override - public List<String> getInstanceKeys(T specification) { - // Return the (sorted) list of dynamic instances created so far. - EMap<String, ?> kVMap = null; - - try { - kVMap = super.getAnnotationValue(specification, DEFAULT_KEY); - } catch(Exception e) { - return emptyList(); - } - - if(kVMap != null) { - List<String> rval = new ArrayList<String>(kVMap.keySet()); - - sort(rval); - return rval; - } - return emptyList(); - } - - /** {@inheritDoc} */ - @Override - public boolean allowsDynamicAnnotationInstances() { - return true; - } -} diff --git a/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/annotation/valueprovider/IAnnotationValueProvider.java b/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/annotation/valueprovider/IAnnotationValueProvider.java index e333fccf9..761f41ce4 100644 --- a/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/annotation/valueprovider/IAnnotationValueProvider.java +++ b/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/annotation/valueprovider/IAnnotationValueProvider.java @@ -42,11 +42,8 @@ import org.fortiss.tooling.kernel.service.base.IEObjectAware; * </p> * Instance keys: * <ul> - * <li>Since multiple instances can exist for a single {@link IAnnotatedSpecification} (dynamic - * instantiation by the user (see {@link DynamicInstanceAnnotationValueProviderBase}), <b>instance - * keys</b> are used to differentiate the different instances.</li> - * <li>Additionally, keys are used to differentiate the different annotations that can be hosted by - * a single {@link IAnnotatedSpecification}. A typical use case is a single + * <li>Kys are used to differentiate the different annotations that can be hosted by a single + * {@link IAnnotatedSpecification}. A typical use case is a single * {@link EStructuralFeatureValueProviderBase} that supports multiple (or all) * {@link EStructuralFeature} provided by single annotation class.</li> * <li>In case the annotation only provides a single value, the {@link #DEFAULT_KEY} is used. For @@ -408,29 +405,13 @@ public interface IAnnotationValueProvider<T extends IAnnotatedSpecification> ext /** * Returns the instance keys supported by this {@link IAnnotationValueProvider}. - * {@link IAnnotationValueProvider}s can either define a static {@link List}, or enable the - * dynamic creation of instance keys using {@link #allowsDynamicAnnotationInstances()}. In the - * latter case, this method returns current list of dynamic annotation instances. + * {@link IAnnotationValueProvider}s can either define a static {@link List}. */ public Collection<String> getInstanceKeys(T specification); /** Returns the {@link EStructuralFeatureDescriptor} for a given {@code instanceKey}. */ public EStructuralFeatureDescriptor getEStructuralFeatureDescriptor(String instanceKey); - /** - * <p> - * Predicate whether the {@link IAnnotatedSpecification} managed by this - * {@link IAnnotationValueProvider} contains a value type allowing the storage of dynamically - * created instances of the annotation (like a list of strings). - * </p> - * <p> - * Static instances can be implemented by overriding - * {@link #getInstanceKeys(IAnnotatedSpecification)} and returning the {@link List} of - * admissible instance keys. - * </p> - */ - public boolean allowsDynamicAnnotationInstances(); - /** * <p> * Returns a list of {@link AnnotationActionEntry}s <--> {@link BiConsumer} {@link Pair}s that diff --git a/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/annotation/valueprovider/ValueProviderBase.java b/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/annotation/valueprovider/ValueProviderBase.java index 28b8eb1ef..2bd6753cb 100644 --- a/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/annotation/valueprovider/ValueProviderBase.java +++ b/org.fortiss.tooling.base/trunk/src/org/fortiss/tooling/base/annotation/valueprovider/ValueProviderBase.java @@ -15,11 +15,11 @@ +--------------------------------------------------------------------------*/ package org.fortiss.tooling.base.annotation.valueprovider; +import static java.util.Collections.emptyList; import static org.fortiss.tooling.kernel.utils.EcoreUtils.pickFirstInstanceOf; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -235,13 +235,7 @@ public abstract class ValueProviderBase<T extends IAnnotatedSpecification> imple /** {@inheritDoc} */ @Override public Collection<String> getInstanceKeys(T specification) { - return Collections.emptyList(); - } - - /** {@inheritDoc} */ - @Override - public boolean allowsDynamicAnnotationInstances() { - return false; + return emptyList(); } /** Returns the {@link #fixedInputChoiceMap}. */ -- GitLab