Skip to content

Commit 84996a6

Browse files
authored
Merge pull request #555 from Systems-Modeling/ST6RI-684-1
ST6RI-684 (update) Implement invocation delegates for operations
2 parents 57600ec + 4298136 commit 84996a6

20 files changed

Lines changed: 397 additions & 391 deletions

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
import org.omg.sysml.lang.sysml.*;
2727
import org.omg.sysml.lang.sysml.Class;
28+
import org.omg.sysml.lang.sysml.Package;
2829
import org.omg.sysml.lang.sysml.util.SysMLSwitch;
2930

3031
public class ElementAdapterFactory {
@@ -286,6 +287,11 @@ public ElementAdapter caseMembership(Membership element) {
286287
return new MembershipAdapter(element);
287288
}
288289

290+
@Override
291+
public ElementAdapter caseMembershipImport(MembershipImport element) {
292+
return new MembershipImportAdapter(element);
293+
}
294+
289295
@Override
290296
public ElementAdapter caseMetadataFeature(MetadataFeature element) {
291297
return new MetadataFeatureAdapter(element);
@@ -306,6 +312,11 @@ public ElementAdapter caseNamespace(Namespace element) {
306312
return new NamespaceAdapter(element);
307313
}
308314

315+
@Override
316+
public ElementAdapter caseNamespaceImport(NamespaceImport element) {
317+
return new NamespaceImportAdapter(element);
318+
}
319+
309320
@Override
310321
public ElementAdapter caseOccurrenceDefinition(OccurrenceDefinition element) {
311322
return new OccurrenceDefinitionAdapter(element);
@@ -321,6 +332,11 @@ public ElementAdapter caseOperatorExpression(OperatorExpression element) {
321332
return new OperatorExpressionAdapter(element);
322333
}
323334

335+
@Override
336+
public ElementAdapter casePackage(Package element) {
337+
return new PackageAdapter(element);
338+
}
339+
324340
@Override
325341
public ElementAdapter casePartDefinition(PartDefinition element) {
326342
return new PartDefinitionAdapter(element);

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

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
package org.omg.sysml.adapter;
2323

24+
import java.util.Collection;
2425
import java.util.Collections;
2526
import java.util.List;
2627
import java.util.stream.Collectors;
@@ -30,6 +31,7 @@
3031
import org.omg.sysml.lang.sysml.Feature;
3132
import org.omg.sysml.lang.sysml.FeatureMembership;
3233
import org.omg.sysml.lang.sysml.FeatureValue;
34+
import org.omg.sysml.lang.sysml.Function;
3335
import org.omg.sysml.lang.sysml.Multiplicity;
3436
import org.omg.sysml.lang.sysml.SysMLFactory;
3537
import org.omg.sysml.lang.sysml.Type;
@@ -67,6 +69,32 @@ public List<Feature> getTypeParameters() {
6769
collect(Collectors.toList());
6870
}
6971

72+
// Inheritence
73+
74+
@Override
75+
public Collection<Feature> getFeaturesRedefinedByType() {
76+
Collection<Feature> features = super.getFeaturesRedefinedByType();
77+
78+
// If inputs and outputs have not been computed, add effectively
79+
// redefined features from the Expression type, without actually
80+
// computing the inputs and outputs.
81+
Expression target = getTarget();
82+
if (target.getInput().isEmpty()) {
83+
features.addAll(ExpressionUtil.getTypeParametersOf(target));
84+
}
85+
if (target.getOutput().isEmpty()) {
86+
Type exprType = ExpressionUtil.getExpressionTypeOf(target);
87+
if (exprType instanceof Function || exprType instanceof Expression) {
88+
Feature result = TypeUtil.getOwnedResultParameterOf(exprType);
89+
if (result != null) {
90+
features.add(result);
91+
}
92+
}
93+
}
94+
95+
return features;
96+
}
97+
7098
// Implicit Generalization
7199

72100
@Override

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*******************************************************************************
22
* SysML 2 Pilot Implementation
3-
* Copyright (c) 2021-2023 Model Driven Solutions, Inc.
3+
* Copyright (c) 2021-2024 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
@@ -41,10 +41,12 @@
4141
import org.omg.sysml.lang.sysml.Element;
4242
import org.omg.sysml.lang.sysml.Expression;
4343
import org.omg.sysml.lang.sysml.Feature;
44+
import org.omg.sysml.lang.sysml.FeatureChaining;
4445
import org.omg.sysml.lang.sysml.FeatureTyping;
4546
import org.omg.sysml.lang.sysml.FeatureValue;
4647
import org.omg.sysml.lang.sysml.Function;
4748
import org.omg.sysml.lang.sysml.InvocationExpression;
49+
import org.omg.sysml.lang.sysml.Membership;
4850
import org.omg.sysml.lang.sysml.Namespace;
4951
import org.omg.sysml.lang.sysml.Redefinition;
5052
import org.omg.sysml.lang.sysml.ReferenceSubsetting;
@@ -72,6 +74,20 @@ public Feature getTarget() {
7274
return (Feature)super.getTarget();
7375
}
7476

77+
// Inheritance
78+
79+
@Override
80+
protected void addInheritedMemberships(EList<Membership> inheritedMemberships, Collection<Namespace> excludedNamespaces, Collection<Type> excludedTypes, boolean includeProtected) {
81+
super.addInheritedMemberships(inheritedMemberships, excludedNamespaces, excludedTypes, includeProtected);
82+
EList<FeatureChaining> featureChainings = getTarget().getOwnedFeatureChaining();
83+
if (!featureChainings.isEmpty()) {
84+
Feature chainingFeature = featureChainings.get(featureChainings.size()-1).getChainingFeature();
85+
if (chainingFeature != null && !excludedTypes.contains(chainingFeature)) {
86+
inheritedMemberships.addAll(TypeUtil.getNonPrivateMembershipFor(chainingFeature, excludedNamespaces, excludedTypes, includeProtected));
87+
}
88+
}
89+
}
90+
7591
// Caching
7692

7793
public EList<Type> getTypes() {
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
/*******************************************************************************
2+
* SysML 2 Pilot Implementation
3+
* Copyright (c) 2024 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 java.util.Collection;
25+
26+
import org.eclipse.emf.common.util.EList;
27+
import org.omg.sysml.lang.sysml.Element;
28+
import org.omg.sysml.lang.sysml.Import;
29+
import org.omg.sysml.lang.sysml.Membership;
30+
import org.omg.sysml.lang.sysml.Namespace;
31+
import org.omg.sysml.lang.sysml.OwningMembership;
32+
import org.omg.sysml.lang.sysml.Type;
33+
import org.omg.sysml.lang.sysml.VisibilityKind;
34+
import org.omg.sysml.util.NamespaceUtil;
35+
36+
public abstract class ImportAdapter extends RelationshipAdapter {
37+
38+
public ImportAdapter(Import element) {
39+
super(element);
40+
}
41+
42+
public Import getTarget() {
43+
return (Import)super.getTarget();
44+
}
45+
46+
// Additional operations
47+
// Note: The excludedType parameter is needed in case the imported Namespace
48+
// is a Type that has one or more Generalizations.
49+
public abstract EList<Membership> importMemberships(EList<Membership> importedMembership,
50+
Collection<Membership> nonpublicMembership, Collection<Namespace> excludedNamespaces,
51+
Collection<Type> excludedTypes);
52+
53+
protected void importMembershipsFrom(Namespace importedNamespace, EList<Membership> importedMembership,
54+
Collection<Membership> nonpublicMembership, Collection<Namespace> excludedNamespaces,
55+
Collection<Type> excludedTypes, boolean isRecursive) {
56+
Import target = getTarget();
57+
Collection<Membership> namespaceMembership =
58+
NamespaceUtil.getVisibleMembershipsFor(importedNamespace, excludedNamespaces, excludedTypes, target.isImportAll());
59+
importedMembership.addAll(namespaceMembership);
60+
if (nonpublicMembership != null && !VisibilityKind.PUBLIC.equals(target.getVisibility())) {
61+
nonpublicMembership.addAll(namespaceMembership);
62+
}
63+
if (isRecursive) {
64+
excludedNamespaces.add(importedNamespace);
65+
for (Membership membership: namespaceMembership) {
66+
if (membership instanceof OwningMembership) {
67+
Element member = membership.getMemberElement();
68+
if (member instanceof Namespace) {
69+
importMembershipsFrom((Namespace)member, importedMembership, nonpublicMembership,
70+
excludedNamespaces, excludedTypes, true);
71+
}
72+
}
73+
}
74+
excludedNamespaces.remove(importedNamespace);
75+
}
76+
}
77+
78+
}

org.omg.sysml/src/org/omg/sysml/delegate/invocation/MembershipImport_importedMemberships_InvocationDelegate.java renamed to org.omg.sysml/src/org/omg/sysml/adapter/MembershipImportAdapter.java

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,36 +19,40 @@
1919
*
2020
*******************************************************************************/
2121

22-
package org.omg.sysml.delegate.invocation;
22+
package org.omg.sysml.adapter;
2323

2424
import java.util.Collection;
25+
2526
import org.eclipse.emf.common.util.EList;
26-
import org.eclipse.emf.ecore.EOperation;
2727
import org.omg.sysml.lang.sysml.Element;
28-
import org.omg.sysml.lang.sysml.Import;
2928
import org.omg.sysml.lang.sysml.Membership;
3029
import org.omg.sysml.lang.sysml.MembershipImport;
3130
import org.omg.sysml.lang.sysml.Namespace;
3231
import org.omg.sysml.lang.sysml.Type;
3332

34-
public class MembershipImport_importedMemberships_InvocationDelegate extends Import_importedMemberships_InvocationDelegate {
33+
public class MembershipImportAdapter extends ImportAdapter {
3534

36-
public MembershipImport_importedMemberships_InvocationDelegate(EOperation operation) {
37-
super(operation);
35+
public MembershipImportAdapter(MembershipImport element) {
36+
super(element);
37+
}
38+
39+
public MembershipImport getTarget() {
40+
return (MembershipImport)super.getTarget();
3841
}
3942

4043
@Override
41-
public EList<Membership> importMemberships(Import self, EList<Membership> importedMemberships,
44+
public EList<Membership> importMemberships(EList<Membership> importedMemberships,
4245
Collection<Membership> nonpublicMemberships, Collection<Namespace> excludedNamespaces,
4346
Collection<Type> excludedTypes) {
44-
Membership importedMembership = ((MembershipImport)self).getImportedMembership();
47+
MembershipImport target = getTarget();
48+
Membership importedMembership = target.getImportedMembership();
4549
if (importedMembership != null) {
4650
importedMemberships.add(importedMembership);
47-
if (self.isRecursive()) {
51+
if (target.isRecursive()) {
4852
Element importedElement = importedMembership.getMemberElement();
4953
if (importedElement instanceof Namespace) {
5054
excludedNamespaces.add((Namespace)importedElement);
51-
importMembershipsFrom(self, (Namespace)importedElement, importedMemberships, nonpublicMemberships,
55+
importMembershipsFrom((Namespace)importedElement, importedMemberships, nonpublicMemberships,
5256
excludedNamespaces, excludedTypes, true);
5357
excludedNamespaces.remove(importedElement);
5458
}

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

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,24 @@
2121

2222
package org.omg.sysml.adapter;
2323

24+
import java.util.Collection;
25+
import java.util.HashSet;
26+
import java.util.stream.Collectors;
27+
2428
import org.eclipse.emf.common.util.EList;
29+
import org.eclipse.emf.ecore.InternalEObject;
30+
import org.eclipse.emf.ecore.util.BasicInternalEList;
31+
import org.omg.sysml.lang.sysml.Import;
2532
import org.omg.sysml.lang.sysml.Membership;
2633
import org.omg.sysml.lang.sysml.Namespace;
34+
import org.omg.sysml.lang.sysml.SysMLPackage;
35+
import org.omg.sysml.lang.sysml.Type;
36+
import org.omg.sysml.lang.sysml.VisibilityKind;
37+
import org.omg.sysml.util.NamespaceUtil;
38+
import org.omg.sysml.util.NonNotifyingEObjectEList;
2739

2840
public class NamespaceAdapter extends ElementAdapter {
2941

30-
private EList<Membership> importedMembership = null;
31-
3242
public NamespaceAdapter(Namespace element) {
3343
super(element);
3444
}
@@ -37,6 +47,49 @@ public Namespace getTarget() {
3747
return (Namespace)super.getTarget();
3848
}
3949

50+
// Additional operations
51+
52+
public EList<Membership> getImportedMembership(Collection<org.omg.sysml.lang.sysml.Namespace> excludedNamespaces, Collection<Type> excludedTypes, boolean includeAll) {
53+
Namespace target = getTarget();
54+
EList<Membership> importedMembership = new NonNotifyingEObjectEList<Membership>(Membership.class, (InternalEObject)target, SysMLPackage.NAMESPACE__IMPORTED_MEMBERSHIP);
55+
Collection<Membership> nonpublicMembership = includeAll? null: new HashSet<Membership>();
56+
if (!excludedNamespaces.contains(target)) {
57+
for (Import _import: target.getOwnedImport()) {
58+
NamespaceUtil.importMembershipsFor(_import, importedMembership, nonpublicMembership, excludedNamespaces, excludedTypes);
59+
}
60+
}
61+
if (!includeAll) {
62+
importedMembership.removeAll(nonpublicMembership);
63+
}
64+
return importedMembership;
65+
}
66+
67+
// Note: The excludedTypes parameter is need when this operation is overridden in class Type.
68+
public EList<Membership> getVisibleMemberships(Collection<org.omg.sysml.lang.sysml.Namespace> excludedNamespaces, Collection<Type> excludedTypes, boolean includeAll) {
69+
Namespace target = getTarget();
70+
EList<Membership> visibleMembership;
71+
if (includeAll) {
72+
visibleMembership = new BasicInternalEList<Membership>(Membership.class);
73+
visibleMembership.addAll(target.getOwnedMembership());
74+
} else {
75+
visibleMembership = getVisibleOwnedMembership(VisibilityKind.PUBLIC);
76+
}
77+
visibleMembership.addAll(getImportedMembership(excludedNamespaces, excludedTypes, includeAll));
78+
return visibleMembership;
79+
}
80+
81+
public EList<Membership> getVisibleOwnedMembership(VisibilityKind visibility) {
82+
Namespace target = getTarget();
83+
EList<Membership> publicMembership = new BasicInternalEList<Membership>(Membership.class);
84+
publicMembership.addAll(target.getOwnedMembership().stream().
85+
filter(membership->visibility.equals(membership.getVisibility())).collect(Collectors.toList()));
86+
return publicMembership;
87+
}
88+
89+
// Caching
90+
91+
private EList<Membership> importedMembership = null;
92+
4093
public EList<Membership> getImportedMembership() {
4194
return importedMembership;
4295
}
@@ -46,10 +99,13 @@ public EList<Membership> setImportedMembership(EList<Membership> importedMembers
4699
return importedMembership;
47100
}
48101

102+
@Override
49103
public void clearCaches() {
50104
importedMembership = null;
51105
}
52106

107+
// Transformation
108+
53109
public void addAdditionalMembers() {
54110
}
55111

0 commit comments

Comments
 (0)