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

doebele pushed a commit to branch version3
in repository https://gitbox.apache.org/repos/asf/empire-db.git


The following commit(s) were added to refs/heads/version3 by this push:
     new 76e915a  EMPIREDB-364 enableRollbackHandling on context
76e915a is described below

commit 76e915ae9282675d87257c6403566f1dd0483201
Author: Rainer Döbele <[email protected]>
AuthorDate: Sat Jan 22 01:34:35 2022 +0100

    EMPIREDB-364 enableRollbackHandling on context
---
 .../empire-db-example-basic/config.xml             |  7 ++++-
 .../org/apache/empire/samples/db/SampleApp.java    |  2 +-
 .../org/apache/empire/rest/service/Service.java    |  6 ++++
 .../org/apache/empire/jsf2/app/WebDBContext.java   |  6 ++++
 .../main/java/org/apache/empire/db/DBContext.java  |  6 ++--
 .../main/java/org/apache/empire/db/DBRecord.java   | 20 +++++++++----
 .../apache/empire/db/context/DBContextBase.java    | 26 ++++++++++++-----
 .../apache/empire/db/context/DBContextStatic.java  | 34 ++++++++++++++++++----
 .../empire/db/context/DBRollbackHandler.java       |  1 +
 .../empire/db/context/DBRollbackManager.java       | 11 +++++--
 10 files changed, 93 insertions(+), 26 deletions(-)

diff --git a/empire-db-examples/empire-db-example-basic/config.xml 
b/empire-db-examples/empire-db-example-basic/config.xml
index 1f70279..1663214 100644
--- a/empire-db-examples/empire-db-example-basic/config.xml
+++ b/empire-db-examples/empire-db-example-basic/config.xml
@@ -147,7 +147,12 @@
                </logger>
 
                <logger name="org.apache.empire.db" additivity="false">
-                       <level value="warn"/>
+                       <level value="info"/>
+                       <appender-ref ref="default"/>
+               </logger>
+
+               <logger name="org.apache.empire.db.context" additivity="false">
+                       <level value="debug"/>
                        <appender-ref ref="default"/>
                </logger>
 
diff --git 
a/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleApp.java
 
b/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleApp.java
index edd76a4..21d3970 100644
--- 
a/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleApp.java
+++ 
b/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleApp.java
@@ -90,7 +90,7 @@ public class SampleApp
                        DBDatabaseDriver driver = 
getDatabaseDriver(config.getDatabaseProvider(), conn);
                        
             // STEP 2.2: Create a Context
-                       context = new DBContextStatic(driver, conn); 
+                       context = new DBContextStatic(driver, conn, true, 
true); 
 
             // STEP 3: Open Database (and create if not existing)
             System.out.println("*** Step 3: openDatabase() ***");
diff --git 
a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/Service.java
 
b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/Service.java
index b263e09..1117934 100644
--- 
a/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/Service.java
+++ 
b/empire-db-examples/empire-db-example-vue/src/main/java/org/apache/empire/rest/service/Service.java
@@ -91,6 +91,12 @@ public abstract class Service {
         }
 
         @Override
+        public boolean isEnableRollbackHandling()
+        {
+            return false; /* No Rollbacks allowed */
+        }
+
+        @Override
         public TextResolver getTextResolver()
         {
             return textResolver;
diff --git 
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/WebDBContext.java 
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/WebDBContext.java
index 6dfd633..1dc246f 100644
--- a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/WebDBContext.java
+++ b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/WebDBContext.java
@@ -49,6 +49,12 @@ public class WebDBContext<DB extends DBDatabase> extends 
DBContextBase
         return driver;
     }
 
+    @Override
+    public boolean isEnableRollbackHandling()
+    {
+        return true;
+    }
+
     /**
      * Unclear weather this is any useful
      * Do not call, as the connections are managed by the Application
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBContext.java 
b/empire-db/src/main/java/org/apache/empire/db/DBContext.java
index 14a1bfc..ae1e6fa 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBContext.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBContext.java
@@ -18,11 +18,13 @@ public interface DBContext
     void commit();
 
     void rollback();
+    
+    boolean isEnableRollbackHandling();
+    
+    void appendRollbackHandler(DBRollbackHandler handler);
 
     void removeRollbackHandler(DBObject object);
     
-    void addRollbackHandler(DBRollbackHandler handler);
-    
     void discard();
     
 }
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBRecord.java 
b/empire-db/src/main/java/org/apache/empire/db/DBRecord.java
index bc79a99..644d698 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBRecord.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBRecord.java
@@ -94,6 +94,12 @@ public class DBRecord extends DBRecordData implements 
DBContextAware, Record, Cl
         }
 
         @Override
+        public String getObjectInfo()
+        {
+            return "Record 
"+record.getRowSet().getName()+":"+StringUtils.arrayToString(record.getKey(), 
"|");
+        }
+
+        @Override
         public void combine(DBRollbackHandler successor)
         {
             if (record!=successor.getObject())
@@ -130,7 +136,8 @@ public class DBRecord extends DBRecordData implements 
DBContextAware, Record, Cl
             record.modified = this.modified;
             record.rowsetData = rowsetData;
             // done
-            log.info("Rollback for record {}[{}] performed", 
record.getRowSet().getName(), StringUtils.arrayToString(record.getKey(), "|"));
+            if (log.isInfoEnabled())
+                log.info("Rollback for {} performed.", getObjectInfo());
         }
 
         @Override
@@ -205,8 +212,8 @@ public class DBRecord extends DBRecordData implements 
DBContextAware, Record, Cl
     private Object          rowsetData; // Special Rowset Data (usually null)
 
     // options
-    protected boolean       enableRollbackHandling = true;
-    protected boolean       validateFieldValues = true;
+    protected boolean       enableRollbackHandling;
+    protected boolean       validateFieldValues;
     
     /**
      * Constructs a new DBRecord.<BR>
@@ -225,6 +232,9 @@ public class DBRecord extends DBRecordData implements 
DBContextAware, Record, Cl
         this.fields = null;
         this.modified = null;
         this.rowsetData = null;
+        // options                         
+        enableRollbackHandling = context.isEnableRollbackHandling();
+        validateFieldValues = true;
     }
 
     /**
@@ -817,7 +827,7 @@ public class DBRecord extends DBRecordData implements 
DBContextAware, Record, Cl
             return; /* Not modified. Nothing to do! */
         // allow rollback
         if (enableRollbackHandling)
-            context.addRollbackHandler(createRollbackHandler());
+            context.appendRollbackHandler(createRollbackHandler());
         // update
         rowset.updateRecord(this);
     }
@@ -838,7 +848,7 @@ public class DBRecord extends DBRecordData implements 
DBContextAware, Record, Cl
             throw new ObjectNotValidException(this);
         // allow rollback
         if (enableRollbackHandling)
-            context.addRollbackHandler(createRollbackHandler());
+            context.appendRollbackHandler(createRollbackHandler());
         // Delete only if record is not new
         if (!isNew())
         {
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/context/DBContextBase.java 
b/empire-db/src/main/java/org/apache/empire/db/context/DBContextBase.java
index 2e66b75..aa24b00 100644
--- a/empire-db/src/main/java/org/apache/empire/db/context/DBContextBase.java
+++ b/empire-db/src/main/java/org/apache/empire/db/context/DBContextBase.java
@@ -27,7 +27,7 @@ public abstract class DBContextBase implements DBContext
     
     private DBUtils utils = null;
     
-    private boolean noRollbacksWarnOnce = true;
+    private boolean noRollbackManagerWarnOnce = true;
     
     /**
      * Factory function for Utils creation 
@@ -71,7 +71,7 @@ public abstract class DBContextBase implements DBContext
             if (conn.getAutoCommit()==false)
                 conn.commit();
             // discard rollbacks
-            DBRollbackManager dbrm = getRollbackManager(false);
+            DBRollbackManager dbrm = (isEnableRollbackHandling() ? 
getRollbackManager(false) : null);
             if (dbrm!=null)
                 dbrm.releaseConnection(conn, ReleaseAction.Discard);
             // Done
@@ -103,7 +103,7 @@ public abstract class DBContextBase implements DBContext
             log.info("Database rollback issued!");
             conn.rollback();
             // perform Rollback
-            DBRollbackManager dbrm = getRollbackManager(false);
+            DBRollbackManager dbrm = (isEnableRollbackHandling() ? 
getRollbackManager(false) : null);
             if (dbrm!=null)
                 dbrm.releaseConnection(conn, ReleaseAction.Rollback);
             // Done
@@ -115,17 +115,22 @@ public abstract class DBContextBase implements DBContext
     }
     
     @Override
-    public void addRollbackHandler(DBRollbackHandler handler)
+    public void appendRollbackHandler(DBRollbackHandler handler)
     {
         if (handler==null || handler.getObject()==null)
             throw new InvalidArgumentException("handler", handler);
+        // Check enabled
+        if (!isEnableRollbackHandling())
+        {   log.warn("*** Rollback handling is disabled for this context. 
AppendRollbackHandler must not be called! ***");
+            return;
+        }
         // Add handler
         DBRollbackManager dbrm = getRollbackManager(true);
         if (dbrm!=null)
-            dbrm.addHandler(getConnection(true), handler);
-        else if (noRollbacksWarnOnce)
-        {   log.warn("*** No DBRollbackManager provided. Rollbacks will be 
disabled! ***");
-            noRollbacksWarnOnce = false;
+            dbrm.appendHandler(getConnection(true), handler);
+        else if (noRollbackManagerWarnOnce)
+        {   log.warn("*** No DBRollbackManager provided! Rollbacks will be 
disabled. ***");
+            noRollbackManagerWarnOnce = false;
         }
     }
     
@@ -134,6 +139,11 @@ public abstract class DBContextBase implements DBContext
     {
         if (object==null)
             throw new InvalidArgumentException("object", object);
+        // Check enabled
+        if (!isEnableRollbackHandling())
+        {   log.warn("*** Rollback handling is disabled for this context. 
RemoveRollbackHandler should not be called! ***");
+            return;
+        }
         // Remove handler
         DBRollbackManager dbrm = getRollbackManager(false);
         if (dbrm!=null)
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/context/DBContextStatic.java 
b/empire-db/src/main/java/org/apache/empire/db/context/DBContextStatic.java
index 9897866..0afe1a1 100644
--- a/empire-db/src/main/java/org/apache/empire/db/context/DBContextStatic.java
+++ b/empire-db/src/main/java/org/apache/empire/db/context/DBContextStatic.java
@@ -12,6 +12,7 @@ public class DBContextStatic extends DBContextBase
 {
     private final DBDatabaseDriver driver;
     private final Connection conn;
+    private final boolean enableRollbackHandling;
     private final boolean closeOnDiscard;
     
     /**
@@ -21,23 +22,42 @@ public class DBContextStatic extends DBContextBase
      *  initialObjectCapacity = 16
      */
     private static final DBRollbackManager staticRollbackManager = new 
DBRollbackManager(2, 16);
+
+    /**
+     * Creates a static DBContext with default options
+     * @param driver
+     * @param conn
+     */
+    public DBContextStatic(DBDatabaseDriver driver, Connection conn)
+    {
+        this(driver, conn, true, false);
+    }
     
-    public DBContextStatic(DBDatabaseDriver driver, Connection conn, boolean 
closeOnDiscard)
+    /**
+     * Creates a static DBContext with custom options
+     * @param driver
+     * @param conn
+     * @param enableRollbackHandling
+     * @param closeOnDiscard
+     */
+    public DBContextStatic(DBDatabaseDriver driver, Connection conn, boolean 
enableRollbackHandling, boolean closeOnDiscard)
     {
         this.driver = driver;
         this.conn = conn;
+        this.enableRollbackHandling = enableRollbackHandling;
         this.closeOnDiscard = closeOnDiscard;
     }
 
-    public DBContextStatic(DBDatabaseDriver driver, Connection conn)
+    @Override
+    public DBDatabaseDriver getDriver()
     {
-        this(driver, conn, false);
+        return driver;
     }
 
     @Override
-    public DBDatabaseDriver getDriver()
+    public boolean isEnableRollbackHandling()
     {
-        return driver;
+        return enableRollbackHandling;
     }
     
     @Override
@@ -48,7 +68,9 @@ public class DBContextStatic extends DBContextBase
         if (closeOnDiscard) 
         {   // Close the connection
             closeConnection();
-            staticRollbackManager.releaseConnection(conn, 
ReleaseAction.Discard);
+            // rollbackManager release
+            if (enableRollbackHandling)
+                staticRollbackManager.releaseConnection(conn, 
ReleaseAction.Discard);
         }
     }
 
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/context/DBRollbackHandler.java 
b/empire-db/src/main/java/org/apache/empire/db/context/DBRollbackHandler.java
index b5029eb..9e94e88 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/context/DBRollbackHandler.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/context/DBRollbackHandler.java
@@ -8,6 +8,7 @@ import org.apache.empire.db.DBObject;
 public interface DBRollbackHandler
 {
     DBObject getObject();
+    String getObjectInfo();
     void combine(DBRollbackHandler successor);
     void rollback();
     void discard();
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/context/DBRollbackManager.java 
b/empire-db/src/main/java/org/apache/empire/db/context/DBRollbackManager.java
index 17c6175..aa0bc36 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/context/DBRollbackManager.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/context/DBRollbackManager.java
@@ -38,7 +38,7 @@ public class DBRollbackManager
      * @param conn
      * @param handler
      */
-    public synchronized void addHandler(Connection conn, DBRollbackHandler 
handler)
+    public synchronized void appendHandler(Connection conn, DBRollbackHandler 
handler)
     {
         Map<DBObject, DBRollbackHandler> handlerMap = 
connectionMap.get(conn.hashCode());
         if (handlerMap==null)
@@ -54,6 +54,9 @@ public class DBRollbackManager
             handlerMap.get(object).combine(handler);
         else
             handlerMap.put(object, handler);
+        // log
+        if (log.isDebugEnabled())
+            log.debug("Rollback handler for {} was added.", 
handler.getObjectInfo());
     }
     
     /**
@@ -75,8 +78,9 @@ public class DBRollbackManager
         DBRollbackHandler handler = handlerMap.remove(object); 
         if (handler==null)
             return; // No handler
-        // dispose
-        log.info("Rollback handler for object {} was removed", 
object.getClass().getSimpleName());
+        // discard
+        if (log.isDebugEnabled())
+            log.debug("Rollback handler for {} was removed.", 
handler.getObjectInfo());
         handler.discard();
     }
     
@@ -89,6 +93,7 @@ public class DBRollbackManager
         if (handlerMap==null)
             return; // Nothing to do
         // rollback
+        log.info("DBRollbackManager performes {} for {} objects.", action, 
handlerMap.size());
         for (DBRollbackHandler handler : handlerMap.values())
             if (action==ReleaseAction.Rollback)
                 handler.rollback();

Reply via email to