001: package nl.knowlogy.validation.jsf.component.validator;
002:
003: import java.text.MessageFormat;
004: import java.util.Locale;
005: import java.util.ResourceBundle;
006:
007: import javax.faces.application.Application;
008: import javax.faces.application.FacesMessage;
009: import javax.faces.component.StateHolder;
010: import javax.faces.component.UIComponent;
011: import javax.faces.context.FacesContext;
012: import javax.faces.validator.Validator;
013: import javax.faces.validator.ValidatorException;
014:
015: import nl.knowlogy.validation.Message;
016: import nl.knowlogy.validation.Messages;
017: import nl.knowlogy.validation.MessagesImpl;
018: import nl.knowlogy.validation.ValidationEngine;
019: import nl.knowlogy.validation.jsf.utils.JsfUtils;
020:
021: import org.apache.log4j.Logger;
022:
023: public class JValidator implements Validator, StateHolder {
024:
025: private String containingObjectExpression;
026: private String propertyName;
027: private boolean istransient = false;
028: private static final Logger logger = Logger
029: .getLogger(JValidator.class);
030:
031: public JValidator() {
032: logger.debug("created jvalidator");
033: }
034:
035: public void validate(FacesContext facesContext,
036: UIComponent uiComponent, Object value)
037: throws ValidatorException {
038: logger
039: .debug("validating with jvalidate, for component with id ["
040: + uiComponent.getId() + "]");
041:
042: Object object = getContainingObject(facesContext, uiComponent);
043: if (object != null) {
044: Messages messages = new MessagesImpl();
045: ValidationEngine.validateProperty(object.getClass(),
046: propertyName, value, messages);
047: if (messages.getNumberOfErrorMessages() > 0) {
048: Message message = messages.getMessage(null,
049: propertyName);
050: Application application = facesContext.getApplication();
051: String messageResourceBundle = application
052: .getMessageBundle();
053: Locale locale = facesContext.getViewRoot().getLocale();
054: ResourceBundle resourceBundle = ResourceBundle
055: .getBundle(messageResourceBundle, locale);
056: convertMessage(resourceBundle, message);
057: logger.debug("signalled an error "
058: + message.getMessage());
059: throw new ValidatorException(new FacesMessage(message
060: .getMessage()));
061: }
062: } else {
063: logger.debug("object was null");
064: }
065: }
066:
067: private void convertMessage(ResourceBundle resourceBundle,
068: Message message) {
069: if (message.getMessage() == null
070: && message.getMessageCode() != null) {
071:
072: try {
073: String messagestr = resourceBundle.getString(message
074: .getMessageCode());
075: messagestr = MessageFormat.format(messagestr, message
076: .getMessageArgs());
077: message.setMessage(messagestr);
078: } catch (java.util.MissingResourceException mre) {
079: message
080: .setMessage("Field has error, no key found in resoucebundle "
081: + message.getMessageCode());
082: }
083: }
084: }
085:
086: private Object getContainingObject(FacesContext context,
087: UIComponent uiComponent) {
088: if (containingObjectExpression == null) {
089: containingObjectExpression = JsfUtils
090: .getObjectPart(uiComponent);
091: propertyName = JsfUtils.getPropertyNamePart(uiComponent);
092:
093: logger.debug("inititialize expressions, for uicomponent["
094: + uiComponent.getId() + "], object ["
095: + containingObjectExpression + "], property ["
096: + propertyName + "]");
097:
098: } else {
099: logger
100: .debug("expressions already initialized, for uicomponent["
101: + uiComponent.getId()
102: + "], object ["
103: + containingObjectExpression
104: + "], property [" + propertyName + "]");
105:
106: }
107: return JsfUtils.getBindedObject(context,
108: containingObjectExpression);
109: }
110:
111: public void restoreState(FacesContext facesContext, Object object) {
112: Object values[] = (Object[]) object;
113: if (values != null) {
114: this .containingObjectExpression = (String) values[0];
115: this .propertyName = (String) values[1];
116: logger.debug("restore state, object ["
117: + containingObjectExpression + "], property ["
118: + propertyName + "]");
119: }
120: }
121:
122: public Object saveState(FacesContext facesContext) {
123: Object values[] = new Object[2];
124: values[0] = this .containingObjectExpression;
125: values[1] = this .propertyName;
126: logger.debug("save state, object ["
127: + containingObjectExpression + "], property ["
128: + propertyName + "]");
129: return ((Object) (values));
130: }
131:
132: public void setTransient(boolean arg0) {
133: istransient = arg0;
134: }
135:
136: public boolean isTransient() {
137: return istransient;
138: }
139: }
|