/**
* 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.HashMap;
import java.util.Map;
import javax.portlet.PortletRequest;
import javax.portlet.PortletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.pluto.container.driver.AdministrativeRequestListener;
/**
* AdministrativeRequestListener that delegates to another AdministrativeRequestListener based on a
* request attribute. <br>
* Configuration:
*
* <table border="1">
* <tr>
* <th align="left">Property</th>
* <th align="left">Description</th>
* <th align="left">Required</th>
* <th align="left">Default</th>
* </tr>
* <tr>
* <td align="right" valign="top">listenerKeyAttribute</td>
* <td>
* The PortletRequest attribute to get the key for the {@link AdministrativeRequestListener} from.
* </td>
* <td valign="top">No</td>
* <td valign="top">org.apereo.portal.portlet.common.AdministrativeRequestListenerControler.LISTENER_KEY</td>
* </tr>
* <tr>
* <td align="right" valign="top">listeners</td>
* <td>
* The {@link Map} of {@link String} keys to {@link AdministrativeRequestListener}s.
* </td>
* <td valign="top">No</td>
* <td valign="top">{@link new HashMap()}</td>
* </tr>
* <tr>
* <td align="right" valign="top">failOnKeyNotFound</td>
* <td>
* If an exception should be thrown if a <code>listenerKeyAttribute</code> request attribute is not
* found. If false a warning will be logged and the method will return.
* </td>
* <td valign="top">No</td>
* <td valign="top">false</td>
* </tr>
* <tr>
* <td align="right" valign="top">failOnListenerNotFound</td>
* <td>
* If an exception should be thrown if a {@link AdministrativeRequestListener} isn't found for the request
* attribute key. If false a warning will be logged and the method will return.
* </td>
* <td valign="top">No</td>
* <td valign="top">false</td>
* </tr>
* </table>
*
*/
public class AdministrativeRequestListenerController
implements org.apache.pluto.container.driver.AdministrativeRequestListener {
public static final String DEFAULT_LISTENER_KEY_ATTRIBUTE =
AdministrativeRequestListenerController.class.getName() + ".LISTENER_KEY";
protected final Log logger = LogFactory.getLog(this.getClass());
private String listenerKeyAttribute = DEFAULT_LISTENER_KEY_ATTRIBUTE;
private Map<String, AdministrativeRequestListener> listeners =
new HashMap<String, AdministrativeRequestListener>();
private boolean failOnKeyNotFound = false;
private boolean failOnListenerNotFound = false;
/** @return the failOnKeyNotFound */
public boolean isFailOnKeyNotFound() {
return this.failOnKeyNotFound;
}
/** @param failOnKeyNotFound the failOnKeyNotFound to set */
public void setFailOnKeyNotFound(boolean failOnKeyNotFound) {
this.failOnKeyNotFound = failOnKeyNotFound;
}
/** @return the failOnListenerNotFound */
public boolean isFailOnListenerNotFound() {
return this.failOnListenerNotFound;
}
/** @param failOnListenerNotFound the failOnListenerNotFound to set */
public void setFailOnListenerNotFound(boolean failOnListenerNotFound) {
this.failOnListenerNotFound = failOnListenerNotFound;
}
/** @return the listenerKeyAttribute */
public String getListenerKeyAttribute() {
return this.listenerKeyAttribute;
}
/** @param listenerKeyAttribute the listenerKeyAttribute to set */
public void setListenerKeyAttribute(String listenerKeyAttribute) {
this.listenerKeyAttribute = listenerKeyAttribute;
}
/** @return the listeners */
public Map<String, AdministrativeRequestListener> getListeners() {
return this.listeners;
}
/** @param listeners the listeners to set */
public void setListeners(Map<String, AdministrativeRequestListener> listeners) {
this.listeners = listeners;
}
/**
* @see
* org.apache.pluto.spi.optional.AdministrativeRequestListener#administer(javax.portlet.PortletRequest,
* javax.portlet.PortletResponse)
*/
public void administer(PortletRequest request, PortletResponse response) {
final String listenerKey = (String) request.getAttribute(this.listenerKeyAttribute);
if (this.logger.isDebugEnabled()) {
this.logger.debug(
"Found key '"
+ listenerKey
+ "' from PortletRequest attribute '"
+ this.listenerKeyAttribute
+ "'");
}
if (listenerKey == null) {
if (this.failOnKeyNotFound) {
this.logger.error(
"Failed to find PortletRequest attribute '"
+ this.listenerKeyAttribute
+ "'");
throw new IllegalArgumentException(
"Failed to find PortletRequest attribute '"
+ this.listenerKeyAttribute
+ "'");
}
this.logger.warn(
"Failed to find PortletRequest attribute '" + this.listenerKeyAttribute + "'");
return;
}
final AdministrativeRequestListener administrativeRequestListener =
this.listeners.get(listenerKey);
if (this.logger.isDebugEnabled()) {
this.logger.debug(
"Found AdministrativeRequestListener '"
+ administrativeRequestListener
+ "' for key '"
+ listenerKey
+ "'");
}
if (administrativeRequestListener == null) {
if (this.failOnListenerNotFound) {
this.logger.error(
"Failed to find AdministrativeRequestListener for key '"
+ listenerKey
+ "'");
throw new IllegalArgumentException(
"Failed to find AdministrativeRequestListener for key '"
+ listenerKey
+ "'");
}
this.logger.warn(
"Failed to find AdministrativeRequestListener for key '" + listenerKey + "'");
return;
}
administrativeRequestListener.administer(request, response);
}
}