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