package org.jboss.seam.jsf; import java.io.IOException; import javax.faces.application.StateManager; import javax.faces.component.UIViewRoot; import javax.faces.context.FacesContext; import org.jboss.seam.contexts.Contexts; import org.jboss.seam.navigation.Pages; /** * A wrapper for the JSF implementation's StateManager that allows * us to intercept saving of the serialized component tree. This * is quite ugly but was needed in order to allow conversations to * be started and manipulated during the RENDER_RESPONSE phase. * * @author Gavin King */ @SuppressWarnings("deprecation") public class SeamStateManager extends StateManager { private final StateManager stateManager; public SeamStateManager(StateManager sm) { this.stateManager = sm; } @Override protected Object getComponentStateToSave(FacesContext ctx) { throw new UnsupportedOperationException(); } @Override protected Object getTreeStructureToSave(FacesContext ctx) { throw new UnsupportedOperationException(); } @Override protected void restoreComponentState(FacesContext ctx, UIViewRoot viewRoot, String str) { throw new UnsupportedOperationException(); } @Override protected UIViewRoot restoreTreeStructure(FacesContext ctx, String str1, String str2) { throw new UnsupportedOperationException(); } @Override public SerializedView saveSerializedView(FacesContext facesContext) { if ( Contexts.isPageContextActive() ) { //store the page parameters in the view root Pages.instance().updateStringValuesInPageContextUsingModel(facesContext); } return stateManager.saveSerializedView(facesContext); } @Override public void writeState(FacesContext ctx, SerializedView sv) throws IOException { stateManager.writeState(ctx, sv); } @Override public UIViewRoot restoreView(FacesContext ctx, String str1, String str2) { return stateManager.restoreView(ctx, str1, str2); } @Override public Object saveView(FacesContext facesContext) { if ( Contexts.isPageContextActive() ) { //store the page parameters in the view root Pages.instance().updateStringValuesInPageContextUsingModel(facesContext); } return stateManager.saveView(facesContext); } @Override public void writeState(FacesContext ctx, Object sv) throws IOException { stateManager.writeState(ctx, sv); } @Override public boolean isSavingStateInClient(FacesContext ctx) { return stateManager.isSavingStateInClient(ctx); } }