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();