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