/** * $Id: EventReceiverCoordinator.java 105077 2012-02-24 22:54:29Z ottenhoff@longsight.com $ * $URL: https://source.sakaiproject.org/svn/entitybroker/trunk/impl/src/java/org/sakaiproject/entitybroker/impl/event/EventReceiverCoordinator.java $ * EBlogic.java - entity-broker - Apr 15, 2008 4:29:18 PM - azeckoski ************************************************************************** * Copyright (c) 2007, 2008, 2009 The 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.entitybroker.impl.event; import java.util.Map; import java.util.Observable; import java.util.Observer; import org.azeckoski.reflectutils.refmap.ReferenceMap; import org.azeckoski.reflectutils.refmap.ReferenceType; import org.sakaiproject.entitybroker.event.EventReceiver; import org.sakaiproject.event.api.Event; import org.sakaiproject.event.api.EventTrackingService; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; /** * Collects beans implementing {@link EventReceiver} from around the context, and distributes * matching events to them.<br/> * FIXME - make a way to handle events by allowing manual registration of receivers, * the way this works now the event receivers will not be registered from webapps, bad bad * * @author Antranig Basman (antranig@caret.cam.ac.uk) * @author Aaron Zeckoski (azeckoski at gmail.com) */ public class EventReceiverCoordinator implements ApplicationContextAware { private Map<ClassLoader, EventReceiver> receivers = new ReferenceMap<ClassLoader, EventReceiver>(ReferenceType.WEAK, ReferenceType.STRONG); EventTrackingService eventTrackingService; public void setEventTrackingService(EventTrackingService eventTrackingService) { this.eventTrackingService = eventTrackingService; } public void init() { // register a single observer for the EB system (switched from local observer) eventTrackingService.addObserver(new Observer() { public void update(Observable o, Object arg) { if (arg instanceof Event) { Event event = (Event) arg; handleEvent(event); } } }); } /* * (non-Javadoc) * @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext) */ public void setApplicationContext(ApplicationContext context) throws BeansException { String[] autobeans = context.getBeanNamesForType(EventReceiver.class, false, false); for (String autobean : autobeans) { EventReceiver receiver = (EventReceiver) context.getBean(autobean); if (receiver != null) { receivers.put(receiver.getClass().getClassLoader(), receiver); } } } /** * Called when events occur which come in from the event system * @param event the event from the system */ protected void handleEvent(Event event) { for (EventReceiver receiver : receivers.values()) { if (match(receiver, event)) { receiver.receiveEvent(event.getEvent(), event.getResource()); } } } /** * @param receiver * @param event * @return */ private boolean match(EventReceiver receiver, Event event) { String name = event.getEvent(); String[] prefixes = receiver.getEventNamePrefixes(); boolean matchprefix = false; if (prefixes == null) { matchprefix = true; } else { for (String prefix : prefixes) { if (name.startsWith(prefix)) { matchprefix = true; break; } } } if (!matchprefix) { return false; } String resprefix = receiver.getResourcePrefix(); if (resprefix == null || event.getResource().startsWith(resprefix)) { return true; } else { return false; } } }