/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF 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
*
* http://www.apache.org/licenses/LICENSE-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.apache.jackrabbit.core.observation;
import org.apache.jackrabbit.core.SessionImpl;
import org.apache.jackrabbit.core.state.ChangeLog;
import org.apache.jackrabbit.spi.Path;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashSet;
import java.util.List;
/**
* This Class implements an observation dispatcher, that delegates events to
* a set of underlying dispatchers.
*/
public class DelegatingObservationDispatcher extends EventDispatcher {
/**
* Logger instance.
*/
private static Logger log = LoggerFactory.getLogger(DelegatingObservationDispatcher.class);
/**
* the set of dispatchers
*/
private final HashSet<ObservationDispatcher> dispatchers = new HashSet<ObservationDispatcher>();
/**
* Adds a new observation dispatcher to the set of dispatchers
*
* @param dispatcher observation dispatcher
*/
public void addDispatcher(ObservationDispatcher dispatcher) {
synchronized (dispatchers) {
dispatchers.add(dispatcher);
}
}
/**
* Removes a observation dispatcher from the set of dispatchers
*
* @param dispatcher observation dispatcher
*/
public void removeDispatcher(ObservationDispatcher dispatcher) {
synchronized (dispatchers) {
dispatchers.remove(dispatcher);
}
}
/**
* Creates an <code>EventStateCollection</code> tied to the session
* given as argument.
*
* @param session event source
* @param pathPrefix event path prefix
* @return new <code>EventStateCollection</code> instance
*/
public EventStateCollection createEventStateCollection(
SessionImpl session, Path pathPrefix) {
return new EventStateCollection(this, session, pathPrefix);
}
//------------------------------------------------------< EventDispatcher >
/**
* {@inheritDoc}
*/
void prepareEvents(EventStateCollection events) {
// events will get prepared on dispatch
}
/**
* {@inheritDoc}
*/
void prepareDeleted(EventStateCollection events, ChangeLog changes) {
// events will get prepared on dispatch
}
/**
* {@inheritDoc}
*/
void dispatchEvents(EventStateCollection events) {
dispatch(events.getEvents(), events.getSession(),
events.getPathPrefix(), events.getUserData());
}
/**
* Dispatchers a list of events to all registered dispatchers. A new
* {@link EventStateCollection} is created for every dispatcher, fille with
* the given event list and then dispatched.
*
* @param eventList list of events
* @param session current session
* @param pathPrefix event path prefix
* @param userData the user data
*/
public void dispatch(List<EventState> eventList, SessionImpl session,
Path pathPrefix, String userData) {
ObservationDispatcher[] disp;
synchronized (dispatchers) {
disp = (ObservationDispatcher[]) dispatchers.toArray(
new ObservationDispatcher[dispatchers.size()]);
}
for (int i = 0; i < disp.length; i++) {
EventStateCollection events =
new EventStateCollection(disp[i], session, pathPrefix);
events.setUserData(userData);
try {
events.addAll(eventList);
events.prepare();
events.dispatch();
} catch (Exception e) {
log.error("Error while dispatching events.", e);
}
}
}
}