X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-parser-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fparser%2Fstmt%2Frfc6020%2Feffective%2FExtensionEffectiveStatementImpl.java;h=94e8e546833524b384071fd004a54abccdd4d72a;hb=07a461a735316f15f9a78455e1c1c3caf91b2a3e;hp=f9f1d8066557af3a21c814b67d07819e0b93f688;hpb=40cc734f65f305ecb2d5d7e01b694e5e54f716e1;p=yangtools.git 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 f9f1d80665..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 @@ -7,72 +7,93 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective; -import java.util.Collection; -import java.util.LinkedList; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.Utils; -import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.ExtensionStatement; -import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; 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; import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; +import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.ExtensionStatement; +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(); -public class ExtensionEffectiveStatementImpl extends - AbstractEffectiveDocumentedNode implements - ExtensionDefinition { private final QName qname; - String argument; + private final String argument; private final SchemaPath schemaPath; - ImmutableList unknownNodes; - boolean yin; + private final List unknownNodes; + private final boolean yin; public ExtensionEffectiveStatementImpl( - StmtContext> ctx) { + final StmtContext> ctx) { super(ctx); - this.qname = ctx.getStatementArgument(); - this.schemaPath = Utils.getSchemaPath(ctx); - - initSubstatementCollections(); - initFields(); - - } + this.schemaPath = ctx.getSchemaPath().get(); - private void initFields() { + final List unknownNodesInit = new ArrayList<>(); + for (EffectiveStatement unknownNode : effectiveSubstatements()) { + if (unknownNode instanceof UnknownSchemaNode) { + unknownNodesInit.add((UnknownSchemaNode) unknownNode); + } + } + this.unknownNodes = ImmutableList.copyOf(unknownNodesInit); + // initFields ArgumentEffectiveStatementImpl argumentSubstatement = firstEffective(ArgumentEffectiveStatementImpl.class); - if (argumentSubstatement != null) { this.argument = argumentSubstatement.argument().getLocalName(); - } - - YinElementEffectiveStatementImpl yinElement = firstEffective(YinElementEffectiveStatementImpl.class); - if (yinElement != null) { - this.yin = yinElement.argument(); + YinElementEffectiveStatementImpl yinElement = argumentSubstatement + .firstEffective(YinElementEffectiveStatementImpl.class); + if (yinElement != null) { + this.yin = yinElement.argument(); + } else { + this.yin = false; + } } else { + this.argument = null; this.yin = false; } - - } - - private void initSubstatementCollections() { - Collection> effectiveSubstatements = effectiveSubstatements(); - - List unknownNodesInit = new LinkedList<>(); - - for (EffectiveStatement effectiveStatement : effectiveSubstatements) { - if (effectiveStatement instanceof UnknownSchemaNode) { - UnknownSchemaNode unknownNode = (UnknownSchemaNode) effectiveStatement; - unknownNodesInit.add(unknownNode); - } - } - - this.unknownNodes = ImmutableList.copyOf(unknownNodesInit); } @Override @@ -104,9 +125,8 @@ public class ExtensionEffectiveStatementImpl extends public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + ((qname == null) ? 0 : qname.hashCode()); - result = prime * result - + ((schemaPath == null) ? 0 : schemaPath.hashCode()); + result = prime * result + Objects.hashCode(qname); + result = prime * result + Objects.hashCode(schemaPath); return result; } @@ -122,34 +142,37 @@ public class ExtensionEffectiveStatementImpl extends return false; } ExtensionEffectiveStatementImpl other = (ExtensionEffectiveStatementImpl) obj; - if (qname == null) { - if (other.qname != null) { - return false; - } - } else if (!qname.equals(other.qname)) { - return false; - } - if (schemaPath == null) { - if (other.schemaPath != null) { - return false; - } - } else if (!schemaPath.equals(other.schemaPath)) { - return false; - } - return true; + return Objects.equals(qname, other.qname) && Objects.equals(schemaPath, other.schemaPath); } @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 + + " ]"; } -} \ No newline at end of file +}