001 /*
002 * Copyright 2002-2004 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005 * use this file except in compliance with the License. You may obtain a copy of
006 * the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013 * License for the specific language governing permissions and limitations under
014 * the License.
015 */
016 package org.springframework.rules.constraint;
017
018 import org.springframework.rules.constraint.Constraint;
019 import org.springframework.rules.closure.BinaryConstraint;
020 import org.springframework.rules.closure.StringLength;
021 import org.springframework.rules.reporting.TypeResolvable;
022 import org.springframework.util.Assert;
023
024 /**
025 * Constraint to validate an object's string length.
026 *
027 * @author Keith Donald
028 */
029 public class StringLengthConstraint extends AbstractConstraint implements TypeResolvable {
030
031 private static final long serialVersionUID = 1L;
032
033 private Constraint lengthConstraint;
034
035 private String type;
036
037 /**
038 * Constructs a maxlength constraint of the specified length.
039 *
040 * @param length
041 * the max string length
042 */
043 public StringLengthConstraint(int length) {
044 this(RelationalOperator.LESS_THAN_EQUAL_TO, length);
045 }
046
047 /**
048 * Constructs a maxlength constraint of the specified length.
049 *
050 * @param length
051 * the max string length
052 */
053 public StringLengthConstraint(int length, String type) {
054 this(RelationalOperator.LESS_THAN_EQUAL_TO, length, type);
055 }
056
057 /**
058 * Constructs a string length constraint with the specified operator and
059 * length constraint.
060 *
061 * @param operator
062 * the operator (one of ==, >, >=, <, <=)
063 * @param length
064 * the length constraint
065 */
066 public StringLengthConstraint(RelationalOperator operator, int length) {
067 this(operator, length, null);
068 }
069
070 /**
071 * Constructs a string length constraint with the specified operator and
072 * length constraint.
073 *
074 * @param operator
075 * the operator (one of ==, >, >=, <, <=)
076 * @param length
077 * the length constraint
078 * @param type
079 * Type used to resolve messages.
080 */
081 public StringLengthConstraint(RelationalOperator operator, int length, String type) {
082 Assert.notNull(operator, "The relational operator is required");
083 Assert.isTrue(length > 0, "length is required");
084 BinaryConstraint comparer = operator.getConstraint();
085 Constraint lengthConstraint = bind(comparer, length);
086 this.lengthConstraint = testResultOf(StringLength.instance(),
087 lengthConstraint);
088 this.type = type;
089 }
090
091 /**
092 * Constructs a string length range constraint.
093 *
094 * @param min
095 * The minimum edge of the range
096 * @param max
097 * the maximum edge of the range
098 */
099 public StringLengthConstraint(int min, int max) {
100 this(min, max, null);
101 }
102
103 /**
104 * Constructs a string length range constraint.
105 *
106 * @param min
107 * The minimum edge of the range
108 * @param max
109 * the maximum edge of the range
110 */
111 public StringLengthConstraint(int min, int max, String type) {
112 Constraint rangeConstraint = new Range(min, max);
113 this.lengthConstraint = testResultOf(StringLength.instance(),
114 rangeConstraint);
115 this.type = type;
116 }
117
118 /**
119 * Tests that the string form of this argument falls within the length
120 * constraint.
121 *
122 * @see Constraint#test(java.lang.Object)
123 */
124 public boolean test(Object argument) {
125 return this.lengthConstraint.test(argument);
126 }
127
128 public Constraint getPredicate() {
129 return lengthConstraint;
130 }
131
132 public String toString() {
133 return lengthConstraint.toString();
134 }
135
136 public String getType() {
137 return type;
138 }
139
140 }