[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