You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@struts.apache.org by "Don Brown (JIRA)" <ji...@apache.org> on 2006/09/05 08:38:32 UTC

[jira] Resolved: (WW-1416) Modifications to FacesResult to control page navigation using the struts.xml result tag.

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

Don Brown resolved WW-1416.
---------------------------

    Fix Version/s: 2.0.0
       Resolution: Fixed

Fixed in changeset 440278.  Thanks for the patch!

> 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
>             Fix For: 2.0.0
>
>         Attachments: FacesRender.java, 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