You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2018/01/03 11:37:32 UTC

[isis] branch master updated: ISIS-1729: improves the auditer service spi so that it ignores objects that are created and then deleted in the same xactn

This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new f136d19  ISIS-1729: improves the auditer service spi so that it ignores objects that are created and then deleted in the same xactn
f136d19 is described below

commit f136d1948705141f1552459ff44fcc5449c6e159
Author: Dan Haywood <da...@haywood-associates.co.uk>
AuthorDate: Wed Jan 3 10:04:41 2018 +0000

    ISIS-1729: improves the auditer service spi so that it ignores objects that are created and then deleted in the same xactn
---
 .../changes/ChangedObjectsServiceInternal.java     |  6 +--
 .../runtime/services/changes/PreAndPostValues.java | 12 ++++--
 .../changes/PreAndPostValues_shouldAudit_Test.java | 47 ++++++++++++++++++++++
 .../src/main/webapp/WEB-INF/logging.properties     | 26 +++++++-----
 .../modules/simple/dom/impl/SimpleObjects.java     | 15 +++++++
 .../src/main/webapp/WEB-INF/logging.properties     | 26 +++++++-----
 6 files changed, 106 insertions(+), 26 deletions(-)

diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/changes/ChangedObjectsServiceInternal.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/changes/ChangedObjectsServiceInternal.java
index 063aaa6..3611706 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/changes/ChangedObjectsServiceInternal.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/changes/ChangedObjectsServiceInternal.java
@@ -226,7 +226,7 @@ public class ChangedObjectsServiceInternal implements WithTransactionScope {
     }
 
     private Set<Map.Entry<AdapterAndProperty, PreAndPostValues>> capturePostValuesAndDrain(final Map<AdapterAndProperty, PreAndPostValues> changedObjectProperties) {
-        final Map<AdapterAndProperty, PreAndPostValues> processedObjectProperties1 = Maps.newLinkedHashMap();
+        final Map<AdapterAndProperty, PreAndPostValues> processedObjectProperties = Maps.newLinkedHashMap();
 
         while(!changedObjectProperties.isEmpty()) {
 
@@ -245,12 +245,12 @@ public class ChangedObjectsServiceInternal implements WithTransactionScope {
                 }
 
                 // if we encounter the same objectProperty again, this will simply overwrite it
-                processedObjectProperties1.put(aap, papv);
+                processedObjectProperties.put(aap, papv);
             }
         }
 
         return Collections.unmodifiableSet(
-                Sets.filter(processedObjectProperties1.entrySet(), PreAndPostValues.Predicates.CHANGED));
+                Sets.filter(processedObjectProperties.entrySet(), PreAndPostValues.Predicates.SHOULD_AUDIT));
     }
 
     protected boolean shouldIgnore(final ObjectAdapter adapter) {
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/changes/PreAndPostValues.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/changes/PreAndPostValues.java
index 4a5cb39..73559e3 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/changes/PreAndPostValues.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/changes/PreAndPostValues.java
@@ -28,11 +28,11 @@ import org.apache.isis.core.runtime.system.transaction.IsisTransaction;
 public class PreAndPostValues {
 
     public static class Predicates {
-        public final static Predicate<Map.Entry<?, PreAndPostValues>> CHANGED = new Predicate<Map.Entry<?, PreAndPostValues>>() {
+        public final static Predicate<Map.Entry<?, PreAndPostValues>> SHOULD_AUDIT = new Predicate<Map.Entry<?, PreAndPostValues>>() {
             @Override
             public boolean apply(Map.Entry<?, PreAndPostValues> input) {
                 final PreAndPostValues papv = input.getValue();
-                return papv.differ();
+                return papv.shouldAudit();
             }
         };
     }
@@ -95,10 +95,16 @@ public class PreAndPostValues {
         return getPre() + " -> " + getPost();
     }
 
-    public boolean differ() {
+    public boolean shouldAudit() {
+        // don't audit objects that were created and then immediately deleted within the same xactn
+        if (getPre() == IsisTransaction.Placeholder.NEW && getPost() == IsisTransaction.Placeholder.DELETED) {
+            return false;
+        }
+        // but do always audit objects that have just been created or deleted
         if (getPre() == IsisTransaction.Placeholder.NEW || getPost() == IsisTransaction.Placeholder.DELETED) {
             return true;
         }
+        // else - for updated objects - audit only if the property value has changed
         return !Objects.equal(getPre(), getPost());
     }
 }
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/services/changes/PreAndPostValues_shouldAudit_Test.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/services/changes/PreAndPostValues_shouldAudit_Test.java
new file mode 100644
index 0000000..14252f9
--- /dev/null
+++ b/core/runtime/src/test/java/org/apache/isis/core/runtime/services/changes/PreAndPostValues_shouldAudit_Test.java
@@ -0,0 +1,47 @@
+package org.apache.isis.core.runtime.services.changes;
+
+import org.junit.Test;
+
+import org.apache.isis.core.runtime.system.transaction.IsisTransaction;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class PreAndPostValues_shouldAudit_Test {
+
+    @Test
+    public void just_created() {
+        final PreAndPostValues papv = PreAndPostValues.pre(IsisTransaction.Placeholder.NEW);
+        papv.setPost("Foo");
+
+        assertTrue(papv.shouldAudit());
+    }
+    @Test
+    public void just_deleted() {
+        final PreAndPostValues papv = PreAndPostValues.pre("Foo");
+        papv.setPost(IsisTransaction.Placeholder.DELETED);
+
+        assertTrue(papv.shouldAudit());
+    }
+    @Test
+    public void changed() {
+        final PreAndPostValues papv = PreAndPostValues.pre("Foo");
+        papv.setPost("Bar");
+
+        assertTrue(papv.shouldAudit());
+    }
+    @Test
+    public void unchanged() {
+        final PreAndPostValues papv = PreAndPostValues.pre("Foo");
+        papv.setPost("Foo");
+
+        assertFalse(papv.shouldAudit());
+    }
+    @Test
+    public void created_and_then_deleted() {
+        final PreAndPostValues papv = PreAndPostValues.pre(IsisTransaction.Placeholder.NEW);
+        papv.setPost(IsisTransaction.Placeholder.DELETED);
+
+        assertFalse(papv.shouldAudit());
+    }
+}
\ No newline at end of file
diff --git a/example/application/helloworld/src/main/webapp/WEB-INF/logging.properties b/example/application/helloworld/src/main/webapp/WEB-INF/logging.properties
index 53bb3da..ded0152 100644
--- a/example/application/helloworld/src/main/webapp/WEB-INF/logging.properties
+++ b/example/application/helloworld/src/main/webapp/WEB-INF/logging.properties
@@ -44,11 +44,17 @@ log4j.appender.File.append=false
 log4j.appender.File.layout=org.apache.log4j.PatternLayout
 log4j.appender.File.layout.ConversionPattern=%d [%-20c{1} %-10t %-5p]  %m%n
 
-log4j.appender.sql=org.apache.log4j.RollingFileAppender
-log4j.appender.sql.File=./logs/sql.log
-log4j.appender.sql.Append=false
-log4j.appender.sql.layout=org.apache.log4j.PatternLayout
-log4j.appender.sql.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
+log4j.appender.sql-dml=org.apache.log4j.RollingFileAppender
+log4j.appender.sql-dml.File=./logs/sql-dml.log
+log4j.appender.sql-dml.Append=false
+log4j.appender.sql-dml.layout=org.apache.log4j.PatternLayout
+log4j.appender.sql-dml.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
+
+log4j.appender.sql-ddl=org.apache.log4j.RollingFileAppender
+log4j.appender.sql-ddl.File=./logs/sql-ddl.log
+log4j.appender.sql-ddl.Append=false
+log4j.appender.sql-ddl.layout=org.apache.log4j.PatternLayout
+log4j.appender.sql-ddl.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
 
 log4j.appender.sqltiming=org.apache.log4j.RollingFileAppender
 log4j.appender.sqltiming.File=./logs/sqltiming.log
@@ -105,10 +111,10 @@ log4j.additivity.org.apache.isis.applib.services.audit.AuditerServiceLogging=fal
 
 # DataNucleus
 # the first two log the DML and DDL (if set to DEBUG)
-log4j.logger.DataNucleus.Datastore.Native=DEBUG, Console, sql
-log4j.logger.DataNucleus.Datastore.Schema=DEBUG, Console, sql
-#log4j.logger.DataNucleus.Datastore.Native=WARN, Console
-#log4j.logger.DataNucleus.Datastore.Schema=WARN, Console
+log4j.logger.DataNucleus.Datastore.Native=DEBUG, Console, sql-dml
+log4j.logger.DataNucleus.Datastore.Schema=DEBUG, Console, sql-ddl
+#log4j.logger.DataNucleus.Datastore.Native=WARN, Console, sql-dml
+#log4j.logger.DataNucleus.Datastore.Schema=WARN, Console, sql-ddl
 # the remainder can probably be left to WARN
 log4j.logger.DataNucleus.Persistence=WARN, Console
 log4j.logger.DataNucleus.Transaction=WARN, Console
@@ -152,7 +158,7 @@ log4j.additivity.DataNucleus.Datastore.IDE=false
 
 
 # if using log4jdbc-remix as JDBC driver
-#log4j.logger.jdbc.sqlonly=DEBUG, sql, Console
+#log4j.logger.jdbc.sqlonly=DEBUG, sql-dml, Console
 #log4j.additivity.jdbc.sqlonly=false
 #log4j.logger.jdbc.resultsettable=DEBUG, jdbc, Console
 #log4j.additivity.jdbc.resultsettable=false
diff --git a/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/dom/impl/SimpleObjects.java b/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/dom/impl/SimpleObjects.java
index f216f8a..e245dbb 100644
--- a/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/dom/impl/SimpleObjects.java
+++ b/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/dom/impl/SimpleObjects.java
@@ -35,6 +35,7 @@ import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.eventbus.ActionDomainEvent;
 import org.apache.isis.applib.services.jdosupport.IsisJdoSupport;
 import org.apache.isis.applib.services.repository.RepositoryService;
+import org.apache.isis.applib.services.xactn.TransactionService;
 
 @DomainService(
         nature = NatureOfService.VIEW_MENU_ONLY,
@@ -92,6 +93,20 @@ public class SimpleObjects {
         return repositoryService.persist(new SimpleObject(name));
     }
 
+    @Action
+    @MemberOrder(sequence = "4")
+    public void createAndDelete(
+            @ParameterLayout(named="Name")
+            final String name) {
+        final SimpleObject simpleObject = create(name);
+        transactionService.nextTransaction();
+        simpleObject.delete();
+        transactionService.nextTransaction();
+    }
+
+    @javax.inject.Inject
+    TransactionService transactionService;
+
     @javax.inject.Inject
     RepositoryService repositoryService;
 
diff --git a/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/logging.properties b/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/logging.properties
index 53bb3da..ded0152 100644
--- a/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/logging.properties
+++ b/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/logging.properties
@@ -44,11 +44,17 @@ log4j.appender.File.append=false
 log4j.appender.File.layout=org.apache.log4j.PatternLayout
 log4j.appender.File.layout.ConversionPattern=%d [%-20c{1} %-10t %-5p]  %m%n
 
-log4j.appender.sql=org.apache.log4j.RollingFileAppender
-log4j.appender.sql.File=./logs/sql.log
-log4j.appender.sql.Append=false
-log4j.appender.sql.layout=org.apache.log4j.PatternLayout
-log4j.appender.sql.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
+log4j.appender.sql-dml=org.apache.log4j.RollingFileAppender
+log4j.appender.sql-dml.File=./logs/sql-dml.log
+log4j.appender.sql-dml.Append=false
+log4j.appender.sql-dml.layout=org.apache.log4j.PatternLayout
+log4j.appender.sql-dml.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
+
+log4j.appender.sql-ddl=org.apache.log4j.RollingFileAppender
+log4j.appender.sql-ddl.File=./logs/sql-ddl.log
+log4j.appender.sql-ddl.Append=false
+log4j.appender.sql-ddl.layout=org.apache.log4j.PatternLayout
+log4j.appender.sql-ddl.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
 
 log4j.appender.sqltiming=org.apache.log4j.RollingFileAppender
 log4j.appender.sqltiming.File=./logs/sqltiming.log
@@ -105,10 +111,10 @@ log4j.additivity.org.apache.isis.applib.services.audit.AuditerServiceLogging=fal
 
 # DataNucleus
 # the first two log the DML and DDL (if set to DEBUG)
-log4j.logger.DataNucleus.Datastore.Native=DEBUG, Console, sql
-log4j.logger.DataNucleus.Datastore.Schema=DEBUG, Console, sql
-#log4j.logger.DataNucleus.Datastore.Native=WARN, Console
-#log4j.logger.DataNucleus.Datastore.Schema=WARN, Console
+log4j.logger.DataNucleus.Datastore.Native=DEBUG, Console, sql-dml
+log4j.logger.DataNucleus.Datastore.Schema=DEBUG, Console, sql-ddl
+#log4j.logger.DataNucleus.Datastore.Native=WARN, Console, sql-dml
+#log4j.logger.DataNucleus.Datastore.Schema=WARN, Console, sql-ddl
 # the remainder can probably be left to WARN
 log4j.logger.DataNucleus.Persistence=WARN, Console
 log4j.logger.DataNucleus.Transaction=WARN, Console
@@ -152,7 +158,7 @@ log4j.additivity.DataNucleus.Datastore.IDE=false
 
 
 # if using log4jdbc-remix as JDBC driver
-#log4j.logger.jdbc.sqlonly=DEBUG, sql, Console
+#log4j.logger.jdbc.sqlonly=DEBUG, sql-dml, Console
 #log4j.additivity.jdbc.sqlonly=false
 #log4j.logger.jdbc.resultsettable=DEBUG, jdbc, Console
 #log4j.additivity.jdbc.resultsettable=false

-- 
To stop receiving notification emails like this one, please contact
['"commits@isis.apache.org" <co...@isis.apache.org>'].