/*
* Copyright 2009-2014 PrimeTek.
*
* 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.primefaces.application;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import javax.faces.application.ConfigurableNavigationHandler;
import javax.faces.application.NavigationCase;
import javax.faces.context.FacesContext;
import org.primefaces.context.RequestContext;
import org.primefaces.util.Constants;
public class DialogNavigationHandler extends ConfigurableNavigationHandler {
private ConfigurableNavigationHandler base;
public DialogNavigationHandler(ConfigurableNavigationHandler base) {
this.base = base;
}
@Override
public void handleNavigation(FacesContext context, String fromAction, String outcome) {
RequestContext requestContext = RequestContext.getCurrentInstance();
Map<Object,Object> attrs = requestContext.getAttributes();
String dialogOutcome = (String) attrs.get(Constants.DIALOG_FRAMEWORK.OUTCOME);
if(dialogOutcome != null) {
NavigationCase navCase = getNavigationCase(context, fromAction, dialogOutcome);
String toViewId = navCase.getToViewId(context);
Map<String,Object> options = (Map<String,Object>) attrs.get(Constants.DIALOG_FRAMEWORK.OPTIONS);
Map<String,List<String>> params = (Map<String,List<String>>) attrs.get(Constants.DIALOG_FRAMEWORK.PARAMS);
if (params == null) {
params = Collections.emptyMap();
}
boolean includeViewParams = false;
if (options != null && options.containsKey(Constants.DIALOG_FRAMEWORK.INCLUDE_VIEW_PARAMS)) {
includeViewParams = (Boolean) options.get(Constants.DIALOG_FRAMEWORK.INCLUDE_VIEW_PARAMS);
}
String url = context.getApplication().getViewHandler().getBookmarkableURL(context, toViewId, params, includeViewParams);
StringBuilder sb = new StringBuilder();
String sourceComponentId = (String) attrs.get(Constants.DIALOG_FRAMEWORK.SOURCE_COMPONENT);
String sourceWidget = (String) attrs.get(Constants.DIALOG_FRAMEWORK.SOURCE_WIDGET);
String pfdlgcid = UUID.randomUUID().toString();
sb.append("PrimeFaces.openDialog({url:'").append(url).append("',pfdlgcid:'").append(pfdlgcid)
.append("',sourceComponentId:'").append(sourceComponentId).append("'");
if(sourceWidget != null) {
sb.append(",sourceWidget:PF('").append(sourceWidget).append("')");
}
sb.append(",options:{");
if(options != null && options.size() > 0) {
for(Iterator<String> it = options.keySet().iterator(); it.hasNext();) {
String optionName = it.next();
Object optionValue = options.get(optionName);
sb.append(optionName).append(":").append(optionValue);
if(it.hasNext())
sb.append(",");
}
}
sb.append("}});");
requestContext.execute(sb.toString());
sb.setLength(0);
}
else {
base.handleNavigation(context, fromAction, outcome);
}
}
@Override
public NavigationCase getNavigationCase(FacesContext context, String fromAction, String outcome) {
return base.getNavigationCase(context, fromAction, outcome);
}
@Override
public Map<String, Set<NavigationCase>> getNavigationCases() {
return base.getNavigationCases();
}
}