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.controller.yang.model.parser.util;
10 import java.util.ArrayList;
11 import java.util.Collections;
12 import java.util.List;
14 import org.opendaylight.controller.yang.model.api.type.LengthConstraint;
15 import org.opendaylight.controller.yang.model.api.type.PatternConstraint;
16 import org.opendaylight.controller.yang.model.api.type.RangeConstraint;
17 import org.opendaylight.controller.yang.model.util.BaseConstraints;
20 * Holder object for holding YANG type constraints.
22 public final class TypeConstraints {
23 private final List<List<RangeConstraint>> ranges = new ArrayList<List<RangeConstraint>>();
24 private final List<List<LengthConstraint>> lengths = new ArrayList<List<LengthConstraint>>();
25 private final List<PatternConstraint> patterns = new ArrayList<PatternConstraint>();
26 private Integer fractionDigits;
28 List<List<RangeConstraint>> getAllRanges() {
32 public List<RangeConstraint> getRange() {
33 if(ranges.isEmpty()) {
34 List<RangeConstraint> result = Collections.emptyList();
38 List<RangeConstraint> resolved = ranges.get(0);
39 RangeConstraint firstRange = resolved.get(0);
40 RangeConstraint lastRange = resolved.get(resolved.size() - 1);
41 Number min = firstRange.getMin();
42 Number max = lastRange.getMax();
44 if (!(min instanceof UnknownBoundaryNumber)
45 && !(max instanceof UnknownBoundaryNumber)) {
49 if (firstRange == lastRange) {
50 if (min instanceof UnknownBoundaryNumber) {
51 min = resolveMinRange(min);
53 if (max instanceof UnknownBoundaryNumber) {
54 max = resolveMaxRange(max);
56 firstRange = BaseConstraints.rangeConstraint(min, max,
57 firstRange.getDescription(), firstRange.getReference());
58 resolved.set(0, firstRange);
59 lastRange = BaseConstraints.rangeConstraint(min, max,
60 lastRange.getDescription(), lastRange.getReference());
61 resolved.set(resolved.size() - 1, lastRange);
63 if (min instanceof UnknownBoundaryNumber) {
64 min = resolveMinRange(min);
65 firstRange = BaseConstraints.rangeConstraint(min,
66 firstRange.getMax(), firstRange.getDescription(),
67 firstRange.getReference());
68 resolved.set(0, firstRange);
70 if (max instanceof UnknownBoundaryNumber) {
71 max = resolveMaxRange(max);
72 lastRange = BaseConstraints.rangeConstraint(lastRange.getMin(),
73 max, lastRange.getDescription(),
74 lastRange.getReference());
75 resolved.set(resolved.size() - 1, lastRange);
81 private Number resolveMinRange(Number min) {
83 while (min instanceof UnknownBoundaryNumber) {
84 List<RangeConstraint> act = ranges.get(i);
85 min = act.get(0).getMin();
91 private Number resolveMaxRange(Number max) {
93 while (max instanceof UnknownBoundaryNumber) {
94 List<RangeConstraint> act = ranges.get(i);
95 max = act.get(act.size() - 1).getMax();
101 public void addRanges(List<RangeConstraint> ranges) {
102 if (ranges != null && ranges.size() > 0) {
103 this.ranges.add(ranges);
107 public List<List<LengthConstraint>> getAllLengths() {
111 public List<LengthConstraint> getLength() {
112 if(lengths.isEmpty()) {
113 List<LengthConstraint> result = Collections.emptyList();
117 List<LengthConstraint> resolved = lengths.get(0);
118 LengthConstraint firstLength = resolved.get(0);
119 LengthConstraint lastLength = resolved.get(resolved.size() - 1);
120 Number min = firstLength.getMin();
121 Number max = lastLength.getMax();
123 if (!(min instanceof UnknownBoundaryNumber)
124 && !(max instanceof UnknownBoundaryNumber)) {
128 if (firstLength == lastLength) {
129 if (min instanceof UnknownBoundaryNumber) {
130 min = resolveMinLength(min);
132 if (max instanceof UnknownBoundaryNumber) {
133 max = resolveMaxLength(max);
135 firstLength = BaseConstraints.lengthConstraint(min, max,
136 firstLength.getDescription(), firstLength.getReference());
137 resolved.set(0, firstLength);
138 lastLength = BaseConstraints.lengthConstraint(min, max,
139 lastLength.getDescription(), lastLength.getReference());
140 resolved.set(resolved.size() - 1, lastLength);
142 if (min instanceof UnknownBoundaryNumber) {
143 min = resolveMinLength(min);
144 firstLength = BaseConstraints.lengthConstraint(min,
145 firstLength.getMax(), firstLength.getDescription(),
146 firstLength.getReference());
147 resolved.set(0, firstLength);
149 if (max instanceof UnknownBoundaryNumber) {
150 max = resolveMaxLength(max);
151 lastLength = BaseConstraints.lengthConstraint(
152 lastLength.getMin(), max, lastLength.getDescription(),
153 lastLength.getReference());
154 resolved.set(resolved.size() - 1, lastLength);
160 private Number resolveMinLength(Number min) {
162 while (min instanceof UnknownBoundaryNumber) {
163 List<LengthConstraint> act = lengths.get(i);
164 min = act.get(0).getMin();
170 private Number resolveMaxLength(Number max) {
172 while (max instanceof UnknownBoundaryNumber) {
173 List<LengthConstraint> act = lengths.get(i);
174 max = act.get(act.size() - 1).getMax();
180 public void addLengths(List<LengthConstraint> lengths) {
181 if (lengths != null && lengths.size() > 0) {
182 this.lengths.add(lengths);
186 public List<PatternConstraint> getPatterns() {
190 public void addPatterns(List<PatternConstraint> patterns) {
191 this.patterns.addAll(patterns);
194 public Integer getFractionDigits() {
195 return fractionDigits;
198 public void setFractionDigits(Integer fractionDigits) {
199 if (this.fractionDigits == null) {
200 this.fractionDigits = fractionDigits;