package org.openntf.domino;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import javolution.util.FastMap;
import org.openntf.domino.events.EnumEvent;
import org.openntf.domino.events.IDominoEvent;
import org.openntf.domino.events.IDominoListener;
import org.openntf.domino.utils.DominoUtils;
/**
* Common class for ODA extension where no lotus wrapper exists (WrapperFactory, DocumentList)
*
* @author Roland Praml, FOCONIS AG
*
*/
public abstract class BaseImpl<D extends lotus.domino.Base> implements Base<D> {
private List<IDominoListener> listeners_;
private transient Map<EnumEvent, List<IDominoListener>> listenerCache_;
@Override
public final boolean hasListeners() {
return listeners_ != null && !listeners_.isEmpty();
}
@Override
public final List<IDominoListener> getListeners() {
if (listeners_ == null) {
listeners_ = new ArrayList<IDominoListener>();
}
return listeners_;
}
@Override
public final void addListener(final IDominoListener listener) {
listenerCache_ = null;
getListeners().add(listener);
}
@Override
public final void removeListener(final IDominoListener listener) {
listenerCache_ = null;
getListeners().remove(listener);
}
@Override
public final List<IDominoListener> getListeners(final EnumEvent event) {
if (!hasListeners())
return Collections.emptyList();
if (listenerCache_ == null)
listenerCache_ = new FastMap<EnumEvent, List<IDominoListener>>();
List<IDominoListener> result = listenerCache_.get(event);
if (result == null) {
result = new ArrayList<IDominoListener>();
for (IDominoListener listener : getListeners()) {
for (EnumEvent curEvent : listener.getEventTypes()) {
if (curEvent.equals(event)) {
result.add(listener);
break;
}
}
}
listenerCache_.put(event, result);
}
return result;
}
@Override
public final boolean fireListener(final IDominoEvent event) {
boolean result = true;
if (!hasListeners())
return true;
List<IDominoListener> listeners = getListeners(event.getEvent());
if (listeners == null || listeners.isEmpty())
return true;
for (IDominoListener listener : listeners) {
try {
if (!listener.eventHappened(event)) {
result = false;
break;
}
} catch (Throwable t) {
DominoUtils.handleException(t);
}
}
return result;
}
}