com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator Maven / Gradle / Ivy
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package com.opensymphony.xwork2.validator.validators;
import com.opensymphony.xwork2.validator.ValidationException;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.Collection;
import java.util.Objects;
/**
*
* StringLengthFieldValidator checks that a String field is of a certain length. If the "minLength"
* parameter is specified, it will make sure that the String has at least that many characters. If
* the "maxLength" parameter is specified, it will make sure that the String has at most that many
* characters. The "trim" parameter determines whether it will {@link String#trim() trim} the
* String before performing the length check. If unspecified, the String will be trimmed.
*
*
*
*
* - fieldName - The field name this validator is validating. Required if using Plain-Validator Syntax otherwise not required
* - maxLength - Integer. The max length of the field value. Default ignore.
* - minLength - Integer. The min length of the field value. Default ignore.
* - trim - (Optional) Boolean, default true. Trim the field value before evaluating its min/max length. Default true.
* - maxLengthExpression - (Optional) String. Defines the max length param as an OGNL expression
* - minLengthExpression - (Optional) String. Defines the min length param as an OGNL expression
* - trimExpression - (Optional) String. Defines th trim param as an OGNL expression
*
*
*
*
* Do not use ${minLengthExpression}, ${maxLengthExpression} and ${trimExpression} as an expression as this will turn into infinitive loop!
*
*
*
*
* <validators>
* <!-- Plain Validator Syntax -->
* <validator type="stringlength">
* <param name="fieldName">myPurchaseCode</param>
* <param name="minLength">10</param>
* <param name="maxLength">10</param>
* <param name="trim">true</param>
* <message>Your purchase code needs to be 10 characters long</message>
* </validator>
*
* <!-- Field Validator Syntax -->
* <field name="myPurchaseCode">
* <field-validator type="stringlength">
* <param name="minLength">10</param>
* <param name="maxLength">10</param>
* <param name="trim">true</param>
* <message>Your purchase code needs to be 10 characters long</message>
* </field-validator>
* </field>
*
* <!-- Field Validator Syntax with expression -->
* <field name="myPurchaseCode">
* <field-validator type="stringlength">
* <param name="minLengthExpression">${minLengthValue}</param> <!-- will be evaluated as: Integer getMinLengthValue() -->
* <param name="maxLengthExpression">${maxLengthValue}</param> <!-- will be evaluated as: Integer getMaxLengthValue() -->
* <param name="trimExpression">${trimValue}</param> <!-- will be evaluated as: boolean getTrimValue() -->
* <message>Your purchase code needs to be 10 characters long</message>
* </field-validator>
* </field>
* </validators>
*
*
*
* @author Jason Carreira
* @author Mark Woon
* @author tmjee
*/
public class StringLengthFieldValidator extends FieldValidatorSupport {
private static final Logger LOG = LogManager.getLogger(StringLengthFieldValidator.class);
private boolean trim = true;
private int maxLength = -1;
private int minLength = -1;
private String maxLengthExpression;
private String minLengthExpression;
private String trimExpression;
public void setMaxLength(int maxLength) {
this.maxLength = maxLength;
}
public void setMaxLengthExpression(String maxLengthExpression) {
this.maxLengthExpression = maxLengthExpression;
}
public int getMaxLength() {
if (StringUtils.isNotEmpty(maxLengthExpression)) {
return (Integer) parse(maxLengthExpression, Integer.class);
}
return maxLength;
}
public void setMinLength(int minLength) {
this.minLength = minLength;
}
public void setMinLengthExpression(String minLengthExpression) {
this.minLengthExpression = minLengthExpression;
}
public int getMinLength() {
if (StringUtils.isNotEmpty(minLengthExpression)) {
return (Integer) parse(minLengthExpression, Integer.class);
}
return minLength;
}
public void setTrim(boolean trim) {
this.trim = trim;
}
public void setTrimExpression(String trimExpression) {
this.trimExpression = trimExpression;
}
public boolean isTrim() {
if (StringUtils.isNotEmpty(trimExpression)) {
return (Boolean) parse(trimExpression, Boolean.class);
}
return trim;
}
public void validate(Object object) throws ValidationException {
Object fieldValue = getFieldValue(fieldName, object);
if (fieldValue == null) {
LOG.debug("Value for field {} is null, use a required validator", getFieldName());
} else if (fieldValue.getClass().isArray()) {
Object[] values = (Object[]) fieldValue;
for (Object value : values) {
validateValue(object, value);
}
} else if (Collection.class.isAssignableFrom(fieldValue.getClass())) {
Collection values = (Collection) fieldValue;
for (Object value : values) {
validateValue(object, value);
}
} else {
validateValue(object, fieldValue);
}
}
protected void validateValue(Object object, Object value) {
String stringValue = Objects.toString(value, "");
if (StringUtils.isEmpty(stringValue)) {
LOG.debug("Value is empty, use a required validator");
return;
}
if (isTrim()) {
stringValue = stringValue.trim();
if (StringUtils.isEmpty(stringValue)) {
LOG.debug("Value is empty, use a required validator");
return;
}
}
int minLengthToUse = getMinLength();
int maxLengthToUse = getMaxLength();
try {
setCurrentValue(stringValue);
if ((minLengthToUse > -1) && (stringValue.length() < minLengthToUse)) {
addFieldError(fieldName, object);
} else if ((maxLengthToUse > -1) && (stringValue.length() > maxLengthToUse)) {
addFieldError(fieldName, object);
}
} finally {
setCurrentValue(null);
}
}
}