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/09/26 14:17:20 UTC

svn commit: r450015 - /db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/core/PersistenceBrokerImpl.java

Author: arminw
Date: Tue Sep 26 05:17:20 2006
New Revision: 450015

URL: http://svn.apache.org/viewvc?view=rev&rev=450015
Log:
add support for configurable collection implementation classes used for 1:n, m:n references and query results
use IdentityHashSet to manage deleted, current stored objects

Modified:
    db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/core/PersistenceBrokerImpl.java

Modified: db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/core/PersistenceBrokerImpl.java
URL: http://svn.apache.org/viewvc/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/core/PersistenceBrokerImpl.java?view=diff&rev=450015&r1=450014&r2=450015
==============================================================================
--- db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/core/PersistenceBrokerImpl.java (original)
+++ db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/core/PersistenceBrokerImpl.java Tue Sep 26 05:17:20 2006
@@ -22,7 +22,6 @@
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Set;
 
 import org.apache.commons.lang.ObjectUtils;
 import org.apache.commons.lang.SystemUtils;
@@ -34,15 +33,13 @@
 import org.apache.ojb.broker.OptimisticLockException;
 import org.apache.ojb.broker.PBKey;
 import org.apache.ojb.broker.PBState;
+import org.apache.ojb.broker.PersistenceBroker;
 import org.apache.ojb.broker.PersistenceBrokerException;
+import org.apache.ojb.broker.PersistenceBrokerInternal;
 import org.apache.ojb.broker.TransactionAbortedException;
 import org.apache.ojb.broker.TransactionInProgressException;
 import org.apache.ojb.broker.TransactionNotInProgressException;
 import org.apache.ojb.broker.TransientObjectException;
-import org.apache.ojb.broker.PersistenceBrokerInternal;
-import org.apache.ojb.broker.PersistenceBroker;
-import org.apache.ojb.broker.lob.LobHelper;
-import org.apache.ojb.broker.lob.LobHelperImpl;
 import org.apache.ojb.broker.accesslayer.ChainingIterator;
 import org.apache.ojb.broker.accesslayer.ConnectionManagerFactory;
 import org.apache.ojb.broker.accesslayer.ConnectionManagerIF;
@@ -66,6 +63,8 @@
 import org.apache.ojb.broker.core.proxy.IndirectionHandler;
 import org.apache.ojb.broker.core.proxy.ProxyFactory;
 import org.apache.ojb.broker.core.proxy.VirtualProxy;
+import org.apache.ojb.broker.lob.LobHelper;
+import org.apache.ojb.broker.lob.LobHelperImpl;
 import org.apache.ojb.broker.metadata.ClassDescriptor;
 import org.apache.ojb.broker.metadata.ClassNotPersistenceCapableException;
 import org.apache.ojb.broker.metadata.CollectionDescriptor;
@@ -78,9 +77,9 @@
 import org.apache.ojb.broker.query.QueryByIdentity;
 import org.apache.ojb.broker.query.QueryBySQL;
 import org.apache.ojb.broker.util.BrokerHelper;
-import org.apache.ojb.broker.util.IdentityArrayList;
-import org.apache.ojb.broker.util.ObjectModification;
 import org.apache.ojb.broker.util.ClassHelper;
+import org.apache.ojb.broker.util.IdentityHashSet;
+import org.apache.ojb.broker.util.ObjectModification;
 import org.apache.ojb.broker.util.configuration.Configuration;
 import org.apache.ojb.broker.util.configuration.ConfigurationException;
 import org.apache.ojb.broker.util.logging.Logger;
@@ -151,6 +150,7 @@
     private ProxyFactory proxyFactory;
     private LobHelper lobHelper;
     private PBKey pbKey;
+    private CollectionTypes collectionTypes;
 
     /**
      * List of objects being stored now, allows to avoid infinite
@@ -162,7 +162,7 @@
     with user implemented equals/hashCode methods of persistence capable objects
     (e.g. objects are equals but PK fields not)
     */
-    private IdentityArrayList nowStoring = new IdentityArrayList();
+    private Collection nowStoring = new IdentityHashSet();
 
     /**
      * Lists for object registration during delete operations.
@@ -177,13 +177,13 @@
     with user implemented equals/hashCode methods of persistence capable objects
     (e.g. objects are equals but PK fields not)
     */
-    private IdentityArrayList markedForDelete = new IdentityArrayList();
+    private Collection markedForDelete = new IdentityHashSet();
 
     /**
      * Used for performance optimization of method
      * {@link #checkRefreshRelationships(Object, org.apache.ojb.broker.Identity, org.apache.ojb.broker.metadata.ClassDescriptor)}
      */
-    private IdentityArrayList skipRefreshRelationship = new IdentityArrayList();
+    private Collection skipRefreshRelationship = new IdentityHashSet();
 
     /**
      * The set of identities of all deleted objects during current transaction
@@ -197,7 +197,7 @@
     the broker does UPDATE. Due the the following set of deleted OIDs
     the broker will know that it should do INSERT.
     */
-    private Set deletedDuringTransaction = new HashSet();
+    private Collection deletedDuringTransaction = new HashSet();
 
     /**
      * Constructor used by {@link PersistenceBrokerFactoryIF} implementation.
@@ -229,11 +229,14 @@
         referencesBroker = new QueryReferenceBroker(this);
         relationshipPrefetcherFactory = new RelationshipPrefetcherFactory(this);
         proxyFactory = AbstractProxyFactory.getProxyFactory();
+        collectionTypes = new CollectionTypes();
     }
 
     public void configure(Configuration pConfig) throws ConfigurationException
     {
         super.configure(pConfig);
+        // pass through config instance
+        collectionTypes.configure(pConfig);
         brokerLeakDetection = pConfig.getBoolean("BrokerLeakDetection", false);
         Class lobHelperClass = pConfig.getClass("LobHelperClass", LobHelperImpl.class);
         Class identityFactoryClass = pConfig.getClass("IdentityFactoryClass", IdentityFactoryImpl.class);
@@ -250,6 +253,11 @@
         }
     }
 
+    public CollectionTypes getCollectionTypes()
+    {
+        return collectionTypes;
+    }
+
     public LobHelper serviceLobHelper()
     {
         return lobHelper;
@@ -546,22 +554,7 @@
      */
     public void delete(Object obj, boolean ignoreReferences) throws PersistenceBrokerException
     {
-        if(isTxCheck() && !isInTransaction())
-        {
-            if(logger.isEnabledFor(Logger.ERROR))
-            {
-                String msg = "No running PB-tx found. Please, only delete objects in context of a PB-transaction" +
-                    " to avoid side-effects - e.g. when rollback of complex objects.";
-                try
-                {
-                    throw new Exception("** Delete object without active PersistenceBroker transaction **");
-                }
-                catch(Exception e)
-                {
-                    logger.error(msg, e);
-                }
-            }
-        }
+        doTxCheck();
         try
         {
             doDelete(obj, ignoreReferences);
@@ -941,22 +934,9 @@
         }
 
         //************************************************
+        // check for runnin tx
+        doTxCheck();
         // now store it:
-        if(isTxCheck() && !isInTransaction())
-        {
-            if(logger.isEnabledFor(Logger.ERROR))
-            {
-                try
-                {
-                    throw new Exception("** Try to store object without active PersistenceBroker transaction **");
-                }
-                catch(Exception e)
-                {
-                    logger.error("No running tx found, please only store in context of an PB-transaction" +
-                    ", to avoid side-effects - e.g. when rollback of complex objects", e);
-                }
-            }
-        }
         // Invoke events on PersistenceBrokerAware instances and listeners
         if (insert)
         {
@@ -1589,7 +1569,7 @@
      */
     public Collection getCollectionByQuery(Query query) throws PersistenceBrokerException
     {
-        return referencesBroker.getCollectionByQuery(query, false);
+        return (Collection) referencesBroker.getCollectionByQuery(collectionTypes.getQuery(), query, false);
     }
 
     /**
@@ -2308,7 +2288,7 @@
      */
     private void refreshRegistrationLists()
     {
-        if(nowStoring.size() > 0) nowStoring = new IdentityArrayList();
+        if(nowStoring.size() > 0) nowStoring.clear();
         if(deletedDuringTransaction.size() > 0) deletedDuringTransaction.clear();
         /*
         arminw:
@@ -2373,6 +2353,29 @@
         catch (Exception ex)
         {
             throw new PersistenceBrokerException("Unable to create proxy using class:"+baseClassForProxy.getName(), ex);
+        }
+    }
+
+    /**
+     * Check if store/delete operation is allowed.
+     */
+    protected void doTxCheck()
+    {
+        if(isTxCheck() && !isInTransaction())
+        {
+            if(logger.isEnabledFor(Logger.ERROR))
+            {
+                String msg = "No running PB-tx found. Please, only insert/update/delete objects in context" +
+                        " of a PB-transaction to avoid side-effects - e.g. when rollback of complex objects.";
+                try
+                {
+                    throw new Exception("** Insert/Update/Delete object without active PersistenceBroker transaction **");
+                }
+                catch(Exception e)
+                {
+                    logger.error(msg, e);
+                }
+            }
         }
     }
 }



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