Martin, this was a valiant attempt, but you've just destroyed facelets
compatibility for all of the validator components using the message
attribute.
Please don't put any processing logic in the Tag classes. In fact,
I'm hoping that we will soon code-generate all jsf Tag classes since
they should all be cookie-cutter pass-through implementations.
You need to handle the various checking and fetching of the message
combinations in the component itself not in the Tag class.
On 9/21/06, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote:
> Author: mmarinschek
> Date: Thu Sep 21 13:44:09 2006
> New Revision: 448673
>
> URL: http://svn.apache.org/viewvc?view=rev&rev=448673
> Log:
> fixed TOMAHAWK-50 : custom validator messages (e.g. to prevent equals
validator showing password texts)
>
> Added:
>
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/validator/AttachedListStateWrapper.java
>
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/validator/AttachedStateWrapper.java
> Modified:
>
myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/util/MessageUtils.java
>
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/creditcardvalidator/CreditCardValidator.java
>
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/creditcardvalidator/ValidateCreditCardTag.java
>
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/emailvalidator/EmailValidator.java
>
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/emailvalidator/ValidateEmailTag.java
>
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/equalvalidator/EqualValidator.java
>
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/equalvalidator/ValidateEqualTag.java
>
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/regexprvalidator/RegExprValidator.java
>
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/regexprvalidator/ValidateRegExprTag.java
>
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/validator/ValidatorBase.java
>
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/validator/ValidatorBaseTag.java
>
myfaces/tomahawk/trunk/core/src/main/tld/entities/ext_validator_base_attributes.xml
> myfaces/tomahawk/trunk/examples/simple/src/main/webapp/validate.jsp
>
myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/urlvalidator/UrlValidator.java
>
myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/urlvalidator/ValidateUrlTag.java
> myfaces/tomahawk/trunk/sandbox/core/src/main/tld/myfaces_sandbox.tld
>
> Modified:
myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/util/MessageUtils.java
> URL:
http://svn.apache.org/viewvc/myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/util/MessageUtils.java?view=diff&rev=448673&r1=448672&r2=448673
> ==============================================================================
> ---
myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/util/MessageUtils.java
(original)
> +++
myfaces/shared/trunk/core/src/main/java/org/apache/myfaces/shared/util/MessageUtils.java
Thu Sep 21 13:44:09 2006
> @@ -247,18 +247,26 @@
> */
> public static FacesMessage getMessage(String bundleBaseName, String
messageId, Object params[])
> {
> - Locale locale = null;
> + return getMessage(bundleBaseName, getCurrentLocale(), messageId,
params);
> + }
> +
> + /**
> + *
> + * @return currently applicable Locale for this request.
> + */
> + public static Locale getCurrentLocale() {
> + Locale locale;
> +
> FacesContext context = FacesContext.getCurrentInstance();
> - if(context != null && context.getViewRoot() != null)
> - {
> + if(context != null && context.getViewRoot() != null) {
> locale = context.getViewRoot().getLocale();
> if(locale == null)
> locale = Locale.getDefault();
> - } else
> - {
> + } else {
> locale = Locale.getDefault();
> }
> - return getMessage(bundleBaseName, locale, messageId, params);
> +
> + return locale;
> }
>
> /**
> @@ -288,7 +296,7 @@
> if (bundleBaseName == null)
> {
> throw new NullPointerException(
> - "Unable to locate ResrouceBundle: bundle is null");
> + "Unable to locate ResourceBundle: bundle is null");
> }
>
> ResourceBundle bundle = ResourceBundle.getBundle(bundleBaseName,
locale);
> @@ -357,11 +365,7 @@
> {
> if(context == null || messageId == null)
> throw new NullPointerException(" context " + context + " messageId
" + messageId);
> - Locale locale = null;
> - if(context != null && context.getViewRoot() != null)
> - locale = context.getViewRoot().getLocale();
> - else
> - locale = Locale.getDefault();
> + Locale locale = getCurrentLocale();
> if(null == locale)
> throw new NullPointerException(" locale " + locale);
> FacesMessage message = getMessage(locale, messageId, params);
> @@ -370,6 +374,8 @@
> return message;
> } else
> {
> + // TODO /FIX: Note that this has fallback behavior to default
Locale for message,
> + // but similar behavior above does not. The methods should
probably behave
> locale = Locale.getDefault();
> return getMessage(locale, messageId, params);
> }
>
> Modified:
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/creditcardvalidator/CreditCardValidator.java
> URL:
http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/creditcardvalidator/CreditCardValidator.java?view=diff&rev=448673&r1=448672&r2=448673
> ==============================================================================
> ---
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/creditcardvalidator/CreditCardValidator.java
(original)
> +++
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/creditcardvalidator/CreditCardValidator.java
Thu Sep 21 13:44:09 2006
> @@ -15,14 +15,13 @@
> */
> package org.apache.myfaces.custom.creditcardvalidator;
>
> +import org.apache.myfaces.validator.ValidatorBase;
> +
> import javax.faces.application.FacesMessage;
> import javax.faces.component.UIComponent;
> import javax.faces.context.FacesContext;
> import javax.faces.validator.ValidatorException;
>
> -import org.apache.myfaces.shared_tomahawk.util.MessageUtils;
> -import org.apache.myfaces.validator.ValidatorBase;
> -
> /**
> * @author mwessendorf (latest modification by $Author$)
> * @version $Revision$ $Date$
> @@ -82,10 +81,7 @@
> initValidator();
> if (!this.creditCardValidator.isValid(value.toString())){
> Object[] args = {value.toString()};
> - String message = getMessage();
> - if (null == message) message = CREDITCARD_MESSAGE_ID;
> -
> - throw new
ValidatorException(MessageUtils.getMessage(FacesMessage.SEVERITY_ERROR, message,
args));
> + throw new
ValidatorException(getFacesMessage(CREDITCARD_MESSAGE_ID, args));
> }
> }
>
>
> Modified:
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/creditcardvalidator/ValidateCreditCardTag.java
> URL:
http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/creditcardvalidator/ValidateCreditCardTag.java?view=diff&rev=448673&r1=448672&r2=448673
> ==============================================================================
> ---
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/creditcardvalidator/ValidateCreditCardTag.java
(original)
> +++
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/creditcardvalidator/ValidateCreditCardTag.java
Thu Sep 21 13:44:09 2006
> @@ -15,13 +15,13 @@
> */
> package org.apache.myfaces.custom.creditcardvalidator;
>
> +import org.apache.myfaces.validator.ValidatorBaseTag;
> +
> import javax.faces.context.FacesContext;
> import javax.faces.el.ValueBinding;
> import javax.faces.validator.Validator;
> import javax.faces.webapp.UIComponentTag;
> import javax.servlet.jsp.JspException;
> -
> -import org.apache.myfaces.validator.ValidatorBaseTag;
>
> /**
> * @author mwessendorf (latest modification by $Author$)
>
> Modified:
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/emailvalidator/EmailValidator.java
> URL:
http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/emailvalidator/EmailValidator.java?view=diff&rev=448673&r1=448672&r2=448673
> ==============================================================================
> ---
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/emailvalidator/EmailValidator.java
(original)
> +++
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/emailvalidator/EmailValidator.java
Thu Sep 21 13:44:09 2006
> @@ -21,10 +21,12 @@
> import org.apache.commons.validator.GenericValidator;
>
> import javax.faces.application.FacesMessage;
> +import javax.faces.component.StateHolder;
> import javax.faces.component.UIComponent;
> import javax.faces.context.FacesContext;
> import javax.faces.validator.ValidatorException;
>
> +
> /**
> * @author mwessendorf (latest modification by $Author$)
> * @version $Revision$ $Date$
> @@ -64,10 +66,7 @@
> }
> if (!GenericValidator.isEmail(value.toString())) {
> Object[] args = {value.toString()};
> - String message = getMessage();
> - if (null == message) message = EMAIL_MESSAGE_ID;
> -
> - throw new
ValidatorException(MessageUtils.getMessage(FacesMessage.SEVERITY_ERROR, message,
args));
> + throw new
ValidatorException(getFacesMessage(EMAIL_MESSAGE_ID, args));
> }
>
> }
>
> Modified:
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/emailvalidator/ValidateEmailTag.java
> URL:
http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/emailvalidator/ValidateEmailTag.java?view=diff&rev=448673&r1=448672&r2=448673
> ==============================================================================
> ---
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/emailvalidator/ValidateEmailTag.java
(original)
> +++
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/emailvalidator/ValidateEmailTag.java
Thu Sep 21 13:44:09 2006
> @@ -15,10 +15,10 @@
> */
> package org.apache.myfaces.custom.emailvalidator;
>
> +import org.apache.myfaces.validator.ValidatorBaseTag;
> +
> import javax.faces.validator.Validator;
> import javax.servlet.jsp.JspException;
> -
> -import org.apache.myfaces.validator.ValidatorBaseTag;
>
> /**
> * @author mwessendorf (latest modification by $Author$)
>
> Modified:
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/equalvalidator/EqualValidator.java
> URL:
http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/equalvalidator/EqualValidator.java?view=diff&rev=448673&r1=448672&r2=448673
> ==============================================================================
> ---
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/equalvalidator/EqualValidator.java
(original)
> +++
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/equalvalidator/EqualValidator.java
Thu Sep 21 13:44:09 2006
> @@ -25,10 +25,12 @@
> import org.apache.myfaces.shared_tomahawk.util.MessageUtils;
> import org.apache.myfaces.validator.ValidatorBase;
>
> +
> /**
> * @author mwessendorf (latest modification by $Author$)
> * @version $Revision$ $Date$
> */
> +
> public class EqualValidator extends ValidatorBase {
>
> /**
> @@ -48,7 +50,7 @@
> //the foreign component_id on which the validation is based.
> private String _for= null;
>
> - // --------------------------------------------------------
ValidatorIF
> + // -------------------------------------------------------- ValidatorIF
> public void validate(
> FacesContext facesContext,
> UIComponent uiComponent,
> @@ -78,21 +80,18 @@
>
> if(foreignEditableValueHolder.getValue()==null ||
!foreignEditableValueHolder.getValue().toString().equals(value.toString()) )
> {
> - String message = getMessage();
> - if (null == message) message = EQUAL_MESSAGE_ID;
> -
> - throw new
ValidatorException(MessageUtils.getMessage(FacesMessage.SEVERITY_ERROR, message,
args));
> + throw new ValidatorException(getFacesMessage(EQUAL_MESSAGE_ID,
args));
> }
>
> }
> // --------------------------------------------------------
StateholderIF
>
> - public Object saveState(FacesContext context) {
> - Object values[] = new Object[6];
> - values[0] = super.saveState(context);
> - values[1] = _for;
> - return values;
> - }
> + public Object saveState(FacesContext context) {
> + Object[] state = new Object[2];
> + state[0] = super.saveState(context);
> + state[1] =_for;
> + return state;
> + }
>
> public void restoreState(FacesContext context, Object state) {
> Object values[] = (Object[])state;
> @@ -114,5 +113,4 @@
> public void setFor(String string) {
> _for = string;
> }
> -
> -}
> \ No newline at end of file
> +}
>
> Modified:
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/equalvalidator/ValidateEqualTag.java
> URL:
http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/equalvalidator/ValidateEqualTag.java?view=diff&rev=448673&r1=448672&r2=448673
> ==============================================================================
> ---
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/equalvalidator/ValidateEqualTag.java
(original)
> +++
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/equalvalidator/ValidateEqualTag.java
Thu Sep 21 13:44:09 2006
> @@ -27,7 +27,9 @@
> * @author mwessendorf (latest modification by $Author$)
> * @version $Revision$ $Date$
> */
> +
> public class ValidateEqualTag extends ValidatorBaseTag {
> +
> private static final long serialVersionUID = -3249115551944863108L;
> //the foreign component_id on which the validation is based.
> private String _for = null;
>
> Modified:
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/regexprvalidator/RegExprValidator.java
> URL:
http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/regexprvalidator/RegExprValidator.java?view=diff&rev=448673&r1=448672&r2=448673
> ==============================================================================
> ---
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/regexprvalidator/RegExprValidator.java
(original)
> +++
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/regexprvalidator/RegExprValidator.java
Thu Sep 21 13:44:09 2006
> @@ -30,6 +30,7 @@
> * @author mwessendorf (latest modification by $Author$)
> * @version $Revision$ $Date$
> */
> +
> public class RegExprValidator extends ValidatorBase {
> /**
> * <p>The standard converter id for this converter.</p>
> @@ -54,22 +55,17 @@
> Object value)
> throws ValidatorException {
>
> - if (facesContext == null) throw new
NullPointerException("facesContext");
> - if (uiComponent == null) throw new
NullPointerException("uiComponent");
> + if (facesContext == null) throw new
NullPointerException("facesContext");
> + if (uiComponent == null) throw new
NullPointerException("uiComponent");
>
> - if (value == null)
> + if (value == null)
> {
> return;
> }
> Object[] args = {value.toString()};
> - if(!GenericValidator.matchRegexp(value.toString(),"^" + getPattern() +
"$")){
> -
> - String message = getMessage();
> - if (null == message) message = REGEXPR_MESSAGE_ID;
> -
> - throw new
ValidatorException(MessageUtils.getMessage(FacesMessage.SEVERITY_ERROR, message,
args));
> - }
> -
> +
if(!GenericValidator.matchRegexp(value.toString(),"^"+getPattern()+"$")){
> + throw new
ValidatorException(getFacesMessage(REGEXPR_MESSAGE_ID, args));
> + }
> }
>
>
>
> Modified:
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/regexprvalidator/ValidateRegExprTag.java
> URL:
http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/regexprvalidator/ValidateRegExprTag.java?view=diff&rev=448673&r1=448672&r2=448673
> ==============================================================================
> ---
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/regexprvalidator/ValidateRegExprTag.java
(original)
> +++
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/custom/regexprvalidator/ValidateRegExprTag.java
Thu Sep 21 13:44:09 2006
> @@ -15,18 +15,19 @@
> */
> package org.apache.myfaces.custom.regexprvalidator;
>
> +import org.apache.myfaces.validator.ValidatorBaseTag;
> +
> import javax.faces.context.FacesContext;
> import javax.faces.el.ValueBinding;
> import javax.faces.validator.Validator;
> import javax.faces.webapp.UIComponentTag;
> import javax.servlet.jsp.JspException;
>
> -import org.apache.myfaces.validator.ValidatorBaseTag;
> -
> /**
> * @author mwessendorf (latest modification by $Author$)
> * @version $Revision$ $Date$
> */
> +
> public class ValidateRegExprTag extends ValidatorBaseTag {
> private static final long serialVersionUID = -449945949876262076L;
> //the pattern, needed by Commons-Validator.
>
> Added:
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/validator/AttachedListStateWrapper.java
> URL:
http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/validator/AttachedListStateWrapper.java?view=auto&rev=448673
> ==============================================================================
> ---
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/validator/AttachedListStateWrapper.java
(added)
> +++
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/validator/AttachedListStateWrapper.java
Thu Sep 21 13:44:09 2006
> @@ -0,0 +1,25 @@
> +package org.apache.myfaces.validator;
>
> +
>
> +import java.io.Serializable;
>
> +import java.util.List;
>
> +
>
> +/**
>
> + * @author Manfred Geiler (latest modification by $Author: bdudney $)
>
> + * @version $Revision: 225333 $ $Date: 2005-07-26 17:49:19 +0200 (Di, 26 Jul
2005) $
>
> + */
>
> +class AttachedListStateWrapper
>
> + implements Serializable
>
> +{
>
> + private static final long serialVersionUID = -3958718149793179776L;
>
> + private List _wrappedStateList;
>
> +
>
> + public AttachedListStateWrapper(List wrappedStateList)
>
> + {
>
> + _wrappedStateList = wrappedStateList;
>
> + }
>
> +
>
> + public List getWrappedStateList()
>
> + {
>
> + return _wrappedStateList;
>
> + }
>
> +}
>
>
> Added:
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/validator/AttachedStateWrapper.java
> URL:
http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/validator/AttachedStateWrapper.java?view=auto&rev=448673
> ==============================================================================
> ---
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/validator/AttachedStateWrapper.java
(added)
> +++
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/validator/AttachedStateWrapper.java
Thu Sep 21 13:44:09 2006
> @@ -0,0 +1,39 @@
> +package org.apache.myfaces.validator;
>
> +
>
> +import java.io.Serializable;
>
> +
>
> +/**
>
> + * @author Manfred Geiler (latest modification by $Author: bdudney $)
>
> + * @version $Revision: 225333 $ $Date: 2005-07-26 17:49:19 +0200 (Di, 26 Jul
2005) $
>
> + */
>
> +class AttachedStateWrapper
>
> + implements Serializable
>
> +{
>
> + private static final long serialVersionUID = 4948301780259917764L;
>
> + private Class _class;
>
> + private Object _wrappedStateObject;
>
> +
>
> + /**
>
> + * @param clazz null means wrappedStateObject is a List of state objects
>
> + * @param wrappedStateObject
>
> + */
>
> + public AttachedStateWrapper(Class clazz, Object wrappedStateObject)
>
> + {
>
> + if (wrappedStateObject != null && !(wrappedStateObject instanceof
Serializable))
>
> + {
>
> + throw new IllegalArgumentException("Attached state for Object of type " + clazz +
" (Class " + wrappedStateObject.getClass().getName() + ") is not serializable");
>
> + }
>
> + _class = clazz;
>
> + _wrappedStateObject = wrappedStateObject;
>
> + }
>
> +
>
> + public Class getClazz()
>
> + {
>
> + return _class;
>
> + }
>
> +
>
> + public Object getWrappedStateObject()
>
> + {
>
> + return _wrappedStateObject;
>
> + }
>
> +}
>
>
> Modified:
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/validator/ValidatorBase.java
> URL:
http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/validator/ValidatorBase.java?view=diff&rev=448673&r1=448672&r2=448673
> ==============================================================================
> ---
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/validator/ValidatorBase.java
(original)
> +++
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/validator/ValidatorBase.java
Thu Sep 21 13:44:09 2006
> @@ -13,61 +13,123 @@
> * See the License for the specific language governing permissions and
> * limitations under the License.
> */
> -package org.apache.myfaces.validator;
> -
> -import java.util.HashMap;
> -import java.util.Map;
> -
> -import javax.faces.component.StateHolder;
> -import javax.faces.context.FacesContext;
> -import javax.faces.el.ValueBinding;
> -import javax.faces.validator.Validator;
> -
> -import org.apache.myfaces.shared_tomahawk.util._ComponentUtils;
>
> /**
> * ValidatorBase provides common attributes and behavior common to all
Tomahawk and sandbox validators.
> * Currently this includes:
> - * - getValueBinding(), setValueBinding(), and getFacesContext() methods
available in UIComponentBase.
> + * - getValueBinding(), setValueBinding(), and getFacesContext() methods
available in UIComponentBase.
> * - a message attribute which can be used to override the message key on
a per-validator instance.
> - *
> + *
> * A validator subclass should call getMessage(), and, if not null, use this
message key instead.
> * A validator subclass must call super.saveState() and super.restoreState()
so that the common attributes are persisted.
> - *
> + *
> * @author mkienenb (latest modification by $Author$)
> * @version $Revision$
> + *//*
> + * Copyright 2006 The Apache Software Foundation.
> + *
> + * Licensed under the Apache License, Version 2.0 (the "License");
> + * you may not use this file except in compliance with the License.
> + * You may obtain a copy of the License at
> + *
> + * http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> */
> -public abstract class ValidatorBase implements Validator, StateHolder {
>
> - // the message to display when validation fails.
> - protected String _message;
> +package org.apache.myfaces.validator;
>
> - //JSF-Field for StateHolder-IF
> - protected boolean _transient = false;
> +import java.util.*;
> +import java.io.Serializable;
>
> - public String getMessage()
> - {
> - if (_message != null) return _message;
> - ValueBinding vb = getValueBinding("message");
> - return vb != null ?
_ComponentUtils.getStringValue(getFacesContext(), vb) : null;
> +import javax.faces.application.FacesMessage;
> +import javax.faces.component.StateHolder;
> +import javax.faces.context.FacesContext;
> +import javax.faces.validator.Validator;
> +import javax.faces.el.ValueBinding;
> +
> +import org.apache.myfaces.shared_tomahawk.util.MessageUtils;
> +
> +/**
> + * Base validator implementation for Tomahawk validators.
> + *
> + */
> +public abstract class ValidatorBase implements StateHolder, Validator {
> +
> + private String _summaryMessage = null;
> + private String _detailMessage = null;
> + private boolean _transient = false;
> +
> + /**
> + *
> + * @return The summary message to be displayed
> + */
> + public String getSummaryMessage() {
> + return _summaryMessage;
> }
>
> - public void setMessage(String message)
> - {
> - this._message = message;
> + /**
> + *
> + * @param message The summary message to be displayed.
> + */
> + public void setSummaryMessage(String message) {
> + _summaryMessage = message;
> + }
> +
> + /**
> + *
> + * @return The message.
> + */
> + public String getMessage() {
> + return getDetailMessage();
> + }
> +
> + /**
> + *
> + * @param message The detail message to be displayed.
> + */
> + public void setMessage(String message) {
> + setDetailMessage(message);
> + }
> +
> +
> + /**
> + *
> + * @return The detail message.
> + */
> + public String getDetailMessage() {
> + return _detailMessage;
> + }
> +
> + /**
> + *
> + * @param message The detail message to be displayed.
> + */
> + public void setDetailMessage(String message) {
> + _detailMessage = message;
> }
>
> - // -------------------------------------------------------- StateholderIF
>
> + /**
> + * @param context
> + */
> public Object saveState(FacesContext context) {
> - Object value[] = new Object[1];
> - value[0] = _message;
> - return value;
> + Object[] state = new Object[3];
> + state[0] = _summaryMessage;
> + state[1] = _detailMessage;
> + state[2] = saveValueBindingMap(context);
> + return state;
> }
>
> public void restoreState(FacesContext context, Object state) {
> Object[] values = (Object[]) state;
> - _message = (String) values[0];
> + _summaryMessage = (String) values[0];
> + _detailMessage = (String) values[1];
> + _valueBindingMap = (Map) restoreValueBindingMap(context, values[2]);
> }
>
> public boolean isTransient() {
> @@ -78,6 +140,28 @@
> _transient = newTransientValue;
> }
>
> + // Utility methods
> +
> + /**
> + * @param defaultMessage The default message we would expect.
> + * @param args Arguments for parsing this message.
> + * @return FacesMessage
> + */
> + protected FacesMessage getFacesMessage(String defaultMessage, Object[]
args) {
> + FacesMessage msg;
> +
> + if (getSummaryMessage() == null && getDetailMessage() == null)
> + {
> + msg = MessageUtils.getMessage(FacesMessage.SEVERITY_ERROR,
defaultMessage, args);
> + } else {
> + Locale locale = MessageUtils.getCurrentLocale();
> + String summaryText = MessageUtils.substituteParams(locale,
getSummaryMessage(), args);
> + String detailText = MessageUtils.substituteParams(locale,
getDetailMessage(), args);
> + msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, summaryText,
detailText);
> + }
> + return msg;
> + }
> +
> // --------------------- borrowed from UIComponentBase ------------
>
> private Map _valueBindingMap = null;
> @@ -106,9 +190,154 @@
> _valueBindingMap.put(name, binding);
> }
>
> + private Object saveValueBindingMap(FacesContext context)
> + {
> + if (_valueBindingMap != null)
> + {
> + int initCapacity = (_valueBindingMap.size() * 4 + 3) / 3;
> + HashMap stateMap = new HashMap(initCapacity);
> + for (Iterator it = _valueBindingMap.entrySet().iterator();
it.hasNext(); )
> + {
> + Map.Entry entry = (Map.Entry)it.next();
> + stateMap.put(entry.getKey(),
> + saveAttachedState(context, entry.getValue()));
> + }
> + return stateMap;
> + }
> + else
> + {
> + return null;
> + }
> + }
> +
> + private void restoreValueBindingMap(FacesContext context, Object
stateObj)
> + {
> + if (stateObj != null)
> + {
> + Map stateMap = (Map)stateObj;
> + int initCapacity = (stateMap.size() * 4 + 3) / 3;
> + _valueBindingMap = new HashMap(initCapacity);
> + for (Iterator it = stateMap.entrySet().iterator(); it.hasNext();
)
> + {
> + Map.Entry entry = (Map.Entry)it.next();
> + _valueBindingMap.put(entry.getKey(),
> + restoreAttachedState(context,
entry.getValue()));
> + }
> + }
> + else
> + {
> + _valueBindingMap = null;
> + }
> + }
> +
> + /**
> + * Serializes objects which are "attached" to this component but which
are
> + * not UIComponent children of it. Examples are validator and listener
> + * objects. To be precise, it returns an object which implements
> + * java.io.Serializable, and which when serialized will persist the
> + * state of the provided object.
> + * <p>
> + * If the attachedObject is a List then every object in the list is saved
> + * via a call to this method, and the returned wrapper object contains
> + * a List object.
> + * <p>
> + * If the object implements StateHolder then the object's saveState is
> + * called immediately, and a wrapper is returned which contains both
> + * this saved state and the original class name. However in the case
> + * where the StateHolder.isTransient method returns true, null is
> + * returned instead.
> + * <p>
> + * If the object implements java.io.Serializable then the object is
simply
> + * returned immediately; standard java serialization will later be used
> + * to store this object.
> + * <p>
> + * In all other cases, a wrapper is returned which simply stores the type
> + * of the provided object. When deserialized, a default instance of that
> + * type will be recreated.
> + */
> + public static Object saveAttachedState(FacesContext context,
> + Object attachedObject)
> + {
> + if (attachedObject == null) return null;
> + if (attachedObject instanceof List)
> + {
> + List lst = new ArrayList(((List)attachedObject).size());
> + for (Iterator it = ((List)attachedObject).iterator();
it.hasNext(); )
> + {
> + lst.add(saveAttachedState(context, it.next()));
> + }
> + return new AttachedListStateWrapper(lst);
> + }
> + else if (attachedObject instanceof StateHolder)
> + {
> + if (((StateHolder)attachedObject).isTransient())
> + {
> + return null;
> + }
> + else
> + {
> + return new AttachedStateWrapper(attachedObject.getClass(),
> +
((StateHolder)attachedObject).saveState(context));
> + }
> + }
> + else if (attachedObject instanceof Serializable)
> + {
> + return attachedObject;
> + }
> + else
> + {
> + return new AttachedStateWrapper(attachedObject.getClass(), null);
> + }
> + }
> +
> + public static Object restoreAttachedState(FacesContext context,
> + Object stateObj)
> + throws IllegalStateException
> + {
> + if (context == null) throw new NullPointerException("context");
> + if (stateObj == null) return null;
> + if (stateObj instanceof AttachedListStateWrapper)
> + {
> + List lst =
((AttachedListStateWrapper)stateObj).getWrappedStateList();
> + List restoredList = new ArrayList(lst.size());
> + for (Iterator it = lst.iterator(); it.hasNext(); )
> + {
> + restoredList.add(restoreAttachedState(context, it.next()));
> + }
> + return restoredList;
> + }
> + else if (stateObj instanceof AttachedStateWrapper)
> + {
> + Class clazz = ((AttachedStateWrapper)stateObj).getClazz();
> + Object restoredObject;
> + try
> + {
> + restoredObject = clazz.newInstance();
> + }
> + catch (InstantiationException e)
> + {
> + throw new RuntimeException("Could not restore StateHolder of type " +
clazz.getName() + " (missing no-args constructor?)", e);
> + }
> + catch (IllegalAccessException e)
> + {
> + throw new RuntimeException(e);
> + }
> + if (restoredObject instanceof StateHolder)
> + {
> + Object wrappedState =
((AttachedStateWrapper)stateObj).getWrappedStateObject();
> + ((StateHolder)restoredObject).restoreState(context,
wrappedState);
> + }
> + return restoredObject;
> + }
> + else
> + {
> + return stateObj;
> + }
> + }
> +
> +
> protected FacesContext getFacesContext()
> {
> return FacesContext.getCurrentInstance();
> }
> -
> }
>
> Modified:
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/validator/ValidatorBaseTag.java
> URL:
http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/validator/ValidatorBaseTag.java?view=diff&rev=448673&r1=448672&r2=448673
> ==============================================================================
> ---
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/validator/ValidatorBaseTag.java
(original)
> +++
myfaces/tomahawk/trunk/core/src/main/java/org/apache/myfaces/validator/ValidatorBaseTag.java
Thu Sep 21 13:44:09 2006
> @@ -33,27 +33,60 @@
> public class ValidatorBaseTag extends ValidatorTag {
> private static final long serialVersionUID = 4416508071412794682L;
> private String _message = null;
> + private String _detailMessage = null;
> + private String _summaryMessage = null;
>
> public void setMessage(String string) {
> _message = string;
> }
>
> + public void setDetailMessage(String detailMessage)
> + {
> + _detailMessage = detailMessage;
> + }
> +
> + public void setSummaryMessage(String summaryMessage)
> + {
> + _summaryMessage = summaryMessage;
> + }
> +
> protected Validator createValidator() throws JspException {
>
> ValidatorBase validator = (ValidatorBase)super.createValidator();
>
> FacesContext facesContext = FacesContext.getCurrentInstance();
>
> - if (_message != null)
> + if(_message != null && _detailMessage != null)
> + throw new JspException("you may not set detailMessage and
detailMessage together - they serve the same purpose.");
> +
> + String detailMessage = _message;
> +
> + if(_detailMessage != null)
> + detailMessage = _detailMessage;
> +
> + if (detailMessage != null)
> + {
> + if (UIComponentTag.isValueReference(detailMessage))
> + {
> + ValueBinding vb =
facesContext.getApplication().createValueBinding(detailMessage);
> + validator.setValueBinding("detailMessage",vb);
> + }
> + else
> + {
> + validator.setDetailMessage(detailMessage);
> + }
> + }
> +
> + if (_summaryMessage != null)
> {
> - if (UIComponentTag.isValueReference(_message))
> + if (UIComponentTag.isValueReference(_summaryMessage))
> {
> - ValueBinding vb =
facesContext.getApplication().createValueBinding(_message);
> - validator.setMessage(new
String(vb.getValue(facesContext).toString()));
> + ValueBinding vb =
facesContext.getApplication().createValueBinding(_summaryMessage);
> + validator.setValueBinding("summaryMessage",vb);
> }
> else
> {
> - validator.setMessage(_message);
> + validator.setSummaryMessage(_summaryMessage);
> }
> }
>
> @@ -64,5 +97,7 @@
> {
> super.release();
> _message= null;
> + _detailMessage = null;
> + _summaryMessage = null;
> }
> }
>
> Modified:
myfaces/tomahawk/trunk/core/src/main/tld/entities/ext_validator_base_attributes.xml
> URL:
http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/core/src/main/tld/entities/ext_validator_base_attributes.xml?view=diff&rev=448673&r1=448672&r2=448673
> ==============================================================================
> ---
myfaces/tomahawk/trunk/core/src/main/tld/entities/ext_validator_base_attributes.xml
(original)
> +++
myfaces/tomahawk/trunk/core/src/main/tld/entities/ext_validator_base_attributes.xml
Thu Sep 21 13:44:09 2006
> @@ -6,6 +6,25 @@
> <required>false</required>
> <rtexprvalue>false</rtexprvalue>
> <description>
> - alternate validation error message format string
> + alternate validation error detail message format string (use
'message' and 'detailMessage' alternatively)
> </description>
> </attribute>
> + <attribute>
> + <name>detailMessage</name>
> + <required>false</required>
> + <rtexprvalue>false</rtexprvalue>
> + <description>
> + alternate validation error detail message format string (use
'message' and 'detailMessage' alternatively)
> + </description>
> + </attribute>
> + <!--
> + This attribute indicates an alternate validation error summary
message format string to display.
> + -->
> + <attribute>
> + <name>summaryMessage</name>
> + <required>false</required>
> + <rtexprvalue>false</rtexprvalue>
> + <description>
> + alternate validation error summary message format string
> + </description>
> + </attribute>
> \ No newline at end of file
>
> Modified: myfaces/tomahawk/trunk/examples/simple/src/main/webapp/validate.jsp
> URL:
http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/examples/simple/src/main/webapp/validate.jsp?view=diff&rev=448673&r1=448672&r2=448673
> ==============================================================================
> --- myfaces/tomahawk/trunk/examples/simple/src/main/webapp/validate.jsp
(original)
> +++ myfaces/tomahawk/trunk/examples/simple/src/main/webapp/validate.jsp Thu
Sep 21 13:44:09 2006
> @@ -52,19 +52,19 @@
>
>
> <h:outputLabel for="email2"
value="#{example_messages['validate_email']}2"/>
>
> <h:inputText id="email2" value="#{validateForm.email2}"
required="true">
>
> - <t:validateEmail/>
>
> + <t:validateEmail detailMessage="Not a valid email
address."/>
>
> </h:inputText>
>
> <t:message id="emailError2" for="email2" styleClass="error"/>
>
>
>
> <h:outputLabel for="creditCardNumber"
value="#{example_messages['validate_credit']}"/>
>
> <h:inputText id="creditCardNumber"
value="#{validateForm.creditCardNumber}" required="true">
>
> - <t:validateCreditCard/>
>
> + <t:validateCreditCard detailMessage='#{"{0} is not a valid
credit card number."}'/>
>
> </h:inputText>
>
> <t:message id="creditCardNumberError" for="creditCardNumber"
styleClass="error"/>
>
>
>
> <h:outputLabel for="regExprValue"
value="#{example_messages['validate_regexp']}"/>
>
> <h:inputText id="regExprValue" value="#{validateForm.regExpr}"
required="true">
>
> - <t:validateRegExpr pattern='\d{5}'/>
>
> + <t:validateRegExpr pattern='\d{5}' detailMessage='#{"{0} is not
valid in this field." }'/>
>
> </h:inputText>
>
> <t:message id="regExprValueError" for="regExprValue"
styleClass="error"/>
>
>
>
> @@ -74,7 +74,9 @@
>
>
> <h:outputLabel for="equal2"
value="#{example_messages['validate_equal']}2"/>
>
> <h:inputText id="equal2" value="#{validateForm.equal2}"
required="true">
>
> - <t:validateEqual for="equal"/>
>
> + <t:validateEqual for="equal"
>
> + summaryMessage='#{"Value {0} should equal
{1}"}'
>
> + detailMessage='#{"The value of this field, {0},
should equal the value of that other field, {1}"}'/>
>
> </h:inputText>
>
> <t:message id="equal2Error" for="equal2" styleClass="error"/>
>
>
>
>
> Modified:
myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/urlvalidator/UrlValidator.java
> URL:
http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/urlvalidator/UrlValidator.java?view=diff&rev=448673&r1=448672&r2=448673
> ==============================================================================
> ---
myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/urlvalidator/UrlValidator.java
(original)
> +++
myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/urlvalidator/UrlValidator.java
Thu Sep 21 13:44:09 2006
> @@ -17,6 +17,7 @@
> package org.apache.myfaces.custom.urlvalidator;
>
> import javax.faces.application.FacesMessage;
> +import javax.faces.component.StateHolder;
> import javax.faces.component.UIComponent;
> import javax.faces.context.FacesContext;
> import javax.faces.validator.ValidatorException;
> @@ -24,7 +25,6 @@
> import org.apache.commons.validator.GenericValidator;
> import org.apache.myfaces.shared_tomahawk.util.MessageUtils;
> import org.apache.myfaces.validator.ValidatorBase;
> -
> /**
> *
> * @author Fabian Frederick
> @@ -66,11 +66,8 @@
> }
> if (!GenericValidator.isUrl(value.toString())) {
> Object[] args = {value.toString()};
> - String message = getMessage();
> - if (null == message) message = URL_MESSAGE_ID;
> -
> - throw new
ValidatorException(MessageUtils.getMessage(FacesMessage.SEVERITY_ERROR, message,
args));
> - }
> + throw new
ValidatorException(getFacesMessage(URL_MESSAGE_ID, args));
> + }
>
> }
>
>
> Modified:
myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/urlvalidator/ValidateUrlTag.java
> URL:
http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/urlvalidator/ValidateUrlTag.java?view=diff&rev=448673&r1=448672&r2=448673
> ==============================================================================
> ---
myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/urlvalidator/ValidateUrlTag.java
(original)
> +++
myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/urlvalidator/ValidateUrlTag.java
Thu Sep 21 13:44:09 2006
> @@ -16,11 +16,11 @@
>
> package org.apache.myfaces.custom.urlvalidator;
>
> +import org.apache.myfaces.validator.ValidatorBaseTag;
> +
> import javax.faces.validator.Validator;
> import javax.servlet.jsp.JspException;
>
> -import org.apache.myfaces.validator.ValidatorBaseTag;
> -
> /**
> *
> * @author Fabian Frederick
> @@ -34,14 +34,14 @@
>
> public ValidateUrlTag()
> {
> - }
> + }
>
> - protected Validator createValidator() throws JspException
> + protected Validator createValidator() throws JspException
> {
> - setValidatorId(UrlValidator.VALIDATOR_ID);
> - UrlValidator validator = (UrlValidator)super.createValidator();
> - return validator;
> - }
> + setValidatorId(UrlValidator.VALIDATOR_ID);
> + UrlValidator validator = (UrlValidator)super.createValidator();
> + return validator;
> + }
>
> public void release()
> {
>
> Modified: myfaces/tomahawk/trunk/sandbox/core/src/main/tld/myfaces_sandbox.tld
> URL:
http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/sandbox/core/src/main/tld/myfaces_sandbox.tld?view=diff&rev=448673&r1=448672&r2=448673
> ==============================================================================
> --- myfaces/tomahawk/trunk/sandbox/core/src/main/tld/myfaces_sandbox.tld
(original)
> +++ myfaces/tomahawk/trunk/sandbox/core/src/main/tld/myfaces_sandbox.tld Thu
Sep 21 13:44:09 2006
> @@ -608,7 +608,6 @@
> &html_anchor_attributes;
> &user_role_attributes;
> &ext_forceId_attribute;
> -
> <attribute>
> <name>resourceRendererClass</name>
> <required>true</required>
> @@ -624,8 +623,7 @@
> passed by nested f:param elements and/or
using session or application scoped beans.
> </description>
> </attribute>
> -
> - </tag>
> + </tag>
>
> <!-- effect -->
> <tag>
>
>
>