/*
* 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.context;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.el.ELContext;
import javax.el.ExpressionFactory;
import javax.el.ValueExpression;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIViewRoot;
import javax.faces.component.visit.VisitContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import org.primefaces.expression.SearchExpressionFacade;
import org.primefaces.util.AjaxRequestBuilder;
import org.primefaces.util.CSVBuilder;
import org.primefaces.util.ComponentUtils;
import org.primefaces.util.Constants;
import org.primefaces.util.StringEncrypter;
import org.primefaces.util.WidgetBuilder;
import org.primefaces.visit.ResetInputVisitCallback;
public class DefaultRequestContext extends RequestContext {
private final static String ATTRIBUTES_KEY = "ATTRIBUTES";
private final static String CALLBACK_PARAMS_KEY = "CALLBACK_PARAMS";
private final static String EXECUTE_SCRIPT_KEY = "EXECUTE_SCRIPT";
private final static String APPLICATION_CONTEXT_KEY = DefaultApplicationContext.class.getName();
private Map<Object, Object> attributes;
private WidgetBuilder widgetBuilder;
private AjaxRequestBuilder ajaxRequestBuilder;
private CSVBuilder csvBuilder;
private FacesContext context;
private StringEncrypter encrypter;
private ApplicationContext applicationContext;
private Boolean ignoreAutoUpdate;
private Boolean rtl;
public DefaultRequestContext(FacesContext context) {
this.context = context;
this.attributes = new HashMap<Object, Object>();
}
@Override
public boolean isAjaxRequest() {
return context.getPartialViewContext().isAjaxRequest();
}
@Override
public void addCallbackParam(String name, Object value) {
getCallbackParams().put(name, value);
}
@Override
public void execute(String script) {
getScriptsToExecute().add(script);
}
@Override
@SuppressWarnings("unchecked")
public Map<String, Object> getCallbackParams() {
if(attributes.get(CALLBACK_PARAMS_KEY) == null) {
attributes.put(CALLBACK_PARAMS_KEY, new HashMap<String, Object>());
}
return (Map<String, Object>) attributes.get(CALLBACK_PARAMS_KEY);
}
@Override
@SuppressWarnings("unchecked")
public List<String> getScriptsToExecute() {
if(attributes.get(EXECUTE_SCRIPT_KEY) == null) {
attributes.put(EXECUTE_SCRIPT_KEY, new ArrayList<String>());
}
return (List<String>) attributes.get(EXECUTE_SCRIPT_KEY);
}
@Override
public WidgetBuilder getWidgetBuilder() {
if (this.widgetBuilder == null) {
this.widgetBuilder = new WidgetBuilder(context);
}
return widgetBuilder;
}
@Override
public AjaxRequestBuilder getAjaxRequestBuilder() {
if (this.ajaxRequestBuilder == null) {
this.ajaxRequestBuilder = new AjaxRequestBuilder(context);
}
return ajaxRequestBuilder;
}
@Override
public CSVBuilder getCSVBuilder() {
if (this.csvBuilder == null) {
this.csvBuilder = new CSVBuilder(context);
}
return csvBuilder;
}
@Override
public void scrollTo(String clientId) {
this.execute("PrimeFaces.scrollTo('" + clientId + "');");
}
@Override
public void update(String clientId) {
context.getPartialViewContext().getRenderIds().add(clientId);
}
@Override
public void update(Collection<String> collection) {
context.getPartialViewContext().getRenderIds().addAll(collection);
}
@Override
public void reset(Collection<String> expressions) {
VisitContext visitContext = VisitContext.createVisitContext(context, null, ComponentUtils.VISIT_HINTS_SKIP_UNRENDERED);
for(String expression : expressions) {
reset(visitContext, expression);
}
}
@Override
public void reset(String expressions) {
VisitContext visitContext = VisitContext.createVisitContext(context, null, ComponentUtils.VISIT_HINTS_SKIP_UNRENDERED);
reset(visitContext, expressions);
}
private void reset(VisitContext visitContext, String expressions) {
UIViewRoot root = context.getViewRoot();
List<UIComponent> components = SearchExpressionFacade.resolveComponents(context, root, expressions);
for (UIComponent component : components) {
component.visitTree(visitContext, ResetInputVisitCallback.INSTANCE);
}
}
@Override
public void openDialog(String outcome) {
this.getAttributes().put(Constants.DIALOG_FRAMEWORK.OUTCOME, outcome);
}
@Override
public void openDialog(String outcome, Map<String,Object> options, Map<String,List<String>> params) {
this.getAttributes().put(Constants.DIALOG_FRAMEWORK.OUTCOME, outcome);
if(options != null)
this.getAttributes().put(Constants.DIALOG_FRAMEWORK.OPTIONS, options);
if(params != null)
this.getAttributes().put(Constants.DIALOG_FRAMEWORK.PARAMS, params);
}
@Override
public void closeDialog(Object data) {
Map<String,String> params = context.getExternalContext().getRequestParameterMap();
String pfdlgcid = params.get(Constants.DIALOG_FRAMEWORK.CONVERSATION_PARAM);
if(data != null) {
Map<String,Object> session = context.getExternalContext().getSessionMap();
session.put(pfdlgcid, data);
}
this.execute("parent.PrimeFaces.closeDialog({pfdlgcid:'" + pfdlgcid + "'});");
}
@Override
public void showMessageInDialog(FacesMessage message) {
this.execute("PrimeFaces.showMessageInDialog({severity:'" + message.getSeverity() +
"',summary:'" + message.getSummary() + "',detail:'" + message.getDetail() + "'});");
}
@Override
public void release() {
setCurrentInstance(null, context);
attributes = null;
widgetBuilder = null;
ajaxRequestBuilder = null;
context = null;
applicationContext = null;
encrypter = null;
}
@Override
public Map<Object, Object> getAttributes() {
if(attributes.get(ATTRIBUTES_KEY) == null) {
attributes.put(ATTRIBUTES_KEY, new HashMap<Object, Object>());
}
return (Map<Object, Object>) attributes.get(ATTRIBUTES_KEY);
}
@Override
public ApplicationContext getApplicationContext() {
if (this.applicationContext == null) {
// get applicationContext from application map
this.applicationContext = (ApplicationContext) context.getExternalContext().getApplicationMap().get(APPLICATION_CONTEXT_KEY);
if (this.applicationContext == null) {
this.applicationContext = new DefaultApplicationContext(context);
context.getExternalContext().getApplicationMap().put(APPLICATION_CONTEXT_KEY, this.applicationContext);
}
}
return applicationContext;
}
@Override
public StringEncrypter getEncrypter() {
// lazy init, it's not required for all pages
if (encrypter == null) {
// we can't store it in the ApplicationMap, as Cipher isn't thread safe
encrypter = new StringEncrypter(getApplicationContext().getConfig().getSecretKey());
}
return encrypter;
}
@Override
public boolean isSecure() {
Object request = context.getExternalContext().getRequest();
if(request instanceof HttpServletRequest) {
return ((HttpServletRequest) request).isSecure();
}
else {
try {
Method method = request.getClass().getDeclaredMethod("isSecure", new Class[0]);
return (Boolean) method.invoke(request, null);
} catch(Exception e) {
return false;
}
}
}
@Override
public boolean isIgnoreAutoUpdate() {
if (ignoreAutoUpdate == null) {
Object ignoreAutoUpdateObject = context.getExternalContext().getRequestParameterMap().get(Constants.RequestParams.IGNORE_AUTO_UPDATE_PARAM);
ignoreAutoUpdate = (null != ignoreAutoUpdateObject && "true".equals(ignoreAutoUpdateObject)) ? true : false;
}
return ignoreAutoUpdate;
}
@Override
public boolean isRTL()
{
if (rtl == null) {
String param = context.getExternalContext().getInitParameter(Constants.ContextParams.DIRECTION);
if (param == null) {
rtl = false;
} else {
ELContext elContext = context.getELContext();
ExpressionFactory expressionFactory = context.getApplication().getExpressionFactory();
ValueExpression expression = expressionFactory.createValueExpression(elContext, param, String.class);
String expressionValue = (String) expression.getValue(elContext);
rtl = (expressionValue == null) ? false : expressionValue.equalsIgnoreCase("rtl");
}
}
return rtl;
}
}