Index: C:/Java/castor-2/src/main/java/org/castor/cache/distributed/GigaspacesCache.java =================================================================== --- C:/Java/castor-2/src/main/java/org/castor/cache/distributed/GigaspacesCache.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/castor/cache/distributed/GigaspacesCache.java (working copy) @@ -58,7 +58,8 @@ *

instance 1:
* "/./myCache?schema=cache&cluster_schema=replicated&total_members=2&id=1"

*

instance 2:
- * "/./myCache?schema=cache&cluster_schema=replicated&total_members=2&id=2"


+ * "/./myCache?schema=cache&cluster_schema=replicated&total_members=2&id=2"

+ *
* * or

* @@ -65,7 +66,8 @@ *

instance 1:
* "/./myCache?schema=cache&cluster_schema=partitioned&total_members=2&id=1"

*

instance 2:
- * "/./myCache?schema=cache&cluster_schema=partitioned&total_members=2&id=2"


+ * "/./myCache?schema=cache&cluster_schema=partitioned&total_members=2&id=2"

+ *
* *

When running the cache in server or in embedded mode, you must have the * cache schema to be used – i.e. 'schema=cache'.


@@ -135,7 +137,8 @@ super.initialize(params); String cacheURL = params.getProperty("cacheURL", DEFAULT_CACHE_URL); - String cacheProperties = params.getProperty("cacheProperties", DEFAULT_CACHE_PROPERTIES); + String cacheProperties = params.getProperty( + "cacheProperties", DEFAULT_CACHE_PROPERTIES); StringBuffer clusterURL = new StringBuffer(); clusterURL.append(cacheURL); Index: C:/Java/castor-2/src/main/java/org/castor/persist/AbstractTransactionContext.java =================================================================== --- C:/Java/castor-2/src/main/java/org/castor/persist/AbstractTransactionContext.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/castor/persist/AbstractTransactionContext.java (working copy) @@ -44,6 +44,7 @@ import org.exolab.castor.persist.QueryResults; import org.exolab.castor.persist.TxSynchronizable; import org.exolab.castor.persist.spi.CallbackInterceptor; +import org.exolab.castor.persist.spi.Complex; import org.exolab.castor.persist.spi.InstanceFactory; import org.exolab.castor.persist.spi.PersistenceQuery; @@ -335,16 +336,17 @@ /** * {@inheritDoc} - * @see org.castor.persist.TransactionContext#fetch( - * org.exolab.castor.persist.ClassMolder, - * java.lang.Object, org.exolab.castor.mapping.AccessMode) + * @see org.castor.persist.TransactionContext + * #fetch(org.exolab.castor.persist.ClassMolder, + * org.exolab.castor.persist.spi.Complex, + * org.exolab.castor.mapping.AccessMode) */ public final synchronized Object fetch( - final ClassMolder molder, final Object identity, + final ClassMolder molder, final Complex identity, final AccessMode suggestedAccessMode) throws PersistenceException { - Object objectInTransaction; + Object objectInTx; OID oid; AccessMode accessMode; @@ -357,12 +359,12 @@ oid = new OID(molder, identity); accessMode = molder.getAccessMode(suggestedAccessMode); if (accessMode == AccessMode.ReadOnly) { - objectInTransaction = _tracker.getObjectForOID(engine, oid, true); + objectInTx = _tracker.getObjectForOID(engine, oid, true); } else { - objectInTransaction = _tracker.getObjectForOID(engine, oid, false); + objectInTx = _tracker.getObjectForOID(engine, oid, false); } - if (objectInTransaction != null) { + if (objectInTx != null) { // Object exists in this transaction. // If the object has been loaded in this transaction from a @@ -370,7 +372,7 @@ // deleted in this transaction, it cannot be re-loaded. If the // object has been created in this transaction, it cannot be // re-loaded but no error is reported. - if (engine != _tracker.getMolderForObject(objectInTransaction).getLockEngine()) { + if (engine != _tracker.getMolderForObject(objectInTx).getLockEngine()) { throw new PersistenceException(Messages.format( "persist.multipleLoad", molder.getName(), identity)); } @@ -376,7 +378,7 @@ } // Objects marked deleted in the transaction return null. - if (_tracker.isDeleted(objectInTransaction)) { + if (_tracker.isDeleted(objectInTx)) { return null; } @@ -388,7 +390,7 @@ // entry.object.getClass() ) ) // if ( ! molder.getJavaClass( _db.getClassLoader() // ).isAssignableFrom( entry.object.getClass() ) ) - if (!molder.isAssignableFrom(objectInTransaction.getClass())) { + if (!molder.isAssignableFrom(objectInTx.getClass())) { throw new PersistenceException(Messages.format( "persist.typeMismatch", molder.getName(), identity)); } @@ -395,13 +397,12 @@ // If the object has been created in this transaction, don't bother // testing access mode. - if (_tracker.isCreated(objectInTransaction)) { - return objectInTransaction; + if (_tracker.isCreated(objectInTx)) { + return objectInTx; } if ((accessMode == AccessMode.Exclusive || accessMode == AccessMode.DbLocked) - && !_tracker.getOIDForObject(objectInTransaction) - .isDbLock()) { + && !_tracker.getOIDForObject(objectInTx).isDbLock()) { // If we are in exclusive mode and object has not been // loaded in exclusive mode before, then we have a // problem. We cannot return an object that is not @@ -410,7 +411,7 @@ throw new PersistenceException(Messages.format( "persist.lockConflict", molder.getName(), identity)); } - return objectInTransaction; + return objectInTx; } return null; } @@ -422,7 +423,7 @@ * org.exolab.castor.mapping.AccessMode) */ public final synchronized Object load( - final Object identity, + final Complex identity, final ProposedEntity proposedObject, final AccessMode suggestedAccessMode) throws PersistenceException { return load(identity, proposedObject, suggestedAccessMode, null); @@ -435,12 +436,12 @@ * org.exolab.castor.mapping.AccessMode, org.exolab.castor.persist.QueryResults) */ public final synchronized Object load( - final Object identity, + final Complex identity, final ProposedEntity proposedObject, final AccessMode suggestedAccessMode, final QueryResults results) throws PersistenceException { - - Object objectInTransaction; + + Object objectInTx; OID oid; AccessMode accessMode; @@ -463,12 +464,12 @@ oid = new OID(molder, identity); accessMode = molder.getAccessMode(suggestedAccessMode); if (accessMode == AccessMode.ReadOnly) { - objectInTransaction = _tracker.getObjectForOID(engine, oid, true); + objectInTx = _tracker.getObjectForOID(engine, oid, true); } else { - objectInTransaction = _tracker.getObjectForOID(engine, oid, false); + objectInTx = _tracker.getObjectForOID(engine, oid, false); } - if (objectInTransaction != null) { + if (objectInTx != null) { // Object exists in this transaction. // If the object has been loaded, but the instance sugguested to @@ -477,7 +478,7 @@ // TODO [WG]: could read && propsedObject != objectInTransaction if (proposedObject.getEntity() != null - && proposedObject.getEntity() != objectInTransaction) { + && proposedObject.getEntity() != objectInTx) { throw new PersistenceException(Messages.format( "persist.multipleLoad", molder.getName(), identity)); } @@ -487,7 +488,7 @@ // deleted in this transaction, it cannot be re-loaded. If the // object has been created in this transaction, it cannot be // re-loaded but no error is reported. - if (engine != _tracker.getMolderForObject(objectInTransaction).getLockEngine()) { + if (engine != _tracker.getMolderForObject(objectInTx).getLockEngine()) { throw new PersistenceException(Messages.format( "persist.multipleLoad", molder.getName(), identity)); } @@ -495,7 +496,7 @@ // Objects marked deleted in the transaction therefore we // throw a ObjectNotFoundException to signal that object isn't // available any more. - if (_tracker.isDeleted(objectInTransaction)) { + if (_tracker.isDeleted(objectInTx)) { throw new ObjectNotFoundException(Messages.format( "persist.objectNotFound", molder.getName(), identity)); } @@ -509,10 +510,10 @@ // if ( ! molder.getJavaClass( _db.getClassLoader() // ).isAssignableFrom( entry.object.getClass() ) ) if (!molder.getJavaClass(_db.getClassLoader()).isAssignableFrom( - objectInTransaction.getClass())) { + objectInTx.getClass())) { throw new PersistenceException(Messages.format( "persist.typeMismatch", molder.getName(), - objectInTransaction.getClass())); + objectInTx.getClass())); } // If the object has been created in this transaction, don't bother @@ -517,12 +518,12 @@ // If the object has been created in this transaction, don't bother // testing access mode. - if (_tracker.isCreated(objectInTransaction)) { - return objectInTransaction; + if (_tracker.isCreated(objectInTx)) { + return objectInTx; } if ((accessMode == AccessMode.Exclusive || accessMode == AccessMode.DbLocked) - && !_tracker.getOIDForObject(objectInTransaction) + && !_tracker.getOIDForObject(objectInTx) .isDbLock()) { // If we are in exclusive mode and object has not been // loaded in exclusive mode before, then we have a @@ -533,7 +534,7 @@ "persist.lockConflict", molder.getName(), identity)); } - return objectInTransaction; + return objectInTx; } // Load (or reload, in case the object is stored in a acache) the object @@ -542,7 +543,7 @@ // (or fail to grant), or report error with the persistence engine. try { if (proposedObject.getEntity() != null) { - objectInTransaction = proposedObject.getEntity(); + objectInTx = proposedObject.getEntity(); } else { // ssa, multi classloader feature // ssa, FIXME : No better way to do that ? @@ -548,20 +549,20 @@ // ssa, FIXME : No better way to do that ? // object = molder.newInstance(); if (_instanceFactory != null) { - objectInTransaction = _instanceFactory.newInstance(molder + objectInTx = _instanceFactory.newInstance(molder .getName(), _db.getClassLoader()); } else { - objectInTransaction = molder.newInstance(_db + objectInTx = molder.newInstance(_db .getClassLoader()); } - proposedObject.setProposedEntityClass(objectInTransaction.getClass()); - proposedObject.setActualEntityClass(objectInTransaction.getClass()); - proposedObject.setEntity(objectInTransaction); + proposedObject.setProposedEntityClass(objectInTx.getClass()); + proposedObject.setActualEntityClass(objectInTx.getClass()); + proposedObject.setEntity(objectInTx); } - molder.setIdentity(this, objectInTransaction, identity); - _tracker.trackObject(molder, oid, objectInTransaction); + molder.setIdentity(this, objectInTx, identity); + _tracker.trackObject(molder, oid, objectInTx); OID newoid = engine.load(this, oid, proposedObject, suggestedAccessMode, _lockTimeout, results); @@ -567,7 +568,7 @@ if (proposedObject.isExpanded()) { // Remove old OID from ObjectTracker - _tracker.untrackObject(objectInTransaction); + _tracker.untrackObject(objectInTx); // Create new OID ClassMolder actualClassMolder = engine.getClassMolder( @@ -596,33 +597,33 @@ engine.load(this, actualOID, proposedExpanded, suggestedAccessMode, _lockTimeout, results); - objectInTransaction = proposedExpanded.getEntity(); + objectInTx = proposedExpanded.getEntity(); } else { // rehash the object entry, because oid might have changed! - _tracker.trackOIDChange(objectInTransaction, engine, oid, newoid); + _tracker.trackOIDChange(objectInTx, engine, oid, newoid); } } catch (ClassCastException except) { - _tracker.untrackObject(objectInTransaction); + _tracker.untrackObject(objectInTx); throw except; } catch (ObjectNotFoundException except) { - _tracker.untrackObject(objectInTransaction); + _tracker.untrackObject(objectInTx); throw except; } catch (LockNotGrantedException except) { - _tracker.untrackObject(objectInTransaction); + _tracker.untrackObject(objectInTx); throw except; } catch (ClassNotPersistenceCapableException except) { - _tracker.untrackObject(objectInTransaction); + _tracker.untrackObject(objectInTx); throw new PersistenceException(Messages.format("persist.nested", except)); } catch (InstantiationException e) { - _tracker.untrackObject(objectInTransaction); + _tracker.untrackObject(objectInTx); throw new PersistenceException(e.getMessage(), e); } catch (IllegalAccessException e) { - _tracker.untrackObject(objectInTransaction); + _tracker.untrackObject(objectInTx); throw new PersistenceException(e.getMessage(), e); } catch (ClassNotFoundException e) { - _tracker.untrackObject(objectInTransaction); + _tracker.untrackObject(objectInTx); throw new PersistenceException(e.getMessage(), e); } @@ -633,14 +634,14 @@ // the object in this transaction. try { if (_callback != null) { - _callback.using(objectInTransaction, _db); - _callback.loaded(objectInTransaction, accessMode); + _callback.using(objectInTx, _db); + _callback.loaded(objectInTx, accessMode); } else if (molder.getCallback() != null) { - molder.getCallback().using(objectInTransaction, _db); - molder.getCallback().loaded(objectInTransaction, accessMode); + molder.getCallback().using(objectInTx, _db); + molder.getCallback().loaded(objectInTx, accessMode); } } catch (Exception except) { - release(objectInTransaction); + release(objectInTx); throw new PersistenceException(Messages.format("persist.nested", except)); } @@ -647,7 +648,7 @@ if (accessMode == AccessMode.ReadOnly) { // Mark it read-only. - _tracker.markReadOnly(objectInTransaction); + _tracker.markReadOnly(objectInTx); // Release the lock on this object. engine.releaseLock(this, oid); @@ -653,7 +654,7 @@ engine.releaseLock(this, oid); } - return objectInTransaction; + return objectInTx; } /** @@ -682,10 +683,6 @@ public final synchronized void markCreate( final ClassMolder molder, final Object object, final OID rootObjectOID) throws PersistenceException { - - OID oid; - Object identity; - if (object == null) { throw new PersistenceException( "Attempted to mark a null object as created."); @@ -694,7 +691,7 @@ LockEngine engine = molder.getLockEngine(); // Make sure the object has not beed persisted in this transaction. - identity = molder.getIdentity(this, object); + Complex identity = molder.getIdentity(this, object); // if autoStore is specified, we relieve user life a little bit here // so that if an object create automatically and user create it @@ -717,7 +714,7 @@ // Note that the oid which is created is for a dependent object; // this is not a change to the rootObjectOID, and therefore doesn't get // trackOIDChange()d. - oid = new OID(molder, rootObjectOID, identity); + OID oid = new OID(molder, rootObjectOID, identity); // You shouldn't be able to modify an object marked read-only in this // transaction. @@ -849,7 +846,7 @@ throw (PersistenceException) except; } else { throw new PersistenceException(Messages.format( - "persist.nested", except)); + "persist.nested", except), except); } } } @@ -866,9 +863,9 @@ Object toCacheUpdate = it.next(); if (_tracker.isCreated(toCacheUpdate)) { OID toCacheUpdateOID = _tracker.getOIDForObject(toCacheUpdate); - LockEngine toCacheUpdateLockEngine = _tracker.getMolderForObject(toCacheUpdate).getLockEngine(); - - toCacheUpdateLockEngine.updateCache(this, toCacheUpdateOID, toCacheUpdate); + LockEngine toCacheUpdateLocker = + _tracker.getMolderForObject(toCacheUpdate).getLockEngine(); + toCacheUpdateLocker.updateCache(this, toCacheUpdateOID, toCacheUpdate); _tracker.unmarkUpdateCacheNeeded(toCacheUpdate); } } @@ -883,22 +880,14 @@ public final boolean markUpdate( final ClassMolder molder, final Object object, final OID depended) throws PersistenceException { - - Object identity; - OID oid; - - if (object == null) { - throw new NullPointerException(); - } + if (object == null) { throw new NullPointerException(); } LockEngine engine = molder.getLockEngine(); - identity = molder.getActualIdentity(this, object); - if (molder.isDefaultIdentity(identity)) { - identity = null; - } + Complex identity = molder.getActualIdentity(this, object); + if (molder.isDefaultIdentity(identity)) { identity = null; } - oid = new OID(molder, depended, identity); + OID oid = new OID(molder, depended, identity); // Check the object is in the transaction. Object foundInTransaction = _tracker.getObjectForOID(engine, oid, false); @@ -910,8 +899,7 @@ if (foundInTransaction != null) { if (_tracker.isDeleted(foundInTransaction)) { throw new ObjectDeletedException(Messages.format( - "persist.objectDeleted", object.getClass(), - identity)); + "persist.objectDeleted", object.getClass(), identity)); } throw new DuplicateIdentityException( @@ -1200,7 +1188,8 @@ // consider for store. if ((!_tracker.isDeleted(object)) && (!_tracker.isCreating(object))) { - LockEngine engine = _tracker.getMolderForObject(object).getLockEngine(); + LockEngine engine = + _tracker.getMolderForObject(object).getLockEngine(); //_tracker.getMolderForObject(object); OID oid = _tracker.getOIDForObject(object); @@ -1601,7 +1590,7 @@ * java.lang.Object) */ public final synchronized void expireCache( - final ClassMolder molder, final Object identity) + final ClassMolder molder, final Complex identity) throws PersistenceException { OID oid; @@ -1639,7 +1628,7 @@ * java.lang.Class, java.lang.Object) */ public final boolean isCached(final ClassMolder molder, - final Class cls, final Object identity) + final Class cls, final Complex identity) throws PersistenceException { if (identity == null) { throw new PersistenceException("Identities can't be null!"); @@ -1673,7 +1662,7 @@ * @param lockEngine Current LcokEngine instance * @return True if the object in question is locked. */ - public final boolean isLocked(final Class cls, final Object identity, + public final boolean isLocked(final Class cls, final Complex identity, final LockEngine lockEngine) { OID oid = new OID(lockEngine.getClassMolder(cls), identity); return lockEngine.isLocked(cls, oid); Index: C:/Java/castor-2/src/main/java/org/castor/persist/ObjectTracker.java =================================================================== --- C:/Java/castor-2/src/main/java/org/castor/persist/ObjectTracker.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/castor/persist/ObjectTracker.java (working copy) @@ -32,6 +32,7 @@ import org.exolab.castor.persist.ClassMolder; import org.exolab.castor.persist.LockEngine; import org.exolab.castor.persist.OID; +import org.exolab.castor.persist.spi.Complex; /** * A transaction records all objects accessed during the lifetime @@ -516,7 +517,7 @@ // TODO [WG] We still might have an option for some serious optimization // here if the instance has not been materialized yet. - Object identity = cgObject.interceptedIdentity(); + Complex identity = cgObject.interceptedIdentity(); ClassMolder molder = cgObject.interceptedClassMolder(); LockEngine engine = molder.getLockEngine(); Index: C:/Java/castor-2/src/main/java/org/castor/persist/TransactionContext.java =================================================================== --- C:/Java/castor-2/src/main/java/org/castor/persist/TransactionContext.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/castor/persist/TransactionContext.java (working copy) @@ -15,6 +15,7 @@ import org.exolab.castor.persist.QueryResults; import org.exolab.castor.persist.TxSynchronizable; import org.exolab.castor.persist.spi.CallbackInterceptor; +import org.exolab.castor.persist.spi.Complex; import org.exolab.castor.persist.spi.InstanceFactory; import org.exolab.castor.persist.spi.PersistenceQuery; @@ -172,7 +173,7 @@ DbMetaInfo getConnectionInfo(final LockEngine engine) throws PersistenceException; Object fetch(final ClassMolder molder, - final Object identity, final AccessMode suggestedAccessMode) + final Complex identity, final AccessMode suggestedAccessMode) throws PersistenceException; /** @@ -203,7 +204,7 @@ * lock on object. The object was not found in persistent storage. An error * reported by the persistence engine. */ - Object load(final Object identity, + Object load(final Complex identity, final ProposedEntity proposedObject, final AccessMode suggestedAccessMode) throws PersistenceException; @@ -225,7 +226,7 @@ * lock on object. The object was not found in persistent storage. An error * reported by the persistence engine. */ - Object load(final Object identity, + Object load(final Complex identity, final ProposedEntity proposedObject, final AccessMode suggestedAccessMode, final QueryResults results) throws PersistenceException; @@ -505,7 +506,7 @@ */ boolean isReadOnly(final Object object); - boolean isCached(final ClassMolder molder, final Class cls, final Object identity) + boolean isCached(final ClassMolder molder, final Class cls, final Complex identity) throws PersistenceException; /** @@ -513,7 +514,6 @@ * read from persistent storage, as opposed to being read from the * cache, during subsequent load/query operations. * - * @param engine The persistence engine. * @param molder The class persistence molder. * @param identity The object's identity. * @throws PersistenceException If identity is null or any problem that happens @@ -519,7 +519,7 @@ * @throws PersistenceException If identity is null or any problem that happens * during expiration of cache values. */ - void expireCache(final ClassMolder molder, final Object identity) + void expireCache(final ClassMolder molder, final Complex identity) throws PersistenceException; /** @@ -540,5 +540,5 @@ * @param lockEngine Current LcokEngine instance * @return True if the object in question is locked. */ - boolean isLocked(Class cls, Object identity, LockEngine lockEngine); + boolean isLocked(Class cls, Complex identity, LockEngine lockEngine); } Index: C:/Java/castor-2/src/main/java/org/castor/persist/cache/CacheEntry.java =================================================================== --- C:/Java/castor-2/src/main/java/org/castor/persist/cache/CacheEntry.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/castor/persist/cache/CacheEntry.java (working copy) @@ -36,7 +36,7 @@ private OID _oid; /** Actual data to be cached. */ - private Object _entry; + private Object[] _entry; /** Associated time stamp. */ private long _timeStamp = TimeStampable.NO_TIMESTAMP; @@ -83,7 +83,7 @@ * * @return Actual data to be cached. */ - public Object getEntry() { + public Object[] getEntry() { return _entry; } @@ -92,7 +92,7 @@ * * @param entry Actual data to be cached. */ - public void setEntry(final Object entry) { + public void setEntry(final Object[] entry) { _entry = entry; } Index: C:/Java/castor-2/src/main/java/org/castor/persist/proxy/CollectionProxy.java =================================================================== --- C:/Java/castor-2/src/main/java/org/castor/persist/proxy/CollectionProxy.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/castor/persist/proxy/CollectionProxy.java (working copy) @@ -36,6 +36,7 @@ import org.apache.commons.logging.LogFactory; import org.castor.jdo.util.ClassLoadingUtils; import org.exolab.castor.persist.FieldMolder; +import org.exolab.castor.persist.spi.Complex; /** * This class is a proxy for different types of Collection and Maps. @@ -46,7 +47,7 @@ public abstract Object getCollection(); - public abstract void add(Object key, Object value); + public abstract void add(Complex key, Object value); public abstract void close(); @@ -56,11 +57,9 @@ if (cls == Vector.class) { return new ColProxy(fieldMolder, object, classLoader, new Vector()); } else if (cls == ArrayList.class) { - return new ColProxy(fieldMolder, object, classLoader, - new ArrayList()); + return new ColProxy(fieldMolder, object, classLoader, new ArrayList()); } else if (cls == Collection.class) { - return new ColProxy(fieldMolder, object, classLoader, - new ArrayList()); + return new ColProxy(fieldMolder, object, classLoader, new ArrayList()); } else if (cls == Set.class) { return new ColProxy(fieldMolder, object, classLoader, new HashSet()); } else if (cls == HashSet.class) { @@ -66,8 +65,7 @@ } else if (cls == HashSet.class) { return new ColProxy(fieldMolder, object, classLoader, new HashSet()); } else if (cls == Hashtable.class) { - return new MapProxy(fieldMolder, object, classLoader, - new Hashtable()); + return new MapProxy(fieldMolder, object, classLoader, new Hashtable()); } else if (cls == HashMap.class) { return new MapProxy(fieldMolder, object, classLoader, new HashMap()); } else if (cls == Iterator.class) { @@ -73,7 +71,8 @@ } else if (cls == Iterator.class) { return new IteratorProxy(fieldMolder, object, classLoader, new ArrayList()); } else if (cls == Enumeration.class) { - return new EnumerationProxy(fieldMolder, object, classLoader, new ArrayList()); + return new EnumerationProxy(fieldMolder, object, classLoader, + new ArrayList()); } else if (cls == Map.class) { return new MapProxy(fieldMolder, object, classLoader, new HashMap()); } else if (cls == SortedSet.class) { @@ -81,8 +80,7 @@ if (comparatorClassName != null) { Comparator comparator; try { - comparator = (Comparator) - ClassLoadingUtils.loadClass(classLoader, comparatorClassName).newInstance(); + comparator = (Comparator) ClassLoadingUtils.loadClass(classLoader, comparatorClassName).newInstance(); } catch (InstantiationException e) { LOG.error ("Problem instantiating instance of " + comparatorClassName); throw new IllegalArgumentException("Problem instantiating instance of " + comparatorClassName); @@ -124,7 +122,7 @@ return _col; } - public void add(final Object key, final Object value) { + public void add(final Complex key, final Object value) { if (!_fm.isAddable()) { // [TODO] Find a better way to express this scenario where no // setter is specified either. @@ -163,7 +161,7 @@ return Collections.enumeration(_collection); } - public void add(final Object key, final Object value) { + public void add(final Complex key, final Object value) { if (!_fm.isAddable()) { // [TODO] Find a better way to express this scenario where no // setter is specified either. @@ -202,7 +200,7 @@ return _collection.iterator(); } - public void add(final Object key, final Object value) { + public void add(final Complex key, final Object value) { if (!_fieldMolder.isAddable()) { // [TODO] Find a better way to express this scenario where no // setter is specified either. @@ -240,8 +238,12 @@ return _map; } - public void add(final Object key, final Object value) { - _map.put(key, value); + public void add(final Complex key, final Object value) { + if (key.size() == 1) { + _map.put(key.get(0), value); + } else { + _map.put(key, value); + } } public void close() { Index: C:/Java/castor-2/src/main/java/org/castor/persist/proxy/LazyCGLIB.java =================================================================== --- C:/Java/castor-2/src/main/java/org/castor/persist/proxy/LazyCGLIB.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/castor/persist/proxy/LazyCGLIB.java (working copy) @@ -48,6 +48,7 @@ import java.io.Serializable; import org.exolab.castor.persist.ClassMolder; +import org.exolab.castor.persist.spi.Complex; /** * Lazy is a place holder interface to indicate that a data object or @@ -82,7 +83,7 @@ * Returns the identity of the object (class) intercepted. * @return identity of the object (class) intercepted. */ - Object interceptedIdentity(); + Complex interceptedIdentity(); /** * Returns the ClassMolder of the object intercepted. Index: C:/Java/castor-2/src/main/java/org/castor/persist/proxy/RelationCollection.java =================================================================== --- C:/Java/castor-2/src/main/java/org/castor/persist/proxy/RelationCollection.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/castor/persist/proxy/RelationCollection.java (working copy) @@ -34,6 +34,7 @@ import org.exolab.castor.persist.Lazy; import org.exolab.castor.persist.OID; import org.exolab.castor.persist.TxSynchronizable; +import org.exolab.castor.persist.spi.Complex; import org.exolab.castor.jdo.LockNotGrantedException; import org.exolab.castor.jdo.PersistenceException; @@ -79,7 +80,6 @@ * Creates an instance of RelationCollection * @param tx Current transaction context * @param enclosing Enclosing OID - * @param engine Associated LockEngine * @param molder Associated ClassMolder * @param amode Access mode * @param ids Set of identifiers. @@ -98,7 +98,7 @@ public boolean add(final Object o) { - Object id = _molder.getIdentity(_tx, o); + Complex id = _molder.getIdentity(_tx, o); // boolean changed = false; if (_ids.contains(id)) { if (_deleted.contains(id)) { @@ -146,11 +146,11 @@ } public boolean contains(final Object o) { - Object ids = _molder.getIdentity(_tx, o); - if (_added.contains(ids)) { + Complex id = _molder.getIdentity(_tx, o); + if (_added.contains(id)) { return true; } - if (_ids.contains(ids) && !_deleted.contains(ids)) { + if (_ids.contains(id) && !_deleted.contains(id)) { return true; } return false; @@ -193,6 +193,7 @@ // _ids and thus are not iterated over. _iterationsize = _parent._added.size() + _parent._ids.size(); } + public boolean hasNext() { if (_changestamp != _parent._changecount) { throw new ConcurrentModificationException( @@ -202,7 +203,7 @@ if (_cursor >= _added.size()) { // skip deleted ids while ((_cursor < _iterationsize) - && isSkipped(_ids.get(_cursor - _added.size()))) { + && isSkipped((Complex) _ids.get(_cursor - _added.size()))) { _cursor++; } } @@ -212,6 +213,7 @@ } return true; } + public Object next() { if (_changestamp != _parent._changecount) { throw new ConcurrentModificationException( @@ -224,10 +226,10 @@ "Read after the end of iterator!"); } - Object id; + Complex id; Object o; if (_cursor < _added.size()) { - id = _added.get(_cursor++); + id = (Complex) _added.get(_cursor++); o = _loaded.get(id); if (o != null) { return o; @@ -235,7 +237,7 @@ return lazyLoad(id); } // the deleted ids were skipped by hasNext(), get is safe - id = _ids.get(_cursor++ - _added.size()); + id = (Complex) _ids.get(_cursor++ - _added.size()); o = _loaded.get(id); if (o != null) { @@ -243,10 +245,9 @@ } return lazyLoad(id); } - private boolean isSkipped(final Object id) { - if (_deleted.contains(id)) { - return true; - } + + private boolean isSkipped(final Complex id) { + if (_deleted.contains(id)) { return true; } // make sure the object is not deleted in // the current transaction outside this class OID oid = new OID(_parent._molder, id); @@ -252,7 +253,8 @@ OID oid = new OID(_parent._molder, id); return _parent._tx.isDeletedByOID(oid); } - private Object lazyLoad(final Object ids) { + + private Object lazyLoad(final Complex ids) { Object o; if (!_tx.isOpen()) { @@ -323,7 +325,7 @@ } public boolean remove(final Object o) { - Object id = _molder.getIdentity(_tx, o); + Complex id = _molder.getIdentity(_tx, o); if (_deleted.contains(id)) { return false; Index: C:/Java/castor-2/src/main/java/org/castor/persist/proxy/SingleProxy.java =================================================================== --- C:/Java/castor-2/src/main/java/org/castor/persist/proxy/SingleProxy.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/castor/persist/proxy/SingleProxy.java (working copy) @@ -29,6 +29,7 @@ import org.exolab.castor.jdo.PersistenceException; import org.exolab.castor.mapping.AccessMode; import org.exolab.castor.persist.ClassMolder; +import org.exolab.castor.persist.spi.Complex; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; @@ -38,7 +39,7 @@ /** SerialVersionUID */ private static final long serialVersionUID = -1498354553937679053L; - private static Log _log = LogFactory.getFactory().getInstance(SingleProxy.class); + private static final Log LOG = LogFactory.getLog(SingleProxy.class); private TransactionContext _tx; private ClassMolder _classMolder; @@ -43,7 +44,7 @@ private TransactionContext _tx; private ClassMolder _classMolder; private Class _clazz; - private Object _identity; + private Complex _identity; private Object _object; private AccessMode _accessMode; @@ -52,7 +53,6 @@ /** * Creates an instance of SingleProxy. * @param tx Actual TransactionContext. - * @param engine Associated LockEngine * @param classMolder Associated ClassMolder. * @param clazz Associated Class instance. * @param identity Identity object. @@ -62,7 +62,7 @@ private SingleProxy(final TransactionContext tx, final ClassMolder classMolder, final Class clazz, - final Object identity, + final Complex identity, final Object object, final AccessMode accessMode) { _tx = tx; @@ -72,9 +72,9 @@ _object = object; _accessMode = accessMode; - if (_log.isDebugEnabled()) { - _log.debug("Created new SingleProxy for an instance of '" + classMolder.getName() - + "' with id '" + identity + "'"); + if (LOG.isDebugEnabled()) { + LOG.debug("Created new SingleProxy for an instance of '" + + classMolder.getName() + "' with id '" + identity + "'"); } } @@ -81,7 +81,6 @@ /** * Factory method to create SingleProxy instance. * @param tx Actual TransactionContext. - * @param engine Associated LockEngine * @param classMolder Associated ClassMolder. * @param identity Identity object. * @param object Object to be lazy-loaded. @@ -91,7 +90,7 @@ */ public static synchronized Object getProxy(final TransactionContext tx, final ClassMolder classMolder, - final Object identity, final Object object, + final Complex identity, final Object object, final AccessMode accessMode) throws ObjectNotFoundException { try { @@ -100,7 +99,7 @@ identity, object, accessMode); return Enhancer.create(clazz, new Class[] {LazyCGLIB.class}, sp); } catch (Throwable ex) { - if (_log.isErrorEnabled()) { + if (LOG.isErrorEnabled()) { String msg = "error on enhance class"; if (classMolder != null) { msg += " " + classMolder.getName(); @@ -105,7 +104,7 @@ if (classMolder != null) { msg += " " + classMolder.getName(); } - _log.error(msg, ex); + LOG.error(msg, ex); } throw new ObjectNotFoundException("lazy loading error - " + ex.getMessage(), ex); @@ -126,8 +125,8 @@ // to not load if method geClass() or finalize() if ("writeReplace".equals(methodName)) { - if (_log.isDebugEnabled()) { - _log.debug("writeReplacing " + _classMolder.getName() + if (LOG.isDebugEnabled()) { + LOG.debug("writeReplacing " + _classMolder.getName() + " with identity " + _identity); } if (!_hasMaterialized) { @@ -134,23 +133,19 @@ try { _object = loadOnly(); } catch (ObjectNotFoundException e) { - _log.error("Object with identity " + _identity - + " does not exist", e); - throw new NotSerializableException("Object with identity " - + _identity + " does not exist"); + String msg = "Object with identity " + _identity + " does not exist"; + LOG.error(msg, e); + throw new NotSerializableException(msg); } catch (PersistenceException e) { - _log.error("Problem serializing object with identity " - + _identity, e); - throw new NotSerializableException( - "Problem serializing object with identity " - + _identity); + String msg = "Problem serializing object with identity " + _identity; + LOG.error(msg, e); + throw new NotSerializableException(msg); } } - if (_log.isDebugEnabled()) { - _log.debug("Serializing instance of " - + _object.getClass().getName()); - _log.debug("_object = " + _object); + if (LOG.isDebugEnabled()) { + LOG.debug("Serializing instance of " + _object.getClass().getName()); + LOG.debug("_object = " + _object); } return _object; } else if ("interceptedClass".equals(methodName)) { @@ -161,8 +156,6 @@ return _identity; } else if ("interceptedClassMolder".equals(methodName)) { return _classMolder; - } else if ("interceptedIdentity".equals(methodName)) { - return _identity; } else if ("getClass".equals(methodName)) { return method.invoke(obj, args); } else if ("finalize".equals(methodName)) { @@ -167,39 +160,13 @@ return method.invoke(obj, args); } else if ("finalize".equals(methodName)) { return method.invoke(obj, args); - } else if ("getId".equals(methodName)) { - if (!_hasMaterialized) { - return _identity; - } } // load object, if not previous loaded - if (_object == null) { - _object = load(obj); - } - // try { - // if ( _log.isDebugEnabled() && _classMolder != null ) { - // _log.debug("load object " + _classMolder.getName() + " with id " + - // _identity); - // } - // _object = _tx.load(_engine, _classMolder, _identity, _object, - // _accessMode); - // hasMaterialized = true; - // } catch (ObjectNotFoundException ex) { - // if ( _log.isDebugEnabled() ) { - // _log.debug("object not found -> " + ex.toString()); - // } - // // if a ObjectNotFoundException occur then create a empty instance - // if ( obj instanceof net.sf.cglib.proxy.Factory ) { - // _object = obj.getClass().getSuperclass().newInstance(); - // } - // } - // } + if (_object == null) { _object = load(obj); } // object found? - if (_object == null) { - return null; - } + if (_object == null) { return null; } // invoke original method in loaded object return method.invoke(_object, args); @@ -213,8 +180,8 @@ */ private Object loadOnly() throws PersistenceException { Object instance = null; - if (_log.isDebugEnabled() && _classMolder != null) { - _log.debug("load object " + _classMolder.getName() + " with id " + if (LOG.isDebugEnabled() && _classMolder != null) { + LOG.debug("load object " + _classMolder.getName() + " with id " + _identity); } ProposedEntity proposedValue = new ProposedEntity(_classMolder); @@ -231,8 +198,8 @@ try { instance = loadOnly(); } catch (ObjectNotFoundException ex) { - if (_log.isDebugEnabled()) { - _log.debug("object not found -> " + ex.toString()); + if (LOG.isDebugEnabled()) { + LOG.debug("object not found -> " + ex.toString()); } // if a ObjectNotFoundException occur then create a empty instance if (proxiedObject instanceof net.sf.cglib.proxy.Factory) { @@ -242,5 +209,4 @@ } return instance; } - } Index: C:/Java/castor-2/src/main/java/org/castor/persist/resolver/ManyRelationResolver.java =================================================================== --- C:/Java/castor-2/src/main/java/org/castor/persist/resolver/ManyRelationResolver.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/castor/persist/resolver/ManyRelationResolver.java (working copy) @@ -33,6 +33,7 @@ import org.exolab.castor.persist.FieldMolder; import org.exolab.castor.persist.Lazy; import org.exolab.castor.persist.OID; +import org.exolab.castor.persist.spi.Complex; /** * Implementation of {@link org.castor.persist.resolver.ResolverStrategy} for many relations. This class carries @@ -168,7 +169,7 @@ .newInstance(collectionType.getComponentType(), v .size()); for (int j = 0, l = v.size(); j < l; j++) { - arrayValue[j] = tx.fetch(fieldClassMolder, v.get(j), null); + arrayValue[j] = tx.fetch(fieldClassMolder, (Complex) v.get(j), null); } _fieldMolder.setValue(object, arrayValue, tx .getClassLoader()); @@ -180,9 +181,9 @@ .getClassLoader()); for (int j = 0, l = v.size(); j < l; j++) { - Object obj = tx.fetch(fieldClassMolder, v.get(j), null); + Object obj = tx.fetch(fieldClassMolder, (Complex) v.get(j), null); if (obj != null) { - cp.add(v.get(j), obj); + cp.add((Complex) v.get(j), obj); } } cp.close(); @@ -214,7 +215,7 @@ ArrayList v = (ArrayList) field; if (v != null) { for (int j = 0, l = v.size(); j < l; j++) { - tx.expireCache(fieldClassMolder, v.get(j)); + tx.expireCache(fieldClassMolder, (Complex) v.get(j)); } } } @@ -241,11 +242,10 @@ Class collectionType = _fieldMolder.getCollectionType(); if (collectionType.isArray()) { Object[] value = (Object[]) java.lang.reflect.Array - .newInstance(collectionType.getComponentType(), v - .size()); + .newInstance(collectionType.getComponentType(), v.size()); for (int j = 0, l = v.size(); j < l; j++) { ProposedEntity proposedValue = new ProposedEntity(fieldClassMolder); - value[j] = tx.load(v.get(j), proposedValue, suggestedAccessMode); + value[j] = tx.load((Complex) v.get(j), proposedValue, suggestedAccessMode); } _fieldMolder.setValue(proposedObject.getEntity(), value, tx .getClassLoader()); @@ -254,7 +254,7 @@ proposedObject.getEntity(), tx.getClassLoader()); for (int j = 0, l = v.size(); j < l; j++) { ProposedEntity proposedValue = new ProposedEntity(fieldClassMolder); - cp.add(v.get(j), tx.load(v.get(j), proposedValue, suggestedAccessMode)); + cp.add((Complex) v.get(j), tx.load((Complex) v.get(j), proposedValue, suggestedAccessMode)); } cp.close(); } @@ -279,7 +279,7 @@ */ public abstract Object postCreate(final TransactionContext tx, final OID oid, final Object object, final Object field, - final Object createdId) + final Complex createdId) throws PersistenceException; /* (non-Javadoc) Index: C:/Java/castor-2/src/main/java/org/castor/persist/resolver/ManyToManyRelationResolver.java =================================================================== --- C:/Java/castor-2/src/main/java/org/castor/persist/resolver/ManyToManyRelationResolver.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/castor/persist/resolver/ManyToManyRelationResolver.java (working copy) @@ -32,6 +32,7 @@ import org.exolab.castor.persist.FieldMolder; import org.exolab.castor.persist.Lazy; import org.exolab.castor.persist.OID; +import org.exolab.castor.persist.spi.Complex; /** * Implementation of {@link org.castor.persist.resolver.ResolverStrategy} for M:N relations. @@ -105,7 +106,7 @@ if (field != null) { ArrayList alist = (ArrayList) field; for (int j = 0; j < alist.size(); j++) { - Object fid = alist.get(j); + Complex fid = (Complex) alist.get(j); Object fetched = null; if (fid != null) { fetched = tx.fetch(fieldClassMolder, fid, null); @@ -153,12 +154,12 @@ flags.setUpdateCache(true); } while (removedItor.hasNext()) { - Object id = removedItor.next(); // must be loaded thur transaction, so that the related object // is properly locked and updated before we delete it. - if (!tx.isDeletedByOID(new OID(fieldClassMolder, id))) { + Complex identity = (Complex) removedItor.next(); + if (!tx.isDeletedByOID(new OID(fieldClassMolder, identity))) { ProposedEntity proposedValue = new ProposedEntity(fieldClassMolder); - Object reldel = tx.load(id, proposedValue, null); + Object reldel = tx.load(identity, proposedValue, null); if (reldel != null && tx.isPersistent(reldel)) { tx.writeLock(reldel, tx.getLockTimeout()); @@ -164,10 +165,9 @@ _fieldMolder.getRelationLoader().deleteRelation( tx.getConnection(oid.getMolder().getLockEngine()), - oid.getIdentity(), id); + oid.getIdentity(), identity); - fieldClassMolder.removeRelation(tx, reldel, - this._classMolder, object); + fieldClassMolder.removeRelation(tx, reldel, _classMolder, object); } } } @@ -218,7 +218,7 @@ Iterator itor = deleted.iterator(); while (itor.hasNext()) { flags.setUpdateCache(true); - Object deletedId = itor.next(); + Complex deletedId = (Complex) itor.next(); Object toBeDeleted = lazy.find(deletedId); if (toBeDeleted != null) { if (tx.isPersistent(toBeDeleted)) { @@ -246,7 +246,7 @@ Iterator itor = added.iterator(); while (itor.hasNext()) { - Object addedId = itor.next(); + Complex addedId = (Complex) itor.next(); Object toBeAdded = lazy.find(addedId); if (toBeAdded != null) { if (tx.isPersistent(toBeAdded)) { @@ -279,27 +279,20 @@ final Object object, final AccessMode suggestedAccessMode, final Object field) throws PersistenceException { + ArrayList v = (ArrayList) field; ClassMolder fieldClassMolder = _fieldMolder.getFieldClassMolder(); if (tx.isAutoStore()) { - Iterator itor = ClassMolderHelper.getIterator(_fieldMolder - .getValue(object, tx.getClassLoader())); - ArrayList v = (ArrayList) field; ArrayList newSetOfIds = new ArrayList(); // iterate the collection of this data object field + Iterator itor = ClassMolderHelper.getIterator(_fieldMolder + .getValue(object, tx.getClassLoader())); while (itor.hasNext()) { Object element = itor.next(); - Object actualIdentity = fieldClassMolder.getActualIdentity(tx, - element); + Object actualIdentity = fieldClassMolder.getActualIdentity(tx, element); newSetOfIds.add(actualIdentity); - if (v != null && v.contains(actualIdentity)) { - if (!tx.isRecorded(element)) { - tx.markUpdate(fieldClassMolder, element, null); - } - } else { - if (!tx.isRecorded(element)) { - tx.markUpdate(fieldClassMolder, element, null); - } + if (!tx.isRecorded(element)) { + tx.markUpdate(fieldClassMolder, element, null); } } // load all old objects for comparison in the preStore state @@ -310,7 +303,7 @@ // modification // check at commit time. ProposedEntity proposedValue = new ProposedEntity(fieldClassMolder); - tx.load(v.get(j), proposedValue, suggestedAccessMode); + tx.load((Complex) v.get(j), proposedValue, suggestedAccessMode); } } } @@ -325,7 +318,7 @@ * java.lang.Object) */ public Object postCreate(final TransactionContext tx, final OID oid, - final Object object, final Object field, final Object createdId) + final Object object, final Object field, final Complex createdId) throws PersistenceException { ClassMolder fieldClassMolder = _fieldMolder.getFieldClassMolder(); Object o = _fieldMolder.getValue(object, tx.getClassLoader()); @@ -331,8 +324,7 @@ Object o = _fieldMolder.getValue(object, tx.getClassLoader()); Object result = field; if (o != null) { - ArrayList fids = ClassMolderHelper.extractIdentityList(tx, - fieldClassMolder, o); + ArrayList fids = ClassMolderHelper.extractIdentityList(tx, fieldClassMolder, o); result = fids; Iterator itor = ClassMolderHelper.getIterator(o); while (itor.hasNext()) { Index: C:/Java/castor-2/src/main/java/org/castor/persist/resolver/OneToManyRelationResolver.java =================================================================== --- C:/Java/castor-2/src/main/java/org/castor/persist/resolver/OneToManyRelationResolver.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/castor/persist/resolver/OneToManyRelationResolver.java (working copy) @@ -32,6 +32,7 @@ import org.exolab.castor.persist.FieldMolder; import org.exolab.castor.persist.Lazy; import org.exolab.castor.persist.OID; +import org.exolab.castor.persist.spi.Complex; /** * @author Werner Guttmann @@ -116,7 +117,7 @@ ArrayList alist = (ArrayList) field; if (field != null) { for (int j = 0; j < alist.size(); j++) { - Object fid = alist.get(j); + Complex fid = (Complex) alist.get(j); Object fetched = null; if (fid != null) { fetched = tx.fetch(fieldClassMolder, fid, null); @@ -139,7 +140,7 @@ if (field != null) { ArrayList alist = (ArrayList) field; for (int j = 0; j < alist.size(); j++) { - Object fid = alist.get(j); + Complex fid = (Complex) alist.get(j); Object fetched = null; if (fid != null) { fetched = tx.fetch(fieldClassMolder, fid, null); @@ -187,7 +188,7 @@ flags.setUpdateCache(true); } while (removedItor.hasNext()) { - Object removedId = removedItor.next(); + Complex removedId = (Complex) removedItor.next(); Object reldel = tx.fetch(fieldClassMolder, removedId, null); if (reldel != null) { if (_fieldMolder.isDependent()) { @@ -310,78 +311,37 @@ final Object object, final AccessMode suggestedAccessMode, final Object field) throws PersistenceException { + ArrayList v = (ArrayList) field; ClassMolder fieldClassMolder = _fieldMolder.getFieldClassMolder(); - if (_fieldMolder.isDependent()) { - if (!_fieldMolder.isLazy()) { - Iterator itor = ClassMolderHelper.getIterator(_fieldMolder - .getValue(object, tx.getClassLoader())); - ArrayList v = (ArrayList) field; - ArrayList newSetOfIds = new ArrayList(); + ArrayList newSetOfIds = new ArrayList(); + Iterator itor = ClassMolderHelper.getIterator(_fieldMolder + .getValue(object, tx.getClassLoader())); - // iterate the collection of this data object field - while (itor.hasNext()) { - Object element = itor.next(); - Object actualIdentity = fieldClassMolder.getActualIdentity( - tx, element); - newSetOfIds.add(actualIdentity); + // iterate the collection of this data object field + while (itor.hasNext()) { + Object element = itor.next(); + Object actualIdentity = fieldClassMolder.getActualIdentity(tx, element); + newSetOfIds.add(actualIdentity); + if (!tx.isRecorded(element)) { + if (_fieldMolder.isDependent() && !_fieldMolder.isLazy()) { if (v != null && v.contains(actualIdentity)) { - if (!tx.isRecorded(element)) { - tx.markUpdate(fieldClassMolder, element, oid); - } -// } else { -// // if ( !tx.isRecorded( element ) ) tx.markCreate( -// // fieldEngine, fieldClassMolder, element, oid ); - } - } - if (v != null) { - for (int j = 0, l = v.size(); j < l; j++) { - if (!newSetOfIds.contains(v.get(j))) { - // load all the dependent object in cache for - // modification - // check at commit time. - ProposedEntity proposedValue = new ProposedEntity(fieldClassMolder); - tx.load(v.get(j), proposedValue, suggestedAccessMode); - } + tx.markUpdate(fieldClassMolder, element, oid); } + } else if (tx.isAutoStore()) { + tx.markUpdate(fieldClassMolder, element, null); } - } else { - // ArrayList avlist = (ArrayList) fields[i]; - fieldClassMolder = _fieldMolder.getFieldClassMolder(); - // RelationCollection relcol = new RelationCollection( tx, oid, - // fieldEngine, fieldClassMolder, accessMode, avlist ); } - } else if (tx.isAutoStore()) { - Iterator itor = ClassMolderHelper.getIterator(_fieldMolder - .getValue(object, tx.getClassLoader())); - ArrayList v = (ArrayList) field; - ArrayList newSetOfIds = new ArrayList(); + } - // iterate the collection of this data object field - while (itor.hasNext()) { - Object element = itor.next(); - Object actualIdentity = fieldClassMolder.getActualIdentity(tx, - element); - newSetOfIds.add(actualIdentity); - if (v != null && v.contains(actualIdentity)) { - if (!tx.isRecorded(element)) { - tx.markUpdate(fieldClassMolder, element, null); - } - } else { - if (!tx.isRecorded(element)) { - tx.markUpdate(fieldClassMolder, element, null); - } - } - } - // load all old objects for comparison in the preStore state - if (v != null) { - for (int j = 0, l = v.size(); j < l; j++) { - if (!newSetOfIds.contains(v.get(j))) { - // load all the dependent object in cache for - // modification - // check at commit time. - ProposedEntity proposedValue = new ProposedEntity(fieldClassMolder); - tx.load(v.get(j), proposedValue, suggestedAccessMode); - } + // load all old objects for comparison in the preStore state + if (v != null) { + for (int j = 0, l = v.size(); j < l; j++) { + if (!newSetOfIds.contains(v.get(j))) { + // load all the dependent object in cache for + // modification + // check at commit time. + ProposedEntity proposedValue = new ProposedEntity(fieldClassMolder); + tx.load((Complex) v.get(j), proposedValue, suggestedAccessMode); } } } @@ -396,7 +356,7 @@ */ public Object postCreate(final TransactionContext tx, final OID oid, final Object object, final Object field, - final Object createdId) { + final Complex createdId) { return field; } Index: C:/Java/castor-2/src/main/java/org/castor/persist/resolver/PersistanceCapableRelationResolver.java =================================================================== --- C:/Java/castor-2/src/main/java/org/castor/persist/resolver/PersistanceCapableRelationResolver.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/castor/persist/resolver/PersistanceCapableRelationResolver.java (working copy) @@ -33,6 +33,7 @@ import org.exolab.castor.persist.ClassMolderHelper; import org.exolab.castor.persist.FieldMolder; import org.exolab.castor.persist.OID; +import org.exolab.castor.persist.spi.Complex; /** * Implementation of {@link org.castor.persist.resolver.ResolverStrategy} for 1:1 relations @@ -146,10 +147,11 @@ ClassMolder fieldClassMolder = _fieldMolder.getFieldClassMolder(); Object value = _fieldMolder.getValue(object, tx.getClassLoader()); - Object newField = null; + Complex curIdentity = (Complex) field; + Complex newIdentity = null; if (value != null) { - newField = fieldClassMolder.getIdentity(tx, value); - flags.setNewField(newField); + newIdentity = fieldClassMolder.getIdentity(tx, value); + flags.setNewField(newIdentity); } // | yip: don't delete the following comment, @@ -177,8 +179,7 @@ // if old is not null // removeRelation // if new is not null - if (ClassMolderHelper.isEquals(field, newField)) { - + if (ClassMolderHelper.isEquals(curIdentity, newIdentity)) { /* * Let's deal with a situation where there's no dependent object (field == null), * a 'new' dependent object has been set (value != null), but as we are using a key @@ -196,7 +197,7 @@ //TODO [WG]: can anybody please explain to me the meaning of the next two lines. if (!_debug) { return flags; } - if (field == null) { return flags; } // do the next field if both are null + if (curIdentity == null) { return flags; } // do the next field if both are null if ((value != null) && tx.isDeleted(value)) { LOG.warn ("Deleted object found!"); @@ -209,7 +210,7 @@ } if (tx.isAutoStore() || _fieldMolder.isDependent()) { - if (value != tx.fetch(fieldClassMolder, field, null)) { + if (value != tx.fetch(fieldClassMolder, curIdentity, null)) { throw new DuplicateIdentityException(""); } } @@ -220,8 +221,8 @@ flags.setUpdateCache(true); if (_fieldMolder.isDependent()) { - if (field != null) { - Object reldel = tx.fetch(fieldClassMolder, field, null); + if (curIdentity != null) { + Object reldel = tx.fetch(fieldClassMolder, curIdentity, null); if (reldel != null) { tx.delete(reldel); } @@ -232,10 +233,10 @@ } } else if (tx.isAutoStore()) { - if (field != null) { - Object deref = tx.fetch(fieldClassMolder, field, null); + if (curIdentity != null) { + Object deref = tx.fetch(fieldClassMolder, curIdentity, null); if (deref != null) { - fieldClassMolder.removeRelation(tx, deref, this._classMolder, object); + fieldClassMolder.removeRelation(tx, deref, _classMolder, object); } } @@ -243,10 +244,10 @@ tx.markCreate(fieldClassMolder, value, null); } } else { - if (field != null) { - Object deref = tx.fetch(fieldClassMolder, field, null); + if (curIdentity != null) { + Object deref = tx.fetch(fieldClassMolder, curIdentity, null); if (deref != null) { - fieldClassMolder.removeRelation(tx, deref, this._classMolder, object); + fieldClassMolder.removeRelation(tx, deref, _classMolder, object); } } @@ -284,6 +285,8 @@ */ public void update(final TransactionContext tx, final OID oid, final Object object, final AccessMode suggestedAccessMode, final Object field) throws PersistenceException { + Complex nfield = (Complex) field; + ClassMolder fieldClassMolder = _fieldMolder.getFieldClassMolder(); Object o = _fieldMolder.getValue(object, tx.getClassLoader()); if (_fieldMolder.isDependent()) { @@ -296,9 +299,9 @@ // load the cached dependent object from the data store. // The loaded will be compared with the new one - if (field != null) { + if (nfield != null) { ProposedEntity proposedValue = new ProposedEntity(fieldClassMolder); - tx.load(field, proposedValue, suggestedAccessMode); + tx.load(nfield, proposedValue, suggestedAccessMode); } } else if (tx.isAutoStore()) { if ((o != null) && !tx.isRecorded(o)) { @@ -305,9 +308,9 @@ tx.markUpdate(fieldClassMolder, o, null); } - if (field != null) { + if (nfield != null) { ProposedEntity proposedValue = new ProposedEntity(fieldClassMolder); - tx.load(field, proposedValue, suggestedAccessMode); + tx.load(nfield, proposedValue, suggestedAccessMode); } } } @@ -327,11 +330,7 @@ fid = fieldClassMolder.getActualIdentity(tx, value); } } - if (fid != null) { - field = fid; - } - } else { - field = null; + if (fid != null) { field = fid; } } return field; } @@ -341,33 +340,27 @@ */ public void markDelete(final TransactionContext tx, final Object object, final Object field) throws PersistenceException { - // persistanceCapable include many_to_one - ClassMolder fieldClassMolder = _fieldMolder.getFieldClassMolder(); - if (_fieldMolder.isDependent()) { - Object fid = field; - Object fetched = null; - if (fid != null) { - fetched = tx.fetch(fieldClassMolder, fid, null); - if (fetched != null) { - tx.delete(fetched); - } - } - - Object fobject = _fieldMolder.getValue(object, tx.getClassLoader()); - if ((fobject != null) && tx.isPersistent(fobject)) { - tx.delete(fobject); + // persistanceCapable include many_to_one + ClassMolder fieldClassMolder = _fieldMolder.getFieldClassMolder(); + Complex identity = (Complex) field; + if (identity != null) { + Object fetched = tx.fetch(fieldClassMolder, identity, null); + if (fetched != null) { + if (_fieldMolder.isDependent()) { + tx.delete(fetched); + } else { + // delete the object from the other side of the relation + fieldClassMolder.removeRelation(tx, fetched, _classMolder, object); } - } else { - // delete the object from the other side of the relation - Object fid = field; - Object fetched = null; - if (fid != null) { - fetched = tx.fetch(fieldClassMolder, field, null); - if (fetched != null) { - fieldClassMolder.removeRelation(tx, fetched, this._classMolder, object); - } - } + } + } + + if (_fieldMolder.isDependent()) { + Object fobject = _fieldMolder.getValue(object, tx.getClassLoader()); + if ((fobject != null) && tx.isPersistent(fobject)) { + tx.delete(fobject); } + } } /* (non-Javadoc) @@ -376,11 +369,8 @@ public void revertObject(final TransactionContext tx, final OID oid, final Object object, final Object field) throws PersistenceException { ClassMolder fieldClassMolder = _fieldMolder.getFieldClassMolder(); - - Object value; - if (field != null) { - value = tx.fetch(fieldClassMolder, field, null); + Object value = tx.fetch(fieldClassMolder, (Complex) field, null); _fieldMolder.setValue(object, value, tx.getClassLoader()); } else { _fieldMolder.setValue(object, null, tx.getClassLoader()); @@ -398,7 +388,7 @@ if (field != null) { // use the corresponding Persistent fields as the identity - tx.expireCache(fieldClassMolder, field); + tx.expireCache(fieldClassMolder, (Complex) field); } } @@ -412,7 +402,7 @@ ClassMolder fieldClassMolder = _fieldMolder.getFieldClassMolder(); - Object fieldValue = proposedObject.getField(_fieldIndex); + Complex fieldValue = (Complex) proposedObject.getField(_fieldIndex); if (fieldValue != null) { // use the corresponding Persistent fields as the identity, // and we ask transactionContext in action to load it. @@ -438,7 +428,7 @@ * @see org.castor.persist.resolver.ResolverStrategy#postCreate(org.castor.persist.TransactionContext, org.exolab.castor.persist.OID, java.lang.Object, java.lang.Object, java.lang.Object) */ public Object postCreate(final TransactionContext tx, final OID oid, final Object object, - final Object field, final Object createdId) { + final Object field, final Complex createdId) { return field; } Index: C:/Java/castor-2/src/main/java/org/castor/persist/resolver/PrimitiveResolver.java =================================================================== --- C:/Java/castor-2/src/main/java/org/castor/persist/resolver/PrimitiveResolver.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/castor/persist/resolver/PrimitiveResolver.java (working copy) @@ -27,6 +27,7 @@ import org.exolab.castor.persist.ClassMolderHelper; import org.exolab.castor.persist.FieldMolder; import org.exolab.castor.persist.OID; +import org.exolab.castor.persist.spi.Complex; /** * Implementation of {@link org.castor.persist.resolver.ResolverStrategy} for primitive fields. @@ -172,7 +173,7 @@ * @see org.castor.persist.resolver.ResolverStrategy#postCreate(org.castor.persist.TransactionContext, org.exolab.castor.persist.OID, java.lang.Object, java.lang.Object, java.lang.Object) */ public Object postCreate(final TransactionContext tx, final OID oid, - final Object object, final Object field, final Object createdId) { + final Object object, final Object field, final Complex createdId) { return field; } Index: C:/Java/castor-2/src/main/java/org/castor/persist/resolver/ResolverStrategy.java =================================================================== --- C:/Java/castor-2/src/main/java/org/castor/persist/resolver/ResolverStrategy.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/castor/persist/resolver/ResolverStrategy.java (working copy) @@ -25,6 +25,7 @@ import org.exolab.castor.mapping.AccessMode; import org.exolab.castor.persist.ClassMolder; import org.exolab.castor.persist.OID; +import org.exolab.castor.persist.spi.Complex; /** * Strategy pattern to allow for common operations related to field resolution based upon @@ -58,7 +59,7 @@ * @return the identity of the object */ Object postCreate(TransactionContext tx, OID oid, Object object, - Object field, Object createdId) + Object field, Complex createdId) throws PersistenceException; /** Index: C:/Java/castor-2/src/main/java/org/castor/persist/resolver/SerializableResolver.java =================================================================== --- C:/Java/castor-2/src/main/java/org/castor/persist/resolver/SerializableResolver.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/castor/persist/resolver/SerializableResolver.java (working copy) @@ -35,6 +35,7 @@ import org.exolab.castor.persist.ClassMolder; import org.exolab.castor.persist.FieldMolder; import org.exolab.castor.persist.OID; +import org.exolab.castor.persist.spi.Complex; /** * Implementation of {@link org.castor.persist.resolver.ResolverStrategy} for @@ -311,7 +312,7 @@ * org.exolab.castor.mapping.AccessMode, java.lang.Object) */ public Object postCreate(final TransactionContext tx, final OID oid, - final Object object, final Object field, final Object createdId) { + final Object object, final Object field, final Complex createdId) { return field; } Index: C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/CacheManager.java =================================================================== --- C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/CacheManager.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/CacheManager.java (working copy) @@ -49,6 +49,7 @@ import org.castor.util.Messages; import org.exolab.castor.persist.ClassMolder; import org.exolab.castor.persist.LockEngine; +import org.exolab.castor.persist.spi.Complex; /** * CacheManager handles expiring objects from the cache. @@ -99,7 +100,7 @@ public boolean isCached ( Class cls, Object identity) throws PersistenceException { if ( transactionContext != null && transactionContext.isOpen() ) { - return transactionContext.isCached(lockEngine.getClassMolder(cls), cls, identity); + return transactionContext.isCached(lockEngine.getClassMolder(cls), cls, new Complex(identity)); } throw new PersistenceException ("isCached() has to be called within an active transaction."); @@ -182,7 +183,7 @@ ClassMolder molder = lockEngine.getClassMolder(type); db.begin(); for (int i = 0; i < identity.length; i++) { - transactionContext.expireCache(molder, identity[i]); + transactionContext.expireCache(molder, new Complex(identity[i])); } db.commit(); } @@ -204,7 +205,7 @@ * * @param type An array of types to expire. */ - public void expireCache(Class[] type) throws PersistenceException { + public void expireCache(Class[] type) { for (int i = 0; i < type.length; i++) { lockEngine.expireCache(type[i]); } Index: C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/Database.java =================================================================== --- C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/Database.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/Database.java (working copy) @@ -49,6 +49,7 @@ import org.exolab.castor.mapping.AccessMode; import org.exolab.castor.persist.PersistenceInfoGroup; +import org.exolab.castor.persist.spi.Complex; /** * An open connection to the database. This object represents an open @@ -498,9 +499,8 @@ * @param cls Class instance. * @param identity Object identity. * @return True if the object specified is locked; false otherwise. - * @see org.exolab.castor.jdo.Database#isLocked(java.lang.Class, java.lang.Object) */ - public boolean isLocked (Class cls, Object identity); + public boolean isLocked (Class cls, Object identity) throws PersistenceException; /** * Closes the database. If a client transaction is in progress the @@ -540,9 +540,9 @@ * * @param object The object. * @return The object's identity, or null. - * @throws ClassNotPersistenceCapableException The class is not persistent capable. + * @throws PersistenceException The class is not persistent capable. */ - public Object getIdentity(Object object) throws ClassNotPersistenceCapableException; + public Complex getIdentity(Object object) throws PersistenceException; /** Index: C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/drivers/PostgreSQLCallQuery.java =================================================================== --- C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/drivers/PostgreSQLCallQuery.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/drivers/PostgreSQLCallQuery.java (working copy) @@ -56,7 +56,6 @@ import org.castor.persist.ProposedEntity; import org.castor.util.Messages; -import org.exolab.castor.jdo.ObjectNotFoundException; import org.exolab.castor.jdo.PersistenceException; import org.exolab.castor.jdo.QueryException; import org.exolab.castor.jdo.engine.JDBCSyntax; @@ -100,10 +99,10 @@ private final String _call; - private Object _lastIdentity; + private Complex _lastIdentity; - private int[] _sqlTypes; + private int[] _sqlTypes; PostgreSQLCallQuery( String call, Class[] types, Class javaClass, @@ -202,27 +201,25 @@ } - public Object nextIdentity(Object identity) throws PersistenceException - { + public Complex nextIdentity(Complex identity) throws PersistenceException { try { - if ( _lastIdentity == null ) { - if ( ! _rs.next() ) - return null; - _lastIdentity = SQLTypeInfos.getValue( _rs, 1, _sqlTypes[ 0 ] ); - return new Complex( _lastIdentity ); + if (_lastIdentity == null) { + if (!_rs.next()) { return null; } + _lastIdentity = new Complex(SQLTypeInfos.getValue(_rs, 1, _sqlTypes[0])); + return _lastIdentity; } - while ( _lastIdentity.equals( identity ) ) { - if ( ! _rs.next() ) { + while (_lastIdentity.equals(identity)) { + if (!_rs.next()) { _lastIdentity = null; return null; } - _lastIdentity = SQLTypeInfos.getValue( _rs, 1, _sqlTypes[ 0 ] ); + _lastIdentity = new Complex(SQLTypeInfos.getValue(_rs, 1, _sqlTypes[0])); } - return new Complex( _lastIdentity ); - } catch ( SQLException except ) { + return _lastIdentity; + } catch (SQLException except) { _lastIdentity = null; - throw new PersistenceException( Messages.format( "persist.nested", except ) ); + throw new PersistenceException(Messages.format("persist.nested", except)); } } @@ -248,8 +245,7 @@ } - public Object fetch(ProposedEntity proposedObject, Object identity) - throws ObjectNotFoundException, PersistenceException { + public Object fetch(ProposedEntity proposedObject) throws PersistenceException { try { // Load all the fields of the object including one-one relations // index 0 belongs to the identity @@ -257,7 +253,7 @@ proposedObject.setField(SQLTypeInfos.getValue(_rs, i + 1, _sqlTypes[i]), i - 1); } if (_rs.next()) { - _lastIdentity = SQLTypeInfos.getValue(_rs, 1, _sqlTypes[0]); + _lastIdentity = new Complex(SQLTypeInfos.getValue(_rs, 1, _sqlTypes[0])); } else { _lastIdentity = null; } Index: C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/engine/AbstractDatabaseImpl.java =================================================================== --- C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/engine/AbstractDatabaseImpl.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/engine/AbstractDatabaseImpl.java (working copy) @@ -36,6 +36,7 @@ import org.exolab.castor.mapping.MappingException; import org.exolab.castor.persist.*; import org.exolab.castor.persist.spi.CallbackInterceptor; +import org.exolab.castor.persist.spi.Complex; import org.exolab.castor.persist.spi.InstanceFactory; /** @@ -224,12 +225,15 @@ * @inheritDoc * @see org.exolab.castor.jdo.Database#isLocked(java.lang.Class, java.lang.Object) */ - public boolean isLocked(final Class cls, final Object identity) { + public boolean isLocked(final Class cls, final Object identity) throws PersistenceException { + if (identity == null) { + throw new PersistenceException("Identities can't be null!"); + } if (_scope == null) { - throw new IllegalStateException(Messages.message("jdo.dbClosed")); + throw new PersistenceException(Messages.message("jdo.dbClosed")); } if (isActive()) { - return _ctx.isLocked(cls, identity, _scope.getLockEngine()); + return _ctx.isLocked(cls, new Complex(identity), _scope.getLockEngine()); } return false; } @@ -235,8 +239,8 @@ } /** - * @inheritDoc * @see org.exolab.castor.jdo.Database#load(java.lang.Class, java.lang.Object) + * {@inheritDoc} */ public Object load(final Class type, final Object identity) throws ObjectNotFoundException, LockNotGrantedException, @@ -245,8 +249,8 @@ } /** - * @inheritDoc * @see org.exolab.castor.jdo.Database#load(java.lang.Class, java.lang.Object, java.lang.Object) + * {@inheritDoc} */ public Object load( final Class type, @@ -258,8 +262,8 @@ } /** - * @inheritDoc * @see org.exolab.castor.jdo.Database#load(java.lang.Class, java.lang.Object, org.exolab.castor.mapping.AccessMode) + * {@inheritDoc} */ public Object load(final Class type, final Object identity, final AccessMode mode) @@ -270,6 +274,7 @@ /** * Loads on object instance of the specified type and its identity. + * * @param type Object type. * @param identity Object identity * @param object Object instance to be filled with loaded values (optional) @@ -284,10 +289,16 @@ final Object object, final AccessMode mode) throws TransactionNotInProgressException, ObjectNotFoundException, LockNotGrantedException, PersistenceException { + if (identity == null) { + throw new PersistenceException("Identities can't be null!"); + } + if (_scope == null) { + throw new PersistenceException(Messages.message("jdo.dbClosed")); + } TransactionContext tx = getTransaction(); ClassMolder molder = _scope.getClassMolder(type); ProposedEntity proposedObject = new ProposedEntity(molder); - return tx.load(identity, proposedObject, mode); + return tx.load(new Complex(identity), proposedObject, mode); } /** @@ -358,10 +369,9 @@ * @inheritDoc * @see org.exolab.castor.jdo.Database#getIdentity(java.lang.Object) */ - public Object getIdentity(final Object object) - throws ClassNotPersistenceCapableException { + public Complex getIdentity(final Object object) throws PersistenceException { if ( _scope == null ) { - throw new IllegalStateException(Messages.message("jdo.dbClosed")); + throw new PersistenceException(Messages.message("jdo.dbClosed")); } ClassMolder molder = _scope.getClassMolder(object.getClass()); Index: C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/engine/OQLQueryImpl.java =================================================================== --- C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/engine/OQLQueryImpl.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/engine/OQLQueryImpl.java (working copy) @@ -68,6 +68,7 @@ import org.exolab.castor.mapping.TypeConvertor; import org.exolab.castor.persist.ClassMolder; import org.exolab.castor.persist.LockEngine; +import org.exolab.castor.persist.spi.Complex; import org.exolab.castor.persist.spi.PersistenceQuery; import org.exolab.castor.persist.spi.QueryExpression; @@ -152,7 +153,14 @@ ClassMolder molder = ((AbstractDatabaseImpl) _database).getLockEngine().getClassMolder( valueClass ); if ( molder != null ) { - value = molder.getActualIdentity( _database.getClassLoader(), value ); + Complex temp = molder.getActualIdentity( _database.getClassLoader(), value ); + if (temp == null) { + value = null; + } else if (temp.size() == 1) { + value = temp.get(0); + } else { + throw new IllegalArgumentException("Unable to bind multi column identities"); + } } } else if ( info.isUserDefined() ) { //If the user specified a type they must pass that exact type. Index: C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/engine/SQLEngine.java =================================================================== --- C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/engine/SQLEngine.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/engine/SQLEngine.java (working copy) @@ -35,6 +35,7 @@ import org.exolab.castor.mapping.FieldDescriptor; import org.exolab.castor.mapping.MappingException; import org.exolab.castor.mapping.loader.FieldHandlerImpl; +import org.exolab.castor.persist.spi.Complex; import org.exolab.castor.persist.spi.KeyGenerator; import org.exolab.castor.persist.spi.Persistence; import org.exolab.castor.persist.spi.PersistenceFactory; @@ -307,13 +308,13 @@ return col.getConvertTo().convert(object, col.getConvertParam()); } - public Object create(final Database database, final Object conn, - final ProposedEntity entity, Object identity) + public Complex create(final Database database, final Object conn, + final ProposedEntity entity, Complex identity) throws PersistenceException { - return _createStatement.executeStatement(database, (Connection) conn, identity, entity); + return (Complex) _createStatement.executeStatement(database, (Connection) conn, identity, entity); } - public Object store(final Object conn, final Object identity, + public Object store(final Object conn, final Complex identity, final ProposedEntity newentity, final ProposedEntity oldentity) throws PersistenceException { @@ -320,7 +321,7 @@ return _storeStatement.executeStatement((Connection) conn, identity, newentity, oldentity); } - public void delete(final Object conn, final Object identity) + public void delete(final Object conn, final Complex identity) throws PersistenceException { _removeStatement.executeStatement((Connection) conn, identity); } @@ -343,7 +344,7 @@ * @throws PersistenceException A persistence error occured */ public Object load(final Object conn, final ProposedEntity entity, - final Object identity, final AccessMode accessMode) + final Complex identity, final AccessMode accessMode) throws PersistenceException { return _loadStatement.executeStatement((Connection) conn, identity, entity, accessMode); } Index: C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/engine/SQLHelper.java =================================================================== --- C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/engine/SQLHelper.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/engine/SQLHelper.java (working copy) @@ -67,18 +67,15 @@ for (int i = 0; i < identityDescriptors.length; i++) { Object temp; - Object[] temps; JDOFieldDescriptor jdoFieldDescriptor = (JDOFieldDescriptor) identityDescriptors[i]; if (jdoFieldDescriptor.getSQLName().length == 1 ) { temp = SQLTypeInfos.getValue( rs, columnIndex++, java.sql.Types.JAVA_OBJECT); - isNull = (temp == null); } else { - temps = new Object[jdoFieldDescriptor.getSQLName().length]; + Object[] temps = new Object[jdoFieldDescriptor.getSQLName().length]; for ( int j=0; j. - public Object nextIdentity(Object identity) throws PersistenceException { + public Complex nextIdentity(final Complex identity) throws PersistenceException { + Complex nextIdentity = null; try { if (_lastIdentity == null) { if (_resultSetDone || !_rs.next()) { @@ -254,19 +241,19 @@ // Look if the current row in our ResultSet already belongs to a different id. _lastIdentity = identityToSQL(identity); - identity = loadIdentity(); + nextIdentity = loadIdentity(); - if (identitiesEqual(_lastIdentity, identityToSQL(identity))) { + if (identitiesEqual(_lastIdentity, identityToSQL(nextIdentity))) { // This will fetch the object data into our internal _fields[] and thus also // "skip" all rows till the first one with a new identity. - fetchRaw(null); + fetchRaw(); } - identity = loadIdentity(); + nextIdentity = loadIdentity(); // This will fetch the object data into our internal _fields[] and thus also // "skip" all rows till the first one with a new identity. - fetchRaw(null); + fetchRaw(); } catch (SQLException except) { _lastIdentity = null; @@ -272,7 +259,7 @@ _lastIdentity = null; throw new PersistenceException(Messages.format("persist.nested", except), except); } - return identity; + return nextIdentity; } public void close() { @@ -294,7 +281,7 @@ } } - private Object[] identityToSQL(final Object identity) { + private Object[] identityToSQL(final Complex identity) { Object[] sqlIdentity = new Object[_engine.getColumnInfoForIdentities().length]; if (identity != null) { @@ -299,13 +286,8 @@ if (identity != null) { // Split complex identity into array of single objects. - if (_engine.getColumnInfoForIdentities().length > 1) { - Complex id = (Complex) identity; - for (int i = 0; i < _engine.getColumnInfoForIdentities().length; i++) { - sqlIdentity[i] = id.get(i); - } - } else { - sqlIdentity[0] = identity; + for (int i = 0; i < _engine.getColumnInfoForIdentities().length; i++) { + sqlIdentity[i] = identity.get(i); } } return sqlIdentity; @@ -312,12 +294,9 @@ } private Object loadSingleField(final int i, final CounterRef counterReference) - throws SQLException, PersistenceException { + throws SQLException { String currentTableName = counterReference.getTableName(); int count = counterReference.getCounter(); - Object[] temp = new Object[_engine.getInfo()[i].getColumnInfo().length]; - boolean notNull = false; - Object field; String fieldTableName = _engine.getInfo()[i].getTableName(); String fieldColumnName = _engine.getInfo()[i].getColumnInfo()[0].getName(); @@ -345,22 +324,20 @@ count++; } - if (_engine.getInfo()[i].getColumnInfo().length == 1) { - field = _engine.getInfo()[i].getColumnInfo()[0].toJava(SQLTypeInfos.getValue(_rs, count, _engine.getInfo()[i].getColumnInfo()[0].getSqlType())); + SQLFieldInfo info = _engine.getInfo()[i]; + Object field; + if (!info.isJoined() && (info.getJoinFields() == null)) { + field = info.getColumnInfo()[0].toJava(SQLTypeInfos.getValue(_rs, count, info.getColumnInfo()[0].getSqlType())); count++; } else { - for (int j = 0; j < _engine.getInfo()[i].getColumnInfo().length; j++) { - temp[j] = _engine.getInfo()[i].getColumnInfo()[j].toJava(SQLTypeInfos.getValue(_rs, count, _engine.getInfo()[i].getColumnInfo()[j].getSqlType())); + boolean notNull = false; + Object[] temp = new Object[info.getColumnInfo().length]; + for (int j = 0; j < info.getColumnInfo().length; j++) { + temp[j] = info.getColumnInfo()[j].toJava(SQLTypeInfos.getValue(_rs, count, info.getColumnInfo()[j].getSqlType())); count++; - if (temp[j] != null) { - notNull = true; - } - } - if (notNull) { - field = new Complex( _engine.getInfo()[i].getColumnInfo().length, temp ); - } else { - field = null; + if (temp[j] != null) { notNull = true; } } + field = ((notNull) ? new Complex(temp) : null); } counterReference.setCounter(count); counterReference.setTableName(currentTableName); @@ -369,11 +346,8 @@ private Object loadMultiField(final int i, final CounterRef counterReference, final Object field) - throws SQLException, PersistenceException { + throws SQLException { int count = counterReference.getCounter(); - Object[] temp = new Object[_engine.getInfo()[i].getColumnInfo().length]; - boolean notNull = false; - ArrayList res; String fieldTableName = _engine.getInfo()[i].getTableName(); String firstColumnOfField = _engine.getInfo()[i].getColumnInfo()[0].getName(); @@ -391,30 +365,18 @@ tableNamePerMetaData = metaData.getTableName(count); } - if (field == null) { - res = new ArrayList(); - } else { - res = (ArrayList) field; - } - - for (int j = 0; j < _engine.getInfo()[i].getColumnInfo().length; j++) { - temp[j] = _engine.getInfo()[i].getColumnInfo()[j].toJava(SQLTypeInfos.getValue(_rs, count, _engine.getInfo()[i].getColumnInfo()[j].getSqlType())); - if (temp[j] != null) { - notNull = true; - } + ArrayList res = ((field == null) ? new ArrayList() : (ArrayList) field); + SQLFieldInfo info = _engine.getInfo()[i]; + boolean notNull = false; + Object[] temp = new Object[info.getColumnInfo().length]; + for (int j = 0; j < info.getColumnInfo().length; j++) { + temp[j] = info.getColumnInfo()[j].toJava(SQLTypeInfos.getValue(_rs, count, info.getColumnInfo()[j].getSqlType())); + if (temp[j] != null) { notNull = true; } count++; } if (notNull) { - if (_engine.getInfo()[i].getColumnInfo().length == 1) { - if (!res.contains(temp[0])) { - res.add(temp[0]); - } - } else { - Complex com = new Complex(_engine.getInfo()[i].getColumnInfo().length, temp); - if (!res.contains(com)) { - res.add( com ); - } - } + Complex identity = new Complex(temp); + if (!res.contains(identity)) { res.add(identity); } } counterReference.setCounter(count); @@ -423,7 +385,7 @@ private int loadRow(final Object[] fields, final int numberOfFields, final boolean isFirst) - throws SQLException, PersistenceException { + throws SQLException { // skip the identity columns first; in other words, look at field columns only int count = _engine.getColumnInfoForIdentities().length + 1; @@ -484,8 +446,7 @@ /** * @see org.exolab.castor.persist.spi.PersistenceQuery#fetch(org.exolab.castor.persist.ProposedEntity, java.lang.Object) */ - public Object fetch(final ProposedEntity proposedObject, - final Object identity) throws PersistenceException { + public Object fetch(final ProposedEntity proposedObject) throws PersistenceException { // Fill the given fields[] with the "cached" stuff from our _fields[] . for (int i = 0; i < _fields.length; i++) { proposedObject.setField(_fields[i], i); @@ -493,7 +454,7 @@ return null; } - private Object fetchRaw(final Object identity) throws PersistenceException { + private Object fetchRaw() throws PersistenceException { // maybe we can optimize a little bit here when we have time. // Instead of creating new Object[] and ArrayList for each // "multi field" each fetchRaw is called, we might reuse them. @@ -540,13 +501,7 @@ Object[] currentIdentity; try { - // If identity given, we want only to load data for this object. - // Otherwise we just load the identity from the current row. - if (identity != null) { - wantedIdentity = identityToSQL( identity ); - } else { - wantedIdentity = loadSQLIdentity(); - } + wantedIdentity = loadSQLIdentity(); // Load first (and perhaps only) row of object data from _rs into <_fields> array. // As we assume that we have called fetch() immediatly after nextIdentity(), Index: C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/engine/SQLStatementCreate.java =================================================================== --- C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/engine/SQLStatementCreate.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/engine/SQLStatementCreate.java (working copy) @@ -18,7 +18,7 @@ package org.exolab.castor.jdo.engine; import java.sql.*; -import java.util.LinkedList; +import java.util.ArrayList; import java.util.List; import java.util.Properties; @@ -41,7 +41,7 @@ import org.exolab.castor.persist.spi.KeyGenerator; import org.exolab.castor.persist.spi.PersistenceFactory; -public final class SQLStatementCreate { +public class SQLStatementCreate { /** The Jakarta * Commons Logging instance used for all logging. */ private static final Log LOG = LogFactory.getLog(SQLStatementCreate.class); @@ -165,7 +165,7 @@ } public Object executeStatement(final Database database, final Connection conn, - Object identity, final ProposedEntity entity) + Complex identity, final ProposedEntity entity) throws PersistenceException { SQLEngine extended = _engine.getExtends(); if ((extended == null) && (_keyGen == null) && (identity == null)) { @@ -208,25 +208,11 @@ int count = 1; SQLColumnInfo[] ids = _engine.getColumnInfoForIdentities(); if ((_keyGen == null) || (_keyGen.getStyle() == KeyGenerator.BEFORE_INSERT)) { - if ((ids.length > 1) && !(identity instanceof Complex)) { - throw new PersistenceException("Multiple identities expected!"); + if (identity.size() != ids.length) { + throw new PersistenceException("Size of identity field mismatched!"); } - - if (identity instanceof Complex) { - Complex id = (Complex) identity; - if ((id.size() != ids.length) || (ids.length <= 1)) { - throw new PersistenceException("Size of complex field mismatched!"); - } - - for (int i = 0; i < ids.length; i++) { - stmt.setObject(count++, ids[i].toSQL(id.get(i))); - } - } else { - if (ids.length != 1) { - throw new PersistenceException("Complex field expected!"); - } - - stmt.setObject(count++, ids[0].toSQL(identity)); + for (int i = 0; i < ids.length; i++) { + stmt.setObject(count++, ids[i].toSQL(identity.get(i))); } } @@ -263,12 +249,13 @@ // Identity is returned in the last parameter // Workaround: for INTEGER type in Oracle getObject returns BigDecimal + Object temp; if (sqlType == java.sql.Types.INTEGER) { - identity = new Integer(cstmt.getInt(count)); + temp = new Integer(cstmt.getInt(count)); } else { - identity = cstmt.getObject(count); + temp = cstmt.getObject(count); } - identity = ids[0].toJava(identity); + identity = new Complex(ids[0].toJava(temp)); } else { if (LOG.isDebugEnabled()) { LOG.debug(Messages.format("jdo.creating", _type, stmt.toString())); @@ -280,7 +267,7 @@ ResultSet keySet = stmt.getGeneratedKeys(); int i = 1; int sqlType; - List keys = new LinkedList(); + List keys = new ArrayList(); while (keySet.next()) { sqlType = ids[i-1].getSqlType(); Object temp; @@ -285,7 +272,7 @@ sqlType = ids[i-1].getSqlType(); Object temp; if (sqlType == java.sql.Types.INTEGER) { - temp = new Integer(keySet.getInt(i)); + temp = new Integer(keySet.getInt(i)); } else if (sqlType == java.sql.Types.NUMERIC) { temp = keySet.getBigDecimal(i); } else { @@ -292,14 +279,10 @@ temp = keySet.getObject(i); } - keys.add(temp); + keys.add(ids[i-1].toJava(temp)); i++; } - if (keys.size() > 1) { - identity = keys.toArray(); - } else { - identity = ids[0].toJava(keys.iterator().next()); - } + identity = new Complex(keys.toArray()); } } @@ -360,7 +343,7 @@ * @return The generated key * @throws PersistenceException If no key can be generated */ - private Object generateKey(final Database database, final Connection conn, + private Complex generateKey(final Database database, final Connection conn, final PreparedStatement stmt) throws PersistenceException { SQLColumnInfo id = _engine.getColumnInfoForIdentities()[0]; @@ -390,7 +373,7 @@ Messages.format("persist.noIdentity", _type)); } - return id.toJava(identity); + return new Complex(id.toJava(identity)); } finally { if (_keyGen.isInSameConnection() == false) { closeSeparateConnection(connection); @@ -418,16 +401,14 @@ for (int j = 0; j < columns.length; j++) { stmt.setNull(count++, columns[j].getSqlType()); } - } else if (value instanceof Complex) { - Complex complex = (Complex) value; - if (complex.size() != columns.length) { - throw new PersistenceException("Size of complex field mismatch!"); + Complex identity = (Complex) value; + if (identity.size() != columns.length) { + throw new PersistenceException("Size of identity field mismatch!"); } - for (int j = 0; j < columns.length; j++) { - value = (complex == null) ? null : complex.get(j); - SQLTypeInfos.setValue(stmt, count++, columns[j].toSQL(value), columns[j].getSqlType()); + SQLTypeInfos.setValue(stmt, count++, + columns[j].toSQL(identity.get(j)), columns[j].getSqlType()); } } else { if (columns.length != 1) { @@ -433,7 +414,6 @@ if (columns.length != 1) { throw new PersistenceException("Complex field expected!"); } - SQLTypeInfos.setValue(stmt, count++, columns[0].toSQL(value), columns[0].getSqlType()); } } Index: C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/engine/SQLStatementLoad.java =================================================================== --- C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/engine/SQLStatementLoad.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/engine/SQLStatementLoad.java (working copy) @@ -251,7 +251,7 @@ return (QueryExpression) _queryExpression.clone(); } - public Object executeStatement(final Connection conn, final Object identity, + public Object executeStatement(final Connection conn, final Complex identity, final ProposedEntity entity, final AccessMode accessMode) throws PersistenceException { @@ -271,20 +271,12 @@ int fieldIndex = 1; // bind the identity of the preparedStatement - if (identity instanceof Complex) { - Complex id = (Complex) identity; - if ((id.size() != ids.length) || (ids.length <= 1)) { - throw new PersistenceException("Size of complex field mismatched! expected: " + ids.length + " found: " + id.size()); - } + if (identity.size() != ids.length) { + throw new PersistenceException("Size of identity field mismatched! expected: " + ids.length + " found: " + identity.size()); + } - for (int i = 0; i < ids.length; i++) { - stmt.setObject(fieldIndex++, ids[i].toSQL(id.get(i))); - } - } else { - if (ids.length != 1) { - throw new PersistenceException("Complex field expected!"); - } - stmt.setObject(fieldIndex++, ids[0].toSQL(identity)); + for (int i = 0; i < ids.length; i++) { + stmt.setObject(fieldIndex++, ids[i].toSQL(identity.get(i))); } if (LOG.isDebugEnabled()) { @@ -335,7 +327,6 @@ fieldIndex = 1; String tableName = null; String tableNameOld = tableName; - Object[] temp = new Object[10]; // assume complex field max at 10 for (int i = 0 ; i < fields.length ; ++i) { SQLFieldInfo field = fields[i]; SQLColumnInfo[] columns = field.getColumnInfo(); @@ -344,43 +335,29 @@ columnIndex = columnIndex + ids.length; } - if (!field.isMulti()) { + if (!field.isJoined() && (field.getJoinFields() == null)) { + entity.setField(columns[0].toJava(SQLTypeInfos.getValue(rs, columnIndex++, columns[0].getSqlType())), i); + fieldIndex++; + } else if (!field.isMulti()) { notNull = false; - if (columns.length == 1) { - entity.setField(columns[0].toJava(SQLTypeInfos.getValue(rs, columnIndex++, columns[0].getSqlType())), i); + Object[] id = new Object[columns.length]; + for (int j = 0; j < columns.length; j++) { + id[j] = columns[j].toJava(SQLTypeInfos.getValue(rs, columnIndex++, columns[j].getSqlType())); fieldIndex++; - } else { - for (int j = 0; j < columns.length; j++) { - temp[j] = columns[j].toJava(SQLTypeInfos.getValue(rs, columnIndex++, columns[j].getSqlType())); - fieldIndex++; - if (temp[j] != null) { - notNull = true; - } - } - if (notNull) { - entity.setField(new Complex(columns.length, temp), i); - } else { - entity.setField(null, i); - } + if (id[j] != null) { notNull = true; } } + entity.setField(((notNull) ? new Complex(id) : null), i); } else { ArrayList res = new ArrayList(); notNull = false; + Object[] id = new Object[columns.length]; for (int j = 0; j < columns.length; j++) { - temp[j] = columns[j].toJava(SQLTypeInfos.getValue(rs, columnIndex, columns[j].getSqlType())); - if (temp[j] != null) { - notNull = true; - } + id[j] = columns[j].toJava(SQLTypeInfos.getValue(rs, columnIndex, columns[j].getSqlType())); + if (id[j] != null) { notNull = true; } fieldIndex++; columnIndex++; } - if (notNull) { - if (columns.length == 1) { - res.add( temp[0] ); - } else { - res.add(new Complex(columns.length, temp)); - } - } + if (notNull) { res.add(new Complex(id)); } entity.setField(res, i); } @@ -405,9 +382,10 @@ if (field.isMulti()) { ArrayList res = (ArrayList) entity.getField(i); notNull = false; + Object[] id = new Object[columns.length]; for (int j = 0; j < columns.length; j++) { - temp[j] = columns[j].toJava(SQLTypeInfos.getValue(rs, columnIndex, columns[j].getSqlType())); - if (temp[j] != null) { notNull = true; } + id[j] = columns[j].toJava(SQLTypeInfos.getValue(rs, columnIndex, columns[j].getSqlType())); + if (id[j] != null) { notNull = true; } columnIndex++; } fieldIndex++; @@ -412,16 +390,8 @@ } fieldIndex++; if (notNull) { - if (columns.length == 1) { - if (!res.contains(temp[0])) { - res.add(temp[0]); - } - } else { - Complex com = new Complex(columns.length, temp); - if (!res.contains(com)) { - res.add(new Complex(columns.length, temp)); - } - } + Complex com = new Complex(id); + if (!res.contains(com)) { res.add(com); } } } else { fieldIndex++; @@ -427,9 +397,9 @@ fieldIndex++; columnIndex += columns.length; } + tableNameOld = tableName; } - } } catch (SQLException except) { LOG.fatal(Messages.format("jdo.loadFatal", _type, (accessMode == AccessMode.DbLocked) ? _statementLock : _statementNoLock), except); Index: C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/engine/SQLStatementLookup.java =================================================================== --- C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/engine/SQLStatementLookup.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/engine/SQLStatementLookup.java (working copy) @@ -74,7 +74,7 @@ } } - public Object executeStatement(final Connection conn, Object identity) + public Object executeStatement(final Connection conn, Complex identity) throws PersistenceException { SQLColumnInfo[] ids = _engine.getColumnInfoForIdentities(); PreparedStatement stmt = null; @@ -87,21 +87,11 @@ // bind the identity to the preparedStatement int count = 1; - if (identity instanceof Complex) { - Complex id = (Complex) identity; - if ((id.size() != ids.length) || (ids.length <= 1)) { - throw new PersistenceException("Size of complex field mismatched!"); - } - - for (int i = 0; i < ids.length; i++) { - stmt.setObject(count++, ids[i].toSQL(id.get(i))); - } - } else { - if (ids.length != 1) { - throw new PersistenceException("Complex field expected!"); - } - - stmt.setObject(count++, ids[0].toSQL(identity)); + if (identity.size() != ids.length) { + throw new PersistenceException("Size of identity field mismatched!"); + } + for (int i = 0; i < ids.length; i++) { + stmt.setObject(count++, ids[i].toSQL(identity.get(i))); } if (stmt.executeQuery().next()) { Index: C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/engine/SQLStatementRemove.java =================================================================== --- C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/engine/SQLStatementRemove.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/engine/SQLStatementRemove.java (working copy) @@ -72,7 +72,7 @@ } } - public Object executeStatement(final Connection conn, Object identity) + public Object executeStatement(final Connection conn, Complex identity) throws PersistenceException { SQLColumnInfo[] ids = _engine.getColumnInfoForIdentities(); SQLEngine extended = _engine.getExtends(); @@ -87,20 +87,12 @@ int count = 1; // bind the identity of the preparedStatement - if (identity instanceof Complex) { - Complex id = (Complex) identity; - if ((id.size() != ids.length) || (ids.length <= 1)) { - throw new PersistenceException("Size of complex field mismatched!"); - } + if (identity.size() != ids.length) { + throw new PersistenceException("Size of identity field mismatched!"); + } - for (int i = 0; i < ids.length; i++) { - stmt.setObject(count++, ids[i].toSQL(id.get(i))); - } - } else { - if (ids.length != 1) { - throw new PersistenceException("Complex field expected!"); - } - stmt.setObject(count++, ids[0].toSQL(identity)); + for (int i = 0; i < ids.length; i++) { + stmt.setObject(count++, ids[i].toSQL(identity.get(i))); } if (LOG.isDebugEnabled()) { Index: C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/engine/SQLStatementStore.java =================================================================== --- C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/engine/SQLStatementStore.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/exolab/castor/jdo/engine/SQLStatementStore.java (working copy) @@ -145,7 +145,7 @@ } } - public Object executeStatement(final Connection conn, final Object identity, + public Object executeStatement(final Connection conn, final Complex identity, final ProposedEntity newentity, final ProposedEntity oldentity) throws PersistenceException { @@ -186,15 +186,14 @@ for (int j = 0; j < columns.length; j++) { stmt.setNull(count++, columns[j].getSqlType()); } - } else if (value instanceof Complex) { - Complex complex = (Complex) value; - if (complex.size() != columns.length) { - throw new PersistenceException("Size of complex field mismatch!"); + Complex id = (Complex) value; + if (id.size() != columns.length) { + throw new PersistenceException("Size of identity field mismatch!"); } for (int j = 0; j < columns.length; j++) { - SQLTypeInfos.setValue(stmt, count++, columns[j].toSQL(complex.get(j)), columns[j].getSqlType()); + SQLTypeInfos.setValue(stmt, count++, columns[j].toSQL(id.get(j)), columns[j].getSqlType()); } } else { if (columns.length != 1) { @@ -208,28 +207,16 @@ // bind the identity of the row to be stored into the preparedStatement SQLColumnInfo[] ids = _engine.getColumnInfoForIdentities(); - if (identity instanceof Complex) { - Complex id = (Complex) identity; - if ((id.size() != ids.length) || (ids.length <= 1)) { - throw new PersistenceException("Size of complex field mismatched!"); - } - - for (int i = 0; i < ids.length; i++) { - stmt.setObject(count++, ids[i].toSQL(id.get(i))); - if (LOG.isTraceEnabled()) { - LOG.trace(Messages.format("jdo.bindingIdentity", ids[i].getName(), ids[i].toSQL(id.get(i)))); - } - } - } else { - if (ids.length != 1) { - throw new PersistenceException("Complex field expected!"); - } - - stmt.setObject(count++, ids[0].toSQL(identity)); + if (identity.size() != ids.length) { + throw new PersistenceException("Size of identity field mismatched!"); + } + + for (int i = 0; i < ids.length; i++) { + stmt.setObject(count++, ids[i].toSQL(identity.get(i))); if (LOG.isTraceEnabled()) { - LOG.trace(Messages.format("jdo.bindingIdentity", ids[0].getName(), ids[0].toSQL(identity))); + LOG.trace(Messages.format("jdo.bindingIdentity", ids[i].getName(), ids[i].toSQL(identity.get(i)))); } - } + } // bind the old fields of the row to be stored into the preparedStatement if (oldentity.getFields() != null) { @@ -246,16 +233,16 @@ } } } else if (value instanceof Complex) { - Complex complex = (Complex) value; - if (complex.size() != columns.length) { - throw new PersistenceException("Size of complex field mismatch!"); + Complex id = (Complex) value; + if (id.size() != columns.length) { + throw new PersistenceException("Size of identity field mismatch!"); } for (int j = 0; j < columns.length; j++) { - SQLTypeInfos.setValue(stmt, count++, columns[j].toSQL(complex.get(j)), columns[j].getSqlType()); + SQLTypeInfos.setValue(stmt, count++, columns[j].toSQL(id.get(j)), columns[j].getSqlType()); if (LOG.isTraceEnabled()) { - LOG.trace(Messages.format("jdo.bindingField", columns[j].getName(), columns[j].toSQL(complex.get(j)))); + LOG.trace(Messages.format("jdo.bindingField", columns[j].getName(), columns[j].toSQL(id.get(j)))); } } } else { @@ -292,13 +279,8 @@ // bind the identity to the prepareStatement count = 1; - if (identity instanceof Complex) { - Complex id = (Complex) identity; - for (int i = 0; i < ids.length; i++) { - stmt.setObject(count++, ids[i].toSQL(id.get(i))); - } - } else { - stmt.setObject(count++, ids[0].toSQL(identity)); + for (int i = 0; i < ids.length; i++) { + stmt.setObject(count++, ids[i].toSQL(identity.get(i))); } ResultSet res = stmt.executeQuery(); @@ -371,13 +353,13 @@ pos = nextParameter(true, sql, pos); } } else if (value instanceof Complex) { - Complex complex = (Complex) value; - if (complex.size() != columns.length) { - throw new PersistenceException("Size of complex field mismatch!"); + Complex identity = (Complex) value; + if (identity.size() != columns.length) { + throw new PersistenceException("Size of identity field mismatch!"); } for (int j = columns.length - 1; j >= 0; j--) { - pos = nextParameter((complex.get(j) == null), sql, pos); + pos = nextParameter((identity.get(j) == null), sql, pos); } } else { if (columns.length != 1) { Index: C:/Java/castor-2/src/main/java/org/exolab/castor/persist/ClassMolder.java =================================================================== --- C:/Java/castor-2/src/main/java/org/exolab/castor/persist/ClassMolder.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/exolab/castor/persist/ClassMolder.java (working copy) @@ -42,11 +42,8 @@ * * $Id$ */ - - package org.exolab.castor.persist; - import java.sql.Connection; import java.util.Properties; import java.util.Vector; @@ -86,7 +83,6 @@ import org.exolab.castor.persist.spi.Complex; import org.exolab.castor.persist.spi.Persistence; - /** * ClassMolder is a 'binder' for one type of data object and its corresponding * {@link Persistence}. For example, when ClassMolder is asked to load @@ -110,13 +106,10 @@ * @author Werner Guttmann */ -public class ClassMolder -{ +public class ClassMolder { - /** - * The Jakarta - * Commons Logging instance used for all logging. - */ + /** The Jakarta + * Commons Logging instance used for all logging. */ private static Log _log = LogFactory.getFactory().getInstance(ClassMolder.class); /** @@ -533,7 +526,7 @@ // try to load the field values from the cache, except when being told // to ignore them if (!proposedObject.isObjectLockObjectToBeIgnored()) { - Object[] cachedFieldValues = (Object[]) locker.getObject(tx); + Object[] cachedFieldValues = locker.getObject(tx); if (_log.isDebugEnabled()) { StringBuffer buffer = new StringBuffer(80); buffer.append("Field values loaded from cache: "); @@ -559,12 +552,10 @@ if (!proposedObject.isFieldsSet() || accessMode == AccessMode.DbLocked) { proposedObject.initializeFields(_fhs.length); if (results != null) { - stamp = results.getQuery().fetch(proposedObject, - oid.getIdentity()); + stamp = results.getQuery().fetch(proposedObject); } else { Connection conn = tx.getConnection(oid.getMolder().getLockEngine()); - stamp = _persistence.load(conn, proposedObject, - oid.getIdentity(), accessMode); + stamp = _persistence.load(conn, proposedObject, oid.getIdentity(), accessMode); } if (proposedObject.isExpanded()) { @@ -626,8 +617,7 @@ } // set the identities into the target object - Object ids = oid.getIdentity(); - setIdentity(tx, proposedObject.getEntity(), ids); + setIdentity(tx, proposedObject.getEntity(), oid.getIdentity()); // iterates thur all the field of the object and bind all field. for ( int i = 0; i < _fhs.length; i++ ) { @@ -656,7 +646,7 @@ * @param object the object to be created * @return the identity of the object */ - public Object create( TransactionContext tx, OID oid, DepositBox locker, Object object ) + public Complex create( TransactionContext tx, OID oid, DepositBox locker, Object object ) throws DuplicateIdentityException, PersistenceException { int fieldType; @@ -670,7 +660,7 @@ ProposedEntity entity = new ProposedEntity(); entity.initializeFields(_fhs.length); - Object ids = oid.getIdentity(); + Complex ids = oid.getIdentity(); // copy the object to cache should make a new field now, for ( int i=0; i<_fhs.length; i++ ) { @@ -691,7 +681,7 @@ } // ask Persistent to create the object into the persistence storage - Object createdId = _persistence.create(tx.getDatabase(), + Complex createdId = _persistence.create(tx.getDatabase(), tx.getConnection(oid.getMolder().getLockEngine()), entity, ids); if (createdId == null) { @@ -775,7 +765,7 @@ getIdentity(tx, object))); } - Object[] fields = (Object[]) locker.getObject(tx); + Object[] fields = locker.getObject(tx); if (fields == null) { throw new PersistenceException( @@ -829,7 +819,7 @@ // load field values from cache (if availabe) ProposedEntity oldentity = new ProposedEntity(); - oldentity.setFields((Object[]) locker.getObject(tx)); + oldentity.setFields(locker.getObject(tx)); if (oldentity.getFields() == null) { throw new PersistenceException( @@ -867,7 +857,7 @@ resetResolvers(); - Object[] fields = (Object[]) locker.getObject(tx); + Object[] fields = locker.getObject(tx); if ((!isDependent()) && (!_timeStampable)) { throw new IllegalArgumentException( @@ -915,7 +905,7 @@ // have something to compare later. try { for ( int i=0; i <_fhs.length; i++ ) { - _resolvers[i].update(tx, oid, object, accessMode, fields[i]); + _resolvers[i].update(tx, oid, object, accessMode, fields[i]); } } catch (ObjectNotFoundException e) { _log.warn(e.getMessage(), e); @@ -1007,16 +997,16 @@ resetResolvers(); - Object ids = oid.getIdentity(); + Complex ids = oid.getIdentity(); - for( int i=0; i < _fhs.length; i++ ) { + for(int i = 0; i < _fhs.length; i++) { if( _fhs[i].isManyToMany() ) { _fhs[i].getRelationLoader().deleteRelation( - tx.getConnection(oid.getMolder().getLockEngine()), ids); + tx.getConnection(oid.getMolder().getLockEngine()), ids); } } - _persistence.delete( tx.getConnection(oid.getMolder().getLockEngine()), ids ); + _persistence.delete(tx.getConnection(oid.getMolder().getLockEngine()), ids); // All field along the extend path will be deleted by transaction // However, everything off the path must be deleted by ClassMolder. @@ -1059,7 +1049,7 @@ resetResolvers(); - Object[] fields = (Object[]) locker.getObject(tx); + Object[] fields = locker.getObject(tx); for (int i = 0; i < _fhs.length; i++) { int fieldType = _fhs[i].getFieldType(); @@ -1100,7 +1090,7 @@ Messages.format("persist.missingIdentityForReverting", _name)); } - Object[] fields = (Object[]) locker.getObject(tx); + Object[] fields = locker.getObject(tx); setIdentity(tx, object, oid.getIdentity()); @@ -1166,21 +1156,10 @@ /** * Test if the specified identity is the default value of the type. */ - public boolean isDefaultIdentity( Object identity ) { - - if (_ids.length == 1) { - return _ids[0].isDefault(identity); - } - - if (identity == null) { - return true; - } - - Complex c = (Complex) identity; - for (int i = 0; i < c.size(); i++) { - if (!_ids[i].isDefault(c.get(i))) { - return false; - } + public boolean isDefaultIdentity(final Complex identity) { + if (identity == null) { return true; } + for (int i = 0; i < identity.size(); i++) { + if (!_ids[i].isDefault(identity.get(i))) { return false; } } return true; } @@ -1193,7 +1172,7 @@ * @param o - object of the base type * @return return an Object[] which contains the identity of the object */ - public Object getIdentity(final TransactionContext tx, final Object o) { + public Complex getIdentity(final TransactionContext tx, final Object o) { // [oleg] In the case where key generator is used, // the value of identity is dummy, set it to null if (isKeyGeneratorUsed() && !(tx.isPersistent(o) || tx.isReadOnly(o))) { @@ -1209,7 +1188,7 @@ * @param o - object of the base type * @return return an Object[] which contains the identity of the object */ - public Object getActualIdentity(final TransactionContext tx, final Object o) { + public Complex getActualIdentity(final TransactionContext tx, final Object o) { return getActualIdentity(tx.getClassLoader(), o); } @@ -1220,23 +1199,13 @@ * @param o - object of the base type * @return return an Object[] which contains the identity of the object */ - public Object getActualIdentity(final ClassLoader loader, final Object o) { - Object temp; - - if (_ids.length == 1) { - return _ids[0].getValue(o, loader); - } else if (_ids.length == 2) { - temp = _ids[0].getValue(o, loader); - return temp == null ? null : new Complex(temp, _ids[1].getValue(o, - loader)); - } else { - Object[] osIds = new Object[_ids.length]; - for (int i = 0; i < osIds.length; i++) { - osIds[i] = _ids[i].getValue(o, loader); - } - if (osIds[0] == null) { return null; } - return new Complex(osIds); + public Complex getActualIdentity(final ClassLoader loader, final Object o) { + Object[] ids = new Object[_ids.length]; + for (int i = 0; i < ids.length; i++) { + ids[i] = _ids[i].getValue(o, loader); } + if (ids[0] == null) { return null; } + return new Complex(ids); } /** @@ -1248,25 +1217,15 @@ */ public void setIdentity(final TransactionContext tx, final Object object, - final Object identity ) + final Complex identity ) throws PersistenceException { - if (_ids.length > 1) { - if (identity instanceof Complex) { - Complex com = (Complex) identity; - if (com.size() != _ids.length) { - throw new PersistenceException("Complex size mismatched!"); - } + if (identity.size() != _ids.length) { + throw new PersistenceException("Identity size mismatched!"); + } - for (int i = 0; i < _ids.length; i++) { - _ids[i].setValue(object, com.get(i), tx.getClassLoader()); - } - } - } else { - if (identity instanceof Complex) { - throw new PersistenceException("Complex type not accepted!"); - } - _ids[0].setValue(object, identity, tx.getClassLoader()); + for (int i = 0; i < _ids.length; i++) { + _ids[i].setValue(object, identity.get(i), tx.getClassLoader()); } } @@ -1464,7 +1423,7 @@ } // get field values from cache - Object[] fields = (Object[]) locker.getObject(); + Object[] fields = locker.getObject(); if (fields == null) { return; Index: C:/Java/castor-2/src/main/java/org/exolab/castor/persist/ClassMolderHelper.java =================================================================== --- C:/Java/castor-2/src/main/java/org/exolab/castor/persist/ClassMolderHelper.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/exolab/castor/persist/ClassMolderHelper.java (working copy) @@ -6,6 +6,7 @@ import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.NoSuchElementException; @@ -19,6 +20,7 @@ import org.exolab.castor.mapping.loader.MappingLoader; import org.exolab.castor.mapping.xml.ClassMapping; import org.exolab.castor.mapping.xml.FieldMapping; +import org.exolab.castor.persist.spi.Complex; import org.exolab.castor.persist.spi.Persistence; import org.exolab.castor.persist.spi.PersistenceFactory; @@ -165,9 +167,10 @@ return idList; } else if (col instanceof Map) { ArrayList idList = new ArrayList(); - Iterator itor = ((Map) col).keySet().iterator(); + Iterator itor = ((Map) col).values().iterator(); while (itor.hasNext()) { - idList.add(itor.next()); + Object id = molder.getIdentity(tx, itor.next()); + if (id != null) { idList.add(id); } } return idList; } else if (col.getClass().isArray()) { @@ -393,14 +396,12 @@ return ((Map) collection).values(); } - Map newMap = (Map) collection; - ArrayList added = new ArrayList(newMap.size()); - Iterator newItor = newMap.entrySet().iterator(); + ArrayList added = new ArrayList(((Map) collection).size()); + Iterator newItor = ((Map) collection).values().iterator(); while (newItor.hasNext()) { - Map.Entry newId = (Map.Entry) newItor.next(); - if (!orgIds.contains(newId.getKey())) { - added.add(newId.getValue()); - } + Object newValue = newItor.next(); + Complex newId = ch.getIdentity(tx, newValue); + if (!orgIds.contains(newId)) { added.add(newValue); } } return added; } @@ -535,7 +536,6 @@ } return orgIds; - } if (collection instanceof Map) { @@ -543,14 +543,17 @@ return new ArrayList(0); } - Map newMap = (Map) collection; + HashSet newIds = new HashSet(((Map) collection).size()); + Iterator newItor = ((Map) collection).values().iterator(); + while (newItor.hasNext()) { + newIds.add(ch.getIdentity(tx, newItor.next())); + } + + ArrayList removed = new ArrayList(orgIds.size()); Iterator orgItor = orgIds.iterator(); - ArrayList removed = new ArrayList(orgIds.size()); while (orgItor.hasNext()) { Object id = orgItor.next(); - if (!newMap.containsKey(id)) { - removed.add(id); - } + if (!newIds.contains(id)) { removed.add(id); } } return removed; } Index: C:/Java/castor-2/src/main/java/org/exolab/castor/persist/DepositBox.java =================================================================== --- C:/Java/castor-2/src/main/java/org/exolab/castor/persist/DepositBox.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/exolab/castor/persist/DepositBox.java (working copy) @@ -77,7 +77,7 @@ * @throw IllegalArgumentException if tx doesn't own the box * */ - public void setObject( TransactionContext tx, Object object ); + public void setObject( TransactionContext tx, Object[] object ); /** * Get the object from the DespositBox, only the transaction @@ -87,7 +87,7 @@ * @return An object instance. * @throw IllegalArgumentException if tx doesn't own the box */ - public Object getObject( TransactionContext tx ); + public Object[] getObject( TransactionContext tx ); /** * Get the time of the most recent call on setObject(Object)}. Index: C:/Java/castor-2/src/main/java/org/exolab/castor/persist/LockEngine.java =================================================================== --- C:/Java/castor-2/src/main/java/org/exolab/castor/persist/LockEngine.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/exolab/castor/persist/LockEngine.java (working copy) @@ -76,6 +76,7 @@ import org.exolab.castor.mapping.MappingResolver; import org.exolab.castor.mapping.AccessMode; import org.exolab.castor.mapping.loader.MappingLoader; +import org.exolab.castor.persist.spi.Complex; import org.exolab.castor.persist.spi.Persistence; import org.exolab.castor.persist.spi.PersistenceFactory; @@ -529,7 +530,7 @@ oid = lock.getOID(); - Object newids = typeInfo.molder.create( tx, oid, lock, object ); + Complex newids = typeInfo.molder.create( tx, oid, lock, object ); succeed = true; oid.setDbLock( true ); @@ -534,7 +535,7 @@ oid.setDbLock( true ); - newoid = new OID(oid.getMolder(), oid.getDepends(), newids ); + newoid = new OID(oid.getMolder(), oid.getDepends(), newids); typeInfo.rename( oid, newoid, tx ); @@ -1187,13 +1188,10 @@ * @throws ObjectDeletedWaitingForLockException * @throws LockNotGrantedException Timeout or deadlock occured attempting * to acquire lock on object - * @throws ObjectDeletedException Object has been deleted from the - * persistence store. */ private ObjectLock acquire(OID oid, TransactionContext tx, short lockAction, int timeout) - throws ObjectDeletedWaitingForLockException, - LockNotGrantedException, ObjectDeletedException { + throws ObjectDeletedWaitingForLockException, LockNotGrantedException { ObjectLock entry = null; // sync on "locks" is, unfortunately, necessary if we employ Index: C:/Java/castor-2/src/main/java/org/exolab/castor/persist/OID.java =================================================================== --- C:/Java/castor-2/src/main/java/org/exolab/castor/persist/OID.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/exolab/castor/persist/OID.java (working copy) @@ -48,6 +48,8 @@ import java.io.Serializable; import java.util.ArrayList; +import org.exolab.castor.persist.spi.Complex; + /** * Object identifier. An object identifier is unique within a cache engine or * other persistence mechanism and is used to locate object based on their @@ -68,7 +70,7 @@ * The object's identity if known, null if the object was created without an * identity. */ - private final Object _identity; + private final Complex _identity; /** * The full qualified name of the object's type. @@ -126,7 +128,7 @@ /** * Constructor */ - public OID(ClassMolder molder, Object identity) { + public OID(ClassMolder molder, Complex identity) { this(molder, null, identity); } @@ -134,7 +136,7 @@ * Constructor */ public OID(ClassMolder molder, OID depends, - Object identity) { + Complex identity) { ArrayList superClassNames = null; if (molder == null) { @@ -140,11 +142,6 @@ if (molder == null) { throw new IllegalArgumentException("molder can't be null"); } - if (identity instanceof Object[]) { - IllegalArgumentException e = new IllegalArgumentException( - "identity can't be object array!"); - throw e; - } _molder = molder; _identity = identity; _name = molder.getName(); @@ -246,7 +243,7 @@ * * @return The object's identity, or null */ - public Object getIdentity() { + public Complex getIdentity() { return _identity; } Index: C:/Java/castor-2/src/main/java/org/exolab/castor/persist/ObjectLock.java =================================================================== --- C:/Java/castor-2/src/main/java/org/exolab/castor/persist/ObjectLock.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/exolab/castor/persist/ObjectLock.java (working copy) @@ -123,7 +123,7 @@ /** * The object being locked. */ - private Object _object; + private Object[] _object; /** * The object's OID. @@ -190,7 +190,7 @@ private boolean _isExpired; - private Object _expiredObject; + private Object[] _expiredObject; /** * Create a new lock for the specified object. Must not create two @@ -342,7 +342,7 @@ return _isExpired; } - public Object getObject() { + public Object[] getObject() { if ( (_expiredObject != null) && (_object == null) ) return _expiredObject; return _object; @@ -521,8 +521,7 @@ // probaraly we just don't need update.... synchronized void acquireUpdateLock( TransactionContext tx, int timeout ) - throws LockNotGrantedException, ObjectDeletedException, - ObjectDeletedWaitingForLockException { + throws LockNotGrantedException, ObjectDeletedWaitingForLockException { long endtime = timeout>0? System.currentTimeMillis() + timeout*1000: Long.MAX_VALUE; while ( true ) { @@ -603,7 +602,7 @@ } } - public synchronized void setObject( TransactionContext tx, Object object ) { + public synchronized void setObject( TransactionContext tx, Object[] object ) { _isExpired = false; // initialize cache expiration flag to false _expiredObject = null; @@ -625,7 +624,7 @@ throw new IllegalArgumentException("Transaction tx does not own this lock, "+toString()+"!"); } - public synchronized Object getObject( TransactionContext tx ) { + public synchronized Object[] getObject( TransactionContext tx ) { if ( _confirmWaiting != null && _confirmWaiting == tx ) return _object; Index: C:/Java/castor-2/src/main/java/org/exolab/castor/persist/QueryResults.java =================================================================== --- C:/Java/castor-2/src/main/java/org/exolab/castor/persist/QueryResults.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/exolab/castor/persist/QueryResults.java (working copy) @@ -58,6 +58,7 @@ import org.exolab.castor.jdo.ObjectNotFoundException; import org.exolab.castor.jdo.LockNotGrantedException; import org.exolab.castor.mapping.AccessMode; +import org.exolab.castor.persist.spi.Complex; import org.exolab.castor.persist.spi.PersistenceQuery; @@ -94,7 +95,7 @@ /** * The last identity retrieved with a call to {@link #nextIdentity}. */ - private Object _lastIdentity; + private Complex _lastIdentity; public QueryResults(TransactionContext tx, final LockEngine engine, @@ -104,8 +105,7 @@ _tx = tx; _engine = engine; _query = query; - _accessMode = - engine.getClassMolder(_query.getResultType()).getAccessMode(accessMode); + _accessMode = engine.getClassMolder(_query.getResultType()).getAccessMode(accessMode); } Index: C:/Java/castor-2/src/main/java/org/exolab/castor/persist/SQLRelationLoader.java =================================================================== --- C:/Java/castor-2/src/main/java/org/exolab/castor/persist/SQLRelationLoader.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/exolab/castor/persist/SQLRelationLoader.java (working copy) @@ -42,8 +42,6 @@ * * $Id$ */ - - package org.exolab.castor.persist; import org.exolab.castor.persist.spi.Complex; @@ -206,25 +204,18 @@ } - private Object idToSQL( int index, Object object ) - throws PersistenceException { - - if ( object == null || leftFrom[index] == null ) - return object; + private Object idToSQL(final int index, final Object object) { + if ((object == null) || (leftFrom[index] == null)) { return object; } return leftFrom[index].convert( object, leftParam[index] ); } - private Object ridToSQL( int index, Object object ) - throws PersistenceException { - - if ( object == null || rightFrom[index] == null ) - return object; - return rightFrom[index].convert( object, rightParam[index] ); + private Object ridToSQL(final int index, final Object object) { + if ((object == null) || (rightFrom[index] == null)) { return object; } + return rightFrom[index].convert(object, rightParam[index]); } - public void createRelation( Connection conn, Object leftValue, Object rightValue ) - throws PersistenceException { - + public void createRelation(final Connection conn, final Complex left, final Complex right) + throws PersistenceException { ResultSet rset = null; PreparedStatement selectStatement = null; PreparedStatement insertStatement = null; @@ -231,49 +222,27 @@ try { int count = 1; - selectStatement = conn.prepareStatement( select ); - if ( leftType.length > 1 ) { - Complex left = (Complex) leftValue; - for ( int i=0; i < left.size(); i++ ) { - selectStatement.setObject( count, idToSQL( i, left.get(i)), leftType[i] ); - count++; - } - } else { - selectStatement.setObject( count, idToSQL( 0, leftValue ), leftType[0] ); + selectStatement = conn.prepareStatement(select); + for (int i = 0; i < left.size(); i++) { + selectStatement.setObject(count, idToSQL(i, left.get(i)), leftType[i]); count++; } - if ( rightType.length > 1 ) { - Complex right = (Complex) rightValue; - for ( int i=0; i < right.size(); i++ ) { - selectStatement.setObject( count, ridToSQL( i, right.get(i) ), rightType[i] ); - count++; - } - } else { - selectStatement.setObject( count, ridToSQL( 0, rightValue ), rightType[0] ); + for (int i = 0; i < right.size(); i++) { + selectStatement.setObject(count, ridToSQL(i, right.get(i)), rightType[i]); + count++; } - count = 1; rset = selectStatement.executeQuery(); - insertStatement = conn.prepareStatement( insert ); - if ( ! rset.next() ) { - if ( leftType.length > 1 ) { - Complex left = (Complex) leftValue; - for ( int i=0; i < left.size(); i++ ) { - insertStatement.setObject( count, idToSQL( i, left.get(i)), leftType[i] ); - count++; - } - } else { - insertStatement.setObject( count, idToSQL( 0, leftValue ), leftType[0] ); - count++; - } - if ( rightType.length > 1 ) { - Complex right = (Complex) rightValue; - for ( int i=0; i < right.size(); i++ ) { - insertStatement.setObject( count, ridToSQL( i, right.get(i) ), rightType[i] ); - count++; - } - } else { - insertStatement.setObject( count, ridToSQL( 0, rightValue ), rightType[0] ); + count = 1; + insertStatement = conn.prepareStatement(insert); + if (!rset.next()) { + for (int i = 0; i < left.size(); i++) { + insertStatement.setObject(count, idToSQL(i, left.get(i)), leftType[i]); + count++; + } + for (int i = 0; i < right.size(); i++) { + insertStatement.setObject(count, ridToSQL(i, right.get(i)), rightType[i]); + count++; } insertStatement.executeUpdate(); } @@ -281,63 +250,45 @@ e.printStackTrace(); throw new PersistenceException( e.toString() ); } finally { - JDOUtils.closeResultSet(rset); - JDOUtils.closeStatement(selectStatement); - JDOUtils.closeStatement(insertStatement); + JDOUtils.closeResultSet(rset); + JDOUtils.closeStatement(selectStatement); + JDOUtils.closeStatement(insertStatement); } } - - public void deleteRelation( Connection conn, Object leftValue ) - throws PersistenceException { + public void deleteRelation(final Connection conn, final Complex left) + throws PersistenceException { PreparedStatement stmt = null; try { int count = 1; - stmt = conn.prepareStatement( deleteAll ); - if ( leftType.length > 1 ) { - Complex left = (Complex) leftValue; - for ( int i=0; i < left.size(); i++ ) { - stmt.setObject( count, idToSQL( i, left.get(i) ), leftType[i] ); + stmt = conn.prepareStatement(deleteAll); + for (int i = 0; i < left.size(); i++) { + stmt.setObject(count, idToSQL(i, left.get(i)), leftType[i]); count++; } - } else { - stmt.setObject( count, idToSQL( 0, leftValue ), leftType[0] ); - } stmt.executeUpdate(); - } catch ( SQLException e ) { + } catch (SQLException e) { e.printStackTrace(); - throw new PersistenceException( e.toString() ); + throw new PersistenceException(e.toString()); } finally { - JDOUtils.closeStatement(stmt); + JDOUtils.closeStatement(stmt); } } - public void deleteRelation( Connection conn, Object leftValue, Object rightValue ) - throws PersistenceException { - + public void deleteRelation(final Connection conn, final Complex left, final Complex right) + throws PersistenceException { PreparedStatement stmt = null; try { int count = 1; - stmt = conn.prepareStatement( delete ); - if ( leftType.length > 1 ) { - Complex left = (Complex) leftValue; - for ( int i=0; i < left.size(); i++ ) { - stmt.setObject( count, idToSQL( i, left.get(i) ), leftType[i] ); + stmt = conn.prepareStatement(delete); + for (int i = 0; i < left.size(); i++) { + stmt.setObject(count, idToSQL(i, left.get(i)), leftType[i]); count++; } - } else { - stmt.setObject( count, idToSQL( 0, leftValue ), leftType[0] ); + for (int i = 0; i < right.size(); i++) { + stmt.setObject(count, ridToSQL(i, right.get(i)), rightType[i]); count++; } - if ( rightType.length > 1 ) { - Complex right = (Complex) rightValue; - for ( int i=0; i < right.size(); i++ ) { - stmt.setObject( count, ridToSQL( i, right.get(i) ), rightType[i] ); - count++; - } - } else { - stmt.setObject( count, ridToSQL( 0, rightValue ), rightType[0] ); - } stmt.executeUpdate(); } catch ( SQLException e ) { e.printStackTrace(); @@ -343,8 +294,7 @@ e.printStackTrace(); throw new PersistenceException( e.toString() ); } finally { - JDOUtils.closeStatement(stmt); + JDOUtils.closeStatement(stmt); } } - } Index: C:/Java/castor-2/src/main/java/org/exolab/castor/persist/spi/AbstractCallQuery.java =================================================================== --- C:/Java/castor-2/src/main/java/org/exolab/castor/persist/spi/AbstractCallQuery.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/exolab/castor/persist/spi/AbstractCallQuery.java (working copy) @@ -29,7 +29,7 @@ protected ResultSet _rs; - protected Object _lastIdentity; + protected Complex _lastIdentity; protected final Class[] _types; @@ -52,10 +52,10 @@ /** * @inheritDoc - * @see org.exolab.castor.persist.spi.PersistenceQuery#fetch(org.castor.persist.ProposedEntity, - * java.lang.Object) + * @see org.exolab.castor.persist.spi.PersistenceQuery + * #fetch(org.castor.persist.ProposedEntity) */ - public Object fetch(ProposedEntity proposedObject, Object identity) + public Object fetch(ProposedEntity proposedObject) throws ObjectNotFoundException, PersistenceException { try { // Load all the fields of the object including one-one relations @@ -61,11 +61,11 @@ // Load all the fields of the object including one-one relations // index 0 belongs to the identity for (int i = 1; i < _sqlTypes.length; ++i) { - proposedObject.setField(SQLTypeInfos.getValue(_rs, i + 1, - _sqlTypes[i]), i - 1); + proposedObject.setField( + SQLTypeInfos.getValue(_rs, i + 1, _sqlTypes[i]), i - 1); } if (nextRow()) { - _lastIdentity = SQLTypeInfos.getValue(_rs, 1, _sqlTypes[0]); + _lastIdentity = new Complex(SQLTypeInfos.getValue(_rs, 1, _sqlTypes[0])); } else { _lastIdentity = null; } @@ -70,8 +70,7 @@ _lastIdentity = null; } } catch (SQLException except) { - throw new PersistenceException(Messages.format("persist.nested", - except)); + throw new PersistenceException(Messages.format("persist.nested", except)); } return null; } @@ -129,14 +128,13 @@ protected abstract void execute(Object conn, AccessMode accessMode) throws QueryException, PersistenceException; - public Object nextIdentity(Object identity) throws PersistenceException { + public Complex nextIdentity(final Complex identity) throws PersistenceException { try { if (_lastIdentity == null) { - if (!nextRow()) - return null; - _lastIdentity = SQLTypeInfos.getValue(_rs, 1, _sqlTypes[0]); - return new Complex(_lastIdentity); + if (!nextRow()) { return null; } + _lastIdentity = new Complex(SQLTypeInfos.getValue(_rs, 1, _sqlTypes[0])); + return _lastIdentity; } while (_lastIdentity.equals(identity)) { @@ -144,14 +142,12 @@ _lastIdentity = null; return null; } - _lastIdentity = SQLTypeInfos.getValue(_rs, 1, _sqlTypes[0]); + _lastIdentity = new Complex(SQLTypeInfos.getValue(_rs, 1, _sqlTypes[0])); } - return new Complex(_lastIdentity); + return _lastIdentity; } catch (SQLException except) { _lastIdentity = null; - throw new PersistenceException(Messages.format("persist.nested", - except)); + throw new PersistenceException(Messages.format("persist.nested", except)); } } - } Index: C:/Java/castor-2/src/main/java/org/exolab/castor/persist/spi/Complex.java =================================================================== --- C:/Java/castor-2/src/main/java/org/exolab/castor/persist/spi/Complex.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/exolab/castor/persist/spi/Complex.java (working copy) @@ -1,241 +0,0 @@ -/** - * Redistribution and use of this software and associated documentation - * ("Software"), with or without modification, are permitted provided - * that the following conditions are met: - * - * 1. Redistributions of source code must retain copyright - * statements and notices. Redistributions must also contain a - * copy of this document. - * - * 2. Redistributions in binary form must reproduce the - * above copyright notice, this list of conditions and the - * following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * 3. The name "Exolab" must not be used to endorse or promote - * products derived from this Software without prior written - * permission of Intalio, Inc. For written permission, - * please contact info@exolab.org. - * - * 4. Products derived from this Software may not be called "Exolab" - * nor may "Exolab" appear in their names without prior written - * permission of Intalio, Inc. Exolab is a registered - * trademark of Intalio, Inc. - * - * 5. Due credit should be given to the Exolab Project - * (http://www.exolab.org/). - * - * THIS SOFTWARE IS PROVIDED BY INTALIO, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT - * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL - * INTALIO, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * Copyright 1999 (C) Intalio, Inc. All Rights Reserved. - * - * $Id$ - */ - - -package org.exolab.castor.persist.spi; - -/** - * @author Thomas Yip - */ -public class Complex { - - private final Object _first; - - private final Object _second; - - private final Object[] _all; - - private final int _size; - - private int _hashCode; - - public Complex( Object o ) { - _size = 1; - _first = o; - _second = null; - _all = null; - _hashCode = _first.hashCode(); - } - - public Complex( int length, Object[] o ) { - _size = length; - if ( length == 1 ) { - _first = o[0]; - _second = null; - _all = null; - _hashCode = _first==null?0:_first.hashCode(); - } else if ( length == 2 ) { - _first = o[0]; - _second = o[1]; - _all = null; - _hashCode = _first==null?0:_first.hashCode(); - _hashCode += _second==null?0:_second.hashCode(); - } else if ( length <= o.length && length > 0 ) { - _first = null; - _second = null; - _all = new Object[_size]; - System.arraycopy( o, 0, _all, 0, _size ); - _hashCode = 0; - for ( int i=0; i < _size; i++ ) { - _hashCode += (_all[i]==null?0:_all[i].hashCode()); - } - } else - throw new IllegalArgumentException("Invalid Complex object"); - } - - public Complex( Object o1, Object o2 ) { - _size = 2; - _first = o1; - _second = o2; - _all = null; - _hashCode = _first==null?0:_first.hashCode(); - _hashCode += _second==null?0:_second.hashCode(); - } - - public Complex( Object[] o ) { - // try to avoid creation of another object - if ( o == null || o.length == 0 ) - throw new NullPointerException(); - - if ( o.length == 1 ) { - _size = 1; - _first = o[0]; - _second = null; - _all = null; - _hashCode = _first.hashCode(); - } else if ( o.length == 2 ) { - _size = 2; - _first = o[0]; - _second = o[1]; - _all = null; - _hashCode = _first.hashCode(); - _hashCode += _second==null?0:_second.hashCode(); - } else { - _size = o.length; - _first = null; - _second = null; - _all = new Object[_size]; - System.arraycopy( o, 0, _all, 0, _size ); - _hashCode = 0; - for ( int i=0; i < _size; i++ ) { - _hashCode += (_all[i]==null?0:_all[i].hashCode()); - } - } - } - - public Complex( Complex complex ) { - // try to avoid creation of another object - if ( complex == null || complex.size() == 0 ) - throw new NullPointerException(); - - int dim = complex.size(); - - if ( dim == 1 ) { - _size = 1; - _first = complex.get(0); - _second = null; - _all = null; - _hashCode = _first.hashCode(); - } else if ( dim == 2 ) { - _first = complex.get(0); - _second = complex.get(1); - _all = null; - _size = 2; - _hashCode = _first.hashCode(); - _hashCode += _second==null?0:_second.hashCode(); - } else { - _size = dim; - _first = null; - _second = null; - _all = new Object[_size]; - System.arraycopy( complex, 0, _all, 0, _size ); - _hashCode = 0; - for ( int i=0; i < _size; i++ ) { - _hashCode += (_all[i]==null?0:_all[i].hashCode()); - } - } - } - - public boolean equals( Object other ) { - if ( other == null ) { - return false; - } - if ( !(other instanceof Complex) ) { - return false; - } - - Complex comp = (Complex) other; - if ( comp.size() != _size ) { - return false; - } - - for ( int i=0; i < _size; i++ ) { - if (get(i) == null) { - if (comp.get(i) != null) { return false; } - } else if (!get(i).equals(comp.get(i))) { - return false; - } - } - return true; - } - - public int size() { - return _size; - } - - public boolean hasSomePartsNull() { - - for ( int i=0; i < _size; i++ ) { - if ( get(i) == null ) - return true; - } - return false; - } - public int hashCode() { - return _hashCode; - } - public Object get( int i ) { - - if ( i >= _size || i < 0 ) - throw new ArrayIndexOutOfBoundsException(); - if ( _size <= 2 ) - return i == 0 ? _first : _second; - - return _all[i]; - } - - /* - * Overrides Object.toString() - * @see java.lang.Object#toString() - */ - public String toString() { - StringBuffer sb = new StringBuffer(); - sb.append("<"); - for( int i=0; i < _size; i++ ) { - if ( i != 0 ) - sb.append(","); - Object obj = get(i); - sb.append(obj); - if (obj != null) - sb.append("(").append(obj.hashCode()).append(")"); - else - sb.append ("(N/A)"); - } - sb.append(">"); - return sb.toString(); - } - -} - Index: C:/Java/castor-2/src/main/java/org/exolab/castor/persist/spi/Complex.java =================================================================== --- C:/Java/castor-2/src/main/java/org/exolab/castor/persist/spi/Complex.java (revision 0) +++ C:/Java/castor-2/src/main/java/org/exolab/castor/persist/spi/Complex.java (revision 5977) @@ -0,0 +1,88 @@ +package org.exolab.castor.persist.spi; + +public class Complex { + private final Object[] _all; + + private int _hashCode; + + public Complex(final Object o) { + if (o instanceof Complex) { + Complex identity = (Complex) o; + _all = new Object[identity.size()]; + _hashCode = 0; + for (int i = 0; i < identity.size(); i++) { + _all[i] = identity.get(i); + _hashCode += ((_all[i] == null) ? 0 : _all[i].hashCode()); + } + } else if (o instanceof Object[]) { + Object[] array = (Object[]) o; + _all = new Object[array.length]; + _hashCode = 0; + for (int i = 0; i < array.length; i++) { + _all[i] = array[i]; + _hashCode += ((array[i] == null) ? 0 : array[i].hashCode()); + } + } else { + _all = new Object[] { o }; + _hashCode = o.hashCode(); + } + } + + public Complex(final Object[] array) { + _all = new Object[array.length]; + _hashCode = 0; + for (int i = 0; i < array.length; i++) { + _all[i] = array[i]; + _hashCode += ((array[i] == null) ? 0 : array[i].hashCode()); + } + } + + public Complex(final Object o1, final Object o2) { + _all = new Object[] { o1, o2 }; + _hashCode = ((o1 == null) ? 0 : o1.hashCode()); + _hashCode += ((o2 == null) ? 0 : o2.hashCode()); + } + + public int size() { return _all.length; } + + public Object get(final int i) { return _all[i]; } + + public Object[] get() { return _all; } + + public boolean equals(final Object other) { + if (other == null) { return false; } + if (!(other instanceof Complex)) { return false; } + + Complex id = (Complex) other; + if (_all.length != id.size()) { return false; } + + for (int i = 0; i < _all.length; i++ ) { + if (_all[i] == null) { + if (id._all[i] != null) { return false; } + } else if (!_all[i].equals(id._all[i])) { + return false; + } + } + return true; + } + + public int hashCode() { return _hashCode; } + + public String toString() { + StringBuffer sb = new StringBuffer(); + sb.append("<"); + for(int i = 0; i < _all.length; i++) { + if (i != 0) { sb.append(","); } + Object obj = _all[i]; + sb.append(obj); + if (obj != null) { + sb.append("(").append(obj.hashCode()).append(")"); + } else { + sb.append ("(N/A)"); + } + } + sb.append(">"); + return sb.toString(); + } +} + Index: C:/Java/castor-2/src/main/java/org/exolab/castor/persist/spi/Persistence.java =================================================================== --- C:/Java/castor-2/src/main/java/org/exolab/castor/persist/spi/Persistence.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/exolab/castor/persist/spi/Persistence.java (working copy) @@ -101,8 +101,8 @@ * exists in persistent storage or any other persistence error * occured. */ - public Object create(Database database, Object conn, - ProposedEntity entity, Object identity) + public Complex create(Database database, Object conn, + ProposedEntity entity, Complex identity) throws PersistenceException; /** @@ -122,7 +122,7 @@ * @throws PersistenceException The object was not found in persistent * storage or any other persistence error occured. */ - public Object load(Object conn, ProposedEntity proposedObject, Object identity, + public Object load(Object conn, ProposedEntity proposedObject, Complex identity, AccessMode accessMode) throws PersistenceException; @@ -154,7 +154,7 @@ * deleted from persitence storage or any other persistence * error occored. */ - public Object store(Object conn, Object identity, + public Object store(Object conn, Complex identity, ProposedEntity newentity, ProposedEntity oldentity) throws PersistenceException; @@ -169,7 +169,7 @@ * @param identity The object's identity * @throws PersistenceException A persistence error occured */ - public void delete(Object conn, Object identity) + public void delete(Object conn, Complex identity) throws PersistenceException; /** Index: C:/Java/castor-2/src/main/java/org/exolab/castor/persist/spi/PersistenceQuery.java =================================================================== --- C:/Java/castor-2/src/main/java/org/exolab/castor/persist/spi/PersistenceQuery.java (revision 5977) +++ C:/Java/castor-2/src/main/java/org/exolab/castor/persist/spi/PersistenceQuery.java (working copy) @@ -116,7 +116,7 @@ * @throws PersistenceException An error reported by the * persistence engine */ - public Object nextIdentity(Object identity) + public Complex nextIdentity(Complex identity) throws PersistenceException; /** @@ -135,7 +135,6 @@ * results rather than issuing a new query to load the object. * * @param fields The fields to load into - * @param identity The object's identity * @return The object's stamp, or null * @throws PersistenceException The object was not found in * persistent storage or any other persistence error occured. @@ -141,7 +140,7 @@ * persistent storage or any other persistence error occured. * @see Persistence#load */ - public Object fetch(ProposedEntity proposedObject, Object identity) + public Object fetch(ProposedEntity proposedObject) throws PersistenceException; /** Index: C:/Java/castor-2/src/test/java/org/castor/cache/TestCacheFactoryRegistry.java =================================================================== --- C:/Java/castor-2/src/test/java/org/castor/cache/TestCacheFactoryRegistry.java (revision 5977) +++ C:/Java/castor-2/src/test/java/org/castor/cache/TestCacheFactoryRegistry.java (working copy) @@ -27,8 +27,12 @@ import org.apache.log4j.Logger; import org.castor.cache.distributed.CoherenceCache; import org.castor.cache.distributed.CoherenceCacheFactory; +import org.castor.cache.distributed.EHCache; +import org.castor.cache.distributed.EHCacheFactory; import org.castor.cache.distributed.FKCache; import org.castor.cache.distributed.FKCacheFactory; +import org.castor.cache.distributed.GigaspacesCache; +import org.castor.cache.distributed.GigaspacesCacheFactory; import org.castor.cache.distributed.JCache; import org.castor.cache.distributed.JCacheFactory; import org.castor.cache.distributed.JcsCache; @@ -107,7 +111,7 @@ public void testGetCacheNames() { Configuration config = Configuration.getInstance(); Collection col = new CacheFactoryRegistry(config).getCacheNames(); - assertEquals(11, col.size()); + assertEquals(13, col.size()); assertTrue(col.contains(CountLimited.TYPE)); assertTrue(col.contains(NoCache.TYPE)); assertTrue(col.contains(TimeLimited.TYPE)); @@ -119,6 +123,8 @@ assertTrue(col.contains(OsCache.TYPE)); assertTrue(col.contains(FIFOHashbelt.TYPE)); assertTrue(col.contains(LRUHashbelt.TYPE)); + assertTrue(col.contains(EHCache.TYPE)); + assertTrue(col.contains(GigaspacesCache.TYPE)); } public void testGetCacheFactories() { @@ -124,7 +130,7 @@ public void testGetCacheFactories() { Configuration config = Configuration.getInstance(); Collection col = new CacheFactoryRegistry(config).getCacheFactories(); - assertEquals(11, col.size()); + assertEquals(13, col.size()); assertTrue(containsInstanceOf(col, CountLimitedFactory.class)); assertTrue(containsInstanceOf(col, NoCacheFactory.class)); assertTrue(containsInstanceOf(col, TimeLimitedFactory.class)); @@ -136,6 +142,8 @@ assertTrue(containsInstanceOf(col, OsCacheFactory.class)); assertTrue(containsInstanceOf(col, FIFOHashbeltFactory.class)); assertTrue(containsInstanceOf(col, LRUHashbeltFactory.class)); + assertTrue(containsInstanceOf(col, EHCacheFactory.class)); + assertTrue(containsInstanceOf(col, GigaspacesCacheFactory.class)); } private boolean containsInstanceOf(final Collection col, final Class cls) { Index: C:/Java/castor-2/src/test/java/org/castor/cache/simple/TestTimeLimited.java =================================================================== --- C:/Java/castor-2/src/test/java/org/castor/cache/simple/TestTimeLimited.java (revision 5977) +++ C:/Java/castor-2/src/test/java/org/castor/cache/simple/TestTimeLimited.java (working copy) @@ -285,7 +285,7 @@ try { Properties params = new Properties(); params.put(Cache.PARAM_NAME, "dummy"); - params.put(TimeLimited.PARAM_TTL, "3"); + params.put(TimeLimited.PARAM_TTL, "5"); cache.initialize(params); } catch (CacheAcquireException ex) { fail("Unexpected CacheAcquireException at initialization."); Index: C:/Java/castor-2/src/test/java/org/castor/persist/cache/TestCacheEntry.java =================================================================== --- C:/Java/castor-2/src/test/java/org/castor/persist/cache/TestCacheEntry.java (revision 5977) +++ C:/Java/castor-2/src/test/java/org/castor/persist/cache/TestCacheEntry.java (working copy) @@ -90,7 +90,7 @@ ce.setOID(null); assertNull(ce.getOID()); - Object entry = new Object(); + Object[] entry = new Object[] {}; ce.setEntry(entry); assertTrue(entry == ce.getEntry()); ce.setEntry(null); @@ -104,7 +104,7 @@ public void testConstructor() throws Exception { OID oid = createOID(); - Object entry = new Object(); + Object[] entry = new Object[] {}; CacheEntry src = createCacheEntry(); src.setOID(oid); Index: C:/Java/castor-2/src/tests/ctf/jdo/tc20x/TestSelfRelation.java =================================================================== --- C:/Java/castor-2/src/tests/ctf/jdo/tc20x/TestSelfRelation.java (revision 5977) +++ C:/Java/castor-2/src/tests/ctf/jdo/tc20x/TestSelfRelation.java (working copy) @@ -147,8 +147,7 @@ // assertEquals(1, child.getParent().getId().intValue()); counter++; - assertTrue("At least two children should have been loaded.", - counter >= 2); + assertTrue("At least two children should have been loaded.", counter >= 2); db.commit(); db.close(); Index: C:/Java/castor-2/src/tests/ctf/jdo/tc7x/TestAutostore.java =================================================================== --- C:/Java/castor-2/src/tests/ctf/jdo/tc7x/TestAutostore.java (revision 5977) +++ C:/Java/castor-2/src/tests/ctf/jdo/tc7x/TestAutostore.java (working copy) @@ -222,7 +222,7 @@ try { assocOne = (AutostoreAssociated1) db.load(AutostoreAssociated1.class, new Integer(300)); - // TODO: remove once support for cascading delete has been added + // TODO remove once support for cascading delete has been added // fail("Expected ObjectNotFoundException"); } catch (ObjectNotFoundException e) { // @@ -229,7 +229,7 @@ } db.commit(); - // TODO: remove once support for cascading deletes has been added + // TODO remove once support for cascading deletes has been added db.begin(); assocOne = (AutostoreAssociated1) db.load(AutostoreAssociated1.class, new Integer(300)); Index: C:/Java/castor-2/src/tests/ctf/jdo/tc7x/TestAutostoreMany.java =================================================================== --- C:/Java/castor-2/src/tests/ctf/jdo/tc7x/TestAutostoreMany.java (revision 5977) +++ C:/Java/castor-2/src/tests/ctf/jdo/tc7x/TestAutostoreMany.java (working copy) @@ -250,7 +250,7 @@ try { many = (AutostoreAssociatedMany) db.load(AutostoreAssociatedMany.class, new Integer(300)); - // TODO: remove once support for cascading delete has been added + // TODO remove once support for cascading delete has been added // fail("Expected ObjectNotFoundException"); } catch (ObjectNotFoundException e) { // @@ -257,7 +257,7 @@ } db.commit(); - // TODO: remove once support for cascading delete has been added + // TODO remove once support for cascading delete has been added db.begin(); many = (AutostoreAssociatedMany) db.load(AutostoreAssociatedMany.class, new Integer(300)); Index: C:/Java/castor-2/src/tests/ctf/jdo/tc8x/TestIdentityPerFieldMapping.java =================================================================== --- C:/Java/castor-2/src/tests/ctf/jdo/tc8x/TestIdentityPerFieldMapping.java (revision 5977) +++ C:/Java/castor-2/src/tests/ctf/jdo/tc8x/TestIdentityPerFieldMapping.java (working copy) @@ -22,7 +22,6 @@ import org.exolab.castor.jdo.Database; import org.exolab.castor.persist.spi.Complex; - /** * JUnit test to test drive specification of class identity through the use of the * identity attribute on the mapping. Index: C:/Java/castor-2/src/tests/ctf/jdo/tc8x/TestLazy1to1.java =================================================================== --- C:/Java/castor-2/src/tests/ctf/jdo/tc8x/TestLazy1to1.java (revision 5977) +++ C:/Java/castor-2/src/tests/ctf/jdo/tc8x/TestLazy1to1.java (working copy) @@ -37,7 +37,6 @@ */ public final class TestLazy1to1 extends CastorTestCase { private JDOCategory _category; - private Database _wrapper; public TestLazy1to1(final TestHarness category) { super(category, "TC87", "TestLazy1to1"); @@ -435,11 +434,11 @@ } public void testLoadBookWithLazyAuthorProperty() throws Exception { - _wrapper = _category.getDatabase(); - _wrapper.begin(); + Database db1 = _category.getDatabase(); + db1.begin(); try { - _wrapper.load(Lazy1to1Author.class, new Long(1)); + db1.load(Lazy1to1Author.class, new Long(1)); } catch (ObjectNotFoundException e) { fail("Database should contain an author with id=1"); } @@ -444,13 +443,13 @@ fail("Database should contain an author with id=1"); } - Database db = _category.getDatabase(); - db.begin(); + Database db2 = _category.getDatabase(); + db2.begin(); - OQLQuery qry = db.getOQLQuery( + OQLQuery qry = db2.getOQLQuery( "SELECT o FROM " + Lazy1to1Book.class.getName() + " o"); QueryResults results = qry.execute(); - assertTrue("Should have a book in db, but couldn't it: ", results.hasMore()); + assertTrue("Couldn't find the book in db: ", results.hasMore()); Lazy1to1Book book = null; if (results.hasMore()) { @@ -461,12 +460,12 @@ assertNotNull("author should have a last name", currentAuthor.getLastName()); } - db.commit(); - db.close(); + db2.commit(); + db2.close(); - if (_wrapper != null) { + if (db1 != null) { try { - _wrapper.commit(); + db1.commit(); } catch (Exception ex) { ex.printStackTrace(); fail("Unexpected exception committing wrapper db: " + ex.getMessage()); @@ -471,7 +470,7 @@ ex.printStackTrace(); fail("Unexpected exception committing wrapper db: " + ex.getMessage()); } finally { - _wrapper.close(); + db1.close(); } } } Index: C:/Java/castor-2/src/tests/ctf/jdo/tc9x/TestPolymorphism.java =================================================================== --- C:/Java/castor-2/src/tests/ctf/jdo/tc9x/TestPolymorphism.java (revision 5977) +++ C:/Java/castor-2/src/tests/ctf/jdo/tc9x/TestPolymorphism.java (working copy) @@ -136,7 +136,7 @@ laptop = (Laptop) database.load(Laptop.class, new Integer(10)); fail("Laptop with id 10 still exists."); } catch (ObjectNotFoundException e) { - assertEquals("The object of type ctf.jdo.tc9x.Laptop with identity 10 " + assertEquals("The object of type ctf.jdo.tc9x.Laptop with identity <10(10)> " + "was not found in persistent storage", e.getMessage()); } database.commit();