Skip to content

Commit

Permalink
[344] Implement effectiveName for SysML and KerML elements
Browse files Browse the repository at this point in the history
Bug: eclipse-syson#344
Signed-off-by: Arthur Daussy <arthur.daussy@obeo.fr>
  • Loading branch information
adaussy authored and AxelRICHARD committed Jun 4, 2024
1 parent 41dd666 commit 50e50e3
Show file tree
Hide file tree
Showing 11 changed files with 316 additions and 52 deletions.
4 changes: 2 additions & 2 deletions CHANGELOG.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@
- https://github.com/eclipse-syson/syson/issues/298[#298] [syson] Add root Namespace to SysON models and libraries
- https://github.com/eclipse-syson/syson/issues/324[#324] [diagrams] Improve support for whitespaces, quotes, and special characters in direct edit
- https://github.com/eclipse-syson/syson/issues/307[#307] [diagrams] Fix parallel states tooling conditions
- https://github.com/eclipse-syson/syson/issues/269[#269] [diagrams] Handle action start and done nodes in Action Flow View diagram

- https://github.com/eclipse-syson/syson/issues/269[#269] [diagrams] Handle action start and done nodes in Action Flow View & General View diagrams
- https://github.com/eclipse-syson/syson/issues/344[#344] [metamodel] Improve implementation of getName and getShortName

=== New features

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
import org.eclipse.syson.sysml.PortConjugation;
import org.eclipse.syson.sysml.PortDefinition;
import org.eclipse.syson.sysml.SysmlPackage;
import org.eclipse.syson.sysml.helper.LabelConstants;

/**
* <!-- begin-user-doc --> An implementation of the model object '<em><b>Conjugated Port Definition</b></em>'. <!--
Expand Down Expand Up @@ -110,23 +109,10 @@ public PortConjugation basicGetOwnedPortConjugator() {
* @generated NOT
*/
@Override
public void setDeclaredName(String newDeclaredName) {
// Nothing to do here
}

/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated NOT
*/
@Override
public String getDeclaredName() {
PortDefinition originalPortDefinition = this.getOriginalPortDefinition();
if (originalPortDefinition != null) {
StringBuilder declaredName = new StringBuilder();
declaredName.append(LabelConstants.CONJUGATED);
declaredName.append(originalPortDefinition.getDeclaredName());
return declaredName.toString();
public String effectiveName() {
PortDefinition portDef = this.getOriginalPortDefinition();
if (portDef != null && portDef.getName() != null) {
return "~" + portDef.getName();
}
return null;
}
Expand All @@ -140,12 +126,14 @@ public String getDeclaredName() {
public Object eGet(int featureID, boolean resolve, boolean coreType) {
switch (featureID) {
case SysmlPackage.CONJUGATED_PORT_DEFINITION__ORIGINAL_PORT_DEFINITION:
if (resolve)
if (resolve) {
return this.getOriginalPortDefinition();
}
return this.basicGetOriginalPortDefinition();
case SysmlPackage.CONJUGATED_PORT_DEFINITION__OWNED_PORT_CONJUGATOR:
if (resolve)
if (resolve) {
return this.getOwnedPortConjugator();
}
return this.basicGetOwnedPortConjugator();
}
return super.eGet(featureID, resolve, coreType);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -362,7 +362,8 @@ public boolean isIsLibraryElement() {
*/
@Override
public String getName() {
return this.getDeclaredName();
// Return an effective name for this Element. By default this is the same as its declaredName.
return this.effectiveName();
}

/**
Expand Down Expand Up @@ -574,7 +575,8 @@ public String getQualifiedName() {
*/
@Override
public String getShortName() {
return this.getDeclaredShortName();
// Return an effective shortName for this Element. By default this is the same as its declaredShortName.
return this.effectiveShortName();
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -699,13 +699,14 @@ public boolean isFeaturedWithin(Type type) {
/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
* @generated
* @generated NOT
*/
@Override
public Feature namingFeature() {
// TODO: implement this method
// Ensure that you remove @generated or mark it @generated NOT
return null;
return this.getOwnedRedefinition().stream()
.findFirst()
.map(red -> red.getRedefiningFeature())
.orElse(null);
}

/**
Expand Down Expand Up @@ -875,6 +876,48 @@ public void eUnset(int featureID) {
super.eUnset(featureID);
}

/**
* @generated NOT
*/
@Override
public String effectiveName() {
String dName = this.getDeclaredName();
String dShortName = this.getDeclaredShortName();
final String effectiveName;
if (dName != null || dShortName != null) {
effectiveName = dName;
} else {
Feature namingFeature = this.namingFeature();
if (namingFeature != null && namingFeature != this) {
effectiveName = namingFeature.effectiveName();
} else {
effectiveName = null;
}
}
return effectiveName;
}

/**
* @generated NOT
*/
@Override
public String effectiveShortName() {
String dName = this.getDeclaredName();
String dShortName = this.getDeclaredShortName();
final String effectiveName;
if (dName != null || dShortName != null) {
effectiveName = dShortName;
} else {
Feature namingFeature = this.namingFeature();
if (namingFeature != null && namingFeature != this) {
effectiveName = namingFeature.effectiveShortName();
} else {
effectiveName = null;
}
}
return effectiveName;
}

/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,14 @@ protected LifeClassImpl() {
super();
}

/**
* @generated NOT
*/
@Override
public String effectiveName() {
return "Life";
}

/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,12 @@
import org.eclipse.emf.ecore.util.EcoreEList;
import org.eclipse.syson.sysml.ActionUsage;
import org.eclipse.syson.sysml.Element;
import org.eclipse.syson.sysml.Feature;
import org.eclipse.syson.sysml.ReferenceUsage;
import org.eclipse.syson.sysml.SysmlPackage;
import org.eclipse.syson.sysml.TextualRepresentation;
import org.eclipse.syson.sysml.TransitionUsage;
import org.eclipse.syson.sysml.Type;

/**
* <!-- begin-user-doc --> An implementation of the model object '<em><b>Reference Usage</b></em>'. <!-- end-user-doc
Expand Down Expand Up @@ -89,4 +92,17 @@ public String getDeclaredName() {
return super.getDeclaredName();
}

/**
* @generated NOT
*/
@Override
public Feature namingFeature() {
Type type = this.getOwningType();

if (type instanceof TransitionUsage transitionUsage && transitionUsage.getParameter().size() >= 2 && transitionUsage.inputParameter(2) == this) {
return transitionUsage.triggerPayloadParameter();
}
return super.namingFeature();
}

} // ReferenceUsageImpl
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,15 @@
import org.eclipse.syson.sysml.ConstraintUsage;
import org.eclipse.syson.sysml.Definition;
import org.eclipse.syson.sysml.EnumerationUsage;
import org.eclipse.syson.sysml.Feature;
import org.eclipse.syson.sysml.FeatureMembership;
import org.eclipse.syson.sysml.FlowConnectionUsage;
import org.eclipse.syson.sysml.InterfaceUsage;
import org.eclipse.syson.sysml.ItemUsage;
import org.eclipse.syson.sysml.Membership;
import org.eclipse.syson.sysml.MetadataUsage;
import org.eclipse.syson.sysml.OccurrenceUsage;
import org.eclipse.syson.sysml.OwningMembership;
import org.eclipse.syson.sysml.PartUsage;
import org.eclipse.syson.sysml.PortUsage;
import org.eclipse.syson.sysml.ReferenceUsage;
Expand Down Expand Up @@ -804,6 +806,23 @@ public EList<VariantMembership> getVariantMembership() {
return new EcoreEList.UnmodifiableEList<>(this, SysmlPackage.eINSTANCE.getUsage_VariantMembership(), data.size(), data.toArray());
}

/**
* @generated NOT
*/
@Override
public Feature namingFeature() {
OwningMembership owMembership = this.getOwningMembership();
final Feature namingFeature;
if (owMembership instanceof VariantMembership variantMembership) {
namingFeature = super.namingFeature();
} else if (this.getOwnedReferenceSubsetting() != null) {
namingFeature = this.getOwnedReferenceSubsetting().getReferencedFeature();
} else {
namingFeature = null;
}
return namingFeature;
}

/**
* <!-- begin-user-doc --> <!-- end-user-doc -->
*
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/*******************************************************************************
* Copyright (c) 2024 Obeo.
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.syson.sysml.impl;

import static org.junit.jupiter.api.Assertions.assertEquals;

import org.eclipse.syson.sysml.ConjugatedPortDefinition;
import org.eclipse.syson.sysml.PortDefinition;
import org.eclipse.syson.sysml.helper.LabelConstants;
import org.eclipse.syson.sysml.util.ModelBuilder;
import org.junit.jupiter.api.Test;

/**
* Test class for {@link ConjugatedPortDefinition}.
*
* @author Arthur Daussy
*/
public class ConjugatedPortDefinitionImplTest {

private final ModelBuilder builder = new ModelBuilder();

@Test
public void getNames() {
PortDefinition port = this.builder.createWithName(PortDefinition.class, "p1");
ConjugatedPortDefinition conjugatedPort = this.builder.createInWithName(ConjugatedPortDefinition.class, port, "unusedName");
assertEquals(LabelConstants.CONJUGATED + "p1", conjugatedPort.getName());

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/*******************************************************************************
* Copyright (c) 2024 Obeo.
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.syson.sysml.impl;

import static org.junit.Assert.assertNull;
import static org.junit.jupiter.api.Assertions.assertEquals;

import org.eclipse.syson.sysml.Feature;
import org.eclipse.syson.sysml.util.ModelBuilder;
import org.junit.jupiter.api.Test;

/**
* Test class for {@link FeatureImpl}.
*
* @author Arthur Daussy
*/
public class FeatureImplTest {

private final ModelBuilder builder = new ModelBuilder();

@Test
public void testNames() {
Feature f1 = this.builder.createWithName(Feature.class, "f1");
f1.setDeclaredShortName("f");

assertEquals("f1", f1.getName());
assertEquals("f1", f1.effectiveName());
assertEquals("f", f1.getShortName());
assertEquals("f", f1.effectiveShortName());

Feature f2 = this.builder.create(Feature.class);
assertNull(f2.getName());
assertNull(f2.effectiveName());
assertNull(f2.getShortName());
assertNull(f2.effectiveShortName());

// Test redefinition

this.builder.addRedefinition(f2, f1);
assertEquals("f1", f2.getName());
assertEquals("f1", f2.effectiveName());
assertEquals("f", f2.getShortName());
assertEquals("f", f2.effectiveShortName());
}

}
Loading

0 comments on commit 50e50e3

Please sign in to comment.