Index: src/main/java/org/apache/jackrabbit/ocm/manager/impl/ObjectContentManagerImpl.java =================================================================== --- src/main/java/org/apache/jackrabbit/ocm/manager/impl/ObjectContentManagerImpl.java (revision 786515) +++ src/main/java/org/apache/jackrabbit/ocm/manager/impl/ObjectContentManagerImpl.java (working copy) @@ -122,7 +122,7 @@ Map atomicTypeConverters = converterProvider.getAtomicTypeConverters(); this.queryManager = new QueryManagerImpl(mapper, atomicTypeConverters, session.getValueFactory()); this.requestObjectCache = new RequestObjectCacheImpl(); - this.objectConverter = new ObjectConverterImpl(mapper, converterProvider, new ProxyManagerImpl(), requestObjectCache); + this.objectConverter = buildObjectConverter(mapper, requestObjectCache); } catch (RepositoryException e) { throw new org.apache.jackrabbit.ocm.exception.RepositoryException("Impossible to instantiate the object content manager", e); @@ -149,7 +149,7 @@ Map atomicTypeConverters = converterProvider.getAtomicTypeConverters(); this.queryManager = new QueryManagerImpl(mapper, atomicTypeConverters, session.getValueFactory()); this.requestObjectCache = new RequestObjectCacheImpl(); - this.objectConverter = new ObjectConverterImpl(mapper, converterProvider, new ProxyManagerImpl(), requestObjectCache); + this.objectConverter = buildObjectConverter(mapper, requestObjectCache); } catch (RepositoryException e) { throw new org.apache.jackrabbit.ocm.exception.RepositoryException("Impossible to instantiate the object content manager", e); @@ -176,7 +176,7 @@ Map atomicTypeConverters = converterProvider.getAtomicTypeConverters(); this.queryManager = new QueryManagerImpl(mapper, atomicTypeConverters, session.getValueFactory()); this.requestObjectCache = new RequestObjectCacheImpl(); - this.objectConverter = new ObjectConverterImpl(mapper, converterProvider, new ProxyManagerImpl(), requestObjectCache); + this.objectConverter = buildObjectConverter(mapper, requestObjectCache); } catch (RepositoryException e) { throw new org.apache.jackrabbit.ocm.exception.RepositoryException("Impossible to instantiate the object content manager", e); @@ -205,6 +205,11 @@ this.requestObjectCache = requestObjectCache; } + + private ObjectConverter buildObjectConverter(Mapper mapper, ObjectCache requestObjectCache) { + DefaultAtomicTypeConverterProvider converterProvider = new DefaultAtomicTypeConverterProvider(); + return new ObjectConverterImpl(mapper, converterProvider, new ProxyManagerImpl(), requestObjectCache); + } /** * Sets the Mapper used by this object content manager. @@ -369,7 +374,7 @@ */ public void retrieveAllMappedAttributes(Object object) { objectConverter.retrieveAllMappedAttributes(session, object); - + requestObjectCache.clear(); } /** @@ -378,7 +383,7 @@ */ public void retrieveMappedAttribute(Object object, String attributeName) { objectConverter.retrieveMappedAttribute(session, object, attributeName); - + requestObjectCache.clear(); } /** @@ -595,7 +600,13 @@ log.debug("Get Object with expression : " + jcrExpression); NodeIterator nodeIterator = getNodeIterator(jcrExpression, javax.jcr.query.Query.XPATH); - return new ObjectIterator(nodeIterator, this.objectConverter, this.session); + // do not use the global object converter to this class as it modifies + // the request object cache ... instead create a new converter local + // to the iterator with its own cache + + ObjectConverter localConverter = buildObjectConverter(mapper, new RequestObjectCacheImpl()); + + return new ObjectIterator(nodeIterator, localConverter, this.session); } @@ -608,7 +619,14 @@ log.debug("Get Object with expression : " + query); NodeIterator nodeIterator = getNodeIterator(query, language); - return new ObjectIterator(nodeIterator, this.objectConverter, this.session); + // do not use the global object converter to this class as it modifies + // the request object cache ... instead create a new converter local + // to the iterator with its own cache + + ObjectConverter localConverter = buildObjectConverter(mapper, new RequestObjectCacheImpl()); + + return new ObjectIterator(nodeIterator, localConverter, this.session); + } public Collection getObjects(String query, String language) { @@ -1076,6 +1094,8 @@ throw new ObjectContentManagerException("Cannot persist current session changes. Violation of a lock detected", le); } catch (RepositoryException e) { throw new ObjectContentManagerException("Cannot persist current session changes.", e); + } finally { + requestObjectCache.clear(); } } @@ -1091,6 +1111,8 @@ session.refresh(keepChanges); } catch (RepositoryException e) { throw new ObjectContentManagerException("Cannot refresh current session ", e); + } finally { + this.requestObjectCache.clear(); } }