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%2Freactor%2FSubstatementContext.java;h=4c3be3e9a2e16ad4fb2696d60a8ba9f67d6af180;hb=6436cd3443272f3c574f65546fd26dc63f3b01c6;hp=aafdfca824a378e1b94af00106b6ef354e5b001a;hpb=b5c32f072f61abfe730a386f8ffe3862491785cd;p=yangtools.git diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/SubstatementContext.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/SubstatementContext.java index aafdfca824..4c3be3e9a2 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/SubstatementContext.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/SubstatementContext.java @@ -7,6 +7,15 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.reactor; +import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier; +import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils; +import org.opendaylight.yangtools.yang.model.api.stmt.KeyStatement; +import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import java.util.List; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.GroupingUtils; +import org.opendaylight.yangtools.yang.common.QNameModule; +import java.util.Collection; +import org.opendaylight.yangtools.yang.common.QName; import com.google.common.base.Preconditions; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; @@ -14,18 +23,86 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.Namesp import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.Registry; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; -class SubstatementContext, E extends EffectiveStatement> - extends StatementContextBase { +class SubstatementContext, E extends EffectiveStatement> + extends StatementContextBase { - private final StatementContextBase parent; + private final StatementContextBase parent; + private final A argument; - SubstatementContext(StatementContextBase parent,ContextBuilder builder) throws SourceException { + SubstatementContext(StatementContextBase parent, + ContextBuilder builder) throws SourceException { super(builder); - this.parent = Preconditions.checkNotNull(parent, "Parent must not be null"); + this.parent = Preconditions.checkNotNull(parent, + "Parent must not be null"); + this.argument = builder.getDefinition().parseArgumentValue(this, + builder.getRawArgument()); + } + + @SuppressWarnings("unchecked") + SubstatementContext(SubstatementContext original, + QNameModule newQNameModule, + StatementContextBase newParent, TypeOfCopy typeOfCopy) + throws SourceException { + super(original); + this.parent = newParent; + + if (newQNameModule != null) { + if (original.argument instanceof QName) { + QName originalQName = (QName) original.argument; + this.argument = (A) QName.create(newQNameModule, + originalQName.getLocalName()); + } else if (StmtContextUtils.producesDeclared(original, + KeyStatement.class)) { + this.argument = (A) StmtContextUtils + .replaceModuleQNameForKey( + (StmtContext, KeyStatement, ?>) original, + newQNameModule); + } else { + this.argument = original.argument; + } + } else { + this.argument = original.argument; + } + + copyDeclaredStmts(original, newQNameModule, typeOfCopy); + + copyEffectiveStmts(original, newQNameModule, typeOfCopy); + } + + private void copyDeclaredStmts(SubstatementContext original, + QNameModule newQNameModule, TypeOfCopy typeOfCopy) + throws SourceException { + Collection> originalDeclaredSubstatements = original + .declaredSubstatements(); + for (StatementContextBase stmtContext : originalDeclaredSubstatements) { + if (GroupingUtils.needToCopyByUses(stmtContext)) { + StatementContextBase copy = stmtContext.createCopy( + newQNameModule, this, typeOfCopy); + this.addEffectiveSubstatement(copy); + } else if (GroupingUtils.isReusedByUses(stmtContext)) { + this.addEffectiveSubstatement(stmtContext); + } + } + } + + private void copyEffectiveStmts(SubstatementContext original, + QNameModule newQNameModule, TypeOfCopy typeOfCopy) + throws SourceException { + Collection> originalEffectiveSubstatements = original + .effectiveSubstatements(); + for (StatementContextBase stmtContext : originalEffectiveSubstatements) { + if (GroupingUtils.needToCopyByUses(stmtContext)) { + StatementContextBase copy = stmtContext.createCopy( + newQNameModule, this, typeOfCopy); + this.addEffectiveSubstatement(copy); + } else if (GroupingUtils.isReusedByUses(stmtContext)) { + this.addEffectiveSubstatement(stmtContext); + } + } } @Override - public StatementContextBase getParentContext() { + public StatementContextBase getParentContext() { return parent; } @@ -44,4 +121,55 @@ class SubstatementContext, E extends EffectiveS return parent.getRoot(); } + @Override + public A getStatementArgument() { + return argument; + } + + @Override + public StatementContextBase createCopy( + StatementContextBase newParent, TypeOfCopy typeOfCopy) + throws SourceException { + return createCopy(null, newParent, typeOfCopy); + } + + @Override + public StatementContextBase createCopy(QNameModule newQNameModule, + StatementContextBase newParent, TypeOfCopy typeOfCopy) + throws SourceException { + SubstatementContext copy = new SubstatementContext<>(this, + newQNameModule, newParent, typeOfCopy); + + copy.addAllToCopyHistory(this.getCopyHistory()); + copy.addToCopyHistory(typeOfCopy); + + if(this.getOriginalCtx() != null) { + copy.setOriginalCtx(this.getOriginalCtx()); + } else { + copy.setOriginalCtx(this); + } + + definition().onStatementAdded(copy); + return copy; + } + + @Override + public List getArgumentsFromRoot() { + List argumentsFromRoot = parent.getArgumentsFromRoot(); + argumentsFromRoot.add(argument); + return argumentsFromRoot; + } + + @Override + public List> getStmtContextsFromRoot() { + List> stmtContextsList = parent + .getStmtContextsFromRoot(); + stmtContextsList.add(this); + return stmtContextsList; + } + + @Override + public boolean isRootContext() { + return false; + } }