/** * 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.session; import java.util.Enumeration; import javax.portlet.PortletRequest; import javax.portlet.PortletResponse; import javax.portlet.PortletSession; import org.apache.pluto.container.driver.AdministrativeRequestListener; /** * Provides access to actions involving the PortletSession. Refer to {@link SessionAction} for * supported actions. * */ public class PortletSessionAdministrativeRequestListener implements AdministrativeRequestListener { public static final String ACTION = "org.apereo.portal.portlet.session.ACTION"; public static final String ARGUMENTS = "org.apereo.portal.portlet.session.ARGUMENTS"; public static final String SCOPE = "org.apereo.portal.portlet.session.SCOPE"; public enum SessionAction { /** Removes all attributes from the session for the specified scope */ CLEAR(false, 0), //No arguments /** Stores an attribute in the session for the specified scope */ SET_ATTRIBUTE(true, 2); // arg[0]=Attribute Name, arg[1]=Attribute Value private final boolean requiresCreation; private final int argumentCount; private SessionAction(boolean requiresCreation, int argumentCount) { this.requiresCreation = requiresCreation; this.argumentCount = argumentCount; } public boolean isRequiresCreation() { return this.requiresCreation; } public int getArgumentCount() { return this.argumentCount; } } /** * @see * org.apache.pluto.spi.optional.AdministrativeRequestListener#administer(javax.portlet.PortletRequest, * javax.portlet.PortletResponse) */ public void administer(PortletRequest request, PortletResponse response) { final SessionAction action = this.getAction(request); final Object[] arguments = this.getArguments(request); final int scope = this.getScope(request); //Check the argument count final int argumentCount = arguments != null ? arguments.length : 0; if (argumentCount != action.getArgumentCount()) { throw new IllegalArgumentException( "SessionAction " + action + " requires " + action.getArgumentCount() + " arguments but " + argumentCount + " arguments were provided."); } //Get the session according to the action final PortletSession portletSession = request.getPortletSession(action.isRequiresCreation()); switch (action) { case CLEAR: { if (portletSession != null) { for (final Enumeration<String> attributeNames = (Enumeration<String>) portletSession.getAttributeNames(scope); attributeNames.hasMoreElements(); ) { final String attributeName = attributeNames.nextElement(); portletSession.removeAttribute(attributeName, scope); } } } break; case SET_ATTRIBUTE: { final String attributeName = (String) arguments[0]; final Object value = arguments[1]; portletSession.setAttribute(attributeName, value, scope); } break; } } protected SessionAction getAction(PortletRequest request) { return (SessionAction) request.getAttribute(ACTION); } protected Object[] getArguments(PortletRequest request) { return (Object[]) request.getAttribute(ARGUMENTS); } protected int getScope(PortletRequest request) { final Integer scope = (Integer) request.getAttribute(SCOPE); if (scope != null) { return scope; } return PortletSession.PORTLET_SCOPE; } }