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