[jboss-cvs] jboss-seam/src/main/org/jboss/seam/navigation ...
Gavin King
gavin.king at jboss.com
Thu Jul 19 08:58:13 EDT 2007
User: gavin
Date: 07/07/19 08:58:13
Modified: src/main/org/jboss/seam/navigation Pages.java Param.java
RedirectNavigationHandler.java
Log:
JBSEAM-1041 capture/redirect did not use converters correctly
Revision Changes Path
1.10 +73 -97 jboss-seam/src/main/org/jboss/seam/navigation/Pages.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: Pages.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/navigation/Pages.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -b -r1.9 -r1.10
--- Pages.java 19 Jul 2007 07:32:27 -0000 1.9
+++ Pages.java 19 Jul 2007 12:58:13 -0000 1.10
@@ -351,7 +351,7 @@
//that if a login redirect occurs, or if a failure
//occurs while validating of applying to the model, we can
//still make Redirect.captureCurrentView() work.
- storeRequestParameterValuesInViewRoot(facesContext);
+ storeRequestStringValuesInPageContext(facesContext);
//check if we need to redirect
String viewId = getViewId(facesContext);
@@ -380,7 +380,7 @@
//now validate the values we just stored in
//the view root, after the redirect checking
- if ( validateViewRootValues(facesContext) )
+ if ( convertAndValidateStringValuesInPageContext(facesContext) )
{
Validation.instance().fail();
//and don't apply them to the model
@@ -389,7 +389,7 @@
{
//finally apply page parameters to the model
//(after checking permissions)
- applyViewRootValues(facesContext);
+ applyConvertedValidatedValuesToModel(facesContext);
}
}
@@ -581,6 +581,7 @@
}
return (Pages) Component.getInstance(Pages.class, ScopeType.APPLICATION);
}
+
/**
* Call the action requested by s:link or s:button.
*/
@@ -639,64 +640,27 @@
* against the model and converting to String.
*
* @param viewId the JSF view id
+ * @param overridden excluded parameters
* @return a map of page parameter name to String value
*/
- public Map<String, Object> getConvertedParameters(FacesContext facesContext, String viewId)
- {
- return getConvertedParameters(facesContext, viewId, Collections.EMPTY_SET);
- }
-
- /**
- * Get the values of any page parameters by evaluating the value bindings
- * against the model.
- *
- * @param viewId the JSF view id
- * @return a map of page parameter name to value
- */
- protected Map<String, Object> getParameters(String viewId)
+ public Map<String, Object> getStringValuesFromModel(FacesContext facesContext, String viewId, Set<String> overridden)
{
Map<String, Object> parameters = new HashMap<String, Object>();
for ( Page page: getPageStack(viewId) )
{
for ( Param pageParameter: page.getParameters() )
{
- ValueExpression valueExpression = pageParameter.getValueExpression();
- Object value;
- if (valueExpression==null)
+ if ( !overridden.contains( pageParameter.getName() ) )
{
- value = Contexts.getPageContext().get( pageParameter.getName() );
- }
- else
+ String value;
+ if ( pageParameter.getValueExpression()==null )
{
- value = valueExpression.getValue();
+ value = (String) Contexts.getPageContext().get( pageParameter.getName() );
}
- if (value!=null)
+ else
{
- parameters.put( pageParameter.getName(), value );
- }
- }
+ value = pageParameter.getStringValueFromModel(facesContext);
}
- return parameters;
- }
-
- /**
- * Get the values of any page parameters by evaluating the value bindings
- * against the model and converting to String.
- *
- * @param viewId the JSF view id
- * @param overridden excluded parameters
- * @return a map of page parameter name to String value
- */
- public Map<String, Object> getConvertedParameters(FacesContext facesContext, String viewId, Set<String> overridden)
- {
- Map<String, Object> parameters = new HashMap<String, Object>();
- for ( Page page: getPageStack(viewId) )
- {
- for ( Param pageParameter: page.getParameters() )
- {
- if ( !overridden.contains( pageParameter.getName() ) )
- {
- Object value = getPageParameterValue(facesContext, pageParameter);
if (value!=null)
{
parameters.put( pageParameter.getName(), value );
@@ -707,31 +671,14 @@
return parameters;
}
- /**
- * Get the current value of a page parameter, looking in the page context
- * if there is no value binding
- */
- private Object getPageParameterValue(FacesContext facesContext, Param pageParameter)
- {
- ValueExpression valueExpression = pageParameter.getValueExpression();
- if (valueExpression==null)
- {
- return Contexts.getPageContext().get( pageParameter.getName() );
- }
- else
- {
- return pageParameter.getValueFromModel(facesContext);
- }
- }
-
- private void storeRequestParameterValuesInViewRoot(FacesContext facesContext)
+ private void storeRequestStringValuesInPageContext(FacesContext facesContext)
{
Map<String, String[]> requestParameters = Parameters.instance().getRequestParameters();
for ( Page page: getPageStack( getViewId(facesContext) ) )
{
for ( Param pageParameter: page.getParameters() )
{
- Object value = pageParameter.getValueFromRequest(facesContext, requestParameters);
+ String value = pageParameter.getStringValueFromRequest(facesContext, requestParameters);
if (value==null)
{
//this should not be necessary, were it not for a MyFaces bug
@@ -748,7 +695,10 @@
}
}
- private boolean validateViewRootValues(FacesContext facesContext)
+ /**
+ * Convert and validate page parameters passed as view root attributes or request parameters
+ */
+ private boolean convertAndValidateStringValuesInPageContext(FacesContext facesContext)
{
boolean validationFailed = false;
for ( Page page: getPageStack( getViewId(facesContext) ) )
@@ -757,10 +707,12 @@
{
try
{
- Object value = Contexts.getPageContext().get( pageParameter.getName() );
+ String value = (String) Contexts.getPageContext().get( pageParameter.getName() );
if (value!=null)
{
pageParameter.validateConvertedValue(facesContext, value);
+ Object convertedValue = pageParameter.convertValueFromString(facesContext, value);
+ Contexts.getEventContext().set( pageParameter.getName(), convertedValue );
}
}
catch (ValidatorException ve)
@@ -779,9 +731,9 @@
}
/**
- * Apply any page parameters passed as view root attributes to the model.
+ * Apply page parameters passed as view root attributes or request parameters to the model
*/
- private void applyViewRootValues(FacesContext facesContext)
+ private void applyConvertedValidatedValuesToModel(FacesContext facesContext)
{
String viewId = getViewId(facesContext);
for ( Page page: getPageStack(viewId) )
@@ -791,7 +743,7 @@
ValueExpression valueExpression = pageParameter.getValueExpression();
if (valueExpression!=null)
{
- Object object = Contexts.getPageContext().get( pageParameter.getName() );
+ Object object = Contexts.getEventContext().get( pageParameter.getName() );
if (object!=null)
{
valueExpression.setValue(object);
@@ -801,7 +753,11 @@
}
}
- public Map<String, Object> getViewRootValues(FacesContext facesContext)
+ /**
+ * Get the page parameter values that were passed in the original request from
+ * the PAGE context
+ */
+ public Map<String, Object> getStringValuesFromPageContext(FacesContext facesContext)
{
Map<String, Object> parameters = new HashMap<String, Object>();
String viewId = getViewId(facesContext);
@@ -820,17 +776,29 @@
}
/**
- * The global setting for no-conversation-viewid.
- *
- * @return a JSF view id
+ * Update the page parameter values stored in the PAGE context with the current
+ * values of the mapped attributes of the model
*/
- public String getNoConversationViewId()
+ public void updateStringValuesInPageContextUsingModel(FacesContext facesContext)
{
- return noConversationViewId;
+ for ( Page page: getPageStack( getViewId(facesContext) ) )
+ {
+ for ( Param pageParameter: page.getParameters() )
+ {
+ if ( pageParameter.getValueExpression()!=null )
+ {
+ String value = pageParameter.getStringValueFromModel(facesContext);
+ if (value==null)
+ {
+ Contexts.getPageContext().remove( pageParameter.getName() );
}
- public void setNoConversationViewId(String noConversationViewId)
+ else
{
- this.noConversationViewId = noConversationViewId;
+ Contexts.getPageContext().set( pageParameter.getName(), value );
+ }
+ }
+ }
+ }
}
/**
@@ -855,23 +823,11 @@
*/
public String encodePageParameters(FacesContext facesContext, String url, String viewId, Set<String> overridden)
{
- Map<String, Object> parameters = getConvertedParameters(facesContext, viewId, overridden);
+ Map<String, Object> parameters = getStringValuesFromModel(facesContext, viewId, overridden);
return Manager.instance().encodeParameters(url, parameters);
}
/**
- * Store the page parameters to the JSF view root
- */
- public void storePageParameters(FacesContext facesContext)
- {
- String viewId = getViewId(facesContext);
- for ( Map.Entry<String, Object> param: getParameters(viewId).entrySet() )
- {
- Contexts.getPageContext().set( param.getKey(), param.getValue() );
- }
- }
-
- /**
* Search for a defined no-conversation-view-id, beginning with
* the most specific view id, then wildcarded view ids, and
* finally the global setting
@@ -1425,6 +1381,26 @@
return result;
}
+ /**
+ * The global setting for no-conversation-viewid.
+ *
+ * @return a JSF view id
+ */
+ public String getNoConversationViewId()
+ {
+ return noConversationViewId;
+ }
+
+ public void setNoConversationViewId(String noConversationViewId)
+ {
+ this.noConversationViewId = noConversationViewId;
+ }
+
+ /**
+ * The global setting for login-viewid.
+ *
+ * @return a JSF view id
+ */
public String getLoginViewId()
{
return loginViewId;
1.9 +16 -7 jboss-seam/src/main/org/jboss/seam/navigation/Param.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: Param.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/navigation/Param.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- Param.java 17 Jul 2007 15:27:08 -0000 1.8
+++ Param.java 19 Jul 2007 12:58:13 -0000 1.9
@@ -127,7 +127,7 @@
* Get the current value of a page or redirection parameter
* from the model, and convert to a String
*/
- public Object getValueFromModel(FacesContext facesContext)
+ public String getStringValueFromModel(FacesContext facesContext)
{
Object value = getValueExpression().getValue();
if (value==null)
@@ -149,7 +149,7 @@
}
return converter==null ?
- value :
+ value.toString() :
converter.getAsString( facesContext, facesContext.getViewRoot(), value );
}
}
@@ -157,7 +157,7 @@
/**
* Get the current value of a page parameter from the request parameters
*/
- public Object getValueFromRequest(FacesContext facesContext, Map<String, String[]> requestParameters)
+ public String getStringValueFromRequest(FacesContext facesContext, Map<String, String[]> requestParameters)
throws ValidatorException
{
String[] parameterValues = requestParameters.get( getName() );
@@ -176,18 +176,27 @@
throw new IllegalArgumentException("page parameter may not be multi-valued: " + getName());
}
- String stringValue = parameterValues[0];
+ String value = parameterValues[0];
//Note: for not-required fields, we behave a
//but different than JSF for empty strings.
//is this a bad thing? (but we are the same
//for required fields)
- if ( stringValue.length()==0 && isRequired() )
+ if ( value.length()==0 && isRequired() )
{
addRequiredMessage(facesContext);
return null;
}
+ return value;
+
+ }
+
+ /**
+ * Convert the string value of a page parameter to the required type
+ */
+ public Object convertValueFromString(FacesContext facesContext, String value)
+ {
Converter converter = null;
try
{
@@ -201,8 +210,8 @@
}
return converter==null ?
- stringValue :
- converter.getAsObject( facesContext, facesContext.getViewRoot(), stringValue );
+ value :
+ converter.getAsObject( facesContext, facesContext.getViewRoot(), value );
}
/**
1.3 +1 -1 jboss-seam/src/main/org/jboss/seam/navigation/RedirectNavigationHandler.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: RedirectNavigationHandler.java
===================================================================
RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/navigation/RedirectNavigationHandler.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- RedirectNavigationHandler.java 21 Jun 2007 05:27:29 -0000 1.2
+++ RedirectNavigationHandler.java 19 Jul 2007 12:58:13 -0000 1.3
@@ -38,7 +38,7 @@
Map<String, Object> parameters = new HashMap<String, Object>();
for ( Param parameter: params )
{
- Object value = parameter.getValueFromModel(context);
+ String value = parameter.getStringValueFromModel(context);
//render it even if the value is null, since we want it
//to override page parameter values which would be
//appended by the redirect filter
More information about the jboss-cvs-commits
mailing list