/*
* Copyright (c) 2006-2011 Nuxeo SA (http://nuxeo.com/) and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Nuxeo - initial API and implementation
*
* $Id$
*/
package org.eclipse.ecr.core.event.impl;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.ecr.core.event.EventListener;
import org.eclipse.ecr.core.event.PostCommitEventListener;
/**
* Utility class used to manage event listeners descriptors.
*
* @author Thierry Delprat
*/
public class EventListenerList {
protected final List<EventListenerDescriptor> inlineListenersDescriptors = new ArrayList<EventListenerDescriptor>();
protected final List<EventListenerDescriptor> syncPostCommitListenersDescriptors = new ArrayList<EventListenerDescriptor>();
protected final List<EventListenerDescriptor> asyncPostCommitListenersDescriptors = new ArrayList<EventListenerDescriptor>();
protected final List<EventListenerDescriptor> enabledInlineListenersDescriptors = new ArrayList<EventListenerDescriptor>();
protected final List<EventListenerDescriptor> enabledSyncPostCommitListenersDescriptors = new ArrayList<EventListenerDescriptor>();
protected final List<EventListenerDescriptor> enabledAsyncPostCommitListenersDescriptors = new ArrayList<EventListenerDescriptor>();
protected final List<String> listenerNames = new ArrayList<String>();
protected boolean enabledFilteringDone = false;
public void add(EventListenerDescriptor descriptor) throws Exception {
enabledFilteringDone=false;
// merge if necessary
if (listenerNames.contains(descriptor.getName())) {
descriptor = mergeDescriptor(descriptor);
}
// checkListener
descriptor.initListener();
if (descriptor.isPostCommit) {
if (descriptor.isAsync) {
asyncPostCommitListenersDescriptors.add(descriptor);
Collections.sort(asyncPostCommitListenersDescriptors, new EventListenerDescriptorComparator());
}
else {
syncPostCommitListenersDescriptors.add(descriptor);
Collections.sort(syncPostCommitListenersDescriptors, new EventListenerDescriptorComparator());
}
} else {
inlineListenersDescriptors.add(descriptor);
Collections.sort(inlineListenersDescriptors, new EventListenerDescriptorComparator());
}
listenerNames.add(descriptor.getName());
}
protected EventListenerDescriptor mergeDescriptor(EventListenerDescriptor descriptor) {
EventListenerDescriptor existingDesc = getDescriptor(descriptor.getName());
removeDescriptor(existingDesc);
existingDesc.merge(descriptor);
return existingDesc;
}
public void removeDescriptor(EventListenerDescriptor descriptor) {
enabledFilteringDone=false;
if (listenerNames.contains(descriptor.getName())) {
if (descriptor.isPostCommit) {
if (descriptor.isAsync) {
asyncPostCommitListenersDescriptors.remove(descriptor);
} else {
syncPostCommitListenersDescriptors.remove(descriptor);
}
} else {
inlineListenersDescriptors.remove(descriptor);
}
listenerNames.remove(descriptor.getName());
}
}
public EventListenerDescriptor getDescriptor(String listenerName) {
if (!listenerNames.contains(listenerName)) {
return null;
}
for (EventListenerDescriptor desc : inlineListenersDescriptors) {
if (desc.getName().equals(listenerName)) {
return desc;
}
}
for (EventListenerDescriptor desc : syncPostCommitListenersDescriptors) {
if (desc.getName().equals(listenerName)) {
return desc;
}
}
for (EventListenerDescriptor desc : asyncPostCommitListenersDescriptors) {
if (desc.getName().equals(listenerName)) {
return desc;
}
}
return null;
}
public List<EventListener> getInLineListeners() {
List<EventListener> listeners = new ArrayList<EventListener>();
for (EventListenerDescriptor desc : getEnabledInlineListenersDescriptors()) {
listeners.add(desc.asEventListener());
}
return listeners;
}
public List<PostCommitEventListener> getSyncPostCommitListeners() {
List<PostCommitEventListener> listeners = new ArrayList<PostCommitEventListener>();
for (EventListenerDescriptor desc : getEnabledSyncPostCommitListenersDescriptors()) {
listeners.add(desc.asPostCommitListener());
}
return listeners;
}
public List<PostCommitEventListener> getAsyncPostCommitListeners() {
List<PostCommitEventListener> listeners = new ArrayList<PostCommitEventListener>();
for (EventListenerDescriptor desc : getEnabledAsyncPostCommitListenersDescriptors()) {
listeners.add(desc.asPostCommitListener());
}
return listeners;
}
public List<EventListenerDescriptor> getInlineListenersDescriptors() {
return inlineListenersDescriptors;
}
public List<EventListenerDescriptor> getSyncPostCommitListenersDescriptors() {
return syncPostCommitListenersDescriptors;
}
public List<EventListenerDescriptor> getAsyncPostCommitListenersDescriptors() {
return asyncPostCommitListenersDescriptors;
}
public synchronized void recomputeEnabledListeners() {
enabledAsyncPostCommitListenersDescriptors.clear();
for (EventListenerDescriptor desc : asyncPostCommitListenersDescriptors) {
if (desc.isEnabled) {
enabledAsyncPostCommitListenersDescriptors.add(desc);
}
}
enabledSyncPostCommitListenersDescriptors.clear();
for (EventListenerDescriptor desc : syncPostCommitListenersDescriptors) {
if (desc.isEnabled) {
enabledSyncPostCommitListenersDescriptors.add(desc);
}
}
enabledInlineListenersDescriptors.clear();
for (EventListenerDescriptor desc : inlineListenersDescriptors) {
if (desc.isEnabled) {
enabledInlineListenersDescriptors.add(desc);
}
}
enabledFilteringDone=true;
}
public synchronized List<EventListenerDescriptor> getEnabledInlineListenersDescriptors() {
if (!enabledFilteringDone) {
recomputeEnabledListeners();
}
return new ArrayList<EventListenerDescriptor>(enabledInlineListenersDescriptors);
}
public synchronized List<EventListenerDescriptor> getEnabledSyncPostCommitListenersDescriptors() {
if (!enabledFilteringDone) {
recomputeEnabledListeners();
}
return new ArrayList<EventListenerDescriptor>(enabledSyncPostCommitListenersDescriptors);
}
public synchronized List<EventListenerDescriptor> getEnabledAsyncPostCommitListenersDescriptors() {
if (!enabledFilteringDone) {
recomputeEnabledListeners();
}
return new ArrayList<EventListenerDescriptor>(enabledAsyncPostCommitListenersDescriptors);
}
public List<String> getListenerNames() {
return listenerNames;
}
}