You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2015/03/05 09:55:02 UTC

[04/50] [abbrv] incubator-ignite git commit: IGNITE-51 Changed CacheInterceptor API. Added CacheLazyEntry,

IGNITE-51 Changed CacheInterceptor API. Added CacheLazyEntry,


Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/43c04a0f
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/43c04a0f
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/43c04a0f

Branch: refs/heads/ignite-user-req
Commit: 43c04a0f3609871e37d1c9d584db91425c9461c6
Parents: 736158d
Author: nikolay_tikhonov <nt...@gridgain.com>
Authored: Tue Mar 3 19:22:22 2015 +0300
Committer: nikolay_tikhonov <nt...@gridgain.com>
Committed: Tue Mar 3 19:22:22 2015 +0300

----------------------------------------------------------------------
 .../apache/ignite/cache/CacheInterceptor.java   |  22 ++--
 .../ignite/cache/CacheInterceptorAdapter.java   |  12 +-
 .../processors/cache/CacheLazyEntry.java        | 111 +++++++++++++++++++
 .../processors/cache/GridCacheAdapter.java      |   2 +-
 .../processors/cache/GridCacheMapEntry.java     |  54 ++++-----
 .../dht/atomic/GridDhtAtomicCache.java          |  27 +++--
 .../local/atomic/GridLocalAtomicCache.java      |  28 ++---
 .../transactions/IgniteTxLocalAdapter.java      |  14 +--
 .../GridCacheInterceptorAbstractSelfTest.java   | 104 +++++++++--------
 .../cache/GridCacheLifecycleAwareSelfTest.java  |  10 +-
 10 files changed, 248 insertions(+), 136 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/43c04a0f/modules/core/src/main/java/org/apache/ignite/cache/CacheInterceptor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/cache/CacheInterceptor.java b/modules/core/src/main/java/org/apache/ignite/cache/CacheInterceptor.java
index a167215..e10fc38 100644
--- a/modules/core/src/main/java/org/apache/ignite/cache/CacheInterceptor.java
+++ b/modules/core/src/main/java/org/apache/ignite/cache/CacheInterceptor.java
@@ -21,6 +21,8 @@ import org.apache.ignite.internal.processors.cache.*;
 import org.apache.ignite.lang.*;
 import org.jetbrains.annotations.*;
 
+import javax.cache.*;
+
 /**
  * Cache interceptor. Cache interceptor can be used for getting callbacks before
  * and after cache {@code get(...)}, {@code put(...)}, and {@code remove(...)}
@@ -61,13 +63,12 @@ public interface CacheInterceptor<K, V> {
      * <p>
      * This method should not throw any exception.
      *
-     * @param key Key.
-     * @param oldVal Old value.
+     * @param entry Old entry.
      * @param newVal New value.
      * @return Value to be put to cache. Returning {@code null} cancels the update.
      * @see CacheProjection#put(Object, Object, IgnitePredicate[])
      */
-    @Nullable public V onBeforePut(K key, @Nullable V oldVal, V newVal);
+    @Nullable public V onBeforePut(Cache.Entry<K, V> entry, V newVal);
 
     /**
      * This method is called after new value has been stored.
@@ -79,10 +80,9 @@ public interface CacheInterceptor<K, V> {
      * <p>
      * This method should not throw any exception.
      *
-     * @param key Key.
-     * @param val Current value.
+     * @param entry Current entry.
      */
-    public void onAfterPut(K key, V val);
+    public void onAfterPut(Cache.Entry<K, V> entry);
 
     /**
      * This method is called within {@link CacheProjection#remove(Object, IgnitePredicate[])}
@@ -95,14 +95,13 @@ public interface CacheInterceptor<K, V> {
      * <p>
      * This method should not throw any exception.
      *
-     * @param key Key.
-     * @param val Old value.
+     * @param entry Old entry.
      * @return Tuple. The first value is the flag whether remove should be cancelled or not.
      *      The second is the value to be returned as result of {@code remove()} operation,
      *      may be {@code null}.
      * @see CacheProjection#remove(Object, IgnitePredicate[])
      */
-    @Nullable public IgniteBiTuple<Boolean, V> onBeforeRemove(K key, @Nullable V val);
+    @Nullable public IgniteBiTuple<Boolean, V> onBeforeRemove(Cache.Entry<K, V> entry);
 
     /**
      * This method is called after value has been removed.
@@ -114,8 +113,7 @@ public interface CacheInterceptor<K, V> {
      * <p>
      * This method should not throw any exception.
      *
-     * @param key Key.
-     * @param val Removed value.
+     * @param entry Removed entry.
      */
-    public void onAfterRemove(K key, V val);
+    public void onAfterRemove(Cache.Entry<K, V> entry);
 }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/43c04a0f/modules/core/src/main/java/org/apache/ignite/cache/CacheInterceptorAdapter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/cache/CacheInterceptorAdapter.java b/modules/core/src/main/java/org/apache/ignite/cache/CacheInterceptorAdapter.java
index 390e5b1..8139d79 100644
--- a/modules/core/src/main/java/org/apache/ignite/cache/CacheInterceptorAdapter.java
+++ b/modules/core/src/main/java/org/apache/ignite/cache/CacheInterceptorAdapter.java
@@ -20,6 +20,8 @@ package org.apache.ignite.cache;
 import org.apache.ignite.lang.*;
 import org.jetbrains.annotations.*;
 
+import javax.cache.*;
+
 /**
  * Cache interceptor convenience adapter. It provides no-op implementations for all
  * interceptor callbacks.
@@ -31,22 +33,22 @@ public class CacheInterceptorAdapter<K, V> implements CacheInterceptor<K, V> {
     }
 
     /** {@inheritDoc} */
-    @Nullable @Override public V onBeforePut(K key, @Nullable V oldVal, V newVal) {
+    @Nullable @Override public V onBeforePut(Cache.Entry<K, V> entry, V newVal) {
         return newVal;
     }
 
     /** {@inheritDoc} */
-    @Override public void onAfterPut(K key, V val) {
+    @Override public void onAfterPut(Cache.Entry<K, V> entry) {
         // No-op.
     }
 
     /** {@inheritDoc} */
-    @Nullable @Override public IgniteBiTuple<Boolean, V> onBeforeRemove(K key, @Nullable V val) {
-        return new IgniteBiTuple<>(false, val);
+    @Nullable @Override public IgniteBiTuple<Boolean, V> onBeforeRemove(Cache.Entry<K, V> entry) {
+        return new IgniteBiTuple<>(false, entry.getValue());
     }
 
     /** {@inheritDoc} */
-    @Override public void onAfterRemove(K key, V val) {
+    @Override public void onAfterRemove(Cache.Entry<K, V> entry) {
         // No-op.
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/43c04a0f/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheLazyEntry.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheLazyEntry.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheLazyEntry.java
new file mode 100644
index 0000000..7b696ec
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheLazyEntry.java
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.ignite.internal.processors.cache;
+
+import org.apache.ignite.internal.util.typedef.internal.*;
+
+import javax.cache.*;
+
+/**
+ * 
+ */
+public class CacheLazyEntry<K, V> implements Cache.Entry<K, V> {
+    /** Cache context. */
+    private GridCacheContext<K, V> cctx;
+
+    /** Key cache object. */
+    private KeyCacheObject keyObj;
+
+    /** Cache object value. */
+    private CacheObject valObj;
+
+    /** Key. */
+    private K key;
+
+    /** Value. */
+    private V val;
+
+    /**
+     * @param keyObj Key cache object.
+     * @param valObj Cache object value.
+     * @param cctx Cache context.
+     */
+    public CacheLazyEntry(KeyCacheObject keyObj, CacheObject valObj, GridCacheContext<K, V> cctx) {
+        this.keyObj = keyObj;
+        this.valObj = valObj;
+        this.cctx = cctx;
+    }
+
+    /**
+     * @param key Key.
+     * @param val Value.
+     */
+    public CacheLazyEntry(K key, V val) {
+        this.key = key;
+        this.val = val;
+    }
+
+    /**
+     * @param keyObj Key cache object.
+     * @param valObj Cache object value.
+     * @param key Key.
+     * @param val Value.
+     * @param cctx Cache context.
+     */
+    public CacheLazyEntry(KeyCacheObject keyObj,
+        CacheObject valObj,
+        K key,
+        V val, 
+        GridCacheContext<K, V> cctx) {
+        this.keyObj = keyObj;
+        this.valObj = valObj;
+        this.val = val;
+        this.key = key;
+        this.cctx = cctx;
+    }
+
+    /** {@inheritDoc} */
+    @Override public K getKey() {
+        if (key == null)
+            key = CU.value(keyObj, cctx, true);
+
+        return key;
+    }
+
+    /** {@inheritDoc} */
+    @Override public V getValue() {
+        if (val == null)
+            val = CU.value(valObj, cctx, true);
+
+        return val;
+    }
+
+    /** {@inheritDoc} */
+    @SuppressWarnings("unchecked")
+    @Override public <T> T unwrap(Class<T> cls) {
+        if(cls.isAssignableFrom(getClass()))
+            return cls.cast(this);
+
+        throw new IllegalArgumentException("Unwrapping to class is not supported: " + cls);
+    }
+
+    /** {@inheritDoc} */
+    public String toString() {
+        return "CacheEntry [key=" + getKey() + ", val=" + getValue() + ']';
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/43c04a0f/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAdapter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAdapter.java
index cd8052d..8df4207 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAdapter.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAdapter.java
@@ -3320,7 +3320,7 @@ public abstract class GridCacheAdapter<K, V> implements GridCache<K, V>,
                 V retVal = CU.value(ret, ctx, true);
 
                 if (ctx.config().getInterceptor() != null)
-                    return (V)ctx.config().getInterceptor().onBeforeRemove(key, retVal).get2();
+                    return (V)ctx.config().getInterceptor().onBeforeRemove(new CacheEntryImpl(key, retVal)).get2();
 
                 return retVal;
             }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/43c04a0f/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java
index 6dd4cae..0b7b0df 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java
@@ -1002,7 +1002,6 @@ public abstract class GridCacheMapEntry implements GridCacheEntryEx {
 
         boolean intercept = cctx.config().getInterceptor() != null;
 
-        Object key0 = null;
         Object val0 = null;
 
         synchronized (this) {
@@ -1030,11 +1029,9 @@ public abstract class GridCacheMapEntry implements GridCacheEntryEx {
             old = (retval || intercept) ? rawGetOrUnmarshalUnlocked(!retval) : this.val;
 
             if (intercept) {
-                key0 = key.value(cctx, false);
-                val0 = CU.value(val, cctx, false);
+                val0 = CU.value(val, cctx, true);
 
-                Object interceptorVal = cctx.config().getInterceptor().onBeforePut(key0,
-                    CU.value(old, cctx, false),
+                Object interceptorVal = cctx.config().getInterceptor().onBeforePut(new CacheLazyEntry(key, old, cctx),
                     val0);
 
                 if (interceptorVal == null)
@@ -1117,7 +1114,7 @@ public abstract class GridCacheMapEntry implements GridCacheEntryEx {
             cctx.store().putToStore(tx, key, val, newVer);
 
         if (intercept)
-            cctx.config().getInterceptor().onAfterPut(key0, val0);
+            cctx.config().getInterceptor().onAfterPut(new CacheLazyEntry(key, val, cctx));
 
         return valid ? new GridCacheUpdateTxResult(true, retval ? old : null) :
             new GridCacheUpdateTxResult(false, null);
@@ -1157,8 +1154,7 @@ public abstract class GridCacheMapEntry implements GridCacheEntryEx {
 
         IgniteBiTuple<Boolean, Object> interceptRes = null;
 
-        Object key0 = null;
-        Object old0 = null;
+        Cache.Entry entry0 = null;
 
         synchronized (this) {
             checkObsolete();
@@ -1181,10 +1177,9 @@ public abstract class GridCacheMapEntry implements GridCacheEntryEx {
             old = (retval || intercept) ? rawGetOrUnmarshalUnlocked(!retval) : val;
 
             if (intercept) {
-                key0 = key.value(cctx, false);
-                old0 = CU.value(old, cctx, false);
+                entry0 = new CacheLazyEntry(key, old, cctx);
 
-                interceptRes = cctx.config().getInterceptor().onBeforeRemove(key0, old0);
+                interceptRes = cctx.config().getInterceptor().onBeforeRemove(entry0);
 
                 if (cctx.cancelRemove(interceptRes)) {
                     CacheObject ret = cctx.toCacheObject(cctx.unwrapTemporary(interceptRes.get2()));
@@ -1296,7 +1291,7 @@ public abstract class GridCacheMapEntry implements GridCacheEntryEx {
         }
 
         if (intercept)
-            cctx.config().getInterceptor().onAfterRemove(key0, old0);
+            cctx.config().getInterceptor().onAfterRemove(entry0);
 
         if (valid) {
             CacheObject ret;
@@ -1460,12 +1455,11 @@ public abstract class GridCacheMapEntry implements GridCacheEntryEx {
 
             if (intercept) {
                 if (op == GridCacheOperation.UPDATE) {
-                    key0 = value(key0, key, false);
                     updated0 = value(updated0, updated, false);
                     old0 = value(old0, old, false);
 
-                    Object interceptorVal
-                        = cctx.config().getInterceptor().onBeforePut(key0, old0, updated0);
+                    Object interceptorVal = cctx.config().getInterceptor()
+                        .onBeforePut(new CacheLazyEntry(key, old, key0, old0, cctx), updated0);
 
                     if (interceptorVal == null)
                         return new GridTuple3<>(false, cctx.unwrapTemporary(old0), invokeRes);
@@ -1476,10 +1470,8 @@ public abstract class GridCacheMapEntry implements GridCacheEntryEx {
                     }
                 }
                 else {
-                    key0 = value(key0, key, false);
-                    old0 = value(old0, old, false);
-
-                    interceptorRes = cctx.config().getInterceptor().onBeforeRemove(key0, old0);
+                    interceptorRes = cctx.config().getInterceptor()
+                        .onBeforeRemove(new CacheLazyEntry(key, old, key0, old0, cctx));
 
                     if (cctx.cancelRemove(interceptorRes))
                         return new GridTuple3<>(false, cctx.unwrapTemporary(interceptorRes.get2()), invokeRes);
@@ -1590,9 +1582,9 @@ public abstract class GridCacheMapEntry implements GridCacheEntryEx {
 
             if (intercept) {
                 if (op == GridCacheOperation.UPDATE)
-                    cctx.config().getInterceptor().onAfterPut(key0, updated0);
+                    cctx.config().getInterceptor().onAfterPut(new CacheLazyEntry(key, null, key0, updated0, cctx));
                 else
-                    cctx.config().getInterceptor().onAfterRemove(key0, old0);
+                    cctx.config().getInterceptor().onAfterRemove(new CacheLazyEntry(key, old, key0, old0, cctx));
             }
         }
 
@@ -1992,11 +1984,10 @@ public abstract class GridCacheMapEntry implements GridCacheEntryEx {
             // Actual update.
             if (op == GridCacheOperation.UPDATE) {
                 if (intercept) {
-                    key0 = value(key0, key, false);
-                    old0 = value(old0, oldVal, false);
                     updated0 = value(updated0, updated, false);
 
-                    Object interceptorVal = cctx.config().getInterceptor().onBeforePut(key0, old0, updated0);
+                    Object interceptorVal = cctx.config().getInterceptor().onBeforePut(new CacheLazyEntry(key, oldVal,
+                        key0, old0, cctx), updated0);
 
                     if (interceptorVal == null)
                         return new GridCacheUpdateAtomicResult(false,
@@ -2071,10 +2062,8 @@ public abstract class GridCacheMapEntry implements GridCacheEntryEx {
             }
             else {
                 if (intercept) {
-                    key0 = value(key0, key, false);
-                    old0 = value(old0, oldVal, false);
-
-                    interceptRes = cctx.config().getInterceptor().onBeforeRemove(key0, old0);
+                    interceptRes = cctx.config().getInterceptor().onBeforeRemove(new CacheLazyEntry(key, oldVal, key0,
+                        old0, cctx));
 
                     if (cctx.cancelRemove(interceptRes))
                         return new GridCacheUpdateAtomicResult(false,
@@ -2170,12 +2159,9 @@ public abstract class GridCacheMapEntry implements GridCacheEntryEx {
 
             if (intercept) {
                 if (op == GridCacheOperation.UPDATE)
-                    cctx.config().getInterceptor().onAfterPut(key0, updated0);
-                else {
-                    old0 = value(old0, oldVal, false);
-
-                    cctx.config().getInterceptor().onAfterRemove(key0, old0);
-                }
+                    cctx.config().getInterceptor().onAfterPut(new CacheLazyEntry(key, null, key0, updated0, cctx));
+                else
+                    cctx.config().getInterceptor().onAfterRemove(new CacheLazyEntry(key, oldVal, null, old0, cctx));
 
                 if (interceptRes != null)
                     oldVal = cctx.toCacheObject(cctx.unwrapTemporary(interceptRes.get2()));

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/43c04a0f/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java
index e4212de..8d7b390 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java
@@ -1368,7 +1368,7 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
                     if (updated == null) {
                         if (intercept) {
                             IgniteBiTuple<Boolean, ?> interceptorRes = ctx.config().getInterceptor().onBeforeRemove(
-                                keyVal, oldVal);
+                                new CacheEntryImpl(keyVal, oldVal));
 
                             if (ctx.cancelRemove(interceptorRes))
                                 continue;
@@ -1410,7 +1410,8 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
                     }
                     else {
                         if (intercept) {
-                            Object val = ctx.config().getInterceptor().onBeforePut(keyVal, oldVal, updatedVal);
+                            Object val = ctx.config().getInterceptor().onBeforePut(new CacheLazyEntry(keyVal, oldVal),
+                                updatedVal);
 
                             if (val == null)
                                 continue;
@@ -1475,8 +1476,10 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
                             taskName,
                             null);
 
-                        Object val = ctx.config().getInterceptor().onBeforePut(entry.key().value(ctx, false),
-                            CU.value(old, ctx, false),
+                        Object val = ctx.config().getInterceptor().onBeforePut(new CacheLazyEntry(
+                            entry.key(),
+                            old,
+                            ctx),
                             updated.value(ctx, false));
 
                         if (val == null)
@@ -1510,9 +1513,8 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
                             taskName,
                             null);
 
-                        IgniteBiTuple<Boolean, ?> interceptorRes = ctx.config().getInterceptor().onBeforeRemove(
-                            entry.key().value(ctx, false),
-                            CU.value(old, ctx, false));
+                        IgniteBiTuple<Boolean, ?> interceptorRes = ctx.config().getInterceptor()
+                            .onBeforeRemove(new CacheLazyEntry(entry.key(), old, ctx));
 
                         if (ctx.cancelRemove(interceptorRes))
                             continue;
@@ -1980,16 +1982,17 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
 
                     if (intercept) {
                         if (op == UPDATE) {
-                            ctx.config().getInterceptor().onAfterPut(
-                                entry.key().value(ctx, false),
-                                CU.value(updRes.newValue(), ctx, false));
+                            ctx.config().getInterceptor().onAfterPut(new CacheLazyEntry(
+                                entry.key(),
+                                updRes.newValue(),
+                                ctx));
                         }
                         else {
                             assert op == DELETE : op;
 
                             // Old value should be already loaded for 'CacheInterceptor.onBeforeRemove'.
-                            ctx.config().getInterceptor().onAfterRemove(entry.key().value(ctx, false),
-                                CU.value(updRes.oldValue(), ctx, false));
+                            ctx.config().getInterceptor().onAfterRemove(new CacheLazyEntry(entry.key(), 
+                                updRes.oldValue(), ctx));
                         }
                     }
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/43c04a0f/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/atomic/GridLocalAtomicCache.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/atomic/GridLocalAtomicCache.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/atomic/GridLocalAtomicCache.java
index 588d987..d7ad717 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/atomic/GridLocalAtomicCache.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/atomic/GridLocalAtomicCache.java
@@ -1205,8 +1205,8 @@ public class GridLocalAtomicCache<K, V> extends GridCacheAdapter<K, V> {
 
                         if (updated == null) {
                             if (intercept) {
-                                IgniteBiTuple<Boolean, ?> interceptorRes = ctx.config().getInterceptor().onBeforeRemove(
-                                    keyVal, oldVal);
+                                IgniteBiTuple<Boolean, ?> interceptorRes = ctx.config().getInterceptor()
+                                    .onBeforeRemove(new CacheEntryImpl(keyVal, oldVal));
 
                                 if (ctx.cancelRemove(interceptorRes))
                                     continue;
@@ -1237,8 +1237,8 @@ public class GridLocalAtomicCache<K, V> extends GridCacheAdapter<K, V> {
                         }
                         else {
                             if (intercept) {
-                                Object interceptorVal =
-                                    ctx.config().getInterceptor().onBeforePut(keyVal, oldVal, updatedVal);
+                                Object interceptorVal = ctx.config().getInterceptor()
+                                    .onBeforePut(new CacheLazyEntry(keyVal, oldVal), updatedVal);
 
                                 if (interceptorVal == null)
                                     continue;
@@ -1286,10 +1286,8 @@ public class GridLocalAtomicCache<K, V> extends GridCacheAdapter<K, V> {
                                 taskName,
                                 null);
 
-                            Object interceptorVal = ctx.config().getInterceptor().onBeforePut(
-                                entry.key().value(ctx, false),
-                                CU.value(old, ctx, false),
-                                val);
+                            Object interceptorVal = ctx.config().getInterceptor().onBeforePut(new CacheLazyEntry(
+                                entry.key(), old, ctx), val);
 
                             if (interceptorVal == null)
                                 continue;
@@ -1319,9 +1317,8 @@ public class GridLocalAtomicCache<K, V> extends GridCacheAdapter<K, V> {
                                 taskName,
                                 null);
 
-                            IgniteBiTuple<Boolean, ?> interceptorRes = ctx.config().getInterceptor().onBeforeRemove(
-                                entry.key().value(ctx, false),
-                                CU.value(old, ctx, false));
+                            IgniteBiTuple<Boolean, ?> interceptorRes = ctx.config().getInterceptor()
+                                .onBeforeRemove(new CacheLazyEntry(entry.key(), old, ctx));
 
                             if (ctx.cancelRemove(interceptorRes))
                                 continue;
@@ -1468,12 +1465,11 @@ public class GridLocalAtomicCache<K, V> extends GridCacheAdapter<K, V> {
                     taskName);
 
                 if (intercept) {
-                    if (op == UPDATE) {
-                        ctx.config().getInterceptor().onAfterPut(entry.key().value(ctx, false),
-                            writeVal.value(ctx, false));
-                    }
+                    if (op == UPDATE)
+                        ctx.config().getInterceptor().onAfterPut(new CacheLazyEntry(entry.key(), writeVal, ctx));
                     else
-                        ctx.config().getInterceptor().onAfterRemove(entry.key().value(ctx, false), t.get2());
+                        ctx.config().getInterceptor().onAfterRemove(new CacheLazyEntry(entry.key(), null, null,
+                            t.get2(), ctx));
                 }
             }
             catch (GridCacheEntryRemovedException ignore) {

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/43c04a0f/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java
index 699e239..efc3c06 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java
@@ -536,12 +536,10 @@ public abstract class IgniteTxLocalAdapter extends IgniteTxAdapter
                             }
 
                             if (intercept) {
-                                Object oldVal = CU.value(e.cached().rawGetOrUnmarshal(true), cacheCtx, false);
-
-                                Object interceptorVal = cacheCtx.config().getInterceptor().onBeforePut(
-                                    key.value(cacheCtx, false),
-                                    oldVal,
-                                    CU.value(val, cacheCtx, false));
+                                Object interceptorVal = cacheCtx.config().getInterceptor()
+                                    .onBeforePut(new CacheLazyEntry(
+                                        key, e.cached().rawGetOrUnmarshal(true), cacheCtx),
+                                        CU.value(val, cacheCtx, false));
 
                                 if (interceptorVal == null)
                                     continue;
@@ -582,7 +580,9 @@ public abstract class IgniteTxLocalAdapter extends IgniteTxAdapter
                                 Object oldVal = CU.value(e.cached().rawGetOrUnmarshal(true), cacheCtx, false);
 
                                 IgniteBiTuple<Boolean, Object> t = cacheCtx.config().getInterceptor()
-                                    .onBeforeRemove(key.value(cacheCtx, false), oldVal);
+                                    .onBeforeRemove(new CacheLazyEntry(key,
+                                        e.cached().rawGetOrUnmarshal(true),
+                                        cacheCtx));
 
                                 if (cacheCtx.cancelRemove(t))
                                     continue;

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/43c04a0f/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheInterceptorAbstractSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheInterceptorAbstractSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheInterceptorAbstractSelfTest.java
index c20279d..0b8ee4a 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheInterceptorAbstractSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheInterceptorAbstractSelfTest.java
@@ -23,10 +23,14 @@ import org.apache.ignite.cache.affinity.*;
 import org.apache.ignite.configuration.*;
 import org.apache.ignite.internal.util.typedef.*;
 import org.apache.ignite.lang.*;
+import org.apache.ignite.spi.discovery.tcp.*;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.*;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.*;
 import org.apache.ignite.transactions.*;
 import org.jdk8.backport.*;
 import org.jetbrains.annotations.*;
 
+import javax.cache.*;
 import javax.cache.processor.*;
 import java.util.*;
 import java.util.concurrent.atomic.*;
@@ -40,6 +44,9 @@ import static org.apache.ignite.cache.CacheMode.*;
  */
 public abstract class GridCacheInterceptorAbstractSelfTest extends GridCacheAbstractSelfTest {
     /** */
+    private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
+    
+    /** */
     private static Interceptor interceptor;
 
     /** {@inheritDoc} */
@@ -73,6 +80,12 @@ public abstract class GridCacheInterceptorAbstractSelfTest extends GridCacheAbst
     @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception {
         IgniteConfiguration c = super.getConfiguration(gridName);
 
+        TcpDiscoverySpi spi = new TcpDiscoverySpi();
+        
+        spi.setIpFinder(IP_FINDER);
+        
+        c.setDiscoverySpi(spi);
+
         c.getTransactionConfiguration().setTxSerializableEnabled(true);
 
         return c;
@@ -423,7 +436,7 @@ public abstract class GridCacheInterceptorAbstractSelfTest extends GridCacheAbst
     private void testCancelUpdate(String key, Operation op) throws Exception {
         // Interceptor returns null to disabled update.
         CacheInterceptor retInterceptor = new InterceptorAdapter() {
-            @Nullable @Override public Object onBeforePut(Object key, @Nullable Object oldVal, Object newVal) {
+            @Nullable @Override public Object onBeforePut(Cache.Entry entry, Object newVal) {
                 return null;
             }
         };
@@ -505,7 +518,7 @@ public abstract class GridCacheInterceptorAbstractSelfTest extends GridCacheAbst
     private void testModifyUpdate(String key, Operation op) throws Exception {
         // Interceptor returns incremented new value.
         CacheInterceptor retInterceptor = new InterceptorAdapter() {
-            @Nullable @Override public Object onBeforePut(Object key, @Nullable Object oldVal, Object newVal) {
+            @Nullable @Override public Object onBeforePut(Cache.Entry entry, Object newVal) {
                 return (Integer)newVal + 1;
             }
         };
@@ -585,7 +598,7 @@ public abstract class GridCacheInterceptorAbstractSelfTest extends GridCacheAbst
     private void testCancelRemove(String key, Operation op) throws Exception {
         // Interceptor disables remove and returns null.
         interceptor.retInterceptor = new InterceptorAdapter() {
-            @Nullable @Override public IgniteBiTuple onBeforeRemove(Object key, @Nullable Object val) {
+            @Nullable @Override public IgniteBiTuple onBeforeRemove(Cache.Entry entry) {
                 return new IgniteBiTuple(true, null);
             }
         };
@@ -610,7 +623,7 @@ public abstract class GridCacheInterceptorAbstractSelfTest extends GridCacheAbst
 
         // Interceptor disables remove and changes return value.
         interceptor.retInterceptor = new InterceptorAdapter() {
-            @Nullable @Override public IgniteBiTuple onBeforeRemove(Object key, @Nullable Object val) {
+            @Nullable @Override public IgniteBiTuple onBeforeRemove(Cache.Entry entry) {
                 return new IgniteBiTuple(true, 900);
             }
         };
@@ -647,7 +660,7 @@ public abstract class GridCacheInterceptorAbstractSelfTest extends GridCacheAbst
 
         // Interceptor disables remove and returns null.
         interceptor.retInterceptor = new InterceptorAdapter() {
-            @Nullable @Override public IgniteBiTuple onBeforeRemove(Object key, @Nullable Object val) {
+            @Nullable @Override public IgniteBiTuple onBeforeRemove(Cache.Entry entry) {
                 return new IgniteBiTuple(true, null);
             }
         };
@@ -668,7 +681,7 @@ public abstract class GridCacheInterceptorAbstractSelfTest extends GridCacheAbst
 
         // Interceptor disables remove and changes return value.
         interceptor.retInterceptor = new InterceptorAdapter() {
-            @Nullable @Override public IgniteBiTuple onBeforeRemove(Object key, @Nullable Object val) {
+            @Nullable @Override public IgniteBiTuple onBeforeRemove(Cache.Entry entry) {
                 return new IgniteBiTuple(true, 1000);
             }
         };
@@ -712,7 +725,7 @@ public abstract class GridCacheInterceptorAbstractSelfTest extends GridCacheAbst
     private void testRemove(String key, Operation op) throws Exception {
         // Interceptor changes return value to null.
         interceptor.retInterceptor = new InterceptorAdapter() {
-            @Nullable @Override public IgniteBiTuple onBeforeRemove(Object key, @Nullable Object val) {
+            @Nullable @Override public IgniteBiTuple onBeforeRemove(Cache.Entry entry) {
                 return new IgniteBiTuple(false, null);
             }
         };
@@ -737,7 +750,7 @@ public abstract class GridCacheInterceptorAbstractSelfTest extends GridCacheAbst
 
         // Interceptor changes return value.
         interceptor.retInterceptor = new InterceptorAdapter() {
-            @Nullable @Override public IgniteBiTuple onBeforeRemove(Object key, @Nullable Object val) {
+            @Nullable @Override public IgniteBiTuple onBeforeRemove(Cache.Entry entry) {
                 return new IgniteBiTuple(false, 900);
             }
         };
@@ -774,7 +787,7 @@ public abstract class GridCacheInterceptorAbstractSelfTest extends GridCacheAbst
 
         // Interceptor changes return value to null.
         interceptor.retInterceptor = new InterceptorAdapter() {
-            @Nullable @Override public IgniteBiTuple onBeforeRemove(Object key, @Nullable Object val) {
+            @Nullable @Override public IgniteBiTuple onBeforeRemove(Cache.Entry entry) {
                 return new IgniteBiTuple(false, null);
             }
         };
@@ -813,7 +826,7 @@ public abstract class GridCacheInterceptorAbstractSelfTest extends GridCacheAbst
 
         // Interceptor changes return value.
         interceptor.retInterceptor = new InterceptorAdapter() {
-            @Nullable @Override public IgniteBiTuple onBeforeRemove(Object key, @Nullable Object val) {
+            @Nullable @Override public IgniteBiTuple onBeforeRemove(Cache.Entry entry) {
                 return new IgniteBiTuple(false, 1000);
             }
         };
@@ -867,7 +880,7 @@ public abstract class GridCacheInterceptorAbstractSelfTest extends GridCacheAbst
         @Nullable TransactionIsolation txIsolation, @Nullable Operation op) throws Exception {
         // Interceptor returns incremented new value.
         interceptor.retInterceptor = new InterceptorAdapter() {
-            @Nullable @Override public Object onBeforePut(Object key, @Nullable Object oldVal, Object newVal) {
+            @Nullable @Override public Object onBeforePut(Cache.Entry entry, Object newVal) {
                 return (Integer)newVal + 1;
             }
         };
@@ -924,7 +937,7 @@ public abstract class GridCacheInterceptorAbstractSelfTest extends GridCacheAbst
     private void testBatchUpdate(Operation op) throws Exception {
         // Interceptor returns incremented new value.
         interceptor.retInterceptor = new InterceptorAdapter() {
-            @Nullable @Override public Object onBeforePut(Object key, @Nullable Object oldVal, Object newVal) {
+            @Nullable @Override public Object onBeforePut(Cache.Entry entry, Object newVal) {
                 return (Integer)newVal + 1;
             }
         };
@@ -975,8 +988,8 @@ public abstract class GridCacheInterceptorAbstractSelfTest extends GridCacheAbst
 
         // Interceptor returns incremented new value, cancels update for one key.
         interceptor.retInterceptor = new InterceptorAdapter() {
-            @Nullable @Override public Object onBeforePut(Object key, @Nullable Object oldVal, Object newVal) {
-                if (key.equals(key1))
+            @Nullable @Override public Object onBeforePut(Cache.Entry entry, Object newVal) {
+                if (entry.getKey().equals(key1))
                     return null;
 
                 return (Integer)newVal + 1;
@@ -1048,7 +1061,7 @@ public abstract class GridCacheInterceptorAbstractSelfTest extends GridCacheAbst
 
         // Interceptor does not cancel update.
         interceptor.retInterceptor = new InterceptorAdapter() {
-            @Nullable @Override public IgniteBiTuple onBeforeRemove(Object key, @Nullable Object val) {
+            @Nullable @Override public IgniteBiTuple onBeforeRemove(Cache.Entry entry) {
                 return new IgniteBiTuple(false, 999);
             }
         };
@@ -1078,7 +1091,7 @@ public abstract class GridCacheInterceptorAbstractSelfTest extends GridCacheAbst
 
         // Interceptor does not cancel update.
         interceptor.retInterceptor = new InterceptorAdapter() {
-            @Nullable @Override public IgniteBiTuple onBeforeRemove(Object key, @Nullable Object val) {
+            @Nullable @Override public IgniteBiTuple onBeforeRemove(Cache.Entry entry) {
                 return new IgniteBiTuple(false, 999);
             }
         };
@@ -1115,8 +1128,8 @@ public abstract class GridCacheInterceptorAbstractSelfTest extends GridCacheAbst
 
         // Interceptor cancels update for one key.
         interceptor.retInterceptor = new InterceptorAdapter() {
-            @Nullable@Override public IgniteBiTuple onBeforeRemove(Object key, @Nullable Object val) {
-                return new IgniteBiTuple(key.equals(key1), 999);
+            @Nullable @Override public IgniteBiTuple onBeforeRemove(Cache.Entry entry) {
+                return new IgniteBiTuple(entry.getKey().equals(key1), 999);
             }
         };
 
@@ -1493,26 +1506,26 @@ public abstract class GridCacheInterceptorAbstractSelfTest extends GridCacheAbst
         }
 
         /** */
-        @Nullable @Override public Object onBeforePut(Object key, @Nullable Object oldVal, Object newVal) {
+        @Nullable @Override public Object onBeforePut(Cache.Entry entry, Object newVal) {
             fail("onBeforePut not expected");
 
             return null;
         }
 
         /** */
-        @Override public void onAfterPut(Object key, Object val) {
+        @Override public void onAfterPut(Cache.Entry entry) {
             fail("onAfterPut not expected");
         }
 
         /** */
-        @Nullable @Override public IgniteBiTuple onBeforeRemove(Object key, @Nullable Object val) {
+        @Nullable @Override public IgniteBiTuple onBeforeRemove(Cache.Entry entry) {
             fail("onBeforeRemove not expected");
 
             return null;
         }
 
         /** */
-        @Override public void onAfterRemove(Object key, Object val) {
+        @Override public void onAfterRemove(Cache.Entry entry) {
             fail("onAfterRemove not expected");
         }
     }
@@ -1570,81 +1583,84 @@ public abstract class GridCacheInterceptorAbstractSelfTest extends GridCacheAbst
 
         /** {@inheritDoc} */
         @SuppressWarnings("unchecked")
-        @Nullable @Override public Object onBeforePut(Object key, @Nullable Object oldVal, Object newVal) {
+        @Nullable @Override public Object onBeforePut(Cache.Entry entry, Object newVal) {
             if (disabled)
                 return newVal;
 
             assertNotNull(retInterceptor);
 
-            Object ret = retInterceptor.onBeforePut(key, oldVal, newVal);
+            Object ret = retInterceptor.onBeforePut(entry, newVal);
 
-            log.info("Before put [key=" + key + ", oldVal=" + oldVal + ", newVal=" + newVal + ", ret=" + ret + ']');
+            log.info("Before put [key=" + entry.getKey() + ", oldVal=" + entry.getValue()+ ", newVal=" + newVal 
+                + ", ret=" + ret + ']');
 
             invokeCnt.incrementAndGet();
 
-            IgniteBiTuple t = beforePutMap.put(key, new IgniteBiTuple(oldVal, newVal));
+            IgniteBiTuple t = beforePutMap.put(entry.getKey(), new IgniteBiTuple(entry.getValue(), newVal));
 
             if (t != null) {
-                assertEquals("Interceptor called with different old values for key " + key, t.get1(), oldVal);
-                assertEquals("Interceptor called with different new values for key " + key, t.get2(), newVal);
+                assertEquals("Interceptor called with different old values for key " + entry.getKey(), t.get1(), 
+                    entry.getValue());
+                assertEquals("Interceptor called with different new values for key " + entry.getKey(), t.get2(), 
+                    newVal);
             }
 
             return ret;
         }
 
         /** {@inheritDoc} */
-        @Override public void onAfterPut(Object key, Object val) {
+        @Override public void onAfterPut(Cache.Entry entry) {
             if (disabled)
                 return;
 
-            log.info("After put [key=" + key + ", val=" + val + ']');
+            log.info("After put [key=" + entry.getKey() + ", val=" + entry.getValue() + ']');
 
             invokeCnt.incrementAndGet();
 
-            Object old = afterPutMap.put(key, val);
+            Object old = afterPutMap.put(entry.getKey(), entry.getValue());
 
             if (old != null)
-                assertEquals(old, val);
+                assertEquals(old, entry.getValue());
         }
 
         /** {@inheritDoc} */
         @SuppressWarnings("unchecked")
-        @Override @Nullable public IgniteBiTuple onBeforeRemove(Object key, @Nullable Object val) {
+        @Override @Nullable public IgniteBiTuple onBeforeRemove(Cache.Entry entry) {
             if (disabled)
-                return new IgniteBiTuple(false, val);
+                return new IgniteBiTuple(false, entry.getValue());
 
             assertNotNull(retInterceptor);
 
-            IgniteBiTuple ret = retInterceptor.onBeforeRemove(key, val);
+            IgniteBiTuple ret = retInterceptor.onBeforeRemove(entry);
 
-            log.info("Before remove [key=" + key + ", val=" + val + ", ret=" + ret + ']');
+            log.info("Before remove [key=" + entry.getKey() + ", val=" + entry.getValue() + ", ret=" + ret + ']');
 
             invokeCnt.incrementAndGet();
 
-            if (val != null) {
-                Object old = beforeRmvMap.put(key, val);
+            if (entry.getValue() != null) {
+                Object old = beforeRmvMap.put(entry.getKey(), entry.getValue());
 
                 if (old != null)
-                    assertEquals(old, val);
+                    assertEquals(old, entry.getValue());
             }
 
             return ret;
         }
 
         /** {@inheritDoc} */
-        @Override public void onAfterRemove(Object key, Object val) {
+        @Override public void onAfterRemove(Cache.Entry entry) {
             if (disabled)
                 return;
 
-            log.info("After remove [key=" + key + ", val=" + val + ']');
+            log.info("After remove [key=" + entry.getKey() + ", val=" + entry.getValue() + ']');
 
             invokeCnt.incrementAndGet();
 
-            if (val != null) {
-                Object old = afterRmvMap.put(key, val);
+            if (entry.getValue() != null) {
+                Object old = afterRmvMap.put(entry.getKey(), entry.getValue());
 
                 if (old != null)
-                    assertEquals(old, val);
+                    assertEquals(old, entry.getValue());
             }
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/43c04a0f/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheLifecycleAwareSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheLifecycleAwareSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheLifecycleAwareSelfTest.java
index 9f4b8f2..67ad896 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheLifecycleAwareSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheLifecycleAwareSelfTest.java
@@ -225,22 +225,22 @@ public class GridCacheLifecycleAwareSelfTest extends GridAbstractLifecycleAwareS
         }
 
         /** {@inheritDoc} */
-        @Nullable @Override public Object onBeforePut(Object key, @Nullable Object oldVal, Object newVal) {
+        @Nullable @Override public Object onBeforePut(Cache.Entry entry, Object newVal) {
             return newVal;
         }
 
         /** {@inheritDoc} */
-        @Override public void onAfterPut(Object key, Object val) {
+        @Override public void onAfterPut(Cache.Entry entry) {
             // No-op.
         }
 
         /** {@inheritDoc} */
-        @SuppressWarnings("unchecked") @Nullable @Override public IgniteBiTuple onBeforeRemove(Object key, @Nullable Object val) {
-            return new IgniteBiTuple(false, val);
+        @SuppressWarnings("unchecked") @Nullable @Override public IgniteBiTuple onBeforeRemove(Cache.Entry entry) {
+            return new IgniteBiTuple(false, entry.getValue());
         }
 
         /** {@inheritDoc} */
-        @Override public void onAfterRemove(Object key, Object val) {
+        @Override public void onAfterRemove(Cache.Entry entry) {
             // No-op.
         }
     }