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