/*
* JBoss, a division of Red Hat
* Copyright 2011, Red Hat Middleware, LLC, and individual
* contributors as indicated by the @authors tag. See the
* copyright.txt in the distribution for a full listing of
* individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.gatein.wsrp.admin.ui;
import org.gatein.common.net.URLTools;
import org.gatein.common.util.ParameterValidation;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
import javax.faces.context.Flash;
import javax.portlet.PortletRequest;
import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
import java.util.Locale;
import java.util.Map;
/**
* Provides a JSF-backed BeanContext implementation. This is the main implementation since the UI is currently based on JSF.
*
* @author <a href="mailto:chris.laprun@jboss.com">Chris Laprun</a>
* @version $Revision: 13413 $
* @since 2.6
*/
public class JSFBeanContext extends BeanContext implements Serializable
{
public String getParameter(String key)
{
return getParameter(key, FacesContext.getCurrentInstance());
}
public static String getParameter(String key, FacesContext facesContext)
{
Map pmap = facesContext.getExternalContext().getRequestParameterMap();
return (String)pmap.get(key);
}
public Map<String, Object> getSessionMap()
{
return JSFBeanContext.getSessionMap(FacesContext.getCurrentInstance());
}
@Override
public <T> T findBean(String name, Class<T> type)
{
final FacesContext facesContext = FacesContext.getCurrentInstance();
// try to get the bean from the application map first
final Map<String, Object> applicationMap = facesContext.getExternalContext().getApplicationMap();
Object candidate = applicationMap.get(name);
if (candidate == null)
{
// try the session map
candidate = getFromSession(name, type);
if (candidate == null)
{
// try to get the bean from an EL expression
candidate = facesContext.getApplication().evaluateExpressionGet(facesContext, "#{" + name + "}", type);
}
}
if (candidate != null)
{
return checkObject(candidate, type, "Bean named '" + name + "' is not of type '" + type.getSimpleName() + "'");
}
else
{
return null;
}
}
@Override
public void putInFlash(String name, Object value)
{
final Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash();
if (value != null)
{
flash.put(name, value);
flash.putNow(name, value);
flash.keep(name);
}
else
{
flash.remove(name);
}
}
@Override
public <T> T getFromFlash(String name, Class<T> type)
{
final Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash();
final Object result = flash.get(name);
if (result != null)
{
return checkObject(result, type, "Flash-scoped object named '" + name + "' is not of type '" + type.getSimpleName() + "'");
}
else
{
return null;
}
}
public static Map<String, Object> getSessionMap(FacesContext facesContext)
{
return facesContext.getExternalContext().getSessionMap();
}
protected void createMessage(String target, String message, Object severity, Object... additionalParams)
{
outputMessage(target, message, severity, additionalParams);
}
public static void outputMessage(String target, String message, Object severity, Object... additionalParams)
{
if (ParameterValidation.isNullOrEmpty(target))
{
target = STATUS;
}
FacesMessage.Severity jsfSeverity;
if (severity instanceof FacesMessage.Severity)
{
jsfSeverity = (FacesMessage.Severity)severity;
}
else
{
jsfSeverity = FacesMessage.SEVERITY_ERROR;
}
// Get the component id from the target
FacesContext facesContext = FacesContext.getCurrentInstance();
UIViewRoot viewRoot = facesContext.getViewRoot();
UIComponent component = viewRoot.findComponent(target);
if (component != null)
{
target = component.getClientId(facesContext);
}
else
{
// todo: do something better here
log.info("Couldn't resolve component target: " + target);
}
String details = ""; // details is empty to avoid repetition of message...
// todo: this should be more generic
if (additionalParams != null && additionalParams.length > 0)
{
Exception exception = (Exception)additionalParams[0];
if (exception != null)
{
details = exception.getLocalizedMessage();
}
}
FacesMessage msg = new FacesMessage(jsfSeverity, message, details);
facesContext.addMessage(target, msg);
}
public static void outputLocalizedMessage(String target, String localizationKey, Object severity, String resourceName, Object... params)
{
if (severity == null)
{
severity = FacesMessage.SEVERITY_ERROR;
}
outputMessage(target, getLocalizedMessage(localizationKey, getRequestLocale(), resourceName, params), severity);
}
protected Object getErrorSeverity()
{
return FacesMessage.SEVERITY_ERROR;
}
protected Object getInfoSeverity()
{
return FacesMessage.SEVERITY_INFO;
}
protected Locale getLocale()
{
return getRequestLocale();
}
public String getServerAddress()
{
Object request = FacesContext.getCurrentInstance().getExternalContext().getRequest();
String serverAddress;
if (request instanceof PortletRequest)
{
// basically copy URLTools.getServerAddressFrom implementation
PortletRequest portletRequest = (PortletRequest)request;
String scheme = portletRequest.getScheme();
String host = portletRequest.getServerName();
int port = portletRequest.getServerPort();
return scheme + URLTools.SCH_END + host + URLTools.PORT_END + port;
}
else
{
serverAddress = URLTools.getServerAddressFrom((HttpServletRequest)request);
}
return serverAddress;
}
public static Locale getRequestLocale()
{
return FacesContext.getCurrentInstance().getExternalContext().getRequestLocale();
}
}