Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian W. Damus2021-08-25 13:26:27 +0000
committerPatrick Tessier2021-10-25 14:06:53 +0000
commit7af501956ef63b572a7575ac5b28952b5a997429 (patch)
tree0ae5a408fe5609eb86bc976fd91aa1c19c89a098
parentf89eca16b4099f066f772e6d4429f25ee4104618 (diff)
downloadorg.eclipse.papyrus-7af501956ef63b572a7575ac5b28952b5a997429.tar.gz
org.eclipse.papyrus-7af501956ef63b572a7575ac5b28952b5a997429.tar.xz
org.eclipse.papyrus-7af501956ef63b572a7575ac5b28952b5a997429.zip
Bug 573986: [Toolsmiths] Properties view editor validation & incremental
updates Common fixes - fix encoding and decoding of related object URIs in the problem markers - handle stereotypes in nested packages (not profiles) - fix NPE in architecture builder - prompt to save editor before running quick fix if it's dirty - save editor after running quick fix - save and clean up resources loaded by the quick fix that the editor doesn't need to know about - delete cross-references within the scope of context models when deleting a data-context element, to account for supertype references, both in the editor and the quick fix Properties validation builder - add new validation builder plug-in for Properties models - check plugin.xml extensions for context and environment models - check existence of referenced Java classes and implied bundle dependencies - handle 'ppe' URI scheme in ModelDependenciesChecker via new generic service - ensure that HREFs to environment models that do not use XMI IDs are not broken by automatic assignment of IDs on resource load - ensure that XMI IDs are generated in context resources - add annotations to the generated Properties Context model to trace to the original source model (UML Profile or Ecore model) - add annotations to data context roots to record which layout generator was used to generate sections (used for quick fixes) - hide annotations from the editor by default because they need not (and probably should not) be edited by the user - infer traceability to source models from known constraints and internal relationships in the context model - add derived reference to views that use a section, supported by generated CacheAdapter implementation - add model validation rules for missing and obsolete data context elements and properties in the context model - add custom validation rules for EMFInstanceOf, UMLInstanceOf, and HasStereotype constraints, that their referenced classes can be resolved - validate that data-context properties, elements, and packages match their corresponding source model elements by name - quick fixes to rename data-context properties, elements, and packages to match their source model elements - includes 'touching' affected XWT resources to ensure that their qualified name references are updated - add check for missing data-context package for nested package/profile - check for entire source package/profile moved Add marker resolutions for - simple property-type inconsistency problems - delete obsolete data-context properties - add missing data-context properties - add missing data-context properties with property editors in sections - delete obsolete data-context elements - add missing data-context elements - add missing data-context elements with generated views - quick fixes to generate data-context package with or without views - add quick fix to find new package/profile location and update all source link URIs - add a quick fix for unresolved class problems in constraints - get appropriately qualified "expected name" of the class referenced by a constraint for population of marker data for the quick fix - generate a fix for each valid name that the constraint can reference Change-Id: Iebd062470d7539d15321cffa80556fc1d22023f2 Signed-off-by: Christian W. Damus <give.a.damus@gmail.com>
-rw-r--r--features/papyrus-tests-features/org.eclipse.papyrus.tests.toolsmiths.feature/feature.xml7
-rw-r--r--features/papyrus-toolsmiths-features/org.eclipse.papyrus.toolsmiths.validation.feature/feature.xml7
-rw-r--r--plugins/doc/org.eclipse.papyrus.toolsmiths.validation.doc/src/site/mediawiki/images/devDoc/Papyrus_ProblemsViewProperties.pngbin0 -> 214024 bytes
-rw-r--r--plugins/doc/org.eclipse.papyrus.toolsmiths.validation.doc/src/site/mediawiki/validationToolsmithsDevDoc.mediawiki56
-rw-r--r--plugins/infra/constraints/org.eclipse.papyrus.infra.constraints/Model/ConstraintEnvironment.properties17
-rw-r--r--plugins/infra/constraints/org.eclipse.papyrus.infra.constraints/Model/Constraints.genmodel3
-rw-r--r--plugins/infra/constraints/org.eclipse.papyrus.infra.constraints/src-gen/org/eclipse/papyrus/infra/constraints/SimpleConstraint.java50
-rw-r--r--plugins/infra/constraints/org.eclipse.papyrus.infra.constraints/src-gen/org/eclipse/papyrus/infra/constraints/impl/SimpleConstraintImpl.java50
-rw-r--r--plugins/infra/constraints/org.eclipse.papyrus.infra.constraints/src/org/eclipse/papyrus/infra/constraints/util/ConstraintsUtil.java106
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core.architecture/src/org/eclipse/papyrus/infra/core/architecture/util/ArchitectureCommandUtils.java30
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/util/ClassLoaderHelper.java95
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/util/Iterators2.java106
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/util/RecursionGuard.java120
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/util/TriFunction.java41
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/util/Try.java525
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/.classpath1
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/META-INF/MANIFEST.MF6
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/build.properties2
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateCompositeConstraint_constraints_SimpleConstraint.gifbin223 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateCompositeWidget_layout_Layout.gifbin367 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateCompositeWidget_widgets_CompositeWidget.gifbin590 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateCompositeWidget_widgets_PropertyEditor.gifbin353 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateCompositeWidget_widgets_StandardWidget.gifbin225 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateCompositeWidget_widgets_UnknownComponent.gifbin562 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateCompositeWidget_widgets_UnknownWidget.gifbin129 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateConstraintDescriptor_constraints_ConstraintDescriptor.gifbin576 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateConstraintDescriptor_properties_ReferenceProperty.gifbin223 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateConstraintDescriptor_properties_ValueProperty.gifbin223 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateConstraintMapping_constraints_ConstraintMapping.gifbin223 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateConstraintMapping_properties_ReferenceProperty.gifbin223 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateConstraintMapping_properties_ValueProperty.gifbin223 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateContext_constraints_ConstraintDescriptor.gifbin576 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateContext_constraints_ConstraintMapping.gifbin223 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateContext_dataContexts_DataContextRoot.gifbin223 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateContext_tabs_Tab.gifbin621 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateContext_views_View.gifbin589 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateDataContextElement_properties_Property.gifbin223 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateDataContextElement_properties_UnknownProperty.gifbin223 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateDataContextPackage_elements_DataContextElement.gifbin223 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateDataContextPackage_elements_DataContextPackage.gifbin223 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateDataContextPackage_elements_DataContextRoot.gifbin223 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateDisplayUnit_constraints_CompositeConstraint.gifbin223 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateDisplayUnit_constraints_ConstraintDescriptor.gifbin576 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateDisplayUnit_constraints_SimpleConstraint.gifbin223 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateElement_children_CompositeWidget.gifbin129 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateElement_children_Element.gifbin223 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateElement_children_Layout.gifbin367 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateElement_children_PropertyEditor.gifbin353 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateElement_children_ReferenceAttribute.gifbin311 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateElement_children_StandardWidget.gifbin129 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateElement_children_UnknownElement.gifbin223 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateElement_children_ValueAttribute.gifbin205 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_compositeWidgetTypes_CompositeWidgetType.gifbin223 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_constraintTypes_ConstraintType.gifbin223 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_contexts_Context.gifbin584 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_layoutTypes_LayoutType.gifbin223 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_miscClasses_MiscClass.gifbin223 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_modelElementFactories_ModelElementFactoryDescriptor.gifbin223 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_namespaces_Namespace.gifbin223 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_propertyEditorTypes_PropertyEditorType.gifbin223 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_widgetTypes_StandardWidgetType.gifbin223 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreatePropertyEditor_unresolvedProperty_UnknownProperty.gifbin223 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateReferenceAttribute_value_CompositeWidget.gifbin129 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateReferenceAttribute_value_Layout.gifbin367 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateReferenceAttribute_value_PropertyEditor.gifbin353 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateReferenceAttribute_value_StandardWidget.gifbin129 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateReferenceAttribute_value_UIComponent.gifbin223 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateReferenceAttribute_value_UnknownComponent.gifbin562 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateReferenceAttribute_value_UnknownElement.gifbin223 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateReferenceAttribute_value_UnknownWidget.gifbin129 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateSimpleConstraint_properties_ReferenceProperty.gifbin223 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateSimpleConstraint_properties_ValueProperty.gifbin223 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateTab_allSections_Section.gifbin223 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateTab_sections_Section.gifbin379 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateUIComponent_attributes_ReferenceAttribute.gifbin311 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateUIComponent_attributes_ValueAttribute.gifbin205 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateView_datacontexts_DataContextElement.gifbin223 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateView_datacontexts_DataContextPackage.gifbin223 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateView_datacontexts_DataContextRoot.gifbin223 -> 0 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/obj16/Annotation.gifbin0 -> 595 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/obj16/Annotation@2x.gifbin0 -> 1407 bytes
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/plugin.properties8
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/pom.xml2
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/AbstractSectionItemProvider.java71
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/AnnotatableItemProvider.java180
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/AnnotationItemProvider.java246
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/ContextItemProvider.java14
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/ContextsItemProviderAdapterFactory.java27
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/DataContextElementItemProvider.java40
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/DataContextPackageItemProvider.java13
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/DataContextRootItemProvider.java13
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/PropertyItemProvider.java40
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/SectionItemProvider.java36
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/TabItemProvider.java13
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/UnknownPropertyItemProvider.java13
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/ViewItemProvider.java53
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/environment/provider/PropertiesEditPlugin.java3
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src/org/eclipse/papyrus/infra/properties/contexts/command/ContextDeleteCommand.java88
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties.ui/model/Environment.properties17
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/META-INF/MANIFEST.MF2
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/Model/properties.ecore38
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/Model/properties.genmodel40
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/Model/properties.notation790
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/Model/properties.uml362
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/build.properties2
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/plugin.properties6
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/plugin.xml45
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/AbstractSection.java5
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/Annotatable.java63
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/Annotation.java128
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/Context.java4
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/ContextsFactory.java12
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/ContextsPackage.java551
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/DataContextElement.java6
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/DataContextPackage.java3
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/DataContextRoot.java3
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/Property.java6
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/Section.java21
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/Tab.java3
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/View.java7
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/AbstractSectionImpl.java135
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/AnnotatableImpl.java212
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/AnnotationImpl.java374
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/ContextImpl.java16
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/ContextsFactoryImpl.java16
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/ContextsPackageImpl.java167
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/DataContextElementImpl.java6
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/DataContextPackageImpl.java3
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/DataContextRootImpl.java3
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/PropertyImpl.java6
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/SectionImpl.java31
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/TabImpl.java15
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/UnknownPropertyImpl.java3
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/ViewImpl.java154
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/operations/AnnotatableOperations.java66
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/operations/SectionOperations.java64
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/util/ContextsAdapterFactory.java41
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/util/ContextsResourceFactoryImpl.java9
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/util/ContextsResourceImpl.java101
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/util/ContextsSwitch.java55
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/EnvironmentPackage.java11
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/impl/EnvironmentImpl.java15
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/impl/EnvironmentPackageImpl.java5
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/impl/MiscClassImpl.java15
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/impl/ModelElementFactoryDescriptorImpl.java15
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/impl/NamespaceImpl.java15
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/impl/WidgetTypeImpl.java15
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/util/EnvironmentResourceFactoryImpl.java9
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/util/EnvironmentResourceImpl.java24
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/ui/impl/ElementImpl.java15
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/ui/impl/UiPackageImpl.java5
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src/org/eclipse/papyrus/infra/properties/contexts/util/ContextAnnotations.java237
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src/org/eclipse/papyrus/infra/properties/contexts/util/ContextContentTreeIterator.java93
-rw-r--r--plugins/infra/properties/org.eclipse.papyrus.infra.properties/src/org/eclipse/papyrus/infra/properties/contexts/util/ContextUsageCrossReferencer.java107
-rw-r--r--plugins/toolsmiths/builder/org.eclipse.papyrus.toolsmiths.plugin.builder/src/org/eclipse/papyrus/toolsmiths/plugin/builder/IPapyrusBuilderProvider.java36
-rw-r--r--plugins/toolsmiths/builder/org.eclipse.papyrus.toolsmiths.plugin.builder/src/org/eclipse/papyrus/toolsmiths/plugin/internal/builder/XWTModelBuilderProvider.java2
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/META-INF/MANIFEST.MF3
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/checkers/ArchitecturePluginChecker.java6
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/META-INF/MANIFEST.MF11
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/DelegatingURIConverterService.java140
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/URIConverterService.java51
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/checkers/BasicEMFResourceProvider.java40
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/checkers/BuildPropertiesChecker.java4
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/checkers/CustomModelChecker.java132
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/checkers/ExtensionsChecker.java2
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/checkers/IPluginChecker2.java4
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/checkers/JavaClassDependencies.java (renamed from plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/checkers/ArchitectureDependencies.java)47
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/checkers/ModelDependenciesChecker.java50
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/command/TouchResourceCommand.java99
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/internal/messages/Messages.java7
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/internal/messages/messages.properties11
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/quickfix/CommonMarkerResolutionGenerator.java15
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/quickfix/CommonMarkerResolutionUtils.java185
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/quickfix/SimpleModelEditMarkerResolution.java274
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/utils/CommonURIUtils.java208
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/utils/LocalProfileIndex.java (renamed from plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.elementtypes/src/org/eclipse/papyrus/toolsmiths/validation/elementtypes/internal/checkers/LocalProfileIndex.java)86
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/utils/MarkersService.java9
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/utils/ModelResourceMapper.java30
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.elementtypes/src/org/eclipse/papyrus/toolsmiths/validation/elementtypes/internal/checkers/ApplyStereotypeAdviceCustomValidator.java1
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.elementtypes/src/org/eclipse/papyrus/toolsmiths/validation/elementtypes/internal/checkers/ElementTypesBuildPropertiesDependencies.java1
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.elementtypes/src/org/eclipse/papyrus/toolsmiths/validation/elementtypes/internal/checkers/StereotypeApplicationMatcherCustomValidator.java1
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.elementtypes/src/org/eclipse/papyrus/toolsmiths/validation/elementtypes/internal/checkers/StereotypePropertyReferenceEdgeAdviceCustomValidator.java1
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/.classpath7
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/.project52
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/.settings/org.eclipse.core.resources.prefs2
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/.settings/org.eclipse.core.runtime.prefs2
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/.settings/org.eclipse.jdt.core.prefs319
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/.settings/org.eclipse.jdt.ui.prefs127
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/.settings/org.eclipse.m2e.core.prefs4
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/.settings/org.eclipse.pde.api.tools.prefs104
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/META-INF/MANIFEST.MF54
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/OSGI-INF/org.eclipse.papyrus.toolsmiths.validation.properties.internal.PropertiesURIConverterService.xml8
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/OSGI-INF/org.eclipse.papyrus.toolsmiths.validation.properties.internal.checkers.PropertiesContextBuilderProvider.xml7
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/OSGI-INF/org.eclipse.papyrus.toolsmiths.validation.properties.internal.checkers.PropertiesEnvironmentBuilderProvider.xml7
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/about.html28
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/build.properties24
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/plugin.properties21
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/plugin.xml43
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/pom.xml14
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/Activator.java71
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/PropertiesURIConverterService.java37
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/ConstraintsCustomValidator.java87
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesContextBuilderProvider.java85
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesContextCustomValidator.java378
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesContextPluginChecker.java159
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesContextPluginXMLValidator.java84
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesEnvironmentBuilderProvider.java86
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesEnvironmentCustomValidator.java29
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesEnvironmentPluginChecker.java176
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesEnvironmentPluginXMLValidator.java84
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesUICustomValidator.java79
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/constants/PropertiesPluginValidationConstants.java164
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/messages/Messages.java92
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/messages/messages.properties75
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/quickfix/AbstractModelEditResolutionFactory.java479
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/quickfix/DataContextElementResolutionFactory.java205
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/quickfix/DataContextPropertyResolutionFactory.java187
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/quickfix/FindNewPackageLocation.java178
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/quickfix/PropertiesMarkerResolutionGenerator.java240
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/trace/ComposedSourceTraceHelper.java143
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/trace/ExplicitSourceTraceHelper.java132
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/trace/ImplicitEcoreSourceTraceHelper.java244
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/trace/ImplicitUMLSourceTraceHelper.java368
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/trace/NameKind.java32
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/trace/SourceTraceHelper.java150
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/trace/SwitchingSourceTraceHelper.java354
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/util/PropertiesCache.java252
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/util/PropertiesContextDecoratorAdapterFactory.java157
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/util/PropertyTypeHelper.java247
-rw-r--r--plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/util/WidgetTypeHelper.java121
-rw-r--r--plugins/toolsmiths/validation/pom.xml1
-rw-r--r--plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/META-INF/MANIFEST.MF1
-rw-r--r--plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/plugin.xml13
-rw-r--r--plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/src/org/eclipse/papyrus/customization/properties/generation/generators/AbstractQVTGenerator.java29
-rw-r--r--plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/src/org/eclipse/papyrus/customization/properties/generation/generators/ContextsBlackBox.java43
-rw-r--r--plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/src/org/eclipse/papyrus/customization/properties/generation/generators/GeneratorHelper.java160
-rw-r--r--plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/src/org/eclipse/papyrus/customization/properties/generation/generators/ProfileGenerator.java8
-rw-r--r--plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/src/org/eclipse/papyrus/customization/properties/generation/layout/StandardLayoutGenerator.java17
-rw-r--r--plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/src/org/eclipse/papyrus/customization/properties/generation/wizard/CreateContextWizard.java52
-rw-r--r--plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/transforms/ecore2datacontext.qvto10
-rw-r--r--plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/transforms/profile2datacontext.qvto12
-rw-r--r--plugins/uml/properties/org.eclipse.papyrus.uml.properties/Model/Environment.properties19
-rw-r--r--plugins/views/properties/org.eclipse.papyrus.views.properties.model.xwt/src/org/eclipse/papyrus/views/properties/model/xwt/resource/XWTResource.java26
-rwxr-xr-xplugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/META-INF/MANIFEST.MF3
-rw-r--r--plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Model/Customization.ctx51
-rw-r--r--plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Model/ui/MultipleAnnotations.xwt5
-rw-r--r--plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Model/ui/MultipleCompositeConstraint.xwt27
-rw-r--r--plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Model/ui/MultipleEStringToStringMapEntries.xwt5
-rw-r--r--plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Model/ui/MultipleValueAttribute.xwt13
-rw-r--r--plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Model/ui/SingleAnnotation.xwt17
-rw-r--r--plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Model/ui/SingleEStringToStringMapEntry.xwt7
-rw-r--r--plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/OSGI-INF/l10n/bundle.properties8
-rw-r--r--plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Query/Contexts.querySet4
-rw-r--r--plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/UICustom/PropertiesContext.custom723
-rw-r--r--plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/icons/Annotation.gifbin0 -> 588 bytes
-rw-r--r--plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/icons/Annotation@2x.gifbin0 -> 1399 bytes
-rw-r--r--plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/plugin.xml31
-rw-r--r--plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/editor/ContextEditorActionBarContributor.java8
-rw-r--r--plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/editor/actions/AbstractToggleHandler.java119
-rw-r--r--plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/editor/actions/MoDiscoDeleteAction.java7
-rw-r--r--plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/editor/actions/ToggleAnnotationsAction.java54
-rw-r--r--plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/editor/actions/TogglePreviewAction.java60
-rw-r--r--plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/providers/ContextContentProvider.java11
-rw-r--r--plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/query/GetVisibleFeaturesQuery.java23
-rw-r--r--plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/query/ShowAnnotationsQuery.java34
-rwxr-xr-xtests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.suite.tests/META-INF/MANIFEST.MF1
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.suite.tests/test/org/eclipse/papyrus/toolsmiths/suite/tests/AllTests.java3
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.architecture.tests/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/quickfix/tests/ModelQuickFixTests.java91
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.common.tests/META-INF/MANIFEST.MF1
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.common.tests/resources/org.eclipse.papyrus.toolsmiths.validation.common.example/META-INF/MANIFEST.MF1
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.common.tests/resources/org.eclipse.papyrus.toolsmiths.validation.common.example/src/org/eclipse/papyrus/toolsmiths/validation/common/example/Activator.java32
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.common.tests/src/org/eclipse/papyrus/toolsmiths/validation/common/tests/rules/QuickFix.java38
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.common.tests/src/org/eclipse/papyrus/toolsmiths/validation/common/tests/rules/QuickFixWith.java37
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.common.tests/src/org/eclipse/papyrus/toolsmiths/validation/common/tests/rules/TestProjectFixture.java115
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.elementtypes.tests/resources/org.eclipse.papyrus.toolsmiths.validation.elementtypes.resources/.project5
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/.classpath15
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/.project28
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/.settings/org.eclipse.core.resources.prefs2
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/.settings/org.eclipse.core.runtime.prefs2
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/.settings/org.eclipse.jdt.core.prefs319
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/.settings/org.eclipse.jdt.ui.prefs127
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/.settings/org.eclipse.pde.api.tools.prefs104
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/META-INF/MANIFEST.MF25
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/about.html28
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/build.properties8
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/plugin.properties18
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/pom.xml15
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/extensions/plugin-noContext.xml42
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/extensions/plugin-noEnvironment.xml42
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/manifest/BookStore-missingClassDependency.xmi15
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/manifest/BookStore-unresolvedClassName.xmi5
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/manifest/MANIFEST-missingDependency.MF34
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-deletedEClass.ecore11
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-deletedProperty.ecore12
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-deletedProperty.profile.uml104
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-deletedStereotype.profile.uml89
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-ecore-enumPropertyWrongType.ctx75
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-ecore-implicitTracesOK.ctx75
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-ecore-stringPropertyWrongType.ctx75
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-ecore-unresolvedInstanceOf.ctx115
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-ecore.ctx115
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-enumPropertyWrongType.ctx131
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-implicitTracesOK.ctx210
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-newEClass.ecore18
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-newNestedPackage.profile.uml135
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-newNestedProfile.profile.uml135
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-newProperty.ecore17
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-newProperty.profile.uml117
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-newStereotype.profile.uml133
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-profileMoved.ctx131
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-propertyWrongMultiplicity.ctx131
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-renamedProfile.profile.uml110
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-renamedProperty.profile.uml110
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-renamedStereotype.profile.uml110
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-stringPropertyWrongType.ctx131
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-unresolvedHasStereotype.ctx131
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-unresolvedInstanceOf.ctx131
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-withComplexDataType.ctx144
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-withComplexDataType.profile.uml190
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore.ecore15
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/plugin-ecore.xml41
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1/.classpath7
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1/.project34
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1/.settings/org.eclipse.jdt.core.prefs319
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1/META-INF/MANIFEST.MF35
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1/build.properties18
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1/plugin.properties14
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1/src/org/eclipse/papyrus/toolsmiths/validation/properties/example/dependency1/modelelement/BookModelElement.java27
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1/src/org/eclipse/papyrus/toolsmiths/validation/properties/example/dependency1/modelelement/BookModelElementFactory.java38
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/.classpath7
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/.project34
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/.settings/org.eclipse.jdt.core.prefs319
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/META-INF/MANIFEST.MF35
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/build.properties21
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/icons/full/obj16/bookstore.pngbin0 -> 453 bytes
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/icons/full/obj16/bookstore@2x.pngbin0 -> 871 bytes
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/plugin.properties14
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/plugin.xml48
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/BookStore.ctx131
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/BookStore.profile.di2
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/BookStore.profile.notation172
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/BookStore.profile.uml110
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/BookStore.xmi11
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/ui/MultipleBook.xwt5
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/ui/MultipleBookStore.xwt11
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/ui/MultipleVendor.xwt5
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/ui/SingleBook.xwt5
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/ui/SingleBookStore.xwt11
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/ui/SingleVendor.xwt11
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/src/org/eclipse/papyrus/toolsmiths/validation/properties/example/modelelement/VendorModelElement.java27
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/src/org/eclipse/papyrus/toolsmiths/validation/properties/example/modelelement/VendorModelElementFactory.java38
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/ui/SingleVendor-wrongWidgetType.xwt11
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/quickfix/tests/ModelQuickFixTests.java166
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/src/org/eclipse/papyrus/toolsmiths/validation/properties/tests/AllTests.java36
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/src/org/eclipse/papyrus/toolsmiths/validation/properties/tests/PropertiesContextModelBuilderEcoreTest.java130
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/src/org/eclipse/papyrus/toolsmiths/validation/properties/tests/PropertiesContextModelBuilderUMLTest.java227
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/src/org/eclipse/papyrus/toolsmiths/validation/properties/tests/PropertiesDependencyBuilderTest.java97
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/src/org/eclipse/papyrus/toolsmiths/validation/properties/tests/PropertiesPluginBuilderTest.java84
-rw-r--r--tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/src/org/eclipse/papyrus/toolsmiths/validation/properties/tests/PropertiesPluginXMLBuilderTest.java75
-rwxr-xr-xtests/junit/plugins/toolsmiths/pom.xml1
360 files changed, 20406 insertions, 1334 deletions
diff --git a/features/papyrus-tests-features/org.eclipse.papyrus.tests.toolsmiths.feature/feature.xml b/features/papyrus-tests-features/org.eclipse.papyrus.tests.toolsmiths.feature/feature.xml
index 9e3b53f43a4..6e0843064ca 100644
--- a/features/papyrus-tests-features/org.eclipse.papyrus.tests.toolsmiths.feature/feature.xml
+++ b/features/papyrus-tests-features/org.eclipse.papyrus.tests.toolsmiths.feature/feature.xml
@@ -61,4 +61,11 @@
version="0.0.0"
unpack="false"/>
+ <plugin
+ id="org.eclipse.papyrus.toolsmiths.validation.properties.tests"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
+
</feature>
diff --git a/features/papyrus-toolsmiths-features/org.eclipse.papyrus.toolsmiths.validation.feature/feature.xml b/features/papyrus-toolsmiths-features/org.eclipse.papyrus.toolsmiths.validation.feature/feature.xml
index d10e08d0683..e3fe42d7e04 100644
--- a/features/papyrus-toolsmiths-features/org.eclipse.papyrus.toolsmiths.validation.feature/feature.xml
+++ b/features/papyrus-toolsmiths-features/org.eclipse.papyrus.toolsmiths.validation.feature/feature.xml
@@ -53,6 +53,13 @@
install-size="0"
version="0.0.0"
unpack="false"/>
+
+ <plugin
+ id="org.eclipse.papyrus.toolsmiths.validation.properties"
+ download-size="0"
+ install-size="0"
+ version="0.0.0"
+ unpack="false"/>
<plugin
id="org.eclipse.papyrus.dev.ui"
diff --git a/plugins/doc/org.eclipse.papyrus.toolsmiths.validation.doc/src/site/mediawiki/images/devDoc/Papyrus_ProblemsViewProperties.png b/plugins/doc/org.eclipse.papyrus.toolsmiths.validation.doc/src/site/mediawiki/images/devDoc/Papyrus_ProblemsViewProperties.png
new file mode 100644
index 00000000000..a067cd79747
--- /dev/null
+++ b/plugins/doc/org.eclipse.papyrus.toolsmiths.validation.doc/src/site/mediawiki/images/devDoc/Papyrus_ProblemsViewProperties.png
Binary files differ
diff --git a/plugins/doc/org.eclipse.papyrus.toolsmiths.validation.doc/src/site/mediawiki/validationToolsmithsDevDoc.mediawiki b/plugins/doc/org.eclipse.papyrus.toolsmiths.validation.doc/src/site/mediawiki/validationToolsmithsDevDoc.mediawiki
index df676143c0c..aaaaf3b58a9 100644
--- a/plugins/doc/org.eclipse.papyrus.toolsmiths.validation.doc/src/site/mediawiki/validationToolsmithsDevDoc.mediawiki
+++ b/plugins/doc/org.eclipse.papyrus.toolsmiths.validation.doc/src/site/mediawiki/validationToolsmithsDevDoc.mediawiki
@@ -177,3 +177,59 @@ The result is displayed in the ''''Problems'''' view and are categorized by the
Like others problems, you can double-click on one to open the relevant file. You may delete a problem that you think is resolved, but if it is not, then it will be presented again by the next validation.
+==Properties Model Plug-in Validation==
+
+This section describes the validation checks performed by the '''Papyrus Plug-in Builder''' on ''Properties models''.
+
+===What is checked?===
+Several validation rules are checked for any plug-in project that contains Properties Context and/or Environment models, including:
+* Bundle manifest dependencies on core Papyrus Properties Framework bundles: '''WARNING'''
+** 'org.eclipse.papyrus.infra.properties'
+* For each properties context model found in the plug-in that traces to a UML Profile or an Ecore package from which it was generated:
+** Validation of the context model file itself and XWT section files that it references: errors or warnings as described for different elements, below
+*** a data context package does not trace to a source UML Profile or Ecore package: '''WARNING'''
+*** a data context package traces to a source UML Profile or Ecore package that appears no longer to exist: '''ERROR'''
+*** a data context package has a different name than the source UML Profile or Ecore package to which it traces: '''ERROR'''
+*** a data context package is missing nested packages or data context elements for nested packages or classes in the source UML Profile or Ecore package: '''WARNING'''
+*** a data context element does not trace to a source UML Stereotype or Ecore Eclass: '''WARNING'''
+*** a data context element traces to a source UML Stereotype or Ecore Eclass that appears no longer to exist: '''WARNING'''
+*** a data context element has a different name than the source UML Stereotype or Ecore Eclass to which it traces: '''ERROR'''
+*** a data context element is missing properties for attributes of the source UML Stereotype or Ecore EClass: '''WARNING'''
+*** a data context package does not trace to an attribute of a source UML Stereotype or Ecore Eclass: '''WARNING'''
+*** a data context property traces to an attribute of the source UML Profile or Ecore package that appears no longer to exist: '''ERROR'''
+*** a data context property has a different name than the attribute of the source UML Stereotype or Ecore Eclass to which it traces: '''ERROR'''
+*** a data context property has a type that appears to be inconsistent with the type of the corresponding attribute in the source UML Stereotype or Ecore Eclass: '''WARNING'''
+*** a property editor in the XWT section has a widget type that appears to be inconsistent with the type of the data context property that it edits: '''WARNING'''
+** Validation of the properties context model registration in the 'plugin.xml' file
+*** if there is no registration extension: '''ERROR'''
+** Validation of bundle dependencies in the 'MANIFEST.MF' file implied by the properties context model:
+*** missing dependency on the bundle that deploys the UML Profile or Ecore package from which the context was generated: '''ERROR'''
+** Validation of the 'build.properties' file
+*** If any of the following resources is not included in the binary build: '''ERROR'''
+**** the properties context model file, itself
+**** any XWT resource referenced by the context
+* For each properties environment model found in the plug-in:
+** Validation of the environment model file itself: errors or warnings as described for different elements, below
+*** a Java class referenced for a model element factory or other concept does not exist: '''ERROR'''
+** Validation of the properties environment model registration in the 'plugin.xml' file
+*** if there is no registration extension: '''ERROR'''
+** Validation of bundle dependencies in the 'MANIFEST.MF' file implied by the properties environment model:
+*** missing dependency on the bundle that defines Java classes referenced in the environment: '''ERROR'''
+** Validation of the 'build.properties' file
+*** If any of the following resources is not included in the binary build: '''ERROR'''
+**** the properties model file, itself
+**** any other environment model cross-referenced by it in the same project
+
+The rules above are not checked in the ''Properties Context Editor'' while editing a model because they
+depend on the deployment of dependent resources in tooling bundles. Therefore, they are only checked by the
+tooling validation mechanisms described in this documentation. Other intrinsic model well-formedness constraints
+for modelign assistants are checked by the editor; they are described in the documentation of the
+''Properties Context'' model.
+
+===Where to find the result?===
+The result is displayed in the ''''Problems'''' view and are categorized by the type ''''Papyrus Toolsmiths Properties Plug-in Problem''''.
+
+[[File:images/devDoc/Papyrus_ProblemsViewProperties.png|frame|none|Properties model problems]]
+
+Like other problems, you can double-click on one to open the relevant file. You may delete a problem that you think is resolved, but if it is not, then it will be presented again by the next validation.
+
diff --git a/plugins/infra/constraints/org.eclipse.papyrus.infra.constraints/Model/ConstraintEnvironment.properties b/plugins/infra/constraints/org.eclipse.papyrus.infra.constraints/Model/ConstraintEnvironment.properties
new file mode 100644
index 00000000000..0c80a55a094
--- /dev/null
+++ b/plugins/infra/constraints/org.eclipse.papyrus.infra.constraints/Model/ConstraintEnvironment.properties
@@ -0,0 +1,17 @@
+#
+# Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+# Christian W. Damus - Initial API and implementation
+#
+#
+
+_UI_label_EMFInstanceOf=Ecore 'instance-of'
+_UI_label_className=EClass name
diff --git a/plugins/infra/constraints/org.eclipse.papyrus.infra.constraints/Model/Constraints.genmodel b/plugins/infra/constraints/org.eclipse.papyrus.infra.constraints/Model/Constraints.genmodel
index 4ea1ac64926..12e4f7cc084 100644
--- a/plugins/infra/constraints/org.eclipse.papyrus.infra.constraints/Model/Constraints.genmodel
+++ b/plugins/infra/constraints/org.eclipse.papyrus.infra.constraints/Model/Constraints.genmodel
@@ -55,7 +55,8 @@
createChild="true" ecoreFeature="ecore:EReference Constraints.ecore#//SimpleConstraint/properties"/>
</genClasses>
<genClasses xsi:type="genmodel:GenClass" image="false" ecoreClass="Constraints.ecore#//ConfigProperty">
- <genFeatures xsi:type="genmodel:GenFeature" createChild="false" ecoreFeature="ecore:EAttribute Constraints.ecore#//ConfigProperty/name"/>
+ <genFeatures xsi:type="genmodel:GenFeature" createChild="false" ecoreFeature="ecore:EAttribute Constraints.ecore#//ConfigProperty/name"
+ key="true"/>
</genClasses>
<genClasses xsi:type="genmodel:GenClass" ecoreClass="Constraints.ecore#//CompositeConstraint">
<genFeatures xsi:type="genmodel:GenFeature" property="None" children="true"
diff --git a/plugins/infra/constraints/org.eclipse.papyrus.infra.constraints/src-gen/org/eclipse/papyrus/infra/constraints/SimpleConstraint.java b/plugins/infra/constraints/org.eclipse.papyrus.infra.constraints/src-gen/org/eclipse/papyrus/infra/constraints/SimpleConstraint.java
index 897008d96cc..f2f9cae7cec 100644
--- a/plugins/infra/constraints/org.eclipse.papyrus.infra.constraints/src-gen/org/eclipse/papyrus/infra/constraints/SimpleConstraint.java
+++ b/plugins/infra/constraints/org.eclipse.papyrus.infra.constraints/src-gen/org/eclipse/papyrus/infra/constraints/SimpleConstraint.java
@@ -1,12 +1,22 @@
-/**
- * <copyright>
- * </copyright>
+/*****************************************************************************
+ * Copyright (c) 2010, 2021 CEA LIST, Christian W. Damus, and others.
*
- * $Id$
- */
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
+ * Christian W. Damus - bug 573986
+ *
+ *****************************************************************************/
package org.eclipse.papyrus.infra.constraints;
import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EClass;
import org.eclipse.papyrus.infra.constraints.environment.ConstraintType;
/**
@@ -71,4 +81,34 @@ public interface SimpleConstraint extends ConstraintDescriptor {
*/
EList<ConfigProperty> getProperties();
+ /**
+ * Retrieves the first {@link org.eclipse.papyrus.infra.constraints.ConfigProperty} with the specified '<em><b>Name</b></em>' from the '<em><b>Properties</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @param name
+ * The '<em><b>Name</b></em>' of the {@link org.eclipse.papyrus.infra.constraints.ConfigProperty} to retrieve, or <code>null</code>.
+ * @return The first {@link org.eclipse.papyrus.infra.constraints.ConfigProperty} with the specified '<em><b>Name</b></em>', or <code>null</code>.
+ * @see #getProperties()
+ * @generated
+ */
+ ConfigProperty getProperties(String name);
+
+ /**
+ * Retrieves the first {@link org.eclipse.papyrus.infra.constraints.ConfigProperty} with the specified '<em><b>Name</b></em>' from the '<em><b>Properties</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @param name
+ * The '<em><b>Name</b></em>' of the {@link org.eclipse.papyrus.infra.constraints.ConfigProperty} to retrieve, or <code>null</code>.
+ * @param ignoreCase
+ * Whether to ignore case in {@link java.lang.String} comparisons.
+ * @param eClass
+ * The Ecore class of the {@link org.eclipse.papyrus.infra.constraints.ConfigProperty} to retrieve, or <code>null</code>.
+ * @return The first {@link org.eclipse.papyrus.infra.constraints.ConfigProperty} with the specified '<em><b>Name</b></em>', or <code>null</code>.
+ * @see #getProperties()
+ * @generated
+ */
+ ConfigProperty getProperties(String name, boolean ignoreCase, EClass eClass);
+
} // SimpleConstraint
diff --git a/plugins/infra/constraints/org.eclipse.papyrus.infra.constraints/src-gen/org/eclipse/papyrus/infra/constraints/impl/SimpleConstraintImpl.java b/plugins/infra/constraints/org.eclipse.papyrus.infra.constraints/src-gen/org/eclipse/papyrus/infra/constraints/impl/SimpleConstraintImpl.java
index 12db525a785..593161444d8 100644
--- a/plugins/infra/constraints/org.eclipse.papyrus.infra.constraints/src-gen/org/eclipse/papyrus/infra/constraints/impl/SimpleConstraintImpl.java
+++ b/plugins/infra/constraints/org.eclipse.papyrus.infra.constraints/src-gen/org/eclipse/papyrus/infra/constraints/impl/SimpleConstraintImpl.java
@@ -1,9 +1,18 @@
-/**
- * <copyright>
- * </copyright>
+/*****************************************************************************
+ * Copyright (c) 2010, 2021 CEA LIST, Christian W. Damus, and others.
*
- * $Id$
- */
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
+ * Christian W. Damus - bug 573986
+ *
+ *****************************************************************************/
package org.eclipse.papyrus.infra.constraints.impl;
import java.util.Collection;
@@ -145,6 +154,37 @@ public class SimpleConstraintImpl extends ConstraintDescriptorImpl implements Si
* @generated
*/
@Override
+ public ConfigProperty getProperties(String name) {
+ return getProperties(name, false, null);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public ConfigProperty getProperties(String name, boolean ignoreCase, EClass eClass) {
+ propertiesLoop: for (ConfigProperty properties : getProperties()) {
+ if (eClass != null && !eClass.isInstance(properties)) {
+ continue propertiesLoop;
+ }
+ if (name != null && !(ignoreCase ? name.equalsIgnoreCase(properties.getName()) : name.equals(properties.getName()))) {
+ continue propertiesLoop;
+ }
+ return properties;
+ }
+ return null;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
switch (featureID) {
case ConstraintsPackage.SIMPLE_CONSTRAINT__PROPERTIES:
diff --git a/plugins/infra/constraints/org.eclipse.papyrus.infra.constraints/src/org/eclipse/papyrus/infra/constraints/util/ConstraintsUtil.java b/plugins/infra/constraints/org.eclipse.papyrus.infra.constraints/src/org/eclipse/papyrus/infra/constraints/util/ConstraintsUtil.java
new file mode 100644
index 00000000000..f7b4595b01b
--- /dev/null
+++ b/plugins/infra/constraints/org.eclipse.papyrus.infra.constraints/src/org/eclipse/papyrus/infra/constraints/util/ConstraintsUtil.java
@@ -0,0 +1,106 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.constraints.util;
+
+import java.util.List;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.ComposedSwitch;
+import org.eclipse.emf.ecore.util.Switch;
+import org.eclipse.papyrus.infra.constraints.ConfigProperty;
+import org.eclipse.papyrus.infra.constraints.ConstraintDescriptor;
+import org.eclipse.papyrus.infra.constraints.SimpleConstraint;
+import org.eclipse.papyrus.infra.constraints.environment.ConstraintType;
+import org.eclipse.papyrus.infra.constraints.environment.util.EnvironmentSwitch;
+import org.eclipse.uml2.common.util.UML2Util;
+
+/**
+ * Utilities for working with constraint models.
+ */
+public class ConstraintsUtil extends UML2Util {
+
+ private static final Switch<String> NAME_SWITCH = createNameSwitch();
+
+ /**
+ * Get the model name (unlocalized) of the given {@code object}, if it has one.
+ *
+ * @param object
+ * an object in the constraints model
+ * @return its name, or {@code null} if none
+ */
+ public static final String getName(EObject object) {
+ return NAME_SWITCH.doSwitch(object);
+ }
+
+ /**
+ * Get a localized label for the given constraints model element, suitable for presentation in the
+ * UI or other user-facing messages.
+ *
+ * @param object
+ * an object in the constraints model
+ * @return its localized label
+ */
+ public static final String getLabel(EObject object) {
+ return getLabel(object, true);
+ }
+
+ public static final String getLabel(EObject object, boolean localize) {
+ String name = getName(object);
+ return getString(object,
+ "_UI_label_" + getValidJavaIdentifier(isEmpty(name)
+ ? EMPTY_STRING
+ : name.replace(':', '_')),
+ name, localize);
+ }
+
+ protected static String getString(EObject context, String key, String defaultValue, boolean localize) {
+ if (context instanceof ConfigProperty) {
+ // The context to look up the label is the constraint type that defines the property
+ EObject container = context.eContainer();
+ if (container instanceof SimpleConstraint) {
+ ConstraintType type = ((SimpleConstraint) container).getConstraintType();
+ if (type != null) {
+ context = type;
+ }
+ }
+ }
+
+ return UML2Util.getString(context, key, defaultValue, localize);
+ }
+
+ private static final Switch<String> createNameSwitch() {
+ Switch<String> constraints = new ConstraintsSwitch<>() {
+ public String caseConstraintDescriptor(ConstraintDescriptor object) {
+ return object.getName();
+ }
+
+ @Override
+ public String caseConfigProperty(ConfigProperty object) {
+ return object.getName();
+ }
+ };
+
+ Switch<String> environment = new EnvironmentSwitch<>() {
+ @Override
+ public String caseConstraintType(ConstraintType object) {
+ return object.getLabel();
+ }
+ };
+
+ return new ComposedSwitch<>(List.of(constraints, environment));
+ }
+
+}
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core.architecture/src/org/eclipse/papyrus/infra/core/architecture/util/ArchitectureCommandUtils.java b/plugins/infra/core/org.eclipse.papyrus.infra.core.architecture/src/org/eclipse/papyrus/infra/core/architecture/util/ArchitectureCommandUtils.java
index 3b57f02b61e..1eb73be7b2d 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core.architecture/src/org/eclipse/papyrus/infra/core/architecture/util/ArchitectureCommandUtils.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core.architecture/src/org/eclipse/papyrus/infra/core/architecture/util/ArchitectureCommandUtils.java
@@ -26,7 +26,6 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
import java.util.stream.Stream;
-import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
@@ -35,8 +34,9 @@ import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.papyrus.infra.core.architecture.ADElement;
import org.eclipse.papyrus.infra.core.architecture.ArchitecturePackage;
import org.eclipse.papyrus.infra.core.architecture.impl.ArchitecturePlugin;
+import org.eclipse.papyrus.infra.tools.util.ClassLoaderHelper;
import org.eclipse.papyrus.infra.tools.util.ClasspathHelper;
-import org.osgi.framework.Bundle;
+import org.eclipse.papyrus.infra.tools.util.Try;
/**
* Utilities for working with/resolving the command classes referenced by
@@ -48,7 +48,6 @@ public class ArchitectureCommandUtils {
private static final String REQUIRED_BUNDLES = "requiredBundles"; //$NON-NLS-1$
private static final String CLASS_CONSTRAINT = "classConstraint"; //$NON-NLS-1$
- private static final String BUNDLECLASS = "bundleclass"; //$NON-NLS-1$
private static final Map<EStructuralFeature, Class<?>> commandClassConstraints = new ConcurrentHashMap<>();
@@ -69,24 +68,7 @@ public class ArchitectureCommandUtils {
String classURI = EcoreUtil.getAnnotation(feature, ArchitecturePackage.eNS_URI, CLASS_CONSTRAINT);
if (classURI != null) {
URI uri = URI.createURI(classURI);
- if (!BUNDLECLASS.equals(uri.scheme())) {
- result = fail("Constraint class URI does not have bundleclass scheme: " + uri); //$NON-NLS-1$
- } else if (uri.authority() == null) {
- result = fail("Constraint class URI does not have an authority: " + uri); //$NON-NLS-1$
- } else if (uri.segmentCount() != 1) {
- result = fail("Constraint class URI must have exactly one segment: " + uri); //$NON-NLS-1$
- } else {
- Bundle bundle = Platform.getBundle(uri.authority());
- if (bundle == null) {
- result = fail("No such bundle in constraint class URI: " + uri); //$NON-NLS-1$
- } else {
- try {
- result = bundle.loadClass(uri.segment(0));
- } catch (Exception e) {
- result = fail(e);
- }
- }
- }
+ result = ClassLoaderHelper.loadClass(uri).orElseApply(ArchitectureCommandUtils::fail);
}
return result;
@@ -98,10 +80,8 @@ public class ArchitectureCommandUtils {
if (owner.eIsSet(feature)) {
String classURI = EcoreUtil.getAnnotation(feature, ArchitecturePackage.eNS_URI, CLASS_CONSTRAINT);
URI uri = classURI == null ? null : URI.createURI(classURI);
-
- if (uri != null && BUNDLECLASS.equals(uri.scheme())) {
- result = uri.authority();
- }
+ Try<String> bundleName = ClassLoaderHelper.getBundleName(uri);
+ result = bundleName.orElse(null);
}
return result;
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/util/ClassLoaderHelper.java b/plugins/infra/core/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/util/ClassLoaderHelper.java
index 70627d18e83..0c912d46f99 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/util/ClassLoaderHelper.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/util/ClassLoaderHelper.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2010, 2020 CEA LIST, EclipseSource, Christian W. Damus, and others.
+ * Copyright (c) 2010, 2021 CEA LIST, EclipseSource, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -12,7 +12,7 @@
* Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
* EclipseSource - Bug 543723
* Vincent Lorenzo (CEA LIST) vincent.lorenzo@cea.fr - bug 553247
- * Christian W. Damus - bug 568782
+ * Christian W. Damus - bugs 568782, 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.tools.util;
@@ -23,6 +23,7 @@ import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.common.util.URI;
import org.eclipse.papyrus.infra.tools.Activator;
import org.osgi.framework.Bundle;
+import org.osgi.framework.FrameworkUtil;
/**
* <p>
@@ -41,6 +42,9 @@ import org.osgi.framework.Bundle;
*/
public class ClassLoaderHelper {
+ /** The Equinox <tt>bundleclass:</tt> URI scheme. */
+ private static final String BUNDLECLASS = "bundleclass"; //$NON-NLS-1$
+
/**
* Usually, there are few classes with many different accesses. Using a cache, we can improve
* the performances between 10 and 20 times, with really little memory consumption
@@ -151,6 +155,93 @@ public class ClassLoaderHelper {
}
/**
+ * Query whether an URI is parseable as a fully-qualified class reference.
+ *
+ * @param uri
+ * an URI
+ * @return whether is is valid input for the {@link #loadClass(URI)} API
+ *
+ * @since 4.2
+ * @see #loadClass(URI)
+ */
+ public static boolean isClassURI(URI uri) {
+ return uri != null && BUNDLECLASS.equals(uri.scheme());
+ }
+
+ /**
+ * Query the bundle name indicated by a class URI.
+ *
+ * @param classURI
+ * reference to a class in a bundle
+ * @return the symbolic name of the bundle that hosts the class
+ *
+ * @since 4.2
+ * @see #isClassURI(URI)
+ */
+ public static Try<String> getBundleName(URI classURI) {
+ Try<String> result;
+
+ if (!isClassURI(classURI)) {
+ result = Try.failure("Class URI does not have bundleclass scheme: " + classURI); //$NON-NLS-1$
+ } else if (classURI.authority() == null) {
+ result = Try.failure("Class URI does not have an authority: " + classURI); //$NON-NLS-1$
+ } else {
+ result = Try.success(classURI.authority());
+ }
+
+ return result;
+ }
+
+ /**
+ * Load a class indicated by an URI.
+ *
+ * @param classURI
+ * reference to the class to load
+ * @return the loaded class
+ *
+ * @since 4.2
+ * @see #isClassURI(URI)
+ */
+ public static Try<Class<?>> loadClass(URI classURI) {
+ Try<Class<?>> result;
+
+ if (!isClassURI(classURI)) {
+ result = Try.failure("Class URI does not have bundleclass scheme: " + classURI); //$NON-NLS-1$
+ } else if (classURI.authority() == null) {
+ result = Try.failure("Class URI does not have an authority: " + classURI); //$NON-NLS-1$
+ } else if (classURI.segmentCount() != 1) {
+ result = Try.failure("Class URI must have exactly one segment: " + classURI); //$NON-NLS-1$
+ } else {
+ Bundle bundle = Platform.getBundle(classURI.authority());
+ if (bundle == null) {
+ result = Try.failure("No such bundle in class URI: " + classURI); //$NON-NLS-1$
+ } else {
+ result = Try.call(() -> bundle.loadClass(classURI.segment(0)));
+ }
+ }
+
+ return result;
+ }
+
+ /**
+ * Get a URI for a class that can be used to {@linkplain #loadClass(URI) load it again} later.
+ * This only works for classes that trace to some bundle that hosts them.
+ *
+ * @param class_
+ * a class
+ * @return a URI for it, if it is a class that is hosted in some bundle
+ *
+ * @since 4.2
+ * @see #loadClass(URI)
+ */
+ public static Try<URI> getURI(Class<?> class_) {
+ Bundle bundle = FrameworkUtil.getBundle(class_);
+ return bundle == null
+ ? Try.failure("Class is not hosted by an OSGi bundle: " + class_.getName())
+ : Try.success(URI.createURI(String.format("%s://%s/%s", BUNDLECLASS, bundle.getSymbolicName(), class_.getName())));
+ }
+
+ /**
* <p>
* Loads and returns the class represented by the given className.
* Checks that the loaded class is a subtype of the given Class.
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/util/Iterators2.java b/plugins/infra/core/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/util/Iterators2.java
index ef0a1257ff9..c83ded14c59 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/util/Iterators2.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/util/Iterators2.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014, 2020 Christian W. Damus, CEA LIST, and others.
+ * Copyright (c) 2014, 2021 Christian W. Damus, CEA LIST, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -18,6 +18,7 @@ package org.eclipse.papyrus.infra.tools.util;
import java.util.Iterator;
import java.util.Spliterator;
import java.util.Spliterators;
+import java.util.function.Predicate;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
@@ -65,6 +66,49 @@ public class Iterators2 {
}
/**
+ * Filters an EMF tree iterator for elements of a particular {@code type}.
+ *
+ * @param treeIterator
+ * the tree iterator to filter
+ * @param type
+ * the type of elements to include in the filtered tree iterator
+ * @param shouldPrune
+ * a predicate that tests {@code true} on elements whose sub-trees should be {@linkplain TreeIterator#prune() pruned}.
+ * A {@link null} predicate will never prune
+ * @return the self-pruning tree iterator
+ *
+ * @since 4.2
+ */
+ public static <T> Iterator<T> autoPrune(final TreeIterator<T> treeIterator, Predicate<? super T> shouldPrune) {
+ class SelfPruningIterator extends AbstractIterator<T> {
+ @Override
+ protected T computeNext() {
+ T result;
+
+ if (!treeIterator.hasNext()) {
+ result = endOfData();
+ } else {
+ result = treeIterator.next();
+ if (shouldPrune.test(result)) {
+ // Prune, now
+ treeIterator.prune();
+ }
+ }
+
+ return result;
+ }
+ }
+
+ Iterator<T> result = treeIterator;
+
+ if (shouldPrune != null) {
+ result = new SelfPruningIterator();
+ }
+
+ return result;
+ }
+
+ /**
* Obtain a spliterator over an EMF tree iterator. The spliterator will have characteristics implied by an
* EMF content tree, namely:
* <ul>
@@ -78,9 +122,40 @@ public class Iterators2 {
* @param treeIterator
* a tree iterator
* @return a spliterator over the tree
+ *
+ * @see #spliterator(TreeIterator, Predicate)
*/
public static <T> Spliterator<T> spliterator(final TreeIterator<T> treeIterator) {
- return Spliterators.spliteratorUnknownSize(treeIterator, Spliterator.ORDERED | Spliterator.DISTINCT | Spliterator.NONNULL);
+ return spliterator(treeIterator, (Predicate<T>) null);
+ }
+
+ /**
+ * Obtain a spliterator over an EMF tree iterator that prunes itself automatically. The spliterator will have characteristics implied by an
+ * EMF content tree, namely:
+ * <ul>
+ * <li>{@link Spliterator#ORDERED}</li>
+ * <li>{@link Spliterator#DISTINCT}</li>
+ * <li>{@link Spliterator#NONNULL}</li>
+ * </ul>
+ *
+ * @param <T>
+ * the tree element type
+ * @param treeIterator
+ * a tree iterator
+ * @param shouldPrune
+ * a predicate that tests {@code true} on elements whose sub-trees should be {@linkplain TreeIterator#prune() pruned}.
+ * A {@link null} predicate will never prune
+ * @return a spliterator over the tree
+ *
+ * @since 4.2
+ *
+ * @see #autoPrune(TreeIterator, Predicate)
+ * @see #stream(TreeIterator, Predicate)
+ * @see #spliterator(TreeIterator)
+ */
+ public static <T> Spliterator<T> spliterator(final TreeIterator<T> treeIterator, Predicate<? super T> shouldPrune) {
+ Iterator<T> delegate = autoPrune(treeIterator, shouldPrune);
+ return Spliterators.spliteratorUnknownSize(delegate, Spliterator.ORDERED | Spliterator.DISTINCT | Spliterator.NONNULL);
}
/**
@@ -91,9 +166,34 @@ public class Iterators2 {
* @param treeIterator
* a tree iterator
* @return a stream over the tree
+ *
+ * @see #stream(TreeIterator, Predicate)r
*/
public static <T> Stream<T> stream(final TreeIterator<T> treeIterator) {
- return StreamSupport.stream(spliterator(treeIterator), false);
+ return stream(treeIterator, (Predicate<T>) null);
+ }
+
+ /**
+ * Obtain a stream over an EMF tree iterator that prunes itself automatically.
+ *
+ * @param <T>
+ * the tree element type
+ * @param treeIterator
+ * a tree iterator
+ * @param shouldPrune
+ * a predicate that tests {@code true} on elements whose sub-trees should be {@linkplain TreeIterator#prune() pruned}.
+ * A {@link null} predicate will never prune
+ *
+ * @return a self-pruning stream over the tree
+ *
+ * @since 4.2
+ *
+ * @see #autoPrune(TreeIterator, Predicate)
+ * @see #spliterator(TreeIterator, Predicate)
+ * @see #stream(TreeIterator)
+ */
+ public static <T> Stream<T> stream(final TreeIterator<T> treeIterator, Predicate<? super T> shouldPrune) {
+ return StreamSupport.stream(spliterator(treeIterator, shouldPrune), false);
}
}
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/util/RecursionGuard.java b/plugins/infra/core/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/util/RecursionGuard.java
new file mode 100644
index 00000000000..effd1c2985e
--- /dev/null
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/util/RecursionGuard.java
@@ -0,0 +1,120 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.tools.util;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+import java.util.function.Predicate;
+
+/**
+ * Encapsulation of a set of objects on which recursive inference of traceability is in progress
+ * to void re-entrance into that scope, to prevent exponential redundant recursion.
+ *
+ * @param <T>
+ * the kind of objects tracked as the scope of recursion
+ *
+ * @since 4.2
+ */
+public final class RecursionGuard<T> {
+ private final Set<T> recursionSet = new HashSet<>();
+
+ /**
+ * Open the recursion gate if all of the given objects are new to the current recursion stack.
+ *
+ * @param recursionScope
+ * objects to attempt to add to the current recursion stack
+ *
+ * @return a gate that will be open all of the objects in the given scope are new additions to the recursion stack
+ */
+ @SafeVarargs
+ public final Gate guard(T... recursionScope) {
+ return guardIfAny(Objects::nonNull, recursionScope);
+ }
+
+ /**
+ * If any of the given objects in the scope of recursion satisfies the {@code condition},
+ * then open the recursion gate if all of them are new to the current recursion stack.
+ *
+ * @param condition
+ * a precondition which, if satisfied by any of the given objects, lets us attempt to open a gate with them
+ * @param recursionScope
+ * objects to attempt to add to the current recursion stack
+ *
+ * @return a gate that will be open if the {@code condition} was satisfied and all of the objects
+ * in the given scope are new additions to the recursion stack
+ */
+ @SafeVarargs
+ public final Gate guardIfAny(Predicate<? super T> condition, T... recursionScope) {
+ return new Gate(condition, recursionScope);
+ }
+
+ /**
+ * Encapsulation of a recursion gate that may be open to permit recursion or closed
+ * to cut it off.
+ */
+ public final class Gate implements AutoCloseable {
+ private final int size;
+ private List<T> gated;
+
+ @SafeVarargs
+ private Gate(Predicate<? super T> condition, T... recursionScope) {
+ super();
+
+ this.size = recursionScope.length;
+ this.gated = new ArrayList<>(size);
+
+ for (T next : recursionScope) {
+ if (condition.test(next)) {
+ guard(recursionScope);
+ }
+ }
+ }
+
+ @SafeVarargs
+ private void guard(T... recursionScope) {
+ for (T next : recursionScope) {
+ if (recursionSet.add(next)) {
+ gated.add(next);
+ }
+ }
+ }
+
+ /**
+ * Queries whether the gate is open to allow recursion.
+ *
+ * @return {@code true} if the gate is open, allowing recursion because the objects encapsulated
+ * as its recursion scope are all new additions to the current recursive stack
+ */
+ public boolean isOpen() {
+ return gated.size() == size;
+ }
+
+ /**
+ * Restores the recursion stack to what it was prior to creation of this gate,
+ * whether it is open or closed. This gate <em><strong>must</strong></em> be closed
+ * regardless of whether {@linkplain #isOpen() it is open}, which is why the gate
+ * is an auto-closeable resource.
+ */
+ @Override
+ public void close() {
+ recursionSet.removeAll(gated);
+ gated.clear();
+ }
+ }
+}
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/util/TriFunction.java b/plugins/infra/core/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/util/TriFunction.java
new file mode 100644
index 00000000000..70de5f62138
--- /dev/null
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/util/TriFunction.java
@@ -0,0 +1,41 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.tools.util;
+
+import java.util.function.BiFunction;
+
+/**
+ * A function analogous to the {@link BiFunction} that takes three inputs.
+ *
+ * @since 4.2
+ */
+@FunctionalInterface
+public interface TriFunction<F, G, H, R> {
+
+ /**
+ * Process three inputs to obtain a result.
+ *
+ * @param f
+ * the first input
+ * @param g
+ * the second input
+ * @param h
+ * the third input
+ * @return the result
+ */
+ R apply(F f, G g, H h);
+
+}
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/util/Try.java b/plugins/infra/core/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/util/Try.java
new file mode 100644
index 00000000000..215a97b2464
--- /dev/null
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/util/Try.java
@@ -0,0 +1,525 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.tools.util;
+
+import java.io.Serializable;
+import java.util.NoSuchElementException;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.concurrent.Callable;
+import java.util.function.BiConsumer;
+import java.util.function.BiFunction;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.Predicate;
+
+/**
+ * Like an {@link Optional} except that when the value is not present, it can
+ * provide a reason why. Also, because the alternative to success an explicit
+ * failure with some kind of reason, a {@linkplain #isSuccess() successful Try}
+ * may have a {@code null} {@linkplain #get() value}.
+ *
+ * @since 4.2
+ */
+public abstract class Try<T> implements Serializable {
+
+ private static final long serialVersionUID = 2007056722268683220L;
+
+ private static final Try<?> EMPTY = Try.success(null);
+
+ /**
+ * Not instantiable by clients.
+ */
+ Try() {
+ super();
+ }
+
+ /**
+ * Queries whether the {@code Try} has a successful value, even if that value is {@code null}.
+ *
+ * @return whether I am a success
+ */
+ public abstract boolean isSuccess();
+
+ /**
+ * Obtains the value of a {@linkplain #isSuccess() successful} {@code Try}.
+ *
+ * @return my value, which may be {@code null}
+ * @throws NoSuchElementException
+ * if I am a {@linkplain #isFailure() failure}
+ */
+ public abstract T get() throws NoSuchElementException;
+
+ /**
+ * Coerce me to an optional value, eliding any failure information.
+ *
+ * @return an optional encapsulating my value, which will {@linkplain Optional#isEmpty() be empty}
+ * if either I am a failure or if I am a success that happens to be a {@code null} value
+ */
+ public abstract Optional<T> toOptional();
+
+ /**
+ * Queries whether the {@code Try} failed to provide value.
+ *
+ * @return whether I am a failure
+ */
+ public final boolean isFailure() {
+ return !isSuccess();
+ }
+
+ /**
+ * Query whether the {@code Try} provided a successful {@code null} value.
+ *
+ * @return whether I am an empty success
+ */
+ public final boolean isEmpty() {
+ return this.equals(EMPTY);
+ }
+
+ /**
+ * Query whether the {@code Try} provided a successful non-{@code null} value.
+ *
+ * @return whether I am a present success
+ */
+ public final boolean isPresent() {
+ return isSuccess() && !isEmpty();
+ }
+
+ /**
+ * Queries the reason for the failure to provide a value.
+ *
+ * @return the reason, which will never be {@code null} but may not be helpful
+ */
+ public abstract String reason();
+
+ /**
+ * Queries the exception, if any, that caused failure to provide a value.
+ *
+ * @return the exception, or {@code null} if the failure to provide a value was not
+ * caused by an exception but just has some ad hoc {@link #reason() reason}
+ */
+ public abstract Throwable failure();
+
+ /**
+ * Encapsulate the result of a {@code callable}.
+ *
+ * @param <T>
+ * the callable result type
+ * @param callable
+ * a computation to call
+ * @return the result of {@linkplain Callable#call() calling} the {@code callable}
+ */
+ public static <T> Try<T> call(Callable<? extends T> callable) {
+ try {
+ return Try.success(callable.call());
+ } catch (Exception e) {
+ return Try.failure(e);
+ }
+ }
+
+ /**
+ * Create a success.
+ *
+ * @param <T>
+ * the type of {@code value}
+ * @param value
+ * the value to provide
+ * @return a successful provision of the {@code value}
+ */
+ public static <T> Try<T> success(T value) {
+ return new Success<>(value);
+ }
+
+ /**
+ * Obtain an empty success: that is, a successful result that happens
+ * to be a {@code null} value.
+ *
+ * @param <T>
+ * the type of value expected
+ * @return the empty success
+ */
+ @SuppressWarnings("unchecked")
+ public static <T> Try<T> empty() {
+ return (Try<T>) EMPTY;
+ }
+
+ /**
+ * Create a failure caused by an exception.
+ *
+ * @param <T>
+ * the type of value that was not provided
+ * @param failure
+ * an exception that caused the failure
+ * @return a failed provision of a value
+ */
+ public static <T> Try<T> failure(Throwable failure) {
+ return new Failure<>(failure);
+ }
+
+ /**
+ * Create a failure with an ad hoc reason.
+ *
+ * @param <T>
+ * the type of value that was not provided
+ * @param reason
+ * an ad hoc description of the reason why the value was not provided
+ * @return a failed provision of a value
+ */
+ public static <T> Try<T> failure(String reason) {
+ return new Failure<>(reason);
+ }
+
+ /**
+ * Process my value if {@linkplain #isSuccess() successful}.
+ *
+ * @param onSuccess
+ * a consumer of the successful {@linkplain #get() value}
+ */
+ public final void ifSuccess(Consumer<? super T> onSuccess) {
+ if (isSuccess()) {
+ onSuccess.accept(get());
+ }
+ }
+
+ /**
+ * Process my value if {@linkplain #isPresent() present}.
+ *
+ * @param onPresent
+ * a consumer of the present {@linkplain #get() value}
+ */
+ public final void ifPresent(Consumer<? super T> onPresent) {
+ if (isPresent()) {
+ onPresent.accept(get());
+ }
+ }
+
+ /**
+ * Process the reason for a {@linkplain #isFailure() failure}.
+ *
+ * @param onSuccess
+ * a consumer of the failure reason and exception
+ */
+ public final void ifFailure(BiConsumer<? super String, ? super Throwable> onFailure) {
+ if (isFailure()) {
+ onFailure.accept(reason(), failure());
+ }
+ }
+
+ /**
+ * Process the reason for a {@linkplain #isFailure() failure}.
+ *
+ * @param onSuccess
+ * a consumer of the failure reason
+ */
+ public final void ifFailure(Consumer<? super String> onFailure) {
+ ifFailure((reason, __) -> onFailure.accept(reason));
+ }
+
+ /**
+ * Obtain my {@linkplain #isSuccess() successful} {@linkplain #get() value} or
+ * else the given value {@link #isFailure() on failure}.
+ *
+ * @param failureValue
+ * the result in case of failure
+ * @return the result
+ */
+ public final T orElse(T failureValue) {
+ return isSuccess() ? get() : failureValue;
+ }
+
+ /**
+ * Obtain my {@linkplain #isSuccess() successful} {@linkplain #get() value} or
+ * else compute an alternative based on the failure reason.
+ *
+ * @param failureFunction
+ * the computation of an alternative in case of failure
+ * @return the result
+ */
+ public final T orElseApply(BiFunction<? super String, ? super Throwable, ? extends T> failureFunction) {
+ return isSuccess() ? get() : failureFunction.apply(reason(), failure());
+ }
+
+ /**
+ * Obtain my {@linkplain #isSuccess() successful} {@linkplain #get() value} or
+ * else compute an alternative based on the failure reason.
+ *
+ * @param failureFunction
+ * the computation of an alternative in case of failure
+ * @return the result
+ */
+ public final T orElseApply(Function<? super String, ? extends T> failureFunction) {
+ return orElseApply((reason, __) -> failureFunction.apply(reason));
+ }
+
+ /**
+ * Obtain my {@linkplain #isSuccess() successful} {@linkplain #get() value} or
+ * else {@code null} with a side-effect based on the failure reason.
+ *
+ * @param onFailure
+ * a side-effect to run in case of failure
+ * @return the result, or {@code null} if failed
+ */
+ public final T orElseAccept(BiConsumer<? super String, ? super Throwable> onFailure) {
+ if (isFailure()) {
+ onFailure.accept(reason(), failure());
+ }
+ return orElse(null);
+ }
+
+ /**
+ * Obtain my {@linkplain #isSuccess() successful} {@linkplain #get() value} or
+ * else {@code null} with a side-effect based on the failure reason.
+ *
+ * @param onFailure
+ * a side-effect to run in case of failure
+ * @return the result, or {@code null} if failed
+ */
+ public final T orElseAccept(Consumer<? super String> onFailure) {
+ return orElseAccept((reason, __) -> onFailure.accept(reason));
+ }
+
+ /**
+ * Map my value, if any, under the given function.
+ *
+ * @param <U>
+ * the result type of the mapping
+ * @param mapping
+ * the mapping function. It may return {@code null}
+ * @return a successful value of the {@code mapping} if I am a successful value, otherwise myself if I am a failure
+ */
+ public abstract <U> Try<U> map(Function<? super T, U> mapping);
+
+ /**
+ * Map my value, if any, under the given function.
+ *
+ * @param <U>
+ * the result type of the optional mapping
+ * @param mapping
+ * the mapping function. It must not return {@code null}
+ * @return a successful value of the {@code mapping} if I am a successful value, which may be empty if
+ * either I am empty or the {@code mapping} result is empty, otherwise myself if I am a failure
+ */
+ public abstract <U> Try<U> flatMap(Function<? super T, Optional<U>> mapping);
+
+ /**
+ * Map my value, if any, under the given function.
+ *
+ * @param <U>
+ * the result type of the attempted mapping
+ * @param mapping
+ * the mapping function. It must not return {@code null}
+ * @return a successful value of the {@code mapping} if I am a successful value and it is also,
+ * otherwise myself if I am a failure or the mapping failure if it is a failure
+ */
+ public abstract <U> Try<U> tryMap(Function<? super T, Try<U>> mapping);
+
+ /**
+ * Filter my value, if any, under the given {@code test}.
+ *
+ * @param test
+ * the filter predicate function
+ * @return a successful value if I am a successful value, which may be empty if
+ * either I am empty or the {@code test} fails, otherwise myself if I am a failure
+ */
+ public abstract Try<T> filter(Predicate<? super T> test);
+
+}
+
+/**
+ * The success case of a {@link Try}.
+ *
+ * @param <T>
+ * the value type
+ */
+final class Success<T> extends Try<T> {
+ private static final long serialVersionUID = -6184897525442822648L;
+
+ private final T value;
+
+ Success(T value) {
+ super();
+
+ this.value = value;
+ }
+
+ @Override
+ public Optional<T> toOptional() {
+ return Optional.ofNullable(value);
+ }
+
+ @Override
+ public boolean isSuccess() {
+ return true;
+ }
+
+ @Override
+ public T get() {
+ return value;
+ }
+
+ @Override
+ public String reason() {
+ return null;
+ }
+
+ @Override
+ public Throwable failure() {
+ return null;
+ }
+
+ @Override
+ public <U> Try<U> map(Function<? super T, U> mapping) {
+ return isEmpty() ? empty() : success(mapping.apply(value));
+ }
+
+ @Override
+ public <U> Try<U> flatMap(Function<? super T, Optional<U>> mapping) {
+ return isEmpty() ? empty() : success(mapping.apply(value).orElse(null));
+ }
+
+ @Override
+ public <U> Try<U> tryMap(Function<? super T, Try<U>> mapping) {
+ return isEmpty() ? empty() : Objects.requireNonNull(mapping.apply(value));
+ }
+
+ @Override
+ public Try<T> filter(Predicate<? super T> test) {
+ return this;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof Success)) {
+ return false;
+ }
+
+ Success<?> other = (Success<?>) obj;
+ return Objects.equals(this.value, other.value);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(Success.class, value);
+ }
+
+ @Override
+ public String toString() {
+ return isEmpty()
+ ? "Empty()" //$NON-NLS-1$
+ : String.format("Success(%s)", value); //$NON-NLS-1$
+ }
+}
+
+/**
+ * The failure case of a {@link Try}.
+ *
+ * @param <T>
+ * the value type
+ */
+final class Failure<T> extends Try<T> {
+ private static final long serialVersionUID = -4229519157128957990L;
+ private static final String NO_REASON = "No reason provided."; //$NON-NLS-1$
+
+ private final Throwable failure;
+ private final String reason;
+
+ Failure(String reason) {
+ this(reason, null);
+ }
+
+ Failure(Throwable failure) {
+ this(null, failure);
+ }
+
+ Failure(String reason, Throwable failure) {
+ super();
+
+ this.reason = (reason != null) ? reason : failure != null ? failure.getClass().getName() : NO_REASON;
+ this.failure = failure;
+ }
+
+ @Override
+ public Optional<T> toOptional() {
+ return Optional.empty();
+ }
+
+ @Override
+ public boolean isSuccess() {
+ return false;
+ }
+
+ @Override
+ public T get() throws NoSuchElementException {
+ throw new NoSuchElementException();
+ }
+
+ @Override
+ public String reason() {
+ return reason;
+ }
+
+ @Override
+ public Throwable failure() {
+ return failure;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public <U> Try<U> map(Function<? super T, U> mapping) {
+ return (Try<U>) this;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public <U> Try<U> flatMap(Function<? super T, Optional<U>> mapping) {
+ return (Try<U>) this;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public <U> Try<U> tryMap(Function<? super T, Try<U>> mapping) {
+ return (Try<U>) this;
+ }
+
+ @Override
+ public Try<T> filter(Predicate<? super T> test) {
+ return this;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof Failure)) {
+ return false;
+ }
+
+ Failure<?> other = (Failure<?>) obj;
+ return Objects.equals(this.reason, other.reason)
+ && Objects.equals(this.failure, other.failure);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(Failure.class, reason, failure);
+ }
+
+ @Override
+ public String toString() {
+ return (failure == null || Objects.equals(failure.getMessage(), reason))
+ ? String.format("Failure(%s)", reason) //$NON-NLS-1$
+ : String.format("Failure(%s, %s: %s)", reason, failure.getClass().getSimpleName(), failure.getMessage()); //$NON-NLS-1$
+ }
+
+}
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/.classpath b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/.classpath
index e9c6eafb6fa..bb642933501 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/.classpath
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/.classpath
@@ -3,5 +3,6 @@
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src-gen"/>
+ <classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
</classpath>
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/META-INF/MANIFEST.MF b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/META-INF/MANIFEST.MF
index fc959cf2c8c..15669bd3de0 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/META-INF/MANIFEST.MF
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/META-INF/MANIFEST.MF
@@ -1,6 +1,7 @@
Manifest-Version: 1.0
Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.18.0,4.0.0)",
org.eclipse.emf.ecore.edit;bundle-version="[2.13.0,3.0.0)",
+ org.eclipse.uml2.types;bundle-version="[2.5.0,3.0.0)",
org.eclipse.uml2.common.edit;bundle-version="[2.5.0,3.0.0)",
org.eclipse.emf.ecore.xmi;bundle-version="[2.16.0,3.0.0)",
org.eclipse.papyrus.infra.constraints.edit;bundle-version="[3.0.0,4.0.0)",
@@ -8,13 +9,14 @@ Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.18.0,4.0.0)",
org.eclipse.papyrus.infra.properties;bundle-version="[4.0.0,5.0.0)",
org.eclipse.emf.edit;bundle-version="[2.16.0,3.0.0)",
org.eclipse.papyrus.infra.constraints;bundle-version="[3.0.0,4.0.0)"
-Export-Package: org.eclipse.papyrus.infra.properties.contexts.provider,
+Export-Package: org.eclipse.papyrus.infra.properties.contexts.command,
+ org.eclipse.papyrus.infra.properties.contexts.provider,
org.eclipse.papyrus.infra.properties.environment.provider,
org.eclipse.papyrus.infra.properties.ui.provider
Bundle-Vendor: %providerName
Bundle-ActivationPolicy: lazy
Bundle-ClassPath: .
-Bundle-Version: 4.0.0.qualifier
+Bundle-Version: 4.1.0.qualifier
Bundle-Localization: plugin
Bundle-Name: %pluginName
Bundle-Activator: org.eclipse.papyrus.infra.properties.environment.provider.PropertiesEditPlugin$Implementation
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/build.properties b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/build.properties
index ff1c7b4035c..43022875a79 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/build.properties
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/build.properties
@@ -4,4 +4,4 @@ output.. = bin/
bin.includes=.,icons/,META-INF/,plugin.xml,plugin.properties,about.html
jars.compile.order=.
src.includes = about.html
-source..=src-gen/
+source..=src-gen/,src/
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateCompositeConstraint_constraints_SimpleConstraint.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateCompositeConstraint_constraints_SimpleConstraint.gif
deleted file mode 100644
index 7943912208c..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateCompositeConstraint_constraints_SimpleConstraint.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateCompositeWidget_layout_Layout.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateCompositeWidget_layout_Layout.gif
deleted file mode 100644
index 99dde266945..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateCompositeWidget_layout_Layout.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateCompositeWidget_widgets_CompositeWidget.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateCompositeWidget_widgets_CompositeWidget.gif
deleted file mode 100644
index 8a1bb500a15..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateCompositeWidget_widgets_CompositeWidget.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateCompositeWidget_widgets_PropertyEditor.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateCompositeWidget_widgets_PropertyEditor.gif
deleted file mode 100644
index 746a59ebd8a..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateCompositeWidget_widgets_PropertyEditor.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateCompositeWidget_widgets_StandardWidget.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateCompositeWidget_widgets_StandardWidget.gif
deleted file mode 100644
index 409c013e857..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateCompositeWidget_widgets_StandardWidget.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateCompositeWidget_widgets_UnknownComponent.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateCompositeWidget_widgets_UnknownComponent.gif
deleted file mode 100644
index 1097d000b66..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateCompositeWidget_widgets_UnknownComponent.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateCompositeWidget_widgets_UnknownWidget.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateCompositeWidget_widgets_UnknownWidget.gif
deleted file mode 100644
index 4365960a04b..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateCompositeWidget_widgets_UnknownWidget.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateConstraintDescriptor_constraints_ConstraintDescriptor.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateConstraintDescriptor_constraints_ConstraintDescriptor.gif
deleted file mode 100644
index efcbc1b6a02..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateConstraintDescriptor_constraints_ConstraintDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateConstraintDescriptor_properties_ReferenceProperty.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateConstraintDescriptor_properties_ReferenceProperty.gif
deleted file mode 100644
index 84f1465d1f0..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateConstraintDescriptor_properties_ReferenceProperty.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateConstraintDescriptor_properties_ValueProperty.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateConstraintDescriptor_properties_ValueProperty.gif
deleted file mode 100644
index 7affd573b9e..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateConstraintDescriptor_properties_ValueProperty.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateConstraintMapping_constraints_ConstraintMapping.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateConstraintMapping_constraints_ConstraintMapping.gif
deleted file mode 100644
index 883ce93b430..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateConstraintMapping_constraints_ConstraintMapping.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateConstraintMapping_properties_ReferenceProperty.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateConstraintMapping_properties_ReferenceProperty.gif
deleted file mode 100644
index a1fa94e6e19..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateConstraintMapping_properties_ReferenceProperty.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateConstraintMapping_properties_ValueProperty.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateConstraintMapping_properties_ValueProperty.gif
deleted file mode 100644
index 182638d7681..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateConstraintMapping_properties_ValueProperty.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateContext_constraints_ConstraintDescriptor.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateContext_constraints_ConstraintDescriptor.gif
deleted file mode 100644
index efcbc1b6a02..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateContext_constraints_ConstraintDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateContext_constraints_ConstraintMapping.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateContext_constraints_ConstraintMapping.gif
deleted file mode 100644
index 14ad12525b4..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateContext_constraints_ConstraintMapping.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateContext_dataContexts_DataContextRoot.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateContext_dataContexts_DataContextRoot.gif
deleted file mode 100644
index 7d37ab47804..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateContext_dataContexts_DataContextRoot.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateContext_tabs_Tab.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateContext_tabs_Tab.gif
deleted file mode 100644
index 80f9182accc..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateContext_tabs_Tab.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateContext_views_View.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateContext_views_View.gif
deleted file mode 100644
index e62987a27b1..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateContext_views_View.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateDataContextElement_properties_Property.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateDataContextElement_properties_Property.gif
deleted file mode 100644
index ae4714fc6a7..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateDataContextElement_properties_Property.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateDataContextElement_properties_UnknownProperty.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateDataContextElement_properties_UnknownProperty.gif
deleted file mode 100644
index 07adaab9f3a..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateDataContextElement_properties_UnknownProperty.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateDataContextPackage_elements_DataContextElement.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateDataContextPackage_elements_DataContextElement.gif
deleted file mode 100644
index eab3c353c4f..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateDataContextPackage_elements_DataContextElement.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateDataContextPackage_elements_DataContextPackage.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateDataContextPackage_elements_DataContextPackage.gif
deleted file mode 100644
index 4e7f8d9ecc7..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateDataContextPackage_elements_DataContextPackage.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateDataContextPackage_elements_DataContextRoot.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateDataContextPackage_elements_DataContextRoot.gif
deleted file mode 100644
index 1c4c5221527..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateDataContextPackage_elements_DataContextRoot.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateDisplayUnit_constraints_CompositeConstraint.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateDisplayUnit_constraints_CompositeConstraint.gif
deleted file mode 100644
index 6243419e928..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateDisplayUnit_constraints_CompositeConstraint.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateDisplayUnit_constraints_ConstraintDescriptor.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateDisplayUnit_constraints_ConstraintDescriptor.gif
deleted file mode 100644
index efcbc1b6a02..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateDisplayUnit_constraints_ConstraintDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateDisplayUnit_constraints_SimpleConstraint.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateDisplayUnit_constraints_SimpleConstraint.gif
deleted file mode 100644
index 7943912208c..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateDisplayUnit_constraints_SimpleConstraint.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateElement_children_CompositeWidget.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateElement_children_CompositeWidget.gif
deleted file mode 100644
index 4365960a04b..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateElement_children_CompositeWidget.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateElement_children_Element.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateElement_children_Element.gif
deleted file mode 100644
index 8a06919132f..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateElement_children_Element.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateElement_children_Layout.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateElement_children_Layout.gif
deleted file mode 100644
index 99dde266945..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateElement_children_Layout.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateElement_children_PropertyEditor.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateElement_children_PropertyEditor.gif
deleted file mode 100644
index 746a59ebd8a..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateElement_children_PropertyEditor.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateElement_children_ReferenceAttribute.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateElement_children_ReferenceAttribute.gif
deleted file mode 100644
index 84954664093..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateElement_children_ReferenceAttribute.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateElement_children_StandardWidget.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateElement_children_StandardWidget.gif
deleted file mode 100644
index 4365960a04b..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateElement_children_StandardWidget.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateElement_children_UnknownElement.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateElement_children_UnknownElement.gif
deleted file mode 100644
index 16c3e21097d..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateElement_children_UnknownElement.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateElement_children_ValueAttribute.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateElement_children_ValueAttribute.gif
deleted file mode 100644
index 0d3c1aa7b2a..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateElement_children_ValueAttribute.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_compositeWidgetTypes_CompositeWidgetType.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_compositeWidgetTypes_CompositeWidgetType.gif
deleted file mode 100644
index d9ee5d095f5..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_compositeWidgetTypes_CompositeWidgetType.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_constraintTypes_ConstraintType.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_constraintTypes_ConstraintType.gif
deleted file mode 100644
index cbc3f4322fb..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_constraintTypes_ConstraintType.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_contexts_Context.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_contexts_Context.gif
deleted file mode 100644
index 9b09a7e4986..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_contexts_Context.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_layoutTypes_LayoutType.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_layoutTypes_LayoutType.gif
deleted file mode 100644
index ae50bcb82ce..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_layoutTypes_LayoutType.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_miscClasses_MiscClass.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_miscClasses_MiscClass.gif
deleted file mode 100644
index eacefe82e9e..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_miscClasses_MiscClass.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_modelElementFactories_ModelElementFactoryDescriptor.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_modelElementFactories_ModelElementFactoryDescriptor.gif
deleted file mode 100644
index e3a33e1908c..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_modelElementFactories_ModelElementFactoryDescriptor.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_namespaces_Namespace.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_namespaces_Namespace.gif
deleted file mode 100644
index 56549ea1acd..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_namespaces_Namespace.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_propertyEditorTypes_PropertyEditorType.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_propertyEditorTypes_PropertyEditorType.gif
deleted file mode 100644
index b5d9dfa2bb4..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_propertyEditorTypes_PropertyEditorType.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_widgetTypes_StandardWidgetType.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_widgetTypes_StandardWidgetType.gif
deleted file mode 100644
index 5ac844dc307..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateEnvironment_widgetTypes_StandardWidgetType.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreatePropertyEditor_unresolvedProperty_UnknownProperty.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreatePropertyEditor_unresolvedProperty_UnknownProperty.gif
deleted file mode 100644
index 7561bfa3634..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreatePropertyEditor_unresolvedProperty_UnknownProperty.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateReferenceAttribute_value_CompositeWidget.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateReferenceAttribute_value_CompositeWidget.gif
deleted file mode 100644
index 4365960a04b..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateReferenceAttribute_value_CompositeWidget.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateReferenceAttribute_value_Layout.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateReferenceAttribute_value_Layout.gif
deleted file mode 100644
index 99dde266945..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateReferenceAttribute_value_Layout.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateReferenceAttribute_value_PropertyEditor.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateReferenceAttribute_value_PropertyEditor.gif
deleted file mode 100644
index 746a59ebd8a..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateReferenceAttribute_value_PropertyEditor.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateReferenceAttribute_value_StandardWidget.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateReferenceAttribute_value_StandardWidget.gif
deleted file mode 100644
index 4365960a04b..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateReferenceAttribute_value_StandardWidget.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateReferenceAttribute_value_UIComponent.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateReferenceAttribute_value_UIComponent.gif
deleted file mode 100644
index 2eb12e9ab33..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateReferenceAttribute_value_UIComponent.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateReferenceAttribute_value_UnknownComponent.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateReferenceAttribute_value_UnknownComponent.gif
deleted file mode 100644
index 1097d000b66..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateReferenceAttribute_value_UnknownComponent.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateReferenceAttribute_value_UnknownElement.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateReferenceAttribute_value_UnknownElement.gif
deleted file mode 100644
index 16c3e21097d..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateReferenceAttribute_value_UnknownElement.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateReferenceAttribute_value_UnknownWidget.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateReferenceAttribute_value_UnknownWidget.gif
deleted file mode 100644
index 4365960a04b..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateReferenceAttribute_value_UnknownWidget.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateSimpleConstraint_properties_ReferenceProperty.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateSimpleConstraint_properties_ReferenceProperty.gif
deleted file mode 100644
index efff0c9aa7b..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateSimpleConstraint_properties_ReferenceProperty.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateSimpleConstraint_properties_ValueProperty.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateSimpleConstraint_properties_ValueProperty.gif
deleted file mode 100644
index c78943ee9d6..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateSimpleConstraint_properties_ValueProperty.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateTab_allSections_Section.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateTab_allSections_Section.gif
deleted file mode 100644
index 6d3993a158e..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateTab_allSections_Section.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateTab_sections_Section.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateTab_sections_Section.gif
deleted file mode 100644
index b54fa6dfce1..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateTab_sections_Section.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateUIComponent_attributes_ReferenceAttribute.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateUIComponent_attributes_ReferenceAttribute.gif
deleted file mode 100644
index 84954664093..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateUIComponent_attributes_ReferenceAttribute.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateUIComponent_attributes_ValueAttribute.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateUIComponent_attributes_ValueAttribute.gif
deleted file mode 100644
index 0d3c1aa7b2a..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateUIComponent_attributes_ValueAttribute.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateView_datacontexts_DataContextElement.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateView_datacontexts_DataContextElement.gif
deleted file mode 100644
index d5442892a77..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateView_datacontexts_DataContextElement.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateView_datacontexts_DataContextPackage.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateView_datacontexts_DataContextPackage.gif
deleted file mode 100644
index 1264e5e43bc..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateView_datacontexts_DataContextPackage.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateView_datacontexts_DataContextRoot.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateView_datacontexts_DataContextRoot.gif
deleted file mode 100644
index a62440d6d57..00000000000
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/ctool16/CreateView_datacontexts_DataContextRoot.gif
+++ /dev/null
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/obj16/Annotation.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/obj16/Annotation.gif
new file mode 100644
index 00000000000..68b27186765
--- /dev/null
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/obj16/Annotation.gif
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/obj16/Annotation@2x.gif b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/obj16/Annotation@2x.gif
new file mode 100644
index 00000000000..7db0922b656
--- /dev/null
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/icons/full/obj16/Annotation@2x.gif
Binary files differ
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/plugin.properties b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/plugin.properties
index 73ae3cd23ff..b4cd19896bc 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/plugin.properties
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/plugin.properties
@@ -199,3 +199,11 @@ _UI_Property_redefinedProperties_feature = Redefined Properties
_UI_Property_redefinedByProperties_feature = Redefined By Properties
_UI_FXSection_category_feature = Category
_UI_Tab_testProp_feature = Test Prop
+_UI_Annotation_type = Annotation
+_UI_Annotatable_type = Annotatable
+_UI_Annotation_source_feature = Source
+_UI_Annotation_details_feature = Details
+_UI_Annotation_references_feature = References
+_UI_Annotatable_annotations_feature = Annotations
+_UI_Annotation_element_feature = Element
+_UI_Section_views_feature = Views
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/pom.xml b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/pom.xml
index c39f6c5c3c4..b47abe8996a 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/pom.xml
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/pom.xml
@@ -9,6 +9,6 @@
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>org.eclipse.papyrus.infra.properties.edit</artifactId>
- <version>4.0.0-SNAPSHOT</version>
+ <version>4.1.0-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project> \ No newline at end of file
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/AbstractSectionItemProvider.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/AbstractSectionItemProvider.java
index 2673f91be6d..a2464645499 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/AbstractSectionItemProvider.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/AbstractSectionItemProvider.java
@@ -1,5 +1,17 @@
-/**
- */
+/*****************************************************************************
+ * Copyright (c) 2021 CEA LIST, Christian W. Damus, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 573986
+ *****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts.provider;
@@ -8,19 +20,16 @@ import java.util.List;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.notify.Notification;
-
import org.eclipse.emf.common.util.ResourceLocator;
-
+import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
import org.eclipse.emf.edit.provider.ViewerNotification;
-
import org.eclipse.papyrus.infra.constraints.provider.DisplayUnitItemProvider;
-
import org.eclipse.papyrus.infra.properties.contexts.AbstractSection;
+import org.eclipse.papyrus.infra.properties.contexts.ContextsFactory;
import org.eclipse.papyrus.infra.properties.contexts.ContextsPackage;
-
import org.eclipse.papyrus.infra.properties.environment.provider.PropertiesEditPlugin;
/**
@@ -102,6 +111,46 @@ public class AbstractSectionItemProvider extends DisplayUnitItemProvider {
}
/**
+ * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
+ * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
+ * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object) {
+ if (childrenFeatures == null) {
+ super.getChildrenFeatures(object);
+ childrenFeatures.add(ContextsPackage.Literals.ANNOTATABLE__ANNOTATIONS);
+ }
+ return childrenFeatures;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EStructuralFeature getChildFeature(Object object, Object child) {
+ // Check the type of the specified child object and return the proper feature to use for
+ // adding (see {@link AddCommand}) it as a child.
+
+ return super.getChildFeature(object, child);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected boolean shouldComposeCreationImage() {
+ return true;
+ }
+
+ /**
* This returns the label text for the adapted class.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
@@ -131,6 +180,9 @@ public class AbstractSectionItemProvider extends DisplayUnitItemProvider {
case ContextsPackage.ABSTRACT_SECTION__NAME:
fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
return;
+ case ContextsPackage.ABSTRACT_SECTION__ANNOTATIONS:
+ fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
+ return;
}
super.notifyChanged(notification);
}
@@ -145,6 +197,11 @@ public class AbstractSectionItemProvider extends DisplayUnitItemProvider {
@Override
protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
super.collectNewChildDescriptors(newChildDescriptors, object);
+
+ newChildDescriptors.add
+ (createChildParameter
+ (ContextsPackage.Literals.ANNOTATABLE__ANNOTATIONS,
+ ContextsFactory.eINSTANCE.createAnnotation()));
}
/**
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/AnnotatableItemProvider.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/AnnotatableItemProvider.java
new file mode 100644
index 00000000000..6e825ae9074
--- /dev/null
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/AnnotatableItemProvider.java
@@ -0,0 +1,180 @@
+/**
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ */
+package org.eclipse.papyrus.infra.properties.contexts.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.common.util.ResourceLocator;
+
+import org.eclipse.emf.ecore.EStructuralFeature;
+
+import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.IItemPropertySource;
+import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.emf.edit.provider.ItemProviderAdapter;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+
+import org.eclipse.papyrus.infra.properties.contexts.Annotatable;
+import org.eclipse.papyrus.infra.properties.contexts.ContextsFactory;
+import org.eclipse.papyrus.infra.properties.contexts.ContextsPackage;
+
+import org.eclipse.papyrus.infra.properties.environment.provider.PropertiesEditPlugin;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.papyrus.infra.properties.contexts.Annotatable} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class AnnotatableItemProvider
+ extends ItemProviderAdapter
+ implements
+ IEditingDomainItemProvider,
+ IStructuredItemContentProvider,
+ ITreeItemContentProvider,
+ IItemLabelProvider,
+ IItemPropertySource {
+ /**
+ * This constructs an instance from a factory and a notifier.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public AnnotatableItemProvider(AdapterFactory adapterFactory) {
+ super(adapterFactory);
+ }
+
+ /**
+ * This returns the property descriptors for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
+ if (itemPropertyDescriptors == null) {
+ super.getPropertyDescriptors(object);
+
+ }
+ return itemPropertyDescriptors;
+ }
+
+ /**
+ * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
+ * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
+ * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object) {
+ if (childrenFeatures == null) {
+ super.getChildrenFeatures(object);
+ childrenFeatures.add(ContextsPackage.Literals.ANNOTATABLE__ANNOTATIONS);
+ }
+ return childrenFeatures;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EStructuralFeature getChildFeature(Object object, Object child) {
+ // Check the type of the specified child object and return the proper feature to use for
+ // adding (see {@link AddCommand}) it as a child.
+
+ return super.getChildFeature(object, child);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected boolean shouldComposeCreationImage() {
+ return true;
+ }
+
+ /**
+ * This returns the label text for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public String getText(Object object) {
+ return getString("_UI_Annotatable_type");
+ }
+
+
+ /**
+ * This handles model notifications by calling {@link #updateChildren} to update any cached
+ * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void notifyChanged(Notification notification) {
+ updateChildren(notification);
+
+ switch (notification.getFeatureID(Annotatable.class)) {
+ case ContextsPackage.ANNOTATABLE__ANNOTATIONS:
+ fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
+ return;
+ }
+ super.notifyChanged(notification);
+ }
+
+ /**
+ * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+ * that can be created under this object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
+ super.collectNewChildDescriptors(newChildDescriptors, object);
+
+ newChildDescriptors.add
+ (createChildParameter
+ (ContextsPackage.Literals.ANNOTATABLE__ANNOTATIONS,
+ ContextsFactory.eINSTANCE.createAnnotation()));
+ }
+
+ /**
+ * Return the resource locator for this item provider's resources.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public ResourceLocator getResourceLocator() {
+ return PropertiesEditPlugin.INSTANCE;
+ }
+
+}
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/AnnotationItemProvider.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/AnnotationItemProvider.java
new file mode 100644
index 00000000000..a171dae0cf5
--- /dev/null
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/AnnotationItemProvider.java
@@ -0,0 +1,246 @@
+/**
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ */
+package org.eclipse.papyrus.infra.properties.contexts.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.common.util.ResourceLocator;
+
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.EcoreFactory;
+import org.eclipse.emf.ecore.EcorePackage;
+
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.IItemPropertySource;
+import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ItemProviderAdapter;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+
+import org.eclipse.papyrus.infra.properties.contexts.Annotation;
+import org.eclipse.papyrus.infra.properties.contexts.ContextsPackage;
+
+import org.eclipse.papyrus.infra.properties.environment.provider.PropertiesEditPlugin;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.papyrus.infra.properties.contexts.Annotation} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class AnnotationItemProvider
+ extends ItemProviderAdapter
+ implements
+ IEditingDomainItemProvider,
+ IStructuredItemContentProvider,
+ ITreeItemContentProvider,
+ IItemLabelProvider,
+ IItemPropertySource {
+ /**
+ * This constructs an instance from a factory and a notifier.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public AnnotationItemProvider(AdapterFactory adapterFactory) {
+ super(adapterFactory);
+ }
+
+ /**
+ * This returns the property descriptors for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
+ if (itemPropertyDescriptors == null) {
+ super.getPropertyDescriptors(object);
+
+ addSourcePropertyDescriptor(object);
+ addReferencesPropertyDescriptor(object);
+ }
+ return itemPropertyDescriptors;
+ }
+
+ /**
+ * This adds a property descriptor for the Source feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected void addSourcePropertyDescriptor(Object object) {
+ itemPropertyDescriptors.add
+ (createItemPropertyDescriptor
+ (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+ getResourceLocator(),
+ getString("_UI_Annotation_source_feature"),
+ getString("_UI_PropertyDescriptor_description", "_UI_Annotation_source_feature", "_UI_Annotation_type"),
+ ContextsPackage.Literals.ANNOTATION__SOURCE,
+ true,
+ false,
+ false,
+ ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+ null,
+ null));
+ }
+
+ /**
+ * This adds a property descriptor for the References feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected void addReferencesPropertyDescriptor(Object object) {
+ itemPropertyDescriptors.add
+ (createItemPropertyDescriptor
+ (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+ getResourceLocator(),
+ getString("_UI_Annotation_references_feature"),
+ getString("_UI_PropertyDescriptor_description", "_UI_Annotation_references_feature", "_UI_Annotation_type"),
+ ContextsPackage.Literals.ANNOTATION__REFERENCES,
+ true,
+ false,
+ true,
+ null,
+ null,
+ null));
+ }
+
+ /**
+ * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
+ * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
+ * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object) {
+ if (childrenFeatures == null) {
+ super.getChildrenFeatures(object);
+ childrenFeatures.add(ContextsPackage.Literals.ANNOTATION__DETAILS);
+ }
+ return childrenFeatures;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EStructuralFeature getChildFeature(Object object, Object child) {
+ // Check the type of the specified child object and return the proper feature to use for
+ // adding (see {@link AddCommand}) it as a child.
+
+ return super.getChildFeature(object, child);
+ }
+
+ /**
+ * This returns Annotation.gif.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object getImage(Object object) {
+ return overlayImage(object, getResourceLocator().getImage("full/obj16/Annotation"));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected boolean shouldComposeCreationImage() {
+ return true;
+ }
+
+ /**
+ * This returns the label text for the adapted class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public String getText(Object object) {
+ String label = ((Annotation)object).getSource();
+ return label == null || label.length() == 0 ?
+ getString("_UI_Annotation_type") :
+ getString("_UI_Annotation_type") + " " + label;
+ }
+
+
+ /**
+ * This handles model notifications by calling {@link #updateChildren} to update any cached
+ * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void notifyChanged(Notification notification) {
+ updateChildren(notification);
+
+ switch (notification.getFeatureID(Annotation.class)) {
+ case ContextsPackage.ANNOTATION__SOURCE:
+ fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
+ return;
+ case ContextsPackage.ANNOTATION__DETAILS:
+ fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
+ return;
+ }
+ super.notifyChanged(notification);
+ }
+
+ /**
+ * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+ * that can be created under this object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
+ super.collectNewChildDescriptors(newChildDescriptors, object);
+
+ newChildDescriptors.add
+ (createChildParameter
+ (ContextsPackage.Literals.ANNOTATION__DETAILS,
+ EcoreFactory.eINSTANCE.create(EcorePackage.Literals.ESTRING_TO_STRING_MAP_ENTRY)));
+ }
+
+ /**
+ * Return the resource locator for this item provider's resources.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public ResourceLocator getResourceLocator() {
+ return PropertiesEditPlugin.INSTANCE;
+ }
+
+}
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/ContextItemProvider.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/ContextItemProvider.java
index 6bfe93ffa68..27b4595fc6f 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/ContextItemProvider.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/ContextItemProvider.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011, 2015 CEA LIST, Christian W. Damus, and others.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,7 +10,7 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
- * Christian W. Damus - bug 482927
+ * Christian W. Damus - bugs 482927, 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts.provider;
@@ -224,6 +224,16 @@ public class ContextItemProvider
}
/**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected boolean shouldComposeCreationImage() {
+ return true;
+ }
+
+ /**
* This returns the label text for the adapted class.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/ContextsItemProviderAdapterFactory.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/ContextsItemProviderAdapterFactory.java
index cf3dfb43333..dc51bb870c5 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/ContextsItemProviderAdapterFactory.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/ContextsItemProviderAdapterFactory.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,6 +10,7 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts.provider;
@@ -288,6 +289,29 @@ public class ContextsItemProviderAdapterFactory extends ContextsAdapterFactory i
}
/**
+ * This keeps track of the one adapter used for all {@link org.eclipse.papyrus.infra.properties.contexts.Annotation} instances.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected AnnotationItemProvider annotationItemProvider;
+
+ /**
+ * This creates an adapter for a {@link org.eclipse.papyrus.infra.properties.contexts.Annotation}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Adapter createAnnotationAdapter() {
+ if (annotationItemProvider == null) {
+ annotationItemProvider = new AnnotationItemProvider(this);
+ }
+
+ return annotationItemProvider;
+ }
+
+ /**
* This returns the root adapter factory that contains this factory.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
@@ -395,6 +419,7 @@ public class ContextsItemProviderAdapterFactory extends ContextsAdapterFactory i
if (contextItemProvider != null) contextItemProvider.dispose();
if (tabItemProvider != null) tabItemProvider.dispose();
if (sectionItemProvider != null) sectionItemProvider.dispose();
+ if (annotationItemProvider != null) annotationItemProvider.dispose();
if (propertyItemProvider != null) propertyItemProvider.dispose();
if (dataContextElementItemProvider != null) dataContextElementItemProvider.dispose();
if (dataContextPackageItemProvider != null) dataContextPackageItemProvider.dispose();
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/DataContextElementItemProvider.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/DataContextElementItemProvider.java
index e6e4a905d9d..1ee7603bc30 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/DataContextElementItemProvider.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/DataContextElementItemProvider.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,6 +10,7 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts.provider;
@@ -19,22 +20,14 @@ import java.util.List;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
import org.eclipse.emf.edit.provider.ViewerNotification;
import org.eclipse.papyrus.infra.properties.contexts.ContextsFactory;
import org.eclipse.papyrus.infra.properties.contexts.ContextsPackage;
import org.eclipse.papyrus.infra.properties.contexts.DataContextElement;
-import org.eclipse.papyrus.infra.properties.environment.provider.PropertiesEditPlugin;
/**
* This is the item provider adapter for a {@link org.eclipse.papyrus.infra.properties.contexts.DataContextElement} object.
@@ -43,13 +36,7 @@ import org.eclipse.papyrus.infra.properties.environment.provider.PropertiesEditP
* @generated
*/
public class DataContextElementItemProvider
- extends ItemProviderAdapter
- implements
- IEditingDomainItemProvider,
- IStructuredItemContentProvider,
- ITreeItemContentProvider,
- IItemLabelProvider,
- IItemPropertySource {
+ extends AnnotatableItemProvider {
/**
* This constructs an instance from a factory and a notifier.
* <!-- begin-user-doc -->
@@ -163,6 +150,16 @@ public class DataContextElementItemProvider
}
/**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected boolean shouldComposeCreationImage() {
+ return true;
+ }
+
+ /**
* This returns the label text for the adapted class.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
@@ -220,15 +217,4 @@ public class DataContextElementItemProvider
ContextsFactory.eINSTANCE.createUnknownProperty()));
}
- /**
- * Return the resource locator for this item provider's resources.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
- @Override
- public ResourceLocator getResourceLocator() {
- return PropertiesEditPlugin.INSTANCE;
- }
-
}
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/DataContextPackageItemProvider.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/DataContextPackageItemProvider.java
index d2c9d2e0d9a..8b6176b12dc 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/DataContextPackageItemProvider.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/DataContextPackageItemProvider.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,6 +10,7 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts.provider;
@@ -101,6 +102,16 @@ public class DataContextPackageItemProvider
}
/**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected boolean shouldComposeCreationImage() {
+ return true;
+ }
+
+ /**
* This returns the label text for the adapted class.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/DataContextRootItemProvider.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/DataContextRootItemProvider.java
index 39e23a255bb..7c1fdf9b5dd 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/DataContextRootItemProvider.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/DataContextRootItemProvider.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,6 +10,7 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts.provider;
@@ -117,6 +118,16 @@ public class DataContextRootItemProvider
}
/**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected boolean shouldComposeCreationImage() {
+ return true;
+ }
+
+ /**
* This returns the label text for the adapted class.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/PropertyItemProvider.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/PropertyItemProvider.java
index a17a5045bc6..5b9029c26a2 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/PropertyItemProvider.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/PropertyItemProvider.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011, 2017 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -11,6 +11,7 @@
* Contributors:
* CEA LIST - Initial API and implementation
* Vincent Lorenzo - Bug 520271
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts.provider;
@@ -20,20 +21,12 @@ import java.util.List;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.ResourceLocator;
import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
import org.eclipse.emf.edit.provider.ViewerNotification;
import org.eclipse.papyrus.infra.properties.contexts.ContextsPackage;
import org.eclipse.papyrus.infra.properties.contexts.Property;
-import org.eclipse.papyrus.infra.properties.environment.provider.PropertiesEditPlugin;
/**
* This is the item provider adapter for a {@link org.eclipse.papyrus.infra.properties.contexts.Property} object.
@@ -42,13 +35,7 @@ import org.eclipse.papyrus.infra.properties.environment.provider.PropertiesEditP
* @generated
*/
public class PropertyItemProvider
- extends ItemProviderAdapter
- implements
- IEditingDomainItemProvider,
- IStructuredItemContentProvider,
- ITreeItemContentProvider,
- IItemLabelProvider,
- IItemPropertySource {
+ extends AnnotatableItemProvider {
/**
* This constructs an instance from a factory and a notifier.
* <!-- begin-user-doc -->
@@ -247,6 +234,16 @@ public class PropertyItemProvider
}
/**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected boolean shouldComposeCreationImage() {
+ return true;
+ }
+
+ /**
* This returns the label text for the adapted class.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
@@ -295,15 +292,4 @@ public class PropertyItemProvider
super.collectNewChildDescriptors(newChildDescriptors, object);
}
- /**
- * Return the resource locator for this item provider's resources.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * @generated
- */
- @Override
- public ResourceLocator getResourceLocator() {
- return PropertiesEditPlugin.INSTANCE;
- }
-
}
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/SectionItemProvider.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/SectionItemProvider.java
index 4b1291fd7d4..9a339e06bc7 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/SectionItemProvider.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/SectionItemProvider.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,6 +10,7 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts.provider;
@@ -57,6 +58,7 @@ public class SectionItemProvider
addSectionFilePropertyDescriptor(object);
addWidgetPropertyDescriptor(object);
+ addViewsPropertyDescriptor(object);
}
return itemPropertyDescriptors;
}
@@ -106,6 +108,28 @@ public class SectionItemProvider
}
/**
+ * This adds a property descriptor for the Views feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected void addViewsPropertyDescriptor(Object object) {
+ itemPropertyDescriptors.add
+ (createItemPropertyDescriptor
+ (((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+ getResourceLocator(),
+ getString("_UI_Section_views_feature"),
+ getString("_UI_PropertyDescriptor_description", "_UI_Section_views_feature", "_UI_Section_type"),
+ ContextsPackage.Literals.SECTION__VIEWS,
+ false,
+ false,
+ false,
+ null,
+ null,
+ null));
+ }
+
+ /**
* This returns Section.gif.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
@@ -117,6 +141,16 @@ public class SectionItemProvider
}
/**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected boolean shouldComposeCreationImage() {
+ return true;
+ }
+
+ /**
* This returns the label text for the adapted class.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/TabItemProvider.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/TabItemProvider.java
index ed6a495b6b2..8b6222ca9ea 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/TabItemProvider.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/TabItemProvider.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,6 +10,7 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts.provider;
@@ -301,6 +302,16 @@ public class TabItemProvider
}
/**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected boolean shouldComposeCreationImage() {
+ return true;
+ }
+
+ /**
* This returns the label text for the adapted class.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/UnknownPropertyItemProvider.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/UnknownPropertyItemProvider.java
index 0d93baadf44..ed7ab836ed4 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/UnknownPropertyItemProvider.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/UnknownPropertyItemProvider.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,6 +10,7 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts.provider;
@@ -67,6 +68,16 @@ public class UnknownPropertyItemProvider
}
/**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected boolean shouldComposeCreationImage() {
+ return true;
+ }
+
+ /**
* This returns the label text for the adapted class.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/ViewItemProvider.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/ViewItemProvider.java
index 9bdd469e12d..615b9e18fce 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/ViewItemProvider.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/contexts/provider/ViewItemProvider.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,6 +10,7 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts.provider;
@@ -20,11 +21,13 @@ import java.util.List;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
import org.eclipse.emf.edit.provider.ViewerNotification;
import org.eclipse.papyrus.infra.constraints.provider.DisplayUnitItemProvider;
+import org.eclipse.papyrus.infra.properties.contexts.ContextsFactory;
import org.eclipse.papyrus.infra.properties.contexts.ContextsPackage;
import org.eclipse.papyrus.infra.properties.contexts.View;
import org.eclipse.papyrus.infra.properties.environment.provider.PropertiesEditPlugin;
@@ -155,6 +158,36 @@ public class ViewItemProvider
}
/**
+ * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
+ * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
+ * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object) {
+ if (childrenFeatures == null) {
+ super.getChildrenFeatures(object);
+ childrenFeatures.add(ContextsPackage.Literals.ANNOTATABLE__ANNOTATIONS);
+ }
+ return childrenFeatures;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EStructuralFeature getChildFeature(Object object, Object child) {
+ // Check the type of the specified child object and return the proper feature to use for
+ // adding (see {@link AddCommand}) it as a child.
+
+ return super.getChildFeature(object, child);
+ }
+
+ /**
* This returns View.gif.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
@@ -166,6 +199,16 @@ public class ViewItemProvider
}
/**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected boolean shouldComposeCreationImage() {
+ return true;
+ }
+
+ /**
* This returns the label text for the adapted class.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
@@ -195,6 +238,9 @@ public class ViewItemProvider
case ContextsPackage.VIEW__AUTOMATIC_CONTEXT:
fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
return;
+ case ContextsPackage.VIEW__ANNOTATIONS:
+ fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
+ return;
}
super.notifyChanged(notification);
}
@@ -209,6 +255,11 @@ public class ViewItemProvider
@Override
protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
super.collectNewChildDescriptors(newChildDescriptors, object);
+
+ newChildDescriptors.add
+ (createChildParameter
+ (ContextsPackage.Literals.ANNOTATABLE__ANNOTATIONS,
+ ContextsFactory.eINSTANCE.createAnnotation()));
}
/**
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/environment/provider/PropertiesEditPlugin.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/environment/provider/PropertiesEditPlugin.java
index 4220e0e0410..6015ce6b10e 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/environment/provider/PropertiesEditPlugin.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src-gen/org/eclipse/papyrus/infra/properties/environment/provider/PropertiesEditPlugin.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,6 +10,7 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.environment.provider;
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src/org/eclipse/papyrus/infra/properties/contexts/command/ContextDeleteCommand.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src/org/eclipse/papyrus/infra/properties/contexts/command/ContextDeleteCommand.java
new file mode 100644
index 00000000000..57ca90b97cf
--- /dev/null
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.edit/src/org/eclipse/papyrus/infra/properties/contexts/command/ContextDeleteCommand.java
@@ -0,0 +1,88 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.properties.contexts.command;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.edit.command.DeleteCommand;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.papyrus.infra.properties.contexts.Context;
+import org.eclipse.papyrus.infra.properties.contexts.util.ContextUsageCrossReferencer;
+
+/**
+ * A specialized deletion command that restricts the scan for incoming references to only
+ * within loaded context resources.
+ *
+ * @since 4.1
+ */
+public class ContextDeleteCommand extends DeleteCommand {
+
+ /**
+ * Initializes me with my contextual editing {@code domain} and a {@code collection} of objects to delete.
+ *
+ * @param domain
+ * the editing domain
+ * @param collection
+ * objects to delete
+ */
+ public ContextDeleteCommand(EditingDomain domain, Collection<?> collection) {
+ super(domain, collection);
+ }
+
+ @Override
+ protected Map<EObject, Collection<EStructuralFeature.Setting>> findReferences(Collection<EObject> eObjects) {
+ // Scope the search for cross-references to just the context resources, and excluding the XWT sections
+ Set<Resource> scope = domain.getResourceSet().getResources().stream()
+ .filter(this::isContextResource)
+ .collect(Collectors.toSet());
+
+ return new ContextUsageCrossReferencer(scope).findAllUsage(eObjects);
+ }
+
+ /**
+ * Query whether a {@code resource} contains a Properties {@link Context}.
+ *
+ * @param resource
+ * a resource
+ * @return whether it contains a context
+ */
+ boolean isContextResource(Resource resource) {
+ return resource.isLoaded() && !resource.getContents().isEmpty()
+ && resource.getContents().stream().anyMatch(Context.class::isInstance);
+ }
+
+ /**
+ * Create a command to delete an {@code object}.
+ */
+ public static Command create(EditingDomain domain, Object object) {
+ return create(domain, Set.of(object));
+ }
+
+ /**
+ * Create a command to delete an {@code collection} of objects.
+ */
+ public static Command create(EditingDomain domain, final Collection<?> collection) {
+ return new ContextDeleteCommand(domain, collection);
+ }
+
+}
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties.ui/model/Environment.properties b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.ui/model/Environment.properties
new file mode 100644
index 00000000000..e65146d0e50
--- /dev/null
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties.ui/model/Environment.properties
@@ -0,0 +1,17 @@
+#
+# Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+# Christian W. Damus - Initial API and implementation
+#
+#
+
+_UI_label_EMFInstanceOfDeprecated=Ecore 'instance-of'
+_UI_label_className=EClass name
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/META-INF/MANIFEST.MF b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/META-INF/MANIFEST.MF
index 83eb212f035..d15b6db8fb7 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/META-INF/MANIFEST.MF
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/META-INF/MANIFEST.MF
@@ -2,6 +2,7 @@ Manifest-Version: 1.0
Export-Package: org.eclipse.papyrus.infra.properties.catalog,
org.eclipse.papyrus.infra.properties.contexts,
org.eclipse.papyrus.infra.properties.contexts.impl,
+ org.eclipse.papyrus.infra.properties.contexts.operations,
org.eclipse.papyrus.infra.properties.contexts.util,
org.eclipse.papyrus.infra.properties.environment,
org.eclipse.papyrus.infra.properties.environment.impl,
@@ -17,6 +18,7 @@ Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.18.0,4.0.0)",
org.eclipse.emf.ecore;bundle-version="[2.23.0,3.0.0)",
org.eclipse.emf.ecore.xmi;bundle-version="[2.16.0,3.0.0)",
org.eclipse.papyrus.infra.constraints;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.uml2.types;bundle-version="[2.5.0,3.0.0)",
org.eclipse.uml2.common;bundle-version="[2.5.0,3.0.0)",
org.eclipse.papyrus.infra.core.log;bundle-version="[2.0.0,3.0.0)"
Bundle-Vendor: %providerName
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/Model/properties.ecore b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/Model/properties.ecore
index ce640ef084e..866f6ebe073 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/Model/properties.ecore
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/Model/properties.ecore
@@ -119,23 +119,49 @@
<eStructuralFeatures xsi:type="ecore:EAttribute" name="priority" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Section" eSuperTypes="#//contexts/AbstractSection">
+ <eOperations name="getViews" ordered="false" upperBound="-1" eType="#//contexts/View">
+ <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+ <details key="suppressedVisibility" value="true"/>
+ </eAnnotations>
+ </eOperations>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="sectionFile" lowerBound="1"
eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="widget" lowerBound="1"
eType="#//ui/CompositeWidget"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="views" ordered="false"
+ upperBound="-1" eType="#//contexts/View" changeable="false" volatile="true"
+ transient="true" derived="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="owner" lowerBound="1"
eType="#//contexts/Tab" volatile="true" transient="true" derived="true"
eOpposite="#//contexts/Tab/sections">
<eAnnotations source="subsets" references="#//contexts/AbstractSection/tab"/>
</eStructuralFeatures>
</eClassifiers>
- <eClassifiers xsi:type="ecore:EClass" name="AbstractSection" abstract="true" eSuperTypes="../../org.eclipse.papyrus.infra.constraints/Model/Constraints.ecore#//DisplayUnit">
+ <eClassifiers xsi:type="ecore:EClass" name="AbstractSection" abstract="true" eSuperTypes="../../org.eclipse.papyrus.infra.constraints/Model/Constraints.ecore#//DisplayUnit #//contexts/Annotatable">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" lowerBound="1"
eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="tab" lowerBound="1" eType="#//contexts/Tab"
eOpposite="#//contexts/Tab/allSections"/>
</eClassifiers>
- <eClassifiers xsi:type="ecore:EClass" name="Property">
+ <eClassifiers xsi:type="ecore:EClass" name="Annotatable" abstract="true">
+ <eOperations name="getAnnotation" ordered="false" lowerBound="1" eType="#//contexts/Annotation">
+ <eParameters name="source" ordered="false" lowerBound="1" eType="ecore:EDataType ../../org.eclipse.uml2.types/model/Types.ecore#//String"/>
+ </eOperations>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="annotations" ordered="false"
+ upperBound="-1" eType="#//contexts/Annotation" containment="true" eOpposite="#//contexts/Annotation/element"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="Annotation">
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="source" ordered="false"
+ lowerBound="1" eType="ecore:EDataType ../../org.eclipse.uml2.types/model/Types.ecore#//String"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="references" ordered="false"
+ upperBound="-1" eType="ecore:EClass ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EObject"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="details" ordered="false"
+ upperBound="-1" eType="ecore:EClass ../../org.eclipse.emf.ecore/model/Ecore.ecore#//EStringToStringMapEntry"
+ containment="true"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="element" ordered="false"
+ lowerBound="1" eType="#//contexts/Annotatable" eOpposite="#//contexts/Annotatable/annotations"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="Property" eSuperTypes="#//contexts/Annotatable">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" lowerBound="1"
eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="label" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
@@ -151,7 +177,7 @@
<eStructuralFeatures xsi:type="ecore:EReference" name="redefinedByProperties"
upperBound="-1" eType="#//contexts/Property" eOpposite="#//contexts/Property/redefinedProperties"/>
</eClassifiers>
- <eClassifiers xsi:type="ecore:EClass" name="DataContextElement">
+ <eClassifiers xsi:type="ecore:EClass" name="DataContextElement" eSuperTypes="#//contexts/Annotatable">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" lowerBound="1"
eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="package" eType="#//contexts/DataContextPackage"
@@ -166,17 +192,17 @@
eType="#//contexts/DataContextElement" containment="true" eOpposite="#//contexts/DataContextElement/package"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="UnknownProperty" eSuperTypes="#//contexts/Property"/>
- <eClassifiers xsi:type="ecore:EClass" name="View" eSuperTypes="../../org.eclipse.papyrus.infra.constraints/Model/Constraints.ecore#//DisplayUnit">
+ <eClassifiers xsi:type="ecore:EClass" name="View" eSuperTypes="../../org.eclipse.papyrus.infra.constraints/Model/Constraints.ecore#//DisplayUnit #//contexts/Annotatable">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" lowerBound="1"
eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="sections" upperBound="-1"
eType="#//contexts/Section"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="context" lowerBound="1"
+ eType="#//contexts/Context" eOpposite="#//contexts/Context/views"/>
<eStructuralFeatures xsi:type="ecore:EAttribute" name="automaticContext" lowerBound="1"
eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="datacontexts" upperBound="-1"
eType="#//contexts/DataContextElement"/>
- <eStructuralFeatures xsi:type="ecore:EReference" name="context" lowerBound="1"
- eType="#//contexts/Context" eOpposite="#//contexts/Context/views"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="DataContextRoot" eSuperTypes="#//contexts/DataContextPackage">
<eStructuralFeatures xsi:type="ecore:EAttribute" name="label" lowerBound="1"
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/Model/properties.genmodel b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/Model/properties.genmodel
index 2c59818b644..86ed1330ae0 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/Model/properties.genmodel
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/Model/properties.genmodel
@@ -2,12 +2,13 @@
<genmodel:GenModel xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:genmodel="http://www.eclipse.org/uml2/2.2.0/GenModel"
copyrightText="Copyright (c) 2011, 2021 CEA LIST and others.&#xA;&#xA;All rights reserved. This program and the accompanying materials&#xA;are made available under the terms of the Eclipse Public License 2.0&#xA;which accompanies this distribution, and is available at&#xA;https://www.eclipse.org/legal/epl-2.0/&#xA;&#xA;SPDX-License-Identifier: EPL-2.0&#xA;&#xA;Contributors:&#xA; CEA LIST - Initial API and implementation&#xA;"
- modelDirectory="/org.eclipse.papyrus.infra.properties/src-gen" editDirectory="/org.eclipse.papyrus.infra.properties.edit/src-gen"
+ modelDirectory="/org.eclipse.papyrus.infra.properties/src-gen" creationIcons="false"
+ editDirectory="/org.eclipse.papyrus.infra.properties.edit/src-gen"
editorDirectory="/org.eclipse.papyrus.infra.properties.editor/src-gen" modelPluginID="org.eclipse.papyrus.infra.properties"
modelName="Properties" nonNLSMarkers="true" rootExtendsClass="org.eclipse.emf.ecore.impl.MinimalEObjectImpl$Container"
importerID="org.eclipse.uml2.uml.ecore.importer" complianceLevel="11.0" copyrightFields="false"
- usedGenPackages="../../org.eclipse.papyrus.infra.constraints/Model/Constraints.genmodel#//constraints ../../org.eclipse.emf.ecore/model/Ecore.genmodel#//ecore"
- operationReflection="true" importOrganizing="true">
+ usedGenPackages="../../org.eclipse.papyrus.infra.constraints/Model/Constraints.genmodel#//constraints ../../org.eclipse.emf.ecore/model/Ecore.genmodel#//ecore ../../org.eclipse.uml2.types/model/Types.genmodel#//types"
+ operationReflection="true" importOrganizing="true" cacheAdapterSupport="true">
<genAnnotations source="http://www.eclipse.org/emf/2002/GenModel/importer/org.eclipse.uml2.uml.ecore.importer">
<details key="OPPOSITE_ROLE_NAMES" value="IGNORE"/>
<details key="DUPLICATE_FEATURES" value="DISCARD"/>
@@ -36,7 +37,9 @@
<genPackages xsi:type="genmodel:GenPackage" prefix="Properties" basePackage="org.eclipse.papyrus.infra"
disposableProviderFactory="true" ecorePackage="properties.ecore#/">
<nestedGenPackages xsi:type="genmodel:GenPackage" prefix="Environment" basePackage="org.eclipse.papyrus.infra.properties"
- disposableProviderFactory="true" ecorePackage="properties.ecore#//environment">
+ resource="XMI" disposableProviderFactory="true" contentTypeIdentifier="org.eclipse.papyrus.infra.properties.environment"
+ fileExtensions="environment,xmi" ecorePackage="properties.ecore#//environment"
+ operationsPackage="org.eclipse.papyrus.infra.properties.environment.operations">
<genEnums xsi:type="genmodel:GenEnum" typeSafeEnumCompatible="false" ecoreEnum="properties.ecore#//environment/Type">
<genEnumLiterals xsi:type="genmodel:GenEnumLiteral" ecoreEnumLiteral="properties.ecore#//environment/Type/String"/>
<genEnumLiterals xsi:type="genmodel:GenEnumLiteral" ecoreEnumLiteral="properties.ecore#//environment/Type/Boolean"/>
@@ -91,7 +94,8 @@
</genClasses>
</nestedGenPackages>
<nestedGenPackages xsi:type="genmodel:GenPackage" prefix="Contexts" basePackage="org.eclipse.papyrus.infra.properties"
- disposableProviderFactory="true" ecorePackage="properties.ecore#//contexts">
+ resource="XMI" disposableProviderFactory="true" contentTypeIdentifier="org.eclipse.papyrus.infra.properties.context"
+ fileExtensions="ctx" ecorePackage="properties.ecore#//contexts" operationsPackage="org.eclipse.papyrus.infra.properties.contexts.operations">
<genClasses xsi:type="genmodel:GenClass" ecoreClass="properties.ecore#//contexts/Context">
<genFeatures xsi:type="genmodel:GenFeature" createChild="false" ecoreFeature="ecore:EAttribute properties.ecore#//contexts/Context/name"/>
<genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
@@ -126,14 +130,34 @@
<genFeatures xsi:type="genmodel:GenFeature" createChild="false" ecoreFeature="ecore:EAttribute properties.ecore#//contexts/Section/sectionFile"/>
<genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
propertySortChoices="true" ecoreFeature="ecore:EReference properties.ecore#//contexts/Section/widget"/>
+ <genFeatures xsi:type="genmodel:GenFeature" property="Readonly" notify="false"
+ createChild="false" ecoreFeature="ecore:EReference properties.ecore#//contexts/Section/views"/>
<genFeatures xsi:type="genmodel:GenFeature" property="None" notify="false"
createChild="false" ecoreFeature="ecore:EReference properties.ecore#//contexts/Section/owner"/>
+ <genOperations xsi:type="genmodel:GenOperation" ecoreOperation="properties.ecore#//contexts/Section/getViews"
+ cacheAdapterScope="Resource"/>
</genClasses>
<genClasses xsi:type="genmodel:GenClass" image="false" ecoreClass="properties.ecore#//contexts/AbstractSection">
<genFeatures xsi:type="genmodel:GenFeature" createChild="false" ecoreFeature="ecore:EAttribute properties.ecore#//contexts/AbstractSection/name"/>
<genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
propertySortChoices="true" ecoreFeature="ecore:EReference properties.ecore#//contexts/AbstractSection/tab"/>
</genClasses>
+ <genClasses xsi:type="genmodel:GenClass" image="false" ecoreClass="properties.ecore#//contexts/Annotatable">
+ <genFeatures xsi:type="genmodel:GenFeature" property="None" children="true"
+ createChild="true" ecoreFeature="ecore:EReference properties.ecore#//contexts/Annotatable/annotations"/>
+ <genOperations xsi:type="genmodel:GenOperation" ecoreOperation="properties.ecore#//contexts/Annotatable/getAnnotation">
+ <genParameters xsi:type="genmodel:GenParameter" ecoreParameter="properties.ecore#//contexts/Annotatable/getAnnotation/source"/>
+ </genOperations>
+ </genClasses>
+ <genClasses xsi:type="genmodel:GenClass" ecoreClass="properties.ecore#//contexts/Annotation">
+ <genFeatures xsi:type="genmodel:GenFeature" createChild="false" ecoreFeature="ecore:EAttribute properties.ecore#//contexts/Annotation/source"/>
+ <genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
+ propertySortChoices="true" ecoreFeature="ecore:EReference properties.ecore#//contexts/Annotation/references"/>
+ <genFeatures xsi:type="genmodel:GenFeature" property="None" children="true"
+ createChild="true" ecoreFeature="ecore:EReference properties.ecore#//contexts/Annotation/details"/>
+ <genFeatures xsi:type="genmodel:GenFeature" property="None" notify="false"
+ createChild="false" ecoreFeature="ecore:EReference properties.ecore#//contexts/Annotation/element"/>
+ </genClasses>
<genClasses xsi:type="genmodel:GenClass" ecoreClass="properties.ecore#//contexts/Property">
<genFeatures xsi:type="genmodel:GenFeature" createChild="false" ecoreFeature="ecore:EAttribute properties.ecore#//contexts/Property/name"/>
<genFeatures xsi:type="genmodel:GenFeature" createChild="false" ecoreFeature="ecore:EAttribute properties.ecore#//contexts/Property/label"/>
@@ -165,11 +189,11 @@
<genFeatures xsi:type="genmodel:GenFeature" createChild="false" ecoreFeature="ecore:EAttribute properties.ecore#//contexts/View/name"/>
<genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
propertySortChoices="true" ecoreFeature="ecore:EReference properties.ecore#//contexts/View/sections"/>
+ <genFeatures xsi:type="genmodel:GenFeature" property="None" notify="false"
+ createChild="false" ecoreFeature="ecore:EReference properties.ecore#//contexts/View/context"/>
<genFeatures xsi:type="genmodel:GenFeature" createChild="false" ecoreFeature="ecore:EAttribute properties.ecore#//contexts/View/automaticContext"/>
<genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
propertySortChoices="true" ecoreFeature="ecore:EReference properties.ecore#//contexts/View/datacontexts"/>
- <genFeatures xsi:type="genmodel:GenFeature" property="None" notify="false"
- createChild="false" ecoreFeature="ecore:EReference properties.ecore#//contexts/View/context"/>
</genClasses>
<genClasses xsi:type="genmodel:GenClass" ecoreClass="properties.ecore#//contexts/DataContextRoot">
<genFeatures xsi:type="genmodel:GenFeature" createChild="false" ecoreFeature="ecore:EAttribute properties.ecore#//contexts/DataContextRoot/label"/>
@@ -178,7 +202,7 @@
</genClasses>
</nestedGenPackages>
<nestedGenPackages xsi:type="genmodel:GenPackage" prefix="Ui" basePackage="org.eclipse.papyrus.infra.properties"
- disposableProviderFactory="true" ecorePackage="properties.ecore#//ui">
+ disposableProviderFactory="true" ecorePackage="properties.ecore#//ui" operationsPackage="org.eclipse.papyrus.infra.properties.ui.operations">
<genClasses xsi:type="genmodel:GenClass" ecoreClass="properties.ecore#//ui/Element"/>
<genClasses xsi:type="genmodel:GenClass" image="false" ecoreClass="properties.ecore#//ui/UIComponent">
<genFeatures xsi:type="genmodel:GenFeature" property="None" children="true"
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/Model/properties.notation b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/Model/properties.notation
index a7f70fe0beb..e9361669834 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/Model/properties.notation
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/Model/properties.notation
@@ -103,6 +103,10 @@
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_CBH3tpxkEeu216dzZOP2Cw"/>
</children>
<children xmi:type="notation:BasicCompartment" xmi:id="_CBH3t5xkEeu216dzZOP2Cw" type="Class_OperationCompartment">
+ <children xmi:type="notation:Shape" xmi:id="_pUyi0MqwEeuhj7ABGVZg5A" type="Operation_ClassOperationLabel">
+ <element xmi:type="uml:Operation" href="properties.uml#_pTka0MqwEeuhj7ABGVZg5A"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_pUyi0cqwEeuhj7ABGVZg5A"/>
+ </children>
<styles xmi:type="notation:TitleStyle" xmi:id="_CBH3uJxkEeu216dzZOP2Cw"/>
<styles xmi:type="notation:SortingStyle" xmi:id="_CBH3uZxkEeu216dzZOP2Cw"/>
<styles xmi:type="notation:FilteringStyle" xmi:id="_CBH3upxkEeu216dzZOP2Cw"/>
@@ -151,29 +155,97 @@
<element xmi:type="uml:Class" href="properties.uml#_jfIc6JxgEeu216dzZOP2Cw"/>
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_C5MIIZxkEeu216dzZOP2Cw" x="360" y="140"/>
</children>
- <children xmi:type="notation:Shape" xmi:id="_R-6E4MhoEeuDHv-ApZ_XIQ" type="StereotypeComment">
- <styles xmi:type="notation:TitleStyle" xmi:id="_R-6E4choEeuDHv-ApZ_XIQ"/>
- <styles xmi:type="notation:EObjectValueStyle" xmi:id="_R-6E48hoEeuDHv-ApZ_XIQ" name="BASE_ELEMENT">
+ <children xmi:type="notation:Shape" xmi:id="_t8x3EMqvEeuhj7ABGVZg5A" type="StereotypeComment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_t8x3EcqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_t8x3E8qvEeuhj7ABGVZg5A" name="BASE_ELEMENT">
<eObjectValue xmi:type="uml:Class" href="properties.uml#_jfIczZxgEeu216dzZOP2Cw"/>
</styles>
<element xsi:nil="true"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_R-6E4shoEeuDHv-ApZ_XIQ" x="1200" y="100"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_t8x3EsqvEeuhj7ABGVZg5A" x="1200" y="100"/>
</children>
- <children xmi:type="notation:Shape" xmi:id="_R_i-EMhoEeuDHv-ApZ_XIQ" type="StereotypeComment">
- <styles xmi:type="notation:TitleStyle" xmi:id="_R_i-EchoEeuDHv-ApZ_XIQ"/>
- <styles xmi:type="notation:EObjectValueStyle" xmi:id="_R_i-E8hoEeuDHv-ApZ_XIQ" name="BASE_ELEMENT">
+ <children xmi:type="notation:Shape" xmi:id="_t9Xs88qvEeuhj7ABGVZg5A" type="StereotypeComment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_t9Xs9MqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_t9YUAMqvEeuhj7ABGVZg5A" name="BASE_ELEMENT">
<eObjectValue xmi:type="uml:Class" href="properties.uml#_jfIc4pxgEeu216dzZOP2Cw"/>
</styles>
<element xsi:nil="true"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_R_i-EshoEeuDHv-ApZ_XIQ" x="480" y="340"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_t9Xs9cqvEeuhj7ABGVZg5A" x="480" y="340"/>
</children>
- <children xmi:type="notation:Shape" xmi:id="_SANFYMhoEeuDHv-ApZ_XIQ" type="StereotypeComment">
- <styles xmi:type="notation:TitleStyle" xmi:id="_SANFYchoEeuDHv-ApZ_XIQ"/>
- <styles xmi:type="notation:EObjectValueStyle" xmi:id="_SANFY8hoEeuDHv-ApZ_XIQ" name="BASE_ELEMENT">
+ <children xmi:type="notation:Shape" xmi:id="_t-B0QMqvEeuhj7ABGVZg5A" type="StereotypeComment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_t-B0QcqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_t-B0Q8qvEeuhj7ABGVZg5A" name="BASE_ELEMENT">
<eObjectValue xmi:type="uml:Class" href="properties.uml#_jfIc6JxgEeu216dzZOP2Cw"/>
</styles>
<element xsi:nil="true"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_SANFYshoEeuDHv-ApZ_XIQ" x="560" y="140"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_t-B0QsqvEeuhj7ABGVZg5A" x="560" y="140"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_yB_Y8MqvEeuhj7ABGVZg5A" type="Class_Shape">
+ <children xmi:type="notation:DecorationNode" xmi:id="_yCBOIMqvEeuhj7ABGVZg5A" type="Class_NameLabel"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_yCBOIcqvEeuhj7ABGVZg5A" type="Class_FloatingNameLabel">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_yCBOIsqvEeuhj7ABGVZg5A" y="15"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_yCB1MMqvEeuhj7ABGVZg5A" type="Class_AttributeCompartment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_yCB1McqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_yCB1MsqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_yCB1M8qvEeuhj7ABGVZg5A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_yCB1NMqvEeuhj7ABGVZg5A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_yCB1NcqvEeuhj7ABGVZg5A" type="Class_OperationCompartment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_yCB1NsqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_yCB1N8qvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_yCB1OMqvEeuhj7ABGVZg5A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_yCB1OcqvEeuhj7ABGVZg5A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_yCB1OsqvEeuhj7ABGVZg5A" type="Class_NestedClassifierCompartment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_yCB1O8qvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_yCB1PMqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_yCB1PcqvEeuhj7ABGVZg5A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_yCB1PsqvEeuhj7ABGVZg5A"/>
+ </children>
+ <element xmi:type="uml:Class" href="properties.uml#_jfIcs5xgEeu216dzZOP2Cw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_yB_Y8cqvEeuhj7ABGVZg5A" x="52" y="21"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_yCK_IMqvEeuhj7ABGVZg5A" type="StereotypeComment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_yCK_IcqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_yCK_I8qvEeuhj7ABGVZg5A" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Class" href="properties.uml#_jfIcs5xgEeu216dzZOP2Cw"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_yCK_IsqvEeuhj7ABGVZg5A" x="200"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_yETtIMqvEeuhj7ABGVZg5A" type="Class_Shape">
+ <children xmi:type="notation:DecorationNode" xmi:id="_yEUUMcqvEeuhj7ABGVZg5A" type="Class_NameLabel"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_yEUUMsqvEeuhj7ABGVZg5A" type="Class_FloatingNameLabel">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_yEUUM8qvEeuhj7ABGVZg5A" y="15"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_yEUUNMqvEeuhj7ABGVZg5A" type="Class_AttributeCompartment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_yEUUNcqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_yEUUNsqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_yEUUN8qvEeuhj7ABGVZg5A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_yEUUOMqvEeuhj7ABGVZg5A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_yEUUOcqvEeuhj7ABGVZg5A" type="Class_OperationCompartment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_yEUUOsqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_yEUUO8qvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_yEUUPMqvEeuhj7ABGVZg5A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_yEUUPcqvEeuhj7ABGVZg5A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_yEUUPsqvEeuhj7ABGVZg5A" type="Class_NestedClassifierCompartment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_yEUUP8qvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_yEUUQMqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_yEUUQcqvEeuhj7ABGVZg5A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_yEUUQsqvEeuhj7ABGVZg5A"/>
+ </children>
+ <element xmi:type="uml:Class" href="properties.uml#_jfJDiZxgEeu216dzZOP2Cw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_yEUUMMqvEeuhj7ABGVZg5A" x="54" y="336"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_yEbo88qvEeuhj7ABGVZg5A" type="StereotypeComment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_yEbo9MqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_yEbo9sqvEeuhj7ABGVZg5A" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Class" href="properties.uml#_jfJDiZxgEeu216dzZOP2Cw"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_yEbo9cqvEeuhj7ABGVZg5A" x="200"/>
</children>
<styles xmi:type="notation:StringValueStyle" xmi:id="_A-_FQZxkEeu216dzZOP2Cw" name="diagram_compatibility_version" stringValue="1.4.0"/>
<styles xmi:type="notation:DiagramStyle" xmi:id="_A-_FQpxkEeu216dzZOP2Cw"/>
@@ -190,7 +262,7 @@
<element xmi:type="uml:Generalization" href="properties.uml#_jfIc5JxgEeu216dzZOP2Cw"/>
<bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_EmRVApxkEeu216dzZOP2Cw"/>
<sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_wauaApxpEeu216dzZOP2Cw" id="(0.5128205128205128,0.0)"/>
- <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_wavBEJxpEeu216dzZOP2Cw" id="(0.49504950495049505,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_wavBEJxpEeu216dzZOP2Cw" id="(0.35668789808917195,1.0)"/>
</edges>
<edges xmi:type="notation:Connector" xmi:id="_zB1_gJxkEeu216dzZOP2Cw" type="Association_Edge" source="_B_m0wJxkEeu216dzZOP2Cw" target="_CBHQoJxkEeu216dzZOP2Cw">
<children xmi:type="notation:DecorationNode" xmi:id="_zB2mkJxkEeu216dzZOP2Cw" type="Association_StereotypeLabel">
@@ -272,35 +344,172 @@
<sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_wlFP4JxpEeu216dzZOP2Cw" id="(0.0,0.4393305439330544)"/>
<targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_wlFP4ZxpEeu216dzZOP2Cw" id="(1.0,0.6299212598425197)"/>
</edges>
- <edges xmi:type="notation:Connector" xmi:id="_R-6r8MhoEeuDHv-ApZ_XIQ" type="StereotypeCommentLink" source="_B_m0wJxkEeu216dzZOP2Cw" target="_R-6E4MhoEeuDHv-ApZ_XIQ">
- <styles xmi:type="notation:FontStyle" xmi:id="_R-6r8choEeuDHv-ApZ_XIQ"/>
- <styles xmi:type="notation:EObjectValueStyle" xmi:id="_R-6r9choEeuDHv-ApZ_XIQ" name="BASE_ELEMENT">
+ <edges xmi:type="notation:Connector" xmi:id="_t8x3FMqvEeuhj7ABGVZg5A" type="StereotypeCommentLink" source="_B_m0wJxkEeu216dzZOP2Cw" target="_t8x3EMqvEeuhj7ABGVZg5A">
+ <styles xmi:type="notation:FontStyle" xmi:id="_t8x3FcqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_t8yeIcqvEeuhj7ABGVZg5A" name="BASE_ELEMENT">
<eObjectValue xmi:type="uml:Class" href="properties.uml#_jfIczZxgEeu216dzZOP2Cw"/>
</styles>
<element xsi:nil="true"/>
- <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_R-6r8shoEeuDHv-ApZ_XIQ" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
- <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_R-6r88hoEeuDHv-ApZ_XIQ"/>
- <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_R-6r9MhoEeuDHv-ApZ_XIQ"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_t8x3FsqvEeuhj7ABGVZg5A" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_t8x3F8qvEeuhj7ABGVZg5A"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_t8yeIMqvEeuhj7ABGVZg5A"/>
</edges>
- <edges xmi:type="notation:Connector" xmi:id="_R_i-FMhoEeuDHv-ApZ_XIQ" type="StereotypeCommentLink" source="_CBHQoJxkEeu216dzZOP2Cw" target="_R_i-EMhoEeuDHv-ApZ_XIQ">
- <styles xmi:type="notation:FontStyle" xmi:id="_R_i-FchoEeuDHv-ApZ_XIQ"/>
- <styles xmi:type="notation:EObjectValueStyle" xmi:id="_R_i-GchoEeuDHv-ApZ_XIQ" name="BASE_ELEMENT">
+ <edges xmi:type="notation:Connector" xmi:id="_t9YUAcqvEeuhj7ABGVZg5A" type="StereotypeCommentLink" source="_CBHQoJxkEeu216dzZOP2Cw" target="_t9Xs88qvEeuhj7ABGVZg5A">
+ <styles xmi:type="notation:FontStyle" xmi:id="_t9YUAsqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_t9YUBsqvEeuhj7ABGVZg5A" name="BASE_ELEMENT">
<eObjectValue xmi:type="uml:Class" href="properties.uml#_jfIc4pxgEeu216dzZOP2Cw"/>
</styles>
<element xsi:nil="true"/>
- <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_R_i-FshoEeuDHv-ApZ_XIQ" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
- <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_R_i-F8hoEeuDHv-ApZ_XIQ"/>
- <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_R_i-GMhoEeuDHv-ApZ_XIQ"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_t9YUA8qvEeuhj7ABGVZg5A" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_t9YUBMqvEeuhj7ABGVZg5A"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_t9YUBcqvEeuhj7ABGVZg5A"/>
</edges>
- <edges xmi:type="notation:Connector" xmi:id="_SANFZMhoEeuDHv-ApZ_XIQ" type="StereotypeCommentLink" source="_C5MIIJxkEeu216dzZOP2Cw" target="_SANFYMhoEeuDHv-ApZ_XIQ">
- <styles xmi:type="notation:FontStyle" xmi:id="_SANFZchoEeuDHv-ApZ_XIQ"/>
- <styles xmi:type="notation:EObjectValueStyle" xmi:id="_SANscshoEeuDHv-ApZ_XIQ" name="BASE_ELEMENT">
+ <edges xmi:type="notation:Connector" xmi:id="_t-B0RMqvEeuhj7ABGVZg5A" type="StereotypeCommentLink" source="_C5MIIJxkEeu216dzZOP2Cw" target="_t-B0QMqvEeuhj7ABGVZg5A">
+ <styles xmi:type="notation:FontStyle" xmi:id="_t-B0RcqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_t-B0ScqvEeuhj7ABGVZg5A" name="BASE_ELEMENT">
<eObjectValue xmi:type="uml:Class" href="properties.uml#_jfIc6JxgEeu216dzZOP2Cw"/>
</styles>
<element xsi:nil="true"/>
- <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_SANFZshoEeuDHv-ApZ_XIQ" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
- <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_SANscMhoEeuDHv-ApZ_XIQ"/>
- <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_SANscchoEeuDHv-ApZ_XIQ"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_t-B0RsqvEeuhj7ABGVZg5A" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_t-B0R8qvEeuhj7ABGVZg5A"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_t-B0SMqvEeuhj7ABGVZg5A"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_yCK_JMqvEeuhj7ABGVZg5A" type="StereotypeCommentLink" source="_yB_Y8MqvEeuhj7ABGVZg5A" target="_yCK_IMqvEeuhj7ABGVZg5A">
+ <styles xmi:type="notation:FontStyle" xmi:id="_yCK_JcqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_yCK_KcqvEeuhj7ABGVZg5A" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Class" href="properties.uml#_jfIcs5xgEeu216dzZOP2Cw"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_yCK_JsqvEeuhj7ABGVZg5A" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_yCK_J8qvEeuhj7ABGVZg5A"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_yCK_KMqvEeuhj7ABGVZg5A"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_yEbo98qvEeuhj7ABGVZg5A" type="StereotypeCommentLink" source="_yETtIMqvEeuhj7ABGVZg5A" target="_yEbo88qvEeuhj7ABGVZg5A">
+ <styles xmi:type="notation:FontStyle" xmi:id="_yEbo-MqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_yEbo_MqvEeuhj7ABGVZg5A" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Class" href="properties.uml#_jfJDiZxgEeu216dzZOP2Cw"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_yEbo-cqvEeuhj7ABGVZg5A" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_yEbo-sqvEeuhj7ABGVZg5A"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_yEbo-8qvEeuhj7ABGVZg5A"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_5o-_gMqvEeuhj7ABGVZg5A" type="Association_Edge" source="_yETtIMqvEeuhj7ABGVZg5A" target="_CBHQoJxkEeu216dzZOP2Cw">
+ <children xmi:type="notation:DecorationNode" xmi:id="_5o-_g8qvEeuhj7ABGVZg5A" type="Association_StereotypeLabel">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_5o-_hMqvEeuhj7ABGVZg5A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_5o-_hcqvEeuhj7ABGVZg5A" type="Association_NameLabel">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_5o-_hsqvEeuhj7ABGVZg5A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_5o-_h8qvEeuhj7ABGVZg5A" type="Association_TargetRoleLabel">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_5o_mkMqvEeuhj7ABGVZg5A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_5o_mkcqvEeuhj7ABGVZg5A" type="Association_SourceRoleLabel">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_5o_mksqvEeuhj7ABGVZg5A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_5o_mk8qvEeuhj7ABGVZg5A" type="Association_SourceMultiplicityLabel">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_5o_mlMqvEeuhj7ABGVZg5A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_5o_mlcqvEeuhj7ABGVZg5A" type="Association_TargetMultiplicityLabel">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_5o_mlsqvEeuhj7ABGVZg5A" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_5o-_gcqvEeuhj7ABGVZg5A"/>
+ <element xmi:type="uml:Association" href="properties.uml#_jfJDlJxgEeu216dzZOP2Cw"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_5o-_gsqvEeuhj7ABGVZg5A" points="[154, 394, -643984, -643984]$[280, 417, -643984, -643984]"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_DJQb4MqwEeuhj7ABGVZg5A" id="(0.0,0.2315270935960591)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_5pANoMqvEeuhj7ABGVZg5A" type="Association_Edge" source="_yB_Y8MqvEeuhj7ABGVZg5A" target="_B_m0wJxkEeu216dzZOP2Cw">
+ <children xmi:type="notation:DecorationNode" xmi:id="_5pANo8qvEeuhj7ABGVZg5A" type="Association_StereotypeLabel">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_6iYFoMqvEeuhj7ABGVZg5A" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_5pANpMqvEeuhj7ABGVZg5A" x="-1" y="-18"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_5pANpcqvEeuhj7ABGVZg5A" type="Association_NameLabel">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_6jWWAMqvEeuhj7ABGVZg5A" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_5pANpsqvEeuhj7ABGVZg5A" x="1" y="19"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_5pANp8qvEeuhj7ABGVZg5A" type="Association_TargetRoleLabel">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_6kTYQMqvEeuhj7ABGVZg5A" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_5pANqMqvEeuhj7ABGVZg5A" x="29" y="-17"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_5pANqcqvEeuhj7ABGVZg5A" type="Association_SourceRoleLabel">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_6lPMYMqvEeuhj7ABGVZg5A" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_5pA0sMqvEeuhj7ABGVZg5A" x="-45" y="-26"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_5pA0scqvEeuhj7ABGVZg5A" type="Association_SourceMultiplicityLabel">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_6mLnkMqvEeuhj7ABGVZg5A" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_5pA0ssqvEeuhj7ABGVZg5A" x="30" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_5pA0s8qvEeuhj7ABGVZg5A" type="Association_TargetMultiplicityLabel">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_6nG0oMqvEeuhj7ABGVZg5A" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_5pA0tMqvEeuhj7ABGVZg5A" x="-129" y="-19"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_5pANocqvEeuhj7ABGVZg5A"/>
+ <element xmi:type="uml:Association" href="properties.uml#_jfJDh5xgEeu216dzZOP2Cw"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_5pANosqvEeuhj7ABGVZg5A" points="[169, 85, -643984, -643984]$[1016, 50, -643984, -643984]$[1010, 100, -643984, -643984]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_6t_fwMqvEeuhj7ABGVZg5A" id="(1.0,0.29)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_6t_fwcqvEeuhj7ABGVZg5A" id="(0.06938775510204082,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_5pA0tcqvEeuhj7ABGVZg5A" type="Association_Edge" source="_yB_Y8MqvEeuhj7ABGVZg5A" target="_yETtIMqvEeuhj7ABGVZg5A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_5pBbwsqvEeuhj7ABGVZg5A" type="Association_StereotypeLabel">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_6oDP0MqvEeuhj7ABGVZg5A" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_5pBbw8qvEeuhj7ABGVZg5A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_5pBbxMqvEeuhj7ABGVZg5A" type="Association_NameLabel">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_6o_rAMqvEeuhj7ABGVZg5A" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_5pBbxcqvEeuhj7ABGVZg5A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_5pBbxsqvEeuhj7ABGVZg5A" type="Association_TargetRoleLabel">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_6p7fIMqvEeuhj7ABGVZg5A" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_5pBbx8qvEeuhj7ABGVZg5A" x="14" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_5pBbyMqvEeuhj7ABGVZg5A" type="Association_SourceRoleLabel">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_6q3TQMqvEeuhj7ABGVZg5A" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_5pBbycqvEeuhj7ABGVZg5A" x="-15" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_5pBbysqvEeuhj7ABGVZg5A" type="Association_SourceMultiplicityLabel">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_6rzHYMqvEeuhj7ABGVZg5A" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_5pBby8qvEeuhj7ABGVZg5A" x="14" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_5pBbzMqvEeuhj7ABGVZg5A" type="Association_TargetMultiplicityLabel">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_6suUcMqvEeuhj7ABGVZg5A" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_5pBbzcqvEeuhj7ABGVZg5A" x="-15" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_5pBbwMqvEeuhj7ABGVZg5A"/>
+ <element xmi:type="uml:Association" href="properties.uml#_jfJDlpxgEeu216dzZOP2Cw"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_5pBbwcqvEeuhj7ABGVZg5A" points="[104, 239, -643984, -643984]$[102, 336, -643984, -643984]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_6t-4sMqvEeuhj7ABGVZg5A" id="(0.47,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_6t-4scqvEeuhj7ABGVZg5A" id="(0.43,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_PSNKsMqwEeuhj7ABGVZg5A" type="Association_Edge" source="_CBHQoJxkEeu216dzZOP2Cw" target="_yETtIMqvEeuhj7ABGVZg5A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_PSNxwMqwEeuhj7ABGVZg5A" type="Association_StereotypeLabel">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_P0jp0MqwEeuhj7ABGVZg5A" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_PSNxwcqwEeuhj7ABGVZg5A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_PSNxwsqwEeuhj7ABGVZg5A" type="Association_NameLabel">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_P1hTIMqwEeuhj7ABGVZg5A" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_PSNxw8qwEeuhj7ABGVZg5A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_PSNxxMqwEeuhj7ABGVZg5A" type="Association_TargetRoleLabel">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_P2dHQMqwEeuhj7ABGVZg5A" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_PSNxxcqwEeuhj7ABGVZg5A" x="37" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_PSNxxsqwEeuhj7ABGVZg5A" type="Association_SourceRoleLabel">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_P3YUUMqwEeuhj7ABGVZg5A" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_PSNxx8qwEeuhj7ABGVZg5A" x="-37" y="19"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_PSNxyMqwEeuhj7ABGVZg5A" type="Association_SourceMultiplicityLabel">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_P4UvgMqwEeuhj7ABGVZg5A" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_PSNxycqwEeuhj7ABGVZg5A" x="37" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_PSNxysqwEeuhj7ABGVZg5A" type="Association_TargetMultiplicityLabel">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_P5P8kMqwEeuhj7ABGVZg5A" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_PSNxy8qwEeuhj7ABGVZg5A" x="-37" y="-16"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_PSNKscqwEeuhj7ABGVZg5A"/>
+ <element xmi:type="uml:Association" href="properties.uml#_PQwZMMqwEeuhj7ABGVZg5A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_PSNKssqwEeuhj7ABGVZg5A" points="[280, 492, -643984, -643984]$[102, 492, -643984, -643984]$[153, 436, -643984, -643984]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_PUj7IMqwEeuhj7ABGVZg5A" id="(0.0,0.7142857142857143)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_PUj7IcqwEeuhj7ABGVZg5A" id="(0.48,1.0)"/>
</edges>
</notation:Diagram>
<notation:Diagram xmi:id="_NuIJAMhkEeu0AMUoTBJB8g" type="PapyrusUMLClassDiagram" name="properties" measurementUnit="Pixel">
@@ -350,13 +559,13 @@
<element xmi:type="uml:Class" href="properties.uml#_jfIc7ZxgEeu216dzZOP2Cw"/>
<layoutConstraint xmi:type="notation:Bounds" xmi:id="_Ob8RQchkEeu0AMUoTBJB8g" x="360" y="220"/>
</children>
- <children xmi:type="notation:Shape" xmi:id="_SENboMhoEeuDHv-ApZ_XIQ" type="StereotypeComment">
- <styles xmi:type="notation:TitleStyle" xmi:id="_SENbochoEeuDHv-ApZ_XIQ"/>
- <styles xmi:type="notation:EObjectValueStyle" xmi:id="_SENbo8hoEeuDHv-ApZ_XIQ" name="BASE_ELEMENT">
+ <children xmi:type="notation:Shape" xmi:id="_tRllA8qvEeuhj7ABGVZg5A" type="StereotypeComment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_tRllBMqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_tRllBsqvEeuhj7ABGVZg5A" name="BASE_ELEMENT">
<eObjectValue xmi:type="uml:Class" href="properties.uml#_jfIc7ZxgEeu216dzZOP2Cw"/>
</styles>
<element xsi:nil="true"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_SENboshoEeuDHv-ApZ_XIQ" x="560" y="220"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_tRllBcqvEeuhj7ABGVZg5A" x="560" y="220"/>
</children>
<styles xmi:type="notation:StringValueStyle" xmi:id="_NuIJAchkEeu0AMUoTBJB8g" name="diagram_compatibility_version" stringValue="1.4.0"/>
<styles xmi:type="notation:DiagramStyle" xmi:id="_NuIJAshkEeu0AMUoTBJB8g"/>
@@ -393,15 +602,514 @@
<element xmi:type="uml:Association" href="properties.uml#_jfJDgZxgEeu216dzZOP2Cw"/>
<bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_OcbZcshkEeu0AMUoTBJB8g" points="[-84, -123, -643984, -643984]$[-84, -123, -643984, -643984]"/>
</edges>
- <edges xmi:type="notation:Connector" xmi:id="_SENbpMhoEeuDHv-ApZ_XIQ" type="StereotypeCommentLink" source="_Ob8RQMhkEeu0AMUoTBJB8g" target="_SENboMhoEeuDHv-ApZ_XIQ">
- <styles xmi:type="notation:FontStyle" xmi:id="_SENbpchoEeuDHv-ApZ_XIQ"/>
- <styles xmi:type="notation:EObjectValueStyle" xmi:id="_SEOCsshoEeuDHv-ApZ_XIQ" name="BASE_ELEMENT">
+ <edges xmi:type="notation:Connector" xmi:id="_tRllB8qvEeuhj7ABGVZg5A" type="StereotypeCommentLink" source="_Ob8RQMhkEeu0AMUoTBJB8g" target="_tRllA8qvEeuhj7ABGVZg5A">
+ <styles xmi:type="notation:FontStyle" xmi:id="_tRllCMqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_tRmMEsqvEeuhj7ABGVZg5A" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Class" href="properties.uml#_jfIc7ZxgEeu216dzZOP2Cw"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_tRllCcqvEeuhj7ABGVZg5A" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_tRmMEMqvEeuhj7ABGVZg5A"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_tRmMEcqvEeuhj7ABGVZg5A"/>
+ </edges>
+ </notation:Diagram>
+ <notation:Diagram xmi:id="_kds1QMiFEeueo7rlLkmY8A" type="PapyrusUMLClassDiagram" name="annotations" measurementUnit="Pixel">
+ <children xmi:type="notation:Shape" xmi:id="_lBPAIMiFEeueo7rlLkmY8A" type="Class_Shape">
+ <children xmi:type="notation:DecorationNode" xmi:id="_lBQ1UMiFEeueo7rlLkmY8A" type="Class_NameLabel"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_lBQ1UciFEeueo7rlLkmY8A" type="Class_FloatingNameLabel">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_lBQ1UsiFEeueo7rlLkmY8A" y="15"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_lBQ1U8iFEeueo7rlLkmY8A" type="Class_AttributeCompartment">
+ <children xmi:type="notation:Shape" xmi:id="_95Se0MiFEeueo7rlLkmY8A" type="Property_ClassAttributeLabel">
+ <element xmi:type="uml:Property" href="properties.uml#_95EcYMiFEeueo7rlLkmY8A"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_95TF4MiFEeueo7rlLkmY8A"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_lBQ1VMiFEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_lBQ1VciFEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_lBQ1VsiFEeueo7rlLkmY8A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_lBQ1V8iFEeueo7rlLkmY8A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_lBQ1WMiFEeueo7rlLkmY8A" type="Class_OperationCompartment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_lBQ1WciFEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_lBQ1WsiFEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_lBQ1W8iFEeueo7rlLkmY8A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_lBQ1XMiFEeueo7rlLkmY8A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_lBRcYMiFEeueo7rlLkmY8A" type="Class_NestedClassifierCompartment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_lBRcYciFEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_lBRcYsiFEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_lBRcY8iFEeueo7rlLkmY8A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_lBRcZMiFEeueo7rlLkmY8A"/>
+ </children>
+ <element xmi:type="uml:Class" href="properties.uml#_lBHrYMiFEeueo7rlLkmY8A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_lBPAIciFEeueo7rlLkmY8A" x="596" y="113"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_oY44cMiFEeueo7rlLkmY8A" type="Class_Shape">
+ <children xmi:type="notation:DecorationNode" xmi:id="_oY5fgciFEeueo7rlLkmY8A" type="Class_NameLabel"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_oY5fgsiFEeueo7rlLkmY8A" type="Class_FloatingNameLabel">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_oY5fg8iFEeueo7rlLkmY8A" y="15"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_oY5fhMiFEeueo7rlLkmY8A" type="Class_AttributeCompartment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_oY5fhciFEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_oY5fhsiFEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_oY5fh8iFEeueo7rlLkmY8A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_oY5fiMiFEeueo7rlLkmY8A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_oY5ficiFEeueo7rlLkmY8A" type="Class_OperationCompartment">
+ <children xmi:type="notation:Shape" xmi:id="_1M0BcMiGEeueo7rlLkmY8A" type="Operation_ClassOperationLabel">
+ <element xmi:type="uml:Operation" href="properties.uml#_1MRO4MiGEeueo7rlLkmY8A"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_1M0BcciGEeueo7rlLkmY8A"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_oY5fisiFEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_oY5fi8iFEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_oY5fjMiFEeueo7rlLkmY8A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_oY5fjciFEeueo7rlLkmY8A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_oY5fjsiFEeueo7rlLkmY8A" type="Class_NestedClassifierCompartment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_oY5fj8iFEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_oY5fkMiFEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_oY5fkciFEeueo7rlLkmY8A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_oY5fksiFEeueo7rlLkmY8A"/>
+ </children>
+ <element xmi:type="uml:Class" href="properties.uml#_oYyx0MiFEeueo7rlLkmY8A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_oY5fgMiFEeueo7rlLkmY8A" x="208" y="109"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_Mu7dYMiGEeueo7rlLkmY8A" type="Class_Shape">
+ <children xmi:type="notation:DecorationNode" xmi:id="_Mu8EcMiGEeueo7rlLkmY8A" type="Class_NameLabel"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Mu8EcciGEeueo7rlLkmY8A" type="Class_FloatingNameLabel">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Mu8EcsiGEeueo7rlLkmY8A" y="15"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_Mu8Ec8iGEeueo7rlLkmY8A" type="Class_AttributeCompartment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_Mu8EdMiGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_Mu8EdciGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_Mu8EdsiGEeueo7rlLkmY8A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Mu8Ed8iGEeueo7rlLkmY8A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_Mu8EeMiGEeueo7rlLkmY8A" type="Class_OperationCompartment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_Mu8EeciGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_Mu8EesiGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_Mu8Ee8iGEeueo7rlLkmY8A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Mu8EfMiGEeueo7rlLkmY8A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_Mu8EfciGEeueo7rlLkmY8A" type="Class_NestedClassifierCompartment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_Mu8EfsiGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_Mu8Ef8iGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_Mu8EgMiGEeueo7rlLkmY8A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Mu8EgciGEeueo7rlLkmY8A"/>
+ </children>
+ <element xmi:type="uml:Class" href="pathmap://UML_METAMODELS/Ecore.metamodel.uml#EObject"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Mu7dYciGEeueo7rlLkmY8A" x="946" y="117"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_U9wgAMiGEeueo7rlLkmY8A" type="Class_Shape">
+ <children xmi:type="notation:DecorationNode" xmi:id="_U9wgAsiGEeueo7rlLkmY8A" type="Class_NameLabel"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_U9xHEMiGEeueo7rlLkmY8A" type="Class_FloatingNameLabel">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_U9xHEciGEeueo7rlLkmY8A" y="15"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_U9xHEsiGEeueo7rlLkmY8A" type="Class_AttributeCompartment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_U9xHE8iGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_U9xHFMiGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_U9xHFciGEeueo7rlLkmY8A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_U9xHFsiGEeueo7rlLkmY8A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_U9xHF8iGEeueo7rlLkmY8A" type="Class_OperationCompartment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_U9xHGMiGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_U9xHGciGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_U9xHGsiGEeueo7rlLkmY8A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_U9xHG8iGEeueo7rlLkmY8A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_U9xHHMiGEeueo7rlLkmY8A" type="Class_NestedClassifierCompartment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_U9xHHciGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_U9xHHsiGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_U9xHH8iGEeueo7rlLkmY8A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_U9xHIMiGEeueo7rlLkmY8A"/>
+ </children>
+ <element xmi:type="uml:Class" href="pathmap://UML_METAMODELS/Ecore.metamodel.uml#EStringToStringMapEntry"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_U9wgAciGEeueo7rlLkmY8A" x="617" y="328"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_c-ajwMiGEeueo7rlLkmY8A" type="Class_Shape">
+ <children xmi:type="notation:DecorationNode" xmi:id="_c-k70MiGEeueo7rlLkmY8A" type="Class_NameLabel"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_c-k70ciGEeueo7rlLkmY8A" type="Class_FloatingNameLabel">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_c-k70siGEeueo7rlLkmY8A" y="15"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_c-k708iGEeueo7rlLkmY8A" type="Class_AttributeCompartment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_c-k71MiGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_c-k71ciGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_c-k71siGEeueo7rlLkmY8A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_c-k718iGEeueo7rlLkmY8A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_c-k72MiGEeueo7rlLkmY8A" type="Class_OperationCompartment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_c-k72ciGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_c-k72siGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_c-k728iGEeueo7rlLkmY8A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_c-k73MiGEeueo7rlLkmY8A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_c-k73ciGEeueo7rlLkmY8A" type="Class_NestedClassifierCompartment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_c-k73siGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_c-k738iGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_c-k74MiGEeueo7rlLkmY8A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_c-k74ciGEeueo7rlLkmY8A"/>
+ </children>
+ <element xmi:type="uml:Class" href="properties.uml#_jfIc6JxgEeu216dzZOP2Cw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_c-ajwciGEeueo7rlLkmY8A" x="335" y="326"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_dpVJAMiGEeueo7rlLkmY8A" type="Class_Shape">
+ <children xmi:type="notation:DecorationNode" xmi:id="_dpVwEMiGEeueo7rlLkmY8A" type="Class_NameLabel"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_dpVwEciGEeueo7rlLkmY8A" type="Class_FloatingNameLabel">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_dpVwEsiGEeueo7rlLkmY8A" y="15"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_dpVwE8iGEeueo7rlLkmY8A" type="Class_AttributeCompartment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_dpVwFMiGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_dpVwFciGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_dpVwFsiGEeueo7rlLkmY8A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_dpVwF8iGEeueo7rlLkmY8A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_dpVwGMiGEeueo7rlLkmY8A" type="Class_OperationCompartment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_dpVwGciGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_dpVwGsiGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_dpVwG8iGEeueo7rlLkmY8A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_dpVwHMiGEeueo7rlLkmY8A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_dpVwHciGEeueo7rlLkmY8A" type="Class_NestedClassifierCompartment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_dpVwHsiGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_dpVwH8iGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_dpVwIMiGEeueo7rlLkmY8A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_dpVwIciGEeueo7rlLkmY8A"/>
+ </children>
+ <element xmi:type="uml:Class" href="properties.uml#_jfIc_pxgEeu216dzZOP2Cw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_dpVJAciGEeueo7rlLkmY8A" x="70" y="324"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_f8b0EMiGEeueo7rlLkmY8A" type="Class_Shape">
+ <children xmi:type="notation:DecorationNode" xmi:id="_f8b0EsiGEeueo7rlLkmY8A" type="Class_NameLabel"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_f8b0E8iGEeueo7rlLkmY8A" type="Class_FloatingNameLabel">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_f8b0FMiGEeueo7rlLkmY8A" y="15"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_f8b0FciGEeueo7rlLkmY8A" type="Class_AttributeCompartment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_f8b0FsiGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_f8b0F8iGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_f8b0GMiGEeueo7rlLkmY8A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_f8b0GciGEeueo7rlLkmY8A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_f8b0GsiGEeueo7rlLkmY8A" type="Class_OperationCompartment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_f8b0G8iGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_f8b0HMiGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_f8b0HciGEeueo7rlLkmY8A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_f8b0HsiGEeueo7rlLkmY8A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_f8b0H8iGEeueo7rlLkmY8A" type="Class_NestedClassifierCompartment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_f8b0IMiGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_f8b0IciGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_f8b0IsiGEeueo7rlLkmY8A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_f8b0I8iGEeueo7rlLkmY8A"/>
+ </children>
+ <element xmi:type="uml:Class" href="properties.uml#_jfIc7ZxgEeu216dzZOP2Cw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_f8b0EciGEeueo7rlLkmY8A" x="212" y="326"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_jyp3sMiGEeueo7rlLkmY8A" type="Class_Shape">
+ <children xmi:type="notation:DecorationNode" xmi:id="_jyp3ssiGEeueo7rlLkmY8A" type="Class_NameLabel"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_jyp3s8iGEeueo7rlLkmY8A" type="Class_FloatingNameLabel">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_jyp3tMiGEeueo7rlLkmY8A" y="15"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jyqewMiGEeueo7rlLkmY8A" type="Class_AttributeCompartment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_jyqewciGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jyqewsiGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jyqew8iGEeueo7rlLkmY8A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_jyqexMiGEeueo7rlLkmY8A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jyqexciGEeueo7rlLkmY8A" type="Class_OperationCompartment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_jyqexsiGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jyqex8iGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jyqeyMiGEeueo7rlLkmY8A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_jyqeyciGEeueo7rlLkmY8A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_jyqeysiGEeueo7rlLkmY8A" type="Class_NestedClassifierCompartment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_jyqey8iGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_jyqezMiGEeueo7rlLkmY8A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_jyqezciGEeueo7rlLkmY8A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_jyqezsiGEeueo7rlLkmY8A"/>
+ </children>
+ <element xmi:type="uml:Class" href="properties.uml#_jfJDiZxgEeu216dzZOP2Cw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_jyp3sciGEeueo7rlLkmY8A" x="464" y="326"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_nxn8YMqvEeuhj7ABGVZg5A" type="StereotypeComment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_nxn8YcqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_nxn8Y8qvEeuhj7ABGVZg5A" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Class" href="properties.uml#_lBHrYMiFEeueo7rlLkmY8A"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nxn8YsqvEeuhj7ABGVZg5A" x="796" y="113"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_nx-hsMqvEeuhj7ABGVZg5A" type="StereotypeComment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_nx-hscqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_nx_IwMqvEeuhj7ABGVZg5A" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Class" href="properties.uml#_oYyx0MiFEeueo7rlLkmY8A"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nx-hssqvEeuhj7ABGVZg5A" x="408" y="109"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_nye4AMqvEeuhj7ABGVZg5A" type="StereotypeComment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_nye4AcqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_nye4A8qvEeuhj7ABGVZg5A" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Class" href="pathmap://UML_METAMODELS/Ecore.metamodel.uml#EObject"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nye4AsqvEeuhj7ABGVZg5A" x="1146" y="117"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_nyzoIMqvEeuhj7ABGVZg5A" type="StereotypeComment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_nyzoIcqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_nyzoI8qvEeuhj7ABGVZg5A" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Class" href="pathmap://UML_METAMODELS/Ecore.metamodel.uml#EStringToStringMapEntry"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nyzoIsqvEeuhj7ABGVZg5A" x="817" y="328"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_nzBDg8qvEeuhj7ABGVZg5A" type="StereotypeComment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_nzBDhMqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_nzBDhsqvEeuhj7ABGVZg5A" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Class" href="properties.uml#_jfIc6JxgEeu216dzZOP2Cw"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nzBDhcqvEeuhj7ABGVZg5A" x="535" y="326"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_nzN30MqvEeuhj7ABGVZg5A" type="StereotypeComment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_nzN30cqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_nzN308qvEeuhj7ABGVZg5A" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Class" href="properties.uml#_jfIc_pxgEeu216dzZOP2Cw"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nzN30sqvEeuhj7ABGVZg5A" x="270" y="324"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_nzZeAMqvEeuhj7ABGVZg5A" type="StereotypeComment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_nzZeAcqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_nzZeA8qvEeuhj7ABGVZg5A" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Class" href="properties.uml#_jfIc7ZxgEeu216dzZOP2Cw"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nzZeAsqvEeuhj7ABGVZg5A" x="412" y="326"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_nzlEMMqvEeuhj7ABGVZg5A" type="StereotypeComment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_nzlEMcqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_nzlEM8qvEeuhj7ABGVZg5A" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Class" href="properties.uml#_jfJDiZxgEeu216dzZOP2Cw"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_nzlEMsqvEeuhj7ABGVZg5A" x="664" y="326"/>
+ </children>
+ <styles xmi:type="notation:StringValueStyle" xmi:id="_kds1QciFEeueo7rlLkmY8A" name="diagram_compatibility_version" stringValue="1.4.0"/>
+ <styles xmi:type="notation:DiagramStyle" xmi:id="_kds1QsiFEeueo7rlLkmY8A"/>
+ <styles xmi:type="style:PapyrusDiagramStyle" xmi:id="_kds1Q8iFEeueo7rlLkmY8A" diagramKindId="org.eclipse.papyrus.uml.diagram.class">
+ <owner xmi:type="uml:Package" href="properties.uml#_jfIcspxgEeu216dzZOP2Cw"/>
+ </styles>
+ <element xmi:type="uml:Package" href="properties.uml#_jfIcspxgEeu216dzZOP2Cw"/>
+ <edges xmi:type="notation:Connector" xmi:id="_uddqAMiFEeueo7rlLkmY8A" type="Association_Edge" source="_oY44cMiFEeueo7rlLkmY8A" target="_lBPAIMiFEeueo7rlLkmY8A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_uddqA8iFEeueo7rlLkmY8A" type="Association_StereotypeLabel">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_zU89YMiFEeueo7rlLkmY8A" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_uddqBMiFEeueo7rlLkmY8A" y="-19"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_uddqBciFEeueo7rlLkmY8A" type="Association_NameLabel">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_zVGuYMiFEeueo7rlLkmY8A" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_uddqBsiFEeueo7rlLkmY8A" x="1" y="18"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_uddqB8iFEeueo7rlLkmY8A" type="Association_TargetRoleLabel">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_zVPRQMiFEeueo7rlLkmY8A" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_uddqCMiFEeueo7rlLkmY8A" x="15" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_uddqCciFEeueo7rlLkmY8A" type="Association_SourceRoleLabel">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_zVZCQMiFEeueo7rlLkmY8A" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_uddqCsiFEeueo7rlLkmY8A" x="-16" y="18"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_uddqC8iFEeueo7rlLkmY8A" type="Association_SourceMultiplicityLabel">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_zViMMMiFEeueo7rlLkmY8A" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_uddqDMiFEeueo7rlLkmY8A" x="16" y="18"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_uddqDciFEeueo7rlLkmY8A" type="Association_TargetMultiplicityLabel">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_zVr9MMiFEeueo7rlLkmY8A" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_uddqDsiFEeueo7rlLkmY8A" x="-16" y="-19"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_uddqAciFEeueo7rlLkmY8A"/>
+ <element xmi:type="uml:Association" href="properties.uml#_ucxGcMiFEeueo7rlLkmY8A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_uddqAsiFEeueo7rlLkmY8A" points="[568, 189, -643984, -643984]$[473, 252, -643984, -643984]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_ud_1gMiFEeueo7rlLkmY8A" id="(1.0,0.2897196261682243)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_ud_1gciFEeueo7rlLkmY8A" id="(0.0,0.2523364485981308)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_O6of8MiGEeueo7rlLkmY8A" type="Association_Edge" source="_lBPAIMiFEeueo7rlLkmY8A" target="_Mu7dYMiGEeueo7rlLkmY8A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_O6of88iGEeueo7rlLkmY8A" type="Association_StereotypeLabel">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_O6of9MiGEeueo7rlLkmY8A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_O6of9ciGEeueo7rlLkmY8A" type="Association_NameLabel">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_O6of9siGEeueo7rlLkmY8A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_O6of98iGEeueo7rlLkmY8A" type="Association_TargetRoleLabel">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_O6of-MiGEeueo7rlLkmY8A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_O6of-ciGEeueo7rlLkmY8A" type="Association_SourceRoleLabel">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_O6of-siGEeueo7rlLkmY8A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_O6of-8iGEeueo7rlLkmY8A" type="Association_SourceMultiplicityLabel">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_O6of_MiGEeueo7rlLkmY8A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_O6of_ciGEeueo7rlLkmY8A" type="Association_TargetMultiplicityLabel">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_O6pHAMiGEeueo7rlLkmY8A" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_O6of8ciGEeueo7rlLkmY8A"/>
+ <element xmi:type="uml:Association" href="properties.uml#_O6XaMMiGEeueo7rlLkmY8A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_O6of8siGEeueo7rlLkmY8A" points="[714, 137, -643984, -643984]$[946, 137, -643984, -643984]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_O7OV0MiGEeueo7rlLkmY8A" id="(1.0,0.22429906542056074)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_O7OV0ciGEeueo7rlLkmY8A" id="(0.0,0.2)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_WBa8cMiGEeueo7rlLkmY8A" type="Association_Edge" source="_lBPAIMiFEeueo7rlLkmY8A" target="_U9wgAMiGEeueo7rlLkmY8A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_WBbjgMiGEeueo7rlLkmY8A" type="Association_StereotypeLabel">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_YvtHoMiGEeueo7rlLkmY8A" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_WBbjgciGEeueo7rlLkmY8A" y="-19"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_WBbjgsiGEeueo7rlLkmY8A" type="Association_NameLabel">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_Yv-0cMiGEeueo7rlLkmY8A" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_WBbjg8iGEeueo7rlLkmY8A" x="-1" y="18"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_WBbjhMiGEeueo7rlLkmY8A" type="Association_TargetRoleLabel">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_YwQhQMiGEeueo7rlLkmY8A" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_WBbjhciGEeueo7rlLkmY8A" x="25" y="-18"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_WBbjhsiGEeueo7rlLkmY8A" type="Association_SourceRoleLabel">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_YwiOEMiGEeueo7rlLkmY8A" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_WBbjh8iGEeueo7rlLkmY8A" x="-26" y="19"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_WBbjiMiGEeueo7rlLkmY8A" type="Association_SourceMultiplicityLabel">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_Yw1wEMiGEeueo7rlLkmY8A" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_WBbjiciGEeueo7rlLkmY8A" x="25" y="19"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_WBbjisiGEeueo7rlLkmY8A" type="Association_TargetMultiplicityLabel">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_YxG10MiGEeueo7rlLkmY8A" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_WBbji8iGEeueo7rlLkmY8A" x="-26" y="-18"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_WBa8cciGEeueo7rlLkmY8A"/>
+ <element xmi:type="uml:Association" href="properties.uml#_WBGMUMiGEeueo7rlLkmY8A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_WBa8csiGEeueo7rlLkmY8A" points="[662, 220, -643984, -643984]$[672, 388, -643984, -643984]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_WCIHEMiGEeueo7rlLkmY8A" id="(0.559322033898305,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_WCIHEciGEeueo7rlLkmY8A" id="(0.31690140845070425,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_uKTA8MiGEeueo7rlLkmY8A" type="Generalization_Edge" source="_dpVJAMiGEeueo7rlLkmY8A" target="_oY44cMiFEeueo7rlLkmY8A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_uKTA88iGEeueo7rlLkmY8A" type="Generalization_StereotypeLabel">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_7M5UkMiGEeueo7rlLkmY8A" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_uKTA9MiGEeueo7rlLkmY8A" y="38"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_uKTA8ciGEeueo7rlLkmY8A"/>
+ <element xmi:type="uml:Generalization" href="properties.uml#_uJ0f0MiGEeueo7rlLkmY8A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_uKTA8siGEeueo7rlLkmY8A" points="[172, 324, -643984, -643984]$[286, 214, -643984, -643984]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_uLMY0MiGEeueo7rlLkmY8A" id="(0.8360655737704918,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_uLMY0ciGEeueo7rlLkmY8A" id="(0.004149377593360996,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_uqx30MiGEeueo7rlLkmY8A" type="Generalization_Edge" source="_f8b0EMiGEeueo7rlLkmY8A" target="_oY44cMiFEeueo7rlLkmY8A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_uqx308iGEeueo7rlLkmY8A" type="Generalization_StereotypeLabel">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_7NWnkMiGEeueo7rlLkmY8A" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_uqx31MiGEeueo7rlLkmY8A" y="39"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_uqx30ciGEeueo7rlLkmY8A"/>
+ <element xmi:type="uml:Generalization" href="properties.uml#_up_NoMiGEeueo7rlLkmY8A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_uqx30siGEeueo7rlLkmY8A" points="[285, 326, -643984, -643984]$[314, 214, -643984, -643984]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_usBN8MiGEeueo7rlLkmY8A" id="(0.73,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_usBN8ciGEeueo7rlLkmY8A" id="(0.2863070539419087,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_vR0psMiGEeueo7rlLkmY8A" type="Generalization_Edge" source="_c-ajwMiGEeueo7rlLkmY8A" target="_oY44cMiFEeueo7rlLkmY8A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_vR0ps8iGEeueo7rlLkmY8A" type="Generalization_StereotypeLabel">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_7Nz6kMiGEeueo7rlLkmY8A" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_vR0ptMiGEeueo7rlLkmY8A" y="39"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_vR0psciGEeueo7rlLkmY8A"/>
+ <element xmi:type="uml:Generalization" href="properties.uml#_vQel4MiGEeueo7rlLkmY8A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_vR0pssiGEeueo7rlLkmY8A" points="[409, 326, -643984, -643984]$[362, 214, -643984, -643984]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_vSyTAMiGEeueo7rlLkmY8A" id="(0.7115384615384616,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_vSyTAciGEeueo7rlLkmY8A" id="(0.7634854771784232,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_v4u4sMiGEeueo7rlLkmY8A" type="Generalization_Edge" source="_jyp3sMiGEeueo7rlLkmY8A" target="_oY44cMiFEeueo7rlLkmY8A">
+ <children xmi:type="notation:DecorationNode" xmi:id="_v4u4s8iGEeueo7rlLkmY8A" type="Generalization_StereotypeLabel">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_7ORNkMiGEeueo7rlLkmY8A" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_v4u4tMiGEeueo7rlLkmY8A" x="-1" y="38"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_v4u4sciGEeueo7rlLkmY8A"/>
+ <element xmi:type="uml:Generalization" href="properties.uml#_v4RlsMiGEeueo7rlLkmY8A"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_v4u4ssiGEeueo7rlLkmY8A" points="[506, 326, -643984, -643984]$[385, 208, -643984, -643984]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_v5pesMiGEeueo7rlLkmY8A" id="(0.42,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_v5pesciGEeueo7rlLkmY8A" id="(1.0,0.9345794392523364)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_nxojcMqvEeuhj7ABGVZg5A" type="StereotypeCommentLink" source="_lBPAIMiFEeueo7rlLkmY8A" target="_nxn8YMqvEeuhj7ABGVZg5A">
+ <styles xmi:type="notation:FontStyle" xmi:id="_nxojccqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_nxojdcqvEeuhj7ABGVZg5A" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Class" href="properties.uml#_lBHrYMiFEeueo7rlLkmY8A"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_nxojcsqvEeuhj7ABGVZg5A" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_nxojc8qvEeuhj7ABGVZg5A"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_nxojdMqvEeuhj7ABGVZg5A"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_nx_IwcqvEeuhj7ABGVZg5A" type="StereotypeCommentLink" source="_oY44cMiFEeueo7rlLkmY8A" target="_nx-hsMqvEeuhj7ABGVZg5A">
+ <styles xmi:type="notation:FontStyle" xmi:id="_nx_IwsqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_nx_IxsqvEeuhj7ABGVZg5A" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Class" href="properties.uml#_oYyx0MiFEeueo7rlLkmY8A"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_nx_Iw8qvEeuhj7ABGVZg5A" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_nx_IxMqvEeuhj7ABGVZg5A"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_nx_IxcqvEeuhj7ABGVZg5A"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_nye4BMqvEeuhj7ABGVZg5A" type="StereotypeCommentLink" source="_Mu7dYMiGEeueo7rlLkmY8A" target="_nye4AMqvEeuhj7ABGVZg5A">
+ <styles xmi:type="notation:FontStyle" xmi:id="_nye4BcqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_nye4CcqvEeuhj7ABGVZg5A" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Class" href="pathmap://UML_METAMODELS/Ecore.metamodel.uml#EObject"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_nye4BsqvEeuhj7ABGVZg5A" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_nye4B8qvEeuhj7ABGVZg5A"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_nye4CMqvEeuhj7ABGVZg5A"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_nyzoJMqvEeuhj7ABGVZg5A" type="StereotypeCommentLink" source="_U9wgAMiGEeueo7rlLkmY8A" target="_nyzoIMqvEeuhj7ABGVZg5A">
+ <styles xmi:type="notation:FontStyle" xmi:id="_nyzoJcqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_nyzoKcqvEeuhj7ABGVZg5A" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Class" href="pathmap://UML_METAMODELS/Ecore.metamodel.uml#EStringToStringMapEntry"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_nyzoJsqvEeuhj7ABGVZg5A" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_nyzoJ8qvEeuhj7ABGVZg5A"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_nyzoKMqvEeuhj7ABGVZg5A"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_nzBqkMqvEeuhj7ABGVZg5A" type="StereotypeCommentLink" source="_c-ajwMiGEeueo7rlLkmY8A" target="_nzBDg8qvEeuhj7ABGVZg5A">
+ <styles xmi:type="notation:FontStyle" xmi:id="_nzBqkcqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_nzBqlcqvEeuhj7ABGVZg5A" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Class" href="properties.uml#_jfIc6JxgEeu216dzZOP2Cw"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_nzBqksqvEeuhj7ABGVZg5A" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_nzBqk8qvEeuhj7ABGVZg5A"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_nzBqlMqvEeuhj7ABGVZg5A"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_nzN31MqvEeuhj7ABGVZg5A" type="StereotypeCommentLink" source="_dpVJAMiGEeueo7rlLkmY8A" target="_nzN30MqvEeuhj7ABGVZg5A">
+ <styles xmi:type="notation:FontStyle" xmi:id="_nzN31cqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_nzN32cqvEeuhj7ABGVZg5A" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Class" href="properties.uml#_jfIc_pxgEeu216dzZOP2Cw"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_nzN31sqvEeuhj7ABGVZg5A" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_nzN318qvEeuhj7ABGVZg5A"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_nzN32MqvEeuhj7ABGVZg5A"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_nzZeBMqvEeuhj7ABGVZg5A" type="StereotypeCommentLink" source="_f8b0EMiGEeueo7rlLkmY8A" target="_nzZeAMqvEeuhj7ABGVZg5A">
+ <styles xmi:type="notation:FontStyle" xmi:id="_nzZeBcqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_nzZeCcqvEeuhj7ABGVZg5A" name="BASE_ELEMENT">
<eObjectValue xmi:type="uml:Class" href="properties.uml#_jfIc7ZxgEeu216dzZOP2Cw"/>
</styles>
<element xsi:nil="true"/>
- <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_SENbpshoEeuDHv-ApZ_XIQ" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
- <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_SEOCsMhoEeuDHv-ApZ_XIQ"/>
- <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_SEOCschoEeuDHv-ApZ_XIQ"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_nzZeBsqvEeuhj7ABGVZg5A" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_nzZeB8qvEeuhj7ABGVZg5A"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_nzZeCMqvEeuhj7ABGVZg5A"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_nzlENMqvEeuhj7ABGVZg5A" type="StereotypeCommentLink" source="_jyp3sMiGEeueo7rlLkmY8A" target="_nzlEMMqvEeuhj7ABGVZg5A">
+ <styles xmi:type="notation:FontStyle" xmi:id="_nzlENcqvEeuhj7ABGVZg5A"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_nzlEOcqvEeuhj7ABGVZg5A" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Class" href="properties.uml#_jfJDiZxgEeu216dzZOP2Cw"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_nzlENsqvEeuhj7ABGVZg5A" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_nzlEN8qvEeuhj7ABGVZg5A"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_nzlEOMqvEeuhj7ABGVZg5A"/>
</edges>
</notation:Diagram>
</xmi:XMI>
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/Model/properties.uml b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/Model/properties.uml
index d8dd16eddd6..fd7236adb5d 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/Model/properties.uml
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/Model/properties.uml
@@ -1,94 +1,94 @@
<?xml version="1.0" encoding="UTF-8"?>
<xmi:XMI xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:Ecore="http://www.eclipse.org/uml2/schemas/Ecore/5" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xsi:schemaLocation="http://www.eclipse.org/uml2/schemas/Ecore/5 pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA">
<uml:Model xmi:id="_jfIcYJxgEeu216dzZOP2Cw" name="properties" URI="http://www.eclipse.org/papyrus/properties/0.9.0">
- <packageImport xmi:type="uml:PackageImport" xmi:id="_40LnAJxjEeu216dzZOP2Cw">
+ <packageImport xmi:id="_40LnAJxjEeu216dzZOP2Cw">
<importedPackage xmi:type="uml:Model" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#_0"/>
</packageImport>
<packagedElement xmi:type="uml:Package" xmi:id="_jfIcYZxgEeu216dzZOP2Cw" name="environment" URI="http://www.eclipse.org/papyrus/properties/environment/0.9">
<packagedElement xmi:type="uml:Class" xmi:id="_jfIcYpxgEeu216dzZOP2Cw" name="Environment">
- <generalization xmi:type="uml:Generalization" xmi:id="_jfIcY5xgEeu216dzZOP2Cw">
+ <generalization xmi:id="_jfIcY5xgEeu216dzZOP2Cw">
<general xmi:type="uml:Class" href="../../org.eclipse.papyrus.infra.constraints/Model/Constraints.uml#_zg0XUpxgEeu216dzZOP2Cw"/>
</generalization>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIcZJxgEeu216dzZOP2Cw" name="modelElementFactories" type="_jfIceZxgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfIcfJxgEeu216dzZOP2Cw">
+ <ownedAttribute xmi:id="_jfIcZJxgEeu216dzZOP2Cw" name="modelElementFactories" type="_jfIceZxgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfIcfJxgEeu216dzZOP2Cw">
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfIcZZxgEeu216dzZOP2Cw"/>
<upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_jfIcZpxgEeu216dzZOP2Cw" value="*"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIcZ5xgEeu216dzZOP2Cw" name="widgetTypes" type="_jfIcfpxgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfIcjpxgEeu216dzZOP2Cw">
+ <ownedAttribute xmi:id="_jfIcZ5xgEeu216dzZOP2Cw" name="widgetTypes" type="_jfIcfpxgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfIcjpxgEeu216dzZOP2Cw">
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfIcaJxgEeu216dzZOP2Cw"/>
<upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_jfIcaZxgEeu216dzZOP2Cw" value="*"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIcapxgEeu216dzZOP2Cw" name="propertyEditorTypes" type="_jfIckJxgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfIcnJxgEeu216dzZOP2Cw">
+ <ownedAttribute xmi:id="_jfIcapxgEeu216dzZOP2Cw" name="propertyEditorTypes" type="_jfIckJxgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfIcnJxgEeu216dzZOP2Cw">
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfIca5xgEeu216dzZOP2Cw"/>
<upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_jfIcbJxgEeu216dzZOP2Cw" value="*"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIcbZxgEeu216dzZOP2Cw" name="compositeWidgetTypes" type="_jfIcnpxgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfIcoJxgEeu216dzZOP2Cw">
+ <ownedAttribute xmi:id="_jfIcbZxgEeu216dzZOP2Cw" name="compositeWidgetTypes" type="_jfIcnpxgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfIcoJxgEeu216dzZOP2Cw">
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfIcbpxgEeu216dzZOP2Cw"/>
<upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_jfIcb5xgEeu216dzZOP2Cw" value="*"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIccJxgEeu216dzZOP2Cw" name="layoutTypes" type="_jfIcopxgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfIcpJxgEeu216dzZOP2Cw">
+ <ownedAttribute xmi:id="_jfIccJxgEeu216dzZOP2Cw" name="layoutTypes" type="_jfIcopxgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfIcpJxgEeu216dzZOP2Cw">
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfIccZxgEeu216dzZOP2Cw"/>
<upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_jfIccpxgEeu216dzZOP2Cw" value="*"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIcc5xgEeu216dzZOP2Cw" name="namespaces" type="_jfIchZxgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfIcppxgEeu216dzZOP2Cw">
+ <ownedAttribute xmi:id="_jfIcc5xgEeu216dzZOP2Cw" name="namespaces" type="_jfIchZxgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfIcppxgEeu216dzZOP2Cw">
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfIcdJxgEeu216dzZOP2Cw"/>
<upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_jfIcdZxgEeu216dzZOP2Cw" value="*"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIcdpxgEeu216dzZOP2Cw" name="miscClasses" type="_jfIcqJxgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfIcsJxgEeu216dzZOP2Cw">
+ <ownedAttribute xmi:id="_jfIcdpxgEeu216dzZOP2Cw" name="miscClasses" type="_jfIcqJxgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfIcsJxgEeu216dzZOP2Cw">
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfIcd5xgEeu216dzZOP2Cw"/>
<upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_jfIceJxgEeu216dzZOP2Cw" value="*"/>
</ownedAttribute>
</packagedElement>
<packagedElement xmi:type="uml:Class" xmi:id="_jfIceZxgEeu216dzZOP2Cw" name="ModelElementFactoryDescriptor">
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIcepxgEeu216dzZOP2Cw" name="name" visibility="public" isOrdered="true">
+ <ownedAttribute xmi:id="_jfIcepxgEeu216dzZOP2Cw" name="name" visibility="public" isOrdered="true">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EString"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIce5xgEeu216dzZOP2Cw" name="factoryClass" visibility="public" isOrdered="true">
+ <ownedAttribute xmi:id="_jfIce5xgEeu216dzZOP2Cw" name="factoryClass" visibility="public" isOrdered="true">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EString"/>
</ownedAttribute>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="_jfIcfJxgEeu216dzZOP2Cw" memberEnd="_jfIcZJxgEeu216dzZOP2Cw _jfIcfZxgEeu216dzZOP2Cw">
- <ownedEnd xmi:type="uml:Property" xmi:id="_jfIcfZxgEeu216dzZOP2Cw" type="_jfIcYpxgEeu216dzZOP2Cw" association="_jfIcfJxgEeu216dzZOP2Cw"/>
+ <ownedEnd xmi:id="_jfIcfZxgEeu216dzZOP2Cw" type="_jfIcYpxgEeu216dzZOP2Cw" association="_jfIcfJxgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Class" xmi:id="_jfIcfpxgEeu216dzZOP2Cw" name="StandardWidgetType">
- <generalization xmi:type="uml:Generalization" xmi:id="_jfIcf5xgEeu216dzZOP2Cw" general="_jfIcgJxgEeu216dzZOP2Cw"/>
+ <generalization xmi:id="_jfIcf5xgEeu216dzZOP2Cw" general="_jfIcgJxgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Class" xmi:id="_jfIcgJxgEeu216dzZOP2Cw" name="WidgetType" isAbstract="true">
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIcgZxgEeu216dzZOP2Cw" name="label" visibility="public" isOrdered="true">
+ <ownedAttribute xmi:id="_jfIcgZxgEeu216dzZOP2Cw" name="label" visibility="public" isOrdered="true">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EString"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIcgpxgEeu216dzZOP2Cw" name="widgetClass" visibility="public" isOrdered="true">
+ <ownedAttribute xmi:id="_jfIcgpxgEeu216dzZOP2Cw" name="widgetClass" visibility="public" isOrdered="true">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EString"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIcg5xgEeu216dzZOP2Cw" name="namespace" type="_jfIchZxgEeu216dzZOP2Cw" isOrdered="true" association="_jfIcjJxgEeu216dzZOP2Cw">
+ <ownedAttribute xmi:id="_jfIcg5xgEeu216dzZOP2Cw" name="namespace" type="_jfIchZxgEeu216dzZOP2Cw" isOrdered="true" association="_jfIcjJxgEeu216dzZOP2Cw">
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfIchJxgEeu216dzZOP2Cw"/>
</ownedAttribute>
</packagedElement>
<packagedElement xmi:type="uml:Class" xmi:id="_jfIchZxgEeu216dzZOP2Cw" name="Namespace">
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIchpxgEeu216dzZOP2Cw" name="prefix" visibility="public" isOrdered="true">
+ <ownedAttribute xmi:id="_jfIchpxgEeu216dzZOP2Cw" name="prefix" visibility="public" isOrdered="true">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EString"/>
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfIch5xgEeu216dzZOP2Cw"/>
<defaultValue xmi:type="uml:LiteralString" xmi:id="_jfIciJxgEeu216dzZOP2Cw" value="clr-namespace">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EString"/>
</defaultValue>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIciZxgEeu216dzZOP2Cw" name="name" visibility="public" isOrdered="true">
+ <ownedAttribute xmi:id="_jfIciZxgEeu216dzZOP2Cw" name="name" visibility="public" isOrdered="true">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EString"/>
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfIcipxgEeu216dzZOP2Cw"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIci5xgEeu216dzZOP2Cw" name="value" visibility="public" isOrdered="true">
+ <ownedAttribute xmi:id="_jfIci5xgEeu216dzZOP2Cw" name="value" visibility="public" isOrdered="true">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EString"/>
</ownedAttribute>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="_jfIcjJxgEeu216dzZOP2Cw" memberEnd="_jfIcg5xgEeu216dzZOP2Cw _jfIcjZxgEeu216dzZOP2Cw">
- <ownedEnd xmi:type="uml:Property" xmi:id="_jfIcjZxgEeu216dzZOP2Cw" type="_jfIcgJxgEeu216dzZOP2Cw" association="_jfIcjJxgEeu216dzZOP2Cw"/>
+ <ownedEnd xmi:id="_jfIcjZxgEeu216dzZOP2Cw" type="_jfIcgJxgEeu216dzZOP2Cw" association="_jfIcjJxgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="_jfIcjpxgEeu216dzZOP2Cw" memberEnd="_jfIcZ5xgEeu216dzZOP2Cw _jfIcj5xgEeu216dzZOP2Cw">
- <ownedEnd xmi:type="uml:Property" xmi:id="_jfIcj5xgEeu216dzZOP2Cw" type="_jfIcYpxgEeu216dzZOP2Cw" association="_jfIcjpxgEeu216dzZOP2Cw"/>
+ <ownedEnd xmi:id="_jfIcj5xgEeu216dzZOP2Cw" type="_jfIcYpxgEeu216dzZOP2Cw" association="_jfIcjpxgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Class" xmi:id="_jfIckJxgEeu216dzZOP2Cw" name="PropertyEditorType">
- <generalization xmi:type="uml:Generalization" xmi:id="_jfIckZxgEeu216dzZOP2Cw" general="_jfIcgJxgEeu216dzZOP2Cw"/>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIckpxgEeu216dzZOP2Cw" name="type" visibility="public" type="_jfIclZxgEeu216dzZOP2Cw" isOrdered="true"/>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIck5xgEeu216dzZOP2Cw" name="multiplicity" visibility="public" isOrdered="true">
+ <generalization xmi:id="_jfIckZxgEeu216dzZOP2Cw" general="_jfIcgJxgEeu216dzZOP2Cw"/>
+ <ownedAttribute xmi:id="_jfIckpxgEeu216dzZOP2Cw" name="type" visibility="public" type="_jfIclZxgEeu216dzZOP2Cw" isOrdered="true"/>
+ <ownedAttribute xmi:id="_jfIck5xgEeu216dzZOP2Cw" name="multiplicity" visibility="public" isOrdered="true">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EInt"/>
<defaultValue xmi:type="uml:LiteralInteger" xmi:id="_jfIclJxgEeu216dzZOP2Cw" value="1">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EInt"/>
@@ -96,94 +96,94 @@
</ownedAttribute>
</packagedElement>
<packagedElement xmi:type="uml:Enumeration" xmi:id="_jfIclZxgEeu216dzZOP2Cw" name="Type">
- <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_jfIclpxgEeu216dzZOP2Cw" name="String"/>
- <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_jfIcl5xgEeu216dzZOP2Cw" name="Boolean"/>
- <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_jfIcmJxgEeu216dzZOP2Cw" name="Integer"/>
- <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_jfIcmZxgEeu216dzZOP2Cw" name="Reference"/>
- <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_jfIcmpxgEeu216dzZOP2Cw" name="Enumeration"/>
- <ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="_jfIcm5xgEeu216dzZOP2Cw" name="Double"/>
+ <ownedLiteral xmi:id="_jfIclpxgEeu216dzZOP2Cw" name="String"/>
+ <ownedLiteral xmi:id="_jfIcl5xgEeu216dzZOP2Cw" name="Boolean"/>
+ <ownedLiteral xmi:id="_jfIcmJxgEeu216dzZOP2Cw" name="Integer"/>
+ <ownedLiteral xmi:id="_jfIcmZxgEeu216dzZOP2Cw" name="Reference"/>
+ <ownedLiteral xmi:id="_jfIcmpxgEeu216dzZOP2Cw" name="Enumeration"/>
+ <ownedLiteral xmi:id="_jfIcm5xgEeu216dzZOP2Cw" name="Double"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="_jfIcnJxgEeu216dzZOP2Cw" memberEnd="_jfIcapxgEeu216dzZOP2Cw _jfIcnZxgEeu216dzZOP2Cw">
- <ownedEnd xmi:type="uml:Property" xmi:id="_jfIcnZxgEeu216dzZOP2Cw" type="_jfIcYpxgEeu216dzZOP2Cw" association="_jfIcnJxgEeu216dzZOP2Cw"/>
+ <ownedEnd xmi:id="_jfIcnZxgEeu216dzZOP2Cw" type="_jfIcYpxgEeu216dzZOP2Cw" association="_jfIcnJxgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Class" xmi:id="_jfIcnpxgEeu216dzZOP2Cw" name="CompositeWidgetType">
- <generalization xmi:type="uml:Generalization" xmi:id="_jfIcn5xgEeu216dzZOP2Cw" general="_jfIcgJxgEeu216dzZOP2Cw"/>
+ <generalization xmi:id="_jfIcn5xgEeu216dzZOP2Cw" general="_jfIcgJxgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="_jfIcoJxgEeu216dzZOP2Cw" memberEnd="_jfIcbZxgEeu216dzZOP2Cw _jfIcoZxgEeu216dzZOP2Cw">
- <ownedEnd xmi:type="uml:Property" xmi:id="_jfIcoZxgEeu216dzZOP2Cw" type="_jfIcYpxgEeu216dzZOP2Cw" association="_jfIcoJxgEeu216dzZOP2Cw"/>
+ <ownedEnd xmi:id="_jfIcoZxgEeu216dzZOP2Cw" type="_jfIcYpxgEeu216dzZOP2Cw" association="_jfIcoJxgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Class" xmi:id="_jfIcopxgEeu216dzZOP2Cw" name="LayoutType">
- <generalization xmi:type="uml:Generalization" xmi:id="_jfIco5xgEeu216dzZOP2Cw" general="_jfIcgJxgEeu216dzZOP2Cw"/>
+ <generalization xmi:id="_jfIco5xgEeu216dzZOP2Cw" general="_jfIcgJxgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="_jfIcpJxgEeu216dzZOP2Cw" memberEnd="_jfIccJxgEeu216dzZOP2Cw _jfIcpZxgEeu216dzZOP2Cw">
- <ownedEnd xmi:type="uml:Property" xmi:id="_jfIcpZxgEeu216dzZOP2Cw" type="_jfIcYpxgEeu216dzZOP2Cw" association="_jfIcpJxgEeu216dzZOP2Cw"/>
+ <ownedEnd xmi:id="_jfIcpZxgEeu216dzZOP2Cw" type="_jfIcYpxgEeu216dzZOP2Cw" association="_jfIcpJxgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="_jfIcppxgEeu216dzZOP2Cw" memberEnd="_jfIcc5xgEeu216dzZOP2Cw _jfIcp5xgEeu216dzZOP2Cw">
- <ownedEnd xmi:type="uml:Property" xmi:id="_jfIcp5xgEeu216dzZOP2Cw" type="_jfIcYpxgEeu216dzZOP2Cw" association="_jfIcppxgEeu216dzZOP2Cw"/>
+ <ownedEnd xmi:id="_jfIcp5xgEeu216dzZOP2Cw" type="_jfIcYpxgEeu216dzZOP2Cw" association="_jfIcppxgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Class" xmi:id="_jfIcqJxgEeu216dzZOP2Cw" name="MiscClass">
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIcqZxgEeu216dzZOP2Cw" name="label" visibility="public" isOrdered="true">
+ <ownedAttribute xmi:id="_jfIcqZxgEeu216dzZOP2Cw" name="label" visibility="public" isOrdered="true">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EString"/>
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfIcqpxgEeu216dzZOP2Cw"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIcq5xgEeu216dzZOP2Cw" name="class" visibility="public" isOrdered="true">
+ <ownedAttribute xmi:id="_jfIcq5xgEeu216dzZOP2Cw" name="class" visibility="public" isOrdered="true">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EString"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIcrJxgEeu216dzZOP2Cw" name="namespace" type="_jfIchZxgEeu216dzZOP2Cw" isOrdered="true" association="_jfIcrpxgEeu216dzZOP2Cw">
+ <ownedAttribute xmi:id="_jfIcrJxgEeu216dzZOP2Cw" name="namespace" type="_jfIchZxgEeu216dzZOP2Cw" isOrdered="true" association="_jfIcrpxgEeu216dzZOP2Cw">
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfIcrZxgEeu216dzZOP2Cw"/>
</ownedAttribute>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="_jfIcrpxgEeu216dzZOP2Cw" memberEnd="_jfIcrJxgEeu216dzZOP2Cw _jfIcr5xgEeu216dzZOP2Cw">
- <ownedEnd xmi:type="uml:Property" xmi:id="_jfIcr5xgEeu216dzZOP2Cw" type="_jfIcqJxgEeu216dzZOP2Cw" association="_jfIcrpxgEeu216dzZOP2Cw"/>
+ <ownedEnd xmi:id="_jfIcr5xgEeu216dzZOP2Cw" type="_jfIcqJxgEeu216dzZOP2Cw" association="_jfIcrpxgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="_jfIcsJxgEeu216dzZOP2Cw" memberEnd="_jfIcdpxgEeu216dzZOP2Cw _jfIcsZxgEeu216dzZOP2Cw">
- <ownedEnd xmi:type="uml:Property" xmi:id="_jfIcsZxgEeu216dzZOP2Cw" type="_jfIcYpxgEeu216dzZOP2Cw" association="_jfIcsJxgEeu216dzZOP2Cw"/>
+ <ownedEnd xmi:id="_jfIcsZxgEeu216dzZOP2Cw" type="_jfIcYpxgEeu216dzZOP2Cw" association="_jfIcsJxgEeu216dzZOP2Cw"/>
</packagedElement>
</packagedElement>
<packagedElement xmi:type="uml:Package" xmi:id="_jfIcspxgEeu216dzZOP2Cw" name="contexts" URI="http://www.eclipse.org/papyrus/properties/contexts/0.9">
<packagedElement xmi:type="uml:Class" xmi:id="_jfIcs5xgEeu216dzZOP2Cw" name="Context">
- <generalization xmi:type="uml:Generalization" xmi:id="_jfIctJxgEeu216dzZOP2Cw">
+ <generalization xmi:id="_jfIctJxgEeu216dzZOP2Cw">
<general xmi:type="uml:Class" href="pathmap://UML_METAMODELS/Ecore.metamodel.uml#EModelElement"/>
</generalization>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIctZxgEeu216dzZOP2Cw" name="name" visibility="public" isOrdered="true">
- <ownedComment xmi:type="uml:Comment" xmi:id="_jfIctpxgEeu216dzZOP2Cw" annotatedElement="_jfIctZxgEeu216dzZOP2Cw">
+ <ownedAttribute xmi:id="_jfIctZxgEeu216dzZOP2Cw" name="name" visibility="public" isOrdered="true">
+ <ownedComment xmi:id="_jfIctpxgEeu216dzZOP2Cw" annotatedElement="_jfIctZxgEeu216dzZOP2Cw">
<body>An unique name for the context, which is used in various components to
identify it.</body>
</ownedComment>
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EString"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIct5xgEeu216dzZOP2Cw" name="dependencies" type="_jfIcs5xgEeu216dzZOP2Cw" association="_jfIcy5xgEeu216dzZOP2Cw">
+ <ownedAttribute xmi:id="_jfIct5xgEeu216dzZOP2Cw" name="dependencies" type="_jfIcs5xgEeu216dzZOP2Cw" association="_jfIcy5xgEeu216dzZOP2Cw">
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfIcuJxgEeu216dzZOP2Cw"/>
<upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_jfIcuZxgEeu216dzZOP2Cw" value="*"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIcupxgEeu216dzZOP2Cw" name="tabs" type="_jfIczZxgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfJDh5xgEeu216dzZOP2Cw">
+ <ownedAttribute xmi:id="_jfIcupxgEeu216dzZOP2Cw" name="tabs" type="_jfIczZxgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfJDh5xgEeu216dzZOP2Cw">
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfIcu5xgEeu216dzZOP2Cw"/>
<upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_jfIcvJxgEeu216dzZOP2Cw" value="*"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIcvZxgEeu216dzZOP2Cw" name="views" type="_jfJDiZxgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfJDlpxgEeu216dzZOP2Cw">
+ <ownedAttribute xmi:id="_jfIcvZxgEeu216dzZOP2Cw" name="views" type="_jfJDiZxgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfJDlpxgEeu216dzZOP2Cw">
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfIcvpxgEeu216dzZOP2Cw"/>
<upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_jfIcv5xgEeu216dzZOP2Cw" value="*"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIcwJxgEeu216dzZOP2Cw" name="dataContexts" type="_jfJDmZxgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfJDn5xgEeu216dzZOP2Cw">
+ <ownedAttribute xmi:id="_jfIcwJxgEeu216dzZOP2Cw" name="dataContexts" type="_jfJDmZxgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfJDn5xgEeu216dzZOP2Cw">
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfIcwZxgEeu216dzZOP2Cw"/>
<upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_jfIcwpxgEeu216dzZOP2Cw" value="*"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIcw5xgEeu216dzZOP2Cw" name="prototype" type="_jfIcs5xgEeu216dzZOP2Cw" isOrdered="true" association="_jfJDoZxgEeu216dzZOP2Cw">
- <ownedComment xmi:type="uml:Comment" xmi:id="_jfIcxJxgEeu216dzZOP2Cw" annotatedElement="_jfIcw5xgEeu216dzZOP2Cw">
+ <ownedAttribute xmi:id="_jfIcw5xgEeu216dzZOP2Cw" name="prototype" type="_jfIcs5xgEeu216dzZOP2Cw" isOrdered="true" association="_jfJDoZxgEeu216dzZOP2Cw">
+ <ownedComment xmi:id="_jfIcxJxgEeu216dzZOP2Cw" annotatedElement="_jfIcw5xgEeu216dzZOP2Cw">
<body>References the context from which a context was copied. The context manager caches the prototype reference so that it can enable a prototype when the copied context is not available.</body>
</ownedComment>
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfIcxZxgEeu216dzZOP2Cw"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIcxpxgEeu216dzZOP2Cw" name="label" visibility="public" isOrdered="true">
- <ownedComment xmi:type="uml:Comment" xmi:id="_jfIcx5xgEeu216dzZOP2Cw" annotatedElement="_jfIcxpxgEeu216dzZOP2Cw">
+ <ownedAttribute xmi:id="_jfIcxpxgEeu216dzZOP2Cw" name="label" visibility="public" isOrdered="true">
+ <ownedComment xmi:id="_jfIcx5xgEeu216dzZOP2Cw" annotatedElement="_jfIcxpxgEeu216dzZOP2Cw">
<body>A potentially translatable (localizable) label for presentation of the context
in the user interface. If absent, the name should be used in its place.</body>
</ownedComment>
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EString"/>
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfIcyJxgEeu216dzZOP2Cw"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIcyZxgEeu216dzZOP2Cw" name="userLabel" visibility="public" isOrdered="true" isReadOnly="true" isDerived="true">
- <ownedComment xmi:type="uml:Comment" xmi:id="_jfIcypxgEeu216dzZOP2Cw" annotatedElement="_jfIcyZxgEeu216dzZOP2Cw">
+ <ownedAttribute xmi:id="_jfIcyZxgEeu216dzZOP2Cw" name="userLabel" visibility="public" isOrdered="true" isReadOnly="true" isDerived="true">
+ <ownedComment xmi:id="_jfIcypxgEeu216dzZOP2Cw" annotatedElement="_jfIcyZxgEeu216dzZOP2Cw">
<body>A computed label for presentation to the user: the label, if available, otherwise
just the name of the context.</body>
</ownedComment>
@@ -191,295 +191,366 @@ just the name of the context.</body>
</ownedAttribute>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="_jfIcy5xgEeu216dzZOP2Cw" memberEnd="_jfIct5xgEeu216dzZOP2Cw _jfIczJxgEeu216dzZOP2Cw">
- <ownedEnd xmi:type="uml:Property" xmi:id="_jfIczJxgEeu216dzZOP2Cw" type="_jfIcs5xgEeu216dzZOP2Cw" association="_jfIcy5xgEeu216dzZOP2Cw"/>
+ <ownedEnd xmi:id="_jfIczJxgEeu216dzZOP2Cw" type="_jfIcs5xgEeu216dzZOP2Cw" association="_jfIcy5xgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Class" xmi:id="_jfIczZxgEeu216dzZOP2Cw" name="Tab">
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIczpxgEeu216dzZOP2Cw" name="label" visibility="public" isOrdered="true">
+ <ownedAttribute xmi:id="_jfIczpxgEeu216dzZOP2Cw" name="label" visibility="public" isOrdered="true">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EString"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIcz5xgEeu216dzZOP2Cw" name="id" visibility="public" isOrdered="true">
+ <ownedAttribute xmi:id="_jfIcz5xgEeu216dzZOP2Cw" name="id" visibility="public" isOrdered="true">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EString"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIc0JxgEeu216dzZOP2Cw" name="category" visibility="public" isOrdered="true">
+ <ownedAttribute xmi:id="_jfIc0JxgEeu216dzZOP2Cw" name="category" visibility="public" isOrdered="true">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EString"/>
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfIc0ZxgEeu216dzZOP2Cw"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIc0pxgEeu216dzZOP2Cw" name="image" visibility="public" isOrdered="true">
+ <ownedAttribute xmi:id="_jfIc0pxgEeu216dzZOP2Cw" name="image" visibility="public" isOrdered="true">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EString"/>
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfIc05xgEeu216dzZOP2Cw"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIc1JxgEeu216dzZOP2Cw" name="afterTab" type="_jfIczZxgEeu216dzZOP2Cw" isOrdered="true" association="_jfIc4JxgEeu216dzZOP2Cw">
+ <ownedAttribute xmi:id="_jfIc1JxgEeu216dzZOP2Cw" name="afterTab" type="_jfIczZxgEeu216dzZOP2Cw" isOrdered="true" association="_jfIc4JxgEeu216dzZOP2Cw">
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfIc1ZxgEeu216dzZOP2Cw"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIc1pxgEeu216dzZOP2Cw" name="sections" type="_jfIc4pxgEeu216dzZOP2Cw" isOrdered="true" isDerived="true" subsettedProperty="_jfIc2ZxgEeu216dzZOP2Cw" association="_jfJDhpxgEeu216dzZOP2Cw">
+ <ownedAttribute xmi:id="_jfIc1pxgEeu216dzZOP2Cw" name="sections" type="_jfIc4pxgEeu216dzZOP2Cw" isOrdered="true" isDerived="true" subsettedProperty="_jfIc2ZxgEeu216dzZOP2Cw" association="_jfJDhpxgEeu216dzZOP2Cw">
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfIc15xgEeu216dzZOP2Cw"/>
<upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_jfIc2JxgEeu216dzZOP2Cw" value="*"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIc2ZxgEeu216dzZOP2Cw" name="allSections" type="_jfIc6JxgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfIc7JxgEeu216dzZOP2Cw">
+ <ownedAttribute xmi:id="_jfIc2ZxgEeu216dzZOP2Cw" name="allSections" type="_jfIc6JxgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfIc7JxgEeu216dzZOP2Cw">
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfIc2pxgEeu216dzZOP2Cw"/>
<upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_jfIc25xgEeu216dzZOP2Cw" value="*"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIc3JxgEeu216dzZOP2Cw" name="indented" visibility="public" isOrdered="true">
+ <ownedAttribute xmi:id="_jfIc3JxgEeu216dzZOP2Cw" name="indented" visibility="public" isOrdered="true">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EBoolean"/>
<defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_jfIc3ZxgEeu216dzZOP2Cw">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EBoolean"/>
</defaultValue>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIc3pxgEeu216dzZOP2Cw" name="priority" visibility="public" isOrdered="true">
+ <ownedAttribute xmi:id="_jfIc3pxgEeu216dzZOP2Cw" name="priority" visibility="public" isOrdered="true">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EInt"/>
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfIc35xgEeu216dzZOP2Cw"/>
</ownedAttribute>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="_jfIc4JxgEeu216dzZOP2Cw" memberEnd="_jfIc1JxgEeu216dzZOP2Cw _jfIc4ZxgEeu216dzZOP2Cw">
- <ownedEnd xmi:type="uml:Property" xmi:id="_jfIc4ZxgEeu216dzZOP2Cw" type="_jfIczZxgEeu216dzZOP2Cw" association="_jfIc4JxgEeu216dzZOP2Cw"/>
+ <ownedEnd xmi:id="_jfIc4ZxgEeu216dzZOP2Cw" type="_jfIczZxgEeu216dzZOP2Cw" association="_jfIc4JxgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Class" xmi:id="_jfIc4pxgEeu216dzZOP2Cw" name="Section">
- <generalization xmi:type="uml:Generalization" xmi:id="_jfIc5JxgEeu216dzZOP2Cw" general="_jfIc6JxgEeu216dzZOP2Cw"/>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIc5ZxgEeu216dzZOP2Cw" name="sectionFile" visibility="public" isOrdered="true">
+ <generalization xmi:id="_jfIc5JxgEeu216dzZOP2Cw" general="_jfIc6JxgEeu216dzZOP2Cw"/>
+ <ownedAttribute xmi:id="_jfIc5ZxgEeu216dzZOP2Cw" name="sectionFile" visibility="public" isOrdered="true">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EString"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIc5pxgEeu216dzZOP2Cw" name="widget" type="_jfJD2pxgEeu216dzZOP2Cw" isOrdered="true" association="_jfJDhJxgEeu216dzZOP2Cw"/>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIc55xgEeu216dzZOP2Cw" name="owner" type="_jfIczZxgEeu216dzZOP2Cw" isOrdered="true" isDerived="true" subsettedProperty="_jfIc65xgEeu216dzZOP2Cw" association="_jfJDhpxgEeu216dzZOP2Cw"/>
+ <ownedAttribute xmi:id="_jfIc5pxgEeu216dzZOP2Cw" name="widget" type="_jfJD2pxgEeu216dzZOP2Cw" isOrdered="true" association="_jfJDhJxgEeu216dzZOP2Cw"/>
+ <ownedAttribute xmi:id="_jfIc55xgEeu216dzZOP2Cw" name="owner" type="_jfIczZxgEeu216dzZOP2Cw" isOrdered="true" isDerived="true" subsettedProperty="_jfIc65xgEeu216dzZOP2Cw" association="_jfJDhpxgEeu216dzZOP2Cw"/>
+ <ownedAttribute xmi:id="_PQ3G4MqwEeuhj7ABGVZg5A" name="views" type="_jfJDiZxgEeu216dzZOP2Cw" isReadOnly="true" isDerived="true" association="_PQwZMMqwEeuhj7ABGVZg5A">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_PQ3t8MqwEeuhj7ABGVZg5A"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_PQ3t8cqwEeuhj7ABGVZg5A" value="*"/>
+ </ownedAttribute>
+ <ownedOperation xmi:id="_pTka0MqwEeuhj7ABGVZg5A" name="getViews" visibility="protected" isQuery="true">
+ <ownedParameter xmi:id="_xZsNYMqwEeuhj7ABGVZg5A" name="result" type="_jfJDiZxgEeu216dzZOP2Cw" direction="return" effect="read">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_D6MesMqyEeuhj7ABGVZg5A"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Ek_IIMqyEeuhj7ABGVZg5A" value="*"/>
+ </ownedParameter>
+ </ownedOperation>
</packagedElement>
<packagedElement xmi:type="uml:Class" xmi:id="_jfIc6JxgEeu216dzZOP2Cw" name="AbstractSection" isAbstract="true">
- <generalization xmi:type="uml:Generalization" xmi:id="_jfIc6ZxgEeu216dzZOP2Cw">
+ <generalization xmi:id="_jfIc6ZxgEeu216dzZOP2Cw">
<general xmi:type="uml:Class" href="../../org.eclipse.papyrus.infra.constraints/Model/Constraints.uml#_zg0XW5xgEeu216dzZOP2Cw"/>
</generalization>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIc6pxgEeu216dzZOP2Cw" name="name" visibility="public" isOrdered="true">
+ <generalization xmi:id="_vQel4MiGEeueo7rlLkmY8A" general="_oYyx0MiFEeueo7rlLkmY8A"/>
+ <ownedAttribute xmi:id="_jfIc6pxgEeu216dzZOP2Cw" name="name" visibility="public" isOrdered="true">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EString"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIc65xgEeu216dzZOP2Cw" name="tab" type="_jfIczZxgEeu216dzZOP2Cw" isOrdered="true" association="_jfIc7JxgEeu216dzZOP2Cw"/>
+ <ownedAttribute xmi:id="_jfIc65xgEeu216dzZOP2Cw" name="tab" type="_jfIczZxgEeu216dzZOP2Cw" isOrdered="true" association="_jfIc7JxgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="_jfIc7JxgEeu216dzZOP2Cw" memberEnd="_jfIc2ZxgEeu216dzZOP2Cw _jfIc65xgEeu216dzZOP2Cw"/>
<packagedElement xmi:type="uml:Class" xmi:id="_jfIc7ZxgEeu216dzZOP2Cw" name="Property">
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIc7pxgEeu216dzZOP2Cw" name="name" visibility="public" isOrdered="true">
+ <generalization xmi:id="_up_NoMiGEeueo7rlLkmY8A" general="_oYyx0MiFEeueo7rlLkmY8A"/>
+ <ownedAttribute xmi:id="_jfIc7pxgEeu216dzZOP2Cw" name="name" visibility="public" isOrdered="true">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EString"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIc75xgEeu216dzZOP2Cw" name="label" visibility="public" isOrdered="true">
+ <ownedAttribute xmi:id="_jfIc75xgEeu216dzZOP2Cw" name="label" visibility="public" isOrdered="true">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EString"/>
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfIc8JxgEeu216dzZOP2Cw"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIc8ZxgEeu216dzZOP2Cw" name="type" visibility="public" type="_jfIclZxgEeu216dzZOP2Cw" isOrdered="true"/>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIc8pxgEeu216dzZOP2Cw" name="contextElement" type="_jfIc_pxgEeu216dzZOP2Cw" isOrdered="true" association="_jfJDeJxgEeu216dzZOP2Cw">
+ <ownedAttribute xmi:id="_jfIc8ZxgEeu216dzZOP2Cw" name="type" visibility="public" type="_jfIclZxgEeu216dzZOP2Cw" isOrdered="true"/>
+ <ownedAttribute xmi:id="_jfIc8pxgEeu216dzZOP2Cw" name="contextElement" type="_jfIc_pxgEeu216dzZOP2Cw" isOrdered="true" association="_jfJDeJxgEeu216dzZOP2Cw">
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfIc85xgEeu216dzZOP2Cw"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIc9JxgEeu216dzZOP2Cw" name="multiplicity" visibility="public" isOrdered="true">
+ <ownedAttribute xmi:id="_jfIc9JxgEeu216dzZOP2Cw" name="multiplicity" visibility="public" isOrdered="true">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EInt"/>
<defaultValue xmi:type="uml:LiteralInteger" xmi:id="_jfIc9ZxgEeu216dzZOP2Cw" value="1">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EInt"/>
</defaultValue>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIc9pxgEeu216dzZOP2Cw" name="description" visibility="public" isOrdered="true">
+ <ownedAttribute xmi:id="_jfIc9pxgEeu216dzZOP2Cw" name="description" visibility="public" isOrdered="true">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EString"/>
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfIc95xgEeu216dzZOP2Cw"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIc-JxgEeu216dzZOP2Cw" name="redefinedProperties" type="_jfIc7ZxgEeu216dzZOP2Cw" isOrdered="true" association="_jfJDgZxgEeu216dzZOP2Cw">
+ <ownedAttribute xmi:id="_jfIc-JxgEeu216dzZOP2Cw" name="redefinedProperties" type="_jfIc7ZxgEeu216dzZOP2Cw" isOrdered="true" association="_jfJDgZxgEeu216dzZOP2Cw">
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfIc-ZxgEeu216dzZOP2Cw"/>
<upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_jfIc-pxgEeu216dzZOP2Cw" value="*"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIc-5xgEeu216dzZOP2Cw" name="redefinedByProperties" type="_jfIc7ZxgEeu216dzZOP2Cw" isOrdered="true" association="_jfJDgZxgEeu216dzZOP2Cw">
+ <ownedAttribute xmi:id="_jfIc-5xgEeu216dzZOP2Cw" name="redefinedByProperties" type="_jfIc7ZxgEeu216dzZOP2Cw" isOrdered="true" association="_jfJDgZxgEeu216dzZOP2Cw">
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfIc_JxgEeu216dzZOP2Cw"/>
<upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_jfIc_ZxgEeu216dzZOP2Cw" value="*"/>
</ownedAttribute>
</packagedElement>
<packagedElement xmi:type="uml:Class" xmi:id="_jfIc_pxgEeu216dzZOP2Cw" name="DataContextElement">
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfIc_5xgEeu216dzZOP2Cw" name="name" visibility="public" isOrdered="true">
+ <generalization xmi:id="_uJ0f0MiGEeueo7rlLkmY8A" general="_oYyx0MiFEeueo7rlLkmY8A"/>
+ <ownedAttribute xmi:id="_jfIc_5xgEeu216dzZOP2Cw" name="name" visibility="public" isOrdered="true">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EString"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfJDcJxgEeu216dzZOP2Cw" name="properties" type="_jfIc7ZxgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfJDeJxgEeu216dzZOP2Cw">
+ <ownedAttribute xmi:id="_jfJDcJxgEeu216dzZOP2Cw" name="properties" type="_jfIc7ZxgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfJDeJxgEeu216dzZOP2Cw">
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfJDcZxgEeu216dzZOP2Cw"/>
<upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_jfJDcpxgEeu216dzZOP2Cw" value="*"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfJDc5xgEeu216dzZOP2Cw" name="package" type="_jfJDeZxgEeu216dzZOP2Cw" isOrdered="true" association="_jfJDfpxgEeu216dzZOP2Cw">
+ <ownedAttribute xmi:id="_jfJDc5xgEeu216dzZOP2Cw" name="package" type="_jfJDeZxgEeu216dzZOP2Cw" isOrdered="true" association="_jfJDfpxgEeu216dzZOP2Cw">
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfJDdJxgEeu216dzZOP2Cw"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfJDdZxgEeu216dzZOP2Cw" name="supertypes" type="_jfIc_pxgEeu216dzZOP2Cw" isOrdered="true" association="_jfJDf5xgEeu216dzZOP2Cw">
+ <ownedAttribute xmi:id="_jfJDdZxgEeu216dzZOP2Cw" name="supertypes" type="_jfIc_pxgEeu216dzZOP2Cw" isOrdered="true" association="_jfJDf5xgEeu216dzZOP2Cw">
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfJDdpxgEeu216dzZOP2Cw"/>
<upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_jfJDd5xgEeu216dzZOP2Cw" value="*"/>
</ownedAttribute>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="_jfJDeJxgEeu216dzZOP2Cw" memberEnd="_jfJDcJxgEeu216dzZOP2Cw _jfIc8pxgEeu216dzZOP2Cw"/>
<packagedElement xmi:type="uml:Class" xmi:id="_jfJDeZxgEeu216dzZOP2Cw" name="DataContextPackage">
- <generalization xmi:type="uml:Generalization" xmi:id="_jfJDepxgEeu216dzZOP2Cw" general="_jfIc_pxgEeu216dzZOP2Cw"/>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfJDe5xgEeu216dzZOP2Cw" name="elements" type="_jfIc_pxgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfJDfpxgEeu216dzZOP2Cw">
+ <generalization xmi:id="_jfJDepxgEeu216dzZOP2Cw" general="_jfIc_pxgEeu216dzZOP2Cw"/>
+ <ownedAttribute xmi:id="_jfJDe5xgEeu216dzZOP2Cw" name="elements" type="_jfIc_pxgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfJDfpxgEeu216dzZOP2Cw">
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfJDfJxgEeu216dzZOP2Cw"/>
<upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_jfJDfZxgEeu216dzZOP2Cw" value="*"/>
</ownedAttribute>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="_jfJDfpxgEeu216dzZOP2Cw" memberEnd="_jfJDe5xgEeu216dzZOP2Cw _jfJDc5xgEeu216dzZOP2Cw"/>
<packagedElement xmi:type="uml:Association" xmi:id="_jfJDf5xgEeu216dzZOP2Cw" memberEnd="_jfJDdZxgEeu216dzZOP2Cw _jfJDgJxgEeu216dzZOP2Cw">
- <ownedEnd xmi:type="uml:Property" xmi:id="_jfJDgJxgEeu216dzZOP2Cw" type="_jfIc_pxgEeu216dzZOP2Cw" association="_jfJDf5xgEeu216dzZOP2Cw"/>
+ <ownedEnd xmi:id="_jfJDgJxgEeu216dzZOP2Cw" type="_jfIc_pxgEeu216dzZOP2Cw" association="_jfJDf5xgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="_jfJDgZxgEeu216dzZOP2Cw" memberEnd="_jfIc-5xgEeu216dzZOP2Cw _jfIc-JxgEeu216dzZOP2Cw"/>
<packagedElement xmi:type="uml:Class" xmi:id="_jfJDgpxgEeu216dzZOP2Cw" name="UnknownProperty">
- <generalization xmi:type="uml:Generalization" xmi:id="_jfJDg5xgEeu216dzZOP2Cw" general="_jfIc7ZxgEeu216dzZOP2Cw"/>
+ <generalization xmi:id="_jfJDg5xgEeu216dzZOP2Cw" general="_jfIc7ZxgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="_jfJDhJxgEeu216dzZOP2Cw" memberEnd="_jfIc5pxgEeu216dzZOP2Cw _jfJDhZxgEeu216dzZOP2Cw">
- <ownedEnd xmi:type="uml:Property" xmi:id="_jfJDhZxgEeu216dzZOP2Cw" type="_jfIc4pxgEeu216dzZOP2Cw" association="_jfJDhJxgEeu216dzZOP2Cw"/>
+ <ownedEnd xmi:id="_jfJDhZxgEeu216dzZOP2Cw" type="_jfIc4pxgEeu216dzZOP2Cw" association="_jfJDhJxgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="_jfJDhpxgEeu216dzZOP2Cw" memberEnd="_jfIc1pxgEeu216dzZOP2Cw _jfIc55xgEeu216dzZOP2Cw"/>
<packagedElement xmi:type="uml:Association" xmi:id="_jfJDh5xgEeu216dzZOP2Cw" memberEnd="_jfIcupxgEeu216dzZOP2Cw _jfJDiJxgEeu216dzZOP2Cw">
- <ownedEnd xmi:type="uml:Property" xmi:id="_jfJDiJxgEeu216dzZOP2Cw" type="_jfIcs5xgEeu216dzZOP2Cw" association="_jfJDh5xgEeu216dzZOP2Cw"/>
+ <ownedEnd xmi:id="_jfJDiJxgEeu216dzZOP2Cw" type="_jfIcs5xgEeu216dzZOP2Cw" association="_jfJDh5xgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Class" xmi:id="_jfJDiZxgEeu216dzZOP2Cw" name="View">
- <generalization xmi:type="uml:Generalization" xmi:id="_jfJDipxgEeu216dzZOP2Cw">
+ <generalization xmi:id="_jfJDipxgEeu216dzZOP2Cw">
<general xmi:type="uml:Class" href="../../org.eclipse.papyrus.infra.constraints/Model/Constraints.uml#_zg0XW5xgEeu216dzZOP2Cw"/>
</generalization>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfJDi5xgEeu216dzZOP2Cw" name="name" visibility="public" isOrdered="true">
+ <generalization xmi:id="_v4RlsMiGEeueo7rlLkmY8A" general="_oYyx0MiFEeueo7rlLkmY8A"/>
+ <ownedAttribute xmi:id="_jfJDi5xgEeu216dzZOP2Cw" name="name" visibility="public" isOrdered="true">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EString"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfJDjJxgEeu216dzZOP2Cw" name="sections" type="_jfIc4pxgEeu216dzZOP2Cw" isOrdered="true" association="_jfJDlJxgEeu216dzZOP2Cw">
+ <ownedAttribute xmi:id="_jfJDjJxgEeu216dzZOP2Cw" name="sections" type="_jfIc4pxgEeu216dzZOP2Cw" isOrdered="true" association="_jfJDlJxgEeu216dzZOP2Cw">
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfJDjZxgEeu216dzZOP2Cw"/>
<upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_jfJDjpxgEeu216dzZOP2Cw" value="*"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfJDj5xgEeu216dzZOP2Cw" name="context" type="_jfIcs5xgEeu216dzZOP2Cw" isOrdered="true" association="_jfJDlpxgEeu216dzZOP2Cw"/>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfJDkJxgEeu216dzZOP2Cw" name="automaticContext" visibility="public" isOrdered="true">
+ <ownedAttribute xmi:id="_jfJDj5xgEeu216dzZOP2Cw" name="context" type="_jfIcs5xgEeu216dzZOP2Cw" isOrdered="true" association="_jfJDlpxgEeu216dzZOP2Cw"/>
+ <ownedAttribute xmi:id="_jfJDkJxgEeu216dzZOP2Cw" name="automaticContext" visibility="public" isOrdered="true">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EBoolean"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfJDkZxgEeu216dzZOP2Cw" name="datacontexts" type="_jfIc_pxgEeu216dzZOP2Cw" isOrdered="true" association="_jfJDl5xgEeu216dzZOP2Cw">
+ <ownedAttribute xmi:id="_jfJDkZxgEeu216dzZOP2Cw" name="datacontexts" type="_jfIc_pxgEeu216dzZOP2Cw" isOrdered="true" association="_jfJDl5xgEeu216dzZOP2Cw">
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfJDkpxgEeu216dzZOP2Cw"/>
<upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_jfJDk5xgEeu216dzZOP2Cw" value="*"/>
</ownedAttribute>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="_jfJDlJxgEeu216dzZOP2Cw" memberEnd="_jfJDjJxgEeu216dzZOP2Cw _jfJDlZxgEeu216dzZOP2Cw">
- <ownedEnd xmi:type="uml:Property" xmi:id="_jfJDlZxgEeu216dzZOP2Cw" type="_jfJDiZxgEeu216dzZOP2Cw" association="_jfJDlJxgEeu216dzZOP2Cw"/>
+ <ownedEnd xmi:id="_jfJDlZxgEeu216dzZOP2Cw" type="_jfJDiZxgEeu216dzZOP2Cw" association="_jfJDlJxgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="_jfJDlpxgEeu216dzZOP2Cw" memberEnd="_jfIcvZxgEeu216dzZOP2Cw _jfJDj5xgEeu216dzZOP2Cw"/>
<packagedElement xmi:type="uml:Association" xmi:id="_jfJDl5xgEeu216dzZOP2Cw" memberEnd="_jfJDkZxgEeu216dzZOP2Cw _jfJDmJxgEeu216dzZOP2Cw">
- <ownedEnd xmi:type="uml:Property" xmi:id="_jfJDmJxgEeu216dzZOP2Cw" type="_jfJDiZxgEeu216dzZOP2Cw" association="_jfJDl5xgEeu216dzZOP2Cw"/>
+ <ownedEnd xmi:id="_jfJDmJxgEeu216dzZOP2Cw" type="_jfJDiZxgEeu216dzZOP2Cw" association="_jfJDl5xgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Class" xmi:id="_jfJDmZxgEeu216dzZOP2Cw" name="DataContextRoot">
- <generalization xmi:type="uml:Generalization" xmi:id="_jfJDmpxgEeu216dzZOP2Cw" general="_jfJDeZxgEeu216dzZOP2Cw"/>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfJDm5xgEeu216dzZOP2Cw" name="label" visibility="public" isOrdered="true">
+ <generalization xmi:id="_jfJDmpxgEeu216dzZOP2Cw" general="_jfJDeZxgEeu216dzZOP2Cw"/>
+ <ownedAttribute xmi:id="_jfJDm5xgEeu216dzZOP2Cw" name="label" visibility="public" isOrdered="true">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EString"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfJDnJxgEeu216dzZOP2Cw" name="modelElementFactory" type="_jfIceZxgEeu216dzZOP2Cw" isOrdered="true" association="_jfJDnZxgEeu216dzZOP2Cw"/>
+ <ownedAttribute xmi:id="_jfJDnJxgEeu216dzZOP2Cw" name="modelElementFactory" type="_jfIceZxgEeu216dzZOP2Cw" isOrdered="true" association="_jfJDnZxgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="_jfJDnZxgEeu216dzZOP2Cw" memberEnd="_jfJDnJxgEeu216dzZOP2Cw _jfJDnpxgEeu216dzZOP2Cw">
- <ownedEnd xmi:type="uml:Property" xmi:id="_jfJDnpxgEeu216dzZOP2Cw" type="_jfJDmZxgEeu216dzZOP2Cw" association="_jfJDnZxgEeu216dzZOP2Cw"/>
+ <ownedEnd xmi:id="_jfJDnpxgEeu216dzZOP2Cw" type="_jfJDmZxgEeu216dzZOP2Cw" association="_jfJDnZxgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="_jfJDn5xgEeu216dzZOP2Cw" memberEnd="_jfIcwJxgEeu216dzZOP2Cw _jfJDoJxgEeu216dzZOP2Cw">
- <ownedEnd xmi:type="uml:Property" xmi:id="_jfJDoJxgEeu216dzZOP2Cw" type="_jfIcs5xgEeu216dzZOP2Cw" association="_jfJDn5xgEeu216dzZOP2Cw"/>
+ <ownedEnd xmi:id="_jfJDoJxgEeu216dzZOP2Cw" type="_jfIcs5xgEeu216dzZOP2Cw" association="_jfJDn5xgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="_jfJDoZxgEeu216dzZOP2Cw" memberEnd="_jfIcw5xgEeu216dzZOP2Cw _jfJDopxgEeu216dzZOP2Cw">
- <ownedEnd xmi:type="uml:Property" xmi:id="_jfJDopxgEeu216dzZOP2Cw" type="_jfIcs5xgEeu216dzZOP2Cw" association="_jfJDoZxgEeu216dzZOP2Cw"/>
+ <ownedEnd xmi:id="_jfJDopxgEeu216dzZOP2Cw" type="_jfIcs5xgEeu216dzZOP2Cw" association="_jfJDoZxgEeu216dzZOP2Cw"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_lBHrYMiFEeueo7rlLkmY8A" name="Annotation">
+ <ownedAttribute xmi:id="_udSq4MiFEeueo7rlLkmY8A" name="element" type="_oYyx0MiFEeueo7rlLkmY8A" association="_ucxGcMiFEeueo7rlLkmY8A"/>
+ <ownedAttribute xmi:id="_95EcYMiFEeueo7rlLkmY8A" name="source">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="_O6YoUMiGEeueo7rlLkmY8A" name="references" association="_O6XaMMiGEeueo7rlLkmY8A">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/Ecore.metamodel.uml#EObject"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_O6YoUciGEeueo7rlLkmY8A"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_O6YoUsiGEeueo7rlLkmY8A" value="*"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="_WBGzYciGEeueo7rlLkmY8A" name="details" aggregation="composite" association="_WBGMUMiGEeueo7rlLkmY8A">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/Ecore.metamodel.uml#EStringToStringMapEntry"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_WBGzYsiGEeueo7rlLkmY8A"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_WBGzY8iGEeueo7rlLkmY8A" value="*"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_oYyx0MiFEeueo7rlLkmY8A" name="Annotatable" isAbstract="true">
+ <ownedAttribute xmi:id="_uc0w0MiFEeueo7rlLkmY8A" name="annotations" type="_lBHrYMiFEeueo7rlLkmY8A" aggregation="composite" association="_ucxGcMiFEeueo7rlLkmY8A">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_uc5CQMiFEeueo7rlLkmY8A"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_udGdoMiFEeueo7rlLkmY8A" value="*"/>
+ </ownedAttribute>
+ <ownedOperation xmi:id="_1MRO4MiGEeueo7rlLkmY8A" name="getAnnotation">
+ <ownedParameter xmi:id="_6yq2sMiGEeueo7rlLkmY8A" name="source" effect="read">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedParameter>
+ <ownedParameter xmi:id="_BOLhkMiHEeueo7rlLkmY8A" type="_lBHrYMiFEeueo7rlLkmY8A" direction="return" effect="read"/>
+ </ownedOperation>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_ucxGcMiFEeueo7rlLkmY8A" memberEnd="_uc0w0MiFEeueo7rlLkmY8A _udSq4MiFEeueo7rlLkmY8A">
+ <eAnnotations xmi:id="_uczisMiFEeueo7rlLkmY8A" source="org.eclipse.papyrus">
+ <details xmi:id="_uczisciFEeueo7rlLkmY8A" key="nature" value="UML_Nature"/>
+ </eAnnotations>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_O6XaMMiGEeueo7rlLkmY8A" memberEnd="_O6YoUMiGEeueo7rlLkmY8A _O6YoU8iGEeueo7rlLkmY8A">
+ <eAnnotations xmi:id="_O6YBQMiGEeueo7rlLkmY8A" source="org.eclipse.papyrus">
+ <details xmi:id="_O6YBQciGEeueo7rlLkmY8A" key="nature" value="UML_Nature"/>
+ </eAnnotations>
+ <ownedEnd xmi:id="_O6YoU8iGEeueo7rlLkmY8A" name="annotation" type="_lBHrYMiFEeueo7rlLkmY8A" association="_O6XaMMiGEeueo7rlLkmY8A">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_SES_kMiGEeueo7rlLkmY8A"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_SEd-sMiGEeueo7rlLkmY8A" value="*"/>
+ </ownedEnd>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_WBGMUMiGEeueo7rlLkmY8A" memberEnd="_WBGzYciGEeueo7rlLkmY8A _WBGzZMiGEeueo7rlLkmY8A">
+ <eAnnotations xmi:id="_WBGMUciGEeueo7rlLkmY8A" source="org.eclipse.papyrus">
+ <details xmi:id="_WBGzYMiGEeueo7rlLkmY8A" key="nature" value="UML_Nature"/>
+ </eAnnotations>
+ <ownedEnd xmi:id="_WBGzZMiGEeueo7rlLkmY8A" name="annotation" type="_lBHrYMiFEeueo7rlLkmY8A" association="_WBGMUMiGEeueo7rlLkmY8A"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_PQwZMMqwEeuhj7ABGVZg5A" memberEnd="_PQ3G4MqwEeuhj7ABGVZg5A _PQ3t8sqwEeuhj7ABGVZg5A">
+ <eAnnotations xmi:id="_PQ14wMqwEeuhj7ABGVZg5A" source="org.eclipse.papyrus">
+ <details xmi:id="_PQ2f0MqwEeuhj7ABGVZg5A" key="nature" value="UML_Nature"/>
+ </eAnnotations>
+ <ownedEnd xmi:id="_PQ3t8sqwEeuhj7ABGVZg5A" name="section" type="_jfIc4pxgEeu216dzZOP2Cw" association="_PQwZMMqwEeuhj7ABGVZg5A">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_cpMZ8MqwEeuhj7ABGVZg5A"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_cpbDcMqwEeuhj7ABGVZg5A" value="*"/>
+ </ownedEnd>
</packagedElement>
</packagedElement>
<packagedElement xmi:type="uml:Package" xmi:id="_jfJDo5xgEeu216dzZOP2Cw" name="ui" URI="http://www.eclipse.org/papyrus/properties/ui/0.9">
<packagedElement xmi:type="uml:Class" xmi:id="_jfJDpJxgEeu216dzZOP2Cw" name="Element"/>
<packagedElement xmi:type="uml:Class" xmi:id="_jfJDpZxgEeu216dzZOP2Cw" name="UIComponent" isAbstract="true">
- <generalization xmi:type="uml:Generalization" xmi:id="_jfJDppxgEeu216dzZOP2Cw" general="_jfJDpJxgEeu216dzZOP2Cw"/>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfJDp5xgEeu216dzZOP2Cw" name="attributes" type="_jfJDqpxgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfJDrZxgEeu216dzZOP2Cw">
+ <generalization xmi:id="_jfJDppxgEeu216dzZOP2Cw" general="_jfJDpJxgEeu216dzZOP2Cw"/>
+ <ownedAttribute xmi:id="_jfJDp5xgEeu216dzZOP2Cw" name="attributes" type="_jfJDqpxgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfJDrZxgEeu216dzZOP2Cw">
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfJDqJxgEeu216dzZOP2Cw"/>
<upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_jfJDqZxgEeu216dzZOP2Cw" value="*"/>
</ownedAttribute>
</packagedElement>
<packagedElement xmi:type="uml:Class" xmi:id="_jfJDqpxgEeu216dzZOP2Cw" name="WidgetAttribute" isAbstract="true">
- <generalization xmi:type="uml:Generalization" xmi:id="_jfJDq5xgEeu216dzZOP2Cw" general="_jfJDpJxgEeu216dzZOP2Cw"/>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfJDrJxgEeu216dzZOP2Cw" name="name" visibility="public" isOrdered="true">
+ <generalization xmi:id="_jfJDq5xgEeu216dzZOP2Cw" general="_jfJDpJxgEeu216dzZOP2Cw"/>
+ <ownedAttribute xmi:id="_jfJDrJxgEeu216dzZOP2Cw" name="name" visibility="public" isOrdered="true">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EString"/>
</ownedAttribute>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="_jfJDrZxgEeu216dzZOP2Cw" memberEnd="_jfJDp5xgEeu216dzZOP2Cw _jfJDrpxgEeu216dzZOP2Cw">
- <ownedEnd xmi:type="uml:Property" xmi:id="_jfJDrpxgEeu216dzZOP2Cw" type="_jfJDpZxgEeu216dzZOP2Cw" association="_jfJDrZxgEeu216dzZOP2Cw"/>
+ <ownedEnd xmi:id="_jfJDrpxgEeu216dzZOP2Cw" type="_jfJDpZxgEeu216dzZOP2Cw" association="_jfJDrZxgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Class" xmi:id="_jfJDr5xgEeu216dzZOP2Cw" name="Widget" isAbstract="true">
- <generalization xmi:type="uml:Generalization" xmi:id="_jfJDsJxgEeu216dzZOP2Cw" general="_jfJDpZxgEeu216dzZOP2Cw"/>
+ <generalization xmi:id="_jfJDsJxgEeu216dzZOP2Cw" general="_jfJDpZxgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Class" xmi:id="_jfJDsZxgEeu216dzZOP2Cw" name="StandardWidget">
- <generalization xmi:type="uml:Generalization" xmi:id="_jfJDspxgEeu216dzZOP2Cw" general="_jfJDr5xgEeu216dzZOP2Cw"/>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfJDs5xgEeu216dzZOP2Cw" name="widgetType" type="_jfIcfpxgEeu216dzZOP2Cw" isOrdered="true" association="_jfJDtJxgEeu216dzZOP2Cw"/>
+ <generalization xmi:id="_jfJDspxgEeu216dzZOP2Cw" general="_jfJDr5xgEeu216dzZOP2Cw"/>
+ <ownedAttribute xmi:id="_jfJDs5xgEeu216dzZOP2Cw" name="widgetType" type="_jfIcfpxgEeu216dzZOP2Cw" isOrdered="true" association="_jfJDtJxgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="_jfJDtJxgEeu216dzZOP2Cw" memberEnd="_jfJDs5xgEeu216dzZOP2Cw _jfJDtZxgEeu216dzZOP2Cw">
- <ownedEnd xmi:type="uml:Property" xmi:id="_jfJDtZxgEeu216dzZOP2Cw" type="_jfJDsZxgEeu216dzZOP2Cw" association="_jfJDtJxgEeu216dzZOP2Cw"/>
+ <ownedEnd xmi:id="_jfJDtZxgEeu216dzZOP2Cw" type="_jfJDsZxgEeu216dzZOP2Cw" association="_jfJDtJxgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Class" xmi:id="_jfJDtpxgEeu216dzZOP2Cw" name="PropertyEditor">
- <generalization xmi:type="uml:Generalization" xmi:id="_jfJDt5xgEeu216dzZOP2Cw" general="_jfJDr5xgEeu216dzZOP2Cw"/>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfJDuJxgEeu216dzZOP2Cw" name="property" type="_jfIc7ZxgEeu216dzZOP2Cw" isOrdered="true" association="_jfJDxJxgEeu216dzZOP2Cw"/>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfJDuZxgEeu216dzZOP2Cw" name="readOnly" visibility="public" isOrdered="true">
+ <generalization xmi:id="_jfJDt5xgEeu216dzZOP2Cw" general="_jfJDr5xgEeu216dzZOP2Cw"/>
+ <ownedAttribute xmi:id="_jfJDuJxgEeu216dzZOP2Cw" name="property" type="_jfIc7ZxgEeu216dzZOP2Cw" isOrdered="true" association="_jfJDxJxgEeu216dzZOP2Cw"/>
+ <ownedAttribute xmi:id="_jfJDuZxgEeu216dzZOP2Cw" name="readOnly" visibility="public" isOrdered="true">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EBoolean"/>
<defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_jfJDupxgEeu216dzZOP2Cw">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EBoolean"/>
</defaultValue>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfJDu5xgEeu216dzZOP2Cw" name="widgetType" type="_jfIckJxgEeu216dzZOP2Cw" isOrdered="true" association="_jfJDxpxgEeu216dzZOP2Cw"/>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfJDvJxgEeu216dzZOP2Cw" name="unresolvedProperty" type="_jfJDgpxgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfJDyJxgEeu216dzZOP2Cw">
+ <ownedAttribute xmi:id="_jfJDu5xgEeu216dzZOP2Cw" name="widgetType" type="_jfIckJxgEeu216dzZOP2Cw" isOrdered="true" association="_jfJDxpxgEeu216dzZOP2Cw"/>
+ <ownedAttribute xmi:id="_jfJDvJxgEeu216dzZOP2Cw" name="unresolvedProperty" type="_jfJDgpxgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfJDyJxgEeu216dzZOP2Cw">
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfJDvZxgEeu216dzZOP2Cw"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfJDvpxgEeu216dzZOP2Cw" name="contentProviderClass" visibility="public" isOrdered="true">
+ <ownedAttribute xmi:id="_jfJDvpxgEeu216dzZOP2Cw" name="contentProviderClass" visibility="public" isOrdered="true">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EString"/>
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfJDv5xgEeu216dzZOP2Cw"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfJDwJxgEeu216dzZOP2Cw" name="showLabel" visibility="public" isOrdered="true">
+ <ownedAttribute xmi:id="_jfJDwJxgEeu216dzZOP2Cw" name="showLabel" visibility="public" isOrdered="true">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EBoolean"/>
<defaultValue xmi:type="uml:LiteralBoolean" xmi:id="_jfJDwZxgEeu216dzZOP2Cw" value="true">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EBoolean"/>
</defaultValue>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfJDwpxgEeu216dzZOP2Cw" name="customLabel" visibility="public" isOrdered="true">
+ <ownedAttribute xmi:id="_jfJDwpxgEeu216dzZOP2Cw" name="customLabel" visibility="public" isOrdered="true">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EString"/>
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfJDw5xgEeu216dzZOP2Cw"/>
</ownedAttribute>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="_jfJDxJxgEeu216dzZOP2Cw" memberEnd="_jfJDuJxgEeu216dzZOP2Cw _jfJDxZxgEeu216dzZOP2Cw">
- <ownedEnd xmi:type="uml:Property" xmi:id="_jfJDxZxgEeu216dzZOP2Cw" type="_jfJDtpxgEeu216dzZOP2Cw" association="_jfJDxJxgEeu216dzZOP2Cw"/>
+ <ownedEnd xmi:id="_jfJDxZxgEeu216dzZOP2Cw" type="_jfJDtpxgEeu216dzZOP2Cw" association="_jfJDxJxgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="_jfJDxpxgEeu216dzZOP2Cw" memberEnd="_jfJDu5xgEeu216dzZOP2Cw _jfJDx5xgEeu216dzZOP2Cw">
- <ownedEnd xmi:type="uml:Property" xmi:id="_jfJDx5xgEeu216dzZOP2Cw" type="_jfJDtpxgEeu216dzZOP2Cw" association="_jfJDxpxgEeu216dzZOP2Cw"/>
+ <ownedEnd xmi:id="_jfJDx5xgEeu216dzZOP2Cw" type="_jfJDtpxgEeu216dzZOP2Cw" association="_jfJDxpxgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="_jfJDyJxgEeu216dzZOP2Cw" memberEnd="_jfJDvJxgEeu216dzZOP2Cw _jfJDyZxgEeu216dzZOP2Cw">
- <ownedEnd xmi:type="uml:Property" xmi:id="_jfJDyZxgEeu216dzZOP2Cw" type="_jfJDtpxgEeu216dzZOP2Cw" association="_jfJDyJxgEeu216dzZOP2Cw"/>
+ <ownedEnd xmi:id="_jfJDyZxgEeu216dzZOP2Cw" type="_jfJDtpxgEeu216dzZOP2Cw" association="_jfJDyJxgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Class" xmi:id="_jfJDypxgEeu216dzZOP2Cw" name="UnknownComponent">
- <generalization xmi:type="uml:Generalization" xmi:id="_jfJDy5xgEeu216dzZOP2Cw" general="_jfJDr5xgEeu216dzZOP2Cw"/>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfJDzJxgEeu216dzZOP2Cw" name="typeName" visibility="public" isOrdered="true">
+ <generalization xmi:id="_jfJDy5xgEeu216dzZOP2Cw" general="_jfJDr5xgEeu216dzZOP2Cw"/>
+ <ownedAttribute xmi:id="_jfJDzJxgEeu216dzZOP2Cw" name="typeName" visibility="public" isOrdered="true">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EString"/>
</ownedAttribute>
</packagedElement>
<packagedElement xmi:type="uml:Class" xmi:id="_jfJDzZxgEeu216dzZOP2Cw" name="Layout">
- <generalization xmi:type="uml:Generalization" xmi:id="_jfJDzpxgEeu216dzZOP2Cw" general="_jfJDpZxgEeu216dzZOP2Cw"/>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfJDz5xgEeu216dzZOP2Cw" name="layoutType" type="_jfIcopxgEeu216dzZOP2Cw" isOrdered="true" association="_jfJD0JxgEeu216dzZOP2Cw"/>
+ <generalization xmi:id="_jfJDzpxgEeu216dzZOP2Cw" general="_jfJDpZxgEeu216dzZOP2Cw"/>
+ <ownedAttribute xmi:id="_jfJDz5xgEeu216dzZOP2Cw" name="layoutType" type="_jfIcopxgEeu216dzZOP2Cw" isOrdered="true" association="_jfJD0JxgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="_jfJD0JxgEeu216dzZOP2Cw" memberEnd="_jfJDz5xgEeu216dzZOP2Cw _jfJD0ZxgEeu216dzZOP2Cw">
- <ownedEnd xmi:type="uml:Property" xmi:id="_jfJD0ZxgEeu216dzZOP2Cw" type="_jfJDzZxgEeu216dzZOP2Cw" association="_jfJD0JxgEeu216dzZOP2Cw"/>
+ <ownedEnd xmi:id="_jfJD0ZxgEeu216dzZOP2Cw" type="_jfJDzZxgEeu216dzZOP2Cw" association="_jfJD0JxgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Class" xmi:id="_jfJD0pxgEeu216dzZOP2Cw" name="ValueAttribute">
- <generalization xmi:type="uml:Generalization" xmi:id="_jfJD05xgEeu216dzZOP2Cw" general="_jfJDqpxgEeu216dzZOP2Cw"/>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfJD1JxgEeu216dzZOP2Cw" name="value" visibility="public" isOrdered="true">
+ <generalization xmi:id="_jfJD05xgEeu216dzZOP2Cw" general="_jfJDqpxgEeu216dzZOP2Cw"/>
+ <ownedAttribute xmi:id="_jfJD1JxgEeu216dzZOP2Cw" name="value" visibility="public" isOrdered="true">
<type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/EcorePrimitiveTypes.library.uml#EString"/>
</ownedAttribute>
</packagedElement>
<packagedElement xmi:type="uml:Class" xmi:id="_jfJD1ZxgEeu216dzZOP2Cw" name="ReferenceAttribute">
- <generalization xmi:type="uml:Generalization" xmi:id="_jfJD1pxgEeu216dzZOP2Cw" general="_jfJDqpxgEeu216dzZOP2Cw"/>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfJD15xgEeu216dzZOP2Cw" name="value" type="_jfJDpZxgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfJD2JxgEeu216dzZOP2Cw"/>
+ <generalization xmi:id="_jfJD1pxgEeu216dzZOP2Cw" general="_jfJDqpxgEeu216dzZOP2Cw"/>
+ <ownedAttribute xmi:id="_jfJD15xgEeu216dzZOP2Cw" name="value" type="_jfJDpZxgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfJD2JxgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="_jfJD2JxgEeu216dzZOP2Cw" memberEnd="_jfJD15xgEeu216dzZOP2Cw _jfJD2ZxgEeu216dzZOP2Cw">
- <ownedEnd xmi:type="uml:Property" xmi:id="_jfJD2ZxgEeu216dzZOP2Cw" type="_jfJD1ZxgEeu216dzZOP2Cw" association="_jfJD2JxgEeu216dzZOP2Cw"/>
+ <ownedEnd xmi:id="_jfJD2ZxgEeu216dzZOP2Cw" type="_jfJD1ZxgEeu216dzZOP2Cw" association="_jfJD2JxgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Class" xmi:id="_jfJD2pxgEeu216dzZOP2Cw" name="CompositeWidget">
- <generalization xmi:type="uml:Generalization" xmi:id="_jfJD25xgEeu216dzZOP2Cw" general="_jfJDr5xgEeu216dzZOP2Cw"/>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfJD3JxgEeu216dzZOP2Cw" name="layout" type="_jfJDzZxgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfJD4ZxgEeu216dzZOP2Cw"/>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfJD3ZxgEeu216dzZOP2Cw" name="widgets" type="_jfJDr5xgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfJD45xgEeu216dzZOP2Cw">
+ <generalization xmi:id="_jfJD25xgEeu216dzZOP2Cw" general="_jfJDr5xgEeu216dzZOP2Cw"/>
+ <ownedAttribute xmi:id="_jfJD3JxgEeu216dzZOP2Cw" name="layout" type="_jfJDzZxgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfJD4ZxgEeu216dzZOP2Cw"/>
+ <ownedAttribute xmi:id="_jfJD3ZxgEeu216dzZOP2Cw" name="widgets" type="_jfJDr5xgEeu216dzZOP2Cw" isOrdered="true" aggregation="composite" association="_jfJD45xgEeu216dzZOP2Cw">
<lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jfJD3pxgEeu216dzZOP2Cw"/>
<upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_jfJD35xgEeu216dzZOP2Cw" value="*"/>
</ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_jfJD4JxgEeu216dzZOP2Cw" name="widgetType" type="_jfIcnpxgEeu216dzZOP2Cw" isOrdered="true" association="_jfJD5ZxgEeu216dzZOP2Cw"/>
+ <ownedAttribute xmi:id="_jfJD4JxgEeu216dzZOP2Cw" name="widgetType" type="_jfIcnpxgEeu216dzZOP2Cw" isOrdered="true" association="_jfJD5ZxgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="_jfJD4ZxgEeu216dzZOP2Cw" memberEnd="_jfJD3JxgEeu216dzZOP2Cw _jfJD4pxgEeu216dzZOP2Cw">
- <ownedEnd xmi:type="uml:Property" xmi:id="_jfJD4pxgEeu216dzZOP2Cw" type="_jfJD2pxgEeu216dzZOP2Cw" association="_jfJD4ZxgEeu216dzZOP2Cw"/>
+ <ownedEnd xmi:id="_jfJD4pxgEeu216dzZOP2Cw" type="_jfJD2pxgEeu216dzZOP2Cw" association="_jfJD4ZxgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="_jfJD45xgEeu216dzZOP2Cw" memberEnd="_jfJD3ZxgEeu216dzZOP2Cw _jfJD5JxgEeu216dzZOP2Cw">
- <ownedEnd xmi:type="uml:Property" xmi:id="_jfJD5JxgEeu216dzZOP2Cw" type="_jfJD2pxgEeu216dzZOP2Cw" association="_jfJD45xgEeu216dzZOP2Cw"/>
+ <ownedEnd xmi:id="_jfJD5JxgEeu216dzZOP2Cw" type="_jfJD2pxgEeu216dzZOP2Cw" association="_jfJD45xgEeu216dzZOP2Cw"/>
</packagedElement>
<packagedElement xmi:type="uml:Association" xmi:id="_jfJD5ZxgEeu216dzZOP2Cw" memberEnd="_jfJD4JxgEeu216dzZOP2Cw _jfJD5pxgEeu216dzZOP2Cw">
- <ownedEnd xmi:type="uml:Property" xmi:id="_jfJD5pxgEeu216dzZOP2Cw" type="_jfJD2pxgEeu216dzZOP2Cw" association="_jfJD5ZxgEeu216dzZOP2Cw"/>
+ <ownedEnd xmi:id="_jfJD5pxgEeu216dzZOP2Cw" type="_jfJD2pxgEeu216dzZOP2Cw" association="_jfJD5ZxgEeu216dzZOP2Cw"/>
</packagedElement>
</packagedElement>
- <profileApplication xmi:type="uml:ProfileApplication" xmi:id="_jfJD55xgEeu216dzZOP2Cw">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_jfJD6JxgEeu216dzZOP2Cw" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <profileApplication xmi:id="_jfJD55xgEeu216dzZOP2Cw">
+ <eAnnotations xmi:id="_jfJD6JxgEeu216dzZOP2Cw" source="http://www.eclipse.org/uml2/2.0.0/UML">
<references xmi:type="ecore:EPackage" href="pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA"/>
</eAnnotations>
- <appliedProfile xmi:type="uml:Profile" href="pathmap://UML_PROFILES/Ecore.profile.uml#_0"/>
+ <appliedProfile href="pathmap://UML_PROFILES/Ecore.profile.uml#_0"/>
</profileApplication>
</uml:Model>
<Ecore:EPackage xmi:id="_jfJD6ZxgEeu216dzZOP2Cw" base_Package="_jfIcYJxgEeu216dzZOP2Cw" nsPrefix="properties"/>
@@ -564,4 +635,7 @@ just the name of the context.</body>
<Ecore:EReference xmi:id="_jfMGzZxgEeu216dzZOP2Cw" base_Property="_jfJD3JxgEeu216dzZOP2Cw"/>
<Ecore:EReference xmi:id="_jfMGzpxgEeu216dzZOP2Cw" base_Property="_jfJD3ZxgEeu216dzZOP2Cw"/>
<Ecore:EReference xmi:id="_jfMGz5xgEeu216dzZOP2Cw" base_Property="_jfJD4JxgEeu216dzZOP2Cw"/>
+ <Ecore:EClass xmi:id="_ntz7IMiFEeueo7rlLkmY8A" base_Class="_lBHrYMiFEeueo7rlLkmY8A"/>
+ <Ecore:EClass xmi:id="_p7SfUMiFEeueo7rlLkmY8A" base_Class="_oYyx0MiFEeueo7rlLkmY8A"/>
+ <Ecore:EOperation xmi:id="_z880UMqwEeuhj7ABGVZg5A" base_Operation="_pTka0MqwEeuhj7ABGVZg5A" visibility="None"/>
</xmi:XMI>
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/build.properties b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/build.properties
index f06fb5850c3..26ffc1b5551 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/build.properties
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/build.properties
@@ -11,4 +11,4 @@ bin.includes = .,\
jars.compile.order=.
src.includes = about.html
source.. = src-gen/,\
- src/ \ No newline at end of file
+ src/
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/plugin.properties b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/plugin.properties
index 926cd0a2fee..52ef49b5e4f 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/plugin.properties
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/plugin.properties
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2011, 2016 CEA LIST, Christian W. Damus, and others.
+# Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
#
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Eclipse Public License 2.0
@@ -10,7 +10,7 @@
#
# Contributors:
# CEA LIST - Initial API and implementation
-# Christian W. Damus - bug 485220
+# Christian W. Damus - bugs 485220, 573986
#
pluginName = Papyrus properties model
providerName = Eclipse Modeling Project
@@ -19,3 +19,5 @@ pluginDescription=An EMF Model for defining a Property view configuration. It co
extension-point.contexts = Properties Contexts
extension-point.environment = Properties Environments
+_UI_Environment_content_type = Papyrus Properties Environment Model File
+_UI_Contexts_content_type = Papyrus Properties Context Model File
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/plugin.xml b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/plugin.xml
index 72cce9d2b94..7b71f1f60e4 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/plugin.xml
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/plugin.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.0"?>
<!--
- Copyright (c) 2011, 2016 CEA LIST, Christian W. Damus, and others.
+ Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
All rights reserved. This program and the accompanying materials
are made available under the terms of the Eclipse Public License 2.0
@@ -12,7 +12,7 @@
Contributors:
CEA LIST - Initial API and implementation
- Christian W. Damus - bug 485220
+ Christian W. Damus - bugs 485220, 573986
-->
<plugin>
<extension-point id="contexts" name="%extension-point.contexts" schema="schema/contexts.exsd"/>
@@ -25,13 +25,28 @@
genModel="Model/properties.genmodel"/>
</extension>
- <extension point="org.eclipse.emf.ecore.extension_parser">
- <!-- @generated Properties -->
+ <extension point="org.eclipse.emf.ecore.content_parser">
+ <!-- @generated properties -->
<parser
- type="environment"
+ contentTypeIdentifier="org.eclipse.papyrus.infra.properties.environment"
class="org.eclipse.papyrus.infra.properties.environment.util.EnvironmentResourceFactoryImpl"/>
</extension>
+ <extension point="org.eclipse.core.contenttype.contentTypes">
+ <!-- @generated properties -->
+ <content-type
+ base-type="org.eclipse.emf.ecore.xmi"
+ file-extensions="environment,xmi"
+ id="org.eclipse.papyrus.infra.properties.environment"
+ name="%_UI_Environment_content_type"
+ priority="normal">
+ <describer class="org.eclipse.emf.ecore.xmi.impl.RootXMLContentHandlerImpl$Describer">
+ <parameter name="namespace" value="http://www.eclipse.org/papyrus/properties/environment/0.9"/>
+ <parameter name="kind" value="xmi"/>
+ </describer>
+ </content-type>
+ </extension>
+
<extension point="org.eclipse.emf.ecore.generated_package">
<package
uri="http://www.eclipse.org/papyrus/properties/contexts/0.9"
@@ -39,13 +54,27 @@
genModel="Model/properties.genmodel"/>
</extension>
- <extension point="org.eclipse.emf.ecore.extension_parser">
- <!-- @generated Properties -->
+ <extension point="org.eclipse.emf.ecore.content_parser">
<parser
- type="ctx"
+ contentTypeIdentifier="org.eclipse.papyrus.infra.properties.context"
class="org.eclipse.papyrus.infra.properties.contexts.util.ContextsResourceFactoryImpl"/>
</extension>
+ <extension point="org.eclipse.core.contenttype.contentTypes">
+ <!-- @generated properties -->
+ <content-type
+ base-type="org.eclipse.emf.ecore.xmi"
+ file-extensions="ctx"
+ id="org.eclipse.papyrus.infra.properties.context"
+ name="%_UI_Contexts_content_type"
+ priority="normal">
+ <describer class="org.eclipse.emf.ecore.xmi.impl.RootXMLContentHandlerImpl$Describer">
+ <parameter name="namespace" value="http://www.eclipse.org/papyrus/properties/contexts/0.9"/>
+ <parameter name="kind" value="xmi"/>
+ </describer>
+ </content-type>
+ </extension>
+
<extension point="org.eclipse.emf.ecore.generated_package">
<package
uri="http://www.eclipse.org/papyrus/properties/ui/0.9"
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/AbstractSection.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/AbstractSection.java
index 956bd83c774..645cbb9f3ad 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/AbstractSection.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/AbstractSection.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2011-2021 CEA LIST and others.
+ * Copyright (c) 2011-2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,6 +10,7 @@
*
* Contributors:
* Remi Schnekenburger - Initial API and implementation
+ * Christian W. Damus - bug 573986
*/
package org.eclipse.papyrus.infra.properties.contexts;
@@ -32,7 +33,7 @@ import org.eclipse.papyrus.infra.constraints.DisplayUnit;
* @model abstract="true"
* @generated
*/
-public interface AbstractSection extends DisplayUnit {
+public interface AbstractSection extends DisplayUnit, Annotatable {
/**
* Returns the value of the '<em><b>Name</b></em>' attribute.
* <!-- begin-user-doc -->
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/Annotatable.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/Annotatable.java
new file mode 100644
index 00000000000..c63ae0fc16a
--- /dev/null
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/Annotatable.java
@@ -0,0 +1,63 @@
+/**
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ */
+package org.eclipse.papyrus.infra.properties.contexts;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Annotatable</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.papyrus.infra.properties.contexts.Annotatable#getAnnotations <em>Annotations</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.papyrus.infra.properties.contexts.ContextsPackage#getAnnotatable()
+ * @model abstract="true"
+ * @generated
+ */
+public interface Annotatable extends EObject {
+ /**
+ * Returns the value of the '<em><b>Annotations</b></em>' containment reference list.
+ * The list contents are of type {@link org.eclipse.papyrus.infra.properties.contexts.Annotation}.
+ * It is bidirectional and its opposite is '{@link org.eclipse.papyrus.infra.properties.contexts.Annotation#getElement <em>Element</em>}'.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Annotations</em>' containment reference list isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ * @return the value of the '<em>Annotations</em>' containment reference list.
+ * @see org.eclipse.papyrus.infra.properties.contexts.ContextsPackage#getAnnotatable_Annotations()
+ * @see org.eclipse.papyrus.infra.properties.contexts.Annotation#getElement
+ * @model opposite="element" containment="true" ordered="false"
+ * @generated
+ */
+ EList<Annotation> getAnnotations();
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @model required="true" ordered="false" sourceDataType="org.eclipse.uml2.types.String" sourceRequired="true" sourceOrdered="false"
+ * @generated
+ */
+ Annotation getAnnotation(String source);
+
+} // Annotatable
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/Annotation.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/Annotation.java
new file mode 100644
index 00000000000..ce79bd51cd2
--- /dev/null
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/Annotation.java
@@ -0,0 +1,128 @@
+/**
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ */
+package org.eclipse.papyrus.infra.properties.contexts;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.EMap;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Annotation</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.papyrus.infra.properties.contexts.Annotation#getSource <em>Source</em>}</li>
+ * <li>{@link org.eclipse.papyrus.infra.properties.contexts.Annotation#getReferences <em>References</em>}</li>
+ * <li>{@link org.eclipse.papyrus.infra.properties.contexts.Annotation#getDetails <em>Details</em>}</li>
+ * <li>{@link org.eclipse.papyrus.infra.properties.contexts.Annotation#getElement <em>Element</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.papyrus.infra.properties.contexts.ContextsPackage#getAnnotation()
+ * @model
+ * @generated
+ */
+public interface Annotation extends EObject {
+ /**
+ * Returns the value of the '<em><b>Source</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Source</em>' attribute isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ * @return the value of the '<em>Source</em>' attribute.
+ * @see #setSource(String)
+ * @see org.eclipse.papyrus.infra.properties.contexts.ContextsPackage#getAnnotation_Source()
+ * @model dataType="org.eclipse.uml2.types.String" required="true" ordered="false"
+ * @generated
+ */
+ String getSource();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.papyrus.infra.properties.contexts.Annotation#getSource <em>Source</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Source</em>' attribute.
+ * @see #getSource()
+ * @generated
+ */
+ void setSource(String value);
+
+ /**
+ * Returns the value of the '<em><b>References</b></em>' reference list.
+ * The list contents are of type {@link org.eclipse.emf.ecore.EObject}.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>References</em>' reference list isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ * @return the value of the '<em>References</em>' reference list.
+ * @see org.eclipse.papyrus.infra.properties.contexts.ContextsPackage#getAnnotation_References()
+ * @model ordered="false"
+ * @generated
+ */
+ EList<EObject> getReferences();
+
+ /**
+ * Returns the value of the '<em><b>Details</b></em>' map.
+ * The key is of type {@link java.lang.String},
+ * and the value is of type {@link java.lang.String},
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Details</em>' map isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ * @return the value of the '<em>Details</em>' map.
+ * @see org.eclipse.papyrus.infra.properties.contexts.ContextsPackage#getAnnotation_Details()
+ * @model mapType="org.eclipse.emf.ecore.EStringToStringMapEntry&lt;org.eclipse.emf.ecore.EString, org.eclipse.emf.ecore.EString&gt;" ordered="false"
+ * @generated
+ */
+ EMap<String, String> getDetails();
+
+ /**
+ * Returns the value of the '<em><b>Element</b></em>' container reference.
+ * It is bidirectional and its opposite is '{@link org.eclipse.papyrus.infra.properties.contexts.Annotatable#getAnnotations <em>Annotations</em>}'.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Element</em>' container reference isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ * @return the value of the '<em>Element</em>' container reference.
+ * @see #setElement(Annotatable)
+ * @see org.eclipse.papyrus.infra.properties.contexts.ContextsPackage#getAnnotation_Element()
+ * @see org.eclipse.papyrus.infra.properties.contexts.Annotatable#getAnnotations
+ * @model opposite="annotations" required="true" transient="false" ordered="false"
+ * @generated
+ */
+ Annotatable getElement();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.papyrus.infra.properties.contexts.Annotation#getElement <em>Element</em>}' container reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @param value the new value of the '<em>Element</em>' container reference.
+ * @see #getElement()
+ * @generated
+ */
+ void setElement(Annotatable value);
+
+} // Annotation
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/Context.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/Context.java
index 98b692999ff..b8b72318dc0 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/Context.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/Context.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011, 2015 CEA LIST, Christian W. Damus, and others.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -11,7 +11,7 @@
* Contributors:
* CEA LIST - Initial API and implementation
* Christian W. Damus - add prototype reference to Context (CDO)
- * Christian W. Damus - bug 482927
+ * Christian W. Damus - bugs 482927, 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts;
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/ContextsFactory.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/ContextsFactory.java
index 37dbb88457e..c2c6a6b3db6 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/ContextsFactory.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/ContextsFactory.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,6 +10,7 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts;
@@ -69,6 +70,15 @@ public interface ContextsFactory extends EFactory {
Section createSection();
/**
+ * Returns a new object of class '<em>Annotation</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return a new object of class '<em>Annotation</em>'.
+ * @generated
+ */
+ Annotation createAnnotation();
+
+ /**
* Returns a new object of class '<em>Data Context Element</em>'.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/ContextsPackage.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/ContextsPackage.java
index a69aaa25587..e2e563251e2 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/ContextsPackage.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/ContextsPackage.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011, 2015, 2017 CEA LIST, Christian W. Damus, and others.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -11,13 +11,14 @@
* Contributors:
* CEA LIST - Initial API and implementation
* Christian W. Damus - add prototype reference to Context (CDO)
- * Christian W. Damus - bug 482927
+ * Christian W. Damus - bugs 482927, 573986
* Vincent Lorenzo - Bug 520271
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EOperation;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EcorePackage;
@@ -65,6 +66,14 @@ public interface ContextsPackage extends EPackage {
String eNS_PREFIX = "contexts";
/**
+ * The package content type ID.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ String eCONTENT_TYPE = "org.eclipse.papyrus.infra.properties.context"; //$NON-NLS-1$
+
+ /**
* The singleton instance of the package.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
@@ -307,7 +316,7 @@ public interface ContextsPackage extends EPackage {
* @see org.eclipse.papyrus.infra.properties.contexts.impl.ContextsPackageImpl#getView()
* @generated
*/
- int VIEW = 8;
+ int VIEW = 10;
/**
* The meta object id for the '{@link org.eclipse.papyrus.infra.properties.contexts.impl.AbstractSectionImpl <em>Abstract Section</em>}' class.
@@ -338,13 +347,22 @@ public interface ContextsPackage extends EPackage {
int ABSTRACT_SECTION__ELEMENT_MULTIPLICITY = ConstraintsPackage.DISPLAY_UNIT__ELEMENT_MULTIPLICITY;
/**
+ * The feature id for the '<em><b>Annotations</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int ABSTRACT_SECTION__ANNOTATIONS = ConstraintsPackage.DISPLAY_UNIT_FEATURE_COUNT + 0;
+
+ /**
* The feature id for the '<em><b>Name</b></em>' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
* @ordered
*/
- int ABSTRACT_SECTION__NAME = ConstraintsPackage.DISPLAY_UNIT_FEATURE_COUNT + 0;
+ int ABSTRACT_SECTION__NAME = ConstraintsPackage.DISPLAY_UNIT_FEATURE_COUNT + 1;
/**
* The feature id for the '<em><b>Tab</b></em>' container reference.
@@ -353,7 +371,7 @@ public interface ContextsPackage extends EPackage {
* @generated
* @ordered
*/
- int ABSTRACT_SECTION__TAB = ConstraintsPackage.DISPLAY_UNIT_FEATURE_COUNT + 1;
+ int ABSTRACT_SECTION__TAB = ConstraintsPackage.DISPLAY_UNIT_FEATURE_COUNT + 2;
/**
* The number of structural features of the '<em>Abstract Section</em>' class.
@@ -362,7 +380,16 @@ public interface ContextsPackage extends EPackage {
* @generated
* @ordered
*/
- int ABSTRACT_SECTION_FEATURE_COUNT = ConstraintsPackage.DISPLAY_UNIT_FEATURE_COUNT + 2;
+ int ABSTRACT_SECTION_FEATURE_COUNT = ConstraintsPackage.DISPLAY_UNIT_FEATURE_COUNT + 3;
+
+ /**
+ * The operation id for the '<em>Get Annotation</em>' operation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int ABSTRACT_SECTION___GET_ANNOTATION__STRING = ConstraintsPackage.DISPLAY_UNIT_OPERATION_COUNT + 0;
/**
* The number of operations of the '<em>Abstract Section</em>' class.
@@ -371,7 +398,7 @@ public interface ContextsPackage extends EPackage {
* @generated
* @ordered
*/
- int ABSTRACT_SECTION_OPERATION_COUNT = ConstraintsPackage.DISPLAY_UNIT_OPERATION_COUNT + 0;
+ int ABSTRACT_SECTION_OPERATION_COUNT = ConstraintsPackage.DISPLAY_UNIT_OPERATION_COUNT + 1;
/**
* The meta object id for the '{@link org.eclipse.papyrus.infra.properties.contexts.impl.SectionImpl <em>Section</em>}' class.
@@ -402,6 +429,15 @@ public interface ContextsPackage extends EPackage {
int SECTION__ELEMENT_MULTIPLICITY = ABSTRACT_SECTION__ELEMENT_MULTIPLICITY;
/**
+ * The feature id for the '<em><b>Annotations</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int SECTION__ANNOTATIONS = ABSTRACT_SECTION__ANNOTATIONS;
+
+ /**
* The feature id for the '<em><b>Name</b></em>' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
@@ -438,13 +474,22 @@ public interface ContextsPackage extends EPackage {
int SECTION__WIDGET = ABSTRACT_SECTION_FEATURE_COUNT + 1;
/**
+ * The feature id for the '<em><b>Views</b></em>' reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int SECTION__VIEWS = ABSTRACT_SECTION_FEATURE_COUNT + 2;
+
+ /**
* The feature id for the '<em><b>Owner</b></em>' reference.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
* @ordered
*/
- int SECTION__OWNER = ABSTRACT_SECTION_FEATURE_COUNT + 2;
+ int SECTION__OWNER = ABSTRACT_SECTION_FEATURE_COUNT + 3;
/**
* The number of structural features of the '<em>Section</em>' class.
@@ -453,7 +498,25 @@ public interface ContextsPackage extends EPackage {
* @generated
* @ordered
*/
- int SECTION_FEATURE_COUNT = ABSTRACT_SECTION_FEATURE_COUNT + 3;
+ int SECTION_FEATURE_COUNT = ABSTRACT_SECTION_FEATURE_COUNT + 4;
+
+ /**
+ * The operation id for the '<em>Get Annotation</em>' operation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int SECTION___GET_ANNOTATION__STRING = ABSTRACT_SECTION___GET_ANNOTATION__STRING;
+
+ /**
+ * The operation id for the '<em>Get Views</em>' operation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int SECTION___GET_VIEWS = ABSTRACT_SECTION_OPERATION_COUNT + 0;
/**
* The number of operations of the '<em>Section</em>' class.
@@ -462,7 +525,117 @@ public interface ContextsPackage extends EPackage {
* @generated
* @ordered
*/
- int SECTION_OPERATION_COUNT = ABSTRACT_SECTION_OPERATION_COUNT + 0;
+ int SECTION_OPERATION_COUNT = ABSTRACT_SECTION_OPERATION_COUNT + 1;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.papyrus.infra.properties.contexts.impl.AnnotatableImpl <em>Annotatable</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.papyrus.infra.properties.contexts.impl.AnnotatableImpl
+ * @see org.eclipse.papyrus.infra.properties.contexts.impl.ContextsPackageImpl#getAnnotatable()
+ * @generated
+ */
+ int ANNOTATABLE = 4;
+
+ /**
+ * The feature id for the '<em><b>Annotations</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int ANNOTATABLE__ANNOTATIONS = 0;
+
+ /**
+ * The number of structural features of the '<em>Annotatable</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int ANNOTATABLE_FEATURE_COUNT = 1;
+
+ /**
+ * The operation id for the '<em>Get Annotation</em>' operation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int ANNOTATABLE___GET_ANNOTATION__STRING = 0;
+
+ /**
+ * The number of operations of the '<em>Annotatable</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int ANNOTATABLE_OPERATION_COUNT = 1;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.papyrus.infra.properties.contexts.impl.AnnotationImpl <em>Annotation</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.papyrus.infra.properties.contexts.impl.AnnotationImpl
+ * @see org.eclipse.papyrus.infra.properties.contexts.impl.ContextsPackageImpl#getAnnotation()
+ * @generated
+ */
+ int ANNOTATION = 5;
+
+ /**
+ * The feature id for the '<em><b>Source</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int ANNOTATION__SOURCE = 0;
+
+ /**
+ * The feature id for the '<em><b>References</b></em>' reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int ANNOTATION__REFERENCES = 1;
+
+ /**
+ * The feature id for the '<em><b>Details</b></em>' map.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int ANNOTATION__DETAILS = 2;
+
+ /**
+ * The feature id for the '<em><b>Element</b></em>' container reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int ANNOTATION__ELEMENT = 3;
+
+ /**
+ * The number of structural features of the '<em>Annotation</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int ANNOTATION_FEATURE_COUNT = 4;
+
+ /**
+ * The number of operations of the '<em>Annotation</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int ANNOTATION_OPERATION_COUNT = 0;
/**
* The meta object id for the '{@link org.eclipse.papyrus.infra.properties.contexts.impl.DataContextElementImpl <em>Data Context Element</em>}' class.
@@ -472,7 +645,7 @@ public interface ContextsPackage extends EPackage {
* @see org.eclipse.papyrus.infra.properties.contexts.impl.ContextsPackageImpl#getDataContextElement()
* @generated
*/
- int DATA_CONTEXT_ELEMENT = 5;
+ int DATA_CONTEXT_ELEMENT = 7;
/**
* The meta object id for the '{@link org.eclipse.papyrus.infra.properties.contexts.impl.PropertyImpl <em>Property</em>}' class.
@@ -482,7 +655,16 @@ public interface ContextsPackage extends EPackage {
* @see org.eclipse.papyrus.infra.properties.contexts.impl.ContextsPackageImpl#getProperty()
* @generated
*/
- int PROPERTY = 4;
+ int PROPERTY = 6;
+
+ /**
+ * The feature id for the '<em><b>Annotations</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int PROPERTY__ANNOTATIONS = ANNOTATABLE__ANNOTATIONS;
/**
* The feature id for the '<em><b>Name</b></em>' attribute.
@@ -491,7 +673,7 @@ public interface ContextsPackage extends EPackage {
* @generated
* @ordered
*/
- int PROPERTY__NAME = 0;
+ int PROPERTY__NAME = ANNOTATABLE_FEATURE_COUNT + 0;
/**
* The feature id for the '<em><b>Label</b></em>' attribute.
@@ -500,7 +682,7 @@ public interface ContextsPackage extends EPackage {
* @generated
* @ordered
*/
- int PROPERTY__LABEL = 1;
+ int PROPERTY__LABEL = ANNOTATABLE_FEATURE_COUNT + 1;
/**
* The feature id for the '<em><b>Type</b></em>' attribute.
@@ -509,7 +691,7 @@ public interface ContextsPackage extends EPackage {
* @generated
* @ordered
*/
- int PROPERTY__TYPE = 2;
+ int PROPERTY__TYPE = ANNOTATABLE_FEATURE_COUNT + 2;
/**
* The feature id for the '<em><b>Context Element</b></em>' container reference.
@@ -518,7 +700,7 @@ public interface ContextsPackage extends EPackage {
* @generated
* @ordered
*/
- int PROPERTY__CONTEXT_ELEMENT = 3;
+ int PROPERTY__CONTEXT_ELEMENT = ANNOTATABLE_FEATURE_COUNT + 3;
/**
* The feature id for the '<em><b>Multiplicity</b></em>' attribute.
@@ -527,7 +709,7 @@ public interface ContextsPackage extends EPackage {
* @generated
* @ordered
*/
- int PROPERTY__MULTIPLICITY = 4;
+ int PROPERTY__MULTIPLICITY = ANNOTATABLE_FEATURE_COUNT + 4;
/**
* The feature id for the '<em><b>Description</b></em>' attribute.
@@ -536,7 +718,7 @@ public interface ContextsPackage extends EPackage {
* @generated
* @ordered
*/
- int PROPERTY__DESCRIPTION = 5;
+ int PROPERTY__DESCRIPTION = ANNOTATABLE_FEATURE_COUNT + 5;
/**
* The feature id for the '<em><b>Redefined Properties</b></em>' reference list.
@@ -545,7 +727,7 @@ public interface ContextsPackage extends EPackage {
* @generated
* @ordered
*/
- int PROPERTY__REDEFINED_PROPERTIES = 6;
+ int PROPERTY__REDEFINED_PROPERTIES = ANNOTATABLE_FEATURE_COUNT + 6;
/**
* The feature id for the '<em><b>Redefined By Properties</b></em>' reference list.
@@ -554,7 +736,7 @@ public interface ContextsPackage extends EPackage {
* @generated
* @ordered
*/
- int PROPERTY__REDEFINED_BY_PROPERTIES = 7;
+ int PROPERTY__REDEFINED_BY_PROPERTIES = ANNOTATABLE_FEATURE_COUNT + 7;
/**
* The number of structural features of the '<em>Property</em>' class.
@@ -563,7 +745,16 @@ public interface ContextsPackage extends EPackage {
* @generated
* @ordered
*/
- int PROPERTY_FEATURE_COUNT = 8;
+ int PROPERTY_FEATURE_COUNT = ANNOTATABLE_FEATURE_COUNT + 8;
+
+ /**
+ * The operation id for the '<em>Get Annotation</em>' operation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int PROPERTY___GET_ANNOTATION__STRING = ANNOTATABLE___GET_ANNOTATION__STRING;
/**
* The number of operations of the '<em>Property</em>' class.
@@ -572,7 +763,16 @@ public interface ContextsPackage extends EPackage {
* @generated
* @ordered
*/
- int PROPERTY_OPERATION_COUNT = 0;
+ int PROPERTY_OPERATION_COUNT = ANNOTATABLE_OPERATION_COUNT + 0;
+
+ /**
+ * The feature id for the '<em><b>Annotations</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DATA_CONTEXT_ELEMENT__ANNOTATIONS = ANNOTATABLE__ANNOTATIONS;
/**
* The feature id for the '<em><b>Name</b></em>' attribute.
@@ -581,7 +781,7 @@ public interface ContextsPackage extends EPackage {
* @generated
* @ordered
*/
- int DATA_CONTEXT_ELEMENT__NAME = 0;
+ int DATA_CONTEXT_ELEMENT__NAME = ANNOTATABLE_FEATURE_COUNT + 0;
/**
* The feature id for the '<em><b>Package</b></em>' container reference.
@@ -590,7 +790,7 @@ public interface ContextsPackage extends EPackage {
* @generated
* @ordered
*/
- int DATA_CONTEXT_ELEMENT__PACKAGE = 1;
+ int DATA_CONTEXT_ELEMENT__PACKAGE = ANNOTATABLE_FEATURE_COUNT + 1;
/**
* The feature id for the '<em><b>Supertypes</b></em>' reference list.
@@ -599,7 +799,7 @@ public interface ContextsPackage extends EPackage {
* @generated
* @ordered
*/
- int DATA_CONTEXT_ELEMENT__SUPERTYPES = 2;
+ int DATA_CONTEXT_ELEMENT__SUPERTYPES = ANNOTATABLE_FEATURE_COUNT + 2;
/**
* The feature id for the '<em><b>Properties</b></em>' containment reference list.
@@ -608,7 +808,7 @@ public interface ContextsPackage extends EPackage {
* @generated
* @ordered
*/
- int DATA_CONTEXT_ELEMENT__PROPERTIES = 3;
+ int DATA_CONTEXT_ELEMENT__PROPERTIES = ANNOTATABLE_FEATURE_COUNT + 3;
/**
* The number of structural features of the '<em>Data Context Element</em>' class.
@@ -617,7 +817,16 @@ public interface ContextsPackage extends EPackage {
* @generated
* @ordered
*/
- int DATA_CONTEXT_ELEMENT_FEATURE_COUNT = 4;
+ int DATA_CONTEXT_ELEMENT_FEATURE_COUNT = ANNOTATABLE_FEATURE_COUNT + 4;
+
+ /**
+ * The operation id for the '<em>Get Annotation</em>' operation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DATA_CONTEXT_ELEMENT___GET_ANNOTATION__STRING = ANNOTATABLE___GET_ANNOTATION__STRING;
/**
* The number of operations of the '<em>Data Context Element</em>' class.
@@ -626,7 +835,7 @@ public interface ContextsPackage extends EPackage {
* @generated
* @ordered
*/
- int DATA_CONTEXT_ELEMENT_OPERATION_COUNT = 0;
+ int DATA_CONTEXT_ELEMENT_OPERATION_COUNT = ANNOTATABLE_OPERATION_COUNT + 0;
/**
* The meta object id for the '{@link org.eclipse.papyrus.infra.properties.contexts.impl.UnknownPropertyImpl <em>Unknown Property</em>}' class.
@@ -636,7 +845,7 @@ public interface ContextsPackage extends EPackage {
* @see org.eclipse.papyrus.infra.properties.contexts.impl.ContextsPackageImpl#getUnknownProperty()
* @generated
*/
- int UNKNOWN_PROPERTY = 7;
+ int UNKNOWN_PROPERTY = 9;
/**
* The meta object id for the '{@link org.eclipse.papyrus.infra.properties.contexts.impl.DataContextPackageImpl <em>Data Context Package</em>}' class.
@@ -646,7 +855,16 @@ public interface ContextsPackage extends EPackage {
* @see org.eclipse.papyrus.infra.properties.contexts.impl.ContextsPackageImpl#getDataContextPackage()
* @generated
*/
- int DATA_CONTEXT_PACKAGE = 6;
+ int DATA_CONTEXT_PACKAGE = 8;
+
+ /**
+ * The feature id for the '<em><b>Annotations</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DATA_CONTEXT_PACKAGE__ANNOTATIONS = DATA_CONTEXT_ELEMENT__ANNOTATIONS;
/**
* The feature id for the '<em><b>Name</b></em>' attribute.
@@ -703,6 +921,15 @@ public interface ContextsPackage extends EPackage {
int DATA_CONTEXT_PACKAGE_FEATURE_COUNT = DATA_CONTEXT_ELEMENT_FEATURE_COUNT + 1;
/**
+ * The operation id for the '<em>Get Annotation</em>' operation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DATA_CONTEXT_PACKAGE___GET_ANNOTATION__STRING = DATA_CONTEXT_ELEMENT___GET_ANNOTATION__STRING;
+
+ /**
* The number of operations of the '<em>Data Context Package</em>' class.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
@@ -712,6 +939,15 @@ public interface ContextsPackage extends EPackage {
int DATA_CONTEXT_PACKAGE_OPERATION_COUNT = DATA_CONTEXT_ELEMENT_OPERATION_COUNT + 0;
/**
+ * The feature id for the '<em><b>Annotations</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int UNKNOWN_PROPERTY__ANNOTATIONS = PROPERTY__ANNOTATIONS;
+
+ /**
* The feature id for the '<em><b>Name</b></em>' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
@@ -793,6 +1029,15 @@ public interface ContextsPackage extends EPackage {
int UNKNOWN_PROPERTY_FEATURE_COUNT = PROPERTY_FEATURE_COUNT + 0;
/**
+ * The operation id for the '<em>Get Annotation</em>' operation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int UNKNOWN_PROPERTY___GET_ANNOTATION__STRING = PROPERTY___GET_ANNOTATION__STRING;
+
+ /**
* The number of operations of the '<em>Unknown Property</em>' class.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
@@ -820,13 +1065,22 @@ public interface ContextsPackage extends EPackage {
int VIEW__ELEMENT_MULTIPLICITY = ConstraintsPackage.DISPLAY_UNIT__ELEMENT_MULTIPLICITY;
/**
+ * The feature id for the '<em><b>Annotations</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int VIEW__ANNOTATIONS = ConstraintsPackage.DISPLAY_UNIT_FEATURE_COUNT + 0;
+
+ /**
* The feature id for the '<em><b>Name</b></em>' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
* @ordered
*/
- int VIEW__NAME = ConstraintsPackage.DISPLAY_UNIT_FEATURE_COUNT + 0;
+ int VIEW__NAME = ConstraintsPackage.DISPLAY_UNIT_FEATURE_COUNT + 1;
/**
* The feature id for the '<em><b>Sections</b></em>' reference list.
@@ -835,7 +1089,16 @@ public interface ContextsPackage extends EPackage {
* @generated
* @ordered
*/
- int VIEW__SECTIONS = ConstraintsPackage.DISPLAY_UNIT_FEATURE_COUNT + 1;
+ int VIEW__SECTIONS = ConstraintsPackage.DISPLAY_UNIT_FEATURE_COUNT + 2;
+
+ /**
+ * The feature id for the '<em><b>Context</b></em>' container reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int VIEW__CONTEXT = ConstraintsPackage.DISPLAY_UNIT_FEATURE_COUNT + 3;
/**
* The feature id for the '<em><b>Automatic Context</b></em>' attribute.
@@ -844,7 +1107,7 @@ public interface ContextsPackage extends EPackage {
* @generated
* @ordered
*/
- int VIEW__AUTOMATIC_CONTEXT = ConstraintsPackage.DISPLAY_UNIT_FEATURE_COUNT + 2;
+ int VIEW__AUTOMATIC_CONTEXT = ConstraintsPackage.DISPLAY_UNIT_FEATURE_COUNT + 4;
/**
* The feature id for the '<em><b>Datacontexts</b></em>' reference list.
@@ -853,25 +1116,25 @@ public interface ContextsPackage extends EPackage {
* @generated
* @ordered
*/
- int VIEW__DATACONTEXTS = ConstraintsPackage.DISPLAY_UNIT_FEATURE_COUNT + 3;
+ int VIEW__DATACONTEXTS = ConstraintsPackage.DISPLAY_UNIT_FEATURE_COUNT + 5;
/**
- * The feature id for the '<em><b>Context</b></em>' container reference.
+ * The number of structural features of the '<em>View</em>' class.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
* @ordered
*/
- int VIEW__CONTEXT = ConstraintsPackage.DISPLAY_UNIT_FEATURE_COUNT + 4;
+ int VIEW_FEATURE_COUNT = ConstraintsPackage.DISPLAY_UNIT_FEATURE_COUNT + 6;
/**
- * The number of structural features of the '<em>View</em>' class.
+ * The operation id for the '<em>Get Annotation</em>' operation.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
* @ordered
*/
- int VIEW_FEATURE_COUNT = ConstraintsPackage.DISPLAY_UNIT_FEATURE_COUNT + 5;
+ int VIEW___GET_ANNOTATION__STRING = ConstraintsPackage.DISPLAY_UNIT_OPERATION_COUNT + 0;
/**
* The number of operations of the '<em>View</em>' class.
@@ -880,7 +1143,7 @@ public interface ContextsPackage extends EPackage {
* @generated
* @ordered
*/
- int VIEW_OPERATION_COUNT = ConstraintsPackage.DISPLAY_UNIT_OPERATION_COUNT + 0;
+ int VIEW_OPERATION_COUNT = ConstraintsPackage.DISPLAY_UNIT_OPERATION_COUNT + 1;
/**
* The meta object id for the '{@link org.eclipse.papyrus.infra.properties.contexts.impl.DataContextRootImpl <em>Data Context Root</em>}' class.
@@ -890,7 +1153,16 @@ public interface ContextsPackage extends EPackage {
* @see org.eclipse.papyrus.infra.properties.contexts.impl.ContextsPackageImpl#getDataContextRoot()
* @generated
*/
- int DATA_CONTEXT_ROOT = 9;
+ int DATA_CONTEXT_ROOT = 11;
+
+ /**
+ * The feature id for the '<em><b>Annotations</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DATA_CONTEXT_ROOT__ANNOTATIONS = DATA_CONTEXT_PACKAGE__ANNOTATIONS;
/**
* The feature id for the '<em><b>Name</b></em>' attribute.
@@ -966,6 +1238,15 @@ public interface ContextsPackage extends EPackage {
/**
+ * The operation id for the '<em>Get Annotation</em>' operation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ * @ordered
+ */
+ int DATA_CONTEXT_ROOT___GET_ANNOTATION__STRING = DATA_CONTEXT_PACKAGE___GET_ANNOTATION__STRING;
+
+ /**
* The number of operations of the '<em>Data Context Root</em>' class.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
@@ -1280,6 +1561,91 @@ public interface ContextsPackage extends EPackage {
EReference getAbstractSection_Tab();
/**
+ * Returns the meta object for class '{@link org.eclipse.papyrus.infra.properties.contexts.Annotatable <em>Annotatable</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>Annotatable</em>'.
+ * @see org.eclipse.papyrus.infra.properties.contexts.Annotatable
+ * @generated
+ */
+ EClass getAnnotatable();
+
+ /**
+ * Returns the meta object for the containment reference list '{@link org.eclipse.papyrus.infra.properties.contexts.Annotatable#getAnnotations <em>Annotations</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the containment reference list '<em>Annotations</em>'.
+ * @see org.eclipse.papyrus.infra.properties.contexts.Annotatable#getAnnotations()
+ * @see #getAnnotatable()
+ * @generated
+ */
+ EReference getAnnotatable_Annotations();
+
+ /**
+ * Returns the meta object for the '{@link org.eclipse.papyrus.infra.properties.contexts.Annotatable#getAnnotation(java.lang.String) <em>Get Annotation</em>}' operation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the '<em>Get Annotation</em>' operation.
+ * @see org.eclipse.papyrus.infra.properties.contexts.Annotatable#getAnnotation(java.lang.String)
+ * @generated
+ */
+ EOperation getAnnotatable__GetAnnotation__String();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.papyrus.infra.properties.contexts.Annotation <em>Annotation</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for class '<em>Annotation</em>'.
+ * @see org.eclipse.papyrus.infra.properties.contexts.Annotation
+ * @generated
+ */
+ EClass getAnnotation();
+
+ /**
+ * Returns the meta object for the attribute '{@link org.eclipse.papyrus.infra.properties.contexts.Annotation#getSource <em>Source</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the attribute '<em>Source</em>'.
+ * @see org.eclipse.papyrus.infra.properties.contexts.Annotation#getSource()
+ * @see #getAnnotation()
+ * @generated
+ */
+ EAttribute getAnnotation_Source();
+
+ /**
+ * Returns the meta object for the reference list '{@link org.eclipse.papyrus.infra.properties.contexts.Annotation#getReferences <em>References</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the reference list '<em>References</em>'.
+ * @see org.eclipse.papyrus.infra.properties.contexts.Annotation#getReferences()
+ * @see #getAnnotation()
+ * @generated
+ */
+ EReference getAnnotation_References();
+
+ /**
+ * Returns the meta object for the map '{@link org.eclipse.papyrus.infra.properties.contexts.Annotation#getDetails <em>Details</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the map '<em>Details</em>'.
+ * @see org.eclipse.papyrus.infra.properties.contexts.Annotation#getDetails()
+ * @see #getAnnotation()
+ * @generated
+ */
+ EReference getAnnotation_Details();
+
+ /**
+ * Returns the meta object for the container reference '{@link org.eclipse.papyrus.infra.properties.contexts.Annotation#getElement <em>Element</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the container reference '<em>Element</em>'.
+ * @see org.eclipse.papyrus.infra.properties.contexts.Annotation#getElement()
+ * @see #getAnnotation()
+ * @generated
+ */
+ EReference getAnnotation_Element();
+
+ /**
* Returns the meta object for class '{@link org.eclipse.papyrus.infra.properties.contexts.Section <em>Section</em>}'.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
@@ -1312,6 +1678,17 @@ public interface ContextsPackage extends EPackage {
EReference getSection_Widget();
/**
+ * Returns the meta object for the reference list '{@link org.eclipse.papyrus.infra.properties.contexts.Section#getViews <em>Views</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the reference list '<em>Views</em>'.
+ * @see org.eclipse.papyrus.infra.properties.contexts.Section#getViews()
+ * @see #getSection()
+ * @generated
+ */
+ EReference getSection_Views();
+
+ /**
* Returns the meta object for the reference '{@link org.eclipse.papyrus.infra.properties.contexts.Section#getOwner <em>Owner</em>}'.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
@@ -1323,6 +1700,16 @@ public interface ContextsPackage extends EPackage {
EReference getSection_Owner();
/**
+ * Returns the meta object for the '{@link org.eclipse.papyrus.infra.properties.contexts.Section#getViews() <em>Get Views</em>}' operation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return the meta object for the '<em>Get Views</em>' operation.
+ * @see org.eclipse.papyrus.infra.properties.contexts.Section#getViews()
+ * @generated
+ */
+ EOperation getSection__GetViews();
+
+ /**
* Returns the meta object for class '{@link org.eclipse.papyrus.infra.properties.contexts.DataContextElement <em>Data Context Element</em>}'.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
@@ -1793,6 +2180,74 @@ public interface ContextsPackage extends EPackage {
EReference ABSTRACT_SECTION__TAB = eINSTANCE.getAbstractSection_Tab();
/**
+ * The meta object literal for the '{@link org.eclipse.papyrus.infra.properties.contexts.impl.AnnotatableImpl <em>Annotatable</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.papyrus.infra.properties.contexts.impl.AnnotatableImpl
+ * @see org.eclipse.papyrus.infra.properties.contexts.impl.ContextsPackageImpl#getAnnotatable()
+ * @generated
+ */
+ EClass ANNOTATABLE = eINSTANCE.getAnnotatable();
+
+ /**
+ * The meta object literal for the '<em><b>Annotations</b></em>' containment reference list feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference ANNOTATABLE__ANNOTATIONS = eINSTANCE.getAnnotatable_Annotations();
+
+ /**
+ * The meta object literal for the '<em><b>Get Annotation</b></em>' operation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EOperation ANNOTATABLE___GET_ANNOTATION__STRING = eINSTANCE.getAnnotatable__GetAnnotation__String();
+
+ /**
+ * The meta object literal for the '{@link org.eclipse.papyrus.infra.properties.contexts.impl.AnnotationImpl <em>Annotation</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see org.eclipse.papyrus.infra.properties.contexts.impl.AnnotationImpl
+ * @see org.eclipse.papyrus.infra.properties.contexts.impl.ContextsPackageImpl#getAnnotation()
+ * @generated
+ */
+ EClass ANNOTATION = eINSTANCE.getAnnotation();
+
+ /**
+ * The meta object literal for the '<em><b>Source</b></em>' attribute feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EAttribute ANNOTATION__SOURCE = eINSTANCE.getAnnotation_Source();
+
+ /**
+ * The meta object literal for the '<em><b>References</b></em>' reference list feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference ANNOTATION__REFERENCES = eINSTANCE.getAnnotation_References();
+
+ /**
+ * The meta object literal for the '<em><b>Details</b></em>' map feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference ANNOTATION__DETAILS = eINSTANCE.getAnnotation_Details();
+
+ /**
+ * The meta object literal for the '<em><b>Element</b></em>' container reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference ANNOTATION__ELEMENT = eINSTANCE.getAnnotation_Element();
+
+ /**
* The meta object literal for the '{@link org.eclipse.papyrus.infra.properties.contexts.impl.SectionImpl <em>Section</em>}' class.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
@@ -1819,6 +2274,14 @@ public interface ContextsPackage extends EPackage {
EReference SECTION__WIDGET = eINSTANCE.getSection_Widget();
/**
+ * The meta object literal for the '<em><b>Views</b></em>' reference list feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EReference SECTION__VIEWS = eINSTANCE.getSection_Views();
+
+ /**
* The meta object literal for the '<em><b>Owner</b></em>' reference feature.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
@@ -1827,6 +2290,14 @@ public interface ContextsPackage extends EPackage {
EReference SECTION__OWNER = eINSTANCE.getSection_Owner();
/**
+ * The meta object literal for the '<em><b>Get Views</b></em>' operation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ EOperation SECTION___GET_VIEWS = eINSTANCE.getSection__GetViews();
+
+ /**
* The meta object literal for the '{@link org.eclipse.papyrus.infra.properties.contexts.impl.DataContextElementImpl <em>Data Context Element</em>}' class.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/DataContextElement.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/DataContextElement.java
index e31afefdd29..0825a018563 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/DataContextElement.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/DataContextElement.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,11 +10,11 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts;
import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
/**
* <!-- begin-user-doc -->
@@ -35,7 +35,7 @@ import org.eclipse.emf.ecore.EObject;
* @model
* @generated
*/
-public interface DataContextElement extends EObject {
+public interface DataContextElement extends Annotatable {
/**
* Returns the value of the '<em><b>Name</b></em>' attribute.
* <!-- begin-user-doc -->
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/DataContextPackage.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/DataContextPackage.java
index 16da7f1f693..8e5615c6b37 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/DataContextPackage.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/DataContextPackage.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,6 +10,7 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts;
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/DataContextRoot.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/DataContextRoot.java
index e5ff7a1657f..fd838abab73 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/DataContextRoot.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/DataContextRoot.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,6 +10,7 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts;
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/Property.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/Property.java
index b05b26f63ad..1b886314cb4 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/Property.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/Property.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011, 2017 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -11,11 +11,11 @@
* Contributors:
* CEA LIST - Initial API and implementation
* Vincent Lorenzo - Bug 520271
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts;
import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
import org.eclipse.papyrus.infra.properties.environment.Type;
/**
@@ -41,7 +41,7 @@ import org.eclipse.papyrus.infra.properties.environment.Type;
* @model
* @generated
*/
-public interface Property extends EObject {
+public interface Property extends Annotatable {
/**
* Returns the value of the '<em><b>Name</b></em>' attribute.
* <!-- begin-user-doc -->
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/Section.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/Section.java
index e16a599162b..97228b35247 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/Section.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/Section.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,9 +10,11 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts;
+import org.eclipse.emf.common.util.EList;
import org.eclipse.papyrus.infra.properties.ui.CompositeWidget;
/**
@@ -26,6 +28,7 @@ import org.eclipse.papyrus.infra.properties.ui.CompositeWidget;
* <ul>
* <li>{@link org.eclipse.papyrus.infra.properties.contexts.Section#getSectionFile <em>Section File</em>}</li>
* <li>{@link org.eclipse.papyrus.infra.properties.contexts.Section#getWidget <em>Widget</em>}</li>
+ * <li>{@link org.eclipse.papyrus.infra.properties.contexts.Section#getViews <em>Views</em>}</li>
* <li>{@link org.eclipse.papyrus.infra.properties.contexts.Section#getOwner <em>Owner</em>}</li>
* </ul>
*
@@ -85,6 +88,22 @@ public interface Section extends AbstractSection {
void setWidget(CompositeWidget value);
/**
+ * Returns the value of the '<em><b>Views</b></em>' reference list.
+ * The list contents are of type {@link org.eclipse.papyrus.infra.properties.contexts.View}.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Views</em>' reference list isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ * @return the value of the '<em>Views</em>' reference list.
+ * @see org.eclipse.papyrus.infra.properties.contexts.ContextsPackage#getSection_Views()
+ * @model transient="true" changeable="false" volatile="true" derived="true" ordered="false"
+ * @generated
+ */
+ EList<View> getViews();
+
+ /**
* Returns the value of the '<em><b>Owner</b></em>' reference.
* It is bidirectional and its opposite is '{@link org.eclipse.papyrus.infra.properties.contexts.Tab#getSections <em>Sections</em>}'.
* <p>
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/Tab.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/Tab.java
index 82a07fb1f8c..6c442a009b1 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/Tab.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/Tab.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,6 +10,7 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts;
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/View.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/View.java
index 4d899f9be2a..7b236cb474a 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/View.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/View.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,6 +10,7 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts;
@@ -27,16 +28,16 @@ import org.eclipse.papyrus.infra.constraints.DisplayUnit;
* <ul>
* <li>{@link org.eclipse.papyrus.infra.properties.contexts.View#getName <em>Name</em>}</li>
* <li>{@link org.eclipse.papyrus.infra.properties.contexts.View#getSections <em>Sections</em>}</li>
+ * <li>{@link org.eclipse.papyrus.infra.properties.contexts.View#getContext <em>Context</em>}</li>
* <li>{@link org.eclipse.papyrus.infra.properties.contexts.View#isAutomaticContext <em>Automatic Context</em>}</li>
* <li>{@link org.eclipse.papyrus.infra.properties.contexts.View#getDatacontexts <em>Datacontexts</em>}</li>
- * <li>{@link org.eclipse.papyrus.infra.properties.contexts.View#getContext <em>Context</em>}</li>
* </ul>
*
* @see org.eclipse.papyrus.infra.properties.contexts.ContextsPackage#getView()
* @model
* @generated
*/
-public interface View extends DisplayUnit {
+public interface View extends DisplayUnit, Annotatable {
/**
* Returns the value of the '<em><b>Name</b></em>' attribute.
* <!-- begin-user-doc -->
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/AbstractSectionImpl.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/AbstractSectionImpl.java
index 873c1eeb01a..4a5148182f6 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/AbstractSectionImpl.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/AbstractSectionImpl.java
@@ -1,5 +1,5 @@
/**
- * Copyright (c) 2011-2021 CEA LIST and others.
+ * Copyright (c) 2011-2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,19 +10,29 @@
*
* Contributors:
* Remi Schnekenburger - Initial API and implementation
+ * Christian W. Damus - bug 573986
*/
package org.eclipse.papyrus.infra.properties.contexts.impl;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Collection;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.util.InternalEList;
import org.eclipse.papyrus.infra.constraints.impl.DisplayUnitImpl;
import org.eclipse.papyrus.infra.properties.contexts.AbstractSection;
+import org.eclipse.papyrus.infra.properties.contexts.Annotatable;
+import org.eclipse.papyrus.infra.properties.contexts.Annotation;
import org.eclipse.papyrus.infra.properties.contexts.ContextsPackage;
import org.eclipse.papyrus.infra.properties.contexts.Tab;
+import org.eclipse.papyrus.infra.properties.contexts.operations.AnnotatableOperations;
+import org.eclipse.uml2.common.util.CacheAdapter;
/**
* <!-- begin-user-doc -->
@@ -32,6 +42,7 @@ import org.eclipse.papyrus.infra.properties.contexts.Tab;
* The following features are implemented:
* </p>
* <ul>
+ * <li>{@link org.eclipse.papyrus.infra.properties.contexts.impl.AbstractSectionImpl#getAnnotations <em>Annotations</em>}</li>
* <li>{@link org.eclipse.papyrus.infra.properties.contexts.impl.AbstractSectionImpl#getName <em>Name</em>}</li>
* <li>{@link org.eclipse.papyrus.infra.properties.contexts.impl.AbstractSectionImpl#getTab <em>Tab</em>}</li>
* </ul>
@@ -40,6 +51,16 @@ import org.eclipse.papyrus.infra.properties.contexts.Tab;
*/
public abstract class AbstractSectionImpl extends DisplayUnitImpl implements AbstractSection {
/**
+ * The cached value of the '{@link #getAnnotations() <em>Annotations</em>}' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getAnnotations()
+ * @generated
+ * @ordered
+ */
+ protected EList<Annotation> annotations;
+
+ /**
* The default value of the '{@link #getName() <em>Name</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
@@ -84,6 +105,19 @@ public abstract class AbstractSectionImpl extends DisplayUnitImpl implements Abs
* @generated
*/
@Override
+ public EList<Annotation> getAnnotations() {
+ if (annotations == null) {
+ annotations = new EObjectContainmentWithInverseEList<Annotation>(Annotation.class, this, ContextsPackage.ABSTRACT_SECTION__ANNOTATIONS, ContextsPackage.ANNOTATION__ELEMENT);
+ }
+ return annotations;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
public String getName() {
return name;
}
@@ -149,9 +183,21 @@ public abstract class AbstractSectionImpl extends DisplayUnitImpl implements Abs
* <!-- end-user-doc -->
* @generated
*/
+ public Annotation getAnnotation(String source) {
+ return AnnotatableOperations.getAnnotation(this, source);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @SuppressWarnings("unchecked")
@Override
public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
switch (featureID) {
+ case ContextsPackage.ABSTRACT_SECTION__ANNOTATIONS:
+ return ((InternalEList<InternalEObject>)(InternalEList<?>)getAnnotations()).basicAdd(otherEnd, msgs);
case ContextsPackage.ABSTRACT_SECTION__TAB:
if (eInternalContainer() != null)
msgs = eBasicRemoveFromContainer(msgs);
@@ -168,6 +214,8 @@ public abstract class AbstractSectionImpl extends DisplayUnitImpl implements Abs
@Override
public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
switch (featureID) {
+ case ContextsPackage.ABSTRACT_SECTION__ANNOTATIONS:
+ return ((InternalEList<?>)getAnnotations()).basicRemove(otherEnd, msgs);
case ContextsPackage.ABSTRACT_SECTION__TAB:
return basicSetTab(null, msgs);
}
@@ -196,6 +244,8 @@ public abstract class AbstractSectionImpl extends DisplayUnitImpl implements Abs
@Override
public Object eGet(int featureID, boolean resolve, boolean coreType) {
switch (featureID) {
+ case ContextsPackage.ABSTRACT_SECTION__ANNOTATIONS:
+ return getAnnotations();
case ContextsPackage.ABSTRACT_SECTION__NAME:
return getName();
case ContextsPackage.ABSTRACT_SECTION__TAB:
@@ -209,9 +259,14 @@ public abstract class AbstractSectionImpl extends DisplayUnitImpl implements Abs
* <!-- end-user-doc -->
* @generated
*/
+ @SuppressWarnings("unchecked")
@Override
public void eSet(int featureID, Object newValue) {
switch (featureID) {
+ case ContextsPackage.ABSTRACT_SECTION__ANNOTATIONS:
+ getAnnotations().clear();
+ getAnnotations().addAll((Collection<? extends Annotation>)newValue);
+ return;
case ContextsPackage.ABSTRACT_SECTION__NAME:
setName((String)newValue);
return;
@@ -230,6 +285,9 @@ public abstract class AbstractSectionImpl extends DisplayUnitImpl implements Abs
@Override
public void eUnset(int featureID) {
switch (featureID) {
+ case ContextsPackage.ABSTRACT_SECTION__ANNOTATIONS:
+ getAnnotations().clear();
+ return;
case ContextsPackage.ABSTRACT_SECTION__NAME:
setName(NAME_EDEFAULT);
return;
@@ -248,6 +306,8 @@ public abstract class AbstractSectionImpl extends DisplayUnitImpl implements Abs
@Override
public boolean eIsSet(int featureID) {
switch (featureID) {
+ case ContextsPackage.ABSTRACT_SECTION__ANNOTATIONS:
+ return annotations != null && !annotations.isEmpty();
case ContextsPackage.ABSTRACT_SECTION__NAME:
return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
case ContextsPackage.ABSTRACT_SECTION__TAB:
@@ -262,6 +322,68 @@ public abstract class AbstractSectionImpl extends DisplayUnitImpl implements Abs
* @generated
*/
@Override
+ public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
+ if (baseClass == Annotatable.class) {
+ switch (derivedFeatureID) {
+ case ContextsPackage.ABSTRACT_SECTION__ANNOTATIONS: return ContextsPackage.ANNOTATABLE__ANNOTATIONS;
+ default: return -1;
+ }
+ }
+ return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
+ if (baseClass == Annotatable.class) {
+ switch (baseFeatureID) {
+ case ContextsPackage.ANNOTATABLE__ANNOTATIONS: return ContextsPackage.ABSTRACT_SECTION__ANNOTATIONS;
+ default: return -1;
+ }
+ }
+ return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public int eDerivedOperationID(int baseOperationID, Class<?> baseClass) {
+ if (baseClass == Annotatable.class) {
+ switch (baseOperationID) {
+ case ContextsPackage.ANNOTATABLE___GET_ANNOTATION__STRING: return ContextsPackage.ABSTRACT_SECTION___GET_ANNOTATION__STRING;
+ default: return -1;
+ }
+ }
+ return super.eDerivedOperationID(baseOperationID, baseClass);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException {
+ switch (operationID) {
+ case ContextsPackage.ABSTRACT_SECTION___GET_ANNOTATION__STRING:
+ return getAnnotation((String)arguments.get(0));
+ }
+ return super.eInvoke(operationID, arguments);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
public String toString() {
if (eIsProxy()) return super.toString();
@@ -272,4 +394,15 @@ public abstract class AbstractSectionImpl extends DisplayUnitImpl implements Abs
return result.toString();
}
+ /**
+ * Retrieves the cache adapter for this '<em><b>Abstract Section</b></em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return The cache adapter for this '<em><b>Abstract Section</b></em>'.
+ * @generated
+ */
+ protected CacheAdapter getCacheAdapter() {
+ return CacheAdapter.getInstance();
+ }
+
} // AbstractSectionImpl
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/AnnotatableImpl.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/AnnotatableImpl.java
new file mode 100644
index 00000000000..38700e9b7e9
--- /dev/null
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/AnnotatableImpl.java
@@ -0,0 +1,212 @@
+/**
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ */
+package org.eclipse.papyrus.infra.properties.contexts.impl;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+import org.eclipse.papyrus.infra.properties.contexts.Annotatable;
+import org.eclipse.papyrus.infra.properties.contexts.Annotation;
+import org.eclipse.papyrus.infra.properties.contexts.ContextsPackage;
+import org.eclipse.papyrus.infra.properties.contexts.operations.AnnotatableOperations;
+import org.eclipse.uml2.common.util.CacheAdapter;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Annotatable</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.papyrus.infra.properties.contexts.impl.AnnotatableImpl#getAnnotations <em>Annotations</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public abstract class AnnotatableImpl extends MinimalEObjectImpl.Container implements Annotatable {
+ /**
+ * The cached value of the '{@link #getAnnotations() <em>Annotations</em>}' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getAnnotations()
+ * @generated
+ * @ordered
+ */
+ protected EList<Annotation> annotations;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected AnnotatableImpl() {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass() {
+ return ContextsPackage.Literals.ANNOTATABLE;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public EList<Annotation> getAnnotations() {
+ if (annotations == null) {
+ annotations = new EObjectContainmentWithInverseEList<Annotation>(Annotation.class, this, ContextsPackage.ANNOTATABLE__ANNOTATIONS, ContextsPackage.ANNOTATION__ELEMENT);
+ }
+ return annotations;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Annotation getAnnotation(String source) {
+ return AnnotatableOperations.getAnnotation(this, source);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+ switch (featureID) {
+ case ContextsPackage.ANNOTATABLE__ANNOTATIONS:
+ return ((InternalEList<InternalEObject>)(InternalEList<?>)getAnnotations()).basicAdd(otherEnd, msgs);
+ }
+ return super.eInverseAdd(otherEnd, featureID, msgs);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+ switch (featureID) {
+ case ContextsPackage.ANNOTATABLE__ANNOTATIONS:
+ return ((InternalEList<?>)getAnnotations()).basicRemove(otherEnd, msgs);
+ }
+ return super.eInverseRemove(otherEnd, featureID, msgs);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object eGet(int featureID, boolean resolve, boolean coreType) {
+ switch (featureID) {
+ case ContextsPackage.ANNOTATABLE__ANNOTATIONS:
+ return getAnnotations();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public void eSet(int featureID, Object newValue) {
+ switch (featureID) {
+ case ContextsPackage.ANNOTATABLE__ANNOTATIONS:
+ getAnnotations().clear();
+ getAnnotations().addAll((Collection<? extends Annotation>)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID) {
+ switch (featureID) {
+ case ContextsPackage.ANNOTATABLE__ANNOTATIONS:
+ getAnnotations().clear();
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID) {
+ switch (featureID) {
+ case ContextsPackage.ANNOTATABLE__ANNOTATIONS:
+ return annotations != null && !annotations.isEmpty();
+ }
+ return super.eIsSet(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException {
+ switch (operationID) {
+ case ContextsPackage.ANNOTATABLE___GET_ANNOTATION__STRING:
+ return getAnnotation((String)arguments.get(0));
+ }
+ return super.eInvoke(operationID, arguments);
+ }
+
+ /**
+ * Retrieves the cache adapter for this '<em><b>Annotatable</b></em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return The cache adapter for this '<em><b>Annotatable</b></em>'.
+ * @generated
+ */
+ protected CacheAdapter getCacheAdapter() {
+ return CacheAdapter.getInstance();
+ }
+
+} // AnnotatableImpl
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/AnnotationImpl.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/AnnotationImpl.java
new file mode 100644
index 00000000000..d54b2b87e47
--- /dev/null
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/AnnotationImpl.java
@@ -0,0 +1,374 @@
+/**
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ */
+package org.eclipse.papyrus.infra.properties.contexts.impl;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.EMap;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.EcorePackage;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.EStringToStringMapEntryImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
+import org.eclipse.emf.ecore.util.EcoreEMap;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.papyrus.infra.properties.contexts.Annotatable;
+import org.eclipse.papyrus.infra.properties.contexts.Annotation;
+import org.eclipse.papyrus.infra.properties.contexts.ContextsPackage;
+import org.eclipse.uml2.common.util.CacheAdapter;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Annotation</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.papyrus.infra.properties.contexts.impl.AnnotationImpl#getSource <em>Source</em>}</li>
+ * <li>{@link org.eclipse.papyrus.infra.properties.contexts.impl.AnnotationImpl#getReferences <em>References</em>}</li>
+ * <li>{@link org.eclipse.papyrus.infra.properties.contexts.impl.AnnotationImpl#getDetails <em>Details</em>}</li>
+ * <li>{@link org.eclipse.papyrus.infra.properties.contexts.impl.AnnotationImpl#getElement <em>Element</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class AnnotationImpl extends MinimalEObjectImpl.Container implements Annotation {
+ /**
+ * The default value of the '{@link #getSource() <em>Source</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getSource()
+ * @generated
+ * @ordered
+ */
+ protected static final String SOURCE_EDEFAULT = null;
+
+ /**
+ * The cached value of the '{@link #getSource() <em>Source</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getSource()
+ * @generated
+ * @ordered
+ */
+ protected String source = SOURCE_EDEFAULT;
+
+ /**
+ * The cached value of the '{@link #getReferences() <em>References</em>}' reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getReferences()
+ * @generated
+ * @ordered
+ */
+ protected EList<EObject> references;
+
+ /**
+ * The cached value of the '{@link #getDetails() <em>Details</em>}' map.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getDetails()
+ * @generated
+ * @ordered
+ */
+ protected EMap<String, String> details;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected AnnotationImpl() {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass() {
+ return ContextsPackage.Literals.ANNOTATION;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public String getSource() {
+ return source;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void setSource(String newSource) {
+ String oldSource = source;
+ source = newSource;
+ if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, ContextsPackage.ANNOTATION__SOURCE, oldSource, source));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public EList<EObject> getReferences() {
+ if (references == null) {
+ references = new EObjectResolvingEList<EObject>(EObject.class, this, ContextsPackage.ANNOTATION__REFERENCES);
+ }
+ return references;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public EMap<String, String> getDetails() {
+ if (details == null) {
+ details = new EcoreEMap<String,String>(EcorePackage.Literals.ESTRING_TO_STRING_MAP_ENTRY, EStringToStringMapEntryImpl.class, this, ContextsPackage.ANNOTATION__DETAILS);
+ }
+ return details;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Annotatable getElement() {
+ if (eContainerFeatureID() != ContextsPackage.ANNOTATION__ELEMENT) return null;
+ return (Annotatable)eInternalContainer();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ public NotificationChain basicSetElement(Annotatable newElement, NotificationChain msgs) {
+ msgs = eBasicSetContainer((InternalEObject)newElement, ContextsPackage.ANNOTATION__ELEMENT, msgs);
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void setElement(Annotatable newElement) {
+ if (newElement != eInternalContainer() || (eContainerFeatureID() != ContextsPackage.ANNOTATION__ELEMENT && newElement != null)) {
+ if (EcoreUtil.isAncestor(this, newElement))
+ throw new IllegalArgumentException("Recursive containment not allowed for " + toString()); //$NON-NLS-1$
+ NotificationChain msgs = null;
+ if (eInternalContainer() != null)
+ msgs = eBasicRemoveFromContainer(msgs);
+ if (newElement != null)
+ msgs = ((InternalEObject)newElement).eInverseAdd(this, ContextsPackage.ANNOTATABLE__ANNOTATIONS, Annotatable.class, msgs);
+ msgs = basicSetElement(newElement, msgs);
+ if (msgs != null) msgs.dispatch();
+ }
+ else if (eNotificationRequired())
+ eNotify(new ENotificationImpl(this, Notification.SET, ContextsPackage.ANNOTATION__ELEMENT, newElement, newElement));
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+ switch (featureID) {
+ case ContextsPackage.ANNOTATION__ELEMENT:
+ if (eInternalContainer() != null)
+ msgs = eBasicRemoveFromContainer(msgs);
+ return basicSetElement((Annotatable)otherEnd, msgs);
+ }
+ return super.eInverseAdd(otherEnd, featureID, msgs);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+ switch (featureID) {
+ case ContextsPackage.ANNOTATION__DETAILS:
+ return ((InternalEList<?>)getDetails()).basicRemove(otherEnd, msgs);
+ case ContextsPackage.ANNOTATION__ELEMENT:
+ return basicSetElement(null, msgs);
+ }
+ return super.eInverseRemove(otherEnd, featureID, msgs);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public NotificationChain eBasicRemoveFromContainerFeature(NotificationChain msgs) {
+ switch (eContainerFeatureID()) {
+ case ContextsPackage.ANNOTATION__ELEMENT:
+ return eInternalContainer().eInverseRemove(this, ContextsPackage.ANNOTATABLE__ANNOTATIONS, Annotatable.class, msgs);
+ }
+ return super.eBasicRemoveFromContainerFeature(msgs);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object eGet(int featureID, boolean resolve, boolean coreType) {
+ switch (featureID) {
+ case ContextsPackage.ANNOTATION__SOURCE:
+ return getSource();
+ case ContextsPackage.ANNOTATION__REFERENCES:
+ return getReferences();
+ case ContextsPackage.ANNOTATION__DETAILS:
+ if (coreType) return getDetails();
+ else return getDetails().map();
+ case ContextsPackage.ANNOTATION__ELEMENT:
+ return getElement();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public void eSet(int featureID, Object newValue) {
+ switch (featureID) {
+ case ContextsPackage.ANNOTATION__SOURCE:
+ setSource((String)newValue);
+ return;
+ case ContextsPackage.ANNOTATION__REFERENCES:
+ getReferences().clear();
+ getReferences().addAll((Collection<? extends EObject>)newValue);
+ return;
+ case ContextsPackage.ANNOTATION__DETAILS:
+ ((EStructuralFeature.Setting)getDetails()).set(newValue);
+ return;
+ case ContextsPackage.ANNOTATION__ELEMENT:
+ setElement((Annotatable)newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID) {
+ switch (featureID) {
+ case ContextsPackage.ANNOTATION__SOURCE:
+ setSource(SOURCE_EDEFAULT);
+ return;
+ case ContextsPackage.ANNOTATION__REFERENCES:
+ getReferences().clear();
+ return;
+ case ContextsPackage.ANNOTATION__DETAILS:
+ getDetails().clear();
+ return;
+ case ContextsPackage.ANNOTATION__ELEMENT:
+ setElement((Annotatable)null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID) {
+ switch (featureID) {
+ case ContextsPackage.ANNOTATION__SOURCE:
+ return SOURCE_EDEFAULT == null ? source != null : !SOURCE_EDEFAULT.equals(source);
+ case ContextsPackage.ANNOTATION__REFERENCES:
+ return references != null && !references.isEmpty();
+ case ContextsPackage.ANNOTATION__DETAILS:
+ return details != null && !details.isEmpty();
+ case ContextsPackage.ANNOTATION__ELEMENT:
+ return getElement() != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public String toString() {
+ if (eIsProxy()) return super.toString();
+
+ StringBuilder result = new StringBuilder(super.toString());
+ result.append(" (source: "); //$NON-NLS-1$
+ result.append(source);
+ result.append(')');
+ return result.toString();
+ }
+
+ /**
+ * Retrieves the cache adapter for this '<em><b>Annotation</b></em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return The cache adapter for this '<em><b>Annotation</b></em>'.
+ * @generated
+ */
+ protected CacheAdapter getCacheAdapter() {
+ return CacheAdapter.getInstance();
+ }
+
+} //AnnotationImpl
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/ContextImpl.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/ContextImpl.java
index b58fea3c83a..4160ff98d5d 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/ContextImpl.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/ContextImpl.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011, 2015 CEA LIST, Christian W. Damus, and others.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -11,7 +11,7 @@
* Contributors:
* CEA LIST - Initial API and implementation
* Christian W. Damus - add prototype reference to Context (CDO)
- * Christian W. Damus - bug 482927
+ * Christian W. Damus - bugs 482927, 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts.impl;
@@ -33,6 +33,7 @@ import org.eclipse.papyrus.infra.properties.contexts.ContextsPackage;
import org.eclipse.papyrus.infra.properties.contexts.DataContextRoot;
import org.eclipse.papyrus.infra.properties.contexts.Tab;
import org.eclipse.papyrus.infra.properties.contexts.View;
+import org.eclipse.uml2.common.util.CacheAdapter;
/**
* <!-- begin-user-doc -->
@@ -506,4 +507,15 @@ public class ContextImpl extends EModelElementImpl implements Context {
return result.toString();
}
+ /**
+ * Retrieves the cache adapter for this '<em><b>Context</b></em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return The cache adapter for this '<em><b>Context</b></em>'.
+ * @generated
+ */
+ protected CacheAdapter getCacheAdapter() {
+ return CacheAdapter.getInstance();
+ }
+
} // ContextImpl
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/ContextsFactoryImpl.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/ContextsFactoryImpl.java
index 854e8e809f0..07a8f3f973e 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/ContextsFactoryImpl.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/ContextsFactoryImpl.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011, 2013 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -11,6 +11,7 @@
* Contributors:
* CEA LIST - Initial API and implementation
* Christian W. Damus - add prototype reference to Context (CDO)
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts.impl;
@@ -19,6 +20,7 @@ import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.impl.EFactoryImpl;
import org.eclipse.emf.ecore.plugin.EcorePlugin;
+import org.eclipse.papyrus.infra.properties.contexts.*;
import org.eclipse.papyrus.infra.properties.contexts.Context;
import org.eclipse.papyrus.infra.properties.contexts.ContextsFactory;
import org.eclipse.papyrus.infra.properties.contexts.ContextsPackage;
@@ -79,6 +81,7 @@ public class ContextsFactoryImpl extends EFactoryImpl implements ContextsFactory
case ContextsPackage.CONTEXT: return createContext();
case ContextsPackage.TAB: return createTab();
case ContextsPackage.SECTION: return createSection();
+ case ContextsPackage.ANNOTATION: return createAnnotation();
case ContextsPackage.PROPERTY: return createProperty();
case ContextsPackage.DATA_CONTEXT_ELEMENT: return createDataContextElement();
case ContextsPackage.DATA_CONTEXT_PACKAGE: return createDataContextPackage();
@@ -140,6 +143,17 @@ public class ContextsFactoryImpl extends EFactoryImpl implements ContextsFactory
* @generated
*/
@Override
+ public Annotation createAnnotation() {
+ AnnotationImpl annotation = new AnnotationImpl();
+ return annotation;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
public DataContextElement createDataContextElement() {
DataContextElementImpl dataContextElement = new DataContextElementImpl();
return dataContextElement;
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/ContextsPackageImpl.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/ContextsPackageImpl.java
index 95b89b8d97e..97af55ed209 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/ContextsPackageImpl.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/ContextsPackageImpl.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011, 2015, 2017 CEA LIST, Christian W. Damus, and others.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -11,7 +11,7 @@
* Contributors:
* CEA LIST - Initial API and implementation
* Christian W. Damus - add prototype reference to Context (CDO)
- * Christian W. Damus - bug 482927
+ * Christian W. Damus - bugs 482927, 573986
* Vincent Lorenzo - Bug 520271
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts.impl;
@@ -19,12 +19,15 @@ package org.eclipse.papyrus.infra.properties.contexts.impl;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EOperation;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.impl.EPackageImpl;
import org.eclipse.papyrus.infra.constraints.ConstraintsPackage;
import org.eclipse.papyrus.infra.properties.contexts.AbstractSection;
+import org.eclipse.papyrus.infra.properties.contexts.Annotatable;
+import org.eclipse.papyrus.infra.properties.contexts.Annotation;
import org.eclipse.papyrus.infra.properties.contexts.Context;
import org.eclipse.papyrus.infra.properties.contexts.ContextsFactory;
import org.eclipse.papyrus.infra.properties.contexts.ContextsPackage;
@@ -40,6 +43,7 @@ import org.eclipse.papyrus.infra.properties.environment.EnvironmentPackage;
import org.eclipse.papyrus.infra.properties.environment.impl.EnvironmentPackageImpl;
import org.eclipse.papyrus.infra.properties.ui.UiPackage;
import org.eclipse.papyrus.infra.properties.ui.impl.UiPackageImpl;
+import org.eclipse.uml2.types.TypesPackage;
/**
* <!-- begin-user-doc -->
@@ -81,6 +85,20 @@ public class ContextsPackageImpl extends EPackageImpl implements ContextsPackage
* <!-- end-user-doc -->
* @generated
*/
+ private EClass annotatableEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ private EClass annotationEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
private EClass sectionEClass = null;
/**
@@ -166,6 +184,7 @@ public class ContextsPackageImpl extends EPackageImpl implements ContextsPackage
// Initialize simple dependencies
ConstraintsPackage.eINSTANCE.eClass();
EcorePackage.eINSTANCE.eClass();
+ TypesPackage.eINSTANCE.eClass();
// Obtain or create and register interdependencies
Object registeredPackage = EPackage.Registry.INSTANCE.getEPackage(EnvironmentPackage.eNS_URI);
@@ -418,7 +437,7 @@ public class ContextsPackageImpl extends EPackageImpl implements ContextsPackage
*/
@Override
public EReference getView_Context() {
- return (EReference)viewEClass.getEStructuralFeatures().get(4);
+ return (EReference)viewEClass.getEStructuralFeatures().get(2);
}
/**
@@ -428,7 +447,7 @@ public class ContextsPackageImpl extends EPackageImpl implements ContextsPackage
*/
@Override
public EAttribute getView_AutomaticContext() {
- return (EAttribute)viewEClass.getEStructuralFeatures().get(2);
+ return (EAttribute)viewEClass.getEStructuralFeatures().get(3);
}
/**
@@ -438,7 +457,7 @@ public class ContextsPackageImpl extends EPackageImpl implements ContextsPackage
*/
@Override
public EReference getView_Datacontexts() {
- return (EReference)viewEClass.getEStructuralFeatures().get(3);
+ return (EReference)viewEClass.getEStructuralFeatures().get(4);
}
/**
@@ -477,6 +496,86 @@ public class ContextsPackageImpl extends EPackageImpl implements ContextsPackage
* @generated
*/
@Override
+ public EClass getAnnotatable() {
+ return annotatableEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public EReference getAnnotatable_Annotations() {
+ return (EReference)annotatableEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public EOperation getAnnotatable__GetAnnotation__String() {
+ return annotatableEClass.getEOperations().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public EClass getAnnotation() {
+ return annotationEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public EAttribute getAnnotation_Source() {
+ return (EAttribute)annotationEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public EReference getAnnotation_References() {
+ return (EReference)annotationEClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public EReference getAnnotation_Details() {
+ return (EReference)annotationEClass.getEStructuralFeatures().get(2);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public EReference getAnnotation_Element() {
+ return (EReference)annotationEClass.getEStructuralFeatures().get(3);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
public EClass getSection() {
return sectionEClass;
}
@@ -507,7 +606,7 @@ public class ContextsPackageImpl extends EPackageImpl implements ContextsPackage
* @generated
*/
@Override
- public EReference getSection_Owner() {
+ public EReference getSection_Views() {
return (EReference)sectionEClass.getEStructuralFeatures().get(2);
}
@@ -517,6 +616,26 @@ public class ContextsPackageImpl extends EPackageImpl implements ContextsPackage
* @generated
*/
@Override
+ public EReference getSection_Owner() {
+ return (EReference)sectionEClass.getEStructuralFeatures().get(3);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public EOperation getSection__GetViews() {
+ return sectionEClass.getEOperations().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
public EClass getDataContextElement() {
return dataContextElementEClass;
}
@@ -764,12 +883,24 @@ public class ContextsPackageImpl extends EPackageImpl implements ContextsPackage
sectionEClass = createEClass(SECTION);
createEAttribute(sectionEClass, SECTION__SECTION_FILE);
createEReference(sectionEClass, SECTION__WIDGET);
+ createEReference(sectionEClass, SECTION__VIEWS);
createEReference(sectionEClass, SECTION__OWNER);
+ createEOperation(sectionEClass, SECTION___GET_VIEWS);
abstractSectionEClass = createEClass(ABSTRACT_SECTION);
createEAttribute(abstractSectionEClass, ABSTRACT_SECTION__NAME);
createEReference(abstractSectionEClass, ABSTRACT_SECTION__TAB);
+ annotatableEClass = createEClass(ANNOTATABLE);
+ createEReference(annotatableEClass, ANNOTATABLE__ANNOTATIONS);
+ createEOperation(annotatableEClass, ANNOTATABLE___GET_ANNOTATION__STRING);
+
+ annotationEClass = createEClass(ANNOTATION);
+ createEAttribute(annotationEClass, ANNOTATION__SOURCE);
+ createEReference(annotationEClass, ANNOTATION__REFERENCES);
+ createEReference(annotationEClass, ANNOTATION__DETAILS);
+ createEReference(annotationEClass, ANNOTATION__ELEMENT);
+
propertyEClass = createEClass(PROPERTY);
createEAttribute(propertyEClass, PROPERTY__NAME);
createEAttribute(propertyEClass, PROPERTY__LABEL);
@@ -794,9 +925,9 @@ public class ContextsPackageImpl extends EPackageImpl implements ContextsPackage
viewEClass = createEClass(VIEW);
createEAttribute(viewEClass, VIEW__NAME);
createEReference(viewEClass, VIEW__SECTIONS);
+ createEReference(viewEClass, VIEW__CONTEXT);
createEAttribute(viewEClass, VIEW__AUTOMATIC_CONTEXT);
createEReference(viewEClass, VIEW__DATACONTEXTS);
- createEReference(viewEClass, VIEW__CONTEXT);
dataContextRootEClass = createEClass(DATA_CONTEXT_ROOT);
createEAttribute(dataContextRootEClass, DATA_CONTEXT_ROOT__LABEL);
@@ -830,6 +961,7 @@ public class ContextsPackageImpl extends EPackageImpl implements ContextsPackage
EcorePackage theEcorePackage = (EcorePackage)EPackage.Registry.INSTANCE.getEPackage(EcorePackage.eNS_URI);
UiPackage theUiPackage = (UiPackage)EPackage.Registry.INSTANCE.getEPackage(UiPackage.eNS_URI);
ConstraintsPackage theConstraintsPackage = (ConstraintsPackage)EPackage.Registry.INSTANCE.getEPackage(ConstraintsPackage.eNS_URI);
+ TypesPackage theTypesPackage = (TypesPackage)EPackage.Registry.INSTANCE.getEPackage(TypesPackage.eNS_URI);
EnvironmentPackage theEnvironmentPackage = (EnvironmentPackage)EPackage.Registry.INSTANCE.getEPackage(EnvironmentPackage.eNS_URI);
// Create type parameters
@@ -840,9 +972,13 @@ public class ContextsPackageImpl extends EPackageImpl implements ContextsPackage
contextEClass.getESuperTypes().add(theEcorePackage.getEModelElement());
sectionEClass.getESuperTypes().add(this.getAbstractSection());
abstractSectionEClass.getESuperTypes().add(theConstraintsPackage.getDisplayUnit());
+ abstractSectionEClass.getESuperTypes().add(this.getAnnotatable());
+ propertyEClass.getESuperTypes().add(this.getAnnotatable());
+ dataContextElementEClass.getESuperTypes().add(this.getAnnotatable());
dataContextPackageEClass.getESuperTypes().add(this.getDataContextElement());
unknownPropertyEClass.getESuperTypes().add(this.getProperty());
viewEClass.getESuperTypes().add(theConstraintsPackage.getDisplayUnit());
+ viewEClass.getESuperTypes().add(this.getAnnotatable());
dataContextRootEClass.getESuperTypes().add(this.getDataContextPackage());
// Initialize classes, features, and operations; add parameters
@@ -870,12 +1006,27 @@ public class ContextsPackageImpl extends EPackageImpl implements ContextsPackage
initEClass(sectionEClass, Section.class, "Section", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
initEAttribute(getSection_SectionFile(), ecorePackage.getEString(), "sectionFile", null, 1, 1, Section.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
initEReference(getSection_Widget(), theUiPackage.getCompositeWidget(), null, "widget", null, 1, 1, Section.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+ initEReference(getSection_Views(), this.getView(), null, "views", null, 0, -1, Section.class, IS_TRANSIENT, IS_VOLATILE, !IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
initEReference(getSection_Owner(), this.getTab(), this.getTab_Sections(), "owner", null, 1, 1, Section.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+ initEOperation(getSection__GetViews(), this.getView(), "getViews", 0, -1, IS_UNIQUE, !IS_ORDERED); //$NON-NLS-1$
+
initEClass(abstractSectionEClass, AbstractSection.class, "AbstractSection", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
initEAttribute(getAbstractSection_Name(), ecorePackage.getEString(), "name", null, 1, 1, AbstractSection.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
initEReference(getAbstractSection_Tab(), this.getTab(), this.getTab_AllSections(), "tab", null, 1, 1, AbstractSection.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+ initEClass(annotatableEClass, Annotatable.class, "Annotatable", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+ initEReference(getAnnotatable_Annotations(), this.getAnnotation(), this.getAnnotation_Element(), "annotations", null, 0, -1, Annotatable.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+
+ EOperation op = initEOperation(getAnnotatable__GetAnnotation__String(), this.getAnnotation(), "getAnnotation", 1, 1, IS_UNIQUE, !IS_ORDERED); //$NON-NLS-1$
+ addEParameter(op, theTypesPackage.getString(), "source", 1, 1, IS_UNIQUE, !IS_ORDERED); //$NON-NLS-1$
+
+ initEClass(annotationEClass, Annotation.class, "Annotation", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+ initEAttribute(getAnnotation_Source(), theTypesPackage.getString(), "source", null, 1, 1, Annotation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+ initEReference(getAnnotation_References(), theEcorePackage.getEObject(), null, "references", null, 0, -1, Annotation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+ initEReference(getAnnotation_Details(), theEcorePackage.getEStringToStringMapEntry(), null, "details", null, 0, -1, Annotation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+ initEReference(getAnnotation_Element(), this.getAnnotatable(), this.getAnnotatable_Annotations(), "element", null, 1, 1, Annotation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+
initEClass(propertyEClass, Property.class, "Property", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
initEAttribute(getProperty_Name(), ecorePackage.getEString(), "name", null, 1, 1, Property.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
initEAttribute(getProperty_Label(), ecorePackage.getEString(), "label", null, 0, 1, Property.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
@@ -900,9 +1051,9 @@ public class ContextsPackageImpl extends EPackageImpl implements ContextsPackage
initEClass(viewEClass, View.class, "View", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
initEAttribute(getView_Name(), ecorePackage.getEString(), "name", null, 1, 1, View.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
initEReference(getView_Sections(), this.getSection(), null, "sections", null, 0, -1, View.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+ initEReference(getView_Context(), this.getContext(), this.getContext_Views(), "context", null, 1, 1, View.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
initEAttribute(getView_AutomaticContext(), ecorePackage.getEBoolean(), "automaticContext", null, 1, 1, View.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
initEReference(getView_Datacontexts(), this.getDataContextElement(), null, "datacontexts", null, 0, -1, View.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
- initEReference(getView_Context(), this.getContext(), this.getContext_Views(), "context", null, 1, 1, View.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
initEClass(dataContextRootEClass, DataContextRoot.class, "DataContextRoot", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
initEAttribute(getDataContextRoot_Label(), ecorePackage.getEString(), "label", null, 1, 1, DataContextRoot.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/DataContextElementImpl.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/DataContextElementImpl.java
index 6deb93e244f..b1a91581422 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/DataContextElementImpl.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/DataContextElementImpl.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011, 2013 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -11,6 +11,7 @@
* Contributors:
* CEA LIST - Initial API and implementation
* Christian W. Damus - add prototype reference to Context (CDO)
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts.impl;
@@ -22,7 +23,6 @@ import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
import org.eclipse.emf.ecore.util.EObjectResolvingEList;
import org.eclipse.emf.ecore.util.EcoreUtil;
@@ -48,7 +48,7 @@ import org.eclipse.papyrus.infra.properties.contexts.Property;
*
* @generated
*/
-public class DataContextElementImpl extends MinimalEObjectImpl.Container implements DataContextElement {
+public class DataContextElementImpl extends AnnotatableImpl implements DataContextElement {
/**
* The default value of the '{@link #getName() <em>Name</em>}' attribute.
* <!-- begin-user-doc -->
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/DataContextPackageImpl.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/DataContextPackageImpl.java
index f119cb20876..1e0592c5201 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/DataContextPackageImpl.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/DataContextPackageImpl.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,6 +10,7 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts.impl;
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/DataContextRootImpl.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/DataContextRootImpl.java
index 0f4b8b7bfd3..ead02e3a399 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/DataContextRootImpl.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/DataContextRootImpl.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,6 +10,7 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts.impl;
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/PropertyImpl.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/PropertyImpl.java
index 9b73d535a62..fe2d7467607 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/PropertyImpl.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/PropertyImpl.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011, 2013, 2017 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -12,6 +12,7 @@
* CEA LIST - Initial API and implementation
* Christian W. Damus - add prototype reference to Context (CDO)
* Vincent Lorenzo - Bug 520271
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts.impl;
@@ -23,7 +24,6 @@ import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
import org.eclipse.emf.ecore.util.EObjectWithInverseResolvingEList;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.util.InternalEList;
@@ -52,7 +52,7 @@ import org.eclipse.papyrus.infra.properties.environment.Type;
*
* @generated
*/
-public class PropertyImpl extends MinimalEObjectImpl.Container implements Property {
+public class PropertyImpl extends AnnotatableImpl implements Property {
/**
* The default value of the '{@link #getName() <em>Name</em>}' attribute.
* <!-- begin-user-doc -->
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/SectionImpl.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/SectionImpl.java
index 210b00ec27b..da1b2f40364 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/SectionImpl.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/SectionImpl.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011, 2013 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -11,11 +11,13 @@
* Contributors:
* CEA LIST - Initial API and implementation
* Christian W. Damus - add prototype reference to Context (CDO)
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts.impl;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
@@ -23,7 +25,10 @@ import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.papyrus.infra.properties.contexts.ContextsPackage;
import org.eclipse.papyrus.infra.properties.contexts.Section;
import org.eclipse.papyrus.infra.properties.contexts.Tab;
+import org.eclipse.papyrus.infra.properties.contexts.View;
+import org.eclipse.papyrus.infra.properties.contexts.operations.SectionOperations;
import org.eclipse.papyrus.infra.properties.ui.CompositeWidget;
+import org.eclipse.uml2.common.util.CacheAdapter;
/**
* <!-- begin-user-doc -->
@@ -36,6 +41,7 @@ import org.eclipse.papyrus.infra.properties.ui.CompositeWidget;
* <li>{@link org.eclipse.papyrus.infra.properties.contexts.impl.SectionImpl#getTab <em>Tab</em>}</li>
* <li>{@link org.eclipse.papyrus.infra.properties.contexts.impl.SectionImpl#getSectionFile <em>Section File</em>}</li>
* <li>{@link org.eclipse.papyrus.infra.properties.contexts.impl.SectionImpl#getWidget <em>Widget</em>}</li>
+ * <li>{@link org.eclipse.papyrus.infra.properties.contexts.impl.SectionImpl#getViews <em>Views</em>}</li>
* <li>{@link org.eclipse.papyrus.infra.properties.contexts.impl.SectionImpl#getOwner <em>Owner</em>}</li>
* </ul>
*
@@ -204,6 +210,25 @@ public class SectionImpl extends AbstractSectionImpl implements Section {
* @generated
*/
@Override
+ public EList<View> getViews() {
+ CacheAdapter cache = getCacheAdapter();
+ if (cache != null) {
+ @SuppressWarnings("unchecked")
+ EList<View> result = (EList<View>) cache.get(eResource(), this, ContextsPackage.Literals.SECTION__VIEWS);
+ if (result == null) {
+ cache.put(eResource(), this, ContextsPackage.Literals.SECTION__VIEWS, result = SectionOperations.getViews(this));
+ }
+ return result;
+ }
+ return SectionOperations.getViews(this);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
public Tab getOwner() {
Tab owner = basicGetOwner();
return owner != null && owner.eIsProxy() ? (Tab)eResolveProxy((InternalEObject)owner) : owner;
@@ -287,6 +312,8 @@ public class SectionImpl extends AbstractSectionImpl implements Section {
case ContextsPackage.SECTION__WIDGET:
if (resolve) return getWidget();
return basicGetWidget();
+ case ContextsPackage.SECTION__VIEWS:
+ return getViews();
case ContextsPackage.SECTION__OWNER:
if (resolve) return getOwner();
return basicGetOwner();
@@ -350,6 +377,8 @@ public class SectionImpl extends AbstractSectionImpl implements Section {
return SECTION_FILE_EDEFAULT == null ? sectionFile != null : !SECTION_FILE_EDEFAULT.equals(sectionFile);
case ContextsPackage.SECTION__WIDGET:
return widget != null;
+ case ContextsPackage.SECTION__VIEWS:
+ return !getViews().isEmpty();
case ContextsPackage.SECTION__OWNER:
return basicGetOwner() != null;
}
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/TabImpl.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/TabImpl.java
index 88521e458f5..81fe6e7feba 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/TabImpl.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/TabImpl.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,6 +10,7 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts.impl;
@@ -28,6 +29,7 @@ import org.eclipse.papyrus.infra.properties.contexts.AbstractSection;
import org.eclipse.papyrus.infra.properties.contexts.ContextsPackage;
import org.eclipse.papyrus.infra.properties.contexts.Section;
import org.eclipse.papyrus.infra.properties.contexts.Tab;
+import org.eclipse.uml2.common.util.CacheAdapter;
import org.eclipse.uml2.common.util.DerivedSubsetEObjectEList;
/**
@@ -622,4 +624,15 @@ public class TabImpl extends MinimalEObjectImpl.Container implements Tab {
return result.toString();
}
+ /**
+ * Retrieves the cache adapter for this '<em><b>Tab</b></em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return The cache adapter for this '<em><b>Tab</b></em>'.
+ * @generated
+ */
+ protected CacheAdapter getCacheAdapter() {
+ return CacheAdapter.getInstance();
+ }
+
} // TabImpl
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/UnknownPropertyImpl.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/UnknownPropertyImpl.java
index 72a8e92fcb5..b33e7b437e3 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/UnknownPropertyImpl.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/UnknownPropertyImpl.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,6 +10,7 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts.impl;
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/ViewImpl.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/ViewImpl.java
index 71116318504..353cc194417 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/ViewImpl.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/impl/ViewImpl.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011, 2013 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -11,9 +11,11 @@
* Contributors:
* CEA LIST - Initial API and implementation
* Christian W. Damus - add prototype reference to Context (CDO)
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts.impl;
+import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
import org.eclipse.emf.common.notify.Notification;
@@ -22,14 +24,20 @@ import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
import org.eclipse.emf.ecore.util.EObjectResolvingEList;
import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.util.InternalEList;
import org.eclipse.papyrus.infra.constraints.impl.DisplayUnitImpl;
+import org.eclipse.papyrus.infra.properties.contexts.Annotatable;
+import org.eclipse.papyrus.infra.properties.contexts.Annotation;
import org.eclipse.papyrus.infra.properties.contexts.Context;
import org.eclipse.papyrus.infra.properties.contexts.ContextsPackage;
import org.eclipse.papyrus.infra.properties.contexts.DataContextElement;
import org.eclipse.papyrus.infra.properties.contexts.Section;
import org.eclipse.papyrus.infra.properties.contexts.View;
+import org.eclipse.papyrus.infra.properties.contexts.operations.AnnotatableOperations;
+import org.eclipse.uml2.common.util.CacheAdapter;
/**
* <!-- begin-user-doc -->
@@ -39,17 +47,28 @@ import org.eclipse.papyrus.infra.properties.contexts.View;
* The following features are implemented:
* </p>
* <ul>
+ * <li>{@link org.eclipse.papyrus.infra.properties.contexts.impl.ViewImpl#getAnnotations <em>Annotations</em>}</li>
* <li>{@link org.eclipse.papyrus.infra.properties.contexts.impl.ViewImpl#getName <em>Name</em>}</li>
* <li>{@link org.eclipse.papyrus.infra.properties.contexts.impl.ViewImpl#getSections <em>Sections</em>}</li>
+ * <li>{@link org.eclipse.papyrus.infra.properties.contexts.impl.ViewImpl#getContext <em>Context</em>}</li>
* <li>{@link org.eclipse.papyrus.infra.properties.contexts.impl.ViewImpl#isAutomaticContext <em>Automatic Context</em>}</li>
* <li>{@link org.eclipse.papyrus.infra.properties.contexts.impl.ViewImpl#getDatacontexts <em>Datacontexts</em>}</li>
- * <li>{@link org.eclipse.papyrus.infra.properties.contexts.impl.ViewImpl#getContext <em>Context</em>}</li>
* </ul>
*
* @generated
*/
public class ViewImpl extends DisplayUnitImpl implements View {
/**
+ * The cached value of the '{@link #getAnnotations() <em>Annotations</em>}' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @see #getAnnotations()
+ * @generated
+ * @ordered
+ */
+ protected EList<Annotation> annotations;
+
+ /**
* The default value of the '{@link #getName() <em>Name</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
@@ -134,6 +153,19 @@ public class ViewImpl extends DisplayUnitImpl implements View {
* @generated
*/
@Override
+ public EList<Annotation> getAnnotations() {
+ if (annotations == null) {
+ annotations = new EObjectContainmentWithInverseEList<Annotation>(Annotation.class, this, ContextsPackage.VIEW__ANNOTATIONS, ContextsPackage.ANNOTATION__ELEMENT);
+ }
+ return annotations;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
public String getName() {
return name;
}
@@ -212,6 +244,15 @@ public class ViewImpl extends DisplayUnitImpl implements View {
* <!-- end-user-doc -->
* @generated
*/
+ public Annotation getAnnotation(String source) {
+ return AnnotatableOperations.getAnnotation(this, source);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
@Override
public boolean isAutomaticContext() {
return automaticContext;
@@ -248,9 +289,12 @@ public class ViewImpl extends DisplayUnitImpl implements View {
* <!-- end-user-doc -->
* @generated
*/
+ @SuppressWarnings("unchecked")
@Override
public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
switch (featureID) {
+ case ContextsPackage.VIEW__ANNOTATIONS:
+ return ((InternalEList<InternalEObject>)(InternalEList<?>)getAnnotations()).basicAdd(otherEnd, msgs);
case ContextsPackage.VIEW__CONTEXT:
if (eInternalContainer() != null)
msgs = eBasicRemoveFromContainer(msgs);
@@ -267,6 +311,8 @@ public class ViewImpl extends DisplayUnitImpl implements View {
@Override
public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
switch (featureID) {
+ case ContextsPackage.VIEW__ANNOTATIONS:
+ return ((InternalEList<?>)getAnnotations()).basicRemove(otherEnd, msgs);
case ContextsPackage.VIEW__CONTEXT:
return basicSetContext(null, msgs);
}
@@ -295,16 +341,18 @@ public class ViewImpl extends DisplayUnitImpl implements View {
@Override
public Object eGet(int featureID, boolean resolve, boolean coreType) {
switch (featureID) {
+ case ContextsPackage.VIEW__ANNOTATIONS:
+ return getAnnotations();
case ContextsPackage.VIEW__NAME:
return getName();
case ContextsPackage.VIEW__SECTIONS:
return getSections();
+ case ContextsPackage.VIEW__CONTEXT:
+ return getContext();
case ContextsPackage.VIEW__AUTOMATIC_CONTEXT:
return isAutomaticContext();
case ContextsPackage.VIEW__DATACONTEXTS:
return getDatacontexts();
- case ContextsPackage.VIEW__CONTEXT:
- return getContext();
}
return super.eGet(featureID, resolve, coreType);
}
@@ -318,6 +366,10 @@ public class ViewImpl extends DisplayUnitImpl implements View {
@Override
public void eSet(int featureID, Object newValue) {
switch (featureID) {
+ case ContextsPackage.VIEW__ANNOTATIONS:
+ getAnnotations().clear();
+ getAnnotations().addAll((Collection<? extends Annotation>)newValue);
+ return;
case ContextsPackage.VIEW__NAME:
setName((String)newValue);
return;
@@ -325,6 +377,9 @@ public class ViewImpl extends DisplayUnitImpl implements View {
getSections().clear();
getSections().addAll((Collection<? extends Section>)newValue);
return;
+ case ContextsPackage.VIEW__CONTEXT:
+ setContext((Context)newValue);
+ return;
case ContextsPackage.VIEW__AUTOMATIC_CONTEXT:
setAutomaticContext((Boolean)newValue);
return;
@@ -332,9 +387,6 @@ public class ViewImpl extends DisplayUnitImpl implements View {
getDatacontexts().clear();
getDatacontexts().addAll((Collection<? extends DataContextElement>)newValue);
return;
- case ContextsPackage.VIEW__CONTEXT:
- setContext((Context)newValue);
- return;
}
super.eSet(featureID, newValue);
}
@@ -347,21 +399,24 @@ public class ViewImpl extends DisplayUnitImpl implements View {
@Override
public void eUnset(int featureID) {
switch (featureID) {
+ case ContextsPackage.VIEW__ANNOTATIONS:
+ getAnnotations().clear();
+ return;
case ContextsPackage.VIEW__NAME:
setName(NAME_EDEFAULT);
return;
case ContextsPackage.VIEW__SECTIONS:
getSections().clear();
return;
+ case ContextsPackage.VIEW__CONTEXT:
+ setContext((Context)null);
+ return;
case ContextsPackage.VIEW__AUTOMATIC_CONTEXT:
setAutomaticContext(AUTOMATIC_CONTEXT_EDEFAULT);
return;
case ContextsPackage.VIEW__DATACONTEXTS:
getDatacontexts().clear();
return;
- case ContextsPackage.VIEW__CONTEXT:
- setContext((Context)null);
- return;
}
super.eUnset(featureID);
}
@@ -374,16 +429,18 @@ public class ViewImpl extends DisplayUnitImpl implements View {
@Override
public boolean eIsSet(int featureID) {
switch (featureID) {
+ case ContextsPackage.VIEW__ANNOTATIONS:
+ return annotations != null && !annotations.isEmpty();
case ContextsPackage.VIEW__NAME:
return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
case ContextsPackage.VIEW__SECTIONS:
return sections != null && !sections.isEmpty();
+ case ContextsPackage.VIEW__CONTEXT:
+ return getContext() != null;
case ContextsPackage.VIEW__AUTOMATIC_CONTEXT:
return automaticContext != AUTOMATIC_CONTEXT_EDEFAULT;
case ContextsPackage.VIEW__DATACONTEXTS:
return datacontexts != null && !datacontexts.isEmpty();
- case ContextsPackage.VIEW__CONTEXT:
- return getContext() != null;
}
return super.eIsSet(featureID);
}
@@ -394,6 +451,68 @@ public class ViewImpl extends DisplayUnitImpl implements View {
* @generated
*/
@Override
+ public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
+ if (baseClass == Annotatable.class) {
+ switch (derivedFeatureID) {
+ case ContextsPackage.VIEW__ANNOTATIONS: return ContextsPackage.ANNOTATABLE__ANNOTATIONS;
+ default: return -1;
+ }
+ }
+ return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
+ if (baseClass == Annotatable.class) {
+ switch (baseFeatureID) {
+ case ContextsPackage.ANNOTATABLE__ANNOTATIONS: return ContextsPackage.VIEW__ANNOTATIONS;
+ default: return -1;
+ }
+ }
+ return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public int eDerivedOperationID(int baseOperationID, Class<?> baseClass) {
+ if (baseClass == Annotatable.class) {
+ switch (baseOperationID) {
+ case ContextsPackage.ANNOTATABLE___GET_ANNOTATION__STRING: return ContextsPackage.VIEW___GET_ANNOTATION__STRING;
+ default: return -1;
+ }
+ }
+ return super.eDerivedOperationID(baseOperationID, baseClass);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
+ public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException {
+ switch (operationID) {
+ case ContextsPackage.VIEW___GET_ANNOTATION__STRING:
+ return getAnnotation((String)arguments.get(0));
+ }
+ return super.eInvoke(operationID, arguments);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ @Override
public String toString() {
if (eIsProxy()) return super.toString();
@@ -406,4 +525,15 @@ public class ViewImpl extends DisplayUnitImpl implements View {
return result.toString();
}
+ /**
+ * Retrieves the cache adapter for this '<em><b>View</b></em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return The cache adapter for this '<em><b>View</b></em>'.
+ * @generated
+ */
+ protected CacheAdapter getCacheAdapter() {
+ return CacheAdapter.getInstance();
+ }
+
} // ViewImpl
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/operations/AnnotatableOperations.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/operations/AnnotatableOperations.java
new file mode 100644
index 00000000000..3c428c56413
--- /dev/null
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/operations/AnnotatableOperations.java
@@ -0,0 +1,66 @@
+/**
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ */
+package org.eclipse.papyrus.infra.properties.contexts.operations;
+
+import java.util.Iterator;
+
+import org.eclipse.papyrus.infra.properties.contexts.Annotatable;
+import org.eclipse.papyrus.infra.properties.contexts.Annotation;
+
+/**
+ * <!-- begin-user-doc -->
+ * A static utility class that provides operations related to '<em><b>Annotatable</b></em>' model objects.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following operations are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.papyrus.infra.properties.contexts.Annotatable#getAnnotation(java.lang.String) <em>Get Annotation</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class AnnotatableOperations {
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected AnnotatableOperations() {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated NOT
+ */
+ public static Annotation getAnnotation(Annotatable annotatable, String source) {
+ Annotation result = null;
+
+ if (source != null) {
+ for (Iterator<Annotation> iter = annotatable.getAnnotations().iterator(); result == null && iter.hasNext();) {
+ Annotation next = iter.next();
+ if (source.equals(next.getSource())) {
+ result = next;
+ }
+ }
+ }
+
+ return result;
+ }
+
+} // AnnotatableOperations
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/operations/SectionOperations.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/operations/SectionOperations.java
new file mode 100644
index 00000000000..13242f09b85
--- /dev/null
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/operations/SectionOperations.java
@@ -0,0 +1,64 @@
+/**
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ */
+package org.eclipse.papyrus.infra.properties.contexts.operations;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.util.EcoreEList;
+import org.eclipse.papyrus.infra.properties.contexts.ContextsPackage;
+import org.eclipse.papyrus.infra.properties.contexts.Section;
+import org.eclipse.papyrus.infra.properties.contexts.View;
+import org.eclipse.uml2.common.util.CacheAdapter;
+
+/**
+ * <!-- begin-user-doc -->
+ * A static utility class that provides operations related to '<em><b>Section</b></em>' model objects.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following operations are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.papyrus.infra.properties.contexts.Section#getViews() <em>Get Views</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class SectionOperations {
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ protected SectionOperations() {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated NOT
+ */
+ public static EList<View> getViews(Section section) {
+ // As generated by the Properties model
+ Object[] result = CacheAdapter.getInstance().getInverseReferences(section).stream()
+ .filter(setting -> setting.getEStructuralFeature() == ContextsPackage.Literals.VIEW__SECTIONS)
+ .map(EStructuralFeature.Setting::getEObject)
+ .toArray();
+ return new EcoreEList.UnmodifiableEList.FastCompare<>((InternalEObject) section, ContextsPackage.Literals.SECTION__VIEWS, result.length, result);
+ }
+
+} // SectionOperations
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/util/ContextsAdapterFactory.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/util/ContextsAdapterFactory.java
index 8309f9658c3..330e344dfea 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/util/ContextsAdapterFactory.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/util/ContextsAdapterFactory.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011, 2015 CEA LIST, Christian W. Damus, and others.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,7 +10,7 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
- * Christian W. Damus - bug 482927
+ * Christian W. Damus - bugs 482927, 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts.util;
@@ -20,6 +20,7 @@ import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
import org.eclipse.emf.ecore.EModelElement;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.papyrus.infra.constraints.DisplayUnit;
+import org.eclipse.papyrus.infra.properties.contexts.*;
import org.eclipse.papyrus.infra.properties.contexts.AbstractSection;
import org.eclipse.papyrus.infra.properties.contexts.Context;
import org.eclipse.papyrus.infra.properties.contexts.ContextsPackage;
@@ -104,6 +105,14 @@ public class ContextsAdapterFactory extends AdapterFactoryImpl {
return createAbstractSectionAdapter();
}
@Override
+ public Adapter caseAnnotatable(Annotatable object) {
+ return createAnnotatableAdapter();
+ }
+ @Override
+ public Adapter caseAnnotation(Annotation object) {
+ return createAnnotationAdapter();
+ }
+ @Override
public Adapter caseProperty(Property object) {
return createPropertyAdapter();
}
@@ -212,6 +221,34 @@ public class ContextsAdapterFactory extends AdapterFactoryImpl {
}
/**
+ * Creates a new adapter for an object of class '{@link org.eclipse.papyrus.infra.properties.contexts.Annotatable <em>Annotatable</em>}'.
+ * <!-- begin-user-doc -->
+ * This default implementation returns null so that we can easily ignore cases;
+ * it's useful to ignore a case when inheritance will catch all the cases anyway.
+ * <!-- end-user-doc -->
+ * @return the new adapter.
+ * @see org.eclipse.papyrus.infra.properties.contexts.Annotatable
+ * @generated
+ */
+ public Adapter createAnnotatableAdapter() {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.papyrus.infra.properties.contexts.Annotation <em>Annotation</em>}'.
+ * <!-- begin-user-doc -->
+ * This default implementation returns null so that we can easily ignore cases;
+ * it's useful to ignore a case when inheritance will catch all the cases anyway.
+ * <!-- end-user-doc -->
+ * @return the new adapter.
+ * @see org.eclipse.papyrus.infra.properties.contexts.Annotation
+ * @generated
+ */
+ public Adapter createAnnotationAdapter() {
+ return null;
+ }
+
+ /**
* Creates a new adapter for an object of class '{@link org.eclipse.papyrus.infra.properties.contexts.Section <em>Section</em>}'.
* <!-- begin-user-doc -->
* This default implementation returns null so that we can easily ignore cases;
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/util/ContextsResourceFactoryImpl.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/util/ContextsResourceFactoryImpl.java
index 3fd33ae5b97..55b355fa542 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/util/ContextsResourceFactoryImpl.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/util/ContextsResourceFactoryImpl.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,6 +10,7 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts.util;
@@ -18,12 +19,12 @@ import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.impl.ResourceFactoryImpl;
+import org.eclipse.emf.ecore.xmi.XMLResource;
/**
* <!-- begin-user-doc -->
* The <b>Resource Factory</b> associated with the package.
* <!-- end-user-doc -->
- *
* @see org.eclipse.papyrus.infra.properties.contexts.util.ContextsResourceImpl
* @generated
*/
@@ -32,7 +33,6 @@ public class ContextsResourceFactoryImpl extends ResourceFactoryImpl {
* Creates an instance of the resource factory.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
- *
* @generated
*/
public ContextsResourceFactoryImpl() {
@@ -43,12 +43,11 @@ public class ContextsResourceFactoryImpl extends ResourceFactoryImpl {
* Creates an instance of the resource.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
- *
* @generated
*/
@Override
public Resource createResource(URI uri) {
- Resource result = new ContextsResourceImpl(uri);
+ XMLResource result = new ContextsResourceImpl(uri);
return result;
}
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/util/ContextsResourceImpl.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/util/ContextsResourceImpl.java
index 4fc533d9f35..ef1c89c6a9b 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/util/ContextsResourceImpl.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/util/ContextsResourceImpl.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,11 +10,25 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts.util;
+import java.util.Map;
+
import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.EcorePackage;
+import org.eclipse.emf.ecore.xmi.XMLHelper;
+import org.eclipse.emf.ecore.xmi.XMLLoad;
+import org.eclipse.emf.ecore.xmi.XMLResource;
+import org.eclipse.emf.ecore.xmi.impl.SAXXMIHandler;
+import org.eclipse.emf.ecore.xmi.impl.XMIHelperImpl;
+import org.eclipse.emf.ecore.xmi.impl.XMILoadImpl;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl;
+import org.eclipse.papyrus.infra.properties.contexts.Annotation;
+import org.xml.sax.helpers.DefaultHandler;
/**
* <!-- begin-user-doc -->
@@ -49,4 +63,89 @@ public class ContextsResourceImpl extends XMIResourceImpl {
return true;
}
+ @Override
+ protected XMLHelper createXMLHelper() {
+ return new ContextsXMIHelper();
+ }
+
+ @Override
+ protected XMLLoad createXMLLoad() {
+ return new ContextsXMILoad(createXMLHelper());
+ }
+
+ boolean isAnnotationDetailURI(EObject object, EStructuralFeature feature) {
+ return feature == EcorePackage.Literals.ESTRING_TO_STRING_MAP_ENTRY__VALUE
+ && "model".equals(((Map.Entry<?, ?>) object).getKey())
+ && object.eContainer() instanceof Annotation;
+ }
+
+ void resolveURIs(Annotation annotation) {
+ for (Map.Entry<String, String> detail : annotation.getDetails()) {
+ if ("model".equals(detail.getKey())) {
+ // The value is a URI
+ String rawValue = detail.getValue();
+ if (rawValue != null && !rawValue.isBlank()) {
+ URI uri = URI.createURI(rawValue, true);
+ if (uri.isRelative()) {
+ uri = uri.resolve(getURI());
+ detail.setValue(uri.toString());
+ }
+ }
+ }
+ }
+ }
+
+ private class ContextsXMIHelper extends XMIHelperImpl {
+
+ ContextsXMIHelper() {
+ super(ContextsResourceImpl.this);
+ }
+
+ @Override
+ public Object getValue(EObject object, EStructuralFeature feature) {
+ if (isAnnotationDetailURI(object, feature)) {
+ // Deresolve the URI
+ String rawValue = (String) ((Map.Entry<?, ?>) object).getValue();
+ if (rawValue != null && !rawValue.isBlank()) {
+ URI uri = URI.createURI(rawValue);
+ URI base = ContextsResourceImpl.this.getURI();
+ return uri.deresolve(base).toString();
+ }
+ }
+
+ return super.getValue(object, feature);
+ }
+ }
+
+ private class ContextsXMILoad extends XMILoadImpl {
+
+ ContextsXMILoad(XMLHelper helper) {
+ super(helper);
+ }
+
+ @Override
+ protected DefaultHandler makeDefaultHandler() {
+ return new ContextsXMIHandler(resource, helper, options);
+ }
+
+ }
+
+ private class ContextsXMIHandler extends SAXXMIHandler {
+
+ ContextsXMIHandler(XMLResource xmiResource, XMLHelper helper, Map<?, ?> options) {
+ super(xmiResource, helper, options);
+ }
+
+ @Override
+ public void endElement(String uri, String localName, String name) {
+ EObject object = objects.peekEObject();
+ if (object instanceof Annotation) {
+ resolveURIs((Annotation) object);
+ }
+
+ super.endElement(uri, localName, name);
+ }
+
+ }
+
} // ContextsResourceImpl
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/util/ContextsSwitch.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/util/ContextsSwitch.java
index 6c90464ea95..5e562acf9b7 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/util/ContextsSwitch.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/contexts/util/ContextsSwitch.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011, 2015 CEA LIST, Christian W. Damus, and others.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,7 +10,7 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
- * Christian W. Damus - bug 482927
+ * Christian W. Damus - bugs 482927, 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.contexts.util;
@@ -19,6 +19,7 @@ import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.util.Switch;
import org.eclipse.papyrus.infra.constraints.DisplayUnit;
+import org.eclipse.papyrus.infra.properties.contexts.*;
import org.eclipse.papyrus.infra.properties.contexts.AbstractSection;
import org.eclipse.papyrus.infra.properties.contexts.Context;
import org.eclipse.papyrus.infra.properties.contexts.ContextsPackage;
@@ -105,6 +106,7 @@ public class ContextsSwitch<T> extends Switch<T> {
T result = caseSection(section);
if (result == null) result = caseAbstractSection(section);
if (result == null) result = caseDisplayUnit(section);
+ if (result == null) result = caseAnnotatable(section);
if (result == null) result = defaultCase(theEObject);
return result;
}
@@ -112,18 +114,33 @@ public class ContextsSwitch<T> extends Switch<T> {
AbstractSection abstractSection = (AbstractSection)theEObject;
T result = caseAbstractSection(abstractSection);
if (result == null) result = caseDisplayUnit(abstractSection);
+ if (result == null) result = caseAnnotatable(abstractSection);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case ContextsPackage.ANNOTATABLE: {
+ Annotatable annotatable = (Annotatable)theEObject;
+ T result = caseAnnotatable(annotatable);
+ if (result == null) result = defaultCase(theEObject);
+ return result;
+ }
+ case ContextsPackage.ANNOTATION: {
+ Annotation annotation = (Annotation)theEObject;
+ T result = caseAnnotation(annotation);
if (result == null) result = defaultCase(theEObject);
return result;
}
case ContextsPackage.PROPERTY: {
Property property = (Property)theEObject;
T result = caseProperty(property);
+ if (result == null) result = caseAnnotatable(property);
if (result == null) result = defaultCase(theEObject);
return result;
}
case ContextsPackage.DATA_CONTEXT_ELEMENT: {
DataContextElement dataContextElement = (DataContextElement)theEObject;
T result = caseDataContextElement(dataContextElement);
+ if (result == null) result = caseAnnotatable(dataContextElement);
if (result == null) result = defaultCase(theEObject);
return result;
}
@@ -131,6 +148,7 @@ public class ContextsSwitch<T> extends Switch<T> {
DataContextPackage dataContextPackage = (DataContextPackage)theEObject;
T result = caseDataContextPackage(dataContextPackage);
if (result == null) result = caseDataContextElement(dataContextPackage);
+ if (result == null) result = caseAnnotatable(dataContextPackage);
if (result == null) result = defaultCase(theEObject);
return result;
}
@@ -138,6 +156,7 @@ public class ContextsSwitch<T> extends Switch<T> {
UnknownProperty unknownProperty = (UnknownProperty)theEObject;
T result = caseUnknownProperty(unknownProperty);
if (result == null) result = caseProperty(unknownProperty);
+ if (result == null) result = caseAnnotatable(unknownProperty);
if (result == null) result = defaultCase(theEObject);
return result;
}
@@ -145,6 +164,7 @@ public class ContextsSwitch<T> extends Switch<T> {
View view = (View)theEObject;
T result = caseView(view);
if (result == null) result = caseDisplayUnit(view);
+ if (result == null) result = caseAnnotatable(view);
if (result == null) result = defaultCase(theEObject);
return result;
}
@@ -153,6 +173,7 @@ public class ContextsSwitch<T> extends Switch<T> {
T result = caseDataContextRoot(dataContextRoot);
if (result == null) result = caseDataContextPackage(dataContextRoot);
if (result == null) result = caseDataContextElement(dataContextRoot);
+ if (result == null) result = caseAnnotatable(dataContextRoot);
if (result == null) result = defaultCase(theEObject);
return result;
}
@@ -221,6 +242,36 @@ public class ContextsSwitch<T> extends Switch<T> {
}
/**
+ * Returns the result of interpreting the object as an instance of '<em>Annotatable</em>'.
+ * <!-- begin-user-doc -->
+ * This implementation returns null;
+ * returning a non-null result will terminate the switch.
+ * <!-- end-user-doc -->
+ * @param object the target of the switch.
+ * @return the result of interpreting the object as an instance of '<em>Annotatable</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseAnnotatable(Annotatable object) {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>Annotation</em>'.
+ * <!-- begin-user-doc -->
+ * This implementation returns null;
+ * returning a non-null result will terminate the switch.
+ * <!-- end-user-doc -->
+ * @param object the target of the switch.
+ * @return the result of interpreting the object as an instance of '<em>Annotation</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseAnnotation(Annotation object) {
+ return null;
+ }
+
+ /**
* Returns the result of interpreting the object as an instance of '<em>Section</em>'.
* <!-- begin-user-doc -->
* This implementation returns null;
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/EnvironmentPackage.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/EnvironmentPackage.java
index ac82a2af1a2..b9cff3d8f76 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/EnvironmentPackage.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/EnvironmentPackage.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,6 +10,7 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.environment;
@@ -61,6 +62,14 @@ public interface EnvironmentPackage extends EPackage {
String eNS_PREFIX = "environment";
/**
+ * The package content type ID.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+ String eCONTENT_TYPE = "org.eclipse.papyrus.infra.properties.environment";
+
+ /**
* The singleton instance of the package.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/impl/EnvironmentImpl.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/impl/EnvironmentImpl.java
index 2123f951d82..930659015d2 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/impl/EnvironmentImpl.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/impl/EnvironmentImpl.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,6 +10,7 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.environment.impl;
@@ -31,6 +32,7 @@ import org.eclipse.papyrus.infra.properties.environment.ModelElementFactoryDescr
import org.eclipse.papyrus.infra.properties.environment.Namespace;
import org.eclipse.papyrus.infra.properties.environment.PropertyEditorType;
import org.eclipse.papyrus.infra.properties.environment.StandardWidgetType;
+import org.eclipse.uml2.common.util.CacheAdapter;
/**
* <!-- begin-user-doc -->
@@ -384,4 +386,15 @@ public class EnvironmentImpl extends ConstraintEnvironmentImpl implements Enviro
return super.eIsSet(featureID);
}
+ /**
+ * Retrieves the cache adapter for this '<em><b>Environment</b></em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return The cache adapter for this '<em><b>Environment</b></em>'.
+ * @generated
+ */
+ protected CacheAdapter getCacheAdapter() {
+ return CacheAdapter.getInstance();
+ }
+
} // EnvironmentImpl
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/impl/EnvironmentPackageImpl.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/impl/EnvironmentPackageImpl.java
index 40ef080c36f..d8bb7eebc09 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/impl/EnvironmentPackageImpl.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/impl/EnvironmentPackageImpl.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,6 +10,7 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.environment.impl;
@@ -37,6 +38,7 @@ import org.eclipse.papyrus.infra.properties.environment.Type;
import org.eclipse.papyrus.infra.properties.environment.WidgetType;
import org.eclipse.papyrus.infra.properties.ui.UiPackage;
import org.eclipse.papyrus.infra.properties.ui.impl.UiPackageImpl;
+import org.eclipse.uml2.types.TypesPackage;
/**
* <!-- begin-user-doc -->
@@ -163,6 +165,7 @@ public class EnvironmentPackageImpl extends EPackageImpl implements EnvironmentP
// Initialize simple dependencies
ConstraintsPackage.eINSTANCE.eClass();
EcorePackage.eINSTANCE.eClass();
+ TypesPackage.eINSTANCE.eClass();
// Obtain or create and register interdependencies
Object registeredPackage = EPackage.Registry.INSTANCE.getEPackage(ContextsPackage.eNS_URI);
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/impl/MiscClassImpl.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/impl/MiscClassImpl.java
index 53c1578add6..1e71f1ca18c 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/impl/MiscClassImpl.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/impl/MiscClassImpl.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,6 +10,7 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.environment.impl;
@@ -21,6 +22,7 @@ import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
import org.eclipse.papyrus.infra.properties.environment.EnvironmentPackage;
import org.eclipse.papyrus.infra.properties.environment.MiscClass;
import org.eclipse.papyrus.infra.properties.environment.Namespace;
+import org.eclipse.uml2.common.util.CacheAdapter;
/**
* <!-- begin-user-doc -->
@@ -290,4 +292,15 @@ public class MiscClassImpl extends MinimalEObjectImpl.Container implements MiscC
return result.toString();
}
+ /**
+ * Retrieves the cache adapter for this '<em><b>Misc Class</b></em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return The cache adapter for this '<em><b>Misc Class</b></em>'.
+ * @generated
+ */
+ protected CacheAdapter getCacheAdapter() {
+ return CacheAdapter.getInstance();
+ }
+
} // MiscClassImpl
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/impl/ModelElementFactoryDescriptorImpl.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/impl/ModelElementFactoryDescriptorImpl.java
index 7d893f3c662..8573a0c7f94 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/impl/ModelElementFactoryDescriptorImpl.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/impl/ModelElementFactoryDescriptorImpl.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,6 +10,7 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.environment.impl;
@@ -19,6 +20,7 @@ import org.eclipse.emf.ecore.impl.ENotificationImpl;
import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
import org.eclipse.papyrus.infra.properties.environment.EnvironmentPackage;
import org.eclipse.papyrus.infra.properties.environment.ModelElementFactoryDescriptor;
+import org.eclipse.uml2.common.util.CacheAdapter;
/**
* <!-- begin-user-doc -->
@@ -226,4 +228,15 @@ public class ModelElementFactoryDescriptorImpl extends MinimalEObjectImpl.Contai
return result.toString();
}
+ /**
+ * Retrieves the cache adapter for this '<em><b>Model Element Factory Descriptor</b></em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return The cache adapter for this '<em><b>Model Element Factory Descriptor</b></em>'.
+ * @generated
+ */
+ protected CacheAdapter getCacheAdapter() {
+ return CacheAdapter.getInstance();
+ }
+
} // ModelElementFactoryDescriptorImpl
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/impl/NamespaceImpl.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/impl/NamespaceImpl.java
index d4cf2afb8b5..4f7a7321eae 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/impl/NamespaceImpl.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/impl/NamespaceImpl.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,6 +10,7 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.environment.impl;
@@ -19,6 +20,7 @@ import org.eclipse.emf.ecore.impl.ENotificationImpl;
import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
import org.eclipse.papyrus.infra.properties.environment.EnvironmentPackage;
import org.eclipse.papyrus.infra.properties.environment.Namespace;
+import org.eclipse.uml2.common.util.CacheAdapter;
/**
* <!-- begin-user-doc -->
@@ -282,4 +284,15 @@ public class NamespaceImpl extends MinimalEObjectImpl.Container implements Names
return result.toString();
}
+ /**
+ * Retrieves the cache adapter for this '<em><b>Namespace</b></em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return The cache adapter for this '<em><b>Namespace</b></em>'.
+ * @generated
+ */
+ protected CacheAdapter getCacheAdapter() {
+ return CacheAdapter.getInstance();
+ }
+
} // NamespaceImpl
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/impl/WidgetTypeImpl.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/impl/WidgetTypeImpl.java
index ca728a711da..8e76fdfe6bb 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/impl/WidgetTypeImpl.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/impl/WidgetTypeImpl.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,6 +10,7 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.environment.impl;
@@ -21,6 +22,7 @@ import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
import org.eclipse.papyrus.infra.properties.environment.EnvironmentPackage;
import org.eclipse.papyrus.infra.properties.environment.Namespace;
import org.eclipse.papyrus.infra.properties.environment.WidgetType;
+import org.eclipse.uml2.common.util.CacheAdapter;
/**
* <!-- begin-user-doc -->
@@ -290,4 +292,15 @@ public abstract class WidgetTypeImpl extends MinimalEObjectImpl.Container implem
return result.toString();
}
+ /**
+ * Retrieves the cache adapter for this '<em><b>Widget Type</b></em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return The cache adapter for this '<em><b>Widget Type</b></em>'.
+ * @generated
+ */
+ protected CacheAdapter getCacheAdapter() {
+ return CacheAdapter.getInstance();
+ }
+
} // WidgetTypeImpl
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/util/EnvironmentResourceFactoryImpl.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/util/EnvironmentResourceFactoryImpl.java
index 31f47d4e333..88f9ae65ea8 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/util/EnvironmentResourceFactoryImpl.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/util/EnvironmentResourceFactoryImpl.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,6 +10,7 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.environment.util;
@@ -18,12 +19,12 @@ import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.impl.ResourceFactoryImpl;
+import org.eclipse.emf.ecore.xmi.XMLResource;
/**
* <!-- begin-user-doc -->
* The <b>Resource Factory</b> associated with the package.
* <!-- end-user-doc -->
- *
* @see org.eclipse.papyrus.infra.properties.environment.util.EnvironmentResourceImpl
* @generated
*/
@@ -32,7 +33,6 @@ public class EnvironmentResourceFactoryImpl extends ResourceFactoryImpl {
* Creates an instance of the resource factory.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
- *
* @generated
*/
public EnvironmentResourceFactoryImpl() {
@@ -43,12 +43,11 @@ public class EnvironmentResourceFactoryImpl extends ResourceFactoryImpl {
* Creates an instance of the resource.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
- *
* @generated
*/
@Override
public Resource createResource(URI uri) {
- Resource result = new EnvironmentResourceImpl(uri);
+ XMLResource result = new EnvironmentResourceImpl(uri);
return result;
}
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/util/EnvironmentResourceImpl.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/util/EnvironmentResourceImpl.java
index d6061dde2f5..127705a35aa 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/util/EnvironmentResourceImpl.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/environment/util/EnvironmentResourceImpl.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,6 +10,7 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.environment.util;
@@ -20,7 +21,6 @@ import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl;
* <!-- begin-user-doc -->
* The <b>Resource </b> associated with the package.
* <!-- end-user-doc -->
- *
* @see org.eclipse.papyrus.infra.properties.environment.util.EnvironmentResourceFactoryImpl
* @generated
*/
@@ -29,9 +29,7 @@ public class EnvironmentResourceImpl extends XMIResourceImpl {
* Creates an instance of the resource.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
- *
- * @param uri
- * the URI of the new resource.
+ * @param uri the URI of the new resource.
* @generated
*/
public EnvironmentResourceImpl(URI uri) {
@@ -49,4 +47,20 @@ public class EnvironmentResourceImpl extends XMIResourceImpl {
protected boolean useUUIDs() {
return true;
}
+
+ /**
+ * In order to maintain compatibility with resources created before this implementation
+ * adopted {@linkplain #useUUIDs() UUIDs for XMI IDs}, do not assign IDs to objects that
+ * do not have them while loading so that incoming HREFs will not be broken. Otherwise,
+ * every time the resource is loaded it would generate new distinct IDs for the same
+ * objects (so long as it is not saved for some reason) and HREFs created with these IDs
+ * will not work.
+ *
+ * @return {@code false}
+ */
+ @Override
+ protected boolean assignIDsWhileLoading() {
+ return false;
+ }
+
} // EnvironmentResourceImpl
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/ui/impl/ElementImpl.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/ui/impl/ElementImpl.java
index 8af2e15b002..e14bbce86d3 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/ui/impl/ElementImpl.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/ui/impl/ElementImpl.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,6 +10,7 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.ui.impl;
@@ -17,6 +18,7 @@ import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
import org.eclipse.papyrus.infra.properties.ui.Element;
import org.eclipse.papyrus.infra.properties.ui.UiPackage;
+import org.eclipse.uml2.common.util.CacheAdapter;
/**
* <!-- begin-user-doc -->
@@ -45,4 +47,15 @@ public class ElementImpl extends MinimalEObjectImpl.Container implements Element
return UiPackage.Literals.ELEMENT;
}
+ /**
+ * Retrieves the cache adapter for this '<em><b>Element</b></em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @return The cache adapter for this '<em><b>Element</b></em>'.
+ * @generated
+ */
+ protected CacheAdapter getCacheAdapter() {
+ return CacheAdapter.getInstance();
+ }
+
} // ElementImpl
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/ui/impl/UiPackageImpl.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/ui/impl/UiPackageImpl.java
index 560579da5a8..36e0a83d587 100644
--- a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/ui/impl/UiPackageImpl.java
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src-gen/org/eclipse/papyrus/infra/properties/ui/impl/UiPackageImpl.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2011 CEA LIST.
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,6 +10,7 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.infra.properties.ui.impl;
@@ -37,6 +38,7 @@ import org.eclipse.papyrus.infra.properties.ui.UnknownComponent;
import org.eclipse.papyrus.infra.properties.ui.ValueAttribute;
import org.eclipse.papyrus.infra.properties.ui.Widget;
import org.eclipse.papyrus.infra.properties.ui.WidgetAttribute;
+import org.eclipse.uml2.types.TypesPackage;
/**
* <!-- begin-user-doc -->
@@ -170,6 +172,7 @@ public class UiPackageImpl extends EPackageImpl implements UiPackage {
// Initialize simple dependencies
ConstraintsPackage.eINSTANCE.eClass();
EcorePackage.eINSTANCE.eClass();
+ TypesPackage.eINSTANCE.eClass();
// Obtain or create and register interdependencies
Object registeredPackage = EPackage.Registry.INSTANCE.getEPackage(EnvironmentPackage.eNS_URI);
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src/org/eclipse/papyrus/infra/properties/contexts/util/ContextAnnotations.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src/org/eclipse/papyrus/infra/properties/contexts/util/ContextAnnotations.java
new file mode 100644
index 00000000000..5c96e1941e7
--- /dev/null
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src/org/eclipse/papyrus/infra/properties/contexts/util/ContextAnnotations.java
@@ -0,0 +1,237 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.properties.contexts.util;
+
+import java.util.Optional;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EcoreFactory;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.papyrus.infra.properties.contexts.Annotatable;
+import org.eclipse.papyrus.infra.properties.contexts.Annotation;
+import org.eclipse.papyrus.infra.properties.contexts.ContextsFactory;
+import org.eclipse.papyrus.infra.properties.contexts.DataContextRoot;
+
+/**
+ * Utilities for working with {@link Annotation}s in context models.
+ */
+public class ContextAnnotations {
+
+ /** The source URI for annotations known by the properties framework and tooling. */
+ public static final String ANNOTATION_SOURCE = "http://www.eclipse.org/papyrus/properties/contexts"; //$NON-NLS-1$
+
+ /**
+ * Detail indicating the URI of the source model element that the context element
+ * corresponds to (often was generated from).
+ */
+ public static final String DETAIL_MODEL = "model"; //$NON-NLS-1$
+
+ /**
+ * Detail indicating the URI of the layout generator class that was used to generate
+ * the XWT sections for the data context.
+ */
+ public static final String DETAIL_LAYOUT_GENERATOR_CLASS = "layoutGenerator"; //$NON-NLS-1$
+
+ /**
+ * Not instantiable by clients.
+ */
+ private ContextAnnotations() {
+ super();
+ }
+
+ /**
+ * Query the source model element from which a <em>Properties Context</em> model element was generated.
+ *
+ * @param contextElement
+ * a properties context model element. The context element must already be attached to
+ * the resource set, otherwise the source model retrieval cannot happen
+ * @return the corresponding source model element, or {@code null} if none could be determined.
+ *
+ * @see #getSourceModel(Annotatable, EObject) {@code getSourceModel(Annotatable, EObject)}
+ * for cases where the properties context element is not yet attached
+ */
+ public static EObject getSourceModel(Annotatable contextElement) {
+ return getSourceModel(contextElement, contextElement);
+ }
+
+ /**
+ * Query the source model element from which a <em>Properties Context</em> model element was generated,
+ * in the resource set implied by the given {@code context} object.
+ *
+ * @param contextElement
+ * a properties context model element
+ * @param context
+ * some other element from the properties context model that already exists in the resource set
+ *
+ * @return the corresponding source model element, or {@code null} if none
+ */
+ public static EObject getSourceModel(Annotatable contextElement, EObject context) {
+ Resource contextResource = context.eResource();
+ if (contextResource == null) {
+ return null;
+ }
+
+ EObject result = null;
+
+ String modelURIDetail = getAnnotation(contextElement, ANNOTATION_SOURCE, DETAIL_MODEL);
+ URI modelURI = modelURIDetail == null ? null : URI.createURI(modelURIDetail, true);
+ if (modelURI != null && modelURI.isRelative()) {
+ modelURI = modelURI.resolve(contextResource.getURI());
+ }
+
+ if (modelURI != null) {
+ URI resolved = modelURI;
+ result = Optional.ofNullable(contextResource.getResourceSet()).map(rset -> safeGetEObject(rset, resolved))
+ // Create a proxy to indicate that we have a source reference, but it doesn't resolve
+ .orElseGet(() -> createProxy(resolved));
+ } else {
+ Annotation annotation = contextElement.getAnnotation(ANNOTATION_SOURCE);
+ if (annotation != null && !annotation.getReferences().isEmpty()) {
+ // Legacy case
+ result = annotation.getReferences().get(0);
+ }
+ }
+
+ return result;
+ }
+
+ private static EObject safeGetEObject(ResourceSet resourceSet, URI uri) {
+ EObject result;
+
+ try {
+ result = resourceSet.getEObject(uri, true);
+ } catch (Exception e) {
+ // Resource does not exist or is otherwise not loadable
+ result = createProxy(uri);
+ }
+
+ return result;
+ }
+
+ private static EObject createProxy(URI proxyURI) {
+ EObject result = EcoreFactory.eINSTANCE.createEObject();
+ ((InternalEObject) result).eSetProxyURI(proxyURI);
+ return result;
+ }
+
+ /**
+ * Query the URI of the source model element from which a <em>Properties Context</em> model element was generated.
+ *
+ * @param contextElement
+ * a properties context model element
+ *
+ * @return the URI of the corresponding source model element, or {@code null} if none
+ */
+ public static URI getSourceModelURI(Annotatable contextElement) {
+ return getSourceModelURI(contextElement, contextElement);
+ }
+
+ /**
+ * Query the URI of the source model element from which a <em>Properties Context</em> model element was generated.
+ *
+ * @param contextElement
+ * a properties context model element
+ * @param context
+ * some other element from the properties context model that already exists in the resource set
+ *
+ * @return the URI of the corresponding source model element, or {@code null} if none
+ */
+ public static URI getSourceModelURI(Annotatable contextElement, EObject context) {
+ String modelURIDetail = getAnnotation(contextElement, ANNOTATION_SOURCE, DETAIL_MODEL);
+ URI result = modelURIDetail == null ? null : URI.createURI(modelURIDetail, true);
+ if (result != null && result.isRelative()) {
+ Resource contextResource = context.eResource();
+ if (contextResource != null) {
+ result = result.resolve(contextResource.getURI());
+ }
+ }
+
+ return result;
+ }
+
+ /**
+ * Set the source model element from which a <em>Properties Context</em> model element was generated.
+ *
+ * @param contextElement
+ * a context model element
+ * @param the
+ * corresponding source model element
+ */
+ public static void setSourceModel(Annotatable contextElement, EObject sourceElement) {
+ URI modelURI = (sourceElement == null) ? null : EcoreUtil.getURI(sourceElement);
+
+ if (modelURI != null) {
+ setAnnotation(contextElement, ANNOTATION_SOURCE, DETAIL_MODEL, modelURI.toString());
+ } else {
+ Annotation annotation = contextElement.getAnnotation(ANNOTATION_SOURCE);
+ if (annotation != null) {
+ annotation.getDetails().removeKey(DETAIL_MODEL);
+ // Legacy case
+ annotation.getReferences().remove(sourceElement);
+ }
+ }
+ }
+
+ public static Annotation getAnnotation(Annotatable contextElement, String source) {
+ return getAnnotation(contextElement, source, false);
+ }
+
+ public static Annotation getAnnotation(Annotatable contextElement, String source, boolean create) {
+ Annotation result = contextElement.getAnnotation(source);
+ if (result == null && create) {
+ result = ContextsFactory.eINSTANCE.createAnnotation();
+ result.setSource(source);
+ contextElement.getAnnotations().add(result);
+ }
+ return result;
+ }
+
+ public static String getAnnotation(Annotatable contextElement, String source, String detail) {
+ Annotation annotation = getAnnotation(contextElement, source);
+ return annotation != null ? annotation.getDetails().get(detail) : null;
+ }
+
+ public static void setAnnotation(Annotatable contextElement, String source, String detail, String value) {
+ getAnnotation(contextElement, source, true).getDetails().put(detail, value);
+ }
+
+ /**
+ * Query the name of the class that generated the layouts of sections for the given data context.
+ *
+ * @param dataContext
+ * a data context
+ * @return the name of the layout-generator class that was used to generate its sections, or {@code null} if none
+ */
+ public static String getLayoutGeneratorClassName(DataContextRoot dataContext) {
+ return getAnnotation(dataContext, ANNOTATION_SOURCE, DETAIL_LAYOUT_GENERATOR_CLASS);
+ }
+
+ /**
+ * Set the name of the class that generated the layouts of sections in the given data context.
+ *
+ * @param dataContext
+ * a data context
+ * @return className the name of the layout-generator class that was used to generate its sections
+ */
+ public static void setLayoutGeneratorClassName(DataContextRoot dataContext, String className) {
+ setAnnotation(dataContext, ANNOTATION_SOURCE, DETAIL_LAYOUT_GENERATOR_CLASS, className);
+ }
+
+}
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src/org/eclipse/papyrus/infra/properties/contexts/util/ContextContentTreeIterator.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src/org/eclipse/papyrus/infra/properties/contexts/util/ContextContentTreeIterator.java
new file mode 100644
index 00000000000..c7c345a1a39
--- /dev/null
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src/org/eclipse/papyrus/infra/properties/contexts/util/ContextContentTreeIterator.java
@@ -0,0 +1,93 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.properties.contexts.util;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.impl.EClassImpl;
+import org.eclipse.emf.ecore.util.EContentsEList;
+import org.eclipse.emf.ecore.util.EcoreUtil.ContentTreeIterator;
+import org.eclipse.emf.ecore.util.InternalEList;
+import org.eclipse.papyrus.infra.properties.contexts.ContextsPackage;
+import org.eclipse.papyrus.infra.properties.contexts.Section;
+
+/**
+ * A custom content tree iterator that traverses the {@link Section#getWidget() Section::widget}
+ * reference as pseudo-containment.
+ */
+public class ContextContentTreeIterator extends ContentTreeIterator<EObject> {
+
+ private static final long serialVersionUID = 1L;
+
+ public ContextContentTreeIterator(Collection<?> emfObjects) {
+ super(emfObjects);
+ }
+
+ public ContextContentTreeIterator(Object object, boolean isResolveProxies) {
+ super(object, isResolveProxies);
+ }
+
+ /**
+ * @see org.eclipse.emf.ecore.util.EcoreUtil.ContentTreeIterator#getEObjectChildren(org.eclipse.emf.ecore.EObject)
+ *
+ * @param eObject
+ * @return
+ */
+ @Override
+ protected Iterator<? extends EObject> getEObjectChildren(EObject eObject) {
+ if (ContextsPackage.Literals.SECTION.isInstance(eObject)) {
+ InternalEList<EObject> containments = new SectionContentsEList(eObject);
+ return isResolveProxies() ? containments.iterator() : containments.basicIterator();
+ } else {
+ return super.getEObjectChildren(eObject);
+ }
+ }
+
+ //
+ // Nested types
+ //
+
+ private static final class SectionContentsEList extends EContentsEList<EObject> {
+
+ /**
+ * Constructor.
+ *
+ * @param eObject
+ */
+ public SectionContentsEList(EObject eObject) {
+ super(eObject, containmentFeatures(eObject));
+ }
+
+ private static EStructuralFeature[] containmentFeatures(EObject eObject) {
+ List<EStructuralFeature> containments = new ArrayList<>(Arrays.asList(((EClassImpl.FeatureSubsetSupplier) eObject.eClass().getEAllStructuralFeatures()).containments()));
+
+ if (ContextsPackage.Literals.SECTION.isInstance(eObject)) {
+ // This is logically a containment reference (albeit cross-resource containment). In any case,
+ // it is the purpose of this class to ignore this reference
+ containments.add(ContextsPackage.Literals.SECTION__WIDGET);
+ }
+
+ return containments.toArray(EStructuralFeature[]::new);
+ }
+
+ }
+}
diff --git a/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src/org/eclipse/papyrus/infra/properties/contexts/util/ContextUsageCrossReferencer.java b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src/org/eclipse/papyrus/infra/properties/contexts/util/ContextUsageCrossReferencer.java
new file mode 100644
index 00000000000..f890f7bb5a4
--- /dev/null
+++ b/plugins/infra/properties/org.eclipse.papyrus.infra.properties/src/org/eclipse/papyrus/infra/properties/contexts/util/ContextUsageCrossReferencer.java
@@ -0,0 +1,107 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.properties.contexts.util;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.EStructuralFeature.Setting;
+import org.eclipse.emf.ecore.impl.EClassImpl;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.util.EContentsEList.FeatureIterator;
+import org.eclipse.emf.ecore.util.ECrossReferenceEList;
+import org.eclipse.emf.ecore.util.EcoreUtil.UsageCrossReferencer;
+import org.eclipse.emf.ecore.util.InternalEList;
+import org.eclipse.papyrus.infra.properties.contexts.ContextsPackage;
+
+/**
+ * A usage cross-referencer for <em>Properties Context</em> models that ignores the
+ * XWT sections.
+ */
+public class ContextUsageCrossReferencer extends UsageCrossReferencer {
+
+ private static final long serialVersionUID = -3574652001979900132L;
+
+ public ContextUsageCrossReferencer(Collection<?> emfObjects) {
+ super(emfObjects);
+ }
+
+ public ContextUsageCrossReferencer(EObject eObject) {
+ super(eObject);
+ }
+
+ public ContextUsageCrossReferencer(Resource resource) {
+ super(resource);
+ }
+
+ public ContextUsageCrossReferencer(ResourceSet resourceSet) {
+ super(resourceSet);
+ }
+
+ @Override
+ public Collection<Setting> findUsage(EObject eObject) {
+ return super.findUsage(eObject);
+ }
+
+ @Override
+ public Map<EObject, Collection<Setting>> findAllUsage(Collection<?> eObjectsOfInterest) {
+ return super.findAllUsage(eObjectsOfInterest);
+ }
+
+ @Override
+ protected FeatureIterator<EObject> getCrossReferences(EObject eObject) {
+ if (ContextsPackage.Literals.SECTION.isInstance(eObject)) {
+ InternalEList<EObject> crossReferences = new SectionCrossReferenceEList(eObject);
+ return (FeatureIterator<EObject>) (resolve() ? crossReferences.iterator() : crossReferences.basicIterator());
+ } else {
+ return super.getCrossReferences(eObject);
+ }
+ }
+
+ //
+ // Nested types
+ //
+
+ private static final class SectionCrossReferenceEList extends ECrossReferenceEList<EObject> {
+
+ /**
+ * Constructor.
+ *
+ * @param eObject
+ */
+ public SectionCrossReferenceEList(EObject eObject) {
+ super(eObject, crossReferenceFeatures(eObject));
+ }
+
+ private static EStructuralFeature[] crossReferenceFeatures(EObject eObject) {
+ List<EStructuralFeature> crossReferences = new ArrayList<>(Arrays.asList(((EClassImpl.FeatureSubsetSupplier) eObject.eClass().getEAllStructuralFeatures()).crossReferences()));
+
+ // This is logically a containment reference (albeit cross-resource containment). In any case,
+ // it is the purpose of this class to ignore this reference
+ crossReferences.remove(ContextsPackage.Literals.SECTION__WIDGET);
+
+ return crossReferences.toArray(EStructuralFeature[]::new);
+ }
+
+ }
+
+}
diff --git a/plugins/toolsmiths/builder/org.eclipse.papyrus.toolsmiths.plugin.builder/src/org/eclipse/papyrus/toolsmiths/plugin/builder/IPapyrusBuilderProvider.java b/plugins/toolsmiths/builder/org.eclipse.papyrus.toolsmiths.plugin.builder/src/org/eclipse/papyrus/toolsmiths/plugin/builder/IPapyrusBuilderProvider.java
index 77763910c00..b3ba58e37d2 100644
--- a/plugins/toolsmiths/builder/org.eclipse.papyrus.toolsmiths.plugin.builder/src/org/eclipse/papyrus/toolsmiths/plugin/builder/IPapyrusBuilderProvider.java
+++ b/plugins/toolsmiths/builder/org.eclipse.papyrus.toolsmiths.plugin.builder/src/org/eclipse/papyrus/toolsmiths/plugin/builder/IPapyrusBuilderProvider.java
@@ -15,9 +15,18 @@
package org.eclipse.papyrus.toolsmiths.plugin.builder;
+import java.io.IOException;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.ContentHandler;
+import org.eclipse.emf.ecore.resource.URIConverter;
/**
* A pluggable service that contributes {@link AbstractPapyrusBuilder}s for various
@@ -82,4 +91,31 @@ public interface IPapyrusBuilderProvider {
*/
AbstractPapyrusBuilder getBuilder(PapyrusBuilderKind builderKind, IProject project);
+ /**
+ * Query whether a resource matches a specific content type.
+ *
+ * @param resourceURI
+ * the URI of the resource to test
+ * @param contentType
+ * the content type against which to match the resource
+ * @return whether the resource is of the given content type
+ */
+ default boolean hasContentType(URI resourceURI, String contentType) {
+ boolean result = false;
+
+ try {
+ IContentType match = Platform.getContentTypeManager().getContentType(contentType);
+ Map<String, ?> description = URIConverter.INSTANCE.contentDescription(resourceURI,
+ Map.of(ContentHandler.OPTION_REQUESTED_PROPERTIES, Set.of(ContentHandler.CONTENT_TYPE_PROPERTY)));
+ result = Optional.ofNullable((String) description.get(ContentHandler.CONTENT_TYPE_PROPERTY))
+ .map(Platform.getContentTypeManager()::getContentType)
+ .filter(type -> match != null && type.isKindOf(match))
+ .isPresent();
+ } catch (IOException e) {
+ Activator.log.error("Failed to determine content type of model resource.", e); //$NON-NLS-1$
+ }
+
+ return result;
+ }
+
}
diff --git a/plugins/toolsmiths/builder/org.eclipse.papyrus.toolsmiths.plugin.builder/src/org/eclipse/papyrus/toolsmiths/plugin/internal/builder/XWTModelBuilderProvider.java b/plugins/toolsmiths/builder/org.eclipse.papyrus.toolsmiths.plugin.builder/src/org/eclipse/papyrus/toolsmiths/plugin/internal/builder/XWTModelBuilderProvider.java
index fac0b441e6f..86b9ab55b6e 100644
--- a/plugins/toolsmiths/builder/org.eclipse.papyrus.toolsmiths.plugin.builder/src/org/eclipse/papyrus/toolsmiths/plugin/internal/builder/XWTModelBuilderProvider.java
+++ b/plugins/toolsmiths/builder/org.eclipse.papyrus.toolsmiths.plugin.builder/src/org/eclipse/papyrus/toolsmiths/plugin/internal/builder/XWTModelBuilderProvider.java
@@ -32,7 +32,7 @@ import org.osgi.service.component.annotations.Component;
@Component
public class XWTModelBuilderProvider implements IPapyrusBuilderProvider {
- public static final Set<String> MODEL_FILE_EXTENSIONS = Set.of("xwt", "xmi", "ctx"); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
+ public static final Set<String> MODEL_FILE_EXTENSIONS = Set.of("xwt"); //$NON-NLS-1$
@Override
public String getProblemMarkerType(PapyrusBuilderKind builderKind) {
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/META-INF/MANIFEST.MF b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/META-INF/MANIFEST.MF
index ffb1809340f..5f9dfbbcad1 100644
--- a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/META-INF/MANIFEST.MF
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/META-INF/MANIFEST.MF
@@ -16,7 +16,8 @@ Require-Bundle:
org.eclipse.papyrus.toolsmiths.plugin.builder;bundle-version="[1.1.0,2.0.0)",
org.eclipse.papyrus.infra.core;bundle-version="[4.1.0,5.0.0)",
org.eclipse.papyrus.infra.emf;bundle-version="[4.0.0,5.0.0)",
- org.eclipse.emf.edit;bundle-version="[2.16.0,3.0.0)"
+ org.eclipse.emf.edit;bundle-version="[2.16.0,3.0.0)",
+ org.eclipse.papyrus.infra.tools;bundle-version="[4.2.0,5.0.0)"
Export-Package:
org.eclipse.papyrus.toolsmiths.validation.architecture,
org.eclipse.papyrus.toolsmiths.validation.architecture.checkers,
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/checkers/ArchitecturePluginChecker.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/checkers/ArchitecturePluginChecker.java
index 05f455658ad..0a550a1ccd4 100644
--- a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/checkers/ArchitecturePluginChecker.java
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/checkers/ArchitecturePluginChecker.java
@@ -10,7 +10,7 @@
*
* Contributors:
* Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
- * Christian W. Damus - bugs 570097, 571125, 573245
+ * Christian W. Damus - bugs 570097, 571125, 573245, 573986
*
*****************************************************************************/
@@ -42,6 +42,7 @@ import org.eclipse.papyrus.toolsmiths.validation.common.checkers.BuildProperties
import org.eclipse.papyrus.toolsmiths.validation.common.checkers.CustomModelChecker;
import org.eclipse.papyrus.toolsmiths.validation.common.checkers.ExtensionsChecker;
import org.eclipse.papyrus.toolsmiths.validation.common.checkers.IPluginChecker2;
+import org.eclipse.papyrus.toolsmiths.validation.common.checkers.JavaClassDependencies;
import org.eclipse.papyrus.toolsmiths.validation.common.checkers.ModelDependenciesChecker;
import org.eclipse.papyrus.toolsmiths.validation.common.checkers.ModelValidationChecker;
import org.eclipse.papyrus.toolsmiths.validation.common.checkers.OpaqueResourceProvider;
@@ -117,7 +118,8 @@ public class ArchitecturePluginChecker {
}
private static OpaqueResourceProvider.EMF createOpaqueResourceProvider(IProject project) {
- ArchitectureDependencies dependencies = new ArchitectureDependencies(project);
+ JavaClassDependencies dependencies = new JavaClassDependencies(project, ArchitectureCommandUtils::getCommandClass);
+
// Icon resources
return createIconProvider()
// Creation/conversion command classes
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/META-INF/MANIFEST.MF b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/META-INF/MANIFEST.MF
index 6507be21eed..3516c52f8e4 100644
--- a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/META-INF/MANIFEST.MF
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/META-INF/MANIFEST.MF
@@ -10,7 +10,7 @@ Require-Bundle: org.eclipse.emf.transaction;bundle-version="[1.9.0,2.0.0)",
org.eclipse.papyrus.infra.architecture;bundle-version="[3.0.0,4.0.0)",
org.eclipse.papyrus.infra.core.architecture;bundle-version="[3.0.0,4.0.0)",
org.eclipse.papyrus.infra.core;bundle-version="[4.0.0,5.0.0)",
- org.eclipse.papyrus.infra.tools;bundle-version="[4.0.0,5.0.0)",
+ org.eclipse.papyrus.infra.tools;bundle-version="[4.2.0,5.0.0)",
org.eclipse.papyrus.emf;bundle-version="[2.0.0,3.0.0)",
org.eclipse.ui.ide;bundle-version="[3.18.0,4.0.0)",
org.eclipse.papyrus.eclipse.project.editors;bundle-version="[3.0.0,4.0.0)",
@@ -18,15 +18,20 @@ Require-Bundle: org.eclipse.emf.transaction;bundle-version="[1.9.0,2.0.0)",
org.eclipse.emf.edit;bundle-version="[2.16.0,3.0.0)",
org.eclipse.papyrus.infra.types.core;bundle-version="[5.1.0,6.0.0)",
org.eclipse.papyrus.infra.types;bundle-version="[5.0.0,6.0.0)",
+ org.eclipse.jdt.core;bundle-version="[3.25.0,4.0.0)",
+ org.eclipse.uml2.uml;bundle-version="[5.5.0,6.0.0)";resolution:=optional,
org.eclipse.gmf.runtime.emf.type.core;bundle-version="[1.9.0,2.0.0)",
- org.eclipse.papyrus.infra.services.edit;bundle-version="[4.1.0,5.0.0)"
+ org.eclipse.papyrus.infra.services.edit;bundle-version="[4.1.0,5.0.0)",
+ org.eclipse.papyrus.uml.tools.utils;bundle-version="[4.1.0,5.0.0)"
Export-Package: org.eclipse.papyrus.toolsmiths.validation.common,
org.eclipse.papyrus.toolsmiths.validation.common.checkers,
+ org.eclipse.papyrus.toolsmiths.validation.common.command,
org.eclipse.papyrus.toolsmiths.validation.common.internal.utils;
x-friends:="org.eclipse.papyrus.toolsmiths.validation.elementtypes,
org.eclipse.papyrus.toolsmiths.validation.architecture,
org.eclipse.papyrus.toolsmiths.validation.profile,
- org.eclipse.papyrus.toolsmiths.validation.newchild",
+ org.eclipse.papyrus.toolsmiths.validation.newchild,
+ org.eclipse.papyrus.toolsmiths.validation.properties",
org.eclipse.papyrus.toolsmiths.validation.common.quickfix,
org.eclipse.papyrus.toolsmiths.validation.common.utils
Bundle-Vendor: %providerName
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/DelegatingURIConverterService.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/DelegatingURIConverterService.java
new file mode 100644
index 00000000000..b45b1b21a35
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/DelegatingURIConverterService.java
@@ -0,0 +1,140 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.common;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.function.Predicate;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.util.tracker.ServiceTracker;
+import org.osgi.util.tracker.ServiceTrackerCustomizer;
+
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.Multimap;
+import com.google.common.collect.Multimaps;
+
+/**
+ * The delegating URI converter service implementation.
+ */
+class DelegatingURIConverterService implements URIConverterService {
+
+ private final Multimap<String, URIConverterService> delegates = Multimaps.synchronizedMultimap(ArrayListMultimap.create());
+ private ServiceTracker<URIConverterService, URIConverterService> delegatesTracker;
+
+ DelegatingURIConverterService() {
+ super();
+
+ BundleContext context = Activator.getDefault().getBundle().getBundleContext();
+ delegatesTracker = new ServiceTracker<>(context, URIConverterService.class, new Customizer(context));
+ delegatesTracker.open();
+ }
+
+ @Override
+ public URI normalize(URI uri, ResourceSet context) {
+ URI result = context.getURIConverter().normalize(uri);
+
+ Collection<URIConverterService> delegates = this.delegates.get(uri.scheme());
+ if (!delegates.isEmpty()) {
+ result = normalize(uri, context, delegates);
+ }
+
+ return result;
+ }
+
+ private URI normalize(URI uri, ResourceSet context, Collection<URIConverterService> delegates) {
+ URI result = uri;
+
+ for (Iterator<URIConverterService> iter = delegates.iterator(); iter.hasNext() && uri.equals(result);) {
+ result = iter.next().normalize(uri, context);
+ }
+
+ return result;
+ }
+
+ //
+ // Nested types
+ //
+
+ private final class Customizer implements ServiceTrackerCustomizer<URIConverterService, URIConverterService> {
+
+ private final BundleContext context;
+
+ Customizer(BundleContext context) {
+ super();
+
+ this.context = context;
+ }
+
+ @Override
+ public URIConverterService addingService(ServiceReference<URIConverterService> reference) {
+ return register(reference, context.getService(reference));
+ }
+
+ private URIConverterService register(ServiceReference<URIConverterService> reference, URIConverterService service) {
+ URIConverterService result = service;
+
+ Object schemes = reference.getProperty(SCHEME_PROPERTY);
+ if (schemes instanceof String) {
+ register((String) schemes, result);
+ } else if (schemes instanceof String[]) {
+ String[] schemeArray = (String[]) schemes;
+ if (schemeArray.length == 0) {
+ result = null;
+ } else {
+ for (String scheme : schemeArray) {
+ register(scheme, result);
+ }
+ }
+ }
+
+ if (result == null) {
+ context.ungetService(reference);
+ }
+
+ return result;
+ }
+
+ private void register(String scheme, URIConverterService service) {
+ if (service instanceof DelegatingURIConverterService) {
+ throw new IllegalArgumentException("attempt to register the delegating service to itself"); //$NON-NLS-1$
+ }
+
+ delegates.put(scheme, service);
+ }
+
+ private void unregister(URIConverterService service) {
+ delegates.values().removeIf(Predicate.isEqual(service));
+ }
+
+ @Override
+ public void modifiedService(ServiceReference<URIConverterService> reference, URIConverterService service) {
+ unregister(service);
+ register(reference, service);
+ }
+
+ @Override
+ public void removedService(ServiceReference<URIConverterService> reference, URIConverterService service) {
+ unregister(service);
+ context.ungetService(reference);
+ }
+
+ }
+
+}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/URIConverterService.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/URIConverterService.java
new file mode 100644
index 00000000000..3b941b954c2
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/URIConverterService.java
@@ -0,0 +1,51 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.common;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.URIConverter;
+
+/**
+ * A service that is like the EMF {@link URIConverter} but that is discoverable
+ * via OSGi and is intended to handle custom URI schemes, not arbitrary mappings
+ * that are better handled by EMF's URI mapping extension point.
+ * Registered services must declare the URI scheme that they handle via the
+ * {@link #SCHEME_PROPERTY} property.
+ */
+public interface URIConverterService {
+
+ /** A shared service instance that delegates to registered converter services. */
+ URIConverterService INSTANCE = new DelegatingURIConverterService();
+
+ /**
+ * OSGi service property indicating the URI scheme or schemes (if an array)
+ * that the converter service can convert.
+ */
+ String SCHEME_PROPERTY = "papyrus.toolsmiths.uri.scheme"; //$NON-NLS-1$
+
+ /**
+ * Normalize a URI in the given resource set {@code context}.
+ *
+ * @param uri
+ * a URI to convert
+ * @param context
+ * the resource set, which may be used to delegate to its {@link URIConverter}, if appropriate
+ * @return the converted URI, or the original URI if it cannot be converted
+ */
+ URI normalize(URI uri, ResourceSet context);
+
+}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/checkers/BasicEMFResourceProvider.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/checkers/BasicEMFResourceProvider.java
index 911891832a1..fe317be2e58 100644
--- a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/checkers/BasicEMFResourceProvider.java
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/checkers/BasicEMFResourceProvider.java
@@ -34,11 +34,11 @@ import org.eclipse.emf.common.util.DiagnosticChain;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.EObjectValidator;
import org.eclipse.osgi.service.resolver.BundleDescription;
import org.eclipse.osgi.util.NLS;
import org.eclipse.papyrus.toolsmiths.validation.common.internal.messages.Messages;
+import org.eclipse.papyrus.toolsmiths.validation.common.utils.CommonURIUtils;
import org.eclipse.pde.core.plugin.IPluginModelBase;
import org.eclipse.pde.core.plugin.PluginRegistry;
@@ -140,36 +140,42 @@ class BasicEMFResourceProvider implements OpaqueResourceProvider.EMF {
return null;
}
- if (result.isRelative() && result.isHierarchical()) {
- // Sometimes the developer puts a leading '/' in the path that will confuse this resolution process
- if (result.hasAbsolutePath() && !result.hasAuthority() && !result.hasDevice()) {
- // Create a relative-path URI (we already know that it has no scheme because it's a relative URI
- result = URI.createHierarchicalURI(result.segments(), result.query(), result.fragment());
+ if (result != null) {
+ if (result.isRelative() && result.isHierarchical()) {
+ // Sometimes the developer puts a leading '/' in the path that will confuse this resolution process
+ if (result.hasAbsolutePath() && !result.hasAuthority() && !result.hasDevice()) {
+ // Create a relative-path URI (we already know that it has no scheme because it's a relative URI
+ result = URI.createHierarchicalURI(result.segments(), result.query(), result.fragment());
+ }
+ result = result.resolve(baseURIFunction.apply(object, project));
}
- result = result.resolve(baseURIFunction.apply(object, project));
- }
- if (result.isPlatform()) {
- // Can check for existence of the resource
- ResourceSet rset = object.eResource().getResourceSet();
- if (!rset.getURIConverter().exists(result, null)) {
+ // Check for existence of the resource, if applicable
+ if (!CommonURIUtils.exists(object, result)) {
BasicDiagnostic diagnostic = new BasicDiagnostic(Diagnostic.ERROR, diagnosticSource, 0,
NLS.bind(Messages.BasicEMFResourceProvider_1,
new Object[] { result.lastSegment(), EObjectValidator.getObjectLabel(object, context), resourceClassifier }),
new Object[] { object, referenceAttribute });
diagnostics.add(diagnostic);
- return null;
+ result = null;
}
}
- return new ClassifiedURIImpl(result, resourceClassifier);
+ return result == null ? null : new ClassifiedURIImpl(result, resourceClassifier);
}
static URI getURI(EObject owner, EAttribute attribute, Object value) {
- if (!attribute.getEContainingClass().isInstance(owner)) {
- return null;
+ URI result = null;
+
+ if (value != null && attribute.getEContainingClass().isInstance(owner)) {
+ URI uri = value instanceof URI ? (URI) value : URI.createURI(String.valueOf(value), true);
+
+ if (!uri.isEmpty()) {
+ result = uri;
+ }
}
- return value instanceof URI ? (URI) value : URI.createURI(String.valueOf(value), true);
+
+ return result;
}
}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/checkers/BuildPropertiesChecker.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/checkers/BuildPropertiesChecker.java
index 336307e5408..6def766ac06 100644
--- a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/checkers/BuildPropertiesChecker.java
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/checkers/BuildPropertiesChecker.java
@@ -11,7 +11,7 @@
* Contributors:
* Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
* Remi Schnekenburger (EclipseSource) - Bug 568495
- * Christian W. Damus - bugs 569357, 570097, 571125
+ * Christian W. Damus - bugs 569357, 570097, 571125, 573986
*
*****************************************************************************/
@@ -381,7 +381,7 @@ public class BuildPropertiesChecker extends AbstractPluginChecker {
// If it's a platform plugin resource, then it is expected to be deployed independently
// and so needs not be considered in our build.properties validation
String uriPlatformString = uri.toPlatformString(true);
- result = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(uriPlatformString));
+ result = ResourcesPlugin.getWorkspace().getRoot().findMember(new Path(uriPlatformString));
}
return result;
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/checkers/CustomModelChecker.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/checkers/CustomModelChecker.java
index 2998d6dfe45..91c7013390e 100644
--- a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/checkers/CustomModelChecker.java
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/checkers/CustomModelChecker.java
@@ -20,16 +20,23 @@ import static org.eclipse.papyrus.toolsmiths.validation.common.checkers.ModelVal
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
+import java.util.ArrayDeque;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.function.Function;
+import java.util.stream.Collectors;
import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.util.BasicDiagnostic;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.DiagnosticChain;
@@ -47,6 +54,7 @@ import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.Diagnostician;
import org.eclipse.emf.ecore.util.EObjectValidator;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
+import org.eclipse.emf.edit.provider.IDisposable;
import org.eclipse.osgi.util.NLS;
import org.eclipse.papyrus.toolsmiths.validation.common.Activator;
import org.eclipse.papyrus.toolsmiths.validation.common.internal.messages.Messages;
@@ -75,6 +83,8 @@ public class CustomModelChecker extends AbstractPluginChecker {
private final EValidator nullValidator = new NullValidator();
+ private Function<? super AdapterFactory, ? extends AdapterFactory> adapterFactoryDecoratorFunction;
+
/**
* Constructor.
*
@@ -105,11 +115,29 @@ public class CustomModelChecker extends AbstractPluginChecker {
return this;
}
+ /**
+ * Configure a function to decorate the adapter factory used to obtain labels for objects in problem messages.
+ *
+ * @param <A>
+ * the adapter factory type created by the decorator function
+ * @param decoratorFunction
+ * a function to decorate an adapter factory
+ */
+ public <A extends AdapterFactory & IDisposable> CustomModelChecker withAdapterFactoryDecorator(Function<? super AdapterFactory, A> decoratorFunction) {
+ adapterFactoryDecoratorFunction = decoratorFunction;
+ return this;
+ }
+
@Override
public void check(final DiagnosticChain diagnostics, final IProgressMonitor monitor) {
SubMonitor subMonitor = SubMonitor.convert(monitor, NLS.bind(Messages.CustomModelChecker_0, getModelFile().getName()), 1);
- ComposedAdapterFactory adapterFactory = new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE);
+ ComposedAdapterFactory composed = new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE);
+ AdapterFactory adapterFactory = decorateAdapterFactory(composed);
+ if (!(adapterFactory instanceof IDisposable)) {
+ composed.dispose();
+ throw new IllegalStateException("adapter factory is not disposable");
+ }
final EValidator.SubstitutionLabelProvider labels = createSubstitutionLabelProvider(adapterFactory);
Map<Object, Object> context = new HashMap<>();
@@ -120,21 +148,32 @@ public class CustomModelChecker extends AbstractPluginChecker {
BasicDiagnostic validationResults = new BasicDiagnostic();
Diagnostician diagnostician = new Diagnostician(new ValidatorRegistry());
- for (EObject next : resource.getContents()) {
- diagnostician.validate(next, validationResults, context);
+ ResourceQueue queue = ResourceQueue.getInstance(context);
+ queue.offer(this.resource);
+
+ for (Resource resource = queue.poll(); resource != null; resource = queue.poll()) {
+ for (EObject next : resource.getContents()) {
+ diagnostician.validate(next, validationResults, context);
+ }
}
if (validationResults.getSeverity() > Diagnostic.OK) {
diagnostics.merge(wrap(validationResults));
}
} finally {
- adapterFactory.dispose();
+ ((IDisposable) adapterFactory).dispose();
}
subMonitor.worked(1);
SubMonitor.done(monitor);
}
+ private AdapterFactory decorateAdapterFactory(AdapterFactory adapterFactory) {
+ return adapterFactoryDecoratorFunction != null
+ ? adapterFactoryDecoratorFunction.apply(adapterFactory)
+ : adapterFactory;
+ }
+
//
// Nested types
//
@@ -340,6 +379,16 @@ public class CustomModelChecker extends AbstractPluginChecker {
} else if (argument instanceof Value) {
Value value = (Value) argument;
result = getValueLabel(value.dataType, value.value, context);
+ } else if (argument instanceof Iterable<?>) {
+ result = StreamSupport.stream(((Iterable<?>) argument).spliterator(), false)
+ .map(el -> formatArgument(el, context))
+ .map(String::valueOf)
+ .collect(Collectors.joining(", ", "[", "]"));
+ } else if (argument instanceof Object[]) {
+ result = Stream.of((Object[]) argument)
+ .map(el -> formatArgument(el, context))
+ .map(String::valueOf)
+ .collect(Collectors.joining(", ", "[", "]"));
}
return result;
}
@@ -389,12 +438,39 @@ public class CustomModelChecker extends AbstractPluginChecker {
}
protected Diagnostic createDiagnostic(int severity, EObject eObject, EStructuralFeature feature, int code, String message, MarkerAttribute attr1, MarkerAttribute... moreAttrs) {
+ return createDiagnostic(severity, eObject, feature, code, message, Lists.asList(attr1, moreAttrs));
+ }
+
+ protected Diagnostic createDiagnostic(int severity, EObject eObject, String message, Collection<? extends MarkerAttribute> moreAttrs) {
+ return createDiagnostic(severity, eObject, null, 0, message, moreAttrs);
+ }
+
+ protected Diagnostic createDiagnostic(int severity, EObject eObject, EStructuralFeature feature, String message, Collection<? extends MarkerAttribute> moreAttrs) {
+ return createDiagnostic(severity, eObject, feature, 0, message, moreAttrs);
+ }
+
+ protected Diagnostic createDiagnostic(int severity, EObject eObject, EStructuralFeature feature, int code, String message, Collection<? extends MarkerAttribute> moreAttrs) {
List<Object> data = diagnosticData(eObject, feature);
- data.addAll(Lists.asList(attr1, moreAttrs));
+ data.addAll(moreAttrs);
return new BasicDiagnostic(severity, source, code, message, data.toArray());
}
+ /**
+ * Add an auxiliary resource to the current validation scope. It will be validated after
+ * processing of the current resource is completed, if it has not already been validated.
+ *
+ * @param auxiliaryResource
+ * a resource to validate
+ * @param context
+ * the current validation context
+ */
+ protected void validateResource(Resource auxiliaryResource, Map<Object, Object> context) {
+ if (auxiliaryResource != null && auxiliaryResource.isLoaded()) {
+ ResourceQueue.getInstance(context).offer(auxiliaryResource);
+ }
+ }
+
protected boolean isValidatorFor(EPackage ePackage) {
return nsURI.equals(ePackage.getNsURI());
}
@@ -491,4 +567,50 @@ public class CustomModelChecker extends AbstractPluginChecker {
}
}
+ @SuppressWarnings("serial") // Never serialized
+ private static final class ResourceQueue extends ArrayDeque<Resource> {
+ // To avoid repeating resources
+ private final Set<Resource> processed = new HashSet<>();
+
+ /**
+ * Not instantiable by clients.
+ */
+ private ResourceQueue() {
+ super();
+ }
+
+ static ResourceQueue getInstance(Map<Object, Object> context) {
+ ResourceQueue result = (ResourceQueue) context.get(ResourceQueue.class);
+ if (result == null) {
+ result = new ResourceQueue();
+ context.put(ResourceQueue.class, result);
+ }
+ return result;
+ }
+
+ @Override
+ public boolean offerFirst(Resource e) {
+ return !processed.contains(e) && super.offerFirst(e);
+ }
+
+ @Override
+ public boolean offerLast(Resource e) {
+ return !processed.contains(e) && super.offerLast(e);
+ }
+
+ @Override
+ public void addFirst(Resource e) {
+ if (processed.add(e)) {
+ super.addFirst(e);
+ }
+ }
+
+ @Override
+ public void addLast(Resource e) {
+ if (processed.add(e)) {
+ super.addLast(e);
+ }
+ }
+ }
+
}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/checkers/ExtensionsChecker.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/checkers/ExtensionsChecker.java
index 603d8314388..d5733cc0ac1 100644
--- a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/checkers/ExtensionsChecker.java
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/checkers/ExtensionsChecker.java
@@ -103,7 +103,7 @@ public class ExtensionsChecker<T extends EObject, P extends DefaultHandler & IPl
final IFile pluginXML = ProjectManagementService.getPluginXMLFile(project);
if (pluginXML == null) {
- MarkersService.createMarker(modelFile, PDEMarkerFactory.MARKER_ID, NLS.bind(Messages.ExtensionsChecker_1, modelFile.getName()), IMarker.SEVERITY_ERROR);
+ MarkersService.createMarker(modelFile, getMarkerType(), NLS.bind(Messages.ExtensionsChecker_1, modelFile.getName()), IMarker.SEVERITY_ERROR);
return;
}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/checkers/IPluginChecker2.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/checkers/IPluginChecker2.java
index 4c2ab38ea52..1e19ab6cf8f 100644
--- a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/checkers/IPluginChecker2.java
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/checkers/IPluginChecker2.java
@@ -469,8 +469,8 @@ public interface IPluginChecker2 {
marker.setAttribute(name, (boolean) value);
} else if (value instanceof Integer) {
marker.setAttribute(name, (int) value);
- } else {
- marker.setAttribute(name, value);
+ } else if (value != null) {
+ marker.setAttribute(name, String.valueOf(value));
}
} catch (CoreException e) {
Activator.log.error("Could not set marker attribute.", e); //$NON-NLS-1$
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/checkers/ArchitectureDependencies.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/checkers/JavaClassDependencies.java
index e6eca97cd14..190bcf8c321 100644
--- a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.architecture/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/checkers/ArchitectureDependencies.java
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/checkers/JavaClassDependencies.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ * Copyright (c) 2021 CEA LIST and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -9,13 +9,14 @@
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
- * Christian W. Damus - Initial API and implementation
+ * CEA LIST - Initial API and implementation
*
*****************************************************************************/
-package org.eclipse.papyrus.toolsmiths.validation.architecture.internal.checkers;
+package org.eclipse.papyrus.toolsmiths.validation.common.checkers;
import java.util.Optional;
+import java.util.function.BiFunction;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
@@ -24,38 +25,46 @@ import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.jdt.core.IJavaModel;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.IType;
import org.eclipse.osgi.service.resolver.BundleDescription;
-import org.eclipse.papyrus.infra.core.architecture.util.ArchitectureCommandUtils;
+import org.eclipse.papyrus.infra.tools.util.ClasspathHelper;
import org.eclipse.pde.core.plugin.IPluginModelBase;
import org.eclipse.pde.core.plugin.PluginRegistry;
import org.osgi.framework.Bundle;
import org.osgi.framework.FrameworkUtil;
/**
- * Inference of bundle dependencies from the command classes referenced by an <em>Architecture Model</em>.
+ * Inference of bundle dependencies from the Java classes referenced by a tooling model.
*/
-class ArchitectureDependencies {
+public class JavaClassDependencies {
private final String hostBundle;
+ private final BiFunction<? super EObject, ? super EAttribute, ?> classExtractor;
- ArchitectureDependencies(IProject project) {
+ public JavaClassDependencies(IProject project) {
+ this(project, null);
+ }
+
+ public JavaClassDependencies(IProject project, BiFunction<? super EObject, ? super EAttribute, ?> classExtractor) {
super();
this.hostBundle = Optional.ofNullable(PluginRegistry.findModel(project))
.map(IPluginModelBase::getBundleDescription)
.map(BundleDescription::getSymbolicName)
.orElse(project.getName());
+ this.classExtractor = (classExtractor != null) ? classExtractor : this::getClass;
}
- URI getClassURI(EObject owner, EAttribute attribute, String className) {
+ public URI getClassURI(EObject owner, EAttribute attribute, String className) {
Optional<String> bundleName;
- Object commandClass = ArchitectureCommandUtils.getCommandClass(owner, attribute);
+ Object commandClass = classExtractor.apply(owner, attribute);
if (commandClass instanceof Class) {
Bundle bundle = FrameworkUtil.getBundle((Class<?>) commandClass);
bundleName = Optional.ofNullable(bundle).map(Bundle::getSymbolicName);
@@ -97,4 +106,24 @@ class ArchitectureDependencies {
return URI.createURI(String.format("bundleclass://%s/%s", bundleName.orElse(hostBundle), className)); //$NON-NLS-1$
}
+ private Object getClass(EObject owner, EAttribute attribute) {
+ Object result = null;
+
+ EDataType dataType = attribute.getEAttributeType();
+
+ if (dataType.getInstanceClass() == Class.class || dataType.getInstanceClass() == URI.class) {
+ // Easy case
+ result = owner.eGet(attribute);
+ } else if (dataType.getInstanceClass() == String.class) {
+ String className = (String) owner.eGet(attribute);
+ URI context = EcoreUtil.getURI(owner);
+ if (context != null) {
+ context = context.trimFragment();
+ }
+ result = ClasspathHelper.INSTANCE.findClass(className, context, null);
+ }
+
+ return result;
+ }
+
}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/checkers/ModelDependenciesChecker.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/checkers/ModelDependenciesChecker.java
index 05b9768f365..8f41aa2ba28 100644
--- a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/checkers/ModelDependenciesChecker.java
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/checkers/ModelDependenciesChecker.java
@@ -11,7 +11,7 @@
* Contributors:
* Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
* Remi Schnekenburger (EclipseSource) - Bug 568495
- * Christian W. Damus - bugs 569357, 570097, 571125
+ * Christian W. Damus - bugs 569357, 570097, 571125, 573986
*
*****************************************************************************/
package org.eclipse.papyrus.toolsmiths.validation.common.checkers;
@@ -30,8 +30,6 @@ import java.util.Queue;
import java.util.Set;
import java.util.function.Function;
import java.util.function.ToIntFunction;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
import org.eclipse.core.filebuffers.FileBuffers;
import org.eclipse.core.filebuffers.ITextFileBuffer;
@@ -46,7 +44,6 @@ import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.DiagnosticChain;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.resource.Resource;
@@ -57,13 +54,12 @@ import org.eclipse.osgi.service.resolver.BundleSpecification;
import org.eclipse.osgi.util.NLS;
import org.eclipse.papyrus.toolsmiths.validation.common.Activator;
import org.eclipse.papyrus.toolsmiths.validation.common.internal.messages.Messages;
+import org.eclipse.papyrus.toolsmiths.validation.common.utils.CommonURIUtils;
import org.eclipse.papyrus.toolsmiths.validation.common.utils.ProjectManagementService;
import org.eclipse.pde.internal.core.ibundle.IManifestHeader;
import org.eclipse.pde.internal.core.text.bundle.BundleModel;
import org.eclipse.pde.internal.core.text.bundle.ManifestHeader;
-import org.osgi.framework.Bundle;
import org.osgi.framework.Constants;
-import org.osgi.framework.FrameworkUtil;
/**
* A checker that verifies specification of the dependencies for bundles that provide the resources
@@ -72,12 +68,6 @@ import org.osgi.framework.FrameworkUtil;
@SuppressWarnings("restriction")
public class ModelDependenciesChecker extends AbstractPluginChecker {
- /** The URI scheme for Equinox's internal <tt>bundleresource://</tt> URIs. */
- private static final String BUNDLE_RESOURCE_SCHEME = "bundleresource"; //$NON-NLS-1$
-
- /** The URI scheme for e4's <tt>bundleclass://</tt> URIs. */
- private static final String BUNDLE_CLASS_SCHEME = "bundleclass"; //$NON-NLS-1$
-
/**
* The EMF model resource.
*/
@@ -90,9 +80,6 @@ public class ModelDependenciesChecker extends AbstractPluginChecker {
private OpaqueResourceProvider.EMF opaqueResourceProvider;
- /** Regex to parse the bundle ID out of a URI of <tt>bundleresource:</tt> scheme. */
- private final Pattern bundleResourceAuthorityPattern = Pattern.compile("^\\d+"); //$NON-NLS-1$
-
/**
* Initializes me to report all missing bundle dependencies as errors.
*
@@ -508,37 +495,8 @@ public class ModelDependenciesChecker extends AbstractPluginChecker {
* which then would have been reported to the {@code diagnostics}.
*/
private String getPluginNameFromURI(final URI uri, final DiagnosticChain diagnostics) {
- String pluginName = null;
-
- if ((uri.isPlatformPlugin() || uri.isPlatformResource()) && uri.segmentCount() > 1) {
- pluginName = uri.segment(1);
- } else if (BUNDLE_CLASS_SCHEME.equals(uri.scheme()) && uri.hasAuthority()) {
- pluginName = uri.authority();
- } else if (BUNDLE_RESOURCE_SCHEME.equals(uri.scheme()) && uri.hasAuthority()) {
- Bundle bundle = null;
- Matcher m = bundleResourceAuthorityPattern.matcher(uri.authority());
- if (m.find()) {
- long bundleID = Long.parseLong(m.group());
- bundle = Activator.getDefault().getBundle().getBundleContext().getBundle(bundleID);
- }
- if (bundle != null) {
- pluginName = bundle.getSymbolicName();
- }
- } else {
- // Is it a registered package?
- EPackage ePackage = resource.getResourceSet().getPackageRegistry().getEPackage(uri.toString());
- if (ePackage != null) {
- Bundle bundle = FrameworkUtil.getBundle(ePackage.getClass());
- if (bundle != null) {
- pluginName = bundle.getSymbolicName();
- }
- } else {
- // This doesn't look like any URI that resolves into a bundle
- diagnostics.add(createDiagnostic(Diagnostic.WARNING, 0, NLS.bind(Messages.ModelDependenciesChecker_2, uri)));
- }
- }
-
- return pluginName;
+ return CommonURIUtils.getBundleName(resource.getResourceSet(), uri).orElseAccept(
+ (reason) -> diagnostics.add(createDiagnostic(Diagnostic.WARNING, 0, reason)));
}
/**
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/command/TouchResourceCommand.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/command/TouchResourceCommand.java
new file mode 100644
index 00000000000..d407aca5fa2
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/command/TouchResourceCommand.java
@@ -0,0 +1,99 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.common.command;
+
+import static java.util.function.Predicate.not;
+import static java.util.stream.Collectors.collectingAndThen;
+import static java.util.stream.Collectors.filtering;
+import static java.util.stream.Collectors.mapping;
+import static java.util.stream.Collectors.reducing;
+
+import java.util.stream.Collector;
+
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.common.command.CompoundCommand;
+import org.eclipse.emf.common.command.IdentityCommand;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.edit.command.AbstractOverrideableCommand;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.papyrus.toolsmiths.validation.common.internal.messages.Messages;
+
+/**
+ * A command that marks a resource as modified so that it should be written
+ * to disk with changes that are implied by other means than editing of its contents.
+ * That may include, for example, the need to update HREFs for refactorings of
+ * objects in other resources.
+ */
+public class TouchResourceCommand extends AbstractOverrideableCommand {
+
+ private Resource resource;
+ private boolean wasModified;
+
+ public TouchResourceCommand(EditingDomain domain, Resource resource) {
+ super(domain, Messages.TouchResourceCommand_0, Messages.TouchResourceCommand_1);
+
+ this.resource = resource;
+ }
+
+ @Override
+ public void doDispose() {
+ resource = null;
+
+ super.doDispose();
+ }
+
+ @Override
+ protected boolean prepare() {
+ return resource != null;
+ }
+
+ @Override
+ public void doExecute() {
+ wasModified = resource.isModified();
+ if (!wasModified) {
+ resource.setModified(true);
+ }
+ }
+
+ @Override
+ public void doUndo() {
+ resource.setModified(wasModified);
+ }
+
+ @Override
+ public void doRedo() {
+ if (!wasModified) {
+ resource.setModified(true);
+ }
+ }
+
+ /**
+ * Collect a stream of resources into a command that touches them.
+ *
+ * @param domain
+ * the contextual editing domain in which to create the touch commands
+ *
+ * @return the touch commands collected, perhaps in a {@link CompoundCommand}
+ */
+ public static Collector<Resource, ?, Command> toTouchCommand(EditingDomain domain) {
+ return collectingAndThen(
+ filtering(not(Resource::isModified),
+ mapping(resource -> (Command) new TouchResourceCommand(domain, resource),
+ reducing(Command::chain))),
+ optional -> optional.orElse(IdentityCommand.INSTANCE));
+ }
+
+}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/internal/messages/Messages.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/internal/messages/Messages.java
index 3cbb084b5f9..b38bd4b9349 100644
--- a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/internal/messages/Messages.java
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/internal/messages/Messages.java
@@ -29,12 +29,14 @@ public class Messages extends NLS {
public static String BasicPluginXMLResourceProvider_1;
public static String BuildPropertiesChecker_2;
public static String BuildPropertiesChecker_3;
+ public static String CommonMarkerResolutionUtils_0;
+ public static String CommonMarkerResolutionUtils_1;
+ public static String CommonURIUtils_0;
public static String CustomModelChecker_0;
public static String ExtensionsChecker_0;
public static String ExtensionsChecker_1;
public static String ModelDependenciesChecker_0;
public static String ModelDependenciesChecker_1;
- public static String ModelDependenciesChecker_2;
public static String PluginErrorReporter_0;
public static String MissingDependenciesMarkerResolution_description;
public static String MissingDependenciesMarkerResolution_label;
@@ -46,6 +48,9 @@ public class Messages extends NLS {
public static String ResourceMissingFromBinaryBuildMarkerResolution_label;
public static String ResourceMissingFromBinaryBuildMarkerResolution_folder;
public static String ResourceMissingFromBinaryBuildMarkerResolution_file;
+ public static String SimpleModelEditMarkerResolution_0;
+ public static String TouchResourceCommand_0;
+ public static String TouchResourceCommand_1;
static {
// initialize resource bundle
NLS.initializeMessages(BUNDLE_NAME, Messages.class);
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/internal/messages/messages.properties b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/internal/messages/messages.properties
index ce5896a8a39..a871737f982 100644
--- a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/internal/messages/messages.properties
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/internal/messages/messages.properties
@@ -10,7 +10,7 @@
#
# Contributors:
# CEA LIST - Initial API and implementation
-# Christian W. Damus - bug 570097
+# Christian W. Damus - bugs 570097, 573986
#
##################################################################################
@@ -20,12 +20,14 @@ BasicPluginXMLResourceProvider_0=Invalid {1} URI in <{0}>: {2}.
BasicPluginXMLResourceProvider_1=No such {2} ''{0}'' in <{1}>.
BuildPropertiesChecker_2=Validate 'build.properties' file for ''{0}''.
BuildPropertiesChecker_3=The build does not include ''{0}''.
+CommonMarkerResolutionUtils_0=Confirm Save
+CommonMarkerResolutionUtils_1=The editor "{0}" must be saved before the quick fix can be applied. Save and proceed?
+CommonURIUtils_0=Suspicious URI: cannot infer bundle name in ''{0}''
CustomModelChecker_0=Validating model file ''{0}''
ExtensionsChecker_0=Checking file: {0}
-ExtensionsChecker_1=No extensions are declared for ''{0}''.
+ExtensionsChecker_1=No extensions are declared for ''{0}'' because the plugin.xml file is missing.
ModelDependenciesChecker_0=Check dependencies for ''{0}''.
ModelDependenciesChecker_1=The plug-in ''{1}'' must be declared as required plug-in (for ''{0}'').
-ModelDependenciesChecker_2=Suspicious URI: cannot infer bundle name in ''{0}''
PluginErrorReporter_0=Missing extension on point ''{0}'' for ''{2}'' [{1}].
MissingDependenciesMarkerResolution_description=Add the missing dependencies in the manifest, with a calculated range.
MissingDependenciesMarkerResolution_label=Add missing dependencies, with a calculated range
@@ -37,3 +39,6 @@ ResourceMissingFromBinaryBuildMarkerResolution_description=Add resource to 'buil
ResourceMissingFromBinaryBuildMarkerResolution_label=Add {0} to the binary build
ResourceMissingFromBinaryBuildMarkerResolution_folder=the folder containing the file
ResourceMissingFromBinaryBuildMarkerResolution_file=the file
+SimpleModelEditMarkerResolution_0=Quick fix "{1}" failed to save changes to resource {0}.
+TouchResourceCommand_0=Touch Resource
+TouchResourceCommand_1=Mark the resource as modified
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/quickfix/CommonMarkerResolutionGenerator.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/quickfix/CommonMarkerResolutionGenerator.java
index dfdc3954d84..ef5e39a8ab9 100644
--- a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/quickfix/CommonMarkerResolutionGenerator.java
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/quickfix/CommonMarkerResolutionGenerator.java
@@ -10,18 +10,23 @@
*
* Contributors:
* Alexandra Buzila (EclipseSource) - Initial API and implementation
- * Christian W. Damus - bug 570097
+ * Christian W. Damus - bugs 570097, 573986
*
*****************************************************************************/
package org.eclipse.papyrus.toolsmiths.validation.common.quickfix;
+import java.util.Objects;
+import java.util.Optional;
+
import org.eclipse.core.resources.IMarker;
import org.eclipse.papyrus.toolsmiths.validation.common.checkers.CommonProblemConstants;
import org.eclipse.pde.internal.core.builders.PDEMarkerFactory;
import org.eclipse.ui.IMarkerResolution;
import org.eclipse.ui.IMarkerResolutionGenerator2;
+import com.google.common.collect.Iterables;
+
/**
* Resolution generator for markers created by the common plug-in builders validation
* framework: manifest problems, build spec problems, and common <tt>plugin.xml</tt> problems.
@@ -42,10 +47,18 @@ public class CommonMarkerResolutionGenerator implements IMarkerResolutionGenerat
return new IMarkerResolution[] { resolution };
}
+ protected final IMarkerResolution[] maybe(Optional<? extends IMarkerResolution> resolution) {
+ return resolution.map(res -> new IMarkerResolution[] { res }).orElse(NO_RESOLUTIONS);
+ }
+
protected final IMarkerResolution[] allOf(IMarkerResolution... resolutions) {
return resolutions;
}
+ protected final IMarkerResolution[] allOf(Iterable<? extends IMarkerResolution> resolutions) {
+ return Iterables.toArray(Iterables.filter(resolutions, Objects::nonNull), IMarkerResolution.class);
+ }
+
@Override
public IMarkerResolution[] getResolutions(IMarker marker) {
int problemID = marker.getAttribute(PDEMarkerFactory.PROBLEM_ID, PDEMarkerFactory.NO_RESOLUTION);
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/quickfix/CommonMarkerResolutionUtils.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/quickfix/CommonMarkerResolutionUtils.java
index 5c0d5fc1dfb..11424202a33 100644
--- a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/quickfix/CommonMarkerResolutionUtils.java
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/quickfix/CommonMarkerResolutionUtils.java
@@ -10,13 +10,17 @@
*
* Contributors:
* Christian W. Damus - Initial API and implementation
- * Christian W. Damus - bugs 570097, 573788
+ * Christian W. Damus - bugs 570097, 573788, 573986
*
*****************************************************************************/
package org.eclipse.papyrus.toolsmiths.validation.common.quickfix;
+import static java.util.function.Predicate.not;
+
+import java.util.Objects;
import java.util.Optional;
+import java.util.function.Predicate;
import java.util.stream.Stream;
import org.eclipse.core.resources.IFile;
@@ -25,11 +29,21 @@ import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.EValidator;
+import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.domain.IEditingDomainProvider;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.papyrus.infra.tools.util.Try;
import org.eclipse.papyrus.toolsmiths.validation.common.checkers.CommonProblemConstants;
+import org.eclipse.papyrus.toolsmiths.validation.common.internal.messages.Messages;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
@@ -56,18 +70,111 @@ public final class CommonMarkerResolutionUtils {
/** Get the object of the given {@code type} from an editing {@code domain}, identified by the URI in the {@code marker}. */
public static <T extends EObject> Optional<T> getModelObject(IMarker marker, Class<T> type, EditingDomain domain) {
- String targetURI = marker.getAttribute(EValidator.URI_ATTRIBUTE, null);
- return Optional.ofNullable(targetURI).map(uri -> URI.createURI(uri, true))
+ return getModelObject(marker, EValidator.URI_ATTRIBUTE, type, domain);
+ }
+
+ /** Get the object of the given {@code type} from an editing {@code domain}, identified by an URI {@code attribute} in the {@code marker}. */
+ public static <T extends EObject> Optional<T> getModelObject(IMarker marker, String attribute, Class<T> type, EditingDomain domain) {
+ return getURIs(marker, attribute)
.map(uri -> domain.getResourceSet().getEObject(uri, true))
.filter(type::isInstance)
+ .findAny()
.map(type::cast);
}
- /** Get the editing domain from an editor that is currently open on the resource of a {@code marker}, if any. */
- public static Optional<EditingDomain> getOpenEditingDomain(IMarker marker) {
+ private static Stream<URI> getURIs(IMarker marker, String attribute) {
+ Stream<URI> result = Stream.of(marker.getAttribute(attribute, "")) //$NON-NLS-1$
+ .filter(not(String::isBlank))
+ .map(uri -> URI.createURI(uri, true));
+
+ if (EValidator.URI_ATTRIBUTE.equals(attribute)) {
+ // Also get relateds, if any
+ String related = marker.getAttribute(EValidator.RELATED_URIS_ATTRIBUTE, ""); //$NON-NLS-1$
+ if (!related.isBlank()) {
+ result = Stream.concat(result, Stream.of(related.split("\\s+")) //$NON-NLS-1$
+ .filter(not(String::isBlank))
+ .map(uri -> URI.decode(uri)) // Multiple URIs are fragment-encoded per EMF
+ .map(uri -> URI.createURI(uri, true)));
+ }
+ }
+
+ return result;
+ }
+
+ public static Optional<EAttribute> getModelAttribute(IMarker marker) {
+ return getModelFeature(marker, EPackage.Registry.INSTANCE).filter(EAttribute.class::isInstance).map(EAttribute.class::cast);
+ }
+
+ public static Optional<EReference> getModelReference(IMarker marker) {
+ return getModelFeature(marker, EPackage.Registry.INSTANCE).filter(EReference.class::isInstance).map(EReference.class::cast);
+ }
+
+ public static Optional<EStructuralFeature> getModelFeature(IMarker marker) {
+ return getModelFeature(marker, EPackage.Registry.INSTANCE);
+ }
+
+ public static Optional<EStructuralFeature> getModelFeature(IMarker marker, EditingDomain domain) {
+ return getModelFeature(marker, domain.getResourceSet().getPackageRegistry());
+ }
+
+ public static Optional<EStructuralFeature> getModelFeature(IMarker marker, EPackage.Registry packageRegistry) {
+ return getURIs(marker, EValidator.URI_ATTRIBUTE)
+ .map(uri -> {
+ EPackage ePackage = packageRegistry.getEPackage(uri.trimFragment().toString());
+ return ePackage == null ? null : ePackage.eResource().getEObject(uri.fragment());
+ })
+ .filter(EStructuralFeature.class::isInstance)
+ .findAny()
+ .map(EStructuralFeature.class::cast);
+ }
+
+ /**
+ * Get a value encoded in a marker attribute.
+ *
+ * @param <V>
+ * the value type
+ * @param marker
+ * the marker describing the problem
+ * @param attribute
+ * the marker attribute that encodes the value
+ * @param type
+ * the value type
+ * @param dataType
+ * the EMF representation of the value type, used to restore non-primitive values. May be {@code null}
+ * for boolean, integer, or string values
+ * @return the value encoded in the marker
+ */
+ public static <V> Optional<V> getValue(IMarker marker, String attribute, Class<V> type, EDataType dataType) {
+ if (type == boolean.class || type == Boolean.class) {
+ @SuppressWarnings("unchecked") // No reasonable way to handle primitive wrappers
+ V safeCast = (V) Boolean.valueOf(marker.getAttribute(attribute, false));
+ return Optional.ofNullable(safeCast);
+ } else if (type == int.class || type == Integer.class) {
+ @SuppressWarnings("unchecked") // No reasonable way to handle primitive wrappers
+ V safeCast = (V) Integer.valueOf(marker.getAttribute(attribute, 0));
+ return Optional.ofNullable(safeCast);
+ } else if (type == String.class) {
+ return Optional.ofNullable(type.cast(marker.getAttribute(attribute, (String) null)));
+ } else {
+ return Optional.ofNullable(marker.getAttribute(attribute, (String) null))
+ .map(value -> EcoreUtil.createFromString(dataType, value))
+ .map(type::cast);
+ }
+ }
+
+ /**
+ * Get the editing domain from an editor that is currently open on the resource of a {@code marker}, if any.
+ *
+ * @param marker
+ * a problem marker
+ * @return the editing domain from an existing open EMF-based editor, which may be a {@linkplain Try#isSuccess() <tt>null</tt> success}
+ * if there is no open editor or {@linkplain Try#isFailure() a failure} if there is an open editor but it is dirty and the
+ * user elected not to save it when prompted
+ */
+ public static Try<EditingDomain> getOpenEditingDomain(IMarker marker) {
IResource resource = marker.getResource();
if (!(resource instanceof IFile) || !PlatformUI.isWorkbenchRunning()) {
- return Optional.empty();
+ return Try.success(null);
}
IEditorInput editorInput = new FileEditorInput((IFile) resource);
@@ -75,22 +182,76 @@ public final class CommonMarkerResolutionUtils {
IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
return Stream.of(windows).map(IWorkbenchWindow::getActivePage)
.flatMap(page -> Stream.of(page.findEditors(editorInput, null, IWorkbenchPage.MATCH_INPUT)))
+ .filter(Objects::nonNull)
.map(CommonMarkerResolutionUtils::getEditingDomain)
- .findAny();
+ .filter(Objects::nonNull)
+ .findAny().orElseGet(Try::empty);
}
- private static EditingDomain getEditingDomain(IEditorReference editorRef) {
- EditingDomain result = null;
+ private static Try<EditingDomain> getEditingDomain(IEditorReference editorRef) {
+ Try<EditingDomain> result = Try.empty();
IEditorPart editor = editorRef.getEditor(true);
if (editor instanceof IEditingDomainProvider) {
- result = ((IEditingDomainProvider) editor).getEditingDomain();
+ if (!ensureClean(editor)) {
+ result = Try.failure("dirty editor"); //$NON-NLS-1$
+ } else {
+ result = Try.success(((IEditingDomainProvider) editor).getEditingDomain());
+ }
}
- if (result == null && editor != null) {
- result = editor.getAdapter(EditingDomain.class);
+ if (result.isEmpty() && editor != null) {
+ result = Try.success(editor.getAdapter(EditingDomain.class));
}
return result;
}
+ private static boolean ensureClean(IEditorPart editor) {
+ boolean result = !editor.isDirty();
+
+ if (!result) {
+ IWorkbenchPage page = editor.getSite().getPage();
+ if (page.getActiveEditor() != editor) {
+ page.activate(editor);
+ }
+
+ if (MessageDialog.openQuestion(editor.getSite().getShell(), Messages.CommonMarkerResolutionUtils_0, NLS.bind(Messages.CommonMarkerResolutionUtils_1, editor.getTitle()))) {
+ result = page.saveEditor(editor, false);
+ }
+ }
+
+ return result;
+ }
+
+ /**
+ * Find the open editor that has the given editing domain.
+ *
+ * @param editingDomain
+ * an editing domain
+ * @return the option editor using that domain
+ */
+ public static Optional<IEditorPart> getEditor(EditingDomain editingDomain) {
+ IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
+ return Stream.of(windows).map(IWorkbenchWindow::getActivePage)
+ .map(IWorkbenchPage::getEditorReferences).flatMap(Stream::of)
+ .map(ref -> ref.getEditor(false))
+ .filter(Objects::nonNull)
+ .filter(hasEditingDomain(editingDomain))
+ .findAny();
+ }
+
+ private static Predicate<IEditorPart> hasEditingDomain(EditingDomain editingDomain) {
+ return editor -> {
+ EditingDomain myDomain = null;
+
+ if (editor instanceof IEditingDomainProvider) {
+ myDomain = ((IEditingDomainProvider) editor).getEditingDomain();
+ }
+ if (myDomain == null) {
+ myDomain = editor.getAdapter(EditingDomain.class);
+ }
+
+ return myDomain == editingDomain;
+ };
+ }
}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/quickfix/SimpleModelEditMarkerResolution.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/quickfix/SimpleModelEditMarkerResolution.java
index e81d0348701..7d28de083c3 100644
--- a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/quickfix/SimpleModelEditMarkerResolution.java
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/quickfix/SimpleModelEditMarkerResolution.java
@@ -16,23 +16,57 @@
package org.eclipse.papyrus.toolsmiths.validation.common.quickfix;
import java.io.IOException;
-import java.util.Optional;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
import java.util.function.BiFunction;
+import java.util.stream.Stream;
import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.emf.common.command.BasicCommandStack;
import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.common.command.CommandWrapper;
+import org.eclipse.emf.common.command.CompoundCommand;
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.Notifier;
+import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.papyrus.infra.emf.utils.EMFHelper;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.papyrus.infra.tools.util.TriFunction;
+import org.eclipse.papyrus.infra.tools.util.Try;
import org.eclipse.papyrus.toolsmiths.validation.common.Activator;
+import org.eclipse.papyrus.toolsmiths.validation.common.internal.messages.Messages;
+
+import com.google.common.collect.ImmutableListMultimap;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Multimap;
+import com.google.common.collect.Multimaps;
/**
+ * <p>
* A marker resolution that resolves a problem by means of an EMF {@link Command}
- * that edits the model.
+ * that edits the model. Two factory methods are provided that use client-provided functions to
+ * compute commands:
+ * </p>
+ * <ul>
+ * <li>one (recommended for most cases) that {@linkplain #create(int, String, String, Class, TriFunction) includes the marker being resolved}
+ * as an input, to support extraction of arbitrary information from it about what needs fixing</li>
+ * <li>a simpler one that {@linkplain #create(int, String, String, Class, BiFunction) uses only the object targeted by the marker}.
+ * This is convenient, for example, for a resolution that just deletes the object or that otherwise doesn't need additional information
+ * from the marker</li>
+ * </ul>
*
* @param <T>
* the model object class on which I resolve the problem
@@ -43,9 +77,11 @@ public class SimpleModelEditMarkerResolution<T extends EObject> extends Abstract
private final String description;
private final Class<T> type;
- private final BiFunction<? super EditingDomain, ? super T, ? extends Command> commandFunction;
+ private final TriFunction<? super EditingDomain, ? super T, ? super IMarker, ? extends Command> commandFunction;
+
+ private boolean canMultiFix = true;
- protected SimpleModelEditMarkerResolution(int problemID, String label, String description, Class<T> type, BiFunction<? super EditingDomain, ? super T, ? extends Command> commandFunction) {
+ protected SimpleModelEditMarkerResolution(int problemID, String label, String description, Class<T> type, TriFunction<? super EditingDomain, ? super T, ? super IMarker, ? extends Command> commandFunction) {
super(problemID);
this.label = label;
@@ -70,13 +106,38 @@ public class SimpleModelEditMarkerResolution<T extends EObject> extends Abstract
* @param commandFunction
* a function that creates a command to edit the object. It will receive an editing domain either from
* an existing open editor or created on-the-fly for an off-line edit, plus the object loaded in that domain to edit
+ * and the problem marker to be resolved
*
* @return the marker resolution
*/
- public static <T extends EObject> SimpleModelEditMarkerResolution<T> create(int problemID, String label, String description, Class<T> type, BiFunction<? super EditingDomain, ? super T, ? extends Command> commandFunction) {
+ public static <T extends EObject> SimpleModelEditMarkerResolution<T> create(int problemID, String label, String description, Class<T> type, TriFunction<? super EditingDomain, ? super T, ? super IMarker, ? extends Command> commandFunction) {
return new SimpleModelEditMarkerResolution<>(problemID, label, description, type, commandFunction);
}
+ /**
+ * Create a new marker resolution that edits the model without reference to the specific problem marker being resolved.
+ *
+ * @param <T>
+ * the kind of object to edit
+ * @param problemID
+ * my marker resolution problem ID
+ * @param label
+ * a label to present to the user for the marker resolution
+ * @param description
+ * a description of the marker resolution to present to the user
+ * @param type
+ * the type of object to edit to resolve the marker
+ * @param commandFunction
+ * a function that creates a command to edit the object. It will receive an editing domain either from
+ * an existing open editor or created on-the-fly for an off-line edit, plus the object loaded in that domain to edit
+ *
+ * @return the marker resolution
+ */
+ public static <T extends EObject> SimpleModelEditMarkerResolution<T> create(int problemID, String label, String description, Class<T> type, BiFunction<? super EditingDomain, ? super T, ? extends Command> commandFunction) {
+ return new SimpleModelEditMarkerResolution<>(problemID, label, description, type,
+ (domain, object, __) -> commandFunction.apply(domain, object));
+ }
+
@Override
public String getLabel() {
return label;
@@ -89,32 +150,195 @@ public class SimpleModelEditMarkerResolution<T extends EObject> extends Abstract
@Override
public void run(IMarker marker) {
- Optional<EditingDomain> openDomain = CommonMarkerResolutionUtils.getOpenEditingDomain(marker);
- EditingDomain domain = openDomain.orElseGet(() -> new AdapterFactoryEditingDomain(new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE), new BasicCommandStack()));
+ run(new IMarker[] { marker }, new NullProgressMonitor());
+ }
+
+ @Override
+ public void run(IMarker[] markers, IProgressMonitor monitor) {
+ Multimap<Try<EditingDomain>, IMarker> openDomains = getOpenEditingDomains(markers);
+ if (openDomains.keySet().stream().anyMatch(Try::isFailure)) {
+ // User cancelled prompt to save a dirty editor
+ if (monitor != null) {
+ monitor.setCanceled(true);
+ }
+ return;
+ }
+
+ // Count the map size once for preparation of commands and once for execution
+ SubMonitor sub = SubMonitor.convert(monitor, 2 * openDomains.size());
try {
- CommonMarkerResolutionUtils.getModelObject(marker, type, domain).ifPresent(object -> {
- Command command = commandFunction.apply(domain, object);
- if (command != null) {
- domain.getCommandStack().execute(command);
+ for (Map.Entry<Try<EditingDomain>, Collection<IMarker>> next : openDomains.asMap().entrySet()) {
+ Try<EditingDomain> openDomain = next.getKey();
+ Collection<? extends IMarker> partition = next.getValue();
+
+ EditingDomain domain = openDomain.toOptional().orElseGet(this::createEditingDomain);
+ Adapter loadedResourceAdapter = new QuickFixLoadedResourcesAdapter(domain);
+
+ try {
+ CompoundCommand fixCommand = new CompoundCommand();
+
+ for (IMarker marker : partition) {
+ CommonMarkerResolutionUtils.getModelObject(marker, type, domain).ifPresent(object -> {
+ Command command = commandFunction.apply(domain, object, marker);
+ if (command != null) {
+ fixCommand.append(new CommandWrapper(command) {
+ @Override
+ public void execute() {
+ super.execute();
+ sub.worked(1); // Executed
+ }
+ });
+ }
+ sub.worked(1); // Prepared
+ });
+ }
+
+ Command command = fixCommand.unwrap();
+ if (command.canExecute()) {
+ domain.getCommandStack().execute(command);
+ } else {
+ // Skipped this partition for whatever reason
+ sub.worked(partition.size());
+ }
+ } finally {
+ // Save and unload any resources that the quick fix caused to be loaded and changed.
+ // Note that if we created the editing domain, then this will unload all of the
+ // resources in it, so any item-provider adapters will have been cleaned up, too
+ loadedResourceAdapter.getTarget().eAdapters().remove(loadedResourceAdapter);
+
+ // And then save the changes we made in the editor
+ openDomain.flatMap(CommonMarkerResolutionUtils::getEditor).ifPresent(editor -> editor.getSite().getPage().saveEditor(editor, false));
}
- });
+ }
} finally {
- if (openDomain.isEmpty()) {
- // We created a domain. Save the changes and unload it
- ResourceSet rset = domain.getResourceSet();
- if (!rset.getResources().isEmpty()) {
- try {
- rset.getResources().get(0).save(null);
- } catch (IOException e) {
- Activator.log.error("Failed to save marker resolution.", e); //$NON-NLS-1$
- }
+ sub.done();
+ }
+ }
+
+ /**
+ * Partition the given {@code markers} by resource and attempt to find an editing domain
+ * in an open editor for each.
+ *
+ * @param markers
+ * markers to be fixed
+ * @return a partition of markers by resource with attempts to find open editing domains
+ */
+ private Multimap<Try<EditingDomain>, IMarker> getOpenEditingDomains(IMarker[] markers) {
+ // First, partition the markers by resource
+ ListMultimap<IResource, IMarker> partitions = Multimaps.index(Arrays.asList(markers), IMarker::getResource);
+
+ ImmutableListMultimap.Builder<Try<EditingDomain>, IMarker> result = ImmutableListMultimap.builder();
+ for (IResource next : partitions.keySet()) {
+ List<IMarker> nextPartition = partitions.get(next);
+
+ IMarker marker = nextPartition.get(0);
+ result.putAll(CommonMarkerResolutionUtils.getOpenEditingDomain(marker), nextPartition);
+ }
+
+ return result.build();
+ }
+
+ private EditingDomain createEditingDomain() {
+ return new AdapterFactoryEditingDomain(
+ new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE),
+ new BasicCommandStack());
+ }
+
+ /**
+ * Disable fixing of multiple markers with this fix. This is usually only appropriate
+ * for a resolution that encodes a static change plan, not determined dynamically
+ * from the marker being fixed.
+ *
+ * @return myself for convenience of fluent configuration
+ */
+ public SimpleModelEditMarkerResolution<T> disableMultiFix() {
+ this.canMultiFix = false;
+ return this;
+ }
+
+ /**
+ * Query whether I can fix multiple markers. This is usually only not the case
+ * for a resolution that encodes a static change plan, not determined dynamically
+ * from the marker being fixed.
+ *
+ * @return whether I can fix multiple markers
+ */
+ public boolean canMultiFix() {
+ return canMultiFix;
+ }
+
+ @Override
+ protected Stream<IMarker> findSimilarMarkers(IMarker[] markers) {
+ return canMultiFix() ? super.findSimilarMarkers(markers) : Stream.empty();
+ }
+
+ //
+ // Nested types
+ //
+
+ /**
+ * An adapter on the resource-set that tracks resources loaded by the quick-fix command,
+ * so that when finished, they may be saved (if changed) and unloaded again to leave
+ * an open editor in ostensibly the same condition as the user last saw it.
+ */
+ private final class QuickFixLoadedResourcesAdapter extends AdapterImpl {
+
+ private final List<Resource> loadedByQuickFix = new ArrayList<>();
+
+ QuickFixLoadedResourcesAdapter(EditingDomain domain) {
+ super();
+
+ domain.getResourceSet().eAdapters().add(this);
+ }
+
+ @Override
+ public void notifyChanged(Notification msg) {
+ if (msg.getFeatureID(ResourceSet.class) == ResourceSet.RESOURCE_SET__RESOURCES) {
+ switch (msg.getEventType()) {
+ case Notification.ADD:
+ handleAdded((Resource) msg.getNewValue());
+ break;
+ case Notification.ADD_MANY:
+ ((Collection<?>) msg.getNewValue()).stream().map(Resource.class::cast).forEach(this::handleAdded);
+ break;
}
+ }
+ }
+
+ @Override
+ public void unsetTarget(Notifier oldTarget) {
+ // Save any resources that the quick-fix loaded and changed, then unload them.
+ loadedByQuickFix.forEach(this::saveAndUnload);
+ loadedByQuickFix.clear();
+
+ super.unsetTarget(oldTarget);
+ }
+
+ private void handleAdded(Resource resource) {
+ loadedByQuickFix.add(resource);
- EMFHelper.unload(domain.getResourceSet());
- ((ComposedAdapterFactory) ((AdapterFactoryEditingDomain) domain).getAdapterFactory()).dispose();
+ // We cannot rely on the "affected objects" of the commands to indicate which resources
+ // are modified by it because, e.g., AddCommand's affected objects are the added objects,
+ // not the object to which they are added. So, track modifications on every resource
+ resource.setTrackingModification(true);
+ }
+
+ private void saveAndUnload(Resource resource) {
+ // First, remove the resource from the resource set so that the editor doesn't see it
+ // when the workspace notifies about save and get confused about conflicting edits
+ // from outside the editor context because we are, in fact, doing this in the editor context
+ resource.getResourceSet().getResources().remove(resource);
+
+ try {
+ if (resource.isModified()) {
+ resource.save(Map.of(Resource.OPTION_SAVE_ONLY_IF_CHANGED, Resource.OPTION_SAVE_ONLY_IF_CHANGED_MEMORY_BUFFER));
+ }
+ } catch (IOException e) {
+ Activator.log.error(NLS.bind(Messages.SimpleModelEditMarkerResolution_0, resource.getURI(), getLabel()), e);
+ } finally {
+ resource.unload();
}
}
}
-
}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/utils/CommonURIUtils.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/utils/CommonURIUtils.java
new file mode 100644
index 00000000000..df924882488
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/utils/CommonURIUtils.java
@@ -0,0 +1,208 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.common.utils;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.papyrus.infra.tools.util.ClasspathHelper;
+import org.eclipse.papyrus.infra.tools.util.Try;
+import org.eclipse.papyrus.toolsmiths.validation.common.Activator;
+import org.eclipse.papyrus.toolsmiths.validation.common.URIConverterService;
+import org.eclipse.papyrus.toolsmiths.validation.common.internal.messages.Messages;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.FrameworkUtil;
+
+/**
+ * Common utilities for working with URIs in validation and quick-fixes.
+ */
+public class CommonURIUtils {
+
+ /** The URI scheme for Equinox's internal <tt>bundleresource://</tt> URIs. */
+ private static final String BUNDLE_RESOURCE_SCHEME = "bundleresource"; //$NON-NLS-1$
+
+ /** The URI scheme for e4's <tt>bundleclass://</tt> URIs. */
+ private static final String BUNDLE_CLASS_SCHEME = "bundleclass"; //$NON-NLS-1$
+
+ /** Regex to parse the bundle ID out of a URI of <tt>bundleresource:</tt> scheme. */
+ private static final Pattern BUNDLE_RESOURCE_AUTHORITY_PATTERN = Pattern.compile("^\\d+"); //$NON-NLS-1$
+
+ public static URI normalize(ResourceSet context, URI resourceURI) {
+ // Can we normalize the URI to something recognizable? Note that we do not expect
+ // to have URI mappings for 'bundleclass' and 'bundleresource' schemes
+ return (context == null) ? resourceURI : URIConverterService.INSTANCE.normalize(resourceURI, context);
+ }
+
+ /**
+ * Get the name of a bundle that hosts a resource.
+ *
+ * @param context
+ * an object in which context the URI is being analyzed
+ * @param resourceURI
+ * a resource URI
+ * @return the bundle that packages the resource. The result will not be {@code null}
+ * but it may have a {@code null} {@linkplain Try#get() value} if the URI scheme should
+ * infer a bundle name but the URI does not
+ */
+ public static Try<String> getBundleName(EObject context, URI resourceURI) {
+ return getBundleName(context.eResource(), resourceURI);
+ }
+
+ /**
+ * Get the name of a bundle that hosts a resource.
+ *
+ * @param context
+ * a resource in which context the URI is being analyzed
+ * @param resourceURI
+ * a resource URI
+ * @return the bundle that packages the resource. The result will not be {@code null}
+ * but it may have a {@code null} {@linkplain Try#get() value} if the URI scheme should
+ * infer a bundle name but the URI does not
+ */
+ public static Try<String> getBundleName(Resource context, URI resourceURI) {
+ return getBundleName(context.getResourceSet(), resourceURI);
+ }
+
+ /**
+ * Get the name of a bundle that hosts a resource.
+ *
+ * @param context
+ * a resource set in which context the URI is being analyzed
+ * @param resourceURI
+ * a resource URI
+ * @return the bundle that packages the resource. The result will not be {@code null}
+ * but it may have a {@code null} {@linkplain Try#get() value} if the URI scheme should
+ * infer a bundle name but the URI does not
+ */
+ public static Try<String> getBundleName(ResourceSet context, URI resourceURI) {
+ String result = null;
+
+ URI normalized = normalize(context, resourceURI);
+
+ if ((normalized.isPlatformPlugin() || normalized.isPlatformResource()) && normalized.segmentCount() > 1) {
+ result = normalized.segment(1);
+ } else if (BUNDLE_CLASS_SCHEME.equals(normalized.scheme()) && normalized.hasAuthority()) {
+ result = normalized.authority();
+ } else if (BUNDLE_RESOURCE_SCHEME.equals(normalized.scheme()) && normalized.hasAuthority()) {
+ Bundle bundle = null;
+ Matcher m = BUNDLE_RESOURCE_AUTHORITY_PATTERN.matcher(normalized.authority());
+ if (m.find()) {
+ long bundleID = Long.parseLong(m.group());
+ bundle = Activator.getDefault().getBundle().getBundleContext().getBundle(bundleID);
+ }
+ if (bundle != null) {
+ result = bundle.getSymbolicName();
+ }
+ } else {
+ // Is it a registered package?
+ EPackage ePackage = context.getPackageRegistry().getEPackage(normalized.toString());
+ if (ePackage != null) {
+ Bundle bundle = FrameworkUtil.getBundle(ePackage.getClass());
+ if (bundle != null) {
+ result = bundle.getSymbolicName();
+ }
+ } else {
+ // This doesn't look like any URI that resolves into a bundle. Don't report the normalized
+ // URI because that's not what the user sees in the resource
+ return Try.failure(NLS.bind(Messages.CommonURIUtils_0, resourceURI));
+ }
+ }
+
+ return Try.success(result);
+ }
+
+ /**
+ * Query whether a resource exists.
+ *
+ * @param context
+ * an object in which context the resource URI is being analyzed
+ * @param resourceURI
+ * a resource URI
+ * @return {@code false} if the resource does not exist; {@code true}, otherwise, including in
+ * the case that the URI is of a kind that cannot be queried for existence and is
+ * therefore just assumed to exist
+ */
+ public static boolean exists(EObject context, URI resourceURI) {
+ return exists(context.eResource(), resourceURI);
+ }
+
+ /**
+ * Query whether a resource exists.
+ *
+ * @param context
+ * a resource in which context the resource URI is being analyzed
+ * @param resourceURI
+ * a resource URI
+ * @return {@code false} if the resource does not exist; {@code true}, otherwise, including in
+ * the case that the URI is of a kind that cannot be queried for existence and is
+ * therefore just assumed to exist
+ */
+ public static boolean exists(Resource context, URI resourceURI) {
+ return exists(context.getResourceSet(), resourceURI);
+ }
+
+ /**
+ * Query whether a resource exists.
+ *
+ * @param context
+ * a resource set in which context the resource URI is being analyzed
+ * @param resourceURI
+ * a resource URI
+ * @return {@code false} if the resource does not exist; {@code true}, otherwise, including in
+ * the case that the URI is of a kind that cannot be queried for existence and is
+ * therefore just assumed to exist
+ */
+ public static boolean exists(ResourceSet context, URI resourceURI) {
+ boolean result = true;
+
+ URI normalized = normalize(context, resourceURI);
+
+ if ((normalized.isPlatformPlugin() || normalized.isPlatformResource())) {
+ // EMF knows how to deal with platform: URIs. And we need more than the 'resource'/'plugin' and project/plug-in
+ // segments in order to identify a valid resource. And a trailing slash indicates a project/plugin or
+ // folder, itself, which is not a file resource
+ result = !normalized.hasTrailingPathSeparator() && normalized.segmentCount() > 2 && context.getURIConverter().exists(normalized, null);
+ } else if (BUNDLE_CLASS_SCHEME.equals(normalized.scheme()) && normalized.hasAuthority() && normalized.segmentCount() > 0) {
+ String bundle = normalized.authority();
+ String className = normalized.segment(0);
+ result = (bundle != null) && (className != null)
+ && ClasspathHelper.INSTANCE.findClass(className, URI.createPlatformPluginURI(bundle, false), null) != null;
+ } else if (BUNDLE_RESOURCE_SCHEME.equals(normalized.scheme()) && normalized.hasAuthority() && normalized.segmentCount() > 0) {
+ Bundle bundle = null;
+ String className = normalized.segment(0);
+
+ Matcher m = BUNDLE_RESOURCE_AUTHORITY_PATTERN.matcher(normalized.authority());
+ if (m.find()) {
+ long bundleID = Long.parseLong(m.group());
+ bundle = Activator.getDefault().getBundle().getBundleContext().getBundle(bundleID);
+ }
+ result = (bundle != null) && (className != null)
+ && ClasspathHelper.INSTANCE.findClass(className, URI.createPlatformPluginURI(bundle.getSymbolicName(), false), null) != null;
+ } else if (!normalized.isRelative()) {
+ // Is it a registered package?
+ result = context.getPackageRegistry().getEPackage(normalized.toString()) != null;
+ }
+
+ return result;
+ }
+
+}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.elementtypes/src/org/eclipse/papyrus/toolsmiths/validation/elementtypes/internal/checkers/LocalProfileIndex.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/utils/LocalProfileIndex.java
index 98f0d407c69..60607741468 100644
--- a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.elementtypes/src/org/eclipse/papyrus/toolsmiths/validation/elementtypes/internal/checkers/LocalProfileIndex.java
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/utils/LocalProfileIndex.java
@@ -13,7 +13,7 @@
*
*****************************************************************************/
-package org.eclipse.papyrus.toolsmiths.validation.elementtypes.internal.checkers;
+package org.eclipse.papyrus.toolsmiths.validation.common.utils;
import static org.eclipse.papyrus.toolsmiths.validation.common.utils.ModelResourceMapper.byExtension;
import static org.eclipse.papyrus.toolsmiths.validation.common.utils.ModelResourceMapper.rootsOfType;
@@ -22,6 +22,7 @@ import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
+import java.util.Optional;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.emf.common.notify.Notification;
@@ -32,8 +33,7 @@ import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.papyrus.toolsmiths.validation.common.utils.ModelResourceMapper;
-import org.eclipse.papyrus.toolsmiths.validation.elementtypes.Activator;
+import org.eclipse.papyrus.toolsmiths.validation.common.Activator;
import org.eclipse.papyrus.uml.tools.utils.StaticProfileUtil;
import org.eclipse.uml2.uml.NamedElement;
import org.eclipse.uml2.uml.Profile;
@@ -72,22 +72,43 @@ public class LocalProfileIndex {
* the validation context
* @return the local profile index
*/
- static LocalProfileIndex getInstance(EObject eObject, Map<Object, Object> context) {
+ public static LocalProfileIndex getInstance(EObject eObject, Map<Object, Object> context) {
return (LocalProfileIndex) context.computeIfAbsent(LocalProfileIndex.class, __ -> getInstance(eObject.eResource().getResourceSet()));
}
/**
* Get the cached instance of the local profile index for a resource set.
*
- * @param resource
- * set
- * the contextural resource set
+ * @param resourceSet
+ * the contextual resource set
* @return the local profile index
*/
- static LocalProfileIndex getInstance(ResourceSet resourceSet) {
+ public static LocalProfileIndex getInstance(ResourceSet resourceSet) {
return Attachment.getIndex(resourceSet);
}
+ /**
+ * Get the cached instance of the local profile index for a {@code resource}.
+ *
+ * @param resource
+ * the contextual resource
+ * @return the local profile index
+ */
+ public static Optional<LocalProfileIndex> getInstance(Resource resource) {
+ return Optional.ofNullable(resource.getResourceSet()).map(LocalProfileIndex::getInstance);
+ }
+
+ /**
+ * Get the cached instance of the local profile index for an {@code object}.
+ *
+ * @param object
+ * the contextual object
+ * @return the local profile index
+ */
+ public static Optional<LocalProfileIndex> getInstance(EObject object) {
+ return Optional.ofNullable(object.eResource()).flatMap(LocalProfileIndex::getInstance);
+ }
+
void reset() {
workspaceLoaded = false;
profilesByName.clear();
@@ -227,20 +248,25 @@ public class LocalProfileIndex {
* @return the named stereotype, or {@code null} if not found
*/
public Stereotype getStereotype(String qualifiedName, EObject context) {
- Stereotype result;
+ Stereotype result = null;
int profileNameLength = qualifiedName.lastIndexOf(NamedElement.SEPARATOR);
- if (profileNameLength < 0) {
- // Not a qualified name? Then don't bother looking for it and report the problem because
- // the advice won't be able to find it at run-time
- result = null;
- } else {
- // Stereotypes don't nest within stereotypes or other classes
- String profileQualifiedName = qualifiedName.substring(0, profileNameLength);
- Profile profile = getProfile(profileQualifiedName, context);
- if (profile != null) {
- result = getStereotype(qualifiedName, profile, context);
- } else {
+ // Not a qualified name? Then don't bother looking for it and report the problem because
+ // the advice won't be able to find it at run-time
+ if (profileNameLength > 0) {
+ // Stereotypes don't nest within stereotypes or other classes, but they do nest in packages
+ do {
+ String profileQualifiedName = qualifiedName.substring(0, profileNameLength);
+ Profile profile = getProfile(profileQualifiedName, context);
+ if (profile != null) {
+ result = getStereotype(qualifiedName, profile, context);
+ }
+ profileNameLength = profileQualifiedName.lastIndexOf(NamedElement.SEPARATOR);
+ if (profileNameLength >= 0) {
+ profileQualifiedName = qualifiedName.substring(0, profileNameLength);
+ }
+ } while (result == null && profileNameLength > 0);
+ if (result == null) {
loadWorkspace();
result = stereotypesByName.get(qualifiedName);
}
@@ -277,13 +303,31 @@ public class LocalProfileIndex {
profilesByURI.put(uri, profile);
}
- for (org.eclipse.uml2.uml.Package nested : profile.getNestedPackages()) {
+ mapNestedPackages(profile);
+ }
+
+ private void mapNestedPackages(org.eclipse.uml2.uml.Package package_) {
+ for (org.eclipse.uml2.uml.Package nested : package_.getNestedPackages()) {
if (nested instanceof Profile) {
mapProfile((Profile) nested);
+ } else {
+ // Stereotypes nested in regular packages within the profile can also be applied in models
+ mapPackage(nested);
}
}
}
+ private void mapPackage(org.eclipse.uml2.uml.Package package_) {
+ for (Stereotype stereo : package_.getOwnedStereotypes()) {
+ String stereoName = stereo.getQualifiedName();
+ if (stereoName != null && !stereoName.isBlank()) {
+ stereotypesByName.put(stereoName, stereo);
+ }
+ }
+
+ mapNestedPackages(package_);
+ }
+
/**
* Get the namespace URI of a {@code profile}, in order of preference (as in UML2 code generation):
* <ul>
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/utils/MarkersService.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/utils/MarkersService.java
index d64ad8c7bbb..aa0dd814a40 100644
--- a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/utils/MarkersService.java
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/utils/MarkersService.java
@@ -10,7 +10,7 @@
*
* Contributors:
* Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
- * Christian W. Damus - bugs 569357, 570097
+ * Christian W. Damus - bugs 569357, 570097, 573986
*
*****************************************************************************/
@@ -107,14 +107,9 @@ public class MarkersService {
// will work
related.append(URI.encodeFragment(uri, false));
}
- break;
} else if (next instanceof IPluginChecker2.MarkerAttribute) {
IPluginChecker2.MarkerAttribute attr = (IPluginChecker2.MarkerAttribute) next;
- try {
- result.setAttribute(attr.getName(), attr.getValue());
- } catch (CoreException e) {
- Activator.log.error("Failed to set attribute " + attr.getName() + " of problem marker.", e); //$NON-NLS-1$ //$NON-NLS-2$
- }
+ attr.applyTo(result);
}
}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/utils/ModelResourceMapper.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/utils/ModelResourceMapper.java
index 43d884afdb9..cab12842e20 100644
--- a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/utils/ModelResourceMapper.java
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.common/src/org/eclipse/papyrus/toolsmiths/validation/common/utils/ModelResourceMapper.java
@@ -10,7 +10,7 @@
*
* Contributors:
* Remi Schnekenburger - Initial API and implementation
- * Christian W. Damus - bugs 569357, 570097
+ * Christian W. Damus - bugs 569357, 570097, 573986
*
*****************************************************************************/
package org.eclipse.papyrus.toolsmiths.validation.common.utils;
@@ -28,7 +28,10 @@ import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.content.IContentDescription;
+import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.emf.common.util.AbstractTreeIterator;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.common.util.URI;
@@ -155,6 +158,31 @@ public class ModelResourceMapper<T extends EObject> {
}
/**
+ * Select files to validate by content type.
+ *
+ * @param extension
+ * the file extension to match
+ */
+ public static Predicate<IResource> byContentType(String contentTypeID) {
+ return file -> //
+ file.getType() == IResource.FILE && hasContentType((IFile) file, contentTypeID);
+ }
+
+ private static boolean hasContentType(IFile file, String contentTypeID) {
+ IContentType match = Platform.getContentTypeManager().getContentType(contentTypeID);
+ IContentType actual = null;
+
+ try {
+ IContentDescription description = file.getContentDescription();
+ actual = description != null ? description.getContentType() : null;
+ } catch (CoreException e) {
+ Activator.log.error("Failed to determine content type of model file.", e); //$NON-NLS-1$
+ }
+
+ return match != null && actual != null && actual.isKindOf(match);
+ }
+
+ /**
* Create standard EMF resource sets with platform scheme support for cross-document references.
*/
public static Function<URI, ResourceSet> resourceSets() {
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.elementtypes/src/org/eclipse/papyrus/toolsmiths/validation/elementtypes/internal/checkers/ApplyStereotypeAdviceCustomValidator.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.elementtypes/src/org/eclipse/papyrus/toolsmiths/validation/elementtypes/internal/checkers/ApplyStereotypeAdviceCustomValidator.java
index 56cf073bfc5..d416464d5a8 100644
--- a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.elementtypes/src/org/eclipse/papyrus/toolsmiths/validation/elementtypes/internal/checkers/ApplyStereotypeAdviceCustomValidator.java
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.elementtypes/src/org/eclipse/papyrus/toolsmiths/validation/elementtypes/internal/checkers/ApplyStereotypeAdviceCustomValidator.java
@@ -20,6 +20,7 @@ import java.util.Map;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.DiagnosticChain;
import org.eclipse.papyrus.toolsmiths.validation.common.checkers.CustomModelChecker;
+import org.eclipse.papyrus.toolsmiths.validation.common.utils.LocalProfileIndex;
import org.eclipse.papyrus.toolsmiths.validation.elementtypes.internal.messages.Messages;
import org.eclipse.papyrus.uml.types.core.advices.applystereotype.FeatureToSet;
import org.eclipse.papyrus.uml.types.core.advices.applystereotype.StereotypeToApply;
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.elementtypes/src/org/eclipse/papyrus/toolsmiths/validation/elementtypes/internal/checkers/ElementTypesBuildPropertiesDependencies.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.elementtypes/src/org/eclipse/papyrus/toolsmiths/validation/elementtypes/internal/checkers/ElementTypesBuildPropertiesDependencies.java
index 4bf44d70e6b..64684b6160f 100644
--- a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.elementtypes/src/org/eclipse/papyrus/toolsmiths/validation/elementtypes/internal/checkers/ElementTypesBuildPropertiesDependencies.java
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.elementtypes/src/org/eclipse/papyrus/toolsmiths/validation/elementtypes/internal/checkers/ElementTypesBuildPropertiesDependencies.java
@@ -28,6 +28,7 @@ import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.Switch;
import org.eclipse.papyrus.infra.emf.utils.ResourceUtils;
import org.eclipse.papyrus.infra.types.util.ElementTypesConfigurationsSwitch;
+import org.eclipse.papyrus.toolsmiths.validation.common.utils.LocalProfileIndex;
import org.eclipse.papyrus.uml.types.core.advices.applystereotype.StereotypeToApply;
import org.eclipse.papyrus.uml.types.core.advices.applystereotype.util.ApplyStereotypeAdviceSwitch;
import org.eclipse.papyrus.uml.types.core.advices.stereotypepropertyreferenceedgeadvice.StereotypePropertyReferenceEdgeAdviceConfiguration;
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.elementtypes/src/org/eclipse/papyrus/toolsmiths/validation/elementtypes/internal/checkers/StereotypeApplicationMatcherCustomValidator.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.elementtypes/src/org/eclipse/papyrus/toolsmiths/validation/elementtypes/internal/checkers/StereotypeApplicationMatcherCustomValidator.java
index 567dc63bea1..89ddfa295a2 100644
--- a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.elementtypes/src/org/eclipse/papyrus/toolsmiths/validation/elementtypes/internal/checkers/StereotypeApplicationMatcherCustomValidator.java
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.elementtypes/src/org/eclipse/papyrus/toolsmiths/validation/elementtypes/internal/checkers/StereotypeApplicationMatcherCustomValidator.java
@@ -20,6 +20,7 @@ import java.util.Map;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.DiagnosticChain;
import org.eclipse.papyrus.toolsmiths.validation.common.checkers.CustomModelChecker;
+import org.eclipse.papyrus.toolsmiths.validation.common.utils.LocalProfileIndex;
import org.eclipse.papyrus.toolsmiths.validation.elementtypes.internal.messages.Messages;
import org.eclipse.papyrus.uml.types.core.matchers.stereotype.StereotypeApplicationMatcherConfiguration;
import org.eclipse.uml2.uml.Profile;
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.elementtypes/src/org/eclipse/papyrus/toolsmiths/validation/elementtypes/internal/checkers/StereotypePropertyReferenceEdgeAdviceCustomValidator.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.elementtypes/src/org/eclipse/papyrus/toolsmiths/validation/elementtypes/internal/checkers/StereotypePropertyReferenceEdgeAdviceCustomValidator.java
index 101975d7564..053bc55838a 100644
--- a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.elementtypes/src/org/eclipse/papyrus/toolsmiths/validation/elementtypes/internal/checkers/StereotypePropertyReferenceEdgeAdviceCustomValidator.java
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.elementtypes/src/org/eclipse/papyrus/toolsmiths/validation/elementtypes/internal/checkers/StereotypePropertyReferenceEdgeAdviceCustomValidator.java
@@ -20,6 +20,7 @@ import java.util.Map;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.DiagnosticChain;
import org.eclipse.papyrus.toolsmiths.validation.common.checkers.CustomModelChecker;
+import org.eclipse.papyrus.toolsmiths.validation.common.utils.LocalProfileIndex;
import org.eclipse.papyrus.toolsmiths.validation.elementtypes.internal.messages.Messages;
import org.eclipse.papyrus.uml.types.core.advices.stereotypepropertyreferenceedgeadvice.StereotypePropertyReferenceEdgeAdviceConfiguration;
import org.eclipse.uml2.uml.Property;
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/.classpath b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/.classpath
new file mode 100644
index 00000000000..7b137d9ab4b
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin/"/>
+</classpath>
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/.project b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/.project
new file mode 100644
index 00000000000..476f71a7d78
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/.project
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.papyrus.toolsmiths.validation.properties</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.oomph.version.VersionBuilder</name>
+ <arguments>
+ <dictionary>
+ <key>check.maven.pom</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>ignore.lower.bound.dependency.ranges</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>release.path</key>
+ <value>/org.eclipse.papyrus.releng.dev.release/release.xml</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ds.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
+ <nature>org.eclipse.oomph.version.VersionNature</nature>
+ </natures>
+</projectDescription>
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/.settings/org.eclipse.core.resources.prefs b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000000..896a9a53a53
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8 \ No newline at end of file
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/.settings/org.eclipse.core.runtime.prefs b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/.settings/org.eclipse.core.runtime.prefs
new file mode 100644
index 00000000000..5a0ad22d2a7
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/.settings/org.eclipse.core.runtime.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+line.separator=\n
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/.settings/org.eclipse.jdt.core.prefs b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..037f04a07c2
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,319 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=11
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=260
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=false
+org.eclipse.jdt.core.formatter.join_wrapped_lines=false
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=260
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=5
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=false
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/.settings/org.eclipse.jdt.ui.prefs b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 00000000000..ba7542ef658
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,127 @@
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.convert_functional_interfaces=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.correct_indentation=false
+cleanup.format_source_code=false
+cleanup.format_source_code_changes_only=false
+cleanup.insert_inferred_type_arguments=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=false
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=false
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.organize_imports=false
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=true
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.remove_private_constructors=true
+cleanup.remove_redundant_type_arguments=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=true
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.use_anonymous_class_creation=false
+cleanup.use_blocks=true
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_lambda=true
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_type_arguments=false
+cleanup_profile=_Papyrus
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Papyrus
+formatter_settings_version=12
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;com;
+org.eclipse.jdt.ui.javadoc=true
+org.eclipse.jdt.ui.ondemandthreshold=99
+org.eclipse.jdt.ui.staticondemandthreshold=99
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="false" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * Constructor.\n *\n * ${tags}\n */</template><template autoinsert\="false" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*****************************************************************************\n * Copyright (c) ${year} CEA LIST and others.\n * \n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License 2.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors\:\n * CEA LIST - Initial API and implementation\n * \n *****************************************************************************/\n</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/**\n * ${see_to_overridden}\n *\n * ${tags}\n */</template><template autoinsert\="false" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${see_to_target}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.make_local_variable_final=true
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_modifiers=false
+sp_cleanup.remove_redundant_type_arguments=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=true
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/.settings/org.eclipse.m2e.core.prefs b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 00000000000..f897a7f1cb2
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/.settings/org.eclipse.pde.api.tools.prefs b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 00000000000..b2260f87129
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,104 @@
+ANNOTATION_ELEMENT_TYPE_ADDED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Warning
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Warning
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+API_USE_SCAN_FIELD_SEVERITY=Error
+API_USE_SCAN_METHOD_SEVERITY=Error
+API_USE_SCAN_TYPE_SEVERITY=Error
+CLASS_ELEMENT_TYPE_ADDED_FIELD=Warning
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Warning
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Warning
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Warning
+ILLEGAL_IMPLEMENT=Warning
+ILLEGAL_INSTANTIATE=Warning
+ILLEGAL_OVERRIDE=Warning
+ILLEGAL_REFERENCE=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_DEFAULT_METHOD=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Ignore
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+INVALID_ANNOTATION=Ignore
+INVALID_JAVADOC_TAG=Ignore
+INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Ignore
+LEAK_EXTEND=Warning
+LEAK_FIELD_DECL=Warning
+LEAK_IMPLEMENT=Warning
+LEAK_METHOD_PARAM=Warning
+LEAK_METHOD_RETURN_TYPE=Warning
+METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+MISSING_EE_DESCRIPTIONS=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+UNUSED_PROBLEM_FILTERS=Warning
+automatically_removed_unused_problem_filters=Enabled
+changed_execution_env=Warning
+eclipse.preferences.version=1
+incompatible_api_component_version=Warning
+incompatible_api_component_version_include_major_without_breaking_change=Disabled
+incompatible_api_component_version_include_minor_without_api_change=Disabled
+incompatible_api_component_version_report_major_without_breaking_change=Error
+incompatible_api_component_version_report_minor_without_api_change=Error
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
+report_api_breakage_when_major_version_incremented=Disabled
+report_resolution_errors_api_component=Warning
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/META-INF/MANIFEST.MF b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..2f0e455a616
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/META-INF/MANIFEST.MF
@@ -0,0 +1,54 @@
+Manifest-Version: 1.0
+Require-Bundle:
+ org.eclipse.core.expressions;bundle-version="[3.6.0,4.0.0)",
+ org.eclipse.core.resources;bundle-version="[3.13.0,4.0.0)",
+ org.eclipse.core.runtime;bundle-version="[3.18.0,4.0.0)",
+ org.eclipse.emf.ecore;bundle-version="[2.22.0,3.0.0)",
+ org.eclipse.papyrus.dev.ui;bundle-version="[1.0.0,2.0.0)",
+ org.eclipse.papyrus.infra.core.log;bundle-version="[2.0.0,3.0.0)",
+ org.eclipse.papyrus.toolsmiths.validation.common;bundle-version="[2.0.0,3.0.0)",
+ org.eclipse.papyrus.uml.tools;bundle-version="[5.0.0,6.0.0)",
+ org.eclipse.pde.core;bundle-version="[3.13.0,4.0.0)",
+ org.eclipse.jdt.core;bundle-version="[3.24.0,4.0.0)",
+ org.eclipse.ui;bundle-version="[3.117.0,4.0.0)",
+ org.eclipse.uml2.uml;bundle-version="[5.5.0,6.0.0)",
+ org.eclipse.ui.ide;bundle-version="[3.18.0,4.0.0)",
+ org.eclipse.papyrus.toolsmiths.plugin.builder;bundle-version="[1.1.0,2.0.0)",
+ org.eclipse.papyrus.infra.core;bundle-version="[4.1.0,5.0.0)",
+ org.eclipse.papyrus.infra.emf;bundle-version="[4.0.0,5.0.0)",
+ org.eclipse.emf.edit;bundle-version="[2.16.0,3.0.0)",
+ org.eclipse.papyrus.infra.properties;bundle-version="[4.0.0,5.0.0)",
+ org.eclipse.papyrus.infra.constraints;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.papyrus.infra.properties.ui;bundle-version="[4.1.0,5.0.0)",
+ org.eclipse.papyrus.infra.tools;bundle-version="[4.2.0,5.0.0)",
+ org.eclipse.papyrus.uml.properties.generation;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.m2m.qvt.oml;bundle-version="[3.10.0,4.0.0)";resolution:=optional,
+ org.eclipse.core.databinding.observable;bundle-version="[1.10.0,2.0.0)";resolution:=optional,
+ org.eclipse.papyrus.infra.ui;bundle-version="[3.3.0,4.0.0)",
+ org.eclipse.papyrus.infra.properties.edit;bundle-version="[4.1.0,5.0.0)"
+Export-Package:
+ org.eclipse.papyrus.toolsmiths.validation.properties.internal,
+ org.eclipse.papyrus.toolsmiths.validation.properties.internal.checkers;x-internal:=true,
+ org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants,
+ org.eclipse.papyrus.toolsmiths.validation.properties.internal.messages;x-internal:=true,
+ org.eclipse.papyrus.toolsmiths.validation.properties.internal.quickfix;x-internal:=true,
+ org.eclipse.papyrus.toolsmiths.validation.properties.internal.trace;x-internal:=true,
+ org.eclipse.papyrus.toolsmiths.validation.properties.internal.util;x-internal:=true
+Bundle-Vendor: %providerName
+Bundle-ActivationPolicy: lazy
+Bundle-ClassPath: .
+Bundle-Version: 1.0.0.qualifier
+Bundle-Localization: plugin
+Bundle-Name: %pluginName
+Bundle-Activator: org.eclipse.papyrus.toolsmiths.validation.properties.internal.Activator
+Bundle-ManifestVersion: 2
+Bundle-Description: %pluginDescription
+Bundle-SymbolicName: org.eclipse.papyrus.toolsmiths.validation.properties;singleton:=true
+Bundle-RequiredExecutionEnvironment: JavaSE-11
+Automatic-Module-Name: org.eclipse.papyrus.toolsmiths.validation.properties
+Import-Package: com.google.common.base;version="[30.1.0,31.0.0)",
+ com.google.common.collect;version="[30.1.0,31.0.0)",
+ org.osgi.service.component.annotations;version="[1.3.0,2.0.0)";resolution:=optional
+Service-Component: OSGI-INF/org.eclipse.papyrus.toolsmiths.validation.properties.internal.checkers.PropertiesContextBuilderProvider.xml,
+ OSGI-INF/org.eclipse.papyrus.toolsmiths.validation.properties.internal.checkers.PropertiesEnvironmentBuilderProvider.xml,
+ OSGI-INF/org.eclipse.papyrus.toolsmiths.validation.properties.internal.PropertiesURIConverterService.xml
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/OSGI-INF/org.eclipse.papyrus.toolsmiths.validation.properties.internal.PropertiesURIConverterService.xml b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/OSGI-INF/org.eclipse.papyrus.toolsmiths.validation.properties.internal.PropertiesURIConverterService.xml
new file mode 100644
index 00000000000..d6c3c0be791
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/OSGI-INF/org.eclipse.papyrus.toolsmiths.validation.properties.internal.PropertiesURIConverterService.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.eclipse.papyrus.toolsmiths.validation.properties.internal.PropertiesURIConverterService">
+ <property name="papyrus.toolsmiths.uri.scheme" value="ppe"/>
+ <service>
+ <provide interface="org.eclipse.papyrus.toolsmiths.validation.common.URIConverterService"/>
+ </service>
+ <implementation class="org.eclipse.papyrus.toolsmiths.validation.properties.internal.PropertiesURIConverterService"/>
+</scr:component> \ No newline at end of file
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/OSGI-INF/org.eclipse.papyrus.toolsmiths.validation.properties.internal.checkers.PropertiesContextBuilderProvider.xml b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/OSGI-INF/org.eclipse.papyrus.toolsmiths.validation.properties.internal.checkers.PropertiesContextBuilderProvider.xml
new file mode 100644
index 00000000000..16c2e268f1f
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/OSGI-INF/org.eclipse.papyrus.toolsmiths.validation.properties.internal.checkers.PropertiesContextBuilderProvider.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.eclipse.papyrus.toolsmiths.validation.properties.internal.checkers.PropertiesContextBuilderProvider">
+ <service>
+ <provide interface="org.eclipse.papyrus.toolsmiths.plugin.builder.IPapyrusBuilderProvider"/>
+ </service>
+ <implementation class="org.eclipse.papyrus.toolsmiths.validation.properties.internal.checkers.PropertiesContextBuilderProvider"/>
+</scr:component> \ No newline at end of file
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/OSGI-INF/org.eclipse.papyrus.toolsmiths.validation.properties.internal.checkers.PropertiesEnvironmentBuilderProvider.xml b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/OSGI-INF/org.eclipse.papyrus.toolsmiths.validation.properties.internal.checkers.PropertiesEnvironmentBuilderProvider.xml
new file mode 100644
index 00000000000..818195cbc56
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/OSGI-INF/org.eclipse.papyrus.toolsmiths.validation.properties.internal.checkers.PropertiesEnvironmentBuilderProvider.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.eclipse.papyrus.toolsmiths.validation.properties.internal.checkers.PropertiesEnvironmentBuilderProvider">
+ <service>
+ <provide interface="org.eclipse.papyrus.toolsmiths.plugin.builder.IPapyrusBuilderProvider"/>
+ </service>
+ <implementation class="org.eclipse.papyrus.toolsmiths.validation.properties.internal.checkers.PropertiesEnvironmentBuilderProvider"/>
+</scr:component> \ No newline at end of file
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/about.html b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/about.html
new file mode 100644
index 00000000000..997c5a2284d
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>November 30, 2017</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 2.0 (&quot;EPL&quot;). A copy of the EPL is available
+at <a href="https://www.eclipse.org/legal/epl-2.0/">https://www.eclipse.org/legal/epl-2.0/</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/build.properties b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/build.properties
new file mode 100644
index 00000000000..ab301eda2f9
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/build.properties
@@ -0,0 +1,24 @@
+# Copyright (c) 2019, 2021 CEA LIST, Christian W. Damus, and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+# Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+# Christian W. Damus - bugs 572644, 573986
+#
+
+output.. = bin/
+bin.includes = .,\
+ META-INF/,\
+ plugin.xml,\
+ plugin.properties,\
+ about.html,\
+ OSGI-INF/
+jars.compile.order=.
+src.includes = about.html
+source.. = src/
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/plugin.properties b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/plugin.properties
new file mode 100644
index 00000000000..422ced9bd6d
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/plugin.properties
@@ -0,0 +1,21 @@
+#################################################################################
+# Copyright (c) 2019, 2021 CEA LIST, Christian W. Damus, and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+# Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+# Christian W. Damus - bugs 570097, 573986
+#
+##################################################################################
+
+pluginName = Papyrus Plug-ins Validation for Properties Contexts
+providerName = Eclipse Modeling Project
+pluginDescription=This plug-in provides the validation for the Properties Context plug-ins
+
+marker.name = Papyrus Toolsmiths Properties Plug-in problems
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/plugin.xml b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/plugin.xml
new file mode 100644
index 00000000000..cde28b92439
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/plugin.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+
+<!--
+ Copyright (c) 2019 CEA LIST.
+
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License 2.0
+ which accompanies this distribution, and is available at
+ https://www.eclipse.org/legal/epl-2.0/
+
+ SPDX-License-Identifier: EPL-2.0
+
+ Contributors:
+ Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+
+-->
+
+<plugin>
+ <extension
+ id="diagnostic"
+ name="%marker.name"
+ point="org.eclipse.core.resources.markers">
+ <super
+ type="org.eclipse.core.resources.problemmarker">
+ </super>
+ <super
+ type="org.eclipse.jdt.core.problem">
+ </super>
+ <persistent
+ value="true">
+ </persistent>
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.ide.markerResolution">
+ <markerResolutionGenerator
+ class="org.eclipse.papyrus.toolsmiths.validation.properties.internal.quickfix.PropertiesMarkerResolutionGenerator"
+ markerType="org.eclipse.papyrus.toolsmiths.validation.properties.diagnostic">
+ </markerResolutionGenerator>
+ </extension>
+
+</plugin>
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/pom.xml b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/pom.xml
new file mode 100644
index 00000000000..fd5bb80b956
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/pom.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.eclipse.papyrus</groupId>
+ <artifactId>org.eclipse.papyrus.toolsmiths.validations</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ </parent>
+ <artifactId>org.eclipse.papyrus.toolsmiths.validation.properties</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <packaging>eclipse-plugin</packaging>
+</project>
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/Activator.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/Activator.java
new file mode 100644
index 00000000000..c2939be62ae
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/Activator.java
@@ -0,0 +1,71 @@
+/*****************************************************************************
+ * Copyright (c) 2019, 2021 CEA LIST, Christian W. Damus, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ * Christian W. Damus - bug 573986
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.properties.internal;
+
+import org.eclipse.papyrus.infra.core.log.LogHelper;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle.
+ */
+public class Activator extends AbstractUIPlugin {
+
+ /**
+ * The plug-in ID.
+ */
+ public static final String PLUGIN_ID = "org.eclipse.papyrus.toolsmiths.validation.properties"; //$NON-NLS-1$
+
+ /**
+ * The shared instance.
+ */
+ private static Activator plugin;
+
+ /**
+ * The log helper.
+ */
+ public static LogHelper log;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ log = new LogHelper(this);
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ }
+
+ /**
+ * Returns the shared instance.
+ *
+ * @return the shared instance.
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
+
+}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/PropertiesURIConverterService.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/PropertiesURIConverterService.java
new file mode 100644
index 00000000000..77c3b46f2e3
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/PropertiesURIConverterService.java
@@ -0,0 +1,37 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.properties.internal;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.papyrus.infra.properties.catalog.PropertiesURIHandler;
+import org.eclipse.papyrus.toolsmiths.validation.common.URIConverterService;
+import org.osgi.service.component.annotations.Component;
+
+/**
+ * A URI converter service for the Properties framework's <tt>ppe</tt> URI scheme.
+ */
+@Component(property = { URIConverterService.SCHEME_PROPERTY + "=ppe" })
+public class PropertiesURIConverterService implements URIConverterService {
+
+ private final PropertiesURIHandler uriHandler = new PropertiesURIHandler();
+
+ @Override
+ public URI normalize(URI uri, ResourceSet context) {
+ return uriHandler.canHandle(uri) ? uriHandler.getConvertedURI(uri) : uri;
+ }
+
+}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/ConstraintsCustomValidator.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/ConstraintsCustomValidator.java
new file mode 100644
index 00000000000..e45f38b16f0
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/ConstraintsCustomValidator.java
@@ -0,0 +1,87 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.properties.internal.checkers;
+
+import static org.eclipse.papyrus.toolsmiths.validation.common.checkers.IPluginChecker2.problem;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.UNRESOLVED_CONSTRAINT_CLASS;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.UNRESOLVED_CONSTRAINT_CLASS_MULTIPLE_CHOICE;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.valueToSet;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.emf.common.util.DiagnosticChain;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EcorePackage;
+import org.eclipse.papyrus.infra.constraints.ConstraintDescriptor;
+import org.eclipse.papyrus.infra.constraints.ConstraintsPackage;
+import org.eclipse.papyrus.infra.constraints.SimpleConstraint;
+import org.eclipse.papyrus.infra.constraints.ValueProperty;
+import org.eclipse.papyrus.infra.constraints.environment.ConstraintType;
+import org.eclipse.papyrus.infra.constraints.util.ConstraintsUtil;
+import org.eclipse.papyrus.toolsmiths.validation.common.checkers.CustomModelChecker;
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.messages.Messages;
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.trace.ComposedSourceTraceHelper;
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.trace.NameKind;
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.trace.SourceTraceHelper;
+
+import com.google.common.base.Strings;
+
+/**
+ * Custom validation rules for <em>Constraints</em> on views and other objects in <em>Properties Context</em> models.
+ */
+public class ConstraintsCustomValidator extends CustomModelChecker.SwitchValidator {
+
+ private final SourceTraceHelper traceHelper = new ComposedSourceTraceHelper();
+
+ public ConstraintsCustomValidator(String nsURI) {
+ super(nsURI);
+ }
+
+ public void validate(ConstraintDescriptor constraint, DiagnosticChain diagnostics, Map<Object, Object> context) {
+ if (traceHelper.isInstanceOfConstraint(constraint)) {
+ EObject sourceClass = traceHelper.resolveInstanceOfConstraintClass(constraint);
+ if (sourceClass == null || sourceClass.eIsProxy()) {
+ // Can we find what the class name should have been?
+ EObject container = constraint.eContainer();
+ EObject containerSource = traceHelper.getSourceElement(container);
+ Collection<? extends EObject> constraintSourceClasses = traceHelper.getValidConstraintSourceClasses(constraint, containerSource);
+
+ String actualClassName = traceHelper.getClassName(constraint);
+ String expectedClassName = constraintSourceClasses.stream().map(c -> traceHelper.getName(c, NameKind.CONSTRAINT))
+ .distinct().collect(Collectors.joining(",")); //$NON-NLS-1$
+ ValueProperty constraintProperty = Strings.isNullOrEmpty(expectedClassName) ? null : traceHelper.getClassNameProperty(constraint);
+
+ if (constraintProperty != null) {
+ // If there are multiple choices, then the fixes will not be applicable to multiple markers,
+ // so use a distinct problem ID for that case
+ int problemID = constraintSourceClasses.size() > 1 ? UNRESOLVED_CONSTRAINT_CLASS_MULTIPLE_CHOICE : UNRESOLVED_CONSTRAINT_CLASS;
+ ConstraintType type = ((SimpleConstraint) constraint).getConstraintType();
+ String message = format(Messages.ConstraintsCustomValidator_0, context, ConstraintsUtil.getLabel(constraint), actualClassName,
+ ConstraintsUtil.getLabel(constraintProperty), ConstraintsUtil.getLabel(type));
+ diagnostics.add(createDiagnostic(Diagnostic.ERROR, constraintProperty, ConstraintsPackage.Literals.VALUE_PROPERTY__VALUE,
+ message, problem(problemID), valueToSet(expectedClassName, EcorePackage.Literals.ESTRING)));
+ } else {
+ diagnostics.add(createDiagnostic(Diagnostic.ERROR, constraint,
+ format(Messages.ConstraintsCustomValidator_1, context, constraint, actualClassName)));
+ }
+ }
+ }
+ }
+
+}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesContextBuilderProvider.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesContextBuilderProvider.java
new file mode 100644
index 00000000000..c6a3086b62a
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesContextBuilderProvider.java
@@ -0,0 +1,85 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.properties.internal.checkers;
+
+import static org.eclipse.papyrus.toolsmiths.validation.common.utils.ModelResourceMapper.byContentType;
+import static org.eclipse.papyrus.toolsmiths.validation.common.utils.ModelResourceMapper.byExtension;
+import static org.eclipse.papyrus.toolsmiths.validation.common.utils.ModelResourceMapper.resourceSets;
+import static org.eclipse.papyrus.toolsmiths.validation.common.utils.ModelResourceMapper.rootsOfType;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.checkers.PropertiesContextPluginChecker.CONTENT_TYPE;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.checkers.PropertiesContextPluginChecker.CONTEXT_EXTENSION;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.PROPERTIES_PLUGIN_VALIDATION_MARKER_TYPE;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.papyrus.infra.emf.utils.ResourceUtils;
+import org.eclipse.papyrus.infra.properties.contexts.Context;
+import org.eclipse.papyrus.toolsmiths.plugin.builder.AbstractPapyrusBuilder;
+import org.eclipse.papyrus.toolsmiths.plugin.builder.IPapyrusBuilderProvider;
+import org.eclipse.papyrus.toolsmiths.plugin.builder.PapyrusBuilderKind;
+import org.eclipse.papyrus.toolsmiths.plugin.builder.PluginCheckerBuilder;
+import org.eclipse.papyrus.toolsmiths.validation.common.utils.ModelResourceMapper;
+import org.osgi.service.component.annotations.Component;
+
+import com.google.common.collect.ListMultimap;
+
+/**
+ * Builder provider for <em>Properties Context</em> models.
+ */
+@Component
+public class PropertiesContextBuilderProvider implements IPapyrusBuilderProvider {
+
+ @Override
+ public String getProblemMarkerType(PapyrusBuilderKind builderKind) {
+ return PROPERTIES_PLUGIN_VALIDATION_MARKER_TYPE;
+ }
+
+ @Override
+ public boolean providesBuilder(PapyrusBuilderKind builderKind, URI resourceURI) {
+ return CONTEXT_EXTENSION.equals(resourceURI.fileExtension())
+ || hasContentType(resourceURI, CONTENT_TYPE);
+ }
+
+ @Override
+ public AbstractPapyrusBuilder getBuilder(PapyrusBuilderKind builderKind, IProject project) {
+ PluginCheckerBuilder result = new PluginCheckerBuilder(PROPERTIES_PLUGIN_VALIDATION_MARKER_TYPE, this::mapContextResources);
+
+ switch (builderKind) {
+ case MODEL_RESOURCE:
+ result = result.withChecker(PropertiesContextPluginChecker.modelValidationCheckerFactory())
+ .withChecker(PropertiesContextPluginChecker.customModelCheckerFactory());
+ break;
+ case BUNDLE_MANIFEST:
+ result = result.withChecker(PropertiesContextPluginChecker.buildPropertiesCheckerFactory())
+ .withChecker(PropertiesContextPluginChecker.modelDependenciesCheckerFactory());
+ break;
+ case PLUGIN_MANIFEST:
+ result = result.withChecker(PropertiesContextPluginChecker.extensionsCheckerFactory());
+ break;
+ }
+
+ return result;
+ }
+
+ private ListMultimap<IFile, Context> mapContextResources(IProject project) {
+ ModelResourceMapper<Context> mapper = new ModelResourceMapper<>(project);
+ return mapper.map(byExtension(CONTEXT_EXTENSION).or(byContentType(CONTENT_TYPE)),
+ resourceSets(ResourceUtils.createWorkspaceAwarePackageRegistry()),
+ rootsOfType(Context.class));
+ }
+
+}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesContextCustomValidator.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesContextCustomValidator.java
new file mode 100644
index 00000000000..653290ea146
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesContextCustomValidator.java
@@ -0,0 +1,378 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.properties.internal.checkers;
+
+import static org.eclipse.papyrus.toolsmiths.validation.common.checkers.IPluginChecker2.problem;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.INCONSISTENT_DATA_CONTEXT_PROPERTY_MULTIPLICITY;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.INCONSISTENT_DATA_CONTEXT_PROPERTY_TYPE;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.MARKER_ATTR_LAYOUT_GENERATOR;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.MISSING_DATA_CONTEXT_ELEMENT;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.MISSING_DATA_CONTEXT_PACKAGE;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.MISSING_DATA_CONTEXT_PROPERTY;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.OBSOLETE_DATA_CONTEXT_ELEMENT;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.OBSOLETE_DATA_CONTEXT_PACKAGE;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.OBSOLETE_DATA_CONTEXT_PROPERTY;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.OBSOLETE_DATA_CONTEXT_ROOT;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.RENAMED_CLASS;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.RENAMED_PACKAGE;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.RENAMED_PROPERTY;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.objectToReference;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.valueToSet;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.emf.common.util.DiagnosticChain;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EcorePackage;
+import org.eclipse.papyrus.customization.properties.generation.generators.GeneratorHelper;
+import org.eclipse.papyrus.infra.properties.contexts.ContextsPackage;
+import org.eclipse.papyrus.infra.properties.contexts.DataContextElement;
+import org.eclipse.papyrus.infra.properties.contexts.DataContextPackage;
+import org.eclipse.papyrus.infra.properties.contexts.DataContextRoot;
+import org.eclipse.papyrus.infra.properties.contexts.Property;
+import org.eclipse.papyrus.infra.properties.contexts.Section;
+import org.eclipse.papyrus.infra.properties.contexts.util.ContextAnnotations;
+import org.eclipse.papyrus.infra.properties.environment.EnvironmentPackage;
+import org.eclipse.papyrus.infra.properties.environment.ModelElementFactoryDescriptor;
+import org.eclipse.papyrus.infra.properties.environment.Type;
+import org.eclipse.papyrus.infra.properties.ui.Widget;
+import org.eclipse.papyrus.toolsmiths.validation.common.checkers.CustomModelChecker;
+import org.eclipse.papyrus.toolsmiths.validation.common.checkers.IPluginChecker2;
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.messages.Messages;
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.util.PropertiesCache;
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.util.PropertyTypeHelper;
+
+import com.google.common.collect.Lists;
+
+/**
+ * Custom validation rules for <em>Properties Context</em> models.
+ */
+public class PropertiesContextCustomValidator extends CustomModelChecker.SwitchValidator {
+
+ /**
+ * Validation context key tracking the data context elements found to be obsolete. Its value is
+ * a set of {@link DataContextElement}s.
+ */
+ private static final String OBSOLETE_DATA_CONTEXT_ELEMENTS = "obsoleteDataContextElement"; //$NON-NLS-1$
+
+ /**
+ * Validation context key tracking the data context roots found to use custom factories, that should
+ * not be validated. Its value is a map of {@link DataContextRoot}s to {@link Boolean} indicating whether
+ * the data context root is custom.
+ */
+ private static final String CUSTOM_DATA_CONTEXT_ROOTS = "customDataContextRoots"; //$NON-NLS-1$
+
+ /**
+ * The set of model-element factories for which we understand and can validate
+ * {@link DataContextRoot}s. Only these factories are used by the context model
+ * generation.
+ */
+ private final Set<String> applicableModelElementFactories = Set.of(
+ // For Ecore models
+ "org.eclipse.papyrus.infra.properties.ui.modelelement.EMFModelElementFactory", //$NON-NLS-1$
+ // For UML profiles
+ "org.eclipse.papyrus.uml.properties.modelelement.UMLModelElementFactory", //$NON-NLS-1$
+ "org.eclipse.papyrus.uml.properties.modelelement.StereotypeModelElementFactory"); //$NON-NLS-1$
+
+ public PropertiesContextCustomValidator(String nsURI) {
+ super(nsURI);
+ }
+
+ public void validate(DataContextPackage package_, DiagnosticChain diagnostics, Map<Object, Object> context) {
+ if (isInCustomDataContextRoot(package_, context)) {
+ // We cannot validate custom data contexts that we do not understand
+ return;
+ }
+
+ if (package_.getPackage() != null && isObsolete(package_.getPackage(), context)) {
+ // Don't need to validate a package nested within an obsolete package
+ markObsolete(package_, context);
+ return;
+ }
+
+ PropertiesCache cache = PropertiesCache.getInstance(package_);
+ EObject sourcePackage = cache.getSourceElement(package_);
+ if (sourcePackage == null) {
+ // No traceability? Warn on the assumption that the DataContextPackage is obsolete
+ diagnostics.add(createDiagnostic(Diagnostic.WARNING, package_,
+ format(Messages.PropertiesContextCustomValidator_0, context, package_),
+ problem(OBSOLETE_DATA_CONTEXT_PACKAGE)));
+ markObsolete(package_, context);
+ } else if (sourcePackage.eIsProxy()) {
+ // Source element was deleted/moved? This DataContextPackage is now obsolete
+
+ if (package_ instanceof DataContextRoot) {
+ // But this is a special case: we hope that the entire source was moved, which is fixable
+ diagnostics.add(createDiagnostic(Diagnostic.WARNING, package_,
+ format(Messages.PropertiesContextCustomValidator_12, context, package_),
+ problem(OBSOLETE_DATA_CONTEXT_ROOT)));
+ } else {
+ diagnostics.add(createDiagnostic(Diagnostic.ERROR, package_,
+ format(Messages.PropertiesContextCustomValidator_1, context, package_),
+ problem(OBSOLETE_DATA_CONTEXT_PACKAGE)));
+ }
+ markObsolete(package_, context);
+ } else {
+ String sourceName = cache.getName(sourcePackage);
+ if (!Objects.equals(sourceName, package_.getName())) {
+ diagnostics.add(createDiagnostic(Diagnostic.ERROR, package_, ContextsPackage.Literals.DATA_CONTEXT_ELEMENT__NAME,
+ format(Messages.PropertiesContextCustomValidator_9, context, package_, sourceName, sourcePackage),
+ problem(RENAMED_PACKAGE), valueToSet(sourceName, EcorePackage.Literals.ESTRING)));
+ }
+ checkForMissingPackages(package_, sourcePackage, diagnostics, context);
+ checkForMissingClasses(package_, sourcePackage, diagnostics, context);
+ }
+ }
+
+ protected boolean isInCustomDataContextRoot(EObject object, Map<Object, Object> context) {
+ boolean result = false;
+
+ if (object instanceof DataContextRoot) {
+ DataContextRoot root = (DataContextRoot) object;
+
+ @SuppressWarnings("unchecked")
+ Map<DataContextRoot, Boolean> customRoots = (Map<DataContextRoot, Boolean>) context.computeIfAbsent(CUSTOM_DATA_CONTEXT_ROOTS, __ -> new HashMap<>());
+ result = customRoots.computeIfAbsent(root, dcr -> {
+ ModelElementFactoryDescriptor factory = dcr.getModelElementFactory();
+ // If this is a custom model element factory, then we can infer nothing about its mappings or
+ // consistency to any model because its purpose is to describe concepts not in the model
+ return factory == null || !applicableModelElementFactories.contains(factory.getFactoryClass());
+ });
+ } else if (object.eContainer() != null) {
+ result = isInCustomDataContextRoot(object.eContainer(), context);
+ }
+
+ return result;
+ }
+
+ private void checkForMissingPackages(DataContextPackage package_, EObject sourcePackage, DiagnosticChain diagnostics, Map<Object, Object> context) {
+ checkForMissingElements(package_, new HashSet<>(PropertiesCache.getInstance(package_).getNestedPackages(sourcePackage)),
+ MISSING_DATA_CONTEXT_PACKAGE, Messages.PropertiesContextCustomValidator_13, diagnostics, context);
+ }
+
+ private void checkForMissingClasses(DataContextPackage package_, EObject sourcePackage, DiagnosticChain diagnostics, Map<Object, Object> context) {
+ checkForMissingElements(package_, new HashSet<>(PropertiesCache.getInstance(package_).getClasses(sourcePackage)),
+ MISSING_DATA_CONTEXT_ELEMENT, Messages.PropertiesContextCustomValidator_2, diagnostics, context);
+ }
+
+ private void checkForMissingElements(DataContextPackage package_, Set<? extends EObject> sourceElements, int problemID, String messagePattern,
+ DiagnosticChain diagnostics, Map<Object, Object> context) {
+
+ PropertiesCache cache = PropertiesCache.getInstance(package_);
+ package_.getElements().stream().map(cache::getSourceElement).forEach(sourceElements::remove);
+ if (!sourceElements.isEmpty()) {
+ // We have unmapped source elements (classes or packages)
+ sourceElements.stream().map(sourceElement -> createDiagnostic(Diagnostic.WARNING, package_,
+ format(messagePattern, context, package_, sourceElement),
+ missingElementAttributes(package_, problemID, sourceElement)))
+ .forEach(diagnostics::add);
+ }
+ }
+
+ private Collection<? extends IPluginChecker2.MarkerAttribute> missingElementAttributes(DataContextPackage package_, int problemID, EObject sourceClass) {
+ Collection<IPluginChecker2.MarkerAttribute> result = Lists.newArrayList(problem(problemID),
+ objectToReference(sourceClass));
+
+ addLayoutGenerator(result, package_);
+ return result;
+ }
+
+ private void addLayoutGenerator(Collection<? super IPluginChecker2.MarkerAttribute> marker, DataContextElement element) {
+ // Does the data context root have a layout-generator annotation?
+ DataContextRoot root = GeneratorHelper.getRoot(element);
+ String layoutGenerator = (root != null) ? ContextAnnotations.getLayoutGeneratorClassName(root) : null;
+ if (layoutGenerator != null) {
+ // Tell the quick fix which layout generator to use
+ marker.add(new IPluginChecker2.MarkerAttribute(MARKER_ATTR_LAYOUT_GENERATOR, layoutGenerator));
+ }
+ }
+
+ public void validate(DataContextElement element, DiagnosticChain diagnostics, Map<Object, Object> context) {
+ // DataContextPackages are DataContextElements but do not map to classes, so skip them
+ if (element instanceof DataContextPackage) {
+ return;
+ }
+ if (isInCustomDataContextRoot(element, context)) {
+ // We cannot validate custom data contexts that we do not understand
+ return;
+ }
+
+ if (isObsolete(element.getPackage(), context)) {
+ // Don't need to validate an element within an obsolete package
+ markObsolete(element, context);
+ return;
+ }
+
+ PropertiesCache cache = PropertiesCache.getInstance(element);
+ EObject sourceClass = cache.getSourceElement(element);
+ if (sourceClass == null) {
+ // No traceability? Warn on the assumption that the DataContextElement is obsolete
+ diagnostics.add(createDiagnostic(Diagnostic.WARNING, element,
+ format(Messages.PropertiesContextCustomValidator_3, context, element),
+ problem(OBSOLETE_DATA_CONTEXT_ELEMENT)));
+ markObsolete(element, context);
+ } else if (sourceClass.eIsProxy()) {
+ // Source element was deleted/moved? This DataContextElement is now obsolete
+ diagnostics.add(createDiagnostic(Diagnostic.ERROR, element,
+ format(Messages.PropertiesContextCustomValidator_4, context, element),
+ problem(OBSOLETE_DATA_CONTEXT_ELEMENT)));
+ markObsolete(element, context);
+ } else {
+ String sourceName = cache.getName(sourceClass);
+ if (!Objects.equals(sourceName, element.getName())) {
+ diagnostics.add(createDiagnostic(Diagnostic.ERROR, element, ContextsPackage.Literals.DATA_CONTEXT_ELEMENT__NAME,
+ format(Messages.PropertiesContextCustomValidator_10, context, element, sourceName, sourceClass),
+ problem(RENAMED_CLASS), valueToSet(sourceName, EcorePackage.Literals.ESTRING)));
+ }
+ checkForMissingProperties(element, sourceClass, diagnostics, context);
+ }
+ }
+
+ private void checkForMissingProperties(DataContextElement element, EObject sourceClass, DiagnosticChain diagnostics, Map<Object, Object> context) {
+ PropertiesCache cache = PropertiesCache.getInstance(element);
+ Set<? extends EObject> properties = new HashSet<>(cache.getProperties(sourceClass));
+
+ // There is no requirement to mirror redefining properties, as the general context should already
+ // have the property (recursively)
+ properties.removeIf(cache::isPropertyRedefinition);
+
+ element.getProperties().stream().map(cache::getSourceElement).forEach(properties::remove);
+
+ if (!properties.isEmpty()) {
+ // We have unmapped properties
+ properties.stream().map(sourceProp -> createDiagnostic(Diagnostic.WARNING, element,
+ format(Messages.PropertiesContextCustomValidator_5, context, element, sourceProp),
+ missingPropertyAttributes(element, sourceProp)))
+ .forEach(diagnostics::add);
+ }
+ }
+
+ private Collection<? extends IPluginChecker2.MarkerAttribute> missingPropertyAttributes(DataContextElement element, EObject sourceProperty) {
+ Collection<IPluginChecker2.MarkerAttribute> result = Lists.newArrayList(problem(MISSING_DATA_CONTEXT_PROPERTY),
+ objectToReference(sourceProperty));
+
+ addLayoutGenerator(result, element);
+ return result;
+ }
+
+ private void markObsolete(DataContextElement element, Map<Object, Object> context) {
+ if (context != null) {
+ @SuppressWarnings("unchecked")
+ Set<DataContextElement> obsolete = (Set<DataContextElement>) context.computeIfAbsent(OBSOLETE_DATA_CONTEXT_ELEMENTS, __ -> new HashSet<>());
+ obsolete.add(element);
+ }
+ }
+
+ private boolean isObsolete(DataContextElement element, Map<Object, Object> context) {
+ boolean result = false;
+
+ if (context != null) {
+ Set<?> obsolete = (Set<?>) context.get(OBSOLETE_DATA_CONTEXT_ELEMENTS);
+ result = obsolete != null && obsolete.contains(element);
+ }
+
+ return result;
+ }
+
+ public void validate(Property property, DiagnosticChain diagnostics, Map<Object, Object> context) {
+ // If the data context element containing the property is obsolete, then so are all of its
+ // properties, so we needn't worry about this
+ if (isObsolete(property.getContextElement(), context)) {
+ return;
+ }
+ if (isInCustomDataContextRoot(property, context)) {
+ // We cannot validate custom data contexts that we do not understand
+ return;
+ }
+
+ PropertiesCache cache = PropertiesCache.getInstance(property);
+ EObject sourceProperty = cache.getSourceElement(property);
+ if (sourceProperty == null) {
+ // No traceability? Warn on the assumption that the property is obsolete
+ diagnostics.add(createDiagnostic(Diagnostic.WARNING, property,
+ format(Messages.PropertiesContextCustomValidator_6, context, property),
+ problem(OBSOLETE_DATA_CONTEXT_PROPERTY)));
+ } else if (sourceProperty.eIsProxy()) {
+ // Source element was deleted/moved? This property is now obsolete
+ diagnostics.add(createDiagnostic(Diagnostic.ERROR, property,
+ format(Messages.PropertiesContextCustomValidator_7, context, property),
+ problem(OBSOLETE_DATA_CONTEXT_PROPERTY)));
+ } else {
+ String sourceName = cache.getName(sourceProperty);
+ if (!Objects.equals(sourceName, property.getName())) {
+ diagnostics.add(createDiagnostic(Diagnostic.ERROR, property, ContextsPackage.Literals.PROPERTY__NAME,
+ format(Messages.PropertiesContextCustomValidator_11, context, property, sourceName, sourceProperty),
+ problem(RENAMED_PROPERTY), valueToSet(sourceName, EcorePackage.Literals.ESTRING)));
+ }
+ if (property.getType() != null) { // If it's missing, that's a different problem
+ validatePropertyType(property, sourceProperty, diagnostics, context);
+ }
+ validatePropertyMultiplicity(property, sourceProperty, diagnostics, context);
+ }
+ }
+
+ /**
+ * Check the {@code property} {@link Property#getType() type} for consistency with the nature of the
+ * source property to which it traces.
+ *
+ * @param property
+ * a data-context property
+ * @param sourceProperty
+ * the property to which it traces in the source model
+ * @param diagnostics
+ * record of problems
+ * @param context
+ * validation context
+ */
+ private void validatePropertyType(Property property, EObject sourceProperty, DiagnosticChain diagnostics, Map<Object, Object> context) {
+ Type expectedType = PropertyTypeHelper.getInstance(property).getPropertyType(sourceProperty);
+ if (expectedType != property.getType()) {
+ diagnostics.add(createDiagnostic(Diagnostic.WARNING, property, ContextsPackage.Literals.PROPERTY__TYPE,
+ format(Messages.PropertiesContextCustomValidator_8, context, property,
+ value(ContextsPackage.Literals.PROPERTY__TYPE, expectedType), sourceProperty),
+ problem(INCONSISTENT_DATA_CONTEXT_PROPERTY_TYPE),
+ valueToSet(expectedType, EnvironmentPackage.Literals.TYPE)));
+ }
+ }
+
+ public void validate(Section section, DiagnosticChain diagnostics, Map<Object, Object> context) {
+ Widget widget = section.getWidget();
+
+ if (widget != null && !widget.eIsProxy()) {
+ // This is not a cross-resource containment reference, so add the containing resource to the
+ // current validation scope
+ validateResource(widget.eResource(), context);
+ }
+ }
+
+ private void validatePropertyMultiplicity(Property property, EObject sourceProperty, DiagnosticChain diagnostics, Map<Object, Object> context) {
+ int expectedMultiplicity = PropertyTypeHelper.getInstance(property).getMultiplicity(sourceProperty);
+ if (expectedMultiplicity != property.getMultiplicity()) {
+ diagnostics.add(createDiagnostic(Diagnostic.WARNING, property, ContextsPackage.Literals.PROPERTY__MULTIPLICITY,
+ format(Messages.PropertiesContextCustomValidator_14, context, property,
+ value(ContextsPackage.Literals.PROPERTY__MULTIPLICITY, expectedMultiplicity), sourceProperty),
+ problem(INCONSISTENT_DATA_CONTEXT_PROPERTY_MULTIPLICITY),
+ valueToSet(expectedMultiplicity, EcorePackage.Literals.EINT)));
+ }
+ }
+
+}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesContextPluginChecker.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesContextPluginChecker.java
new file mode 100644
index 00000000000..93b936f2f48
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesContextPluginChecker.java
@@ -0,0 +1,159 @@
+/*****************************************************************************
+ * Copyright (c) 2019, 2021 CEA LIST, Christian W. Damus, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ * Christian W. Damus - bugs 570097, 571125, 573986
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.properties.internal.checkers;
+
+
+import static org.eclipse.papyrus.infra.properties.contexts.ContextsPackage.Literals.TAB__IMAGE;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.CONTEXTS_EXTENSION_POINT_IDENTIFIER;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.PROPERTIES_PLUGIN_VALIDATION_MARKER_TYPE;
+
+import java.util.Collection;
+import java.util.Set;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.papyrus.infra.constraints.ConstraintsPackage;
+import org.eclipse.papyrus.infra.properties.contexts.Context;
+import org.eclipse.papyrus.infra.properties.contexts.ContextsPackage;
+import org.eclipse.papyrus.infra.properties.ui.UiPackage;
+import org.eclipse.papyrus.toolsmiths.validation.common.checkers.BuildPropertiesChecker;
+import org.eclipse.papyrus.toolsmiths.validation.common.checkers.CustomModelChecker;
+import org.eclipse.papyrus.toolsmiths.validation.common.checkers.ExtensionsChecker;
+import org.eclipse.papyrus.toolsmiths.validation.common.checkers.IPluginChecker2;
+import org.eclipse.papyrus.toolsmiths.validation.common.checkers.ModelDependenciesChecker;
+import org.eclipse.papyrus.toolsmiths.validation.common.checkers.ModelValidationChecker;
+import org.eclipse.papyrus.toolsmiths.validation.common.checkers.OpaqueResourceProvider;
+import org.eclipse.papyrus.toolsmiths.validation.common.checkers.OpaqueResourceProvider.ResourceKind;
+import org.eclipse.papyrus.toolsmiths.validation.common.internal.utils.PluginErrorReporter;
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.util.PropertiesContextDecoratorAdapterFactory;
+
+/**
+ * This allows to check <em>Properties Context</em> models in a tooling plug-in (extensions, builds, dependencies, ...).
+ */
+public class PropertiesContextPluginChecker {
+
+ public static final String CONTEXT_EXTENSION = "ctx";//$NON-NLS-1$
+ public static final String CONTENT_TYPE = ContextsPackage.eCONTENT_TYPE;
+
+ private static final Set<String> ADDITIONAL_REQUIREMENTS = Set.of(
+ "org.eclipse.papyrus.infra.properties" //$NON-NLS-1$
+ );
+
+ /**
+ * Obtain a model validation checker factory.
+ *
+ * @return the model validation checker factory
+ */
+ public static IPluginChecker2.Factory modelValidationCheckerFactory() {
+ return IPluginChecker2.Factory.forEMFResource(PropertiesContextPluginChecker::createModelValidationChecker);
+ }
+
+ private static ModelValidationChecker createModelValidationChecker(IProject project, IFile modelFile, Resource resource) {
+ return new ModelValidationChecker(modelFile, resource, PROPERTIES_PLUGIN_VALIDATION_MARKER_TYPE);
+ }
+
+ /**
+ * Obtain a build properties checker factory.
+ *
+ * @return the build properties checker factory
+ */
+ public static IPluginChecker2.Factory buildPropertiesCheckerFactory() {
+ return IPluginChecker2.Factory.forEMFResource(PropertiesContextPluginChecker::createBuildPropertiesChecker);
+ }
+
+ private static BuildPropertiesChecker createBuildPropertiesChecker(IProject project, IFile modelFile, Resource resource) {
+ return new BuildPropertiesChecker(project, modelFile, resource, PROPERTIES_PLUGIN_VALIDATION_MARKER_TYPE)
+ .withReferencedResources(createIconProvider());
+ }
+
+ /**
+ * Obtain a dependencies checker factory for the specified bundle dependencies validation.
+ *
+ * @return the dependencies checker factory
+ */
+ public static IPluginChecker2.Factory modelDependenciesCheckerFactory() {
+ // When checking the project, we have some additional requirements that aren't model-specific
+ return IPluginChecker2.Factory.forProject(PropertiesContextPluginChecker::createModelDependenciesChecker)
+ .or(IPluginChecker2.Factory.forEMFResource(PropertiesContextPluginChecker::createModelDependenciesChecker));
+ }
+
+ private static ModelDependenciesChecker createModelDependenciesChecker(IProject project) {
+ // When checking the project, we have some additional requirements that aren't model-specific
+ return new ModelDependenciesChecker(project, null, null, PROPERTIES_PLUGIN_VALIDATION_MARKER_TYPE)
+ .addRequirements(ADDITIONAL_REQUIREMENTS)
+ .withSeverityFunction(bundle -> ADDITIONAL_REQUIREMENTS.contains(bundle) ? Diagnostic.WARNING : Diagnostic.ERROR);
+ }
+
+ private static ModelDependenciesChecker createModelDependenciesChecker(IProject project, IFile modelFile, Resource resource) {
+ return new ModelDependenciesChecker(project, modelFile, resource, PROPERTIES_PLUGIN_VALIDATION_MARKER_TYPE)
+ .withReferencedResources(createOpaqueResourceProvider(project));
+ }
+
+ // Icon resources
+ private static OpaqueResourceProvider.EMF createIconProvider() {
+ return OpaqueResourceProvider.EMF.create(ResourceKind.ICON, ContextsPackage.eNS_URI, TAB__IMAGE);
+ }
+
+ private static OpaqueResourceProvider.EMF createOpaqueResourceProvider(IProject project) {
+ // Icon resources
+ return createIconProvider();
+ }
+
+ /**
+ * Obtain a <tt>plugin.xml</tt> extensions checker factory.
+ *
+ * @return the extensions checker factory
+ */
+ public static IPluginChecker2.Factory extensionsCheckerFactory() {
+ return IPluginChecker2.Factory.forEMFResource(PropertiesContextPluginChecker::createExtensionsChecker);
+ }
+
+ private static ExtensionsChecker<Context, PluginErrorReporter<Context>> createExtensionsChecker(
+ IProject project, IFile modelFile, Resource resource) {
+
+ Collection<Context> contexts = EcoreUtil.getObjectsByType(resource.getContents(), ContextsPackage.Literals.CONTEXT);
+ return new ExtensionsChecker<>(project, modelFile, contexts, PROPERTIES_PLUGIN_VALIDATION_MARKER_TYPE, PropertiesContextPluginChecker::createPluginErrorReporter);
+ }
+
+ private static PluginErrorReporter<Context> createPluginErrorReporter(IFile pluginXML, IFile modelFile, Context model) {
+ PropertiesContextPluginXMLValidator validator = new PropertiesContextPluginXMLValidator(modelFile);
+
+ return new PluginErrorReporter<>(pluginXML, modelFile, model, PROPERTIES_PLUGIN_VALIDATION_MARKER_TYPE, context -> context.getName())
+ .requireExtensionPoint(CONTEXTS_EXTENSION_POINT_IDENTIFIER, validator::matchExtension, null, validator::problemID);
+ }
+
+ /**
+ * Obtain a checker factory for custom model validation rules.
+ *
+ * @return the custom model checker factory
+ */
+ public static IPluginChecker2.Factory customModelCheckerFactory() {
+ return IPluginChecker2.Factory.forEMFResource(PropertiesContextPluginChecker::createCustomModelChecker);
+ }
+
+ private static CustomModelChecker createCustomModelChecker(IProject project, IFile modelFile, Resource resource) {
+ return new CustomModelChecker(modelFile, resource, PROPERTIES_PLUGIN_VALIDATION_MARKER_TYPE)
+ .withAdapterFactoryDecorator(PropertiesContextDecoratorAdapterFactory::new)
+ .withValidator(ContextsPackage.eNS_URI, PropertiesContextCustomValidator::new)
+ .withValidator(UiPackage.eNS_URI, PropertiesUICustomValidator::new)
+ .withValidator(ConstraintsPackage.eNS_URI, ConstraintsCustomValidator::new);
+ }
+
+}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesContextPluginXMLValidator.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesContextPluginXMLValidator.java
new file mode 100644
index 00000000000..4536213d842
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesContextPluginXMLValidator.java
@@ -0,0 +1,84 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.properties.internal.checkers;
+
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.A_CONTEXT_MODEL;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.CONTEXTS_EXTENSION_POINT_IDENTIFIER;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.E_CONTEXT;
+
+import java.util.Objects;
+import java.util.Optional;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.papyrus.infra.properties.contexts.Context;
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+/**
+ * Validation of the <tt>plugin.xml</tt> for properties context model extensions.
+ */
+final class PropertiesContextPluginXMLValidator {
+
+ static final String CATEGORY = "properties-context"; //$NON-NLS-1$
+
+ private final IFile modelFile;
+
+ /**
+ * Initializes me with the model file that I validate.
+ *
+ * @param modelFile
+ * the model file
+ */
+ PropertiesContextPluginXMLValidator(IFile modelFile) {
+ super();
+
+ this.modelFile = modelFile;
+ }
+
+ Optional<Element> matchExtension(Element element, String point, Context contextModel) {
+ switch (point) {
+ case CONTEXTS_EXTENSION_POINT_IDENTIFIER:
+ NodeList children = element.getElementsByTagName(E_CONTEXT);
+ for (int i = 0; i < children.getLength(); i++) {
+ Element model = (Element) children.item(i);
+ if (matchContext(model, contextModel)) {
+ return Optional.of(model);
+ }
+ }
+ break;
+ default:
+ break;
+ }
+
+ return Optional.empty();
+ }
+
+ boolean matchContext(Element element, Context model) {
+ String path = element.getAttribute(A_CONTEXT_MODEL);
+ return Objects.equals(path, modelFile.getProjectRelativePath().toString());
+ }
+
+ int problemID(String point, Context model) {
+ switch (point) {
+ case CONTEXTS_EXTENSION_POINT_IDENTIFIER:
+ return PropertiesPluginValidationConstants.MISSING_CONTEXT_MODEL_EXTENSION_ID;
+ default:
+ return -1;
+ }
+ }
+
+}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesEnvironmentBuilderProvider.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesEnvironmentBuilderProvider.java
new file mode 100644
index 00000000000..a0993ac8136
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesEnvironmentBuilderProvider.java
@@ -0,0 +1,86 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.properties.internal.checkers;
+
+import static org.eclipse.papyrus.toolsmiths.validation.common.utils.ModelResourceMapper.byContentType;
+import static org.eclipse.papyrus.toolsmiths.validation.common.utils.ModelResourceMapper.byExtension;
+import static org.eclipse.papyrus.toolsmiths.validation.common.utils.ModelResourceMapper.resourceSets;
+import static org.eclipse.papyrus.toolsmiths.validation.common.utils.ModelResourceMapper.rootsOfType;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.checkers.PropertiesEnvironmentPluginChecker.CONTENT_TYPE;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.checkers.PropertiesEnvironmentPluginChecker.ENVIRONMENT_EXTENSION;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.checkers.PropertiesEnvironmentPluginChecker.XMI_EXTENSION;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.PROPERTIES_PLUGIN_VALIDATION_MARKER_TYPE;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.papyrus.infra.emf.utils.ResourceUtils;
+import org.eclipse.papyrus.infra.properties.environment.Environment;
+import org.eclipse.papyrus.toolsmiths.plugin.builder.AbstractPapyrusBuilder;
+import org.eclipse.papyrus.toolsmiths.plugin.builder.IPapyrusBuilderProvider;
+import org.eclipse.papyrus.toolsmiths.plugin.builder.PapyrusBuilderKind;
+import org.eclipse.papyrus.toolsmiths.plugin.builder.PluginCheckerBuilder;
+import org.eclipse.papyrus.toolsmiths.validation.common.utils.ModelResourceMapper;
+import org.osgi.service.component.annotations.Component;
+
+import com.google.common.collect.ListMultimap;
+
+/**
+ * Builder provider for <em>Properties Environment</em> models.
+ */
+@Component
+public class PropertiesEnvironmentBuilderProvider implements IPapyrusBuilderProvider {
+
+ @Override
+ public String getProblemMarkerType(PapyrusBuilderKind builderKind) {
+ return PROPERTIES_PLUGIN_VALIDATION_MARKER_TYPE;
+ }
+
+ @Override
+ public boolean providesBuilder(PapyrusBuilderKind builderKind, URI resourceURI) {
+ return ENVIRONMENT_EXTENSION.equals(resourceURI.fileExtension())
+ || (XMI_EXTENSION.equals(resourceURI.fileExtension()) && hasContentType(resourceURI, CONTENT_TYPE));
+ }
+
+ @Override
+ public AbstractPapyrusBuilder getBuilder(PapyrusBuilderKind builderKind, IProject project) {
+ PluginCheckerBuilder result = new PluginCheckerBuilder(PROPERTIES_PLUGIN_VALIDATION_MARKER_TYPE, this::mapEnvironmentResources);
+
+ switch (builderKind) {
+ case MODEL_RESOURCE:
+ result = result.withChecker(PropertiesEnvironmentPluginChecker.modelValidationCheckerFactory())
+ .withChecker(PropertiesEnvironmentPluginChecker.customModelCheckerFactory());
+ break;
+ case BUNDLE_MANIFEST:
+ result = result.withChecker(PropertiesEnvironmentPluginChecker.buildPropertiesCheckerFactory())
+ .withChecker(PropertiesEnvironmentPluginChecker.modelDependenciesCheckerFactory());
+ break;
+ case PLUGIN_MANIFEST:
+ result = result.withChecker(PropertiesEnvironmentPluginChecker.extensionsCheckerFactory());
+ break;
+ }
+
+ return result;
+ }
+
+ private ListMultimap<IFile, Environment> mapEnvironmentResources(IProject project) {
+ ModelResourceMapper<Environment> mapper = new ModelResourceMapper<>(project);
+ return mapper.map(byExtension(ENVIRONMENT_EXTENSION).or(byExtension(XMI_EXTENSION).and(byContentType(CONTENT_TYPE))),
+ resourceSets(ResourceUtils.createWorkspaceAwarePackageRegistry()),
+ rootsOfType(Environment.class));
+ }
+
+}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesEnvironmentCustomValidator.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesEnvironmentCustomValidator.java
new file mode 100644
index 00000000000..a22ec99e472
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesEnvironmentCustomValidator.java
@@ -0,0 +1,29 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.properties.internal.checkers;
+
+import org.eclipse.papyrus.toolsmiths.validation.common.checkers.CustomModelChecker;
+
+/**
+ * Custom validation rules for <em>Properties Environment</em> models.
+ */
+public class PropertiesEnvironmentCustomValidator extends CustomModelChecker.SwitchValidator {
+
+ public PropertiesEnvironmentCustomValidator(String nsURI) {
+ super(nsURI);
+ }
+
+}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesEnvironmentPluginChecker.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesEnvironmentPluginChecker.java
new file mode 100644
index 00000000000..13b66b22ae1
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesEnvironmentPluginChecker.java
@@ -0,0 +1,176 @@
+/*****************************************************************************
+ * Copyright (c) 2019, 2021 CEA LIST, Christian W. Damus, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ * Christian W. Damus - bugs 570097, 571125, 573986
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.properties.internal.checkers;
+
+
+import static org.eclipse.papyrus.infra.properties.environment.EnvironmentPackage.Literals.MISC_CLASS__CLASS;
+import static org.eclipse.papyrus.infra.properties.environment.EnvironmentPackage.Literals.MODEL_ELEMENT_FACTORY_DESCRIPTOR__FACTORY_CLASS;
+import static org.eclipse.papyrus.infra.properties.environment.EnvironmentPackage.Literals.WIDGET_TYPE__WIDGET_CLASS;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.ENVIRONMENTS_EXTENSION_POINT_IDENTIFIER;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.PROPERTIES_PLUGIN_VALIDATION_MARKER_TYPE;
+
+import java.util.Collection;
+import java.util.Set;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.papyrus.infra.properties.environment.Environment;
+import org.eclipse.papyrus.infra.properties.environment.EnvironmentPackage;
+import org.eclipse.papyrus.infra.properties.environment.Namespace;
+import org.eclipse.papyrus.infra.properties.environment.WidgetType;
+import org.eclipse.papyrus.toolsmiths.validation.common.checkers.BuildPropertiesChecker;
+import org.eclipse.papyrus.toolsmiths.validation.common.checkers.CustomModelChecker;
+import org.eclipse.papyrus.toolsmiths.validation.common.checkers.ExtensionsChecker;
+import org.eclipse.papyrus.toolsmiths.validation.common.checkers.IPluginChecker2;
+import org.eclipse.papyrus.toolsmiths.validation.common.checkers.JavaClassDependencies;
+import org.eclipse.papyrus.toolsmiths.validation.common.checkers.ModelDependenciesChecker;
+import org.eclipse.papyrus.toolsmiths.validation.common.checkers.ModelValidationChecker;
+import org.eclipse.papyrus.toolsmiths.validation.common.checkers.OpaqueResourceProvider;
+import org.eclipse.papyrus.toolsmiths.validation.common.checkers.OpaqueResourceProvider.ResourceKind;
+import org.eclipse.papyrus.toolsmiths.validation.common.internal.utils.PluginErrorReporter;
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.messages.Messages;
+
+/**
+ * This allows to check <em>Properties Environment</em> models in a tooling plug-in (extensions, builds, dependencies, ...).
+ */
+public class PropertiesEnvironmentPluginChecker {
+
+ public static final String XMI_EXTENSION = "xmi";//$NON-NLS-1$
+ public static final String ENVIRONMENT_EXTENSION = "environment";//$NON-NLS-1$
+ public static final String CONTENT_TYPE = EnvironmentPackage.eCONTENT_TYPE;
+
+ private static final Set<String> ADDITIONAL_REQUIREMENTS = Set.of(
+ "org.eclipse.papyrus.infra.properties" //$NON-NLS-1$
+ );
+
+ /**
+ * Obtain a model validation checker factory.
+ *
+ * @return the model validation checker factory
+ */
+ public static IPluginChecker2.Factory modelValidationCheckerFactory() {
+ return IPluginChecker2.Factory.forEMFResource(PropertiesEnvironmentPluginChecker::createModelValidationChecker);
+ }
+
+ private static ModelValidationChecker createModelValidationChecker(IProject project, IFile modelFile, Resource resource) {
+ return new ModelValidationChecker(modelFile, resource, PROPERTIES_PLUGIN_VALIDATION_MARKER_TYPE);
+ }
+
+ /**
+ * Obtain a build properties checker factory.
+ *
+ * @return the build properties checker factory
+ */
+ public static IPluginChecker2.Factory buildPropertiesCheckerFactory() {
+ return IPluginChecker2.Factory.forEMFResource(PropertiesEnvironmentPluginChecker::createBuildPropertiesChecker);
+ }
+
+ private static BuildPropertiesChecker createBuildPropertiesChecker(IProject project, IFile modelFile, Resource resource) {
+ return new BuildPropertiesChecker(project, modelFile, resource, PROPERTIES_PLUGIN_VALIDATION_MARKER_TYPE);
+ }
+
+ /**
+ * Obtain a dependencies checker factory for the specified bundle dependencies validation.
+ *
+ * @return the dependencies checker factory
+ */
+ public static IPluginChecker2.Factory modelDependenciesCheckerFactory() {
+ // When checking the project, we have some additional requirements that aren't model-specific
+ return IPluginChecker2.Factory.forProject(PropertiesEnvironmentPluginChecker::createModelDependenciesChecker)
+ .or(IPluginChecker2.Factory.forEMFResource(PropertiesEnvironmentPluginChecker::createModelDependenciesChecker));
+ }
+
+ private static ModelDependenciesChecker createModelDependenciesChecker(IProject project) {
+ // When checking the project, we have some additional requirements that aren't model-specific
+ return new ModelDependenciesChecker(project, null, null, PROPERTIES_PLUGIN_VALIDATION_MARKER_TYPE)
+ .addRequirements(ADDITIONAL_REQUIREMENTS)
+ .withSeverityFunction(bundle -> ADDITIONAL_REQUIREMENTS.contains(bundle) ? Diagnostic.WARNING : Diagnostic.ERROR);
+ }
+
+ private static ModelDependenciesChecker createModelDependenciesChecker(IProject project, IFile modelFile, Resource resource) {
+ return new ModelDependenciesChecker(project, modelFile, resource, PROPERTIES_PLUGIN_VALIDATION_MARKER_TYPE)
+ .withReferencedResources(createOpaqueResourceProvider(project));
+ }
+
+ private static OpaqueResourceProvider.EMF createOpaqueResourceProvider(IProject project) {
+ JavaClassDependencies dependencies = new JavaClassDependencies(project);
+
+ // Java classes
+ return OpaqueResourceProvider.EMF.<String> create(ResourceKind.CLASS, EnvironmentPackage.eNS_URI, WIDGET_TYPE__WIDGET_CLASS, (owner, attribute, className) -> getClassURI(owner, attribute, className, dependencies))
+ .and(OpaqueResourceProvider.EMF.create(ResourceKind.CLASS, EnvironmentPackage.eNS_URI, MODEL_ELEMENT_FACTORY_DESCRIPTOR__FACTORY_CLASS, dependencies::getClassURI))
+ .and(OpaqueResourceProvider.EMF.create(ResourceKind.CLASS, EnvironmentPackage.eNS_URI, MISC_CLASS__CLASS, dependencies::getClassURI));
+ }
+
+ private static URI getClassURI(EObject owner, EAttribute attribute, String className, JavaClassDependencies dependencies) {
+ String qualifiedName = className; // The common case
+
+ if (owner instanceof WidgetType) {
+ // These separate the class's package namespace from the simple name
+ WidgetType type = (WidgetType) owner;
+ Namespace namespace = type.getNamespace();
+ if (namespace != null) {
+ qualifiedName = namespace.getValue() + "." + className; //$NON-NLS-1$
+ }
+ }
+
+ return dependencies.getClassURI(owner, attribute, qualifiedName);
+ }
+
+ /**
+ * Obtain a <tt>plugin.xml</tt> extensions checker factory.
+ *
+ * @return the extensions checker factory
+ */
+ public static IPluginChecker2.Factory extensionsCheckerFactory() {
+ return IPluginChecker2.Factory.forEMFResource(PropertiesEnvironmentPluginChecker::createExtensionsChecker);
+ }
+
+ private static ExtensionsChecker<Environment, PluginErrorReporter<Environment>> createExtensionsChecker(
+ IProject project, IFile modelFile, Resource resource) {
+
+ Collection<Environment> environments = EcoreUtil.getObjectsByType(resource.getContents(), EnvironmentPackage.Literals.ENVIRONMENT);
+ return new ExtensionsChecker<>(project, modelFile, environments, PROPERTIES_PLUGIN_VALIDATION_MARKER_TYPE, PropertiesEnvironmentPluginChecker::createPluginErrorReporter);
+ }
+
+ private static PluginErrorReporter<Environment> createPluginErrorReporter(IFile pluginXML, IFile modelFile, Environment model) {
+ PropertiesEnvironmentPluginXMLValidator validator = new PropertiesEnvironmentPluginXMLValidator(modelFile);
+
+ return new PluginErrorReporter<>(pluginXML, modelFile, model, PROPERTIES_PLUGIN_VALIDATION_MARKER_TYPE, __ -> Messages.PropertiesEnvironmentPluginChecker_0)
+ .requireExtensionPoint(ENVIRONMENTS_EXTENSION_POINT_IDENTIFIER, validator::matchExtension, null, validator::problemID);
+ }
+
+ /**
+ * Obtain a checker factory for custom model validation rules.
+ *
+ * @return the custom model checker factory
+ */
+ public static IPluginChecker2.Factory customModelCheckerFactory() {
+ return IPluginChecker2.Factory.forEMFResource(PropertiesEnvironmentPluginChecker::createCustomModelChecker);
+ }
+
+ private static CustomModelChecker createCustomModelChecker(IProject project, IFile modelFile, Resource resource) {
+ return new CustomModelChecker(modelFile, resource, PROPERTIES_PLUGIN_VALIDATION_MARKER_TYPE)
+ .withValidator(EnvironmentPackage.eNS_URI, PropertiesEnvironmentCustomValidator::new);
+ }
+
+}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesEnvironmentPluginXMLValidator.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesEnvironmentPluginXMLValidator.java
new file mode 100644
index 00000000000..cf3e87c2c94
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesEnvironmentPluginXMLValidator.java
@@ -0,0 +1,84 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.properties.internal.checkers;
+
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.A_ENVIRONMENT_MODEL;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.ENVIRONMENTS_EXTENSION_POINT_IDENTIFIER;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.E_ENVIRONMENT;
+
+import java.util.Objects;
+import java.util.Optional;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.papyrus.infra.properties.environment.Environment;
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+/**
+ * Validation of the <tt>plugin.xml</tt> for properties environment model extensions.
+ */
+final class PropertiesEnvironmentPluginXMLValidator {
+
+ static final String CATEGORY = "properties-environment"; //$NON-NLS-1$
+
+ private final IFile modelFile;
+
+ /**
+ * Initializes me with the model file that I validate.
+ *
+ * @param modelFile
+ * the model file
+ */
+ PropertiesEnvironmentPluginXMLValidator(IFile modelFile) {
+ super();
+
+ this.modelFile = modelFile;
+ }
+
+ Optional<Element> matchExtension(Element element, String point, Environment environmentModel) {
+ switch (point) {
+ case ENVIRONMENTS_EXTENSION_POINT_IDENTIFIER:
+ NodeList children = element.getElementsByTagName(E_ENVIRONMENT);
+ for (int i = 0; i < children.getLength(); i++) {
+ Element model = (Element) children.item(i);
+ if (matchContext(model, environmentModel)) {
+ return Optional.of(model);
+ }
+ }
+ break;
+ default:
+ break;
+ }
+
+ return Optional.empty();
+ }
+
+ boolean matchContext(Element element, Environment model) {
+ String path = element.getAttribute(A_ENVIRONMENT_MODEL);
+ return Objects.equals(path, modelFile.getProjectRelativePath().toString());
+ }
+
+ int problemID(String point, Environment model) {
+ switch (point) {
+ case ENVIRONMENTS_EXTENSION_POINT_IDENTIFIER:
+ return PropertiesPluginValidationConstants.MISSING_ENVIRONMENT_MODEL_EXTENSION_ID;
+ default:
+ return -1;
+ }
+ }
+
+}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesUICustomValidator.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesUICustomValidator.java
new file mode 100644
index 00000000000..a0aa338be4d
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/checkers/PropertiesUICustomValidator.java
@@ -0,0 +1,79 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.properties.internal.checkers;
+
+import static org.eclipse.papyrus.toolsmiths.validation.common.checkers.IPluginChecker2.problem;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.INCONSISTENT_WIDGET_TYPE;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.objectToReference;
+
+import java.util.Map;
+
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.emf.common.util.DiagnosticChain;
+import org.eclipse.papyrus.infra.properties.contexts.ContextsPackage;
+import org.eclipse.papyrus.infra.properties.contexts.Property;
+import org.eclipse.papyrus.infra.properties.environment.PropertyEditorType;
+import org.eclipse.papyrus.infra.properties.environment.WidgetType;
+import org.eclipse.papyrus.infra.properties.ui.PropertyEditor;
+import org.eclipse.papyrus.infra.properties.ui.UiPackage;
+import org.eclipse.papyrus.toolsmiths.validation.common.checkers.CustomModelChecker;
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.messages.Messages;
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.util.WidgetTypeHelper;
+
+/**
+ * Custom validation rules for <em>Properties UI</em> models.
+ */
+public class PropertiesUICustomValidator extends CustomModelChecker.SwitchValidator {
+
+ public PropertiesUICustomValidator(String nsURI) {
+ super(nsURI);
+ }
+
+ public void validate(PropertyEditor propertyEditor, DiagnosticChain diagnostics, Map<Object, Object> context) {
+ WidgetType widgetType = propertyEditor.getWidgetType();
+ Property property = propertyEditor.getProperty();
+
+ if (widgetType instanceof PropertyEditorType && !widgetType.eIsProxy() && property != null && !property.eIsProxy()) {
+ // If null is a problem, it's a different problem to this
+ WidgetTypeHelper helper = WidgetTypeHelper.getInstance(propertyEditor);
+ PropertyEditorType editorType = (PropertyEditorType) widgetType;
+ WidgetType defaultWidgetType = helper.getDefaultWidgetType(property);
+ if (helper.isCoreWidgetType(widgetType) && defaultWidgetType instanceof PropertyEditorType) {
+ PropertyEditorType defaultEditorType = (PropertyEditorType) defaultWidgetType;
+
+ // Warn if a non-custom widget type seems to disagree with the property type
+ String message = getInconsistentTypeMessage(property, propertyEditor, editorType, defaultEditorType, context);
+ if (message != null) {
+ diagnostics.add(createDiagnostic(Diagnostic.WARNING, propertyEditor, UiPackage.Literals.PROPERTY_EDITOR__WIDGET_TYPE,
+ message, problem(INCONSISTENT_WIDGET_TYPE), objectToReference(defaultWidgetType)));
+ }
+ }
+ }
+ }
+
+ private String getInconsistentTypeMessage(Property property, PropertyEditor editor, PropertyEditorType actualEditorType, PropertyEditorType defaultEditorType, Map<Object, Object> context) {
+ if (actualEditorType.getType() != defaultEditorType.getType()) {
+ return format(Messages.PropertiesUICustomValidator_0, context,
+ property, actualEditorType, value(ContextsPackage.Literals.PROPERTY__TYPE, property.getType()));
+ }
+ if (actualEditorType.getMultiplicity() != defaultEditorType.getMultiplicity()) {
+ return format(Messages.PropertiesUICustomValidator_1, context,
+ property, actualEditorType, value(ContextsPackage.Literals.PROPERTY__MULTIPLICITY, property.getMultiplicity()));
+ }
+ return null;
+ }
+
+}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/constants/PropertiesPluginValidationConstants.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/constants/PropertiesPluginValidationConstants.java
new file mode 100644
index 00000000000..b320ec2e105
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/constants/PropertiesPluginValidationConstants.java
@@ -0,0 +1,164 @@
+/*****************************************************************************
+ * Copyright (c) 2019, 2021 CEA LIST, Christian W. Damus, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Nicolas FAUVERGUE (CEA LIST) nicolas.fauvergue@cea.fr - Initial API and implementation
+ * Christian W. Damus - bugs 570097, 573788, 573986
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants;
+
+import java.util.Optional;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.emf.ecore.EDataType;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.papyrus.toolsmiths.validation.common.checkers.CommonProblemConstants;
+import org.eclipse.papyrus.toolsmiths.validation.common.checkers.IPluginChecker2;
+import org.eclipse.papyrus.toolsmiths.validation.common.quickfix.CommonMarkerResolutionUtils;
+
+/**
+ * The <em>Properties Context</em> plug-in validation constants.
+ */
+public class PropertiesPluginValidationConstants {
+
+ /**
+ * Marker type for the validation of properties plug-ins.
+ */
+ public static final String PROPERTIES_PLUGIN_VALIDATION_MARKER_TYPE = "org.eclipse.papyrus.toolsmiths.validation.properties.diagnostic"; //$NON-NLS-1$
+
+ /**
+ * The extension point identifier for <em>Properties Context</em> model resources.
+ */
+ public static final String CONTEXTS_EXTENSION_POINT_IDENTIFIER = "org.eclipse.papyrus.infra.properties.contexts"; //$NON-NLS-1$
+
+ /** The environment models extension point element name. */
+ public static final String E_CONTEXT = "context"; //$NON-NLS-1$
+ public static final String A_CONTEXT_MODEL = "contextModel"; //$NON-NLS-1$
+
+ /**
+ * The extension point identifier for <em>Properties Environment</em> model resources.
+ */
+ public static final String ENVIRONMENTS_EXTENSION_POINT_IDENTIFIER = "org.eclipse.papyrus.infra.properties.environments"; //$NON-NLS-1$
+
+ /** The environment models extension point element name. */
+ public static final String E_ENVIRONMENT = "environment"; //$NON-NLS-1$
+ public static final String A_ENVIRONMENT_MODEL = "environmentModel"; //$NON-NLS-1$
+
+ /** The architecture models extension point attribute name for the resource path. */
+ public static final String ATTR_PATH = "path"; //$NON-NLS-1$
+
+ /**
+ * Marker attribute indicating the URI of the object to set in a reference to fix the problem of
+ * an inconsistent property type, widget type, or other issue of the same "wrong object referenced" kind.
+ */
+ public static final String MARKER_ATTR_REF = "object_to_reference"; //$NON-NLS-1$
+
+ /**
+ * Marker attribute indicating value to set in an attribute to fix the problem of
+ * an inconsistent property type, widget type, or other issue of the same "wrong object referenced" kind.
+ */
+ public static final String MARKER_ATTR_VALUE = "value_to_set"; //$NON-NLS-1$
+
+ /**
+ * Marker attribute indicating which layout generator must be used to fix missing
+ * attributes or elements.
+ */
+ public static final String MARKER_ATTR_LAYOUT_GENERATOR = "layout_generator"; //$NON-NLS-1$
+
+ /** Problem IDs for the markers generated by properties plug-in validation. */
+ public static final int PROBLEM_ID_BASE = CommonProblemConstants.MAX_PROBLEM_ID + 0x01;
+ public static final int MISSING_CONTEXT_MODEL_EXTENSION_ID = PROBLEM_ID_BASE + 0x00;
+ public static final int MISSING_ENVIRONMENT_MODEL_EXTENSION_ID = PROBLEM_ID_BASE + 0x01;
+ public static final int OBSOLETE_DATA_CONTEXT_PACKAGE = PROBLEM_ID_BASE + 0x02;
+ public static final int MISSING_DATA_CONTEXT_ELEMENT = PROBLEM_ID_BASE + 0x03;
+ public static final int OBSOLETE_DATA_CONTEXT_ELEMENT = PROBLEM_ID_BASE + 0x04;
+ public static final int MISSING_DATA_CONTEXT_PROPERTY = PROBLEM_ID_BASE + 0x05;
+ public static final int OBSOLETE_DATA_CONTEXT_PROPERTY = PROBLEM_ID_BASE + 0x06;
+ public static final int INCONSISTENT_DATA_CONTEXT_PROPERTY_TYPE = PROBLEM_ID_BASE + 0x07;
+ public static final int INCONSISTENT_WIDGET_TYPE = PROBLEM_ID_BASE + 0x08;
+ public static final int RENAMED_PROPERTY = PROBLEM_ID_BASE + 0x09;
+ public static final int RENAMED_CLASS = PROBLEM_ID_BASE + 0x0a;
+ public static final int RENAMED_PACKAGE = PROBLEM_ID_BASE + 0x0b;
+ public static final int MISSING_DATA_CONTEXT_PACKAGE = PROBLEM_ID_BASE + 0x0c;
+ public static final int OBSOLETE_DATA_CONTEXT_ROOT = PROBLEM_ID_BASE + 0x0d;
+ public static final int UNRESOLVED_CONSTRAINT_CLASS = PROBLEM_ID_BASE + 0x0e;
+ public static final int UNRESOLVED_CONSTRAINT_CLASS_MULTIPLE_CHOICE = PROBLEM_ID_BASE + 0x0f;
+ public static final int INCONSISTENT_DATA_CONTEXT_PROPERTY_MULTIPLICITY = PROBLEM_ID_BASE + 0x10;
+ public static final int MAX_PROBLEM_ID = PROBLEM_ID_BASE + 0x3f;
+
+ /**
+ * Get the suggested object to set in the problematic reference.
+ *
+ * @param <T>
+ * the object type
+ * @param marker
+ * the marker describing the problem
+ * @param type
+ * the object type
+ * @param domain
+ * the contextual editing domain
+ * @return the object to set in the problematic reference of the object targeted by the marker
+ */
+ public static <T extends EObject> Optional<T> getObjectToReference(IMarker marker, Class<T> type, EditingDomain domain) {
+ return CommonMarkerResolutionUtils.getModelObject(marker, MARKER_ATTR_REF, type, domain);
+ }
+
+ /**
+ * Create a marker attribute to encode the reference to an object to set in the problematic model element.
+ *
+ * @param object
+ * an object to encode as a reference in a marker
+ * @return the marker attribute
+ */
+ public static IPluginChecker2.MarkerAttribute objectToReference(EObject object) {
+ return new IPluginChecker2.MarkerAttribute(MARKER_ATTR_REF, EcoreUtil.getURI(object));
+ }
+
+ /**
+ * Get the suggested value to set in the problematic attribute.
+ *
+ * @param <V>
+ * the value type
+ * @param marker
+ * the marker describing the problem
+ * @param type
+ * the value type
+ * @param dataType
+ * the EMF representation of the value type, used to restore non-primitive values
+ * @return the value to set in the problematic attribute of the object targeted by the marker
+ */
+ public static <V> Optional<V> getValueToSet(IMarker marker, Class<V> type, EDataType dataType) {
+ return CommonMarkerResolutionUtils.getValue(marker, MARKER_ATTR_VALUE, type, dataType);
+ }
+
+ /**
+ * Create a marker attribute to encode the value of an attribute to set in the problematic model element.
+ *
+ * @param value
+ * an attribute value to encode in a marker
+ * @param dataType
+ * the EMF representation of the value type, used to restore non-primitive values
+ * @return the marker attribute
+ */
+ public static IPluginChecker2.MarkerAttribute valueToSet(Object value, EDataType dataType) {
+ if (value instanceof Boolean) {
+ return new IPluginChecker2.MarkerAttribute(MARKER_ATTR_VALUE, (boolean) value);
+ } else if (value instanceof Integer) {
+ return new IPluginChecker2.MarkerAttribute(MARKER_ATTR_VALUE, (int) value);
+ } else {
+ return new IPluginChecker2.MarkerAttribute(MARKER_ATTR_VALUE, EcoreUtil.convertToString(dataType, value));
+ }
+ }
+
+}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/messages/Messages.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/messages/Messages.java
new file mode 100644
index 00000000000..e7d729a2166
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/messages/Messages.java
@@ -0,0 +1,92 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.properties.internal.messages;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * Externalized strings for the bundle.
+ */
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.papyrus.toolsmiths.validation.properties.internal.messages.messages"; //$NON-NLS-1$
+ public static String AbstractModelEditResolutionFactory_1;
+ public static String AbstractModelEditResolutionFactory_2;
+ public static String AbstractModelEditResolutionFactory_3;
+ public static String ConstraintsCustomValidator_0;
+ public static String ConstraintsCustomValidator_1;
+ public static String DataContextElementResolutionFactory_0;
+ public static String DataContextElementResolutionFactory_1;
+ public static String DataContextElementResolutionFactory_2;
+ public static String DataContextElementResolutionFactory_3;
+ public static String DataContextElementResolutionFactory_4;
+ public static String DataContextElementResolutionFactory_5;
+ public static String DataContextElementResolutionFactory_6;
+ public static String DataContextElementResolutionFactory_7;
+ public static String DataContextElementResolutionFactory_8;
+ public static String DataContextElementResolutionFactory_9;
+ public static String DataContextPropertyResolutionFactory_0;
+ public static String DataContextPropertyResolutionFactory_1;
+ public static String DataContextPropertyResolutionFactory_2;
+ public static String DataContextPropertyResolutionFactory_3;
+ public static String DataContextPropertyResolutionFactory_4;
+ public static String DataContextPropertyResolutionFactory_5;
+ public static String FindNewPackageLocation_0;
+ public static String FindNewPackageLocation_1;
+ public static String MissingPropertiesExtension_0;
+ public static String MissingPropertiesExtension_1;
+ public static String MissingPropertiesExtension_2;
+ public static String MissingPropertiesExtension_3;
+ public static String PropertiesContextCustomValidator_0;
+ public static String PropertiesContextCustomValidator_1;
+ public static String PropertiesContextCustomValidator_10;
+ public static String PropertiesContextCustomValidator_11;
+ public static String PropertiesContextCustomValidator_12;
+ public static String PropertiesContextCustomValidator_13;
+ public static String PropertiesContextCustomValidator_14;
+ public static String PropertiesContextCustomValidator_2;
+ public static String PropertiesContextCustomValidator_3;
+ public static String PropertiesContextCustomValidator_4;
+ public static String PropertiesContextCustomValidator_5;
+ public static String PropertiesContextCustomValidator_6;
+ public static String PropertiesContextCustomValidator_7;
+ public static String PropertiesContextCustomValidator_8;
+ public static String PropertiesContextCustomValidator_9;
+ public static String PropertiesContextDecoratorAdapterFactory_0;
+ public static String PropertiesEnvironmentPluginChecker_0;
+ public static String PropertiesMarkerResolutionGenerator_0;
+ public static String PropertiesMarkerResolutionGenerator_1;
+ public static String PropertiesMarkerResolutionGenerator_2;
+ public static String PropertiesMarkerResolutionGenerator_3;
+ public static String PropertiesMarkerResolutionGenerator_4;
+ public static String PropertiesMarkerResolutionGenerator_5;
+ public static String PropertiesMarkerResolutionGenerator_6;
+ public static String PropertiesMarkerResolutionGenerator_7;
+ public static String PropertiesMarkerResolutionGenerator_8;
+ public static String PropertiesMarkerResolutionGenerator_9;
+ public static String PropertiesMarkerResolutionGenerator_10;
+ public static String PropertiesMarkerResolutionGenerator_11;
+ public static String PropertiesMarkerResolutionGenerator_12;
+ public static String PropertiesMarkerResolutionGenerator_13;
+ public static String PropertiesUICustomValidator_0;
+ public static String PropertiesUICustomValidator_1;
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ }
+}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/messages/messages.properties b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/messages/messages.properties
new file mode 100644
index 00000000000..3646d5986da
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/messages/messages.properties
@@ -0,0 +1,75 @@
+#################################################################################
+# Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+# Christian W. Damus - Initial API and implementation
+#
+##################################################################################
+
+AbstractModelEditResolutionFactory_1=Single {0}
+AbstractModelEditResolutionFactory_2=Multiple {0}
+AbstractModelEditResolutionFactory_3=is{0}
+ConstraintsCustomValidator_0=Unresolved {2} ''{1}'' in {3} constraint ''{0}''.
+ConstraintsCustomValidator_1=Unresolved class reference ''{1}'' in {0}.
+DataContextElementResolutionFactory_0=Add data context element
+DataContextElementResolutionFactory_1=Add the missing data context element only
+DataContextElementResolutionFactory_2=Add data context element and views ({0})
+DataContextElementResolutionFactory_3=Add the missing data context element and generate views for it laid out with the "{0}" layout generator.
+DataContextElementResolutionFactory_4=Remove data context element
+DataContextElementResolutionFactory_5=Delete the obsolete data context element and any views that present it.
+DataContextElementResolutionFactory_6=Add data context package
+DataContextElementResolutionFactory_7=Add the missing data context package only
+DataContextElementResolutionFactory_8=Add data context element and views ({0})
+DataContextElementResolutionFactory_9=Add the missing data context package and generate views for its elements using the "{0}" layout generator.
+DataContextPropertyResolutionFactory_0=Add data context property
+DataContextPropertyResolutionFactory_1=Add the missing data context property only.
+DataContextPropertyResolutionFactory_2=Add data context property and editor
+DataContextPropertyResolutionFactory_3=Add the missing data context property and an editor for it in every appropriate section.
+DataContextPropertyResolutionFactory_4=Remove data context property
+DataContextPropertyResolutionFactory_5=Delete the obsolete data context property and any widgets that edit it.
+FindNewPackageLocation_0=Find Source Model
+FindNewPackageLocation_1=Select the new location of the source model for data context root ''{0}''.
+MissingPropertiesExtension_0=Register properties context model
+MissingPropertiesExtension_1=Add a plug-in extension registering the properties context model
+MissingPropertiesExtension_2=Register properties environment model
+MissingPropertiesExtension_3=Add a plug-in extension registering the properties environment model
+PropertiesContextCustomValidator_0={0} does not appear to correspond to a package in the source model and may be obsolete.
+PropertiesContextCustomValidator_1=The source package to which {0} corresponds has been deleted and it is now obsolete.
+PropertiesContextCustomValidator_10={0} must be named ''{1}'' to match {2}.
+PropertiesContextCustomValidator_11={0} must be named ''{1}'' to match {2}.
+PropertiesContextCustomValidator_12=The source model of {0} is not resolved. Perhaps it has been moved to another location?
+PropertiesContextCustomValidator_13={0} is missing a Data Context Package for nested source model package {1}.
+PropertiesContextCustomValidator_14={0} should have multiplicity {1} for consistency with source {2}.
+PropertiesContextCustomValidator_2={0} is missing a Data Context Element for source model class {1}.
+PropertiesContextCustomValidator_3={0} does not appear to correspond to a class in the source model and may be obsolete.
+PropertiesContextCustomValidator_4=The source model class to which {0} corresponds has been deleted and it is now obsolete.
+PropertiesContextCustomValidator_5={0} is missing a Property for source model property {1}.
+PropertiesContextCustomValidator_6={0} does not appear to correspond to a property in the source model and may be obsolete.
+PropertiesContextCustomValidator_7=The source model property to which {0} corresponds has been deleted and it is now obsolete.
+PropertiesContextCustomValidator_8={0} should have type {1} for consistency with source {2}.
+PropertiesContextCustomValidator_9={0} must be named ''{1}'' to match {2}.
+PropertiesContextDecoratorAdapterFactory_0={0} in section file ''{1}''
+PropertiesEnvironmentPluginChecker_0=Environment
+PropertiesMarkerResolutionGenerator_0=Set property type
+PropertiesMarkerResolutionGenerator_1=Set the recommended data-context property type to match the source model property.
+PropertiesMarkerResolutionGenerator_2=Set property editor type
+PropertiesMarkerResolutionGenerator_3=Set the recommended widget type to match the edited property type.
+PropertiesMarkerResolutionGenerator_4=Rename element
+PropertiesMarkerResolutionGenerator_5=Rename element and update references in XWT sections.
+PropertiesMarkerResolutionGenerator_6=Find new location for source model
+PropertiesMarkerResolutionGenerator_7=Search the workspace for the location to which the source model was moved.
+PropertiesMarkerResolutionGenerator_8=Update constraint reference
+PropertiesMarkerResolutionGenerator_9=Update the constraint to reference the correct class name.
+PropertiesMarkerResolutionGenerator_10=Update constraint to ''{0}''
+PropertiesMarkerResolutionGenerator_11=Update the constraint to use the class name ''{0}''.
+PropertiesMarkerResolutionGenerator_12=Set property multiplicity
+PropertiesMarkerResolutionGenerator_13=Set the data-context property multiplicity to match the source model property.
+PropertiesUICustomValidator_0=Widget type ''{1}'' of editor for {0} is not consistent with its type ''{2}''.
+PropertiesUICustomValidator_1=Widget type ''{1}'' of editor for {0} is not consistent with its multiplicity ''{2}''.
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/quickfix/AbstractModelEditResolutionFactory.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/quickfix/AbstractModelEditResolutionFactory.java
new file mode 100644
index 00000000000..dd7f5424c83
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/quickfix/AbstractModelEditResolutionFactory.java
@@ -0,0 +1,479 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.properties.internal.quickfix;
+
+import static java.util.function.Predicate.not;
+import static org.eclipse.papyrus.infra.tools.util.Iterators2.autoPrune;
+import static org.eclipse.papyrus.infra.tools.util.Iterators2.filter;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.MARKER_ATTR_LAYOUT_GENERATOR;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.BiFunction;
+import java.util.function.Supplier;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.common.command.CompoundCommand;
+import org.eclipse.emf.common.command.UnexecutableCommand;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.edit.command.AddCommand;
+import org.eclipse.emf.edit.command.ChangeCommand;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.papyrus.customization.properties.generation.generators.GeneratorHelper;
+import org.eclipse.papyrus.customization.properties.generation.generators.IGenerator;
+import org.eclipse.papyrus.customization.properties.generation.layout.ILayoutGenerator;
+import org.eclipse.papyrus.infra.constraints.ConstraintDescriptor;
+import org.eclipse.papyrus.infra.properties.contexts.Context;
+import org.eclipse.papyrus.infra.properties.contexts.ContextsFactory;
+import org.eclipse.papyrus.infra.properties.contexts.ContextsPackage;
+import org.eclipse.papyrus.infra.properties.contexts.DataContextElement;
+import org.eclipse.papyrus.infra.properties.contexts.DataContextPackage;
+import org.eclipse.papyrus.infra.properties.contexts.Property;
+import org.eclipse.papyrus.infra.properties.contexts.Section;
+import org.eclipse.papyrus.infra.properties.contexts.Tab;
+import org.eclipse.papyrus.infra.properties.contexts.UnknownProperty;
+import org.eclipse.papyrus.infra.properties.contexts.View;
+import org.eclipse.papyrus.infra.properties.contexts.util.ContextAnnotations;
+import org.eclipse.papyrus.infra.properties.ui.CompositeWidget;
+import org.eclipse.papyrus.infra.properties.ui.PropertyEditor;
+import org.eclipse.papyrus.infra.properties.ui.Widget;
+import org.eclipse.papyrus.infra.properties.ui.util.PropertiesUtil;
+import org.eclipse.papyrus.infra.tools.util.ClassLoaderHelper;
+import org.eclipse.papyrus.infra.tools.util.TriFunction;
+import org.eclipse.papyrus.infra.tools.util.Try;
+import org.eclipse.papyrus.toolsmiths.validation.common.quickfix.CommonMarkerResolutionUtils;
+import org.eclipse.papyrus.toolsmiths.validation.common.quickfix.SimpleModelEditMarkerResolution;
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.Activator;
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.messages.Messages;
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.trace.ComposedSourceTraceHelper;
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.trace.SourceTraceHelper;
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.util.PropertiesCache;
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.util.PropertyTypeHelper;
+import org.eclipse.ui.IMarkerResolution;
+
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Iterators;
+
+/**
+ * Abstraction of a factory for quick fixes that add or remove properties context model elements.
+ * It is not called a "generator" because it does not implement the Eclipse marker-resolution generator API.
+ */
+abstract class AbstractModelEditResolutionFactory {
+
+ private final int problemID;
+ private final SourceTraceHelper traceHelper;
+
+ private final ThreadLocal<IMarker> marker = new ThreadLocal<>();
+
+ AbstractModelEditResolutionFactory(int problemID) {
+ super();
+
+ this.problemID = problemID;
+ this.traceHelper = new ComposedSourceTraceHelper();
+ }
+
+ protected final IMarker getMarker() {
+ return marker.get();
+ }
+
+ protected final int getProblemID() {
+ return problemID;
+ }
+
+ protected final SourceTraceHelper getTraceHelper() {
+ return traceHelper;
+ }
+
+ public Iterable<IMarkerResolution> createResolutions(IMarker marker) {
+ return withMarker(marker, this::createResolutions);
+ }
+
+ private <T> T withMarker(IMarker marker, Supplier<T> computation) {
+ this.marker.set(marker);
+
+ try {
+ return computation.get();
+ } finally {
+ this.marker.remove();
+ }
+ }
+
+ protected abstract Iterable<IMarkerResolution> createResolutions();
+
+ protected <T extends EObject> IMarkerResolution createResolution(String label, String description, Class<T> type, BiFunction<? super EditingDomain, ? super T, ? extends Command> command) {
+ return SimpleModelEditMarkerResolution.create(getProblemID(), label, description, type, withMarker(command));
+ }
+
+ private <T extends EObject> TriFunction<EditingDomain, T, IMarker, Command> withMarker(BiFunction<? super EditingDomain, ? super T, ? extends Command> command) {
+ return (domain, object, marker) -> withMarker(marker, () -> command.apply(domain, object));
+ }
+
+ @SafeVarargs
+ protected final <T extends EObject> TriFunction<EditingDomain, T, IMarker, Command> compose(TriFunction<? super EditingDomain, ? super T, ? super IMarker, ? extends Command>... commands) {
+ return (domain, object, marker) -> {
+ CompoundCommand result = new CompoundCommand();
+
+ for (TriFunction<? super EditingDomain, ? super T, ? super IMarker, ? extends Command> commandFunction : commands) {
+ Command command = commandFunction.apply(domain, object, marker);
+ if (command != null) {
+ result.append(command);
+ }
+ }
+
+ return result.unwrap();
+ };
+ }
+
+ protected Iterator<CompositeWidget> widgeterator(Section section) {
+ return widgeterator(section, CompositeWidget.class);
+ }
+
+ protected <T extends Widget> Iterator<T> widgeterator(Section section, Class<? extends T> type) {
+ CompositeWidget composite = section.getWidget();
+
+ if (composite == null || composite.eIsProxy()) {
+ return Collections.emptyIterator();
+ }
+
+ return autoPrune(filter(EcoreUtil.getAllContents(Set.of(composite)), type), not(CompositeWidget.class::isInstance));
+ }
+
+ protected Context getContext(DataContextElement element) {
+ EObject result = EcoreUtil.getRootContainer(element);
+ return (result instanceof Context) ? (Context) result : null;
+ }
+
+ protected int getElementMultiplicity(Section section) {
+ int result = SourceTraceHelper.DEFAULT_MULTIPLICITY;
+
+ for (View view : section.getViews()) {
+ result = view.getElementMultiplicity();
+
+ if (result != SourceTraceHelper.DEFAULT_MULTIPLICITY) {
+ break;
+ }
+ }
+
+ return result;
+ }
+
+ /**
+ * Find an existing property editor for a {@code property} in a {@code section}.
+ *
+ * @param section
+ * a section
+ * @param property
+ * a data-context property
+ * @return the existing property editor in the {@code section}, or {@code null} if none
+ */
+ protected PropertyEditor getPropertyEditor(Section section, Property property) {
+ return Iterators.find(widgeterator(section, PropertyEditor.class), pe -> isPropertyEditorFor(pe, property), null);
+ }
+
+ /**
+ * Find an existing property editor for a {@code property} of a data-context {@code element} in a {@code section}.
+ * This is useful in cases where the {@code property} is not yet added to its owning {@code element}.
+ *
+ * @param section
+ * a section
+ * @param element
+ * a data-context element
+ * @param property
+ * a property of the {@code element}
+ * @return the existing property editor in the {@code section}, or {@code null} if none
+ */
+ protected PropertyEditor getPropertyEditor(Section section, DataContextElement element, Property property) {
+ return Iterators.find(widgeterator(section, PropertyEditor.class), pe -> isPropertyEditorFor(pe, element, property), null);
+ }
+
+ /**
+ * Query whether a property editor edits a data-context {@code property}.
+ *
+ * @param propertyEditor
+ * a property editor
+ * @param property
+ * a property
+ * @return whether the editor edits the {@code property}
+ */
+ protected boolean isPropertyEditorFor(PropertyEditor propertyEditor, Property property) {
+ boolean result = propertyEditor.getProperty() == property;
+
+ if (!result) {
+ // Perhaps it's an unresolved property reference
+ String qname = getQualifiedName(property);
+ UnknownProperty unknown = propertyEditor.getUnresolvedProperty();
+ result = unknown != null && qname.equals(unknown.getName());
+ }
+
+ return result;
+ }
+
+ /**
+ * Query whether a property editor edits a {@code property} of a data-context {@code element}.
+ * This is useful in cases where the {@code property} is not yet added to its owning {@code element}.
+ *
+ * @param propertyEditor
+ * a property editor
+ * @param element
+ * a data-context element
+ * @param property
+ * a property of the {@code element}
+ * @return whether the editor edits the {@code property}
+ */
+ protected boolean isPropertyEditorFor(PropertyEditor propertyEditor, DataContextElement element, Property property) {
+ boolean result = propertyEditor.getProperty() == property;
+
+ if (!result) {
+ // Perhaps it's an unresolved property reference
+ String qname = getQualifiedName(element, property);
+ UnknownProperty unknown = propertyEditor.getUnresolvedProperty();
+ result = unknown != null && qname.equals(unknown.getName());
+ }
+
+ return result;
+ }
+
+ protected final String getQualifiedName(DataContextElement element) {
+ StringBuilder result = new StringBuilder();
+ collectQualifiedName(element, result);
+ return result.toString();
+ }
+
+ private void collectQualifiedName(DataContextElement element, StringBuilder name) {
+ if (element.getPackage() != null) {
+ collectQualifiedName(element.getPackage(), name);
+ name.append(':');
+ }
+ name.append(element.getName());
+ }
+
+ protected final String getQualifiedName(Property property) {
+ StringBuilder result = new StringBuilder();
+ collectQualifiedName(property, result);
+ return result.toString();
+ }
+
+ private void collectQualifiedName(Property property, StringBuilder name) {
+ if (property.getContextElement() != null) {
+ collectQualifiedName(property.getContextElement(), name);
+ name.append(':');
+ }
+ name.append(property.getName());
+ }
+
+ protected final String getQualifiedName(DataContextElement element, Property property) {
+ StringBuilder result = new StringBuilder();
+ collectQualifiedName(element, result);
+ result.append(':');
+ result.append(property.getName());
+ return result.toString();
+ }
+
+ protected Property createDataContextProperty(EditingDomain domain, EObject sourceProperty) {
+ Property result = ContextsFactory.eINSTANCE.createProperty();
+ ContextAnnotations.setSourceModel(result, sourceProperty);
+
+ String name = getTraceHelper().getName(sourceProperty);
+ result.setName(name);
+ result.setLabel(PropertiesUtil.getLabel(name));
+ result.setMultiplicity(getTraceHelper().getMultiplicity(sourceProperty));
+ result.setType(PropertyTypeHelper.getInstance(result).getPropertyType(sourceProperty));
+
+ return result;
+ }
+
+ protected DataContextPackage createDataContextPackage(EditingDomain domain, EObject sourcePackage) {
+ DataContextPackage result = ContextsFactory.eINSTANCE.createDataContextPackage();
+ ContextAnnotations.setSourceModel(result, sourcePackage);
+
+ String name = getTraceHelper().getName(sourcePackage);
+ result.setName(name);
+
+ // Create its nested packages
+ getTraceHelper().getNestedPackages(sourcePackage).stream()
+ .map(nested -> createDataContextPackage(domain, nested))
+ .forEach(result.getElements()::add);
+
+ // And its classes
+ getTraceHelper().getClasses(sourcePackage).stream()
+ .map(sourceClass -> createDataContextElement(domain, sourceClass))
+ .forEach(result.getElements()::add);
+
+ // Packages do not use the inherited 'supertypes' and 'properties' properties
+
+ return result;
+ }
+
+ protected DataContextElement createDataContextElement(EditingDomain domain, EObject sourceClass) {
+ DataContextElement result = ContextsFactory.eINSTANCE.createDataContextElement();
+ ContextAnnotations.setSourceModel(result, sourceClass);
+
+ String name = getTraceHelper().getName(sourceClass);
+ result.setName(name);
+
+ // Create the properties
+ getTraceHelper().getProperties(sourceClass).stream()
+ .map(sourceProperty -> createDataContextProperty(domain, sourceProperty))
+ .forEach(result.getProperties()::add);
+
+ // Set the data-context supertypes
+ CommonMarkerResolutionUtils.getModelObject(getMarker(), DataContextPackage.class, domain).ifPresent(package_ -> {
+ PropertiesCache cache = PropertiesCache.getInstance(package_);
+
+ cache.getSuperclasses(sourceClass).stream()
+ .map(superclass -> cache.getDataContextElement(package_, superclass))
+ .flatMap(Optional::stream)
+ .forEach(result.getSupertypes()::add);
+ });
+
+ return result;
+ }
+
+ protected Optional<Class<? extends ILayoutGenerator>> getLayoutGeneratorClass() {
+ return Optional.ofNullable(getMarker().getAttribute(MARKER_ATTR_LAYOUT_GENERATOR, null))
+ .map(URI::createURI)
+ .filter(ClassLoaderHelper::isClassURI)
+ .map(ClassLoaderHelper::loadClass)
+ .map(loaded -> loaded.orElse(null))
+ .filter(ILayoutGenerator.class::isAssignableFrom)
+ .map(c -> c.asSubclass(ILayoutGenerator.class));
+ }
+
+ protected ILayoutGenerator instantiateLayout(Class<? extends ILayoutGenerator> layoutClass) {
+ return Try.call(() -> layoutClass.getConstructor().newInstance())
+ .orElseAccept((reason, exception) -> Activator.log.error("Failed to instantiate layout generator.", exception)); //$NON-NLS-1$
+ }
+
+ protected View createView(Context context, DataContextElement element, int multiplicity) {
+ // We know this exists explicitly because we just now set it
+ EObject sourceClass = ContextAnnotations.getSourceModel(element, context);
+
+ View result = ContextsFactory.eINSTANCE.createView();
+ ContextAnnotations.setSourceModel(result, sourceClass);
+
+ String namePattern = (multiplicity == 1) ? Messages.AbstractModelEditResolutionFactory_1 : Messages.AbstractModelEditResolutionFactory_2;
+ result.setName(NLS.bind(namePattern, element.getName()));
+ result.setElementMultiplicity(multiplicity);
+ result.setAutomaticContext(true);
+ result.getDatacontexts().add(element);
+
+ ConstraintDescriptor constraint = getTraceHelper().createInstanceOfConstraint(sourceClass);
+ constraint.setName(NLS.bind(Messages.AbstractModelEditResolutionFactory_3, result.getName().replaceAll("\\s+", ""))); //$NON-NLS-1$//$NON-NLS-2$
+ result.getConstraints().add(constraint);
+
+ return result;
+ }
+
+ /**
+ * Create a command that generates the section layout for a {@code view}.
+ *
+ * @param domain
+ * the contextual editing domain
+ * @param layout
+ * the layout generator to use
+ * @param context
+ * the properties context model
+ * @param element
+ * the data context element for which to create a section
+ * @param view
+ * the view of the data context {@code element} for which to create sections
+ *
+ * @return a command to generate the sections
+ */
+ protected Command createLayoutCommand(EditingDomain domain, ILayoutGenerator layout, Context context, DataContextElement element, View view) {
+ return createLayoutCommand(domain, layout, context, element, view, null);
+ }
+
+ /**
+ * Create a command that generates the section layout for a {@code view}.
+ *
+ * @param domain
+ * the contextual editing domain
+ * @param layout
+ * the layout generator to use
+ * @param context
+ * the properties context model
+ * @param element
+ * the data context element for which to create a section
+ * @param view
+ * the view of the data context {@code element} for which to create sections
+ * @param properties
+ * which properties of the data contect {@code element} to create editors for in the generated sections, or {@code null}
+ * to generate all eligible properties
+ *
+ * @return a command to generate the sections
+ */
+ protected Command createLayoutCommand(EditingDomain domain, ILayoutGenerator layout, Context context, DataContextElement element, View view,
+ Collection<? extends Property> properties) {
+
+ CompoundCommand result = new CompoundCommand();
+
+ // The layout generation needs the view to be added to the context, first
+ result.append(AddCommand.create(domain, context, ContextsPackage.Literals.CONTEXT__VIEWS, view));
+
+ // We know this exists explicitly because we just now set it
+ EObject sourceClass = ContextAnnotations.getSourceModel(element, context);
+
+ // We need this for profile layout generation
+ IGenerator generator = getTraceHelper().createGenerator(sourceClass);
+ GeneratorHelper helper = new GeneratorHelper(generator, layout);
+
+ Tab tab = Iterables.getFirst(context.getTabs(), null);
+ if (tab == null) {
+ return UnexecutableCommand.INSTANCE;
+ }
+
+ result.append(new ChangeCommand(context) {
+
+ private List<Section> generatedSections;
+
+ @Override
+ protected void doExecute() {
+ generatedSections = helper.generateLayout(context, tab, view,
+ (property, multiplicity) -> multiplicity.intValue() == 1 && (properties == null || properties.contains(property)));
+ }
+
+ // We need to save the generated section files
+ @Override
+ public Collection<?> getAffectedObjects() {
+ List<EObject> result = new ArrayList<>();
+
+ result.add(context);
+
+ if (generatedSections != null) {
+ generatedSections.stream().map(Section::getWidget)
+ .filter(Objects::nonNull)
+ .forEach(result::add);
+ }
+
+ return result;
+ }
+ });
+
+ return result.unwrap();
+ }
+
+}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/quickfix/DataContextElementResolutionFactory.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/quickfix/DataContextElementResolutionFactory.java
new file mode 100644
index 00000000000..dd834121482
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/quickfix/DataContextElementResolutionFactory.java
@@ -0,0 +1,205 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.properties.internal.quickfix;
+
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.MISSING_DATA_CONTEXT_ELEMENT;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.MISSING_DATA_CONTEXT_PACKAGE;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.OBSOLETE_DATA_CONTEXT_ELEMENT;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.getObjectToReference;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Stream;
+
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.common.command.CompoundCommand;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.edit.command.AddCommand;
+import org.eclipse.emf.edit.command.RemoveCommand;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.papyrus.customization.properties.generation.extensionpoint.LayoutExtensionPoint;
+import org.eclipse.papyrus.customization.properties.generation.layout.ILayoutGenerator;
+import org.eclipse.papyrus.infra.properties.contexts.Context;
+import org.eclipse.papyrus.infra.properties.contexts.ContextsPackage;
+import org.eclipse.papyrus.infra.properties.contexts.DataContextElement;
+import org.eclipse.papyrus.infra.properties.contexts.DataContextPackage;
+import org.eclipse.papyrus.infra.properties.contexts.command.ContextDeleteCommand;
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.messages.Messages;
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.util.PropertiesCache;
+import org.eclipse.ui.IMarkerResolution;
+
+import com.google.common.collect.Lists;
+
+/**
+ * A factory for quick fixes that add or remove data-context elements, with or without
+ * associated views and sections. It is not called a "generator" because it does not
+ * implement the Eclipse marker-resolution generator API.
+ */
+class DataContextElementResolutionFactory extends AbstractModelEditResolutionFactory {
+
+ DataContextElementResolutionFactory(int problemID) {
+ super(problemID);
+ }
+
+ @Override
+ protected Iterable<IMarkerResolution> createResolutions() {
+ switch (getProblemID()) {
+ case MISSING_DATA_CONTEXT_PACKAGE:
+ return List.copyOf(Lists.asList(addDataContextPackage(), addDataContextPackageAndViews()));
+ case MISSING_DATA_CONTEXT_ELEMENT:
+ return List.copyOf(Lists.asList(addDataContextElement(), addDataContextElementAndViews()));
+ case OBSOLETE_DATA_CONTEXT_ELEMENT:
+ return List.of(removeDataContextElement());
+ default:
+ return List.of();
+ }
+ }
+
+ IMarkerResolution addDataContextPackage() {
+ return createResolution(Messages.DataContextElementResolutionFactory_6, Messages.DataContextElementResolutionFactory_7,
+ DataContextPackage.class, this::createAddDataContextPackageCommand);
+ }
+
+ IMarkerResolution[] addDataContextPackageAndViews() {
+ return getLayoutGeneratorClass().map(this::instantiateLayout)
+ .map(Stream::of)
+ .orElseGet(() -> new LayoutExtensionPoint().getGenerators().stream())
+ .map(this::addDataContextPackageAndViews)
+ .toArray(IMarkerResolution[]::new);
+ }
+
+ private IMarkerResolution addDataContextPackageAndViews(ILayoutGenerator generator) {
+ return createResolution(NLS.bind(Messages.DataContextElementResolutionFactory_8, generator.getName()),
+ NLS.bind(Messages.DataContextElementResolutionFactory_9, generator.getName()),
+ DataContextPackage.class, (domain, package_) -> createDataContextPackageAndViewsCommand(domain, package_, generator));
+ }
+
+ private Command createAddDataContextPackageCommand(EditingDomain domain, DataContextPackage package_) {
+ return getObjectToReference(getMarker(), EObject.class, domain)
+ .map(sourcePackage -> createDataContextPackage(domain, sourcePackage))
+ .map(nested -> AddCommand.create(domain, package_, ContextsPackage.Literals.DATA_CONTEXT_PACKAGE__ELEMENTS, nested))
+ .orElse(null);
+ }
+
+ private Command createDataContextPackageAndViewsCommand(EditingDomain domain, DataContextPackage package_, ILayoutGenerator layout) {
+ return getObjectToReference(getMarker(), EObject.class, domain)
+ .map(sourcePackage -> createDataContextPackage(domain, sourcePackage))
+ .map(nested -> {
+ CompoundCommand result = new CompoundCommand();
+ result.append(AddCommand.create(domain, package_, ContextsPackage.Literals.DATA_CONTEXT_PACKAGE__ELEMENTS, nested));
+
+ createCreateViewCommands(domain, getContext(package_), nested, layout).forEach(result::append);
+
+ return result.unwrap();
+ })
+ .orElse(null);
+ }
+
+ IMarkerResolution addDataContextElement() {
+ return createResolution(Messages.DataContextElementResolutionFactory_0, Messages.DataContextElementResolutionFactory_1,
+ DataContextPackage.class, this::createAddDataContextElementCommand);
+ }
+
+ IMarkerResolution[] addDataContextElementAndViews() {
+ return getLayoutGeneratorClass().map(this::instantiateLayout)
+ .map(Stream::of)
+ .orElseGet(() -> new LayoutExtensionPoint().getGenerators().stream())
+ .map(this::addDataContextElementAndViews)
+ .toArray(IMarkerResolution[]::new);
+ }
+
+ private IMarkerResolution addDataContextElementAndViews(ILayoutGenerator generator) {
+ return createResolution(NLS.bind(Messages.DataContextElementResolutionFactory_2, generator.getName()),
+ NLS.bind(Messages.DataContextElementResolutionFactory_3, generator.getName()),
+ DataContextPackage.class, (domain, package_) -> createDataContextElementAndViewsCommand(domain, package_, generator));
+ }
+
+ private Command createAddDataContextElementCommand(EditingDomain domain, DataContextPackage package_) {
+ return getObjectToReference(getMarker(), EObject.class, domain)
+ .map(sourceClass -> createDataContextElement(domain, sourceClass))
+ .map(element -> AddCommand.create(domain, package_, ContextsPackage.Literals.DATA_CONTEXT_PACKAGE__ELEMENTS, element))
+ .orElse(null);
+ }
+
+ private Command createDataContextElementAndViewsCommand(EditingDomain domain, DataContextPackage package_, ILayoutGenerator layout) {
+ return getObjectToReference(getMarker(), EObject.class, domain)
+ .map(sourceClass -> createDataContextElement(domain, sourceClass))
+ .map(element -> {
+ CompoundCommand result = new CompoundCommand();
+ result.append(AddCommand.create(domain, package_, ContextsPackage.Literals.DATA_CONTEXT_PACKAGE__ELEMENTS, element));
+
+ createCreateViewCommands(domain, getContext(package_), element, layout).forEach(result::append);
+
+ return result.unwrap();
+ })
+ .orElse(null);
+ }
+
+ /**
+ * Create views for and lay out sections for the given {@code element} in a properties {@code context}.
+ *
+ * @param domain
+ * the EMF editing domain in which to create commands
+ * @param context
+ * the properties context model
+ * @param element
+ * the element for which to create views. This may be a {@link DataContextPackage}, in which case
+ * views are created recursively for contained elements
+ * @param layout
+ * the layout generator to use to generate the sections
+ *
+ * @return the stream (possibly empty) of commands to append
+ */
+ private Stream<Command> createCreateViewCommands(EditingDomain domain, Context context, DataContextElement element, ILayoutGenerator layout) {
+ Stream<Command> result;
+
+ if (element instanceof DataContextPackage) {
+ result = ((DataContextPackage) element).getElements().stream()
+ .flatMap(child -> createCreateViewCommands(domain, context, child, layout));
+ } else {
+ result = Stream.of(createView(context, element, 1), createView(context, element, -1))
+ .map(view -> createLayoutCommand(domain, layout, context, element, view));
+ }
+
+ return result;
+ }
+
+ IMarkerResolution removeDataContextElement() {
+ return createResolution(Messages.DataContextElementResolutionFactory_4, Messages.DataContextElementResolutionFactory_5,
+ DataContextElement.class, this::createDeleteDataContextElementCommand);
+ }
+
+ private Command createDeleteDataContextElementCommand(EditingDomain domain, DataContextElement element) {
+ DataContextPackage package_ = element.getPackage();
+ return Optional.ofNullable(package_).map(container -> {
+ CompoundCommand result = new CompoundCommand();
+
+ // Same command as the editor uses
+ result.append(ContextDeleteCommand.create(domain, element));
+
+ // Find associated views and sections and delete them
+ Stream.concat(PropertiesCache.getInstance(element).getViews(element).stream(),
+ PropertiesCache.getInstance(element).getSections(element).stream())
+ // The editor uses RemoveCommand instead of DeleteCommand, so we do, also
+ .map(viewOrSection -> RemoveCommand.create(domain, viewOrSection))
+ .forEach(result::append);
+
+ return result.unwrap();
+ }).orElse(null);
+ }
+
+}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/quickfix/DataContextPropertyResolutionFactory.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/quickfix/DataContextPropertyResolutionFactory.java
new file mode 100644
index 00000000000..0097c9214ae
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/quickfix/DataContextPropertyResolutionFactory.java
@@ -0,0 +1,187 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.properties.internal.quickfix;
+
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.MISSING_DATA_CONTEXT_PROPERTY;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.OBSOLETE_DATA_CONTEXT_PROPERTY;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.getObjectToReference;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Stream;
+
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.common.command.CompoundCommand;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.edit.command.AddCommand;
+import org.eclipse.emf.edit.command.RemoveCommand;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.papyrus.customization.properties.generation.layout.ILayoutGenerator;
+import org.eclipse.papyrus.customization.properties.generation.layout.StandardLayoutGenerator;
+import org.eclipse.papyrus.infra.properties.contexts.Context;
+import org.eclipse.papyrus.infra.properties.contexts.ContextsPackage;
+import org.eclipse.papyrus.infra.properties.contexts.DataContextElement;
+import org.eclipse.papyrus.infra.properties.contexts.Property;
+import org.eclipse.papyrus.infra.properties.contexts.Section;
+import org.eclipse.papyrus.infra.properties.environment.PropertyEditorType;
+import org.eclipse.papyrus.infra.properties.environment.WidgetType;
+import org.eclipse.papyrus.infra.properties.ui.CompositeWidget;
+import org.eclipse.papyrus.infra.properties.ui.PropertyEditor;
+import org.eclipse.papyrus.infra.properties.ui.UiFactory;
+import org.eclipse.papyrus.infra.properties.ui.UiPackage;
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.messages.Messages;
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.util.PropertiesCache;
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.util.WidgetTypeHelper;
+import org.eclipse.ui.IMarkerResolution;
+
+import com.google.common.collect.Iterators;
+
+/**
+ * A factory for quick fixes that add or remove data-context properties.
+ * It is not called a "generator" because it does not implement the Eclipse
+ * marker-resolution generator API.
+ */
+class DataContextPropertyResolutionFactory extends AbstractModelEditResolutionFactory {
+
+ DataContextPropertyResolutionFactory(int problemID) {
+ super(problemID);
+ }
+
+ @Override
+ protected Iterable<IMarkerResolution> createResolutions() {
+ switch (getProblemID()) {
+ case MISSING_DATA_CONTEXT_PROPERTY:
+ return List.of(addDataContextProperty(), addDataContextPropertyAndEditor());
+ case OBSOLETE_DATA_CONTEXT_PROPERTY:
+ return List.of(removeDataContextProperty());
+ default:
+ return List.of();
+ }
+ }
+
+ IMarkerResolution addDataContextProperty() {
+ return createResolution(Messages.DataContextPropertyResolutionFactory_0, Messages.DataContextPropertyResolutionFactory_1,
+ DataContextElement.class, this::createAddDataContextPropertyCommand);
+ }
+
+ IMarkerResolution addDataContextPropertyAndEditor() {
+ return createResolution(Messages.DataContextPropertyResolutionFactory_2, Messages.DataContextPropertyResolutionFactory_3,
+ DataContextElement.class, this::createAddDataContextPropertyAndEditorCommand);
+ }
+
+ private Command createAddDataContextPropertyCommand(EditingDomain domain, DataContextElement element) {
+ return getObjectToReference(getMarker(), EObject.class, domain)
+ .map(sourceProperty -> createDataContextProperty(domain, sourceProperty))
+ .map(property -> AddCommand.create(domain, element, ContextsPackage.Literals.DATA_CONTEXT_ELEMENT__PROPERTIES, property))
+ .orElse(null);
+ }
+
+ private Command createAddDataContextPropertyAndEditorCommand(EditingDomain domain, DataContextElement element) {
+ return getObjectToReference(getMarker(), EObject.class, domain)
+ .map(sourceProperty -> createDataContextProperty(domain, sourceProperty))
+ .map(property -> {
+ CompoundCommand result = new CompoundCommand();
+ result.append(AddCommand.create(domain, element, ContextsPackage.Literals.DATA_CONTEXT_ELEMENT__PROPERTIES, property));
+
+ Collection<Section> sections = PropertiesCache.getInstance(element).getSections(element);
+ if (sections.isEmpty()) {
+ // No sections? then we need to generate the initial views
+ Command createViews = createCreateViewsForPropertyEditorCommand(domain, element, property);
+ if (createViews != null) {
+ result.append(createViews);
+ }
+ } else {
+ for (Section section : PropertiesCache.getInstance(element).getSections(element)) {
+ // Only add a property editor for single selections. Note that sections do not use
+ // their own multiplicity attributes; we rely on the associated views
+ if (getElementMultiplicity(section) == 1) {
+ Command createPropertyEditor = createCreatePropertyEditorCommand(domain, section, element, property);
+ if (createPropertyEditor != null) {
+ result.append(createPropertyEditor);
+ }
+ }
+ }
+ }
+
+ return result.unwrap();
+ })
+ .orElse(null);
+ }
+
+ private Command createCreatePropertyEditorCommand(EditingDomain domain, Section section, DataContextElement element, Property property) {
+ Command result = null;
+
+ // TODO: Is there a good way to find a more appropriate composite widget to add the property to?
+
+ // Search for the last most deeply nested composite to add to
+ CompositeWidget composite = Iterators.getLast(widgeterator(section), null);
+
+ // And don't add another editor if this section already has one for this property
+ if (composite != null && getPropertyEditor(section, element, property) == null) {
+ WidgetType type = WidgetTypeHelper.getInstance(composite).getDefaultWidgetType(property);
+ if (type instanceof PropertyEditorType) {
+ PropertyEditor editor = UiFactory.eINSTANCE.createPropertyEditor();
+ editor.setProperty(property);
+ editor.setWidgetType((PropertyEditorType) type);
+ result = AddCommand.create(domain, composite, UiPackage.Literals.COMPOSITE_WIDGET__WIDGETS, editor);
+ }
+ }
+
+ return result;
+ }
+
+ private Command createCreateViewsForPropertyEditorCommand(EditingDomain domain, DataContextElement element, Property property) {
+ CompoundCommand result = new CompoundCommand();
+ Context context = getContext(element);
+
+ // To generate just one property, it doesn't really matter the layout we use
+ ILayoutGenerator layout = getLayoutGeneratorClass().map(this::instantiateLayout).orElseGet(StandardLayoutGenerator::new);
+ Stream.of(createView(context, element, 1), createView(context, element, -1))
+ .map(view -> createLayoutCommand(domain, layout, context, element, view, Set.of(property)))
+ .forEach(result::append);
+
+ return result.unwrap();
+ }
+
+ IMarkerResolution removeDataContextProperty() {
+ return createResolution(Messages.DataContextPropertyResolutionFactory_4, Messages.DataContextPropertyResolutionFactory_5,
+ Property.class, this::createDeleteDataContextPropertyCommand);
+ }
+
+ private Command createDeleteDataContextPropertyCommand(EditingDomain domain, Property property) {
+ DataContextElement element = property.getContextElement();
+ return Optional.ofNullable(element).map(container -> {
+ CompoundCommand result = new CompoundCommand();
+
+ // The editor uses RemoveCommand instead of DeleteCommand, so we do, also
+ result.append(RemoveCommand.create(domain, property));
+
+ // Ensure that the sections that can legitimately reference this property via property editors are loaded
+ PropertiesCache.getInstance(element).getSections(element).forEach(Section::getWidget);
+
+ // Find referencing property editors and remove them (don't need a delete command because they
+ // are not referenced by anything, themselves)
+ PropertiesCache.getInstance(element).getReferencers(property, UiPackage.Literals.PROPERTY_EDITOR__PROPERTY).stream()
+ .map(propertyEditor -> RemoveCommand.create(domain, propertyEditor))
+ .forEach(result::append);
+
+ return result.unwrap();
+ }).orElse(null);
+ }
+
+}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/quickfix/FindNewPackageLocation.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/quickfix/FindNewPackageLocation.java
new file mode 100644
index 00000000000..d60c362c99f
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/quickfix/FindNewPackageLocation.java
@@ -0,0 +1,178 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.properties.internal.quickfix;
+
+import java.util.stream.Collectors;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.common.command.IdentityCommand;
+import org.eclipse.emf.common.command.UnexecutableCommand;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EcorePackage;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.edit.command.SetCommand;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.jface.window.Window;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.papyrus.infra.properties.contexts.Annotatable;
+import org.eclipse.papyrus.infra.properties.contexts.DataContextRoot;
+import org.eclipse.papyrus.infra.properties.contexts.util.ContextAnnotations;
+import org.eclipse.papyrus.infra.tools.util.Iterators2;
+import org.eclipse.papyrus.infra.ui.util.EditorHelper;
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.messages.Messages;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.dialogs.FilteredResourcesSelectionDialog;
+
+/**
+ * Quick fix for a {@link DataContextRoot} whose source package has moved to another URI.
+ * It asks the user for the new location of the resource and updates all matching
+ * source trace annotations accordingly.
+ */
+public class FindNewPackageLocation {
+
+ Command fix(EditingDomain domain, DataContextRoot dataContext, IMarker marker) {
+ // Assume there's nothing to fix until we determine otherwise
+ Command result = UnexecutableCommand.INSTANCE;
+
+ URI originalURI = getOriginalURI(dataContext);
+ if (originalURI != null) {
+ IFile newFile = browseForNewFile(marker, dataContext, originalURI);
+ URI newURI = (newFile != null) ? URI.createPlatformResourceURI(newFile.getFullPath().toString(), true) : null;
+
+ if (newURI != null) {
+ result = createReplaceURIsCommand(domain, dataContext.eResource(), originalURI, newURI);
+ }
+ }
+
+ return result;
+ }
+
+ private URI getOriginalURI(Annotatable element) {
+ URI result = ContextAnnotations.getSourceModelURI(element);
+ if (result != null) {
+ result = result.trimFragment();
+ }
+ return result;
+ }
+
+ private Command createReplaceURIsCommand(EditingDomain domain, Resource resource, URI oldURI, URI newURI) {
+ return Iterators2.stream(Iterators2.filter(EcoreUtil.getAllProperContents(resource, false), Annotatable.class))
+ .filter(annotatable -> tracesTo(annotatable, oldURI))
+ .map(annotatable -> updateSourceURI(domain, annotatable, newURI))
+ .collect(Collectors.reducing(Command::chain))
+ .orElse(UnexecutableCommand.INSTANCE);
+ }
+
+ private boolean tracesTo(Annotatable annotatable, URI resourceURI) {
+ URI oldURI = ContextAnnotations.getSourceModelURI(annotatable);
+ return oldURI != null && oldURI.trimFragment().equals(resourceURI);
+ }
+
+ private Command updateSourceURI(EditingDomain domain, Annotatable annotatable, URI newResourceURI) {
+ // We know a priori that this annotation exists, otherwise we wouldn't be updating it
+ return annotatable.getAnnotation(ContextAnnotations.ANNOTATION_SOURCE).getDetails().stream()
+ .filter(entry -> ContextAnnotations.DETAIL_MODEL.equals(entry.getKey()))
+ .findAny()
+ .map(entry -> SetCommand.create(domain, entry, EcorePackage.Literals.ESTRING_TO_STRING_MAP_ENTRY__VALUE,
+ newResourceURI.appendFragment(URI.createURI(entry.getValue()).fragment()).toString()))
+ .orElse(IdentityCommand.INSTANCE);
+ }
+
+ private IFile browseForNewFile(IMarker marker, DataContextRoot dataContext, URI originalURI) {
+ IFile result = null;
+
+ IWorkspace workspace = marker.getResource().getWorkspace();
+ String fileExtension = originalURI.fileExtension();
+
+ Shell parentShell = EditorHelper.getActiveShell();
+ FilteredResourcesSelectionDialog dialog = new FilteredResourcesSelectionDialog(parentShell, false, workspace.getRoot(), IResource.FILE) {
+ {
+ setInitialPattern("**"); //$NON-NLS-1$
+ setTitle(Messages.FindNewPackageLocation_0);
+ String dataContextLabel = dataContext.getLabel();
+ if (dataContextLabel == null || dataContextLabel.isBlank()) {
+ dataContextLabel = dataContext.getName();
+ }
+ setMessage(NLS.bind(Messages.FindNewPackageLocation_1, dataContextLabel));
+ }
+
+ @Override
+ protected ItemsFilter createFilter() {
+ ResourceFilter delegate = (ResourceFilter) super.createFilter();
+
+ return new ResourceFilter(workspace.getRoot(), delegate.isShowDerived(), IResource.FILE) {
+
+ @Override
+ public boolean isConsistentItem(Object item) {
+ return delegate.isConsistentItem(item);
+ }
+
+ @Override
+ public boolean matchItem(Object item) {
+ return delegate.matchItem(item) && hasCorrectExtension(item);
+ }
+
+ @Override
+ public int getMatchRule() {
+ return delegate.getMatchRule();
+ }
+
+ @Override
+ public boolean isCamelCasePattern() {
+ return delegate.isCamelCasePattern();
+ }
+
+ @Override
+ public String getPattern() {
+ return delegate.getPattern();
+ }
+
+ @Override
+ public boolean matchesRawNamePattern(Object item) {
+ return delegate.matchesRawNamePattern(item);
+ }
+
+ @Override
+ public boolean isSubFilter(ItemsFilter filter) {
+ return delegate.isSubFilter(filter);
+ }
+
+ @Override
+ public boolean equalsFilter(ItemsFilter filter) {
+ return delegate.equalsFilter(filter);
+ }
+
+ boolean hasCorrectExtension(Object item) {
+ return item instanceof IFile && fileExtension.equals(((IFile) item).getFullPath().getFileExtension());
+ }
+
+ };
+ }
+ };
+
+ if (dialog.open() == Window.OK) {
+ result = (IFile) dialog.getFirstResult();
+ }
+
+ return result;
+ }
+
+}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/quickfix/PropertiesMarkerResolutionGenerator.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/quickfix/PropertiesMarkerResolutionGenerator.java
new file mode 100644
index 00000000000..319799e730f
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/quickfix/PropertiesMarkerResolutionGenerator.java
@@ -0,0 +1,240 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.properties.internal.quickfix;
+
+import static java.util.function.Predicate.not;
+import static org.eclipse.papyrus.toolsmiths.validation.common.quickfix.CommonMarkerResolutionUtils.getModelAttribute;
+import static org.eclipse.papyrus.toolsmiths.validation.common.quickfix.CommonMarkerResolutionUtils.getModelPath;
+import static org.eclipse.papyrus.toolsmiths.validation.common.quickfix.SimpleMissingExtensionMarkerResolution.optionalAttribute;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.A_CONTEXT_MODEL;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.A_ENVIRONMENT_MODEL;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.CONTEXTS_EXTENSION_POINT_IDENTIFIER;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.ENVIRONMENTS_EXTENSION_POINT_IDENTIFIER;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.E_CONTEXT;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.E_ENVIRONMENT;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.INCONSISTENT_DATA_CONTEXT_PROPERTY_MULTIPLICITY;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.INCONSISTENT_DATA_CONTEXT_PROPERTY_TYPE;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.INCONSISTENT_WIDGET_TYPE;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.MAX_PROBLEM_ID;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.MISSING_CONTEXT_MODEL_EXTENSION_ID;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.MISSING_DATA_CONTEXT_ELEMENT;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.MISSING_DATA_CONTEXT_PACKAGE;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.MISSING_DATA_CONTEXT_PROPERTY;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.MISSING_ENVIRONMENT_MODEL_EXTENSION_ID;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.OBSOLETE_DATA_CONTEXT_ELEMENT;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.OBSOLETE_DATA_CONTEXT_PROPERTY;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.OBSOLETE_DATA_CONTEXT_ROOT;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.PROBLEM_ID_BASE;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.RENAMED_CLASS;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.RENAMED_PACKAGE;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.RENAMED_PROPERTY;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.UNRESOLVED_CONSTRAINT_CLASS;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.UNRESOLVED_CONSTRAINT_CLASS_MULTIPLE_CHOICE;
+
+import java.util.Collection;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.stream.Stream;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.common.command.CompoundCommand;
+import org.eclipse.emf.common.command.UnexecutableCommand;
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EDataType;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EcorePackage;
+import org.eclipse.emf.edit.command.SetCommand;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.papyrus.infra.properties.contexts.ContextsPackage;
+import org.eclipse.papyrus.infra.properties.contexts.DataContextElement;
+import org.eclipse.papyrus.infra.properties.contexts.DataContextPackage;
+import org.eclipse.papyrus.infra.properties.contexts.DataContextRoot;
+import org.eclipse.papyrus.infra.properties.contexts.Property;
+import org.eclipse.papyrus.infra.properties.contexts.Section;
+import org.eclipse.papyrus.infra.properties.ui.UiPackage;
+import org.eclipse.papyrus.infra.tools.util.Iterators2;
+import org.eclipse.papyrus.toolsmiths.validation.common.command.TouchResourceCommand;
+import org.eclipse.papyrus.toolsmiths.validation.common.quickfix.CommonMarkerResolutionGenerator;
+import org.eclipse.papyrus.toolsmiths.validation.common.quickfix.SimpleMissingExtensionMarkerResolution;
+import org.eclipse.papyrus.toolsmiths.validation.common.quickfix.SimpleModelEditMarkerResolution;
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants;
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.messages.Messages;
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.util.PropertiesCache;
+import org.eclipse.ui.IMarkerResolution;
+
+/**
+ * Resolution generator for markers created by the validation of <em>Properties</em> models.
+ */
+public class PropertiesMarkerResolutionGenerator extends CommonMarkerResolutionGenerator {
+
+ public PropertiesMarkerResolutionGenerator() {
+ super();
+ }
+
+ @Override
+ public IMarkerResolution[] getResolutions(IMarker marker) {
+ if (hasCommonResolutions(marker)) {
+ return super.getResolutions(marker);
+ }
+
+ int problemID = getProblemID(marker);
+ switch (problemID) {
+ case MISSING_CONTEXT_MODEL_EXTENSION_ID:
+ return only(new SimpleMissingExtensionMarkerResolution(problemID,
+ Messages.MissingPropertiesExtension_0, Messages.MissingPropertiesExtension_1,
+ CONTEXTS_EXTENSION_POINT_IDENTIFIER, E_CONTEXT,
+ optionalAttribute(A_CONTEXT_MODEL, m -> getModelPath(m).map(IPath::toPortableString))));
+ case MISSING_ENVIRONMENT_MODEL_EXTENSION_ID:
+ return only(new SimpleMissingExtensionMarkerResolution(problemID,
+ Messages.MissingPropertiesExtension_2, Messages.MissingPropertiesExtension_3,
+ ENVIRONMENTS_EXTENSION_POINT_IDENTIFIER, E_ENVIRONMENT,
+ optionalAttribute(A_ENVIRONMENT_MODEL, m -> getModelPath(m).map(IPath::toPortableString))));
+ case INCONSISTENT_DATA_CONTEXT_PROPERTY_TYPE:
+ return only(createSetValueResolution(problemID, ContextsPackage.Literals.PROPERTY__TYPE, Messages.PropertiesMarkerResolutionGenerator_0, Messages.PropertiesMarkerResolutionGenerator_1));
+ case INCONSISTENT_WIDGET_TYPE:
+ return only(createSetReferenceResolution(problemID, UiPackage.Literals.PROPERTY_EDITOR__WIDGET_TYPE, Messages.PropertiesMarkerResolutionGenerator_2, Messages.PropertiesMarkerResolutionGenerator_3));
+ case MISSING_DATA_CONTEXT_PACKAGE:
+ case MISSING_DATA_CONTEXT_ELEMENT:
+ case OBSOLETE_DATA_CONTEXT_ELEMENT:
+ return allOf(new DataContextElementResolutionFactory(problemID).createResolutions(marker));
+ case MISSING_DATA_CONTEXT_PROPERTY:
+ case OBSOLETE_DATA_CONTEXT_PROPERTY:
+ return allOf(new DataContextPropertyResolutionFactory(problemID).createResolutions(marker));
+ case RENAMED_PROPERTY:
+ case RENAMED_CLASS:
+ case RENAMED_PACKAGE:
+ return maybe(getModelAttribute(marker).map(feature -> createSetValueResolution(problemID, feature, Messages.PropertiesMarkerResolutionGenerator_4, Messages.PropertiesMarkerResolutionGenerator_5)));
+ case OBSOLETE_DATA_CONTEXT_ROOT:
+ return only(SimpleModelEditMarkerResolution.create(problemID, Messages.PropertiesMarkerResolutionGenerator_6, Messages.PropertiesMarkerResolutionGenerator_7,
+ DataContextRoot.class, new FindNewPackageLocation()::fix));
+ case UNRESOLVED_CONSTRAINT_CLASS:
+ return maybe(getModelAttribute(marker).map(feature -> createSetValueResolution(problemID, feature,
+ Messages.PropertiesMarkerResolutionGenerator_8, Messages.PropertiesMarkerResolutionGenerator_9)));
+ case UNRESOLVED_CONSTRAINT_CLASS_MULTIPLE_CHOICE:
+ String validClassNames = PropertiesPluginValidationConstants.getValueToSet(marker, String.class, EcorePackage.Literals.ESTRING).orElse(""); //$NON-NLS-1$
+ return allOf(Stream.of(validClassNames.split(",")) //$NON-NLS-1$
+ .map(className -> getModelAttribute(marker).map(feature -> createSetValueResolution(problemID, feature, className,
+ NLS.bind(Messages.PropertiesMarkerResolutionGenerator_10, className), NLS.bind(Messages.PropertiesMarkerResolutionGenerator_11, className))))
+ .filter(Optional::isPresent)
+ .map(Optional::get)
+ .toArray(IMarkerResolution[]::new));
+ case INCONSISTENT_DATA_CONTEXT_PROPERTY_MULTIPLICITY:
+ return only(createSetValueResolution(problemID, ContextsPackage.Literals.PROPERTY__MULTIPLICITY, Messages.PropertiesMarkerResolutionGenerator_12, Messages.PropertiesMarkerResolutionGenerator_13));
+ default:
+ return noResolutions();
+ }
+ }
+
+ @Override
+ public boolean hasResolutions(IMarker marker) {
+ return super.hasResolutions(marker)
+ || matchProblemID(marker, PROBLEM_ID_BASE, MAX_PROBLEM_ID);
+ }
+
+ protected IMarkerResolution createSetValueResolution(int problemID, EAttribute attribute, String label, String description) {
+ Class<? extends EObject> ownerType = attribute.getEContainingClass().getInstanceClass().asSubclass(EObject.class);
+ return SimpleModelEditMarkerResolution.create(problemID, label, description, ownerType, (domain, owner, marker) -> {
+ CompoundCommand result = new CompoundCommand();
+
+ EDataType dataType = attribute.getEAttributeType();
+ Optional<?> value = PropertiesPluginValidationConstants.getValueToSet(marker, dataType.getInstanceClass(), dataType);
+
+ result.append(value.map(v -> SetCommand.create(domain, owner, attribute, v)).orElse(UnexecutableCommand.INSTANCE));
+
+ if (attribute == ContextsPackage.Literals.PROPERTY__NAME) {
+ result.append(touchSectionFiles(domain, (Property) owner));
+ } else if (attribute == ContextsPackage.Literals.DATA_CONTEXT_ELEMENT__NAME) {
+ result.append(touchSectionFiles(domain, (DataContextElement) owner));
+ }
+
+ return result.unwrap();
+ });
+ }
+
+ protected IMarkerResolution createSetValueResolution(int problemID, EAttribute attribute, Object value, String label, String description) {
+ Class<? extends EObject> ownerType = attribute.getEContainingClass().getInstanceClass().asSubclass(EObject.class);
+ return SimpleModelEditMarkerResolution.create(problemID, label, description, ownerType, (domain, owner, marker) -> {
+ CompoundCommand result = new CompoundCommand();
+
+ result.append(SetCommand.create(domain, owner, attribute, value));
+
+ if (attribute == ContextsPackage.Literals.PROPERTY__NAME) {
+ result.append(touchSectionFiles(domain, (Property) owner));
+ } else if (attribute == ContextsPackage.Literals.DATA_CONTEXT_ELEMENT__NAME) {
+ result.append(touchSectionFiles(domain, (DataContextElement) owner));
+ }
+
+ return result.unwrap();
+ }).disableMultiFix(); // We encode a static fix plan and so cannot apply it to other markers
+ }
+
+ protected IMarkerResolution createSetReferenceResolution(int problemID, EReference reference, String label, String description) {
+ Class<? extends EObject> ownerType = reference.getEContainingClass().getInstanceClass().asSubclass(EObject.class);
+ return SimpleModelEditMarkerResolution.create(problemID, label, description, ownerType, (domain, owner, marker) -> {
+ Class<? extends EObject> referenceType = reference.getEReferenceType().getInstanceClass().asSubclass(EObject.class);
+ Optional<? extends EObject> object = PropertiesPluginValidationConstants.getObjectToReference(marker, referenceType, domain);
+ return object.map(ref -> SetCommand.create(domain, owner, reference, ref)).orElse(UnexecutableCommand.INSTANCE);
+ });
+ }
+
+ /**
+ * Create a command that touches all of the section files referencing the given {@code property} so that
+ * they will be rewritten with the new property name.
+ *
+ * @param domain
+ * the contextual editing domain
+ * @param property
+ * a property that is renamed
+ * @return the touch command
+ */
+ protected Command touchSectionFiles(EditingDomain domain, Property property) {
+ // Ensure that the sections that can legitimately reference this property via property editors are loaded
+ PropertiesCache.getInstance(property).getSections(property.getContextElement()).forEach(Section::getWidget);
+
+ return PropertiesCache.getInstance(property).getReferencers(property, UiPackage.Literals.PROPERTY_EDITOR__PROPERTY).stream()
+ .map(EObject::eResource).distinct()
+ .collect(TouchResourceCommand.toTouchCommand(domain));
+ }
+
+ /**
+ * Create a command that touches all of the section files referencing properties of the given
+ * data-context {@code element} so that they will be rewritten with the new property name.
+ *
+ * @param domain
+ * the contextual editing domain
+ * @param element
+ * a data-context element that is renamed
+ * @return the touch command
+ */
+ protected Command touchSectionFiles(EditingDomain domain, DataContextElement element) {
+ PropertiesCache cache = PropertiesCache.getInstance(element);
+
+ Stream<DataContextElement> classes = !(element instanceof DataContextPackage)
+ ? Stream.of(element)
+ : Iterators2.stream(Iterators2.filter(element.eAllContents(), DataContextElement.class))
+ .filter(not(DataContextPackage.class::isInstance));
+
+ return classes.map(cache::getSections).flatMap(Collection::stream)
+ .map(Section::getWidget).filter(Objects::nonNull).filter(not(EObject::eIsProxy))
+ .map(EObject::eResource).distinct()
+ .collect(TouchResourceCommand.toTouchCommand(domain));
+ }
+
+}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/trace/ComposedSourceTraceHelper.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/trace/ComposedSourceTraceHelper.java
new file mode 100644
index 00000000000..ea497b61ef9
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/trace/ComposedSourceTraceHelper.java
@@ -0,0 +1,143 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.properties.internal.trace;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Objects;
+import java.util.function.BiFunction;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.papyrus.customization.properties.generation.generators.IGenerator;
+import org.eclipse.papyrus.infra.constraints.ConstraintDescriptor;
+import org.eclipse.papyrus.infra.constraints.ValueProperty;
+import org.eclipse.papyrus.infra.properties.contexts.DataContextElement;
+import org.eclipse.papyrus.infra.properties.contexts.Section;
+import org.eclipse.papyrus.infra.properties.contexts.View;
+
+/**
+ * A source trace helper that is composed of other helpers to which it delegates
+ * in turn until it gets a result.
+ */
+public class ComposedSourceTraceHelper implements SourceTraceHelper {
+
+ private final List<SourceTraceHelper> delegates;
+
+ public ComposedSourceTraceHelper() {
+ super();
+
+ delegates = List.of(new ExplicitSourceTraceHelper(),
+ new ImplicitUMLSourceTraceHelper(),
+ new ImplicitEcoreSourceTraceHelper());
+ }
+
+ @Override
+ public EObject getSourceElement(EObject propertiesElement) {
+ return iterate(propertiesElement, null, SourceTraceHelper::getSourceElement);
+ }
+
+ @Override
+ public List<? extends EObject> getNestedPackages(EObject sourcePackage) {
+ return iterate(sourcePackage, List.of(), SourceTraceHelper::getNestedPackages);
+ }
+
+ @Override
+ public List<? extends EObject> getClasses(EObject sourcePackage) {
+ return iterate(sourcePackage, List.of(), SourceTraceHelper::getClasses);
+ }
+
+ @Override
+ public List<? extends EObject> getProperties(EObject sourceClass) {
+ return iterate(sourceClass, List.of(), SourceTraceHelper::getProperties);
+ }
+
+ @Override
+ public boolean isPropertyRedefinition(EObject sourceProperty) {
+ return iterate(sourceProperty, false, SourceTraceHelper::isPropertyRedefinition);
+ }
+
+ @Override
+ public List<? extends EObject> getSuperclasses(EObject sourceClass) {
+ return iterate(sourceClass, List.of(), SourceTraceHelper::getSuperclasses);
+ }
+
+ @Override
+ public ConstraintDescriptor createInstanceOfConstraint(EObject sourceClass) {
+ return iterate(sourceClass, null, SourceTraceHelper::createInstanceOfConstraint);
+ }
+
+ @Override
+ public boolean isInstanceOfConstraint(ConstraintDescriptor constraint) {
+ return iterate(constraint, false, SourceTraceHelper::isInstanceOfConstraint);
+ }
+
+ @Override
+ public EObject resolveInstanceOfConstraintClass(ConstraintDescriptor constraint) {
+ return iterate(constraint, null, SourceTraceHelper::resolveInstanceOfConstraintClass);
+ }
+
+ @Override
+ public String getClassName(ConstraintDescriptor instanceOfConstraint) {
+ return iterate(instanceOfConstraint, null, SourceTraceHelper::getClassName);
+ }
+
+ @Override
+ public ValueProperty getClassNameProperty(ConstraintDescriptor instanceOfConstraint) {
+ return iterate(instanceOfConstraint, null, SourceTraceHelper::getClassNameProperty);
+ }
+
+ @Override
+ public Collection<? extends EObject> getValidConstraintSourceClasses(ConstraintDescriptor instanceOfConstraint, EObject sourceClass) {
+ return iterate(instanceOfConstraint, List.of(sourceClass), (h, c) -> h.getValidConstraintSourceClasses(c, sourceClass));
+ }
+
+ @Override
+ public IGenerator createGenerator(EObject sourceClass) {
+ return iterate(sourceClass, null, SourceTraceHelper::createGenerator);
+ }
+
+ @Override
+ public String getName(EObject sourceElement, NameKind kind) {
+ return iterate(sourceElement, null, (h, e) -> h.getName(e, kind));
+ }
+
+ @Override
+ public int getMultiplicity(EObject sourceProperty) {
+ return iterate(sourceProperty, DEFAULT_MULTIPLICITY, SourceTraceHelper::getMultiplicity);
+ }
+
+ @Override
+ public boolean isViewOf(View view, DataContextElement element) {
+ return iterate(view, false, (helper, v) -> helper.isViewOf(v, element));
+ }
+
+ @Override
+ public boolean isSectionFor(Section section, DataContextElement element) {
+ return iterate(section, false, (helper, s) -> helper.isSectionFor(s, element));
+ }
+
+ private <T, R> R iterate(T input, R defaultResult, BiFunction<SourceTraceHelper, ? super T, ? extends R> function) {
+ R result = null;
+
+ for (Iterator<SourceTraceHelper> iter = delegates.iterator(); (result == null || Objects.equals(result, defaultResult)) && iter.hasNext();) {
+ result = function.apply(iter.next(), input);
+ }
+
+ return result != null ? result : defaultResult;
+ }
+
+}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/trace/ExplicitSourceTraceHelper.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/trace/ExplicitSourceTraceHelper.java
new file mode 100644
index 00000000000..7bb6398d036
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/trace/ExplicitSourceTraceHelper.java
@@ -0,0 +1,132 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.properties.internal.trace;
+
+import java.util.List;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.ComposedSwitch;
+import org.eclipse.emf.ecore.util.Switch;
+import org.eclipse.papyrus.customization.properties.generation.generators.IGenerator;
+import org.eclipse.papyrus.infra.constraints.ConstraintDescriptor;
+import org.eclipse.papyrus.infra.constraints.ValueProperty;
+import org.eclipse.papyrus.infra.properties.contexts.Annotatable;
+import org.eclipse.papyrus.infra.properties.contexts.util.ContextAnnotations;
+import org.eclipse.papyrus.infra.properties.contexts.util.ContextsSwitch;
+
+/**
+ * Source trace helper that uses the explicit source reference in the annotation.
+ */
+class ExplicitSourceTraceHelper extends ComposedSwitch<EObject> implements SourceTraceHelper {
+
+ ExplicitSourceTraceHelper() {
+ super();
+
+ addSwitch(createContextsSwitch());
+ }
+
+ @Override
+ public EObject getSourceElement(EObject propertiesElement) {
+ return doSwitch(propertiesElement);
+ }
+
+ @Override
+ public List<? extends EObject> getNestedPackages(EObject sourcePackage) {
+ // Explicit tracing doesn't really help with this; we need metamodel-specific handling
+ return null;
+ }
+
+ @Override
+ public List<? extends EObject> getClasses(EObject sourcePackage) {
+ // Explicit tracing doesn't really help with this; we need metamodel-specific handling
+ return null;
+ }
+
+ @Override
+ public List<? extends EObject> getProperties(EObject sourceClass) {
+ // Explicit tracing doesn't really help with this; we need metamodel-specific handling
+ return null;
+ }
+
+ @Override
+ public boolean isPropertyRedefinition(EObject sourceProperty) {
+ // Explicit tracing doesn't really help with this; we need metamodel-specific handling
+ return false;
+ }
+
+ @Override
+ public List<? extends EObject> getSuperclasses(EObject sourceClass) {
+ // Explicit tracing doesn't really help with this; we need metamodel-specific handling
+ return null;
+ }
+
+ @Override
+ public ConstraintDescriptor createInstanceOfConstraint(EObject sourceClass) {
+ // Explicit tracing doesn't really help with this; we need metamodel-specific handling
+ return null;
+ }
+
+ @Override
+ public boolean isInstanceOfConstraint(ConstraintDescriptor constraint) {
+ // Explicit tracing doesn't really help with this; we need metamodel-specific handling
+ return false;
+ }
+
+ @Override
+ public String getClassName(ConstraintDescriptor instanceOfConstraint) {
+ // Explicit tracing doesn't really help with this; we need metamodel-specific handling
+ return null;
+ }
+
+ @Override
+ public ValueProperty getClassNameProperty(ConstraintDescriptor instanceOfConstraint) {
+ // Explicit tracing doesn't really help with this; we need metamodel-specific handling
+ return null;
+ }
+
+ @Override
+ public EObject resolveInstanceOfConstraintClass(ConstraintDescriptor constraint) {
+ // Explicit tracing doesn't really help with this; we need metamodel-specific handling
+ return null;
+ }
+
+ @Override
+ public IGenerator createGenerator(EObject sourceClass) {
+ // Explicit tracing doesn't really help with this; we need metamodel-specific handling
+ return null;
+ }
+
+ @Override
+ public String getName(EObject sourceElement, NameKind kind) {
+ // Explicit tracing doesn't really help with this; we need metamodel-specific handling
+ return null;
+ }
+
+ @Override
+ public int getMultiplicity(EObject sourceProperty) {
+ // Explicit tracing doesn't really help with this; we need metamodel-specific handling
+ return DEFAULT_MULTIPLICITY;
+ }
+
+ private Switch<EObject> createContextsSwitch() {
+ return new ContextsSwitch<>() {
+ public EObject caseAnnotatable(Annotatable object) {
+ return ContextAnnotations.getSourceModel(object);
+ }
+ };
+ }
+
+}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/trace/ImplicitEcoreSourceTraceHelper.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/trace/ImplicitEcoreSourceTraceHelper.java
new file mode 100644
index 00000000000..8357662947c
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/trace/ImplicitEcoreSourceTraceHelper.java
@@ -0,0 +1,244 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.properties.internal.trace;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.eclipse.emf.common.util.ECollections;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EAnnotation;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EClassifier;
+import org.eclipse.emf.ecore.ENamedElement;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.ETypedElement;
+import org.eclipse.emf.ecore.util.Switch;
+import org.eclipse.papyrus.customization.properties.generation.generators.EcoreGenerator;
+import org.eclipse.papyrus.customization.properties.generation.generators.IGenerator;
+import org.eclipse.papyrus.infra.constraints.ConstraintDescriptor;
+import org.eclipse.papyrus.infra.constraints.ConstraintsFactory;
+import org.eclipse.papyrus.infra.constraints.SimpleConstraint;
+import org.eclipse.papyrus.infra.constraints.ValueProperty;
+import org.eclipse.papyrus.infra.constraints.environment.ConstraintType;
+import org.eclipse.papyrus.infra.emf.utils.EMFHelper;
+import org.eclipse.papyrus.infra.properties.contexts.DataContextElement;
+import org.eclipse.papyrus.infra.properties.contexts.Property;
+import org.eclipse.uml2.common.util.UML2Util;
+
+import com.google.common.collect.Lists;
+
+/**
+ * Source trace helper that infers source traces from known constraint types that
+ * reference the source Ecore model.
+ */
+class ImplicitEcoreSourceTraceHelper extends SwitchingSourceTraceHelper {
+
+ private static final String EMF_INSTANCE_OF = "org.eclipse.papyrus.infra.constraints.constraints.EMFInstanceOfConstraint"; //$NON-NLS-1$
+
+ private static final String PROPERTY_NS_URI = "nsUri"; //$NON-NLS-1$
+ private static final String PROPERTY_CLASS_NAME = "className"; //$NON-NLS-1$
+
+ // As declared in UMLUtil class
+ private static final String ANNOTATION__REDEFINES = "redefines"; //$NON-NLS-1$
+
+ ImplicitEcoreSourceTraceHelper() {
+ super();
+ }
+
+ @Override
+ public List<? extends EObject> getNestedPackages(EObject sourcePackage) {
+ return sourcePackage instanceof EPackage ? ((EPackage) sourcePackage).getESubpackages() : null;
+ }
+
+ @Override
+ public List<? extends EObject> getClasses(EObject sourcePackage) {
+ return sourcePackage instanceof EPackage ? getEClasses((EPackage) sourcePackage) : null;
+ }
+
+ private List<EClass> getEClasses(EPackage ePackage) {
+ return ePackage.getEClassifiers().stream()
+ .filter(EClass.class::isInstance).map(EClass.class::cast)
+ .collect(Collectors.toList());
+ }
+
+ @Override
+ protected EObject getOwningPackage(EObject sourceElement) {
+ return sourceElement instanceof EClassifier
+ ? ((EClassifier) sourceElement).getEPackage()
+ : sourceElement instanceof EPackage
+ ? ((EPackage) sourceElement).getESuperPackage()
+ : null;
+ }
+
+ @Override
+ protected EObject getClass(EObject sourcePackage, DataContextElement contextElement) {
+ EClassifier result = sourcePackage instanceof EPackage ? ((EPackage) sourcePackage).getEClassifier(contextElement.getName()) : null;
+ return result instanceof EClass ? result : null;
+ }
+
+ @Override
+ public List<? extends EObject> getProperties(EObject sourceClass) {
+ return sourceClass instanceof EClass ? ((EClass) sourceClass).getEStructuralFeatures() : null;
+ }
+
+ @Override
+ public boolean isPropertyRedefinition(EObject sourceProperty) {
+ EAnnotation redefinesAnnotation = sourceProperty instanceof EStructuralFeature
+ ? ((EStructuralFeature) sourceProperty).getEAnnotation(ANNOTATION__REDEFINES)
+ : null;
+ EList<?> redefinitions = redefinesAnnotation == null ? ECollections.emptyEList() : redefinesAnnotation.getReferences();
+
+ return !redefinitions.isEmpty() && redefinitions.get(0) instanceof EStructuralFeature;
+ }
+
+ @Override
+ public List<? extends EObject> getSuperclasses(EObject sourceClass) {
+ return sourceClass instanceof EClass ? ((EClass) sourceClass).getESuperTypes() : null;
+ }
+
+ @Override
+ public ConstraintDescriptor createInstanceOfConstraint(EObject sourceClass) {
+ SimpleConstraint result = null;
+
+ if (sourceClass instanceof EClass) {
+ result = getConstraintType(EMF_INSTANCE_OF).map(type -> {
+ SimpleConstraint constraint = ConstraintsFactory.eINSTANCE.createSimpleConstraint();
+ constraint.setConstraintType(type);
+ setEClassifier(constraint, (EClass) sourceClass);
+ return constraint;
+ }).orElse(null);
+ }
+
+ return result;
+ }
+
+ @Override
+ public boolean isInstanceOfConstraint(ConstraintDescriptor constraint) {
+ return getConstraintType(constraint).map(ConstraintType::getConstraintClass).filter(EMF_INSTANCE_OF::equals).isPresent();
+ }
+
+ @Override
+ public EObject resolveInstanceOfConstraintClass(ConstraintDescriptor constraint) {
+ EObject result = null;
+
+ if (isInstanceOfConstraint(constraint)) {
+ result = asSimpleConstraint(constraint).map(simple -> {
+ String nsURI = getValue(simple, PROPERTY_NS_URI);
+ String className = getValue(simple, PROPERTY_CLASS_NAME);
+
+ EPackage ePackage = EMFHelper.getResourceSet(simple).getPackageRegistry().getEPackage(nsURI);
+ return (ePackage == null) ? null : ePackage.getEClassifier(className);
+ }).orElse(null);
+ }
+
+ return result;
+ }
+
+ @Override
+ public String getClassName(ConstraintDescriptor instanceOfConstraint) {
+ return asSimpleConstraint(instanceOfConstraint).map(simple -> getValue(simple, PROPERTY_CLASS_NAME)).orElse(null);
+ }
+
+ @Override
+ public ValueProperty getClassNameProperty(ConstraintDescriptor instanceOfConstraint) {
+ return asSimpleConstraint(instanceOfConstraint).map(simple -> getProperty(simple, PROPERTY_CLASS_NAME)).orElse(null);
+ }
+
+ @Override
+ public IGenerator createGenerator(EObject sourceClass) {
+ IGenerator result = null;
+
+ if (sourceClass instanceof EClassifier) {
+ result = new EcoreGenerator() {
+ {
+ ecorePackage = ((EClassifier) sourceClass).getEPackage();
+ listEPackages = Lists.newArrayList(ecorePackage);
+ }
+ };
+ }
+
+ return result;
+ }
+
+ @Override
+ protected EObject getProperty(EObject class_, Property contextProperty) {
+ return class_ instanceof EClass ? ((EClass) class_).getEStructuralFeature(contextProperty.getName()) : null;
+ }
+
+ @Override
+ public String getName(EObject sourceElement, NameKind kind) {
+ String result = null;
+
+ if (sourceElement instanceof ENamedElement) {
+ ENamedElement namedElement = (ENamedElement) sourceElement;
+ switch (kind) {
+ case QUALIFIED:
+ result = UML2Util.getQualifiedName(namedElement, "::"); //$NON-NLS-1$
+ break;
+ default:
+ result = namedElement.getName();
+ break;
+ }
+ }
+
+ return result;
+ }
+
+ @Override
+ public int getMultiplicity(EObject sourceProperty) {
+ return (sourceProperty instanceof ETypedElement) ? ((ETypedElement) sourceProperty).getUpperBound() : DEFAULT_MULTIPLICITY;
+ }
+
+ @Override
+ protected Switch<EObject> createConstraintsSwitch() {
+ return new ConstraintsDelegate() {
+ @Override
+ protected EObject constraintSwitch(SimpleConstraint constraint, String constraintClass) {
+ EObject result = null;
+
+ switch (constraintClass) {
+ case EMF_INSTANCE_OF:
+ result = getEClassifier(constraint);
+ break;
+ }
+
+ return result;
+ }
+ };
+ }
+
+ private EObject getEClassifier(SimpleConstraint constraint) {
+ EObject result = null;
+ String nsURI = getValue(constraint, PROPERTY_NS_URI);
+ String className = getValue(constraint, PROPERTY_CLASS_NAME);
+
+ if (nsURI != null && className != null) {
+ EPackage ePackage = EMFHelper.getResourceSet(constraint).getPackageRegistry().getEPackage(nsURI);
+ return ePackage != null ? ePackage.getEClassifier(className) : null;
+ }
+
+ return result;
+ }
+
+ private void setEClassifier(SimpleConstraint constraint, EClass eClass) {
+ setValue(constraint, PROPERTY_NS_URI, eClass.getEPackage().getNsURI());
+ setValue(constraint, PROPERTY_CLASS_NAME, eClass.getName());
+ }
+
+}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/trace/ImplicitUMLSourceTraceHelper.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/trace/ImplicitUMLSourceTraceHelper.java
new file mode 100644
index 00000000000..181457d7c3c
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/trace/ImplicitUMLSourceTraceHelper.java
@@ -0,0 +1,368 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.properties.internal.trace;
+
+import static java.util.function.Predicate.not;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.Switch;
+import org.eclipse.papyrus.customization.properties.generation.generators.IGenerator;
+import org.eclipse.papyrus.customization.properties.generation.generators.ProfileGenerator;
+import org.eclipse.papyrus.infra.constraints.ConstraintDescriptor;
+import org.eclipse.papyrus.infra.constraints.ConstraintsFactory;
+import org.eclipse.papyrus.infra.constraints.SimpleConstraint;
+import org.eclipse.papyrus.infra.constraints.ValueProperty;
+import org.eclipse.papyrus.infra.constraints.environment.ConstraintType;
+import org.eclipse.papyrus.infra.emf.utils.EMFHelper;
+import org.eclipse.papyrus.infra.properties.contexts.DataContextElement;
+import org.eclipse.papyrus.toolsmiths.validation.common.utils.LocalProfileIndex;
+import org.eclipse.uml2.common.util.UML2Util;
+import org.eclipse.uml2.uml.AttributeOwner;
+import org.eclipse.uml2.uml.Classifier;
+import org.eclipse.uml2.uml.DataType;
+import org.eclipse.uml2.uml.Element;
+import org.eclipse.uml2.uml.Enumeration;
+import org.eclipse.uml2.uml.MultiplicityElement;
+import org.eclipse.uml2.uml.NamedElement;
+import org.eclipse.uml2.uml.PrimitiveType;
+import org.eclipse.uml2.uml.Profile;
+import org.eclipse.uml2.uml.Property;
+import org.eclipse.uml2.uml.Stereotype;
+import org.eclipse.uml2.uml.Type;
+import org.eclipse.uml2.uml.UMLPackage;
+import org.eclipse.uml2.uml.resource.UMLResource;
+import org.eclipse.uml2.uml.util.UMLUtil;
+
+/**
+ * Source trace helper that infers source traces from known constraint types that
+ * reference the source UML model or profile.
+ */
+class ImplicitUMLSourceTraceHelper extends SwitchingSourceTraceHelper {
+
+ private static final String UML_INSTANCE_OF = "org.eclipse.papyrus.uml.properties.constraints.UmlInstanceOfConstraint"; //$NON-NLS-1$
+ private static final String HAS_STEREOTYPE = "org.eclipse.papyrus.uml.properties.constraints.HasStereotypeConstraint"; //$NON-NLS-1$
+
+ private static final String PROPERTY_STEREOTYPE_NAME = "stereotypeName"; //$NON-NLS-1$
+ private static final String PROPERTY_CLASS_NAME = "umlClassName"; //$NON-NLS-1$
+
+ private static final URI UML_METAMODEL_URI = URI.createURI(UMLResource.UML_METAMODEL_URI);
+
+ private final Set<String> constraintTypes = Set.of(UML_INSTANCE_OF, HAS_STEREOTYPE);
+
+ ImplicitUMLSourceTraceHelper() {
+ super();
+ }
+
+ @Override
+ public List<? extends EObject> getNestedPackages(EObject sourcePackage) {
+ return sourcePackage instanceof org.eclipse.uml2.uml.Package ? ((org.eclipse.uml2.uml.Package) sourcePackage).getNestedPackages() : null;
+ }
+
+ @Override
+ public List<? extends EObject> getClasses(EObject sourcePackage) {
+ return sourcePackage instanceof org.eclipse.uml2.uml.Package ? getOwnedClasses((org.eclipse.uml2.uml.Package) sourcePackage) : null;
+ }
+
+ private List<Classifier> getOwnedClasses(org.eclipse.uml2.uml.Package package_) {
+ return package_.getOwnedTypes().stream()
+ .filter(this::isClasslike).map(Classifier.class::cast)
+ .collect(Collectors.toList());
+ }
+
+ /**
+ * Query whether a {@code type} in an UML model or profile is a class-like concept that presents properties editable
+ * in the properties view. Actual UML {@linkplain org.eclipse.uml2.uml.Class classes} and complex {@linkplain DataType data types}
+ * are class-like.
+ *
+ * @param type
+ * an UML type
+ * @return whether it is class-like for properties editing purposes
+ */
+ private boolean isClasslike(Type type) {
+ return type instanceof org.eclipse.uml2.uml.Class || isComplexDataType(type);
+ }
+
+ private boolean isComplexDataType(Type type) {
+ return type instanceof DataType &&
+ !(type instanceof PrimitiveType) &&
+ !(type instanceof Enumeration);
+ }
+
+ @Override
+ protected EObject getOwningPackage(EObject sourceElement) {
+ return sourceElement instanceof org.eclipse.uml2.uml.Package
+ ? ((org.eclipse.uml2.uml.Package) sourceElement).getNestingPackage()
+ : sourceElement instanceof Element
+ ? ((Element) sourceElement).getNearestPackage()
+ : null;
+ }
+
+ @Override
+ protected EObject getClass(EObject sourcePackage, DataContextElement contextElement) {
+ return sourcePackage instanceof org.eclipse.uml2.uml.Package
+ ? ((org.eclipse.uml2.uml.Package) sourcePackage).getOwnedType(contextElement.getName(), false, UMLPackage.Literals.CLASS, false)
+ : null;
+ }
+
+ @Override
+ public List<? extends EObject> getProperties(EObject sourceClass) {
+ return sourceClass instanceof AttributeOwner
+ ? ((AttributeOwner) sourceClass).getOwnedAttributes().stream()
+ // But not the base element references! Those do not generate properties
+ .filter(not(this::isExtensionEnd))
+ .collect(Collectors.toList())
+ : null;
+ }
+
+ @Override
+ public boolean isPropertyRedefinition(EObject sourceProperty) {
+ return sourceProperty instanceof Property && !((Property) sourceProperty).getRedefinedProperties().isEmpty();
+ }
+
+ private boolean isExtensionEnd(org.eclipse.uml2.uml.Property property) {
+ return UMLPackage.Literals.EXTENSION.isInstance(property.getAssociation());
+ }
+
+ @Override
+ public List<? extends EObject> getSuperclasses(EObject sourceClass) {
+ return sourceClass instanceof Classifier
+ ? ((Classifier) sourceClass).getGenerals().stream().filter(this::isClasslike).collect(Collectors.toList())
+ : null;
+ }
+
+ @Override
+ public ConstraintDescriptor createInstanceOfConstraint(EObject sourceClass) {
+ SimpleConstraint result = null;
+ String constraintClassName = null;
+
+ if (sourceClass instanceof Stereotype) {
+ constraintClassName = HAS_STEREOTYPE;
+ } else if (sourceClass instanceof org.eclipse.uml2.uml.Class) {
+ constraintClassName = UML_INSTANCE_OF;
+ } else if (sourceClass instanceof DataType) {
+ // FIXME: This is what the QVTo transformation generates, but it is not correct. This should
+ // be fixed when the generator is fixed
+ constraintClassName = HAS_STEREOTYPE;
+ }
+
+ if (constraintClassName != null) {
+ result = getConstraintType(constraintClassName).map(type -> {
+ SimpleConstraint constraint = ConstraintsFactory.eINSTANCE.createSimpleConstraint();
+ constraint.setConstraintType(type);
+ setClassifier(constraint, (Classifier) sourceClass);
+ return constraint;
+ }).orElse(null);
+ }
+
+ return result;
+ }
+
+ @Override
+ public boolean isInstanceOfConstraint(ConstraintDescriptor constraint) {
+ return getConstraintType(constraint).map(ConstraintType::getConstraintClass).filter(constraintTypes::contains).isPresent();
+ }
+
+ @Override
+ public EObject resolveInstanceOfConstraintClass(ConstraintDescriptor constraint) {
+ EObject result = null;
+
+ if (isInstanceOfConstraint(constraint)) {
+ result = asSimpleConstraint(constraint).map(simple -> {
+ switch (simple.getConstraintType().getConstraintClass()) {
+ case UML_INSTANCE_OF:
+ return UMLPackage.eINSTANCE.getEClassifier(getValue(simple, PROPERTY_CLASS_NAME));
+ case HAS_STEREOTYPE:
+ String stereotypeName = getValue(simple, PROPERTY_STEREOTYPE_NAME);
+ return LocalProfileIndex.getInstance(constraint)
+ .filter(__ -> stereotypeName != null)
+ .map(index -> index.getStereotype(stereotypeName, simple))
+ .orElse(null);
+ default:
+ return null;
+ }
+ }).orElse(null);
+ }
+
+ return result;
+ }
+
+ @Override
+ public String getClassName(ConstraintDescriptor instanceOfConstraint) {
+ return asSimpleConstraint(instanceOfConstraint).map(simple -> {
+ switch (simple.getConstraintType().getConstraintClass()) {
+ case UML_INSTANCE_OF:
+ return getValue(simple, PROPERTY_CLASS_NAME);
+ case HAS_STEREOTYPE:
+ return getValue(simple, PROPERTY_STEREOTYPE_NAME);
+ default:
+ return null;
+ }
+ }).orElse(null);
+ }
+
+ @Override
+ public ValueProperty getClassNameProperty(ConstraintDescriptor instanceOfConstraint) {
+ return asSimpleConstraint(instanceOfConstraint).map(simple -> {
+ switch (simple.getConstraintType().getConstraintClass()) {
+ case UML_INSTANCE_OF:
+ return getProperty(simple, PROPERTY_CLASS_NAME);
+ case HAS_STEREOTYPE:
+ return getProperty(simple, PROPERTY_STEREOTYPE_NAME);
+ default:
+ return null;
+ }
+ }).orElse(null);
+ }
+
+ @Override
+ public Collection<? extends EObject> getValidConstraintSourceClasses(ConstraintDescriptor instanceOfConstraint, EObject sourceClass) {
+ return asSimpleConstraint(instanceOfConstraint).map(simple -> {
+ switch (simple.getConstraintType().getConstraintClass()) {
+ case UML_INSTANCE_OF:
+ return sourceClass instanceof Stereotype ? ((Stereotype) sourceClass).getAllExtendedMetaclasses() : List.of(sourceClass);
+ default:
+ return List.of(sourceClass);
+ }
+ }).orElse(List.of(sourceClass));
+ }
+
+ @Override
+ public IGenerator createGenerator(EObject sourceClass) {
+ IGenerator result = null;
+
+ Profile profile = null;
+
+ if (sourceClass instanceof Classifier) {
+ Classifier classifier = (Classifier) sourceClass;
+ if (classifier.getPackage() instanceof Profile) {
+ profile = (Profile) classifier.getPackage();
+ }
+ }
+
+ if (profile != null) {
+ Profile _profile = profile;
+ result = new ProfileGenerator() {
+ {
+ setProfile(_profile);
+ }
+ };
+ }
+
+ return result;
+ }
+
+ @Override
+ protected EObject getProperty(EObject class_, org.eclipse.papyrus.infra.properties.contexts.Property contextProperty) {
+ return class_ instanceof AttributeOwner ? ((AttributeOwner) class_).getOwnedAttribute(contextProperty.getName(), null) : null;
+ }
+
+ @Override
+ public String getName(EObject sourceElement, NameKind kind) {
+ String result = null;
+
+ if (sourceElement instanceof NamedElement) {
+ NamedElement namedElement = (NamedElement) sourceElement;
+ switch (kind) {
+ case QUALIFIED:
+ result = UML2Util.getQualifiedText(namedElement, UMLUtil.QualifiedTextProvider.DEFAULT);
+ break;
+ case CONSTRAINT:
+ if (namedElement instanceof Stereotype) {
+ // need the qualified name
+ result = UML2Util.getQualifiedText(namedElement, UMLUtil.QualifiedTextProvider.DEFAULT);
+ } else {
+ // UML Metaclasses need the simple name
+ result = namedElement.getName();
+ }
+ break;
+ default:
+ result = namedElement.getName();
+ break;
+ }
+ }
+
+ return result;
+ }
+
+ @Override
+ public int getMultiplicity(EObject sourceProperty) {
+ return (sourceProperty instanceof MultiplicityElement) ? ((MultiplicityElement) sourceProperty).upperBound() : DEFAULT_MULTIPLICITY;
+ }
+
+ @Override
+ protected Switch<EObject> createConstraintsSwitch() {
+ return new ConstraintsDelegate() {
+ @Override
+ protected EObject constraintSwitch(SimpleConstraint constraint, String constraintClass) {
+ EObject result = null;
+
+ switch (constraintClass) {
+ case HAS_STEREOTYPE:
+ result = getStereotype(constraint);
+ break;
+ case UML_INSTANCE_OF:
+ result = getUMLClass(constraint);
+ break;
+ }
+
+ return result;
+ }
+ };
+ }
+
+ private EObject getStereotype(SimpleConstraint constraint) {
+ EObject result = null;
+ String stereotypeName = getValue(constraint, PROPERTY_STEREOTYPE_NAME);
+
+ if (stereotypeName != null) {
+ result = LocalProfileIndex.getInstance(constraint)
+ .map(index -> index.getStereotype(stereotypeName, constraint))
+ .orElse(null);
+ }
+
+ return result;
+ }
+
+ private EObject getUMLClass(SimpleConstraint constraint) {
+ EObject result = null;
+ String className = getValue(constraint, PROPERTY_CLASS_NAME);
+
+ if (className != null) {
+ org.eclipse.uml2.uml.Package uml = UML2Util.load(EMFHelper.getResourceSet(constraint), UML_METAMODEL_URI, UMLPackage.Literals.PACKAGE);
+ result = (uml != null) ? uml.getOwnedType(className) : null;
+ }
+
+ return result;
+ }
+
+ private void setClassifier(SimpleConstraint constraint, Classifier classifier) {
+ switch (constraint.getConstraintType().getConstraintClass()) {
+ case HAS_STEREOTYPE:
+ setValue(constraint, PROPERTY_STEREOTYPE_NAME, classifier.getQualifiedName());
+ break;
+ default:
+ setValue(constraint, PROPERTY_CLASS_NAME, classifier.getName());
+ break;
+ }
+ }
+
+}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/trace/NameKind.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/trace/NameKind.java
new file mode 100644
index 00000000000..b4e74646b66
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/trace/NameKind.java
@@ -0,0 +1,32 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.properties.internal.trace;
+
+/**
+ * Enumeration of the kinds of names to extract from source model objects,
+ * which usually depend on the context in which the names are used.
+ */
+public enum NameKind {
+ /** The simplest name, usable primarily for information and not unique reference. */
+ SIMPLE,
+ /** A fully qualified name, for when it is known <em>a priori</em> that such is required. */
+ QUALIFIED,
+ /**
+ * A name used for reference in an 'is-a-kind-of' constraint. Some constraints
+ * need different kinds of qualification of a name than others.
+ */
+ CONSTRAINT,
+}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/trace/SourceTraceHelper.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/trace/SourceTraceHelper.java
new file mode 100644
index 00000000000..66e1f326bf2
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/trace/SourceTraceHelper.java
@@ -0,0 +1,150 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.properties.internal.trace;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Objects;
+import java.util.function.Predicate;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.papyrus.customization.properties.generation.generators.IGenerator;
+import org.eclipse.papyrus.customization.properties.generation.layout.ILayoutGenerator;
+import org.eclipse.papyrus.infra.constraints.ConstraintDescriptor;
+import org.eclipse.papyrus.infra.constraints.ConstraintsPackage;
+import org.eclipse.papyrus.infra.constraints.ValueProperty;
+import org.eclipse.papyrus.infra.properties.contexts.DataContextElement;
+import org.eclipse.papyrus.infra.properties.contexts.Property;
+import org.eclipse.papyrus.infra.properties.contexts.Section;
+import org.eclipse.papyrus.infra.properties.contexts.View;
+import org.eclipse.papyrus.infra.properties.ui.CompositeWidget;
+import org.eclipse.papyrus.infra.properties.ui.PropertyEditor;
+import org.eclipse.papyrus.infra.tools.util.Iterators2;
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.util.PropertiesCache;
+
+/**
+ * Protocol for a helper that infers the source model element of a properties element
+ * for properties elements that do not have explicit source annotations.
+ */
+public interface SourceTraceHelper {
+
+ int DEFAULT_MULTIPLICITY = (int) ConstraintsPackage.Literals.DISPLAY_UNIT__ELEMENT_MULTIPLICITY.getDefaultValue();;
+
+ EObject getSourceElement(EObject propertiesElement);
+
+ List<? extends EObject> getNestedPackages(EObject sourcePackage);
+
+ List<? extends EObject> getClasses(EObject sourcePackage);
+
+ List<? extends EObject> getProperties(EObject sourceClass);
+
+ boolean isPropertyRedefinition(EObject sourceProperty);
+
+ List<? extends EObject> getSuperclasses(EObject sourceClass);
+
+ ConstraintDescriptor createInstanceOfConstraint(EObject sourceClass);
+
+ boolean isInstanceOfConstraint(ConstraintDescriptor constraint);
+
+ EObject resolveInstanceOfConstraintClass(ConstraintDescriptor constraint);
+
+ /**
+ * Extract the class name referenced by an <em>Instance Of</em> constraint.
+ *
+ * @param instanceOfConstraint
+ * a constraint recognized as an <em>Instance Of</em> by the
+ * {@link #isInstanceOfConstraint(ConstraintDescriptor)} API
+ *
+ * @return referenced class name
+ */
+ String getClassName(ConstraintDescriptor instanceOfConstraint);
+
+ /**
+ * Query the property of an <em>Instance Of</em> constraint that specifies the class name.
+ *
+ * @param instanceOfConstraint
+ * a constraint recognized as an <em>Instance Of</em> by the
+ * {@link #isInstanceOfConstraint(ConstraintDescriptor)} API
+ *
+ * @return the class name property
+ */
+ ValueProperty getClassNameProperty(ConstraintDescriptor instanceOfConstraint);
+
+ /**
+ * Given the source class that the owner of a constraint traces to, resolve the
+ * class or classes that is/are valid source(s) according to the semantics of
+ * the constraint. This accounts, for example, for metaclass extensions of UML
+ * stereotypes (in which case the use must choose one to reference in the
+ * constraint from multiple quick fixes offered).
+ *
+ * @param instanceOfConstraint
+ * a constraint recognized as an <em>Instance Of</em> by the
+ * {@link #isInstanceOfConstraint(ConstraintDescriptor)} API
+ * @param sourceClass
+ * the traced source class of the constraint's owner
+ * @return the resolved source class according to the semantics of the constraint
+ */
+ default Collection<? extends EObject> getValidConstraintSourceClasses(ConstraintDescriptor instanceOfConstraint, EObject sourceClass) {
+ return List.of(sourceClass);
+ }
+
+ /**
+ * Create a dummy generator for the given source model class that is used to satisfies the requirements
+ * of an {@link ILayoutGenerator} that is used to generate the properties editor layout for the class.
+ *
+ * @param sourceClass
+ * a class in the source model
+ * @return a generator that is minimally configured to support the {@link ILayoutGenerator}
+ */
+ IGenerator createGenerator(EObject sourceClass);
+
+ /**
+ * Get the {@linkplain NameKind#SIMPLE simple name} of a source model element.
+ *
+ * @param sourceElement
+ * a source model element
+ * @return its simple name
+ */
+ default String getName(EObject sourceElement) {
+ return getName(sourceElement, NameKind.SIMPLE);
+ }
+
+ String getName(EObject sourceElement, NameKind kind);
+
+ int getMultiplicity(EObject sourceProperty);
+
+ default boolean isViewOf(View view, DataContextElement element) {
+ PropertiesCache cache = PropertiesCache.getInstance(view);
+ return view.getDatacontexts().contains(element)
+ || view.getSections().stream().anyMatch(cache.getSections(element)::contains);
+ }
+
+ default boolean isSectionFor(Section section, DataContextElement element) {
+ boolean result = false;
+
+ CompositeWidget widget = section.getWidget();
+ if (widget != null && !widget.eIsProxy()) {
+ result = Iterators2.stream(Iterators2.filter(widget.eAllContents(), PropertyEditor.class))
+ .map(pe -> pe.getProperty())
+ .filter(Objects::nonNull)
+ .map(Property::getContextElement)
+ .anyMatch(Predicate.isEqual(element));
+ }
+
+ return result;
+ }
+
+}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/trace/SwitchingSourceTraceHelper.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/trace/SwitchingSourceTraceHelper.java
new file mode 100644
index 00000000000..63858fc30a2
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/trace/SwitchingSourceTraceHelper.java
@@ -0,0 +1,354 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.properties.internal.trace;
+
+import java.util.Iterator;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.function.Function;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.ComposedSwitch;
+import org.eclipse.emf.ecore.util.Switch;
+import org.eclipse.papyrus.infra.constraints.CompositeConstraint;
+import org.eclipse.papyrus.infra.constraints.ConstraintDescriptor;
+import org.eclipse.papyrus.infra.constraints.ConstraintsFactory;
+import org.eclipse.papyrus.infra.constraints.ConstraintsPackage;
+import org.eclipse.papyrus.infra.constraints.ReferenceProperty;
+import org.eclipse.papyrus.infra.constraints.SimpleConstraint;
+import org.eclipse.papyrus.infra.constraints.ValueProperty;
+import org.eclipse.papyrus.infra.constraints.environment.ConstraintType;
+import org.eclipse.papyrus.infra.constraints.util.ConstraintsSwitch;
+import org.eclipse.papyrus.infra.properties.contexts.AbstractSection;
+import org.eclipse.papyrus.infra.properties.contexts.Context;
+import org.eclipse.papyrus.infra.properties.contexts.ContextsPackage;
+import org.eclipse.papyrus.infra.properties.contexts.DataContextElement;
+import org.eclipse.papyrus.infra.properties.contexts.DataContextPackage;
+import org.eclipse.papyrus.infra.properties.contexts.Property;
+import org.eclipse.papyrus.infra.properties.contexts.Section;
+import org.eclipse.papyrus.infra.properties.contexts.View;
+import org.eclipse.papyrus.infra.properties.contexts.util.ContextContentTreeIterator;
+import org.eclipse.papyrus.infra.properties.contexts.util.ContextsSwitch;
+import org.eclipse.papyrus.infra.properties.ui.CompositeWidget;
+import org.eclipse.papyrus.infra.properties.ui.PropertyEditor;
+import org.eclipse.papyrus.infra.properties.ui.UiPackage;
+import org.eclipse.papyrus.infra.properties.ui.Widget;
+import org.eclipse.papyrus.infra.properties.ui.runtime.PropertiesRuntime;
+import org.eclipse.papyrus.infra.properties.ui.util.UiSwitch;
+import org.eclipse.papyrus.infra.tools.util.Iterators2;
+import org.eclipse.papyrus.infra.tools.util.RecursionGuard;
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.util.PropertiesCache;
+
+import com.google.common.collect.Iterables;
+
+/**
+ * Abstract switch for common cases of inferring source traces from constraints and other
+ * relationships in the properties model.
+ */
+abstract class SwitchingSourceTraceHelper extends ComposedSwitch<EObject> implements SourceTraceHelper {
+
+ SwitchingSourceTraceHelper() {
+ super();
+
+ addSwitch(createContextsSwitch());
+ addSwitch(createConstraintsSwitch());
+ }
+
+ protected final EObject composedSwitch(EObject object) {
+ return super.doSwitch(object);
+ }
+
+ @Override
+ public final EObject getSourceElement(EObject propertiesElement) {
+ return composedSwitch(propertiesElement);
+ }
+
+ protected Switch<EObject> createContextsSwitch() {
+ return new ContextsDelegate();
+ }
+
+ protected Switch<EObject> createConstraintsSwitch() {
+ return new ConstraintsDelegate();
+ }
+
+ protected ValueProperty getProperty(SimpleConstraint constraint, String propertyName) {
+ return (ValueProperty) constraint.getProperties(propertyName, false, ConstraintsPackage.Literals.VALUE_PROPERTY);
+ }
+
+ protected String getValue(SimpleConstraint constraint, String propertyName) {
+ ValueProperty result = getProperty(constraint, propertyName);
+ return result != null ? result.getValue() : null;
+ }
+
+ protected void setValue(SimpleConstraint constraint, String propertyName, String value) {
+ ValueProperty property = ConstraintsFactory.eINSTANCE.createValueProperty();
+ property.setName(propertyName);
+ property.setValue(value);
+ constraint.getProperties().add(property);
+ }
+
+ protected EObject getReference(SimpleConstraint constraint, String propertyName) {
+ ReferenceProperty result = (ReferenceProperty) constraint.getProperties(propertyName, false, ConstraintsPackage.Literals.REFERENCE_PROPERTY);
+ return result != null ? result.getValue() : null;
+ }
+
+ protected void setReference(SimpleConstraint constraint, String propertyName, EObject reference) {
+ ReferenceProperty property = ConstraintsFactory.eINSTANCE.createReferenceProperty();
+ property.setName(propertyName);
+ property.setValue(reference);
+ constraint.getProperties().add(property);
+ }
+
+ protected Optional<ConstraintType> getConstraintType(String className) {
+ return Optional.ofNullable(Iterables.getFirst(PropertiesRuntime.getConfigurationManager().getContexts(), null))
+ .map(context -> PropertiesCache.getInstance(context).getConstraintTypes(context))
+ .flatMap(constraintTypes -> constraintTypes.stream()
+ .filter(type -> className.equals(type.getConstraintClass()))
+ .findAny());
+ }
+
+ protected Optional<ConstraintType> getConstraintType(ConstraintDescriptor constraint) {
+ ConstraintType result = null;
+
+ if (constraint instanceof SimpleConstraint) {
+ SimpleConstraint simple = (SimpleConstraint) constraint;
+ result = simple.getConstraintType();
+ }
+
+ return Optional.ofNullable(result);
+ }
+
+ protected Optional<SimpleConstraint> asSimpleConstraint(ConstraintDescriptor constraint) {
+ return Optional.ofNullable(constraint).filter(SimpleConstraint.class::isInstance).map(SimpleConstraint.class::cast);
+ }
+
+ protected abstract EObject getOwningPackage(EObject sourceElement);
+
+ protected abstract EObject getClass(EObject package_, DataContextElement contextElement);
+
+ protected abstract EObject getProperty(EObject class_, Property contextProperty);
+
+ protected EObject drillDown(Iterable<? extends EObject> nested) {
+ EObject result = null;
+ for (Iterator<? extends EObject> iter = nested.iterator(); result == null && iter.hasNext();) {
+ result = composedSwitch(iter.next());
+ }
+ return result;
+ }
+
+ protected EObject drillDown(Iterable<? extends EObject> nested, Function<? super EObject, ? extends EObject> resultFunction) {
+ EObject result = null;
+ for (Iterator<? extends EObject> iter = nested.iterator(); result == null && iter.hasNext();) {
+ EObject next = composedSwitch(iter.next());
+ if (next != null) {
+ result = resultFunction.apply(next);
+ }
+ }
+ return result;
+ }
+
+ //
+ // Nested types
+ //
+
+ protected class ContextsDelegate extends ContextsSwitch<EObject> {
+
+ /**
+ * A set of objects that are currently engaged in recursion up
+ * the tree to try to infer a trace for themselves. This is used
+ * to cut off unbounded recursion back down the tree again through
+ * these objects.
+ */
+ private final RecursionGuard<EObject> upwardRecursionGuard = new RecursionGuard<>();
+
+ @Override
+ public EObject caseAbstractSection(AbstractSection object) {
+ return drillDown(object.getConstraints());
+ }
+
+ @Override
+ public EObject caseSection(Section object) {
+ EObject result = caseAbstractSection(object);
+
+ if (result == null) {
+ // Check the view(s) referencing the section
+ result = drillDown(object.getViews());
+ }
+
+ return result;
+ }
+
+ @Override
+ public EObject caseView(View object) {
+ return drillDown(object.getConstraints());
+ }
+
+ @Override
+ public EObject caseDataContextPackage(DataContextPackage object) {
+ // Find the source class of any context-element that provides one, then get its package
+ return drillDown(object.getElements(), SwitchingSourceTraceHelper.this::getOwningPackage);
+ }
+
+ @Override
+ public EObject caseDataContextElement(DataContextElement object) {
+ EObject result = null;
+ PropertiesCache cache = PropertiesCache.getInstance(object);
+
+ if (!object.getProperties().isEmpty()) {
+ // Find any property that has an editor in some section, that we can trace via an instance-of constraint,
+ // and get that constraint class if it has the same name as the data-context element
+ for (Property property : object.getProperties()) {
+ result = cache.getViews(object).stream().filter(view -> hasEditor(view, property))
+ .map(SwitchingSourceTraceHelper.this::getSourceElement)
+ .filter(Objects::nonNull)
+ .filter(sourceClass -> Objects.equals(getName(sourceClass), object.getName()))
+ .findAny().orElse(null);
+
+ if (result != null) {
+ break;
+ }
+ }
+ }
+
+ if (result == null) {
+ // Didn't get a result from properties? Maybe there are none or they do not resolve.
+ // See if we can trace the containing package by any means and look up the class by name
+ EObject container = object.eContainer();
+ try (RecursionGuard<EObject>.Gate gate = upwardRecursionGuard.guardIfAny(DataContextPackage.class::isInstance, container)) {
+ if (gate.isOpen() && !(container instanceof Context)) {
+ EObject sourcePackage = composedSwitch(container);
+ if (sourcePackage != null) {
+ result = SwitchingSourceTraceHelper.this.getClass(sourcePackage, object);
+ }
+ }
+ }
+ }
+
+ return result;
+ }
+
+ private boolean hasEditor(View view, Property property) {
+ boolean result = false;
+
+ Iterator<PropertyEditor> editors = Iterators2.filter(new ContextContentTreeIterator(view.getSections()), PropertyEditor.class);
+ while (!result && editors.hasNext()) {
+ result = editors.next().getProperty() == property;
+ }
+
+ return result;
+ }
+
+ @Override
+ public EObject caseProperty(Property object) {
+ DataContextElement owner = object.getContextElement();
+ if (owner == null) {
+ // No use looking up a property that isn't in the data context (which
+ // then should actually be an instance of the UnknownProperty class)
+ return null;
+ }
+
+ // Look for any section that has a widget referencing this property
+ EObject result = null;
+
+ PropertiesCache cache = PropertiesCache.getInstance(object);
+ for (Iterator<PropertyEditor> iter = cache.<PropertyEditor> getReferencers(object, UiPackage.Literals.PROPERTY_EDITOR__PROPERTY).iterator(); result == null && iter.hasNext();) {
+ Widget rootWidget = getRootWidget(iter.next());
+ Section section = getSection(rootWidget);
+ if (section != null) {
+ EObject sourceClass = composedSwitch(section);
+ // Check that we're not finding an inherited property
+ if (sourceClass != null && Objects.equals(getName(sourceClass), owner.getName())) {
+ result = getProperty(sourceClass, object);
+ }
+ }
+ }
+
+ if (result == null) {
+ // Maybe we can trace the containing context and find a matching property?
+ try (RecursionGuard<EObject>.Gate gate = upwardRecursionGuard.guard(owner)) {
+ if (gate.isOpen()) {
+ EObject sourceClass = composedSwitch(owner);
+ if (sourceClass != null) {
+ result = getProperty(sourceClass, object);
+ }
+ }
+ }
+
+ }
+
+ return result;
+ }
+
+ Widget getRootWidget(Widget widget) {
+ Widget result = widget;
+
+ while (result != null && result.eContainer() instanceof Widget) {
+ result = (Widget) result.eContainer();
+ }
+
+ return result;
+ }
+
+ Section getSection(Widget widget) {
+ PropertiesCache cache = PropertiesCache.getInstance(widget);
+ EList<Section> sections = cache.getReferencers(widget, ContextsPackage.Literals.SECTION__WIDGET);
+ return sections.isEmpty() ? null : sections.get(0);
+ }
+
+ }
+
+ protected class ConstraintsDelegate extends ConstraintsSwitch<EObject> {
+
+ @Override
+ public EObject caseCompositeConstraint(CompositeConstraint object) {
+ return drillDown(object.getConstraints());
+ }
+
+ @Override
+ public EObject caseSimpleConstraint(SimpleConstraint object) {
+ EObject result = null;
+ ConstraintType type = object.getConstraintType();
+
+ if (type.getConstraintClass() != null) {
+ result = constraintSwitch(object, type.getConstraintClass());
+ }
+
+ return result;
+ }
+
+ protected EObject constraintSwitch(SimpleConstraint constraint, String constraintClass) {
+ return null;
+ }
+
+ }
+
+ protected class UIDelegate extends UiSwitch<EObject> {
+
+ @Override
+ public EObject caseCompositeWidget(CompositeWidget object) {
+ return drillDown(object.getWidgets());
+ }
+
+ @Override
+ public EObject casePropertyEditor(PropertyEditor object) {
+
+ return super.casePropertyEditor(object);
+ }
+
+ }
+
+}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/util/PropertiesCache.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/util/PropertiesCache.java
new file mode 100644
index 00000000000..fc4441b8719
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/util/PropertiesCache.java
@@ -0,0 +1,252 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.properties.internal.util;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.eclipse.emf.common.notify.Notifier;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.TreeIterator;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.common.util.UniqueEList;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.EcoreFactory;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.papyrus.infra.constraints.environment.ConstraintType;
+import org.eclipse.papyrus.infra.emf.utils.EMFHelper;
+import org.eclipse.papyrus.infra.properties.contexts.Context;
+import org.eclipse.papyrus.infra.properties.contexts.DataContextElement;
+import org.eclipse.papyrus.infra.properties.contexts.DataContextPackage;
+import org.eclipse.papyrus.infra.properties.contexts.Section;
+import org.eclipse.papyrus.infra.properties.contexts.Tab;
+import org.eclipse.papyrus.infra.properties.contexts.View;
+import org.eclipse.papyrus.infra.properties.environment.Environment;
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.trace.ComposedSourceTraceHelper;
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.trace.SourceTraceHelper;
+import org.eclipse.uml2.common.util.CacheAdapter;
+
+import com.google.common.collect.ImmutableList;
+
+/**
+ * Cache of derived information about <em>Properties View</em> models.
+ */
+public class PropertiesCache {
+
+ static final PropertiesCache INSTANCE = new PropertiesCache();
+
+ private final Map<?, ?> cacheMisses;
+ private final Map<?, ?> defaults;
+
+ private final Object contextKey = URI.createURI("PropertiesCache:context"); //$NON-NLS-1$
+ private final Object sourceKey = URI.createURI("PropertiesCache:source"); //$NON-NLS-1$
+ private final Object nameKey = URI.createURI("PropertiesCache:name"); //$NON-NLS-1$
+ private final Object nestedPackagesKey = URI.createURI("PropertiesCache:nestedPackages"); //$NON-NLS-1$
+ private final Object classesKey = URI.createURI("PropertiesCache:classes"); //$NON-NLS-1$
+ private final Object propertiesKey = URI.createURI("PropertiesCache:properties"); //$NON-NLS-1$
+ private final Object isPropertyRedefinitionKey = URI.createURI("PropertiesCache:isPropertyRedefinition"); //$NON-NLS-1$
+ private final Object superclassesKey = URI.createURI("PropertiesCache:superclasses"); //$NON-NLS-1$
+ private final Object viewsKey = URI.createURI("PropertiesCache:views"); //$NON-NLS-1$
+ private final Object sectionsKey = URI.createURI("PropertiesCache:sections"); //$NON-NLS-1$
+ private final Object constraintTypesKey = URI.createURI("constraintTypes"); //$NON-NLS-1$
+
+ private final Object allDataContextElementsKey = new Object();
+
+ private final SourceTraceHelper sourceTraceHelper = new ComposedSourceTraceHelper();
+
+ private PropertiesCache() {
+ super();
+
+ EObject dummy = EcoreFactory.eINSTANCE.createEObject();
+
+ cacheMisses = Map.of(sourceKey, dummy, classesKey, List.of(dummy), propertiesKey, List.of(dummy));
+
+ // Don't need null defaults (e.g. for sourceKey) in the map
+ defaults = Map.of(classesKey, List.of(), propertiesKey, List.of());
+ }
+
+ public static PropertiesCache getInstance(Notifier notifier) {
+ return INSTANCE;
+ }
+
+ private static CacheAdapter getCacheAdapter(EObject object) {
+ // As generated by the Properties model
+ return CacheAdapter.getInstance();
+ }
+
+ public Context getContext(EObject contextElement) {
+ return getOrCache(contextElement, contextKey, e -> {
+ EObject root = EcoreUtil.getRootContainer(e);
+ return root instanceof Context ? (Context) root : null;
+ });
+ }
+
+ public EObject getSourceElement(EObject propertiesElement) {
+ return getOrCache(propertiesElement, sourceKey, sourceTraceHelper::getSourceElement);
+ }
+
+ public String getName(EObject sourceElement) {
+ return getOrCache(sourceElement, nameKey, sourceTraceHelper::getName);
+ }
+
+ public List<? extends EObject> getNestedPackages(EObject sourcePackage) {
+ return getOrCache(sourcePackage, nestedPackagesKey, sourceTraceHelper::getNestedPackages);
+ }
+
+ public List<? extends EObject> getClasses(EObject sourcePackage) {
+ return getOrCache(sourcePackage, classesKey, sourceTraceHelper::getClasses);
+ }
+
+ public List<DataContextElement> getDataContextElements(Context context) {
+ return getOrCache(context, allDataContextElementsKey, this::getAllDataContextElements);
+ }
+
+ private List<DataContextElement> getAllDataContextElements(Context context) {
+ ImmutableList.Builder<DataContextElement> result = ImmutableList.builder();
+ ResourceSet rset = EMFHelper.getResourceSet(context);
+
+ for (TreeIterator<?> contents = rset.getAllContents(); contents.hasNext();) {
+ Object next = contents.next();
+ if (next instanceof DataContextElement) {
+ result.add((DataContextElement) next);
+ } else if (next instanceof Tab || next instanceof View) {
+ contents.prune();
+ }
+ }
+
+ return result.build();
+ }
+
+ public List<View> getViews(DataContextElement element) {
+ return getOrCache(element, viewsKey, this::getViewsOf);
+ }
+
+ private List<View> getViewsOf(DataContextElement element) {
+ return allViews(getContext(element))
+ .filter(view -> sourceTraceHelper.isViewOf(view, element))
+ .collect(ImmutableList.toImmutableList());
+ }
+
+ private Stream<View> allViews(Context context) {
+ return context.getViews().stream();
+ }
+
+ public List<Section> getSections(DataContextElement element) {
+ return getOrCache(element, sectionsKey, this::getSectionsOf);
+ }
+
+ private List<Section> getSectionsOf(DataContextElement element) {
+ return allSections(getContext(element))
+ .filter(section -> sourceTraceHelper.isSectionFor(section, element))
+ .collect(ImmutableList.toImmutableList());
+ }
+
+ private Stream<Section> allSections(Context context) {
+ return context.getTabs().stream()
+ .map(Tab::getSections).flatMap(Collection::stream);
+ }
+
+ public Optional<DataContextElement> getDataContextElement(DataContextPackage package_, EObject sourceClass) {
+ Context context = getContext(package_);
+ return getDataContextElements(context).stream()
+ .filter(element -> getSourceElement(element) == sourceClass)
+ .findAny();
+ }
+
+ public List<? extends EObject> getProperties(EObject sourceClass) {
+ return getOrCache(sourceClass, propertiesKey, sourceTraceHelper::getProperties);
+ }
+
+ public boolean isPropertyRedefinition(EObject sourceProperty) {
+ return getOrCache(sourceProperty, isPropertyRedefinitionKey, sourceTraceHelper::isPropertyRedefinition);
+ }
+
+ public List<? extends EObject> getSuperclasses(EObject sourceClass) {
+ return getOrCache(sourceClass, superclassesKey, sourceTraceHelper::getSuperclasses);
+ }
+
+ public List<ConstraintType> getConstraintTypes(Context context) {
+ return getOrCache(context, constraintTypesKey, this::getAllConstraintTypes);
+ }
+
+ private List<ConstraintType> getAllConstraintTypes(Context context) {
+ ImmutableList.Builder<ConstraintType> result = ImmutableList.builder();
+
+ ResourceSet rset = EMFHelper.getResourceSet(context);
+ for (Resource resource : rset.getResources()) {
+ for (EObject root : resource.getContents()) {
+ if (root instanceof Environment) {
+ result.addAll(((Environment) root).getConstraintTypes());
+ }
+ }
+ }
+
+ return result.build();
+ }
+
+ private <T extends EObject, V> V getOrCache(T object, Object key, Function<? super T, V> computer) {
+ CacheAdapter cache = getCacheAdapter(object);
+
+ @SuppressWarnings("unchecked")
+ V result = (V) cache.get(object, key);
+ @SuppressWarnings("unchecked")
+ V cacheMiss = (V) cacheMisses.get(key);
+
+ if (result == null) {
+ result = computer.apply(object);
+ if (result == null) {
+ result = cacheMiss;
+ }
+ cache.put(object, key, result);
+ }
+
+ if (result == cacheMiss) {
+ @SuppressWarnings("unchecked")
+ V defaultValue = (V) defaults.get(key);
+ result = defaultValue;
+ }
+
+ return result;
+ }
+
+ @SuppressWarnings("unchecked")
+ public <T extends EObject> EList<T> getReferencers(EObject object, EReference reference) {
+ return (EList<T>) getCacheAdapter(object).getInverseReferences(object).stream()
+ .filter(setting -> setting.getEStructuralFeature() == reference)
+ .map(EStructuralFeature.Setting::getEObject)
+ .collect(Collectors.toCollection(UniqueEList.FastCompare::new));
+ }
+
+ public Collection<EStructuralFeature.Setting> getInverseReferences(EObject object, EReference reference) {
+ return getCacheAdapter(object).getInverseReferences(object).stream()
+ .filter(setting -> setting.getEStructuralFeature() == reference)
+ .collect(Collectors.toCollection(UniqueEList.FastCompare::new));
+ }
+
+ public Collection<EStructuralFeature.Setting> getInverseReferences(EObject object) {
+ return getCacheAdapter(object).getInverseReferences(object);
+ }
+
+}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/util/PropertiesContextDecoratorAdapterFactory.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/util/PropertiesContextDecoratorAdapterFactory.java
new file mode 100644
index 00000000000..262db31c0e0
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/util/PropertiesContextDecoratorAdapterFactory.java
@@ -0,0 +1,157 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.properties.internal.util;
+
+import java.util.function.Function;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notifier;
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.edit.provider.DecoratorAdapterFactory;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.IItemProviderDecorator;
+import org.eclipse.emf.edit.provider.ItemProviderDecorator;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.papyrus.infra.properties.contexts.DataContextElement;
+import org.eclipse.papyrus.infra.properties.contexts.Property;
+import org.eclipse.papyrus.infra.properties.contexts.UnknownProperty;
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.messages.Messages;
+import org.eclipse.uml2.uml.NamedElement;
+
+/**
+ * Decorate the item providers for the <em>Properties Context</em> model to make object labels
+ * better suited for problem messages.
+ */
+public class PropertiesContextDecoratorAdapterFactory extends DecoratorAdapterFactory {
+
+ public PropertiesContextDecoratorAdapterFactory(AdapterFactory decoratedAdapterFactory) {
+ super(decoratedAdapterFactory);
+ }
+
+ @Override
+ protected IItemProviderDecorator createItemProviderDecorator(Object target, Object type) {
+ return new ContextItemProviderDecorator(getDecoratedAdapterFactory());
+ }
+
+ //
+ // Nested types
+ //
+
+ private static class ContextItemProviderDecorator extends ItemProviderDecorator implements Adapter, IItemLabelProvider {
+
+ ContextItemProviderDecorator(AdapterFactory adapterFactory) {
+ super(adapterFactory);
+ }
+
+ @Override
+ public String getText(Object object) {
+ String result = null;
+ if (object instanceof DataContextElement || object instanceof Property) {
+ result = getQualifiedName(object);
+ }
+
+ if (result == null) {
+ result = super.getText(object);
+ }
+
+ if (object instanceof UnknownProperty) {
+ // Humansneed a bit more context to locate these objects that are contained in XWT files
+ result = decorateUnknownPropertyText((UnknownProperty) object, result);
+ }
+
+ return result;
+ }
+
+ String getQualifiedName(Object contextElement) {
+ StringBuilder result = new StringBuilder();
+ qualifiedName(contextElement, result);
+
+ if (result != null) {
+ EObject object = (EObject) contextElement;
+ String key = String.format("_UI_%s_type", object.eClass().getName()); //$NON-NLS-1$
+ String type = ((ResourceLocator) getDecoratedItemProvider()).getString(key);
+ result.insert(0, " "); //$NON-NLS-1$
+ result.insert(0, type);
+ }
+
+ return result == null ? null : result.toString();
+ }
+
+ private StringBuilder qualifiedName(Object contextElement, StringBuilder buf) {
+ if (contextElement instanceof Property) {
+ Property property = (Property) contextElement;
+ return qualifiedName(property, buf, Property::getContextElement, Property::getName);
+ } else if (contextElement instanceof DataContextElement) {
+ DataContextElement element = (DataContextElement) contextElement;
+ return qualifiedName(element, buf, DataContextElement::getPackage, DataContextElement::getName);
+ }
+
+ return null;
+ }
+
+ private <T> StringBuilder qualifiedName(T contextElement, StringBuilder buf, Function<? super T, ?> ownerFunction, Function<? super T, String> nameFunction) {
+ Object owner = ownerFunction.apply(contextElement);
+ if (owner != null) {
+ qualifiedName(owner, buf);
+ }
+ if (buf == null) {
+ // There is no qualified name
+ return null;
+ }
+
+ if (buf.length() > 0) {
+ buf.append(NamedElement.SEPARATOR);
+ }
+ String name = nameFunction.apply(contextElement);
+ if (name == null) {
+ // There is no qualified name
+ return null;
+ }
+
+ buf.append(name);
+ return buf;
+ }
+
+ String decorateUnknownPropertyText(UnknownProperty unknownProperty, String text) {
+ String result = text;
+
+ Resource resource = unknownProperty.eResource();
+ URI uri = resource == null ? null : resource.getURI();
+ if (uri != null) {
+ result = NLS.bind(Messages.PropertiesContextDecoratorAdapterFactory_0, text, uri.lastSegment());
+ }
+
+ return result;
+ }
+
+ @Override
+ public Notifier getTarget() {
+ // I don't track any target
+ return null;
+ }
+
+ @Override
+ public void setTarget(Notifier newTarget) {
+ // I don't track any target
+ }
+
+ }
+
+}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/util/PropertyTypeHelper.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/util/PropertyTypeHelper.java
new file mode 100644
index 00000000000..a1758afe160
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/util/PropertyTypeHelper.java
@@ -0,0 +1,247 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.properties.internal.util;
+
+import java.util.Map;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EDataType;
+import org.eclipse.emf.ecore.EEnum;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.ETypedElement;
+import org.eclipse.emf.ecore.EcorePackage;
+import org.eclipse.emf.ecore.util.ComposedSwitch;
+import org.eclipse.emf.ecore.util.EcoreSwitch;
+import org.eclipse.emf.ecore.util.Switch;
+import org.eclipse.papyrus.infra.properties.contexts.Property;
+import org.eclipse.papyrus.infra.properties.environment.Type;
+import org.eclipse.uml2.types.TypesPackage;
+import org.eclipse.uml2.uml.Class;
+import org.eclipse.uml2.uml.DataType;
+import org.eclipse.uml2.uml.Enumeration;
+import org.eclipse.uml2.uml.MultiplicityElement;
+import org.eclipse.uml2.uml.Operation;
+import org.eclipse.uml2.uml.PrimitiveType;
+import org.eclipse.uml2.uml.TypedElement;
+import org.eclipse.uml2.uml.util.UMLSwitch;
+
+import com.google.common.collect.ImmutableMap;
+
+/**
+ * Support for analysis of {@linkplain Property#getType() property types} in <em>Properties Context</em>
+ * models sourced in various metamodels.
+ */
+public class PropertyTypeHelper {
+
+ private static final PropertyTypeHelper INSTANCE = new PropertyTypeHelper();
+
+ private final Switch<EObject> sourceTypeSwitch = new SourceTypeSwitch();
+ private final Switch<Type> propertyTypeSwitch = new PropertyTypeSwitch();
+ private final Switch<Integer> sourceMultiplicitySwitch = new SourceMultiplicitySwitch();
+
+ /**
+ * Not instantiable by clients.
+ */
+ private PropertyTypeHelper() {
+ super();
+ }
+
+ public static final PropertyTypeHelper getInstance(Property property) {
+ return INSTANCE;
+ }
+
+ public Type getPropertyType(EObject sourceProperty) {
+ Type result = Type.STRING; // As in the generator, unknown types are edited as strings
+
+ EObject sourceType = sourceTypeSwitch.doSwitch(sourceProperty);
+ if (sourceType != null) {
+ result = propertyTypeSwitch.doSwitch(sourceType);
+ }
+
+ return result;
+ }
+
+ public int getMultiplicity(EObject sourceProperty) {
+ int result = 1; // The default upper bound in both Ecore and UML
+
+ Integer multiplicity = sourceMultiplicitySwitch.doSwitch(sourceProperty);
+ if (multiplicity != null) {
+ result = multiplicity.intValue();
+ }
+
+ return result;
+ }
+
+ //
+ // Nested types
+ //
+
+ /**
+ * A switch that computes the type (in the source model) of a source property.
+ */
+ private static final class SourceTypeSwitch extends ComposedSwitch<EObject> {
+ SourceTypeSwitch() {
+ super();
+
+ addSwitch(createEcoreSwitch());
+ addSwitch(createUMLSwitch());
+ }
+
+ private Switch<EObject> createEcoreSwitch() {
+ return new EcoreSwitch<>() {
+ public EObject caseETypedElement(ETypedElement object) {
+ return object.getEType();
+ }
+ };
+ }
+
+ private Switch<EObject> createUMLSwitch() {
+ return new UMLSwitch<>() {
+ public EObject caseTypedElement(TypedElement object) {
+ return object.getType();
+ }
+
+ public EObject caseOperation(Operation object) {
+ return object.getType();
+ }
+ };
+ }
+
+ }
+
+ private static final class PropertyTypeSwitch extends ComposedSwitch<Type> {
+ PropertyTypeSwitch() {
+ super();
+
+ addSwitch(createEcoreSwitch());
+ addSwitch(createUMLSwitch());
+ }
+
+ private Switch<Type> createEcoreSwitch() {
+ return new EcoreSwitch<>() {
+ private final Map<java.lang.Class<?>, Type> primitiveTypes = ImmutableMap.<java.lang.Class<?>, Type> builder()
+ .put(EcorePackage.Literals.ESTRING.getInstanceClass(), Type.STRING)
+ .put(EcorePackage.Literals.EINT.getInstanceClass(), Type.INTEGER)
+ .put(EcorePackage.Literals.EINTEGER_OBJECT.getInstanceClass(), Type.INTEGER)
+ .put(EcorePackage.Literals.EBIG_INTEGER.getInstanceClass(), Type.INTEGER)
+ .put(EcorePackage.Literals.EBOOLEAN.getInstanceClass(), Type.BOOLEAN)
+ .put(EcorePackage.Literals.EFLOAT.getInstanceClass(), Type.DOUBLE)
+ .put(EcorePackage.Literals.EFLOAT_OBJECT.getInstanceClass(), Type.DOUBLE)
+ .put(EcorePackage.Literals.EDOUBLE.getInstanceClass(), Type.DOUBLE)
+ .put(EcorePackage.Literals.EDOUBLE_OBJECT.getInstanceClass(), Type.DOUBLE)
+ .put(EcorePackage.Literals.EBIG_DECIMAL.getInstanceClass(), Type.DOUBLE)
+ .put(EcorePackage.Literals.ECHAR.getInstanceClass(), Type.INTEGER)
+ .put(EcorePackage.Literals.ECHARACTER_OBJECT.getInstanceClass(), Type.INTEGER)
+ .put(EcorePackage.Literals.EBYTE.getInstanceClass(), Type.INTEGER)
+ .put(EcorePackage.Literals.EBYTE_OBJECT.getInstanceClass(), Type.INTEGER)
+ .build();
+
+ @Override
+ public Type caseEClass(EClass object) {
+ return Type.REFERENCE;
+ }
+
+ @Override
+ public Type caseEEnum(EEnum object) {
+ return Type.ENUMERATION;
+ }
+
+ @Override
+ public Type caseEDataType(EDataType object) {
+ return primitiveTypes.get(object.getInstanceClass());
+ }
+
+ @Override
+ public Type defaultCase(EObject object) {
+ return Type.STRING; // as in the generator
+ }
+
+ };
+ }
+
+ private Switch<Type> createUMLSwitch() {
+ return new UMLSwitch<>() {
+ private final Map<String, Type> primitiveTypes = Map.of(
+ TypesPackage.Literals.STRING.getName(), Type.STRING,
+ TypesPackage.Literals.INTEGER.getName(), Type.INTEGER,
+ TypesPackage.Literals.BOOLEAN.getName(), Type.BOOLEAN,
+ TypesPackage.Literals.REAL.getName(), Type.DOUBLE,
+ TypesPackage.Literals.UNLIMITED_NATURAL.getName(), Type.INTEGER,
+ "Double", Type.DOUBLE); //$NON-NLS-1$ // as in the generator
+
+ @Override
+ public Type caseClass(Class object) {
+ return Type.REFERENCE;
+ }
+
+ @Override
+ public Type caseEnumeration(Enumeration object) {
+ return Type.ENUMERATION;
+ }
+
+ @Override
+ public Type casePrimitiveType(PrimitiveType object) {
+ return primitiveTypes.get(object.getName());
+ }
+
+ @Override
+ public Type caseDataType(DataType object) {
+ return Type.REFERENCE;
+ }
+
+ @Override
+ public Type defaultCase(EObject object) {
+ return Type.STRING; // as in the generator
+ }
+
+ };
+ }
+ }
+
+ /**
+ * A switch that computes the multiplicity (in the source model) of a source property.
+ */
+ private static final class SourceMultiplicitySwitch extends ComposedSwitch<Integer> {
+ SourceMultiplicitySwitch() {
+ super();
+
+ addSwitch(createEcoreSwitch());
+ addSwitch(createUMLSwitch());
+ }
+
+ private Switch<Integer> createEcoreSwitch() {
+ return new EcoreSwitch<>() {
+ public Integer caseETypedElement(ETypedElement object) {
+ return object.getUpperBound();
+ }
+ };
+ }
+
+ private Switch<Integer> createUMLSwitch() {
+ return new UMLSwitch<>() {
+ public Integer caseMultiplicityElement(MultiplicityElement object) {
+ return object.getUpper();
+ }
+
+ public Integer caseOperation(Operation object) {
+ return object.getUpper();
+ }
+ };
+ }
+
+ }
+
+}
diff --git a/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/util/WidgetTypeHelper.java b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/util/WidgetTypeHelper.java
new file mode 100644
index 00000000000..85e9d14f5c1
--- /dev/null
+++ b/plugins/toolsmiths/validation/org.eclipse.papyrus.toolsmiths.validation.properties/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/util/WidgetTypeHelper.java
@@ -0,0 +1,121 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.properties.internal.util;
+
+import java.util.Optional;
+import java.util.function.Predicate;
+
+import org.eclipse.emf.common.notify.Notifier;
+import org.eclipse.emf.common.notify.impl.AdapterImpl;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.papyrus.infra.emf.utils.EMFHelper;
+import org.eclipse.papyrus.infra.properties.contexts.Property;
+import org.eclipse.papyrus.infra.properties.environment.EnvironmentPackage;
+import org.eclipse.papyrus.infra.properties.environment.Namespace;
+import org.eclipse.papyrus.infra.properties.environment.WidgetType;
+import org.eclipse.papyrus.infra.properties.ui.PropertyEditor;
+import org.eclipse.papyrus.infra.properties.ui.Widget;
+import org.eclipse.papyrus.infra.properties.ui.runtime.IConfigurationManager;
+import org.eclipse.papyrus.infra.properties.ui.runtime.PropertiesRuntime;
+import org.eclipse.papyrus.infra.properties.ui.util.PropertiesUtil;
+import org.eclipse.papyrus.infra.tools.util.Iterators2;
+
+/**
+ * Support for analysis of {@linkplain PropertyEditor#getWidgetType() widget types} in <em>Properties UI</em>
+ * models.
+ */
+public class WidgetTypeHelper {
+
+ /** The namespace of the standard widget types in the base environment model. */
+ private static final String NAMESPACE = "org.eclipse.papyrus.infra.properties.ui.widgets"; //$NON-NLS-1$
+
+ private final IConfigurationManager configManager = PropertiesRuntime.getConfigurationManager();
+
+ private Optional<Namespace> coreWidgetNamespace;
+
+ /**
+ * Not instantiable by clients.
+ */
+ private WidgetTypeHelper() {
+ super();
+ }
+
+ public static final WidgetTypeHelper getInstance(Widget widget) {
+ return getInstance(EMFHelper.getResourceSet(widget));
+ }
+
+ public static final WidgetTypeHelper getInstance(Property property) {
+ return getInstance(EMFHelper.getResourceSet(property));
+ }
+
+ private static final WidgetTypeHelper getInstance(ResourceSet resourceSet) {
+ HelperAdapter adapter = (HelperAdapter) EcoreUtil.getExistingAdapter(resourceSet, HelperAdapter.class);
+ if (adapter == null) {
+ adapter = new HelperAdapter(new WidgetTypeHelper());
+ resourceSet.eAdapters().add(adapter);
+ }
+
+ return adapter.getHelper();
+ }
+
+ public WidgetType getDefaultWidgetType(Property property) {
+ return configManager.getDefaultEditorType(property);
+ }
+
+ public boolean isCoreWidgetType(WidgetType widgetType) {
+ return widgetType != null && widgetType.getNamespace() == getCoreWidgetNamespace();
+ }
+
+ public Namespace getCoreWidgetNamespace() {
+ if (coreWidgetNamespace == null) {
+ Predicate<Notifier> shouldPrune = Predicate.<Notifier> not(EnvironmentPackage.Literals.ENVIRONMENT::isInstance)
+ .and(EObject.class::isInstance);
+ coreWidgetNamespace = Iterators2.stream(configManager.getResourceSet().getAllContents(), shouldPrune)
+ .filter(Namespace.class::isInstance).map(Namespace.class::cast)
+ .filter(ns -> PropertiesUtil.namespaceEquals(ns, NAMESPACE))
+ .findFirst();
+ }
+
+ return coreWidgetNamespace.orElse(null);
+ }
+
+ //
+ // Nested types
+ //
+
+ private static final class HelperAdapter extends AdapterImpl {
+ private final WidgetTypeHelper helper;
+
+ HelperAdapter(WidgetTypeHelper helper) {
+ super();
+
+ this.helper = helper;
+ }
+
+ WidgetTypeHelper getHelper() {
+ return helper;
+ }
+
+ @Override
+ public boolean isAdapterForType(Object type) {
+ return type == WidgetTypeHelper.class || type == HelperAdapter.class;
+ }
+
+ }
+
+}
diff --git a/plugins/toolsmiths/validation/pom.xml b/plugins/toolsmiths/validation/pom.xml
index cee46cb9643..fa93273fccc 100644
--- a/plugins/toolsmiths/validation/pom.xml
+++ b/plugins/toolsmiths/validation/pom.xml
@@ -18,5 +18,6 @@
<module>org.eclipse.papyrus.toolsmiths.validation.elementtypes</module>
<module>org.eclipse.papyrus.toolsmiths.validation.architecture</module>
<module>org.eclipse.papyrus.toolsmiths.validation.newchild</module>
+ <module>org.eclipse.papyrus.toolsmiths.validation.properties</module>
</modules>
</project>
diff --git a/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/META-INF/MANIFEST.MF b/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/META-INF/MANIFEST.MF
index 4a1aff57ecb..f077c946e40 100644
--- a/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/META-INF/MANIFEST.MF
+++ b/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/META-INF/MANIFEST.MF
@@ -1,5 +1,6 @@
Manifest-Version: 1.0
Export-Package: org.eclipse.papyrus.customization.properties.generation,
+ org.eclipse.papyrus.customization.properties.generation.extensionpoint;x-friends:="org.eclipse.papyrus.toolsmiths.validation.properties",
org.eclipse.papyrus.customization.properties.generation.generators,
org.eclipse.papyrus.customization.properties.generation.layout,
org.eclipse.papyrus.customization.properties.generation.validators,
diff --git a/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/plugin.xml b/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/plugin.xml
index 9e4538407d0..44c6954ad45 100644
--- a/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/plugin.xml
+++ b/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/plugin.xml
@@ -53,5 +53,18 @@
id="profile2datacontext">
</library>
</extension>
+ <extension
+ point="org.eclipse.m2m.qvt.oml.javaBlackboxUnits">
+ <unit
+ name="Contexts"
+ namespace="org.eclipse.papyrus.uml.properties.generation">
+ <library
+ class="org.eclipse.papyrus.customization.properties.generation.generators.ContextsBlackBox">
+ <metamodel
+ nsURI="http://www.eclipse.org/papyrus/properties/contexts/0.9">
+ </metamodel>
+ </library>
+ </unit>
+ </extension>
</plugin>
diff --git a/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/src/org/eclipse/papyrus/customization/properties/generation/generators/AbstractQVTGenerator.java b/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/src/org/eclipse/papyrus/customization/properties/generation/generators/AbstractQVTGenerator.java
index bb6f981c3d2..d5916a06db0 100644
--- a/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/src/org/eclipse/papyrus/customization/properties/generation/generators/AbstractQVTGenerator.java
+++ b/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/src/org/eclipse/papyrus/customization/properties/generation/generators/AbstractQVTGenerator.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2010, 2014 CEA LIST and others.
+ * Copyright (c) 2010, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -12,6 +12,7 @@
* Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
* Thibault Le Ouay t.leouay@sherpa-eng.com - Strategy improvement of generated files
* Christian W. Damus (CEA) - bug 422257
+ * Christian W. Damus - bug 573986
*
*****************************************************************************/
package org.eclipse.papyrus.customization.properties.generation.generators;
@@ -41,6 +42,7 @@ import org.eclipse.m2m.qvt.oml.TransformationExecutor;
import org.eclipse.papyrus.customization.properties.generation.Activator;
import org.eclipse.papyrus.infra.emf.utils.EMFHelper;
import org.eclipse.papyrus.infra.properties.contexts.Context;
+import org.eclipse.papyrus.infra.properties.contexts.ContextsPackage;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
@@ -63,12 +65,13 @@ public abstract class AbstractQVTGenerator implements IGenerator, Listener {
*/
protected ModelExtent out;
- private Set<Listener> listeners = new HashSet<Listener>();
+ private Set<Listener> listeners = new HashSet<>();
private int strategy;
private Collection<ResourceSet> scratchResourceSets;
+ @Override
public List<Context> generate(List<URI> targetURI) {
switch (strategy) {
@@ -87,6 +90,7 @@ public abstract class AbstractQVTGenerator implements IGenerator, Listener {
return generatedContexts;
}
+ @Override
public void dispose() {
if (scratchResourceSets != null) {
for (ResourceSet next : scratchResourceSets) {
@@ -126,7 +130,7 @@ public abstract class AbstractQVTGenerator implements IGenerator, Listener {
* @param uri
* The URI from which the EObject is loaded
* @return
- * The loaded EObject, or null if an error occured
+ * The loaded EObject, or null if an error occured
* @throws IOException
* If the URI isn't a valid EObject
*/
@@ -149,20 +153,23 @@ public abstract class AbstractQVTGenerator implements IGenerator, Listener {
protected final ResourceSet createResourceSet() {
ResourceSet result = new ResourceSetImpl();
if (scratchResourceSets == null) {
- scratchResourceSets = new ArrayList<ResourceSet>();
+ scratchResourceSets = new ArrayList<>();
}
scratchResourceSets.add(result);
return result;
}
+ @Override
public void addListener(Listener listener) {
listeners.add(listener);
}
+ @Override
public void removeListener(Listener listener) {
listeners.remove(listener);
}
+ @Override
public void handleEvent(Event event) {
for (Listener listener : listeners) {
listener.handleEvent(event);
@@ -175,10 +182,10 @@ public abstract class AbstractQVTGenerator implements IGenerator, Listener {
* @param outObjects
* The list of EObjects from which the context will be retrieved
* @return
- * The main generated context
+ * The main generated context
*/
protected List<Context> getContexts(List<EObject> outObjects) {
- List<Context> result = new LinkedList<Context>();
+ List<Context> result = new LinkedList<>();
for (Object objectResult : outObjects) {
if (objectResult instanceof Context) {
@@ -190,8 +197,10 @@ public abstract class AbstractQVTGenerator implements IGenerator, Listener {
}
+ @Override
public abstract IObservableValue getObservableValue();
+ @Override
public void setStrategy(int strategy) {
this.strategy = strategy;
}
@@ -224,7 +233,8 @@ public abstract class AbstractQVTGenerator implements IGenerator, Listener {
}
ResourceSet resourceSet = createResourceSet();
- Resource contextResource = resourceSet.createResource(targetURI.get(0));
+ // We want to use UUIDs for XMI IDs, so be sure to use the correct resource factory
+ Resource contextResource = resourceSet.createResource(targetURI.get(0), ContextsPackage.eCONTENT_TYPE);
contextResource.getContents().addAll(outObjects);
return generatedContexts = getContexts(outObjects);
@@ -251,7 +261,7 @@ public abstract class AbstractQVTGenerator implements IGenerator, Listener {
ExecutionContextImpl context = new ExecutionContextImpl();
context.setConfigProperty("keepModeling", true); //$NON-NLS-1$
// context.setLog(new WriterLog(new OutputStreamWriter(System.out)));
- List<Context> temp = new LinkedList<Context>();
+ List<Context> temp = new LinkedList<>();
for (int i = 0; i < targetURI.size(); i++) {
extents = getModelExtents(i);
@@ -267,7 +277,8 @@ public abstract class AbstractQVTGenerator implements IGenerator, Listener {
return null;
}
ResourceSet resourceSet = createResourceSet();
- Resource contextResource = resourceSet.createResource(targetURI.get(i));
+ // We want to use UUIDs for XMI IDs, so be sure to use the correct resource factory
+ Resource contextResource = resourceSet.createResource(targetURI.get(i), ContextsPackage.eCONTENT_TYPE);
contextResource.getContents().addAll(outObjects);
temp.addAll(getContexts(outObjects));
diff --git a/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/src/org/eclipse/papyrus/customization/properties/generation/generators/ContextsBlackBox.java b/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/src/org/eclipse/papyrus/customization/properties/generation/generators/ContextsBlackBox.java
new file mode 100644
index 00000000000..980900adc59
--- /dev/null
+++ b/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/src/org/eclipse/papyrus/customization/properties/generation/generators/ContextsBlackBox.java
@@ -0,0 +1,43 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.customization.properties.generation.generators;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.m2m.qvt.oml.blackbox.java.Module;
+import org.eclipse.m2m.qvt.oml.blackbox.java.Operation;
+import org.eclipse.m2m.qvt.oml.blackbox.java.Operation.Kind;
+import org.eclipse.papyrus.infra.properties.contexts.Annotatable;
+import org.eclipse.papyrus.infra.properties.contexts.ContextsPackage;
+import org.eclipse.papyrus.infra.properties.contexts.util.ContextAnnotations;
+
+/**
+ * Black-box operations for context model transformations in QVTo.
+ */
+@Module(packageURIs = { ContextsPackage.eNS_URI })
+public class ContextsBlackBox {
+
+ public ContextsBlackBox() {
+ super();
+ }
+
+ @Operation(contextual = true, kind = Kind.HELPER)
+ public void setSourceModel(Annotatable self, Object sourceModel) {
+ if (sourceModel instanceof EObject) {
+ ContextAnnotations.setSourceModel(self, (EObject) sourceModel);
+ }
+ }
+
+}
diff --git a/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/src/org/eclipse/papyrus/customization/properties/generation/generators/GeneratorHelper.java b/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/src/org/eclipse/papyrus/customization/properties/generation/generators/GeneratorHelper.java
new file mode 100644
index 00000000000..f256e11cf33
--- /dev/null
+++ b/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/src/org/eclipse/papyrus/customization/properties/generation/generators/GeneratorHelper.java
@@ -0,0 +1,160 @@
+/*****************************************************************************
+ * Copyright (c) 2010, 2021 CEA LIST, Christian W. Damus, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
+ * Christian W. Damus (CEA) - bug 422257
+ * Christian W. Damus - bugs 482927, 573986
+ * Vincent Lorenzo (CEA LIST) - bug 520271
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.customization.properties.generation.generators;
+
+import static org.eclipse.papyrus.infra.properties.contexts.util.ContextAnnotations.setLayoutGeneratorClassName;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+import java.util.function.BiPredicate;
+import java.util.stream.Collectors;
+
+import org.eclipse.papyrus.customization.properties.generation.layout.ILayoutGenerator;
+import org.eclipse.papyrus.infra.properties.contexts.Context;
+import org.eclipse.papyrus.infra.properties.contexts.DataContextElement;
+import org.eclipse.papyrus.infra.properties.contexts.DataContextRoot;
+import org.eclipse.papyrus.infra.properties.contexts.Property;
+import org.eclipse.papyrus.infra.properties.contexts.Section;
+import org.eclipse.papyrus.infra.properties.contexts.Tab;
+import org.eclipse.papyrus.infra.properties.contexts.View;
+import org.eclipse.papyrus.infra.properties.ui.PropertyEditor;
+import org.eclipse.papyrus.infra.properties.ui.UiFactory;
+import org.eclipse.papyrus.infra.properties.ui.ValueAttribute;
+import org.eclipse.papyrus.infra.properties.ui.runtime.IConfigurationManager;
+import org.eclipse.papyrus.infra.properties.ui.runtime.PropertiesRuntime;
+import org.eclipse.papyrus.infra.tools.util.ClassLoaderHelper;
+
+/**
+ * Utilities to assist <em>Properties Context</em> model generation.
+ */
+public class GeneratorHelper {
+
+ private final IConfigurationManager configManager = PropertiesRuntime.getConfigurationManager();
+
+ private final IGenerator generator;
+ private final ILayoutGenerator layout;
+
+ public GeneratorHelper(IGenerator generator, ILayoutGenerator layout) {
+ super();
+
+ this.generator = generator;
+ this.layout = layout;
+ }
+
+ /**
+ * Generate the sections of the given {@code view} into the specified {@code tab} of the {@code context} model.
+ *
+ * @param context
+ * the <em>Properties Context</em> model
+ * @param tab
+ * a tab into which to generate sections
+ * @param view
+ * a view for which to generate sections
+ * @param propertySelectionPredicate
+ * a predicate that tests whether a property of some multiplicity is to be generated in the section
+ *
+ * @return the generated sections
+ */
+ public List<Section> generateLayout(Context context, Tab tab, View view, BiPredicate<? super Property, ? super Integer> propertySelectionPredicate) {
+ layout.setGenerator(generator);
+
+ List<PropertyEditor> editors = new LinkedList<>();
+ // the list of properties for the current view
+ final List<Property> properties = new ArrayList<>();
+
+ Set<DataContextElement> elements = getAllContextElements(view.getDatacontexts());
+ for (DataContextElement element : elements) {
+ for (Property property : element.getProperties()) {
+ if (propertySelectionPredicate.test(property, view.getElementMultiplicity())) {
+ properties.add(property);
+ }
+ }
+ }
+
+ // Annotate the data context to record the layout generator used
+ Collection<DataContextRoot> dataContexts = getRoots(elements);
+ ClassLoaderHelper.getURI(layout.getClass()).ifSuccess(uri -> dataContexts.forEach(dc -> setLayoutGeneratorClassName(dc, uri.toString())));
+
+ final List<Property> tmpProperties = new ArrayList<>(properties);
+ for (Property p1 : tmpProperties) {
+ // Bug 519090
+ // we remove all redefined properties from the list
+ properties.removeAll(p1.getRedefinedProperties());
+ }
+
+ // we create the editor
+ for (Property property : properties) {
+ PropertyEditor editor = UiFactory.eINSTANCE.createPropertyEditor();
+ editor.setProperty(property);
+ editor.setWidgetType(configManager.getDefaultEditorType(property));
+ editors.add(editor);
+ ValueAttribute input = UiFactory.eINSTANCE.createValueAttribute();
+ input.setName("input"); //$NON-NLS-1$
+ input.setValue("{Binding}"); //$NON-NLS-1$
+ editor.getAttributes().add(input);
+ }
+
+ List<Section> generatedSections = layout.layoutElements(editors, view);
+ tab.getSections().addAll(generatedSections);
+ view.getSections().addAll(generatedSections);
+
+ return generatedSections;
+ }
+
+ private Set<DataContextElement> getAllContextElements(Collection<DataContextElement> source) {
+ Set<DataContextElement> result = new HashSet<>();
+ for (DataContextElement element : source) {
+ getAllContextElements(element, result);
+ }
+ return result;
+ }
+
+ private void getAllContextElements(DataContextElement source, Set<DataContextElement> result) {
+ if (result.contains(source)) {
+ return;
+ }
+
+ result.add(source);
+ for (DataContextElement element : source.getSupertypes()) {
+ getAllContextElements(element, result);
+ }
+ }
+
+ private Collection<DataContextRoot> getRoots(Collection<? extends DataContextElement> elements) {
+ return elements.stream().map(GeneratorHelper::getRoot).filter(Objects::nonNull).distinct().collect(Collectors.toList());
+ }
+
+ public static DataContextRoot getRoot(DataContextElement element) {
+ DataContextRoot result = null;
+
+ for (DataContextElement dc = element; dc != null && result == null; dc = dc.getPackage()) {
+ if (dc instanceof DataContextRoot) {
+ result = (DataContextRoot) dc;
+ }
+ }
+
+ return result;
+ }
+
+}
diff --git a/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/src/org/eclipse/papyrus/customization/properties/generation/generators/ProfileGenerator.java b/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/src/org/eclipse/papyrus/customization/properties/generation/generators/ProfileGenerator.java
index 4a6291a1d54..08701e1d207 100644
--- a/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/src/org/eclipse/papyrus/customization/properties/generation/generators/ProfileGenerator.java
+++ b/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/src/org/eclipse/papyrus/customization/properties/generation/generators/ProfileGenerator.java
@@ -11,7 +11,7 @@
* Contributors:
* Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
* Thibault Le Ouay t.leouay@sherpa-eng.com - Strategy improvement of generated files
- * Christian W. Damus - bug 573987
+ * Christian W. Damus - bugs 573987, 573986
*****************************************************************************/
package org.eclipse.papyrus.customization.properties.generation.generators;
@@ -357,7 +357,7 @@ public class ProfileGenerator extends AbstractQVTGenerator {
if (listEObject.get(i) instanceof Package) {
Package currentPackage = (Package) listEObject.get(i);
- umlProfile = (Profile) loadEMFModel(currentPackage.eResource().getURI());
+ setProfile((Profile) loadEMFModel(currentPackage.eResource().getURI()));
inProfile = new BasicModelExtent(Collections.singletonList(umlProfile));
}
@@ -408,4 +408,8 @@ public class ProfileGenerator extends AbstractQVTGenerator {
return result;
}
+ protected void setProfile(Profile profile) {
+ this.umlProfile = profile;
+ }
+
}
diff --git a/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/src/org/eclipse/papyrus/customization/properties/generation/layout/StandardLayoutGenerator.java b/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/src/org/eclipse/papyrus/customization/properties/generation/layout/StandardLayoutGenerator.java
index e9de8df6f35..5b1ad2862da 100644
--- a/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/src/org/eclipse/papyrus/customization/properties/generation/layout/StandardLayoutGenerator.java
+++ b/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/src/org/eclipse/papyrus/customization/properties/generation/layout/StandardLayoutGenerator.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2010 CEA LIST.
+ * Copyright (c) 2010, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,9 +10,13 @@
*
* Contributors:
* Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.customization.properties.generation.layout;
+import static org.eclipse.papyrus.infra.properties.contexts.util.ContextAnnotations.getSourceModel;
+import static org.eclipse.papyrus.infra.properties.contexts.util.ContextAnnotations.setSourceModel;
+
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
@@ -54,10 +58,11 @@ import org.eclipse.papyrus.infra.properties.ui.util.PropertiesUtil;
*/
public class StandardLayoutGenerator implements ILayoutGenerator {
- protected final TreeMap<Category, List<PropertyEditor>> editorsByCategory = new TreeMap<Category, List<PropertyEditor>>();
+ protected final TreeMap<Category, List<PropertyEditor>> editorsByCategory = new TreeMap<>();
- protected final Set<Namespace> namespaces = new HashSet<Namespace>();
+ protected final Set<Namespace> namespaces = new HashSet<>();
+ @Override
public synchronized List<Section> layoutElements(List<PropertyEditor> editors, View parent) {
editorsByCategory.clear();
@@ -117,6 +122,7 @@ public class StandardLayoutGenerator implements ILayoutGenerator {
CompositeWidget sectionRoot = createSectionRoot();
Section section = ContextsFactory.eINSTANCE.createSection();
+ setSourceModel(section, getSourceModel(parent));
section.setName(parent.getName());
section.setSectionFile(String.format("ui/%s.xwt", section.getName().replaceAll(" ", ""))); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
@@ -148,7 +154,7 @@ public class StandardLayoutGenerator implements ILayoutGenerator {
}
protected List<ValueAttribute> createNamespaces(Collection<Namespace> namespaces) {
- List<ValueAttribute> xmlNamespaces = new LinkedList<ValueAttribute>();
+ List<ValueAttribute> xmlNamespaces = new LinkedList<>();
for (Namespace namespace : namespaces) {
if (namespace == null) {
continue;
@@ -230,6 +236,7 @@ public class StandardLayoutGenerator implements ILayoutGenerator {
return true;
}
+ @Override
public int compareTo(Category category) {
if (category == null) {
return -1;
@@ -269,10 +276,12 @@ public class StandardLayoutGenerator implements ILayoutGenerator {
*/
public static Type[] orderedTypes = new Type[] { Type.STRING, Type.BOOLEAN, Type.INTEGER, Type.ENUMERATION, Type.REFERENCE };
+ @Override
public String getName() {
return Messages.StandardLayoutGenerator_name;
}
+ @Override
public void setGenerator(IGenerator generator) {
// Ignored
}
diff --git a/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/src/org/eclipse/papyrus/customization/properties/generation/wizard/CreateContextWizard.java b/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/src/org/eclipse/papyrus/customization/properties/generation/wizard/CreateContextWizard.java
index 5b71bd56090..9732c1f7a7e 100644
--- a/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/src/org/eclipse/papyrus/customization/properties/generation/wizard/CreateContextWizard.java
+++ b/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/src/org/eclipse/papyrus/customization/properties/generation/wizard/CreateContextWizard.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2010, 2021, 2017 CEA LIST, Christian W. Damus, and others.
+ * Copyright (c) 2010, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -11,7 +11,7 @@
* Contributors:
* Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
* Christian W. Damus (CEA) - bug 422257
- * Christian W. Damus - bugs 482927, 573987
+ * Christian W. Damus - bugs 482927, 573987, 573986
* Vincent Lorenzo (CEA LIST) - bug 520271
*****************************************************************************/
package org.eclipse.papyrus.customization.properties.generation.wizard;
@@ -20,7 +20,6 @@ import static java.util.stream.StreamSupport.stream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
@@ -30,6 +29,7 @@ import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
+import java.util.function.BiPredicate;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IProgressMonitor;
@@ -43,6 +43,7 @@ import org.eclipse.papyrus.customization.properties.generation.Activator;
import org.eclipse.papyrus.customization.properties.generation.fieldselection.ContextElement;
import org.eclipse.papyrus.customization.properties.generation.fieldselection.FieldSelection;
import org.eclipse.papyrus.customization.properties.generation.fieldselection.PropertyDefinition;
+import org.eclipse.papyrus.customization.properties.generation.generators.GeneratorHelper;
import org.eclipse.papyrus.customization.properties.generation.generators.IGenerator;
import org.eclipse.papyrus.customization.properties.generation.layout.ILayoutGenerator;
import org.eclipse.papyrus.customization.properties.generation.messages.Messages;
@@ -55,11 +56,6 @@ import org.eclipse.papyrus.infra.properties.contexts.Property;
import org.eclipse.papyrus.infra.properties.contexts.Section;
import org.eclipse.papyrus.infra.properties.contexts.Tab;
import org.eclipse.papyrus.infra.properties.contexts.View;
-import org.eclipse.papyrus.infra.properties.ui.PropertyEditor;
-import org.eclipse.papyrus.infra.properties.ui.UiFactory;
-import org.eclipse.papyrus.infra.properties.ui.ValueAttribute;
-import org.eclipse.papyrus.infra.properties.ui.runtime.IConfigurationManager;
-import org.eclipse.papyrus.infra.properties.ui.runtime.PropertiesRuntime;
import org.eclipse.papyrus.infra.ui.util.EditorHelper;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;
@@ -115,8 +111,6 @@ public class CreateContextWizard extends Wizard implements INewWizard {
return result;
}
- IConfigurationManager configManager = PropertiesRuntime.getConfigurationManager();
-
for (Context context : contexts) {
Tab defaultTab = ContextsFactory.eINSTANCE.createTab();
defaultTab.setId(context.getName().toLowerCase());
@@ -135,47 +129,15 @@ public class CreateContextWizard extends Wizard implements INewWizard {
// Activator.log.error("Couldn't persist the field selection model", ex); //$NON-NLS-1$
// }
- layoutGenerator.setGenerator(generator);
+ GeneratorHelper helper = new GeneratorHelper(generator, layoutGenerator);
+ BiPredicate<Property, Integer> propertySelectionPredicate = (property, multiplicity) -> isSelected(fieldSelection, property, multiplicity.intValue() != 1);
for (View view : context.getViews()) {
if (view.getConstraints().size() == 0) {
continue;
}
- List<PropertyEditor> editors = new LinkedList<>();
- // the list of properties for the current view
- final List<Property> properties = new ArrayList<>();
- for (DataContextElement element : getAllContextElements(view.getDatacontexts())) {
- for (Property property : element.getProperties()) {
- if (isSelected(fieldSelection, property, view.getElementMultiplicity() != 1)) {
- properties.add(property);
- }
- }
- }
-
- final List<Property> tmpProperties = new ArrayList<>(properties);
- for (Property p1 : tmpProperties) {
- // Bug 519090
- // we remove all redefined properties from the list
- properties.removeAll(p1.getRedefinedProperties());
- }
-
- // we create the editor
- for (Property property : properties) {
- PropertyEditor editor = UiFactory.eINSTANCE.createPropertyEditor();
- editor.setProperty(property);
- editor.setWidgetType(configManager.getDefaultEditorType(property));
- editors.add(editor);
- ValueAttribute input = UiFactory.eINSTANCE.createValueAttribute();
- input.setName("input"); //$NON-NLS-1$
- input.setValue("{Binding}"); //$NON-NLS-1$
- editor.getAttributes().add(input);
- }
-
- List<Section> generatedSections = layoutGenerator.layoutElements(editors, view);
- defaultTab.getSections().addAll(generatedSections);
- view.getSections().addAll(generatedSections);
- context.getViews().add(view);
+ helper.generateLayout(context, defaultTab, view, propertySelectionPredicate);
}
int i = 1;
diff --git a/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/transforms/ecore2datacontext.qvto b/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/transforms/ecore2datacontext.qvto
index 37372e14e84..9d2fce91ab8 100644
--- a/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/transforms/ecore2datacontext.qvto
+++ b/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/transforms/ecore2datacontext.qvto
@@ -1,3 +1,5 @@
+import org.eclipse.papyrus.uml.properties.generation.Contexts;
+
modeltype Ecore uses "http://www.eclipse.org/emf/2002/Ecore";
modeltype PropertyContext uses "http://www.eclipse.org/papyrus/properties/contexts/0.9";
modeltype PropertyEnvironment uses "http://www.eclipse.org/papyrus/properties/environment/0.9";
@@ -28,7 +30,8 @@ mapping EPackage::toContext() : c: Context, root:DataContextRoot when {
->any(e | e.factoryClass = 'org.eclipse.papyrus.infra.properties.ui.modelelement.EMFModelElementFactory');
}
-mapping EPackage::toDataContextPackage() : DataContextPackage{
+mapping EPackage::toDataContextPackage() : DataContextPackage {
+ result.setSourceModel(self);
name := self.name;
elements := self.eClassifiers->select(e | e.oclIsKindOf(EClass))->map toDataContextElement().element
->union(self.eSubpackages->map toDataContextPackage());
@@ -53,7 +56,11 @@ query EClass::getContext() : PropertyContext::Context {
}
abstract mapping EClassifier::toDataContextElement() : element : DataContextElement, viewSingle : View, viewMultiple : View {
+ element.setSourceModel(self);
element.name := self.name;
+
+ viewSingle.setSourceModel(self);
+ viewMultiple.setSourceModel(self);
}
mapping EClass::toDataContextElement() : element : DataContextElement, viewSingle : View, viewMultiple : View inherits EClassifier::toDataContextElement
@@ -114,6 +121,7 @@ mapping EClass::toConstraint(view : View) : SimpleConstraint {
}
mapping EStructuralFeature::toProperty() : Property {
+ result.setSourceModel(self);
name := self.name;
type := self.eType.toType();
multiplicity := if self.upperBound = 1 then 1 else -1 endif;
diff --git a/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/transforms/profile2datacontext.qvto b/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/transforms/profile2datacontext.qvto
index 1035d5d01b9..ce22e55dead 100644
--- a/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/transforms/profile2datacontext.qvto
+++ b/plugins/uml/properties/org.eclipse.papyrus.uml.properties.generation/transforms/profile2datacontext.qvto
@@ -1,8 +1,11 @@
+import org.eclipse.papyrus.uml.properties.generation.Contexts;
+
modeltype UML uses "http://www.eclipse.org/uml2/5.0.0/UML";
modeltype PropertyContext uses "http://www.eclipse.org/papyrus/properties/contexts/0.9";
modeltype PropertyEnvironment uses "http://www.eclipse.org/papyrus/properties/environment/0.9";
modeltype PRoot uses "http://www.eclipse.org/papyrus/properties/root";
modeltype Constraints uses "http://www.eclipse.org/papyrus/constraints/0.9";
+modeltype Ecore uses "http://www.eclipse.org/emf/2002/Ecore";
transformation stereotype2datacontext(in profile : UML, out context : PropertyContext, in uml : PropertyContext, in pRoot : PRoot);
@@ -37,14 +40,13 @@ query Package::getClassifiers() : Collection(Classifier) {
return self.packagedElement->select(e | e.isView()).oclAsType(Classifier);
}
--------------------
-
----- DataContextPackage & DataContextRoot -------
mapping Package::toDCPackage() : DataContextPackage disjuncts
Package::toDataContextPackage, Package::toDCRoot;
abstract mapping Package::toAbstractDCPackage() : DataContextPackage {
+ result.setSourceModel(self);
name := self.name;
var mappedElements := self.getClassifiers().map toDCElement().element;
elements := mappedElements
@@ -86,9 +88,11 @@ query findFactory(className : String) : ModelElementFactoryDescriptor {
mapping Classifier::toDCElement() : element : DataContextElement, viewSingle : View, viewMultiple : View
disjuncts Stereotype::toDataContextElement, DataType::toDataContextElement;
-abstract mapping Classifier::toAbstractDCElement() : element : DataContextElement, viewSingle : View, viewMultiple : View{
+abstract mapping Classifier::toAbstractDCElement() : element : DataContextElement, viewSingle : View, viewMultiple : View {
+ element.setSourceModel(self);
element.name := self.name;
+ viewSingle.setSourceModel(self);
viewSingle.name := 'Single '+self.name;
viewSingle.automaticContext := true;
viewSingle.datacontexts := element;
@@ -96,6 +100,7 @@ abstract mapping Classifier::toAbstractDCElement() : element : DataContextElemen
viewSingle.constraints := self.map toConstraint(viewSingle);
viewSingle.context := self.getRootPackage().map toContext();
+ viewMultiple.setSourceModel(self);
viewMultiple.name := 'Multiple '+self.name;
viewMultiple.automaticContext := true;
viewMultiple.datacontexts := element;
@@ -152,6 +157,7 @@ query UML::Property::isAttribute(stereo : Stereotype) : Boolean{
---------------------------------------
mapping UML::Property::toProperty() : PropertyContext::Property {
+ result.setSourceModel(self);
name := self.name;
type := self.type.getType();
multiplicity := if self.upperBound() > 1 or self.upperBound() = -1 then -1 else 1 endif;
diff --git a/plugins/uml/properties/org.eclipse.papyrus.uml.properties/Model/Environment.properties b/plugins/uml/properties/org.eclipse.papyrus.uml.properties/Model/Environment.properties
new file mode 100644
index 00000000000..3fe12ea9e66
--- /dev/null
+++ b/plugins/uml/properties/org.eclipse.papyrus.uml.properties/Model/Environment.properties
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+# Christian W. Damus - Initial API and implementation
+#
+#
+
+_UI_label_UMLInstanceOf=UML 'instance-of'
+_UI_label_HasStereotype=UML 'has-stereotype'
+_UI_label_umlClassName=UML metaclass name
+_UI_label_stereotypeName=stereotype qualified name
diff --git a/plugins/views/properties/org.eclipse.papyrus.views.properties.model.xwt/src/org/eclipse/papyrus/views/properties/model/xwt/resource/XWTResource.java b/plugins/views/properties/org.eclipse.papyrus.views.properties.model.xwt/src/org/eclipse/papyrus/views/properties/model/xwt/resource/XWTResource.java
index ac2c1767fb3..ca74a17f2ad 100644
--- a/plugins/views/properties/org.eclipse.papyrus.views.properties.model.xwt/src/org/eclipse/papyrus/views/properties/model/xwt/resource/XWTResource.java
+++ b/plugins/views/properties/org.eclipse.papyrus.views.properties.model.xwt/src/org/eclipse/papyrus/views/properties/model/xwt/resource/XWTResource.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2010 CEA LIST.
+ * Copyright (c) 2010, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -11,6 +11,7 @@
* Contributors:
* Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
* Vincent Lorenzo (CEA LIST) vincent.lorenzo@cea.fr - bug 402049
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.views.properties.model.xwt.resource;
@@ -89,6 +90,7 @@ public class XWTResource extends ResourceImpl {
private final NamespaceComparator comparator = new NamespaceComparator();
private final WidgetAttributeComparator widgetAttributeComparator = new WidgetAttributeComparator();
+
/**
*
* Constructs a new XWTResource with the given URI
@@ -120,14 +122,14 @@ public class XWTResource extends ResourceImpl {
@Override
public void save(Map<?, ?> options) throws IOException {
if (options == null || options.isEmpty()) {
- Map<String, String> optionsMap = new HashMap<String, String>();
+ Map<String, String> optionsMap = new HashMap<>();
optionsMap.put(OPTION_SAVE_ONLY_IF_CHANGED, OPTION_SAVE_ONLY_IF_CHANGED_MEMORY_BUFFER);
super.save(optionsMap);
} else {
super.save(options);
}
- Object formatValue = options.get(OPTION_FORMAT);
+ Object formatValue = options == null ? null : options.get(OPTION_FORMAT);
if (formatValue == null || formatValue == Boolean.TRUE) {
if (uri.isPlatform()) {
IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(uri.toPlatformString(true)));
@@ -157,7 +159,7 @@ public class XWTResource extends ResourceImpl {
}
private Collection<Context> findContexts() {
- Set<Context> rootContexts = new HashSet<Context>();
+ Set<Context> rootContexts = new HashSet<>();
if (resourceSet == null) {
return Collections.emptyList();
}
@@ -169,7 +171,7 @@ public class XWTResource extends ResourceImpl {
}
}
- Set<Context> allContexts = new HashSet<Context>();
+ Set<Context> allContexts = new HashSet<>();
for (Context context : rootContexts) {
allContexts.addAll(PropertiesUtil.getDependencies(context));
@@ -182,7 +184,7 @@ public class XWTResource extends ResourceImpl {
URI transformationURI = URI.createPlatformPluginURI(Activator.PLUGIN_ID + "/Transformation/XMLToUI.qvto", true); //$NON-NLS-1$
TransformationExecutor executor = new TransformationExecutor(transformationURI);
- List<Context> contexts = new LinkedList<Context>(findContexts());
+ List<Context> contexts = new LinkedList<>(findContexts());
ModelExtent inXml = getModelExtent(genericXMLRoot);
ModelExtent inRoot = getModelExtent(ConfigurationManager.getInstance().getPropertiesRoot());
@@ -201,11 +203,11 @@ public class XWTResource extends ResourceImpl {
if (!(objectResult instanceof CompositeWidget)) {
return null;
}
-
- //we sort the attribute to be sure to display them in the same order than the serialization, done to fix the bug 402049
+
+ // we sort the attribute to be sure to display them in the same order than the serialization, done to fix the bug 402049
CompositeWidget widget = (CompositeWidget) outObjects.get(0);
ECollections.sort(widget.getAttributes(), this.widgetAttributeComparator);
-
+
return widget;
} else {
IStatus status = BasicDiagnostic.toIStatus(result);
@@ -275,14 +277,14 @@ public class XWTResource extends ResourceImpl {
return new BasicModelExtent();
}
- EList<EObject> objects = new BasicEList<EObject>();
+ EList<EObject> objects = new BasicEList<>();
objects.add(source);
ModelExtent extent = new BasicModelExtent(objects);
return extent;
}
/**
- *
+ *
* @author Vincent Lorenzo
* This comparator has been created to fix the bug 402049. This comparator is used during the save of the model.
*/
@@ -310,7 +312,7 @@ public class XWTResource extends ResourceImpl {
}
/**
- *
+ *
* @author Vincent Lorenzo
* This comparator has been created to fix the bug 402049. This comparator is used when we load the model,
* to be sure to display attribute in the same order than the saved one!
diff --git a/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/META-INF/MANIFEST.MF b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/META-INF/MANIFEST.MF
index 75072e0473f..ddfe74355ae 100755
--- a/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/META-INF/MANIFEST.MF
+++ b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/META-INF/MANIFEST.MF
@@ -28,7 +28,8 @@ Require-Bundle: com.ibm.icu,
org.eclipse.papyrus.views.properties;bundle-version="[5.0.0,6.0.0)",
org.eclipse.papyrus.views.properties.model.xwt;bundle-version="[3.0.0,4.0.0)",
org.eclipse.uml2.uml.editor;bundle-version="[5.5.0,6.0.0)",
- org.eclipse.papyrus.views.properties.toolsmiths;bundle-version="[3.0.0,4.0.0)"
+ org.eclipse.papyrus.views.properties.toolsmiths;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.papyrus.infra.properties.edit;bundle-version="[4.1.0,5.0.0)"
Bundle-Vendor: %Bundle-Vendor
Bundle-ActivationPolicy: lazy
Bundle-ClassPath: .,
diff --git a/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Model/Customization.ctx b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Model/Customization.ctx
index 12d524924fc..5fa6f95a174 100644
--- a/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Model/Customization.ctx
+++ b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Model/Customization.ctx
@@ -282,6 +282,18 @@
</constraints>
<widget href="ui/JavaQuery.xwt#/"/>
</allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_Y-8R8MiQEeuawZoZjJAkNQ" name="Single Annotation" sectionFile="ui/SingleAnnotation.xwt">
+ <widget href="ui/SingleAnnotation.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_h8gC0MiQEeuawZoZjJAkNQ" name="Multiple Annotations" sectionFile="ui/MultipleAnnotations.xwt">
+ <widget href="ui/MultipleAnnotations.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_l4XJgMiSEeuyq8SIp47lRg" name="Single EStringToStringMapEntry" sectionFile="ui/SingleEStringToStringMapEntry.xwt">
+ <widget href="ui/SingleEStringToStringMapEntry.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_oRQTgMiSEeuyq8SIp47lRg" name="Multiple EStringToStringMapEntries" sectionFile="ui/MultipleEStringToStringMapEntries.xwt">
+ <widget href="ui/MultipleEStringToStringMapEntries.xwt#/"/>
+ </allSections>
</tabs>
<views xmi:id="_W3-hwZLCEeWbp4A9_-WIrQ" name="Single Environment" sections="_W38FcpLCEeWbp4A9_-WIrQ" automaticContext="true">
<constraints xsi:type="constraints:SimpleConstraint" xmi:id="_W3-hwpLCEeWbp4A9_-WIrQ" name="isSingleEnvironment">
@@ -759,6 +771,34 @@
<properties xsi:type="constraints:ValueProperty" xmi:id="_W4CzM5LCEeWbp4A9_-WIrQ" name="nsUri" value="http://www.eclipse.org/papyrus/constraints/0.9"/>
</constraints>
</views>
+ <views xmi:id="_cZBBkMiPEeuawZoZjJAkNQ" name="Single Annotation" sections="_Y-8R8MiQEeuawZoZjJAkNQ">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_pc4ggMiPEeuawZoZjJAkNQ" name="isSingleAnnotation">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_VLM6kMiQEeuawZoZjJAkNQ" name="className" value="Annotation"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_VLM6kciQEeuawZoZjJAkNQ" name="nsUri" value="http://www.eclipse.org/papyrus/properties/contexts/0.9"/>
+ </constraints>
+ </views>
+ <views xmi:id="_dXW5IMiPEeuawZoZjJAkNQ" elementMultiplicity="-1" name="Multiple Annotations" sections="_h8gC0MiQEeuawZoZjJAkNQ">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_vPWOYMiPEeuawZoZjJAkNQ" name="isMultipleAnnotations">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_VLM6ksiQEeuawZoZjJAkNQ" name="className" value="Annotation"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_VLM6k8iQEeuawZoZjJAkNQ" name="nsUri" value="http://www.eclipse.org/papyrus/properties/contexts/0.9"/>
+ </constraints>
+ </views>
+ <views xmi:id="_74YgkMiREeuyq8SIp47lRg" name="Single EStringToStringMapEntry" sections="_l4XJgMiSEeuyq8SIp47lRg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_EY4iAMiSEeuyq8SIp47lRg" name="isSingleDetail">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_jGk-YMiSEeuyq8SIp47lRg" name="className" value="EStringToStringMapEntry"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_jGk-YciSEeuyq8SIp47lRg" name="nsUri" value="http://www.eclipse.org/emf/2002/Ecore"/>
+ </constraints>
+ </views>
+ <views xmi:id="_InG18MiSEeuyq8SIp47lRg" elementMultiplicity="-1" name="Multiple EStringToStringMapEntries" sections="_oRQTgMiSEeuyq8SIp47lRg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_NjpocMiSEeuyq8SIp47lRg" name="isMultipleDetails">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_jGk-YsiSEeuyq8SIp47lRg" name="className" value="EStringToStringMapEntry"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_jGk-Y8iSEeuyq8SIp47lRg" name="nsUri" value="http://www.eclipse.org/emf/2002/Ecore"/>
+ </constraints>
+ </views>
<dataContexts xmi:id="_W4CzNJLCEeWbp4A9_-WIrQ" name="properties" label="properties">
<elements xsi:type="contexts:DataContextPackage" xmi:id="_W4CzNZLCEeWbp4A9_-WIrQ" name="environment">
<elements xmi:id="_W4CzNpLCEeWbp4A9_-WIrQ" name="Environment">
@@ -869,6 +909,11 @@
<properties xmi:id="_W4EBUpLCEeWbp4A9_-WIrQ" name="constraintType" type="Reference" description="The type of this constraint"/>
<properties xmi:id="_W4EBU5LCEeWbp4A9_-WIrQ" name="properties" label="" type="Reference" multiplicity="-1" description="The list of properties used to instantiate this constraint (key - value pairs)"/>
</elements>
+ <elements xmi:id="_h2pZ0MiNEeulZ9kJCZuAXw" name="Annotation">
+ <properties xmi:id="_lkLbgMiNEeulZ9kJCZuAXw" name="source" label="Source" description="The source URI identifying the application that manages the annotation."/>
+ <properties xmi:id="_skTPUMiNEeulZ9kJCZuAXw" name="references" label="References" type="Reference" multiplicity="-1" description="References to model elements. The semantics of these references vary by source."/>
+ <properties xmi:id="_5vDZYMiNEeulZ9kJCZuAXw" name="details" label="Details" type="Reference" multiplicity="-1" description="Name/value pairs of tagged values providing additional information about the annotated element.&#xA;The semantics of details varies by source."/>
+ </elements>
</elements>
<elements xsi:type="contexts:DataContextPackage" xmi:id="_W4EBVJLCEeWbp4A9_-WIrQ" name="ui">
<elements xmi:id="_W4EBVZLCEeWbp4A9_-WIrQ" name="Element"/>
@@ -907,6 +952,12 @@
<properties xmi:id="_W4EBbpLCEeWbp4A9_-WIrQ" name="typeName" description="The fully-qualified name of this element"/>
</elements>
</elements>
+ <elements xsi:type="contexts:DataContextPackage" xmi:id="_K80F4MiOEeulZ9kJCZuAXw" name="ecore">
+ <elements xmi:id="_Mge4EMiOEeulZ9kJCZuAXw" name="EStringToStringMapEntry">
+ <properties xmi:id="_OyungMiOEeulZ9kJCZuAXw" name="key" label="Key" description="The mapping key."/>
+ <properties xmi:id="_PMH-8MiOEeulZ9kJCZuAXw" name="value" label="Value" description="The mapping value.&#x9;"/>
+ </elements>
+ </elements>
<modelElementFactory href="ppe:/environment/org.eclipse.papyrus.views.properties.toolsmiths/Model/CustomizationEnvironment.xmi#//@modelElementFactories.2"/>
</dataContexts>
<dataContexts xmi:id="_W4EoUJLCEeWbp4A9_-WIrQ" name="Custom" label="Custom">
diff --git a/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Model/ui/MultipleAnnotations.xwt b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Model/ui/MultipleAnnotations.xwt
new file mode 100644
index 00000000000..28b5fd1bad2
--- /dev/null
+++ b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Model/ui/MultipleAnnotations.xwt
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?><Composite xmlns="http://www.eclipse.org/xwt/presentation" xmlns:j="clr-namespace:java.lang" xmlns:ppel="clr-namespace:org.eclipse.papyrus.infra.properties.ui.widgets.layout" xmlns:x="http://www.eclipse.org/xwt">
+ <Composite.layout>
+ <ppel:PropertiesLayout/>
+ </Composite.layout>
+</Composite>
diff --git a/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Model/ui/MultipleCompositeConstraint.xwt b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Model/ui/MultipleCompositeConstraint.xwt
index 9a7e1fa5a69..15116302055 100644
--- a/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Model/ui/MultipleCompositeConstraint.xwt
+++ b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Model/ui/MultipleCompositeConstraint.xwt
@@ -1,16 +1,11 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Composite xmlns:ppel="clr-namespace:org.eclipse.papyrus.infra.properties.ui.widgets.layout"
- xmlns="http://www.eclipse.org/xwt/presentation" xmlns:ppe="clr-namespace:org.eclipse.papyrus.infra.properties.ui.widgets"
- xmlns:x="http://www.eclipse.org/xwt">
- <Composite.layout>
- <ppel:PropertiesLayout></ppel:PropertiesLayout>
- </Composite.layout>
- <Composite>
- <Composite.layout>
- <ppel:PropertiesLayout></ppel:PropertiesLayout>
- </Composite.layout>
- <ppe:BooleanRadio
- property="properties:contexts:ConstraintDescriptor:overrideable"
- input="{Binding}"></ppe:BooleanRadio>
- </Composite>
-</Composite> \ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?><Composite xmlns="http://www.eclipse.org/xwt/presentation" xmlns:ppe="clr-namespace:org.eclipse.papyrus.infra.properties.ui.widgets" xmlns:ppel="clr-namespace:org.eclipse.papyrus.infra.properties.ui.widgets.layout" xmlns:x="http://www.eclipse.org/xwt">
+ <Composite.layout>
+ <ppel:PropertiesLayout/>
+ </Composite.layout>
+ <Composite>
+ <Composite.layout>
+ <ppel:PropertiesLayout/>
+ </Composite.layout>
+ <ppe:BooleanRadio input="{Binding}" property="properties:contexts:ConstraintDescriptor:overrideable"/>
+ </Composite>
+</Composite>
diff --git a/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Model/ui/MultipleEStringToStringMapEntries.xwt b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Model/ui/MultipleEStringToStringMapEntries.xwt
new file mode 100644
index 00000000000..dfa55363295
--- /dev/null
+++ b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Model/ui/MultipleEStringToStringMapEntries.xwt
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?><Composite xmlns="http://www.eclipse.org/xwt/presentation" xmlns:ppe="clr-namespace:org.eclipse.papyrus.infra.properties.ui.widgets" xmlns:ppel="clr-namespace:org.eclipse.papyrus.infra.properties.ui.widgets.layout" xmlns:x="http://www.eclipse.org/xwt">
+ <Composite.layout>
+ <ppel:PropertiesLayout/>
+ </Composite.layout>
+</Composite>
diff --git a/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Model/ui/MultipleValueAttribute.xwt b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Model/ui/MultipleValueAttribute.xwt
index 2d855ce6e31..dfa55363295 100644
--- a/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Model/ui/MultipleValueAttribute.xwt
+++ b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Model/ui/MultipleValueAttribute.xwt
@@ -1,8 +1,5 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Composite xmlns:x="http://www.eclipse.org/xwt"
- xmlns:ppel="clr-namespace:org.eclipse.papyrus.infra.properties.ui.widgets.layout"
- xmlns:ppe="clr-namespace:org.eclipse.papyrus.infra.properties.ui.widgets" xmlns="http://www.eclipse.org/xwt/presentation">
- <Composite.layout>
- <ppel:PropertiesLayout></ppel:PropertiesLayout>
- </Composite.layout>
-</Composite> \ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?><Composite xmlns="http://www.eclipse.org/xwt/presentation" xmlns:ppe="clr-namespace:org.eclipse.papyrus.infra.properties.ui.widgets" xmlns:ppel="clr-namespace:org.eclipse.papyrus.infra.properties.ui.widgets.layout" xmlns:x="http://www.eclipse.org/xwt">
+ <Composite.layout>
+ <ppel:PropertiesLayout/>
+ </Composite.layout>
+</Composite>
diff --git a/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Model/ui/SingleAnnotation.xwt b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Model/ui/SingleAnnotation.xwt
new file mode 100644
index 00000000000..a00e6926e0b
--- /dev/null
+++ b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Model/ui/SingleAnnotation.xwt
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?><Composite xmlns="http://www.eclipse.org/xwt/presentation" xmlns:j="clr-namespace:java.lang" xmlns:ppe="clr-namespace:org.eclipse.papyrus.infra.properties.ui.widgets" xmlns:ppel="clr-namespace:org.eclipse.papyrus.infra.properties.ui.widgets.layout" xmlns:x="http://www.eclipse.org/xwt">
+ <Composite.layout>
+ <ppel:PropertiesLayout/>
+ </Composite.layout>
+ <Composite>
+ <Composite.layout>
+ <ppel:PropertiesLayout numColumns="1"/>
+ </Composite.layout>
+ <ppe:StringEditor input="{Binding}" property="properties:contexts:Annotation:source"/>
+ </Composite>
+ <Composite>
+ <Composite.layout>
+ <ppel:PropertiesLayout numColumns="1"/>
+ </Composite.layout>
+ <ppe:MultiReference input="{Binding}" property="properties:contexts:Annotation:references"/>
+ </Composite>
+</Composite>
diff --git a/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Model/ui/SingleEStringToStringMapEntry.xwt b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Model/ui/SingleEStringToStringMapEntry.xwt
new file mode 100644
index 00000000000..1c923b63db9
--- /dev/null
+++ b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Model/ui/SingleEStringToStringMapEntry.xwt
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?><Composite xmlns="http://www.eclipse.org/xwt/presentation" xmlns:ppe="clr-namespace:org.eclipse.papyrus.infra.properties.ui.widgets" xmlns:ppel="clr-namespace:org.eclipse.papyrus.infra.properties.ui.widgets.layout" xmlns:x="http://www.eclipse.org/xwt">
+ <Composite.layout>
+ <ppel:PropertiesLayout/>
+ </Composite.layout>
+ <ppe:StringEditor property="properties:ecore:EStringToStringMapEntry:key" input="{Binding}"/>
+ <ppe:StringEditor property="properties:ecore:EStringToStringMapEntry:value" input="{Binding}"/>
+</Composite>
diff --git a/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/OSGI-INF/l10n/bundle.properties b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/OSGI-INF/l10n/bundle.properties
index 271e3f40977..56cf656bcdf 100644
--- a/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/OSGI-INF/l10n/bundle.properties
+++ b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/OSGI-INF/l10n/bundle.properties
@@ -8,17 +8,21 @@ customize.command.tooltip = Customize the content of the Properties View
customize.command.description = This command allows customization of the content of the properties view
customize.command.name = Customize properties view
perspective.name = Properties View Customization
-page.name = Customization
+page.name = Customization
command.description = Customize the Properties view
command.name = Customize properties view
command.description.0 = Toggles the customization's Preview view
command.name.0 = Toggle preview
command.description.1 = Toggles the DataContext display
command.name.1 = Toggle DataContext
+command.description.2 = Toggles display of annotations
+command.name.2 = Show Annotations
toolbar.label = Papyrus customization toolbar
command.label = Toggle preview
command.tooltip = Toggles the customization's Preview view
command.label.0 = Toggle DataContext
command.tooltip.0 = Toggles the display of DataContext in the UIEditor view
+command.label.1 = Show Annotations
+command.tooltip.1 = Toggles the display of annotations in the Properties Context Editor
view.name = Properties Customization Preview
-category.name = Papyrus Toolsmiths \ No newline at end of file
+category.name = Papyrus Toolsmiths
diff --git a/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Query/Contexts.querySet b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Query/Contexts.querySet
index f16ff1f0d8c..a12a3dd275e 100644
--- a/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Query/Contexts.querySet
+++ b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/Query/Contexts.querySet
@@ -54,4 +54,8 @@
<returnType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
<scope href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Context"/>
</queries>
+ <queries xsi:type="query:JavaModelQuery" name="showDAnnotations" description="Tests whether annotations should be displayed" lowerBound="1" implementationClassName="org.eclipse.papyrus.views.properties.toolsmiths.query.ShowAnnotationsQuery">
+ <returnType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
+ <scope href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Context"/>
+ </queries>
</query:ModelQuerySet>
diff --git a/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/UICustom/PropertiesContext.custom b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/UICustom/PropertiesContext.custom
index 8d41e89c725..f576713ba56 100644
--- a/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/UICustom/PropertiesContext.custom
+++ b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/UICustom/PropertiesContext.custom
@@ -1,575 +1,346 @@
<?xml version="1.0" encoding="UTF-8"?>
-<custom:Customization
- xmi:version="2.0"
- xmlns:xmi="http://www.omg.org/XMI"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:custom="http://www.eclipse.org/papyrus/emf/facet/custom/0.2.incubation/custom"
- xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
- xmlns:efacet="http://www.eclipse.org/papyrus/emf/facet/efacet/0.2.incubation/efacet"
- xmlns:javaQuery="http://www.eclipse.org/papyrus/emf/facet/query/java/0.2.incubation/javaquery"
- xmlns:oclQuery="http://www.eclipse.org/papyrus/emf/facet/query/ocl/0.3.incubation/oclquery"
- name="Properties Context"
- nsURI="http://www.eclipse.org/papyrus/properties/contexts/custom"
- nsPrefix="propctx"
- documentation=""
- mustBeLoadedByDefault="true">
- <eClassifiers
- xsi:type="custom:EClassCustomization"
- name="CustomContext">
- <extendedMetaclass
- href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Context"/>
- <facetOperations
- name="label"
- lowerBound="1">
- <eType
- xsi:type="ecore:EDataType"
- href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
- <eParameters
- name="eStructuralFeature">
- <eType
- xsi:type="ecore:EClass"
- href="http://www.eclipse.org/emf/2002/Ecore#//ETypedElement"/>
+<custom:Customization xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:custom="http://www.eclipse.org/papyrus/emf/facet/custom/0.2.incubation/custom" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:efacet="http://www.eclipse.org/papyrus/emf/facet/efacet/0.2.incubation/efacet" xmlns:javaQuery="http://www.eclipse.org/papyrus/emf/facet/query/java/0.2.incubation/javaquery" xmlns:oclQuery="http://www.eclipse.org/papyrus/emf/facet/query/ocl/0.3.incubation/oclquery" name="Properties Context" nsURI="http://www.eclipse.org/papyrus/properties/contexts/custom" nsPrefix="propctx" documentation="" mustBeLoadedByDefault="true">
+ <eClassifiers xsi:type="custom:EClassCustomization" name="CustomContext">
+ <extendedMetaclass href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Context"/>
+ <facetOperations name="label" lowerBound="1">
+ <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ <eParameters name="eStructuralFeature">
+ <eType xsi:type="ecore:EClass" href="http://www.eclipse.org/emf/2002/Ecore#//ETypedElement"/>
</eParameters>
- <query
- xsi:type="custom:ETypedElementSwitchQuery">
+ <query xsi:type="custom:ETypedElementSwitchQuery">
<cases>
- <value
- xsi:type="oclQuery:OclQuery"
- oclExpression="if name = null or name = '' then '&lt;&lt;Unnamed>>' else name endif">
- <context
- xsi:type="ecore:EClass"
- href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Context"/>
+ <value xsi:type="oclQuery:OclQuery" oclExpression="if name = null or name = '' then '&lt;&lt;Unnamed>>' else name endif">
+ <context xsi:type="ecore:EClass" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Context"/>
</value>
</cases>
<cases>
- <case
- xsi:type="ecore:EReference"
- href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Context/views"/>
- <value
- xsi:type="oclQuery:OclQuery"
- canBeCached="true"
- oclExpression="'Views'">
- <context
- xsi:type="ecore:EClass"
- href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Context"/>
+ <case xsi:type="ecore:EReference" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Context/views"/>
+ <value xsi:type="oclQuery:OclQuery" canBeCached="true" oclExpression="'Views'">
+ <context xsi:type="ecore:EClass" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Context"/>
</value>
</cases>
<cases>
- <case
- xsi:type="ecore:EReference"
- href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Context/dataContexts"/>
- <value
- xsi:type="oclQuery:OclQuery"
- canBeCached="true"
- oclExpression="'Data contexts'">
- <context
- xsi:type="ecore:EClass"
- href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Context"/>
+ <case xsi:type="ecore:EReference" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Context/dataContexts"/>
+ <value xsi:type="oclQuery:OclQuery" canBeCached="true" oclExpression="'Data contexts'">
+ <context xsi:type="ecore:EClass" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Context"/>
</value>
</cases>
</query>
- <override
- xsi:type="efacet:FacetOperation"
- href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/label"/>
+ <override xsi:type="efacet:FacetOperation" href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/label"/>
</facetOperations>
- <facetOperations
- name="visibleReferences"
- upperBound="-1">
- <eType
- xsi:type="ecore:EClass"
- href="http://www.eclipse.org/emf/2002/Ecore#//EReference"/>
- <query
- xsi:type="javaQuery:JavaQuery"
- implementationClassName="org.eclipse.papyrus.views.properties.toolsmiths.query.GetVisibleFeaturesQuery"/>
- <override
- xsi:type="efacet:FacetOperation"
- href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/visibleReferences"/>
+ <facetOperations name="visibleReferences" upperBound="-1">
+ <eType xsi:type="ecore:EClass" href="http://www.eclipse.org/emf/2002/Ecore#//EReference"/>
+ <query xsi:type="javaQuery:JavaQuery" implementationClassName="org.eclipse.papyrus.views.properties.toolsmiths.query.GetVisibleFeaturesQuery"/>
+ <override xsi:type="efacet:FacetOperation" href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/visibleReferences"/>
</facetOperations>
- <facetOperations
- name="image"
- lowerBound="1">
- <eType
- xsi:type="ecore:EDataType"
- href="http://www.eclipse.org/papyrus/emf/facet/custom/0.2.incubation/custom_primitive_types#//Image"/>
- <eParameters
- name="eStructuralFeature">
- <eType
- xsi:type="ecore:EClass"
- href="http://www.eclipse.org/emf/2002/Ecore#//ETypedElement"/>
+ <facetOperations name="image" lowerBound="1">
+ <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/papyrus/emf/facet/custom/0.2.incubation/custom_primitive_types#//Image"/>
+ <eParameters name="eStructuralFeature">
+ <eType xsi:type="ecore:EClass" href="http://www.eclipse.org/emf/2002/Ecore#//ETypedElement"/>
</eParameters>
- <query
- xsi:type="custom:ETypedElementSwitchQuery">
+ <query xsi:type="custom:ETypedElementSwitchQuery">
<cases>
- <case
- xsi:type="ecore:EReference"
- href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Context/views"/>
- <value
- xsi:type="javaQuery:JavaQuery"
- canBeCached="true"
- implementationClassName="org.eclipse.papyrus.views.properties.toolsmiths.query.ViewsImageQuery"/>
+ <case xsi:type="ecore:EReference" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Context/views"/>
+ <value xsi:type="javaQuery:JavaQuery" canBeCached="true" implementationClassName="org.eclipse.papyrus.views.properties.toolsmiths.query.ViewsImageQuery"/>
</cases>
<cases>
- <case
- xsi:type="ecore:EReference"
- href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Context/dataContexts"/>
- <value
- xsi:type="javaQuery:JavaQuery"
- canBeCached="true"
- implementationClassName="org.eclipse.papyrus.views.properties.toolsmiths.query.DataContextsImageQuery"/>
+ <case xsi:type="ecore:EReference" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Context/dataContexts"/>
+ <value xsi:type="javaQuery:JavaQuery" canBeCached="true" implementationClassName="org.eclipse.papyrus.views.properties.toolsmiths.query.DataContextsImageQuery"/>
</cases>
</query>
- <override
- xsi:type="efacet:FacetOperation"
- href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/image"/>
+ <override xsi:type="efacet:FacetOperation" href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/image"/>
</facetOperations>
- <facetOperations
- name="collapseLink">
- <eType
- xsi:type="ecore:EDataType"
- href="http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"/>
- <eParameters
- name="eStructuralFeature">
- <eType
- xsi:type="ecore:EClass"
- href="http://www.eclipse.org/emf/2002/Ecore#//ETypedElement"/>
+ <facetOperations name="collapseLink">
+ <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"/>
+ <eParameters name="eStructuralFeature">
+ <eType xsi:type="ecore:EClass" href="http://www.eclipse.org/emf/2002/Ecore#//ETypedElement"/>
</eParameters>
- <query
- xsi:type="custom:ETypedElementSwitchQuery">
+ <query xsi:type="custom:ETypedElementSwitchQuery">
<cases>
- <case
- xsi:type="ecore:EReference"
- href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Context/tabs"/>
- <value
- xsi:type="oclQuery:OclQuery"
- canBeCached="true"
- oclExpression="true">
- <context
- xsi:type="ecore:EClass"
- href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Context"/>
+ <case xsi:type="ecore:EReference" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Context/tabs"/>
+ <value xsi:type="oclQuery:OclQuery" canBeCached="true" oclExpression="true">
+ <context xsi:type="ecore:EClass" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Context"/>
</value>
</cases>
</query>
- <override
- xsi:type="efacet:FacetOperation"
- href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/collapseLink"/>
+ <override xsi:type="efacet:FacetOperation" href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/collapseLink"/>
</facetOperations>
- <extendedFacets
- href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject"/>
+ <extendedFacets href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject"/>
</eClassifiers>
- <eClassifiers
- xsi:type="custom:EClassCustomization"
- name="CustomDataContextRoot">
- <extendedMetaclass
- href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//DataContextRoot"/>
- <facetOperations
- name="visibleReferences"
- upperBound="-1">
- <eType
- xsi:type="ecore:EClass"
- href="http://www.eclipse.org/emf/2002/Ecore#//EReference"/>
- <query
- xsi:type="javaQuery:JavaQuery"
- implementationClassName="org.eclipse.papyrus.views.properties.toolsmiths.query.GetVisibleFeaturesQuery"/>
- <override
- xsi:type="efacet:FacetOperation"
- href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/visibleReferences"/>
+ <eClassifiers xsi:type="custom:EClassCustomization" name="CustomDataContextRoot">
+ <extendedMetaclass href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//DataContextRoot"/>
+ <facetOperations name="visibleReferences" upperBound="-1">
+ <eType xsi:type="ecore:EClass" href="http://www.eclipse.org/emf/2002/Ecore#//EReference"/>
+ <query xsi:type="javaQuery:JavaQuery" implementationClassName="org.eclipse.papyrus.views.properties.toolsmiths.query.GetVisibleFeaturesQuery"/>
+ <override xsi:type="efacet:FacetOperation" href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/visibleReferences"/>
</facetOperations>
- <extendedFacets
- href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject"/>
+ <extendedFacets href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject"/>
</eClassifiers>
- <eClassifiers
- xsi:type="custom:EClassCustomization"
- name="CustomDataContextPackage">
- <extendedMetaclass
- href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//DataContextPackage"/>
- <facetOperations
- name="collapseLink">
- <eType
- xsi:type="ecore:EDataType"
- href="http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"/>
- <eParameters
- name="eStructuralFeature">
- <eType
- xsi:type="ecore:EClass"
- href="http://www.eclipse.org/emf/2002/Ecore#//ETypedElement"/>
+ <eClassifiers xsi:type="custom:EClassCustomization" name="CustomDataContextPackage">
+ <extendedMetaclass href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//DataContextPackage"/>
+ <facetOperations name="collapseLink">
+ <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"/>
+ <eParameters name="eStructuralFeature">
+ <eType xsi:type="ecore:EClass" href="http://www.eclipse.org/emf/2002/Ecore#//ETypedElement"/>
</eParameters>
- <query
- xsi:type="custom:ETypedElementSwitchQuery">
+ <query xsi:type="custom:ETypedElementSwitchQuery">
<cases>
- <case
- xsi:type="ecore:EReference"
- href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//DataContextPackage/elements"/>
- <value
- xsi:type="oclQuery:OclQuery"
- canBeCached="true"
- oclExpression="true">
- <context
- xsi:type="ecore:EClass"
- href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//DataContextPackage"/>
+ <case xsi:type="ecore:EReference" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//DataContextPackage/elements"/>
+ <value xsi:type="oclQuery:OclQuery" canBeCached="true" oclExpression="true">
+ <context xsi:type="ecore:EClass" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//DataContextPackage"/>
</value>
</cases>
<cases>
- <case
- xsi:type="ecore:EReference"
- href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//DataContextElement/properties"/>
- <value
- xsi:type="oclQuery:OclQuery"
- canBeCached="true"
- oclExpression="true">
- <context
- xsi:type="ecore:EClass"
- href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//DataContextElement"/>
+ <case xsi:type="ecore:EReference" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//DataContextElement/properties"/>
+ <value xsi:type="oclQuery:OclQuery" canBeCached="true" oclExpression="true">
+ <context xsi:type="ecore:EClass" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//DataContextElement"/>
+ </value>
+ </cases>
+ <cases>
+ <case xsi:type="ecore:EReference" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Annotatable/annotations"/>
+ <value xsi:type="oclQuery:OclQuery" canBeCached="true" oclExpression="true">
+ <context xsi:type="ecore:EClass" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//DataContextElement"/>
</value>
</cases>
</query>
- <override
- xsi:type="efacet:FacetOperation"
- href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/collapseLink"/>
+ <override xsi:type="efacet:FacetOperation" href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/collapseLink"/>
</facetOperations>
- <extendedFacets
- href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject"/>
+ <facetOperations name="visibleReferences" upperBound="-1">
+ <eType xsi:type="ecore:EClass" href="http://www.eclipse.org/emf/2002/Ecore#//EReference"/>
+ <query xsi:type="javaQuery:JavaQuery" implementationClassName="org.eclipse.papyrus.views.properties.toolsmiths.query.GetVisibleFeaturesQuery"/>
+ <override xsi:type="efacet:FacetOperation" href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/visibleReferences"/>
+ </facetOperations>
+ <extendedFacets href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject"/>
</eClassifiers>
- <eClassifiers
- xsi:type="custom:EClassCustomization"
- name="CustomDataContextElement">
- <extendedMetaclass
- href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//DataContextElement"/>
- <facetOperations
- name="collapseLink">
- <eType
- xsi:type="ecore:EDataType"
- href="http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"/>
- <eParameters
- name="eStructuralFeature">
- <eType
- xsi:type="ecore:EClass"
- href="http://www.eclipse.org/emf/2002/Ecore#//ETypedElement"/>
+ <eClassifiers xsi:type="custom:EClassCustomization" name="CustomDataContextElement">
+ <extendedMetaclass href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//DataContextElement"/>
+ <facetOperations name="collapseLink">
+ <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"/>
+ <eParameters name="eStructuralFeature">
+ <eType xsi:type="ecore:EClass" href="http://www.eclipse.org/emf/2002/Ecore#//ETypedElement"/>
</eParameters>
- <query
- xsi:type="custom:ETypedElementSwitchQuery">
+ <query xsi:type="custom:ETypedElementSwitchQuery">
<cases>
- <case
- xsi:type="ecore:EReference"
- href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//DataContextElement/properties"/>
- <value
- xsi:type="oclQuery:OclQuery"
- canBeCached="true"
- oclExpression="true">
- <context
- xsi:type="ecore:EClass"
- href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//DataContextElement"/>
+ <case xsi:type="ecore:EReference" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//DataContextElement/properties"/>
+ <value xsi:type="oclQuery:OclQuery" canBeCached="true" oclExpression="true">
+ <context xsi:type="ecore:EClass" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//DataContextElement"/>
+ </value>
+ </cases>
+ <cases>
+ <case xsi:type="ecore:EReference" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Annotatable/annotations"/>
+ <value xsi:type="oclQuery:OclQuery" canBeCached="true" oclExpression="true">
+ <context xsi:type="ecore:EClass" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//DataContextElement"/>
</value>
</cases>
</query>
- <override
- xsi:type="efacet:FacetOperation"
- href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/collapseLink"/>
+ <override xsi:type="efacet:FacetOperation" href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/collapseLink"/>
</facetOperations>
- <facetOperations
- name="label"
- lowerBound="1">
- <eType
- xsi:type="ecore:EDataType"
- href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
- <eParameters
- name="eStructuralFeature">
- <eType
- xsi:type="ecore:EClass"
- href="http://www.eclipse.org/emf/2002/Ecore#//ETypedElement"/>
+ <facetOperations name="label" lowerBound="1">
+ <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ <eParameters name="eStructuralFeature">
+ <eType xsi:type="ecore:EClass" href="http://www.eclipse.org/emf/2002/Ecore#//ETypedElement"/>
</eParameters>
- <query
- xsi:type="custom:ETypedElementSwitchQuery">
+ <query xsi:type="custom:ETypedElementSwitchQuery">
<cases>
- <value
- xsi:type="oclQuery:OclQuery"
- canBeCached="true"
- oclExpression="name">
- <context
- xsi:type="ecore:EClass"
- href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//DataContextElement"/>
+ <value xsi:type="oclQuery:OclQuery" canBeCached="true" oclExpression="name">
+ <context xsi:type="ecore:EClass" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//DataContextElement"/>
</value>
</cases>
</query>
- <override
- xsi:type="efacet:FacetOperation"
- href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/label"/>
+ <override xsi:type="efacet:FacetOperation" href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/label"/>
</facetOperations>
- <facetOperations
- name="visibleReferences"
- upperBound="-1">
- <eType
- xsi:type="ecore:EClass"
- href="http://www.eclipse.org/emf/2002/Ecore#//EReference"/>
- <query
- xsi:type="javaQuery:JavaQuery"
- implementationClassName="org.eclipse.papyrus.views.properties.toolsmiths.query.GetVisibleFeaturesQuery"/>
- <override
- xsi:type="efacet:FacetOperation"
- href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/visibleReferences"/>
+ <facetOperations name="visibleReferences" upperBound="-1">
+ <eType xsi:type="ecore:EClass" href="http://www.eclipse.org/emf/2002/Ecore#//EReference"/>
+ <query xsi:type="javaQuery:JavaQuery" implementationClassName="org.eclipse.papyrus.views.properties.toolsmiths.query.GetVisibleFeaturesQuery"/>
+ <override xsi:type="efacet:FacetOperation" href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/visibleReferences"/>
</facetOperations>
- <extendedFacets
- href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject"/>
+ <extendedFacets href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject"/>
</eClassifiers>
- <eClassifiers
- xsi:type="custom:EClassCustomization"
- name="CustomProperty">
- <extendedMetaclass
- href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Property"/>
- <facetOperations
- name="label"
- lowerBound="1">
- <eType
- xsi:type="ecore:EDataType"
- href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
- <eParameters
- name="eStructuralFeature">
- <eType
- xsi:type="ecore:EClass"
- href="http://www.eclipse.org/emf/2002/Ecore#//ETypedElement"/>
+ <eClassifiers xsi:type="custom:EClassCustomization" name="CustomProperty">
+ <extendedMetaclass href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Property"/>
+ <facetOperations name="label" lowerBound="1">
+ <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ <eParameters name="eStructuralFeature">
+ <eType xsi:type="ecore:EClass" href="http://www.eclipse.org/emf/2002/Ecore#//ETypedElement"/>
</eParameters>
- <query
- xsi:type="custom:ETypedElementSwitchQuery">
+ <query xsi:type="custom:ETypedElementSwitchQuery">
<cases>
- <value
- xsi:type="oclQuery:OclQuery"
- canBeCached="true"
- oclExpression="if label.oclIsUndefined() or label = '' then name else label endif">
- <context
- xsi:type="ecore:EClass"
- href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Property"/>
+ <value xsi:type="oclQuery:OclQuery" canBeCached="true" oclExpression="if label.oclIsUndefined() or label = '' then name else label endif">
+ <context xsi:type="ecore:EClass" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Property"/>
</value>
</cases>
</query>
- <override
- xsi:type="efacet:FacetOperation"
- href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/label"/>
+ <override xsi:type="efacet:FacetOperation" href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/label"/>
</facetOperations>
- <facetOperations
- name="visibleReferences"
- upperBound="-1">
- <eType
- xsi:type="ecore:EClass"
- href="http://www.eclipse.org/emf/2002/Ecore#//EReference"/>
- <query
- xsi:type="javaQuery:JavaQuery"
- implementationClassName="org.eclipse.papyrus.views.properties.toolsmiths.query.GetVisibleFeaturesQuery"/>
- <override
- xsi:type="efacet:FacetOperation"
- href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/visibleReferences"/>
+ <facetOperations name="visibleReferences" upperBound="-1">
+ <eType xsi:type="ecore:EClass" href="http://www.eclipse.org/emf/2002/Ecore#//EReference"/>
+ <query xsi:type="javaQuery:JavaQuery" implementationClassName="org.eclipse.papyrus.views.properties.toolsmiths.query.GetVisibleFeaturesQuery"/>
+ <override xsi:type="efacet:FacetOperation" href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/visibleReferences"/>
</facetOperations>
- <extendedFacets
- href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject"/>
+ <facetOperations name="collapseLink">
+ <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"/>
+ <eParameters name="eStructuralFeature">
+ <eType xsi:type="ecore:EClass" href="http://www.eclipse.org/emf/2002/Ecore#//ETypedElement"/>
+ </eParameters>
+ <query xsi:type="custom:ETypedElementSwitchQuery">
+ <cases>
+ <case xsi:type="ecore:EReference" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Annotatable/annotations"/>
+ <value xsi:type="oclQuery:OclQuery" canBeCached="true" oclExpression="true">
+ <context xsi:type="ecore:EClass" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//DataContextElement"/>
+ </value>
+ </cases>
+ </query>
+ <override xsi:type="efacet:FacetOperation" href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/collapseLink"/>
+ </facetOperations>
+ <extendedFacets href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject"/>
</eClassifiers>
- <eClassifiers
- xsi:type="custom:EClassCustomization"
- name="CustomSection">
- <extendedMetaclass
- href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Section"/>
- <facetOperations
- name="label"
- lowerBound="1">
- <eType
- xsi:type="ecore:EDataType"
- href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
- <eParameters
- name="eStructuralFeature">
- <eType
- xsi:type="ecore:EClass"
- href="http://www.eclipse.org/emf/2002/Ecore#//ETypedElement"/>
+ <eClassifiers xsi:type="custom:EClassCustomization" name="CustomSection">
+ <extendedMetaclass href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Section"/>
+ <facetOperations name="label" lowerBound="1">
+ <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ <eParameters name="eStructuralFeature">
+ <eType xsi:type="ecore:EClass" href="http://www.eclipse.org/emf/2002/Ecore#//ETypedElement"/>
</eParameters>
- <query
- xsi:type="custom:ETypedElementSwitchQuery">
+ <query xsi:type="custom:ETypedElementSwitchQuery">
<cases>
- <value
- xsi:type="oclQuery:OclQuery"
- canBeCached="true"
- oclExpression="if name = null or name = '' then '&lt;&lt;Unnamed>>' else name.concat(if tab.oclIsUndefined() then ' [&lt;&lt;Undefined>>]' else ' ['.concat(tab.label).concat(']') endif) endif">
- <context
- xsi:type="ecore:EClass"
- href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Section"/>
+ <value xsi:type="oclQuery:OclQuery" canBeCached="true" oclExpression="if name = null or name = '' then '&lt;&lt;Unnamed>>' else name.concat(if tab.oclIsUndefined() then ' [&lt;&lt;Undefined>>]' else ' ['.concat(tab.label).concat(']') endif) endif">
+ <context xsi:type="ecore:EClass" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Section"/>
</value>
</cases>
</query>
- <override
- xsi:type="efacet:FacetOperation"
- href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/label"/>
+ <override xsi:type="efacet:FacetOperation" href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/label"/>
</facetOperations>
- <facetOperations
- name="collapseLink">
- <eType
- xsi:type="ecore:EDataType"
- href="http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"/>
- <eParameters
- name="eStructuralFeature">
- <eType
- xsi:type="ecore:EClass"
- href="http://www.eclipse.org/emf/2002/Ecore#//ETypedElement"/>
+ <facetOperations name="collapseLink">
+ <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"/>
+ <eParameters name="eStructuralFeature">
+ <eType xsi:type="ecore:EClass" href="http://www.eclipse.org/emf/2002/Ecore#//ETypedElement"/>
</eParameters>
- <query
- xsi:type="custom:ETypedElementSwitchQuery">
+ <query xsi:type="custom:ETypedElementSwitchQuery">
<cases>
- <case
- xsi:type="ecore:EReference"
- href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Section/widget"/>
- <value
- xsi:type="oclQuery:OclQuery"
- canBeCached="true"
- oclExpression="true">
- <context
- xsi:type="ecore:EClass"
- href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Section"/>
+ <case xsi:type="ecore:EReference" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Section/widget"/>
+ <value xsi:type="oclQuery:OclQuery" canBeCached="true" oclExpression="true">
+ <context xsi:type="ecore:EClass" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Section"/>
+ </value>
+ </cases>
+ <cases>
+ <case xsi:type="ecore:EReference" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Annotatable/annotations"/>
+ <value xsi:type="oclQuery:OclQuery" canBeCached="true" oclExpression="true">
+ <context xsi:type="ecore:EClass" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//DataContextElement"/>
</value>
</cases>
</query>
- <override
- xsi:type="efacet:FacetOperation"
- href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/collapseLink"/>
+ <override xsi:type="efacet:FacetOperation" href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/collapseLink"/>
</facetOperations>
- <facetOperations
- name="visibleReferences"
- upperBound="-1">
- <eType
- xsi:type="ecore:EClass"
- href="http://www.eclipse.org/emf/2002/Ecore#//EReference"/>
- <query
- xsi:type="javaQuery:JavaQuery"
- implementationClassName="org.eclipse.papyrus.views.properties.toolsmiths.query.GetVisibleFeaturesQuery"/>
- <override
- xsi:type="efacet:FacetOperation"
- href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/visibleReferences"/>
+ <facetOperations name="visibleReferences" upperBound="-1">
+ <eType xsi:type="ecore:EClass" href="http://www.eclipse.org/emf/2002/Ecore#//EReference"/>
+ <query xsi:type="javaQuery:JavaQuery" implementationClassName="org.eclipse.papyrus.views.properties.toolsmiths.query.GetVisibleFeaturesQuery"/>
+ <override xsi:type="efacet:FacetOperation" href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/visibleReferences"/>
</facetOperations>
- <extendedFacets
- href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject"/>
+ <extendedFacets href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject"/>
</eClassifiers>
- <eClassifiers
- xsi:type="custom:EClassCustomization"
- name="CustomTab">
- <extendedMetaclass
- href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Tab"/>
- <facetOperations
- name="label"
- lowerBound="1">
- <eType
- xsi:type="ecore:EDataType"
- href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
- <eParameters
- name="eStructuralFeature">
- <eType
- xsi:type="ecore:EClass"
- href="http://www.eclipse.org/emf/2002/Ecore#//ETypedElement"/>
+ <eClassifiers xsi:type="custom:EClassCustomization" name="CustomTab">
+ <extendedMetaclass href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Tab"/>
+ <facetOperations name="label" lowerBound="1">
+ <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ <eParameters name="eStructuralFeature">
+ <eType xsi:type="ecore:EClass" href="http://www.eclipse.org/emf/2002/Ecore#//ETypedElement"/>
+ </eParameters>
+ <query xsi:type="custom:ETypedElementSwitchQuery">
+ <cases>
+ <value xsi:type="oclQuery:OclQuery" canBeCached="true" oclExpression="if label.oclIsUndefined() or label = '' then '&lt;&lt;Unnamed>>' else label endif">
+ <context xsi:type="ecore:EClass" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Tab"/>
+ </value>
+ </cases>
+ </query>
+ <override xsi:type="efacet:FacetOperation" href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/label"/>
+ </facetOperations>
+ <facetOperations name="visibleReferences" upperBound="-1">
+ <eType xsi:type="ecore:EClass" href="http://www.eclipse.org/emf/2002/Ecore#//EReference"/>
+ <query xsi:type="javaQuery:JavaQuery" implementationClassName="org.eclipse.papyrus.views.properties.toolsmiths.query.GetVisibleFeaturesQuery"/>
+ <override xsi:type="efacet:FacetOperation" href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/visibleReferences"/>
+ </facetOperations>
+ <extendedFacets href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="custom:EClassCustomization" name="CustomView">
+ <extendedMetaclass href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//View"/>
+ <facetOperations name="collapseLink">
+ <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"/>
+ <eParameters name="eStructuralFeature">
+ <eType xsi:type="ecore:EClass" href="http://www.eclipse.org/emf/2002/Ecore#//ETypedElement"/>
+ </eParameters>
+ <query xsi:type="custom:ETypedElementSwitchQuery">
+ <cases>
+ <case xsi:type="ecore:EReference" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//View/sections"/>
+ <value xsi:type="oclQuery:OclQuery" canBeCached="true" oclExpression="true">
+ <context xsi:type="ecore:EClass" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//View"/>
+ </value>
+ </cases>
+ <cases>
+ <case xsi:type="ecore:EReference" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Annotatable/annotations"/>
+ <value xsi:type="oclQuery:OclQuery" canBeCached="true" oclExpression="true">
+ <context xsi:type="ecore:EClass" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//DataContextElement"/>
+ </value>
+ </cases>
+ </query>
+ <override xsi:type="efacet:FacetOperation" href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/collapseLink"/>
+ </facetOperations>
+ <facetOperations name="label" lowerBound="1">
+ <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ <eParameters name="eStructuralFeature">
+ <eType xsi:type="ecore:EClass" href="http://www.eclipse.org/emf/2002/Ecore#//ETypedElement"/>
</eParameters>
- <query
- xsi:type="custom:ETypedElementSwitchQuery">
+ <query xsi:type="custom:ETypedElementSwitchQuery">
<cases>
- <value
- xsi:type="oclQuery:OclQuery"
- canBeCached="true"
- oclExpression="if label.oclIsUndefined() or label = '' then '&lt;&lt;Unnamed>>' else label endif">
- <context
- xsi:type="ecore:EClass"
- href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Tab"/>
+ <value xsi:type="oclQuery:OclQuery" canBeCached="true" oclExpression="if name = null or name = '' then '&lt;&lt;Unnamed>>' else name endif">
+ <context xsi:type="ecore:EClass" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//View"/>
</value>
</cases>
</query>
- <override
- xsi:type="efacet:FacetOperation"
- href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/label"/>
+ <override xsi:type="efacet:FacetOperation" href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/label"/>
</facetOperations>
- <facetOperations
- name="visibleReferences"
- upperBound="-1">
- <eType
- xsi:type="ecore:EClass"
- href="http://www.eclipse.org/emf/2002/Ecore#//EReference"/>
- <query
- xsi:type="javaQuery:JavaQuery"
- implementationClassName="org.eclipse.papyrus.views.properties.toolsmiths.query.GetVisibleFeaturesQuery"/>
- <override
- xsi:type="efacet:FacetOperation"
- href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/visibleReferences"/>
+ <facetOperations name="visibleReferences" upperBound="-1">
+ <eType xsi:type="ecore:EClass" href="http://www.eclipse.org/emf/2002/Ecore#//EReference"/>
+ <query xsi:type="javaQuery:JavaQuery" implementationClassName="org.eclipse.papyrus.views.properties.toolsmiths.query.GetVisibleFeaturesQuery"/>
+ <override xsi:type="efacet:FacetOperation" href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/visibleReferences"/>
</facetOperations>
- <extendedFacets
- href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject"/>
+ <extendedFacets href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject"/>
</eClassifiers>
- <eClassifiers
- xsi:type="custom:EClassCustomization"
- name="CustomView">
- <extendedMetaclass
- href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//View"/>
- <facetOperations
- name="collapseLink">
- <eType
- xsi:type="ecore:EDataType"
- href="http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"/>
- <eParameters
- name="eStructuralFeature">
- <eType
- xsi:type="ecore:EClass"
- href="http://www.eclipse.org/emf/2002/Ecore#//ETypedElement"/>
+ <eClassifiers xsi:type="custom:EClassCustomization" name="Annotation">
+ <extendedMetaclass href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Annotation"/>
+ <facetOperations name="collapseLink">
+ <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBooleanObject"/>
+ <eParameters name="eStructuralFeature">
+ <eType xsi:type="ecore:EClass" href="http://www.eclipse.org/emf/2002/Ecore#//ETypedElement"/>
</eParameters>
- <query
- xsi:type="custom:ETypedElementSwitchQuery">
+ <query xsi:type="custom:ETypedElementSwitchQuery">
<cases>
- <case
- xsi:type="ecore:EReference"
- href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//View/sections"/>
- <value
- xsi:type="oclQuery:OclQuery"
- canBeCached="true"
- oclExpression="true">
- <context
- xsi:type="ecore:EClass"
- href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//View"/>
+ <case xsi:type="ecore:EReference" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Annotation/details"/>
+ <value xsi:type="oclQuery:OclQuery" canBeCached="true" oclExpression="true">
+ <context xsi:type="ecore:EClass" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//DataContextElement"/>
</value>
</cases>
</query>
- <override
- xsi:type="efacet:FacetOperation"
- href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/collapseLink"/>
+ <override xsi:type="efacet:FacetOperation" href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/collapseLink"/>
</facetOperations>
- <facetOperations
- name="label"
- lowerBound="1">
- <eType
- xsi:type="ecore:EDataType"
- href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
- <eParameters
- name="eStructuralFeature">
- <eType
- xsi:type="ecore:EClass"
- href="http://www.eclipse.org/emf/2002/Ecore#//ETypedElement"/>
+ <facetOperations name="label" lowerBound="1">
+ <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ <eParameters name="eStructuralFeature">
+ <eType xsi:type="ecore:EClass" href="http://www.eclipse.org/emf/2002/Ecore#//ETypedElement"/>
</eParameters>
- <query
- xsi:type="custom:ETypedElementSwitchQuery">
+ <query xsi:type="custom:ETypedElementSwitchQuery">
<cases>
- <value
- xsi:type="oclQuery:OclQuery"
- canBeCached="true"
- oclExpression="if name = null or name = '' then '&lt;&lt;Unnamed>>' else name endif">
- <context
- xsi:type="ecore:EClass"
- href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//View"/>
+ <value xsi:type="oclQuery:OclQuery" canBeCached="true" oclExpression="source">
+ <context xsi:type="ecore:EClass" href="http://www.eclipse.org/papyrus/properties/contexts/0.9#//Annotation"/>
</value>
</cases>
</query>
- <override
- xsi:type="efacet:FacetOperation"
- href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/label"/>
+ <override xsi:type="efacet:FacetOperation" href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/label"/>
</facetOperations>
- <facetOperations
- name="visibleReferences"
- upperBound="-1">
- <eType
- xsi:type="ecore:EClass"
- href="http://www.eclipse.org/emf/2002/Ecore#//EReference"/>
- <query
- xsi:type="javaQuery:JavaQuery"
- implementationClassName="org.eclipse.papyrus.views.properties.toolsmiths.query.GetVisibleFeaturesQuery"/>
- <override
- xsi:type="efacet:FacetOperation"
- href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/visibleReferences"/>
+ <facetOperations name="visibleReferences" upperBound="-1">
+ <eType xsi:type="ecore:EClass" href="http://www.eclipse.org/emf/2002/Ecore#//EReference"/>
+ <query xsi:type="javaQuery:JavaQuery" implementationClassName="org.eclipse.papyrus.views.properties.toolsmiths.query.GetVisibleFeaturesQuery"/>
+ <override xsi:type="efacet:FacetOperation" href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject/visibleReferences"/>
</facetOperations>
- <extendedFacets
- href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject"/>
+ <extendedFacets href="platform:/plugin/org.eclipse.papyrus.emf.facet.custom.ui/resources/customproperties.efacet#//CustomizedEObject"/>
</eClassifiers>
</custom:Customization>
diff --git a/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/icons/Annotation.gif b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/icons/Annotation.gif
new file mode 100644
index 00000000000..b7917c33d58
--- /dev/null
+++ b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/icons/Annotation.gif
Binary files differ
diff --git a/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/icons/Annotation@2x.gif b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/icons/Annotation@2x.gif
new file mode 100644
index 00000000000..3e538e8a9c4
--- /dev/null
+++ b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/icons/Annotation@2x.gif
Binary files differ
diff --git a/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/plugin.xml b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/plugin.xml
index f9ccef435d4..f77f96f46a4 100644
--- a/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/plugin.xml
+++ b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/plugin.xml
@@ -97,6 +97,10 @@
class="org.eclipse.papyrus.views.properties.toolsmiths.editor.actions.TogglePreviewAction"
commandId="org.eclipse.papyrus.customization.properties.TogglePreview">
</handler>
+ <handler
+ class="org.eclipse.papyrus.views.properties.toolsmiths.editor.actions.ToggleAnnotationsAction"
+ commandId="org.eclipse.papyrus.customization.properties.ToggleAnnotations">
+ </handler>
</extension>
<extension
point="org.eclipse.ui.commands">
@@ -111,8 +115,15 @@
name="%command.name.0">
<state
class="org.eclipse.jface.commands.ToggleState"
- id="org.eclipse.ui.commands.toggleState">
- </state>
+ id="org.eclipse.ui.commands.toggleState"/>
+ </command>
+ <command
+ description="%command.description.2"
+ id="org.eclipse.papyrus.customization.properties.ToggleAnnotations"
+ name="%command.name.2">
+ <state
+ class="org.eclipse.ui.handlers.RegistryToggleState"
+ id="org.eclipse.ui.commands.toggleState"/>
</command>
</extension>
<extension
@@ -156,6 +167,22 @@
</with>
</visibleWhen>
</command>
+ <command
+ commandId="org.eclipse.papyrus.customization.properties.ToggleAnnotations"
+ icon="icons/Annotation.gif"
+ id="org.eclipse.papyrus.customization.properties.toggleAnnotations"
+ label="%command.label.1"
+ style="toggle"
+ tooltip="%command.tooltip.1">
+ <visibleWhen>
+ <with
+ variable="activeEditorId">
+ <equals
+ value="org.eclipse.papyrus.customization.properties.UIEditor">
+ </equals>
+ </with>
+ </visibleWhen>
+ </command>
</toolbar>
</menuContribution>
</extension>
diff --git a/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/editor/ContextEditorActionBarContributor.java b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/editor/ContextEditorActionBarContributor.java
index 974e0dfc54f..c9e80899d2a 100644
--- a/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/editor/ContextEditorActionBarContributor.java
+++ b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/editor/ContextEditorActionBarContributor.java
@@ -10,7 +10,7 @@
*
* Contributors:
* Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
- * Christian W. Damus - bug 573987
+ * Christian W. Damus - bugs 573987, 573986
*****************************************************************************/
package org.eclipse.papyrus.views.properties.toolsmiths.editor;
@@ -41,6 +41,7 @@ import org.eclipse.papyrus.views.properties.toolsmiths.editor.actions.MoDiscoCop
import org.eclipse.papyrus.views.properties.toolsmiths.editor.actions.MoDiscoCutAction;
import org.eclipse.papyrus.views.properties.toolsmiths.editor.actions.MoDiscoDeleteAction;
import org.eclipse.papyrus.views.properties.toolsmiths.editor.actions.MoDiscoPasteAction;
+import org.eclipse.papyrus.views.properties.toolsmiths.editor.actions.ToggleAnnotationsAction;
import org.eclipse.papyrus.views.properties.toolsmiths.editor.actions.ValidationAction;
import org.eclipse.papyrus.views.properties.toolsmiths.messages.Messages;
import org.eclipse.papyrus.views.properties.toolsmiths.util.ActionUtil;
@@ -157,6 +158,9 @@ public class ContextEditorActionBarContributor extends EcoreActionBarContributor
if (createChildAction.getText().equals("Data Context Root")) { // It's the only relevant property we have access to... //$NON-NLS-1$
iterator.remove();
}
+ if (!ToggleAnnotationsAction.showAnnotations && createChildAction.getText().equals("Annotation")) { //$NON-NLS-1$
+ iterator.remove();
+ }
}
}
}
@@ -327,7 +331,7 @@ public class ContextEditorActionBarContributor extends EcoreActionBarContributor
@Override
protected boolean removeAllReferencesOnDelete() {
- return false; // When true, the whole model is loaded on "delete" actions, including *.xwt files
+ return true; // Our "delete" action scans for references only in context resources, not *.xwt files
// (Which cannot contain references to the deleted element, and are really slow to load)
}
diff --git a/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/editor/actions/AbstractToggleHandler.java b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/editor/actions/AbstractToggleHandler.java
new file mode 100644
index 00000000000..624862c58bb
--- /dev/null
+++ b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/editor/actions/AbstractToggleHandler.java
@@ -0,0 +1,119 @@
+/*****************************************************************************
+ * Copyright (c) 2021 CEA LIST, Christian W. Damus, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.views.properties.toolsmiths.editor.actions;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.Command;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.State;
+import org.eclipse.ui.ISources;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.commands.ICommandService;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * A simple framework for toggle actions.
+ */
+public abstract class AbstractToggleHandler extends AbstractHandler {
+
+ private static final String STATE_ID = "org.eclipse.ui.commands.toggleState"; //$NON-NLS-1$
+
+ private final String commandID;
+
+ private State state;
+
+ protected AbstractToggleHandler(String commandID) {
+ super();
+
+ this.commandID = commandID;
+ }
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ IWorkbenchPage activePage = HandlerUtil.getActiveWorkbenchWindowChecked(event).getActivePage();
+ if (activePage == null || state == null) {
+ return null;
+ }
+
+ boolean current = (Boolean) state.getValue();
+ doToggle(activePage, !current);
+
+ return null;
+ }
+
+ @Override
+ public void setEnabled(Object evaluationContext) {
+ super.setEnabled(evaluationContext);
+
+ IWorkbenchWindow activeWindow = (IWorkbenchWindow) HandlerUtil.getVariable(evaluationContext, ISources.ACTIVE_WORKBENCH_WINDOW_NAME);
+ IWorkbenchPage activePage = activeWindow == null ? null : activeWindow.getActivePage();
+ if (activePage == null) {
+ return;
+ }
+
+ ICommandService commandService = activeWindow.getService(ICommandService.class);
+ Command command = commandService.getCommand(commandID);
+
+ if (this.state == null) {
+ State state = (command == null) ? null : command.getState(STATE_ID);
+ if (state == null) {
+ return;
+ }
+
+ // Initialize from the persistent state
+ this.state = state;
+ boolean fromState = (Boolean) state.getValue();
+ boolean initial = initializeFromState(activePage, fromState);
+ state.setValue(initial);
+ } else {
+ this.state.setValue(updateState(activePage));
+ }
+ }
+
+ /**
+ * Handle the toggling of the action state.
+ *
+ * @param page
+ * the current workbench page in which to apply the effect of toggling
+ * @param on
+ * {@code true} if the toggle is on, {@code false} if it is off
+ */
+ protected abstract void doToggle(IWorkbenchPage page, boolean on);
+
+ /**
+ * Compute an update to the state based on the current reality of the workbench.
+ *
+ * @param page
+ * the current workbench page from which to compute the updated state
+ * @return the updated state
+ */
+ protected abstract boolean updateState(IWorkbenchPage page);
+
+ /**
+ * Reconcile the initial action state in the workbench with the persistent state value.
+ *
+ * @param page
+ * the current workbench page from in which reconcile the initial state
+ * @param on
+ * {@code true} if the toggle is on, {@code false} if it is off
+ * @return the value to update in the initial state. If this is the same as {@code on}, then the state will not be updated
+ */
+ protected boolean initializeFromState(IWorkbenchPage page, boolean on) {
+ return on;
+ }
+
+}
diff --git a/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/editor/actions/MoDiscoDeleteAction.java b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/editor/actions/MoDiscoDeleteAction.java
index fe593e9aa05..c61fab237bd 100644
--- a/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/editor/actions/MoDiscoDeleteAction.java
+++ b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/editor/actions/MoDiscoDeleteAction.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2010 CEA LIST.
+ * Copyright (c) 2010, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,14 +10,17 @@
*
* Contributors:
* Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
+ * Christian W. Damus - bug 573986
*****************************************************************************/
package org.eclipse.papyrus.views.properties.toolsmiths.editor.actions;
import java.util.Collection;
import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.edit.command.RemoveCommand;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.ui.action.DeleteAction;
+import org.eclipse.papyrus.infra.properties.contexts.command.ContextDeleteCommand;
import org.eclipse.papyrus.views.properties.toolsmiths.util.ActionUtil;
/**
@@ -75,7 +78,7 @@ public class MoDiscoDeleteAction extends DeleteAction {
@Override
public Command createCommand(Collection<?> selection) {
Collection<?> newSelection = ActionUtil.getAdaptedSelection(selection);
- return super.createCommand(newSelection);
+ return removeAllReferences ? ContextDeleteCommand.create(domain, newSelection) : RemoveCommand.create(domain, newSelection);
}
}
diff --git a/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/editor/actions/ToggleAnnotationsAction.java b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/editor/actions/ToggleAnnotationsAction.java
new file mode 100644
index 00000000000..1e3a9de8e14
--- /dev/null
+++ b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/editor/actions/ToggleAnnotationsAction.java
@@ -0,0 +1,54 @@
+/*****************************************************************************
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
+ * Christian W. Damus - bug 573986
+ *****************************************************************************/
+package org.eclipse.papyrus.views.properties.toolsmiths.editor.actions;
+
+import org.eclipse.papyrus.views.properties.toolsmiths.editor.UIEditor;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchPage;
+
+/**
+ * An action to toggle the display of annotations in the <em>Properties Context Editor</em>.
+ */
+public class ToggleAnnotationsAction extends AbstractToggleHandler {
+
+ public static boolean showAnnotations = false;
+
+ public ToggleAnnotationsAction() {
+ super("org.eclipse.papyrus.customization.properties.ToggleAnnotations"); //$NON-NLS-1$
+ }
+
+ @Override
+ protected void doToggle(IWorkbenchPage page, boolean on) {
+ showAnnotations = on;
+
+ IEditorPart editor = page.getActiveEditor();
+ if (editor instanceof UIEditor) {
+ UIEditor uiEditor = (UIEditor) editor;
+ uiEditor.getViewer().refresh();
+ }
+ }
+
+ @Override
+ protected boolean updateState(IWorkbenchPage page) {
+ return showAnnotations;
+ }
+
+ @Override
+ protected boolean initializeFromState(IWorkbenchPage page, boolean on) {
+ showAnnotations = on;
+ return showAnnotations;
+ }
+
+}
diff --git a/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/editor/actions/TogglePreviewAction.java b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/editor/actions/TogglePreviewAction.java
index 7dc57289d4f..84ef99b0635 100644
--- a/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/editor/actions/TogglePreviewAction.java
+++ b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/editor/actions/TogglePreviewAction.java
@@ -14,73 +14,47 @@
*****************************************************************************/
package org.eclipse.papyrus.views.properties.toolsmiths.editor.actions;
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.Command;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.State;
import org.eclipse.papyrus.views.properties.toolsmiths.Activator;
-import org.eclipse.ui.ISources;
import org.eclipse.ui.IViewReference;
import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.commands.ICommandService;
-import org.eclipse.ui.handlers.HandlerUtil;
-import org.eclipse.ui.part.ViewPart;
/**
* An action to toggle the UIEditor Preview
*
* @author Camille Letavernier
*/
-public class TogglePreviewAction extends AbstractHandler {
+public class TogglePreviewAction extends AbstractToggleHandler {
- private static final String STATE_ID = "org.eclipse.ui.commands.toggleState"; //$NON-NLS-1$
- private static final String COMMAND_ID = "org.eclipse.papyrus.customization.properties.TogglePreview"; //$NON-NLS-1$
+ public TogglePreviewAction() {
+ super("org.eclipse.papyrus.customization.properties.TogglePreview"); //$NON-NLS-1$
+ }
@Override
- public Object execute(ExecutionEvent event) throws ExecutionException {
- IWorkbenchPage activePage = HandlerUtil.getActiveWorkbenchWindowChecked(event).getActivePage();
- if (activePage == null) {
- return null;
- }
-
- IViewReference viewReference = activePage.findViewReference(Activator.PREVIEW_ID);
+ protected void doToggle(IWorkbenchPage page, boolean on) {
try {
- if (viewReference == null) {
- activePage.showView(Activator.PREVIEW_ID);
+ if (on) {
+ page.showView(Activator.PREVIEW_ID);
} else {
- activePage.hideView((ViewPart) viewReference.getPart(false));
+ IViewReference viewReference = page.findViewReference(Activator.PREVIEW_ID);
+ if (viewReference != null) {
+ page.hideView(viewReference);
+ }
}
} catch (PartInitException ex) {
Activator.log.error(ex);
}
-
- return null;
}
@Override
- public void setEnabled(Object evaluationContext) {
- super.setEnabled(evaluationContext);
-
- IWorkbenchWindow activeWindow = (IWorkbenchWindow) HandlerUtil.getVariable(evaluationContext, ISources.ACTIVE_WORKBENCH_WINDOW_NAME);
- IWorkbenchPage activePage = activeWindow == null ? null : activeWindow.getActivePage();
- if (activePage == null) {
- return;
- }
-
- ICommandService commandService = activeWindow.getService(ICommandService.class);
- Command command = commandService.getCommand(COMMAND_ID);
-
- State state = (command == null) ? null : command.getState(STATE_ID);
- if (state == null) {
- return;
- }
+ protected boolean updateState(IWorkbenchPage page) {
+ return page.findViewReference(Activator.PREVIEW_ID) != null;
+ }
- IViewReference viewReference = activePage.findViewReference(Activator.PREVIEW_ID);
- state.setValue(viewReference != null);
+ @Override
+ protected boolean initializeFromState(IWorkbenchPage page, boolean on) {
+ return page.findViewReference(Activator.PREVIEW_ID) != null;
}
}
diff --git a/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/providers/ContextContentProvider.java b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/providers/ContextContentProvider.java
index dd7a0c37344..0268b51dd2b 100644
--- a/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/providers/ContextContentProvider.java
+++ b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/providers/ContextContentProvider.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2010, 2016 CEA LIST, Christian W. Damus, and others.
+ * Copyright (c) 2010, 2021 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,7 +10,7 @@
*
* Contributors:
* Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
- * Christian W. Damus - bug 485220
+ * Christian W. Damus - bugs 485220, 573986
*
*****************************************************************************/
package org.eclipse.papyrus.views.properties.toolsmiths.providers;
@@ -46,7 +46,7 @@ public class ContextContentProvider extends CustomizedTreeContentProvider {
* @return The root EObjects from the input ResourceSet
*/
@Override
- public EObject[] getRootElements(Object inputElement) {
+ public Object[] getRootElements(Object inputElement) {
if (inputElement instanceof ResourceSet) {
ResourceSet resourceSet = (ResourceSet) inputElement;
@@ -64,9 +64,10 @@ public class ContextContentProvider extends CustomizedTreeContentProvider {
}
}
elements.addAll(allContexts);
- return elements.toArray(new EObject[elements.size()]);
+ return elements.toArray();
}
- return null;
+
+ return super.getRootElements(inputElement);
}
@Override
diff --git a/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/query/GetVisibleFeaturesQuery.java b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/query/GetVisibleFeaturesQuery.java
index 2f35923e17e..97ad24ad1d3 100644
--- a/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/query/GetVisibleFeaturesQuery.java
+++ b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/query/GetVisibleFeaturesQuery.java
@@ -10,7 +10,7 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
- * Christian W. Damus - bug 573987
+ * Christian W. Damus - bugs 573987, 573986
*
*****************************************************************************/
@@ -32,10 +32,12 @@ import org.eclipse.papyrus.emf.facet.efacet.core.exception.DerivedTypedElementEx
import org.eclipse.papyrus.emf.facet.query.java.core.IJavaQuery2;
import org.eclipse.papyrus.emf.facet.query.java.core.IParameterValueList2;
import org.eclipse.papyrus.infra.constraints.ConstraintsPackage;
+import org.eclipse.papyrus.infra.properties.contexts.Annotatable;
import org.eclipse.papyrus.infra.properties.contexts.Context;
import org.eclipse.papyrus.infra.properties.contexts.ContextsPackage;
import org.eclipse.papyrus.infra.properties.contexts.util.ContextsSwitch;
import org.eclipse.papyrus.infra.properties.ui.UiPackage;
+import org.eclipse.papyrus.views.properties.toolsmiths.editor.actions.ToggleAnnotationsAction;
/**
* @author Camille Letavernier
@@ -56,11 +58,14 @@ public class GetVisibleFeaturesQuery implements IJavaQuery2<EObject, List<ERefer
allExcludedReferences.add(ContextsPackage.Literals.PROPERTY__CONTEXT_ELEMENT);
allExcludedReferences.add(ContextsPackage.Literals.ABSTRACT_SECTION__TAB);
allExcludedReferences.add(ContextsPackage.Literals.SECTION__OWNER);
+ allExcludedReferences.add(ContextsPackage.Literals.SECTION__VIEWS);
allExcludedReferences.add(ContextsPackage.Literals.TAB__AFTER_TAB);
allExcludedReferences.add(ContextsPackage.Literals.TAB__SECTIONS);
allExcludedReferences.add(ContextsPackage.Literals.TAB__ALL_SECTIONS);
allExcludedReferences.add(ContextsPackage.Literals.VIEW__CONTEXT);
allExcludedReferences.add(ContextsPackage.Literals.VIEW__DATACONTEXTS);
+ allExcludedReferences.add(ContextsPackage.Literals.ANNOTATION__ELEMENT);
+ allExcludedReferences.add(ContextsPackage.Literals.ANNOTATION__REFERENCES);
allExcludedReferences.add(UiPackage.Literals.COMPOSITE_WIDGET__WIDGET_TYPE);
allExcludedReferences.add(UiPackage.Literals.UI_COMPONENT__ATTRIBUTES);
@@ -90,6 +95,11 @@ public class GetVisibleFeaturesQuery implements IJavaQuery2<EObject, List<ERefer
}
@Override
+ public List<EReference> caseAnnotatable(Annotatable object) {
+ return filter(object.eClass(), filterAnnotationReferences(object));
+ }
+
+ @Override
public java.util.List<EReference> defaultCase(EObject object) {
return filter(object.eClass(), ref -> true);
};
@@ -106,6 +116,17 @@ public class GetVisibleFeaturesQuery implements IJavaQuery2<EObject, List<ERefer
return ref -> {
if (ref == ContextsPackage.Literals.CONTEXT__PROTOTYPE) { // Show the Prototype reference only if it is set
return object.getPrototype() != null;
+ } else if (ref == ContextsPackage.Literals.ANNOTATABLE__ANNOTATIONS) {
+ return ToggleAnnotationsAction.showAnnotations;
+ }
+ return true;
+ };
+ }
+
+ protected Predicate<EReference> filterAnnotationReferences(Annotatable object) {
+ return ref -> {
+ if (ref == ContextsPackage.Literals.ANNOTATABLE__ANNOTATIONS) {
+ return ToggleAnnotationsAction.showAnnotations;
}
return true;
};
diff --git a/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/query/ShowAnnotationsQuery.java b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/query/ShowAnnotationsQuery.java
new file mode 100644
index 00000000000..05be5c6d877
--- /dev/null
+++ b/plugins/views/properties/org.eclipse.papyrus.views.properties.toolsmiths/src/org/eclipse/papyrus/views/properties/toolsmiths/query/ShowAnnotationsQuery.java
@@ -0,0 +1,34 @@
+/*****************************************************************************
+ * Copyright (c) 2011, 2021 CEA LIST, Christian W. Damus, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
+ * Christian W. Damus - bug 573986
+ *****************************************************************************/
+package org.eclipse.papyrus.views.properties.toolsmiths.query;
+
+import org.eclipse.papyrus.emf.facet.efacet.core.IFacetManager;
+import org.eclipse.papyrus.emf.facet.efacet.core.exception.DerivedTypedElementException;
+import org.eclipse.papyrus.emf.facet.query.java.core.IJavaQuery2;
+import org.eclipse.papyrus.emf.facet.query.java.core.IParameterValueList2;
+import org.eclipse.papyrus.infra.properties.contexts.Context;
+import org.eclipse.papyrus.views.properties.toolsmiths.editor.actions.ToggleAnnotationsAction;
+
+/**
+ * A Query to test whether annotations are shown in the <em>Properties Context Editor</em>.
+ */
+public class ShowAnnotationsQuery implements IJavaQuery2<Context, Boolean> {
+
+ @Override
+ public Boolean evaluate(Context source, IParameterValueList2 parameterValues, IFacetManager facetManager) throws DerivedTypedElementException {
+ return ToggleAnnotationsAction.showAnnotations;
+ }
+
+}
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.suite.tests/META-INF/MANIFEST.MF b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.suite.tests/META-INF/MANIFEST.MF
index 938de45a3ad..013ad8ecf0d 100755
--- a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.suite.tests/META-INF/MANIFEST.MF
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.suite.tests/META-INF/MANIFEST.MF
@@ -19,6 +19,7 @@ Require-Bundle: org.eclipse.emf.edit.ui;bundle-version="[2.18.0,3.0.0)",
org.eclipse.papyrus.toolsmiths.validation.elementtypes.tests;bundle-version="[2.0.0,3.0.0)",
org.eclipse.papyrus.toolsmiths.validation.profile.tests;bundle-version="[2.0.0,3.0.0)",
org.eclipse.papyrus.toolsmiths.validation.newchild.tests;bundle-version="[2.0.0,3.0.0)",
+ org.eclipse.papyrus.toolsmiths.validation.properties.tests;bundle-version="[1.0.0,2.0.0)",
org.eclipse.ui.views.properties.tabbed;bundle-version="[3.8.0,4.0.0)",
org.junit;bundle-version="[4.13.0,5.0.0)"
Export-Package: org.eclipse.papyrus.toolsmiths.suite.tests
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.suite.tests/test/org/eclipse/papyrus/toolsmiths/suite/tests/AllTests.java b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.suite.tests/test/org/eclipse/papyrus/toolsmiths/suite/tests/AllTests.java
index 30b310e6e86..39f43ec9508 100644
--- a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.suite.tests/test/org/eclipse/papyrus/toolsmiths/suite/tests/AllTests.java
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.suite.tests/test/org/eclipse/papyrus/toolsmiths/suite/tests/AllTests.java
@@ -11,7 +11,7 @@
*
* Contributors:
* Pauline DEVILLE (CEA LIST) pauline.deville@cea.fr - Initial API and implementation
- * Christian W. Damus - bugs 572677, 572633
+ * Christian W. Damus - bugs 572677, 572633, 573986
*
*****************************************************************************/
package org.eclipse.papyrus.toolsmiths.suite.tests;
@@ -45,6 +45,7 @@ public class AllTests {
suiteClasses.add(new PluginTestSuiteClass(org.eclipse.papyrus.toolsmiths.validation.elementtypes.tests.AllTests.class));
suiteClasses.add(new PluginTestSuiteClass(org.eclipse.papyrus.toolsmiths.validation.profile.tests.AllTests.class));
suiteClasses.add(new PluginTestSuiteClass(org.eclipse.papyrus.toolsmiths.validation.newchild.tests.AllTests.class));
+ suiteClasses.add(new PluginTestSuiteClass(org.eclipse.papyrus.toolsmiths.validation.properties.tests.AllTests.class));
// end
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.architecture.tests/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/quickfix/tests/ModelQuickFixTests.java b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.architecture.tests/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/quickfix/tests/ModelQuickFixTests.java
index a5bc8bde0ec..9b15044cfae 100644
--- a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.architecture.tests/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/quickfix/tests/ModelQuickFixTests.java
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.architecture.tests/src/org/eclipse/papyrus/toolsmiths/validation/architecture/internal/quickfix/tests/ModelQuickFixTests.java
@@ -15,35 +15,17 @@
package org.eclipse.papyrus.toolsmiths.validation.architecture.internal.quickfix.tests;
-import static org.eclipse.papyrus.junit.matchers.MoreMatchers.greaterThanOrEqual;
-import static org.eclipse.papyrus.junit.matchers.MoreMatchers.isEmpty;
import static org.eclipse.papyrus.toolsmiths.validation.architecture.constants.ArchitecturePluginValidationConstants.ARCHITECTURE_PLUGIN_VALIDATION_MARKER_TYPE;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.notNullValue;
-import static org.hamcrest.MatcherAssert.assertThat;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
import org.eclipse.papyrus.toolsmiths.validation.architecture.constants.ArchitecturePluginValidationConstants;
import org.eclipse.papyrus.toolsmiths.validation.architecture.internal.quickfix.ArchitectureMarkerResolutionGenerator;
-import org.eclipse.papyrus.toolsmiths.validation.common.checkers.IPluginChecker2;
import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.Build;
import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.MarkerType;
import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.OverlayFile;
+import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.QuickFix;
+import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.QuickFixWith;
import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.TestProject;
import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.TestProjectFixture;
-import org.eclipse.ui.IMarkerResolution;
-import org.eclipse.ui.IMarkerResolutionGenerator2;
-import org.junit.After;
-import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -52,14 +34,12 @@ import org.junit.Test;
*/
@TestProject("org.eclipse.papyrus.toolsmiths.validation.architecture.example")
@MarkerType(ARCHITECTURE_PLUGIN_VALIDATION_MARKER_TYPE)
+@QuickFixWith(ArchitectureMarkerResolutionGenerator.class)
@Build
public class ModelQuickFixTests {
private static final String MODEL_PATH = "resources/BookStore.architecture"; //$NON-NLS-1$
- private List<IMarker> modelMarkers;
- private List<Map<String, Object>> fixedMarkers = new ArrayList<>();
-
/**
* The project fixture to manage easily the project.
*/
@@ -70,72 +50,11 @@ public class ModelQuickFixTests {
super();
}
- /**
- * Test the marker resolution for the Representations Advice warning.
- *
- * @see <a href="https://eclip.se/573788">bug 573788</a>
- */
@OverlayFile(value = "bug573788-models/BookStore-noRepresentationsAdvice.architecture", path = MODEL_PATH)
+ @QuickFix(ArchitecturePluginValidationConstants.MISSING_REPRESENTATIONS_ADVICE_ID)
@Test
public void representationsAdviceFix() {
- fix(ArchitecturePluginValidationConstants.MISSING_REPRESENTATIONS_ADVICE_ID);
- }
-
- //
- // Test framework
- //
-
- @Before
- public void initMarkers() {
- modelMarkers = fixture.getMarkers(MODEL_PATH);
- }
-
- @After
- public void verifyFixes() {
- if (!fixedMarkers.isEmpty()) {
- fixture.build();
-
- Set<Map<String, Object>> newMarkerAttributes = getMarkerAttributes(fixture.getMarkers(MODEL_PATH));
- Set<Map<String, Object>> unfixed = new HashSet<>(fixedMarkers);
- unfixed.retainAll(newMarkerAttributes);
-
- assertThat("Some problem(s) not fixed", unfixed, isEmpty());
- }
- }
-
- Map<String, Object> getAttributes(IMarker marker) {
- try {
- return marker.getAttributes();
- } catch (CoreException e) {
- throw new AssertionError("Failed to extract marker attributes.", e);
- }
- }
-
- Set<Map<String, Object>> getMarkerAttributes(Collection<? extends IMarker> markers) {
- return markers.stream()
- .map(this::getAttributes)
- .collect(Collectors.toSet());
- }
-
- void fix(int problemID) {
- IMarker marker = getFixableMarker(problemID);
- Map<String, Object> attributes = getAttributes(marker);
-
- IMarkerResolutionGenerator2 generator = new ArchitectureMarkerResolutionGenerator();
- assertThat("No quick fix available for problem " + problemID, generator.hasResolutions(marker), is(true));
- IMarkerResolution[] fixes = generator.getResolutions(marker);
- assertThat("No quick fix provided by generator", fixes.length, greaterThanOrEqual(1));
- fixes[0].run(marker);
-
- fixedMarkers.add(attributes);
- }
-
- IMarker getFixableMarker(int problemID) {
- IPluginChecker2.MarkerAttribute attr = IPluginChecker2.problem(problemID);
- IMarker result = modelMarkers.stream().filter(m -> m.getAttribute(attr.getName(), -1) == problemID)
- .findAny().orElse(null);
- assertThat("Fixable problem marker not found: " + problemID, result, notNullValue());
- return result;
+ // Automatic test
}
}
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.common.tests/META-INF/MANIFEST.MF b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.common.tests/META-INF/MANIFEST.MF
index 5540c45c23d..b4d03a432f0 100644
--- a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.common.tests/META-INF/MANIFEST.MF
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.common.tests/META-INF/MANIFEST.MF
@@ -22,3 +22,4 @@ Export-Package: org.eclipse.papyrus.toolsmiths.validation.common.tests,
Automatic-Module-Name: org.eclipse.papyrus.toolsmiths.validation.common.tests
Bundle-Vendor: %providerName
Bundle-Localization: plugin
+Import-Package: com.google.common.collect;version="[30.1.0,31.0.0)"
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.common.tests/resources/org.eclipse.papyrus.toolsmiths.validation.common.example/META-INF/MANIFEST.MF b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.common.tests/resources/org.eclipse.papyrus.toolsmiths.validation.common.example/META-INF/MANIFEST.MF
index 3bf14ab78ab..ce93313d7c9 100644
--- a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.common.tests/resources/org.eclipse.papyrus.toolsmiths.validation.common.example/META-INF/MANIFEST.MF
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.common.tests/resources/org.eclipse.papyrus.toolsmiths.validation.common.example/META-INF/MANIFEST.MF
@@ -14,3 +14,4 @@ Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.18.0,4.0.0)",
Bundle-RequiredExecutionEnvironment: JavaSE-11
Automatic-Module-Name: org.eclipse.papyrus.toolsmiths.validation.common.example
Bundle-ActivationPolicy: lazy
+Bundle-Activator: org.eclipse.papyrus.toolsmiths.validation.common.example.Activator
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.common.tests/resources/org.eclipse.papyrus.toolsmiths.validation.common.example/src/org/eclipse/papyrus/toolsmiths/validation/common/example/Activator.java b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.common.tests/resources/org.eclipse.papyrus.toolsmiths.validation.common.example/src/org/eclipse/papyrus/toolsmiths/validation/common/example/Activator.java
new file mode 100644
index 00000000000..0577a0e9e43
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.common.tests/resources/org.eclipse.papyrus.toolsmiths.validation.common.example/src/org/eclipse/papyrus/toolsmiths/validation/common/example/Activator.java
@@ -0,0 +1,32 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Patrick Tessier, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Patrick Tessier (CEA LIST)- Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.toolsmiths.validation.common.example;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class Activator implements BundleActivator {
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+
+ }
+
+}
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.common.tests/src/org/eclipse/papyrus/toolsmiths/validation/common/tests/rules/QuickFix.java b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.common.tests/src/org/eclipse/papyrus/toolsmiths/validation/common/tests/rules/QuickFix.java
new file mode 100644
index 00000000000..10bd051da06
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.common.tests/src/org/eclipse/papyrus/toolsmiths/validation/common/tests/rules/QuickFix.java
@@ -0,0 +1,38 @@
+/*****************************************************************************
+ * Copyright (c) 2020 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.common.tests.rules;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Annotates a test with the quick fix problem ID to verify.
+ *
+ * @see QuickFixWith
+ * @see TestProjectFixture
+ */
+@Target({ ElementType.METHOD })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface QuickFix {
+
+ /** The problem ID to fix. */
+ int value();
+
+ /** If there are possibly multiple resources that can have the problem to fix, the path to the resource to fix. */
+ String path() default "";
+}
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.common.tests/src/org/eclipse/papyrus/toolsmiths/validation/common/tests/rules/QuickFixWith.java b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.common.tests/src/org/eclipse/papyrus/toolsmiths/validation/common/tests/rules/QuickFixWith.java
new file mode 100644
index 00000000000..4ffd6891ebb
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.common.tests/src/org/eclipse/papyrus/toolsmiths/validation/common/tests/rules/QuickFixWith.java
@@ -0,0 +1,37 @@
+/*****************************************************************************
+ * Copyright (c) 2020 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.common.tests.rules;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.eclipse.ui.IMarkerResolutionGenerator2;
+
+/**
+ * Annotates a test or test class with the marker resolution generator to use
+ * for testing quick fixes. If absent, the test does not verify quick fixes.
+ *
+ * @see QuickFix
+ * @see TestProjectFixture
+ */
+@Target({ ElementType.METHOD, ElementType.TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface QuickFixWith {
+ /** The marker resolution generator class to instantiate. */
+ Class<? extends IMarkerResolutionGenerator2> value();
+}
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.common.tests/src/org/eclipse/papyrus/toolsmiths/validation/common/tests/rules/TestProjectFixture.java b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.common.tests/src/org/eclipse/papyrus/toolsmiths/validation/common/tests/rules/TestProjectFixture.java
index 8fa6191704e..b6574651ca9 100644
--- a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.common.tests/src/org/eclipse/papyrus/toolsmiths/validation/common/tests/rules/TestProjectFixture.java
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.common.tests/src/org/eclipse/papyrus/toolsmiths/validation/common/tests/rules/TestProjectFixture.java
@@ -15,6 +15,10 @@
package org.eclipse.papyrus.toolsmiths.validation.common.tests.rules;
+import static org.eclipse.papyrus.junit.matchers.MoreMatchers.greaterThanOrEqual;
+import static org.eclipse.papyrus.junit.matchers.MoreMatchers.isEmpty;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.MatcherAssert.assertThat;
@@ -27,6 +31,7 @@ import java.net.URL;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
@@ -67,6 +72,8 @@ import org.eclipse.papyrus.junit.utils.rules.ProjectFixture;
import org.eclipse.papyrus.toolsmiths.plugin.builder.preferences.PluginBuilderPreferencesConstants;
import org.eclipse.papyrus.toolsmiths.validation.common.checkers.IPluginChecker2;
import org.eclipse.papyrus.toolsmiths.validation.common.utils.ModelResourceMapper;
+import org.eclipse.ui.IMarkerResolution;
+import org.eclipse.ui.IMarkerResolutionGenerator2;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
@@ -100,6 +107,10 @@ public class TestProjectFixture extends ProjectFixture {
private String projectNameOverride;
private final Set<String> filteredDiagnosticSources = new HashSet<>();
+ // Quick-fix testing
+ private List<IMarker> modelMarkers;
+ private List<Map<String, Object>> fixedMarkers = new ArrayList<>();
+
/**
* Initializes me.
*/
@@ -123,6 +134,12 @@ public class TestProjectFixture extends ProjectFixture {
@Override
public Statement apply(Statement base, Description description) {
+ QuickFixWith fixWith = JUnitUtils.getAnnotation(description, QuickFixWith.class);
+ QuickFix fix = JUnitUtils.getAnnotation(description, QuickFix.class);
+ if (fixWith != null && fix != null && fixWith.value() != null) {
+ base = new QuickFixes(fixWith, fix, base);
+ }
+
Build build = JUnitUtils.getAnnotation(description, Build.class);
if (build != null && build.value()) {
base = new BuildProject(base);
@@ -412,6 +429,40 @@ public class TestProjectFixture extends ProjectFixture {
});
}
+ public Map<String, Object> getAttributes(IMarker marker) {
+ try {
+ return marker.getAttributes();
+ } catch (CoreException e) {
+ throw new AssertionError("Failed to extract marker attributes.", e);
+ }
+ }
+
+ public Set<Map<String, Object>> getMarkerAttributes(Collection<? extends IMarker> markers) {
+ return markers.stream()
+ .map(this::getAttributes)
+ .collect(Collectors.toSet());
+ }
+
+ public void fix(int problemID, IMarkerResolutionGenerator2 resolutionGenerator) {
+ IMarker marker = getFixableMarker(problemID);
+ Map<String, Object> attributes = getAttributes(marker);
+
+ assertThat("No quick fix available for problem " + problemID, resolutionGenerator.hasResolutions(marker), is(true));
+ IMarkerResolution[] fixes = resolutionGenerator.getResolutions(marker);
+ assertThat("No quick fix provided by generator", fixes.length, greaterThanOrEqual(1));
+ fixes[0].run(marker);
+
+ fixedMarkers.add(attributes);
+ }
+
+ public IMarker getFixableMarker(int problemID) {
+ IPluginChecker2.MarkerAttribute attr = IPluginChecker2.problem(problemID);
+ IMarker result = modelMarkers.stream().filter(m -> m.getAttribute(attr.getName(), -1) == problemID)
+ .findAny().orElse(null);
+ assertThat("Fixable problem marker not found: " + problemID, result, notNullValue());
+ return result;
+ }
+
//
// Nested types
//
@@ -735,4 +786,68 @@ public class TestProjectFixture extends ProjectFixture {
}
+ private final class QuickFixes extends Statement {
+
+ private final Class<? extends IMarkerResolutionGenerator2> quickFixer;
+ private final int problemID;
+ private final Optional<String> path;
+
+ private final Statement base;
+
+ QuickFixes(QuickFixWith fixWith, QuickFix fix, Statement base) {
+ super();
+
+ this.quickFixer = fixWith.value();
+ this.problemID = fix.value();
+ this.path = Optional.ofNullable(fix.path()).filter(Predicate.not(String::isBlank));
+
+ this.base = base;
+ }
+
+ @Override
+ public void evaluate() throws Throwable {
+ String path = resourceToFix();
+ modelMarkers = getMarkers(path);
+
+ try {
+ base.evaluate();
+
+ IMarkerResolutionGenerator2 generator = quickFixer.getConstructor().newInstance();
+ fix(problemID, generator);
+
+ assertThat("No problem markers processed by quick fix", fixedMarkers, not(isEmpty()));
+
+ build();
+
+ Set<Map<String, Object>> newMarkerAttributes = getMarkerAttributes(getMarkers(path));
+ Set<Map<String, Object>> unfixed = new HashSet<>(fixedMarkers);
+ unfixed.retainAll(newMarkerAttributes);
+
+ assertThat("Some problem(s) not fixed", unfixed, isEmpty());
+ } finally {
+ modelMarkers = null;
+ }
+ }
+
+ private String resourceToFix() {
+ return path.or(this::findResourceToFix)
+ .orElseThrow(() -> new AssertionError(String.format("Could not find resource to fix problem ID 0x%x.", problemID)));
+ }
+
+ private Optional<String> findResourceToFix() {
+ Optional<IResource> result;
+
+ try {
+ result = Stream.of(getProject().findMarkers(markerType, false, IResource.DEPTH_INFINITE))
+ .filter(marker -> marker.getAttribute("problemId", -1) == problemID)
+ .map(IMarker::getResource)
+ .findAny();
+ } catch (CoreException e) {
+ throw new AssertionError("Failed to search markers in project.", e);
+ }
+
+ return result.map(IResource::getProjectRelativePath).map(Object::toString);
+ }
+ }
+
}
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.elementtypes.tests/resources/org.eclipse.papyrus.toolsmiths.validation.elementtypes.resources/.project b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.elementtypes.tests/resources/org.eclipse.papyrus.toolsmiths.validation.elementtypes.resources/.project
index e792a714655..4eb12eccaea 100644
--- a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.elementtypes.tests/resources/org.eclipse.papyrus.toolsmiths.validation.elementtypes.resources/.project
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.elementtypes.tests/resources/org.eclipse.papyrus.toolsmiths.validation.elementtypes.resources/.project
@@ -20,11 +20,6 @@
<arguments>
</arguments>
</buildCommand>
- <buildCommand>
- <name>org.eclipse.papyrus.plugin.builder</name>
- <arguments>
- </arguments>
- </buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.pde.PluginNature</nature>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/.classpath b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/.classpath
new file mode 100644
index 00000000000..9758da65af4
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/.classpath
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11">
+ <attributes>
+ <attribute name="module" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <accessrules>
+ <accessrule kind="accessible" pattern="org/eclipse/papyrus/toolsmiths/validation/properties/internal/**"/>
+ </accessrules>
+ </classpathentry>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/.project b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/.project
new file mode 100644
index 00000000000..9074a88cab0
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.papyrus.toolsmiths.validation.properties.tests</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/.settings/org.eclipse.core.resources.prefs b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000000..896a9a53a53
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8 \ No newline at end of file
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/.settings/org.eclipse.core.runtime.prefs b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/.settings/org.eclipse.core.runtime.prefs
new file mode 100644
index 00000000000..5a0ad22d2a7
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/.settings/org.eclipse.core.runtime.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+line.separator=\n
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/.settings/org.eclipse.jdt.core.prefs b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..037f04a07c2
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,319 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=11
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=260
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=false
+org.eclipse.jdt.core.formatter.join_wrapped_lines=false
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=260
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=5
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=false
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/.settings/org.eclipse.jdt.ui.prefs b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 00000000000..ba7542ef658
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,127 @@
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.convert_functional_interfaces=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.correct_indentation=false
+cleanup.format_source_code=false
+cleanup.format_source_code_changes_only=false
+cleanup.insert_inferred_type_arguments=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=false
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=false
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.organize_imports=false
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=true
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.remove_private_constructors=true
+cleanup.remove_redundant_type_arguments=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=true
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.use_anonymous_class_creation=false
+cleanup.use_blocks=true
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_lambda=true
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_type_arguments=false
+cleanup_profile=_Papyrus
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Papyrus
+formatter_settings_version=12
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;com;
+org.eclipse.jdt.ui.javadoc=true
+org.eclipse.jdt.ui.ondemandthreshold=99
+org.eclipse.jdt.ui.staticondemandthreshold=99
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="false" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * Constructor.\n *\n * ${tags}\n */</template><template autoinsert\="false" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*****************************************************************************\n * Copyright (c) ${year} CEA LIST and others.\n * \n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License 2.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n *\n * Contributors\:\n * CEA LIST - Initial API and implementation\n * \n *****************************************************************************/\n</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/**\n * ${see_to_overridden}\n *\n * ${tags}\n */</template><template autoinsert\="false" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${see_to_target}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_functional_interfaces=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.make_local_variable_final=true
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_modifiers=false
+sp_cleanup.remove_redundant_type_arguments=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=true
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=true
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/.settings/org.eclipse.pde.api.tools.prefs b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/.settings/org.eclipse.pde.api.tools.prefs
new file mode 100644
index 00000000000..b2260f87129
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/.settings/org.eclipse.pde.api.tools.prefs
@@ -0,0 +1,104 @@
+ANNOTATION_ELEMENT_TYPE_ADDED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
+ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
+ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Warning
+API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Warning
+API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
+API_USE_SCAN_FIELD_SEVERITY=Error
+API_USE_SCAN_METHOD_SEVERITY=Error
+API_USE_SCAN_TYPE_SEVERITY=Error
+CLASS_ELEMENT_TYPE_ADDED_FIELD=Warning
+CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
+CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
+CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
+CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
+CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
+ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
+ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
+ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+FIELD_ELEMENT_TYPE_ADDED_VALUE=Warning
+FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
+FIELD_ELEMENT_TYPE_CHANGED_VALUE=Warning
+FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
+FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
+ILLEGAL_EXTEND=Warning
+ILLEGAL_IMPLEMENT=Warning
+ILLEGAL_INSTANTIATE=Warning
+ILLEGAL_OVERRIDE=Warning
+ILLEGAL_REFERENCE=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_DEFAULT_METHOD=Warning
+INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Ignore
+INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
+INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
+INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
+INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+INVALID_ANNOTATION=Ignore
+INVALID_JAVADOC_TAG=Ignore
+INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Ignore
+LEAK_EXTEND=Warning
+LEAK_FIELD_DECL=Warning
+LEAK_IMPLEMENT=Warning
+LEAK_METHOD_PARAM=Warning
+LEAK_METHOD_RETURN_TYPE=Warning
+METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
+METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
+METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
+METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
+METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
+METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
+METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
+MISSING_EE_DESCRIPTIONS=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
+TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
+UNUSED_PROBLEM_FILTERS=Warning
+automatically_removed_unused_problem_filters=Enabled
+changed_execution_env=Warning
+eclipse.preferences.version=1
+incompatible_api_component_version=Warning
+incompatible_api_component_version_include_major_without_breaking_change=Disabled
+incompatible_api_component_version_include_minor_without_api_change=Disabled
+incompatible_api_component_version_report_major_without_breaking_change=Error
+incompatible_api_component_version_report_minor_without_api_change=Error
+invalid_since_tag_version=Error
+malformed_since_tag=Error
+missing_since_tag=Error
+report_api_breakage_when_major_version_incremented=Disabled
+report_resolution_errors_api_component=Warning
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/META-INF/MANIFEST.MF b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..893286a4350
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,25 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.papyrus.toolsmiths.validation.properties.tests;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-RequiredExecutionEnvironment: JavaSE-11
+Require-Bundle: org.eclipse.emf.edit.ui;bundle-version="[2.18.0,3.0.0)",
+ org.eclipse.gmf.runtime.common.ui;bundle-version="[1.8.0,2.0.0)",
+ org.eclipse.gmf.runtime.emf.type.core;bundle-version="[1.9.0,2.0.0)",
+ org.eclipse.papyrus.infra.core.log;bundle-version="[2.0.0,3.0.0)",
+ org.eclipse.papyrus.junit.framework;bundle-version="[2.0.0,3.0.0)",
+ org.eclipse.papyrus.junit.utils;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.papyrus.toolsmiths.validation.properties;bundle-version="[1.0.0,2.0.0)",
+ org.eclipse.ui.views.properties.tabbed;bundle-version="[3.8.0,4.0.0)",
+ org.junit;bundle-version="[4.13.0,5.0.0)",
+ org.eclipse.papyrus.toolsmiths.plugin.builder;bundle-version="[1.0.0,2.0.0)",
+ org.eclipse.papyrus.toolsmiths.validation.common;bundle-version="[2.0.0,3.0.0)",
+ org.eclipse.uml2.uml;bundle-version="[5.5.0,6.0.0)",
+ org.eclipse.papyrus.toolsmiths.validation.common.tests;bundle-version="[2.0.0,3.0.0)",
+ org.eclipse.papyrus.uml.diagram.clazz;bundle-version="[5.0.0,6.0.0)",
+ org.eclipse.ui.ide;bundle-version="[3.18.0,4.0.0)"
+Export-Package: org.eclipse.papyrus.toolsmiths.validation.properties.tests
+Automatic-Module-Name: org.eclipse.papyrus.toolsmiths.validation.properties.tests
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/about.html b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/about.html
new file mode 100644
index 00000000000..ef2872f2845
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>November 30, 2017</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 2.0 (&quot;EPL&quot;). A copy of the EPL is available
+at <a href="https://www.eclipse.org/legal/epl-2.0/">https://www.eclipse.org/legal/epl-2.0/</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html> \ No newline at end of file
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/build.properties b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/build.properties
new file mode 100644
index 00000000000..071a645751e
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/build.properties
@@ -0,0 +1,8 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ resources/,\
+ about.html,\
+ plugin.properties
+src.includes = about.html
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/plugin.properties b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/plugin.properties
new file mode 100644
index 00000000000..dcd9bc2f39e
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/plugin.properties
@@ -0,0 +1,18 @@
+#################################################################################
+# Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+# Christian W. Damus - Initial API and implementation
+#
+##################################################################################
+
+pluginName = Papyrus Architecture Model Project Builder Test Plug-in
+providerName = Eclipse Modeling Project
+pluginDescription=This plug-in provides JUnit tests for the Architecture Model Project Builder.
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/pom.xml b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/pom.xml
new file mode 100644
index 00000000000..f2a4451d7ca
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/pom.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.eclipse.papyrus.tests</groupId>
+ <artifactId>org.eclipse.papyrus.toolsmiths.tests.releng</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ </parent>
+ <groupId>org.eclipse.papyrus.tests</groupId>
+ <artifactId>org.eclipse.papyrus.toolsmiths.validation.properties.tests</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <packaging>eclipse-test-plugin</packaging>
+</project> \ No newline at end of file
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/extensions/plugin-noContext.xml b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/extensions/plugin-noContext.xml
new file mode 100644
index 00000000000..93ac00d0e7d
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/extensions/plugin-noContext.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+
+<!--
+ Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License 2.0
+ which accompanies this distribution, and is available at
+ https://www.eclipse.org/legal/epl-2.0/
+
+ SPDX-License-Identifier: EPL-2.0
+
+ Contributors:
+ Christian W. Damus - Initial API and implementation
+-->
+
+<plugin>
+
+ <extension
+ point="org.eclipse.emf.ecore.dynamic_package">
+ <resource
+ uri="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"
+ location="resources/BookStore.profile.uml#_e24cAVG7EeuXzM4mqVly4g">
+ </resource>
+ </extension>
+ <extension
+ point="org.eclipse.uml2.uml.dynamic_package">
+ <profile
+ uri="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"
+ location="resources/BookStore.profile.uml#_gnO0wFG6EeuXzM4mqVly4g">
+ </profile>
+ </extension>
+
+ <extension
+ point="org.eclipse.papyrus.infra.properties.environments">
+ <environment
+ environmentModel="resources/BookStore.xmi">
+ </environment>
+ </extension>
+
+</plugin>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/extensions/plugin-noEnvironment.xml b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/extensions/plugin-noEnvironment.xml
new file mode 100644
index 00000000000..73a9bd0d431
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/extensions/plugin-noEnvironment.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+
+<!--
+ Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License 2.0
+ which accompanies this distribution, and is available at
+ https://www.eclipse.org/legal/epl-2.0/
+
+ SPDX-License-Identifier: EPL-2.0
+
+ Contributors:
+ Christian W. Damus - Initial API and implementation
+-->
+
+<plugin>
+
+ <extension
+ point="org.eclipse.emf.ecore.dynamic_package">
+ <resource
+ uri="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"
+ location="resources/BookStore.profile.uml#_e24cAVG7EeuXzM4mqVly4g">
+ </resource>
+ </extension>
+ <extension
+ point="org.eclipse.uml2.uml.dynamic_package">
+ <profile
+ uri="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"
+ location="resources/BookStore.profile.uml#_gnO0wFG6EeuXzM4mqVly4g">
+ </profile>
+ </extension>
+
+ <extension
+ point="org.eclipse.papyrus.infra.properties.contexts">
+ <context
+ contextModel="resources/BookStore.ctx">
+ </context>
+ </extension>
+
+</plugin>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/manifest/BookStore-missingClassDependency.xmi b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/manifest/BookStore-missingClassDependency.xmi
new file mode 100644
index 00000000000..fe864e1963b
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/manifest/BookStore-missingClassDependency.xmi
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<environment:Environment
+ xmi:version="2.0"
+ xmlns:xmi="http://www.omg.org/XMI"
+ xmlns:environment="http://www.eclipse.org/papyrus/properties/environment/0.9"
+ xmi:id="_FMCggMVhEeuKDMwJXd21Mg">
+ <modelElementFactories
+ xmi:id="_L5mksMVhEeuKDMwJXd21Mg"
+ name="Vendor"
+ factoryClass="org.eclipse.papyrus.toolsmiths.validation.properties.example.modelelement.VendorModelElementFactory"/>
+ <modelElementFactories
+ xmi:id="_d3C8IMeaEeuQ8O63UYhvCw"
+ name="Book"
+ factoryClass="org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1.modelelement.BookModelElementFactory"/>
+</environment:Environment>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/manifest/BookStore-unresolvedClassName.xmi b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/manifest/BookStore-unresolvedClassName.xmi
new file mode 100644
index 00000000000..9998cef7323
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/manifest/BookStore-unresolvedClassName.xmi
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<environment:Environment xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:environment="http://www.eclipse.org/papyrus/properties/environment/0.9" xmi:id="_FMCggMVhEeuKDMwJXd21Mg">
+ <modelElementFactories xmi:id="_L5mksMVhEeuKDMwJXd21Mg" name="Vendor" factoryClass="org.eclipse.papyrus.toolsmiths.validation.properties.example.modelelement.VendorModelElementFactory"/>
+ <modelElementFactories xmi:id="_d3C8IMeaEeuQ8O63UYhvCw" name="Boo" factoryClass="org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1.modelelement.BooModelElementFactory"/>
+</environment:Environment>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/manifest/MANIFEST-missingDependency.MF b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/manifest/MANIFEST-missingDependency.MF
new file mode 100644
index 00000000000..b44914d908e
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/manifest/MANIFEST-missingDependency.MF
@@ -0,0 +1,34 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.papyrus.toolsmiths.validation.properties.example;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-ClassPath: .
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.18.0,4.0.0)",
+ org.eclipse.papyrus.infra.architecture;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.papyrus.infra.properties;bundle-version="[4.0.0,5.0.0)",
+ org.eclipse.papyrus.infra.gmfdiag.commands;bundle-version="[4.0.0,5.0.0)",
+ org.eclipse.papyrus.infra.gmfdiag.common;bundle-version="[4.0.0,5.0.0)",
+ org.eclipse.papyrus.infra.core;bundle-version="[4.0.0,5.0.0)",
+ org.eclipse.emf.ecore;bundle-version="[2.23.0,3.0.0)",
+ org.eclipse.gmf.runtime.notation;bundle-version="[1.10.0,2.0.0)",
+ org.eclipse.gmf.runtime.common.core;bundle-version="[1.7.0,2.0.0)",
+ org.eclipse.papyrus.infra.viewpoints.policy;bundle-version="[4.0.0,5.0.0)",
+ org.eclipse.gmf.runtime.diagram.core;bundle-version="[1.7.0,2.0.0)",
+ org.eclipse.papyrus.infra.types;bundle-version="[5.0.0,6.0.0)",
+ org.eclipse.papyrus.infra.types.core;bundle-version="[5.0.0,6.0.0)",
+ org.eclipse.uml2.uml;bundle-version="[5.5.0,6.0.0)",
+ org.eclipse.uml2.uml.resources;bundle-version="[5.5.0,6.0.0)",
+ org.eclipse.papyrus.uml.service.types;bundle-version="[5.0.0,6.0.0)",
+ org.eclipse.papyrus.uml.diagram.common;bundle-version="[4.0.0,5.0.0)",
+ org.eclipse.papyrus.infra.gmfdiag.paletteconfiguration;bundle-version="[5.0.0,6.0.0)",
+ org.eclipse.papyrus.infra.properties.ui;bundle-version="[4.1.0,5.0.0)",
+ org.eclipse.papyrus.infra.emf;bundle-version="[4.1.0,5.0.0)",
+ org.eclipse.papyrus.infra.widgets;bundle-version="[4.1.0,5.0.0)",
+ org.eclipse.core.databinding;bundle-version="[1.10.100,2.0.0)",
+ org.eclipse.jface;bundle-version="[3.22.100,4.0.0)"
+Bundle-RequiredExecutionEnvironment: JavaSE-11
+Automatic-Module-Name: org.eclipse.papyrus.toolsmiths.validation.properties.example
+Bundle-ActivationPolicy: lazy
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-deletedEClass.ecore b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-deletedEClass.ecore
new file mode 100644
index 00000000000..976ffd29d71
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-deletedEClass.ecore
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="BookStore" nsURI="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"
+ nsPrefix="store">
+ <eClassifiers xsi:type="ecore:EClass" name="BookStore">
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="bookDispositions" lowerBound="1"
+ upperBound="-1" eType="#//DispositionKind"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EEnum" name="DispositionKind"/>
+ <eClassifiers xsi:type="ecore:EClass" name="Book"/>
+</ecore:EPackage>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-deletedProperty.ecore b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-deletedProperty.ecore
new file mode 100644
index 00000000000..149365955ed
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-deletedProperty.ecore
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="BookStore" nsURI="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"
+ nsPrefix="store">
+ <eClassifiers xsi:type="ecore:EClass" name="BookStore">
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="bookDispositions" lowerBound="1"
+ upperBound="-1" eType="#//DispositionKind"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EEnum" name="DispositionKind"/>
+ <eClassifiers xsi:type="ecore:EClass" name="Vendor"/>
+ <eClassifiers xsi:type="ecore:EClass" name="Book"/>
+</ecore:EPackage>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-deletedProperty.profile.uml b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-deletedProperty.profile.uml
new file mode 100644
index 00000000000..fe49a7f7409
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-deletedProperty.profile.uml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:Ecore="http://www.eclipse.org/uml2/schemas/Ecore/5" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xsi:schemaLocation="http://www.eclipse.org/uml2/schemas/Ecore/5 pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA">
+ <uml:Profile xmi:id="_gnO0wFG6EeuXzM4mqVly4g" name="BookStore" URI="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore" metaclassReference="_rQ3s8FG6EeuXzM4mqVly4g _rQ5iIFG6EeuXzM4mqVly4g">
+ <eAnnotations xmi:id="_e24cAFG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <eAnnotations xmi:id="_V-_VwMVgEeuKDMwJXd21Mg" source="PapyrusVersion">
+ <details xmi:id="_V-_VwcVgEeuKDMwJXd21Mg" key="Version" value="0.0.0"/>
+ <details xmi:id="_V-_VwsVgEeuKDMwJXd21Mg" key="Comment" value="&lt;undefined>"/>
+ <details xmi:id="_V-_Vw8VgEeuKDMwJXd21Mg" key="Copyright" value=""/>
+ <details xmi:id="_V-_VxMVgEeuKDMwJXd21Mg" key="Date" value=""/>
+ <details xmi:id="_V-_VxcVgEeuKDMwJXd21Mg" key="Author" value="&lt;undefined>"/>
+ </eAnnotations>
+ <contents xmi:type="ecore:EPackage" xmi:id="_e24cAVG7EeuXzM4mqVly4g" name="bookstore" nsURI="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore" nsPrefix="book">
+ <eAnnotations xmi:id="_e24cAlG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <details xmi:id="_e24cA1G7EeuXzM4mqVly4g" key="originalName" value="BookStore"/>
+ </eAnnotations>
+ <eAnnotations xmi:id="_e26RMFG7EeuXzM4mqVly4g" source="PapyrusVersion">
+ <details xmi:id="_e26RMVG7EeuXzM4mqVly4g" key="Version" value="0.0.1"/>
+ <details xmi:id="_e26RMlG7EeuXzM4mqVly4g" key="Comment" value=""/>
+ <details xmi:id="_e26RM1G7EeuXzM4mqVly4g" key="Copyright" value="Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.&#xA;&#xA;All rights reserved. This program and the accompanying materials&#xA;are made available under the terms of the Eclipse Public License 2.0&#xA;which accompanies this distribution, and is available at&#xA;http://www.eclipse.org/legal/epl-2.0/&#xA;&#xA;SPDX-License-Identifier: EPL-2.0&#xA;&#xA;Contributors:&#xA; Christian W. Damus - Initial API and implementation"/>
+ <details xmi:id="_e26RNFG7EeuXzM4mqVly4g" key="Date" value="2021-01-08"/>
+ <details xmi:id="_e26RNVG7EeuXzM4mqVly4g" key="Author" value="Christian W. Damus"/>
+ </eAnnotations>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_e24cBFG7EeuXzM4mqVly4g" name="BookStore">
+ <eAnnotations xmi:id="_e24cBVG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_tQKrMFG6EeuXzM4mqVly4g"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_e24cBlG7EeuXzM4mqVly4g" name="base_Package" ordered="false">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Package"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_T36poMViEeuKDMwJXd21Mg" name="bookDispositions" lowerBound="1" upperBound="-1" eType="_FZtToMViEeuKDMwJXd21Mg"/>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_e24cCFG7EeuXzM4mqVly4g" name="Vendor">
+ <eAnnotations xmi:id="_e24cCVG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_xMldcFG6EeuXzM4mqVly4g"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_e24cClG7EeuXzM4mqVly4g" name="base_Class" ordered="false">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Class"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_e24cDFG7EeuXzM4mqVly4g" name="Book">
+ <eAnnotations xmi:id="_e24cDVG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_8r71oFG6EeuXzM4mqVly4g"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_e24cDlG7EeuXzM4mqVly4g" name="base_Class" ordered="false">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Class"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EEnum" xmi:id="_FZtToMViEeuKDMwJXd21Mg" name="DispositionKind">
+ <eLiterals xmi:id="_Hu0J0MViEeuKDMwJXd21Mg" name="new"/>
+ <eLiterals xmi:id="_K4FA0MViEeuKDMwJXd21Mg" name="used" value="1"/>
+ <eLiterals xmi:id="_M41XoMViEeuKDMwJXd21Mg" name="lending" value="2"/>
+ </eClassifiers>
+ </contents>
+ </eAnnotations>
+ <elementImport xmi:id="_rQ3s8FG6EeuXzM4mqVly4g" alias="Package">
+ <importedElement xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Package"/>
+ </elementImport>
+ <elementImport xmi:id="_rQ5iIFG6EeuXzM4mqVly4g" alias="Class">
+ <importedElement xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ </elementImport>
+ <packageImport xmi:id="_gurgkFG6EeuXzM4mqVly4g">
+ <importedPackage xmi:type="uml:Model" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#_0"/>
+ </packageImport>
+ <packageImport xmi:id="_gut80FG6EeuXzM4mqVly4g">
+ <importedPackage xmi:type="uml:Model" href="pathmap://UML_METAMODELS/UML.metamodel.uml#_0"/>
+ </packageImport>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_tQKrMFG6EeuXzM4mqVly4g" name="BookStore">
+ <ownedAttribute xmi:id="_uzEBUFG6EeuXzM4mqVly4g" name="base_Package" association="_uzCMIFG6EeuXzM4mqVly4g">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Package"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_uzEBUVG6EeuXzM4mqVly4g"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="_egjHIMVgEeuKDMwJXd21Mg" name="bookDispositions" type="_V-9gkMVgEeuKDMwJXd21Mg">
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_hAwaEMVgEeuKDMwJXd21Mg" value="*"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="_uzCMIFG6EeuXzM4mqVly4g" name="E_BookStore_Package6" memberEnd="_uzDaQFG6EeuXzM4mqVly4g _uzEBUFG6EeuXzM4mqVly4g">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_uzDaQFG6EeuXzM4mqVly4g" name="extension_BookStore" type="_tQKrMFG6EeuXzM4mqVly4g" aggregation="composite" association="_uzCMIFG6EeuXzM4mqVly4g"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_xMldcFG6EeuXzM4mqVly4g" name="Vendor">
+ <ownedAttribute xmi:id="__-fLglG6EeuXzM4mqVly4g" name="base_Class" association="__-fLgFG6EeuXzM4mqVly4g">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="__-fykFG6EeuXzM4mqVly4g"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_8r71oFG6EeuXzM4mqVly4g" name="Book">
+ <ownedAttribute xmi:id="__Aw_AVG6EeuXzM4mqVly4g" name="base_Class" association="__AwX8FG6EeuXzM4mqVly4g">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="__Aw_AlG6EeuXzM4mqVly4g"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="__AwX8FG6EeuXzM4mqVly4g" name="E_Book_Class9" memberEnd="__Aw_AFG6EeuXzM4mqVly4g __Aw_AVG6EeuXzM4mqVly4g">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="__Aw_AFG6EeuXzM4mqVly4g" name="extension_Book" type="_8r71oFG6EeuXzM4mqVly4g" aggregation="composite" association="__AwX8FG6EeuXzM4mqVly4g"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="__-fLgFG6EeuXzM4mqVly4g" name="E_Vendor_Class10" memberEnd="__-fLgVG6EeuXzM4mqVly4g __-fLglG6EeuXzM4mqVly4g">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="__-fLgVG6EeuXzM4mqVly4g" name="extension_Vendor" type="_xMldcFG6EeuXzM4mqVly4g" aggregation="composite" association="__-fLgFG6EeuXzM4mqVly4g"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Enumeration" xmi:id="_V-9gkMVgEeuKDMwJXd21Mg" name="DispositionKind">
+ <ownedLiteral xmi:id="_b19wMMVgEeuKDMwJXd21Mg" name="new"/>
+ <ownedLiteral xmi:id="_c2HloMVgEeuKDMwJXd21Mg" name="used"/>
+ <ownedLiteral xmi:id="_di2v0MVgEeuKDMwJXd21Mg" name="lending"/>
+ </packagedElement>
+ <profileApplication xmi:id="_LFzeMFG7EeuXzM4mqVly4g">
+ <eAnnotations xmi:id="_LF0FQFG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <references xmi:type="ecore:EPackage" href="pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA"/>
+ </eAnnotations>
+ <appliedProfile href="pathmap://UML_PROFILES/Ecore.profile.uml#_0"/>
+ </profileApplication>
+ </uml:Profile>
+ <Ecore:EPackage xmi:id="_Lr8RIFG7EeuXzM4mqVly4g" base_Package="_gnO0wFG6EeuXzM4mqVly4g" packageName="bookstore" nsPrefix="book" basePackage="org.eclipse.papyrus.toolsmiths.validation.properties.example"/>
+</xmi:XMI>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-deletedStereotype.profile.uml b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-deletedStereotype.profile.uml
new file mode 100644
index 00000000000..b5c5e530855
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-deletedStereotype.profile.uml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:Ecore="http://www.eclipse.org/uml2/schemas/Ecore/5" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xsi:schemaLocation="http://www.eclipse.org/uml2/schemas/Ecore/5 pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA">
+ <uml:Profile xmi:id="_gnO0wFG6EeuXzM4mqVly4g" name="BookStore" URI="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore" metaclassReference="_rQ3s8FG6EeuXzM4mqVly4g _rQ5iIFG6EeuXzM4mqVly4g">
+ <eAnnotations xmi:id="_e24cAFG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <eAnnotations xmi:id="_V-_VwMVgEeuKDMwJXd21Mg" source="PapyrusVersion">
+ <details xmi:id="_V-_VwcVgEeuKDMwJXd21Mg" key="Version" value="0.0.0"/>
+ <details xmi:id="_V-_VwsVgEeuKDMwJXd21Mg" key="Comment" value="&lt;undefined>"/>
+ <details xmi:id="_V-_Vw8VgEeuKDMwJXd21Mg" key="Copyright" value=""/>
+ <details xmi:id="_V-_VxMVgEeuKDMwJXd21Mg" key="Date" value=""/>
+ <details xmi:id="_V-_VxcVgEeuKDMwJXd21Mg" key="Author" value="&lt;undefined>"/>
+ </eAnnotations>
+ <contents xmi:type="ecore:EPackage" xmi:id="_e24cAVG7EeuXzM4mqVly4g" name="bookstore" nsURI="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore" nsPrefix="book">
+ <eAnnotations xmi:id="_e24cAlG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <details xmi:id="_e24cA1G7EeuXzM4mqVly4g" key="originalName" value="BookStore"/>
+ </eAnnotations>
+ <eAnnotations xmi:id="_e26RMFG7EeuXzM4mqVly4g" source="PapyrusVersion">
+ <details xmi:id="_e26RMVG7EeuXzM4mqVly4g" key="Version" value="0.0.1"/>
+ <details xmi:id="_e26RMlG7EeuXzM4mqVly4g" key="Comment" value=""/>
+ <details xmi:id="_e26RM1G7EeuXzM4mqVly4g" key="Copyright" value="Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.&#xA;&#xA;All rights reserved. This program and the accompanying materials&#xA;are made available under the terms of the Eclipse Public License 2.0&#xA;which accompanies this distribution, and is available at&#xA;http://www.eclipse.org/legal/epl-2.0/&#xA;&#xA;SPDX-License-Identifier: EPL-2.0&#xA;&#xA;Contributors:&#xA; Christian W. Damus - Initial API and implementation"/>
+ <details xmi:id="_e26RNFG7EeuXzM4mqVly4g" key="Date" value="2021-01-08"/>
+ <details xmi:id="_e26RNVG7EeuXzM4mqVly4g" key="Author" value="Christian W. Damus"/>
+ </eAnnotations>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_e24cBFG7EeuXzM4mqVly4g" name="BookStore">
+ <eAnnotations xmi:id="_e24cBVG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_tQKrMFG6EeuXzM4mqVly4g"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_e24cBlG7EeuXzM4mqVly4g" name="base_Package" ordered="false">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Package"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_T36poMViEeuKDMwJXd21Mg" name="bookDispositions" lowerBound="1" upperBound="-1" eType="_FZtToMViEeuKDMwJXd21Mg"/>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_e24cDFG7EeuXzM4mqVly4g" name="Book">
+ <eAnnotations xmi:id="_e24cDVG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_8r71oFG6EeuXzM4mqVly4g"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_e24cDlG7EeuXzM4mqVly4g" name="base_Class" ordered="false">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Class"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EEnum" xmi:id="_FZtToMViEeuKDMwJXd21Mg" name="DispositionKind">
+ <eLiterals xmi:id="_Hu0J0MViEeuKDMwJXd21Mg" name="new"/>
+ <eLiterals xmi:id="_K4FA0MViEeuKDMwJXd21Mg" name="used" value="1"/>
+ <eLiterals xmi:id="_M41XoMViEeuKDMwJXd21Mg" name="lending" value="2"/>
+ </eClassifiers>
+ </contents>
+ </eAnnotations>
+ <elementImport xmi:id="_rQ3s8FG6EeuXzM4mqVly4g" alias="Package">
+ <importedElement xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Package"/>
+ </elementImport>
+ <elementImport xmi:id="_rQ5iIFG6EeuXzM4mqVly4g" alias="Class">
+ <importedElement xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ </elementImport>
+ <packageImport xmi:id="_gurgkFG6EeuXzM4mqVly4g">
+ <importedPackage xmi:type="uml:Model" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#_0"/>
+ </packageImport>
+ <packageImport xmi:id="_gut80FG6EeuXzM4mqVly4g">
+ <importedPackage xmi:type="uml:Model" href="pathmap://UML_METAMODELS/UML.metamodel.uml#_0"/>
+ </packageImport>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_tQKrMFG6EeuXzM4mqVly4g" name="BookStore">
+ <ownedAttribute xmi:id="_uzEBUFG6EeuXzM4mqVly4g" name="base_Package" association="_uzCMIFG6EeuXzM4mqVly4g">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Package"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_uzEBUVG6EeuXzM4mqVly4g"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="_egjHIMVgEeuKDMwJXd21Mg" name="bookDispositions" type="_V-9gkMVgEeuKDMwJXd21Mg">
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_hAwaEMVgEeuKDMwJXd21Mg" value="*"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="_uzCMIFG6EeuXzM4mqVly4g" name="E_BookStore_Package6" memberEnd="_uzDaQFG6EeuXzM4mqVly4g _uzEBUFG6EeuXzM4mqVly4g">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_uzDaQFG6EeuXzM4mqVly4g" name="extension_BookStore" type="_tQKrMFG6EeuXzM4mqVly4g" aggregation="composite" association="_uzCMIFG6EeuXzM4mqVly4g"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_8r71oFG6EeuXzM4mqVly4g" name="Book">
+ <ownedAttribute xmi:id="__Aw_AVG6EeuXzM4mqVly4g" name="base_Class" association="__AwX8FG6EeuXzM4mqVly4g">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="__Aw_AlG6EeuXzM4mqVly4g"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="__AwX8FG6EeuXzM4mqVly4g" name="E_Book_Class9" memberEnd="__Aw_AFG6EeuXzM4mqVly4g __Aw_AVG6EeuXzM4mqVly4g">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="__Aw_AFG6EeuXzM4mqVly4g" name="extension_Book" type="_8r71oFG6EeuXzM4mqVly4g" aggregation="composite" association="__AwX8FG6EeuXzM4mqVly4g"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Enumeration" xmi:id="_V-9gkMVgEeuKDMwJXd21Mg" name="DispositionKind">
+ <ownedLiteral xmi:id="_b19wMMVgEeuKDMwJXd21Mg" name="new"/>
+ <ownedLiteral xmi:id="_c2HloMVgEeuKDMwJXd21Mg" name="used"/>
+ <ownedLiteral xmi:id="_di2v0MVgEeuKDMwJXd21Mg" name="lending"/>
+ </packagedElement>
+ <profileApplication xmi:id="_LFzeMFG7EeuXzM4mqVly4g">
+ <eAnnotations xmi:id="_LF0FQFG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <references xmi:type="ecore:EPackage" href="pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA"/>
+ </eAnnotations>
+ <appliedProfile href="pathmap://UML_PROFILES/Ecore.profile.uml#_0"/>
+ </profileApplication>
+ </uml:Profile>
+ <Ecore:EPackage xmi:id="_Lr8RIFG7EeuXzM4mqVly4g" base_Package="_gnO0wFG6EeuXzM4mqVly4g" packageName="bookstore" nsPrefix="book" basePackage="org.eclipse.papyrus.toolsmiths.validation.properties.example"/>
+</xmi:XMI>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-ecore-enumPropertyWrongType.ctx b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-ecore-enumPropertyWrongType.ctx
new file mode 100644
index 00000000000..c822d8dab63
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-ecore-enumPropertyWrongType.ctx
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="ASCII"?>
+<contexts:Context xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:constraints="http://www.eclipse.org/papyrus/constraints/0.9" xmlns:contexts="http://www.eclipse.org/papyrus/properties/contexts/0.9" xmi:id="_UN9FQM0cEeu8U7nNo50eCA" name="bookstore">
+ <tabs xmi:id="_VF2WkM0cEeu8U7nNo50eCA" label="BookStore" id="bookstore" priority="100">
+ <allSections xsi:type="contexts:Section" xmi:id="_VF3ksM0cEeu8U7nNo50eCA" name="Single BookStore" sectionFile="ui/SingleBookStore.xwt">
+ <widget href="ui/SingleBookStore.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_VF3kss0cEeu8U7nNo50eCA" name="Single Vendor" sectionFile="ui/SingleVendor.xwt">
+ <widget href="ui/SingleVendor.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_VF3ktM0cEeu8U7nNo50eCA" name="Single Book" sectionFile="ui/SingleBook.xwt">
+ <widget href="ui/SingleBook.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_VF3kts0cEeu8U7nNo50eCA" name="Multiple BookStore" sectionFile="ui/MultipleBookStore.xwt">
+ <widget href="ui/MultipleBookStore.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_VF3kuM0cEeu8U7nNo50eCA" name="Multiple Vendor" sectionFile="ui/MultipleVendor.xwt">
+ <widget href="ui/MultipleVendor.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_VF3kus0cEeu8U7nNo50eCA" name="Multiple Book" sectionFile="ui/MultipleBook.xwt">
+ <widget href="ui/MultipleBook.xwt#/"/>
+ </allSections>
+ </tabs>
+ <views xmi:id="_UN9FQc0cEeu8U7nNo50eCA" name="Single BookStore" sections="_VF3ksM0cEeu8U7nNo50eCA" automaticContext="true" datacontexts="_UN9FYM0cEeu8U7nNo50eCA">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_UN9FQs0cEeu8U7nNo50eCA" name="isSingleBookStore">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FQ80cEeu8U7nNo50eCA" name="className" value="BookStore"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FRM0cEeu8U7nNo50eCA" name="nsUri" value="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"/>
+ </constraints>
+ </views>
+ <views xmi:id="_UN9FRs0cEeu8U7nNo50eCA" name="Single Vendor" sections="_VF3kss0cEeu8U7nNo50eCA" automaticContext="true" datacontexts="_UN9FZM0cEeu8U7nNo50eCA">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_UN9FR80cEeu8U7nNo50eCA" name="isSingleVendor">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FSM0cEeu8U7nNo50eCA" name="nsUri" value="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FSc0cEeu8U7nNo50eCA" name="className" value="Vendor"/>
+ </constraints>
+ </views>
+ <views xmi:id="_UN9FS80cEeu8U7nNo50eCA" name="Single Book" sections="_VF3ktM0cEeu8U7nNo50eCA" automaticContext="true" datacontexts="_UN9FaM0cEeu8U7nNo50eCA">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_UN9FTM0cEeu8U7nNo50eCA" name="isSingleBook">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FTc0cEeu8U7nNo50eCA" name="className" value="Book"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FTs0cEeu8U7nNo50eCA" name="nsUri" value="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"/>
+ </constraints>
+ </views>
+ <views xmi:id="_UN9FUM0cEeu8U7nNo50eCA" elementMultiplicity="-1" name="Multiple BookStore" sections="_VF3kts0cEeu8U7nNo50eCA" automaticContext="true" datacontexts="_UN9FYM0cEeu8U7nNo50eCA">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_UN9FUc0cEeu8U7nNo50eCA" name="isMultipleBookStore">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FUs0cEeu8U7nNo50eCA" name="nsUri" value="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FU80cEeu8U7nNo50eCA" name="className" value="BookStore"/>
+ </constraints>
+ </views>
+ <views xmi:id="_UN9FVc0cEeu8U7nNo50eCA" elementMultiplicity="-1" name="Multiple Vendor" sections="_VF3kuM0cEeu8U7nNo50eCA" automaticContext="true" datacontexts="_UN9FZM0cEeu8U7nNo50eCA">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_UN9FVs0cEeu8U7nNo50eCA" name="isMultipleVendor">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FV80cEeu8U7nNo50eCA" name="nsUri" value="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FWM0cEeu8U7nNo50eCA" name="className" value="Vendor"/>
+ </constraints>
+ </views>
+ <views xmi:id="_UN9FWs0cEeu8U7nNo50eCA" elementMultiplicity="-1" name="Multiple Book" sections="_VF3kus0cEeu8U7nNo50eCA" automaticContext="true" datacontexts="_UN9FaM0cEeu8U7nNo50eCA">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_UN9FW80cEeu8U7nNo50eCA" name="isMultipleBook">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FXM0cEeu8U7nNo50eCA" name="className" value="Book"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FXc0cEeu8U7nNo50eCA" name="nsUri" value="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"/>
+ </constraints>
+ </views>
+ <dataContexts xmi:id="_UN9FX80cEeu8U7nNo50eCA" name="BookStore" label="Book Store">
+ <elements xmi:id="_UN9FYM0cEeu8U7nNo50eCA" name="BookStore">
+ <properties xmi:id="_UN9FYs0cEeu8U7nNo50eCA" name="bookDispositions" multiplicity="-1" type="Reference"/>
+ </elements>
+ <elements xmi:id="_UN9FZM0cEeu8U7nNo50eCA" name="Vendor">
+ <properties xmi:id="_UN9FZs0cEeu8U7nNo50eCA" name="licenseNumber"/>
+ </elements>
+ <elements xmi:id="_UN9FaM0cEeu8U7nNo50eCA" name="Book"/>
+ <modelElementFactory href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@modelElementFactories.0"/>
+ </dataContexts>
+</contexts:Context>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-ecore-implicitTracesOK.ctx b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-ecore-implicitTracesOK.ctx
new file mode 100644
index 00000000000..56d3b99589e
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-ecore-implicitTracesOK.ctx
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="ASCII"?>
+<contexts:Context xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:constraints="http://www.eclipse.org/papyrus/constraints/0.9" xmlns:contexts="http://www.eclipse.org/papyrus/properties/contexts/0.9" xmi:id="_UN9FQM0cEeu8U7nNo50eCA" name="bookstore">
+ <tabs xmi:id="_VF2WkM0cEeu8U7nNo50eCA" label="BookStore" id="bookstore" priority="100">
+ <allSections xsi:type="contexts:Section" xmi:id="_VF3ksM0cEeu8U7nNo50eCA" name="Single BookStore" sectionFile="ui/SingleBookStore.xwt">
+ <widget href="ui/SingleBookStore.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_VF3kss0cEeu8U7nNo50eCA" name="Single Vendor" sectionFile="ui/SingleVendor.xwt">
+ <widget href="ui/SingleVendor.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_VF3ktM0cEeu8U7nNo50eCA" name="Single Book" sectionFile="ui/SingleBook.xwt">
+ <widget href="ui/SingleBook.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_VF3kts0cEeu8U7nNo50eCA" name="Multiple BookStore" sectionFile="ui/MultipleBookStore.xwt">
+ <widget href="ui/MultipleBookStore.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_VF3kuM0cEeu8U7nNo50eCA" name="Multiple Vendor" sectionFile="ui/MultipleVendor.xwt">
+ <widget href="ui/MultipleVendor.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_VF3kus0cEeu8U7nNo50eCA" name="Multiple Book" sectionFile="ui/MultipleBook.xwt">
+ <widget href="ui/MultipleBook.xwt#/"/>
+ </allSections>
+ </tabs>
+ <views xmi:id="_UN9FQc0cEeu8U7nNo50eCA" name="Single BookStore" sections="_VF3ksM0cEeu8U7nNo50eCA" automaticContext="true" datacontexts="_UN9FYM0cEeu8U7nNo50eCA">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_UN9FQs0cEeu8U7nNo50eCA" name="isSingleBookStore">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FQ80cEeu8U7nNo50eCA" name="className" value="BookStore"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FRM0cEeu8U7nNo50eCA" name="nsUri" value="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"/>
+ </constraints>
+ </views>
+ <views xmi:id="_UN9FRs0cEeu8U7nNo50eCA" name="Single Vendor" sections="_VF3kss0cEeu8U7nNo50eCA" automaticContext="true" datacontexts="_UN9FZM0cEeu8U7nNo50eCA">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_UN9FR80cEeu8U7nNo50eCA" name="isSingleVendor">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FSM0cEeu8U7nNo50eCA" name="nsUri" value="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FSc0cEeu8U7nNo50eCA" name="className" value="Vendor"/>
+ </constraints>
+ </views>
+ <views xmi:id="_UN9FS80cEeu8U7nNo50eCA" name="Single Book" sections="_VF3ktM0cEeu8U7nNo50eCA" automaticContext="true" datacontexts="_UN9FaM0cEeu8U7nNo50eCA">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_UN9FTM0cEeu8U7nNo50eCA" name="isSingleBook">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FTc0cEeu8U7nNo50eCA" name="className" value="Book"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FTs0cEeu8U7nNo50eCA" name="nsUri" value="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"/>
+ </constraints>
+ </views>
+ <views xmi:id="_UN9FUM0cEeu8U7nNo50eCA" elementMultiplicity="-1" name="Multiple BookStore" sections="_VF3kts0cEeu8U7nNo50eCA" automaticContext="true" datacontexts="_UN9FYM0cEeu8U7nNo50eCA">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_UN9FUc0cEeu8U7nNo50eCA" name="isMultipleBookStore">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FUs0cEeu8U7nNo50eCA" name="nsUri" value="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FU80cEeu8U7nNo50eCA" name="className" value="BookStore"/>
+ </constraints>
+ </views>
+ <views xmi:id="_UN9FVc0cEeu8U7nNo50eCA" elementMultiplicity="-1" name="Multiple Vendor" sections="_VF3kuM0cEeu8U7nNo50eCA" automaticContext="true" datacontexts="_UN9FZM0cEeu8U7nNo50eCA">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_UN9FVs0cEeu8U7nNo50eCA" name="isMultipleVendor">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FV80cEeu8U7nNo50eCA" name="nsUri" value="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FWM0cEeu8U7nNo50eCA" name="className" value="Vendor"/>
+ </constraints>
+ </views>
+ <views xmi:id="_UN9FWs0cEeu8U7nNo50eCA" elementMultiplicity="-1" name="Multiple Book" sections="_VF3kus0cEeu8U7nNo50eCA" automaticContext="true" datacontexts="_UN9FaM0cEeu8U7nNo50eCA">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_UN9FW80cEeu8U7nNo50eCA" name="isMultipleBook">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FXM0cEeu8U7nNo50eCA" name="className" value="Book"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FXc0cEeu8U7nNo50eCA" name="nsUri" value="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"/>
+ </constraints>
+ </views>
+ <dataContexts xmi:id="_UN9FX80cEeu8U7nNo50eCA" name="BookStore" label="Book Store">
+ <elements xmi:id="_UN9FYM0cEeu8U7nNo50eCA" name="BookStore">
+ <properties xmi:id="_UN9FYs0cEeu8U7nNo50eCA" name="bookDispositions" multiplicity="-1" type="Enumeration"/>
+ </elements>
+ <elements xmi:id="_UN9FZM0cEeu8U7nNo50eCA" name="Vendor">
+ <properties xmi:id="_UN9FZs0cEeu8U7nNo50eCA" name="licenseNumber"/>
+ </elements>
+ <elements xmi:id="_UN9FaM0cEeu8U7nNo50eCA" name="Book"/>
+ <modelElementFactory href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@modelElementFactories.0"/>
+ </dataContexts>
+</contexts:Context>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-ecore-stringPropertyWrongType.ctx b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-ecore-stringPropertyWrongType.ctx
new file mode 100644
index 00000000000..1c540fa07c0
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-ecore-stringPropertyWrongType.ctx
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="ASCII"?>
+<contexts:Context xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:constraints="http://www.eclipse.org/papyrus/constraints/0.9" xmlns:contexts="http://www.eclipse.org/papyrus/properties/contexts/0.9" xmi:id="_UN9FQM0cEeu8U7nNo50eCA" name="bookstore">
+ <tabs xmi:id="_VF2WkM0cEeu8U7nNo50eCA" label="BookStore" id="bookstore" priority="100">
+ <allSections xsi:type="contexts:Section" xmi:id="_VF3ksM0cEeu8U7nNo50eCA" name="Single BookStore" sectionFile="ui/SingleBookStore.xwt">
+ <widget href="ui/SingleBookStore.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_VF3kss0cEeu8U7nNo50eCA" name="Single Vendor" sectionFile="ui/SingleVendor.xwt">
+ <widget href="ui/SingleVendor.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_VF3ktM0cEeu8U7nNo50eCA" name="Single Book" sectionFile="ui/SingleBook.xwt">
+ <widget href="ui/SingleBook.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_VF3kts0cEeu8U7nNo50eCA" name="Multiple BookStore" sectionFile="ui/MultipleBookStore.xwt">
+ <widget href="ui/MultipleBookStore.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_VF3kuM0cEeu8U7nNo50eCA" name="Multiple Vendor" sectionFile="ui/MultipleVendor.xwt">
+ <widget href="ui/MultipleVendor.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_VF3kus0cEeu8U7nNo50eCA" name="Multiple Book" sectionFile="ui/MultipleBook.xwt">
+ <widget href="ui/MultipleBook.xwt#/"/>
+ </allSections>
+ </tabs>
+ <views xmi:id="_UN9FQc0cEeu8U7nNo50eCA" name="Single BookStore" sections="_VF3ksM0cEeu8U7nNo50eCA" automaticContext="true" datacontexts="_UN9FYM0cEeu8U7nNo50eCA">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_UN9FQs0cEeu8U7nNo50eCA" name="isSingleBookStore">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FQ80cEeu8U7nNo50eCA" name="className" value="BookStore"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FRM0cEeu8U7nNo50eCA" name="nsUri" value="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"/>
+ </constraints>
+ </views>
+ <views xmi:id="_UN9FRs0cEeu8U7nNo50eCA" name="Single Vendor" sections="_VF3kss0cEeu8U7nNo50eCA" automaticContext="true" datacontexts="_UN9FZM0cEeu8U7nNo50eCA">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_UN9FR80cEeu8U7nNo50eCA" name="isSingleVendor">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FSM0cEeu8U7nNo50eCA" name="nsUri" value="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FSc0cEeu8U7nNo50eCA" name="className" value="Vendor"/>
+ </constraints>
+ </views>
+ <views xmi:id="_UN9FS80cEeu8U7nNo50eCA" name="Single Book" sections="_VF3ktM0cEeu8U7nNo50eCA" automaticContext="true" datacontexts="_UN9FaM0cEeu8U7nNo50eCA">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_UN9FTM0cEeu8U7nNo50eCA" name="isSingleBook">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FTc0cEeu8U7nNo50eCA" name="className" value="Book"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FTs0cEeu8U7nNo50eCA" name="nsUri" value="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"/>
+ </constraints>
+ </views>
+ <views xmi:id="_UN9FUM0cEeu8U7nNo50eCA" elementMultiplicity="-1" name="Multiple BookStore" sections="_VF3kts0cEeu8U7nNo50eCA" automaticContext="true" datacontexts="_UN9FYM0cEeu8U7nNo50eCA">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_UN9FUc0cEeu8U7nNo50eCA" name="isMultipleBookStore">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FUs0cEeu8U7nNo50eCA" name="nsUri" value="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FU80cEeu8U7nNo50eCA" name="className" value="BookStore"/>
+ </constraints>
+ </views>
+ <views xmi:id="_UN9FVc0cEeu8U7nNo50eCA" elementMultiplicity="-1" name="Multiple Vendor" sections="_VF3kuM0cEeu8U7nNo50eCA" automaticContext="true" datacontexts="_UN9FZM0cEeu8U7nNo50eCA">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_UN9FVs0cEeu8U7nNo50eCA" name="isMultipleVendor">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FV80cEeu8U7nNo50eCA" name="nsUri" value="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FWM0cEeu8U7nNo50eCA" name="className" value="Vendor"/>
+ </constraints>
+ </views>
+ <views xmi:id="_UN9FWs0cEeu8U7nNo50eCA" elementMultiplicity="-1" name="Multiple Book" sections="_VF3kus0cEeu8U7nNo50eCA" automaticContext="true" datacontexts="_UN9FaM0cEeu8U7nNo50eCA">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_UN9FW80cEeu8U7nNo50eCA" name="isMultipleBook">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FXM0cEeu8U7nNo50eCA" name="className" value="Book"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FXc0cEeu8U7nNo50eCA" name="nsUri" value="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"/>
+ </constraints>
+ </views>
+ <dataContexts xmi:id="_UN9FX80cEeu8U7nNo50eCA" name="BookStore" label="Book Store">
+ <elements xmi:id="_UN9FYM0cEeu8U7nNo50eCA" name="BookStore">
+ <properties xmi:id="_UN9FYs0cEeu8U7nNo50eCA" name="bookDispositions" multiplicity="-1" type="Enumeration"/>
+ </elements>
+ <elements xmi:id="_UN9FZM0cEeu8U7nNo50eCA" name="Vendor">
+ <properties xmi:id="_UN9FZs0cEeu8U7nNo50eCA" name="licenseNumber" type="Integer"/>
+ </elements>
+ <elements xmi:id="_UN9FaM0cEeu8U7nNo50eCA" name="Book"/>
+ <modelElementFactory href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@modelElementFactories.0"/>
+ </dataContexts>
+</contexts:Context>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-ecore-unresolvedInstanceOf.ctx b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-ecore-unresolvedInstanceOf.ctx
new file mode 100644
index 00000000000..3b60853a298
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-ecore-unresolvedInstanceOf.ctx
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="ASCII"?>
+<contexts:Context xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:constraints="http://www.eclipse.org/papyrus/constraints/0.9" xmlns:contexts="http://www.eclipse.org/papyrus/properties/contexts/0.9" xmi:id="_UN9FQM0cEeu8U7nNo50eCA" name="bookstore" label="">
+ <tabs xmi:id="_VF2WkM0cEeu8U7nNo50eCA" label="BookStore" id="bookstore" priority="100">
+ <allSections xsi:type="contexts:Section" xmi:id="_VF3ksM0cEeu8U7nNo50eCA" name="Single BookStore" sectionFile="ui/SingleBookStore.xwt">
+ <widget href="ui/SingleBookStore.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_VF3kss0cEeu8U7nNo50eCA" name="Single Vendor" sectionFile="ui/SingleVendor.xwt">
+ <widget href="ui/SingleVendor.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_VF3ktM0cEeu8U7nNo50eCA" name="Single Book" sectionFile="ui/SingleBook.xwt">
+ <widget href="ui/SingleBook.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_VF3kts0cEeu8U7nNo50eCA" name="Multiple BookStore" sectionFile="ui/MultipleBookStore.xwt">
+ <widget href="ui/MultipleBookStore.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_VF3kuM0cEeu8U7nNo50eCA" name="Multiple Vendor" sectionFile="ui/MultipleVendor.xwt">
+ <widget href="ui/MultipleVendor.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_VF3kus0cEeu8U7nNo50eCA" name="Multiple Book" sectionFile="ui/MultipleBook.xwt">
+ <widget href="ui/MultipleBook.xwt#/"/>
+ </allSections>
+ </tabs>
+ <views xmi:id="_UN9FQc0cEeu8U7nNo50eCA" name="Single BookStore" sections="_VF3ksM0cEeu8U7nNo50eCA" automaticContext="true" datacontexts="_UN9FYM0cEeu8U7nNo50eCA">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_UN9FQs0cEeu8U7nNo50eCA" name="isSingleBookStore">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FQ80cEeu8U7nNo50eCA" name="className" value="Store"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FRM0cEeu8U7nNo50eCA" name="nsUri" value="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"/>
+ </constraints>
+ <annotations xmi:id="_UqSMMM0tEeu8U7nNo50eCA" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.ecore#//BookStore"/>
+ </annotations>
+ </views>
+ <views xmi:id="_UN9FRs0cEeu8U7nNo50eCA" name="Single Vendor" sections="_VF3kss0cEeu8U7nNo50eCA" automaticContext="true" datacontexts="_UN9FZM0cEeu8U7nNo50eCA">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_UN9FR80cEeu8U7nNo50eCA" name="isSingleVendor">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FSM0cEeu8U7nNo50eCA" name="nsUri" value="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FSc0cEeu8U7nNo50eCA" name="className" value="Vendor"/>
+ </constraints>
+ <annotations xmi:id="_YgBusM0tEeu8U7nNo50eCA" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.ecore#//Vendor"/>
+ </annotations>
+ </views>
+ <views xmi:id="_UN9FS80cEeu8U7nNo50eCA" name="Single Book" sections="_VF3ktM0cEeu8U7nNo50eCA" automaticContext="true" datacontexts="_UN9FaM0cEeu8U7nNo50eCA">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_UN9FTM0cEeu8U7nNo50eCA" name="isSingleBook">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FTc0cEeu8U7nNo50eCA" name="className" value="Book"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FTs0cEeu8U7nNo50eCA" name="nsUri" value="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"/>
+ </constraints>
+ <annotations xmi:id="_aLnGwM0tEeu8U7nNo50eCA" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.ecore#//Book"/>
+ </annotations>
+ </views>
+ <views xmi:id="_UN9FUM0cEeu8U7nNo50eCA" elementMultiplicity="-1" name="Multiple BookStore" sections="_VF3kts0cEeu8U7nNo50eCA" automaticContext="true" datacontexts="_UN9FYM0cEeu8U7nNo50eCA">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_UN9FUc0cEeu8U7nNo50eCA" name="isMultipleBookStore">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FUs0cEeu8U7nNo50eCA" name="nsUri" value="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FU80cEeu8U7nNo50eCA" name="className" value="BookStore"/>
+ </constraints>
+ <annotations xmi:id="_dGb5IM0tEeu8U7nNo50eCA" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.ecore#//BookStore"/>
+ </annotations>
+ </views>
+ <views xmi:id="_UN9FVc0cEeu8U7nNo50eCA" elementMultiplicity="-1" name="Multiple Vendor" sections="_VF3kuM0cEeu8U7nNo50eCA" automaticContext="true" datacontexts="_UN9FZM0cEeu8U7nNo50eCA">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_UN9FVs0cEeu8U7nNo50eCA" name="isMultipleVendor">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FV80cEeu8U7nNo50eCA" name="nsUri" value="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FWM0cEeu8U7nNo50eCA" name="className" value="Vendor"/>
+ </constraints>
+ <annotations xmi:id="_czmcsM0tEeu8U7nNo50eCA" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.ecore#//Vendor"/>
+ </annotations>
+ </views>
+ <views xmi:id="_UN9FWs0cEeu8U7nNo50eCA" elementMultiplicity="-1" name="Multiple Book" sections="_VF3kus0cEeu8U7nNo50eCA" automaticContext="true" datacontexts="_UN9FaM0cEeu8U7nNo50eCA">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_UN9FW80cEeu8U7nNo50eCA" name="isMultipleBook">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FXM0cEeu8U7nNo50eCA" name="className" value="Book"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FXc0cEeu8U7nNo50eCA" name="nsUri" value="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"/>
+ </constraints>
+ <annotations xmi:id="_cUF2MM0tEeu8U7nNo50eCA" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.ecore#//Book"/>
+ </annotations>
+ </views>
+ <dataContexts xmi:id="_UN9FX80cEeu8U7nNo50eCA" name="BookStore" label="Book Store">
+ <annotations xmi:id="_fVkDIM0tEeu8U7nNo50eCA" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.ecore#/"/>
+ <details xmi:id="_H8Gt8NmlEeuJXNXZyutAwA" key="layoutGenerator" value="bundleclass://org.eclipse.papyrus.uml.properties.generation/org.eclipse.papyrus.customization.properties.generation.layout.StandardLayoutGenerator"/>
+ </annotations>
+ <elements xmi:id="_UN9FYM0cEeu8U7nNo50eCA" name="BookStore">
+ <annotations xmi:id="_hmwpsM0tEeu8U7nNo50eCA" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.ecore#//BookStore"/>
+ </annotations>
+ <properties xmi:id="_UN9FYs0cEeu8U7nNo50eCA" name="bookDispositions" type="Enumeration" multiplicity="-1">
+ <annotations xmi:id="_mfesIM0tEeu8U7nNo50eCA" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.ecore#//BookStore/bookDispositions"/>
+ </annotations>
+ </properties>
+ </elements>
+ <elements xmi:id="_UN9FZM0cEeu8U7nNo50eCA" name="Vendor">
+ <annotations xmi:id="_iTsBIM0tEeu8U7nNo50eCA" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.ecore#//Vendor"/>
+ </annotations>
+ <properties xmi:id="_UN9FZs0cEeu8U7nNo50eCA" name="licenseNumber">
+ <annotations xmi:id="_jcxwIM0tEeu8U7nNo50eCA" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.ecore#//Vendor/licenseNumber"/>
+ </annotations>
+ </properties>
+ </elements>
+ <elements xmi:id="_UN9FaM0cEeu8U7nNo50eCA" name="Book">
+ <annotations xmi:id="_i8RrIM0tEeu8U7nNo50eCA" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.ecore#//Book"/>
+ </annotations>
+ </elements>
+ <modelElementFactory href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@modelElementFactories.0"/>
+ </dataContexts>
+</contexts:Context>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-ecore.ctx b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-ecore.ctx
new file mode 100644
index 00000000000..96cb4383673
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-ecore.ctx
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="ASCII"?>
+<contexts:Context xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:constraints="http://www.eclipse.org/papyrus/constraints/0.9" xmlns:contexts="http://www.eclipse.org/papyrus/properties/contexts/0.9" xmi:id="_UN9FQM0cEeu8U7nNo50eCA" name="bookstore" label="">
+ <tabs xmi:id="_VF2WkM0cEeu8U7nNo50eCA" label="BookStore" id="bookstore" priority="100">
+ <allSections xsi:type="contexts:Section" xmi:id="_VF3ksM0cEeu8U7nNo50eCA" name="Single BookStore" sectionFile="ui/SingleBookStore.xwt">
+ <widget href="ui/SingleBookStore.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_VF3kss0cEeu8U7nNo50eCA" name="Single Vendor" sectionFile="ui/SingleVendor.xwt">
+ <widget href="ui/SingleVendor.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_VF3ktM0cEeu8U7nNo50eCA" name="Single Book" sectionFile="ui/SingleBook.xwt">
+ <widget href="ui/SingleBook.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_VF3kts0cEeu8U7nNo50eCA" name="Multiple BookStore" sectionFile="ui/MultipleBookStore.xwt">
+ <widget href="ui/MultipleBookStore.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_VF3kuM0cEeu8U7nNo50eCA" name="Multiple Vendor" sectionFile="ui/MultipleVendor.xwt">
+ <widget href="ui/MultipleVendor.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_VF3kus0cEeu8U7nNo50eCA" name="Multiple Book" sectionFile="ui/MultipleBook.xwt">
+ <widget href="ui/MultipleBook.xwt#/"/>
+ </allSections>
+ </tabs>
+ <views xmi:id="_UN9FQc0cEeu8U7nNo50eCA" name="Single BookStore" sections="_VF3ksM0cEeu8U7nNo50eCA" automaticContext="true" datacontexts="_UN9FYM0cEeu8U7nNo50eCA">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_UN9FQs0cEeu8U7nNo50eCA" name="isSingleBookStore">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FQ80cEeu8U7nNo50eCA" name="className" value="BookStore"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FRM0cEeu8U7nNo50eCA" name="nsUri" value="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"/>
+ </constraints>
+ <annotations xmi:id="_UqSMMM0tEeu8U7nNo50eCA" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.ecore#//BookStore"/>
+ </annotations>
+ </views>
+ <views xmi:id="_UN9FRs0cEeu8U7nNo50eCA" name="Single Vendor" sections="_VF3kss0cEeu8U7nNo50eCA" automaticContext="true" datacontexts="_UN9FZM0cEeu8U7nNo50eCA">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_UN9FR80cEeu8U7nNo50eCA" name="isSingleVendor">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FSM0cEeu8U7nNo50eCA" name="nsUri" value="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FSc0cEeu8U7nNo50eCA" name="className" value="Vendor"/>
+ </constraints>
+ <annotations xmi:id="_YgBusM0tEeu8U7nNo50eCA" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.ecore#//Vendor"/>
+ </annotations>
+ </views>
+ <views xmi:id="_UN9FS80cEeu8U7nNo50eCA" name="Single Book" sections="_VF3ktM0cEeu8U7nNo50eCA" automaticContext="true" datacontexts="_UN9FaM0cEeu8U7nNo50eCA">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_UN9FTM0cEeu8U7nNo50eCA" name="isSingleBook">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FTc0cEeu8U7nNo50eCA" name="className" value="Book"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FTs0cEeu8U7nNo50eCA" name="nsUri" value="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"/>
+ </constraints>
+ <annotations xmi:id="_aLnGwM0tEeu8U7nNo50eCA" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.ecore#//Book"/>
+ </annotations>
+ </views>
+ <views xmi:id="_UN9FUM0cEeu8U7nNo50eCA" elementMultiplicity="-1" name="Multiple BookStore" sections="_VF3kts0cEeu8U7nNo50eCA" automaticContext="true" datacontexts="_UN9FYM0cEeu8U7nNo50eCA">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_UN9FUc0cEeu8U7nNo50eCA" name="isMultipleBookStore">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FUs0cEeu8U7nNo50eCA" name="nsUri" value="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FU80cEeu8U7nNo50eCA" name="className" value="BookStore"/>
+ </constraints>
+ <annotations xmi:id="_dGb5IM0tEeu8U7nNo50eCA" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.ecore#//BookStore"/>
+ </annotations>
+ </views>
+ <views xmi:id="_UN9FVc0cEeu8U7nNo50eCA" elementMultiplicity="-1" name="Multiple Vendor" sections="_VF3kuM0cEeu8U7nNo50eCA" automaticContext="true" datacontexts="_UN9FZM0cEeu8U7nNo50eCA">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_UN9FVs0cEeu8U7nNo50eCA" name="isMultipleVendor">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FV80cEeu8U7nNo50eCA" name="nsUri" value="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FWM0cEeu8U7nNo50eCA" name="className" value="Vendor"/>
+ </constraints>
+ <annotations xmi:id="_czmcsM0tEeu8U7nNo50eCA" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.ecore#//Vendor"/>
+ </annotations>
+ </views>
+ <views xmi:id="_UN9FWs0cEeu8U7nNo50eCA" elementMultiplicity="-1" name="Multiple Book" sections="_VF3kus0cEeu8U7nNo50eCA" automaticContext="true" datacontexts="_UN9FaM0cEeu8U7nNo50eCA">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_UN9FW80cEeu8U7nNo50eCA" name="isMultipleBook">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FXM0cEeu8U7nNo50eCA" name="className" value="Book"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_UN9FXc0cEeu8U7nNo50eCA" name="nsUri" value="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"/>
+ </constraints>
+ <annotations xmi:id="_cUF2MM0tEeu8U7nNo50eCA" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.ecore#//Book"/>
+ </annotations>
+ </views>
+ <dataContexts xmi:id="_UN9FX80cEeu8U7nNo50eCA" name="BookStore" label="Book Store">
+ <annotations xmi:id="_fVkDIM0tEeu8U7nNo50eCA" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.ecore#/"/>
+ <details xmi:id="_H8Gt8NmlEeuJXNXZyutAwA" key="layoutGenerator" value="bundleclass://org.eclipse.papyrus.uml.properties.generation/org.eclipse.papyrus.customization.properties.generation.layout.StandardLayoutGenerator"/>
+ </annotations>
+ <elements xmi:id="_UN9FYM0cEeu8U7nNo50eCA" name="BookStore">
+ <annotations xmi:id="_hmwpsM0tEeu8U7nNo50eCA" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.ecore#//BookStore"/>
+ </annotations>
+ <properties xmi:id="_UN9FYs0cEeu8U7nNo50eCA" name="bookDispositions" type="Enumeration" multiplicity="-1">
+ <annotations xmi:id="_mfesIM0tEeu8U7nNo50eCA" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.ecore#//BookStore/bookDispositions"/>
+ </annotations>
+ </properties>
+ </elements>
+ <elements xmi:id="_UN9FZM0cEeu8U7nNo50eCA" name="Vendor">
+ <annotations xmi:id="_iTsBIM0tEeu8U7nNo50eCA" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.ecore#//Vendor"/>
+ </annotations>
+ <properties xmi:id="_UN9FZs0cEeu8U7nNo50eCA" name="licenseNumber">
+ <annotations xmi:id="_jcxwIM0tEeu8U7nNo50eCA" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.ecore#//Vendor/licenseNumber"/>
+ </annotations>
+ </properties>
+ </elements>
+ <elements xmi:id="_UN9FaM0cEeu8U7nNo50eCA" name="Book">
+ <annotations xmi:id="_i8RrIM0tEeu8U7nNo50eCA" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.ecore#//Book"/>
+ </annotations>
+ </elements>
+ <modelElementFactory href="ppe:/environment/org.eclipse.papyrus.infra.properties.ui/model/Environment.xmi#//@modelElementFactories.0"/>
+ </dataContexts>
+</contexts:Context>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-enumPropertyWrongType.ctx b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-enumPropertyWrongType.ctx
new file mode 100644
index 00000000000..e9e4cb5d1ae
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-enumPropertyWrongType.ctx
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="ASCII"?>
+<contexts:Context xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:constraints="http://www.eclipse.org/papyrus/constraints/0.9" xmlns:contexts="http://www.eclipse.org/papyrus/properties/contexts/0.9" xmi:id="_SVQc4Mf7EeuIwKU8xdbBsg" name="BookStore" label="Book Store">
+ <dependencies href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_69QJkKDJEeSZxfCXzZz3-w"/>
+ <tabs xmi:id="_SVQc4cf7EeuIwKU8xdbBsg" label="BookStore" id="bookstore" priority="100">
+ <allSections xsi:type="contexts:Section" xmi:id="_SVQc4sf7EeuIwKU8xdbBsg" name="Single Book" sectionFile="ui/SingleBook.xwt">
+ <annotations xmi:id="_SVQc48f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/SingleBook.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_SVQc5Mf7EeuIwKU8xdbBsg" name="Multiple Book" sectionFile="ui/MultipleBook.xwt">
+ <annotations xmi:id="_SVQc5cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/MultipleBook.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_SVQc5sf7EeuIwKU8xdbBsg" name="Single BookStore" sectionFile="ui/SingleBookStore.xwt">
+ <annotations xmi:id="_SVQc58f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/SingleBookStore.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_SVQc6Mf7EeuIwKU8xdbBsg" name="Multiple BookStore" sectionFile="ui/MultipleBookStore.xwt">
+ <annotations xmi:id="_SVQc6cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/MultipleBookStore.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_SVQc6sf7EeuIwKU8xdbBsg" name="Single Vendor" sectionFile="ui/SingleVendor.xwt">
+ <annotations xmi:id="_SVQc68f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/SingleVendor.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_SVQc7Mf7EeuIwKU8xdbBsg" name="Multiple Vendor" sectionFile="ui/MultipleVendor.xwt">
+ <annotations xmi:id="_SVQc7cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/MultipleVendor.xwt#/"/>
+ </allSections>
+ </tabs>
+ <views xmi:id="_SVQc7sf7EeuIwKU8xdbBsg" name="Single Book" sections="_SVQc4sf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdDMf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc78f7EeuIwKU8xdbBsg" name="isSingleBook">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQc8Mf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::Book"/>
+ </constraints>
+ <annotations xmi:id="_SVQc8cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQc8sf7EeuIwKU8xdbBsg" elementMultiplicity="-1" name="Multiple Book" sections="_SVQc5Mf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdDMf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc88f7EeuIwKU8xdbBsg" name="isMultipleBook">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQc9Mf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::Book"/>
+ </constraints>
+ <annotations xmi:id="_SVQc9cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQc9sf7EeuIwKU8xdbBsg" name="Single BookStore" sections="_SVQc5sf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdCMf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc98f7EeuIwKU8xdbBsg" name="isSingleBookStore">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQc-Mf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::BookStore"/>
+ </constraints>
+ <annotations xmi:id="_SVQc-cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQc-sf7EeuIwKU8xdbBsg" elementMultiplicity="-1" name="Multiple BookStore" sections="_SVQc6Mf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdCMf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc-8f7EeuIwKU8xdbBsg" name="isMultipleBookStore">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQc_Mf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::BookStore"/>
+ </constraints>
+ <annotations xmi:id="_SVQc_cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQc_sf7EeuIwKU8xdbBsg" name="Single Vendor" sections="_SVQc6sf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdDsf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc_8f7EeuIwKU8xdbBsg" name="isSingleVendor">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQdAMf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::Vendor"/>
+ </constraints>
+ <annotations xmi:id="_SVQdAcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQdAsf7EeuIwKU8xdbBsg" elementMultiplicity="-1" name="Multiple Vendor" sections="_SVQc7Mf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdDsf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQdA8f7EeuIwKU8xdbBsg" name="isMultipleVendor">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQdBMf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::Vendor"/>
+ </constraints>
+ <annotations xmi:id="_SVQdBcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <dataContexts xmi:id="_SVQdBsf7EeuIwKU8xdbBsg" name="BookStore" label="Book Store">
+ <annotations xmi:id="_SVQdB8f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_gnO0wFG6EeuXzM4mqVly4g"/>
+ <details xmi:id="_H8Gt8NmlEeuJXNXZyutAwA" key="layoutGenerator" value="bundleclass://org.eclipse.papyrus.uml.properties.generation/org.eclipse.papyrus.customization.properties.generation.layout.StandardLayoutGenerator"/>
+ </annotations>
+ <elements xmi:id="_SVQdCMf7EeuIwKU8xdbBsg" name="BookStore">
+ <annotations xmi:id="_SVQdCcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <supertypes href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_690xiaDJEeSZxfCXzZz3-w"/>
+ <properties xmi:id="_SVQdCsf7EeuIwKU8xdbBsg" name="bookDispositions" type="Reference" multiplicity="-1">
+ <annotations xmi:id="_SVQdC8f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_egjHIMVgEeuKDMwJXd21Mg"/>
+ </annotations>
+ </properties>
+ </elements>
+ <elements xmi:id="_SVQdDMf7EeuIwKU8xdbBsg" name="Book">
+ <annotations xmi:id="_SVQdDcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <supertypes href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_690yXqDJEeSZxfCXzZz3-w"/>
+ </elements>
+ <elements xmi:id="_SVQdDsf7EeuIwKU8xdbBsg" name="Vendor">
+ <annotations xmi:id="_SVQdD8f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <supertypes href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_690yXqDJEeSZxfCXzZz3-w"/>
+ <properties xmi:id="_SVQdEMf7EeuIwKU8xdbBsg" name="licenseNumber">
+ <annotations xmi:id="_SVQdEcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_qf-GgMVgEeuKDMwJXd21Mg"/>
+ </annotations>
+ </properties>
+ </elements>
+ <modelElementFactory href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@modelElementFactories.2"/>
+ </dataContexts>
+</contexts:Context>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-implicitTracesOK.ctx b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-implicitTracesOK.ctx
new file mode 100644
index 00000000000..4089aee691a
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-implicitTracesOK.ctx
@@ -0,0 +1,210 @@
+<?xml version="1.0" encoding="ASCII"?>
+<contexts:Context
+ xmi:version="2.0"
+ xmlns:xmi="http://www.omg.org/XMI"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:constraints="http://www.eclipse.org/papyrus/constraints/0.9"
+ xmlns:contexts="http://www.eclipse.org/papyrus/properties/contexts/0.9"
+ xmi:id="_SVQc4Mf7EeuIwKU8xdbBsg"
+ name="BookStore"
+ label="Book Store">
+ <dependencies
+ href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_69QJkKDJEeSZxfCXzZz3-w"/>
+ <tabs xmi:id="_SVQc4cf7EeuIwKU8xdbBsg"
+ label="BookStore"
+ id="bookstore"
+ priority="100">
+ <allSections
+ xsi:type="contexts:Section"
+ xmi:id="_SVQc4sf7EeuIwKU8xdbBsg"
+ name="Single Book"
+ sectionFile="ui/SingleBook.xwt">
+ <widget
+ href="ui/SingleBook.xwt#/"/>
+ </allSections>
+ <allSections
+ xsi:type="contexts:Section"
+ xmi:id="_SVQc5Mf7EeuIwKU8xdbBsg"
+ name="Multiple Book"
+ sectionFile="ui/MultipleBook.xwt">
+ <widget
+ href="ui/MultipleBook.xwt#/"/>
+ </allSections>
+ <allSections
+ xsi:type="contexts:Section"
+ xmi:id="_SVQc5sf7EeuIwKU8xdbBsg"
+ name="Single BookStore"
+ sectionFile="ui/SingleBookStore.xwt">
+ <widget
+ href="ui/SingleBookStore.xwt#/"/>
+ </allSections>
+ <allSections
+ xsi:type="contexts:Section"
+ xmi:id="_SVQc6Mf7EeuIwKU8xdbBsg"
+ name="Multiple BookStore"
+ sectionFile="ui/MultipleBookStore.xwt">
+ <widget
+ href="ui/MultipleBookStore.xwt#/"/>
+ </allSections>
+ <allSections
+ xsi:type="contexts:Section"
+ xmi:id="_SVQc6sf7EeuIwKU8xdbBsg"
+ name="Single Vendor"
+ sectionFile="ui/SingleVendor.xwt">
+ <widget
+ href="ui/SingleVendor.xwt#/"/>
+ </allSections>
+ <allSections
+ xsi:type="contexts:Section"
+ xmi:id="_SVQc7Mf7EeuIwKU8xdbBsg"
+ name="Multiple Vendor"
+ sectionFile="ui/MultipleVendor.xwt">
+ <widget
+ href="ui/MultipleVendor.xwt#/"/>
+ </allSections>
+ </tabs>
+ <views xmi:id="_SVQc7sf7EeuIwKU8xdbBsg"
+ name="Single Book"
+ sections="_SVQc4sf7EeuIwKU8xdbBsg"
+ automaticContext="true"
+ datacontexts="_SVQdDMf7EeuIwKU8xdbBsg">
+ <constraints
+ xsi:type="constraints:SimpleConstraint"
+ xmi:id="_SVQc78f7EeuIwKU8xdbBsg"
+ name="isSingleBook">
+ <constraintType
+ href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties
+ xsi:type="constraints:ValueProperty"
+ xmi:id="_SVQc8Mf7EeuIwKU8xdbBsg"
+ name="stereotypeName"
+ value="BookStore::Book"/>
+ </constraints>
+ </views>
+ <views xmi:id="_SVQc8sf7EeuIwKU8xdbBsg"
+ elementMultiplicity="-1"
+ name="Multiple Book"
+ sections="_SVQc5Mf7EeuIwKU8xdbBsg"
+ automaticContext="true"
+ datacontexts="_SVQdDMf7EeuIwKU8xdbBsg">
+ <constraints
+ xsi:type="constraints:SimpleConstraint"
+ xmi:id="_SVQc88f7EeuIwKU8xdbBsg"
+ name="isMultipleBook">
+ <constraintType
+ href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties
+ xsi:type="constraints:ValueProperty"
+ xmi:id="_SVQc9Mf7EeuIwKU8xdbBsg"
+ name="stereotypeName"
+ value="BookStore::Book"/>
+ </constraints>
+ </views>
+ <views xmi:id="_SVQc9sf7EeuIwKU8xdbBsg"
+ name="Single BookStore"
+ sections="_SVQc5sf7EeuIwKU8xdbBsg"
+ automaticContext="true"
+ datacontexts="_SVQdCMf7EeuIwKU8xdbBsg">
+ <constraints
+ xsi:type="constraints:SimpleConstraint"
+ xmi:id="_SVQc98f7EeuIwKU8xdbBsg"
+ name="isSingleBookStore">
+ <constraintType
+ href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties
+ xsi:type="constraints:ValueProperty"
+ xmi:id="_SVQc-Mf7EeuIwKU8xdbBsg"
+ name="stereotypeName"
+ value="BookStore::BookStore"/>
+ </constraints>
+ </views>
+ <views xmi:id="_SVQc-sf7EeuIwKU8xdbBsg"
+ elementMultiplicity="-1"
+ name="Multiple BookStore"
+ sections="_SVQc6Mf7EeuIwKU8xdbBsg"
+ automaticContext="true"
+ datacontexts="_SVQdCMf7EeuIwKU8xdbBsg">
+ <constraints
+ xsi:type="constraints:SimpleConstraint"
+ xmi:id="_SVQc-8f7EeuIwKU8xdbBsg"
+ name="isMultipleBookStore">
+ <constraintType
+ href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties
+ xsi:type="constraints:ValueProperty"
+ xmi:id="_SVQc_Mf7EeuIwKU8xdbBsg"
+ name="stereotypeName"
+ value="BookStore::BookStore"/>
+ </constraints>
+ </views>
+ <views xmi:id="_SVQc_sf7EeuIwKU8xdbBsg"
+ name="Single Vendor"
+ sections="_SVQc6sf7EeuIwKU8xdbBsg"
+ automaticContext="true"
+ datacontexts="_SVQdDsf7EeuIwKU8xdbBsg">
+ <constraints
+ xsi:type="constraints:SimpleConstraint"
+ xmi:id="_SVQc_8f7EeuIwKU8xdbBsg"
+ name="isSingleVendor">
+ <constraintType
+ href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties
+ xsi:type="constraints:ValueProperty"
+ xmi:id="_SVQdAMf7EeuIwKU8xdbBsg"
+ name="stereotypeName"
+ value="BookStore::Vendor"/>
+ </constraints>
+ </views>
+ <views xmi:id="_SVQdAsf7EeuIwKU8xdbBsg"
+ elementMultiplicity="-1"
+ name="Multiple Vendor"
+ sections="_SVQc7Mf7EeuIwKU8xdbBsg"
+ automaticContext="true"
+ datacontexts="_SVQdDsf7EeuIwKU8xdbBsg">
+ <constraints
+ xsi:type="constraints:SimpleConstraint"
+ xmi:id="_SVQdA8f7EeuIwKU8xdbBsg"
+ name="isMultipleVendor">
+ <constraintType
+ href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties
+ xsi:type="constraints:ValueProperty"
+ xmi:id="_SVQdBMf7EeuIwKU8xdbBsg"
+ name="stereotypeName"
+ value="BookStore::Vendor"/>
+ </constraints>
+ </views>
+ <dataContexts
+ xmi:id="_SVQdBsf7EeuIwKU8xdbBsg"
+ name="BookStore"
+ label="Book Store">
+ <elements
+ xmi:id="_SVQdCMf7EeuIwKU8xdbBsg"
+ name="BookStore">
+ <supertypes
+ href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_690xiaDJEeSZxfCXzZz3-w"/>
+ <properties
+ xmi:id="_SVQdCsf7EeuIwKU8xdbBsg"
+ name="bookDispositions"
+ type="Enumeration"
+ multiplicity="-1"/>
+ </elements>
+ <elements
+ xmi:id="_SVQdDMf7EeuIwKU8xdbBsg"
+ name="Book">
+ <supertypes
+ href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_690yXqDJEeSZxfCXzZz3-w"/>
+ </elements>
+ <elements
+ xmi:id="_SVQdDsf7EeuIwKU8xdbBsg"
+ name="Vendor">
+ <supertypes
+ href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_690yXqDJEeSZxfCXzZz3-w"/>
+ <properties
+ xmi:id="_SVQdEMf7EeuIwKU8xdbBsg"
+ name="licenseNumber"/>
+ </elements>
+ <modelElementFactory
+ href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@modelElementFactories.2"/>
+ </dataContexts>
+</contexts:Context>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-newEClass.ecore b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-newEClass.ecore
new file mode 100644
index 00000000000..e3c1e265a62
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-newEClass.ecore
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="BookStore" nsURI="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"
+ nsPrefix="store">
+ <eClassifiers xsi:type="ecore:EClass" name="BookStore">
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="bookDispositions" lowerBound="1"
+ upperBound="-1"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EEnum" name="DispositionKind"/>
+ <eClassifiers xsi:type="ecore:EClass" name="Vendor">
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="licenseNumber" lowerBound="1"
+ eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="Book"/>
+ <eClassifiers xsi:type="ecore:EClass" name="LoanContract">
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="periodInDays" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
+ </eClassifiers>
+</ecore:EPackage>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-newNestedPackage.profile.uml b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-newNestedPackage.profile.uml
new file mode 100644
index 00000000000..e03d3e9be92
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-newNestedPackage.profile.uml
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:Ecore="http://www.eclipse.org/uml2/schemas/Ecore/5" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xsi:schemaLocation="http://www.eclipse.org/uml2/schemas/Ecore/5 pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA">
+ <uml:Profile xmi:id="_gnO0wFG6EeuXzM4mqVly4g" name="BookStore" URI="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore" metaclassReference="_rQ3s8FG6EeuXzM4mqVly4g _rQ5iIFG6EeuXzM4mqVly4g _3MJpgMrXEeul3Y3J4HUK4g">
+ <eAnnotations xmi:id="_e24cAFG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <eAnnotations xmi:id="_V-_VwMVgEeuKDMwJXd21Mg" source="PapyrusVersion">
+ <details xmi:id="_V-_VwcVgEeuKDMwJXd21Mg" key="Version" value="0.0.0"/>
+ <details xmi:id="_V-_VwsVgEeuKDMwJXd21Mg" key="Comment" value="&lt;undefined>"/>
+ <details xmi:id="_V-_Vw8VgEeuKDMwJXd21Mg" key="Copyright" value=""/>
+ <details xmi:id="_V-_VxMVgEeuKDMwJXd21Mg" key="Date" value=""/>
+ <details xmi:id="_V-_VxcVgEeuKDMwJXd21Mg" key="Author" value="&lt;undefined>"/>
+ </eAnnotations>
+ <contents xmi:type="ecore:EPackage" xmi:id="_e24cAVG7EeuXzM4mqVly4g" name="bookstore" nsURI="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore" nsPrefix="book">
+ <eAnnotations xmi:id="_e24cAlG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <details xmi:id="_e24cA1G7EeuXzM4mqVly4g" key="originalName" value="BookStore"/>
+ </eAnnotations>
+ <eAnnotations xmi:id="_e26RMFG7EeuXzM4mqVly4g" source="PapyrusVersion">
+ <details xmi:id="_e26RMVG7EeuXzM4mqVly4g" key="Version" value="0.0.1"/>
+ <details xmi:id="_e26RMlG7EeuXzM4mqVly4g" key="Comment" value=""/>
+ <details xmi:id="_e26RM1G7EeuXzM4mqVly4g" key="Copyright" value="Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.&#xA;&#xA;All rights reserved. This program and the accompanying materials&#xA;are made available under the terms of the Eclipse Public License 2.0&#xA;which accompanies this distribution, and is available at&#xA;http://www.eclipse.org/legal/epl-2.0/&#xA;&#xA;SPDX-License-Identifier: EPL-2.0&#xA;&#xA;Contributors:&#xA; Christian W. Damus - Initial API and implementation"/>
+ <details xmi:id="_e26RNFG7EeuXzM4mqVly4g" key="Date" value="2021-01-08"/>
+ <details xmi:id="_e26RNVG7EeuXzM4mqVly4g" key="Author" value="Christian W. Damus"/>
+ </eAnnotations>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_e24cBFG7EeuXzM4mqVly4g" name="BookStore">
+ <eAnnotations xmi:id="_e24cBVG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_tQKrMFG6EeuXzM4mqVly4g"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_e24cBlG7EeuXzM4mqVly4g" name="base_Package" ordered="false">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Package"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_T36poMViEeuKDMwJXd21Mg" name="bookDispositions" lowerBound="1" upperBound="-1" eType="_FZtToMViEeuKDMwJXd21Mg"/>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_e24cCFG7EeuXzM4mqVly4g" name="Vendor">
+ <eAnnotations xmi:id="_e24cCVG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_xMldcFG6EeuXzM4mqVly4g"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_e24cClG7EeuXzM4mqVly4g" name="base_Class" ordered="false">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Class"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_aGK7oMViEeuKDMwJXd21Mg" name="licenseNumber" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_e24cDFG7EeuXzM4mqVly4g" name="Book">
+ <eAnnotations xmi:id="_e24cDVG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_8r71oFG6EeuXzM4mqVly4g"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_e24cDlG7EeuXzM4mqVly4g" name="base_Class" ordered="false">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Class"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EEnum" xmi:id="_FZtToMViEeuKDMwJXd21Mg" name="DispositionKind">
+ <eLiterals xmi:id="_Hu0J0MViEeuKDMwJXd21Mg" name="new"/>
+ <eLiterals xmi:id="_K4FA0MViEeuKDMwJXd21Mg" name="used" value="1"/>
+ <eLiterals xmi:id="_M41XoMViEeuKDMwJXd21Mg" name="lending" value="2"/>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_6-7-oMrXEeul3Y3J4HUK4g" name="LoanContract">
+ <eAnnotations xmi:id="_6-7-ocrXEeul3Y3J4HUK4g" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_izOBgMrXEeul3Y3J4HUK4g"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_6-7-osrXEeul3Y3J4HUK4g" name="base_Association" ordered="false">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Association"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_Ba7KoMrYEeul3Y3J4HUK4g" name="periodInDays" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ </contents>
+ </eAnnotations>
+ <elementImport xmi:id="_rQ3s8FG6EeuXzM4mqVly4g" alias="Package">
+ <importedElement xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Package"/>
+ </elementImport>
+ <elementImport xmi:id="_rQ5iIFG6EeuXzM4mqVly4g" alias="Class">
+ <importedElement xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ </elementImport>
+ <elementImport xmi:id="_3MJpgMrXEeul3Y3J4HUK4g">
+ <importedElement xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Association"/>
+ </elementImport>
+ <packageImport xmi:id="_gurgkFG6EeuXzM4mqVly4g">
+ <importedPackage xmi:type="uml:Model" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#_0"/>
+ </packageImport>
+ <packageImport xmi:id="_gut80FG6EeuXzM4mqVly4g">
+ <importedPackage xmi:type="uml:Model" href="pathmap://UML_METAMODELS/UML.metamodel.uml#_0"/>
+ </packageImport>
+ <packagedElement xmi:type="uml:Package" xmi:id="_RBc3kOMWEeuPtdmMlhgbUw" name="Legal" URI="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore/Legal">
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_izOBgMrXEeul3Y3J4HUK4g" name="LoanContract">
+ <ownedAttribute xmi:id="_5ITNIsrXEeul3Y3J4HUK4g" name="base_Association" association="_5ITNIMrXEeul3Y3J4HUK4g">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Association"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="_xasoQMrXEeul3Y3J4HUK4g" name="periodInDays">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="_5ITNIMrXEeul3Y3J4HUK4g" name="Association_LoanContract" memberEnd="_5ITNIcrXEeul3Y3J4HUK4g _5ITNIsrXEeul3Y3J4HUK4g">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_5ITNIcrXEeul3Y3J4HUK4g" name="extension_LoanContract" type="_izOBgMrXEeul3Y3J4HUK4g" aggregation="composite" association="_5ITNIMrXEeul3Y3J4HUK4g"/>
+ </packagedElement>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_tQKrMFG6EeuXzM4mqVly4g" name="BookStore">
+ <ownedAttribute xmi:id="_uzEBUFG6EeuXzM4mqVly4g" name="base_Package" association="_uzCMIFG6EeuXzM4mqVly4g">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Package"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_uzEBUVG6EeuXzM4mqVly4g"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="_egjHIMVgEeuKDMwJXd21Mg" name="bookDispositions" type="_V-9gkMVgEeuKDMwJXd21Mg">
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_hAwaEMVgEeuKDMwJXd21Mg" value="*"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="_uzCMIFG6EeuXzM4mqVly4g" name="E_BookStore_Package6" memberEnd="_uzDaQFG6EeuXzM4mqVly4g _uzEBUFG6EeuXzM4mqVly4g">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_uzDaQFG6EeuXzM4mqVly4g" name="extension_BookStore" type="_tQKrMFG6EeuXzM4mqVly4g" aggregation="composite" association="_uzCMIFG6EeuXzM4mqVly4g"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_xMldcFG6EeuXzM4mqVly4g" name="Vendor">
+ <ownedAttribute xmi:id="__-fLglG6EeuXzM4mqVly4g" name="base_Class" association="__-fLgFG6EeuXzM4mqVly4g">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="__-fykFG6EeuXzM4mqVly4g"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="_qf-GgMVgEeuKDMwJXd21Mg" name="licenseNumber">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_8r71oFG6EeuXzM4mqVly4g" name="Book">
+ <ownedAttribute xmi:id="__Aw_AVG6EeuXzM4mqVly4g" name="base_Class" association="__AwX8FG6EeuXzM4mqVly4g">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="__Aw_AlG6EeuXzM4mqVly4g"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="__AwX8FG6EeuXzM4mqVly4g" name="E_Book_Class9" memberEnd="__Aw_AFG6EeuXzM4mqVly4g __Aw_AVG6EeuXzM4mqVly4g">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="__Aw_AFG6EeuXzM4mqVly4g" name="extension_Book" type="_8r71oFG6EeuXzM4mqVly4g" aggregation="composite" association="__AwX8FG6EeuXzM4mqVly4g"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="__-fLgFG6EeuXzM4mqVly4g" name="E_Vendor_Class10" memberEnd="__-fLgVG6EeuXzM4mqVly4g __-fLglG6EeuXzM4mqVly4g">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="__-fLgVG6EeuXzM4mqVly4g" name="extension_Vendor" type="_xMldcFG6EeuXzM4mqVly4g" aggregation="composite" association="__-fLgFG6EeuXzM4mqVly4g"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Enumeration" xmi:id="_V-9gkMVgEeuKDMwJXd21Mg" name="DispositionKind">
+ <ownedLiteral xmi:id="_b19wMMVgEeuKDMwJXd21Mg" name="new"/>
+ <ownedLiteral xmi:id="_c2HloMVgEeuKDMwJXd21Mg" name="used"/>
+ <ownedLiteral xmi:id="_di2v0MVgEeuKDMwJXd21Mg" name="lending"/>
+ </packagedElement>
+ <profileApplication xmi:id="_LFzeMFG7EeuXzM4mqVly4g">
+ <eAnnotations xmi:id="_LF0FQFG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <references xmi:type="ecore:EPackage" href="pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA"/>
+ </eAnnotations>
+ <appliedProfile href="pathmap://UML_PROFILES/Ecore.profile.uml#_0"/>
+ </profileApplication>
+ </uml:Profile>
+ <Ecore:EPackage xmi:id="_Lr8RIFG7EeuXzM4mqVly4g" base_Package="_gnO0wFG6EeuXzM4mqVly4g" packageName="bookstore" nsPrefix="book" basePackage="org.eclipse.papyrus.toolsmiths.validation.properties.example"/>
+</xmi:XMI>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-newNestedProfile.profile.uml b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-newNestedProfile.profile.uml
new file mode 100644
index 00000000000..6f84b191df3
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-newNestedProfile.profile.uml
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:Ecore="http://www.eclipse.org/uml2/schemas/Ecore/5" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xsi:schemaLocation="http://www.eclipse.org/uml2/schemas/Ecore/5 pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA">
+ <uml:Profile xmi:id="_gnO0wFG6EeuXzM4mqVly4g" name="BookStore" URI="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore" metaclassReference="_rQ3s8FG6EeuXzM4mqVly4g _rQ5iIFG6EeuXzM4mqVly4g _3MJpgMrXEeul3Y3J4HUK4g">
+ <eAnnotations xmi:id="_e24cAFG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <eAnnotations xmi:id="_V-_VwMVgEeuKDMwJXd21Mg" source="PapyrusVersion">
+ <details xmi:id="_V-_VwcVgEeuKDMwJXd21Mg" key="Version" value="0.0.0"/>
+ <details xmi:id="_V-_VwsVgEeuKDMwJXd21Mg" key="Comment" value="&lt;undefined>"/>
+ <details xmi:id="_V-_Vw8VgEeuKDMwJXd21Mg" key="Copyright" value=""/>
+ <details xmi:id="_V-_VxMVgEeuKDMwJXd21Mg" key="Date" value=""/>
+ <details xmi:id="_V-_VxcVgEeuKDMwJXd21Mg" key="Author" value="&lt;undefined>"/>
+ </eAnnotations>
+ <contents xmi:type="ecore:EPackage" xmi:id="_e24cAVG7EeuXzM4mqVly4g" name="bookstore" nsURI="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore" nsPrefix="book">
+ <eAnnotations xmi:id="_e24cAlG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <details xmi:id="_e24cA1G7EeuXzM4mqVly4g" key="originalName" value="BookStore"/>
+ </eAnnotations>
+ <eAnnotations xmi:id="_e26RMFG7EeuXzM4mqVly4g" source="PapyrusVersion">
+ <details xmi:id="_e26RMVG7EeuXzM4mqVly4g" key="Version" value="0.0.1"/>
+ <details xmi:id="_e26RMlG7EeuXzM4mqVly4g" key="Comment" value=""/>
+ <details xmi:id="_e26RM1G7EeuXzM4mqVly4g" key="Copyright" value="Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.&#xA;&#xA;All rights reserved. This program and the accompanying materials&#xA;are made available under the terms of the Eclipse Public License 2.0&#xA;which accompanies this distribution, and is available at&#xA;http://www.eclipse.org/legal/epl-2.0/&#xA;&#xA;SPDX-License-Identifier: EPL-2.0&#xA;&#xA;Contributors:&#xA; Christian W. Damus - Initial API and implementation"/>
+ <details xmi:id="_e26RNFG7EeuXzM4mqVly4g" key="Date" value="2021-01-08"/>
+ <details xmi:id="_e26RNVG7EeuXzM4mqVly4g" key="Author" value="Christian W. Damus"/>
+ </eAnnotations>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_e24cBFG7EeuXzM4mqVly4g" name="BookStore">
+ <eAnnotations xmi:id="_e24cBVG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_tQKrMFG6EeuXzM4mqVly4g"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_e24cBlG7EeuXzM4mqVly4g" name="base_Package" ordered="false">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Package"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_T36poMViEeuKDMwJXd21Mg" name="bookDispositions" lowerBound="1" upperBound="-1" eType="_FZtToMViEeuKDMwJXd21Mg"/>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_e24cCFG7EeuXzM4mqVly4g" name="Vendor">
+ <eAnnotations xmi:id="_e24cCVG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_xMldcFG6EeuXzM4mqVly4g"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_e24cClG7EeuXzM4mqVly4g" name="base_Class" ordered="false">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Class"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_aGK7oMViEeuKDMwJXd21Mg" name="licenseNumber" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_e24cDFG7EeuXzM4mqVly4g" name="Book">
+ <eAnnotations xmi:id="_e24cDVG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_8r71oFG6EeuXzM4mqVly4g"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_e24cDlG7EeuXzM4mqVly4g" name="base_Class" ordered="false">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Class"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EEnum" xmi:id="_FZtToMViEeuKDMwJXd21Mg" name="DispositionKind">
+ <eLiterals xmi:id="_Hu0J0MViEeuKDMwJXd21Mg" name="new"/>
+ <eLiterals xmi:id="_K4FA0MViEeuKDMwJXd21Mg" name="used" value="1"/>
+ <eLiterals xmi:id="_M41XoMViEeuKDMwJXd21Mg" name="lending" value="2"/>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_6-7-oMrXEeul3Y3J4HUK4g" name="LoanContract">
+ <eAnnotations xmi:id="_6-7-ocrXEeul3Y3J4HUK4g" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_izOBgMrXEeul3Y3J4HUK4g"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_6-7-osrXEeul3Y3J4HUK4g" name="base_Association" ordered="false">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Association"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_Ba7KoMrYEeul3Y3J4HUK4g" name="periodInDays" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ </contents>
+ </eAnnotations>
+ <elementImport xmi:id="_rQ3s8FG6EeuXzM4mqVly4g" alias="Package">
+ <importedElement xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Package"/>
+ </elementImport>
+ <elementImport xmi:id="_rQ5iIFG6EeuXzM4mqVly4g" alias="Class">
+ <importedElement xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ </elementImport>
+ <elementImport xmi:id="_3MJpgMrXEeul3Y3J4HUK4g">
+ <importedElement xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Association"/>
+ </elementImport>
+ <packageImport xmi:id="_gurgkFG6EeuXzM4mqVly4g">
+ <importedPackage xmi:type="uml:Model" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#_0"/>
+ </packageImport>
+ <packageImport xmi:id="_gut80FG6EeuXzM4mqVly4g">
+ <importedPackage xmi:type="uml:Model" href="pathmap://UML_METAMODELS/UML.metamodel.uml#_0"/>
+ </packageImport>
+ <packagedElement xmi:type="uml:Profile" xmi:id="_RBc3kOMWEeuPtdmMlhgbUw" name="Legal" URI="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore/Legal">
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_izOBgMrXEeul3Y3J4HUK4g" name="LoanContract">
+ <ownedAttribute xmi:id="_5ITNIsrXEeul3Y3J4HUK4g" name="base_Association" association="_5ITNIMrXEeul3Y3J4HUK4g">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Association"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="_xasoQMrXEeul3Y3J4HUK4g" name="periodInDays">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="_5ITNIMrXEeul3Y3J4HUK4g" name="Association_LoanContract" memberEnd="_5ITNIcrXEeul3Y3J4HUK4g _5ITNIsrXEeul3Y3J4HUK4g">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_5ITNIcrXEeul3Y3J4HUK4g" name="extension_LoanContract" type="_izOBgMrXEeul3Y3J4HUK4g" aggregation="composite" association="_5ITNIMrXEeul3Y3J4HUK4g"/>
+ </packagedElement>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_tQKrMFG6EeuXzM4mqVly4g" name="BookStore">
+ <ownedAttribute xmi:id="_uzEBUFG6EeuXzM4mqVly4g" name="base_Package" association="_uzCMIFG6EeuXzM4mqVly4g">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Package"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_uzEBUVG6EeuXzM4mqVly4g"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="_egjHIMVgEeuKDMwJXd21Mg" name="bookDispositions" type="_V-9gkMVgEeuKDMwJXd21Mg">
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_hAwaEMVgEeuKDMwJXd21Mg" value="*"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="_uzCMIFG6EeuXzM4mqVly4g" name="E_BookStore_Package6" memberEnd="_uzDaQFG6EeuXzM4mqVly4g _uzEBUFG6EeuXzM4mqVly4g">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_uzDaQFG6EeuXzM4mqVly4g" name="extension_BookStore" type="_tQKrMFG6EeuXzM4mqVly4g" aggregation="composite" association="_uzCMIFG6EeuXzM4mqVly4g"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_xMldcFG6EeuXzM4mqVly4g" name="Vendor">
+ <ownedAttribute xmi:id="__-fLglG6EeuXzM4mqVly4g" name="base_Class" association="__-fLgFG6EeuXzM4mqVly4g">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="__-fykFG6EeuXzM4mqVly4g"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="_qf-GgMVgEeuKDMwJXd21Mg" name="licenseNumber">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_8r71oFG6EeuXzM4mqVly4g" name="Book">
+ <ownedAttribute xmi:id="__Aw_AVG6EeuXzM4mqVly4g" name="base_Class" association="__AwX8FG6EeuXzM4mqVly4g">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="__Aw_AlG6EeuXzM4mqVly4g"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="__AwX8FG6EeuXzM4mqVly4g" name="E_Book_Class9" memberEnd="__Aw_AFG6EeuXzM4mqVly4g __Aw_AVG6EeuXzM4mqVly4g">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="__Aw_AFG6EeuXzM4mqVly4g" name="extension_Book" type="_8r71oFG6EeuXzM4mqVly4g" aggregation="composite" association="__AwX8FG6EeuXzM4mqVly4g"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="__-fLgFG6EeuXzM4mqVly4g" name="E_Vendor_Class10" memberEnd="__-fLgVG6EeuXzM4mqVly4g __-fLglG6EeuXzM4mqVly4g">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="__-fLgVG6EeuXzM4mqVly4g" name="extension_Vendor" type="_xMldcFG6EeuXzM4mqVly4g" aggregation="composite" association="__-fLgFG6EeuXzM4mqVly4g"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Enumeration" xmi:id="_V-9gkMVgEeuKDMwJXd21Mg" name="DispositionKind">
+ <ownedLiteral xmi:id="_b19wMMVgEeuKDMwJXd21Mg" name="new"/>
+ <ownedLiteral xmi:id="_c2HloMVgEeuKDMwJXd21Mg" name="used"/>
+ <ownedLiteral xmi:id="_di2v0MVgEeuKDMwJXd21Mg" name="lending"/>
+ </packagedElement>
+ <profileApplication xmi:id="_LFzeMFG7EeuXzM4mqVly4g">
+ <eAnnotations xmi:id="_LF0FQFG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <references xmi:type="ecore:EPackage" href="pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA"/>
+ </eAnnotations>
+ <appliedProfile href="pathmap://UML_PROFILES/Ecore.profile.uml#_0"/>
+ </profileApplication>
+ </uml:Profile>
+ <Ecore:EPackage xmi:id="_Lr8RIFG7EeuXzM4mqVly4g" base_Package="_gnO0wFG6EeuXzM4mqVly4g" packageName="bookstore" nsPrefix="book" basePackage="org.eclipse.papyrus.toolsmiths.validation.properties.example"/>
+</xmi:XMI>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-newProperty.ecore b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-newProperty.ecore
new file mode 100644
index 00000000000..ca8d93526c7
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-newProperty.ecore
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="BookStore" nsURI="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"
+ nsPrefix="store">
+ <eClassifiers xsi:type="ecore:EClass" name="BookStore">
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="bookDispositions" lowerBound="1"
+ upperBound="-1"/>
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="taxClass" lowerBound="1"
+ eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EEnum" name="DispositionKind"/>
+ <eClassifiers xsi:type="ecore:EClass" name="Vendor">
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="licenseNumber" lowerBound="1"
+ eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="Book"/>
+</ecore:EPackage>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-newProperty.profile.uml b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-newProperty.profile.uml
new file mode 100644
index 00000000000..bbc2179f18c
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-newProperty.profile.uml
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:Ecore="http://www.eclipse.org/uml2/schemas/Ecore/5" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xsi:schemaLocation="http://www.eclipse.org/uml2/schemas/Ecore/5 pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA">
+ <uml:Profile xmi:id="_gnO0wFG6EeuXzM4mqVly4g" name="BookStore" URI="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore" metaclassReference="_rQ3s8FG6EeuXzM4mqVly4g _rQ5iIFG6EeuXzM4mqVly4g">
+ <eAnnotations xmi:id="_e24cAFG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <eAnnotations xmi:id="_V-_VwMVgEeuKDMwJXd21Mg" source="PapyrusVersion">
+ <details xmi:id="_V-_VwcVgEeuKDMwJXd21Mg" key="Version" value="0.0.0"/>
+ <details xmi:id="_V-_VwsVgEeuKDMwJXd21Mg" key="Comment" value="&lt;undefined>"/>
+ <details xmi:id="_V-_Vw8VgEeuKDMwJXd21Mg" key="Copyright" value=""/>
+ <details xmi:id="_V-_VxMVgEeuKDMwJXd21Mg" key="Date" value=""/>
+ <details xmi:id="_V-_VxcVgEeuKDMwJXd21Mg" key="Author" value="&lt;undefined>"/>
+ </eAnnotations>
+ <contents xmi:type="ecore:EPackage" xmi:id="_e24cAVG7EeuXzM4mqVly4g" name="bookstore" nsURI="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore" nsPrefix="book">
+ <eAnnotations xmi:id="_e24cAlG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <details xmi:id="_e24cA1G7EeuXzM4mqVly4g" key="originalName" value="BookStore"/>
+ </eAnnotations>
+ <eAnnotations xmi:id="_e26RMFG7EeuXzM4mqVly4g" source="PapyrusVersion">
+ <details xmi:id="_e26RMVG7EeuXzM4mqVly4g" key="Version" value="0.0.1"/>
+ <details xmi:id="_e26RMlG7EeuXzM4mqVly4g" key="Comment" value=""/>
+ <details xmi:id="_e26RM1G7EeuXzM4mqVly4g" key="Copyright" value="Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.&#xA;&#xA;All rights reserved. This program and the accompanying materials&#xA;are made available under the terms of the Eclipse Public License 2.0&#xA;which accompanies this distribution, and is available at&#xA;http://www.eclipse.org/legal/epl-2.0/&#xA;&#xA;SPDX-License-Identifier: EPL-2.0&#xA;&#xA;Contributors:&#xA; Christian W. Damus - Initial API and implementation"/>
+ <details xmi:id="_e26RNFG7EeuXzM4mqVly4g" key="Date" value="2021-01-08"/>
+ <details xmi:id="_e26RNVG7EeuXzM4mqVly4g" key="Author" value="Christian W. Damus"/>
+ </eAnnotations>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_e24cBFG7EeuXzM4mqVly4g" name="BookStore">
+ <eAnnotations xmi:id="_e24cBVG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_tQKrMFG6EeuXzM4mqVly4g"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_e24cBlG7EeuXzM4mqVly4g" name="base_Package" ordered="false">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Package"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_T36poMViEeuKDMwJXd21Mg" name="bookDispositions" lowerBound="1" upperBound="-1" eType="_FZtToMViEeuKDMwJXd21Mg"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_yacDcMrWEeul3Y3J4HUK4g" name="taxClass" lowerBound="1" upperBound="-1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_e24cCFG7EeuXzM4mqVly4g" name="Vendor">
+ <eAnnotations xmi:id="_e24cCVG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_xMldcFG6EeuXzM4mqVly4g"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_e24cClG7EeuXzM4mqVly4g" name="base_Class" ordered="false">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Class"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_aGK7oMViEeuKDMwJXd21Mg" name="licenseNumber" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_e24cDFG7EeuXzM4mqVly4g" name="Book">
+ <eAnnotations xmi:id="_e24cDVG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_8r71oFG6EeuXzM4mqVly4g"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_e24cDlG7EeuXzM4mqVly4g" name="base_Class" ordered="false">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Class"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EEnum" xmi:id="_FZtToMViEeuKDMwJXd21Mg" name="DispositionKind">
+ <eLiterals xmi:id="_Hu0J0MViEeuKDMwJXd21Mg" name="new"/>
+ <eLiterals xmi:id="_K4FA0MViEeuKDMwJXd21Mg" name="used" value="1"/>
+ <eLiterals xmi:id="_M41XoMViEeuKDMwJXd21Mg" name="lending" value="2"/>
+ </eClassifiers>
+ </contents>
+ </eAnnotations>
+ <elementImport xmi:id="_rQ3s8FG6EeuXzM4mqVly4g" alias="Package">
+ <importedElement xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Package"/>
+ </elementImport>
+ <elementImport xmi:id="_rQ5iIFG6EeuXzM4mqVly4g" alias="Class">
+ <importedElement xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ </elementImport>
+ <packageImport xmi:id="_gurgkFG6EeuXzM4mqVly4g">
+ <importedPackage xmi:type="uml:Model" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#_0"/>
+ </packageImport>
+ <packageImport xmi:id="_gut80FG6EeuXzM4mqVly4g">
+ <importedPackage xmi:type="uml:Model" href="pathmap://UML_METAMODELS/UML.metamodel.uml#_0"/>
+ </packageImport>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_tQKrMFG6EeuXzM4mqVly4g" name="BookStore">
+ <ownedAttribute xmi:id="_uzEBUFG6EeuXzM4mqVly4g" name="base_Package" association="_uzCMIFG6EeuXzM4mqVly4g">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Package"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_uzEBUVG6EeuXzM4mqVly4g"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="_egjHIMVgEeuKDMwJXd21Mg" name="bookDispositions" type="_V-9gkMVgEeuKDMwJXd21Mg">
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_hAwaEMVgEeuKDMwJXd21Mg" value="*"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="_lykkAMrWEeul3Y3J4HUK4g" name="taxClass">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_pPtZQMrWEeul3Y3J4HUK4g" value="*"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="_uzCMIFG6EeuXzM4mqVly4g" name="E_BookStore_Package6" memberEnd="_uzDaQFG6EeuXzM4mqVly4g _uzEBUFG6EeuXzM4mqVly4g">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_uzDaQFG6EeuXzM4mqVly4g" name="extension_BookStore" type="_tQKrMFG6EeuXzM4mqVly4g" aggregation="composite" association="_uzCMIFG6EeuXzM4mqVly4g"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_xMldcFG6EeuXzM4mqVly4g" name="Vendor">
+ <ownedAttribute xmi:id="__-fLglG6EeuXzM4mqVly4g" name="base_Class" association="__-fLgFG6EeuXzM4mqVly4g">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="__-fykFG6EeuXzM4mqVly4g"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="_qf-GgMVgEeuKDMwJXd21Mg" name="licenseNumber">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_8r71oFG6EeuXzM4mqVly4g" name="Book">
+ <ownedAttribute xmi:id="__Aw_AVG6EeuXzM4mqVly4g" name="base_Class" association="__AwX8FG6EeuXzM4mqVly4g">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="__Aw_AlG6EeuXzM4mqVly4g"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="__AwX8FG6EeuXzM4mqVly4g" name="E_Book_Class9" memberEnd="__Aw_AFG6EeuXzM4mqVly4g __Aw_AVG6EeuXzM4mqVly4g">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="__Aw_AFG6EeuXzM4mqVly4g" name="extension_Book" type="_8r71oFG6EeuXzM4mqVly4g" aggregation="composite" association="__AwX8FG6EeuXzM4mqVly4g"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="__-fLgFG6EeuXzM4mqVly4g" name="E_Vendor_Class10" memberEnd="__-fLgVG6EeuXzM4mqVly4g __-fLglG6EeuXzM4mqVly4g">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="__-fLgVG6EeuXzM4mqVly4g" name="extension_Vendor" type="_xMldcFG6EeuXzM4mqVly4g" aggregation="composite" association="__-fLgFG6EeuXzM4mqVly4g"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Enumeration" xmi:id="_V-9gkMVgEeuKDMwJXd21Mg" name="DispositionKind">
+ <ownedLiteral xmi:id="_b19wMMVgEeuKDMwJXd21Mg" name="new"/>
+ <ownedLiteral xmi:id="_c2HloMVgEeuKDMwJXd21Mg" name="used"/>
+ <ownedLiteral xmi:id="_di2v0MVgEeuKDMwJXd21Mg" name="lending"/>
+ </packagedElement>
+ <profileApplication xmi:id="_LFzeMFG7EeuXzM4mqVly4g">
+ <eAnnotations xmi:id="_LF0FQFG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <references xmi:type="ecore:EPackage" href="pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA"/>
+ </eAnnotations>
+ <appliedProfile href="pathmap://UML_PROFILES/Ecore.profile.uml#_0"/>
+ </profileApplication>
+ </uml:Profile>
+ <Ecore:EPackage xmi:id="_Lr8RIFG7EeuXzM4mqVly4g" base_Package="_gnO0wFG6EeuXzM4mqVly4g" packageName="bookstore" nsPrefix="book" basePackage="org.eclipse.papyrus.toolsmiths.validation.properties.example"/>
+</xmi:XMI>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-newStereotype.profile.uml b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-newStereotype.profile.uml
new file mode 100644
index 00000000000..6d9f842f98d
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-newStereotype.profile.uml
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:Ecore="http://www.eclipse.org/uml2/schemas/Ecore/5" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xsi:schemaLocation="http://www.eclipse.org/uml2/schemas/Ecore/5 pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA">
+ <uml:Profile xmi:id="_gnO0wFG6EeuXzM4mqVly4g" name="BookStore" URI="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore" metaclassReference="_rQ3s8FG6EeuXzM4mqVly4g _rQ5iIFG6EeuXzM4mqVly4g _3MJpgMrXEeul3Y3J4HUK4g">
+ <eAnnotations xmi:id="_e24cAFG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <eAnnotations xmi:id="_V-_VwMVgEeuKDMwJXd21Mg" source="PapyrusVersion">
+ <details xmi:id="_V-_VwcVgEeuKDMwJXd21Mg" key="Version" value="0.0.0"/>
+ <details xmi:id="_V-_VwsVgEeuKDMwJXd21Mg" key="Comment" value="&lt;undefined>"/>
+ <details xmi:id="_V-_Vw8VgEeuKDMwJXd21Mg" key="Copyright" value=""/>
+ <details xmi:id="_V-_VxMVgEeuKDMwJXd21Mg" key="Date" value=""/>
+ <details xmi:id="_V-_VxcVgEeuKDMwJXd21Mg" key="Author" value="&lt;undefined>"/>
+ </eAnnotations>
+ <contents xmi:type="ecore:EPackage" xmi:id="_e24cAVG7EeuXzM4mqVly4g" name="bookstore" nsURI="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore" nsPrefix="book">
+ <eAnnotations xmi:id="_e24cAlG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <details xmi:id="_e24cA1G7EeuXzM4mqVly4g" key="originalName" value="BookStore"/>
+ </eAnnotations>
+ <eAnnotations xmi:id="_e26RMFG7EeuXzM4mqVly4g" source="PapyrusVersion">
+ <details xmi:id="_e26RMVG7EeuXzM4mqVly4g" key="Version" value="0.0.1"/>
+ <details xmi:id="_e26RMlG7EeuXzM4mqVly4g" key="Comment" value=""/>
+ <details xmi:id="_e26RM1G7EeuXzM4mqVly4g" key="Copyright" value="Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.&#xA;&#xA;All rights reserved. This program and the accompanying materials&#xA;are made available under the terms of the Eclipse Public License 2.0&#xA;which accompanies this distribution, and is available at&#xA;http://www.eclipse.org/legal/epl-2.0/&#xA;&#xA;SPDX-License-Identifier: EPL-2.0&#xA;&#xA;Contributors:&#xA; Christian W. Damus - Initial API and implementation"/>
+ <details xmi:id="_e26RNFG7EeuXzM4mqVly4g" key="Date" value="2021-01-08"/>
+ <details xmi:id="_e26RNVG7EeuXzM4mqVly4g" key="Author" value="Christian W. Damus"/>
+ </eAnnotations>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_e24cBFG7EeuXzM4mqVly4g" name="BookStore">
+ <eAnnotations xmi:id="_e24cBVG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_tQKrMFG6EeuXzM4mqVly4g"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_e24cBlG7EeuXzM4mqVly4g" name="base_Package" ordered="false">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Package"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_T36poMViEeuKDMwJXd21Mg" name="bookDispositions" lowerBound="1" upperBound="-1" eType="_FZtToMViEeuKDMwJXd21Mg"/>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_e24cCFG7EeuXzM4mqVly4g" name="Vendor">
+ <eAnnotations xmi:id="_e24cCVG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_xMldcFG6EeuXzM4mqVly4g"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_e24cClG7EeuXzM4mqVly4g" name="base_Class" ordered="false">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Class"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_aGK7oMViEeuKDMwJXd21Mg" name="licenseNumber" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_e24cDFG7EeuXzM4mqVly4g" name="Book">
+ <eAnnotations xmi:id="_e24cDVG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_8r71oFG6EeuXzM4mqVly4g"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_e24cDlG7EeuXzM4mqVly4g" name="base_Class" ordered="false">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Class"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EEnum" xmi:id="_FZtToMViEeuKDMwJXd21Mg" name="DispositionKind">
+ <eLiterals xmi:id="_Hu0J0MViEeuKDMwJXd21Mg" name="new"/>
+ <eLiterals xmi:id="_K4FA0MViEeuKDMwJXd21Mg" name="used" value="1"/>
+ <eLiterals xmi:id="_M41XoMViEeuKDMwJXd21Mg" name="lending" value="2"/>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_6-7-oMrXEeul3Y3J4HUK4g" name="LoanContract">
+ <eAnnotations xmi:id="_6-7-ocrXEeul3Y3J4HUK4g" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_izOBgMrXEeul3Y3J4HUK4g"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_6-7-osrXEeul3Y3J4HUK4g" name="base_Association" ordered="false">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Association"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_Ba7KoMrYEeul3Y3J4HUK4g" name="periodInDays" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ </contents>
+ </eAnnotations>
+ <elementImport xmi:id="_rQ3s8FG6EeuXzM4mqVly4g" alias="Package">
+ <importedElement xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Package"/>
+ </elementImport>
+ <elementImport xmi:id="_rQ5iIFG6EeuXzM4mqVly4g" alias="Class">
+ <importedElement xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ </elementImport>
+ <elementImport xmi:id="_3MJpgMrXEeul3Y3J4HUK4g">
+ <importedElement xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Association"/>
+ </elementImport>
+ <packageImport xmi:id="_gurgkFG6EeuXzM4mqVly4g">
+ <importedPackage xmi:type="uml:Model" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#_0"/>
+ </packageImport>
+ <packageImport xmi:id="_gut80FG6EeuXzM4mqVly4g">
+ <importedPackage xmi:type="uml:Model" href="pathmap://UML_METAMODELS/UML.metamodel.uml#_0"/>
+ </packageImport>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_tQKrMFG6EeuXzM4mqVly4g" name="BookStore">
+ <ownedAttribute xmi:id="_uzEBUFG6EeuXzM4mqVly4g" name="base_Package" association="_uzCMIFG6EeuXzM4mqVly4g">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Package"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_uzEBUVG6EeuXzM4mqVly4g"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="_egjHIMVgEeuKDMwJXd21Mg" name="bookDispositions" type="_V-9gkMVgEeuKDMwJXd21Mg">
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_hAwaEMVgEeuKDMwJXd21Mg" value="*"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="_uzCMIFG6EeuXzM4mqVly4g" name="E_BookStore_Package6" memberEnd="_uzDaQFG6EeuXzM4mqVly4g _uzEBUFG6EeuXzM4mqVly4g">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_uzDaQFG6EeuXzM4mqVly4g" name="extension_BookStore" type="_tQKrMFG6EeuXzM4mqVly4g" aggregation="composite" association="_uzCMIFG6EeuXzM4mqVly4g"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_xMldcFG6EeuXzM4mqVly4g" name="Vendor">
+ <ownedAttribute xmi:id="__-fLglG6EeuXzM4mqVly4g" name="base_Class" association="__-fLgFG6EeuXzM4mqVly4g">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="__-fykFG6EeuXzM4mqVly4g"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="_qf-GgMVgEeuKDMwJXd21Mg" name="licenseNumber">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_8r71oFG6EeuXzM4mqVly4g" name="Book">
+ <ownedAttribute xmi:id="__Aw_AVG6EeuXzM4mqVly4g" name="base_Class" association="__AwX8FG6EeuXzM4mqVly4g">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="__Aw_AlG6EeuXzM4mqVly4g"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="__AwX8FG6EeuXzM4mqVly4g" name="E_Book_Class9" memberEnd="__Aw_AFG6EeuXzM4mqVly4g __Aw_AVG6EeuXzM4mqVly4g">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="__Aw_AFG6EeuXzM4mqVly4g" name="extension_Book" type="_8r71oFG6EeuXzM4mqVly4g" aggregation="composite" association="__AwX8FG6EeuXzM4mqVly4g"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="__-fLgFG6EeuXzM4mqVly4g" name="E_Vendor_Class10" memberEnd="__-fLgVG6EeuXzM4mqVly4g __-fLglG6EeuXzM4mqVly4g">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="__-fLgVG6EeuXzM4mqVly4g" name="extension_Vendor" type="_xMldcFG6EeuXzM4mqVly4g" aggregation="composite" association="__-fLgFG6EeuXzM4mqVly4g"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Enumeration" xmi:id="_V-9gkMVgEeuKDMwJXd21Mg" name="DispositionKind">
+ <ownedLiteral xmi:id="_b19wMMVgEeuKDMwJXd21Mg" name="new"/>
+ <ownedLiteral xmi:id="_c2HloMVgEeuKDMwJXd21Mg" name="used"/>
+ <ownedLiteral xmi:id="_di2v0MVgEeuKDMwJXd21Mg" name="lending"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_izOBgMrXEeul3Y3J4HUK4g" name="LoanContract">
+ <ownedAttribute xmi:id="_5ITNIsrXEeul3Y3J4HUK4g" name="base_Association" association="_5ITNIMrXEeul3Y3J4HUK4g">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Association"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="_xasoQMrXEeul3Y3J4HUK4g" name="periodInDays">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="_5ITNIMrXEeul3Y3J4HUK4g" name="Association_LoanContract" memberEnd="_5ITNIcrXEeul3Y3J4HUK4g _5ITNIsrXEeul3Y3J4HUK4g">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_5ITNIcrXEeul3Y3J4HUK4g" name="extension_LoanContract" type="_izOBgMrXEeul3Y3J4HUK4g" aggregation="composite" association="_5ITNIMrXEeul3Y3J4HUK4g"/>
+ </packagedElement>
+ <profileApplication xmi:id="_LFzeMFG7EeuXzM4mqVly4g">
+ <eAnnotations xmi:id="_LF0FQFG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <references xmi:type="ecore:EPackage" href="pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA"/>
+ </eAnnotations>
+ <appliedProfile href="pathmap://UML_PROFILES/Ecore.profile.uml#_0"/>
+ </profileApplication>
+ </uml:Profile>
+ <Ecore:EPackage xmi:id="_Lr8RIFG7EeuXzM4mqVly4g" base_Package="_gnO0wFG6EeuXzM4mqVly4g" packageName="bookstore" nsPrefix="book" basePackage="org.eclipse.papyrus.toolsmiths.validation.properties.example"/>
+</xmi:XMI>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-profileMoved.ctx b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-profileMoved.ctx
new file mode 100644
index 00000000000..f8112320e8f
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-profileMoved.ctx
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="ASCII"?>
+<contexts:Context xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:constraints="http://www.eclipse.org/papyrus/constraints/0.9" xmlns:contexts="http://www.eclipse.org/papyrus/properties/contexts/0.9" xmi:id="_SVQc4Mf7EeuIwKU8xdbBsg" name="BookStore" label="Book Store">
+ <dependencies href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_69QJkKDJEeSZxfCXzZz3-w"/>
+ <tabs xmi:id="_SVQc4cf7EeuIwKU8xdbBsg" label="BookStore" id="bookstore" priority="100">
+ <sections xmi:id="_SVQc4sf7EeuIwKU8xdbBsg" name="Single Book" sectionFile="ui/SingleBook.xwt">
+ <annotations xmi:id="_SVQc48f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="Book_Store.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/SingleBook.xwt#/"/>
+ </sections>
+ <sections xmi:id="_SVQc5Mf7EeuIwKU8xdbBsg" name="Multiple Book" sectionFile="ui/MultipleBook.xwt">
+ <annotations xmi:id="_SVQc5cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="Book_Store.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/MultipleBook.xwt#/"/>
+ </sections>
+ <sections xmi:id="_SVQc5sf7EeuIwKU8xdbBsg" name="Single BookStore" sectionFile="ui/SingleBookStore.xwt">
+ <annotations xmi:id="_SVQc58f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="Book_Store.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/SingleBookStore.xwt#/"/>
+ </sections>
+ <sections xmi:id="_SVQc6Mf7EeuIwKU8xdbBsg" name="Multiple BookStore" sectionFile="ui/MultipleBookStore.xwt">
+ <annotations xmi:id="_SVQc6cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="Book_Store.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/MultipleBookStore.xwt#/"/>
+ </sections>
+ <sections xmi:id="_SVQc6sf7EeuIwKU8xdbBsg" name="Single Vendor" sectionFile="ui/SingleVendor.xwt">
+ <annotations xmi:id="_SVQc68f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="Book_Store.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/SingleVendor.xwt#/"/>
+ </sections>
+ <sections xmi:id="_SVQc7Mf7EeuIwKU8xdbBsg" name="Multiple Vendor" sectionFile="ui/MultipleVendor.xwt">
+ <annotations xmi:id="_SVQc7cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="Book_Store.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/MultipleVendor.xwt#/"/>
+ </sections>
+ </tabs>
+ <views xmi:id="_SVQc7sf7EeuIwKU8xdbBsg" name="Single Book" sections="_SVQc4sf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdDMf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc78f7EeuIwKU8xdbBsg" name="isSingleBook">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQc8Mf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::Book"/>
+ </constraints>
+ <annotations xmi:id="_SVQc8cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="Book_Store.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQc8sf7EeuIwKU8xdbBsg" elementMultiplicity="-1" name="Multiple Book" sections="_SVQc5Mf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdDMf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc88f7EeuIwKU8xdbBsg" name="isMultipleBook">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQc9Mf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::Book"/>
+ </constraints>
+ <annotations xmi:id="_SVQc9cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="Book_Store.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQc9sf7EeuIwKU8xdbBsg" name="Single BookStore" sections="_SVQc5sf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdCMf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc98f7EeuIwKU8xdbBsg" name="isSingleBookStore">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQc-Mf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::BookStore"/>
+ </constraints>
+ <annotations xmi:id="_SVQc-cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="Book_Store.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQc-sf7EeuIwKU8xdbBsg" elementMultiplicity="-1" name="Multiple BookStore" sections="_SVQc6Mf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdCMf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc-8f7EeuIwKU8xdbBsg" name="isMultipleBookStore">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQc_Mf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::BookStore"/>
+ </constraints>
+ <annotations xmi:id="_SVQc_cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="Book_Store.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQc_sf7EeuIwKU8xdbBsg" name="Single Vendor" sections="_SVQc6sf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdDsf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc_8f7EeuIwKU8xdbBsg" name="isSingleVendor">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQdAMf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::Vendor"/>
+ </constraints>
+ <annotations xmi:id="_SVQdAcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="Book_Store.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQdAsf7EeuIwKU8xdbBsg" elementMultiplicity="-1" name="Multiple Vendor" sections="_SVQc7Mf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdDsf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQdA8f7EeuIwKU8xdbBsg" name="isMultipleVendor">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQdBMf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::Vendor"/>
+ </constraints>
+ <annotations xmi:id="_SVQdBcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="Book_Store.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <dataContexts xmi:id="_SVQdBsf7EeuIwKU8xdbBsg" name="BookStore" label="Book Store">
+ <annotations xmi:id="_SVQdB8f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="Book_Store.profile.uml#_gnO0wFG6EeuXzM4mqVly4g"/>
+ <details xmi:id="_H8Gt8NmlEeuJXNXZyutAwA" key="layoutGenerator" value="bundleclass://org.eclipse.papyrus.uml.properties.generation/org.eclipse.papyrus.customization.properties.generation.layout.StandardLayoutGenerator"/>
+ </annotations>
+ <elements xmi:id="_SVQdCMf7EeuIwKU8xdbBsg" name="BookStore">
+ <annotations xmi:id="_SVQdCcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="Book_Store.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <properties xmi:id="_SVQdCsf7EeuIwKU8xdbBsg" name="bookDispositions" type="Enumeration" multiplicity="-1">
+ <annotations xmi:id="_SVQdC8f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="Book_Store.profile.uml#_egjHIMVgEeuKDMwJXd21Mg"/>
+ </annotations>
+ </properties>
+ <supertypes href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_690xiaDJEeSZxfCXzZz3-w"/>
+ </elements>
+ <elements xmi:id="_SVQdDMf7EeuIwKU8xdbBsg" name="Book">
+ <annotations xmi:id="_SVQdDcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="Book_Store.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <supertypes href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_690yXqDJEeSZxfCXzZz3-w"/>
+ </elements>
+ <elements xmi:id="_SVQdDsf7EeuIwKU8xdbBsg" name="Vendor">
+ <annotations xmi:id="_SVQdD8f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="Book_Store.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <properties xmi:id="_SVQdEMf7EeuIwKU8xdbBsg" name="licenseNumber">
+ <annotations xmi:id="_SVQdEcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="Book_Store.profile.uml#_qf-GgMVgEeuKDMwJXd21Mg"/>
+ </annotations>
+ </properties>
+ <supertypes href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_690yXqDJEeSZxfCXzZz3-w"/>
+ </elements>
+ <modelElementFactory href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@modelElementFactories.2"/>
+ </dataContexts>
+</contexts:Context>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-propertyWrongMultiplicity.ctx b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-propertyWrongMultiplicity.ctx
new file mode 100644
index 00000000000..9823a43f604
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-propertyWrongMultiplicity.ctx
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="ASCII"?>
+<contexts:Context xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:constraints="http://www.eclipse.org/papyrus/constraints/0.9" xmlns:contexts="http://www.eclipse.org/papyrus/properties/contexts/0.9" xmi:id="_SVQc4Mf7EeuIwKU8xdbBsg" name="BookStore" label="Book Store">
+ <dependencies href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_69QJkKDJEeSZxfCXzZz3-w"/>
+ <tabs xmi:id="_SVQc4cf7EeuIwKU8xdbBsg" label="BookStore" id="bookstore" priority="100">
+ <allSections xsi:type="contexts:Section" xmi:id="_SVQc4sf7EeuIwKU8xdbBsg" name="Single Book" sectionFile="ui/SingleBook.xwt">
+ <annotations xmi:id="_SVQc48f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/SingleBook.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_SVQc5Mf7EeuIwKU8xdbBsg" name="Multiple Book" sectionFile="ui/MultipleBook.xwt">
+ <annotations xmi:id="_SVQc5cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/MultipleBook.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_SVQc5sf7EeuIwKU8xdbBsg" name="Single BookStore" sectionFile="ui/SingleBookStore.xwt">
+ <annotations xmi:id="_SVQc58f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/SingleBookStore.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_SVQc6Mf7EeuIwKU8xdbBsg" name="Multiple BookStore" sectionFile="ui/MultipleBookStore.xwt">
+ <annotations xmi:id="_SVQc6cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/MultipleBookStore.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_SVQc6sf7EeuIwKU8xdbBsg" name="Single Vendor" sectionFile="ui/SingleVendor.xwt">
+ <annotations xmi:id="_SVQc68f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/SingleVendor.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_SVQc7Mf7EeuIwKU8xdbBsg" name="Multiple Vendor" sectionFile="ui/MultipleVendor.xwt">
+ <annotations xmi:id="_SVQc7cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/MultipleVendor.xwt#/"/>
+ </allSections>
+ </tabs>
+ <views xmi:id="_SVQc7sf7EeuIwKU8xdbBsg" name="Single Book" sections="_SVQc4sf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdDMf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc78f7EeuIwKU8xdbBsg" name="isSingleBook">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQc8Mf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::Book"/>
+ </constraints>
+ <annotations xmi:id="_SVQc8cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQc8sf7EeuIwKU8xdbBsg" elementMultiplicity="-1" name="Multiple Book" sections="_SVQc5Mf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdDMf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc88f7EeuIwKU8xdbBsg" name="isMultipleBook">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQc9Mf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::Book"/>
+ </constraints>
+ <annotations xmi:id="_SVQc9cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQc9sf7EeuIwKU8xdbBsg" name="Single BookStore" sections="_SVQc5sf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdCMf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc98f7EeuIwKU8xdbBsg" name="isSingleBookStore">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQc-Mf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::BookStore"/>
+ </constraints>
+ <annotations xmi:id="_SVQc-cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQc-sf7EeuIwKU8xdbBsg" elementMultiplicity="-1" name="Multiple BookStore" sections="_SVQc6Mf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdCMf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc-8f7EeuIwKU8xdbBsg" name="isMultipleBookStore">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQc_Mf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::BookStore"/>
+ </constraints>
+ <annotations xmi:id="_SVQc_cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQc_sf7EeuIwKU8xdbBsg" name="Single Vendor" sections="_SVQc6sf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdDsf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc_8f7EeuIwKU8xdbBsg" name="isSingleVendor">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQdAMf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::Vendor"/>
+ </constraints>
+ <annotations xmi:id="_SVQdAcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQdAsf7EeuIwKU8xdbBsg" elementMultiplicity="-1" name="Multiple Vendor" sections="_SVQc7Mf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdDsf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQdA8f7EeuIwKU8xdbBsg" name="isMultipleVendor">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQdBMf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::Vendor"/>
+ </constraints>
+ <annotations xmi:id="_SVQdBcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <dataContexts xmi:id="_SVQdBsf7EeuIwKU8xdbBsg" name="BookStore" label="Book Store">
+ <annotations xmi:id="_SVQdB8f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_gnO0wFG6EeuXzM4mqVly4g"/>
+ <details xmi:id="_H8Gt8NmlEeuJXNXZyutAwA" key="layoutGenerator" value="bundleclass://org.eclipse.papyrus.uml.properties.generation/org.eclipse.papyrus.customization.properties.generation.layout.StandardLayoutGenerator"/>
+ </annotations>
+ <elements xmi:id="_SVQdCMf7EeuIwKU8xdbBsg" name="BookStore">
+ <annotations xmi:id="_SVQdCcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <supertypes href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_690xiaDJEeSZxfCXzZz3-w"/>
+ <properties xmi:id="_SVQdCsf7EeuIwKU8xdbBsg" name="bookDispositions" type="Enumeration" multiplicity="1">
+ <annotations xmi:id="_SVQdC8f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_egjHIMVgEeuKDMwJXd21Mg"/>
+ </annotations>
+ </properties>
+ </elements>
+ <elements xmi:id="_SVQdDMf7EeuIwKU8xdbBsg" name="Book">
+ <annotations xmi:id="_SVQdDcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <supertypes href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_690yXqDJEeSZxfCXzZz3-w"/>
+ </elements>
+ <elements xmi:id="_SVQdDsf7EeuIwKU8xdbBsg" name="Vendor">
+ <annotations xmi:id="_SVQdD8f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <supertypes href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_690yXqDJEeSZxfCXzZz3-w"/>
+ <properties xmi:id="_SVQdEMf7EeuIwKU8xdbBsg" name="licenseNumber">
+ <annotations xmi:id="_SVQdEcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_qf-GgMVgEeuKDMwJXd21Mg"/>
+ </annotations>
+ </properties>
+ </elements>
+ <modelElementFactory href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@modelElementFactories.2"/>
+ </dataContexts>
+</contexts:Context>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-renamedProfile.profile.uml b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-renamedProfile.profile.uml
new file mode 100644
index 00000000000..5017652b5ac
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-renamedProfile.profile.uml
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:Ecore="http://www.eclipse.org/uml2/schemas/Ecore/5" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xsi:schemaLocation="http://www.eclipse.org/uml2/schemas/Ecore/5 pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA">
+ <uml:Profile xmi:id="_gnO0wFG6EeuXzM4mqVly4g" name="BookStoreProfile" URI="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore" metaclassReference="_rQ3s8FG6EeuXzM4mqVly4g _rQ5iIFG6EeuXzM4mqVly4g">
+ <eAnnotations xmi:id="_e24cAFG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <eAnnotations xmi:id="_V-_VwMVgEeuKDMwJXd21Mg" source="PapyrusVersion">
+ <details xmi:id="_V-_VwcVgEeuKDMwJXd21Mg" key="Version" value="0.0.0"/>
+ <details xmi:id="_V-_VwsVgEeuKDMwJXd21Mg" key="Comment" value="&lt;undefined>"/>
+ <details xmi:id="_V-_Vw8VgEeuKDMwJXd21Mg" key="Copyright" value=""/>
+ <details xmi:id="_V-_VxMVgEeuKDMwJXd21Mg" key="Date" value=""/>
+ <details xmi:id="_V-_VxcVgEeuKDMwJXd21Mg" key="Author" value="&lt;undefined>"/>
+ </eAnnotations>
+ <contents xmi:type="ecore:EPackage" xmi:id="_e24cAVG7EeuXzM4mqVly4g" name="bookstoreprofile" nsURI="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore" nsPrefix="book">
+ <eAnnotations xmi:id="_e24cAlG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <details xmi:id="_e24cA1G7EeuXzM4mqVly4g" key="originalName" value="BookStore"/>
+ </eAnnotations>
+ <eAnnotations xmi:id="_e26RMFG7EeuXzM4mqVly4g" source="PapyrusVersion">
+ <details xmi:id="_e26RMVG7EeuXzM4mqVly4g" key="Version" value="0.0.1"/>
+ <details xmi:id="_e26RMlG7EeuXzM4mqVly4g" key="Comment" value=""/>
+ <details xmi:id="_e26RM1G7EeuXzM4mqVly4g" key="Copyright" value="Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.&#xA;&#xA;All rights reserved. This program and the accompanying materials&#xA;are made available under the terms of the Eclipse Public License 2.0&#xA;which accompanies this distribution, and is available at&#xA;http://www.eclipse.org/legal/epl-2.0/&#xA;&#xA;SPDX-License-Identifier: EPL-2.0&#xA;&#xA;Contributors:&#xA; Christian W. Damus - Initial API and implementation"/>
+ <details xmi:id="_e26RNFG7EeuXzM4mqVly4g" key="Date" value="2021-01-08"/>
+ <details xmi:id="_e26RNVG7EeuXzM4mqVly4g" key="Author" value="Christian W. Damus"/>
+ </eAnnotations>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_e24cBFG7EeuXzM4mqVly4g" name="BookStore">
+ <eAnnotations xmi:id="_e24cBVG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_tQKrMFG6EeuXzM4mqVly4g"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_e24cBlG7EeuXzM4mqVly4g" name="base_Package" ordered="false">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Package"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_T36poMViEeuKDMwJXd21Mg" name="bookDispositions" lowerBound="1" upperBound="-1" eType="_FZtToMViEeuKDMwJXd21Mg"/>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_e24cCFG7EeuXzM4mqVly4g" name="Vendor">
+ <eAnnotations xmi:id="_e24cCVG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_xMldcFG6EeuXzM4mqVly4g"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_e24cClG7EeuXzM4mqVly4g" name="base_Class" ordered="false">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Class"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_aGK7oMViEeuKDMwJXd21Mg" name="licenseNumber" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_e24cDFG7EeuXzM4mqVly4g" name="Book">
+ <eAnnotations xmi:id="_e24cDVG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_8r71oFG6EeuXzM4mqVly4g"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_e24cDlG7EeuXzM4mqVly4g" name="base_Class" ordered="false">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Class"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EEnum" xmi:id="_FZtToMViEeuKDMwJXd21Mg" name="DispositionKind">
+ <eLiterals xmi:id="_Hu0J0MViEeuKDMwJXd21Mg" name="new"/>
+ <eLiterals xmi:id="_K4FA0MViEeuKDMwJXd21Mg" name="used" value="1"/>
+ <eLiterals xmi:id="_M41XoMViEeuKDMwJXd21Mg" name="lending" value="2"/>
+ </eClassifiers>
+ </contents>
+ </eAnnotations>
+ <elementImport xmi:id="_rQ3s8FG6EeuXzM4mqVly4g" alias="Package">
+ <importedElement xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Package"/>
+ </elementImport>
+ <elementImport xmi:id="_rQ5iIFG6EeuXzM4mqVly4g" alias="Class">
+ <importedElement xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ </elementImport>
+ <packageImport xmi:id="_gurgkFG6EeuXzM4mqVly4g">
+ <importedPackage xmi:type="uml:Model" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#_0"/>
+ </packageImport>
+ <packageImport xmi:id="_gut80FG6EeuXzM4mqVly4g">
+ <importedPackage xmi:type="uml:Model" href="pathmap://UML_METAMODELS/UML.metamodel.uml#_0"/>
+ </packageImport>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_tQKrMFG6EeuXzM4mqVly4g" name="BookStore">
+ <ownedAttribute xmi:id="_uzEBUFG6EeuXzM4mqVly4g" name="base_Package" association="_uzCMIFG6EeuXzM4mqVly4g">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Package"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_uzEBUVG6EeuXzM4mqVly4g"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="_egjHIMVgEeuKDMwJXd21Mg" name="bookDispositions" type="_V-9gkMVgEeuKDMwJXd21Mg">
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_hAwaEMVgEeuKDMwJXd21Mg" value="*"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="_uzCMIFG6EeuXzM4mqVly4g" name="E_BookStore_Package6" memberEnd="_uzDaQFG6EeuXzM4mqVly4g _uzEBUFG6EeuXzM4mqVly4g">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_uzDaQFG6EeuXzM4mqVly4g" name="extension_BookStore" type="_tQKrMFG6EeuXzM4mqVly4g" aggregation="composite" association="_uzCMIFG6EeuXzM4mqVly4g"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_xMldcFG6EeuXzM4mqVly4g" name="Vendor">
+ <ownedAttribute xmi:id="__-fLglG6EeuXzM4mqVly4g" name="base_Class" association="__-fLgFG6EeuXzM4mqVly4g">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="__-fykFG6EeuXzM4mqVly4g"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="_qf-GgMVgEeuKDMwJXd21Mg" name="licenseNumber">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_8r71oFG6EeuXzM4mqVly4g" name="Book">
+ <ownedAttribute xmi:id="__Aw_AVG6EeuXzM4mqVly4g" name="base_Class" association="__AwX8FG6EeuXzM4mqVly4g">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="__Aw_AlG6EeuXzM4mqVly4g"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="__AwX8FG6EeuXzM4mqVly4g" name="E_Book_Class9" memberEnd="__Aw_AFG6EeuXzM4mqVly4g __Aw_AVG6EeuXzM4mqVly4g">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="__Aw_AFG6EeuXzM4mqVly4g" name="extension_Book" type="_8r71oFG6EeuXzM4mqVly4g" aggregation="composite" association="__AwX8FG6EeuXzM4mqVly4g"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="__-fLgFG6EeuXzM4mqVly4g" name="E_Vendor_Class10" memberEnd="__-fLgVG6EeuXzM4mqVly4g __-fLglG6EeuXzM4mqVly4g">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="__-fLgVG6EeuXzM4mqVly4g" name="extension_Vendor" type="_xMldcFG6EeuXzM4mqVly4g" aggregation="composite" association="__-fLgFG6EeuXzM4mqVly4g"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Enumeration" xmi:id="_V-9gkMVgEeuKDMwJXd21Mg" name="DispositionKind">
+ <ownedLiteral xmi:id="_b19wMMVgEeuKDMwJXd21Mg" name="new"/>
+ <ownedLiteral xmi:id="_c2HloMVgEeuKDMwJXd21Mg" name="used"/>
+ <ownedLiteral xmi:id="_di2v0MVgEeuKDMwJXd21Mg" name="lending"/>
+ </packagedElement>
+ <profileApplication xmi:id="_LFzeMFG7EeuXzM4mqVly4g">
+ <eAnnotations xmi:id="_LF0FQFG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <references xmi:type="ecore:EPackage" href="pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA"/>
+ </eAnnotations>
+ <appliedProfile href="pathmap://UML_PROFILES/Ecore.profile.uml#_0"/>
+ </profileApplication>
+ </uml:Profile>
+ <Ecore:EPackage xmi:id="_Lr8RIFG7EeuXzM4mqVly4g" base_Package="_gnO0wFG6EeuXzM4mqVly4g" packageName="bookstoreprofile" nsPrefix="book" basePackage="org.eclipse.papyrus.toolsmiths.validation.properties.example"/>
+</xmi:XMI>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-renamedProperty.profile.uml b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-renamedProperty.profile.uml
new file mode 100644
index 00000000000..2f17535b9fe
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-renamedProperty.profile.uml
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:Ecore="http://www.eclipse.org/uml2/schemas/Ecore/5" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xsi:schemaLocation="http://www.eclipse.org/uml2/schemas/Ecore/5 pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA">
+ <uml:Profile xmi:id="_gnO0wFG6EeuXzM4mqVly4g" name="BookStore" URI="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore" metaclassReference="_rQ3s8FG6EeuXzM4mqVly4g _rQ5iIFG6EeuXzM4mqVly4g">
+ <eAnnotations xmi:id="_e24cAFG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <eAnnotations xmi:id="_V-_VwMVgEeuKDMwJXd21Mg" source="PapyrusVersion">
+ <details xmi:id="_V-_VwcVgEeuKDMwJXd21Mg" key="Version" value="0.0.0"/>
+ <details xmi:id="_V-_VwsVgEeuKDMwJXd21Mg" key="Comment" value="&lt;undefined>"/>
+ <details xmi:id="_V-_Vw8VgEeuKDMwJXd21Mg" key="Copyright" value=""/>
+ <details xmi:id="_V-_VxMVgEeuKDMwJXd21Mg" key="Date" value=""/>
+ <details xmi:id="_V-_VxcVgEeuKDMwJXd21Mg" key="Author" value="&lt;undefined>"/>
+ </eAnnotations>
+ <contents xmi:type="ecore:EPackage" xmi:id="_e24cAVG7EeuXzM4mqVly4g" name="bookstore" nsURI="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore" nsPrefix="book">
+ <eAnnotations xmi:id="_e24cAlG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <details xmi:id="_e24cA1G7EeuXzM4mqVly4g" key="originalName" value="BookStore"/>
+ </eAnnotations>
+ <eAnnotations xmi:id="_e26RMFG7EeuXzM4mqVly4g" source="PapyrusVersion">
+ <details xmi:id="_e26RMVG7EeuXzM4mqVly4g" key="Version" value="0.0.1"/>
+ <details xmi:id="_e26RMlG7EeuXzM4mqVly4g" key="Comment" value=""/>
+ <details xmi:id="_e26RM1G7EeuXzM4mqVly4g" key="Copyright" value="Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.&#xA;&#xA;All rights reserved. This program and the accompanying materials&#xA;are made available under the terms of the Eclipse Public License 2.0&#xA;which accompanies this distribution, and is available at&#xA;http://www.eclipse.org/legal/epl-2.0/&#xA;&#xA;SPDX-License-Identifier: EPL-2.0&#xA;&#xA;Contributors:&#xA; Christian W. Damus - Initial API and implementation"/>
+ <details xmi:id="_e26RNFG7EeuXzM4mqVly4g" key="Date" value="2021-01-08"/>
+ <details xmi:id="_e26RNVG7EeuXzM4mqVly4g" key="Author" value="Christian W. Damus"/>
+ </eAnnotations>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_e24cBFG7EeuXzM4mqVly4g" name="BookStore">
+ <eAnnotations xmi:id="_e24cBVG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_tQKrMFG6EeuXzM4mqVly4g"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_e24cBlG7EeuXzM4mqVly4g" name="base_Package" ordered="false">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Package"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_T36poMViEeuKDMwJXd21Mg" name="bookDispositions" lowerBound="1" upperBound="-1" eType="_FZtToMViEeuKDMwJXd21Mg"/>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_e24cCFG7EeuXzM4mqVly4g" name="Vendor">
+ <eAnnotations xmi:id="_e24cCVG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_xMldcFG6EeuXzM4mqVly4g"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_e24cClG7EeuXzM4mqVly4g" name="base_Class" ordered="false">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Class"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_aGK7oMViEeuKDMwJXd21Mg" name="license" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_e24cDFG7EeuXzM4mqVly4g" name="Book">
+ <eAnnotations xmi:id="_e24cDVG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_8r71oFG6EeuXzM4mqVly4g"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_e24cDlG7EeuXzM4mqVly4g" name="base_Class" ordered="false">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Class"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EEnum" xmi:id="_FZtToMViEeuKDMwJXd21Mg" name="DispositionKind">
+ <eLiterals xmi:id="_Hu0J0MViEeuKDMwJXd21Mg" name="new"/>
+ <eLiterals xmi:id="_K4FA0MViEeuKDMwJXd21Mg" name="used" value="1"/>
+ <eLiterals xmi:id="_M41XoMViEeuKDMwJXd21Mg" name="lending" value="2"/>
+ </eClassifiers>
+ </contents>
+ </eAnnotations>
+ <elementImport xmi:id="_rQ3s8FG6EeuXzM4mqVly4g" alias="Package">
+ <importedElement xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Package"/>
+ </elementImport>
+ <elementImport xmi:id="_rQ5iIFG6EeuXzM4mqVly4g" alias="Class">
+ <importedElement xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ </elementImport>
+ <packageImport xmi:id="_gurgkFG6EeuXzM4mqVly4g">
+ <importedPackage xmi:type="uml:Model" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#_0"/>
+ </packageImport>
+ <packageImport xmi:id="_gut80FG6EeuXzM4mqVly4g">
+ <importedPackage xmi:type="uml:Model" href="pathmap://UML_METAMODELS/UML.metamodel.uml#_0"/>
+ </packageImport>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_tQKrMFG6EeuXzM4mqVly4g" name="BookStore">
+ <ownedAttribute xmi:id="_uzEBUFG6EeuXzM4mqVly4g" name="base_Package" association="_uzCMIFG6EeuXzM4mqVly4g">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Package"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_uzEBUVG6EeuXzM4mqVly4g"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="_egjHIMVgEeuKDMwJXd21Mg" name="bookDispositions" type="_V-9gkMVgEeuKDMwJXd21Mg">
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_hAwaEMVgEeuKDMwJXd21Mg" value="*"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="_uzCMIFG6EeuXzM4mqVly4g" name="E_BookStore_Package6" memberEnd="_uzDaQFG6EeuXzM4mqVly4g _uzEBUFG6EeuXzM4mqVly4g">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_uzDaQFG6EeuXzM4mqVly4g" name="extension_BookStore" type="_tQKrMFG6EeuXzM4mqVly4g" aggregation="composite" association="_uzCMIFG6EeuXzM4mqVly4g"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_xMldcFG6EeuXzM4mqVly4g" name="Vendor">
+ <ownedAttribute xmi:id="__-fLglG6EeuXzM4mqVly4g" name="base_Class" association="__-fLgFG6EeuXzM4mqVly4g">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="__-fykFG6EeuXzM4mqVly4g"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="_qf-GgMVgEeuKDMwJXd21Mg" name="license">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_8r71oFG6EeuXzM4mqVly4g" name="Book">
+ <ownedAttribute xmi:id="__Aw_AVG6EeuXzM4mqVly4g" name="base_Class" association="__AwX8FG6EeuXzM4mqVly4g">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="__Aw_AlG6EeuXzM4mqVly4g"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="__AwX8FG6EeuXzM4mqVly4g" name="E_Book_Class9" memberEnd="__Aw_AFG6EeuXzM4mqVly4g __Aw_AVG6EeuXzM4mqVly4g">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="__Aw_AFG6EeuXzM4mqVly4g" name="extension_Book" type="_8r71oFG6EeuXzM4mqVly4g" aggregation="composite" association="__AwX8FG6EeuXzM4mqVly4g"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="__-fLgFG6EeuXzM4mqVly4g" name="E_Vendor_Class10" memberEnd="__-fLgVG6EeuXzM4mqVly4g __-fLglG6EeuXzM4mqVly4g">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="__-fLgVG6EeuXzM4mqVly4g" name="extension_Vendor" type="_xMldcFG6EeuXzM4mqVly4g" aggregation="composite" association="__-fLgFG6EeuXzM4mqVly4g"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Enumeration" xmi:id="_V-9gkMVgEeuKDMwJXd21Mg" name="DispositionKind">
+ <ownedLiteral xmi:id="_b19wMMVgEeuKDMwJXd21Mg" name="new"/>
+ <ownedLiteral xmi:id="_c2HloMVgEeuKDMwJXd21Mg" name="used"/>
+ <ownedLiteral xmi:id="_di2v0MVgEeuKDMwJXd21Mg" name="lending"/>
+ </packagedElement>
+ <profileApplication xmi:id="_LFzeMFG7EeuXzM4mqVly4g">
+ <eAnnotations xmi:id="_LF0FQFG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <references xmi:type="ecore:EPackage" href="pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA"/>
+ </eAnnotations>
+ <appliedProfile href="pathmap://UML_PROFILES/Ecore.profile.uml#_0"/>
+ </profileApplication>
+ </uml:Profile>
+ <Ecore:EPackage xmi:id="_Lr8RIFG7EeuXzM4mqVly4g" base_Package="_gnO0wFG6EeuXzM4mqVly4g" packageName="bookstore" nsPrefix="book" basePackage="org.eclipse.papyrus.toolsmiths.validation.properties.example"/>
+</xmi:XMI>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-renamedStereotype.profile.uml b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-renamedStereotype.profile.uml
new file mode 100644
index 00000000000..30fabb3f365
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-renamedStereotype.profile.uml
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:Ecore="http://www.eclipse.org/uml2/schemas/Ecore/5" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xsi:schemaLocation="http://www.eclipse.org/uml2/schemas/Ecore/5 pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA">
+ <uml:Profile xmi:id="_gnO0wFG6EeuXzM4mqVly4g" name="BookStore" URI="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore" metaclassReference="_rQ3s8FG6EeuXzM4mqVly4g _rQ5iIFG6EeuXzM4mqVly4g">
+ <eAnnotations xmi:id="_e24cAFG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <eAnnotations xmi:id="_V-_VwMVgEeuKDMwJXd21Mg" source="PapyrusVersion">
+ <details xmi:id="_V-_VwcVgEeuKDMwJXd21Mg" key="Version" value="0.0.0"/>
+ <details xmi:id="_V-_VwsVgEeuKDMwJXd21Mg" key="Comment" value="&lt;undefined>"/>
+ <details xmi:id="_V-_Vw8VgEeuKDMwJXd21Mg" key="Copyright" value=""/>
+ <details xmi:id="_V-_VxMVgEeuKDMwJXd21Mg" key="Date" value=""/>
+ <details xmi:id="_V-_VxcVgEeuKDMwJXd21Mg" key="Author" value="&lt;undefined>"/>
+ </eAnnotations>
+ <contents xmi:type="ecore:EPackage" xmi:id="_e24cAVG7EeuXzM4mqVly4g" name="bookstore" nsURI="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore" nsPrefix="book">
+ <eAnnotations xmi:id="_e24cAlG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <details xmi:id="_e24cA1G7EeuXzM4mqVly4g" key="originalName" value="BookStore"/>
+ </eAnnotations>
+ <eAnnotations xmi:id="_e26RMFG7EeuXzM4mqVly4g" source="PapyrusVersion">
+ <details xmi:id="_e26RMVG7EeuXzM4mqVly4g" key="Version" value="0.0.1"/>
+ <details xmi:id="_e26RMlG7EeuXzM4mqVly4g" key="Comment" value=""/>
+ <details xmi:id="_e26RM1G7EeuXzM4mqVly4g" key="Copyright" value="Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.&#xA;&#xA;All rights reserved. This program and the accompanying materials&#xA;are made available under the terms of the Eclipse Public License 2.0&#xA;which accompanies this distribution, and is available at&#xA;http://www.eclipse.org/legal/epl-2.0/&#xA;&#xA;SPDX-License-Identifier: EPL-2.0&#xA;&#xA;Contributors:&#xA; Christian W. Damus - Initial API and implementation"/>
+ <details xmi:id="_e26RNFG7EeuXzM4mqVly4g" key="Date" value="2021-01-08"/>
+ <details xmi:id="_e26RNVG7EeuXzM4mqVly4g" key="Author" value="Christian W. Damus"/>
+ </eAnnotations>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_e24cBFG7EeuXzM4mqVly4g" name="BookStore">
+ <eAnnotations xmi:id="_e24cBVG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_tQKrMFG6EeuXzM4mqVly4g"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_e24cBlG7EeuXzM4mqVly4g" name="base_Package" ordered="false">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Package"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_T36poMViEeuKDMwJXd21Mg" name="bookDispositions" lowerBound="1" upperBound="-1" eType="_FZtToMViEeuKDMwJXd21Mg"/>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_e24cCFG7EeuXzM4mqVly4g" name="Seller">
+ <eAnnotations xmi:id="_e24cCVG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_xMldcFG6EeuXzM4mqVly4g"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_e24cClG7EeuXzM4mqVly4g" name="base_Class" ordered="false">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Class"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_aGK7oMViEeuKDMwJXd21Mg" name="licenseNumber" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_e24cDFG7EeuXzM4mqVly4g" name="Book">
+ <eAnnotations xmi:id="_e24cDVG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_8r71oFG6EeuXzM4mqVly4g"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_e24cDlG7EeuXzM4mqVly4g" name="base_Class" ordered="false">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Class"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EEnum" xmi:id="_FZtToMViEeuKDMwJXd21Mg" name="DispositionKind">
+ <eLiterals xmi:id="_Hu0J0MViEeuKDMwJXd21Mg" name="new"/>
+ <eLiterals xmi:id="_K4FA0MViEeuKDMwJXd21Mg" name="used" value="1"/>
+ <eLiterals xmi:id="_M41XoMViEeuKDMwJXd21Mg" name="lending" value="2"/>
+ </eClassifiers>
+ </contents>
+ </eAnnotations>
+ <elementImport xmi:id="_rQ3s8FG6EeuXzM4mqVly4g" alias="Package">
+ <importedElement xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Package"/>
+ </elementImport>
+ <elementImport xmi:id="_rQ5iIFG6EeuXzM4mqVly4g" alias="Class">
+ <importedElement xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ </elementImport>
+ <packageImport xmi:id="_gurgkFG6EeuXzM4mqVly4g">
+ <importedPackage xmi:type="uml:Model" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#_0"/>
+ </packageImport>
+ <packageImport xmi:id="_gut80FG6EeuXzM4mqVly4g">
+ <importedPackage xmi:type="uml:Model" href="pathmap://UML_METAMODELS/UML.metamodel.uml#_0"/>
+ </packageImport>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_tQKrMFG6EeuXzM4mqVly4g" name="BookStore">
+ <ownedAttribute xmi:id="_uzEBUFG6EeuXzM4mqVly4g" name="base_Package" association="_uzCMIFG6EeuXzM4mqVly4g">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Package"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_uzEBUVG6EeuXzM4mqVly4g"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="_egjHIMVgEeuKDMwJXd21Mg" name="bookDispositions" type="_V-9gkMVgEeuKDMwJXd21Mg">
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_hAwaEMVgEeuKDMwJXd21Mg" value="*"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="_uzCMIFG6EeuXzM4mqVly4g" name="E_BookStore_Package6" memberEnd="_uzDaQFG6EeuXzM4mqVly4g _uzEBUFG6EeuXzM4mqVly4g">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_uzDaQFG6EeuXzM4mqVly4g" name="extension_BookStore" type="_tQKrMFG6EeuXzM4mqVly4g" aggregation="composite" association="_uzCMIFG6EeuXzM4mqVly4g"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_xMldcFG6EeuXzM4mqVly4g" name="Seller">
+ <ownedAttribute xmi:id="__-fLglG6EeuXzM4mqVly4g" name="base_Class" association="__-fLgFG6EeuXzM4mqVly4g">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="__-fykFG6EeuXzM4mqVly4g"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="_qf-GgMVgEeuKDMwJXd21Mg" name="licenseNumber">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_8r71oFG6EeuXzM4mqVly4g" name="Book">
+ <ownedAttribute xmi:id="__Aw_AVG6EeuXzM4mqVly4g" name="base_Class" association="__AwX8FG6EeuXzM4mqVly4g">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="__Aw_AlG6EeuXzM4mqVly4g"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="__AwX8FG6EeuXzM4mqVly4g" name="E_Book_Class9" memberEnd="__Aw_AFG6EeuXzM4mqVly4g __Aw_AVG6EeuXzM4mqVly4g">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="__Aw_AFG6EeuXzM4mqVly4g" name="extension_Book" type="_8r71oFG6EeuXzM4mqVly4g" aggregation="composite" association="__AwX8FG6EeuXzM4mqVly4g"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="__-fLgFG6EeuXzM4mqVly4g" name="E_Vendor_Class10" memberEnd="__-fLgVG6EeuXzM4mqVly4g __-fLglG6EeuXzM4mqVly4g">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="__-fLgVG6EeuXzM4mqVly4g" name="extension_Vendor" type="_xMldcFG6EeuXzM4mqVly4g" aggregation="composite" association="__-fLgFG6EeuXzM4mqVly4g"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Enumeration" xmi:id="_V-9gkMVgEeuKDMwJXd21Mg" name="DispositionKind">
+ <ownedLiteral xmi:id="_b19wMMVgEeuKDMwJXd21Mg" name="new"/>
+ <ownedLiteral xmi:id="_c2HloMVgEeuKDMwJXd21Mg" name="used"/>
+ <ownedLiteral xmi:id="_di2v0MVgEeuKDMwJXd21Mg" name="lending"/>
+ </packagedElement>
+ <profileApplication xmi:id="_LFzeMFG7EeuXzM4mqVly4g">
+ <eAnnotations xmi:id="_LF0FQFG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <references xmi:type="ecore:EPackage" href="pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA"/>
+ </eAnnotations>
+ <appliedProfile href="pathmap://UML_PROFILES/Ecore.profile.uml#_0"/>
+ </profileApplication>
+ </uml:Profile>
+ <Ecore:EPackage xmi:id="_Lr8RIFG7EeuXzM4mqVly4g" base_Package="_gnO0wFG6EeuXzM4mqVly4g" packageName="bookstore" nsPrefix="book" basePackage="org.eclipse.papyrus.toolsmiths.validation.properties.example"/>
+</xmi:XMI>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-stringPropertyWrongType.ctx b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-stringPropertyWrongType.ctx
new file mode 100644
index 00000000000..25dbf519f1a
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-stringPropertyWrongType.ctx
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="ASCII"?>
+<contexts:Context xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:constraints="http://www.eclipse.org/papyrus/constraints/0.9" xmlns:contexts="http://www.eclipse.org/papyrus/properties/contexts/0.9" xmi:id="_SVQc4Mf7EeuIwKU8xdbBsg" name="BookStore" label="Book Store">
+ <dependencies href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_69QJkKDJEeSZxfCXzZz3-w"/>
+ <tabs xmi:id="_SVQc4cf7EeuIwKU8xdbBsg" label="BookStore" id="bookstore" priority="100">
+ <allSections xsi:type="contexts:Section" xmi:id="_SVQc4sf7EeuIwKU8xdbBsg" name="Single Book" sectionFile="ui/SingleBook.xwt">
+ <annotations xmi:id="_SVQc48f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/SingleBook.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_SVQc5Mf7EeuIwKU8xdbBsg" name="Multiple Book" sectionFile="ui/MultipleBook.xwt">
+ <annotations xmi:id="_SVQc5cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/MultipleBook.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_SVQc5sf7EeuIwKU8xdbBsg" name="Single BookStore" sectionFile="ui/SingleBookStore.xwt">
+ <annotations xmi:id="_SVQc58f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/SingleBookStore.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_SVQc6Mf7EeuIwKU8xdbBsg" name="Multiple BookStore" sectionFile="ui/MultipleBookStore.xwt">
+ <annotations xmi:id="_SVQc6cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/MultipleBookStore.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_SVQc6sf7EeuIwKU8xdbBsg" name="Single Vendor" sectionFile="ui/SingleVendor.xwt">
+ <annotations xmi:id="_SVQc68f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/SingleVendor.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_SVQc7Mf7EeuIwKU8xdbBsg" name="Multiple Vendor" sectionFile="ui/MultipleVendor.xwt">
+ <annotations xmi:id="_SVQc7cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/MultipleVendor.xwt#/"/>
+ </allSections>
+ </tabs>
+ <views xmi:id="_SVQc7sf7EeuIwKU8xdbBsg" name="Single Book" sections="_SVQc4sf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdDMf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc78f7EeuIwKU8xdbBsg" name="isSingleBook">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQc8Mf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::Book"/>
+ </constraints>
+ <annotations xmi:id="_SVQc8cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQc8sf7EeuIwKU8xdbBsg" elementMultiplicity="-1" name="Multiple Book" sections="_SVQc5Mf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdDMf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc88f7EeuIwKU8xdbBsg" name="isMultipleBook">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQc9Mf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::Book"/>
+ </constraints>
+ <annotations xmi:id="_SVQc9cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQc9sf7EeuIwKU8xdbBsg" name="Single BookStore" sections="_SVQc5sf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdCMf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc98f7EeuIwKU8xdbBsg" name="isSingleBookStore">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQc-Mf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::BookStore"/>
+ </constraints>
+ <annotations xmi:id="_SVQc-cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQc-sf7EeuIwKU8xdbBsg" elementMultiplicity="-1" name="Multiple BookStore" sections="_SVQc6Mf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdCMf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc-8f7EeuIwKU8xdbBsg" name="isMultipleBookStore">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQc_Mf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::BookStore"/>
+ </constraints>
+ <annotations xmi:id="_SVQc_cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQc_sf7EeuIwKU8xdbBsg" name="Single Vendor" sections="_SVQc6sf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdDsf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc_8f7EeuIwKU8xdbBsg" name="isSingleVendor">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQdAMf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::Vendor"/>
+ </constraints>
+ <annotations xmi:id="_SVQdAcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQdAsf7EeuIwKU8xdbBsg" elementMultiplicity="-1" name="Multiple Vendor" sections="_SVQc7Mf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdDsf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQdA8f7EeuIwKU8xdbBsg" name="isMultipleVendor">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQdBMf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::Vendor"/>
+ </constraints>
+ <annotations xmi:id="_SVQdBcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <dataContexts xmi:id="_SVQdBsf7EeuIwKU8xdbBsg" name="BookStore" label="Book Store">
+ <annotations xmi:id="_SVQdB8f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_gnO0wFG6EeuXzM4mqVly4g"/>
+ <details xmi:id="_H8Gt8NmlEeuJXNXZyutAwA" key="layoutGenerator" value="bundleclass://org.eclipse.papyrus.uml.properties.generation/org.eclipse.papyrus.customization.properties.generation.layout.StandardLayoutGenerator"/>
+ </annotations>
+ <elements xmi:id="_SVQdCMf7EeuIwKU8xdbBsg" name="BookStore">
+ <annotations xmi:id="_SVQdCcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <supertypes href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_690xiaDJEeSZxfCXzZz3-w"/>
+ <properties xmi:id="_SVQdCsf7EeuIwKU8xdbBsg" name="bookDispositions" type="Enumeration" multiplicity="-1">
+ <annotations xmi:id="_SVQdC8f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_egjHIMVgEeuKDMwJXd21Mg"/>
+ </annotations>
+ </properties>
+ </elements>
+ <elements xmi:id="_SVQdDMf7EeuIwKU8xdbBsg" name="Book">
+ <annotations xmi:id="_SVQdDcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <supertypes href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_690yXqDJEeSZxfCXzZz3-w"/>
+ </elements>
+ <elements xmi:id="_SVQdDsf7EeuIwKU8xdbBsg" name="Vendor">
+ <annotations xmi:id="_SVQdD8f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <supertypes href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_690yXqDJEeSZxfCXzZz3-w"/>
+ <properties xmi:id="_SVQdEMf7EeuIwKU8xdbBsg" name="licenseNumber" type="Integer">
+ <annotations xmi:id="_SVQdEcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_qf-GgMVgEeuKDMwJXd21Mg"/>
+ </annotations>
+ </properties>
+ </elements>
+ <modelElementFactory href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@modelElementFactories.2"/>
+ </dataContexts>
+</contexts:Context>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-unresolvedHasStereotype.ctx b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-unresolvedHasStereotype.ctx
new file mode 100644
index 00000000000..ab22c594010
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-unresolvedHasStereotype.ctx
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="ASCII"?>
+<contexts:Context xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:constraints="http://www.eclipse.org/papyrus/constraints/0.9" xmlns:contexts="http://www.eclipse.org/papyrus/properties/contexts/0.9" xmi:id="_SVQc4Mf7EeuIwKU8xdbBsg" name="BookStore" label="Book Store">
+ <dependencies href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_69QJkKDJEeSZxfCXzZz3-w"/>
+ <tabs xmi:id="_SVQc4cf7EeuIwKU8xdbBsg" label="BookStore" id="bookstore" priority="100">
+ <sections xmi:id="_SVQc4sf7EeuIwKU8xdbBsg" name="Single Book" sectionFile="ui/SingleBook.xwt">
+ <annotations xmi:id="_SVQc48f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/SingleBook.xwt#/"/>
+ </sections>
+ <sections xmi:id="_SVQc5Mf7EeuIwKU8xdbBsg" name="Multiple Book" sectionFile="ui/MultipleBook.xwt">
+ <annotations xmi:id="_SVQc5cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/MultipleBook.xwt#/"/>
+ </sections>
+ <sections xmi:id="_SVQc5sf7EeuIwKU8xdbBsg" name="Single BookStore" sectionFile="ui/SingleBookStore.xwt">
+ <annotations xmi:id="_SVQc58f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/SingleBookStore.xwt#/"/>
+ </sections>
+ <sections xmi:id="_SVQc6Mf7EeuIwKU8xdbBsg" name="Multiple BookStore" sectionFile="ui/MultipleBookStore.xwt">
+ <annotations xmi:id="_SVQc6cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/MultipleBookStore.xwt#/"/>
+ </sections>
+ <sections xmi:id="_SVQc6sf7EeuIwKU8xdbBsg" name="Single Vendor" sectionFile="ui/SingleVendor.xwt">
+ <annotations xmi:id="_SVQc68f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/SingleVendor.xwt#/"/>
+ </sections>
+ <sections xmi:id="_SVQc7Mf7EeuIwKU8xdbBsg" name="Multiple Vendor" sectionFile="ui/MultipleVendor.xwt">
+ <annotations xmi:id="_SVQc7cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/MultipleVendor.xwt#/"/>
+ </sections>
+ </tabs>
+ <views xmi:id="_SVQc7sf7EeuIwKU8xdbBsg" name="Single Book" sections="_SVQc4sf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdDMf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc78f7EeuIwKU8xdbBsg" name="isSingleBook">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQc8Mf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::Book"/>
+ </constraints>
+ <annotations xmi:id="_SVQc8cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQc8sf7EeuIwKU8xdbBsg" elementMultiplicity="-1" name="Multiple Book" sections="_SVQc5Mf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdDMf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc88f7EeuIwKU8xdbBsg" name="isMultipleBook">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQc9Mf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::Book"/>
+ </constraints>
+ <annotations xmi:id="_SVQc9cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQc9sf7EeuIwKU8xdbBsg" name="Single BookStore" sections="_SVQc5sf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdCMf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc98f7EeuIwKU8xdbBsg" name="isSingleBookStore">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQc-Mf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::Store"/>
+ </constraints>
+ <annotations xmi:id="_SVQc-cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQc-sf7EeuIwKU8xdbBsg" elementMultiplicity="-1" name="Multiple BookStore" sections="_SVQc6Mf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdCMf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc-8f7EeuIwKU8xdbBsg" name="isMultipleBookStore">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQc_Mf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::BookStore"/>
+ </constraints>
+ <annotations xmi:id="_SVQc_cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQc_sf7EeuIwKU8xdbBsg" name="Single Vendor" sections="_SVQc6sf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdDsf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc_8f7EeuIwKU8xdbBsg" name="isSingleVendor">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQdAMf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::Vendor"/>
+ </constraints>
+ <annotations xmi:id="_SVQdAcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQdAsf7EeuIwKU8xdbBsg" elementMultiplicity="-1" name="Multiple Vendor" sections="_SVQc7Mf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdDsf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQdA8f7EeuIwKU8xdbBsg" name="isMultipleVendor">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQdBMf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::Vendor"/>
+ </constraints>
+ <annotations xmi:id="_SVQdBcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <dataContexts xmi:id="_SVQdBsf7EeuIwKU8xdbBsg" name="BookStore" label="Book Store">
+ <annotations xmi:id="_SVQdB8f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_gnO0wFG6EeuXzM4mqVly4g"/>
+ <details xmi:id="_H8Gt8NmlEeuJXNXZyutAwA" key="layoutGenerator" value="bundleclass://org.eclipse.papyrus.uml.properties.generation/org.eclipse.papyrus.customization.properties.generation.layout.StandardLayoutGenerator"/>
+ </annotations>
+ <elements xmi:id="_SVQdCMf7EeuIwKU8xdbBsg" name="BookStore">
+ <annotations xmi:id="_SVQdCcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <properties xmi:id="_SVQdCsf7EeuIwKU8xdbBsg" name="bookDispositions" type="Enumeration" multiplicity="-1">
+ <annotations xmi:id="_SVQdC8f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_egjHIMVgEeuKDMwJXd21Mg"/>
+ </annotations>
+ </properties>
+ <supertypes href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_690xiaDJEeSZxfCXzZz3-w"/>
+ </elements>
+ <elements xmi:id="_SVQdDMf7EeuIwKU8xdbBsg" name="Book">
+ <annotations xmi:id="_SVQdDcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <supertypes href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_690yXqDJEeSZxfCXzZz3-w"/>
+ </elements>
+ <elements xmi:id="_SVQdDsf7EeuIwKU8xdbBsg" name="Vendor">
+ <annotations xmi:id="_SVQdD8f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <properties xmi:id="_SVQdEMf7EeuIwKU8xdbBsg" name="licenseNumber">
+ <annotations xmi:id="_SVQdEcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_qf-GgMVgEeuKDMwJXd21Mg"/>
+ </annotations>
+ </properties>
+ <supertypes href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_690yXqDJEeSZxfCXzZz3-w"/>
+ </elements>
+ <modelElementFactory href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@modelElementFactories.2"/>
+ </dataContexts>
+</contexts:Context>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-unresolvedInstanceOf.ctx b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-unresolvedInstanceOf.ctx
new file mode 100644
index 00000000000..055cefb73d5
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-unresolvedInstanceOf.ctx
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="ASCII"?>
+<contexts:Context xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:constraints="http://www.eclipse.org/papyrus/constraints/0.9" xmlns:contexts="http://www.eclipse.org/papyrus/properties/contexts/0.9" xmi:id="_SVQc4Mf7EeuIwKU8xdbBsg" name="BookStore" label="Book Store">
+ <dependencies href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_69QJkKDJEeSZxfCXzZz3-w"/>
+ <tabs xmi:id="_SVQc4cf7EeuIwKU8xdbBsg" label="BookStore" id="bookstore" priority="100">
+ <sections xmi:id="_SVQc4sf7EeuIwKU8xdbBsg" name="Single Book" sectionFile="ui/SingleBook.xwt">
+ <annotations xmi:id="_SVQc48f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/SingleBook.xwt#/"/>
+ </sections>
+ <sections xmi:id="_SVQc5Mf7EeuIwKU8xdbBsg" name="Multiple Book" sectionFile="ui/MultipleBook.xwt">
+ <annotations xmi:id="_SVQc5cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/MultipleBook.xwt#/"/>
+ </sections>
+ <sections xmi:id="_SVQc5sf7EeuIwKU8xdbBsg" name="Single BookStore" sectionFile="ui/SingleBookStore.xwt">
+ <annotations xmi:id="_SVQc58f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/SingleBookStore.xwt#/"/>
+ </sections>
+ <sections xmi:id="_SVQc6Mf7EeuIwKU8xdbBsg" name="Multiple BookStore" sectionFile="ui/MultipleBookStore.xwt">
+ <annotations xmi:id="_SVQc6cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/MultipleBookStore.xwt#/"/>
+ </sections>
+ <sections xmi:id="_SVQc6sf7EeuIwKU8xdbBsg" name="Single Vendor" sectionFile="ui/SingleVendor.xwt">
+ <annotations xmi:id="_SVQc68f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/SingleVendor.xwt#/"/>
+ </sections>
+ <sections xmi:id="_SVQc7Mf7EeuIwKU8xdbBsg" name="Multiple Vendor" sectionFile="ui/MultipleVendor.xwt">
+ <annotations xmi:id="_SVQc7cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/MultipleVendor.xwt#/"/>
+ </sections>
+ </tabs>
+ <views xmi:id="_SVQc7sf7EeuIwKU8xdbBsg" name="Single Book" sections="_SVQc4sf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdDMf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc78f7EeuIwKU8xdbBsg" name="isSingleBook">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQc8Mf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::Book"/>
+ </constraints>
+ <annotations xmi:id="_SVQc8cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQc8sf7EeuIwKU8xdbBsg" elementMultiplicity="-1" name="Multiple Book" sections="_SVQc5Mf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdDMf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc88f7EeuIwKU8xdbBsg" name="isMultipleBook">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQc9Mf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::Book"/>
+ </constraints>
+ <annotations xmi:id="_SVQc9cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQc9sf7EeuIwKU8xdbBsg" name="Single BookStore" sections="_SVQc5sf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdCMf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc98f7EeuIwKU8xdbBsg" name="isSingleBookStore">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQc-Mf7EeuIwKU8xdbBsg" name="umlClassName" value="BogusMetaclass"/>
+ </constraints>
+ <annotations xmi:id="_SVQc-cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQc-sf7EeuIwKU8xdbBsg" elementMultiplicity="-1" name="Multiple BookStore" sections="_SVQc6Mf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdCMf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc-8f7EeuIwKU8xdbBsg" name="isMultipleBookStore">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQc_Mf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::BookStore"/>
+ </constraints>
+ <annotations xmi:id="_SVQc_cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQc_sf7EeuIwKU8xdbBsg" name="Single Vendor" sections="_SVQc6sf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdDsf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc_8f7EeuIwKU8xdbBsg" name="isSingleVendor">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQdAMf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::Vendor"/>
+ </constraints>
+ <annotations xmi:id="_SVQdAcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQdAsf7EeuIwKU8xdbBsg" elementMultiplicity="-1" name="Multiple Vendor" sections="_SVQc7Mf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdDsf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQdA8f7EeuIwKU8xdbBsg" name="isMultipleVendor">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQdBMf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::Vendor"/>
+ </constraints>
+ <annotations xmi:id="_SVQdBcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <dataContexts xmi:id="_SVQdBsf7EeuIwKU8xdbBsg" name="BookStore" label="Book Store">
+ <annotations xmi:id="_SVQdB8f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_gnO0wFG6EeuXzM4mqVly4g"/>
+ <details xmi:id="_H8Gt8NmlEeuJXNXZyutAwA" key="layoutGenerator" value="bundleclass://org.eclipse.papyrus.uml.properties.generation/org.eclipse.papyrus.customization.properties.generation.layout.StandardLayoutGenerator"/>
+ </annotations>
+ <elements xmi:id="_SVQdCMf7EeuIwKU8xdbBsg" name="BookStore">
+ <annotations xmi:id="_SVQdCcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <properties xmi:id="_SVQdCsf7EeuIwKU8xdbBsg" name="bookDispositions" type="Enumeration" multiplicity="-1">
+ <annotations xmi:id="_SVQdC8f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_egjHIMVgEeuKDMwJXd21Mg"/>
+ </annotations>
+ </properties>
+ <supertypes href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_690xiaDJEeSZxfCXzZz3-w"/>
+ </elements>
+ <elements xmi:id="_SVQdDMf7EeuIwKU8xdbBsg" name="Book">
+ <annotations xmi:id="_SVQdDcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <supertypes href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_690yXqDJEeSZxfCXzZz3-w"/>
+ </elements>
+ <elements xmi:id="_SVQdDsf7EeuIwKU8xdbBsg" name="Vendor">
+ <annotations xmi:id="_SVQdD8f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <properties xmi:id="_SVQdEMf7EeuIwKU8xdbBsg" name="licenseNumber">
+ <annotations xmi:id="_SVQdEcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_qf-GgMVgEeuKDMwJXd21Mg"/>
+ </annotations>
+ </properties>
+ <supertypes href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_690yXqDJEeSZxfCXzZz3-w"/>
+ </elements>
+ <modelElementFactory href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@modelElementFactories.2"/>
+ </dataContexts>
+</contexts:Context>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-withComplexDataType.ctx b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-withComplexDataType.ctx
new file mode 100644
index 00000000000..aaafb80d999
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-withComplexDataType.ctx
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="ASCII"?>
+<contexts:Context xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:constraints="http://www.eclipse.org/papyrus/constraints/0.9" xmlns:contexts="http://www.eclipse.org/papyrus/properties/contexts/0.9" xmi:id="_SVQc4Mf7EeuIwKU8xdbBsg" name="BookStore" label="Book Store">
+ <dependencies href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_69QJkKDJEeSZxfCXzZz3-w"/>
+ <tabs xmi:id="_SVQc4cf7EeuIwKU8xdbBsg" label="BookStore" id="bookstore" priority="100">
+ <allSections xsi:type="contexts:Section" xmi:id="_SVQc4sf7EeuIwKU8xdbBsg" name="Single Book" sectionFile="ui/SingleBook.xwt">
+ <annotations xmi:id="_SVQc48f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/SingleBook.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_SVQc5Mf7EeuIwKU8xdbBsg" name="Multiple Book" sectionFile="ui/MultipleBook.xwt">
+ <annotations xmi:id="_SVQc5cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/MultipleBook.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_SVQc5sf7EeuIwKU8xdbBsg" name="Single BookStore" sectionFile="ui/SingleBookStore.xwt">
+ <annotations xmi:id="_SVQc58f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/SingleBookStore.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_SVQc6Mf7EeuIwKU8xdbBsg" name="Multiple BookStore" sectionFile="ui/MultipleBookStore.xwt">
+ <annotations xmi:id="_SVQc6cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/MultipleBookStore.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_SVQc6sf7EeuIwKU8xdbBsg" name="Single Vendor" sectionFile="ui/SingleVendor.xwt">
+ <annotations xmi:id="_SVQc68f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/SingleVendor.xwt#/"/>
+ </allSections>
+ <allSections xsi:type="contexts:Section" xmi:id="_SVQc7Mf7EeuIwKU8xdbBsg" name="Multiple Vendor" sectionFile="ui/MultipleVendor.xwt">
+ <annotations xmi:id="_SVQc7cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/MultipleVendor.xwt#/"/>
+ </allSections>
+ </tabs>
+ <views xmi:id="_SVQc7sf7EeuIwKU8xdbBsg" name="Single Book" sections="_SVQc4sf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdDMf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc78f7EeuIwKU8xdbBsg" name="isSingleBook">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQc8Mf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::Book"/>
+ </constraints>
+ <annotations xmi:id="_SVQc8cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQc8sf7EeuIwKU8xdbBsg" elementMultiplicity="-1" name="Multiple Book" sections="_SVQc5Mf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdDMf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc88f7EeuIwKU8xdbBsg" name="isMultipleBook">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQc9Mf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::Book"/>
+ </constraints>
+ <annotations xmi:id="_SVQc9cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQc9sf7EeuIwKU8xdbBsg" name="Single BookStore" sections="_SVQc5sf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdCMf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc98f7EeuIwKU8xdbBsg" name="isSingleBookStore">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQc-Mf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::BookStore"/>
+ </constraints>
+ <annotations xmi:id="_SVQc-cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQc-sf7EeuIwKU8xdbBsg" elementMultiplicity="-1" name="Multiple BookStore" sections="_SVQc6Mf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdCMf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc-8f7EeuIwKU8xdbBsg" name="isMultipleBookStore">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQc_Mf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::BookStore"/>
+ </constraints>
+ <annotations xmi:id="_SVQc_cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQc_sf7EeuIwKU8xdbBsg" name="Single Vendor" sections="_SVQc6sf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdDsf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc_8f7EeuIwKU8xdbBsg" name="isSingleVendor">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQdAMf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::Vendor"/>
+ </constraints>
+ <annotations xmi:id="_SVQdAcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQdAsf7EeuIwKU8xdbBsg" elementMultiplicity="-1" name="Multiple Vendor" sections="_SVQc7Mf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdDsf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQdA8f7EeuIwKU8xdbBsg" name="isMultipleVendor">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQdBMf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::Vendor"/>
+ </constraints>
+ <annotations xmi:id="_SVQdBcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <dataContexts xmi:id="_SVQdBsf7EeuIwKU8xdbBsg" name="BookStore" label="Book Store">
+ <annotations xmi:id="_SVQdB8f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_gnO0wFG6EeuXzM4mqVly4g"/>
+ <details xmi:id="_H8Gt8NmlEeuJXNXZyutAwA" key="layoutGenerator" value="bundleclass://org.eclipse.papyrus.uml.properties.generation/org.eclipse.papyrus.customization.properties.generation.layout.StandardLayoutGenerator"/>
+ </annotations>
+ <elements xmi:id="_SVQdCMf7EeuIwKU8xdbBsg" name="BookStore">
+ <annotations xmi:id="_SVQdCcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <supertypes href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_690xiaDJEeSZxfCXzZz3-w"/>
+ <properties xmi:id="_SVQdCsf7EeuIwKU8xdbBsg" name="bookDispositions" type="Enumeration" multiplicity="-1">
+ <annotations xmi:id="_SVQdC8f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_egjHIMVgEeuKDMwJXd21Mg"/>
+ </annotations>
+ </properties>
+ </elements>
+ <elements xmi:id="_SVQdDMf7EeuIwKU8xdbBsg" name="Book">
+ <annotations xmi:id="_SVQdDcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <supertypes href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_690yXqDJEeSZxfCXzZz3-w"/>
+ </elements>
+ <elements xmi:id="_SVQdDsf7EeuIwKU8xdbBsg" name="Vendor">
+ <annotations xmi:id="_SVQdD8f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <supertypes href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_690yXqDJEeSZxfCXzZz3-w"/>
+ <properties xmi:id="_SVQdEMf7EeuIwKU8xdbBsg" name="licenseNumber">
+ <annotations xmi:id="_SVQdEcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_qf-GgMVgEeuKDMwJXd21Mg"/>
+ </annotations>
+ </properties>
+ </elements>
+ <elements xmi:id="_oyfsYNgJEeunxZmJJrSNRQ" name="Address">
+ <annotations xmi:id="_5xz68NgOEeunxZmJJrSNRQ" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_i87SENgHEeunxZmJJrSNRQ"/>
+ </annotations>
+ <properties xmi:id="_v6PLINgJEeunxZmJJrSNRQ" name="number" label="Number"/>
+ <properties xmi:id="_1S__kNgJEeunxZmJJrSNRQ" name="street" label="Street" description=""/>
+ <properties xmi:id="_1dKBINgJEeunxZmJJrSNRQ" name="city" label="City"/>
+ <properties xmi:id="_1ls5INgJEeunxZmJJrSNRQ" name="province" label="Province"/>
+ <properties xmi:id="_1tj0oNgJEeunxZmJJrSNRQ" name="state" label="State"/>
+ <properties xmi:id="_11yjkNgJEeunxZmJJrSNRQ" name="canton" label="Canton"/>
+ <properties xmi:id="_2A2kENgJEeunxZmJJrSNRQ" name="country" label="Country"/>
+ <properties xmi:id="_BiNucNgKEeunxZmJJrSNRQ" name="postcode" label="Post Code"/>
+ </elements>
+ <modelElementFactory href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@modelElementFactories.2"/>
+ </dataContexts>
+</contexts:Context>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-withComplexDataType.profile.uml b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-withComplexDataType.profile.uml
new file mode 100644
index 00000000000..3198b8a1214
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore-withComplexDataType.profile.uml
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:Ecore="http://www.eclipse.org/uml2/schemas/Ecore/5" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xsi:schemaLocation="http://www.eclipse.org/uml2/schemas/Ecore/5 pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA">
+ <uml:Profile xmi:id="_gnO0wFG6EeuXzM4mqVly4g" name="BookStore" URI="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore" metaclassReference="_rQ3s8FG6EeuXzM4mqVly4g _rQ5iIFG6EeuXzM4mqVly4g">
+ <eAnnotations xmi:id="_e24cAFG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <eAnnotations xmi:id="_V-_VwMVgEeuKDMwJXd21Mg" source="PapyrusVersion">
+ <details xmi:id="_V-_VwcVgEeuKDMwJXd21Mg" key="Version" value="0.0.0"/>
+ <details xmi:id="_V-_VwsVgEeuKDMwJXd21Mg" key="Comment" value="&lt;undefined>"/>
+ <details xmi:id="_V-_Vw8VgEeuKDMwJXd21Mg" key="Copyright" value=""/>
+ <details xmi:id="_V-_VxMVgEeuKDMwJXd21Mg" key="Date" value=""/>
+ <details xmi:id="_V-_VxcVgEeuKDMwJXd21Mg" key="Author" value="&lt;undefined>"/>
+ </eAnnotations>
+ <contents xmi:type="ecore:EPackage" xmi:id="_e24cAVG7EeuXzM4mqVly4g" name="bookstore" nsURI="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore" nsPrefix="book">
+ <eAnnotations xmi:id="_e24cAlG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <details xmi:id="_e24cA1G7EeuXzM4mqVly4g" key="originalName" value="BookStore"/>
+ </eAnnotations>
+ <eAnnotations xmi:id="_e26RMFG7EeuXzM4mqVly4g" source="PapyrusVersion">
+ <details xmi:id="_e26RMVG7EeuXzM4mqVly4g" key="Version" value="0.0.1"/>
+ <details xmi:id="_e26RMlG7EeuXzM4mqVly4g" key="Comment" value=""/>
+ <details xmi:id="_e26RM1G7EeuXzM4mqVly4g" key="Copyright" value="Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.&#xA;&#xA;All rights reserved. This program and the accompanying materials&#xA;are made available under the terms of the Eclipse Public License 2.0&#xA;which accompanies this distribution, and is available at&#xA;http://www.eclipse.org/legal/epl-2.0/&#xA;&#xA;SPDX-License-Identifier: EPL-2.0&#xA;&#xA;Contributors:&#xA; Christian W. Damus - Initial API and implementation"/>
+ <details xmi:id="_e26RNFG7EeuXzM4mqVly4g" key="Date" value="2021-01-08"/>
+ <details xmi:id="_e26RNVG7EeuXzM4mqVly4g" key="Author" value="Christian W. Damus"/>
+ </eAnnotations>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_e24cBFG7EeuXzM4mqVly4g" name="BookStore">
+ <eAnnotations xmi:id="_e24cBVG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_tQKrMFG6EeuXzM4mqVly4g"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_e24cBlG7EeuXzM4mqVly4g" name="base_Package" ordered="false">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Package"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_T36poMViEeuKDMwJXd21Mg" name="bookDispositions" lowerBound="1" upperBound="-1" eType="_FZtToMViEeuKDMwJXd21Mg"/>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_e24cCFG7EeuXzM4mqVly4g" name="Vendor">
+ <eAnnotations xmi:id="_e24cCVG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_xMldcFG6EeuXzM4mqVly4g"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_e24cClG7EeuXzM4mqVly4g" name="base_Class" ordered="false">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Class"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_aGK7oMViEeuKDMwJXd21Mg" name="licenseNumber" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_e24cDFG7EeuXzM4mqVly4g" name="Book">
+ <eAnnotations xmi:id="_e24cDVG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_8r71oFG6EeuXzM4mqVly4g"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_e24cDlG7EeuXzM4mqVly4g" name="base_Class" ordered="false">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Class"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EEnum" xmi:id="_FZtToMViEeuKDMwJXd21Mg" name="DispositionKind">
+ <eLiterals xmi:id="_Hu0J0MViEeuKDMwJXd21Mg" name="new"/>
+ <eLiterals xmi:id="_K4FA0MViEeuKDMwJXd21Mg" name="used" value="1"/>
+ <eLiterals xmi:id="_M41XoMViEeuKDMwJXd21Mg" name="lending" value="2"/>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_2cVboNgIEeunxZmJJrSNRQ" name="Address">
+ <eAnnotations xmi:id="_GPVfoNjgEeufXtSjiAFO8w" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_i87SENgHEeunxZmJJrSNRQ"/>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_3-ZrUNgIEeunxZmJJrSNRQ" name="number" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_9M9a4NgIEeunxZmJJrSNRQ" name="street" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_8IY_gNgIEeunxZmJJrSNRQ" name="city" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_AQzmYNgJEeunxZmJJrSNRQ" name="province">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_CU16sNgJEeunxZmJJrSNRQ" name="state">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_CeYRMNgJEeunxZmJJrSNRQ" name="canton">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_GncYUNgJEeunxZmJJrSNRQ" name="country" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_Isup0NgJEeunxZmJJrSNRQ" name="postcode">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_I0W70NgJEeunxZmJJrSNRQ" name="zipcode">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ </contents>
+ </eAnnotations>
+ <elementImport xmi:id="_rQ3s8FG6EeuXzM4mqVly4g" alias="Package">
+ <importedElement xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Package"/>
+ </elementImport>
+ <elementImport xmi:id="_rQ5iIFG6EeuXzM4mqVly4g" alias="Class">
+ <importedElement xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ </elementImport>
+ <packageImport xmi:id="_gurgkFG6EeuXzM4mqVly4g">
+ <importedPackage xmi:type="uml:Model" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#_0"/>
+ </packageImport>
+ <packageImport xmi:id="_gut80FG6EeuXzM4mqVly4g">
+ <importedPackage xmi:type="uml:Model" href="pathmap://UML_METAMODELS/UML.metamodel.uml#_0"/>
+ </packageImport>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_tQKrMFG6EeuXzM4mqVly4g" name="BookStore">
+ <ownedAttribute xmi:id="_uzEBUFG6EeuXzM4mqVly4g" name="base_Package" association="_uzCMIFG6EeuXzM4mqVly4g">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Package"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_uzEBUVG6EeuXzM4mqVly4g"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="_egjHIMVgEeuKDMwJXd21Mg" name="bookDispositions" type="_V-9gkMVgEeuKDMwJXd21Mg">
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_hAwaEMVgEeuKDMwJXd21Mg" value="*"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="_uzCMIFG6EeuXzM4mqVly4g" name="E_BookStore_Package6" memberEnd="_uzDaQFG6EeuXzM4mqVly4g _uzEBUFG6EeuXzM4mqVly4g">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_uzDaQFG6EeuXzM4mqVly4g" name="extension_BookStore" type="_tQKrMFG6EeuXzM4mqVly4g" aggregation="composite" association="_uzCMIFG6EeuXzM4mqVly4g"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_xMldcFG6EeuXzM4mqVly4g" name="Vendor">
+ <ownedAttribute xmi:id="__-fLglG6EeuXzM4mqVly4g" name="base_Class" association="__-fLgFG6EeuXzM4mqVly4g">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="__-fykFG6EeuXzM4mqVly4g"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="_qf-GgMVgEeuKDMwJXd21Mg" name="licenseNumber">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_8r71oFG6EeuXzM4mqVly4g" name="Book">
+ <ownedAttribute xmi:id="__Aw_AVG6EeuXzM4mqVly4g" name="base_Class" association="__AwX8FG6EeuXzM4mqVly4g">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="__Aw_AlG6EeuXzM4mqVly4g"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="__AwX8FG6EeuXzM4mqVly4g" name="E_Book_Class9" memberEnd="__Aw_AFG6EeuXzM4mqVly4g __Aw_AVG6EeuXzM4mqVly4g">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="__Aw_AFG6EeuXzM4mqVly4g" name="extension_Book" type="_8r71oFG6EeuXzM4mqVly4g" aggregation="composite" association="__AwX8FG6EeuXzM4mqVly4g"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="__-fLgFG6EeuXzM4mqVly4g" name="E_Vendor_Class10" memberEnd="__-fLgVG6EeuXzM4mqVly4g __-fLglG6EeuXzM4mqVly4g">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="__-fLgVG6EeuXzM4mqVly4g" name="extension_Vendor" type="_xMldcFG6EeuXzM4mqVly4g" aggregation="composite" association="__-fLgFG6EeuXzM4mqVly4g"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Enumeration" xmi:id="_V-9gkMVgEeuKDMwJXd21Mg" name="DispositionKind">
+ <ownedLiteral xmi:id="_b19wMMVgEeuKDMwJXd21Mg" name="new"/>
+ <ownedLiteral xmi:id="_c2HloMVgEeuKDMwJXd21Mg" name="used"/>
+ <ownedLiteral xmi:id="_di2v0MVgEeuKDMwJXd21Mg" name="lending"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:DataType" xmi:id="_i87SENgHEeunxZmJJrSNRQ" name="Address">
+ <ownedRule xmi:id="_FUQuoNgIEeunxZmJJrSNRQ" name="jurisdiction_alternation">
+ <specification xmi:type="uml:OpaqueExpression" xmi:id="_L_tS8NgIEeunxZmJJrSNRQ">
+ <language>OCL</language>
+ <language>English</language>
+ <body>Set{province, state, canton}->excluding(null)->size() &lt;= 1</body>
+ <body>At most one subnational jurisdiction may be set. City-states use the same name for city and country.</body>
+ </specification>
+ </ownedRule>
+ <ownedRule xmi:id="_jZkVUNgIEeunxZmJJrSNRQ" name="postal_alternation">
+ <specification xmi:type="uml:OpaqueExpression" xmi:id="_jZkVUdgIEeunxZmJJrSNRQ">
+ <language>OCL</language>
+ <language>English</language>
+ <body>Set{postcode, zipcode}->excluding(null)->size() = 1</body>
+ <body>Exactly one postal code must be set.</body>
+ </specification>
+ </ownedRule>
+ <ownedAttribute xmi:id="_nvzyQNgHEeunxZmJJrSNRQ" name="number">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="_sN0OoNgHEeunxZmJJrSNRQ" name="street">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="_vDFLkNgHEeunxZmJJrSNRQ" name="city">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="_x21FkNgHEeunxZmJJrSNRQ" name="province">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_z1PTANgHEeunxZmJJrSNRQ"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="_0Pj3gNgHEeunxZmJJrSNRQ" name="state">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_0Pj3gdgHEeunxZmJJrSNRQ"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="_3R3x8NgHEeunxZmJJrSNRQ" name="canton">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_3R3x8dgHEeunxZmJJrSNRQ"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="_4RuscNgHEeunxZmJJrSNRQ" name="country">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="_8DuXYNgHEeunxZmJJrSNRQ" name="postcode">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_8DuXYdgHEeunxZmJJrSNRQ"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="_8DuXYtgHEeunxZmJJrSNRQ" name="zipcode">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_8DuXY9gHEeunxZmJJrSNRQ"/>
+ </ownedAttribute>
+ </packagedElement>
+ <profileApplication xmi:id="_LFzeMFG7EeuXzM4mqVly4g">
+ <eAnnotations xmi:id="_LF0FQFG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <references xmi:type="ecore:EPackage" href="pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA"/>
+ </eAnnotations>
+ <appliedProfile href="pathmap://UML_PROFILES/Ecore.profile.uml#_0"/>
+ </profileApplication>
+ </uml:Profile>
+ <Ecore:EPackage xmi:id="_Lr8RIFG7EeuXzM4mqVly4g" base_Package="_gnO0wFG6EeuXzM4mqVly4g" packageName="bookstore" nsPrefix="book" basePackage="org.eclipse.papyrus.toolsmiths.validation.properties.example"/>
+</xmi:XMI>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore.ecore b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore.ecore
new file mode 100644
index 00000000000..db6d0c9d89b
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/BookStore.ecore
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="BookStore" nsURI="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"
+ nsPrefix="store">
+ <eClassifiers xsi:type="ecore:EClass" name="BookStore">
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="bookDispositions" lowerBound="1"
+ upperBound="-1" eType="#//DispositionKind"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EEnum" name="DispositionKind"/>
+ <eClassifiers xsi:type="ecore:EClass" name="Vendor">
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="licenseNumber" lowerBound="1"
+ eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="Book"/>
+</ecore:EPackage>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/plugin-ecore.xml b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/plugin-ecore.xml
new file mode 100644
index 00000000000..d0797286696
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/models/plugin-ecore.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+
+<!--
+ Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License 2.0
+ which accompanies this distribution, and is available at
+ https://www.eclipse.org/legal/epl-2.0/
+
+ SPDX-License-Identifier: EPL-2.0
+
+ Contributors:
+ Christian W. Damus - Initial API and implementation
+-->
+
+<plugin>
+
+ <extension
+ point="org.eclipse.emf.ecore.dynamic_package">
+ <resource
+ uri="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"
+ location="resources/BookStore.ecore#/">
+ </resource>
+ </extension>
+
+ <extension
+ point="org.eclipse.papyrus.infra.properties.contexts">
+ <context
+ contextModel="resources/BookStore.ctx">
+ </context>
+ </extension>
+ <extension
+ point="org.eclipse.papyrus.infra.properties.environments">
+ <environment
+ environmentModel="resources/BookStore.xmi">
+ </environment>
+ </extension>
+
+</plugin>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1/.classpath b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1/.classpath
new file mode 100644
index 00000000000..e801ebfb468
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1/.project b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1/.project
new file mode 100644
index 00000000000..154f157f231
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.papyrus.plugin.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.papyrus.plugin.nature</nature>
+ </natures>
+</projectDescription>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1/.settings/org.eclipse.jdt.core.prefs b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..037f04a07c2
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,319 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=11
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=260
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=false
+org.eclipse.jdt.core.formatter.join_wrapped_lines=false
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=260
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=5
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=false
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1/META-INF/MANIFEST.MF b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..3852fd4991b
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1/META-INF/MANIFEST.MF
@@ -0,0 +1,35 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-ClassPath: .
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.18.0,4.0.0)",
+ org.eclipse.papyrus.infra.architecture;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.papyrus.infra.properties;bundle-version="[4.0.0,5.0.0)",
+ org.eclipse.papyrus.infra.gmfdiag.commands;bundle-version="[4.0.0,5.0.0)",
+ org.eclipse.papyrus.infra.gmfdiag.common;bundle-version="[4.0.0,5.0.0)",
+ org.eclipse.papyrus.infra.core;bundle-version="[4.0.0,5.0.0)",
+ org.eclipse.emf.ecore;bundle-version="[2.23.0,3.0.0)",
+ org.eclipse.gmf.runtime.notation;bundle-version="[1.10.0,2.0.0)",
+ org.eclipse.gmf.runtime.common.core;bundle-version="[1.7.0,2.0.0)",
+ org.eclipse.papyrus.infra.viewpoints.policy;bundle-version="[4.0.0,5.0.0)",
+ org.eclipse.gmf.runtime.diagram.core;bundle-version="[1.7.0,2.0.0)",
+ org.eclipse.papyrus.infra.types;bundle-version="[5.0.0,6.0.0)",
+ org.eclipse.papyrus.infra.types.core;bundle-version="[5.0.0,6.0.0)",
+ org.eclipse.uml2.uml;bundle-version="[5.5.0,6.0.0)",
+ org.eclipse.uml2.uml.resources;bundle-version="[5.5.0,6.0.0)",
+ org.eclipse.papyrus.uml.service.types;bundle-version="[5.0.0,6.0.0)",
+ org.eclipse.papyrus.uml.diagram.common;bundle-version="[5.0.0,6.0.0)",
+ org.eclipse.papyrus.infra.gmfdiag.paletteconfiguration;bundle-version="[5.0.0,6.0.0)",
+ org.eclipse.papyrus.infra.properties.ui;bundle-version="[4.1.0,5.0.0)",
+ org.eclipse.papyrus.infra.emf;bundle-version="[4.1.0,5.0.0)",
+ org.eclipse.papyrus.infra.widgets;bundle-version="[4.1.0,5.0.0)",
+ org.eclipse.core.databinding;bundle-version="[1.10.100,2.0.0)",
+ org.eclipse.jface;bundle-version="[3.22.100,4.0.0)",
+ org.eclipse.papyrus.uml.properties;bundle-version="[4.1.0,5.0.0)"
+Bundle-RequiredExecutionEnvironment: JavaSE-11
+Automatic-Module-Name: org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1
+Bundle-ActivationPolicy: lazy
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1/build.properties b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1/build.properties
new file mode 100644
index 00000000000..252310279e1
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1/build.properties
@@ -0,0 +1,18 @@
+# Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+# Christian W. Damus - Initial API and implementation
+
+bin.includes = .,\
+ META-INF/,\
+ plugin.properties
+jars.compile.order = .
+source.. = src
+output.. = bin/
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1/plugin.properties b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1/plugin.properties
new file mode 100644
index 00000000000..9740998d806
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1/plugin.properties
@@ -0,0 +1,14 @@
+# Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+# Christian W. Damus - Initial API and implementation
+
+pluginName = A Dependency of Properties Plug-in Validation Example Bundle (Book Store) for Testing
+providerName = Eclipse Modeling Project
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1/src/org/eclipse/papyrus/toolsmiths/validation/properties/example/dependency1/modelelement/BookModelElement.java b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1/src/org/eclipse/papyrus/toolsmiths/validation/properties/example/dependency1/modelelement/BookModelElement.java
new file mode 100644
index 00000000000..07d9506c827
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1/src/org/eclipse/papyrus/toolsmiths/validation/properties/example/dependency1/modelelement/BookModelElement.java
@@ -0,0 +1,27 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1.modelelement;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.papyrus.infra.properties.ui.modelelement.EMFModelElement;
+
+public class BookModelElement extends EMFModelElement {
+
+ public BookModelElement(EObject source, EditingDomain domain) {
+ super(source, domain);
+ }
+
+}
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1/src/org/eclipse/papyrus/toolsmiths/validation/properties/example/dependency1/modelelement/BookModelElementFactory.java b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1/src/org/eclipse/papyrus/toolsmiths/validation/properties/example/dependency1/modelelement/BookModelElementFactory.java
new file mode 100644
index 00000000000..f832d41870f
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1/src/org/eclipse/papyrus/toolsmiths/validation/properties/example/dependency1/modelelement/BookModelElementFactory.java
@@ -0,0 +1,38 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1.modelelement;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.papyrus.infra.emf.utils.EMFHelper;
+import org.eclipse.papyrus.infra.properties.contexts.DataContextElement;
+import org.eclipse.papyrus.infra.properties.ui.modelelement.EMFModelElement;
+import org.eclipse.papyrus.infra.properties.ui.modelelement.EMFModelElementFactory;
+
+public class BookModelElementFactory extends EMFModelElementFactory {
+
+ @Override
+ protected EMFModelElement doCreateFromSource(Object sourceElement, DataContextElement context) {
+ EObject source = EMFHelper.getEObject(sourceElement);
+ if (source == null) {
+ System.err.println("Unable to resolve the selected element to an EObject"); //$NON-NLS-1$
+ return null;
+ }
+
+ EditingDomain domain = EMFHelper.resolveEditingDomain(source);
+ return new BookModelElement(source, domain);
+ }
+
+}
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/.classpath b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/.classpath
new file mode 100644
index 00000000000..e801ebfb468
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/.project b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/.project
new file mode 100644
index 00000000000..4f8aa85ad54
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.papyrus.toolsmiths.validation.properties.example</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.papyrus.plugin.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.papyrus.plugin.nature</nature>
+ </natures>
+</projectDescription>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/.settings/org.eclipse.jdt.core.prefs b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..037f04a07c2
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,319 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=11
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=260
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=false
+org.eclipse.jdt.core.formatter.join_wrapped_lines=false
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=260
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=5
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=false
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/META-INF/MANIFEST.MF b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..fcd5e11a4b3
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/META-INF/MANIFEST.MF
@@ -0,0 +1,35 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.papyrus.toolsmiths.validation.properties.example;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-ClassPath: .
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.18.0,4.0.0)",
+ org.eclipse.papyrus.infra.architecture;bundle-version="[3.0.0,4.0.0)",
+ org.eclipse.papyrus.infra.properties;bundle-version="[4.0.0,5.0.0)",
+ org.eclipse.papyrus.infra.gmfdiag.commands;bundle-version="[4.0.0,5.0.0)",
+ org.eclipse.papyrus.infra.gmfdiag.common;bundle-version="[4.0.0,5.0.0)",
+ org.eclipse.papyrus.infra.core;bundle-version="[4.0.0,5.0.0)",
+ org.eclipse.emf.ecore;bundle-version="[2.23.0,3.0.0)",
+ org.eclipse.gmf.runtime.notation;bundle-version="[1.10.0,2.0.0)",
+ org.eclipse.gmf.runtime.common.core;bundle-version="[1.7.0,2.0.0)",
+ org.eclipse.papyrus.infra.viewpoints.policy;bundle-version="[4.0.0,5.0.0)",
+ org.eclipse.gmf.runtime.diagram.core;bundle-version="[1.7.0,2.0.0)",
+ org.eclipse.papyrus.infra.types;bundle-version="[5.0.0,6.0.0)",
+ org.eclipse.papyrus.infra.types.core;bundle-version="[5.0.0,6.0.0)",
+ org.eclipse.uml2.uml;bundle-version="[5.5.0,6.0.0)",
+ org.eclipse.uml2.uml.resources;bundle-version="[5.5.0,6.0.0)",
+ org.eclipse.papyrus.uml.service.types;bundle-version="[5.0.0,6.0.0)",
+ org.eclipse.papyrus.uml.diagram.common;bundle-version="[5.0.0,6.0.0)",
+ org.eclipse.papyrus.infra.gmfdiag.paletteconfiguration;bundle-version="[5.0.0,6.0.0)",
+ org.eclipse.papyrus.infra.properties.ui;bundle-version="[4.1.0,5.0.0)",
+ org.eclipse.papyrus.infra.emf;bundle-version="[4.1.0,5.0.0)",
+ org.eclipse.papyrus.infra.widgets;bundle-version="[4.1.0,5.0.0)",
+ org.eclipse.core.databinding;bundle-version="[1.10.100,2.0.0)",
+ org.eclipse.jface;bundle-version="[3.22.100,4.0.0)",
+ org.eclipse.papyrus.uml.properties;bundle-version="[4.1.0,5.0.0)"
+Bundle-RequiredExecutionEnvironment: JavaSE-11
+Automatic-Module-Name: org.eclipse.papyrus.toolsmiths.validation.properties.example
+Bundle-ActivationPolicy: lazy
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/build.properties b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/build.properties
new file mode 100644
index 00000000000..9c45409f7db
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/build.properties
@@ -0,0 +1,21 @@
+# Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+# Christian W. Damus - Initial API and implementation
+
+bin.includes = .,\
+ META-INF/,\
+ plugin.xml,\
+ plugin.properties,\
+ icons/,\
+ resources/
+jars.compile.order = .
+source.. = src
+output.. = bin/
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/icons/full/obj16/bookstore.png b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/icons/full/obj16/bookstore.png
new file mode 100644
index 00000000000..f18851a509c
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/icons/full/obj16/bookstore.png
Binary files differ
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/icons/full/obj16/bookstore@2x.png b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/icons/full/obj16/bookstore@2x.png
new file mode 100644
index 00000000000..13bbf74a7ae
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/icons/full/obj16/bookstore@2x.png
Binary files differ
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/plugin.properties b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/plugin.properties
new file mode 100644
index 00000000000..f546c94dcde
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/plugin.properties
@@ -0,0 +1,14 @@
+# Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+#
+# SPDX-License-Identifier: EPL-2.0
+#
+# Contributors:
+# Christian W. Damus - Initial API and implementation
+
+pluginName = Properties Plug-in Validation Example Bundle (Book Store) for Testing
+providerName = Eclipse Modeling Project
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/plugin.xml b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/plugin.xml
new file mode 100644
index 00000000000..6f43952397e
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/plugin.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+
+<!--
+ Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License 2.0
+ which accompanies this distribution, and is available at
+ https://www.eclipse.org/legal/epl-2.0/
+
+ SPDX-License-Identifier: EPL-2.0
+
+ Contributors:
+ Christian W. Damus - Initial API and implementation
+-->
+
+<plugin>
+
+ <extension
+ point="org.eclipse.emf.ecore.dynamic_package">
+ <resource
+ uri="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"
+ location="resources/BookStore.profile.uml#_e24cAVG7EeuXzM4mqVly4g">
+ </resource>
+ </extension>
+ <extension
+ point="org.eclipse.uml2.uml.dynamic_package">
+ <profile
+ uri="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore"
+ location="resources/BookStore.profile.uml#_gnO0wFG6EeuXzM4mqVly4g">
+ </profile>
+ </extension>
+
+ <extension
+ point="org.eclipse.papyrus.infra.properties.contexts">
+ <context
+ contextModel="resources/BookStore.ctx">
+ </context>
+ </extension>
+ <extension
+ point="org.eclipse.papyrus.infra.properties.environments">
+ <environment
+ environmentModel="resources/BookStore.xmi">
+ </environment>
+ </extension>
+
+</plugin>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/BookStore.ctx b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/BookStore.ctx
new file mode 100644
index 00000000000..5b45f5e2d62
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/BookStore.ctx
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="ASCII"?>
+<contexts:Context xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:constraints="http://www.eclipse.org/papyrus/constraints/0.9" xmlns:contexts="http://www.eclipse.org/papyrus/properties/contexts/0.9" xmi:id="_SVQc4Mf7EeuIwKU8xdbBsg" name="BookStore" label="Book Store">
+ <dependencies href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_69QJkKDJEeSZxfCXzZz3-w"/>
+ <tabs xmi:id="_SVQc4cf7EeuIwKU8xdbBsg" label="BookStore" id="bookstore" priority="100">
+ <sections xmi:id="_SVQc4sf7EeuIwKU8xdbBsg" name="Single Book" sectionFile="ui/SingleBook.xwt">
+ <annotations xmi:id="_SVQc48f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/SingleBook.xwt#/"/>
+ </sections>
+ <sections xmi:id="_SVQc5Mf7EeuIwKU8xdbBsg" name="Multiple Book" sectionFile="ui/MultipleBook.xwt">
+ <annotations xmi:id="_SVQc5cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/MultipleBook.xwt#/"/>
+ </sections>
+ <sections xmi:id="_SVQc5sf7EeuIwKU8xdbBsg" name="Single BookStore" sectionFile="ui/SingleBookStore.xwt">
+ <annotations xmi:id="_SVQc58f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/SingleBookStore.xwt#/"/>
+ </sections>
+ <sections xmi:id="_SVQc6Mf7EeuIwKU8xdbBsg" name="Multiple BookStore" sectionFile="ui/MultipleBookStore.xwt">
+ <annotations xmi:id="_SVQc6cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/MultipleBookStore.xwt#/"/>
+ </sections>
+ <sections xmi:id="_SVQc6sf7EeuIwKU8xdbBsg" name="Single Vendor" sectionFile="ui/SingleVendor.xwt">
+ <annotations xmi:id="_SVQc68f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/SingleVendor.xwt#/"/>
+ </sections>
+ <sections xmi:id="_SVQc7Mf7EeuIwKU8xdbBsg" name="Multiple Vendor" sectionFile="ui/MultipleVendor.xwt">
+ <annotations xmi:id="_SVQc7cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <widget href="ui/MultipleVendor.xwt#/"/>
+ </sections>
+ </tabs>
+ <views xmi:id="_SVQc7sf7EeuIwKU8xdbBsg" name="Single Book" sections="_SVQc4sf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdDMf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc78f7EeuIwKU8xdbBsg" name="isSingleBook">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQc8Mf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::Book"/>
+ </constraints>
+ <annotations xmi:id="_SVQc8cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQc8sf7EeuIwKU8xdbBsg" elementMultiplicity="-1" name="Multiple Book" sections="_SVQc5Mf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdDMf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc88f7EeuIwKU8xdbBsg" name="isMultipleBook">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQc9Mf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::Book"/>
+ </constraints>
+ <annotations xmi:id="_SVQc9cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQc9sf7EeuIwKU8xdbBsg" name="Single BookStore" sections="_SVQc5sf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdCMf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc98f7EeuIwKU8xdbBsg" name="isSingleBookStore">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQc-Mf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::BookStore"/>
+ </constraints>
+ <annotations xmi:id="_SVQc-cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQc-sf7EeuIwKU8xdbBsg" elementMultiplicity="-1" name="Multiple BookStore" sections="_SVQc6Mf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdCMf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc-8f7EeuIwKU8xdbBsg" name="isMultipleBookStore">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQc_Mf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::BookStore"/>
+ </constraints>
+ <annotations xmi:id="_SVQc_cf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQc_sf7EeuIwKU8xdbBsg" name="Single Vendor" sections="_SVQc6sf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdDsf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQc_8f7EeuIwKU8xdbBsg" name="isSingleVendor">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQdAMf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::Vendor"/>
+ </constraints>
+ <annotations xmi:id="_SVQdAcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <views xmi:id="_SVQdAsf7EeuIwKU8xdbBsg" elementMultiplicity="-1" name="Multiple Vendor" sections="_SVQc7Mf7EeuIwKU8xdbBsg" automaticContext="true" datacontexts="_SVQdDsf7EeuIwKU8xdbBsg">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SVQdA8f7EeuIwKU8xdbBsg" name="isMultipleVendor">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@constraintTypes.1"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SVQdBMf7EeuIwKU8xdbBsg" name="stereotypeName" value="BookStore::Vendor"/>
+ </constraints>
+ <annotations xmi:id="_SVQdBcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ </views>
+ <dataContexts xmi:id="_SVQdBsf7EeuIwKU8xdbBsg" name="BookStore" label="Book Store">
+ <annotations xmi:id="_SVQdB8f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_gnO0wFG6EeuXzM4mqVly4g"/>
+ <details xmi:id="_H8Gt8NmlEeuJXNXZyutAwA" key="layoutGenerator" value="bundleclass://org.eclipse.papyrus.uml.properties.generation/org.eclipse.papyrus.customization.properties.generation.layout.StandardLayoutGenerator"/>
+ </annotations>
+ <elements xmi:id="_SVQdCMf7EeuIwKU8xdbBsg" name="BookStore">
+ <annotations xmi:id="_SVQdCcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <properties xmi:id="_SVQdCsf7EeuIwKU8xdbBsg" name="bookDispositions" type="Enumeration" multiplicity="-1">
+ <annotations xmi:id="_SVQdC8f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_egjHIMVgEeuKDMwJXd21Mg"/>
+ </annotations>
+ </properties>
+ <supertypes href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_690xiaDJEeSZxfCXzZz3-w"/>
+ </elements>
+ <elements xmi:id="_SVQdDMf7EeuIwKU8xdbBsg" name="Book">
+ <annotations xmi:id="_SVQdDcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <supertypes href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_690yXqDJEeSZxfCXzZz3-w"/>
+ </elements>
+ <elements xmi:id="_SVQdDsf7EeuIwKU8xdbBsg" name="Vendor">
+ <annotations xmi:id="_SVQdD8f7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ </annotations>
+ <properties xmi:id="_SVQdEMf7EeuIwKU8xdbBsg" name="licenseNumber">
+ <annotations xmi:id="_SVQdEcf7EeuIwKU8xdbBsg" source="http://www.eclipse.org/papyrus/properties/contexts">
+ <details key="model" value="BookStore.profile.uml#_qf-GgMVgEeuKDMwJXd21Mg"/>
+ </annotations>
+ </properties>
+ <supertypes href="ppe:/context/org.eclipse.papyrus.uml.properties/Model/UML/UML.ctx#_690yXqDJEeSZxfCXzZz3-w"/>
+ </elements>
+ <modelElementFactory href="ppe:/environment/org.eclipse.papyrus.uml.properties/Model/Environment.xmi#//@modelElementFactories.2"/>
+ </dataContexts>
+</contexts:Context>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/BookStore.profile.di b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/BookStore.profile.di
new file mode 100644
index 00000000000..247ed5e3570
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/BookStore.profile.di
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<architecture:ArchitectureDescription xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:architecture="http://www.eclipse.org/papyrus/infra/core/architecture" contextId="org.eclipse.papyrus.uml.architecture.Profile"/>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/BookStore.profile.notation b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/BookStore.profile.notation
new file mode 100644
index 00000000000..0ce5e28644c
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/BookStore.profile.notation
@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<notation:Diagram xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.3/notation" xmlns:style="http://www.eclipse.org/papyrus/infra/gmfdiag/style" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_gpCLkFG6EeuXzM4mqVly4g" type="PapyrusUMLProfileDiagram" name="Profile Diagram" measurementUnit="Pixel">
+ <children xmi:type="notation:Shape" xmi:id="_rQ_BsFG6EeuXzM4mqVly4g" type="Class_MetaclassShape">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_rRPgYFG6EeuXzM4mqVly4g" source="Stereotype_Annotation">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_rRPgYVG6EeuXzM4mqVly4g" key="StereotypeWithQualifiedNameList" value=""/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_rRPgYlG6EeuXzM4mqVly4g" key="StereotypeList" value="StandardProfile::Metaclass"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_rRPgY1G6EeuXzM4mqVly4g" key="Stereotype_Presentation_Kind" value="HorizontalStereo"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_rRPgZFG6EeuXzM4mqVly4g" key="PropStereoDisplay" value=""/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_rRPgZVG6EeuXzM4mqVly4g" key="StereotypePropertyLocation" value="Compartment"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_rRNEIFG6EeuXzM4mqVly4g" type="Class_MetaclassNameLabel"/>
+ <element xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Package"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rRNEIVG6EeuXzM4mqVly4g" x="200" y="120"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_rRPgZlG6EeuXzM4mqVly4g" type="Class_MetaclassShape">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_rRQHclG6EeuXzM4mqVly4g" source="Stereotype_Annotation">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_rRQHc1G6EeuXzM4mqVly4g" key="StereotypeWithQualifiedNameList" value=""/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_rRQHdFG6EeuXzM4mqVly4g" key="StereotypeList" value="StandardProfile::Metaclass"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_rRQHdVG6EeuXzM4mqVly4g" key="Stereotype_Presentation_Kind" value="HorizontalStereo"/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_rRQHdlG6EeuXzM4mqVly4g" key="PropStereoDisplay" value=""/>
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_rRQHd1G6EeuXzM4mqVly4g" key="StereotypePropertyLocation" value="Compartment"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_rRQHcFG6EeuXzM4mqVly4g" type="Class_MetaclassNameLabel"/>
+ <element xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rRQHcVG6EeuXzM4mqVly4g" x="600" y="120"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_tQO8oFG6EeuXzM4mqVly4g" type="Stereotype_Shape">
+ <children xmi:type="notation:DecorationNode" xmi:id="_tQPjsFG6EeuXzM4mqVly4g" type="Stereotype_NameLabel"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_tQRY4FG6EeuXzM4mqVly4g" type="Stereotype_AttributeCompartment">
+ <children xmi:type="notation:Shape" xmi:id="_egs4IMVgEeuKDMwJXd21Mg" type="Property_ClassAttributeLabel">
+ <element xmi:type="uml:Property" href="BookStore.profile.uml#_egjHIMVgEeuKDMwJXd21Mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_egs4IcVgEeuKDMwJXd21Mg"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_tQRY4VG6EeuXzM4mqVly4g"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_tQRY4lG6EeuXzM4mqVly4g"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_tQRY41G6EeuXzM4mqVly4g"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_tQRY5FG6EeuXzM4mqVly4g"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_tQRY5VG6EeuXzM4mqVly4g" type="Stereotype_OperationCompartment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_tQRY5lG6EeuXzM4mqVly4g"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_tQRY51G6EeuXzM4mqVly4g"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_tQRY6FG6EeuXzM4mqVly4g"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_tQRY6VG6EeuXzM4mqVly4g"/>
+ </children>
+ <element xmi:type="uml:Stereotype" href="BookStore.profile.uml#_tQKrMFG6EeuXzM4mqVly4g"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_tQO8oVG6EeuXzM4mqVly4g" x="160" y="320"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_xMmrkFG6EeuXzM4mqVly4g" type="Stereotype_Shape">
+ <children xmi:type="notation:DecorationNode" xmi:id="_xMmrklG6EeuXzM4mqVly4g" type="Stereotype_NameLabel"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_xMmrk1G6EeuXzM4mqVly4g" type="Stereotype_AttributeCompartment">
+ <children xmi:type="notation:Shape" xmi:id="_qgLh4MVgEeuKDMwJXd21Mg" type="Property_ClassAttributeLabel">
+ <element xmi:type="uml:Property" href="BookStore.profile.uml#_qf-GgMVgEeuKDMwJXd21Mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_qgLh4cVgEeuKDMwJXd21Mg"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_xMmrlFG6EeuXzM4mqVly4g"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_xMmrlVG6EeuXzM4mqVly4g"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_xMmrllG6EeuXzM4mqVly4g"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_xMmrl1G6EeuXzM4mqVly4g"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_xMmrmFG6EeuXzM4mqVly4g" type="Stereotype_OperationCompartment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_xMmrmVG6EeuXzM4mqVly4g"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_xMmrmlG6EeuXzM4mqVly4g"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_xMmrm1G6EeuXzM4mqVly4g"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_xMmrnFG6EeuXzM4mqVly4g"/>
+ </children>
+ <element xmi:type="uml:Stereotype" href="BookStore.profile.uml#_xMldcFG6EeuXzM4mqVly4g"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_xMmrkVG6EeuXzM4mqVly4g" x="460" y="320"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_8r9DwFG6EeuXzM4mqVly4g" type="Stereotype_Shape">
+ <children xmi:type="notation:DecorationNode" xmi:id="_8r9q0FG6EeuXzM4mqVly4g" type="Stereotype_NameLabel"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_8r9q0VG6EeuXzM4mqVly4g" type="Stereotype_AttributeCompartment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_8r9q0lG6EeuXzM4mqVly4g"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_8r9q01G6EeuXzM4mqVly4g"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_8r9q1FG6EeuXzM4mqVly4g"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_8r9q1VG6EeuXzM4mqVly4g"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_8r9q1lG6EeuXzM4mqVly4g" type="Stereotype_OperationCompartment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_8r9q11G6EeuXzM4mqVly4g"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_8r9q2FG6EeuXzM4mqVly4g"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_8r9q2VG6EeuXzM4mqVly4g"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_8r9q2lG6EeuXzM4mqVly4g"/>
+ </children>
+ <element xmi:type="uml:Stereotype" href="BookStore.profile.uml#_8r71oFG6EeuXzM4mqVly4g"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_8r9DwVG6EeuXzM4mqVly4g" x="700" y="320"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_TCl2EMVgEeuKDMwJXd21Mg" type="StereotypeComment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_TCl2EcVgEeuKDMwJXd21Mg"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_TCl2E8VgEeuKDMwJXd21Mg" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Package"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_TCl2EsVgEeuKDMwJXd21Mg" x="440" y="120"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_TCxcQMVgEeuKDMwJXd21Mg" type="StereotypeComment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_TCxcQcVgEeuKDMwJXd21Mg"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_TCxcQ8VgEeuKDMwJXd21Mg" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_TCxcQsVgEeuKDMwJXd21Mg" x="800" y="120"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_V_IfsMVgEeuKDMwJXd21Mg" type="Enumeration_Shape">
+ <children xmi:type="notation:DecorationNode" xmi:id="_V_Jt0MVgEeuKDMwJXd21Mg" type="Enumeration_NameLabel"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_V_Jt0cVgEeuKDMwJXd21Mg" type="Enumeration_LiteralCompartment">
+ <children xmi:type="notation:Shape" xmi:id="_b2PdAMVgEeuKDMwJXd21Mg" type="EnumerationLiteral_LiteralLabel">
+ <element xmi:type="uml:EnumerationLiteral" href="BookStore.profile.uml#_b19wMMVgEeuKDMwJXd21Mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_b2PdAcVgEeuKDMwJXd21Mg"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_c2WPIMVgEeuKDMwJXd21Mg" type="EnumerationLiteral_LiteralLabel">
+ <element xmi:type="uml:EnumerationLiteral" href="BookStore.profile.uml#_c2HloMVgEeuKDMwJXd21Mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_c2WPIcVgEeuKDMwJXd21Mg"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_djFZUMVgEeuKDMwJXd21Mg" type="EnumerationLiteral_LiteralLabel">
+ <element xmi:type="uml:EnumerationLiteral" href="BookStore.profile.uml#_di2v0MVgEeuKDMwJXd21Mg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_djFZUcVgEeuKDMwJXd21Mg"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_V_Jt0sVgEeuKDMwJXd21Mg"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_V_Jt08VgEeuKDMwJXd21Mg"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_V_Jt1MVgEeuKDMwJXd21Mg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_V_Jt1cVgEeuKDMwJXd21Mg"/>
+ </children>
+ <element xmi:type="uml:Enumeration" href="BookStore.profile.uml#_V-9gkMVgEeuKDMwJXd21Mg"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_V_IfscVgEeuKDMwJXd21Mg" x="240" y="500"/>
+ </children>
+ <styles xmi:type="notation:StringValueStyle" xmi:id="_gpCLkVG6EeuXzM4mqVly4g" name="diagram_compatibility_version" stringValue="1.4.0"/>
+ <styles xmi:type="notation:DiagramStyle" xmi:id="_gpCLklG6EeuXzM4mqVly4g"/>
+ <styles xmi:type="style:PapyrusDiagramStyle" xmi:id="_gpCLk1G6EeuXzM4mqVly4g" diagramKindId="org.eclipse.papyrus.uml.diagram.profile">
+ <owner xmi:type="uml:Profile" href="BookStore.profile.uml#_gnO0wFG6EeuXzM4mqVly4g"/>
+ </styles>
+ <element xmi:type="uml:Profile" href="BookStore.profile.uml#_gnO0wFG6EeuXzM4mqVly4g"/>
+ <edges xmi:type="notation:Connector" xmi:id="_uzQ1oFG6EeuXzM4mqVly4g" type="Extension_Edge" source="_tQO8oFG6EeuXzM4mqVly4g" target="_rQ_BsFG6EeuXzM4mqVly4g">
+ <styles xmi:type="notation:FontStyle" xmi:id="_uzQ1oVG6EeuXzM4mqVly4g"/>
+ <element xmi:type="uml:Extension" href="BookStore.profile.uml#_uzCMIFG6EeuXzM4mqVly4g"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_uzQ1olG6EeuXzM4mqVly4g" points="[340, 360, -643984, -643984]$[380, 170, -643984, -643984]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_uzuIoFG6EeuXzM4mqVly4g" id="(0.37383177570093457,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_uzuvsFG6EeuXzM4mqVly4g" id="(0.4,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="__A7XEFG6EeuXzM4mqVly4g" type="Extension_Edge" source="_8r9DwFG6EeuXzM4mqVly4g" target="_rRPgZlG6EeuXzM4mqVly4g">
+ <styles xmi:type="notation:FontStyle" xmi:id="__A7XEVG6EeuXzM4mqVly4g"/>
+ <element xmi:type="uml:Extension" href="BookStore.profile.uml#__AwX8FG6EeuXzM4mqVly4g"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="__A7XElG6EeuXzM4mqVly4g" points="[800, 360, -643984, -643984]$[640, 170, -643984, -643984]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="__BIycFG6EeuXzM4mqVly4g" id="(0.6,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="__BJZgFG6EeuXzM4mqVly4g" id="(0.6,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="__-o8gFG6EeuXzM4mqVly4g" type="Extension_Edge" source="_xMmrkFG6EeuXzM4mqVly4g" target="_rRPgZlG6EeuXzM4mqVly4g">
+ <styles xmi:type="notation:FontStyle" xmi:id="__-o8gVG6EeuXzM4mqVly4g"/>
+ <element xmi:type="uml:Extension" href="BookStore.profile.uml#__-fLgFG6EeuXzM4mqVly4g"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="__-o8glG6EeuXzM4mqVly4g" points="[600, 360, -643984, -643984]$[660, 170, -643984, -643984]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="__-2X4FG6EeuXzM4mqVly4g" id="(0.6535947712418301,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="__-2X4VG6EeuXzM4mqVly4g" id="(0.4,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_TCmdIMVgEeuKDMwJXd21Mg" type="StereotypeCommentLink" source="_rQ_BsFG6EeuXzM4mqVly4g" target="_TCl2EMVgEeuKDMwJXd21Mg">
+ <styles xmi:type="notation:FontStyle" xmi:id="_TCmdIcVgEeuKDMwJXd21Mg"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_TCmdJcVgEeuKDMwJXd21Mg" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Package"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_TCmdIsVgEeuKDMwJXd21Mg" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_TCmdI8VgEeuKDMwJXd21Mg"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_TCmdJMVgEeuKDMwJXd21Mg"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_TCxcRMVgEeuKDMwJXd21Mg" type="StereotypeCommentLink" source="_rRPgZlG6EeuXzM4mqVly4g" target="_TCxcQMVgEeuKDMwJXd21Mg">
+ <styles xmi:type="notation:FontStyle" xmi:id="_TCxcRcVgEeuKDMwJXd21Mg"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_TCxcScVgEeuKDMwJXd21Mg" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_TCxcRsVgEeuKDMwJXd21Mg" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_TCxcR8VgEeuKDMwJXd21Mg"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_TCxcSMVgEeuKDMwJXd21Mg"/>
+ </edges>
+</notation:Diagram>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/BookStore.profile.uml b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/BookStore.profile.uml
new file mode 100644
index 00000000000..af8813f4301
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/BookStore.profile.uml
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:Ecore="http://www.eclipse.org/uml2/schemas/Ecore/5" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xsi:schemaLocation="http://www.eclipse.org/uml2/schemas/Ecore/5 pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA">
+ <uml:Profile xmi:id="_gnO0wFG6EeuXzM4mqVly4g" name="BookStore" URI="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore" metaclassReference="_rQ3s8FG6EeuXzM4mqVly4g _rQ5iIFG6EeuXzM4mqVly4g">
+ <eAnnotations xmi:id="_e24cAFG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <eAnnotations xmi:id="_V-_VwMVgEeuKDMwJXd21Mg" source="PapyrusVersion">
+ <details xmi:id="_V-_VwcVgEeuKDMwJXd21Mg" key="Version" value="0.0.0"/>
+ <details xmi:id="_V-_VwsVgEeuKDMwJXd21Mg" key="Comment" value="&lt;undefined>"/>
+ <details xmi:id="_V-_Vw8VgEeuKDMwJXd21Mg" key="Copyright" value=""/>
+ <details xmi:id="_V-_VxMVgEeuKDMwJXd21Mg" key="Date" value=""/>
+ <details xmi:id="_V-_VxcVgEeuKDMwJXd21Mg" key="Author" value="&lt;undefined>"/>
+ </eAnnotations>
+ <contents xmi:type="ecore:EPackage" xmi:id="_e24cAVG7EeuXzM4mqVly4g" name="bookstore" nsURI="http://www.eclipse.org/Papyrus/test/toolsmiths/propertiesbuilder/BookStore" nsPrefix="book">
+ <eAnnotations xmi:id="_e24cAlG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <details xmi:id="_e24cA1G7EeuXzM4mqVly4g" key="originalName" value="BookStore"/>
+ </eAnnotations>
+ <eAnnotations xmi:id="_e26RMFG7EeuXzM4mqVly4g" source="PapyrusVersion">
+ <details xmi:id="_e26RMVG7EeuXzM4mqVly4g" key="Version" value="0.0.1"/>
+ <details xmi:id="_e26RMlG7EeuXzM4mqVly4g" key="Comment" value=""/>
+ <details xmi:id="_e26RM1G7EeuXzM4mqVly4g" key="Copyright" value="Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.&#xA;&#xA;All rights reserved. This program and the accompanying materials&#xA;are made available under the terms of the Eclipse Public License 2.0&#xA;which accompanies this distribution, and is available at&#xA;http://www.eclipse.org/legal/epl-2.0/&#xA;&#xA;SPDX-License-Identifier: EPL-2.0&#xA;&#xA;Contributors:&#xA; Christian W. Damus - Initial API and implementation"/>
+ <details xmi:id="_e26RNFG7EeuXzM4mqVly4g" key="Date" value="2021-01-08"/>
+ <details xmi:id="_e26RNVG7EeuXzM4mqVly4g" key="Author" value="Christian W. Damus"/>
+ </eAnnotations>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_e24cBFG7EeuXzM4mqVly4g" name="BookStore">
+ <eAnnotations xmi:id="_e24cBVG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_tQKrMFG6EeuXzM4mqVly4g"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_e24cBlG7EeuXzM4mqVly4g" name="base_Package" ordered="false">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Package"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_T36poMViEeuKDMwJXd21Mg" name="bookDispositions" lowerBound="1" upperBound="-1" eType="_FZtToMViEeuKDMwJXd21Mg"/>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_e24cCFG7EeuXzM4mqVly4g" name="Vendor">
+ <eAnnotations xmi:id="_e24cCVG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_xMldcFG6EeuXzM4mqVly4g"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_e24cClG7EeuXzM4mqVly4g" name="base_Class" ordered="false">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Class"/>
+ </eStructuralFeatures>
+ <eStructuralFeatures xmi:type="ecore:EAttribute" xmi:id="_aGK7oMViEeuKDMwJXd21Mg" name="licenseNumber" lowerBound="1">
+ <eType xmi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EClass" xmi:id="_e24cDFG7EeuXzM4mqVly4g" name="Book">
+ <eAnnotations xmi:id="_e24cDVG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML" references="_8r71oFG6EeuXzM4mqVly4g"/>
+ <eStructuralFeatures xmi:type="ecore:EReference" xmi:id="_e24cDlG7EeuXzM4mqVly4g" name="base_Class" ordered="false">
+ <eType xmi:type="ecore:EClass" href="http://www.eclipse.org/uml2/5.0.0/UML#//Class"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xmi:type="ecore:EEnum" xmi:id="_FZtToMViEeuKDMwJXd21Mg" name="DispositionKind">
+ <eLiterals xmi:id="_Hu0J0MViEeuKDMwJXd21Mg" name="new"/>
+ <eLiterals xmi:id="_K4FA0MViEeuKDMwJXd21Mg" name="used" value="1"/>
+ <eLiterals xmi:id="_M41XoMViEeuKDMwJXd21Mg" name="lending" value="2"/>
+ </eClassifiers>
+ </contents>
+ </eAnnotations>
+ <elementImport xmi:id="_rQ3s8FG6EeuXzM4mqVly4g" alias="Package">
+ <importedElement xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Package"/>
+ </elementImport>
+ <elementImport xmi:id="_rQ5iIFG6EeuXzM4mqVly4g" alias="Class">
+ <importedElement xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ </elementImport>
+ <packageImport xmi:id="_gurgkFG6EeuXzM4mqVly4g">
+ <importedPackage xmi:type="uml:Model" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#_0"/>
+ </packageImport>
+ <packageImport xmi:id="_gut80FG6EeuXzM4mqVly4g">
+ <importedPackage xmi:type="uml:Model" href="pathmap://UML_METAMODELS/UML.metamodel.uml#_0"/>
+ </packageImport>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_tQKrMFG6EeuXzM4mqVly4g" name="BookStore">
+ <ownedAttribute xmi:id="_uzEBUFG6EeuXzM4mqVly4g" name="base_Package" association="_uzCMIFG6EeuXzM4mqVly4g">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Package"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_uzEBUVG6EeuXzM4mqVly4g"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="_egjHIMVgEeuKDMwJXd21Mg" name="bookDispositions" type="_V-9gkMVgEeuKDMwJXd21Mg">
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_hAwaEMVgEeuKDMwJXd21Mg" value="*"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="_uzCMIFG6EeuXzM4mqVly4g" name="E_BookStore_Package6" memberEnd="_uzDaQFG6EeuXzM4mqVly4g _uzEBUFG6EeuXzM4mqVly4g">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="_uzDaQFG6EeuXzM4mqVly4g" name="extension_BookStore" type="_tQKrMFG6EeuXzM4mqVly4g" aggregation="composite" association="_uzCMIFG6EeuXzM4mqVly4g"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_xMldcFG6EeuXzM4mqVly4g" name="Vendor">
+ <ownedAttribute xmi:id="__-fLglG6EeuXzM4mqVly4g" name="base_Class" association="__-fLgFG6EeuXzM4mqVly4g">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="__-fykFG6EeuXzM4mqVly4g"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:id="_qf-GgMVgEeuKDMwJXd21Mg" name="licenseNumber">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Stereotype" xmi:id="_8r71oFG6EeuXzM4mqVly4g" name="Book">
+ <ownedAttribute xmi:id="__Aw_AVG6EeuXzM4mqVly4g" name="base_Class" association="__AwX8FG6EeuXzM4mqVly4g">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/UML.metamodel.uml#Class"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="__Aw_AlG6EeuXzM4mqVly4g"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="__AwX8FG6EeuXzM4mqVly4g" name="E_Book_Class9" memberEnd="__Aw_AFG6EeuXzM4mqVly4g __Aw_AVG6EeuXzM4mqVly4g">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="__Aw_AFG6EeuXzM4mqVly4g" name="extension_Book" type="_8r71oFG6EeuXzM4mqVly4g" aggregation="composite" association="__AwX8FG6EeuXzM4mqVly4g"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Extension" xmi:id="__-fLgFG6EeuXzM4mqVly4g" name="E_Vendor_Class10" memberEnd="__-fLgVG6EeuXzM4mqVly4g __-fLglG6EeuXzM4mqVly4g">
+ <ownedEnd xmi:type="uml:ExtensionEnd" xmi:id="__-fLgVG6EeuXzM4mqVly4g" name="extension_Vendor" type="_xMldcFG6EeuXzM4mqVly4g" aggregation="composite" association="__-fLgFG6EeuXzM4mqVly4g"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Enumeration" xmi:id="_V-9gkMVgEeuKDMwJXd21Mg" name="DispositionKind">
+ <ownedLiteral xmi:id="_b19wMMVgEeuKDMwJXd21Mg" name="new"/>
+ <ownedLiteral xmi:id="_c2HloMVgEeuKDMwJXd21Mg" name="used"/>
+ <ownedLiteral xmi:id="_di2v0MVgEeuKDMwJXd21Mg" name="lending"/>
+ </packagedElement>
+ <profileApplication xmi:id="_LFzeMFG7EeuXzM4mqVly4g">
+ <eAnnotations xmi:id="_LF0FQFG7EeuXzM4mqVly4g" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <references xmi:type="ecore:EPackage" href="pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA"/>
+ </eAnnotations>
+ <appliedProfile href="pathmap://UML_PROFILES/Ecore.profile.uml#_0"/>
+ </profileApplication>
+ </uml:Profile>
+ <Ecore:EPackage xmi:id="_Lr8RIFG7EeuXzM4mqVly4g" base_Package="_gnO0wFG6EeuXzM4mqVly4g" packageName="bookstore" nsPrefix="book" basePackage="org.eclipse.papyrus.toolsmiths.validation.properties.example"/>
+</xmi:XMI>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/BookStore.xmi b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/BookStore.xmi
new file mode 100644
index 00000000000..42e519bbea5
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/BookStore.xmi
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<environment:Environment
+ xmi:version="2.0"
+ xmlns:xmi="http://www.omg.org/XMI"
+ xmlns:environment="http://www.eclipse.org/papyrus/properties/environment/0.9"
+ xmi:id="_FMCggMVhEeuKDMwJXd21Mg">
+ <modelElementFactories
+ xmi:id="_L5mksMVhEeuKDMwJXd21Mg"
+ name="Vendor"
+ factoryClass="org.eclipse.papyrus.toolsmiths.validation.properties.example.modelelement.VendorModelElementFactory"/>
+</environment:Environment>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/ui/MultipleBook.xwt b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/ui/MultipleBook.xwt
new file mode 100644
index 00000000000..28b5fd1bad2
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/ui/MultipleBook.xwt
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?><Composite xmlns="http://www.eclipse.org/xwt/presentation" xmlns:j="clr-namespace:java.lang" xmlns:ppel="clr-namespace:org.eclipse.papyrus.infra.properties.ui.widgets.layout" xmlns:x="http://www.eclipse.org/xwt">
+ <Composite.layout>
+ <ppel:PropertiesLayout/>
+ </Composite.layout>
+</Composite>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/ui/MultipleBookStore.xwt b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/ui/MultipleBookStore.xwt
new file mode 100644
index 00000000000..2eb48ae9f62
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/ui/MultipleBookStore.xwt
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?><Composite xmlns="http://www.eclipse.org/xwt/presentation" xmlns:j="clr-namespace:java.lang" xmlns:ppe="clr-namespace:org.eclipse.papyrus.infra.properties.ui.widgets" xmlns:ppel="clr-namespace:org.eclipse.papyrus.infra.properties.ui.widgets.layout" xmlns:x="http://www.eclipse.org/xwt">
+ <Composite.layout>
+ <ppel:PropertiesLayout/>
+ </Composite.layout>
+ <Composite>
+ <Composite.layout>
+ <ppel:PropertiesLayout numColumns="1"/>
+ </Composite.layout>
+ <ppe:MultiReference input="{Binding}" property="BookStore:BookStore:bookDispositions"/>
+ </Composite>
+</Composite>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/ui/MultipleVendor.xwt b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/ui/MultipleVendor.xwt
new file mode 100644
index 00000000000..28b5fd1bad2
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/ui/MultipleVendor.xwt
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?><Composite xmlns="http://www.eclipse.org/xwt/presentation" xmlns:j="clr-namespace:java.lang" xmlns:ppel="clr-namespace:org.eclipse.papyrus.infra.properties.ui.widgets.layout" xmlns:x="http://www.eclipse.org/xwt">
+ <Composite.layout>
+ <ppel:PropertiesLayout/>
+ </Composite.layout>
+</Composite>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/ui/SingleBook.xwt b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/ui/SingleBook.xwt
new file mode 100644
index 00000000000..28b5fd1bad2
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/ui/SingleBook.xwt
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?><Composite xmlns="http://www.eclipse.org/xwt/presentation" xmlns:j="clr-namespace:java.lang" xmlns:ppel="clr-namespace:org.eclipse.papyrus.infra.properties.ui.widgets.layout" xmlns:x="http://www.eclipse.org/xwt">
+ <Composite.layout>
+ <ppel:PropertiesLayout/>
+ </Composite.layout>
+</Composite>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/ui/SingleBookStore.xwt b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/ui/SingleBookStore.xwt
new file mode 100644
index 00000000000..2eb48ae9f62
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/ui/SingleBookStore.xwt
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?><Composite xmlns="http://www.eclipse.org/xwt/presentation" xmlns:j="clr-namespace:java.lang" xmlns:ppe="clr-namespace:org.eclipse.papyrus.infra.properties.ui.widgets" xmlns:ppel="clr-namespace:org.eclipse.papyrus.infra.properties.ui.widgets.layout" xmlns:x="http://www.eclipse.org/xwt">
+ <Composite.layout>
+ <ppel:PropertiesLayout/>
+ </Composite.layout>
+ <Composite>
+ <Composite.layout>
+ <ppel:PropertiesLayout numColumns="1"/>
+ </Composite.layout>
+ <ppe:MultiReference input="{Binding}" property="BookStore:BookStore:bookDispositions"/>
+ </Composite>
+</Composite>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/ui/SingleVendor.xwt b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/ui/SingleVendor.xwt
new file mode 100644
index 00000000000..4fd3f8f76ce
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/resources/ui/SingleVendor.xwt
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?><Composite xmlns="http://www.eclipse.org/xwt/presentation" xmlns:j="clr-namespace:java.lang" xmlns:ppe="clr-namespace:org.eclipse.papyrus.infra.properties.ui.widgets" xmlns:ppel="clr-namespace:org.eclipse.papyrus.infra.properties.ui.widgets.layout" xmlns:x="http://www.eclipse.org/xwt">
+ <Composite.layout>
+ <ppel:PropertiesLayout/>
+ </Composite.layout>
+ <Composite>
+ <Composite.layout>
+ <ppel:PropertiesLayout numColumns="1"/>
+ </Composite.layout>
+ <ppe:StringEditor input="{Binding}" property="BookStore:Vendor:licenseNumber"/>
+ </Composite>
+</Composite>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/src/org/eclipse/papyrus/toolsmiths/validation/properties/example/modelelement/VendorModelElement.java b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/src/org/eclipse/papyrus/toolsmiths/validation/properties/example/modelelement/VendorModelElement.java
new file mode 100644
index 00000000000..2e000519e68
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/src/org/eclipse/papyrus/toolsmiths/validation/properties/example/modelelement/VendorModelElement.java
@@ -0,0 +1,27 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.toolsmiths.validation.properties.example.modelelement;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.papyrus.infra.properties.ui.modelelement.EMFModelElement;
+
+public class VendorModelElement extends EMFModelElement {
+
+ public VendorModelElement(EObject source, EditingDomain domain) {
+ super(source, domain);
+ }
+
+}
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/src/org/eclipse/papyrus/toolsmiths/validation/properties/example/modelelement/VendorModelElementFactory.java b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/src/org/eclipse/papyrus/toolsmiths/validation/properties/example/modelelement/VendorModelElementFactory.java
new file mode 100644
index 00000000000..2eee8150613
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/org.eclipse.papyrus.toolsmiths.validation.properties.example/src/org/eclipse/papyrus/toolsmiths/validation/properties/example/modelelement/VendorModelElementFactory.java
@@ -0,0 +1,38 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.toolsmiths.validation.properties.example.modelelement;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.papyrus.infra.emf.utils.EMFHelper;
+import org.eclipse.papyrus.infra.properties.contexts.DataContextElement;
+import org.eclipse.papyrus.infra.properties.ui.modelelement.EMFModelElement;
+import org.eclipse.papyrus.infra.properties.ui.modelelement.EMFModelElementFactory;
+
+public class VendorModelElementFactory extends EMFModelElementFactory {
+
+ @Override
+ protected EMFModelElement doCreateFromSource(Object sourceElement, DataContextElement context) {
+ EObject source = EMFHelper.getEObject(sourceElement);
+ if (source == null) {
+ System.err.println("Unable to resolve the selected element to an EObject"); //$NON-NLS-1$
+ return null;
+ }
+
+ EditingDomain domain = EMFHelper.resolveEditingDomain(source);
+ return new VendorModelElement(source, domain);
+ }
+
+}
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/ui/SingleVendor-wrongWidgetType.xwt b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/ui/SingleVendor-wrongWidgetType.xwt
new file mode 100644
index 00000000000..cfd2dcb5308
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/resources/ui/SingleVendor-wrongWidgetType.xwt
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?><Composite xmlns="http://www.eclipse.org/xwt/presentation" xmlns:j="clr-namespace:java.lang" xmlns:ppe="clr-namespace:org.eclipse.papyrus.infra.properties.ui.widgets" xmlns:ppel="clr-namespace:org.eclipse.papyrus.infra.properties.ui.widgets.layout" xmlns:x="http://www.eclipse.org/xwt">
+ <Composite.layout>
+ <ppel:PropertiesLayout/>
+ </Composite.layout>
+ <Composite>
+ <Composite.layout>
+ <ppel:PropertiesLayout numColumns="1"/>
+ </Composite.layout>
+ <ppe:IntegerEditor input="{Binding}" property="BookStore:Vendor:licenseNumber"/>
+ </Composite>
+</Composite>
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/quickfix/tests/ModelQuickFixTests.java b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/quickfix/tests/ModelQuickFixTests.java
new file mode 100644
index 00000000000..6524b48f47b
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/src/org/eclipse/papyrus/toolsmiths/validation/properties/internal/quickfix/tests/ModelQuickFixTests.java
@@ -0,0 +1,166 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.toolsmiths.validation.properties.internal.quickfix.tests;
+
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.PROPERTIES_PLUGIN_VALIDATION_MARKER_TYPE;
+
+import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.Build;
+import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.MarkerType;
+import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.OverlayFile;
+import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.QuickFix;
+import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.QuickFixWith;
+import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.TestProject;
+import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.TestProjectFixture;
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants;
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.quickfix.PropertiesMarkerResolutionGenerator;
+import org.junit.Rule;
+import org.junit.Test;
+
+/**
+ * Specific tests for the <em>Properties Context Model</em> quick fixes.
+ */
+@TestProject("org.eclipse.papyrus.toolsmiths.validation.properties.example")
+@MarkerType(PROPERTIES_PLUGIN_VALIDATION_MARKER_TYPE)
+@QuickFixWith(PropertiesMarkerResolutionGenerator.class)
+@Build
+public class ModelQuickFixTests {
+
+ private static final String CONTEXT = "resources/BookStore.ctx"; //$NON-NLS-1$
+ private static final String PROFILE = "resources/BookStore.profile.uml"; //$NON-NLS-1$
+
+ /**
+ * The project fixture to manage easily the project.
+ */
+ @Rule
+ public final TestProjectFixture fixture = new TestProjectFixture();
+
+ public ModelQuickFixTests() {
+ super();
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-newProperty.profile.uml", path = PROFILE)
+ @QuickFix(PropertiesPluginValidationConstants.MISSING_DATA_CONTEXT_PROPERTY)
+ public void missingDataContextProperty() {
+ // Automatic test
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-newStereotype.profile.uml", path = PROFILE)
+ @QuickFix(PropertiesPluginValidationConstants.MISSING_DATA_CONTEXT_ELEMENT)
+ public void missingDataContextElement() {
+ // Automatic test
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-deletedProperty.profile.uml", path = PROFILE)
+ @QuickFix(PropertiesPluginValidationConstants.OBSOLETE_DATA_CONTEXT_PROPERTY)
+ public void obsoleteDataContextProperty() {
+ // Automatic test
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-deletedStereotype.profile.uml", path = PROFILE)
+ @QuickFix(PropertiesPluginValidationConstants.OBSOLETE_DATA_CONTEXT_ELEMENT)
+ public void obsoleteDataContextElement() {
+ // Automatic test
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-enumPropertyWrongType.ctx", path = CONTEXT)
+ @QuickFix(PropertiesPluginValidationConstants.INCONSISTENT_DATA_CONTEXT_PROPERTY_TYPE)
+ public void enumPropertyWrongType() {
+ // Automatic test
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-stringPropertyWrongType.ctx", path = CONTEXT)
+ @QuickFix(PropertiesPluginValidationConstants.INCONSISTENT_DATA_CONTEXT_PROPERTY_TYPE)
+ public void stringPropertyWrongType() {
+ // Automatic test
+ }
+
+ @Test
+ @OverlayFile(value = "ui/SingleVendor-wrongWidgetType.xwt", path = "resources/ui/SingleVendor.xwt")
+ @QuickFix(PropertiesPluginValidationConstants.INCONSISTENT_WIDGET_TYPE)
+ public void stringPropertyEditorWrongWidgetType() {
+ // Automatic test
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-renamedProperty.profile.uml", path = PROFILE)
+ @QuickFix(PropertiesPluginValidationConstants.RENAMED_PROPERTY)
+ public void renamedProperty() {
+ // Automatic test
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-renamedStereotype.profile.uml", path = PROFILE)
+ @QuickFix(PropertiesPluginValidationConstants.RENAMED_CLASS)
+ public void renamedStereotype() {
+ // Automatic test
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-renamedProfile.profile.uml", path = PROFILE)
+ @QuickFix(PropertiesPluginValidationConstants.RENAMED_PACKAGE)
+ public void renamedProfile() {
+ // Automatic test
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-newNestedProfile.profile.uml", path = PROFILE)
+ @QuickFix(PropertiesPluginValidationConstants.MISSING_DATA_CONTEXT_PACKAGE)
+ public void missingDataContextPackage_nestedProfile() {
+ // Automatic test
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-newNestedPackage.profile.uml", path = PROFILE)
+ @QuickFix(PropertiesPluginValidationConstants.MISSING_DATA_CONTEXT_PACKAGE)
+ public void missingDataContextPackage_nestedPackage() {
+ // Automatic test
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-unresolvedInstanceOf.ctx", path = CONTEXT)
+ @QuickFix(PropertiesPluginValidationConstants.UNRESOLVED_CONSTRAINT_CLASS)
+ public void unresolvedConstraintClass_instanceOf() {
+ // Automatic test
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-unresolvedHasStereotype.ctx", path = CONTEXT)
+ @QuickFix(PropertiesPluginValidationConstants.UNRESOLVED_CONSTRAINT_CLASS)
+ public void unresolvedConstraintClass_hasStereotype() {
+ // Automatic test
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-renamedProfile.profile.uml", path = PROFILE)
+ @QuickFix(PropertiesPluginValidationConstants.UNRESOLVED_CONSTRAINT_CLASS)
+ public void unresolvedConstraintClass_hasStereotype_byRenamedProfile() {
+ // Automatic test
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-propertyWrongMultiplicity.ctx", path = CONTEXT)
+ @QuickFix(PropertiesPluginValidationConstants.INCONSISTENT_DATA_CONTEXT_PROPERTY_MULTIPLICITY)
+ public void propertyWrongMultiplicity() {
+ // Automatic test
+ }
+
+}
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/src/org/eclipse/papyrus/toolsmiths/validation/properties/tests/AllTests.java b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/src/org/eclipse/papyrus/toolsmiths/validation/properties/tests/AllTests.java
new file mode 100644
index 00000000000..76b5f851dec
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/src/org/eclipse/papyrus/toolsmiths/validation/properties/tests/AllTests.java
@@ -0,0 +1,36 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.toolsmiths.validation.properties.tests;
+
+import org.eclipse.papyrus.toolsmiths.validation.properties.internal.quickfix.tests.ModelQuickFixTests;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+import org.junit.runners.Suite.SuiteClasses;
+
+/**
+ * All tests for <em>Properties Configuration</em> model plug-in validation.
+ */
+@RunWith(Suite.class)
+@SuiteClasses({
+ PropertiesPluginBuilderTest.class,
+ PropertiesPluginXMLBuilderTest.class,
+ PropertiesDependencyBuilderTest.class,
+ PropertiesContextModelBuilderUMLTest.class,
+ PropertiesContextModelBuilderEcoreTest.class,
+ ModelQuickFixTests.class,
+})
+public class AllTests {
+ // Everything is specified in annotations
+}
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/src/org/eclipse/papyrus/toolsmiths/validation/properties/tests/PropertiesContextModelBuilderEcoreTest.java b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/src/org/eclipse/papyrus/toolsmiths/validation/properties/tests/PropertiesContextModelBuilderEcoreTest.java
new file mode 100644
index 00000000000..ceabee1ced1
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/src/org/eclipse/papyrus/toolsmiths/validation/properties/tests/PropertiesContextModelBuilderEcoreTest.java
@@ -0,0 +1,130 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.toolsmiths.validation.properties.tests;
+
+import static org.eclipse.papyrus.junit.matchers.WorkspaceMatchers.isMarkerMessage;
+import static org.eclipse.papyrus.junit.matchers.WorkspaceMatchers.isMarkerSeverity;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.PROPERTIES_PLUGIN_VALIDATION_MARKER_TYPE;
+import static org.hamcrest.CoreMatchers.anything;
+import static org.hamcrest.CoreMatchers.both;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.CoreMatchers.hasItem;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import java.util.List;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.papyrus.junit.framework.classification.tests.AbstractPapyrusTest;
+import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.Build;
+import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.MarkerType;
+import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.OverlayFile;
+import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.TestProject;
+import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.TestProjectFixture;
+import org.junit.FixMethodOrder;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runners.MethodSorters;
+
+/**
+ * Test cases for the <em>Properties Model</em> validation of <em>Context</em> resources
+ * sourced in <em>UML Profiles</em>.
+ */
+@TestProject("org.eclipse.papyrus.toolsmiths.validation.properties.example")
+@MarkerType(PROPERTIES_PLUGIN_VALIDATION_MARKER_TYPE)
+@Build
+@OverlayFile(value = "models/BookStore-ecore.ctx", path = PropertiesContextModelBuilderEcoreTest.CONTEXT)
+@OverlayFile(value = "models/BookStore.ecore", path = PropertiesContextModelBuilderEcoreTest.ECORE)
+@OverlayFile(value = "models/plugin-ecore.xml", path = "plugin.xml")
+@FixMethodOrder(MethodSorters.JVM)
+public class PropertiesContextModelBuilderEcoreTest extends AbstractPapyrusTest {
+
+ static final String CONTEXT = "resources/BookStore.ctx"; //$NON-NLS-1$
+ static final String ECORE = "resources/BookStore.ecore"; //$NON-NLS-1$
+
+ @Rule
+ public final TestProjectFixture fixture = new TestProjectFixture();
+
+ /**
+ * Test that a context model with implicit dependencies only (generated before source annotations)
+ * does not report errors on missing data context elements.
+ */
+ @Test
+ @OverlayFile(value = "models/BookStore-ecore-implicitTracesOK.ctx", path = CONTEXT)
+ public void implicitSourceTracesOK() {
+ final List<IMarker> modelMarkers = fixture.getMarkers(CONTEXT);
+
+ assertThat(modelMarkers, not(hasItem(anything())));
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-newProperty.ecore", path = ECORE)
+ public void missingDataContextProperty() {
+ final List<IMarker> modelMarkers = fixture.getMarkers(CONTEXT);
+ assertThat(modelMarkers, hasItem(both(isMarkerSeverity(IMarker.SEVERITY_WARNING)).and(isMarkerMessage(
+ both(containsString("is missing a Property")).and(containsString("taxClass"))))));
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-newEClass.ecore", path = ECORE)
+ public void missingDataContextElement() {
+ final List<IMarker> modelMarkers = fixture.getMarkers(CONTEXT);
+ assertThat(modelMarkers, hasItem(both(isMarkerSeverity(IMarker.SEVERITY_WARNING)).and(isMarkerMessage(
+ both(containsString("is missing a Data Context Element")).and(containsString("LoanContract"))))));
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-deletedProperty.ecore", path = ECORE)
+ public void obsoleteDataContextProperty() {
+ final List<IMarker> modelMarkers = fixture.getMarkers(CONTEXT);
+ assertThat(modelMarkers, hasItem(both(isMarkerSeverity(IMarker.SEVERITY_ERROR)).and(isMarkerMessage(
+ both(containsString("source model property")).and(containsString("has been deleted"))
+ .and(containsString("licenseNumber"))))));
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-deletedEClass.ecore", path = ECORE)
+ public void obsoleteDataContextElement() {
+ final List<IMarker> modelMarkers = fixture.getMarkers(CONTEXT);
+ assertThat(modelMarkers, hasItem(both(isMarkerSeverity(IMarker.SEVERITY_ERROR)).and(isMarkerMessage(
+ both(containsString("source model class")).and(containsString("has been deleted"))
+ .and(containsString("Vendor"))))));
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-ecore-enumPropertyWrongType.ctx", path = CONTEXT)
+ public void enumPropertyWrongType() {
+ final List<IMarker> modelMarkers = fixture.getMarkers(CONTEXT);
+ assertThat(modelMarkers, hasItem(both(isMarkerSeverity(IMarker.SEVERITY_WARNING)).and(isMarkerMessage(
+ both(containsString("should have type Enumeration for consistency")).and(containsString("bookDispositions"))))));
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-ecore-stringPropertyWrongType.ctx", path = CONTEXT)
+ public void stringPropertyWrongType() {
+ final List<IMarker> modelMarkers = fixture.getMarkers(CONTEXT);
+ assertThat(modelMarkers, hasItem(both(isMarkerSeverity(IMarker.SEVERITY_WARNING)).and(isMarkerMessage(
+ both(containsString("should have type String for consistency")).and(containsString("licenseNumber"))))));
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-ecore-unresolvedInstanceOf.ctx", path = CONTEXT)
+ public void unresolvedInstanceOfConstraint() {
+ final List<IMarker> modelMarkers = fixture.getMarkers(CONTEXT);
+ assertThat(modelMarkers, hasItem(both(isMarkerSeverity(IMarker.SEVERITY_ERROR)).and(isMarkerMessage(
+ both(containsString("Unresolved EClass name 'Store'")).and(containsString("Ecore 'instance-of' constraint 'isSingleBookStore'"))))));
+ }
+
+}
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/src/org/eclipse/papyrus/toolsmiths/validation/properties/tests/PropertiesContextModelBuilderUMLTest.java b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/src/org/eclipse/papyrus/toolsmiths/validation/properties/tests/PropertiesContextModelBuilderUMLTest.java
new file mode 100644
index 00000000000..b34c89c9edb
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/src/org/eclipse/papyrus/toolsmiths/validation/properties/tests/PropertiesContextModelBuilderUMLTest.java
@@ -0,0 +1,227 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.toolsmiths.validation.properties.tests;
+
+import static org.eclipse.papyrus.junit.matchers.WorkspaceMatchers.isMarkerMessage;
+import static org.eclipse.papyrus.junit.matchers.WorkspaceMatchers.isMarkerSeverity;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.PROPERTIES_PLUGIN_VALIDATION_MARKER_TYPE;
+import static org.hamcrest.CoreMatchers.anything;
+import static org.hamcrest.CoreMatchers.both;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.CoreMatchers.hasItem;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import java.util.List;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.papyrus.junit.framework.classification.tests.AbstractPapyrusTest;
+import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.Build;
+import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.MarkerType;
+import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.OverlayFile;
+import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.TestProject;
+import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.TestProjectFixture;
+import org.junit.FixMethodOrder;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runners.MethodSorters;
+
+/**
+ * Test cases for the <em>Properties Model</em> validation of <em>Context</em> resources
+ * sourced in <em>UML Profiles</em>.
+ */
+@TestProject("org.eclipse.papyrus.toolsmiths.validation.properties.example")
+@MarkerType(PROPERTIES_PLUGIN_VALIDATION_MARKER_TYPE)
+@Build
+@FixMethodOrder(MethodSorters.JVM)
+public class PropertiesContextModelBuilderUMLTest extends AbstractPapyrusTest {
+
+ private static final String CONTEXT = "resources/BookStore.ctx"; //$NON-NLS-1$
+ private static final String PROFILE = "resources/BookStore.profile.uml"; //$NON-NLS-1$
+
+ @Rule
+ public final TestProjectFixture fixture = new TestProjectFixture();
+
+ /**
+ * Test that a context model with implicit dependencies only (generated before source annotations)
+ * does not report errors on missing data context elements.
+ */
+ @Test
+ @OverlayFile(value = "models/BookStore-implicitTracesOK.ctx", path = CONTEXT)
+ public void implicitSourceTracesOK() {
+ final List<IMarker> modelMarkers = fixture.getMarkers(CONTEXT);
+
+ assertThat(modelMarkers, not(hasItem(anything())));
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-newProperty.profile.uml", path = PROFILE)
+ public void missingDataContextProperty() {
+ final List<IMarker> modelMarkers = fixture.getMarkers(CONTEXT);
+ assertThat(modelMarkers, hasItem(both(isMarkerSeverity(IMarker.SEVERITY_WARNING)).and(isMarkerMessage(
+ both(containsString("is missing a Property")).and(containsString("taxClass"))))));
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-newStereotype.profile.uml", path = PROFILE)
+ public void missingDataContextElement() {
+ final List<IMarker> modelMarkers = fixture.getMarkers(CONTEXT);
+ assertThat(modelMarkers, hasItem(both(isMarkerSeverity(IMarker.SEVERITY_WARNING)).and(isMarkerMessage(
+ both(containsString("is missing a Data Context Element")).and(containsString("LoanContract"))))));
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-deletedProperty.profile.uml", path = PROFILE)
+ public void obsoleteDataContextProperty() {
+ final List<IMarker> modelMarkers = fixture.getMarkers(CONTEXT);
+ assertThat(modelMarkers, hasItem(both(isMarkerSeverity(IMarker.SEVERITY_ERROR)).and(isMarkerMessage(
+ both(containsString("source model property")).and(containsString("has been deleted"))
+ .and(containsString("licenseNumber"))))));
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-deletedStereotype.profile.uml", path = PROFILE)
+ public void obsoleteDataContextElement() {
+ final List<IMarker> modelMarkers = fixture.getMarkers(CONTEXT);
+ assertThat(modelMarkers, hasItem(both(isMarkerSeverity(IMarker.SEVERITY_ERROR)).and(isMarkerMessage(
+ both(containsString("source model class")).and(containsString("has been deleted"))
+ .and(containsString("Vendor"))))));
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-enumPropertyWrongType.ctx", path = CONTEXT)
+ public void enumPropertyWrongType() {
+ final List<IMarker> modelMarkers = fixture.getMarkers(CONTEXT);
+ assertThat(modelMarkers, hasItem(both(isMarkerSeverity(IMarker.SEVERITY_WARNING)).and(isMarkerMessage(
+ both(containsString("should have type Enumeration for consistency")).and(containsString("bookDispositions"))))));
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-stringPropertyWrongType.ctx", path = CONTEXT)
+ public void stringPropertyWrongType() {
+ final List<IMarker> modelMarkers = fixture.getMarkers(CONTEXT);
+ assertThat(modelMarkers, hasItem(both(isMarkerSeverity(IMarker.SEVERITY_WARNING)).and(isMarkerMessage(
+ both(containsString("should have type String for consistency")).and(containsString("licenseNumber"))))));
+ }
+
+ /**
+ * Test that complex data types (not primitives) are treated as classes for the purposes of
+ * editing in the properties view.
+ */
+ @Test
+ @OverlayFile(value = "models/BookStore-withComplexDataType.ctx", path = CONTEXT)
+ @OverlayFile(value = "models/BookStore-withComplexDataType.profile.uml", path = PROFILE)
+ public void dataTypeAsClass() {
+ final List<IMarker> modelMarkers = fixture.getMarkers(CONTEXT);
+ assertThat(modelMarkers, hasItem(both(isMarkerSeverity(IMarker.SEVERITY_WARNING)).and(isMarkerMessage(
+ both(containsString("Address")).and(containsString("is missing a Property")).and(containsString("zipcode"))))));
+ }
+
+ @Test
+ @OverlayFile(value = "ui/SingleVendor-wrongWidgetType.xwt", path = "resources/ui/SingleVendor.xwt")
+ public void stringPropertyEditorWrongWidgetType() {
+ // The problem is reported on the Context resource because that is where we edit the XWT content
+ final List<IMarker> modelMarkers = fixture.getMarkers(CONTEXT);
+ assertThat(modelMarkers, hasItem(both(isMarkerSeverity(IMarker.SEVERITY_WARNING)).and(isMarkerMessage(
+ both(containsString("is not consistent with its type")).and(containsString("IntegerEditor"))))));
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-unresolvedInstanceOf.ctx", path = CONTEXT)
+ public void unresolvedInstanceOfConstraint() {
+ final List<IMarker> modelMarkers = fixture.getMarkers(CONTEXT);
+ assertThat(modelMarkers, hasItem(both(isMarkerSeverity(IMarker.SEVERITY_ERROR)).and(isMarkerMessage(
+ both(containsString("Unresolved UML metaclass name 'BogusMetaclass'")).and(containsString("UML 'instance-of' constraint 'isSingleBookStore'"))))));
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-unresolvedHasStereotype.ctx", path = CONTEXT)
+ public void unresolvedHasStereotypeConstraint() {
+ final List<IMarker> modelMarkers = fixture.getMarkers(CONTEXT);
+ assertThat(modelMarkers, hasItem(both(isMarkerSeverity(IMarker.SEVERITY_ERROR)).and(isMarkerMessage(
+ both(containsString("Unresolved stereotype qualified name 'BookStore::Store'")).and(containsString("UML 'has-stereotype' constraint 'isSingleBookStore'"))))));
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-renamedProfile.profile.uml", path = PROFILE)
+ public void unresolvedHasStereotypeConstraint_byRenamedProfile() {
+ final List<IMarker> modelMarkers = fixture.getMarkers(CONTEXT);
+ assertThat(modelMarkers, hasItem(both(isMarkerSeverity(IMarker.SEVERITY_ERROR)).and(isMarkerMessage(
+ both(containsString("Unresolved stereotype qualified name 'BookStore::BookStore'")).and(containsString("UML 'has-stereotype' constraint 'isSingleBookStore'"))))));
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-renamedProperty.profile.uml", path = PROFILE)
+ public void renamedProperty() {
+ final List<IMarker> modelMarkers = fixture.getMarkers(CONTEXT);
+ assertThat(modelMarkers, hasItem(both(isMarkerSeverity(IMarker.SEVERITY_ERROR)).and(isMarkerMessage(
+ both(containsString("must be named 'license'")).and(containsString("licenseNumber"))))));
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-renamedStereotype.profile.uml", path = PROFILE)
+ public void renamedStereotype() {
+ final List<IMarker> modelMarkers = fixture.getMarkers(CONTEXT);
+ assertThat(modelMarkers, hasItem(both(isMarkerSeverity(IMarker.SEVERITY_ERROR)).and(isMarkerMessage(
+ both(containsString("must be named 'Seller'")).and(containsString("Vendor"))))));
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-renamedProfile.profile.uml", path = PROFILE)
+ public void renamedProfile() {
+ final List<IMarker> modelMarkers = fixture.getMarkers(CONTEXT);
+ assertThat(modelMarkers, hasItem(both(isMarkerSeverity(IMarker.SEVERITY_ERROR)).and(isMarkerMessage(
+ containsString("must be named 'BookStoreProfile'")))));
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-newNestedProfile.profile.uml", path = PROFILE)
+ public void missingDataContextPackage_nestedProfile() {
+ final List<IMarker> modelMarkers = fixture.getMarkers(CONTEXT);
+ assertThat(modelMarkers, hasItem(both(isMarkerSeverity(IMarker.SEVERITY_WARNING)).and(isMarkerMessage(
+ both(containsString("is missing a Data Context Package")).and(containsString("Legal"))))));
+
+ // The new stereotype in the new profile is not reported as its newness follows from the profile
+ assertThat(modelMarkers, not(hasItem(isMarkerMessage(containsString("is missing a Data Context Element")))));
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-newNestedPackage.profile.uml", path = PROFILE)
+ public void missingDataContextPackage_nestedPackage() {
+ final List<IMarker> modelMarkers = fixture.getMarkers(CONTEXT);
+ assertThat(modelMarkers, hasItem(both(isMarkerSeverity(IMarker.SEVERITY_WARNING)).and(isMarkerMessage(
+ both(containsString("is missing a Data Context Package")).and(containsString("Legal"))))));
+
+ // The new stereotype in the new nested package is not reported as its newness follows from the package
+ assertThat(modelMarkers, not(hasItem(isMarkerMessage(containsString("is missing a Data Context Element")))));
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-profileMoved.ctx", path = CONTEXT)
+ public void profileMoved() {
+ final List<IMarker> modelMarkers = fixture.getMarkers(CONTEXT);
+ assertThat(modelMarkers, hasItem(both(isMarkerSeverity(IMarker.SEVERITY_WARNING)).and(isMarkerMessage(
+ both(containsString("is not resolved. Perhaps it has been moved to another location?")).and(containsString("Data Context Root BookStore"))))));
+ }
+
+ @Test
+ @OverlayFile(value = "models/BookStore-propertyWrongMultiplicity.ctx", path = CONTEXT)
+ public void propertyWrongMultiplicity() {
+ final List<IMarker> modelMarkers = fixture.getMarkers(CONTEXT);
+ assertThat(modelMarkers, hasItem(both(isMarkerSeverity(IMarker.SEVERITY_WARNING)).and(isMarkerMessage(
+ both(containsString("should have multiplicity -1 for consistency")).and(containsString("bookDispositions"))))));
+ }
+
+}
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/src/org/eclipse/papyrus/toolsmiths/validation/properties/tests/PropertiesDependencyBuilderTest.java b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/src/org/eclipse/papyrus/toolsmiths/validation/properties/tests/PropertiesDependencyBuilderTest.java
new file mode 100644
index 00000000000..ad756d33c44
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/src/org/eclipse/papyrus/toolsmiths/validation/properties/tests/PropertiesDependencyBuilderTest.java
@@ -0,0 +1,97 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.toolsmiths.validation.properties.tests;
+
+import static org.eclipse.papyrus.junit.matchers.WorkspaceMatchers.isMarkerMessage;
+import static org.eclipse.papyrus.junit.matchers.WorkspaceMatchers.isMarkerSeverity;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.PROPERTIES_PLUGIN_VALIDATION_MARKER_TYPE;
+import static org.hamcrest.CoreMatchers.both;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.CoreMatchers.hasItem;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import java.util.List;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.papyrus.junit.framework.classification.tests.AbstractPapyrusTest;
+import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.AuxProject;
+import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.Build;
+import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.MarkerType;
+import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.OverlayFile;
+import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.TestProject;
+import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.TestProjectFixture;
+import org.junit.FixMethodOrder;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runners.MethodSorters;
+
+/**
+ * Test cases for the <em>Properties Model</em> validation of <tt>MANIFEST.MF</tt>
+ * dependencies in the project builder.
+ */
+@TestProject("org.eclipse.papyrus.toolsmiths.validation.properties.example")
+@MarkerType(PROPERTIES_PLUGIN_VALIDATION_MARKER_TYPE)
+@Build
+@FixMethodOrder(MethodSorters.JVM)
+public class PropertiesDependencyBuilderTest extends AbstractPapyrusTest {
+
+ private static final String MANIFEST = "META-INF/MANIFEST.MF"; //$NON-NLS-1$
+ private static final String ENVIRONMENT = "resources/BookStore.xmi"; //$NON-NLS-1$
+
+ @Rule
+ public final TestProjectFixture fixture = new TestProjectFixture();
+
+ /**
+ * Test the reporting of a missing bundle dependency implied by a
+ * reference to <em>properties context</em> model via a
+ * <tt>ppe:/</tt> scheme URI.
+ */
+ @Test
+ @OverlayFile(value = "manifest/MANIFEST-missingDependency.MF", path = MANIFEST)
+ public void missingDependencyByContextReference() {
+ final List<IMarker> modelMarkers = fixture.getMarkers(MANIFEST);
+
+ assertThat(modelMarkers, hasItem(both(isMarkerSeverity(IMarker.SEVERITY_ERROR)).and(isMarkerMessage(
+ both(containsString("required plug-in")).and(containsString("uml.properties")))))); //$NON-NLS-1$//$NON-NLS-2$
+ }
+
+ /**
+ * Test the reporting of an unresolved class name in a <em>properties environment model</em>.
+ */
+ @Test
+ @OverlayFile(value = "manifest/BookStore-unresolvedClassName.xmi", path = ENVIRONMENT)
+ public void unresolvedEnvironmentModelFactory() {
+ final List<IMarker> modelMarkers = fixture.getMarkers(ENVIRONMENT);
+
+ assertThat(modelMarkers, hasItem(both(isMarkerSeverity(IMarker.SEVERITY_ERROR)).and(isMarkerMessage(
+ both(containsString("No such class")).and(containsString("BooModelElementFactory")))))); //$NON-NLS-1$//$NON-NLS-2$
+ }
+
+ /**
+ * Test the reporting of a missing bundle dependency implied by a
+ * reference to a <em>model-element factory class</em> by Java qualified name
+ * in a <em>properties environment model</em>.
+ */
+ @Test
+ @OverlayFile(value = "manifest/BookStore-missingClassDependency.xmi", path = ENVIRONMENT)
+ @AuxProject("org.eclipse.papyrus.toolsmiths.validation.properties.example.dependency1")
+ public void missingDependencyByEnvironmentModelFactory() {
+ final List<IMarker> modelMarkers = fixture.getMarkers(MANIFEST);
+
+ assertThat(modelMarkers, hasItem(both(isMarkerSeverity(IMarker.SEVERITY_ERROR)).and(isMarkerMessage(
+ both(containsString("required plug-in")).and(containsString("properties.example.dependency1")))))); //$NON-NLS-1$//$NON-NLS-2$
+ }
+
+}
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/src/org/eclipse/papyrus/toolsmiths/validation/properties/tests/PropertiesPluginBuilderTest.java b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/src/org/eclipse/papyrus/toolsmiths/validation/properties/tests/PropertiesPluginBuilderTest.java
new file mode 100644
index 00000000000..394f1220bd2
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/src/org/eclipse/papyrus/toolsmiths/validation/properties/tests/PropertiesPluginBuilderTest.java
@@ -0,0 +1,84 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.toolsmiths.validation.properties.tests;
+
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.PROPERTIES_PLUGIN_VALIDATION_MARKER_TYPE;
+import static org.hamcrest.CoreMatchers.anything;
+import static org.hamcrest.CoreMatchers.hasItem;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import java.util.List;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.papyrus.junit.framework.classification.tests.AbstractPapyrusTest;
+import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.Build;
+import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.MarkerType;
+import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.TestProject;
+import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.TestProjectFixture;
+import org.junit.Rule;
+import org.junit.Test;
+
+/**
+ * General test cases for the <em>Properties Model</em> project builder.
+ */
+@TestProject("org.eclipse.papyrus.toolsmiths.validation.properties.example")
+@MarkerType(PROPERTIES_PLUGIN_VALIDATION_MARKER_TYPE)
+@Build
+public class PropertiesPluginBuilderTest extends AbstractPapyrusTest {
+
+ /**
+ * The project fixture to manage easily the project.
+ */
+ @Rule
+ public final TestProjectFixture fixture = new TestProjectFixture();
+
+ /**
+ * Test the reporting of a project that passes all checks.
+ */
+ @Test
+ public void contextOK() {
+ final List<IMarker> modelMarkers = fixture.getMarkers("resources/BookStore.ctx"); //$NON-NLS-1$
+ assertThat(modelMarkers, not(hasItem(anything())));
+ }
+
+ /**
+ * Test the reporting of a project that passes all checks.
+ */
+ @Test
+ public void environmentOK() {
+ final List<IMarker> modelMarkers = fixture.getMarkers("resources/BookStore.xmi"); //$NON-NLS-1$
+ assertThat(modelMarkers, not(hasItem(anything())));
+ }
+
+ /**
+ * Test the reporting of a project that passes all checks.
+ */
+ @Test
+ public void manifestOK() {
+ final List<IMarker> manifestMarkers = fixture.getMarkers("META-INF/MANIFEST.MF"); //$NON-NLS-1$
+ assertThat(manifestMarkers, not(hasItem(anything())));
+ }
+
+ /**
+ * Test the reporting of a project that passes all checks.
+ */
+ @Test
+ public void extensionsOK() {
+ final List<IMarker> pluginXMLMarkers = fixture.getMarkers("plugin.xml"); //$NON-NLS-1$
+ assertThat(pluginXMLMarkers, not(hasItem(anything())));
+ }
+
+}
diff --git a/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/src/org/eclipse/papyrus/toolsmiths/validation/properties/tests/PropertiesPluginXMLBuilderTest.java b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/src/org/eclipse/papyrus/toolsmiths/validation/properties/tests/PropertiesPluginXMLBuilderTest.java
new file mode 100644
index 00000000000..bc8860aeac7
--- /dev/null
+++ b/tests/junit/plugins/toolsmiths/org.eclipse.papyrus.toolsmiths.validation.properties.tests/src/org/eclipse/papyrus/toolsmiths/validation/properties/tests/PropertiesPluginXMLBuilderTest.java
@@ -0,0 +1,75 @@
+/*****************************************************************************
+ * Copyright (c) 2021 Christian W. Damus, CEA LIST, and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.toolsmiths.validation.properties.tests;
+
+import static org.eclipse.papyrus.junit.matchers.WorkspaceMatchers.isMarkerMessage;
+import static org.eclipse.papyrus.junit.matchers.WorkspaceMatchers.isMarkerSeverity;
+import static org.eclipse.papyrus.toolsmiths.validation.properties.internal.constants.PropertiesPluginValidationConstants.PROPERTIES_PLUGIN_VALIDATION_MARKER_TYPE;
+import static org.hamcrest.CoreMatchers.both;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.CoreMatchers.hasItem;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import java.util.List;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.papyrus.junit.framework.classification.tests.AbstractPapyrusTest;
+import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.Build;
+import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.MarkerType;
+import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.OverlayFile;
+import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.TestProject;
+import org.eclipse.papyrus.toolsmiths.validation.common.tests.rules.TestProjectFixture;
+import org.junit.Rule;
+import org.junit.Test;
+
+/**
+ * Test cases for the <em>Properties Model</em> validation of <tt>plugin.xml</tt>
+ * in the project builder.
+ */
+@TestProject("org.eclipse.papyrus.toolsmiths.validation.properties.example")
+@MarkerType(PROPERTIES_PLUGIN_VALIDATION_MARKER_TYPE)
+@Build
+public class PropertiesPluginXMLBuilderTest extends AbstractPapyrusTest {
+
+ private static final String PLUGIN = "plugin.xml"; //$NON-NLS-1$
+
+ @Rule
+ public final TestProjectFixture fixture = new TestProjectFixture();
+
+ /**
+ * Test the reporting of a missing properties context registration extension.
+ */
+ @Test
+ @OverlayFile(value = "extensions/plugin-noContext.xml", path = PLUGIN)
+ public void noContextExtension() {
+ final List<IMarker> modelMarkers = fixture.getMarkers(PLUGIN);
+
+ assertThat(modelMarkers, hasItem(both(isMarkerSeverity(IMarker.SEVERITY_ERROR)).and(isMarkerMessage(
+ both(containsString("Missing extension")).and(containsString("infra.properties.contexts")))))); //$NON-NLS-1$
+ }
+
+ /**
+ * Test the reporting of a missing properties environment registration extension.
+ */
+ @Test
+ @OverlayFile(value = "extensions/plugin-noEnvironment.xml", path = PLUGIN)
+ public void noEnvironmentExtension() {
+ final List<IMarker> modelMarkers = fixture.getMarkers(PLUGIN);
+
+ assertThat(modelMarkers, hasItem(both(isMarkerSeverity(IMarker.SEVERITY_ERROR)).and(isMarkerMessage(
+ both(containsString("Missing extension")).and(containsString("infra.properties.environments")))))); //$NON-NLS-1$//$NON-NLS-2$
+ }
+
+}
diff --git a/tests/junit/plugins/toolsmiths/pom.xml b/tests/junit/plugins/toolsmiths/pom.xml
index fb7ef032cb9..06df16fd286 100755
--- a/tests/junit/plugins/toolsmiths/pom.xml
+++ b/tests/junit/plugins/toolsmiths/pom.xml
@@ -24,6 +24,7 @@
<module>org.eclipse.papyrus.toolsmiths.validation.elementtypes.tests</module>
<module>org.eclipse.papyrus.toolsmiths.validation.architecture.tests</module>
<module>org.eclipse.papyrus.toolsmiths.validation.newchild.tests</module>
+ <module>org.eclipse.papyrus.toolsmiths.validation.properties.tests</module>
</modules>
</project>

Back to the top