Skip to content

Commit 2328589

Browse files
committed
ST6RI-897 Moved non-gen Feature.isEnd and getDirection code to adapters.
- Setting isEnd for EndFeatureMembership moved to EndFeatureMembershipAdapter.postProcess. - Setting direction for ParameterMembership moved to ParameterMembershipAdapter.postProcess. (Note that this means that simply being owned via a ParameterMembership no longer ensures that the parameter direction will be "in".) - Setting direction for the owned Feature of a FlowEnd moved to FlowEndAdapter.doTransform(). (Can't be done in postProcess, because of need for proxy resolution.)
1 parent fdebe52 commit 2328589

6 files changed

Lines changed: 153 additions & 43 deletions

File tree

org.omg.sysml/src/org/omg/sysml/adapter/ElementAdapterFactory.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,11 @@ public ElementAdapter caseElement(Element element) {
247247
return new ElementAdapter(element);
248248
}
249249

250+
@Override
251+
public ElementAdapter caseEndFeatureMembership(EndFeatureMembership element) {
252+
return new EndFeatureMembershipAdapter(element);
253+
}
254+
250255
@Override
251256
public ElementAdapter caseEventOccurrenceUsage(EventOccurrenceUsage element) {
252257
return new EventOccurrenceUsageAdapter(element);
@@ -437,6 +442,11 @@ public ElementAdapter casePackage(Package element) {
437442
return new PackageAdapter(element);
438443
}
439444

445+
@Override
446+
public ElementAdapter caseParameterMembership(ParameterMembership element) {
447+
return new ParameterMembershipAdapter(element);
448+
}
449+
440450
@Override
441451
public ElementAdapter casePartDefinition(PartDefinition element) {
442452
return new PartDefinitionAdapter(element);
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/*******************************************************************************
2+
* SysML 2 Pilot Implementation
3+
* Copyright (c) 2026 Model Driven Solutions, Inc.
4+
*
5+
* This program is free software: you can redistribute it and/or modify
6+
* it under the terms of the GNU Lesser General Public License as published by
7+
* the Free Software Foundation, either version 3 of the License, or
8+
* (at your option) any later version.
9+
*
10+
* This program is distributed in the hope that it will be useful,
11+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+
* GNU Lesser General Public License for more details.
14+
*
15+
* You should have received a copy of the GNU Lesser General Public License
16+
* along with this program. If not, see <https://www.gnu.org/licenses/>.
17+
*
18+
* @license LGPL-3.0-or-later <http://spdx.org/licenses/LGPL-3.0-or-later>
19+
*
20+
*******************************************************************************/
21+
22+
package org.omg.sysml.adapter;
23+
24+
import org.omg.sysml.lang.sysml.EndFeatureMembership;
25+
import org.omg.sysml.lang.sysml.Feature;
26+
27+
public class EndFeatureMembershipAdapter extends FeatureMembershipAdapter {
28+
29+
public EndFeatureMembershipAdapter(EndFeatureMembership element) {
30+
super(element);
31+
}
32+
33+
@Override
34+
public EndFeatureMembership getTarget() {
35+
return (EndFeatureMembership)super.getTarget();
36+
}
37+
38+
/**
39+
* @satisfies validateEndFeatureMembershipIsEnd
40+
*/
41+
@Override
42+
public void postProcess() {
43+
super.postProcess();
44+
EndFeatureMembership target = getTarget();
45+
Feature endFeature = target.getOwnedMemberFeature();
46+
if (endFeature != null) {
47+
endFeature.setIsEnd(true);
48+
}
49+
}
50+
51+
}

org.omg.sysml/src/org/omg/sysml/adapter/FlowEndAdapter.java

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*******************************************************************************
22
* SysML 2 Pilot Implementation
3-
* Copyright (c) 2021-2022 Model Driven Solutions, Inc.
3+
* Copyright (c) 2021-2022, 2026 Model Driven Solutions, Inc.
44
*
55
* This program is free software: you can redistribute it and/or modify
66
* it under the terms of the GNU Lesser General Public License as published by
@@ -27,6 +27,7 @@
2727
import org.omg.sysml.lang.sysml.Element;
2828
import org.omg.sysml.lang.sysml.Feature;
2929
import org.omg.sysml.lang.sysml.FlowEnd;
30+
import org.omg.sysml.lang.sysml.Redefinition;
3031
import org.omg.sysml.lang.sysml.SysMLPackage;
3132
import org.omg.sysml.util.FeatureUtil;
3233
import org.omg.sysml.util.ImplicitGeneralizationMap;
@@ -42,12 +43,12 @@ public FlowEndAdapter(FlowEnd element) {
4243
public FlowEnd getTarget() {
4344
return (FlowEnd)super.getTarget();
4445
}
45-
46+
4647
// Implicit Generalization
4748

4849
@Override
4950
public Stream<Feature> getSubsettedNotRedefinedFeatures() {
50-
addItemFlowEndSubsetting();
51+
addFlowEndSubsetting();
5152
return super.getSubsettedNotRedefinedFeatures();
5253
}
5354

@@ -59,12 +60,32 @@ public void computeImplicitGeneralTypes() {
5960

6061
// Transformation
6162

62-
public void addItemFlowEndSubsetting() {
63+
/**
64+
* @satisfies validateRedefinitionDirectionConformance
65+
* (For the case of a FlowEnd feature.)
66+
*/
67+
public void addFlowFeatureDirection() {
68+
FlowEnd target = getTarget();
69+
EList<Feature> ownedFeatures = target.getOwnedFeature();
70+
if (!ownedFeatures.isEmpty()) {
71+
Feature flowFeature = ownedFeatures.get(0);
72+
EList<Redefinition> redefinitions = flowFeature.getOwnedRedefinition();
73+
if (!redefinitions.isEmpty()) {
74+
// Note: This cannot be done during parse post-processing because it may require proxy resolution.
75+
Feature redefinedFeature = redefinitions.get(0).getRedefinedFeature();
76+
if (redefinedFeature != null) {
77+
flowFeature.setDirection(target.directionOf(redefinedFeature));
78+
}
79+
}
80+
}
81+
}
82+
83+
public void addFlowEndSubsetting() {
6384
FlowEnd target = getTarget();
6485
if (target.getOwnedSubsetting().isEmpty()) {
65-
EList<Feature> features = getTarget().getOwnedFeature();
66-
if (!features.isEmpty()) {
67-
FeatureUtil.getRedefinedFeaturesOf(features.get(0)).stream().findFirst().
86+
EList<Feature> ownedFeatures = getTarget().getOwnedFeature();
87+
if (!ownedFeatures.isEmpty()) {
88+
FeatureUtil.getRedefinedFeaturesOf(ownedFeatures.get(0)).stream().findFirst().
6889
filter(f->f != null).
6990
map(Feature::getOwningType).
7091
filter(Feature.class::isInstance).
@@ -78,29 +99,30 @@ public void addItemFlowEndSubsetting() {
7899
/**
79100
* @satisfies checkFeatureFlowFeatureRedefinition
80101
*/
81-
public void addItemFlowFeatureRedefinition() {
102+
public void addFlowFeatureRedefinition() {
82103
FlowEnd target = getTarget();
83104
Element owner = target.getOwner();
84105
if (owner instanceof Feature) {
85106
EList<Feature> ownedFeatures = target.getOwnedFeature();
86107
if (!ownedFeatures.isEmpty()) {
87-
Feature itemFlowFeature = ownedFeatures.get(0);
88-
int i = ((Feature)owner).getEndFeature().indexOf(target);
89-
if (i == 0 || i == 1) {
90-
TypeUtil.addImplicitGeneralTypeTo(itemFlowFeature,
108+
Feature flowFeature = ownedFeatures.get(0);
109+
int i = ((Feature)owner).getEndFeature().indexOf(target);
110+
if (i == 0 || i == 1) {
111+
TypeUtil.addImplicitGeneralTypeTo(flowFeature,
91112
SysMLPackage.eINSTANCE.getRedefinition(),
92113
getLibraryType(ImplicitGeneralizationMap.getDefaultSupertypeFor(
93114
target.getClass(), i == 0? "sourceOutput": "targetInput")));
94-
TypeUtil.setIsAddImplicitGeneralTypesFor(itemFlowFeature, false);
115+
TypeUtil.setIsAddImplicitGeneralTypesFor(flowFeature, false);
95116
}
96117
}
97118
}
98119
}
99120

100121
@Override
101122
public void doTransform() {
102-
addItemFlowEndSubsetting();
103-
addItemFlowFeatureRedefinition();
123+
addFlowEndSubsetting();
124+
addFlowFeatureRedefinition();
125+
addFlowFeatureDirection();
104126
super.doTransform();
105127
}
106128

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*******************************************************************************
2+
* SysML 2 Pilot Implementation
3+
* Copyright (c) 2026 Model Driven Solutions, Inc.
4+
*
5+
* This program is free software: you can redistribute it and/or modify
6+
* it under the terms of the GNU Lesser General Public License as published by
7+
* the Free Software Foundation, either version 3 of the License, or
8+
* (at your option) any later version.
9+
*
10+
* This program is distributed in the hope that it will be useful,
11+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+
* GNU Lesser General Public License for more details.
14+
*
15+
* You should have received a copy of the GNU Lesser General Public License
16+
* along with this program. If not, see <https://www.gnu.org/licenses/>.
17+
*
18+
* @license LGPL-3.0-or-later <http://spdx.org/licenses/LGPL-3.0-or-later>
19+
*
20+
*******************************************************************************/
21+
22+
package org.omg.sysml.adapter;
23+
24+
import org.omg.sysml.lang.sysml.Feature;
25+
import org.omg.sysml.lang.sysml.ParameterMembership;
26+
27+
public class ParameterMembershipAdapter extends FeatureMembershipAdapter {
28+
29+
public ParameterMembershipAdapter(ParameterMembership element) {
30+
super(element);
31+
}
32+
33+
@Override
34+
public ParameterMembership getTarget() {
35+
return (ParameterMembership)super.getTarget();
36+
}
37+
38+
@Override
39+
public void postProcess() {
40+
super.postProcess();
41+
ParameterMembership target = getTarget();
42+
Feature parameter = target.getOwnedMemberParameter();
43+
if (parameter != null) {
44+
parameter.setDirection(target.parameterDirection());
45+
}
46+
}
47+
48+
}

org.omg.sysml/src/org/omg/sysml/util/TypeUtil.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import org.omg.sysml.lang.sysml.Expression;
4242
import org.omg.sysml.lang.sysml.Feature;
4343
import org.omg.sysml.lang.sysml.FeatureChaining;
44+
import org.omg.sysml.lang.sysml.FeatureDirectionKind;
4445
import org.omg.sysml.lang.sysml.FeatureMembership;
4546
import org.omg.sysml.lang.sysml.Specialization;
4647
import org.omg.sysml.lang.sysml.Membership;
@@ -265,6 +266,7 @@ public static void addResultParameterTo(Type type, Feature resultParameter) {
265266
ReturnParameterMembership membership = SysMLFactory.eINSTANCE.createReturnParameterMembership();
266267
membership.setOwnedMemberParameter(resultParameter);
267268
type.getOwnedRelationship().add(membership);
269+
resultParameter.setDirection(FeatureDirectionKind.OUT);
268270
}
269271
}
270272

@@ -364,7 +366,9 @@ public static FeatureMembership addBoundFeatureTo(Type type, Expression value) {
364366
}
365367

366368
public static ParameterMembership addOwnedParameterTo(Type type, Expression value) {
367-
return addBoundFeatureTo(type, value, SysMLFactory.eINSTANCE.createParameterMembership());
369+
ParameterMembership membership = addBoundFeatureTo(type, value, SysMLFactory.eINSTANCE.createParameterMembership());
370+
membership.getOwnedMemberParameter().setDirection(FeatureDirectionKind.IN);
371+
return membership;
368372
}
369373

370374
// Implicit general types

org.omg.sysml/syntax-gen/org/omg/sysml/lang/sysml/impl/FeatureImpl.java

Lines changed: 2 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,6 @@
4646
import org.omg.sysml.lang.sysml.FeatureInverting;
4747
import org.omg.sysml.lang.sysml.FeatureMembership;
4848
import org.omg.sysml.lang.sysml.FeatureTyping;
49-
import org.omg.sysml.lang.sysml.FlowEnd;
50-
import org.omg.sysml.lang.sysml.ParameterMembership;
51-
import org.omg.sysml.lang.sysml.EndFeatureMembership;
5249
import org.omg.sysml.lang.sysml.Redefinition;
5350
import org.omg.sysml.lang.sysml.ReferenceSubsetting;
5451
import org.omg.sysml.lang.sysml.Relationship;
@@ -686,13 +683,10 @@ public void setIsConstant(boolean newIsConstant) {
686683
* <!-- begin-user-doc -->
687684
* Mark a feature as an end if it is owned via an EndFeatureMembership.
688685
* <!-- end-user-doc -->
689-
* @generated NOT
686+
* @generated
690687
*/
691688
@Override
692689
public boolean isEnd() {
693-
if (getOwningMembership() instanceof EndFeatureMembership) {
694-
isEnd = true;
695-
}
696690
return isEnd;
697691
}
698692

@@ -711,30 +705,11 @@ public void setIsEnd(boolean newIsEnd) {
711705

712706
/**
713707
* <!-- begin-user-doc -->
714-
* If the Feature is owned via a ParameterMembership, the direction is given by
715-
* the parameterDirection operation of the relationship.
716-
* If the feature is owned by an ItemFlowEnd, the direction is that of the
717-
* redefined feature of its owned Redefinition.
718708
* <!-- end-user-doc -->
719-
* @generated NOT
709+
* @generated
720710
*/
721711
@Override
722712
public FeatureDirectionKind getDirection() {
723-
FeatureMembership owningFeatureMembership = getOwningFeatureMembership();
724-
if (owningFeatureMembership instanceof ParameterMembership) {
725-
direction = ((ParameterMembership)owningFeatureMembership).parameterDirection();
726-
} else if (owningFeatureMembership != null) {
727-
Type owningType = owningFeatureMembership.getOwningType();
728-
if (owningType instanceof FlowEnd) {
729-
EList<Redefinition> redefinitions = getOwnedRedefinition();
730-
if (!redefinitions.isEmpty()) {
731-
Feature redefinedFeature = redefinitions.get(0).getRedefinedFeature();
732-
if (redefinedFeature != null) {
733-
direction = owningType.directionOf(redefinedFeature);
734-
}
735-
}
736-
}
737-
}
738713
return direction;
739714
}
740715

0 commit comments

Comments
 (0)