2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
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
9 package org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective;
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;
27 public class UnknownEffectiveStatementImpl extends EffectiveStatementBase<QName, UnknownStatement<QName>> implements
30 private boolean augmenting;
31 private boolean addedByUses;
32 private UnknownSchemaNode original;
34 private final QName qName;
35 private final SchemaPath path;
36 private ExtensionDefinition extension;
37 private String description;
38 private String reference;
39 private Status status = Status.CURRENT;
40 private final List<UnknownSchemaNode> unknownNodes = new ArrayList<>();
41 private QName nodeType;
42 private String nodeParameter;
44 public UnknownEffectiveStatementImpl(final StmtContext<QName, UnknownStatement<QName>, ?> ctx) {
47 final StmtContext<?, ExtensionStatement, EffectiveStatement<QName, ExtensionStatement>> extensionInit = ctx
48 .getAllFromNamespace(ExtensionNamespace.class).get(ctx.getPublicDefinition().getStatementName());
50 if (extensionInit == null) {
52 nodeType = ctx.getPublicDefinition().getArgumentName();
54 extension = (ExtensionEffectiveStatementImpl) extensionInit.buildEffective();
55 nodeType = extension.getQName();
58 qName = ctx.getStatementArgument();
59 path = Utils.getSchemaPath(ctx);
61 nodeParameter = (ctx.rawStatementArgument() == null) ? "" : ctx.rawStatementArgument();
63 // TODO init other fields (see Bug1412Test)
65 for (final EffectiveStatement<?, ?> effectiveStatement : effectiveSubstatements()) {
66 if (effectiveStatement instanceof DescriptionEffectiveStatementImpl) {
67 description = ((DescriptionEffectiveStatementImpl) effectiveStatement).argument();
69 if (effectiveStatement instanceof ReferenceEffectiveStatementImpl) {
70 reference = ((ReferenceEffectiveStatementImpl) effectiveStatement).argument();
72 if (effectiveStatement instanceof UnknownEffectiveStatementImpl) {
73 unknownNodes.add((UnknownEffectiveStatementImpl) effectiveStatement);
80 private void initCopyType(final StmtContext<QName, UnknownStatement<QName>, ?> ctx) {
82 List<TypeOfCopy> copyTypesFromOriginal = ctx.getCopyHistory();
84 if (copyTypesFromOriginal.contains(TypeOfCopy.ADDED_BY_AUGMENTATION)) {
87 if (copyTypesFromOriginal.contains(TypeOfCopy.ADDED_BY_USES)) {
90 if (copyTypesFromOriginal.contains(TypeOfCopy.ADDED_BY_USES_AUGMENTATION)) {
91 addedByUses = augmenting = true;
94 if (ctx.getOriginalCtx() != null) {
95 original = (UnknownSchemaNode) ctx.getOriginalCtx().buildEffective();
100 public QName getNodeType() {
105 public String getNodeParameter() {
106 return nodeParameter;
110 public boolean isAddedByUses() {
115 public ExtensionDefinition getExtensionDefinition() {
120 public QName getQName() {
125 public SchemaPath getPath() {
130 public List<UnknownSchemaNode> getUnknownSchemaNodes() {
135 public String getDescription() {
140 public String getReference() {
145 public Status getStatus() {
150 public int hashCode() {
151 final int prime = 31;
153 result = prime * result + Objects.hashCode(qName);
154 result = prime * result + Objects.hashCode(path);
155 result = prime * result + Objects.hashCode(nodeType);
156 result = prime * result + Objects.hashCode(nodeParameter);
161 public boolean equals(final Object obj) {
168 if (getClass() != obj.getClass()) {
171 UnknownEffectiveStatementImpl other = (UnknownEffectiveStatementImpl) obj;
173 if (other.qName != null) {
176 } else if (!qName.equals(other.qName)) {
180 if (other.path != null) {
183 } else if (!path.equals(other.path)) {
186 if (nodeType == null) {
187 if (other.nodeType != null) {
190 } else if (!nodeType.equals(other.nodeType)) {
193 if (nodeParameter == null) {
194 if (other.nodeParameter != null) {
197 } else if (!nodeParameter.equals(other.nodeParameter)) {
204 public String toString() {
205 StringBuilder sb = new StringBuilder();
206 sb.append(nodeType.getNamespace());
208 sb.append(nodeType.getLocalName());
210 sb.append(nodeParameter);
211 return sb.toString();