BUG-4556: Introduce StmtContext.getSchemaPath()
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / effective / UnknownEffectiveStatementImpl.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
9 package org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective;
10
11 import java.util.ArrayList;
12 import java.util.List;
13 import java.util.Objects;
14 import org.opendaylight.yangtools.yang.common.QName;
15 import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition;
16 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
17 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
18 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
19 import org.opendaylight.yangtools.yang.model.api.stmt.ExtensionStatement;
20 import org.opendaylight.yangtools.yang.model.api.stmt.UnknownStatement;
21 import org.opendaylight.yangtools.yang.parser.spi.ExtensionNamespace;
22 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
23 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.TypeOfCopy;
24 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.Utils;
25
26 public final class UnknownEffectiveStatementImpl extends AbstractEffectiveDocumentedNode<String, UnknownStatement<String>>
27         implements UnknownSchemaNode {
28
29     private final boolean addedByUses;
30     private final boolean addedByAugmentation;
31     private final QName maybeQNameArgument;
32     private final SchemaPath path;
33     private final ExtensionDefinition extension;
34     private final List<UnknownSchemaNode> unknownNodes = new ArrayList<>();
35     private final QName nodeType;
36     private final String nodeParameter;
37
38     public UnknownEffectiveStatementImpl(final StmtContext<String, UnknownStatement<String>, ?> ctx) {
39         super(ctx);
40
41         final StmtContext<?, ExtensionStatement, EffectiveStatement<QName, ExtensionStatement>> extensionInit = ctx
42                 .getAllFromNamespace(ExtensionNamespace.class).get(ctx.getPublicDefinition().getStatementName());
43
44         if (extensionInit == null) {
45             extension = null;
46             nodeType = ctx.getPublicDefinition().getArgumentName();
47         } else {
48             extension = (ExtensionEffectiveStatementImpl) extensionInit.buildEffective();
49             nodeType = extension.getQName();
50         }
51
52         // initCopyType
53         List<TypeOfCopy> copyTypesFromOriginal = ctx.getCopyHistory();
54         if (copyTypesFromOriginal.contains(TypeOfCopy.ADDED_BY_USES_AUGMENTATION)) {
55             this.addedByUses = this.addedByAugmentation = true;
56         } else {
57             this.addedByAugmentation = copyTypesFromOriginal.contains(TypeOfCopy.ADDED_BY_AUGMENTATION);
58             this.addedByUses = copyTypesFromOriginal.contains(TypeOfCopy.ADDED_BY_USES);
59         }
60
61         // FIXME: Remove following section after fixing 4380
62         final UnknownSchemaNode original = ctx.getOriginalCtx() == null ? null : (UnknownSchemaNode) ctx
63                 .getOriginalCtx().buildEffective();
64         if (original != null) {
65             this.maybeQNameArgument = original.getQName();
66         } else {
67             QName maybeQNameArgumentInit = null;
68             try {
69                 maybeQNameArgumentInit = Utils.qNameFromArgument(ctx, argument());
70             } catch (IllegalArgumentException e) {
71                 maybeQNameArgumentInit = nodeType;
72             }
73             this.maybeQNameArgument = maybeQNameArgumentInit;
74         }
75         path = ctx.getParentContext().getSchemaPath().get().createChild(maybeQNameArgument);
76         nodeParameter = (ctx.rawStatementArgument() == null) ? "" : ctx.rawStatementArgument();
77
78         // TODO init other fields (see Bug1412Test)
79         for (final EffectiveStatement<?, ?> effectiveStatement : effectiveSubstatements()) {
80             if (effectiveStatement instanceof UnknownEffectiveStatementImpl) {
81                 unknownNodes.add((UnknownEffectiveStatementImpl) effectiveStatement);
82             }
83         }
84     }
85
86     @Override
87     public boolean isAddedByAugmentation() {
88         return addedByAugmentation;
89     }
90
91     @Override
92     public QName getNodeType() {
93         return nodeType;
94     }
95
96     @Override
97     public String getNodeParameter() {
98         return nodeParameter;
99     }
100
101     @Override
102     public boolean isAddedByUses() {
103         return addedByUses;
104     }
105
106     @Override
107     public ExtensionDefinition getExtensionDefinition() {
108         return extension;
109     }
110
111     @Override
112     public QName getQName() {
113         return maybeQNameArgument;
114     }
115
116     @Override
117     public SchemaPath getPath() {
118         return path;
119     }
120
121     @Override
122     public List<UnknownSchemaNode> getUnknownSchemaNodes() {
123         return unknownNodes;
124     }
125
126     @Override
127     public int hashCode() {
128         final int prime = 31;
129         int result = 1;
130         result = prime * result + Objects.hashCode(maybeQNameArgument);
131         result = prime * result + Objects.hashCode(path);
132         result = prime * result + Objects.hashCode(nodeType);
133         result = prime * result + Objects.hashCode(nodeParameter);
134         return result;
135     }
136
137     @Override
138     public boolean equals(final Object obj) {
139         if (this == obj) {
140             return true;
141         }
142         if (obj == null) {
143             return false;
144         }
145         if (getClass() != obj.getClass()) {
146             return false;
147         }
148         UnknownEffectiveStatementImpl other = (UnknownEffectiveStatementImpl) obj;
149         if (!Objects.equals(maybeQNameArgument, other.maybeQNameArgument)) {
150             return false;
151         }
152         if (!Objects.equals(path, other.path)) {
153             return false;
154         }
155         if (!Objects.equals(nodeType, other.nodeType)) {
156             return false;
157         }
158         if (!Objects.equals(nodeParameter, other.nodeParameter)) {
159             return false;
160         }
161         return true;
162     }
163
164     @Override
165     public String toString() {
166         StringBuilder sb = new StringBuilder();
167         sb.append(nodeType.getNamespace());
168         sb.append(":");
169         sb.append(nodeType.getLocalName());
170         sb.append(" ");
171         sb.append(nodeParameter);
172         return sb.toString();
173     }
174
175 }