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/06/23 23:25:00 UTC

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

Author: arminw
Date: Fri Jun 23 14:25:00 2006
New Revision: 416820

URL: http://svn.apache.org/viewvc?rev=416820&view=rev
Log:
fix OJB-114, apply patch

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

Modified: db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/core/PersistenceBrokerAbstractImpl.java
URL: http://svn.apache.org/viewvc/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/core/PersistenceBrokerAbstractImpl.java?rev=416820&r1=416819&r2=416820&view=diff
==============================================================================
--- db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/core/PersistenceBrokerAbstractImpl.java (original)
+++ db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/core/PersistenceBrokerAbstractImpl.java Fri Jun 23 14:25:00 2006
@@ -15,6 +15,9 @@
  * limitations under the License.
  */
 
+import java.util.Collections;
+import java.util.List;
+
 import org.apache.ojb.broker.PBLifeCycleEvent;
 import org.apache.ojb.broker.PBLifeCycleListener;
 import org.apache.ojb.broker.PBListener;
@@ -41,34 +44,38 @@
  */
 public abstract class PersistenceBrokerAbstractImpl implements PersistenceBrokerInternal
 {
-    /**
-     * Returns <em>true</em> if PB-transaction check is enabled.
-     */
+    /** Returns <em>true</em> if PB-transaction check is enabled. */
     private boolean txCheck;
 
+    /*
+    PB instances are single threaded used, but we use synchronization here to
+    avoid problems with the JVM Finalizer thread - more details see issue
+    OJB-114 in JIRA
+    */
+
     /**
      * List containing all permanent {@link org.apache.ojb.broker.PBStateListener}
      * instances.
      */
-    private IdentityArrayList permanentStateListeners = new IdentityArrayList();
+    private final List permanentStateListeners = Collections.synchronizedList(new IdentityArrayList());
 
     /**
      * List containing all temporary {@link org.apache.ojb.broker.PBStateListener}
      * instances.
      */
-    private IdentityArrayList temporaryStateListeners = new IdentityArrayList();
+    private final List temporaryStateListeners = Collections.synchronizedList(new IdentityArrayList());
 
     /**
      * List containing all permanent {@link org.apache.ojb.broker.PBLifeCycleListener}
      * instances.
      */
-    private IdentityArrayList permanentLifeCycleListeners = new IdentityArrayList(100);
+    private List permanentLifeCycleListeners = Collections.synchronizedList(new IdentityArrayList(100));
 
     /**
      * List containing all temporary {@link org.apache.ojb.broker.PBLifeCycleListener}
      * instances.
      */
-    private IdentityArrayList temporaryLifeCycleListeners = new IdentityArrayList(100);
+    private List temporaryLifeCycleListeners = Collections.synchronizedList(new IdentityArrayList(100));
 
     /**
      * Override if needed.
@@ -108,49 +115,45 @@
         this.txCheck = txCheck;
     }
 
-    /**
-     * @see org.apache.ojb.broker.PersistenceBroker#addListener(PBListener listener)
-     */
+    /** @see org.apache.ojb.broker.PersistenceBroker#addListener(PBListener listener) */
     public void addListener(PBListener listener) throws PersistenceBrokerException
     {
         addListener(listener, false);
     }
 
-    /**
-     * @see org.apache.ojb.broker.PersistenceBroker#addListener(PBListener listener, boolean permanent)
-     */
+    /** @see org.apache.ojb.broker.PersistenceBroker#addListener(PBListener listener, boolean permanent) */
     public void addListener(PBListener listener, boolean permanent) throws PersistenceBrokerException
     {
-        if (listener instanceof PBStateListener)
+        if(listener instanceof PBStateListener)
         {
-            if (permanent)
+            if(permanent)
             {
-                if (!permanentStateListeners.contains(listener))
+                if(!permanentStateListeners.contains(listener))
                 {
                     permanentStateListeners.add(listener);
                 }
             }
             else
             {
-                if (!temporaryStateListeners.contains(listener))
+                if(!temporaryStateListeners.contains(listener))
                 {
                     temporaryStateListeners.add(listener);
                 }
             }
         }
 
-        if (listener instanceof PBLifeCycleListener)
+        if(listener instanceof PBLifeCycleListener)
         {
-            if (permanent)
+            if(permanent)
             {
-                if (!permanentLifeCycleListeners.contains(listener))
+                if(!permanentLifeCycleListeners.contains(listener))
                 {
                     permanentLifeCycleListeners.add(listener);
                 }
             }
             else
             {
-                if (!temporaryLifeCycleListeners.contains(listener))
+                if(!temporaryLifeCycleListeners.contains(listener))
                 {
                     temporaryLifeCycleListeners.add(listener);
                 }
@@ -158,37 +161,33 @@
         }
     }
 
-    /**
-     * @see org.apache.ojb.broker.PersistenceBroker#removeListener(PBListener listener)
-     */
+    /** @see org.apache.ojb.broker.PersistenceBroker#removeListener(PBListener listener) */
     public void removeListener(PBListener listener) throws PersistenceBrokerException
     {
-        if (listener instanceof PBStateListener)
+        if(listener instanceof PBStateListener)
         {
             permanentStateListeners.remove(listener);
             temporaryStateListeners.remove(listener);
         }
 
-        if (listener instanceof PBLifeCycleListener)
+        if(listener instanceof PBLifeCycleListener)
         {
             permanentLifeCycleListeners.remove(listener);
             temporaryLifeCycleListeners.remove(listener);
         }
     }
 
-    /**
-     * @see org.apache.ojb.broker.PersistenceBroker#removeAllListeners(boolean)
-     */
+    /** @see org.apache.ojb.broker.PersistenceBroker#removeAllListeners(boolean) */
     public void removeAllListeners(boolean permanent) throws PersistenceBrokerException
     {
-        if (permanent)
+        if(permanent)
         {
             // remove permanent listeners as well
             permanentStateListeners.clear();
             // this could be huge, thus simply replace instance
             if(permanentLifeCycleListeners.size() > 10000)
             {
-                permanentLifeCycleListeners = new IdentityArrayList(100);
+                permanentLifeCycleListeners = Collections.synchronizedList(new IdentityArrayList(100));
             }
             else
             {
@@ -200,7 +199,7 @@
         // this could be huge, thus simply replace instance
         if(temporaryLifeCycleListeners.size() > 10000)
         {
-            temporaryLifeCycleListeners = new IdentityArrayList(100);
+            temporaryLifeCycleListeners = Collections.synchronizedList(new IdentityArrayList(100));
         }
         else
         {
@@ -208,9 +207,7 @@
         }
     }
 
-    /**
-     * @see org.apache.ojb.broker.PersistenceBroker#removeAllListeners()
-     */
+    /** @see org.apache.ojb.broker.PersistenceBroker#removeAllListeners() */
     public void removeAllListeners() throws PersistenceBrokerException
     {
         removeAllListeners(false);
@@ -218,11 +215,11 @@
 
     public void fireBrokerEvent(PersistenceBrokerEvent event)
     {
-        if (event instanceof PBLifeCycleEvent)
+        if(event instanceof PBLifeCycleEvent)
         {
             fireBrokerEvent((PBLifeCycleEvent) event);
         }
-        else if (event instanceof PBStateEvent)
+        else if(event instanceof PBStateEvent)
         {
             fireBrokerEvent((PBStateEvent) event);
         }
@@ -235,43 +232,54 @@
 
     public void fireBrokerEvent(PBLifeCycleEvent event)
     {
-        if (event.getPersitenceBrokerAware() != null)
+        if(event.getPersitenceBrokerAware() != null)
         {
             // first we do the persistent object callback
             performCallBack(event);
         }
 
         // now we notify the listeners
-        for (int i = permanentLifeCycleListeners.size() - 1; i >= 0; i--)
+        synchronized(permanentLifeCycleListeners)
         {
-            notifiyObjectLifeCycleListener((PBLifeCycleListener) permanentLifeCycleListeners.get(i), event);
+            for(int i = permanentLifeCycleListeners.size() - 1; i >= 0; i--)
+            {
+                notifiyObjectLifeCycleListener((PBLifeCycleListener) permanentLifeCycleListeners.get(i), event);
+            }
         }
 
-        for(int i = temporaryLifeCycleListeners.size() - 1; i >= 0; i--)
+        synchronized(temporaryLifeCycleListeners)
         {
-            notifiyObjectLifeCycleListener((PBLifeCycleListener) temporaryLifeCycleListeners.get(i), event);
-
+            for(int i = temporaryLifeCycleListeners.size() - 1; i >= 0; i--)
+            {
+                notifiyObjectLifeCycleListener((PBLifeCycleListener) temporaryLifeCycleListeners.get(i), event);
+            }
         }
     }
 
     public void fireBrokerEvent(PBStateEvent event)
     {
-        for(int i = permanentStateListeners.size() - 1; i >= 0; i--)
+        synchronized(permanentStateListeners)
         {
-            notifiyStateListener((PBStateListener) permanentStateListeners.get(i), event);
+            for(int i = permanentStateListeners.size() - 1; i >= 0; i--)
+            {
+                notifiyStateListener((PBStateListener) permanentStateListeners.get(i), event);
+            }
         }
 
-        for(int i = temporaryStateListeners.size() - 1; i >= 0; i--)
+        synchronized(temporaryStateListeners)
         {
-            notifiyStateListener((PBStateListener) temporaryStateListeners.get(i), event);
+            for(int i = temporaryStateListeners.size() - 1; i >= 0; i--)
+            {
+                notifiyStateListener((PBStateListener) temporaryStateListeners.get(i), event);
+            }
         }
     }
 
     private void performCallBack(PBLifeCycleEvent event)
     {
         // Check for null
-        if (event.getPersitenceBrokerAware() == null) return;
-        switch (event.getEventType().typeId())
+        if(event.getPersitenceBrokerAware() == null) return;
+        switch(event.getEventType().typeId())
         {
             case PBLifeCycleEvent.TYPE_AFTER_LOOKUP:
                 event.getPersitenceBrokerAware().afterLookup(event.getTriggeringBroker());
@@ -299,7 +307,7 @@
 
     private void notifiyStateListener(PBStateListener listener, PBStateEvent stateEvent)
     {
-        switch (stateEvent.getEventType().typeId())
+        switch(stateEvent.getEventType().typeId())
         {
             case PBStateEvent.KEY_BEFORE_COMMIT:
                 listener.beforeCommit(stateEvent);
@@ -330,7 +338,7 @@
 
     private void notifiyObjectLifeCycleListener(PBLifeCycleListener listener, PBLifeCycleEvent lifeEvent)
     {
-        switch (lifeEvent.getEventType().typeId())
+        switch(lifeEvent.getEventType().typeId())
         {
             case PBLifeCycleEvent.TYPE_AFTER_LOOKUP:
                 listener.afterLookup(lifeEvent);



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