2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.yangtools.yang.parser.builder.impl;
10 import com.google.common.collect.ImmutableSet;
11 import java.util.Collections;
12 import java.util.HashSet;
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;
20 public final class ConstraintsBuilderImpl implements ConstraintsBuilder {
21 private static final ConstraintDefinitionImpl EMPTY_CONSTRAINT = new ConstraintDefinitionImpl();
22 private static final ConstraintDefinitionImpl EMPTY_MANDATORY_CONSTRAINT;
25 ConstraintDefinitionImpl c = new ConstraintDefinitionImpl();
28 EMPTY_MANDATORY_CONSTRAINT = c;
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;
41 public ConstraintsBuilderImpl(final String moduleName, final int line) {
42 this.moduleName = moduleName;
44 mustDefinitions = new HashSet<>();
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();
57 ConstraintsBuilderImpl(final String moduleName, final int line, final ConstraintDefinition base) {
58 this.moduleName = moduleName;
60 whenStmt = base.getWhenCondition();
61 mustDefinitions = new HashSet<>(base.getMustConstraints());
62 mandatory = base.isMandatory();
63 min = base.getMinElements();
64 max = base.getMaxElements();
68 * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#build()
71 public ConstraintDefinition toInstance() {
72 if (instance != null) {
76 if (whenStmt == null) {
77 if (whenCondition == null) {
80 whenStmt = new RevisionAwareXPathImpl(whenCondition, false);
84 ConstraintDefinitionImpl newInstance = new ConstraintDefinitionImpl();
85 newInstance.setWhenCondition(whenStmt);
86 newInstance.setMandatory(mandatory);
87 newInstance.setMinElements(min);
88 newInstance.setMaxElements(max);
90 if (!mustDefinitions.isEmpty()) {
91 newInstance.setMustConstraints(mustDefinitions);
93 if (EMPTY_CONSTRAINT.equals(newInstance)) {
94 newInstance = EMPTY_CONSTRAINT;
95 } else if (EMPTY_MANDATORY_CONSTRAINT.equals(newInstance)) {
96 newInstance = EMPTY_MANDATORY_CONSTRAINT;
99 instance = newInstance;
104 * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#getModuleName()
107 public String getModuleName() {
112 * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#getLine()
115 public int getLine() {
120 * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#getMinElements()
123 public Integer getMinElements() {
128 * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#setMinElements(java.lang.Integer)
131 public void setMinElements(final Integer minElements) {
132 this.min = minElements;
136 * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#getMaxElements()
139 public Integer getMaxElements() {
144 * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#setMaxElements(java.lang.Integer)
147 public void setMaxElements(final Integer maxElements) {
148 this.max = maxElements;
152 * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#getMustDefinitions()
155 public Set<MustDefinition> getMustDefinitions() {
156 return mustDefinitions;
160 * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#addMustDefinition(org.opendaylight.yangtools.yang.model.api.MustDefinition)
163 public void addMustDefinition(final MustDefinition must) {
164 mustDefinitions.add(must);
168 * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#getWhenCondition()
171 public String getWhenCondition() {
172 return whenCondition;
176 * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#addWhenCondition(java.lang.String)
179 public void addWhenCondition(final String whenCondition) {
180 this.whenCondition = whenCondition;
184 * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#isMandatory()
187 public boolean isMandatory() {
192 * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#setMandatory(boolean)
195 public void setMandatory(final boolean mandatory) {
196 this.mandatory = mandatory;
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;
207 public RevisionAwareXPath getWhenCondition() {
208 return whenCondition;
211 private void setWhenCondition(final RevisionAwareXPath whenCondition) {
212 this.whenCondition = whenCondition;
216 public Set<MustDefinition> getMustConstraints() {
217 return mustConstraints;
220 private void setMustConstraints(final Set<MustDefinition> mustConstraints) {
221 if (mustConstraints != null) {
222 this.mustConstraints = ImmutableSet.copyOf(mustConstraints);
227 public boolean isMandatory() {
231 private void setMandatory(final boolean mandatory) {
232 this.mandatory = mandatory;
236 public Integer getMinElements() {
240 private void setMinElements(final Integer minElements) {
241 this.minElements = minElements;
245 public Integer getMaxElements() {
249 private void setMaxElements(final Integer maxElements) {
250 this.maxElements = maxElements;
254 public int hashCode() {
255 final int prime = 31;
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();
266 public boolean equals(final Object obj) {
273 if (getClass() != obj.getClass()) {
276 ConstraintDefinitionImpl other = (ConstraintDefinitionImpl) obj;
277 if (whenCondition == null) {
278 if (other.whenCondition != null) {
281 } else if (!whenCondition.equals(other.whenCondition)) {
284 if (mustConstraints == null) {
285 if (other.mustConstraints != null) {
288 } else if (!mustConstraints.equals(other.mustConstraints)) {
291 if (mandatory != other.mandatory) {
294 if (minElements == null) {
295 if (other.minElements != null) {
298 } else if (!minElements.equals(other.minElements)) {
301 if (maxElements == null) {
302 if (other.maxElements != null) {
305 } else if (!maxElements.equals(other.maxElements)) {
312 public String toString() {
313 StringBuilder sb = new StringBuilder(ConstraintDefinitionImpl.class.getSimpleName());
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);
321 return sb.toString();