You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2011/01/31 19:29:35 UTC

svn commit: r1065704 - /cayenne/main/trunk/framework/cayenne-lifecycle/src/main/java/org/apache/cayenne/lifecycle/audit/AuditableFilter.java

Author: aadamchik
Date: Mon Jan 31 18:29:34 2011
New Revision: 1065704

URL: http://svn.apache.org/viewvc?rev=1065704&view=rev
Log:
CAY-1534 cayenne-lifecycle: implement AuditableFilter

fixing endless loop in the filter call

Modified:
    cayenne/main/trunk/framework/cayenne-lifecycle/src/main/java/org/apache/cayenne/lifecycle/audit/AuditableFilter.java

Modified: cayenne/main/trunk/framework/cayenne-lifecycle/src/main/java/org/apache/cayenne/lifecycle/audit/AuditableFilter.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-lifecycle/src/main/java/org/apache/cayenne/lifecycle/audit/AuditableFilter.java?rev=1065704&r1=1065703&r2=1065704&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-lifecycle/src/main/java/org/apache/cayenne/lifecycle/audit/AuditableFilter.java (original)
+++ cayenne/main/trunk/framework/cayenne-lifecycle/src/main/java/org/apache/cayenne/lifecycle/audit/AuditableFilter.java Mon Jan 31 18:29:34 2011
@@ -38,12 +38,12 @@ import org.apache.cayenne.query.Query;
  */
 public class AuditableFilter implements DataChannelFilter {
 
-    private ThreadLocal<AuditableAggregator> aggregator;
+    private ThreadLocal<AuditableAggregator> threadAggregator;
     protected AuditableProcessor processor;
 
     public AuditableFilter(AuditableProcessor processor) {
         this.processor = processor;
-        this.aggregator = new ThreadLocal<AuditableAggregator>();
+        this.threadAggregator = new ThreadLocal<AuditableAggregator>();
     }
 
     public void init(DataChannel channel) {
@@ -63,31 +63,38 @@ public class AuditableFilter implements 
             int syncType,
             DataChannelFilterChain filterChain) {
 
-        try {
-            GraphDiff response = filterChain
-                    .onSync(originatingContext, changes, syncType);
-
-            postSync();
+        GraphDiff response;
 
-            return response;
+        try {
+            response = filterChain.onSync(originatingContext, changes, syncType);
+            if (syncType == DataChannel.FLUSH_CASCADE_SYNC
+                    || syncType == DataChannel.FLUSH_NOCASCADE_SYNC) {
+                postSync();
+            }
         }
         finally {
-            aggregator.set(null);
+            threadAggregator.set(null);
         }
+
+        return response;
     }
 
     void postSync() {
-        AuditableAggregator aggregator = this.aggregator.get();
+        AuditableAggregator aggregator = threadAggregator.get();
         if (aggregator != null) {
+            // must reset thread aggregator before processing the audit operations
+            // to avoid an endless processing loop if audit processor commits
+            // something
+            threadAggregator.set(null);
             aggregator.postSync();
         }
     }
 
     private AuditableAggregator getAggregator() {
-        AuditableAggregator aggregator = this.aggregator.get();
+        AuditableAggregator aggregator = threadAggregator.get();
         if (aggregator == null) {
             aggregator = new AuditableAggregator(processor);
-            this.aggregator.set(aggregator);
+            threadAggregator.set(aggregator);
         }
 
         return aggregator;