Revert Merge "Bug 2366: new parser - Types & TypeDefs"
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / reactor / SubstatementContext.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.yangtools.yang.parser.stmt.reactor;
9
10 import java.util.List;
11
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;
22
23 class SubstatementContext<A,D extends DeclaredStatement<A>, E extends EffectiveStatement<A, D>>
24     extends StatementContextBase<A,D,E> {
25
26     private final StatementContextBase<?,?,?> parent;
27     private final A argument;
28
29     SubstatementContext(StatementContextBase<?,?,?> parent,ContextBuilder<A,D,E> builder) throws SourceException {
30         //super(builder,  builder.getDefinition().parseArgumentValue(parent, builder.getRawArgument()));
31         super(builder);
32         this.parent = Preconditions.checkNotNull(parent, "Parent must not be null");
33         this.argument =   builder.getDefinition().parseArgumentValue(this, builder.getRawArgument());
34     }
35
36     SubstatementContext(SubstatementContext<A,D,E> original, QNameModule newQNameModule, StatementContextBase<?, ?, ?> newParent) throws SourceException {
37         super(original);
38         this.parent = newParent;
39
40         if(newQNameModule != null && original.argument instanceof QName) {
41             QName originalQName = (QName) original.argument;
42             this.argument =  (A) QName.create(newQNameModule,originalQName.getLocalName());
43         } else {
44             this.argument = original.argument;
45         }
46
47         copyDeclaredStmts(original, newQNameModule);
48
49         copyEffectiveStmts(original, newQNameModule);
50     }
51
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);
63             }
64         }
65     }
66
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);
78             }
79         }
80     }
81
82     @Override
83     public StatementContextBase<?,?,?> getParentContext() {
84         return parent;
85     }
86
87     @Override
88     public NamespaceStorageNode getParentNamespaceStorage() {
89         return parent;
90     }
91
92     @Override
93     public Registry getBehaviourRegistry() {
94         return parent.getBehaviourRegistry();
95     }
96
97     @Override
98     public RootStatementContext<?, ?, ?> getRoot() {
99         return parent.getRoot();
100     }
101
102
103     @Override
104     public A getStatementArgument() {
105         return argument;
106     }
107
108     @Override
109     public StatementContextBase<A, D, E>  createCopy(QNameModule newQNameModule, StatementContextBase<?, ?, ?> newParent) throws SourceException {
110         return new SubstatementContext<>(this,newQNameModule, newParent);
111     }
112
113     @Override
114     public List<Object> getArgumentsFromRoot() {
115         List<Object> argumentsFromRoot = parent.getArgumentsFromRoot();
116         argumentsFromRoot.add(argument);
117         return argumentsFromRoot;
118     }
119
120
121 }