/** * Licensed to Apereo under one or more contributor license agreements. See the NOTICE file * distributed with this work for additional information regarding copyright ownership. Apereo * licenses this file to you 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 the * following location: * * <p>http://www.apache.org/licenses/LICENSE-2.0 * * <p>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.apereo.portal.portlet.container.services; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.portlet.PortletRequest; import javax.servlet.http.HttpServletRequest; import org.apache.pluto.container.PortletContainerException; import org.apache.pluto.container.PortletWindow; import org.apache.pluto.container.UserInfoService; import org.apache.pluto.container.om.portlet.PortletApplicationDefinition; import org.apache.pluto.container.om.portlet.UserAttribute; import org.apereo.portal.portlet.om.IPortletDefinition; import org.apereo.portal.portlet.om.IPortletEntity; import org.apereo.portal.portlet.om.IPortletWindow; import org.apereo.portal.portlet.registry.IPortletDefinitionRegistry; import org.apereo.portal.portlet.registry.IPortletEntityRegistry; import org.apereo.portal.portlet.registry.IPortletWindowRegistry; import org.apereo.portal.url.IPortalRequestUtils; import org.jasig.services.persondir.IPersonAttributeDao; import org.jasig.services.persondir.IPersonAttributes; import org.springframework.beans.factory.annotation.Autowired; /** * Ties the IPersonAttributeDao to the Pluto UserInfoService * */ public class PersonDirectoryUserInfoService implements UserInfoService { private IPersonAttributeDao personAttributeDao; private IPortletWindowRegistry portletWindowRegistry; private IPortletEntityRegistry portletEntityRegistry; private IPortletDefinitionRegistry portletDefinitionRegistry; private IPortalRequestUtils portalRequestUtils; /** @return the portalRequestUtils */ public IPortalRequestUtils getPortalRequestUtils() { return portalRequestUtils; } /** @param portalRequestUtils the portalRequestUtils to set */ @Autowired public void setPortalRequestUtils(IPortalRequestUtils portalRequestUtils) { this.portalRequestUtils = portalRequestUtils; } /** @return the portletEntityRegistry */ public IPortletEntityRegistry getPortletEntityRegistry() { return this.portletEntityRegistry; } /** @param portletEntityRegistry the portletEntityRegistry to set */ @Autowired public void setPortletEntityRegistry(IPortletEntityRegistry portletEntityRegistry) { this.portletEntityRegistry = portletEntityRegistry; } /** @return the personAttributeDao */ public IPersonAttributeDao getPersonAttributeDao() { return this.personAttributeDao; } /** @param personAttributeDao the personAttributeDao to set */ @Autowired public void setPersonAttributeDao(IPersonAttributeDao personAttributeDao) { this.personAttributeDao = personAttributeDao; } /** @return the portletWindowRegistry */ public IPortletWindowRegistry getPortletWindowRegistry() { return this.portletWindowRegistry; } /** @param portletWindowRegistry the portletWindowRegistry to set */ @Autowired public void setPortletWindowRegistry(IPortletWindowRegistry portletWindowRegistry) { this.portletWindowRegistry = portletWindowRegistry; } /** @return the portletDefinitionRegistry */ public IPortletDefinitionRegistry getPortletDefinitionRegistry() { return this.portletDefinitionRegistry; } /** @param portletDefinitionRegistry the portletDefinitionRegistry to set */ @Autowired public void setPortletDefinitionRegistry(IPortletDefinitionRegistry portletDefinitionRegistry) { this.portletDefinitionRegistry = portletDefinitionRegistry; } /* (non-Javadoc) * @see org.apache.pluto.spi.optional.UserInfoService#getUserInfo(javax.portlet.PortletRequest, org.apache.pluto.PortletWindow) */ public Map<String, String> getUserInfo(PortletRequest request, PortletWindow plutoPortletWindow) throws PortletContainerException { //Get the remote user final String remoteUser = request.getRemoteUser(); if (remoteUser == null) { return null; } final HttpServletRequest httpServletRequest = this.portalRequestUtils.getPortletHttpRequest(request); final IPortletWindow portletWindow = this.portletWindowRegistry.convertPortletWindow( httpServletRequest, plutoPortletWindow); return this.getUserInfo(remoteUser, httpServletRequest, portletWindow); } /** * Commons logic to get a subset of the user's attributes for the specified portlet window. * * @param remoteUser The user to get attributes for. * @param httpServletRequest The current, underlying httpServletRequest * @param portletWindow The window to filter attributes for * @return A Map of user attributes for the user and windows * @throws PortletContainerException */ protected Map<String, String> getUserInfo( String remoteUser, HttpServletRequest httpServletRequest, IPortletWindow portletWindow) throws PortletContainerException { //Get the list of user attributes the portal knows about the user final IPersonAttributes personAttributes = this.personAttributeDao.getPerson(remoteUser); if (personAttributes == null) { return Collections.emptyMap(); } final List<? extends UserAttribute> expectedUserAttributes = this.getExpectedUserAttributes(httpServletRequest, portletWindow); final Map<String, String> portletUserAttributes = this.generateUserInfo(personAttributes, expectedUserAttributes, httpServletRequest); return portletUserAttributes; } /** * Using the Map of portal user attributes and a List of expected attributes generate the * USER_INFO map for the portlet * * @param portalUserAttributes All the attributes the portal knows about the user * @param expectedUserAttributes The attributes the portlet expects to get * @return The Map to use for the USER_INFO attribute */ protected Map<String, String> generateUserInfo( final IPersonAttributes personAttributes, final List<? extends UserAttribute> expectedUserAttributes, HttpServletRequest httpServletRequest) { final Map<String, String> portletUserAttributes = new HashMap<String, String>(expectedUserAttributes.size()); //Copy expected attributes to the USER_INFO Map final Map<String, List<Object>> attributes = personAttributes.getAttributes(); for (final UserAttribute userAttributeDD : expectedUserAttributes) { final String attributeName = userAttributeDD.getName(); //TODO a personAttributes.hasAttribute(String) API is needed here, if hasAttribute and null then put the key with no value in the returned map if (attributes.containsKey(attributeName)) { final Object valueObj = personAttributes.getAttributeValue(attributeName); final String value = valueObj == null ? null : String.valueOf(valueObj); portletUserAttributes.put(attributeName, value); } } return portletUserAttributes; } /** * Get the list of user attributes the portlet expects * * @param request The current request. * @param portletWindow The window to get the expected user attributes for. * @return The List of expected user attributes for the portlet * @throws PortletContainerException If expected attributes cannot be determined */ protected List<? extends UserAttribute> getExpectedUserAttributes( HttpServletRequest request, final IPortletWindow portletWindow) throws PortletContainerException { final IPortletEntity portletEntity = portletWindow.getPortletEntity(); final IPortletDefinition portletDefinition = portletEntity.getPortletDefinition(); final PortletApplicationDefinition portletApplicationDescriptor = this.portletDefinitionRegistry.getParentPortletApplicationDescriptor( portletDefinition.getPortletDefinitionId()); return portletApplicationDescriptor.getUserAttributes(); } }