From 725b3b6220a5e0a61afc95c3dec8f1de557de865 Mon Sep 17 00:00:00 2001 From: Ed Seidewitz Date: Wed, 10 Dec 2025 13:05:02 -0500 Subject: [PATCH 1/3] ST6RI-899 Added Junit test of variant and enumeratedValue. Test passes for getVariant on a variantion item def, but it fails for and enum def. --- .../DerivedPropertyAndOperationTest.java | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/org.omg.sysml.interactive.tests/src/org/omg/sysml/interactive/tests/DerivedPropertyAndOperationTest.java b/org.omg.sysml.interactive.tests/src/org/omg/sysml/interactive/tests/DerivedPropertyAndOperationTest.java index 42b67a269..52eda684a 100644 --- a/org.omg.sysml.interactive.tests/src/org/omg/sysml/interactive/tests/DerivedPropertyAndOperationTest.java +++ b/org.omg.sysml.interactive.tests/src/org/omg/sysml/interactive/tests/DerivedPropertyAndOperationTest.java @@ -1,6 +1,6 @@ /******************************************************************************* * SysML 2 Pilot Implementation - * Copyright (c) 2021-2022 Model Driven Solutions, Inc. + * Copyright (c) 2021-2022, 2025 Model Driven Solutions, Inc. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by @@ -36,6 +36,8 @@ import org.omg.sysml.lang.sysml.AttributeUsage; import org.omg.sysml.lang.sysml.Definition; import org.omg.sysml.lang.sysml.Element; +import org.omg.sysml.lang.sysml.EnumerationDefinition; +import org.omg.sysml.lang.sysml.EnumerationUsage; import org.omg.sysml.lang.sysml.Expression; import org.omg.sysml.lang.sysml.Feature; import org.omg.sysml.lang.sysml.ItemUsage; @@ -221,4 +223,35 @@ public void testDirectedUsage() throws Exception { assertEquals("constraint def (directedUsages)", directedFeatures.subList(0, 2), directedUsages); } + public final String enumeratedValueTest = + "package Test {\n" + + " variation item def I {\n" + + " variant item i1;\n" + + " variant item i2;\n" + + " }" + + " enum def A {\n" + + " enum a1;\n" + + " enum a2;\n" + + " }" + + "}"; + + @Test + public void testEnumeratedValue() throws Exception { + SysMLInteractive instance = getSysMLInteractiveInstance(); + SysMLInteractiveResult result = instance.process(enumeratedValueTest); + Element root = result.getRootElement(); + List elements = ((Namespace)root).getOwnedMember(); + List ownedMembers = ((Namespace)elements.get(0)).getOwnedMember(); + List variants = ((Definition)ownedMembers.get(0)).getVariant(); + assertEquals("item def (variants.size)", 2, variants.size()); + + // Check that getting variant and enumeratedValue work for EnumerationDefinitions, + // even though EnumerationDefinition::enumeratedValue redefines Definition::variant. + + variants = ((Definition)ownedMembers.get(1)).getVariant(); + List enumeratedValues = ((EnumerationDefinition)ownedMembers.get(1)).getEnumeratedValue(); + assertEquals("enum def (variants.size)", 2, variants.size()); + assertEquals("enuim def (enumeratedValues.size)", 2, enumeratedValues.size()); + assertEquals("enum def (enumeratedValues)", variants, enumeratedValues); + } } From 1f2fc3250cf34641d182ce6eff31a2f05662265e Mon Sep 17 00:00:00 2001 From: Ed Seidewitz Date: Wed, 10 Dec 2025 14:24:04 -0500 Subject: [PATCH 2/3] ST6RI-899 Revised delegate for derivation of enumeratedValue. Implemented an explicit filter on EnumerationUsage instead of using DerivedEObjectEList. --- ...Definition_enumeratedValue_SettingDelegate.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/org.omg.sysml/src/org/omg/sysml/delegate/setting/EnumerationDefinition_enumeratedValue_SettingDelegate.java b/org.omg.sysml/src/org/omg/sysml/delegate/setting/EnumerationDefinition_enumeratedValue_SettingDelegate.java index 2e0be9d1b..7be3c259c 100644 --- a/org.omg.sysml/src/org/omg/sysml/delegate/setting/EnumerationDefinition_enumeratedValue_SettingDelegate.java +++ b/org.omg.sysml/src/org/omg/sysml/delegate/setting/EnumerationDefinition_enumeratedValue_SettingDelegate.java @@ -1,6 +1,6 @@ /******************************************************************************* * SysML 2 Pilot Implementation - * Copyright (c) 2022 Siemens AG + * Copyright (c) 2022, 2025 Siemens AG * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by @@ -24,11 +24,10 @@ import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.InternalEObject; -import org.eclipse.uml2.common.util.DerivedEObjectEList; import org.omg.sysml.lang.sysml.EnumerationUsage; -import org.omg.sysml.lang.sysml.SysMLPackage; +import org.omg.sysml.util.NonNotifyingEObjectEList; -public class EnumerationDefinition_enumeratedValue_SettingDelegate extends BasicDerivedListSettingDelegate { +public class EnumerationDefinition_enumeratedValue_SettingDelegate extends Definition_variant_SettingDelegate { public EnumerationDefinition_enumeratedValue_SettingDelegate(EStructuralFeature eStructuralFeature) { super(eStructuralFeature); @@ -36,7 +35,12 @@ public EnumerationDefinition_enumeratedValue_SettingDelegate(EStructuralFeature @Override protected EList basicGet(InternalEObject owner) { - return new DerivedEObjectEList<>(EnumerationUsage.class, owner, SysMLPackage.ENUMERATION_DEFINITION__ENUMERATED_VALUE, new int[] {SysMLPackage.DEFINITION__VARIANT}); + EList enumeratedValues = new NonNotifyingEObjectEList<>(EnumerationUsage.class, owner, eStructuralFeature.getFeatureID()); + super.basicGet(owner).stream(). + filter(EnumerationUsage.class::isInstance). + map(EnumerationUsage.class::cast). + forEachOrdered(enumeratedValues::add); + return enumeratedValues; } } From 176974c09d2119f508725c4e77e3210658d55f53 Mon Sep 17 00:00:00 2001 From: Ed Seidewitz Date: Wed, 10 Dec 2025 15:00:08 -0500 Subject: [PATCH 3/3] ST6RI-899 Updated derivation of directedUsage for Definition and Usage. Made the implementation consistent with each other and implementation of EnumerationDefinition::enumeratedValue. --- .../DerivedPropertyAndOperationTest.java | 53 +++++++++++++++++-- ...inition_directedUsage_SettingDelegate.java | 18 +++---- .../Usage_directedUsage_SettingDelegate.java | 7 +-- 3 files changed, 62 insertions(+), 16 deletions(-) diff --git a/org.omg.sysml.interactive.tests/src/org/omg/sysml/interactive/tests/DerivedPropertyAndOperationTest.java b/org.omg.sysml.interactive.tests/src/org/omg/sysml/interactive/tests/DerivedPropertyAndOperationTest.java index 52eda684a..9a615b865 100644 --- a/org.omg.sysml.interactive.tests/src/org/omg/sysml/interactive/tests/DerivedPropertyAndOperationTest.java +++ b/org.omg.sysml.interactive.tests/src/org/omg/sysml/interactive/tests/DerivedPropertyAndOperationTest.java @@ -175,7 +175,7 @@ public void testPathOperation() throws Exception { assertEquals("TopLevel/3/1/1/1", TopLevel_3_1_1.getOwnedRelatedElement().get(0).path()); } - public final String directedUsageTest = + public final String directedUsageTest1 = "package Test {\n" + " item def I {\n" + " in x;\n" @@ -192,9 +192,9 @@ public void testPathOperation() throws Exception { + "}"; @Test - public void testDirectedUsage() throws Exception { + public void testDirectedUsage1() throws Exception { SysMLInteractive instance = getSysMLInteractiveInstance(); - SysMLInteractiveResult result = instance.process(directedUsageTest); + SysMLInteractiveResult result = instance.process(directedUsageTest1); Element root = result.getRootElement(); List elements = ((Namespace)root).getOwnedMember(); List ownedMembers = ((Namespace)elements.get(0)).getOwnedMember(); @@ -222,6 +222,53 @@ public void testDirectedUsage() throws Exception { assertEquals("constraint def (directedUsages.size)", 2, directedUsages.size()); assertEquals("constraint def (directedUsages)", directedFeatures.subList(0, 2), directedUsages); } + public final String directedUsageTest2 = + "package Test {\n" + + " item I {\n" + + " in x;\n" + + " in y;\n" + + " }" + + " action A {\n" + + " in x;\n" + + " in y;\n" + + " }" + + " constraint C {\n" + + " in x;\n" + + " in y;\n" + + " }" + + "}"; + + @Test + public void testDirectedUsage2() throws Exception { + SysMLInteractive instance = getSysMLInteractiveInstance(); + SysMLInteractiveResult result = instance.process(directedUsageTest2); + Element root = result.getRootElement(); + List elements = ((Namespace)root).getOwnedMember(); + List ownedMembers = ((Namespace)elements.get(0)).getOwnedMember(); + List directedFeatures = ((Usage)ownedMembers.get(0)).getDirectedFeature(); + List directedUsages = ((Usage)ownedMembers.get(0)).getDirectedUsage(); + assertEquals("item (directedFeatures.size)", 2, directedFeatures.size()); + assertEquals("item (directedUsages.size)", 2, directedUsages.size()); + assertEquals("item (directedUsages)", directedFeatures, directedUsages); + + // Check that getting directedFeatures and directedUsages work for ActionUsages and + // ConstraintUsages, even though they are kinds of Steps, and Step redefines + // directedFeature as parameter. + + directedFeatures = ((Usage)ownedMembers.get(1)).getDirectedFeature(); + directedUsages = ((Usage)ownedMembers.get(1)).getDirectedUsage(); + assertEquals("action (directedFeatures.size)", 2, directedFeatures.size()); + assertEquals("action (directedUsages.size)", 2, directedUsages.size()); + assertEquals("action (directedUsages)", directedFeatures, directedUsages); + + // The ConstraintUsage "C" has three directedFeatures, including its return parameter, + // but only the first two are Usages. + directedFeatures = ((Usage)ownedMembers.get(2)).getDirectedFeature(); + directedUsages = ((Usage)ownedMembers.get(2)).getDirectedUsage(); + assertEquals("constraint (directedFeatures.size)", 3, directedFeatures.size()); + assertEquals("constraint (directedUsages.size)", 2, directedUsages.size()); + assertEquals("constraint (directedUsages)", directedFeatures.subList(0, 2), directedUsages); + } public final String enumeratedValueTest = "package Test {\n" diff --git a/org.omg.sysml/src/org/omg/sysml/delegate/setting/Definition_directedUsage_SettingDelegate.java b/org.omg.sysml/src/org/omg/sysml/delegate/setting/Definition_directedUsage_SettingDelegate.java index 7b2202f13..372628bb1 100644 --- a/org.omg.sysml/src/org/omg/sysml/delegate/setting/Definition_directedUsage_SettingDelegate.java +++ b/org.omg.sysml/src/org/omg/sysml/delegate/setting/Definition_directedUsage_SettingDelegate.java @@ -24,13 +24,10 @@ import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.InternalEObject; -import org.eclipse.uml2.common.util.DerivedEObjectEList; -import org.omg.sysml.lang.sysml.ActionDefinition; -import org.omg.sysml.lang.sysml.ConstraintDefinition; -import org.omg.sysml.lang.sysml.SysMLPackage; import org.omg.sysml.lang.sysml.Usage; +import org.omg.sysml.util.NonNotifyingEObjectEList; -public class Definition_directedUsage_SettingDelegate extends DefaultDerivedPropertySettingDelegate { +public class Definition_directedUsage_SettingDelegate extends Type_directedFeature_SettingDelegate { public Definition_directedUsage_SettingDelegate(EStructuralFeature eStructuralFeature) { super(eStructuralFeature); @@ -38,10 +35,11 @@ public Definition_directedUsage_SettingDelegate(EStructuralFeature eStructuralFe @Override protected EList basicGet(InternalEObject owner) { - return owner instanceof ActionDefinition? - new DerivedEObjectEList<>(Usage.class, owner, eStructuralFeature.getFeatureID(), new int[] {SysMLPackage.ACTION_DEFINITION__PARAMETER}): - owner instanceof ConstraintDefinition? - new DerivedEObjectEList<>(Usage.class, owner, eStructuralFeature.getFeatureID(), new int[] {SysMLPackage.CONSTRAINT_DEFINITION__PARAMETER}): - super.basicGet(owner); + EList directedUsages = new NonNotifyingEObjectEList<>(Usage.class, owner, eStructuralFeature.getFeatureID()); + super.basicGet(owner).stream(). + filter(Usage.class::isInstance). + map(Usage.class::cast). + forEachOrdered(directedUsages::add); + return directedUsages; } } diff --git a/org.omg.sysml/src/org/omg/sysml/delegate/setting/Usage_directedUsage_SettingDelegate.java b/org.omg.sysml/src/org/omg/sysml/delegate/setting/Usage_directedUsage_SettingDelegate.java index 9b7da3565..5df035ba5 100644 --- a/org.omg.sysml/src/org/omg/sysml/delegate/setting/Usage_directedUsage_SettingDelegate.java +++ b/org.omg.sysml/src/org/omg/sysml/delegate/setting/Usage_directedUsage_SettingDelegate.java @@ -28,7 +28,7 @@ import org.omg.sysml.lang.sysml.Usage; import org.omg.sysml.util.NonNotifyingEObjectEList; -public class Usage_directedUsage_SettingDelegate extends BasicDerivedListSettingDelegate { +public class Usage_directedUsage_SettingDelegate extends Type_directedFeature_SettingDelegate { public Usage_directedUsage_SettingDelegate(EStructuralFeature eStructuralFeature) { super(eStructuralFeature); @@ -37,8 +37,9 @@ public Usage_directedUsage_SettingDelegate(EStructuralFeature eStructuralFeature @Override protected EList basicGet(InternalEObject owner) { EList directedUsages = new NonNotifyingEObjectEList<>(Usage.class, owner, eStructuralFeature.getFeatureID()); - ((Usage)owner).getUsage().stream(). - filter(usage->usage.getDirection() != null). + super.basicGet(owner).stream(). + filter(Usage.class::isInstance). + map(Usage.class::cast). forEachOrdered(directedUsages::add); return directedUsages; }