[ http://issues.apache.org/struts/browse/WW-1416?page=all ]

Christopher Waring updated WW-1416:
-----------------------------------

    Attachment: FacesResult_diff.txt

> Modifications to FacesResult to control page navigation using the struts.xml 
> result tag.
> ----------------------------------------------------------------------------------------
>
>                 Key: WW-1416
>                 URL: http://issues.apache.org/struts/browse/WW-1416
>             Project: Struts 2
>          Issue Type: New Feature
>          Components: Configuration
>    Affects Versions: 2.0.0, 2.0.1
>         Environment: All
>            Reporter: Christopher Waring
>         Assigned To: Don Brown
>         Attachments: FacesResult_diff.txt
>
>
> Modified the FacesResult class to compare the result uri from the struts 
> result config to the JSF viewId and build a new JSF viewId if they do not 
> match.  Processing is then delegated to the render.
> I had to split the render() into it's own class because I needed the 
> StrutsResultSupport functionality for parsing the result string to garuantee 
> that the parameter functionality would be available.  This will allow the 
> FacesResult to work the same as the other Result classes in respect to how 
> you can define the location to forward to.
> Simple Example Configuration:
> <result name="success" type="jsf" >
>      /listBillingActions.jsp
> </result>
> org.apache.struts2.jsf.FacesRender.java
> /*
>  * $Id: PlainTextResult.java 394468 2006-04-16 12:16:03Z tmjee $
>  *
>  * 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.
>  */
> package org.apache.struts2.jsf;
> import java.io.IOException;
> import javax.faces.FacesException;
> import javax.faces.application.Application;
> import javax.faces.application.ViewHandler;
> import javax.faces.component.UIViewRoot;
> import javax.faces.context.FacesContext;
> import javax.faces.event.PhaseId;
> import org.apache.struts2.dispatcher.StrutsResultSupport;
> import com.opensymphony.xwork2.ActionInvocation;
> import com.opensymphony.xwork2.Result;
> /**
>  * Handles the results navigation and then executes the JSF render phase
>  */
> public class FacesResult extends StrutsResultSupport implements Result {
>     private static final long serialVersionUID = -3548970638740937804L;
>       /** 
>        * Checks to see if we need to build a new JSF ViewId from the Struts 
> Result config and
>        * then renders the result by delegating to the FacesRender.render().
>        * @see 
> org.apache.struts2.dispatcher.StrutsResultSupport#doExecute(java.lang.String, 
> com.opensymphony.xwork2.ActionInvocation)
>        */
>       protected void doExecute(String finalLocation, ActionInvocation 
> invocation) throws Exception {
>               performNavigation(finalLocation, 
> FacesContext.getCurrentInstance());
>       new FacesRender().render(FacesContext.getCurrentInstance());
>       }
>     /**
>      * Compares the Struts Result uri to the faces viewId.
>      * If they are different use the Struts uri to build 
>      * a new faces viewId.
>      * @param finalLocation The result uri
>      * @param facesContext The FacesContext
>      */
>     private void performNavigation(String finalLocation, FacesContext 
> facesContext) {
>       String facesViewId = facesContext.getViewRoot().getViewId();
>         
>       if (finalLocation != null) {
>               if (finalLocation.equals(facesViewId) == false) {
>                       ViewHandler viewHandler = 
> facesContext.getApplication().getViewHandler();
>                       UIViewRoot viewRoot = 
> viewHandler.createView(facesContext, finalLocation);
>                   facesContext.setViewRoot(viewRoot);
>                   facesContext.renderResponse();
>               }
>       }
>       }
> }
> org.apache.struts2.jsf.FacesRender.java
> /*
>  * $Id: PlainTextResult.java 394468 2006-04-16 12:16:03Z tmjee $
>  *
>  * 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.
>  */
> package org.apache.struts2.jsf;
> import java.io.IOException;
> import javax.faces.FacesException;
> import javax.faces.application.Application;
> import javax.faces.application.ViewHandler;
> import javax.faces.context.FacesContext;
> import javax.faces.event.PhaseId;
> /**
>  * Performs the JSF render lifecycle phase.
>  *
>  */
> public class FacesRender extends FacesSupport {
>       /**
>      * Executes the render phase, borrowed from MyFaces
>      * 
>      * @param facesContext
>      *            The faces context
>      * @throws FacesException
>      *             If anything goes wrong
>      */
>     public void render(FacesContext facesContext) throws FacesException {
>         // if the response is complete we should not be invoking the phase
>         // listeners
>         if (isResponseComplete(facesContext, "render", true)) {
>             return;
>         }
>         if (log.isTraceEnabled())
>             log.trace("entering renderResponse");
>         informPhaseListenersBefore(facesContext, PhaseId.RENDER_RESPONSE);
>         try {
>             // also possible that one of the listeners completed the response
>             if (isResponseComplete(facesContext, "render", true)) {
>                 return;
>             }
>             Application application = facesContext.getApplication();
>             ViewHandler viewHandler = application.getViewHandler();
>             try {
>                 viewHandler
>                         .renderView(facesContext, facesContext.getViewRoot());
>             } catch (IOException e) {
>                 throw new FacesException(e.getMessage(), e);
>             }
>         } finally {
>             informPhaseListenersAfter(facesContext, PhaseId.RENDER_RESPONSE);
>         }
>         if (log.isTraceEnabled()) {
>             // Note: DebugUtils Logger must also be in trace level
>             // DebugUtils.traceView("View after rendering");
>         }
>         if (log.isTraceEnabled())
>             log.trace("exiting renderResponse");
>     }
> }

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://issues.apache.org/struts/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to