package org.infoglue.calendar.util.validators;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.Iterator;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.validator.Field;
import org.apache.commons.validator.Msg;
import org.apache.commons.validator.Validator;
import org.apache.commons.validator.ValidatorResources;
import org.apache.commons.validator.ValidatorResult;
import org.apache.commons.validator.ValidatorResults;
import org.infoglue.calendar.actions.ViewApplicationStateAction;
import org.infoglue.common.contenttypeeditor.entities.ContentTypeDefinition;
import org.infoglue.common.exceptions.ConstraintException;
import org.infoglue.common.util.ConstraintExceptionBuffer;
public class BaseValidator
{
private static Log log = LogFactory.getLog(BaseValidator.class);
/**
*
*/
public BaseValidator() {}
/**
*
*/
public ConstraintExceptionBuffer validate(ContentTypeDefinition contentTypeDefinition, String xmlAttributes)
{
try
{
BaseBean bean = new BaseBean(contentTypeDefinition, xmlAttributes);
ValidatorResources resources = loadResources(contentTypeDefinition);
Validator validator = new Validator(resources, "requiredForm");
validator.setOnlyReturnErrors(true);
validator.setParameter(Validator.BEAN_PARAM, bean);
ValidatorResults results = validator.validate();
if(results.isEmpty())
return new ConstraintExceptionBuffer();
else
return populateConstraintExceptionBuffer(results);
}
catch(Exception e)
{
return new ConstraintExceptionBuffer();
}
}
/**
*
*/
private static ConstraintExceptionBuffer populateConstraintExceptionBuffer(ValidatorResults results)
{
ConstraintExceptionBuffer ceb = new ConstraintExceptionBuffer();
Set s = results.getPropertyNames();
for(Iterator i=s.iterator(); i.hasNext(); )
{
ValidatorResult r = results.getValidatorResult((String) i.next());
Field field = r.getField();
String name = field.getKey();
for(Iterator messages=field.getMessages().values().iterator(); messages.hasNext();)
{
Msg m = (Msg) messages.next();
log.debug("Adding error message:" + name + "=" + m.getKey());
ceb.add(new ConstraintException(name, m.getKey()));
}
}
return ceb;
}
/**
*
*/
private ValidatorResources loadResources(ContentTypeDefinition contentTypeDefinition)
{
try
{
InputStream is = readValidatorXML(contentTypeDefinition);
return new ValidatorResources(is);
}
catch(Exception e)
{
log.debug(e.toString());
}
return null;
}
/**
* TODO: remove - read from ContentTypeDefinition
*/
private InputStream readValidatorXML(ContentTypeDefinition contentTypeDefinition) throws Exception
{
String xml = contentTypeDefinition.getSchemaValue();
String validationSchema = xml.substring(xml.indexOf("<form-validation>"), xml.indexOf("</form-validation>") + 18);
return new ByteArrayInputStream(validationSchema.getBytes("UTF-8"));
}
}