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