Merge "Bug 1478 - Autoboxing support"
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / builder / impl / ConstraintsBuilderImpl.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.ImmutableSet;
11 import java.util.Collections;
12 import java.util.HashSet;
13 import java.util.Set;
14 import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition;
15 import org.opendaylight.yangtools.yang.model.api.MustDefinition;
16 import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath;
17 import org.opendaylight.yangtools.yang.model.util.RevisionAwareXPathImpl;
18 import org.opendaylight.yangtools.yang.parser.builder.api.ConstraintsBuilder;
19
20 public final class ConstraintsBuilderImpl implements ConstraintsBuilder {
21     private static final ConstraintDefinitionImpl EMPTY_CONSTRAINT = new ConstraintDefinitionImpl();
22     private static final ConstraintDefinitionImpl EMPTY_MANDATORY_CONSTRAINT;
23
24     static {
25         ConstraintDefinitionImpl c = new ConstraintDefinitionImpl();
26         c.setMandatory(true);
27
28         EMPTY_MANDATORY_CONSTRAINT = c;
29     }
30
31     private final String moduleName;
32     private final int line;
33     private final Set<MustDefinition> mustDefinitions;
34     private ConstraintDefinitionImpl instance;
35     private RevisionAwareXPath whenStmt;
36     private String whenCondition;
37     private boolean mandatory;
38     private Integer min;
39     private Integer max;
40
41     public ConstraintsBuilderImpl(final String moduleName, final int line) {
42         this.moduleName = moduleName;
43         this.line = line;
44         mustDefinitions = new HashSet<>();
45     }
46
47     ConstraintsBuilderImpl(final ConstraintsBuilder b) {
48         this.moduleName = b.getModuleName();
49         this.line = b.getLine();
50         mustDefinitions = new HashSet<>(b.getMustDefinitions());
51         whenCondition = b.getWhenCondition();
52         mandatory = b.isMandatory();
53         min = b.getMinElements();
54         max = b.getMaxElements();
55     }
56
57     ConstraintsBuilderImpl(final String moduleName, final int line, final ConstraintDefinition base) {
58         this.moduleName = moduleName;
59         this.line = line;
60         whenStmt = base.getWhenCondition();
61         mustDefinitions = new HashSet<>(base.getMustConstraints());
62         mandatory = base.isMandatory();
63         min = base.getMinElements();
64         max = base.getMaxElements();
65     }
66
67     /* (non-Javadoc)
68      * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#build()
69      */
70     @Override
71     public ConstraintDefinition toInstance() {
72         if (instance != null) {
73             return instance;
74         }
75
76         if (whenStmt == null) {
77             if (whenCondition == null) {
78                 whenStmt = null;
79             } else {
80                 whenStmt = new RevisionAwareXPathImpl(whenCondition, false);
81             }
82         }
83
84         ConstraintDefinitionImpl newInstance = new ConstraintDefinitionImpl();
85         newInstance.setWhenCondition(whenStmt);
86         newInstance.setMandatory(mandatory);
87         newInstance.setMinElements(min);
88         newInstance.setMaxElements(max);
89
90         if (!mustDefinitions.isEmpty()) {
91             newInstance.setMustConstraints(mustDefinitions);
92         }
93         if (EMPTY_CONSTRAINT.equals(newInstance)) {
94             newInstance = EMPTY_CONSTRAINT;
95         } else if (EMPTY_MANDATORY_CONSTRAINT.equals(newInstance)) {
96             newInstance = EMPTY_MANDATORY_CONSTRAINT;
97         }
98
99         instance = newInstance;
100         return instance;
101     }
102
103     /* (non-Javadoc)
104      * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#getModuleName()
105      */
106     @Override
107     public String getModuleName() {
108         return moduleName;
109     }
110
111     /* (non-Javadoc)
112      * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#getLine()
113      */
114     @Override
115     public int getLine() {
116         return line;
117     }
118
119     /* (non-Javadoc)
120      * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#getMinElements()
121      */
122     @Override
123     public Integer getMinElements() {
124         return min;
125     }
126
127     /* (non-Javadoc)
128      * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#setMinElements(java.lang.Integer)
129      */
130     @Override
131     public void setMinElements(final Integer minElements) {
132         this.min = minElements;
133     }
134
135     /* (non-Javadoc)
136      * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#getMaxElements()
137      */
138     @Override
139     public Integer getMaxElements() {
140         return max;
141     }
142
143     /* (non-Javadoc)
144      * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#setMaxElements(java.lang.Integer)
145      */
146     @Override
147     public void setMaxElements(final Integer maxElements) {
148         this.max = maxElements;
149     }
150
151     /* (non-Javadoc)
152      * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#getMustDefinitions()
153      */
154     @Override
155     public Set<MustDefinition> getMustDefinitions() {
156         return mustDefinitions;
157     }
158
159     /* (non-Javadoc)
160      * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#addMustDefinition(org.opendaylight.yangtools.yang.model.api.MustDefinition)
161      */
162     @Override
163     public void addMustDefinition(final MustDefinition must) {
164         mustDefinitions.add(must);
165     }
166
167     /* (non-Javadoc)
168      * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#getWhenCondition()
169      */
170     @Override
171     public String getWhenCondition() {
172         return whenCondition;
173     }
174
175     /* (non-Javadoc)
176      * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#addWhenCondition(java.lang.String)
177      */
178     @Override
179     public void addWhenCondition(final String whenCondition) {
180         this.whenCondition = whenCondition;
181     }
182
183     /* (non-Javadoc)
184      * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#isMandatory()
185      */
186     @Override
187     public boolean isMandatory() {
188         return mandatory;
189     }
190
191     /* (non-Javadoc)
192      * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#setMandatory(boolean)
193      */
194     @Override
195     public void setMandatory(final boolean mandatory) {
196         this.mandatory = mandatory;
197     }
198
199     private static final class ConstraintDefinitionImpl implements ConstraintDefinition {
200         private RevisionAwareXPath whenCondition;
201         private Set<MustDefinition> mustConstraints = Collections.emptySet();
202         private Boolean mandatory = false;
203         private Integer minElements;
204         private Integer maxElements;
205
206         @Override
207         public RevisionAwareXPath getWhenCondition() {
208             return whenCondition;
209         }
210
211         private void setWhenCondition(final RevisionAwareXPath whenCondition) {
212             this.whenCondition = whenCondition;
213         }
214
215         @Override
216         public Set<MustDefinition> getMustConstraints() {
217             return mustConstraints;
218         }
219
220         private void setMustConstraints(final Set<MustDefinition> mustConstraints) {
221             if (mustConstraints != null) {
222                 this.mustConstraints = ImmutableSet.copyOf(mustConstraints);
223             }
224         }
225
226         @Override
227         public boolean isMandatory() {
228             return mandatory;
229         }
230
231         private void setMandatory(final boolean mandatory) {
232             this.mandatory = mandatory;
233         }
234
235         @Override
236         public Integer getMinElements() {
237             return minElements;
238         }
239
240         private void setMinElements(final Integer minElements) {
241             this.minElements = minElements;
242         }
243
244         @Override
245         public Integer getMaxElements() {
246             return maxElements;
247         }
248
249         private void setMaxElements(final Integer maxElements) {
250             this.maxElements = maxElements;
251         }
252
253         @Override
254         public int hashCode() {
255             final int prime = 31;
256             int result = 1;
257             result = prime * result + ((whenCondition == null) ? 0 : whenCondition.hashCode());
258             result = prime * result + ((mustConstraints == null) ? 0 : mustConstraints.hashCode());
259             result = prime * result + ((minElements == null) ? 0 : minElements.hashCode());
260             result = prime * result + ((maxElements == null) ? 0 : maxElements.hashCode());
261             result = prime * result + mandatory.hashCode();
262             return result;
263         }
264
265         @Override
266         public boolean equals(final Object obj) {
267             if (this == obj) {
268                 return true;
269             }
270             if (obj == null) {
271                 return false;
272             }
273             if (getClass() != obj.getClass()) {
274                 return false;
275             }
276             ConstraintDefinitionImpl other = (ConstraintDefinitionImpl) obj;
277             if (whenCondition == null) {
278                 if (other.whenCondition != null) {
279                     return false;
280                 }
281             } else if (!whenCondition.equals(other.whenCondition)) {
282                 return false;
283             }
284             if (mustConstraints == null) {
285                 if (other.mustConstraints != null) {
286                     return false;
287                 }
288             } else if (!mustConstraints.equals(other.mustConstraints)) {
289                 return false;
290             }
291             if (!mandatory.equals(other.mandatory)) {
292                 return false;
293             }
294             if (minElements == null) {
295                 if (other.minElements != null) {
296                     return false;
297                 }
298             } else if (!minElements.equals(other.minElements)) {
299                 return false;
300             }
301             if (maxElements == null) {
302                 if (other.maxElements != null) {
303                     return false;
304                 }
305             } else if (!maxElements.equals(other.maxElements)) {
306                 return false;
307             }
308             return true;
309         }
310
311         @Override
312         public String toString() {
313             StringBuilder sb = new StringBuilder(ConstraintDefinitionImpl.class.getSimpleName());
314             sb.append("[");
315             sb.append("whenCondition=").append(whenCondition);
316             sb.append(", mustConstraints=").append(mustConstraints);
317             sb.append(", mandatory=").append(mandatory);
318             sb.append(", minElements=").append(minElements);
319             sb.append(", maxElements=").append(maxElements);
320             sb.append("]");
321             return sb.toString();
322         }
323     }
324
325 }