/**
* Copyright (c) 2000-2017 Liferay, Inc. All rights reserved.
*
* 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 com.liferay.faces.util.context.internal;
import java.io.Serializable;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.el.ELContext;
import javax.el.ELResolver;
import javax.faces.FactoryFinder;
import javax.faces.application.Application;
import javax.faces.application.FacesMessage;
import javax.faces.application.FacesMessage.Severity;
import javax.faces.application.NavigationHandler;
import javax.faces.application.ViewHandler;
import javax.faces.component.ActionSource;
import javax.faces.component.EditableValueHolder;
import javax.faces.component.UIComponent;
import javax.faces.component.UIForm;
import javax.faces.component.UIViewRoot;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseListener;
import javax.faces.lifecycle.LifecycleFactory;
import javax.servlet.http.HttpServletRequest;
import com.liferay.faces.util.component.ComponentUtil;
import com.liferay.faces.util.context.FacesContextHelper;
import com.liferay.faces.util.helper.BooleanHelper;
import com.liferay.faces.util.helper.IntegerHelper;
import com.liferay.faces.util.helper.LongHelper;
import com.liferay.faces.util.i18n.I18n;
import com.liferay.faces.util.i18n.I18nFactory;
/**
* @author Neil Griffin
*/
public class FacesContextHelperImpl implements FacesContextHelper, Serializable {
// serialVersionUID
private static final long serialVersionUID = 5363868926989717581L;
// Private Constants
private static final String UNEXPECTED_ERROR_MSG_ID = "an-unexpected-error-occurred";
private static final String SUCCESS_INFO_MSG_ID = "your-request-processed-successfully";
@Override
public void addComponentErrorMessage(String clientId, String messageId) {
addComponentErrorMessage(FacesContext.getCurrentInstance(), clientId, messageId);
}
@Override
public void addComponentErrorMessage(FacesContext facesContext, String clientId, String messageId) {
addMessage(facesContext, clientId, FacesMessage.SEVERITY_ERROR, messageId);
}
@Override
public void addComponentErrorMessage(String clientId, String messageId, Object... arguments) {
addComponentErrorMessage(FacesContext.getCurrentInstance(), clientId, messageId, arguments);
}
@Override
public void addComponentErrorMessage(FacesContext facesContext, String clientId, String messageId,
Object... arguments) {
addMessage(facesContext, clientId, FacesMessage.SEVERITY_ERROR, messageId, arguments);
}
@Override
public void addComponentInfoMessage(String clientId, String messageId) {
addComponentInfoMessage(FacesContext.getCurrentInstance(), clientId, messageId);
}
@Override
public void addComponentInfoMessage(FacesContext facesContext, String clientId, String messageId) {
addMessage(facesContext, clientId, FacesMessage.SEVERITY_INFO, messageId);
}
@Override
public void addComponentInfoMessage(String clientId, String messageId, Object... arguments) {
addComponentInfoMessage(FacesContext.getCurrentInstance(), clientId, messageId, arguments);
}
@Override
public void addComponentInfoMessage(FacesContext facesContext, String clientId, String messageId,
Object... arguments) {
addMessage(facesContext, clientId, FacesMessage.SEVERITY_INFO, messageId, arguments);
}
@Override
public void addGlobalErrorMessage(String messageId) {
addGlobalErrorMessage(FacesContext.getCurrentInstance(), messageId);
}
@Override
public void addGlobalErrorMessage(FacesContext facesContext, String messageId) {
addComponentErrorMessage(facesContext, null, messageId);
}
@Override
public void addGlobalErrorMessage(String messageId, Object... arguments) {
addGlobalErrorMessage(FacesContext.getCurrentInstance(), messageId, arguments);
}
@Override
public void addGlobalErrorMessage(FacesContext facesContext, String messageId, Object... arguments) {
addComponentErrorMessage(facesContext, null, messageId, arguments);
}
@Override
public void addGlobalInfoMessage(String messageId) {
addGlobalInfoMessage(FacesContext.getCurrentInstance(), messageId);
}
@Override
public void addGlobalInfoMessage(FacesContext facesContext, String messageId) {
addComponentInfoMessage(facesContext, null, messageId);
}
@Override
public void addGlobalInfoMessage(String messageId, Object... arguments) {
addGlobalInfoMessage(FacesContext.getCurrentInstance(), messageId, arguments);
}
@Override
public void addGlobalInfoMessage(FacesContext facesContext, String messageId, Object... arguments) {
addComponentInfoMessage(facesContext, null, messageId, arguments);
}
/**
* @see FacesContextHelper#addGlobalSuccessInfoMessage()
*/
@Override
public void addGlobalSuccessInfoMessage() {
addGlobalSuccessInfoMessage(FacesContext.getCurrentInstance());
}
/**
* @see FacesContextHelper#addGlobalSuccessInfoMessage()
*/
@Override
public void addGlobalSuccessInfoMessage(FacesContext facesContext) {
addGlobalInfoMessage(facesContext, SUCCESS_INFO_MSG_ID);
}
/**
* @see FacesContextHelper#addGlobalUnexpectedErrorMessage()
*/
@Override
public void addGlobalUnexpectedErrorMessage() {
addGlobalUnexpectedErrorMessage(FacesContext.getCurrentInstance());
}
/**
* @see FacesContextHelper#addGlobalUnexpectedErrorMessage()
*/
@Override
public void addGlobalUnexpectedErrorMessage(FacesContext facesContext) {
addGlobalErrorMessage(facesContext, UNEXPECTED_ERROR_MSG_ID);
}
@Override
public void addMessage(String clientId, Severity severity, String messageId) {
addMessage(FacesContext.getCurrentInstance(), clientId, severity, messageId);
}
@Override
public void addMessage(FacesContext facesContext, String clientId, Severity severity, String messageId) {
Locale locale = getLocale(facesContext);
I18n i18n = getI18n(facesContext);
FacesMessage facesMessage = i18n.getFacesMessage(facesContext, locale, severity, messageId);
facesContext.addMessage(clientId, facesMessage);
}
@Override
public void addMessage(String clientId, Severity severity, String messageId, Object... arguments) {
addMessage(FacesContext.getCurrentInstance(), clientId, severity, messageId, arguments);
}
@Override
public void addMessage(FacesContext facesContext, String clientId, Severity severity, String messageId,
Object... arguments) {
Locale locale = getLocale(facesContext);
I18n i18n = getI18n(facesContext);
FacesMessage facesMessage = i18n.getFacesMessage(facesContext, locale, severity, messageId, arguments);
facesContext.addMessage(clientId, facesMessage);
}
@Override
public FacesContext getFacesContext() {
return getFacesContext(FacesContext.getCurrentInstance());
}
public FacesContext getFacesContext(FacesContext facesContext) {
return facesContext;
}
@Override
public Locale getLocale() {
return getLocale(FacesContext.getCurrentInstance());
}
@Override
public Locale getLocale(FacesContext facesContext) {
UIViewRoot viewRoot = facesContext.getViewRoot();
Locale locale = viewRoot.getLocale();
// If the JSF ViewRoot didn't return a locale, then try and get it from the JSF Application.
if (locale == null) {
Application application = facesContext.getApplication();
locale = application.getDefaultLocale();
}
// Otherwise, if we couldn't determine the locale, just use the server's default value.
if (locale == null) {
locale = Locale.getDefault();
}
return locale;
}
@Override
public String getMessage(String messageId) {
return getMessage(FacesContext.getCurrentInstance(), messageId);
}
@Override
public String getMessage(FacesContext facesContext, String messageId) {
return getMessage(facesContext, getLocale(facesContext), messageId);
}
@Override
public String getMessage(String messageId, Object... arguments) {
return getMessage(FacesContext.getCurrentInstance(), messageId, arguments);
}
@Override
public String getMessage(Locale locale, String messageId) {
return getMessage(FacesContext.getCurrentInstance(), locale, messageId);
}
@Override
public String getMessage(FacesContext facesContext, String messageId, Object... arguments) {
I18n i18n = getI18n(facesContext);
return i18n.getMessage(facesContext, getLocale(facesContext), messageId, arguments);
}
@Override
public String getMessage(FacesContext facesContext, Locale locale, String messageId) {
I18n i18n = getI18n(facesContext);
return i18n.getMessage(facesContext, locale, messageId);
}
@Override
public String getMessage(Locale locale, String messageId, Object... arguments) {
return getMessage(FacesContext.getCurrentInstance(), locale, messageId, arguments);
}
@Override
public String getMessage(FacesContext facesContext, Locale locale, String messageId, Object... arguments) {
I18n i18n = getI18n(facesContext);
return i18n.getMessage(facesContext, locale, messageId, arguments);
}
@Override
public String getNamespace() {
return getNamespace(FacesContext.getCurrentInstance());
}
@Override
public String getNamespace(FacesContext facesContext) {
return facesContext.getExternalContext().encodeNamespace("");
}
@Override
public UIForm getParentForm(final UIComponent uiComponent) {
UIComponent parent = uiComponent;
while ((parent != null) && !(parent instanceof UIForm)) {
parent = parent.getParent();
}
return (UIForm) parent;
}
@Override
public Object getRequestAttribute(String name) {
return getRequestAttribute(FacesContext.getCurrentInstance(), name);
}
@Override
public Object getRequestAttribute(FacesContext facesContext, String name) {
ExternalContext externalContext = facesContext.getExternalContext();
HttpServletRequest httpServletRequest = (HttpServletRequest) externalContext.getRequest();
return httpServletRequest.getAttribute(name);
}
@Override
public String getRequestContextPath() {
return getRequestContextPath(FacesContext.getCurrentInstance());
}
@Override
public String getRequestContextPath(FacesContext facesContext) {
ExternalContext externalContext = facesContext.getExternalContext();
return externalContext.getRequestContextPath();
}
@Override
public String getRequestParameter(String name) {
return getRequestParameter(FacesContext.getCurrentInstance(), name);
}
@Override
public String getRequestParameter(FacesContext facesContext, String name) {
ExternalContext externalContext = facesContext.getExternalContext();
Map<String, String> requestParameterMap = externalContext.getRequestParameterMap();
return requestParameterMap.get(name);
}
@Override
public boolean getRequestParameterAsBool(String name, boolean defaultValue) {
return getRequestParameterAsBool(FacesContext.getCurrentInstance(), name, defaultValue);
}
@Override
public boolean getRequestParameterAsBool(FacesContext facesContext, String name, boolean defaultValue) {
return BooleanHelper.toBoolean(getRequestParameter(facesContext, name), defaultValue);
}
@Override
public int getRequestParameterAsInt(String name, int defaultValue) {
return getRequestParameterAsInt(FacesContext.getCurrentInstance(), name, defaultValue);
}
@Override
public int getRequestParameterAsInt(FacesContext facesContext, String name, int defaultValue) {
return IntegerHelper.toInteger(getRequestParameter(facesContext, name), defaultValue);
}
@Override
public long getRequestParameterAsLong(String name, long defaultValue) {
return getRequestParameterAsLong(FacesContext.getCurrentInstance(), name, defaultValue);
}
@Override
public long getRequestParameterAsLong(FacesContext facesContext, String name, long defaultValue) {
return LongHelper.toLong(getRequestParameter(facesContext, name), defaultValue);
}
@Override
public String getRequestParameterFromMap(String name) {
return getRequestParameterFromMap(FacesContext.getCurrentInstance(), name);
}
@Override
public String getRequestParameterFromMap(FacesContext facesContext, String name) {
ExternalContext externalContext = facesContext.getExternalContext();
return externalContext.getRequestParameterMap().get(name);
}
@Override
public Map<String, String> getRequestParameterMap() {
return getRequestParameterMap(FacesContext.getCurrentInstance());
}
@Override
public Map<String, String> getRequestParameterMap(FacesContext facesContext) {
ExternalContext externalContext = facesContext.getExternalContext();
return externalContext.getRequestParameterMap();
}
@Override
public String getRequestQueryString() {
return getRequestQueryString(FacesContext.getCurrentInstance());
}
@Override
public String getRequestQueryString(FacesContext facesContext) {
return (String) getRequestAttribute(facesContext, "javax.servlet.forward.query_string");
}
@Override
public String getRequestQueryStringParameter(String name) {
return getRequestQueryStringParameter(FacesContext.getCurrentInstance(), name);
}
@Override
public String getRequestQueryStringParameter(FacesContext facesContext, String name) {
String value = null;
String queryString = getRequestQueryString(facesContext);
if (queryString != null) {
String[] queryStringTokens = queryString.split("&");
boolean found = false;
for (int i = 0; (!found && (i < queryStringTokens.length)); i++) {
String nameValuePair = queryStringTokens[i];
String[] nameValuePairArray = nameValuePair.split("=");
found = nameValuePairArray[0].equals(name);
if (found && (nameValuePairArray.length > 1)) {
value = nameValuePairArray[1];
}
}
}
return value;
}
@Override
public Object getSession(boolean create) {
return getSession(FacesContext.getCurrentInstance(), create);
}
@Override
public Object getSession(FacesContext facesContext, boolean create) {
ExternalContext externalContext = facesContext.getExternalContext();
return externalContext.getSession(create);
}
@Override
public Object getSessionAttribute(String name) {
return getSessionAttribute(FacesContext.getCurrentInstance(), name);
}
@Override
public Object getSessionAttribute(FacesContext facesContext, String name) {
ExternalContext externalContext = facesContext.getExternalContext();
Map<String, Object> sessionMap = externalContext.getSessionMap();
return sessionMap.get(name);
}
@Override
public UIComponent matchComponentInHierarchy(UIComponent parent, String partialClientId) {
return matchComponentInHierarchy(FacesContext.getCurrentInstance(), parent, partialClientId);
}
@Override
public UIComponent matchComponentInHierarchy(FacesContext facesContext, UIComponent parent,
String partialClientId) {
return ComponentUtil.matchComponentInHierarchy(facesContext, parent, partialClientId);
}
@Override
public UIComponent matchComponentInViewRoot(String partialClientId) {
return matchComponentInViewRoot(FacesContext.getCurrentInstance(), partialClientId);
}
@Override
public UIComponent matchComponentInViewRoot(FacesContext facesContext, String partialClientId) {
UIViewRoot viewRoot = facesContext.getViewRoot();
return matchComponentInHierarchy(facesContext, viewRoot, partialClientId);
}
@Override
public void navigate(String fromAction, String outcome) {
navigate(FacesContext.getCurrentInstance(), fromAction, outcome);
}
@Override
public void navigate(FacesContext facesContext, String fromAction, String outcome) {
Application application = facesContext.getApplication();
NavigationHandler navigationHandler = application.getNavigationHandler();
navigationHandler.handleNavigation(facesContext, fromAction, outcome);
}
@Override
public void navigateTo(String outcome) {
navigateTo(FacesContext.getCurrentInstance(), outcome);
}
@Override
public void navigateTo(FacesContext facesContext, String outcome) {
navigate(facesContext, null, outcome);
}
@Override
public void recreateComponentTree() {
recreateComponentTree(FacesContext.getCurrentInstance());
}
@Override
public void recreateComponentTree(FacesContext facesContext) {
Application application = facesContext.getApplication();
ViewHandler viewHandler = application.getViewHandler();
UIViewRoot oldViewRoot = facesContext.getViewRoot();
UIViewRoot viewRoot = viewHandler.createView(facesContext, oldViewRoot.getViewId());
facesContext.setViewRoot(viewRoot);
facesContext.renderResponse();
}
@Override
public void registerPhaseListener(PhaseListener phaseListener) throws IllegalStateException {
LifecycleFactory lifecycleFactory = (LifecycleFactory) FactoryFinder.getFactory(
FactoryFinder.LIFECYCLE_FACTORY);
for (Iterator<String> lifecycleIds = lifecycleFactory.getLifecycleIds(); lifecycleIds.hasNext();) {
String lifecycleId = lifecycleIds.next();
lifecycleFactory.getLifecycle(lifecycleId).addPhaseListener(phaseListener);
}
}
@Override
public void removeChildrenFromComponentTree(String clientId) {
removeChildrenFromComponentTree(FacesContext.getCurrentInstance(), clientId);
}
@Override
public void removeChildrenFromComponentTree(FacesContext facesContext, String clientId) {
UIComponent uiComponent = facesContext.getViewRoot().findComponent(clientId);
if (uiComponent != null) {
uiComponent.getChildren().clear();
uiComponent.getFacets().clear();
}
}
@Override
public void removeMessages(String clientId) {
removeMessages(FacesContext.getCurrentInstance(), clientId);
}
@Override
public void removeMessages(FacesContext facesContext, String clientId) {
Iterator<FacesMessage> facesMessages = facesContext.getMessages(clientId);
while (facesMessages.hasNext()) {
facesMessages.next();
facesMessages.remove();
}
}
@Override
public void removeMessagesForImmediateComponents() {
removeMessagesForImmediateComponents(FacesContext.getCurrentInstance());
}
@Override
public void removeMessagesForImmediateComponents(FacesContext facesContext) {
removeMessagesForImmediateComponents(facesContext, facesContext.getViewRoot());
}
@Override
public void removeMessagesForImmediateComponents(UIComponent uiComponent) {
removeMessagesForImmediateComponents(FacesContext.getCurrentInstance(), uiComponent);
}
@Override
public void removeMessagesForImmediateComponents(FacesContext facesContext, UIComponent uiComponent) {
if (uiComponent instanceof ActionSource) {
ActionSource actionSource = (ActionSource) uiComponent;
if (actionSource.isImmediate()) {
removeMessages(facesContext, uiComponent.getClientId(facesContext));
}
}
else if (uiComponent instanceof EditableValueHolder) {
EditableValueHolder editableValueHolder = (EditableValueHolder) uiComponent;
if (editableValueHolder.isImmediate()) {
removeMessages(facesContext, uiComponent.getClientId(facesContext));
}
}
List<UIComponent> childComponents = uiComponent.getChildren();
for (UIComponent childComponent : childComponents) {
removeMessagesForImmediateComponents(facesContext, childComponent);
}
}
@Override
public void removeParentFormFromComponentTree(final UIComponent uiComponent) {
UIComponent form = getParentForm(uiComponent);
if (form != null) {
form.getChildren().clear();
form.getFacets().clear();
}
}
@Override
public void resetView() {
resetView(FacesContext.getCurrentInstance());
}
@Override
public void resetView(FacesContext facesContext) {
resetView(facesContext, true);
}
@Override
public void resetView(boolean renderResponse) {
resetView(FacesContext.getCurrentInstance(), renderResponse);
}
@Override
public void resetView(FacesContext facesContext, boolean renderResponse) {
Application application = facesContext.getApplication();
ViewHandler viewHandler = application.getViewHandler();
UIViewRoot viewRoot = facesContext.getViewRoot();
UIViewRoot emptyView = viewHandler.createView(facesContext, viewRoot.getViewId());
facesContext.setViewRoot(emptyView);
if (renderResponse) {
facesContext.renderResponse();
}
}
@Override
public Object resolveExpression(String elExpression) {
return resolveExpression(FacesContext.getCurrentInstance(), elExpression);
}
@Override
public Object resolveExpression(FacesContext facesContext, String elExpression) {
Application application = facesContext.getApplication();
ELResolver elResolver = application.getELResolver();
ELContext elContext = facesContext.getELContext();
return elResolver.getValue(elContext, null, elExpression);
}
@Override
public void setRequestAttribute(String name, Object value) {
setRequestAttribute(FacesContext.getCurrentInstance(), name, value);
}
@Override
public void setRequestAttribute(FacesContext facesContext, String name, Object value) {
ExternalContext externalContext = facesContext.getExternalContext();
HttpServletRequest httpServletRequest = (HttpServletRequest) externalContext.getRequest();
httpServletRequest.setAttribute(name, value);
}
@Override
public void setSessionAttribute(String name, Object value) {
setSessionAttribute(FacesContext.getCurrentInstance(), name, value);
}
@Override
public void setSessionAttribute(FacesContext facesContext, String name, Object value) {
ExternalContext externalContext = facesContext.getExternalContext();
Map<String, Object> sessionMap = externalContext.getSessionMap();
sessionMap.put(name, value);
}
private I18n getI18n(FacesContext facesContext) {
ExternalContext externalContext = facesContext.getExternalContext();
return I18nFactory.getI18nInstance(externalContext);
}
}