Use Objects.hashCode()
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / effective / IdentityEffectiveStatementImpl.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 com.google.common.collect.ImmutableSet;
12 import java.util.Collection;
13 import java.util.Collections;
14 import java.util.HashSet;
15 import java.util.LinkedList;
16 import java.util.List;
17 import java.util.Objects;
18 import java.util.Set;
19 import org.opendaylight.yangtools.yang.common.QName;
20 import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode;
21 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
22 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
23 import org.opendaylight.yangtools.yang.model.api.stmt.IdentityStatement;
24 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
25 import org.opendaylight.yangtools.yang.parser.spi.meta.DerivedIdentitiesNamespace;
26 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
27 import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.Utils;
28
29 public class IdentityEffectiveStatementImpl extends
30         AbstractEffectiveDocumentedNode<QName, IdentityStatement> implements
31         IdentitySchemaNode {
32     private final QName qname;
33     private final SchemaPath path;
34     IdentitySchemaNode baseIdentity;
35     private ImmutableSet<IdentitySchemaNode> derivedIdentities;
36
37     ImmutableList<UnknownSchemaNode> unknownNodes;
38
39     public IdentityEffectiveStatementImpl(
40             StmtContext<QName, IdentityStatement, EffectiveStatement<QName, IdentityStatement>> ctx) {
41         super(ctx);
42
43         this.qname = ctx.getStatementArgument();
44         this.path = Utils.getSchemaPath(ctx);
45
46         initSubstatementCollections();
47         initDerivedIdentities(ctx);
48     }
49
50     private void initDerivedIdentities(
51             StmtContext<QName, IdentityStatement, EffectiveStatement<QName, IdentityStatement>> ctx) {
52
53         Set<IdentitySchemaNode> derivedIdentitiesInit = new HashSet<IdentitySchemaNode>();
54         List<StmtContext<?, ?, ?>> derivedIdentitiesCtxList = ctx.getFromNamespace(
55                 DerivedIdentitiesNamespace.class, ctx.getStatementArgument());
56
57         if(derivedIdentitiesCtxList == null) {
58             this.derivedIdentities = ImmutableSet.of();
59             return;
60         }
61
62         for (StmtContext<?, ?, ?> derivedIdentityCtx : derivedIdentitiesCtxList) {
63             IdentityEffectiveStatementImpl derivedIdentity = (IdentityEffectiveStatementImpl) derivedIdentityCtx
64                     .buildEffective();
65             derivedIdentity.initBaseIdentity(this);
66             derivedIdentitiesInit.add(derivedIdentity);
67         }
68         this.derivedIdentities = ImmutableSet.copyOf(derivedIdentitiesInit);
69     }
70
71     private void initBaseIdentity(IdentityEffectiveStatementImpl baseIdentity) {
72         this.baseIdentity = baseIdentity;
73     }
74
75     private void initSubstatementCollections() {
76         Collection<? extends EffectiveStatement<?, ?>> effectiveSubstatements = effectiveSubstatements();
77
78         List<UnknownSchemaNode> unknownNodesInit = new LinkedList<>();
79
80         for (EffectiveStatement<?, ?> effectiveStatement : effectiveSubstatements) {
81             if (effectiveStatement instanceof UnknownSchemaNode) {
82                 UnknownSchemaNode unknownNode = (UnknownSchemaNode) effectiveStatement;
83                 unknownNodesInit.add(unknownNode);
84             }
85         }
86
87         this.unknownNodes = ImmutableList.copyOf(unknownNodesInit);
88     }
89
90     @Override
91     public QName getQName() {
92         return qname;
93     }
94
95     @Override
96     public IdentitySchemaNode getBaseIdentity() {
97         return baseIdentity;
98     }
99
100     @Override
101     public Set<IdentitySchemaNode> getDerivedIdentities() {
102         return Collections.unmodifiableSet(derivedIdentities);
103     }
104
105     @Override
106     public SchemaPath getPath() {
107         return path;
108     }
109
110     @Override
111     public List<UnknownSchemaNode> getUnknownSchemaNodes() {
112         return unknownNodes;
113     }
114
115     @Override
116     public int hashCode() {
117         final int prime = 31;
118         int result = 1;
119         result = prime * result + Objects.hashCode(qname);
120         result = prime * result + Objects.hashCode(path);
121         return result;
122     }
123
124     @Override
125     public boolean equals(final Object obj) {
126         if (this == obj) {
127             return true;
128         }
129         if (obj == null) {
130             return false;
131         }
132         if (getClass() != obj.getClass()) {
133             return false;
134         }
135         IdentityEffectiveStatementImpl other = (IdentityEffectiveStatementImpl) obj;
136         if (qname == null) {
137             if (other.qname != null) {
138                 return false;
139             }
140         } else if (!qname.equals(other.qname)) {
141             return false;
142         }
143         if (path == null) {
144             if (other.path != null) {
145                 return false;
146             }
147         } else if (!path.equals(other.path)) {
148             return false;
149         }
150         return true;
151     }
152
153     @Override
154     public String toString() {
155         StringBuilder sb = new StringBuilder(
156                 IdentityEffectiveStatementImpl.class.getSimpleName());
157         sb.append("[");
158         sb.append("base=").append(baseIdentity);
159         sb.append(", qname=").append(qname);
160         sb.append("]");
161         return sb.toString();
162     }
163 }