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 java.util.Collections;
11 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 import com.google.common.collect.ImmutableSet;
22 public final class ConstraintsBuilderImpl implements ConstraintsBuilder {
23 private static final ConstraintDefinitionImpl EMPTY_CONSTRAINT = new ConstraintDefinitionImpl();
24 private static final ConstraintDefinitionImpl EMPTY_MANDATORY_CONSTRAINT;
27 ConstraintDefinitionImpl c = new ConstraintDefinitionImpl();
30 EMPTY_MANDATORY_CONSTRAINT = c;
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;
43 public ConstraintsBuilderImpl(final String moduleName, final int line) {
44 this.moduleName = moduleName;
46 mustDefinitions = new HashSet<MustDefinition>();
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();
59 ConstraintsBuilderImpl(final String moduleName, final int line, final ConstraintDefinition base) {
60 this.moduleName = moduleName;
62 whenStmt = base.getWhenCondition();
63 mustDefinitions = new HashSet<MustDefinition>(base.getMustConstraints());
64 mandatory = base.isMandatory();
65 min = base.getMinElements();
66 max = base.getMaxElements();
70 * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#build()
73 public ConstraintDefinition toInstance() {
74 if (instance != null) {
78 if (whenStmt == null) {
79 if (whenCondition == null) {
82 whenStmt = new RevisionAwareXPathImpl(whenCondition, false);
86 ConstraintDefinitionImpl newInstance = new ConstraintDefinitionImpl();
87 newInstance.setWhenCondition(whenStmt);
88 newInstance.setMandatory(mandatory);
89 newInstance.setMinElements(min);
90 newInstance.setMaxElements(max);
92 if (!mustDefinitions.isEmpty()) {
93 newInstance.setMustConstraints(mustDefinitions);
95 if (EMPTY_CONSTRAINT.equals(newInstance)) {
96 newInstance = EMPTY_CONSTRAINT;
97 } else if (EMPTY_MANDATORY_CONSTRAINT.equals(newInstance)) {
98 newInstance = EMPTY_MANDATORY_CONSTRAINT;
101 instance = newInstance;
106 * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#getModuleName()
109 public String getModuleName() {
114 * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#getLine()
117 public int getLine() {
122 * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#getMinElements()
125 public Integer getMinElements() {
130 * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#setMinElements(java.lang.Integer)
133 public void setMinElements(final Integer minElements) {
134 this.min = minElements;
138 * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#getMaxElements()
141 public Integer getMaxElements() {
146 * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#setMaxElements(java.lang.Integer)
149 public void setMaxElements(final Integer maxElements) {
150 this.max = maxElements;
154 * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#getMustDefinitions()
157 public Set<MustDefinition> getMustDefinitions() {
158 return mustDefinitions;
162 * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#addMustDefinition(org.opendaylight.yangtools.yang.model.api.MustDefinition)
165 public void addMustDefinition(final MustDefinition must) {
166 mustDefinitions.add(must);
170 * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#getWhenCondition()
173 public String getWhenCondition() {
174 return whenCondition;
178 * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#addWhenCondition(java.lang.String)
181 public void addWhenCondition(final String whenCondition) {
182 this.whenCondition = whenCondition;
186 * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#isMandatory()
189 public boolean isMandatory() {
194 * @see org.opendaylight.yangtools.yang.parser.builder.impl.IConstraintsBuilder#setMandatory(boolean)
197 public void setMandatory(final boolean mandatory) {
198 this.mandatory = mandatory;
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;
209 public RevisionAwareXPath getWhenCondition() {
210 return whenCondition;
213 private void setWhenCondition(final RevisionAwareXPath whenCondition) {
214 this.whenCondition = whenCondition;
218 public Set<MustDefinition> getMustConstraints() {
219 return mustConstraints;
222 private void setMustConstraints(final Set<MustDefinition> mustConstraints) {
223 if (mustConstraints != null) {
224 this.mustConstraints = ImmutableSet.copyOf(mustConstraints);
229 public boolean isMandatory() {
233 private void setMandatory(final boolean mandatory) {
234 this.mandatory = mandatory;
238 public Integer getMinElements() {
242 private void setMinElements(final Integer minElements) {
243 this.minElements = minElements;
247 public Integer getMaxElements() {
251 private void setMaxElements(final Integer maxElements) {
252 this.maxElements = maxElements;
256 public int hashCode() {
257 final int prime = 31;
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();
268 public boolean equals(final Object obj) {
275 if (getClass() != obj.getClass()) {
278 ConstraintDefinitionImpl other = (ConstraintDefinitionImpl) obj;
279 if (whenCondition == null) {
280 if (other.whenCondition != null) {
283 } else if (!whenCondition.equals(other.whenCondition)) {
286 if (mustConstraints == null) {
287 if (other.mustConstraints != null) {
290 } else if (!mustConstraints.equals(other.mustConstraints)) {
293 if (mandatory != other.mandatory) {
296 if (minElements == null) {
297 if (other.minElements != null) {
300 } else if (!minElements.equals(other.minElements)) {
303 if (maxElements == null) {
304 if (other.maxElements != null) {
307 } else if (!maxElements.equals(other.maxElements)) {
314 public String toString() {
315 StringBuilder sb = new StringBuilder(ConstraintDefinitionImpl.class.getSimpleName());
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);
323 return sb.toString();