package org.mobicents.slee.runtime.eventrouter;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import javax.slee.resource.EventFlags;
import org.mobicents.slee.runtime.activity.ActivityContextHandle;
import org.mobicents.slee.util.concurrent.ConcurrentHashSet;
/**
* Manages references to events fired by RAs with {@link EventFlags#REQUEST_EVENT_UNREFERENCED_CALLBACK}
*
* @author martins
*
*/
public class DeferredEventReferencesManagement {
private final ConcurrentHashMap<Object, DeferredEventReferences> eventsBeingManaged = new ConcurrentHashMap<Object, DeferredEventReferences>();
public void manageReferencesForEvent(DeferredEvent de) {
eventsBeingManaged.put(de.getEvent(),new DeferredEventReferences(de));
}
public void unmanageReferencesForEvent(DeferredEvent de) {
eventsBeingManaged.remove(de.getEvent());
}
public void eventReferencedByActivity(Object event, ActivityContextHandle ach) {
DeferredEventReferences der = eventsBeingManaged.get(event);
if (der != null) {
der.getActivitiesReferencing().add(ach);
}
}
public void eventUnreferencedByActivity(Object event, ActivityContextHandle ach) {
DeferredEventReferences der = eventsBeingManaged.get(event);
if (der != null) {
der.getActivitiesReferencing().remove(ach);
if (der.getActivitiesReferencing().isEmpty()) {
eventsBeingManaged.remove(event);
der.getDeferredEvent().eventUnreferenced();
}
}
}
private class DeferredEventReferences {
private final DeferredEvent de;
private final Set<ActivityContextHandle> activitiesReferencing = new ConcurrentHashSet<ActivityContextHandle>();
public DeferredEventReferences(DeferredEvent de) {
this.de = de;
activitiesReferencing.add(de.getActivityContextHandle());
}
public DeferredEvent getDeferredEvent() {
return de;
}
public Set<ActivityContextHandle> getActivitiesReferencing() {
return activitiesReferencing;
}
@Override
public int hashCode() {
return de.getEvent().hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj != null && obj.getClass() == this.getClass()) {
return ((DeferredEventReferences)obj).de.getEvent().equals(this.de.getEvent());
}
else {
return false;
}
}
}
}