2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.yangtools.yang.parser.stmt.reactor;
10 import java.util.List;
12 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.GroupingUtils;
13 import org.opendaylight.yangtools.yang.common.QNameModule;
14 import java.util.Collection;
15 import org.opendaylight.yangtools.yang.common.QName;
16 import com.google.common.base.Preconditions;
17 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
18 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
19 import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.NamespaceStorageNode;
20 import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.Registry;
21 import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
23 class SubstatementContext<A,D extends DeclaredStatement<A>, E extends EffectiveStatement<A, D>>
24 extends StatementContextBase<A,D,E> {
26 private final StatementContextBase<?,?,?> parent;
27 private final A argument;
29 SubstatementContext(StatementContextBase<?,?,?> parent,ContextBuilder<A,D,E> builder) throws SourceException {
30 //super(builder, builder.getDefinition().parseArgumentValue(parent, builder.getRawArgument()));
32 this.parent = Preconditions.checkNotNull(parent, "Parent must not be null");
33 this.argument = builder.getDefinition().parseArgumentValue(this, builder.getRawArgument());
36 SubstatementContext(SubstatementContext<A,D,E> original, QNameModule newQNameModule, StatementContextBase<?, ?, ?> newParent) throws SourceException {
38 this.parent = newParent;
40 if(newQNameModule != null && original.argument instanceof QName) {
41 QName originalQName = (QName) original.argument;
42 this.argument = (A) QName.create(newQNameModule,originalQName.getLocalName());
44 this.argument = original.argument;
47 copyDeclaredStmts(original, newQNameModule);
49 copyEffectiveStmts(original, newQNameModule);
52 private void copyDeclaredStmts(SubstatementContext<A, D, E> original,
53 QNameModule newQNameModule) throws SourceException {
54 Collection<? extends StatementContextBase<?, ?, ?>> originalDeclaredSubstatements = original
55 .declaredSubstatements();
56 for (StatementContextBase<?, ?, ?> stmtContext : originalDeclaredSubstatements) {
57 if (GroupingUtils.needToCopyByUses(stmtContext)) {
58 StatementContextBase<?, ?, ?> copy = stmtContext
59 .createCopy(newQNameModule,this);
60 this.addEffectiveSubstatement(copy);
61 } else if (GroupingUtils.isReusedByUses(stmtContext)) {
62 this.addEffectiveSubstatement(stmtContext);
67 private void copyEffectiveStmts(SubstatementContext<A, D, E> original,
68 QNameModule newQNameModule) throws SourceException {
69 Collection<? extends StatementContextBase<?, ?, ?>> originalEffectiveSubstatements = original
70 .effectiveSubstatements();
71 for (StatementContextBase<?, ?, ?> stmtContext : originalEffectiveSubstatements) {
72 if (GroupingUtils.needToCopyByUses(stmtContext)) {
73 StatementContextBase<?, ?, ?> copy = stmtContext
74 .createCopy(newQNameModule,this);
75 this.addEffectiveSubstatement(copy);
76 } else if (GroupingUtils.isReusedByUses(stmtContext)) {
77 this.addEffectiveSubstatement(stmtContext);
83 public StatementContextBase<?,?,?> getParentContext() {
88 public NamespaceStorageNode getParentNamespaceStorage() {
93 public Registry getBehaviourRegistry() {
94 return parent.getBehaviourRegistry();
98 public RootStatementContext<?, ?, ?> getRoot() {
99 return parent.getRoot();
104 public A getStatementArgument() {
109 public StatementContextBase<A, D, E> createCopy(QNameModule newQNameModule, StatementContextBase<?, ?, ?> newParent) throws SourceException {
110 StatementContextBase<A,D,E> copy = new SubstatementContext<A,D,E>(this,newQNameModule, newParent);
115 public List<Object> getArgumentsFromRoot() {
116 List<Object> argumentsFromRoot = parent.getArgumentsFromRoot();
117 argumentsFromRoot.add(argument);
118 return argumentsFromRoot;