package com.venky.swf.db.annotations.model.validations;
import java.util.logging.Level;
import com.venky.swf.db.model.Count;
import com.venky.swf.db.model.Model;
import com.venky.swf.db.model.reflection.ModelReflector;
import com.venky.swf.exceptions.MultiException;
import com.venky.swf.routing.Config;
import com.venky.swf.sql.Conjunction;
import com.venky.swf.sql.Expression;
import com.venky.swf.sql.Operator;
import com.venky.swf.sql.Select;
public class UniqueKeyValidator extends ModelValidator{
@Override
protected <M extends Model> boolean isValid(ModelReflector<M> reflector, M m,MultiException modelValidationException) {
for (Expression where : reflector.getUniqueKeyConditions(m,true)){
Expression countWhere = new Expression(reflector.getPool(),Conjunction.AND);
countWhere.add(where);
if (m.getId() > 0){
countWhere.add(new Expression(reflector.getPool(),"ID",Operator.NE,m.getId()));
}
Count count = new Select("COUNT(1) AS COUNT").from(reflector.getModelClass()).where(countWhere).execute(Count.class).get(0);
if (count.getCount() > 0){
modelValidationException.add(new UniqueConstraintViolatedException(reflector.getModelClass().getSimpleName() + " already present. "));
Config.instance().getLogger(getClass().getName()).log(Level.FINE, where.getRealSQL());
return false;
}
}
return true;
}
public static class UniqueConstraintViolatedException extends RuntimeException {
/**
*
*/
private static final long serialVersionUID = 6457033240437360324L;
public UniqueConstraintViolatedException(){
super();
}
public UniqueConstraintViolatedException(String message){
super(message);
}
}
}