package au.com.vaadinutils.crud.events; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; import au.com.vaadinutils.audit.AuditFactory; import au.com.vaadinutils.crud.BaseCrudView; import au.com.vaadinutils.crud.CrudEntity; public enum CrudEventDistributer { SELF; // Logger logger = LogManager.getLogger(); Map<Class<? extends BaseCrudView<?>>, List<CrudEventListener>> listeners = new ConcurrentHashMap<>(); public static synchronized void addListener(Class<? extends BaseCrudView<?>> type, CrudEventListener listener) { List<CrudEventListener> list = SELF.listeners.get(type); if (list == null) { list = new CopyOnWriteArrayList<CrudEventListener>(); SELF.listeners.put(type, list); } list.add(listener); } public static void removeListener(Class<? extends BaseCrudView<?>> type, CrudEventListener listener) { List<CrudEventListener> list = SELF.listeners.get(type); if (list != null) { list.remove(listener); } } public static <T extends CrudEntity> void publishEvent(BaseCrudView<T> view, CrudEventType event, T entity) { List<CrudEventListener> interestedParties = SELF.listeners.get(view.getClass()); if (interestedParties != null) { for (CrudEventListener listener : interestedParties) { listener.crudEvent(event, entity); } } AuditFactory.getAuditor().audit(event, entity); } }