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