From c7261b815824e2897e5462674d7ef409b12856f1 Mon Sep 17 00:00:00 2001 From: Axel RICHARD Date: Wed, 17 Jun 2026 09:25:39 +0200 Subject: [PATCH] ST6RI-939 Fix StackOverflow when loading a ResourceSet Signed-off-by: Axel RICHARD --- .../sysml/adapter/TransitionUsageAdapter.java | 42 ++++++++------ .../logic/TransitionUsageAdapterTest.java | 57 +++++++++++++++++++ 2 files changed, 83 insertions(+), 16 deletions(-) create mode 100644 org.omg.sysml.logic/src/test/java/org/omg/sysml/logic/TransitionUsageAdapterTest.java diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/TransitionUsageAdapter.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/TransitionUsageAdapter.java index 8f39f4205..926e5f48d 100644 --- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/TransitionUsageAdapter.java +++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/TransitionUsageAdapter.java @@ -38,6 +38,8 @@ public class TransitionUsageAdapter extends ActionUsageAdapter { + private boolean isComputingTransitionLinkConnectors = false; + public TransitionUsageAdapter(TransitionUsage element) { super(element); } @@ -103,24 +105,32 @@ protected void computeSource() { */ protected Feature computeTransitionLinkConnectors() { TransitionUsage transition = getTarget(); - Feature transitionLinkFeature = UsageUtil.getTransitionLinkFeatureOf(transition); - if (transitionLinkFeature == null) { - Succession succession = transition.getSuccession(); - if (succession != null) { - transitionLinkFeature = SysMLFactory.eINSTANCE.createReferenceUsage(); - TypeUtil.addOwnedFeatureTo(transition, transitionLinkFeature); - addBindingConnector(succession, transitionLinkFeature); - } - - List parameters = TypeUtil.getOwnedParametersOf(transition); - if (!parameters.isEmpty()) { - Feature source = transition.getSource(); - if (source != null) { - addBindingConnector(source, parameters.get(0)); + if (this.isComputingTransitionLinkConnectors) { + return UsageUtil.getTransitionLinkFeatureOf(transition); + } + this.isComputingTransitionLinkConnectors = true; + try { + Feature transitionLinkFeature = UsageUtil.getTransitionLinkFeatureOf(transition); + if (transitionLinkFeature == null) { + Succession succession = transition.getSuccession(); + if (succession != null) { + transitionLinkFeature = SysMLFactory.eINSTANCE.createReferenceUsage(); + TypeUtil.addOwnedFeatureTo(transition, transitionLinkFeature); + addBindingConnector(succession, transitionLinkFeature); + } + + List parameters = TypeUtil.getOwnedParametersOf(transition); + if (!parameters.isEmpty()) { + Feature source = transition.getSource(); + if (source != null) { + addBindingConnector(source, parameters.get(0)); + } } } + return transitionLinkFeature; + } finally { + this.isComputingTransitionLinkConnectors = false; } - return transitionLinkFeature; } @Override @@ -130,7 +140,7 @@ public void addAdditionalMembers() { computeSource(); // Note: Needs to come before clearing and recomputation of inheritance cache. //checkTransitionUsageSuccessionBindingConnector - computeTransitionLinkConnectors(); + computeTransitionLinkConnectors(); } } diff --git a/org.omg.sysml.logic/src/test/java/org/omg/sysml/logic/TransitionUsageAdapterTest.java b/org.omg.sysml.logic/src/test/java/org/omg/sysml/logic/TransitionUsageAdapterTest.java new file mode 100644 index 000000000..e281101e6 --- /dev/null +++ b/org.omg.sysml.logic/src/test/java/org/omg/sysml/logic/TransitionUsageAdapterTest.java @@ -0,0 +1,57 @@ +/******************************************************************************* + * SysML 2 Pilot Implementation + * Copyright (c) 2026 Obeo + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the Eclipse Public License as published by + * the Eclipse Foundation, version 2 of the License. + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * Eclipse Public License for more details. + * + * You should have received a copy of theEclipse Public License + * along with this program. If not, see . + * + * @license EPL-2.0 + * + *******************************************************************************/ + +package org.omg.sysml.logic; + +import static org.junit.Assert.assertNull; + +import org.junit.Test; +import org.omg.sysml.lang.sysml.Feature; +import org.omg.sysml.lang.sysml.FeatureDirectionKind; +import org.omg.sysml.lang.sysml.ParameterMembership; +import org.omg.sysml.lang.sysml.SysMLFactory; +import org.omg.sysml.lang.sysml.SysMLPackage; +import org.omg.sysml.lang.sysml.TransitionUsage; + +/** + * Tests transition derived-property computations. + */ +public class TransitionUsageAdapterTest { + /** + * The source derivation asks transition adapters to add implicit members. + * A transition with parameters but no source and no succession must not + * recursively recompute transition link connectors while its source is being + * derived. + */ + @Test + public void transitionSourceDerivationIsReentrantSafeWithoutSuccession() { + SysMLLogicStandaloneSetup.doSetup(); + SysMLPackage.eINSTANCE.eClass(); + SysMLFactory factory = SysMLFactory.eINSTANCE; + TransitionUsage transition = factory.createTransitionUsage(); + Feature parameter = factory.createFeature(); + parameter.setDirection(FeatureDirectionKind.IN); + ParameterMembership parameterMembership = factory.createParameterMembership(); + parameterMembership.setOwnedMemberParameter(parameter); + transition.getOwnedRelationship().add(parameterMembership); + assertNull(transition.getSource()); + } +}