| /* |
| * 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.cache; |
| |
| import java.io.Serializable; |
| import javax.cache.Cache; |
| import org.apache.ignite.IgniteCache; |
| import org.apache.ignite.configuration.CacheConfiguration; |
| import org.apache.ignite.lang.IgniteBiTuple; |
| import org.jetbrains.annotations.Nullable; |
| |
| /** |
| * Cache interceptor. Cache interceptor can be used for getting callbacks before |
| * and after cache {@code get(...)}, {@code put(...)}, and {@code remove(...)} |
| * operations. The {@code onBefore} callbacks can also be used to change the values |
| * stored in cache or preventing entries from being removed from cache. |
| * <p> |
| * Cache interceptor is configured via {@link CacheConfiguration#getInterceptor()} |
| * configuration property. |
| * <p> |
| * Any grid resource from {@code org.apache.ignite.resources} package can be injected |
| * into implementation of this interface. |
| */ |
| public interface CacheInterceptor<K, V> extends Serializable { |
| /** |
| * This method is called within {@link IgniteCache#get(Object)} |
| * and similar operations to provide control over returned value. |
| * <p> |
| * If this method returns {@code null}, then {@code get()} operation |
| * results in {@code null} as well. |
| * <p> |
| * This method should not throw any exception. |
| * |
| * @param key Key. |
| * @param val Value mapped to {@code key} at the moment of {@code get()} operation. |
| * @return The new value to be returned as result of {@code get()} operation. |
| * @see Cache#get(Object) |
| */ |
| @Nullable public V onGet(K key, @Nullable V val); |
| |
| /** |
| * This method is called within {@link IgniteCache#put(Object, Object)} |
| * and similar operations before new value is stored in cache. |
| * <p> |
| * Implementations should not execute any complex logic, |
| * including locking, networking or cache operations, |
| * as it may lead to deadlock, since this method is called |
| * from sensitive synchronization blocks. |
| * <p> |
| * This method should not throw any exception. |
| * <p> |
| * <b>IMPORTANT:</b> for this method to take affect, {@code newVal} and |
| * the returned value have to be different instances. I.e., you should |
| * not mutate {@code newVal} directly, but instead create a copy, update |
| * it and then return from the interceptor. |
| * |
| * @param entry Old entry. If {@link CacheConfiguration#isCopyOnRead()} is {@code true}, then is copy. |
| * @param newVal New value. |
| * @return Value to be put to cache. Returning {@code null} cancels the update. |
| * @see IgniteCache#put(Object, Object) |
| */ |
| @Nullable public V onBeforePut(Cache.Entry<K, V> entry, V newVal); |
| |
| /** |
| * This method is called after new value has been stored. |
| * <p> |
| * Implementations should not execute any complex logic, |
| * including locking, networking or cache operations, |
| * as it may lead to deadlock, since this method is called |
| * from sensitive synchronization blocks. |
| * <p> |
| * This method should not throw any exception. |
| * |
| * @param entry Current entry. If {@link CacheConfiguration#isCopyOnRead()} is {@code true} then |
| * entry is a copy. |
| */ |
| public void onAfterPut(Cache.Entry<K, V> entry); |
| |
| /** |
| * This method is called within {@link IgniteCache#remove(Object)} |
| * and similar operations to provide control over returned value. |
| * <p> |
| * Implementations should not execute any complex logic, |
| * including locking, networking or cache operations, |
| * as it may lead to deadlock, since this method is called |
| * from sensitive synchronization blocks. |
| * <p> |
| * This method should not throw any exception. |
| * |
| * @param entry Old entry. If {@link CacheConfiguration#isCopyOnRead()} is {@code true} then |
| * entry is a copy. |
| * @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 IgniteCache#remove(Object) |
| */ |
| @Nullable public IgniteBiTuple<Boolean, V> onBeforeRemove(Cache.Entry<K, V> entry); |
| |
| /** |
| * This method is called after value has been removed. |
| * <p> |
| * Implementations should not execute any complex logic, |
| * including locking, networking or cache operations, |
| * as it may lead to deadlock, since this method is called |
| * from sensitive synchronization blocks. |
| * <p> |
| * This method should not throw any exception. |
| * |
| * @param entry Removed entry. If {@link CacheConfiguration#isCopyOnRead()} is {@code true} then |
| * entry is a copy. |
| */ |
| public void onAfterRemove(Cache.Entry<K, V> entry); |
| } |