/*
* Copyright (C) 2003-2011 eXo Platform SAS.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.etk.service.common.event;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.Callable;
import org.etk.common.logging.Logger;
import org.etk.kernel.container.ApplicationContainer;
import org.etk.service.foo.MockRepositoryService;
/**
* Created by The eXo Platform SAS
* Author : eXoPlatform
* exo@exoplatform.com
* Jul 21, 2011
*/
public abstract class AbstractLifeCycle<T extends LifeCycleListener<E>, E extends LifeCycleEvent<?,?>> {
/** Logger */
private static final Logger LOG = Logger.getLogger(AbstractLifeCycle.class);
protected Set<T> listeners = new HashSet<T>();
protected final ApplicationContainer container;
private String currentRepository;
protected LifeCycleCompletionService completionService;
protected AbstractLifeCycle() {
this.container = ApplicationContainer.getInstance();
this.completionService = (LifeCycleCompletionService) container.getComponentInstanceOfType(LifeCycleCompletionService.class);
}
/**
* {@inheritDoc}
*/
public void addListener(T listener) {
listeners.add(listener);
}
/**
* {@inheritDoc}
*/
public void removeListener(T listener) {
listeners.remove(listener);
}
/**
* Broadcasts an event to the registered listeners. The event is broadcasted
* asynchronously but sequentially.
*
* @see #dispatchEvent(LifeCycleListener, LifeCycleEvent)
* @param event
*/
protected void broadcast(final E event) {
//TODO Fixed SOC-1882
//currentRepository = MockRepositoryService.getCurrentRepo();
addTasks(event);
}
protected void addTasks(final E event) {
for (final T listener : listeners) {
completionService.addTask(new Callable<E>() {
public E call() throws Exception {
try {
//TODO Fixed SOC-1882
//MockRepositoryService.switchRepo(currentRepository);
begin();
dispatchEvent(listener, event);
}
catch(Exception e) {
LOG.debug(e.getMessage(), e);
}
finally {
end();
}
return event;
}
});
}
}
protected void begin() {
}
protected void end() {
}
protected abstract void dispatchEvent(final T listener, final E event);
}