blob: ffb3c2b668c84404b61ff3b371fc8e44ca2740c9 [file] [log] [blame]
/*
* 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);
}