[jboss-cvs] JBossCache/src-50/org/jboss/cache/pojo/impl ...
Ben Wang
bwang at jboss.com
Fri Jul 14 12:35:48 EDT 2006
User: bwang
Date: 06/07/14 12:35:48
Modified: src-50/org/jboss/cache/pojo/impl
AdvisedPojoHandler.java CollectionClassHandler.java
InternalHelper.java ObjectGraphHandler.java
PojoCacheDelegate.java PojoCacheImpl.java
SerializableObjectHandler.java
Log:
Created a new AdvisedPojoHandler to handle specifically Advised pojo get/put/remove.
Revision Changes Path
1.2 +173 -10 JBossCache/src-50/org/jboss/cache/pojo/impl/AdvisedPojoHandler.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: AdvisedPojoHandler.java
===================================================================
RCS file: /cvsroot/jboss/JBossCache/src-50/org/jboss/cache/pojo/impl/AdvisedPojoHandler.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- AdvisedPojoHandler.java 14 Jul 2006 01:46:48 -0000 1.1
+++ AdvisedPojoHandler.java 14 Jul 2006 16:35:48 -0000 1.2
@@ -12,6 +12,10 @@
import org.jboss.cache.pojo.PojoTreeCache;
import org.jboss.cache.pojo.CachedType;
import org.jboss.cache.pojo.PojoReference;
+import org.jboss.cache.pojo.PojoUtil;
+import org.jboss.cache.pojo.observable.Observer;
+import org.jboss.cache.pojo.memory.FieldPersistentReference;
+import org.jboss.cache.pojo.util.AopUtil;
import org.jboss.cache.pojo.interceptors.dynamic.AbstractCollectionInterceptor;
import org.jboss.cache.pojo.interceptors.dynamic.BaseInterceptor;
import org.jboss.cache.pojo.interceptors.dynamic.CacheFieldInterceptor;
@@ -22,19 +26,23 @@
import org.jboss.aop.advice.Interceptor;
import org.jboss.aop.InstanceAdvisor;
import org.jboss.aop.Advised;
+import org.jboss.aop.ClassInstanceAdvisor;
+import org.jboss.aop.Advisor;
import java.util.Map;
import java.util.List;
import java.util.Set;
import java.util.Iterator;
import java.util.Collection;
+import java.util.HashMap;
+import java.lang.reflect.Field;
/**
* Handling the Collection class management.
*
* @author Ben Wang
* Date: Aug 4, 2005
- * @version $Id: AdvisedPojoHandler.java,v 1.1 2006/07/14 01:46:48 bwang Exp $
+ * @version $Id: AdvisedPojoHandler.java,v 1.2 2006/07/14 16:35:48 bwang Exp $
*/
class AdvisedPojoHandler
{
@@ -43,20 +51,25 @@
private PojoCacheImpl pCache_;
private InternalHelper internal_;
private ObjectGraphHandler graphHandler_;
+ private PojoUtil util_;
+ private Observer observer_;
public AdvisedPojoHandler(PojoCacheImpl pCache, InternalHelper internal,
- ObjectGraphHandler graphHandler)
+ ObjectGraphHandler graphHandler, PojoUtil util, Observer observer)
{
pCache_ = pCache;
cache_ = (PojoTreeCache)pCache_.getCache();
internal_ = internal;
graphHandler_ = graphHandler;
+ util_ = util;
+ observer_ = observer;
}
- Object get(Fqn fqn, Class clazz, CachedType type, PojoReference pojoReference)
+ public Object get(Fqn fqn, Class clazz, PojoReference pojoReference)
throws CacheException
{
- Object obj;
+ CachedType type = pCache_.getCachedType(clazz);
+ Object obj = null;
try
{
obj = clazz.newInstance();
@@ -70,18 +83,168 @@
InstanceAdvisor advisor = ((Advised) obj)._getInstanceAdvisor();
CacheFieldInterceptor interceptor = new CacheFieldInterceptor(pCache_, fqn, type);
interceptor.setAopInstance(pojoReference);
-// util_.attachInterceptor(obj, advisor, interceptor, observer_);
- return null;
+ util_.attachInterceptor(obj, advisor, interceptor, observer_);
+ return obj;
}
+ void put(Fqn fqn, Object obj) throws CacheException
+ {
+ CachedType type = pCache_.getCachedType(obj.getClass());
+ // add interceptor
+ InstanceAdvisor advisor = ((Advised) obj)._getInstanceAdvisor();
+ if (advisor == null)
+ throw new RuntimeException("_putObject(): InstanceAdvisor is null for: " + obj);
+
+ // Step Check for cross references
+ Interceptor interceptor = AopUtil.findCacheInterceptor(advisor);
+ if (interceptor != null && graphHandler_.put(fqn, interceptor, type))
+ {
+ // found cross references
+ return;
+ }
+
+ // We have a clean slate then.
+ _regularPutObject(fqn, obj, advisor, type);
+ }
+
+ void remove(Fqn fqn) throws CacheException
+ {
+ }
+
+
+
+ /*****************************************************************************************
+ * private methods
+ *******************************************************************************************/
+
+ private void _regularPutObject(Fqn fqn, Object obj, InstanceAdvisor advisor, CachedType type)
+ throws CacheException
+ {
+ // TODO workaround for deserialiased objects
+ if (advisor == null)
+ {
+ advisor = new ClassInstanceAdvisor(obj);
+ ((Advised) obj)._setInstanceAdvisor(advisor);
+ }
+
+ // Let's do batch update via Map instead
+ Map map = new HashMap();
+ // Always initialize the ref count so we can mark this as an AopNode.
+ PojoReference pojoReference = InternalHelper.initializeAopInstance();
+ // Insert interceptor at runtime
+ CacheFieldInterceptor interceptor = new CacheFieldInterceptor(pCache_, fqn, type);
+ interceptor.setAopInstance(pojoReference);
+ util_.attachInterceptor(obj, advisor, interceptor, observer_);
+
+ map.put(PojoReference.KEY, pojoReference);
+ // This is put into map first.
+ InternalHelper.putAopClazz(type.getType(), map);
+ // we will do it recursively.
+ // Map of sub-objects that are non-primitive
+ Map subPojoMap = new HashMap();
+ boolean hasFieldAnnotation = hasAnnotation(obj.getClass(), ((Advised) obj)._getAdvisor(), type);
+
+ for (Iterator i = type.getFields().iterator(); i.hasNext();)
+ {
+ Field field = (Field) (((FieldPersistentReference) i.next())).get();
+ Object value = null;
+ try
+ {
+ value = field.get(obj);
+ }
+ catch (IllegalAccessException e)
+ {
+ throw new CacheException("field access failed", e);
+ }
+ CachedType fieldType = pCache_.getCachedType(field.getType());
+ // check for non-replicatable types
+ if (CachedType.isPrimitiveNonReplicatable(field))
+ {
+ continue;
+ }
+
+ if (hasFieldAnnotation)
+ {
+ if (CachedType.hasTransientAnnotation(field, ((Advised) obj)._getAdvisor()))
+ {
+ continue;
+ }
+ }
+
+ // we simply treat field that has @Serializable as a primitive type.
+ if (fieldType.isImmediate() ||
+ (hasFieldAnnotation &&
+ CachedType.hasSerializableAnnotation(field, ((Advised) obj)._getAdvisor())))
+ {
+ // switched using batch update
+ map.put(field.getName(), value);
+ } else
+ {
+ subPojoMap.put(field, value);
+ }
+ }
+
+ // Use option to skip locking since we have parent lock already.
+ cache_.put(fqn, map, internal_.getLockOption());
+ // This is in-memory operation only
+ InternalHelper.setPojo(pojoReference, obj);
- boolean put(Fqn fqn, Object obj) throws CacheException
+ for (Object o : subPojoMap.keySet())
{
- return false;
+ Field field = (Field) o;
+ Object value = subPojoMap.get(field);
+ Fqn tmpFqn = new Fqn(fqn, field.getName());
+ pCache_.putObject(tmpFqn, value);
+ // If it is Collection classes, we replace it with dynamic proxy.
+ // But we will have to ignore it if value is null
+ if (value instanceof Map || value instanceof List || value instanceof Set)
+ {
+ Object newValue = pCache_.getObject(tmpFqn);
+ util_.collectionReplaceWithProxy(obj, field, newValue);
+ }
}
- boolean remove(Fqn fqn) throws CacheException
+ // Need to make sure this is behind put such that obj.toString is done correctly.
+ if (log.isDebugEnabled())
{
- return false;
+ log.debug("_regularPutObject(): inserting with fqn: " + fqn);
}
+ }
+
+ private static boolean hasAnnotation(Class clazz, Advisor advisor, CachedType type)
+ {
+ return CachedType.hasAnnotation(clazz, advisor, type);
+ }
+
+
+ public void remove(Fqn fqn, Object result, Class clazz
+ ) throws CacheException
+ {
+ CachedType type = pCache_.getCachedType(clazz);
+ for (Iterator i = type.getFields().iterator(); i.hasNext();)
+ {
+ Field field = (Field) (((FieldPersistentReference) i.next())).get();
+ CachedType fieldType = pCache_.getCachedType(field.getType());
+ Object value = null;
+ if (!fieldType.isImmediate())
+ {
+ value = pCache_.removeObject(new Fqn(fqn, field.getName()));
+
+ // Check for Collection. If it is, we need to reset the original reference.
+/*
+ if ((value instanceof Map || value instanceof List || value instanceof Set) &&
+ (value instanceof ClassProxy))
+ {
+ Interceptor interceptor = CollectionInterceptorUtil.getInterceptor((ClassProxy) value);
+ Object origValue = ((AbstractCollectionInterceptor)interceptor).getCurrecntCopy();
+ util_.collectionReplaceWithProxy(value, field, origValue);
+ }
+*/
+ }
+ }
+
+ // batch remove
+ cache_.removeData(fqn);
+ }
+
}
1.3 +8 -19 JBossCache/src-50/org/jboss/cache/pojo/impl/CollectionClassHandler.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: CollectionClassHandler.java
===================================================================
RCS file: /cvsroot/jboss/JBossCache/src-50/org/jboss/cache/pojo/impl/CollectionClassHandler.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- CollectionClassHandler.java 14 Jul 2006 01:46:48 -0000 1.2
+++ CollectionClassHandler.java 14 Jul 2006 16:35:48 -0000 1.3
@@ -31,7 +31,7 @@
*
* @author Ben Wang
* Date: Aug 4, 2005
- * @version $Id: CollectionClassHandler.java,v 1.2 2006/07/14 01:46:48 bwang Exp $
+ * @version $Id: CollectionClassHandler.java,v 1.3 2006/07/14 16:35:48 bwang Exp $
*/
class CollectionClassHandler
{
@@ -50,7 +50,7 @@
graphHandler_ = graphHandler;
}
- Object get(Fqn fqn, Class clazz)
+ Object get(Fqn fqn, Class clazz, PojoReference pojoReference)
throws CacheException
{
Object obj = null;
@@ -78,7 +78,7 @@
}
- boolean put(Fqn fqn, Object obj) throws CacheException
+ void put(Fqn fqn, Object obj) throws CacheException
{
boolean isCollection = false;
@@ -110,7 +110,7 @@
// Let's check for object graph, e.g., multiple and circular references first
if (graphHandler_.put(fqn, interceptor, type))
{ // found cross references
- return true;
+ return;
}
} else
{
@@ -119,7 +119,7 @@
interceptor.attach(fqn, copyToCache);
internal_.putAopClazz(fqn, type.getType());
internal_.setPojo(fqn, obj);
- return true; // we are done
+ return; // we are done
}
}
}
@@ -232,20 +232,10 @@
InternalHelper.setPojo(pojoReference, obj);
}
- return isCollection;
}
- boolean remove(Fqn fqn
- ) throws CacheException
+ void remove(Fqn fqn, Object obj) throws CacheException
{
- Class clazz = internal_.peekAopClazz(fqn);
-
- if (!Map.class.isAssignableFrom(clazz) && !Collection.class.isAssignableFrom(clazz))
- {
- return false;
- }
-
- Object obj = pCache_.getObject(fqn);
if (!(obj instanceof ClassProxy))
{
throw new RuntimeException("CollectionClassHandler.collectionRemoveObject(): object is not a proxy :" + obj);
@@ -253,8 +243,7 @@
Interceptor interceptor = CollectionInterceptorUtil.getInterceptor((ClassProxy) obj);
boolean removeFromCache = true;
- ((AbstractCollectionInterceptor) interceptor).detach(removeFromCache); // detach the interceptor. This will trigger a copy and remove.
-
- return true;
+ // detach the interceptor. This will trigger a copy and remove.
+ ((AbstractCollectionInterceptor) interceptor).detach(removeFromCache);
}
}
1.3 +10 -17 JBossCache/src-50/org/jboss/cache/pojo/impl/InternalHelper.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: InternalHelper.java
===================================================================
RCS file: /cvsroot/jboss/JBossCache/src-50/org/jboss/cache/pojo/impl/InternalHelper.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- InternalHelper.java 13 Jul 2006 16:53:12 -0000 1.2
+++ InternalHelper.java 14 Jul 2006 16:35:48 -0000 1.3
@@ -293,11 +293,9 @@
cache_.remove(fqn, InternalConstant.CLASS_INTERNAL);
}
- void cleanUp(Fqn fqn, boolean evict) throws CacheException
+ void cleanUp(Fqn fqn) throws CacheException
{
// We can't do a brute force remove anymore?
- if (!evict)
- {
if (!cache_._get(fqn).hasChildren())
{
// remove everything
@@ -311,11 +309,6 @@
log.trace("cleanup(): fqn: " + fqn + " is not empty. That means it has sub-pojos. Will not remove node");
}
}
- } else
- {
- // This has to use plainEvict method otherwise it is recursively calling aop version of evict.
-// cache_.plainEvict(fqn);
- }
}
String createIndirectFqn(String fqn) throws CacheException
1.3 +6 -9 JBossCache/src-50/org/jboss/cache/pojo/impl/ObjectGraphHandler.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: ObjectGraphHandler.java
===================================================================
RCS file: /cvsroot/jboss/JBossCache/src-50/org/jboss/cache/pojo/impl/ObjectGraphHandler.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- ObjectGraphHandler.java 14 Jul 2006 01:46:48 -0000 1.2
+++ ObjectGraphHandler.java 14 Jul 2006 16:35:48 -0000 1.3
@@ -27,7 +27,7 @@
*
* @author Ben Wang
* Date: Aug 4, 2005
- * @version $Id: ObjectGraphHandler.java,v 1.2 2006/07/14 01:46:48 bwang Exp $
+ * @version $Id: ObjectGraphHandler.java,v 1.3 2006/07/14 16:35:48 bwang Exp $
*/
class ObjectGraphHandler
{
@@ -96,7 +96,7 @@
return true;
}
- boolean remove(Fqn fqn, boolean removeCacheInterceptor, Object pojo, boolean evict)
+ boolean remove(Fqn fqn, Object pojo)
throws CacheException
{
boolean isTrue = false;
@@ -112,8 +112,8 @@
log.debug("remove(): removing object fqn: " + fqn + " but is actually from ref fqn: " + refFqn
+ " Will just de-reference it.");
}
- removeFromReference(fqn, refFqn, removeCacheInterceptor, evict);
- internal_.cleanUp(fqn, evict);
+ removeFromReference(fqn, refFqn);
+ internal_.cleanUp(fqn);
isTrue = true;
} else
{
@@ -170,12 +170,9 @@
*
* @param fqn
* @param refFqn
- * @param removeCacheInterceptor
- * @param evict
* @throws CacheException
*/
- private void removeFromReference(Fqn fqn, String refFqn, boolean removeCacheInterceptor,
- boolean evict) throws CacheException
+ private void removeFromReference(Fqn fqn, String refFqn) throws CacheException
{
synchronized (refFqn)
{ // we lock the internal fqn here so no one else has access.
@@ -184,7 +181,7 @@
{
// No one is referring it so it is safe to remove
// TODO we should make sure the parent nodes are also removed they are empty as well.
- pCache_._removeObject(Fqn.fromString(refFqn), removeCacheInterceptor, evict);
+ pCache_._removeObject(Fqn.fromString(refFqn));
}
}
1.3 +46 -204 JBossCache/src-50/org/jboss/cache/pojo/impl/PojoCacheDelegate.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: PojoCacheDelegate.java
===================================================================
RCS file: /cvsroot/jboss/JBossCache/src-50/org/jboss/cache/pojo/impl/PojoCacheDelegate.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- PojoCacheDelegate.java 14 Jul 2006 01:46:48 -0000 1.2
+++ PojoCacheDelegate.java 14 Jul 2006 16:35:48 -0000 1.3
@@ -26,6 +26,7 @@
import org.jboss.cache.pojo.PojoUtil;
import org.jboss.cache.pojo.CachedType;
import org.jboss.cache.pojo.PojoReference;
+import org.jboss.cache.pojo.collection.CollectionInterceptorUtil;
import java.lang.reflect.Field;
import java.util.Collection;
@@ -46,6 +47,7 @@
private PojoTreeCache cache_;
private final static Log log = LogFactory.getLog(PojoCacheDelegate.class);
private InternalHelper internal_;
+ private AdvisedPojoHandler advisedHandler_;
private ObjectGraphHandler graphHandler_;
private CollectionClassHandler collectionHandler_;
private SerializableObjectHandler serializableHandler_;
@@ -65,6 +67,7 @@
collectionHandler_ = new CollectionClassHandler(pCache_, internal_, graphHandler_);
serializableHandler_ = new SerializableObjectHandler(pCache_, internal_);
observer_ = observer;
+ advisedHandler_ = new AdvisedPojoHandler(pCache_, internal_, graphHandler_, util_, observer_);
}
public void setBulkRemove(boolean bulk)
@@ -116,7 +119,6 @@
/**
* Reconstruct the managed POJO
*/
- CachedType type = pCache_.getCachedType(clazz);
Object obj;
// Check for both Advised and Collection classes for object graph.
@@ -131,42 +133,28 @@
if (Advised.class.isAssignableFrom(clazz))
{
- try
- {
- obj = clazz.newInstance();
- // TODO Need to populate the object from the cache as well.
- }
- catch (Exception e)
- {
- throw new CacheException("failed creating instance of " + clazz.getName(), e);
- }
- // Insert interceptor at runtime
- InstanceAdvisor advisor = ((Advised) obj)._getInstanceAdvisor();
- CacheFieldInterceptor interceptor = new CacheFieldInterceptor(pCache_, fqn, type);
- interceptor.setAopInstance(pojoReference);
- util_.attachInterceptor(obj, advisor, interceptor, observer_);
- } else
+ obj = advisedHandler_.get(fqn, clazz, pojoReference);
+ } else if(isCollectionGet(clazz))
{ // Must be Collection classes. We will use aop.ClassProxy instance instead.
- try
- {
- if ((obj = collectionHandler_.get(fqn, clazz)) != null)
- {
+ obj = collectionHandler_.get(fqn, clazz, pojoReference);
} else
{
// Maybe it is just a serialized object.
- obj = serializableHandler_.get(fqn);
- }
- }
- catch (Exception e)
- {
- throw new CacheException("failure creating proxy", e);
- }
+ obj = serializableHandler_.get(fqn, clazz, pojoReference);
}
InternalHelper.setPojo(pojoReference, obj);
return obj;
}
+ private boolean isCollectionGet(Class clazz)
+ {
+ if(Map.class.isAssignableFrom(clazz) || Collection.class.isAssignableFrom(clazz))
+ return true;
+
+ return false;
+ }
+
/**
* Note that caller of this method will take care of synchronization within the <code>fqn</code> sub-tree.
*
@@ -181,7 +169,9 @@
Object oldValue = internal_.getPojo(fqn);
if (oldValue == obj) return obj; // value already in cache. return right away.
- pCache_._removeObject(fqn, true); // remove old value before overwriting it.
+ // remove old value before overwriting it. This is necessary to detach any interceptor.
+ // TODO Or can we simply walk thru that somewhere? Well, there is also implication of Collection though
+ pCache_._removeObject(fqn, true);
if (obj == null)
{
@@ -197,45 +187,29 @@
log.debug("putObject(): fqn: " + fqn);
}
- // store object in cache
if (obj instanceof Advised)
{
- CachedType type = pCache_.getCachedType(obj.getClass());
- // add interceptor
- InstanceAdvisor advisor = ((Advised) obj)._getInstanceAdvisor();
- if (advisor == null)
- throw new RuntimeException("_putObject(): InstanceAdvisor is null for: " + obj);
-
- // Step Check for cross references
- Interceptor interceptor = AopUtil.findCacheInterceptor(advisor);
- if (interceptor != null && graphHandler_.put(fqn, interceptor, type))
- { // found cross references
- return oldValue;
- }
-
- // We have a clean slate then.
- _regularPutObject(fqn, obj, advisor, type);
-
- /**
- * Handling collection classes here.
- * First check if obj has been aspectized? That is, if it is a ClassProxy or not.
- * If not, we will need to create a proxy first for the Collection classes
- */
- } else if (collectionHandler_.put(fqn, obj))
+ advisedHandler_.put(fqn, obj);
+ } else if (isCollection(obj))
{
+ collectionHandler_.put(fqn, obj);
//
- } else if (serializableHandler_.put(fqn, obj))
- {
- // must be Serializable, including primitive types
} else
{
- // I really don't know what this is.
- throw new RuntimeException("putObject(): obj: " + obj + " type is not recognizable.");
+ // must be Serializable, including primitive types
+ serializableHandler_.put(fqn, obj);
}
return oldValue;
}
+ private boolean isCollection(Object obj)
+ {
+ if(obj instanceof Collection || obj instanceof Map) return true;
+
+ return false;
+ }
+
/**
* Based on the pojo to perform a bulk remove recursively if there is no object graph
* relationship for performance optimization.
@@ -244,7 +218,6 @@
{
// Check for cross-reference. If there is, we can't do bulk remove
// map contains (pojo, cacheinterceptor) pair that needs to undo the the removal.
-// return false;
Map undoMap = new HashMap();
if (pojoGraphMultipleReferenced(obj, undoMap))
{
@@ -302,6 +275,11 @@
*/
private boolean pojoGraphMultipleReferenced(Object obj, Map undoMap) throws CacheException
{
+ return true;
+ }
+
+ private boolean XpojoGraphMultipleReferenced(Object obj, Map undoMap) throws CacheException
+ {
// store object in cache
if (obj instanceof Advised)
{
@@ -409,99 +387,6 @@
return false;
}
- private void _regularPutObject(Fqn fqn, Object obj, InstanceAdvisor advisor, CachedType type) throws CacheException
- {
- // TODO workaround for deserialiased objects
- if (advisor == null)
- {
- advisor = new ClassInstanceAdvisor(obj);
- ((Advised) obj)._setInstanceAdvisor(advisor);
- }
-
- // Let's do batch update via Map instead
- Map map = new HashMap();
- // Always initialize the ref count so we can mark this as an AopNode.
- PojoReference pojoReference = InternalHelper.initializeAopInstance();
- // Insert interceptor at runtime
- CacheFieldInterceptor interceptor = new CacheFieldInterceptor(pCache_, fqn, type);
- interceptor.setAopInstance(pojoReference);
- util_.attachInterceptor(obj, advisor, interceptor, observer_);
-
- map.put(PojoReference.KEY, pojoReference);
- // This is put into map first.
- InternalHelper.putAopClazz(type.getType(), map);
- // we will do it recursively.
- // Map of sub-objects that are non-primitive
- Map subPojoMap = new HashMap();
- boolean hasFieldAnnotation = hasAnnotation(obj.getClass(), ((Advised) obj)._getAdvisor(), type);
-
- for (Iterator i = type.getFields().iterator(); i.hasNext();)
- {
- Field field = (Field) (((FieldPersistentReference) i.next())).get();
- Object value = null;
- try
- {
- value = field.get(obj);
- }
- catch (IllegalAccessException e)
- {
- throw new CacheException("field access failed", e);
- }
- CachedType fieldType = pCache_.getCachedType(field.getType());
- // check for non-replicatable types
- if (CachedType.isPrimitiveNonReplicatable(field))
- {
- continue;
- }
-
- if (hasFieldAnnotation)
- {
- if (CachedType.hasTransientAnnotation(field, ((Advised) obj)._getAdvisor()))
- {
- continue;
- }
- }
-
- // we simply treat field that has @Serializable as a primitive type.
- if (fieldType.isImmediate() ||
- (hasFieldAnnotation &&
- CachedType.hasSerializableAnnotation(field, ((Advised) obj)._getAdvisor())))
- {
- // switched using batch update
- map.put(field.getName(), value);
- } else
- {
- subPojoMap.put(field, value);
- }
- }
-
- // Use option to skip locking since we have parent lock already.
- cache_.put(fqn, map, internal_.getLockOption());
- // This is in-memory operation only
- InternalHelper.setPojo(pojoReference, obj);
-
- for (Object o : subPojoMap.keySet())
- {
- Field field = (Field) o;
- Object value = subPojoMap.get(field);
- Fqn tmpFqn = new Fqn(fqn, field.getName());
- _putObject(tmpFqn, value);
- // If it is Collection classes, we replace it with dynamic proxy.
- // But we will have to ignore it if value is null
- if (value instanceof Map || value instanceof List || value instanceof Set)
- {
- Object newValue = pCache_.getObject(tmpFqn);
- util_.collectionReplaceWithProxy(obj, value, field, newValue);
- }
- }
-
- // Need to make sure this is behind put such that obj.toString is done correctly.
- if (log.isDebugEnabled())
- {
- log.debug("_regularPutObject(): inserting with fqn: " + fqn);
- }
- }
-
private static boolean hasAnnotation(Class clazz, Advisor advisor, CachedType type)
{
return CachedType.hasAnnotation(clazz, advisor, type);
@@ -511,13 +396,10 @@
* Note that caller of this method will take care of synchronization within the <code>fqn</code> sub-tree.
*
* @param fqn
- * @param removeCacheInterceptor
- * @param evict
* @return
* @throws CacheException
*/
- public Object _removeObject(Fqn fqn, boolean removeCacheInterceptor, boolean evict)
- throws CacheException
+ public Object _removeObject(Fqn fqn) throws CacheException
{
Class clazz = internal_.peekAopClazz(fqn);
if (clazz == null)
@@ -541,13 +423,7 @@
if (cache_.exists(fqn))
{
// TODO What do we do here. It can still have children pojo though.
- if (!evict)
- {
cache_.remove(fqn);
- } else
- {
- cache_._evict(fqn);
- }
}
return null;
}
@@ -560,7 +436,7 @@
// Remember not to print obj here since it will trigger the CacheFieldInterceptor.
if (log.isDebugEnabled())
{
- log.debug("_removeObject(): fqn: " + fqn + "removing exisiting object in bulk.");
+ log.debug("_removeObject(): fqn: " + fqn + "removing existing object in bulk.");
}
return result;
@@ -568,7 +444,7 @@
setBulkRemove(false);
}
- if (graphHandler_.remove(fqn, removeCacheInterceptor, result, evict))
+ if (graphHandler_.remove(fqn, result))
{
return result;
}
@@ -576,55 +452,21 @@
// Not multi-referenced
if (Advised.class.isAssignableFrom(clazz))
{
- _regularRemoveObject(fqn, removeCacheInterceptor, result, clazz, evict);
- } else if (collectionHandler_.remove(fqn))
+ advisedHandler_.remove(fqn, result, clazz);
+ } else if (isCollectionGet(clazz))
{
+ collectionHandler_.remove(fqn, result);
} else
{ // Just Serializable objects. Do a brute force remove is ok.
serializableHandler_.remove();
}
- internal_.cleanUp(fqn, evict);
+ internal_.cleanUp(fqn);
// remove the interceptor as well.
return result;
}
- private void _regularRemoveObject(Fqn fqn, boolean removeCacheInterceptor, Object result, Class clazz,
- boolean evict) throws CacheException
- {
- InstanceAdvisor advisor = ((Advised) result)._getInstanceAdvisor();
- CachedType type = pCache_.getCachedType(clazz);
- for (Iterator i = type.getFields().iterator(); i.hasNext();)
- {
- Field field = (Field) (((FieldPersistentReference) i.next())).get();
- CachedType fieldType = pCache_.getCachedType(field.getType());
- if (!fieldType.isImmediate())
- {
- _removeObject(new Fqn(fqn, field.getName()), removeCacheInterceptor, evict);
- }
- }
-
- // batch remove
- cache_.removeData(fqn);
-
- // Determine if we want to keep the interceptor for later use.
- if (removeCacheInterceptor)
- {
- CacheFieldInterceptor interceptor = (CacheFieldInterceptor) AopUtil.findCacheInterceptor(advisor);
- // Remember to remove the interceptor from in-memory object but make sure it belongs to me first.
- if (interceptor != null)
- {
- if (log.isDebugEnabled())
- {
- log.debug("regularRemoveObject(): removed cache interceptor fqn: " + fqn + " interceptor: " + interceptor);
- }
- util_.detachInterceptor(advisor, interceptor, observer_);
- }
- }
-
- }
-
Map _findObjects(Fqn fqn) throws CacheException
{
1.9 +4 -3 JBossCache/src-50/org/jboss/cache/pojo/impl/PojoCacheImpl.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: PojoCacheImpl.java
===================================================================
RCS file: /cvsroot/jboss/JBossCache/src-50/org/jboss/cache/pojo/impl/PojoCacheImpl.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -b -r1.8 -r1.9
--- PojoCacheImpl.java 13 Jul 2006 15:56:12 -0000 1.8
+++ PojoCacheImpl.java 14 Jul 2006 16:35:48 -0000 1.9
@@ -38,7 +38,7 @@
* Implementation class for PojoCache interface
*
* @author Ben Wang
- * @version $Id: PojoCacheImpl.java,v 1.8 2006/07/13 15:56:12 bwang Exp $
+ * @version $Id: PojoCacheImpl.java,v 1.9 2006/07/14 16:35:48 bwang Exp $
*/
public class PojoCacheImpl implements PojoCache, Observer
{
@@ -248,7 +248,7 @@
// Don't trigger bulk remove now since there is still some problem with Collection class
// when it is detached.
delegate_.setBulkRemove(true);
- return delegate_._removeObject(fqn, removeCacheInterceptor, evict);
+ return delegate_._removeObject(fqn);
}
/**
@@ -263,7 +263,8 @@
// evicted.
// if(detachPojoWhenEvicted_) removeCacheInterceptor = true;
delegate_.setBulkRemove(false);
- return delegate_._removeObject(fqn, removeCacheInterceptor, evict);
+// return delegate_._removeObject(fqn, removeCacheInterceptor);
+ return null;
}
/**
1.4 +2 -2 JBossCache/src-50/org/jboss/cache/pojo/impl/SerializableObjectHandler.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: SerializableObjectHandler.java
===================================================================
RCS file: /cvsroot/jboss/JBossCache/src-50/org/jboss/cache/pojo/impl/SerializableObjectHandler.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- SerializableObjectHandler.java 14 Jul 2006 01:46:48 -0000 1.3
+++ SerializableObjectHandler.java 14 Jul 2006 16:35:48 -0000 1.4
@@ -22,7 +22,7 @@
* Handle Serializable object cache management.
*
* @author Ben Wang
- * @version $Id: SerializableObjectHandler.java,v 1.3 2006/07/14 01:46:48 bwang Exp $
+ * @version $Id: SerializableObjectHandler.java,v 1.4 2006/07/14 16:35:48 bwang Exp $
*/
class SerializableObjectHandler
{
@@ -38,7 +38,7 @@
internal_ = internal;
}
- Object get(Fqn fqn)
+ Object get(Fqn fqn, Class clazz, PojoReference pojoReference)
throws CacheException
{
Object obj = internal_.get(fqn, InternalConstant.SERIALIZED);
More information about the jboss-cvs-commits
mailing list