You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-dev@db.apache.org by ar...@apache.org on 2006/07/15 16:28:05 UTC

svn commit: r422235 [3/3] - in /db/ojb/trunk/src: java/org/apache/ojb/odmg/ java/org/apache/ojb/odmg/oql/ java/org/apache/ojb/odmg/states/ java/org/odmg/ jdori/org/apache/ojb/jdori/sql/ samples/org/apache/ojb/tutorials/

Modified: db/ojb/trunk/src/java/org/apache/ojb/odmg/TransactionImpl.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/odmg/TransactionImpl.java?rev=422235&r1=422234&r2=422235&view=diff
==============================================================================
--- db/ojb/trunk/src/java/org/apache/ojb/odmg/TransactionImpl.java (original)
+++ db/ojb/trunk/src/java/org/apache/ojb/odmg/TransactionImpl.java Sat Jul 15 07:28:03 2006
@@ -1,6 +1,6 @@
 package org.apache.ojb.odmg;
 
-/* Copyright 2002-2004 The Apache Software Foundation
+/* Copyright 2002-2006 The Apache Software Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,12 +23,15 @@
 import java.util.List;
 
 import org.apache.commons.lang.SystemUtils;
+import org.apache.commons.lang.builder.ToStringBuilder;
+import org.apache.commons.lang.builder.ToStringStyle;
 import org.apache.ojb.broker.Identity;
 import org.apache.ojb.broker.OJBRuntimeException;
 import org.apache.ojb.broker.PBFactoryException;
 import org.apache.ojb.broker.PersistenceBroker;
 import org.apache.ojb.broker.PersistenceBrokerException;
 import org.apache.ojb.broker.PersistenceBrokerInternal;
+import org.apache.ojb.broker.cache.SessionCache;
 import org.apache.ojb.broker.core.proxy.CollectionProxy;
 import org.apache.ojb.broker.core.proxy.CollectionProxyListener;
 import org.apache.ojb.broker.core.proxy.IndirectionHandler;
@@ -38,10 +41,12 @@
 import org.apache.ojb.broker.metadata.CollectionDescriptor;
 import org.apache.ojb.broker.metadata.ObjectReferenceDescriptor;
 import org.apache.ojb.broker.util.BrokerHelper;
-import org.apache.ojb.broker.util.GUID;
+import org.apache.ojb.broker.util.GUIDFactory;
+import org.apache.ojb.broker.util.IdentityArrayList;
 import org.apache.ojb.broker.util.logging.Logger;
 import org.apache.ojb.broker.util.logging.LoggerFactory;
 import org.apache.ojb.odmg.locking.LockManager;
+import org.apache.ojb.odmg.locking.LockManagerOdmgImpl;
 import org.odmg.DatabaseClosedException;
 import org.odmg.LockNotGrantedException;
 import org.odmg.ODMGRuntimeException;
@@ -50,13 +55,8 @@
 import org.odmg.TransactionNotInProgressException;
 
 /**
+ * Implementation of Transaction for {@link org.odmg.Transaction}.
  *
- * Implementation of Transaction for org.odmg.Transaction.
- *
- * @author     Thomas Mahler & David Dixon-Peugh
- * @author <a href="mailto:mattbaird@yahoo.com">Matthew Baird</a>
- * @author <a href="mailto:armin@codeAuLait.de">Armin Waibel</a>
- * @author <a href="mailto:brianm@apache.org">Brian McCallister</a>
  * @version $Id$
  *
  */
@@ -64,16 +64,18 @@
         implements Transaction, MaterializationListener, CollectionProxyListener, TransactionExt
 {
     private Logger log = LoggerFactory.getLogger(TransactionImpl.class);
+
+    private static final GUIDFactory guid = new GUIDFactory();
+
+    private final String txGUID;
+    private final ImplementationImpl implementation;
+    private final NamedRootsMap namedRootsMap;
+    protected PersistenceBrokerInternal broker = null;
+    //private ArrayList registrationList = new ArrayList();
+
     private boolean impliciteWriteLocks;
     private boolean implicitLocking;
     private boolean ordering;
-    private boolean noteUserOrdering;
-
-    private String txGUID;
-    protected PersistenceBrokerInternal broker = null;
-    private ArrayList registrationList = new ArrayList();
-    private ImplementationImpl implementation;
-    private NamedRootsMap namedRootsMap;
 
     /**
      * The status of the current transaction, as specified by the
@@ -86,7 +88,7 @@
      * the internal table containing all Objects "touched" by this tx and their
      * respective transactional state
      */
-    protected ObjectEnvelopeTable objectEnvelopeTable = null;
+    public final ObjectEnvelopeTable objectEnvelopeTable;
 
     /**
      * reference to the currently opened database
@@ -99,17 +101,27 @@
      */
     private ArrayList registeredIndirectionHandlers = new ArrayList();
 
+    /*
+    arminw:
+    in both cases below we have to use identity based lists, because normal
+    lists will call obj.equals(...) which will materialize the proxy object
+    */
     /**
      * Unloaded collection proxies which will be registered with tx when
      * collection is loaded
      */
-    private ArrayList registeredCollectionProxies = new ArrayList();
+    private IdentityArrayList registeredCollectionProxies = new IdentityArrayList();
 
     /**
      * list of proxy objects that were locked, but haven't been materialized yet.
      * This is necessary so the locks can be released on closing the transaction
      */
-    private ArrayList unmaterializedLocks = new ArrayList();
+    private IdentityArrayList unmaterializedLocks = new IdentityArrayList();
+
+    /**
+     * This list is used to avoid endless loops on circular referenced objects.
+     */
+    private ArrayList currentRegistered = new ArrayList();
 
     /**
      * Creates new Transaction
@@ -121,12 +133,12 @@
         this.impliciteWriteLocks = implementation.isImpliciteWriteLocks();
         this.implicitLocking = implementation.isImplicitLocking();
         this.ordering = implementation.isOrdering();
-        this.noteUserOrdering = implementation.isNoteUserOrder();
-
-        // assign a globally uniqe id to this tx
-        txGUID = new GUID().toString();
+        // assign a uniqe id to this tx
+        txGUID = guid.next();
         curDB = implementation.getCurrentDatabase();
         namedRootsMap = new NamedRootsMap(this);
+        // initialize the ObjectEnvelope table
+        objectEnvelopeTable = new ObjectEnvelopeTable(this);
     }
 
     public ImplementationImpl getImplementation()
@@ -221,70 +233,112 @@
         if (log.isDebugEnabled()) log.debug("lock object was called on tx " + this + ", object is " + obj.toString());
         checkOpen();
         RuntimeObject rtObject = new RuntimeObject(obj, this);
-        lockAndRegister(rtObject, lockMode, isImplicitLocking(), getRegistrationList());
-        if(isImplicitLocking()) moveToLastInOrderList(rtObject.getIdentity());
+        lockAndRegister(rtObject, lockMode, isImplicitLocking());
     }
 
     /**
-     * Returns an empty List for registration of processed object Identity.
-     */
-    public ArrayList getRegistrationList()
-    {
-        clearRegistrationList();
-        return registrationList;
-    }
-
-    /**
-     * Clears the list of processed object Identity.
+     * Lock and register the specified object, make sure that when cascading locking and register
+     * is enabled to specify a List to register the already processed object Identiy.
      */
-    public void clearRegistrationList()
+    public void lockAndRegister(RuntimeObject rtObject, int lockMode)
     {
-        registrationList.clear();
+        lockAndRegister(rtObject, lockMode, isImplicitLocking());
     }
 
     /**
      * Lock and register the specified object, make sure that when cascading locking and register
      * is enabled to specify a List to register the already processed object Identiy.
      */
-    public void lockAndRegister(RuntimeObject rtObject, int lockMode, List registeredObjects)
+    public synchronized void lockAndRegister(RuntimeObject rtObject, int lockMode, boolean cascade)
     {
-        lockAndRegister(rtObject, lockMode, isImplicitLocking(), registeredObjects);
+        internalLockRegister(rtObject, lockMode, cascade);
+        if(currentRegistered.size() > 0) currentRegistered.clear();
     }
 
     /**
      * Lock and register the specified object, make sure that when cascading locking and register
      * is enabled to specify a List to register the already processed object Identiy.
      */
-    public void lockAndRegister(RuntimeObject rtObject, int lockMode, boolean cascade, List registeredObjects)
+    private void internalLockRegister(final RuntimeObject rtObject, final int lockMode, final boolean cascade)
     {
+        if(log.isDebugEnabled()) log.debug("Lock and register called for " + rtObject.getIdentity());
         // if current object was already locked, do nothing
         // avoid endless loops when circular object references are used
-        if(!registeredObjects.contains(rtObject.getIdentity()))
+        Identity oid = rtObject.getIdentity();
+        ObjectEnvelope mod = objectEnvelopeTable.getByIdentity(oid);
+        if(mod == null && !currentRegistered.contains(oid))
         {
+            currentRegistered.add(oid);
+            Object objectToRegister = rtObject.getObj();
             /*
             arminw: This is used to re-/initialize OJBAssociate objects
             (e.g. the odmg collection implementations use this interface)
             with current pc-configuration and OJB's tx-manager.
             */
             getImplementation().prepareOJBBaseInstance(rtObject.getObj());
-            if(cascade) registeredObjects.add(rtObject.getIdentity());
+            /*
+            if the object is a Proxy there are two options:
+            1. The proxies real subject has already been materialized:
+               we take this real subject as the object to register and proceed
+               as if it were a ordinary object.
+            2. The real subject has not been materialized: Then there is nothing
+               to be registered now!
+               Of course we might just materialize the real subject to have something
+               to register. But this would make proxies useless for ODMG as proxies would
+               get materialized even if their real subjects were not used by the
+               client app.
+               Thus we register the current transaction as a Listener to the IndirectionHandler
+               of the Proxy.
+               Only when the IndirectionHandler performs the materialization of the real subject
+               at some later point in time it invokes callbacks on all it's listeners.
+               Using this callback we can defer the registering until it's really needed.
+            */
+            if(rtObject.isProxy())
+            {
+                IndirectionHandler handler = rtObject.getHandler();
+                if(handler == null)
+                {
+                    throw new OJBRuntimeException("Unexpected error, expect an proxy object as indicated: " + rtObject);
+                }
+                if (handler.alreadyMaterialized())
+                {
+                    objectToRegister = handler.getRealSubject();
+                }
+                else
+                {
+                    lockUnmaterializedObject(rtObject, lockMode, handler);
+                    // all work is done, so set to null to skip
+                    // "normal" registration/lock below
+                    objectToRegister = null;
+                }
+            }
+            if(objectToRegister != null)
+            {
+                if(cascade)
+                {
+                    // lock and register 1:1 references first
+                    //
+                    // If implicit locking is used, we have to use the materialized main object
+                    // to lock the referenced objects too
+                    internalLockRegisterReferences(rtObject.getCld(), rtObject.getObjMaterialized(), lockMode, cascade);
+                }
             try
             {
                 // perform the lock on the object
                 // we don't need to lock new objects
                 if(!rtObject.isNew())
                 {
-                    doSingleLock(rtObject.getCld(), rtObject.getObj(), rtObject.getIdentity(), lockMode);
+                        internalSingleLock(rtObject.getCld(), rtObject.getIdentity(), lockMode);
                 }
-                // now register specified object + register and lock recursive all referenced objects
                 // after we locked the object, register it to detect status and changes while tx
-                register(rtObject, lockMode, cascade, registeredObjects);
+                    internalSingleRegister(rtObject, lockMode);
             }
             catch (Throwable t)
             {
                 //log.error("Locking of obj " + rtObject.getIdentity() + " failed", t);
-                // if registering of object fails, release lock on object
-                implementation.getLockManager().releaseLock(this, rtObject.getIdentity(), rtObject.getObj());
+                // if registering of object fails release lock on object, because later we don't
+                // get a change to do this.
+                    implementation.getLockManager().releaseLock(this, rtObject.getIdentity());
                 if(t instanceof LockNotGrantedException)
                 {
                     throw (LockNotGrantedException) t;
@@ -297,6 +351,31 @@
                             + ": " + t.getMessage() + "]");
                 }
             }
+                if(cascade)
+                {
+                    // perform locks and register 1:n and m:n references
+                    // If implicit locking is used, we have to use the materialized main object
+                    // to lock the referenced objects too
+                    internalLockRegisterCollections(rtObject.getCld(), rtObject.getObjMaterialized(), lockMode, cascade);
+        }
+    }
+        }
+        else
+        {
+            /*
+            TODO:
+            Replace this intransparent detach/attach workaround with a
+            real detach/attach service
+            */
+            if(mod != null)
+            {
+                // only use real objects, no proxy instances
+                Object realObj = rtObject.getObjMaterialized();
+                if(realObj != null)
+                {
+                    mod.refreshObjectIfNeeded(realObj);
+                }
+            }
         }
     }
 
@@ -312,15 +391,15 @@
      *
      * @exception  LockNotGrantedException    Description of Exception
      */
-    void doSingleLock(ClassDescriptor cld, Object obj, Identity oid, int lockMode) throws LockNotGrantedException
+    void internalSingleLock(final ClassDescriptor cld, final Identity oid, final int lockMode) throws LockNotGrantedException
     {
-        LockManager lm = implementation.getLockManager();
         if (cld.isAcceptLocks())
         {
+            LockManager lm = implementation.getLockManager();
             if (lockMode == Transaction.READ)
             {
                 if (log.isDebugEnabled()) log.debug("Do READ lock on object: " + oid);
-                if(!lm.readLock(this, oid, obj))
+                if(!lm.readLock(this, oid, cld))
                 {
                     throw new LockNotGrantedException("Can not lock for READ: " + oid);
                 }
@@ -328,7 +407,7 @@
             else if (lockMode == Transaction.WRITE)
             {
                 if (log.isDebugEnabled()) log.debug("Do WRITE lock on object: " + oid);
-                if(!lm.writeLock(this, oid, obj))
+                if(!lm.writeLock(this, oid, cld))
                 {
                     throw new LockNotGrantedException("Can not lock for WRITE: " + oid);
                 }
@@ -336,7 +415,7 @@
             else if (lockMode == Transaction.UPGRADE)
             {
                 if (log.isDebugEnabled()) log.debug("Do UPGRADE lock on object: " + oid);
-                if(!lm.upgradeLock(this, oid, obj))
+                if(!lm.upgradeLock(this, oid, cld))
                 {
                     throw new LockNotGrantedException("Can not lock for UPGRADE: " + oid);
                 }
@@ -344,9 +423,11 @@
         }
         else
         {
-            if (log.isDebugEnabled()) log.debug("Class '" + cld.getClassNameOfObject()
-                    + "' doesn't accept locks (specified in class-descriptor), so OJB skip this object: "
-                    + oid);
+            if (log.isDebugEnabled())
+            {
+                log.debug("Class '" + cld.getClassNameOfObject() + "' doesn't accept locks" +
+                        " (accept-locks=false) when implicite locked, so OJB skip this object: " + oid);
+            }
         }
     }
 
@@ -374,6 +455,7 @@
         if (!getBroker().isInTransaction())
         {
             if (log.isDebugEnabled()) log.debug("call beginTransaction() on PB instance");
+            broker.setManaged(implementation.isManaged());
             broker.beginTransaction();
         }
 
@@ -385,7 +467,7 @@
         // now we have to perform the named objects
         namedRootsMap.performDeletion();
         namedRootsMap.performInsert();
-        namedRootsMap.afterWriteCleanup();
+        namedRootsMap.cleanup();
     }
 
     /**
@@ -399,6 +481,7 @@
         performTransactionAwareBeforeRollback();
 
         // Now, we abort everything. . .
+        namedRootsMap.cleanup();
         objectEnvelopeTable.rollback();
 
         // Now, we notify everything the abort is done.
@@ -412,23 +495,21 @@
     {
         try
         {
-            LockManager lm = getImplementation().getLockManager();
-            Enumeration en = objectEnvelopeTable.elements();
-            while (en.hasMoreElements())
+            try
             {
-                ObjectEnvelope oe = (ObjectEnvelope) en.nextElement();
-                lm.releaseLock(this, oe.getIdentity(), oe.getObject());
+                // this tx is no longer interested in materialization callbacks
+                unRegisterFromAllIndirectionHandlers();
+                unRegisterFromAllCollectionProxies();
             }
-
-            //remove locks for objects which haven't been materialized yet
-            for (Iterator it = unmaterializedLocks.iterator(); it.hasNext();)
+            catch(Exception e)
             {
-                lm.releaseLock(this, it.next());
+                log.error("Unexpected error while unregister transaction from proxy listener", e);
             }
 
-            // this tx is no longer interested in materialization callbacks
-            unRegisterFromAllIndirectionHandlers();
-            unRegisterFromAllCollectionProxies();
+            LockManager lm = getImplementation().getLockManager();
+            // this call is important to unlock registered
+            // objects and unregistered proxies
+            lm.releaseLocks(this);
         }
         finally
         {
@@ -437,41 +518,28 @@
              */
             if (log.isDebugEnabled())
                 log.debug("Close Transaction and release current PB " + broker + " on tx " + this);
+            txStatus = Status.STATUS_NO_TRANSACTION;
             // remove current thread from LocalTxManager
             // to avoid problems for succeeding calls of the same thread
             implementation.getTxManager().deregisterTx(this);
-            // now cleanup and prepare for reuse
-            refresh();
+            // now cleanup the use broker instance
+            cleanupBroker();
         }
     }
 
     /**
-     * cleanup tx and prepare for reuse
+     * Prepare this tx for reuse
      */
     protected void refresh()
     {
-        if (log.isDebugEnabled())
-                log.debug("Refresh this transaction for reuse: " + this);
-        try
-        {
+        if (log.isDebugEnabled()) log.debug("Refresh this transaction for reuse: " + this);
             // we reuse ObjectEnvelopeTable instance
-            objectEnvelopeTable.refresh();
-        }
-        catch (Exception e)
-        {
-            if (log.isDebugEnabled())
-            {
-                log.debug("error closing object envelope table : " + e.getMessage());
-                e.printStackTrace();
-            }
-        }
-        cleanupBroker();
+        objectEnvelopeTable.prepareForUse();
         // clear the temporary used named roots map
         // we should do that, because same tx instance
         // could be used several times
         broker = null;
-        clearRegistrationList();
-        unmaterializedLocks.clear();
+        if(unmaterializedLocks.size() > 0) unmaterializedLocks.clear();
         txStatus = Status.STATUS_NO_TRANSACTION;
     }
 
@@ -525,7 +593,7 @@
         }
         catch (Throwable t)
         {
-            log.error("flush failed", t);
+            log.error("Calling method 'tx.flush()' failed", t);
             txStatus = Status.STATUS_MARKED_ROLLBACK;
             abort();
             if(!(t instanceof ODMGRuntimeException))
@@ -561,7 +629,7 @@
             Object realObj = rt.getHandler().getRealSubject();
             rt = new RuntimeObject(realObj, rt.getIdentity(), this, false);
         }
-        lockAndRegister(rt, Transaction.WRITE, getRegistrationList());
+        lockAndRegister(rt, Transaction.WRITE);
         ObjectEnvelope oe = objectEnvelopeTable.getByIdentity(rt.getIdentity());
         // TODO: not needed on delete - or? When optimistic locking is used we should always use the
         // specified object instance to use the last version of the object
@@ -608,7 +676,7 @@
     {
         try
         {
-            lockAndRegister(rt, Transaction.WRITE, getRegistrationList());
+            lockAndRegister(rt, Transaction.WRITE);
             markPersistent(rt);
         }
         catch (org.apache.ojb.broker.metadata.ClassNotPersistenceCapableException ex)
@@ -652,6 +720,11 @@
         }
     }
 
+    private boolean needFullCommit()
+    {
+        return objectEnvelopeTable.registeredObjectCount() > 0 || namedRootsMap.needsCommit();
+    }
+
     /**
      * Commit and close the transaction. Calling <code>commit</code> commits to
      * the database all persistent object modifications within the transaction and
@@ -676,13 +749,16 @@
         checkOpen();
         try
         {
+            if(needFullCommit())
+            {
             prepareCommit();
             checkForCommit();
 
             txStatus = Status.STATUS_COMMITTING;
             if (log.isDebugEnabled()) log.debug("Commit transaction " + this);
+            }
             // now do real commit on broker
-            if(hasBroker()) getBroker().commitTransaction();
+            if(hasBroker() && getBroker().isInTransaction()) getBroker().commitTransaction();
 
             // Now, we notify everything the commit is done.
             performTransactionAwareAfterCommit();
@@ -807,6 +883,7 @@
         finally
         {
             txStatus = Status.STATUS_ROLLEDBACK;
+            // cleanup things, e.g. release all locks
             doClose();
         }
     }
@@ -825,15 +902,14 @@
     {
         checkForBegin();
         if (log.isDebugEnabled()) log.debug("Begin transaction was called on tx " + this);
-        // initialize the ObjectEnvelope table
-        objectEnvelopeTable = new ObjectEnvelopeTable(this);
+        refresh();
         // register transaction
         implementation.getTxManager().registerTx(this);
         // mark tx as active (open)
         txStatus = Status.STATUS_ACTIVE;
     }
 
-    protected void checkForBegin()
+    private void checkForBegin()
     {
         /**
          * Is the associated database non-null and open? ODMG 3.0 says it must be.
@@ -849,6 +925,10 @@
         }
     }
 
+    /**
+     * Returns a global unique identifier for this transaction generated
+     * by {@link org.apache.ojb.broker.util.GUIDFactory}.
+     */
     public String getGUID()
     {
         return txGUID;
@@ -877,99 +957,42 @@
     }
 
     /**
-     * Registers the object (without locking) with this transaction and if cascade is <em>true</em>
-     * recursively all associations (a implicite lock is acquired for associations). This method
-     * expect that the main object is already locked!!!
+     * Registers the object (without locking) with this transaction. This method
+     * expects that the object was already locked, no check is done!!!
      */
-    private synchronized void register(RuntimeObject rtObject, int lockMode, boolean cascade, List registeredObjects)
+    private void internalSingleRegister(RuntimeObject rtObject, int lockMode)
             throws LockNotGrantedException, PersistenceBrokerException
     {
-        Object objectToRegister = rtObject.getObj();
-        /*
-        if the object is a Proxy there are two options:
-        1. The proxies real subject has already been materialized:
-           we take this real subject as the object to register and proceed
-           as if it were a ordinary object.
-        2. The real subject has not been materialized: Then there is nothing
-           to be registered now!
-           Of course we might just materialize the real subject to have something
-           to register. But this would make proxies useless for ODMG as proxies would
-           get materialized even if their real subjects were not used by the
-           client app.
-           Thus we register the current transaction as a Listener to the IndirectionHandler
-           of the Proxy.
-           Only when the IndirectionHandler performs the materialization of the real subject
-           at some later point in time it invokes callbacks on all it's listeners.
-           Using this callback we can defer the registering until it's really needed.
-        */
-        if(rtObject.isProxy())
+        if(log.isDebugEnabled()) log.debug("Register object " + rtObject.getIdentity());
+        // no Proxy and is not null, register real object
+        ObjectEnvelope envelope = objectEnvelopeTable.getByIdentity(rtObject.getIdentity());
+        // if we found an envelope, object is already registered --> we do nothing
+        // than refreshing the object!
+        if ((envelope == null))
         {
-            IndirectionHandler handler = rtObject.getHandler();
-            if(handler == null)
-            {
-                throw new OJBRuntimeException("Unexpected error, expect an proxy object as indicated: " + rtObject);
-            }
-            if (handler.alreadyMaterialized())
-            {
-                objectToRegister = handler.getRealSubject();
-            }
-            else
-            {
-                registerToIndirectionHandler(handler);
-                registerUnmaterializedLocks(rtObject.getObj());
-                // all work is done, so set to null
-                objectToRegister = null;
-            }
+            // register object itself
+            envelope = objectEnvelopeTable.get(rtObject.getIdentity(), rtObject.getObj(), rtObject.isNew());
         }
-        // no Proxy and is not null, register real object
-        if (objectToRegister != null)
+        else
         {
-            // register associated 1:1 objects
-            if(cascade)
-            {
-                // it's save to call RTO#getObjMaterialized because we know that
-                // the object is a non-null normal object or an materialized proxy
-                // and the method returns in any case the real object
-                lockAndRegisterReferences(rtObject.getCld(), rtObject.getObjMaterialized(), getImpliciteLockType(lockMode), registeredObjects);
-            }
-
-            ObjectEnvelope envelope = objectEnvelopeTable.getByIdentity(rtObject.getIdentity());
-            // if we found an envelope, object is already registered --> we do nothing
-            // than refreshing the object!
-            if ((envelope == null))
-            {
-                // register object itself
-                envelope = objectEnvelopeTable.get(rtObject.getIdentity(), objectToRegister, rtObject.isNew());
-            }
-            else
-            {
-                /*
-                arminw:
-                if an different instance of the same object was locked again
-                we should replace the old instance with new one to make
-                accessible the changed fields
-                */
-                envelope.refreshObjectIfNeeded(objectToRegister);
-            }
             /*
+            TODO: replace this intransparent handling with detach/attach service
             arminw:
-            For better performance we check if this object has already a write lock
-            in this case we don't need to acquire a write lock on commit
+            if an different instance of the same object was locked again
+            we should replace the old instance with new one to make
+            accessible the changed fields
             */
-            if(lockMode == Transaction.WRITE)
-            {
-                // signal ObjectEnvelope that a WRITE lock is already acquired
-                envelope.setWriteLocked(true);
-            }
-            // register associated 1:n and m:n objects
-            if(cascade)
-            {
-                // it's save to call RTO#getObjMaterialized because we know that
-                // the object is a non-null normal object or an materialized proxy
-                // and the method returns in any case the real object
-                //lockAndRegisterReferences(rtObject.getCld(), rtObject.getObjMaterialized(), getImpliciteLockType(lockMode), registeredObjects);
-                lockAndRegisterCollections(rtObject.getCld(), rtObject.getObjMaterialized(), getImpliciteLockType(lockMode), registeredObjects);
-            }
+            envelope.refreshObjectIfNeeded(rtObject.getObj());
+        }
+        /*
+        arminw:
+        For better performance we check if this object has already a write lock
+        in this case we don't need to acquire a write lock on commit
+        */
+        if(lockMode == Transaction.WRITE)
+        {
+            // signal ObjectEnvelope that a WRITE lock is already acquired
+            envelope.setWriteLocked(true);
         }
     }
 
@@ -978,7 +1001,7 @@
      * reference locking, we will materialize objects and they will enter the registered for
      * lock map.
      */
-    private void lockAndRegisterReferences(ClassDescriptor cld, Object sourceObject, int lockMode, List registeredObjects) throws LockNotGrantedException
+    private void internalLockRegisterReferences(final ClassDescriptor cld, final Object sourceObject, final int lockMode, final boolean cascade) throws LockNotGrantedException
     {
         if (implicitLocking)
         {
@@ -992,16 +1015,13 @@
                 {
                     boolean isProxy = proxyFactory.isProxy(refObj);
                     RuntimeObject rt = isProxy ? new RuntimeObject(refObj, this, false) : new RuntimeObject(refObj, this);
-                    if (!registrationList.contains(rt.getIdentity()))
-                    {
-                        lockAndRegister(rt, lockMode, registeredObjects);
-                    }
+                    internalLockRegister(rt, lockMode, cascade);
                 }
             }
         }
     }
 
-    private void lockAndRegisterCollections(ClassDescriptor cld, Object sourceObject, int lockMode, List registeredObjects) throws LockNotGrantedException
+    private void internalLockRegisterCollections(final ClassDescriptor cld, final Object sourceObject, final int lockMode, boolean cascade) throws LockNotGrantedException
     {
         if (implicitLocking)
         {
@@ -1037,7 +1057,7 @@
                                 IndirectionHandler handler = proxyFactory.getIndirectionHandler(item);
                                 if (!handler.alreadyMaterialized())
                                 {
-                                    handler.addListener(this);
+                                    registerToIndirectionHandler(handler);
                                     continue;
                                 }
                                 else
@@ -1047,10 +1067,7 @@
                                     item = handler.getRealSubject();
                                 }
                             }
-                            if (!registrationList.contains(rt.getIdentity()))
-                            {
-                                lockAndRegister(rt, lockMode, registeredObjects);
-                            }
+                            internalLockRegister(rt, lockMode, cascade);
                         }
                     }
                     catch (LockNotGrantedException e)
@@ -1105,7 +1122,7 @@
             }
             ClassDescriptor cld = getBroker().getClassDescriptor(materializedObject.getClass());
             RuntimeObject rt = new RuntimeObject(getBrokerInternal(), materializedObject, oid, cld, false, false);
-            lockAndRegister(rt, Transaction.READ, false, getRegistrationList());
+            lockAndRegister(rt, Transaction.READ, isImplicitLocking());
         }
         catch (Throwable t)
         {
@@ -1152,12 +1169,46 @@
     }
 
     /**
-     * register proxy objects that were locked but haven't been materialized yet
-     * so they can be unlocked when closing the transaction
+     * Lock unmaterialized proxy objects -
+     *
+     * @param rtObj The unmaterialized proxy.
+     * @param lockMode The lock mode.
      */
-    protected void registerUnmaterializedLocks(Object obj)
+    private void lockUnmaterializedObject(final RuntimeObject rtObj, final int lockMode, final IndirectionHandler handler)
     {
-        unmaterializedLocks.add(obj);
+        registerToIndirectionHandler(handler);
+        // TODO: remove this section when deprecated locking classes are removed
+        if(!(getImplementation().getLockManager() instanceof LockManagerOdmgImpl))
+        {
+            unmaterializedLocks.add(rtObj);
+        }
+        if(log.isDebugEnabled()) log.debug("Lock unmaterialized proxy object: " + rtObj.getIdentity());
+        internalSingleLock(rtObj.getCld(), rtObj.getIdentity(), lockMode);
+    }
+
+    /**
+     * For internal use! For backward compatibility with older
+     * locking implementations. This methods releases all locks for
+     * unmaterialized objects which are not registered in {@link ObjectEnvelopeTable}.
+     * The new lock implementation fully supports methods
+     * {@link org.apache.ojb.odmg.locking.LockManager#releaseLocks(org.apache.ojb.odmg.TransactionImpl)}
+     * the old ones need this method.
+     *
+     * @deprecated will be removed
+     */
+    public void releaseUnmaterialzedLocks()
+    {
+        // TODO: remove this method when deprecated locking classes are removed
+        LockManager lm = getImplementation().getLockManager();
+        if(!(lm instanceof LockManagerOdmgImpl) && unmaterializedLocks.size() > 0)
+        {
+            //remove locks for objects which haven't been materialized yet
+            for (Iterator it = unmaterializedLocks.iterator(); it.hasNext();)
+            {
+                RuntimeObject rt = (RuntimeObject) it.next();
+                lm.releaseLock(this, rt.getIdentity());
+            }
+        }
     }
 
     /**
@@ -1168,12 +1219,13 @@
      * very good chance the broker will be leaked as the doClose() method of
      * transactionImpl will never be called and thus the broker will never
      * be closed and returned to the pool.
+     *
      * @return Returns a PersistenceBroker
      * @throws TransactionNotInProgressException is the transaction is not open;
      */
     public PersistenceBrokerInternal getBrokerInternal()
     {
-        if (broker == null || broker.isClosed())
+        if (broker == null)
         {
             checkOpen();
             try
@@ -1201,7 +1253,7 @@
      */
     protected boolean hasBroker()
     {
-        return broker != null && !broker.isClosed();
+        return broker != null; //&& !broker.isClosed();
     }
 
     protected void cleanupBroker()
@@ -1271,7 +1323,7 @@
                 Identity oid = broker.serviceIdentity().buildIdentity(o);
                 ClassDescriptor cld = broker.getClassDescriptor(broker.getProxyFactory().getRealClass(o));
                 RuntimeObject rt = new RuntimeObject(broker, o, oid, cld, false, broker.getProxyFactory().isProxy(o));
-                lockAndRegister(rt, Transaction.READ, false, getRegistrationList());
+                lockAndRegister(rt, Transaction.READ, isImplicitLocking());
             }
         }
         unregisterFromCollectionProxy(colProxy);
@@ -1335,6 +1387,52 @@
     }
 
     /**
+     * Detect new objects.
+     */
+    protected boolean isTransient(ClassDescriptor cld, Object obj, Identity oid)
+    {
+        // if the Identity is transient we assume a non-persistent object
+        boolean isNew = oid != null && oid.isTransient();
+        /*
+        detection of new objects is costly (select of ID in DB to check if object
+        already exists) we do:
+        a. check if the object has nullified PK field
+        b. check if the object is already registered
+        c. lookup from cache and if not found, last option select on DB
+        */
+        if(!isNew)
+        {
+            final PersistenceBroker pb = getBroker();
+            if(cld == null)
+            {
+                cld = pb.getClassDescriptor(obj.getClass());
+            }
+            isNew = pb.serviceBrokerHelper().hasNullPKField(cld, obj);
+            if(!isNew)
+            {
+                if(oid == null)
+                {
+                    oid = pb.serviceIdentity().buildIdentity(cld, obj);
+                }
+                final ObjectEnvelope mod = objectEnvelopeTable.getByIdentity(oid);
+                if(mod != null)
+                {
+                    // already registered object, use current state
+                    isNew = mod.needsInsert();
+                }
+                else
+                {
+                    // if object was found cache, assume it's old
+                    // else make costly check against the DB
+                    isNew = pb.serviceSessionCache().lookup(oid, SessionCache.LEVEL_DEEP) == null
+                            && !pb.serviceJdbcAccess().doesExist(cld, oid);
+                }
+            }
+        }
+        return isNew;
+    }
+
+    /**
      * Allows to change the <em>cascading delete</em> behavior of the specified reference
      * of the target class while this transaction is in use.
      *
@@ -1360,7 +1458,9 @@
 
     /**
      * Allows to change the <em>cascading delete</em> behavior of all references of the
-     * specified class while this transaction is in use.
+     * specified class while this transaction is in use - if the specified class is an
+     * interface, abstract class or class with "extent" classes the cascading flag will
+     * be propagated.
      *
      * @param target The class to change cascading delete behavior of all references.
      * @param doCascade If <em>true</em> cascading delete is enabled, <em>false</em> disabled.
@@ -1368,18 +1468,33 @@
     public void setCascadingDelete(Class target, boolean doCascade)
     {
         ClassDescriptor cld = getBroker().getClassDescriptor(target);
+        List extents = cld.getExtentClasses();
         Boolean result = doCascade ? Boolean.TRUE : Boolean.FALSE;
+        setCascadingDelete(cld, result);
+        if(extents != null && extents.size() > 0)
+        {
+            for(int i = 0; i < extents.size(); i++)
+            {
+                Class extent =  (Class) extents.get(i);
+                ClassDescriptor tmp = getBroker().getClassDescriptor(extent);
+                setCascadingDelete(tmp, result);
+            }
+        }
+    }
+
+    private void setCascadingDelete(ClassDescriptor cld, Boolean cascade)
+    {
         List singleRefs = cld.getObjectReferenceDescriptors(true);
         for(int i = 0; i < singleRefs.size(); i++)
         {
             Object o = singleRefs.get(i);
-            runtimeCascadeDeleteMap.put(o, result);
+            runtimeCascadeDeleteMap.put(o, cascade);
         }
         List collectionRefs = cld.getCollectionDescriptors(true);
         for(int i = 0; i < collectionRefs.size(); i++)
         {
             Object o =  collectionRefs.get(i);
-            runtimeCascadeDeleteMap.put(o, result);
+            runtimeCascadeDeleteMap.put(o, cascade);
         }
     }
 
@@ -1398,27 +1513,6 @@
             arminw: Here we use the auto-delete flag defined in metadata
             */
             result = ord.getCascadingDelete() == ObjectReferenceDescriptor.CASCADE_OBJECT;
-/*
-arminw:
-these settings are nonsense (my fault), it dosen't make sense to differ cascade delete
-on the used reference type.
-*/
-//            if(ord instanceof CollectionDescriptor)
-//            {
-//                CollectionDescriptor cds = (CollectionDescriptor) ord;
-//                if(cds.isMtoNRelation())
-//                {
-//                    result = implementation.cascadingDeleteMtoN;
-//                }
-//                else
-//                {
-//                    result = implementation.cascadingDeleteOnetoN;
-//                }
-//            }
-//            else
-//            {
-//                result = implementation.cascadingDeleteOnetoOne;
-//            }
         }
         else
         {
@@ -1456,33 +1550,30 @@
         this.ordering = ordering;
     }
 
-    /**
-     * @see ImplementationExt#isNoteUserOrder()
-     */
-    public boolean isNoteUserOrder()
+    protected void finalize() throws Throwable
     {
-        return noteUserOrdering;
-    }
-
-    /**
-     * @see ImplementationExt#setNoteUserOrder(boolean)
-     */
-    public void setNoteUserOrder(boolean noteUserOrder)
-    {
-        this.noteUserOrdering = noteUserOrder;
+        super.finalize();
+        if(isOpen())
+        {
+            log.error("Finalize object: This transaction is still marked as active, please check code" +
+                    " for tx leaks: " + this.toString());
+            try
+            {
+                this.abort();
+            }
+            catch(Exception ignore)
+            {
+                // ignore
+            }
+        }
     }
 
-    /**
-     * Move the specified {@link org.apache.ojb.broker.Identity} to the
-     * last position in the order list if {@link #isNoteUserOrder()} returns <em>true</em>.
-     * @param oid The object identity to move.
-     */
-    public void moveToLastInOrderList(Identity oid)
+    public String toString()
     {
-        if(isNoteUserOrder())
-        {
-            objectEnvelopeTable.moveToLastInOrderList(oid);
-        }
+        return new ToStringBuilder(this, ToStringStyle.DEFAULT_STYLE)
+                .append("tx-status", TxUtil.getStatusString(getStatus()))
+                .append("unclosed_broker", this.broker != null && !broker.isClosed())
+                .toString();
     }
 
     //============================================================

Modified: db/ojb/trunk/src/java/org/apache/ojb/odmg/TxUtil.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/odmg/TxUtil.java?rev=422235&r1=422234&r2=422235&view=diff
==============================================================================
--- db/ojb/trunk/src/java/org/apache/ojb/odmg/TxUtil.java (original)
+++ db/ojb/trunk/src/java/org/apache/ojb/odmg/TxUtil.java Sat Jul 15 07:28:03 2006
@@ -1,8 +1,6 @@
 package org.apache.ojb.odmg;
 
-import javax.transaction.Status;
-
-/* Copyright 2002-2004 The Apache Software Foundation
+/* Copyright 2002-2005 The Apache Software Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,6 +14,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
+import javax.transaction.Status;
+
 public class TxUtil
 {
     public static String getStatusString(int status)

Modified: db/ojb/trunk/src/java/org/apache/ojb/odmg/oql/OQLQueryImpl.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/odmg/oql/OQLQueryImpl.java?rev=422235&r1=422234&r2=422235&view=diff
==============================================================================
--- db/ojb/trunk/src/java/org/apache/ojb/odmg/oql/OQLQueryImpl.java (original)
+++ db/ojb/trunk/src/java/org/apache/ojb/odmg/oql/OQLQueryImpl.java Sat Jul 15 07:28:03 2006
@@ -20,7 +20,7 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.ListIterator;
-import java.util.Vector;
+import java.util.ArrayList;
 
 import org.apache.ojb.broker.ManageableCollection;
 import org.apache.ojb.broker.PersistenceBroker;
@@ -125,7 +125,7 @@
         }
     }
 
-    private Vector flatten(Criteria crit, Vector acc)
+    private List flatten(final Criteria crit, final List acc)
     {
         Enumeration e = crit.getElements();
         while (e.hasMoreElements())
@@ -164,12 +164,12 @@
      * @param	queryString	An OQL query.
      * @exception	QueryInvalidException	The query syntax is invalid.
      */
-    public void create(String queryString) throws org.odmg.QueryInvalidException
+    public void create(final String queryString) throws org.odmg.QueryInvalidException
     {
         create(queryString, Query.NO_START_AT_INDEX, Query.NO_END_AT_INDEX);
     }
 
-    public void create(String queryString, int startAtIndex, int endAtIndex) throws QueryInvalidException
+    public void create(final String queryString, final int startAtIndex, final int endAtIndex) throws QueryInvalidException
     {
         if (log.isDebugEnabled()) log.debug("create query for query-string: " + queryString);
         /**
@@ -191,12 +191,12 @@
         {
 //			Query query = QueryPool.getQuery(queryString);
             // Use the OQL parser to transform a query string to a valid org.apache.ojb.broker.query object
-            QueryByCriteria _query;
-            StringReader reader = new StringReader(queryString);
-            OQLLexer lexer = new OQLLexer(reader);
-            OQLParser parser = new OQLParser(lexer);
+            final QueryByCriteria _query;
+            final StringReader reader = new StringReader(queryString);
+            final OQLLexer lexer = new OQLLexer(reader);
+            final OQLParser parser = new OQLParser(lexer);
             _query = (QueryByCriteria) parser.buildQuery();
-            setBindIterator(flatten(_query.getCriteria(), new Vector()).listIterator());
+            setBindIterator(flatten(_query.getCriteria(), new ArrayList()).listIterator());
             _query.setStartAtIndex(startAtIndex);
             _query.setEndAtIndex(endAtIndex);
             setQuery(_query);
@@ -255,9 +255,8 @@
             }
             else
             {
-                Iterator iter;
                 result = broker.getConfiguration().getCollectionFactory().createCollection(this, null);
-                iter = broker.getReportQueryIteratorByQuery(query);
+                Iterator iter = broker.getReportQueryIteratorByQuery(query);
                 try
                 {
                     while (iter.hasNext())
@@ -319,20 +318,12 @@
         {
             // read-lock all resulting objects to the current transaction
             Iterator iter = result.ojbIterator(broker);
-            Object toBeLocked = null;
-            try
+            Object toBeLocked;
+            while (iter.hasNext())
             {
-                List regList = tx.getRegistrationList();
-                while (iter.hasNext())
-                {
-                    toBeLocked = iter.next();
-                    RuntimeObject rt = new RuntimeObject(toBeLocked, tx, false);
-                    tx.lockAndRegister(rt, Transaction.READ, true, regList);
-                }
-            }
-            finally
-            {
-                tx.clearRegistrationList();
+                toBeLocked = iter.next();
+                RuntimeObject rt = new RuntimeObject(toBeLocked, tx, false);
+                tx.lockAndRegister(rt, Transaction.READ, true);
             }
         }
     }

Modified: db/ojb/trunk/src/java/org/apache/ojb/odmg/states/ModificationState.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/odmg/states/ModificationState.java?rev=422235&r1=422234&r2=422235&view=diff
==============================================================================
--- db/ojb/trunk/src/java/org/apache/ojb/odmg/states/ModificationState.java (original)
+++ db/ojb/trunk/src/java/org/apache/ojb/odmg/states/ModificationState.java Sat Jul 15 07:28:03 2006
@@ -1,6 +1,6 @@
 package org.apache.ojb.odmg.states;
 
-/* Copyright 2002-2004 The Apache Software Foundation
+/* Copyright 2002-2005 The Apache Software Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,7 +23,7 @@
 /**
  * Describes an objects transactional state regarding commiting and rollbacking
  */
-public abstract class ModificationState extends Object implements Serializable
+public abstract class ModificationState implements Serializable
 {
 	static final long serialVersionUID = 4182870857709997816L;
     public ModificationState()
@@ -107,5 +107,30 @@
     public boolean needsDelete()
     {
         return false;
+    }
+
+    public boolean isTransient()
+    {
+        return false;
+    }
+
+    public boolean isNew()
+    {
+        return false;
+    }
+
+    public boolean isDirty()
+    {
+        return false;
+    }
+
+    public boolean isDelete()
+    {
+        return false;
+    }
+
+    public boolean isClean()
+    {
+        return !isDelete() && !isDirty();
     }
 }

Modified: db/ojb/trunk/src/java/org/apache/ojb/odmg/states/StateNewClean.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/odmg/states/StateNewClean.java?rev=422235&r1=422234&r2=422235&view=diff
==============================================================================
--- db/ojb/trunk/src/java/org/apache/ojb/odmg/states/StateNewClean.java (original)
+++ db/ojb/trunk/src/java/org/apache/ojb/odmg/states/StateNewClean.java Sat Jul 15 07:28:03 2006
@@ -1,6 +1,6 @@
 package org.apache.ojb.odmg.states;
 
-/* Copyright 2002-2004 The Apache Software Foundation
+/* Copyright 2002-2005 The Apache Software Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -113,5 +113,10 @@
     public void rollback(ObjectEnvelope mod)
     {
         mod.doEvictFromCache();
+    }
+
+    public boolean isNew()
+    {
+        return true;
     }
 }

Modified: db/ojb/trunk/src/java/org/apache/ojb/odmg/states/StateNewDelete.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/odmg/states/StateNewDelete.java?rev=422235&r1=422234&r2=422235&view=diff
==============================================================================
--- db/ojb/trunk/src/java/org/apache/ojb/odmg/states/StateNewDelete.java (original)
+++ db/ojb/trunk/src/java/org/apache/ojb/odmg/states/StateNewDelete.java Sat Jul 15 07:28:03 2006
@@ -1,6 +1,6 @@
 package org.apache.ojb.odmg.states;
 
-/* Copyright 2002-2004 The Apache Software Foundation
+/* Copyright 2002-2005 The Apache Software Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,7 +18,7 @@
 import org.apache.ojb.odmg.ObjectEnvelope;
 
 /**
- * this state represents new objects which have been mrked for deletion during tx.
+ * this state represents new objects which have been marked for deletion during tx.
  */
 public class StateNewDelete extends ModificationState
 {
@@ -111,5 +111,15 @@
     {
         mod.doEvictFromCache();
         mod.setModificationState(StateTransient.getInstance());
+    }
+
+    public boolean isNew()
+    {
+        return true;
+    }
+
+    public boolean isDelete()
+    {
+        return true;
     }
 }

Modified: db/ojb/trunk/src/java/org/apache/ojb/odmg/states/StateNewDirty.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/odmg/states/StateNewDirty.java?rev=422235&r1=422234&r2=422235&view=diff
==============================================================================
--- db/ojb/trunk/src/java/org/apache/ojb/odmg/states/StateNewDirty.java (original)
+++ db/ojb/trunk/src/java/org/apache/ojb/odmg/states/StateNewDirty.java Sat Jul 15 07:28:03 2006
@@ -1,6 +1,6 @@
 package org.apache.ojb.odmg.states;
 
-/* Copyright 2002-2004 The Apache Software Foundation
+/* Copyright 2002-2005 The Apache Software Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,6 +16,7 @@
  */
 
 import org.apache.ojb.odmg.ObjectEnvelope;
+import org.apache.ojb.broker.PersistenceBrokerException;
 
 /**
  * This state represents new objects which have been altered during tx.
@@ -91,8 +92,7 @@
     /**
      * checkpoint the ObjectModification
      */
-    public void checkpoint(ObjectEnvelope mod)
-            throws org.apache.ojb.broker.PersistenceBrokerException
+    public void checkpoint(ObjectEnvelope mod) throws PersistenceBrokerException
     {
         mod.doInsert();
         mod.setModificationState(StateOldClean.getInstance());
@@ -101,7 +101,7 @@
     /**
      * commit the associated transaction
      */
-    public void commit(ObjectEnvelope mod) throws org.apache.ojb.broker.PersistenceBrokerException
+    public void commit(ObjectEnvelope mod) throws PersistenceBrokerException
     {
         mod.doInsert();
         mod.setModificationState(StateOldClean.getInstance());
@@ -116,4 +116,13 @@
         mod.doEvictFromCache();
     }
 
+    public boolean isNew()
+    {
+        return true;
+    }
+
+    public boolean isDirty()
+    {
+        return true;
+    }
 }

Modified: db/ojb/trunk/src/java/org/apache/ojb/odmg/states/StateOldClean.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/odmg/states/StateOldClean.java?rev=422235&r1=422234&r2=422235&view=diff
==============================================================================
--- db/ojb/trunk/src/java/org/apache/ojb/odmg/states/StateOldClean.java (original)
+++ db/ojb/trunk/src/java/org/apache/ojb/odmg/states/StateOldClean.java Sat Jul 15 07:28:03 2006
@@ -1,6 +1,6 @@
 package org.apache.ojb.odmg.states;
 
-/* Copyright 2002-2004 The Apache Software Foundation
+/* Copyright 2002-2005 The Apache Software Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.

Modified: db/ojb/trunk/src/java/org/apache/ojb/odmg/states/StateOldDelete.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/odmg/states/StateOldDelete.java?rev=422235&r1=422234&r2=422235&view=diff
==============================================================================
--- db/ojb/trunk/src/java/org/apache/ojb/odmg/states/StateOldDelete.java (original)
+++ db/ojb/trunk/src/java/org/apache/ojb/odmg/states/StateOldDelete.java Sat Jul 15 07:28:03 2006
@@ -1,6 +1,6 @@
 package org.apache.ojb.odmg.states;
 
-/* Copyright 2002-2004 The Apache Software Foundation
+/* Copyright 2002-2005 The Apache Software Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -114,5 +114,10 @@
     public void rollback(ObjectEnvelope mod)
     {
         mod.doEvictFromCache();
+    }
+    
+    public boolean isDelete()
+    {
+        return true;
     }
 }

Modified: db/ojb/trunk/src/java/org/apache/ojb/odmg/states/StateOldDirty.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/odmg/states/StateOldDirty.java?rev=422235&r1=422234&r2=422235&view=diff
==============================================================================
--- db/ojb/trunk/src/java/org/apache/ojb/odmg/states/StateOldDirty.java (original)
+++ db/ojb/trunk/src/java/org/apache/ojb/odmg/states/StateOldDirty.java Sat Jul 15 07:28:03 2006
@@ -1,6 +1,6 @@
 package org.apache.ojb.odmg.states;
 
-/* Copyright 2002-2004 The Apache Software Foundation
+/* Copyright 2002-2005 The Apache Software Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -122,4 +122,8 @@
         return true;
     }
 
+    public boolean isDirty()
+    {
+        return true;
+    }
 }

Modified: db/ojb/trunk/src/java/org/apache/ojb/odmg/states/StateTransient.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/odmg/states/StateTransient.java?rev=422235&r1=422234&r2=422235&view=diff
==============================================================================
--- db/ojb/trunk/src/java/org/apache/ojb/odmg/states/StateTransient.java (original)
+++ db/ojb/trunk/src/java/org/apache/ojb/odmg/states/StateTransient.java Sat Jul 15 07:28:03 2006
@@ -1,6 +1,6 @@
 package org.apache.ojb.odmg.states;
 
-/* Copyright 2002-2004 The Apache Software Foundation
+/* Copyright 2002-2005 The Apache Software Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,8 +15,8 @@
  * limitations under the License.
  */
 
-import org.apache.ojb.broker.PersistenceBrokerException;
 import org.apache.ojb.odmg.ObjectEnvelope;
+import org.apache.ojb.broker.PersistenceBrokerException;
 
 /**
  * this state represents objects which are not persisted and no longer used.
@@ -108,5 +108,10 @@
      */
     public void rollback(ObjectEnvelope mod)
     {
+    }
+
+    public boolean isTransient()
+    {
+        return true;
     }
 }

Modified: db/ojb/trunk/src/java/org/odmg/Implementation.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/odmg/Implementation.java?rev=422235&r1=422234&r2=422235&view=diff
==============================================================================
--- db/ojb/trunk/src/java/org/odmg/Implementation.java (original)
+++ db/ojb/trunk/src/java/org/odmg/Implementation.java Sat Jul 15 07:28:03 2006
@@ -39,7 +39,7 @@
      * @return The new <code>OQLQuery</code> object.
      * @see org.odmg.OQLQuery
      */
-    public EnhancedOQLQuery newOQLQuery();
+    public OQLQuery newOQLQuery();
 
     /**
      * Create a new <code>DList</code> object.

Modified: db/ojb/trunk/src/jdori/org/apache/ojb/jdori/sql/OjbStoreManager.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/jdori/org/apache/ojb/jdori/sql/OjbStoreManager.java?rev=422235&r1=422234&r2=422235&view=diff
==============================================================================
--- db/ojb/trunk/src/jdori/org/apache/ojb/jdori/sql/OjbStoreManager.java (original)
+++ db/ojb/trunk/src/jdori/org/apache/ojb/jdori/sql/OjbStoreManager.java Sat Jul 15 07:28:03 2006
@@ -25,7 +25,7 @@
 import org.apache.ojb.broker.Identity;
 import org.apache.ojb.broker.PersistenceBroker;
 import org.apache.ojb.broker.PersistenceConfiguration;
-import org.apache.ojb.broker.util.ObjectModificationDefaultImpl;
+import org.apache.ojb.broker.util.ObjectModification;
 import org.apache.ojb.broker.util.logging.Logger;
 import org.apache.ojb.broker.util.logging.LoggerFactory;
 
@@ -93,7 +93,7 @@
             logger.debug("OjbStoreManager.insert");
             PersistenceBroker broker = connector.getBroker();
             Object instance = sm.getObject();
-            broker.store(instance, ObjectModificationDefaultImpl.INSERT);
+            broker.store(instance, ObjectModification.INSERT);
         }
         catch (Exception ex)
         {
@@ -118,7 +118,7 @@
             PersistenceBroker broker = connector.getBroker();
             fetch(sm, null);
             Object instance = sm.getObject();
-            broker.store(instance, ObjectModificationDefaultImpl.UPDATE);
+            broker.store(instance, ObjectModification.UPDATE);
         }
         catch (Exception ex)
         {

Modified: db/ojb/trunk/src/samples/org/apache/ojb/tutorials/PBExample.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/samples/org/apache/ojb/tutorials/PBExample.java?rev=422235&r1=422234&r2=422235&view=diff
==============================================================================
--- db/ojb/trunk/src/samples/org/apache/ojb/tutorials/PBExample.java (original)
+++ db/ojb/trunk/src/samples/org/apache/ojb/tutorials/PBExample.java Sat Jul 15 07:28:03 2006
@@ -198,7 +198,7 @@
 
                 broker.store(result);
                 // alternative, more performant:
-                // broker.store(result, ObjectModificationDefaultImpl.UPDATE);
+                // broker.store(result, ObjectModification.UPDATE);
 
                 broker.commitTransaction();
                 isSold = true;



---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-dev-help@db.apache.org