package org.appfuse.webapp.services.impl; import org.apache.tapestry5.Asset; import org.apache.tapestry5.Field; import org.apache.tapestry5.MarkupWriter; import org.apache.tapestry5.ValidationDecorator; import org.apache.tapestry5.ValidationTracker; import org.apache.tapestry5.dom.Element; import org.apache.tapestry5.services.Environment; /** * Custom Implementation of the ValidationDecorator Interface * * @author Serge Eby * @version $Id: ValidationDelegate.java 5 2008-08-30 09:59:21Z serge.eby $ */ public class ValidationDelegate implements ValidationDecorator { private final Environment environment; private final Asset iconAsset; private final MarkupWriter markupWriter; public ValidationDelegate(Environment environment, Asset iconAsset, MarkupWriter markupWriter) { this.environment = environment; this.markupWriter = markupWriter; this.iconAsset = iconAsset; } public void insideField(Field field) { if (inError(field)) { if (field.isRequired() && isMissing(field)) { addErrorClassToCurrentElement("fieldMissing"); return; } addErrorClassToCurrentElement("fieldInvalid"); } } public void beforeLabel(Field field) { } public void insideLabel(Field field, Element labelElement) { if (inError(field)) { addErrorClassToCurrentElement("error"); } /* http://www.nabble.com/Problem-using-BeanEditForm-with-a-POJO-td23349016s302.html#a23352398 if (field.isRequired()) { labelElement.raw("<span class=\"req\"> *</span>"); }*/ } public void afterLabel(Field field) { } public void beforeField(Field field) { if (inError(field)) { markupWriter.element("span", "class", "fieldError"); String iconId = field.getClientId() + ":icon"; markupWriter.element("img", "src", iconAsset.toClientURL(), "alt", "", "class", "validationWarning", "id", iconId); markupWriter.end(); // img markupWriter.writeRaw(" "); String error = getError(field); if (error == null) { error = ""; } markupWriter.writeRaw(error); markupWriter.end(); // span } } public void afterField(Field field) { } private boolean inError(Field field) { ValidationTracker tracker = environment .peekRequired(ValidationTracker.class); return tracker.inError(field); } private String getError(Field field) { ValidationTracker tracker = environment .peekRequired(ValidationTracker.class); return tracker.getError(field); } private boolean isMissing(Field field) { return true; // FIXME: Determine if field wasn't populated } private void addErrorClassToCurrentElement(String errorClass) { markupWriter.getElement().addClassName(errorClass); } }