blob: ad5fab673ec424ade33303ca87726391a19860e0 [file] [log] [blame]
/* $Id: BaseDescription.java 988245 2010-08-23 18:39:35Z kwright $ */
/**
* 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.manifoldcf.core.cachemanager;
import org.apache.manifoldcf.core.interfaces.*;
import java.util.*;
/** This is the base class for cache object descriptions.
* The base class sets up LRU behavior based on parameters
* in a configuration file, and also bases expiration on the
* same class picture.
*/
public abstract class BaseDescription implements ICacheDescription
{
public static final String _rcsid = "@(#)$Id: BaseDescription.java 988245 2010-08-23 18:39:35Z kwright $";
protected ICacheClass cacheClass = null;
protected final static int MAX_VALUE = Integer.MAX_VALUE;
public BaseDescription(String objectClassName)
{
if (objectClassName != null)
cacheClass = new LocalCacheClass(objectClassName);
}
public BaseDescription(String objectClassName, IThreadContext threadContext)
throws ManifoldCFException
{
if (objectClassName != null) {
cacheClass = new LocalCacheClass(objectClassName, threadContext);
}
}
public BaseDescription(String objectClassName, int maxLRUCount)
{
if (objectClassName != null)
cacheClass = new LocalCacheClass(objectClassName, maxLRUCount);
}
/** Get the object class for an object. The object class is used to determine
* the group of objects treated in the same LRU manner.
* @return the newly created object's object class, or null if there is no
* such class, and LRU behavior is not desired.
*/
public ICacheClass getObjectClass()
{
return cacheClass;
}
/** Obtain an expiration time for an object, in milliseconds since epoch.
* The cache manager will call this method for all objects that are being operated on,
* so that their expiration timestamps get properly updated to a new time.
* @return a time in milliseconds for the object to expire, or -1 if there is no expiration
* desired.
*/
public long getObjectExpirationTime(long currentTime)
{
return -1;
}
/** This is a cache class implementation that gets expiration and LRU info
* from .ini variables.
*/
protected class LocalCacheClass implements ICacheClass
{
protected String objectClassName;
protected Integer maxLRUCount = null;
public LocalCacheClass(String objectClassName, IThreadContext threadContext)
throws ManifoldCFException
{
this(objectClassName, new Integer(LockManagerFactory.getIntProperty(threadContext, "cache."+objectClassName+".lrusize", MAX_VALUE)));
}
public LocalCacheClass(String objectClassName)
{
this(objectClassName, (Integer)null);
}
public LocalCacheClass(String objectClassName, Integer maxLRUCount)
{
this.objectClassName = objectClassName;
this.maxLRUCount = maxLRUCount;
}
/** Get the name of the object class.
* This determines the set of objects that are treated in the same
* LRU pool.
*@return the class name.
*/
@Override
public String getClassName()
{
return objectClassName;
}
/** Get the maximum LRU count of the object class.
*@return the maximum number of the objects of the particular class
* allowed.
*/
@Override
public int getMaxLRUCount()
{
if (maxLRUCount == null)
{
return MAX_VALUE;
}
return maxLRUCount;
}
}
}