/*
* Copyright (c) 2008-2017, Hazelcast, Inc. All Rights Reserved.
*
* 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 com.hazelcast.map.impl;
import com.hazelcast.core.EntryEvent;
import com.hazelcast.core.EntryEventType;
import com.hazelcast.core.IMapEvent;
import com.hazelcast.core.MapEvent;
import com.hazelcast.internal.nearcache.impl.invalidation.Invalidation;
import com.hazelcast.map.impl.nearcache.invalidation.InvalidationListener;
import com.hazelcast.map.listener.EntryAddedListener;
import com.hazelcast.map.listener.EntryEvictedListener;
import com.hazelcast.map.listener.EntryExpiredListener;
import com.hazelcast.map.listener.EntryMergedListener;
import com.hazelcast.map.listener.EntryRemovedListener;
import com.hazelcast.map.listener.EntryUpdatedListener;
import com.hazelcast.map.listener.MapClearedListener;
import com.hazelcast.map.listener.MapEvictedListener;
import com.hazelcast.map.listener.MapListener;
import com.hazelcast.util.ConstructorFunction;
import java.util.EnumMap;
import java.util.Map;
/**
* A static factory class which creates various
* {@link com.hazelcast.map.impl.ListenerAdapter} implementations.
*/
public final class MapListenerAdaptors {
/**
* Registry for all {@link com.hazelcast.map.listener.MapListener} to {@link com.hazelcast.map.impl.ListenerAdapter}
* constructors according to {@link com.hazelcast.core.EntryEventType}s.
*/
private static final Map<EntryEventType, ConstructorFunction<MapListener, ListenerAdapter>> CONSTRUCTORS
= new EnumMap<EntryEventType, ConstructorFunction<MapListener, ListenerAdapter>>(EntryEventType.class);
/**
* Converts an {@link com.hazelcast.map.listener.EntryAddedListener} to a {@link com.hazelcast.map.impl.ListenerAdapter}.
*/
private static final ConstructorFunction<MapListener, ListenerAdapter> ENTRY_ADDED_LISTENER_ADAPTER_CONSTRUCTOR =
new ConstructorFunction<MapListener, ListenerAdapter>() {
@Override
public ListenerAdapter createNew(MapListener mapListener) {
if (!(mapListener instanceof EntryAddedListener)) {
return null;
}
final EntryAddedListener listener = (EntryAddedListener) mapListener;
return new ListenerAdapter<IMapEvent>() {
@Override
public void onEvent(IMapEvent event) {
listener.entryAdded((EntryEvent) event);
}
};
}
};
/**
* Converts an {@link com.hazelcast.map.listener.EntryRemovedListener} to a {@link com.hazelcast.map.impl.ListenerAdapter}.
*/
private static final ConstructorFunction<MapListener, ListenerAdapter> ENTRY_REMOVED_LISTENER_ADAPTER_CONSTRUCTOR =
new ConstructorFunction<MapListener, ListenerAdapter>() {
@Override
public ListenerAdapter createNew(MapListener mapListener) {
if (!(mapListener instanceof EntryRemovedListener)) {
return null;
}
final EntryRemovedListener listener = (EntryRemovedListener) mapListener;
return new ListenerAdapter<IMapEvent>() {
@Override
public void onEvent(IMapEvent event) {
listener.entryRemoved((EntryEvent) event);
}
};
}
};
/**
* Converts an {@link com.hazelcast.map.listener.EntryEvictedListener} to a {@link com.hazelcast.map.impl.ListenerAdapter}.
*/
private static final ConstructorFunction<MapListener, ListenerAdapter> ENTRY_EVICTED_LISTENER_ADAPTER_CONSTRUCTOR =
new ConstructorFunction<MapListener, ListenerAdapter>() {
@Override
public ListenerAdapter createNew(MapListener mapListener) {
if (!(mapListener instanceof EntryEvictedListener)) {
return null;
}
final EntryEvictedListener listener = (EntryEvictedListener) mapListener;
return new ListenerAdapter<IMapEvent>() {
@Override
public void onEvent(IMapEvent event) {
listener.entryEvicted((EntryEvent) event);
}
};
}
};
/**
* Converts an {@link com.hazelcast.map.listener.EntryUpdatedListener} to a {@link com.hazelcast.map.impl.ListenerAdapter}.
*/
private static final ConstructorFunction<MapListener, ListenerAdapter> ENTRY_UPDATED_LISTENER_ADAPTER_CONSTRUCTOR =
new ConstructorFunction<MapListener, ListenerAdapter>() {
@Override
public ListenerAdapter createNew(MapListener mapListener) {
if (!(mapListener instanceof EntryUpdatedListener)) {
return null;
}
final EntryUpdatedListener listener = (EntryUpdatedListener) mapListener;
return new ListenerAdapter<IMapEvent>() {
@Override
public void onEvent(IMapEvent event) {
listener.entryUpdated((EntryEvent) event);
}
};
}
};
/**
* Converts an {@link com.hazelcast.map.listener.MapEvictedListener} to a {@link com.hazelcast.map.impl.ListenerAdapter}.
*/
private static final ConstructorFunction<MapListener, ListenerAdapter> MAP_EVICTED_LISTENER_ADAPTER_CONSTRUCTOR =
new ConstructorFunction<MapListener, ListenerAdapter>() {
@Override
public ListenerAdapter createNew(MapListener mapListener) {
if (!(mapListener instanceof MapEvictedListener)) {
return null;
}
final MapEvictedListener listener = (MapEvictedListener) mapListener;
return new ListenerAdapter<IMapEvent>() {
@Override
public void onEvent(IMapEvent event) {
listener.mapEvicted((MapEvent) event);
}
};
}
};
/**
* Converts an {@link com.hazelcast.map.listener.MapClearedListener} to a {@link com.hazelcast.map.impl.ListenerAdapter}.
*/
private static final ConstructorFunction<MapListener, ListenerAdapter> MAP_CLEARED_LISTENER_ADAPTER_CONSTRUCTOR =
new ConstructorFunction<MapListener, ListenerAdapter>() {
@Override
public ListenerAdapter createNew(MapListener mapListener) {
if (!(mapListener instanceof MapClearedListener)) {
return null;
}
final MapClearedListener listener = (MapClearedListener) mapListener;
return new ListenerAdapter<IMapEvent>() {
@Override
public void onEvent(IMapEvent event) {
listener.mapCleared((MapEvent) event);
}
};
}
};
/**
* Converts an {@link com.hazelcast.map.listener.EntryMergedListener} to a {@link com.hazelcast.map.impl.ListenerAdapter}.
*/
private static final ConstructorFunction<MapListener, ListenerAdapter> ENTRY_MERGED_LISTENER_ADAPTER_CONSTRUCTOR =
new ConstructorFunction<MapListener, ListenerAdapter>() {
@Override
public ListenerAdapter createNew(MapListener mapListener) {
if (!(mapListener instanceof EntryMergedListener)) {
return null;
}
final EntryMergedListener listener = (EntryMergedListener) mapListener;
return new ListenerAdapter<IMapEvent>() {
@Override
public void onEvent(IMapEvent event) {
listener.entryMerged((EntryEvent) event);
}
};
}
};
/**
* Converts an {@link InvalidationListener} to a {@link com.hazelcast.map.impl.ListenerAdapter}.
*/
private static final ConstructorFunction<MapListener, ListenerAdapter> INVALIDATION_LISTENER =
new ConstructorFunction<MapListener, ListenerAdapter>() {
@Override
public ListenerAdapter createNew(MapListener mapListener) {
if (!(mapListener instanceof InvalidationListener)) {
return null;
}
final InvalidationListener listener = (InvalidationListener) mapListener;
return new ListenerAdapter<Invalidation>() {
@Override
public void onEvent(Invalidation event) {
listener.onInvalidate(event);
}
};
}
};
/**
* Converts an {@link EntryExpiredListener} to a {@link com.hazelcast.map.impl.ListenerAdapter}.
*/
private static final ConstructorFunction<MapListener, ListenerAdapter> ENTRY_EXPIRED_LISTENER_ADAPTER_CONSTRUCTOR =
new ConstructorFunction<MapListener, ListenerAdapter>() {
@Override
public ListenerAdapter createNew(MapListener mapListener) {
if (!(mapListener instanceof EntryExpiredListener)) {
return null;
}
final EntryExpiredListener listener = (EntryExpiredListener) mapListener;
return new ListenerAdapter<IMapEvent>() {
@Override
public void onEvent(IMapEvent event) {
listener.entryExpired((EntryEvent) event);
}
};
}
};
/**
* Register all {@link com.hazelcast.map.impl.ListenerAdapter} constructors
* according to {@link com.hazelcast.core.EntryEventType}s.
*/
static {
CONSTRUCTORS.put(EntryEventType.ADDED, ENTRY_ADDED_LISTENER_ADAPTER_CONSTRUCTOR);
CONSTRUCTORS.put(EntryEventType.REMOVED, ENTRY_REMOVED_LISTENER_ADAPTER_CONSTRUCTOR);
CONSTRUCTORS.put(EntryEventType.EVICTED, ENTRY_EVICTED_LISTENER_ADAPTER_CONSTRUCTOR);
CONSTRUCTORS.put(EntryEventType.UPDATED, ENTRY_UPDATED_LISTENER_ADAPTER_CONSTRUCTOR);
CONSTRUCTORS.put(EntryEventType.MERGED, ENTRY_MERGED_LISTENER_ADAPTER_CONSTRUCTOR);
CONSTRUCTORS.put(EntryEventType.EXPIRED, ENTRY_EXPIRED_LISTENER_ADAPTER_CONSTRUCTOR);
CONSTRUCTORS.put(EntryEventType.EVICT_ALL, MAP_EVICTED_LISTENER_ADAPTER_CONSTRUCTOR);
CONSTRUCTORS.put(EntryEventType.CLEAR_ALL, MAP_CLEARED_LISTENER_ADAPTER_CONSTRUCTOR);
CONSTRUCTORS.put(EntryEventType.INVALIDATION, INVALIDATION_LISTENER);
}
private MapListenerAdaptors() {
}
/**
* Creates a {@link com.hazelcast.map.impl.ListenerAdapter} array
* for all event types of {@link com.hazelcast.core.EntryEventType}.
*
* @param mapListener a {@link com.hazelcast.map.listener.MapListener} instance.
* @return an array of {@link com.hazelcast.map.impl.ListenerAdapter}
*/
public static ListenerAdapter[] createListenerAdapters(MapListener mapListener) {
EntryEventType[] values = EntryEventType.values();
ListenerAdapter[] listenerAdapters = new ListenerAdapter[values.length];
for (EntryEventType eventType : values) {
listenerAdapters[eventType.ordinal()] = createListenerAdapter(eventType, mapListener);
}
return listenerAdapters;
}
/**
* Creates a {@link ListenerAdapter} for a specific {@link com.hazelcast.core.EntryEventType}.
*
* @param eventType an {@link com.hazelcast.core.EntryEventType}.
* @param mapListener a {@link com.hazelcast.map.listener.MapListener} instance.
* @return {@link com.hazelcast.map.impl.ListenerAdapter} for a specific {@link com.hazelcast.core.EntryEventType}
*/
private static ListenerAdapter createListenerAdapter(EntryEventType eventType, MapListener mapListener) {
final ConstructorFunction<MapListener, ListenerAdapter> constructorFunction = CONSTRUCTORS.get(eventType);
if (constructorFunction == null) {
throw new IllegalArgumentException("First, define a ListenerAdapter for the event EntryEventType." + eventType);
}
return constructorFunction.createNew(mapListener);
}
/**
* Wraps a user defined {@link com.hazelcast.map.listener.MapListener}
* into a {@link com.hazelcast.map.impl.ListenerAdapter}.
*
* @param mapListener a {@link com.hazelcast.map.listener.MapListener} instance.
* @return {@link com.hazelcast.map.impl.ListenerAdapter} for the user-defined
* {@link com.hazelcast.map.listener.MapListener}
*/
static ListenerAdapter createMapListenerAdaptor(MapListener mapListener) {
return new InternalMapListenerAdapter(mapListener);
}
}