blob: 17a2da31f5e9124bbf9268fa8d3e82360d03193b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.empire.jsf2.pages;
import java.util.HashMap;
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.component.UIViewRoot;
import javax.faces.context.FacesContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PageNavigationHandler extends ConfigurableNavigationHandler
{
private static final Logger log = LoggerFactory.getLogger(PageNavigationHandler.class);
private static boolean initialized = false;
public static boolean isInitialized()
{
return initialized;
}
private NavigationHandler parent;
public PageNavigationHandler(NavigationHandler parent)
{
this.parent = parent;
initialized = true;
// Log
log.info("PageNavigatonHandler sucessfully established.");
}
@Override
public void handleNavigation(FacesContext context, String from, String outcome)
{
// boolean redirect = (outcome.indexOf("faces-redirect=true")>=0);
parent.handleNavigation(context, from, outcome);
// Check outcome
if (outcome==null)
return;
NavigationCase navigationCase = getNavigationCase(context, from, outcome);
boolean redirect = (navigationCase != null ?
navigationCase.isRedirect() :
(outcome.indexOf("faces-redirect=true") >= 0));
// Check for forward (not redirect)
if (!redirect)
{
log.debug("Handling forward navigation.");
/*
NavigationCase navigationCase = getNavigationCase(context, fromAction, outcome);
if (navigationCase == null || navigationCase.isRedirect()) {
handler.handleNavigation(context, fromAction, outcome);
} else {
UIViewRoot viewRoot = context.getViewRoot();
Collection<UIForm> forms = findUIForms(viewRoot);
Map<String, Object> viewAttributes = viewRoot.getViewMap();
HashMap idToPreviousParametersMapping = (HashMap) viewAttributes.get(DeltaSubmitPhaseListener.PreviousParameters);
if (idToPreviousParametersMapping == null) {
idToPreviousParametersMapping = new HashMap();
viewAttributes.put(DeltaSubmitPhaseListener.PreviousParameters, idToPreviousParametersMapping);
}
for (UIForm form : forms) {
Map previousParameters = (Map) form.getAttributes().get(DeltaSubmitPhaseListener.PreviousParameters);
if (previousParameters != null) {
idToPreviousParametersMapping.put(form.getId(), new HashMap(previousParameters));
}
}
handler.handleNavigation(context, fromAction, outcome);
//propagate previously calculated submit parameters
context.getViewRoot().getViewMap().put(DeltaSubmitPhaseListener.PreviousParameters, idToPreviousParametersMapping);
}
*/
UIViewRoot viewRoot = context.getViewRoot();
Map<String, Object> viewMap = viewRoot.getViewMap();
Map<String, String> paramsMap = getActionParameterMap(outcome);
if (paramsMap!=null)
{
log.debug("Setting FORWARD_PAGE_PARAMS for outcome {}.", outcome);
viewMap.put(PagePhaseListener.FORWARD_PAGE_PARAMS, paramsMap);
}
}
}
private Map<String, String> getActionParameterMap(String s)
{
int i = -1;
Map<String, String> map = null;
while ((i=s.indexOf('=', i+1))>0)
{
int n = s.lastIndexOf('&', i);
if (n<0)
n = s.lastIndexOf('?', i);
if (n<0)
continue; // something is wrong
int v = s.indexOf('&', i);
String name = s.substring(n+1, i);
String value = (v>i) ? s.substring(i+1, v) : s.substring(i+1);
log.debug("Adding view parameter '{}' with value '{}'.", name, value);
if (map==null)
map = new HashMap<String, String>();
map.put(name, value);
}
return map;
}
@Override
public NavigationCase getNavigationCase(FacesContext context, String fromAction, String outcome)
{
if (parent instanceof ConfigurableNavigationHandler)
{
NavigationCase navigationCase = ((ConfigurableNavigationHandler) parent).getNavigationCase(context, fromAction, outcome);
/*
if (navigationCase!=null && !navigationCase.isRedirect())
{
log.trace("Performing a forward operation!");
}
*/
return navigationCase;
}
else
{
return null;
}
}
@Override
public Map<String, Set<NavigationCase>> getNavigationCases()
{
if (parent instanceof ConfigurableNavigationHandler)
{
return ((ConfigurableNavigationHandler) parent).getNavigationCases();
}
else
{
return null;
}
}
}