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;