Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -173,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"
Expand All @@ -190,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<Element> elements = ((Namespace)root).getOwnedMember();
List<Element> ownedMembers = ((Namespace)elements.get(0)).getOwnedMember();
Expand Down Expand Up @@ -220,5 +222,83 @@ 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<Element> elements = ((Namespace)root).getOwnedMember();
List<Element> ownedMembers = ((Namespace)elements.get(0)).getOwnedMember();
List<Feature> directedFeatures = ((Usage)ownedMembers.get(0)).getDirectedFeature();
List<Usage> 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"
+ " 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<Element> elements = ((Namespace)root).getOwnedMember();
List<Element> ownedMembers = ((Namespace)elements.get(0)).getOwnedMember();
List<Usage> 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<EnumerationUsage> 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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,24 +24,22 @@
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);
}

@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<Usage> 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;
}
}
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -24,19 +24,23 @@
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);
}

@Override
protected EList<?> basicGet(InternalEObject owner) {
return new DerivedEObjectEList<>(EnumerationUsage.class, owner, SysMLPackage.ENUMERATION_DEFINITION__ENUMERATED_VALUE, new int[] {SysMLPackage.DEFINITION__VARIANT});
EList<EnumerationUsage> 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;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -37,8 +37,9 @@ public Usage_directedUsage_SettingDelegate(EStructuralFeature eStructuralFeature
@Override
protected EList<?> basicGet(InternalEObject owner) {
EList<Usage> 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;
}
Expand Down