Bug 2366 - new parser API - implementation of declared statements
[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 org.opendaylight.yangtools.yang.parser.stmt.rfc6020.GroupingUtils;
11
12 import org.opendaylight.yangtools.yang.common.QNameModule;
13 import java.util.Collection;
14 import org.opendaylight.yangtools.yang.common.QName;
15 import com.google.common.base.Preconditions;
16 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
17 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
18 import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.NamespaceStorageNode;
19 import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.Registry;
20 import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
21
22 class SubstatementContext<A,D extends DeclaredStatement<A>, E extends EffectiveStatement<A, D>>
23     extends StatementContextBase<A,D,E> {
24
25     private final StatementContextBase<?,?,?> parent;
26     private final A argument;
27
28     SubstatementContext(StatementContextBase<?,?,?> parent,ContextBuilder<A,D,E> builder) throws SourceException {
29         //super(builder,  builder.getDefinition().parseArgumentValue(parent, builder.getRawArgument()));
30         super(builder);
31         this.parent = Preconditions.checkNotNull(parent, "Parent must not be null");
32         this.argument =   builder.getDefinition().parseArgumentValue(this, builder.getRawArgument());
33     }
34
35     SubstatementContext(SubstatementContext<A,D,E> original, QNameModule newQNameModule, StatementContextBase<?, ?, ?> newParent) throws SourceException {
36         super(original);
37         this.parent = newParent;
38
39         if(newQNameModule != null && original.argument instanceof QName) {
40             QName originalQName = (QName) original.argument;
41             this.argument =  (A) QName.create(newQNameModule,originalQName.getLocalName());
42         } else {
43             this.argument = original.argument;
44         }
45
46         copyDeclaredStmts(original, newQNameModule);
47
48         copyEffectiveStmts(original, newQNameModule);
49     }
50
51     private void copyDeclaredStmts(SubstatementContext<A, D, E> original,
52             QNameModule newQNameModule) throws SourceException {
53         Collection<? extends StatementContextBase<?, ?, ?>> originalDeclaredSubstatements = original
54                 .declaredSubstatements();
55         for (StatementContextBase<?, ?, ?> stmtContext : originalDeclaredSubstatements) {
56             if (GroupingUtils.needToCopyByUses(stmtContext)) {
57                 StatementContextBase<?, ?, ?> copy = stmtContext
58                         .createCopy(newQNameModule,this);
59                 this.addEffectiveSubstatement(copy);
60             } else if (GroupingUtils.isReusedByUses(stmtContext)) {
61                 this.addEffectiveSubstatement(stmtContext);
62             }
63         }
64     }
65
66     private void copyEffectiveStmts(SubstatementContext<A, D, E> original,
67             QNameModule newQNameModule) throws SourceException {
68         Collection<? extends StatementContextBase<?, ?, ?>> originalEffectiveSubstatements = original
69                 .effectiveSubstatements();
70         for (StatementContextBase<?, ?, ?> stmtContext : originalEffectiveSubstatements) {
71             if (GroupingUtils.needToCopyByUses(stmtContext)) {
72                 StatementContextBase<?, ?, ?> copy = stmtContext
73                         .createCopy(newQNameModule,this);
74                 this.addEffectiveSubstatement(copy);
75             } else if (GroupingUtils.isReusedByUses(stmtContext)) {
76                 this.addEffectiveSubstatement(stmtContext);
77             }
78         }
79     }
80
81     @Override
82     public StatementContextBase<?,?,?> getParentContext() {
83         return parent;
84     }
85
86     @Override
87     public NamespaceStorageNode getParentNamespaceStorage() {
88         return parent;
89     }
90
91     @Override
92     public Registry getBehaviourRegistry() {
93         return parent.getBehaviourRegistry();
94     }
95
96     @Override
97     public RootStatementContext<?, ?, ?> getRoot() {
98         return parent.getRoot();
99     }
100
101
102     @Override
103     public A getStatementArgument() {
104         return argument;
105     }
106
107     @Override
108     public StatementContextBase<A, D, E>  createCopy(QNameModule newQNameModule, StatementContextBase<?, ?, ?> newParent) throws SourceException {
109         StatementContextBase<A,D,E> copy = new SubstatementContext<A,D,E>(this,newQNameModule, newParent);
110         return copy;
111     }
112 }