/*
* JBoss, Home of Professional Open Source.
* Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.cache;
import org.jboss.cache.annotations.Compat;
import org.jboss.cache.config.Configuration;
import org.jboss.cache.config.EvictionPolicyConfig;
import org.jboss.cache.config.EvictionRegionConfig;
import org.jboss.cache.eviction.EvictedEventNode;
import org.jboss.cache.eviction.EvictionEvent;
import org.jboss.cache.eviction.EvictionPolicy;
/**
* Defines characteristics such as class loading and eviction of {@link org.jboss.cache.Node}s belonging to a Region in a {@link Cache}.
* A Region is described by an {@link #getFqn() Fqn} relative to the root of the cache.
* All nodes and child nodes of this Fqn belong to this region.
*
* If a region is to be recognised as an eviction region (region of type {@link Type#EVICTION} then
* it must have an {@link org.jboss.cache.config.EvictionRegionConfig} set using {@link #setEvictionRegionConfig(org.jboss.cache.config.EvictionRegionConfig)}.
*
* Similarly, to be recognised as a marshalling region (region of type {@link Type#MARSHALLING} then it must have a
* {@link ClassLoader} registered using {@link #registerContextClassLoader(ClassLoader)}.
*
* Note that a single region can be both an eviction and marshalling region at the same time.
*
*
* @author Manik Surtani (manik AT jboss DOT org)
* @see RegionManager
* @since 2.0.0
*/
@Compat(notes = "Cloneable is extended for backward compat.")
public interface Region extends Comparable, Cloneable
{
/**
* Types of regions.
*/
static enum Type
{
EVICTION, MARSHALLING, ANY
}
/**
* Region status
*/
static enum Status
{
ACTIVATING, ACTIVE, INACTIVATING, INACTIVE
}
/**
* Registers a specific {@link ClassLoader} for this region,
* overridding the default cache class loader.
*
* @param classLoader specific class loader
*/
void registerContextClassLoader(ClassLoader classLoader);
/**
* @return the cache-wide configuration
* @since 2.1.0
*/
Configuration getCacheConfiguration();
/**
* Unregisters a registered {@link ClassLoader}s for this region.
*/
void unregisterContextClassLoader();
/**
* Activates this region for replication.
* By default, the entire cache is activated for replication at start-up.
*
* @throws RegionNotEmptyException if the {@link Fqn} that represents this region already exists and contains data or children.
*/
void activate() throws RegionNotEmptyException;
/**
* Activates this region for replication, but if the {@link Fqn} that represents this region already exists and
* either contains data or children, no state transfers take place. The region is simply marked as active in this
* case.
*/
void activateIfEmpty();
/**
* Deactivates this region from being replicated.
*/
void deactivate();
/**
* Sets this region as active - this only marks a flag
* and does not actually activates or
* deactivates this region. Use {@link #activate()}
* and {@link #deactivate()} for the full process.
*
* @param b
*/
void setActive(boolean b);
/**
* Returns true if this region has been activated.
*
* @return true if this region has been activated.
*/
boolean isActive();
/**
* Returns the configured {@link ClassLoader} for this region.
*
* @return a ClassLoader
*/
ClassLoader getClassLoader();
/**
* Processes the eviction queues (primary and recycle queues) associated with this region. A no-op if this is not an eviction region.
*
* @since 3.0
*/
void processEvictionQueues();
/**
* Clears the node event queue used for processing eviction.
*/
void resetEvictionQueues();
/**
* Configures this region for eviction.
*
* @param evictionRegionConfig configuration to set
*/
void setEvictionRegionConfig(EvictionRegionConfig evictionRegionConfig);
/**
* @return the eviction region config, if any, set on the current region.
*/
EvictionRegionConfig getEvictionRegionConfig();
/**
* Registers an eviction event on the region's eviction event queue for later processing by
* {@link #processEvictionQueues()}.
*
* @param fqn passed in to the constructor of {@link org.jboss.cache.eviction.EvictionEvent}
* @param eventType passed in to the constructor of {@link org.jboss.cache.eviction.EvictionEvent}
* @param elementDifference passed in to the constructor of {@link org.jboss.cache.eviction.EvictionEvent}
* @return an EvictedEventNode that has been created for this queue
*/
EvictionEvent registerEvictionEvent(Fqn fqn, EvictionEvent.Type eventType, int elementDifference);
/**
* An overloaded version of {@link #registerEvictionEvent(Fqn, org.jboss.cache.eviction.EvictionEvent.Type, int)} which
* uses a default elementDifference value.
*
* @param fqn passed in to the constructor of {@link org.jboss.cache.eviction.EvictionEvent}
* @param eventType passed in to the constructor of {@link org.jboss.cache.eviction.EvictionEvent}
* @return an EvictedEventNode that has been created for this queue
*/
EvictionEvent registerEvictionEvent(Fqn fqn, EvictionEvent.Type eventType);
/**
* Marks a {@link org.jboss.cache.Node} as currently in use, by adding an event to the eviction queue.
* If there is an {@link org.jboss.cache.config.EvictionRegionConfig} associated with this region, and
* it respects this event (e.g., {@link org.jboss.cache.eviction.LRUAlgorithm} does), then the {@link org.jboss.cache.Node} will not
* be evicted until {@link #unmarkNodeCurrentlyInUse(Fqn)} is invoked.
*
* This mechanism can be used to prevent eviction of data that the application
* is currently using, in the absence of any locks on the {@link org.jboss.cache.Node} where the
* data is stored.
*
* @param fqn Fqn of the node.
* @see #unmarkNodeCurrentlyInUse(Fqn)
*/
void markNodeCurrentlyInUse(Fqn fqn, long timeout);
/**
* Adds an event to the eviction queue indicating that a node is no longer in use.
*
* @param fqn Fqn of the node.
* @see #markNodeCurrentlyInUse(Fqn,long)
*/
void unmarkNodeCurrentlyInUse(Fqn fqn);
/**
* Returns the {@link org.jboss.cache.Fqn} of this region.
*
* @return the Fqn
*/
Fqn getFqn();
/**
* A mechanism to set status of a region, more fine grained control than just setActive();
*
* @param status status of the region
* @since 2.1.0
*/
void setStatus(Status status);
/**
* @return the region's status
*/
Status getStatus();
/**
* copies the region - including eviction queue events - to a new Region instance, attached to a new Fqn root.
* Typically used with Buddy Replication where region roots need to be adjusted.
*
* @param newRoot new root for the region - e.g., a buddy backup root.
* @return a new Region instance.
*/
Region copy(Fqn newRoot);
// -------- deprecated interfaces retained for compatibility with 2.x. -----------
/**
* Configures an eviction policy for this region.
*
* Note: This is deprecated since this is an internal method and never was
* meant to be a part of the public API. Please do not treat this as public API, it may be removed in a future release
* and its functionality is not guaranteed.
*
*
* @param evictionPolicyConfig configuration to set
* @deprecated
*/
@Deprecated
@Compat
void setEvictionPolicy(EvictionPolicyConfig evictionPolicyConfig);
/**
* Returns an eviction policy configuration.
*
* Note: This is deprecated since this is an internal method and never was
* meant to be a part of the public API. Please do not treat this as public API, it may be removed in a future release
* and its functionality is not guaranteed.
*
*
* @return an eviction policy configuration
* @deprecated
*/
@Deprecated
@Compat
EvictionPolicyConfig getEvictionPolicyConfig();
/**
* Returns an eviction policy.
*
* Note: This is deprecated since this is an internal method and never was
* meant to be a part of the public API. Please do not treat this as public API, it may be removed in a future release
* and its functionality is not guaranteed.
*
*
* @return an eviction policy
* @deprecated
*/
@Deprecated
@Compat
EvictionPolicy getEvictionPolicy();
/**
* Returns the size of the node event queue, used by the eviction thread.
*
* Note: This is deprecated since this is an internal method and never was
* meant to be a part of the public API. Please do not treat this as public API, it may be removed in a future release
* and its functionality is not guaranteed.
*
*
* @return number of events
* @deprecated
*/
@Deprecated
@Compat
int nodeEventQueueSize();
/**
* Returns the most recent {@link org.jboss.cache.eviction.EvictedEventNode} added to the event queue by
* {@link #putNodeEvent(org.jboss.cache.eviction.EvictedEventNode)}.
*
* Note: This is deprecated since this is an internal method and never was
* meant to be a part of the public API. Please do not treat this as public API, it may be removed in a future release
* and its functionality is not guaranteed.
*
*
* @return the last {@link org.jboss.cache.eviction.EvictedEventNode}, or null if no more events exist
* @deprecated
*/
@Compat
@Deprecated
EvictedEventNode takeLastEventNode();
/**
* Adds an {@link org.jboss.cache.eviction.EvictedEventNode} to the internal queue for processing
* by the eviction thread.
*
* Note: This is deprecated since this is an internal method and never was
* meant to be a part of the public API. Please do not treat this as public API, it may be removed in a future release
* and its functionality is not guaranteed.
*
*
* @param event event to add
* @deprecated
*/
@Deprecated
@Compat
void putNodeEvent(EvictedEventNode event);
/**
* @return a clone
* @deprecated
*/
@Deprecated
@Compat
Region clone() throws CloneNotSupportedException;
}