d084ed0b7f7bb763dd03d16a2b752206adc366d3
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / builder / impl / IdentitySchemaNodeBuilder.java
1 /*
2  * Copyright (c) 2013 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.builder.impl;
9
10 import com.google.common.collect.ImmutableList;
11 import java.util.Collections;
12 import java.util.HashSet;
13 import java.util.List;
14 import java.util.Set;
15 import org.opendaylight.yangtools.yang.common.QName;
16 import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode;
17 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
18 import org.opendaylight.yangtools.yang.model.api.Status;
19 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
20 import org.opendaylight.yangtools.yang.parser.builder.api.AbstractSchemaNodeBuilder;
21
22 public final class IdentitySchemaNodeBuilder extends AbstractSchemaNodeBuilder {
23     private IdentitySchemaNodeImpl instance;
24     private IdentitySchemaNode baseIdentity;
25     private IdentitySchemaNodeBuilder baseIdentityBuilder;
26     private final Set<IdentitySchemaNode> derivedIdentities = new HashSet<>();
27     private String baseIdentityName;
28
29     IdentitySchemaNodeBuilder(final String moduleName, final int line, final QName qname, final SchemaPath path) {
30         super(moduleName, line, qname);
31         schemaPath = path;
32     }
33
34     IdentitySchemaNodeBuilder(final String moduleName, IdentitySchemaNode base) {
35         super(moduleName, 0, base.getQName());
36         schemaPath = base.getPath();
37         derivedIdentities.addAll(base.getDerivedIdentities());
38         unknownNodes.addAll(base.getUnknownSchemaNodes());
39     }
40
41     @Override
42     public IdentitySchemaNode build() {
43         if (instance != null) {
44             return instance;
45         }
46
47         instance = new IdentitySchemaNodeImpl(qname, schemaPath, derivedIdentities);
48
49         instance.description = description;
50         instance.reference = reference;
51         instance.status = status;
52
53         if (baseIdentityBuilder != null) {
54             baseIdentityBuilder.addDerivedIdentity(instance);
55             baseIdentity = baseIdentityBuilder.build();
56         }
57         instance.baseIdentity = baseIdentity;
58
59         // UNKNOWN NODES
60         for (UnknownSchemaNodeBuilder b : addedUnknownNodes) {
61             unknownNodes.add(b.build());
62         }
63         instance.unknownNodes = ImmutableList.copyOf(unknownNodes);
64
65         return instance;
66     }
67
68     public String getBaseIdentityName() {
69         return baseIdentityName;
70     }
71
72     public void setBaseIdentityName(final String baseIdentityName) {
73         this.baseIdentityName = baseIdentityName;
74     }
75
76     public void setBaseIdentity(final IdentitySchemaNodeBuilder baseType) {
77         this.baseIdentityBuilder = baseType;
78     }
79
80     public void addDerivedIdentity(IdentitySchemaNode derivedIdentity) {
81         if (derivedIdentity != null) {
82             derivedIdentities.add(derivedIdentity);
83         }
84     }
85
86     @Override
87     public String toString() {
88         return "identity " + qname.getLocalName();
89     }
90
91     private static final class IdentitySchemaNodeImpl implements IdentitySchemaNode {
92         private final QName qname;
93         private final SchemaPath path;
94         private IdentitySchemaNode baseIdentity;
95         private final Set<IdentitySchemaNode> derivedIdentities;
96         private String description;
97         private String reference;
98         private Status status;
99         private ImmutableList<UnknownSchemaNode> unknownNodes;
100
101         private IdentitySchemaNodeImpl(final QName qname, final SchemaPath path,
102                 final Set<IdentitySchemaNode> derivedIdentities) {
103             this.qname = qname;
104             this.path = path;
105             this.derivedIdentities = derivedIdentities;
106         }
107
108         @Override
109         public QName getQName() {
110             return qname;
111         }
112
113         @Override
114         public IdentitySchemaNode getBaseIdentity() {
115             return baseIdentity;
116         }
117
118         @Override
119         public Set<IdentitySchemaNode> getDerivedIdentities() {
120             return Collections.unmodifiableSet(derivedIdentities);
121         }
122
123         @Override
124         public String getDescription() {
125             return description;
126         }
127
128         @Override
129         public String getReference() {
130             return reference;
131         }
132
133         @Override
134         public Status getStatus() {
135             return status;
136         }
137
138         @Override
139         public SchemaPath getPath() {
140             return path;
141         }
142
143         @Override
144         public List<UnknownSchemaNode> getUnknownSchemaNodes() {
145             return unknownNodes;
146         }
147
148         @Override
149         public int hashCode() {
150             final int prime = 31;
151             int result = 1;
152             result = prime * result + ((qname == null) ? 0 : qname.hashCode());
153             result = prime * result + ((path == null) ? 0 : path.hashCode());
154             return result;
155         }
156
157         @Override
158         public boolean equals(Object obj) {
159             if (this == obj) {
160                 return true;
161             }
162             if (obj == null) {
163                 return false;
164             }
165             if (getClass() != obj.getClass()) {
166                 return false;
167             }
168             IdentitySchemaNodeImpl other = (IdentitySchemaNodeImpl) obj;
169             if (qname == null) {
170                 if (other.qname != null) {
171                     return false;
172                 }
173             } else if (!qname.equals(other.qname)) {
174                 return false;
175             }
176             if (path == null) {
177                 if (other.path != null) {
178                     return false;
179                 }
180             } else if (!path.equals(other.path)) {
181                 return false;
182             }
183             return true;
184         }
185
186         @Override
187         public String toString() {
188             StringBuilder sb = new StringBuilder(IdentitySchemaNodeImpl.class.getSimpleName());
189             sb.append("[");
190             sb.append("base=" + baseIdentity);
191             sb.append(", qname=" + qname);
192             sb.append("]");
193             return sb.toString();
194         }
195     }
196
197 }