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<String, UnknownStatement<String>> implements
30 private boolean augmenting;
31 private boolean addedByUses;
32 private UnknownSchemaNode original;
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;
44 public UnknownEffectiveStatementImpl(final StmtContext<String, UnknownStatement<String>, ?> 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 List<TypeOfCopy> copyTypesFromOriginal = ctx.getCopyHistory();
60 if (copyTypesFromOriginal.contains(TypeOfCopy.ADDED_BY_AUGMENTATION)) {
63 if (copyTypesFromOriginal.contains(TypeOfCopy.ADDED_BY_USES)) {
66 if (copyTypesFromOriginal.contains(TypeOfCopy.ADDED_BY_USES_AUGMENTATION)) {
67 addedByUses = augmenting = true;
70 if (ctx.getOriginalCtx() != null) {
71 original = (UnknownSchemaNode) ctx.getOriginalCtx().buildEffective();
74 // FIXME: Remove following section after fixing 4380
75 if(original != null) {
76 maybeQNameArgument = original.getQName();
79 maybeQNameArgument = Utils.qNameFromArgument(ctx, argument());
80 } catch (IllegalArgumentException e) {
81 maybeQNameArgument = nodeType;
84 path = Utils.getSchemaPath(ctx.getParentContext()).createChild(maybeQNameArgument);
85 nodeParameter = (ctx.rawStatementArgument() == null) ? "" : ctx.rawStatementArgument();
87 // TODO init other fields (see Bug1412Test)
89 for (final EffectiveStatement<?, ?> effectiveStatement : effectiveSubstatements()) {
90 if (effectiveStatement instanceof DescriptionEffectiveStatementImpl) {
91 description = ((DescriptionEffectiveStatementImpl) effectiveStatement).argument();
93 if (effectiveStatement instanceof ReferenceEffectiveStatementImpl) {
94 reference = ((ReferenceEffectiveStatementImpl) effectiveStatement).argument();
96 if (effectiveStatement instanceof UnknownEffectiveStatementImpl) {
97 unknownNodes.add((UnknownEffectiveStatementImpl) effectiveStatement);
104 public QName getNodeType() {
109 public String getNodeParameter() {
110 return nodeParameter;
114 public boolean isAddedByUses() {
119 public ExtensionDefinition getExtensionDefinition() {
124 public QName getQName() {
125 return maybeQNameArgument;
129 public SchemaPath getPath() {
134 public List<UnknownSchemaNode> getUnknownSchemaNodes() {
139 public String getDescription() {
144 public String getReference() {
149 public Status getStatus() {
154 public int hashCode() {
155 final int prime = 31;
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);
165 public boolean equals(final Object obj) {
172 if (getClass() != obj.getClass()) {
175 UnknownEffectiveStatementImpl other = (UnknownEffectiveStatementImpl) obj;
176 if (!Objects.equals(maybeQNameArgument, other.maybeQNameArgument)) {
179 if (!Objects.equals(path, other.path)) {
182 if (!Objects.equals(nodeType, other.nodeType)) {
185 if (!Objects.equals(nodeParameter, other.nodeParameter)) {
192 public String toString() {
193 StringBuilder sb = new StringBuilder();
194 sb.append(nodeType.getNamespace());
196 sb.append(nodeType.getLocalName());
198 sb.append(nodeParameter);
199 return sb.toString();