/* * Copyright (c) 2008-2012, Hazel Bilisim Ltd. 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.hibernate; import com.hazelcast.core.MapEntry; import com.hazelcast.impl.base.DataRecordEntry; import com.hazelcast.merge.MergePolicy; import org.hibernate.cache.entry.CacheEntry; public class VersionAwareMergePolicy implements MergePolicy { public static final String NAME = "hz.HIBERNATE_VERSION_AWARE"; @SuppressWarnings({"rawtypes", "unchecked"}) public Object merge(String mapName, MapEntry mergingEntry, MapEntry existingEntry) { DataRecordEntry mergingDataEntry = (DataRecordEntry) mergingEntry; if (!mergingDataEntry.isValid()) { return REMOVE_EXISTING; } else { final Object existingObject = existingEntry != null ? existingEntry.getValue() : null; final Object mergingObject = mergingEntry.getValue(); if (existingObject != null && existingObject instanceof CacheEntry && mergingObject != null && mergingObject instanceof CacheEntry) { final CacheEntry existing = (CacheEntry) existingObject; final CacheEntry merging = (CacheEntry) mergingObject; final Object mergingVersionObject = merging.getVersion(); final Object existingVersionObject = existing.getVersion(); if (mergingVersionObject != null && existingVersionObject != null && mergingVersionObject instanceof Comparable && existingVersionObject instanceof Comparable) { final Comparable mergingVersion = (Comparable) mergingVersionObject; final Comparable existingVersion = (Comparable) existingVersionObject; if (mergingVersion.compareTo(existingVersion) > 0) { return mergingDataEntry.getValueData(); } else { return ((DataRecordEntry) existingEntry).getValueData(); } } } return mergingDataEntry.getValueData(); } } }