package org.jboss.seam.jsf; import java.util.Map; import java.util.Set; import javax.faces.application.ConfigurableNavigationHandler; import javax.faces.application.NavigationCase; import javax.faces.application.NavigationHandler; import javax.faces.context.FacesContext; import org.jboss.seam.core.Init; import org.jboss.seam.faces.FacesManager; import org.jboss.seam.navigation.Pages; import org.jboss.seam.pageflow.Pageflow; /** * Adds three new navigation possibilities beyond the * frumpy JSF navigation rules: returning the view id * directly, pages.xml, and jPDL-based pageflows. * * @author Gavin King * */ public class SeamNavigationHandler extends ConfigurableNavigationHandler { private final NavigationHandler baseNavigationHandler; public SeamNavigationHandler(NavigationHandler navigationHandler) { this.baseNavigationHandler = navigationHandler; } @Override public void handleNavigation(FacesContext context, String fromAction, String outcome) { if ( !context.getResponseComplete() ) //workaround for a bug in MyFaces { if ( isOutcomeViewId(outcome) ) { FacesManager.instance().interpolateAndRedirect(outcome); } else if ( Init.instance().isJbpmInstalled() && Pageflow.instance().isInProcess() && Pageflow.instance().hasTransition(outcome) ) { Pageflow.instance().navigate(context, outcome); } else if ( !Pages.instance().navigate(context, fromAction, outcome) ) { baseNavigationHandler.handleNavigation(context, fromAction, outcome); } } } private static boolean isOutcomeViewId(String outcome) { return outcome!=null && outcome.startsWith("/"); } @Override public NavigationCase getNavigationCase(FacesContext context, String fromAction, String outcome) { if (baseNavigationHandler instanceof ConfigurableNavigationHandler) { return ((ConfigurableNavigationHandler) baseNavigationHandler).getNavigationCase(context, fromAction, outcome); } else { return null; } } @Override public Map<String, Set<NavigationCase>> getNavigationCases() { if (baseNavigationHandler instanceof ConfigurableNavigationHandler) { return ((ConfigurableNavigationHandler) baseNavigationHandler).getNavigationCases(); } else { return null; } } }