efb543a82392dfcd397cffa66bf6df0da89ecc46
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / effective / ExtensionEffectiveStatementImpl.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 package org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective;
9
10 import com.google.common.collect.ImmutableList;
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.parser.spi.meta.StmtContext;
21
22 public class ExtensionEffectiveStatementImpl extends AbstractEffectiveDocumentedNode<QName, ExtensionStatement>
23         implements ExtensionDefinition {
24     private final QName qname;
25     private final String argument;
26     private final SchemaPath schemaPath;
27
28     private final List<UnknownSchemaNode> unknownNodes;
29     private final boolean yin;
30
31     public ExtensionEffectiveStatementImpl(
32             final StmtContext<QName, ExtensionStatement, EffectiveStatement<QName, ExtensionStatement>> ctx) {
33         super(ctx);
34         this.qname = ctx.getStatementArgument();
35         this.schemaPath = ctx.getSchemaPath().get();
36
37         // initSubstatementCollections
38         List<UnknownSchemaNode> unknownNodesInit = new ArrayList<>();
39         for (EffectiveStatement<?, ?> effectiveStatement : effectiveSubstatements()) {
40             if (effectiveStatement instanceof UnknownSchemaNode) {
41                 UnknownSchemaNode unknownNode = (UnknownSchemaNode) effectiveStatement;
42                 unknownNodesInit.add(unknownNode);
43             }
44         }
45         this.unknownNodes = ImmutableList.copyOf(unknownNodesInit);
46
47         // initFields
48         ArgumentEffectiveStatementImpl argumentSubstatement = firstEffective(ArgumentEffectiveStatementImpl.class);
49         if (argumentSubstatement != null) {
50             this.argument = argumentSubstatement.argument().getLocalName();
51
52             YinElementEffectiveStatementImpl yinElement = argumentSubstatement
53                     .firstEffective(YinElementEffectiveStatementImpl.class);
54             if (yinElement != null) {
55                 this.yin = yinElement.argument();
56             } else {
57                 this.yin = false;
58             }
59         } else {
60             this.argument = null;
61             this.yin = false;
62         }
63     }
64
65     @Override
66     public QName getQName() {
67         return qname;
68     }
69
70     @Override
71     public SchemaPath getPath() {
72         return schemaPath;
73     }
74
75     @Override
76     public List<UnknownSchemaNode> getUnknownSchemaNodes() {
77         return unknownNodes;
78     }
79
80     @Override
81     public String getArgument() {
82         return argument;
83     }
84
85     @Override
86     public boolean isYinElement() {
87         return yin;
88     }
89
90     @Override
91     public int hashCode() {
92         final int prime = 31;
93         int result = 1;
94         result = prime * result + Objects.hashCode(qname);
95         result = prime * result + Objects.hashCode(schemaPath);
96         return result;
97     }
98
99     @Override
100     public boolean equals(final Object obj) {
101         if (this == obj) {
102             return true;
103         }
104         if (obj == null) {
105             return false;
106         }
107         if (getClass() != obj.getClass()) {
108             return false;
109         }
110         ExtensionEffectiveStatementImpl other = (ExtensionEffectiveStatementImpl) obj;
111         return Objects.equals(qname, other.qname) && Objects.equals(schemaPath, other.schemaPath);
112     }
113
114     @Override
115     public String toString() {
116         StringBuilder sb = new StringBuilder(ExtensionEffectiveStatementImpl.class.getSimpleName());
117         sb.append("[");
118         sb.append("argument=").append(argument);
119         sb.append(", qname=").append(qname);
120         sb.append(", schemaPath=").append(schemaPath);
121         sb.append(", extensionSchemaNodes=").append(unknownNodes);
122         sb.append(", yin=").append(yin);
123         sb.append("]");
124         return sb.toString();
125     }
126 }