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 extends StatementContextBase, ?, ?>> 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 extends StatementContextBase, ?, ?>> 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