[ http://issues.apache.org/jira/browse/IBATIS-204?page=all ]
Clinton Begin updated IBATIS-204:
---------------------------------
Description:
The cache layer has no logging. Following is the code change I made (all
cache mechanisms EXCEPT os-cache) to the cache code which suits my purposes. I
tried to stay within the spirit of the existing logging, mimicing the output
formats, etc. Released to the public domain.
[...source snipped...]
was:
The cache layer has no logging. Following is the code change I made (all
cache mechanisms EXCEPT os-cache) to the cache code which suits my purposes. I
tried to stay within the spirit of the existing logging, mimicing the output
formats, etc. Released to the public domain.
=======================/*
* Copyright 2004 Clinton Begin
*
* Licensed 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 com.ibatis.sqlmap.engine.cache.fifo;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import com.ibatis.common.logging.Log;
import com.ibatis.common.logging.LogFactory;
import com.ibatis.sqlmap.engine.cache.CacheController;
import com.ibatis.sqlmap.engine.cache.CacheModel;
/**
* FIFO (first in, first out) cache controller implementation
*/
public class FifoCacheController implements CacheController {
private static Log _log = LogFactory.getLog(FifoCacheController.class);
private Map cache;
private int cacheSize;
private List keyList;
/**
* Default constructor
*/
public FifoCacheController() {
this.cacheSize = 100;
this.cache = Collections.synchronizedMap(new HashMap());
this.keyList = Collections.synchronizedList(new LinkedList());
}
/**
* Configures the cache
*
* @param props
* Optionally can contain properties
[reference-type=WEAK|SOFT|STRONG]
*/
public void configure(Properties props) {
String size = props.getProperty("cache-size");
if (size == null) {
size = props.getProperty("size");
}
if (size != null) {
cacheSize = Integer.parseInt(size);
}
}
/**
* Flushes the cache.
*
* @param cacheModel
* The cache model
*/
public void flush(CacheModel cacheModel) {
if (_log.isDebugEnabled()) {
_log.debug("{cache-FIFO} Flush");
}
cache.clear();
keyList.clear();
}
/**
* Get an object out of the cache.
*
* @param cacheModel
* The cache model
* @param key
* The key of the object to be returned
* @return The cached object (or null)
*/
public Object getObject(CacheModel cacheModel, Object key) {
Object value = cache.get(key);
if (_log.isDebugEnabled()) {
_log.debug("{cache-FIFO} GetObject-[" + key + "]-[" + value + "]");
}
return value;
}
/**
* Add an object to the cache
*
* @param cacheModel
* The cacheModel
* @param key
* The key of the object to be cached
* @param value
* The object to be cached
*/
public void putObject(CacheModel cacheModel, Object key, Object value) {
if (_log.isDebugEnabled()) {
_log.debug("{cache-FIFO} PutObject-[" + key + "]-[" + value + "]");
}
cache.put(key, value);
keyList.add(key);
if (keyList.size() > cacheSize) {
try {
Object oldestKey = keyList.remove(0);
cache.remove(oldestKey);
} catch (IndexOutOfBoundsException e) {
// ignore
}
}
}
public Object removeObject(CacheModel cacheModel, Object key) {
keyList.remove(key);
Object value = cache.remove(key);
if (_log.isDebugEnabled()) {
_log.debug("{cache-FIFO} RemoveObject-[" + key + "]-[" + value + "]");
}
return value;
}
}
============================================
/*
* Copyright 2004 Clinton Begin
*
* Licensed 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 com.ibatis.sqlmap.engine.cache.lru;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import com.ibatis.common.logging.Log;
import com.ibatis.common.logging.LogFactory;
import com.ibatis.sqlmap.engine.cache.CacheController;
import com.ibatis.sqlmap.engine.cache.CacheModel;
/**
* LRU (least recently used) cache controller implementation
*/
public class LruCacheController implements CacheController {
private static Log _log = LogFactory.getLog(LruCacheController.class);
private Map cache;
private int cacheSize;
private List keyList;
/**
* Default constructor
*/
public LruCacheController() {
this.cacheSize = 100;
this.cache = Collections.synchronizedMap(new HashMap());
this.keyList = Collections.synchronizedList(new LinkedList());
}
/**
* Configures the cache
*
* @param props
* Optionally can contain properties
[reference-type=WEAK|SOFT|STRONG]
*/
public void configure(Properties props) {
String size = props.getProperty("cache-size");
if (size == null) {
size = props.getProperty("size");
}
if (size != null) {
cacheSize = Integer.parseInt(size);
}
}
/**
* Flushes the cache.
*
* @param cacheModel
* The cache model
*/
public void flush(CacheModel cacheModel) {
if (_log.isDebugEnabled()) {
_log.debug("{cache-LRU} Flush");
}
cache.clear();
keyList.clear();
}
/**
* Get an object out of the cache.
*
* @param cacheModel
* The cache model
* @param key
* The key of the object to be returned
* @return The cached object (or null)
*/
public Object getObject(CacheModel cacheModel, Object key) {
Object result = cache.get(key);
if (_log.isDebugEnabled()) {
_log.debug("{cache-LRU} GetObject-[" + key + "]-[" + result + "]");
}
keyList.remove(key);
if (result != null) {
keyList.add(key);
}
return result;
}
/**
* Add an object to the cache
*
* @param cacheModel
* The cacheModel
* @param key
* The key of the object to be cached
* @param value
* The object to be cached
*/
public void putObject(CacheModel cacheModel, Object key, Object value) {
if (_log.isDebugEnabled()) {
_log.debug("{cache-LRU} PutObject-[" + key + "]-[" + value + "]");
}
cache.put(key, value);
keyList.add(key);
if (keyList.size() > cacheSize) {
try {
Object oldestKey = keyList.remove(0);
cache.remove(oldestKey);
} catch (IndexOutOfBoundsException e) {
// ignore
}
}
}
public Object removeObject(CacheModel cacheModel, Object key) {
keyList.remove(key);
Object value = cache.remove(key);
if (_log.isDebugEnabled()) {
_log.debug("{cache-LRU} RemoveObject-[" + key + "]-[" + value + "]");
}
return value;
}
}
===============================================
/*
* Copyright 2004 Clinton Begin
*
* Licensed 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 com.ibatis.sqlmap.engine.cache.memory;
import com.ibatis.common.logging.Log;
import com.ibatis.common.logging.LogFactory;
import com.ibatis.sqlmap.engine.cache.CacheController;
import com.ibatis.sqlmap.engine.cache.CacheModel;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
/**
* Memory-based implementation of CacheController
*/
public class MemoryCacheController implements CacheController {
private MemoryCacheLevel cacheLevel = MemoryCacheLevel.WEAK;
private Map cache = Collections.synchronizedMap(new HashMap());
private static Log _log = LogFactory.getLog(MemoryCacheController.class);
/**
* Configures the cache
*
* @param props
* Optionally can contain properties
[reference-type=WEAK|SOFT|STRONG]
*/
public void configure(Properties props) {
String refType = props.getProperty("reference-type");
if (refType == null) {
refType = props.getProperty("referenceType");
}
if (refType != null) {
cacheLevel = MemoryCacheLevel.getByReferenceType(refType);
}
}
/**
* Add an object to the cache
*
* @param cacheModel
* The cacheModel
* @param key
* The key of the object to be cached
* @param value
* The object to be cached
*/
public void putObject(CacheModel cacheModel, Object key, Object value) {
Object reference = null;
if (cacheLevel.equals(MemoryCacheLevel.WEAK)) {
reference = new WeakReference(value);
} else if (cacheLevel.equals(MemoryCacheLevel.SOFT)) {
reference = new SoftReference(value);
} else if (cacheLevel.equals(MemoryCacheLevel.STRONG)) {
reference = new StrongReference(value);
}
if (_log.isDebugEnabled()) {
_log.debug("{cache-memory} PutObject-[" + key + "]-[" + value + "]");
}
cache.put(key, reference);
}
/**
* Get an object out of the cache.
*
* @param cacheModel
* The cache model
* @param key
* The key of the object to be returned
* @return The cached object (or null)
*/
public Object getObject(CacheModel cacheModel, Object key) {
Object value = null;
Object ref = cache.get(key);
if (ref != null) {
if (ref instanceof StrongReference) {
value = ((StrongReference)ref).get();
} else if (ref instanceof SoftReference) {
value = ((SoftReference)ref).get();
} else if (ref instanceof WeakReference) {
value = ((WeakReference)ref).get();
}
}
if (_log.isDebugEnabled()) {
_log.debug("{cache-memory} GetObject-[" + key + "]-[" + value + "]");
}
return value;
}
public Object removeObject(CacheModel cacheModel, Object key) {
Object value = null;
Object ref = cache.remove(key);
if (ref != null) {
if (ref instanceof StrongReference) {
value = ((StrongReference)ref).get();
} else if (ref instanceof SoftReference) {
value = ((SoftReference)ref).get();
} else if (ref instanceof WeakReference) {
value = ((WeakReference)ref).get();
}
}
if (_log.isDebugEnabled()) {
_log.debug("{cache-memory} RemoveObject-[" + key + "]-[" + value + "]");
}
return value;
}
/**
* Flushes the cache.
*
* @param cacheModel
* The cache model
*/
public void flush(CacheModel cacheModel) {
if (_log.isDebugEnabled()) {
_log.debug("{cache-memory} Flush");
}
cache.clear();
}
/**
* Class to implement a strong (permanent) reference.
*/
private static class StrongReference {
private Object object;
/**
* StrongReference constructor for an object
*
* @param object -
* the Object to store
*/
public StrongReference(Object object) {
this.object = object;
}
/**
* Getter to get the object stored in the StrongReference
*
* @return - the stored Object
*/
public Object get() {
return object;
}
}
}
> Cache layer does no logging of puts, gets, flushes, or removals.
> ----------------------------------------------------------------
>
> Key: IBATIS-204
> URL: http://issues.apache.org/jira/browse/IBATIS-204
> Project: iBatis for Java
> Type: Improvement
> Components: SQL Maps
> Versions: 2.0.8, 2.0.9, 2.1.0, 2.0.9b, 2.1.5, 2.2.0, 2.2.5
> Environment: All
> Reporter: michael campbell
> Priority: Minor
>
> The cache layer has no logging. Following is the code change I made (all
> cache mechanisms EXCEPT os-cache) to the cache code which suits my purposes.
> I tried to stay within the spirit of the existing logging, mimicing the
> output formats, etc. Released to the public domain.
> [...source snipped...]
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira