All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.sakaiproject.site.impl.SiteAliasCleanupNotificationAction Maven / Gradle / Ivy

There is a newer version: 23.3
Show newest version
/**********************************************************************************
 * $URL$
 * $Id$
 ***********************************************************************************
 *
 * Copyright (c) 2003, 2004, 2005, 2006 Sakai Foundation
 *
 * Licensed under the Educational Community 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
 *
 *       http://www.opensource.org/licenses/ECL-2.0
 *
 * 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.sakaiproject.site.impl;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.alias.api.AliasService;
import org.sakaiproject.event.api.Event;
import org.sakaiproject.event.api.Notification;
import org.sakaiproject.event.api.NotificationAction;
import org.sakaiproject.event.api.NotificationEdit;
import org.sakaiproject.event.api.NotificationService;
import org.sakaiproject.exception.PermissionException;
import org.sakaiproject.site.api.SiteService;
import org.w3c.dom.Element;

/**
 * Removes orphaned aliases when a site is deleted. Only deals with
 * site aliases and not, for example, mail archive channel aliases.
 * 
 * @author dmccallum
 *
 */
public class SiteAliasCleanupNotificationAction implements NotificationAction {

	private static Log log = LogFactory.getLog(SiteAliasCleanupNotificationAction.class);
	private AliasService aliasService;
	private NotificationService notificationService;
	private boolean enabled = true;
	private boolean propagateExceptions = false;
	
	public NotificationAction getClone() {
		SiteAliasCleanupNotificationAction clone = 
			new SiteAliasCleanupNotificationAction();
		clone.setAliasService(aliasService);
		clone.setNotificationService(notificationService);
		clone.setEnabled(enabled);
		clone.setPropagateExceptions(propagateExceptions);
		return clone;
	}
	
	/**
	 * Registered this {@link NotificationAction} with the 
	 * {@link NotificationService}. Typically invoked by DI framework.
	 */
	public void init() {
		NotificationEdit notification = notificationService.addTransientNotification();
		// we're only interested in being notified of site deletions
		notification.setFunction(SiteService.SECURE_REMOVE_SITE);
		// reiterate that we're only interested in site deletions (likely overkill)
		notification.setResourceFilter(SiteService.REFERENCE_ROOT);
		// assign this object as the actual action to be fired on site deletions
		notification.setAction(this);
	}

	/**
	 * Removes all aliases targeting the resource associated with the given
	 * {@link Event}. Use {@link #setPropagateExceptions(boolean)} to
	 * control whether or not failures are just logged or are wrapped
	 * and raised as unchecked exceptions.
	 * 
	 * 

Please note that the implementation assumes the configuration * is correct such that this method only receives site deletion * events. No guards are implemented in that respect.

*/ public void notify(Notification notif, Event event) { if ( !(enabled) ) { return; } String deletedResource = event.getResource(); try { aliasService.removeTargetAliases(deletedResource); } catch ( RuntimeException e ) { if ( propagateExceptions ) { throw e; } else { log.warn("Unable to remove aliases for [" + deletedResource + "]", e); } } catch ( PermissionException e ) { if ( propagateExceptions ) { throw new RuntimeException("Unable to remove aliases for [" + deletedResource + "] because of insufficient permissions", e); } else { log.warn("Unable to remove aliases for [" + deletedResource + "] because of insufficient permissions", e); } } } public void set(Element arg0) { // nothing to do } public void set(NotificationAction arg0) { // nothing to do } public void toXml(Element arg0) { // nothing to do } /** * Is site alias cleanup enabled. If not, simply ignores all * events. Otherwise, will attempt to remove all aliases scoped * to the deleted site. Aliases scoped to entities/resources * associated with the site, e.g. a mail channel, need to * be cleaned up elsewhere. * * @return */ public boolean isEnabled() { return enabled; } /** * Toggle alias cleanup behavior on and off. * * @see #isEnabled() * * @param enabled */ public void setEnabled(boolean enabled) { this.enabled = enabled; } public void setAliasService(AliasService aliasService) { this.aliasService = aliasService; } public AliasService getAliasService() { return aliasService; } /** * If true, {@link #notify(Notification, Event)} will * raise unchecked exceptions as is and wrap and rethrow checked * exceptions. Otherwise such conditions are just logged. * */ public boolean isPropagateExceptions() { return propagateExceptions; } /** * Control failure handling in {@link #notify(Notification, Event)}. * * @see #isPropagateExceptions() * @param propagateExceptions */ public void setPropagateExceptions(boolean propagateExceptions) { this.propagateExceptions = propagateExceptions; } /** * Assign the {@link NotificationService} with which to register * this {@link NotificationAction} on a call to {@link #init()} * * @param notificationService */ public void setNotificationService(NotificationService notificationService) { this.notificationService = notificationService; } public NotificationService getNotificationService() { return notificationService; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy