/**
* Copyright (C) 2009 eXo Platform SAS.
*
* 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.exoplatform.portal.webui.application;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import javax.portlet.PortletRequest;
import javax.servlet.http.HttpServletRequest;
import org.exoplatform.portal.application.PortalRequestContext;
import org.exoplatform.services.organization.UserProfile;
import org.gatein.pc.api.invocation.resolver.AttributeResolver;
import org.gatein.pc.api.invocation.resolver.PrincipalAttributeResolver;
import org.gatein.pc.api.spi.UserContext;
/**
* @author <a href="mailto:boleslaw.dawidowicz at redhat.com">Boleslaw Dawidowicz</a>
* @author <a href="mailto:julien@jboss.org">Julien Viet</a>
* @version $Revision$
*/
// TODO: needs to be tested
class ExoUserContext implements UserContext {
/** . */
private static final Map<String, String> EMPTY_STRING_TO_STRING_MAP = Collections.emptyMap();
/** . */
private static final List<Locale> EMPTY_LOCALE_LIST = Collections.emptyList();
/** . */
private final String id;
/** . */
private final HttpServletRequest clientRequest;
/** . */
private final AttributeResolver attributeResolver;
/** . */
private final UserProfile userProfile;
/** Names from PortletRequest.P3PUserInfos */
private static final Set<String> JSR_168_P3P;
static {
Set<String> keys = new HashSet<String>();
for (PortletRequest.P3PUserInfos userInfos : PortletRequest.P3PUserInfos.values()) {
keys.add(userInfos.toString());
}
JSR_168_P3P = Collections.unmodifiableSet(keys);
}
public ExoUserContext(HttpServletRequest clientRequest, UserProfile userProfile) throws IllegalArgumentException {
if (clientRequest == null) {
throw new IllegalArgumentException("No client request provided");
}
this.id = clientRequest.getRemoteUser();
this.clientRequest = clientRequest;
this.attributeResolver = new PrincipalAttributeResolver(clientRequest);
this.userProfile = userProfile;
}
/** Returns the user id or null if none was provided. */
public String getId() {
return id;
}
/** Returns an immutable empty map. */
public Map<String, String> getInformations() {
if (userProfile == null) {
return EMPTY_STRING_TO_STRING_MAP;
}
Map<String, String> infoMap = userProfile.getUserInfoMap();
Map<String, String> filteredMap = new HashMap<String, String>();
for (String key : infoMap.keySet()) {
if (JSR_168_P3P.contains(key)) {
filteredMap.put(key, infoMap.get(key));
}
}
return Collections.unmodifiableMap(filteredMap);
}
/**
* Returns current PortalRequestContext's locale. It falls back to clientRequest locale (
* {@link HttpServletRequest#getLocale}), or <code>Locale.ENGLISH</code> if clientRequest object is not available.
*/
public Locale getLocale() {
PortalRequestContext context = PortalRequestContext.getCurrentInstance();
if (context != null) {
Locale loc = context.getLocale();
if (loc != null)
return loc;
}
return clientRequest != null ? clientRequest.getLocale() : Locale.ENGLISH;
}
/**
* Returns the list of client request locales, making sure the first one in the List is the same as what getLocale() method
* returns.
*/
@SuppressWarnings("unchecked")
public List<Locale> getLocales() {
Locale loc = getLocale();
if (loc == null) {
return EMPTY_LOCALE_LIST;
} else {
LinkedList<Locale> locs = new LinkedList<Locale>();
locs.add(loc);
if (clientRequest != null) {
Enumeration<Locale> clientLocs = (Enumeration<Locale>) clientRequest.getLocales();
while (clientLocs.hasMoreElements()) {
Locale current = clientLocs.nextElement();
if (current.getLanguage().equals(loc.getLanguage()) && current.getCountry().equals(loc.getCountry()))
continue;
locs.add(current);
}
}
return Collections.unmodifiableList(locs);
}
}
public void setAttribute(String attrKey, Object attrValue) {
attributeResolver.setAttribute(attrKey, attrValue);
}
public Object getAttribute(String attrKey) {
return attributeResolver.getAttribute(attrKey);
}
}