/** * 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.io.IOException; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import javax.portlet.ValidatorException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.pluto.container.PortletRequestContext; import org.apache.pluto.container.om.portlet.PortletDefinition; import org.apache.pluto.container.om.portlet.Preference; import org.apache.pluto.container.om.portlet.Preferences; import org.apereo.portal.portlet.dao.jpa.PortletPreferenceImpl; import org.apereo.portal.portlet.om.IPortletDefinition; import org.apereo.portal.portlet.om.IPortletDefinitionId; import org.apereo.portal.portlet.om.IPortletEntity; import org.apereo.portal.portlet.om.IPortletEntityId; import org.apereo.portal.portlet.om.IPortletPreference; import org.apereo.portal.portlet.registry.IPortletDefinitionRegistry; import org.apereo.portal.portlet.registry.IPortletEntityRegistry; /** * Preferences impl that manipulates the portlet entity level preference data * */ public class GuestPortletEntityPreferencesImpl extends AbstractPortletPreferencesImpl<IPortletEntity> { protected static final String PORTLET_PREFERENCES_MAP_ATTRIBUTE = GuestPortletEntityPreferencesImpl.class.getName() + ".PORTLET_PREFERENCES_MAP"; private final PortletRequestContext portletRequestContext; private final IPortletEntityId portletEntityId; private final IPortletEntityRegistry portletEntityRegistry; private final IPortletDefinitionRegistry portletDefinitionRegistry; public GuestPortletEntityPreferencesImpl( PortletRequestContext portletRequestContext, IPortletEntityRegistry portletEntityRegistry, IPortletDefinitionRegistry portletDefinitionRegistry, IPortletEntityId portletEntityId, boolean render) { super(render); this.portletRequestContext = portletRequestContext; this.portletEntityRegistry = portletEntityRegistry; this.portletDefinitionRegistry = portletDefinitionRegistry; this.portletEntityId = portletEntityId; } @Override protected IPortletEntity getInitializationContext() { final HttpServletRequest containerRequest = this.portletRequestContext.getContainerRequest(); return this.portletEntityRegistry.getPortletEntity(containerRequest, portletEntityId); } @Override protected Object getLogDescription() { return this.getInitializationContext(); } @Override protected void loadTargetPortletPreferences( IPortletEntity portletEntity, Map<String, IPortletPreference> targetPortletPreferences) { final HttpServletRequest containerRequest = this.portletRequestContext.getContainerRequest(); final Map<String, IPortletPreference> sessionPreferences = this.getSessionPreferences(portletEntityId, containerRequest); if (sessionPreferences != null) { targetPortletPreferences.putAll(sessionPreferences); } } @Override protected void loadBasePortletPreferences( IPortletEntity portletEntity, Map<String, IPortletPreference> basePortletPreferences) { final IPortletDefinition portletDefinition = portletEntity.getPortletDefinition(); //Add descriptor prefs to base Map final IPortletDefinitionId portletDefinitionId = portletDefinition.getPortletDefinitionId(); final PortletDefinition portletDescriptor = this.portletDefinitionRegistry.getParentPortletDescriptor(portletDefinitionId); final Preferences descriptorPreferences = portletDescriptor.getPortletPreferences(); for (final Preference preference : descriptorPreferences.getPortletPreferences()) { final IPortletPreference preferenceWrapper = new PortletPreferenceImpl(preference); basePortletPreferences.put(preferenceWrapper.getName(), preferenceWrapper); } //Add definition prefs to base Map final List<IPortletPreference> definitionPreferences = portletDefinition.getPortletPreferences(); for (final IPortletPreference preference : definitionPreferences) { basePortletPreferences.put(preference.getName(), preference); } //Add entity prefs to base Map final List<IPortletPreference> entityPreferences = portletEntity.getPortletPreferences(); for (final IPortletPreference preference : entityPreferences) { basePortletPreferences.put(preference.getName(), preference); } } @Override protected boolean storeInternal() throws IOException, ValidatorException { final Map<String, IPortletPreference> targetPortletPreferences = this.getTargetPortletPreferences(); if (targetPortletPreferences.isEmpty()) { return false; } final HttpServletRequest containerRequest = portletRequestContext.getContainerRequest(); this.storeSessionPreferences(portletEntityId, containerRequest, targetPortletPreferences); return true; } /** * Gets the session-stored list of IPortletPreferences for the specified request and * IPortletEntityId. * * @return List of IPortletPreferences for the entity and session, may be null if no preferences * have been set. */ @SuppressWarnings("unchecked") protected Map<String, IPortletPreference> getSessionPreferences( IPortletEntityId portletEntityId, HttpServletRequest httpServletRequest) { final HttpSession session = httpServletRequest.getSession(); final Map<IPortletEntityId, Map<String, IPortletPreference>> portletPreferences; //Sync on the session to ensure the Map isn't in the process of being created synchronized (session) { portletPreferences = (Map<IPortletEntityId, Map<String, IPortletPreference>>) session.getAttribute(PORTLET_PREFERENCES_MAP_ATTRIBUTE); } if (portletPreferences == null) { return null; } return portletPreferences.get(portletEntityId); } @SuppressWarnings("unchecked") protected void storeSessionPreferences( IPortletEntityId portletEntityId, HttpServletRequest httpServletRequest, Map<String, IPortletPreference> preferences) { final HttpSession session = httpServletRequest.getSession(); Map<IPortletEntityId, Map<String, IPortletPreference>> portletPreferences; //Sync on the session to ensure other threads aren't creating the Map at the same time synchronized (session) { portletPreferences = (Map<IPortletEntityId, Map<String, IPortletPreference>>) session.getAttribute(PORTLET_PREFERENCES_MAP_ATTRIBUTE); if (portletPreferences == null) { portletPreferences = new ConcurrentHashMap<IPortletEntityId, Map<String, IPortletPreference>>(); session.setAttribute(PORTLET_PREFERENCES_MAP_ATTRIBUTE, portletPreferences); } } portletPreferences.put(portletEntityId, preferences); } }