package org.infoglue.cms.util.validators; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.StringWriter; import java.util.Iterator; import java.util.Set; import org.apache.commons.io.IOUtils; 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.apache.log4j.Logger; import org.infoglue.cms.entities.content.ContentVersionVO; import org.infoglue.cms.entities.management.ContentTypeDefinitionVO; import org.infoglue.cms.exception.ConstraintException; import org.infoglue.cms.util.ConstraintExceptionBuffer; public class ContentVersionValidator { private final static Logger logger = Logger.getLogger(ContentVersionValidator.class.getName()); /** * */ public ContentVersionValidator() {} /** * */ public ConstraintExceptionBuffer validate(ContentTypeDefinitionVO contentType, ContentVersionVO contentVersionVO, String languageCode) { try { ContentVersionBean bean = new ContentVersionBean(contentType, contentVersionVO, languageCode); ValidatorResources resources = loadResources(contentType, languageCode); 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, contentVersionVO, languageCode); } catch(Exception e) { return new ConstraintExceptionBuffer(); } } /** * */ private static ConstraintExceptionBuffer populateConstraintExceptionBuffer(ValidatorResults results, ContentVersionVO contentVersionVO, String languageCode) { ConstraintExceptionBuffer ceb = new ConstraintExceptionBuffer(); Set s = results.getPropertyNames(); logger.info("s:" + s); for(Iterator i=s.iterator(); i.hasNext(); ) { ValidatorResult r = results.getValidatorResult((String) i.next()); logger.info("r:" + r); Field field = r.getField(); String name = "ContentVersion" + "." + field.getKey(); for(Iterator messages=field.getMessages().values().iterator(); messages.hasNext();) { Msg m = (Msg) messages.next(); logger.info("m:" + m); String errorMessage = m.getKey(); logger.info("errorMessage: " + errorMessage); if(languageCode != null && errorMessage != null && errorMessage.contains(languageCode + "=")) { String[] languageMessages = errorMessage.split(","); for(String message : languageMessages) { if(message.contains(languageCode + "=")) errorMessage = message.substring(4, message.length() - 1); } } else if(errorMessage.contains("=[")) { String[] languageMessages = errorMessage.split(","); for(String message : languageMessages) { errorMessage = message.substring(4, message.length() - 1); break; } } ceb.add(new ConstraintException(name, errorMessage)); //ceb.add(new ConstraintException(name, m.getKey())); } } return ceb; } /** * */ private ValidatorResources loadResources(ContentTypeDefinitionVO contentType, String languageCode) { try { InputStream is = readValidatorXML(contentType, languageCode); if (logger.isTraceEnabled()) { StringWriter writer = new StringWriter(); IOUtils.copy(is, writer, "utf-8"); String theString = writer.toString(); logger.trace("is: " + theString); is.reset(); } return new ValidatorResources(is); } catch(Exception e) { logger.error("Error loading resource: " + e.getMessage()); } return null; } /** * TODO: remove - read from ContentTypeDefinition */ private InputStream readValidatorXML(ContentTypeDefinitionVO contentTypeDefinition, String languageCode) throws Exception { String xml = contentTypeDefinition.getSchemaValue(); String validationSchema = xml.substring(xml.indexOf("<form-validation>"), xml.indexOf("</form-validation>") + 18); try { int startIndex = validationSchema.indexOf("key_" + languageCode); if(startIndex > -1) { String langKey = validationSchema.substring(startIndex+8, validationSchema.indexOf("\"", startIndex+8)); if(langKey.length() > 0) validationSchema = validationSchema.replaceAll("key=", "key_default=").replaceAll("key_" + languageCode + "=", "key="); } } catch (Exception e) { logger.warn("Problem parsing content type:" + e.getMessage(), e); } return new ByteArrayInputStream(validationSchema.getBytes("UTF-8")); } }