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