Author: ppoddar
Date: Wed Sep 12 01:23:32 2012
New Revision: 1383727

URL: http://svn.apache.org/viewvc?rev=1383727&view=rev
Log:
OPENJPA-2253: Clear temporary storage for audit to prevent memory leak

Modified:
    
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AuditManager.java
    
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/Audited.java

Modified: 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AuditManager.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AuditManager.java?rev=1383727&r1=1383726&r2=1383727&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AuditManager.java
 (original)
+++ 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AuditManager.java
 Wed Sep 12 01:23:32 2012
@@ -43,7 +43,7 @@ import org.apache.openjpa.event.Transact
 /**
  * Controller for audit facility.
  * This controller performs the following basic duties:
- * <LI> Records auditable types at class laoding time
+ * <LI> Records auditable types at class loading time
  * <LI> Listens to instance life cycle changes and transaction.
  * <LI> Collects auditable instances on instance life cycle changes.
  * <LI> Delegates real auditing to the {@link Auditor} at transaction boundary.
@@ -143,24 +143,32 @@ public class AuditManager extends InMemo
                }
        }
        
+       private void forget(Broker broker) {
+               AuditCallback cb = _saved.remove(broker);
+               if (cb != null) {
+                       broker.removeLifecycleListener(cb);
+                       cb.clear();
+               }
+       }
+       
        @Override
        public void afterCommit(TransactionEvent event) {
-               _saved.remove(event.getSource());
+               forget((Broker)event.getSource());
        }
 
        @Override
        public void afterRollback(TransactionEvent event) {
-               _saved.remove(event.getSource());
+               forget((Broker)event.getSource());
        }
 
        @Override
        public void afterCommitComplete(TransactionEvent event) {
-               _saved.remove(event.getSource());
+               forget((Broker)event.getSource());
        }
 
        @Override
        public void afterRollbackComplete(TransactionEvent event) {
-               _saved.remove(event.getSource());
+               forget((Broker)event.getSource());
        }
        
        @Override
@@ -294,6 +302,10 @@ public class AuditManager extends InMemo
                        }
                }
                
+               void clear() {
+                       _audits.clear();
+               }
+               
                /**
                 * Life-cycle callbacks 
                 */

Modified: 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/Audited.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/Audited.java?rev=1383727&r1=1383726&r2=1383727&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/Audited.java
 (original)
+++ 
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/Audited.java
 Wed Sep 12 01:23:32 2012
@@ -22,6 +22,8 @@ import java.util.BitSet;
 
 import org.apache.openjpa.audit.AuditableOperation;
 import org.apache.openjpa.enhance.PersistenceCapable;
+import org.apache.openjpa.enhance.Reflection;
+import org.apache.openjpa.meta.FieldMetaData;
 
 /**
  * Carries immutable information about an audited persistent instance.
@@ -73,12 +75,42 @@ public final class Audited {
                String[] names = new String[dirty.cardinality()];
                int j = 0;
                for (int pos = dirty.nextSetBit(0); pos != -1; pos = 
dirty.nextSetBit(pos+1)) {
-                       names[j++] = _sm.getMetaData().getField(pos).getName();
+                       names[j++] = _sm.getMetaData().getField(pos).getName(); 
        
                }
                return names;
        }
        
        /**
+        * Gets the value of the given field of the managed object.
+        * 
+        * @param field name of a persistent property
+        * @return value of the given field in the managed instance
+        * @exception IllegalArgumentException if the named field is not a 
persistent property 
+        */
+       public Object getManangedFieldValue(String field) {
+               FieldMetaData fmd = _sm.getMetaData().getField(field);
+               if (fmd == null) {
+                       throw new IllegalArgumentException(field + " does not 
exist in " + _original);
+               }
+               return _sm.fetch(fmd.getIndex());
+       }
+       
+       /**
+        * Gets the value of the given field of the original state of the 
object.
+        * 
+        * @param field name of a persistent property
+        * @return value of the given field in the original instance
+        * @exception IllegalArgumentException if the named field is not a 
persistent property 
+        */
+       public Object getOriginalFieldValue(String field) {
+               try {
+                       return Reflection.getValue(_original, field, true);
+               } catch (Exception e) {
+                       throw new IllegalArgumentException(field + " does not 
exist in " + _original);
+               }
+       }
+       
+       /**
         * Gets the type of this audit.
         */
        public AuditableOperation getType() {


Reply via email to