/*
*
* * Copyright 2014 Orient Technologies LTD (info(at)orientechnologies.com)
* *
* * 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.
* *
* * For more information: http://www.orientechnologies.com
*
*/
package com.orientechnologies.orient.server.hazelcast;
import com.hazelcast.core.*;
import com.hazelcast.map.listener.EntryAddedListener;
import com.hazelcast.map.listener.EntryRemovedListener;
import com.hazelcast.map.listener.EntryUpdatedListener;
import com.hazelcast.map.listener.MapClearedListener;
import com.orientechnologies.orient.server.distributed.ODistributedServerLog;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
/**
* Optimized concurrent hash map implementation on top of Hazelcast distributed map.
*
* @author Luca Garulli (l.garulli--at--orientechnologies.com)
*/
public class OHazelcastDistributedMap extends ConcurrentHashMap<String, Object>
implements EntryAddedListener<String, Object>, EntryRemovedListener<String, Object>, MapClearedListener,
EntryUpdatedListener<String, Object> {
private final OHazelcastPlugin dManager;
private final IMap<String, Object> hzMap;
private final String membershipListenerRegistration;
public static final String ORIENTDB_MAP = "orientdb";
public OHazelcastDistributedMap(final OHazelcastPlugin manager, final HazelcastInstance hz) {
dManager = manager;
hzMap = hz.getMap(ORIENTDB_MAP);
membershipListenerRegistration = hzMap.addEntryListener(this, true);
super.putAll(hzMap);
}
public IMap<String, Object> getHazelcastMap() {
return hzMap;
}
@Override
public Object get(final Object key) {
return hzMap.get(key);
}
@Override
public boolean containsKey(final Object key) {
return hzMap.containsKey(key);
}
@Override
public Set<Entry<String, Object>> entrySet() {
return hzMap.entrySet();
}
public Set<Entry<String, Object>> localEntrySet() {
return super.entrySet();
}
public Object getLocalCachedValue(final Object key) {
final Object res = super.get(key);
if (res != null)
return res;
try {
return hzMap.get(key);
} catch (HazelcastInstanceNotActiveException e) {
// IGNORE IT
return null;
}
}
@Override
public Object put(final String key, final Object value) {
try {
hzMap.put(key, value);
} catch (HazelcastInstanceNotActiveException e) {
// IGNORE IT
}
return super.put(key, value);
}
@Override
public Object putIfAbsent(final String key, final Object value) {
try {
hzMap.putIfAbsent(key, value);
} catch (HazelcastInstanceNotActiveException e) {
// IGNORE IT
}
return super.putIfAbsent(key, value);
}
public Object putInLocalCache(final String key, final Object value) {
return super.put(key, value);
}
@Override
public Object remove(final Object key) {
try {
hzMap.remove(key);
} catch (HazelcastInstanceNotActiveException e) {
// IGNORE IT
}
return super.remove(key);
}
@Override
public boolean remove(final Object key, final Object value) {
try {
hzMap.remove(key, value);
} catch (HazelcastInstanceNotActiveException e) {
// IGNORE IT
}
return super.remove(key, value);
}
@Override
public void entryAdded(final EntryEvent<String, Object> event) {
if (ODistributedServerLog.isDebugEnabled())
ODistributedServerLog.debug(this, dManager.getLocalNodeName(), null, ODistributedServerLog.DIRECTION.NONE,
"Map entry added key=" + event.getKey() + ": " + event.getValue());
super.put(event.getKey(), event.getValue());
}
@Override
public void entryUpdated(final EntryEvent<String, Object> event) {
if (ODistributedServerLog.isDebugEnabled())
ODistributedServerLog.debug(this, dManager.getLocalNodeName(), null, ODistributedServerLog.DIRECTION.NONE,
"Map entry updated key=" + event.getKey() + ": " + event.getValue() + " from " + dManager.getNodeName(event.getMember()));
super.put(event.getKey(), event.getValue());
}
@Override
public void entryRemoved(final EntryEvent<String, Object> event) {
if (ODistributedServerLog.isDebugEnabled())
ODistributedServerLog.debug(this, dManager.getLocalNodeName(), null, ODistributedServerLog.DIRECTION.NONE,
"Map entry removed key=" + event.getKey() + ": " + event.getValue() + " from " + dManager.getNodeName(event.getMember()));
super.remove(event.getKey());
}
@Override
public void mapCleared(MapEvent event) {
if (ODistributedServerLog.isDebugEnabled())
ODistributedServerLog.debug(this, dManager.getLocalNodeName(), null, ODistributedServerLog.DIRECTION.NONE,
"Map cleared from " + dManager.getNodeName(event.getMember()));
super.clear();
}
public void destroy() {
clear();
hzMap.removeEntryListener(membershipListenerRegistration);
}
public void clearLocalCache() {
super.clear();
}
}