package gueei.binding.labs.validation.validators;
import gueei.binding.IObservable;
import gueei.binding.Utility;
import gueei.binding.labs.validation.ValidatorBase;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import android.content.Context;
@Retention(RetentionPolicy.RUNTIME)
public @interface EqualsTo{
public Class<?> Validator() default EqualsToValidator.class;
public String Observable();
public String ErrorMessage() default "%fieldname% must be the same as %observable%";
public String ErrorMessageRes() default "";
public class EqualsToValidator extends ValidatorBase<EqualsTo> {
@Override
protected String doFormatErrorMessage(Context context,
EqualsTo parameters, String fieldName, String errorMessageFormat) {
return errorMessageFormat
.replace("%fieldname%", fieldName)
.replace("%observable%", parameters.Observable());
}
@Override
protected boolean doValidate(Context context, Object value,
EqualsTo parameters, Object model) {
try{
if (value == null) return true;
IObservable<?> observable =
Utility.getObservableForModel(context, parameters.Observable(), model);
if (observable==null) return false;
Object otherValue = observable.get();
if ((value instanceof CharSequence) && (otherValue instanceof CharSequence)){
return compareCharSequence((CharSequence)value, (CharSequence)otherValue);
}
return value.equals(otherValue);
}catch(Exception e){
e.printStackTrace();
return false;
}
}
@Override
public Class<EqualsTo> getAcceptedAnnotation() {
return EqualsTo.class;
}
private boolean compareCharSequence(CharSequence a, CharSequence b){
if(a==null||b==null) return false;
if(a.length()!=b.length()) return false;
for(int i=0; i<a.length(); i++){
if (a.charAt(i)!= b.charAt(i)) return false;
}
return true;
}
}
}