/*
* Copyright (C) 2012 granoeste@gmail.com (https://github.com/granoeste)
*
* Licensed 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 net.granoeste.validator;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import android.content.Context;
import android.view.View;
import android.widget.TextView;
/**
* Validators
*/
public class Validators {
/** Validators */
private final Map<View, Validator[]> mValidatorMap = new HashMap<View, Validator[]>();
/** Add validations of view. */
public void put(final View v, final Validator[] validators) {
mValidatorMap.put(v, validators);
}
/** Add validations of view. */
public void put(final Context context, final ValidatableEditText v) {
final List<Validator> listValidator = new ArrayList<Validator>();
if (v.isRequired()) {
listValidator.add(
new RequiredValidator(
v.hasMessage() ? v.getMessage() :
context.getString(R.string.errors_required, v.getLabel())));
}
if (v.getMinlength() != -1) {
listValidator.add(
new MinLengthValidator(v.getMinlength(),
v.hasMessage() ? v.getMessage() :
context.getString(R.string.errors_minlength, v.getLabel(),
v.getMinlength())));
}
if (v.getMaxlength() != -1) {
listValidator.add(
new MaxLengthValidator(v.getMinlength(),
v.hasMessage() ? v.getMessage() :
context.getString(R.string.errors_maxlength, v.getLabel(),
v.getMaxlength())));
}
if (v.getMask() != null) {
listValidator.add(
new MaskValidator(v.getMask(),
v.hasMessage() ? v.getMessage() :
context.getString(R.string.errors_mask, v.getLabel())));
}
if (v.isInteger()) {
listValidator.add(
new IntValidator(
v.hasMessage() ? v.getMessage() :
context.getString(R.string.errors_isInteger, v.getLabel())));
}
if (v.isDouble()) {
listValidator.add(
new DoubleValidator(
v.hasMessage() ? v.getMessage() :
context.getString(R.string.errors_isDouble, v.getLabel())));
}
if (v.isDate()) {
listValidator.add(
new DateValidator(
v.hasMessage() ? v.getMessage() :
context.getString(R.string.errors_isDate, v.getLabel()), v
.getDateFormat(), false));
}
if (v.isRange()) {
listValidator.add(
new RangeValidator(v.getRangeFrom(), v.getRangeTo(),
v.hasMessage() ? v.getMessage() :
context.getString(R.string.errors_range,
v.getLabel(), v.getRangeFrom(), v.getRangeTo())));
}
if (v.isIntRange()) {
listValidator.add(
new IntRangeValidator(v.getIntRangeFrom(), v.getIntRangeTo(),
v.hasMessage() ? v.getMessage() :
context.getString(R.string.errors_intRange,
v.getLabel(), v.getIntRangeFrom(), v.getIntRangeTo())));
}
if (v.isDoubleRange()) {
listValidator.add(
new DoubleRangeValidator(v.getDoubleRangeFrom(), v.getDoubleRangeTo(),
v.hasMessage() ? v.getMessage() :
context.getString(R.string.errors_doubleRange,
v.getLabel(), v.getDoubleRangeFrom(),
v.getDoubleRangeTo())));
}
if (v.isEmail()) {
listValidator.add(
new EmailValidator(
v.hasMessage() ? v.getMessage() :
context.getString(R.string.errors_isEmail, v.getLabel())));
}
if (v.isUrl()) {
listValidator.add(
new UrlValidator(
v.hasMessage() ? v.getMessage() :
context.getString(R.string.errors_isUrl, v.getLabel())));
}
final Validator[] validators = listValidator.toArray(new Validator[0]);
mValidatorMap.put(v, validators);
}
/** Remove view for validators. */
public void remove(final View v) {
mValidatorMap.remove(v);
}
/** Clear validators. */
public void clear() {
mValidatorMap.clear();
}
/** Get views for validators. */
public Set<View> getAllView() {
return mValidatorMap.keySet();
}
/** Execute validation of view. */
public ValidatorResult execute(final View v) {
final Validator[] vals = mValidatorMap.get(v);
final StringBuilder sb = new StringBuilder();
for (final Validator val : vals) {
if (!val.isValid(v)) {
sb.append(val.getMessage()).append('\n');
}
}
if (sb.length() > 0) {
return new ValidatorResult(v, sb.deleteCharAt(sb.length() - 1).toString());
}
return null;
}
/** Execute validation all. */
public List<ValidatorResult> execute() {
final List<ValidatorResult> results = new ArrayList<ValidatorResult>();
final Iterator<View> i = mValidatorMap.keySet().iterator();
while (i.hasNext()) {
final View v = i.next();
final Validator[] validators = mValidatorMap.get(v);
final StringBuilder sb = new StringBuilder();
for (final Validator val : validators) {
if (!val.isValid(v)) {
sb.append(val.getMessage()).append('\n');
}
}
if (sb.length() > 0) {
results.add(new ValidatorResult(v, sb.deleteCharAt(sb.length() - 1).toString()));
}
}
return results;
}
/** Test valid for view */
public boolean isValid(final View v) {
final ValidatorResult result = execute(v);
boolean ret = false;
if (ret = result != null) {
if (result.getView() instanceof TextView) {
((TextView) result.getView()).setError(result.getMessage());
}
}
return ret;
}
/** Test valid for all view */
public boolean isValid() {
final List<ValidatorResult> results = execute();
final boolean ret = !results.isEmpty();
if (ret) {
for (final ValidatorResult result : results) {
if (result.getView() instanceof TextView) {
((TextView) result.getView()).setError(result.getMessage());
}
}
}
return ret;
}
/** Clear error of view */
public void clearError(final View v) {
if (v instanceof TextView) {
((TextView) v).setError(null);
}
}
/** Clear all error */
public void clearError() {
final Iterator<View> i = mValidatorMap.keySet().iterator();
while (i.hasNext()) {
final View v = i.next();
if (v instanceof TextView) {
((TextView) v).setError(null);
}
}
}
}