X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-parser-rfc7950%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fparser%2Frfc7950%2Fstmt%2Fextension%2FUnrecognizedEffectiveStatementImpl.java;h=15c964557b117a3a6f44578396a94e32950d1317;hb=99d0a43d0f67ab0b98d56ac4a5b51cb7b1f76e80;hp=69eafb5d6ceb3ba6d4216d7da18810f867d6b8e1;hpb=1cc6359e5bae1459582e9262a24ca56f23bcc70f;p=yangtools.git diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/extension/UnrecognizedEffectiveStatementImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/extension/UnrecognizedEffectiveStatementImpl.java index 69eafb5d6c..15c964557b 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/extension/UnrecognizedEffectiveStatementImpl.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/extension/UnrecognizedEffectiveStatementImpl.java @@ -7,77 +7,93 @@ */ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.extension; -import java.util.Objects; -import javax.annotation.Nonnull; +import com.google.common.collect.ImmutableList; +import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.common.QNameModule; +import org.opendaylight.yangtools.yang.common.UnqualifiedQName; 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.meta.StatementDefinition; import org.opendaylight.yangtools.yang.model.api.stmt.UnrecognizedEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.UnrecognizedStatement; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.UnknownEffectiveStatementBase; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; final class UnrecognizedEffectiveStatementImpl extends UnknownEffectiveStatementBase implements UnrecognizedEffectiveStatement { + private static final Logger LOG = LoggerFactory.getLogger(UnrecognizedEffectiveStatementImpl.class); private final QName maybeQNameArgument; - private final SchemaPath path; + private final @NonNull SchemaPath path; - UnrecognizedEffectiveStatementImpl(final StmtContext ctx) { - super(ctx); + UnrecognizedEffectiveStatementImpl(final @NonNull UnrecognizedStatement declared, + final @NonNull ImmutableList> substatements, + final StmtContext ctx) { + super(ctx.getStatementArgument(), declared, substatements, ctx); // FIXME: Remove following section after fixing 4380 final UnknownSchemaNode original = (UnknownSchemaNode) ctx.getOriginalCtx().map(StmtContext::buildEffective) .orElse(null); - if (original != null) { - this.maybeQNameArgument = original.getQName(); + if (original == null) { + final QName qname = qnameFromArgument(ctx); + maybeQNameArgument = qname != null ? qname : getNodeType(); } else { - QName maybeQNameArgumentInit = null; - try { - maybeQNameArgumentInit = StmtContextUtils.qnameFromArgument(ctx, argument()); - } catch (IllegalArgumentException e) { - maybeQNameArgumentInit = getNodeType(); - } - this.maybeQNameArgument = maybeQNameArgumentInit; + maybeQNameArgument = original.getQName(); } - path = ctx.getParentContext().getSchemaPath().get().createChild(maybeQNameArgument); + + SchemaPath maybePath; + try { + maybePath = ctx.coerceParentContext().getSchemaPath() + .map(parentPath -> parentPath.createChild(maybeQNameArgument)).orElse(null); + } catch (IllegalArgumentException | SourceException e) { + LOG.debug("Cannot construct path for {}, attempting to recover", ctx, e); + maybePath = null; + } + path = maybePath; } - @Nonnull @Override public QName getQName() { return maybeQNameArgument; } - @Nonnull @Override + @Deprecated public SchemaPath getPath() { return path; } @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + Objects.hashCode(maybeQNameArgument); - result = prime * result + Objects.hashCode(path); - result = prime * result + Objects.hashCode(getNodeType()); - result = prime * result + Objects.hashCode(getNodeParameter()); - return result; + public StatementDefinition statementDefinition() { + return getDeclared().statementDefinition(); } - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; + private static QName qnameFromArgument(final StmtContext stmt) { + final String value = stmt.getStatementArgument(); + if (value == null || value.isEmpty()) { + return stmt.getPublicDefinition().getStatementName(); } - if (!(obj instanceof UnrecognizedEffectiveStatementImpl)) { - return false; + + final int colon = value.indexOf(':'); + if (colon == -1) { + final UnqualifiedQName qname = UnqualifiedQName.tryCreate(value); + return qname == null ? null : qname.bindTo(StmtContextUtils.getRootModuleQName(stmt)).intern(); } - UnrecognizedEffectiveStatementImpl other = (UnrecognizedEffectiveStatementImpl) obj; - return Objects.equals(maybeQNameArgument, other.maybeQNameArgument) && Objects.equals(path, other.path) - && Objects.equals(getNodeType(), other.getNodeType()) - && Objects.equals(getNodeParameter(), other.getNodeParameter()); + + final QNameModule qnameModule = StmtContextUtils.getModuleQNameByPrefix(stmt, value.substring(0, colon)); + if (qnameModule == null) { + return null; + } + + final int next = value.indexOf(':', colon + 1); + final String localName = next == -1 ? value.substring(colon + 1) : value.substring(colon + 1, next); + final UnqualifiedQName qname = UnqualifiedQName.tryCreate(localName); + return qname == null ? null : qname.bindTo(qnameModule).intern(); } }