/* * Copyright Terracotta, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.ehcache.jsr107; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; import javax.cache.Cache; import javax.cache.event.CacheEntryCreatedListener; import javax.cache.event.CacheEntryEvent; import javax.cache.event.CacheEntryEventFilter; import javax.cache.event.CacheEntryExpiredListener; import javax.cache.event.CacheEntryListener; import javax.cache.event.CacheEntryRemovedListener; import javax.cache.event.CacheEntryUpdatedListener; import javax.cache.event.EventType; /** * @author teck */ class EventListenerAdaptors { static abstract class EventListenerAdaptor<K, V> implements org.ehcache.event.CacheEventListener<K, V> { final CacheEntryEventFilter<K, V> filter; final Cache<K, V> source; final boolean requestsOld; EventListenerAdaptor(Cache<K, V> source, CacheEntryEventFilter<K, V> filter, boolean requestsOld) { this.source = source; this.filter = filter; this.requestsOld = requestsOld; } abstract org.ehcache.event.EventType getEhcacheEventType(); } @SuppressWarnings("unchecked") static <K, V> List<EventListenerAdaptor<K, V>> ehListenersFor(CacheEntryListener<? super K, ? super V> listener, CacheEntryEventFilter<? super K, ? super V> filter, Cache<K, V> source, boolean requestsOld) { List<EventListenerAdaptor<K, V>> rv = new ArrayList<EventListenerAdaptor<K, V>>(); if (listener instanceof CacheEntryUpdatedListener) { rv.add(new UpdatedAdaptor<K, V>(source, (CacheEntryUpdatedListener<K, V>) listener, (CacheEntryEventFilter<K, V>) filter, requestsOld)); } if (listener instanceof CacheEntryCreatedListener) { rv.add(new CreatedAdaptor<K, V>(source, (CacheEntryCreatedListener<K, V>) listener, (CacheEntryEventFilter<K, V>) filter, requestsOld)); } if (listener instanceof CacheEntryRemovedListener) { rv.add(new RemovedAdaptor<K, V>(source, (CacheEntryRemovedListener<K, V>) listener, (CacheEntryEventFilter<K, V>) filter, requestsOld)); } if (listener instanceof CacheEntryExpiredListener) { rv.add(new ExpiredAdaptor<K, V>(source, (CacheEntryExpiredListener<K, V>) listener, (CacheEntryEventFilter<K, V>) filter, requestsOld)); } return rv; } private EventListenerAdaptors() { // } static class UpdatedAdaptor<K, V> extends EventListenerAdaptor<K, V> { private final CacheEntryUpdatedListener<K, V> listener; UpdatedAdaptor(Cache<K, V> source, CacheEntryUpdatedListener<K, V> listener, CacheEntryEventFilter<K, V> filter, boolean requestsOld) { super(source, filter, requestsOld); this.listener = listener; } @Override org.ehcache.event.EventType getEhcacheEventType() { return org.ehcache.event.EventType.UPDATED; } @SuppressWarnings("unchecked") @Override public void onEvent(org.ehcache.event.CacheEvent<? extends K, ? extends V> ehEvent) { Eh107CacheEntryEvent<K, V> event = new Eh107CacheEntryEvent.NormalEvent<K, V>(source, EventType.UPDATED, ehEvent, requestsOld); if (filter.evaluate(event)) { Set<?> events = Collections.singleton(event); listener.onUpdated((Iterable<CacheEntryEvent<? extends K, ? extends V>>) events); } } } static class RemovedAdaptor<K, V> extends EventListenerAdaptor<K, V> { private final CacheEntryRemovedListener<K, V> listener; RemovedAdaptor(Cache<K, V> source, CacheEntryRemovedListener<K, V> listener, CacheEntryEventFilter<K, V> filter, boolean requestsOld) { super(source, filter, requestsOld); this.listener = listener; } @Override org.ehcache.event.EventType getEhcacheEventType() { return org.ehcache.event.EventType.REMOVED; } @SuppressWarnings("unchecked") @Override public void onEvent(org.ehcache.event.CacheEvent<? extends K, ? extends V> ehEvent) { Eh107CacheEntryEvent<K, V> event = new Eh107CacheEntryEvent.RemovingEvent<K, V>(source, EventType.REMOVED, ehEvent, requestsOld); if (filter.evaluate(event)) { Set<?> events = Collections.singleton(event); listener.onRemoved((Iterable<CacheEntryEvent<? extends K, ? extends V>>) events); } } } static class ExpiredAdaptor<K, V> extends EventListenerAdaptor<K, V> { private final CacheEntryExpiredListener<K, V> listener; ExpiredAdaptor(Cache<K, V> source, CacheEntryExpiredListener<K, V> listener, CacheEntryEventFilter<K, V> filter, boolean requestsOld) { super(source, filter, requestsOld); this.listener = listener; } @Override org.ehcache.event.EventType getEhcacheEventType() { return org.ehcache.event.EventType.EXPIRED; } @SuppressWarnings("unchecked") @Override public void onEvent(org.ehcache.event.CacheEvent<? extends K, ? extends V> ehEvent) { Eh107CacheEntryEvent<K, V> event = new Eh107CacheEntryEvent.RemovingEvent<K, V>(source, EventType.EXPIRED, ehEvent, requestsOld); if (filter.evaluate(event)) { Set<?> events = Collections.singleton(event); listener.onExpired((Iterable<CacheEntryEvent<? extends K, ? extends V>>) events); } } } static class CreatedAdaptor<K, V> extends EventListenerAdaptor<K, V> { private final CacheEntryCreatedListener<K, V> listener; CreatedAdaptor(Cache<K, V> source, CacheEntryCreatedListener<K, V> listener, CacheEntryEventFilter<K, V> filter, boolean requestsOld) { super(source, filter, requestsOld); this.listener = listener; } @Override org.ehcache.event.EventType getEhcacheEventType() { return org.ehcache.event.EventType.CREATED; } @SuppressWarnings("unchecked") @Override public void onEvent(org.ehcache.event.CacheEvent<? extends K, ? extends V> ehEvent) { Eh107CacheEntryEvent<K, V> event = new Eh107CacheEntryEvent.NormalEvent<K, V>(source, EventType.CREATED, ehEvent, requestsOld); if (filter.evaluate(event)) { Set<?> events = Collections.singleton(event); listener.onCreated((Iterable<CacheEntryEvent<? extends K, ? extends V>>) events); } } } }