/*
* 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);
}
}
}
}