From: Gavin K. <gav...@jb...> - 2006-04-09 22:31:36
|
User: gavin Date: 06/04/09 18:31:34 Modified: src/main/org/jboss/seam/jsf SeamExtendedManagedPersistencePhaseListener.java Added: src/main/org/jboss/seam/jsf SeamExtendedManagedPersistencePortletPhaseListener.java SeamPortletPhaseListener.java Log: added portlet phase listeners Revision Changes Path 1.14 +1 -3 jboss-seam/src/main/org/jboss/seam/jsf/SeamExtendedManagedPersistencePhaseListener.java (In the diff below, changes in quantity of whitespace are not shown.) Index: SeamExtendedManagedPersistencePhaseListener.java =================================================================== RCS file: /cvsroot/jboss/jboss-seam/src/main/org/jboss/seam/jsf/SeamExtendedManagedPersistencePhaseListener.java,v retrieving revision 1.13 retrieving revision 1.14 diff -u -b -r1.13 -r1.14 --- SeamExtendedManagedPersistencePhaseListener.java 5 Apr 2006 01:15:18 -0000 1.13 +++ SeamExtendedManagedPersistencePhaseListener.java 9 Apr 2006 22:31:34 -0000 1.14 @@ -1,4 +1,4 @@ -//$Id: SeamExtendedManagedPersistencePhaseListener.java,v 1.13 2006/04/05 01:15:18 gavin Exp $ +//$Id: SeamExtendedManagedPersistencePhaseListener.java,v 1.14 2006/04/09 22:31:34 gavin Exp $ package org.jboss.seam.jsf; import javax.faces.event.PhaseEvent; @@ -52,8 +52,6 @@ super.afterPhase( event ); } - - @Override protected void afterPageActions() { 1.1 date: 2006/04/09 22:31:34; author: gavin; state: Exp;jboss-seam/src/main/org/jboss/seam/jsf/SeamExtendedManagedPersistencePortletPhaseListener.java Index: SeamExtendedManagedPersistencePortletPhaseListener.java =================================================================== //$Id: SeamExtendedManagedPersistencePortletPhaseListener.java,v 1.1 2006/04/09 22:31:34 gavin Exp $ package org.jboss.seam.jsf; import javax.faces.event.PhaseEvent; import javax.faces.event.PhaseId; import org.jboss.logging.Logger; import org.jboss.seam.util.Transactions; /** * Transaction management for extended persistence contexts. * A transaction spans the restore view, apply request values, process validations, * update model values and invoke application phases. It is committed when * invoke application is complete, or renderResponse() or responseComplete() is * called. A second transaction spans the render response phase. * * @author Gavin King */ public class SeamExtendedManagedPersistencePortletPhaseListener extends SeamPortletPhaseListener { private static Logger log = Logger.getLogger( SeamExtendedManagedPersistencePortletPhaseListener.class ); @Override public void beforePhase(PhaseEvent event) { boolean beginTran = event.getPhaseId()==PhaseId.RESTORE_VIEW || event.getPhaseId()==PhaseId.RENDER_RESPONSE || event.getPhaseId()==PhaseId.INVOKE_APPLICATION; if ( beginTran ) { begin(); } super.beforePhase( event ); } @Override public void afterPhase(PhaseEvent event) { boolean commitTran = event.getPhaseId()==PhaseId.INVOKE_APPLICATION || event.getFacesContext().getRenderResponse() || event.getPhaseId()==PhaseId.RENDER_RESPONSE; if (commitTran) { commit(); //we commit before destroying contexts, cos the contexts have the PC in them } super.afterPhase( event ); } @Override protected void afterPageActions() { commit(); begin(); } private void begin() { try { if ( !Transactions.isTransactionActiveOrMarkedRollback() ) { log.debug("beginning transaction"); Transactions.getUserTransaction().begin(); } } catch (Exception e) { //TODO: what should we *really* do here?? throw new IllegalStateException("Could not start transaction", e); } } private void commit() { try { if ( Transactions.isTransactionActive() ) { log.debug("committing transaction"); Transactions.getUserTransaction().commit(); } } catch (Exception e) { //TODO: what should we *really* do here?? throw new IllegalStateException("Could not commit transaction", e); } } } 1.1 date: 2006/04/09 22:31:34; author: gavin; state: Exp;jboss-seam/src/main/org/jboss/seam/jsf/SeamPortletPhaseListener.java Index: SeamPortletPhaseListener.java =================================================================== /* * JBoss, Home of Professional Open Source * * Distributable under LGPL license. * See terms of license at gnu.org. */ package org.jboss.seam.jsf; import static javax.faces.event.PhaseId.ANY_PHASE; import static javax.faces.event.PhaseId.INVOKE_APPLICATION; import static javax.faces.event.PhaseId.RENDER_RESPONSE; import static javax.faces.event.PhaseId.RESTORE_VIEW; import java.util.Map; import java.util.Set; import javax.faces.context.ExternalContext; import javax.faces.context.FacesContext; import javax.faces.el.MethodBinding; import javax.faces.event.PhaseEvent; import javax.faces.event.PhaseId; import javax.faces.event.PhaseListener; import javax.faces.model.DataModel; import org.jboss.logging.Logger; import org.jboss.seam.contexts.Contexts; import org.jboss.seam.contexts.Lifecycle; import org.jboss.seam.contexts.Session; import org.jboss.seam.core.FacesMessages; import org.jboss.seam.core.Init; import org.jboss.seam.core.Manager; import org.jboss.seam.core.Pageflow; import org.jboss.seam.core.Pages; /** * Manages the Seam contexts associated with a JSF request. * Manages the thread/context associations throught the * lifecycle of a JSF request. * * @author Gavin King */ public class SeamPortletPhaseListener implements PhaseListener { private static final Logger log = Logger.getLogger( SeamPortletPhaseListener.class ); public PhaseId getPhaseId() { return ANY_PHASE; } public void beforePhase(PhaseEvent event) { log.trace( "before phase: " + event.getPhaseId() ); Lifecycle.setPhaseId( event.getPhaseId() ); if ( event.getPhaseId() == RESTORE_VIEW || event.getPhaseId() == RENDER_RESPONSE ) { Lifecycle.beginRequest( event.getFacesContext().getExternalContext() ); } if ( event.getPhaseId() == RENDER_RESPONSE ) { restoreAnyConversationContext(event); callPageActions(event); FacesMessages.instance().beforeRenderResponse(); Manager.instance().prepareBackswitch(event); //if the page actions called responseComplete(), //we need to call beforeSaveState(), since the //component tree will not get rendered if ( event.getFacesContext().getResponseComplete() ) { beforeSaveState( event.getFacesContext() ); //MyFaces bug: ? Lifecycle.endRequest( event.getFacesContext().getExternalContext() ); } } } public void afterPhase(PhaseEvent event) { log.trace( "after phase: " + event.getPhaseId() ); if ( event.getPhaseId() == RESTORE_VIEW ) { restoreAnyConversationContext(event); } else if ( event.getPhaseId() == RENDER_RESPONSE ) { Lifecycle.endRequest( event.getFacesContext().getExternalContext() ); } else if ( event.getPhaseId() == INVOKE_APPLICATION || event.getFacesContext().getResponseComplete() ) { Manager.instance().beforeRedirect(); beforeSaveState( event.getFacesContext() ); Lifecycle.endRequest( event.getFacesContext().getExternalContext() ); } Lifecycle.setPhaseId(null); } private void callPageActions(PhaseEvent event) { boolean actionsWereCalled = false; actionsWereCalled = callAction( event.getFacesContext() ) || actionsWereCalled; actionsWereCalled = Pages.instance().callAction() || actionsWereCalled; if (actionsWereCalled) afterPageActions(); } protected void afterPageActions() {} private boolean callAction(FacesContext facesContext) { //TODO: refactor with Pages.callAction!! boolean result = false; String outcome = (String) facesContext.getExternalContext().getRequestParameterMap().get("actionOutcome"); String fromAction = outcome; if (outcome==null) { String action = (String) facesContext.getExternalContext().getRequestParameterMap().get("actionMethod"); if (action!=null) { String expression = "#{" + action + "}"; if ( !isActionAllowed(facesContext, expression) ) return result; result = true; MethodBinding actionBinding = facesContext.getApplication().createMethodBinding(expression, null); outcome = (String) actionBinding.invoke( facesContext, null ); fromAction = expression; } } if (outcome!=null) { facesContext.getApplication().getNavigationHandler().handleNavigation(facesContext, fromAction, outcome); } return result; } private boolean isActionAllowed(FacesContext facesContext, String expression) { Map applicationMap = facesContext.getExternalContext().getApplicationMap(); Set actions = (Set) applicationMap.get("org.jboss.seam.actions"); if (actions==null) return false; synchronized (actions) { return actions.contains(expression); } } /** * Called just before the StateManager serializes the component tree */ static void beforeSaveState(FacesContext ctx) { log.debug( "Before saving state" ); /*if ( !Init.instance().isClientSideConversations() ) { // difficult question: does this really need to happen before // storeAnyConversationContext, or could it be done later Manager.instance().conversationTimeout( ctx.getExternalContext() ); }*/ storeAnyConversationContext(ctx); } private static void restoreAnyConversationContext(PhaseEvent event) { Lifecycle.resumePage(); ExternalContext externalContext = event.getFacesContext().getExternalContext(); Map parameters = getParameters(event); Manager.instance().restoreConversation( parameters ); Lifecycle.resumeConversation( externalContext ); if ( Init.instance().isJbpmInstalled() ) { Pageflow.instance().validatePageflow(); } Manager.instance().handleConversationPropagation(parameters); selectDataModelRow(parameters); log.debug( "After restore view, conversation context: " + Contexts.getConversationContext() ); } private static void selectDataModelRow(Map parameters) { String dataModelSelection = (String) parameters.get("dataModelSelection"); if (dataModelSelection!=null) { int loc = dataModelSelection.indexOf('['); String name = dataModelSelection.substring(0, loc); int index = Integer.parseInt( dataModelSelection.substring( loc+1, dataModelSelection.length()-1 ) ); Object value = Contexts.lookupInStatefulContexts(name); if (value!=null) { ( (DataModel) value ).setRowIndex(index); } } } static void storeAnyConversationContext(FacesContext ctx) { Lifecycle.flushClientConversation(); if ( !Contexts.isConversationContextActive() ) { log.debug( "No active conversation context" ); } else { Session session = Session.getSession(ctx.getExternalContext(), true); Manager.instance().storeConversation( session, ctx.getExternalContext().getResponse() ); } Lifecycle.flushPage(); } private static Map getParameters(PhaseEvent event) { return event.getFacesContext().getExternalContext().getRequestParameterMap(); } private static Map getAttributes(FacesContext facesContext) { return facesContext.getViewRoot().getAttributes(); } } |