Skip to content

Commit 16e927c

Browse files
committed
fix StackOverflowError while replacing the ProxyCompositeNode delegate
fix StackOverflowError such as: at org.eclipse.xtext.nodemodel.util.NodeModelUtils.findNodesForFeature(NodeModelUtils.java:129) ~[org.eclipse.xtext_2.37.0.v20241119-0857.jar:?] at com.avaloq.tools.ddk.xtext.util.ParseTreeUtil.getParsedStringUnchecked(ParseTreeUtil.java:145) ~[com.avaloq.tools.ddk.xtext_14.5.0.v20250117-2009.jar:?] at com.avaloq.tools.ddk.xtext.util.ParseTreeUtil.getParsedString(ParseTreeUtil.java:94) ~[com.avaloq.tools.ddk.xtext_14.5.0.v20250117-2009.jar:?] at com.avaloq.tools.ddk.xtext.util.ParseTreeUtil.getParsedString(ParseTreeUtil.java:75) ~[com.avaloq.tools.ddk.xtext_14.5.0.v20250117-2009.jar:?] at com.avaloq.tools.dsl.avqscript.avqscript.impl.FeatureCallImplCustom.toString(FeatureCallImplCustom.java:38) ~[com.avaloq.tools.dsl.avqscript.core_19.5.0.v20250119-1823-J170-NIGHTLY.jar:?] at com.avaloq.tools.dsl.avqscript.avqscript.impl.ChainedFeatureCallImplCustom.toString(ChainedFeatureCallImplCustom.java:48) ~[com.avaloq.tools.dsl.avqscript.core_19.5.0.v20250119-1823-J170-NIGHTLY.jar:?] at java.lang.String.valueOf(String.java:4220) ~[?:?] at com.avaloq.tools.ddk.xtext.resource.persistence.ProxyCompositeNode.delegate(ProxyCompositeNode.java:177) ~[com.avaloq.tools.ddk.xtext_14.5.0.v20250117-2009.jar:?] at com.avaloq.tools.ddk.xtext.resource.persistence.ProxyCompositeNode.utils(ProxyCompositeNode.java:399) ~[com.avaloq.tools.ddk.xtext_14.5.0.v20250117-2009.jar:?] at org.eclipse.xtext.nodemodel.util.NodeModelUtils.findActualNodeFor(NodeModelUtils.java:160) ~[org.eclipse.xtext_2.37.0.v20241119-0857.jar:?] at org.eclipse.xtext.nodemodel.util.NodeModelUtils.findNodesForFeature(NodeModelUtils.java:129) ~[org.eclipse.xtext_2.37.0.v20241119-0857.jar:?] at com.avaloq.tools.ddk.xtext.util.ParseTreeUtil.getParsedStringUnchecked(ParseTreeUtil.java:145) ~[com.avaloq.tools.ddk.xtext_14.5.0.v20250117-2009.jar:?] at com.avaloq.tools.ddk.xtext.util.ParseTreeUtil.getParsedString(ParseTreeUtil.java:94) ~[com.avaloq.tools.ddk.xtext_14.5.0.v20250117-2009.jar:?] at com.avaloq.tools.ddk.xtext.util.ParseTreeUtil.getParsedString(ParseTreeUtil.java:75) ~[com.avaloq.tools.ddk.xtext_14.5.0.v20250117-2009.jar:?] at com.avaloq.tools.dsl.avqscript.avqscript.impl.FeatureCallImplCustom.toString(FeatureCallImplCustom.java:38) ~[com.avaloq.tools.dsl.avqscript.core_19.5.0.v20250119-1823-J170-NIGHTLY.jar:?] at com.avaloq.tools.dsl.avqscript.avqscript.impl.ChainedFeatureCallImplCustom.toString(ChainedFeatureCallImplCustom.java:48) ~[com.avaloq.tools.dsl.avqscript.core_19.5.0.v20250119-1823-J170-NIGHTLY.jar:?] at java.lang.String.valueOf(String.java:4220) ~[?:?] at com.avaloq.tools.ddk.xtext.resource.persistence.ProxyCompositeNode.delegate(ProxyCompositeNode.java:177) ~[com.avaloq.tools.ddk.xtext_14.5.0.v20250117-2009.jar:?] at com.avaloq.tools.ddk.xtext.resource.persistence.ProxyCompositeNode.utils(ProxyCompositeNode.java:399) ~[com.avaloq.tools.ddk.xtext_14.5.0.v20250117-2009.jar:?] ...
1 parent 8e4afb3 commit 16e927c

File tree

1 file changed

+26
-1
lines changed

1 file changed

+26
-1
lines changed

com.avaloq.tools.ddk.xtext/src/com/avaloq/tools/ddk/xtext/resource/persistence/ProxyCompositeNode.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.eclipse.emf.common.util.URI;
2323
import org.eclipse.emf.common.util.WrappedException;
2424
import org.eclipse.emf.ecore.EObject;
25+
import org.eclipse.emf.ecore.InternalEObject;
2526
import org.eclipse.emf.ecore.resource.Resource;
2627
import org.eclipse.emf.ecore.util.EContentsEList.FeatureIterator;
2728
import org.eclipse.emf.ecore.util.EContentsEList.Filterable;
@@ -174,14 +175,38 @@ private CompositeNode delegate() {
174175
ICompositeNode compositeNode = NodeModelUtils.getNode(semanticElement);
175176
if (!(compositeNode instanceof CompositeNode)) {
176177
URI uri = EcoreUtil.getURI(semanticElement);
177-
throw new IllegalStateException("No composite node found for " + uri.toString() + " (" + semanticElement + "). Found " + compositeNode); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
178+
throw new IllegalStateException("No composite node found for " + uri.toString() + " (" + toString(semanticElement) + "). Found " + compositeNode); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
178179
}
179180
delegate = (CompositeNode) compositeNode;
180181
}
181182
}
182183
return delegate;
183184
}
184185

186+
/**
187+
* A safe to string method that does not rely on possible custom implementations based on {@link org.eclipse.emf.ecore.impl.BasicEObjectImpl#toString()}.
188+
* <p>
189+
* Some custom implementations use the node model to give extra information,
190+
* and this does not work when the node model is being replaced.
191+
* </p>
192+
*
193+
* @param eObject
194+
* the EObject
195+
* @return the string
196+
*/
197+
private String toString(final EObject eObject) {
198+
StringBuilder result = new StringBuilder(eObject.getClass().getName());
199+
result.append('@');
200+
result.append(Integer.toHexString(hashCode()));
201+
202+
if (eObject.eIsProxy() && eObject instanceof InternalEObject internal) {
203+
result.append(" (eProxyURI: "); //$NON-NLS-1$
204+
result.append(internal.eProxyURI());
205+
result.append(')');
206+
}
207+
return result.toString();
208+
}
209+
185210
@Override
186211
@SuppressFBWarnings("EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_THIS")
187212
public boolean equals(final Object obj) {

0 commit comments

Comments
 (0)