/* ********************************************************************** ** ** Copyright notice ** ** ** ** (c) 2005-2009 RSSOwl Development Team ** ** http://www.rssowl.org/ ** ** ** ** 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.rssowl.org/legal/epl-v10.html ** ** ** ** A copy is found in the file epl-v10.html and important notices to the ** ** license from the team is found in the textfile LICENSE.txt distributed ** ** in this package. ** ** ** ** This copyright notice MUST APPEAR in all copies of the file! ** ** ** ** Contributors: ** ** RSSOwl Development Team - initial API and implementation ** ** ** ** ********************************************************************** */ package org.rssowl.core.internal.persist.service; import org.rssowl.core.persist.IEntity; import org.rssowl.core.persist.event.ModelEvent; import org.rssowl.core.persist.event.runnable.EventRunnable; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.IdentityHashMap; import java.util.List; import java.util.Map; /** * A {@link Map} of {@link ModelEvent} pointing to {@link EventRunnable}. */ public class EventsMap { private static final EventsMap INSTANCE = new EventsMap(); private static class InternalMap extends HashMap<Class<? extends ModelEvent>, EventRunnable<? extends ModelEvent>> { InternalMap() { super(); } } private final ThreadLocal<InternalMap> fEvents = new ThreadLocal<InternalMap>(); private final ThreadLocal<Map<IEntity, ModelEvent>> fEventTemplatesMap = new ThreadLocal<Map<IEntity, ModelEvent>>(); private EventsMap() { // Enforce singleton pattern } public final static EventsMap getInstance() { return INSTANCE; } public final void putPersistEvent(ModelEvent event) { EventRunnable<? extends ModelEvent> eventRunnable = getEventRunnable(event); eventRunnable.addCheckedPersistEvent(event); } public final void putUpdateEvent(ModelEvent event) { EventRunnable<? extends ModelEvent> eventRunnable = getEventRunnable(event); eventRunnable.addCheckedUpdateEvent(event); } public final void putRemoveEvent(ModelEvent event) { EventRunnable<? extends ModelEvent> eventRunnable = getEventRunnable(event); eventRunnable.addCheckedRemoveEvent(event); } public final boolean containsPersistEvent(Class<? extends ModelEvent> eventClass, IEntity entity) { EventRunnable<? extends ModelEvent> eventRunnable = getEventRunnable(eventClass); return eventRunnable.getPersistEvents().contains(entity); } public final boolean containsUpdateEvent(Class<? extends ModelEvent> eventClass, IEntity entity) { EventRunnable<? extends ModelEvent> eventRunnable = getEventRunnable(eventClass); return eventRunnable.getUpdateEvents().contains(entity); } public final boolean containsRemoveEvent(Class<? extends ModelEvent> eventClass, IEntity entity) { EventRunnable<? extends ModelEvent> eventRunnable = getEventRunnable(eventClass); return eventRunnable.getRemoveEvents().contains(entity); } private EventRunnable<? extends ModelEvent> getEventRunnable(Class<? extends ModelEvent> eventClass) { InternalMap map = fEvents.get(); if (map == null) { map = new InternalMap(); fEvents.set(map); } EventRunnable<? extends ModelEvent> eventRunnable = map.get(eventClass); return eventRunnable; } private EventRunnable<? extends ModelEvent> getEventRunnable(ModelEvent event) { Class<? extends ModelEvent> eventClass = event.getClass(); EventRunnable<? extends ModelEvent> eventRunnable = getEventRunnable(eventClass); if (eventRunnable == null) { eventRunnable = event.createEventRunnable(); fEvents.get().put(eventClass, eventRunnable); } return eventRunnable; } public EventRunnable<? extends ModelEvent> removeEventRunnable(Class<? extends ModelEvent> klass) { InternalMap map = fEvents.get(); if (map == null) return null; EventRunnable<? extends ModelEvent> runnable = map.remove(klass); return runnable; } public List<EventRunnable<?>> getEventRunnables() { InternalMap map = fEvents.get(); if (map == null) return new ArrayList<EventRunnable<?>>(0); List<EventRunnable<?>> eventRunnables = new ArrayList<EventRunnable<?>>(map.size()); for (Map.Entry<Class<? extends ModelEvent>, EventRunnable<? extends ModelEvent>> entry : map.entrySet()) { eventRunnables.add(entry.getValue()); } return eventRunnables; } public List<EventRunnable<?>> removeEventRunnables() { InternalMap map = fEvents.get(); if (map == null) return new ArrayList<EventRunnable<?>>(0); List<EventRunnable<?>> eventRunnables = getEventRunnables(); map.clear(); return eventRunnables; } public void putEventTemplate(ModelEvent event) { Map<IEntity, ModelEvent> map = fEventTemplatesMap.get(); if (map == null) { map = new IdentityHashMap<IEntity, ModelEvent>(); fEventTemplatesMap.set(map); } map.put(event.getEntity(), event); } public final Map<IEntity, ModelEvent> getEventTemplatesMap() { Map<IEntity, ModelEvent> map = fEventTemplatesMap.get(); if (map == null) return Collections.emptyMap(); return Collections.unmodifiableMap(fEventTemplatesMap.get()); } public Map<IEntity, ModelEvent> removeEventTemplatesMap() { Map<IEntity, ModelEvent> map = fEventTemplatesMap.get(); fEventTemplatesMap.remove(); return map; } }