X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=yangtools.git;a=blobdiff_plain;f=yang%2Fyang-parser-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fparser%2Fstmt%2Frfc6020%2Feffective%2FExtensionEffectiveStatementImpl.java;fp=yang%2Fyang-parser-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fparser%2Fstmt%2Frfc6020%2Feffective%2FExtensionEffectiveStatementImpl.java;h=94e8e546833524b384071fd004a54abccdd4d72a;hp=4a13515b8d1f190bbbc23e2d06ebb1d675bf6dc5;hb=07a461a735316f15f9a78455e1c1c3caf91b2a3e;hpb=de990fa7c7840a1ac964a48f00aff1358eaec562 diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/ExtensionEffectiveStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/ExtensionEffectiveStatementImpl.java index 4a13515b8d..94e8e54683 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/ExtensionEffectiveStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/ExtensionEffectiveStatementImpl.java @@ -8,7 +8,9 @@ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective; import com.google.common.collect.ImmutableList; +import java.util.ArrayDeque; import java.util.ArrayList; +import java.util.Deque; import java.util.List; import java.util.Objects; import org.opendaylight.yangtools.yang.common.QName; @@ -21,6 +23,40 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; public class ExtensionEffectiveStatementImpl extends AbstractEffectiveDocumentedNode implements ExtensionDefinition { + private static final class RecursionDetector extends ThreadLocal> { + boolean check(final ExtensionEffectiveStatementImpl current) { + final Deque stack = get(); + if (stack != null) { + for (ExtensionEffectiveStatementImpl s : stack) { + if (s == current) { + return true; + } + } + } + return false; + } + + void push(final ExtensionEffectiveStatementImpl current) { + Deque stack = get(); + if (stack == null) { + stack = new ArrayDeque<>(1); + set(stack); + } + + stack.push(current); + } + + void pop() { + Deque stack = get(); + stack.pop(); + if (stack.isEmpty()) { + remove(); + } + } + } + + private static final RecursionDetector TOSTRING_DETECTOR = new RecursionDetector(); + private final QName qname; private final String argument; private final SchemaPath schemaPath; @@ -111,14 +147,32 @@ public class ExtensionEffectiveStatementImpl extends AbstractEffectiveDocumented @Override public String toString() { - StringBuilder sb = new StringBuilder(ExtensionEffectiveStatementImpl.class.getSimpleName()); - sb.append("["); - sb.append("argument=").append(argument); - sb.append(", qname=").append(qname); - sb.append(", schemaPath=").append(schemaPath); - sb.append(", extensionSchemaNodes=").append(unknownNodes); - sb.append(", yin=").append(yin); - sb.append("]"); - return sb.toString(); + if (TOSTRING_DETECTOR.check(this)) { + return recursedToString(); + } + + TOSTRING_DETECTOR.push(this); + try { + StringBuilder sb = new StringBuilder(ExtensionEffectiveStatementImpl.class.getSimpleName()); + sb.append("["); + sb.append("argument=").append(argument); + sb.append(", qname=").append(qname); + sb.append(", schemaPath=").append(schemaPath); + sb.append(", extensionSchemaNodes=").append(unknownNodes); + sb.append(", yin=").append(yin); + sb.append("]"); + return sb.toString(); + } finally { + TOSTRING_DETECTOR.pop(); + } + } + + private String recursedToString() { + return ExtensionEffectiveStatementImpl.class.getSimpleName() + "[" + + "argument=" + argument + + ", qname=" + qname + + ", schemaPath=" + schemaPath + + ", yin=" + yin + + " ]"; } }