/*
* 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.config;
import com.hazelcast.core.EntryEvent;
import com.hazelcast.core.EntryListener;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.core.HazelcastInstanceAware;
import com.hazelcast.core.MapEvent;
import com.hazelcast.map.listener.EntryAddedListener;
import com.hazelcast.map.listener.EntryEvictedListener;
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 java.util.EventListener;
import static com.hazelcast.util.Preconditions.isNotNull;
/**
* Configuration for EntryListener
*/
public class EntryListenerConfig extends ListenerConfig {
private boolean local;
private boolean includeValue = true;
private EntryListenerConfigReadOnly readOnly;
public EntryListenerConfig() {
}
public EntryListenerConfig(String className, boolean local, boolean includeValue) {
super(className);
this.local = local;
this.includeValue = includeValue;
}
public EntryListenerConfig(EntryListener implementation, boolean local, boolean includeValue) {
super(implementation);
this.local = local;
this.includeValue = includeValue;
}
public EntryListenerConfig(MapListener implementation, boolean local, boolean includeValue) {
super(toEntryListener(implementation));
this.local = local;
this.includeValue = includeValue;
}
public EntryListenerConfig(EntryListenerConfig config) {
includeValue = config.isIncludeValue();
local = config.isLocal();
implementation = config.getImplementation();
className = config.getClassName();
}
/**
* Gets immutable version of this configuration.
*
* @return Immutable version of this configuration.
* @deprecated this method will be removed in 4.0; it is meant for internal usage only.
*/
@Override
public EntryListenerConfigReadOnly getAsReadOnly() {
if (readOnly == null) {
readOnly = new EntryListenerConfigReadOnly(this);
}
return readOnly;
}
@Override
public ListenerConfig setImplementation(EventListener implementation) {
isNotNull(implementation, "implementation");
this.implementation = toEntryListener(implementation);
this.className = null;
return this;
}
@Override
public EntryListener getImplementation() {
return (EntryListener) implementation;
}
/**
* This method provides a workaround by converting a MapListener to EntryListener
* when it is added via EntryListenerConfig object.
* <p/>
* With this method, we are trying to fix two problems :
* First, if we do not introduce the conversion in this method, {@link EntryListenerConfig#getImplementation}
* will give {@link ClassCastException} with a MapListener implementation.
* <p/>
* Second goal of the conversion is to preserve backward compatibility.
*/
private static EventListener toEntryListener(Object implementation) {
if (implementation instanceof EntryListener) {
return (EventListener) implementation;
}
if (implementation instanceof MapListener) {
return new MapListenerToEntryListenerAdapter((MapListener) implementation);
}
throw new IllegalArgumentException(implementation + " is not an expected EventListener implementation."
+ " A valid one has to be an implementation of EntryListener or MapListener");
}
/**
* Wraps a MapListener into an EntryListener.
*/
public static class MapListenerToEntryListenerAdapter implements EntryListener, HazelcastInstanceAware {
private final MapListener mapListener;
public MapListenerToEntryListenerAdapter(MapListener mapListener) {
this.mapListener = mapListener;
}
@Override
public void entryAdded(EntryEvent event) {
if (mapListener instanceof EntryAddedListener) {
((EntryAddedListener) mapListener).entryAdded(event);
}
}
@Override
public void entryEvicted(EntryEvent event) {
if (mapListener instanceof EntryEvictedListener) {
((EntryEvictedListener) mapListener).entryEvicted(event);
}
}
@Override
public void entryRemoved(EntryEvent event) {
if (mapListener instanceof EntryRemovedListener) {
((EntryRemovedListener) mapListener).entryRemoved(event);
}
}
@Override
public void entryUpdated(EntryEvent event) {
if (mapListener instanceof EntryUpdatedListener) {
((EntryUpdatedListener) mapListener).entryUpdated(event);
}
}
@Override
public void mapCleared(MapEvent event) {
if (mapListener instanceof MapClearedListener) {
((MapClearedListener) mapListener).mapCleared(event);
}
}
@Override
public void mapEvicted(MapEvent event) {
if (mapListener instanceof MapEvictedListener) {
((MapEvictedListener) mapListener).mapEvicted(event);
}
}
@Override
public void setHazelcastInstance(HazelcastInstance hazelcastInstance) {
if (mapListener instanceof HazelcastInstanceAware) {
((HazelcastInstanceAware) mapListener).setHazelcastInstance(hazelcastInstance);
}
}
public MapListener getMapListener() {
return mapListener;
}
}
public EntryListenerConfig setImplementation(final EntryListener implementation) {
super.setImplementation(implementation);
return this;
}
@Override
public boolean isLocal() {
return local;
}
public EntryListenerConfig setLocal(boolean local) {
this.local = local;
return this;
}
@Override
public boolean isIncludeValue() {
return includeValue;
}
public EntryListenerConfig setIncludeValue(boolean includeValue) {
this.includeValue = includeValue;
return this;
}
@Override
public String toString() {
return "EntryListenerConfig{local=" + local + ", includeValue=" + includeValue + '}';
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
if (!super.equals(o)) {
return false;
}
EntryListenerConfig that = (EntryListenerConfig) o;
if (includeValue != that.includeValue) {
return false;
}
if (local != that.local) {
return false;
}
return true;
}
@Override
public int hashCode() {
int result = super.hashCode();
result = 31 * result + (local ? 1 : 0);
result = 31 * result + (includeValue ? 1 : 0);
return result;
}
}