package org.infinispan.cdi.embedded.test.event; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.infinispan.notifications.cachemanagerlistener.event.Event; /** * Collects all events from observer and allows to extract them. * * @author Sebastian Laskawiec */ public class CacheEventHolder { /** * Main data structure of this event holder. * <p> * From top to bottom: * <ul> * <li><code>Map<Class, Map></code> - holds Cache annotation as keys and event map as value</li> * <li><code>Map<Class, List></code> - holds Event class as keys and a list of occurred event as value</li> * <li><code>List</code> - holds list of occurred events</li> * </ul> * </p> */ private Map<Class<?>, Map<Class<?>, List<Object>>> eventMap = new HashMap<>(); private void addEventClass(Class<?> cacheAnnotationClass, Class<?> eventClass) { if(!eventMap.containsKey(cacheAnnotationClass)) { eventMap.put(cacheAnnotationClass, new HashMap<>()); } if(!eventMap.get(cacheAnnotationClass).containsKey(eventClass)) { eventMap.get(cacheAnnotationClass).put(eventClass, new ArrayList<>()); } } /** * Adds event to this holder. * * @param cacheAnnotationClass CDI Cache qualifier annotation (like <code>@Cache1</code>). * @param eventStaticClass Event static class information (event have generic type information). * @param event Event itself. * @param <T> Generic information about event type. */ public <T extends org.infinispan.notifications.cachelistener.event.Event> void addEvent (Class<?> cacheAnnotationClass, Class<T> eventStaticClass, T event) { addEventClass(cacheAnnotationClass, eventStaticClass); eventMap.get(cacheAnnotationClass).get(eventStaticClass).add(event); } /** * Adds event to this holder. * * @param cacheAnnotationClass CDI Cache qualifier annotation (like <code>@Cache1</code>). * @param eventStaticClass Event static class information (event have generic type information). * @param event Event itself. * @param <T> Generic information about event type. */ public <T extends Event> void addEvent(Class<?> cacheAnnotationClass, Class<T> eventStaticClass, T event) { addEventClass(cacheAnnotationClass,eventStaticClass); eventMap.get(cacheAnnotationClass).get(eventStaticClass).add(event); } public void clear() { eventMap.clear(); } /** * Gets all events based on Cache annotation and class of events. * * @param cacheAnnotationClass CDI Cache qualifier annotation (like <code>@Cache1</code>). * @param eventClass Event class. * @param <T> Generic information about event type. * @return List of events occurred. Empty list if there was no events. */ public <T> List<T> getEvents(Class<?> cacheAnnotationClass, Class<T> eventClass) { ArrayList<T> toBeReturned = new ArrayList<>(); Map<Class<?>, List<Object>> eventsMapForGivenCache = eventMap.get(cacheAnnotationClass); if(eventsMapForGivenCache == null) { return toBeReturned; } List<Object> events = eventsMapForGivenCache.get(eventClass); if(events != null) { for (Object event : events) { toBeReturned.add(eventClass.cast(event)); } } return toBeReturned; } }