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