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 6133355 WebContext overhaul
6133355 is described below
commit 613335541f794482a2ebb5d63ff1fbc8f1e0c211
Author: Rainer Döbele <[email protected]>
AuthorDate: Thu Jan 20 05:52:28 2022 +0100
WebContext overhaul
---
.../org/apache/empire/jsf2/app/WebApplication.java | 102 ++++++++++++---------
.../org/apache/empire/jsf2/app/WebDBContext.java | 11 +--
.../apache/empire/db/context/DBContextBase.java | 6 ++
3 files changed, 68 insertions(+), 51 deletions(-)
diff --git
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/WebApplication.java
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/WebApplication.java
index d9948a3..2115243 100644
---
a/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/WebApplication.java
+++
b/empire-db-jsf2/src/main/java/org/apache/empire/jsf2/app/WebApplication.java
@@ -20,8 +20,10 @@ package org.apache.empire.jsf2.app;
import java.sql.Connection;
import java.sql.SQLException;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
+import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;
@@ -56,10 +58,8 @@ import org.slf4j.LoggerFactory;
public abstract class WebApplication
{
private static final Logger log =
LoggerFactory.getLogger(WebApplication.class);
-
- private static final String CONNECTION_ATTRIBUTE = "dbConnections";
-
- private static final String DB_CONTEXT_MAP = "dbContextMap";
+
+ private static final String CONNECTION_CONTEXT_INFO_MAP =
"CONNECTION_CONTEXT_INFO_MAP";
public static String APPLICATION_BEAN_NAME = "webApplication";
@@ -454,67 +454,77 @@ public abstract class WebApplication
}
/**
- * returns a connection for the current Request
+ * Internally used to manage Connections and Contexts
+ */
+ private static class ConnectionContextInfo
+ {
+ ConnectionContextInfo(Connection conn, WebDBContext<? extends
DBDatabase> ctx)
+ {
+ this.connection = conn;
+ ctxList.add(ctx);
+ }
+ public Connection connection;
+ public final List<WebDBContext<? extends DBDatabase>> ctxList = new
ArrayList<WebDBContext<? extends DBDatabase>>(1);
+ }
+
+ /**
+ * Obtains a connection for the current request
+ * A WebDBContext must be provided which must store the connection util
releaseConnection is called
*/
public Connection getConnectionForRequest(FacesContext fc, WebDBContext<?
extends DBDatabase> context)
{
if (fc == null)
throw new InvalidArgumentException("FacesContext", fc);
if (context == null)
- throw new InvalidArgumentException("context", context);
- // Get Conneciton map
- DBDatabase db = context.getDatabase();
+ throw new InvalidArgumentException("WebDBContext", context);
+ // Get the ConnectionContextInfo map
@SuppressWarnings("unchecked")
- Map<DBDatabase, Connection> connMap = (Map<DBDatabase, Connection>)
FacesUtils.getRequestAttribute(fc, CONNECTION_ATTRIBUTE);
- if (connMap== null)
- { connMap = new HashMap<DBDatabase, Connection>();
- FacesUtils.setRequestAttribute(fc, CONNECTION_ATTRIBUTE, connMap);
+ Map<DBDatabase, ConnectionContextInfo> cciMap = (Map<DBDatabase,
ConnectionContextInfo>) FacesUtils.getRequestAttribute(fc,
CONNECTION_CONTEXT_INFO_MAP);
+ if (cciMap== null)
+ { cciMap = new HashMap<DBDatabase, ConnectionContextInfo>();
+ FacesUtils.setRequestAttribute(fc, CONNECTION_CONTEXT_INFO_MAP,
cciMap);
}
- Connection conn = connMap.get(db);
- if (conn==null)
+ DBDatabase db = context.getDatabase();
+ ConnectionContextInfo cci = cciMap.get(db);
+ if (cci==null)
{ // Get Pooled Connection
- conn = getConnection(db);
+ Connection conn = getConnection(db);
if (conn== null)
throw new UnexpectedReturnValueException(this,
"getConnection");
// Add to map
- connMap.put(db, conn);
+ cci = new ConnectionContextInfo(conn, context);
+ cciMap.put(db, cci);
}
- // Store Context
- @SuppressWarnings("unchecked")
- Map<Integer, WebDBContext<? extends DBDatabase>> ctxMap =
(Map<Integer, WebDBContext<? extends DBDatabase>>)
FacesUtils.getRequestAttribute(fc, DB_CONTEXT_MAP);
- if (ctxMap== null)
- { ctxMap = new HashMap<Integer, WebDBContext<? extends
DBDatabase>>();
- FacesUtils.setRequestAttribute(fc, DB_CONTEXT_MAP, ctxMap);
+ else
+ { // add context
+ if (cci.ctxList.contains(context)==false)
+ cci.ctxList.add(context);
}
- ctxMap.put(conn.hashCode(), context);
// done
- return conn;
+ return cci.connection;
}
/**
- * releases the current request connection
+ * Releases all connections attached to the current request
* @param fc the FacesContext
* @param commit when true changes are committed otherwise they are rolled
back
*/
public void releaseAllConnections(final FacesContext fc, boolean commit)
{
@SuppressWarnings("unchecked")
- Map<DBDatabase, Connection> connMap = (Map<DBDatabase, Connection>)
FacesUtils.getRequestAttribute(fc, CONNECTION_ATTRIBUTE);
- @SuppressWarnings("unchecked")
- Map<Integer, WebDBContext<? extends DBDatabase>> ctxMap =
(Map<Integer, WebDBContext<? extends DBDatabase>>)
FacesUtils.getRequestAttribute(fc, DB_CONTEXT_MAP);
- if (connMap != null)
+ Map<DBDatabase, ConnectionContextInfo> cciMap = (Map<DBDatabase,
ConnectionContextInfo>) FacesUtils.getRequestAttribute(fc,
CONNECTION_CONTEXT_INFO_MAP);
+ if (cciMap != null)
{ // Walk the connection map
- for (Map.Entry<DBDatabase, Connection> e : connMap.entrySet())
+ for (Map.Entry<DBDatabase, ConnectionContextInfo> e :
cciMap.entrySet())
{
- Connection conn = e.getValue();
- releaseConnection(e.getKey(), conn, commit);
+ ConnectionContextInfo cci = e.getValue();
+ releaseConnection(e.getKey(), cci.connection, commit);
// release connection
- WebDBContext<? extends DBDatabase> ctx =
ctxMap.get(conn.hashCode());
- ctx.releaseConnection(commit);
+ for (WebDBContext<? extends DBDatabase> ctx : cci.ctxList)
+ ctx.releaseConnection(commit);
}
// remove from request map
- FacesUtils.setRequestAttribute(fc, CONNECTION_ATTRIBUTE, null);
- FacesUtils.setRequestAttribute(fc, DB_CONTEXT_MAP, null);
+ FacesUtils.setRequestAttribute(fc, CONNECTION_CONTEXT_INFO_MAP,
null);
}
}
@@ -526,13 +536,18 @@ public abstract class WebApplication
public void releaseConnection(final FacesContext fc, DBDatabase db,
boolean commit)
{
@SuppressWarnings("unchecked")
- Map<DBDatabase, Connection> connMap = (Map<DBDatabase, Connection>)
FacesUtils.getRequestAttribute(fc, CONNECTION_ATTRIBUTE);
- if (connMap != null && connMap.containsKey(db))
- { // Walk the connection map
- releaseConnection(db, connMap.get(db), commit);
- connMap.remove(db);
- if (connMap.size() == 0)
- FacesUtils.setRequestAttribute(fc, CONNECTION_ATTRIBUTE, null);
+ Map<DBDatabase, ConnectionContextInfo> cciMap = (Map<DBDatabase,
ConnectionContextInfo>) FacesUtils.getRequestAttribute(fc,
CONNECTION_CONTEXT_INFO_MAP);
+ if (cciMap != null && cciMap.containsKey(db))
+ {
+ ConnectionContextInfo cci = cciMap.get(db);
+ releaseConnection(db, cci.connection, commit);
+ // release connection
+ for (WebDBContext<? extends DBDatabase> ctx : cci.ctxList)
+ ctx.releaseConnection(commit);
+ // Walk the connection map
+ cciMap.remove(db);
+ if (cciMap.isEmpty())
+ FacesUtils.setRequestAttribute(fc,
CONNECTION_CONTEXT_INFO_MAP, null);
}
}
@@ -541,5 +556,4 @@ public abstract class WebApplication
releaseConnection(fc, db, !hasError(fc));
}
-
}
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 da70293..4e5cdd7 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
@@ -1,15 +1,12 @@
package org.apache.empire.jsf2.app;
import java.sql.Connection;
-import java.sql.SQLException;
import javax.faces.context.FacesContext;
import org.apache.empire.db.DBDatabase;
import org.apache.empire.db.DBDatabaseDriver;
import org.apache.empire.db.context.DBContextBase;
-import org.apache.empire.db.exceptions.EmpireSQLException;
-import org.apache.empire.exceptions.InvalidArgumentException;
import org.apache.empire.exceptions.NotSupportedException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -73,16 +70,16 @@ public class WebDBContext<DB extends DBDatabase> extends
DBContextBase
if (conn!=null)
super.commit();
else
- log.warn("No Connection to commmit");
+ log.info("No Connection to commmit changes");
}
@Override
- public synchronized void rollback()
+ public void rollback()
{
if (conn!=null)
- super.commit();
+ super.rollback();
else
- log.warn("No Connection to rollbakc");
+ log.info("No Connection to rollback changes");
}
public synchronized void releaseConnection(boolean commitPerformed)
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 2490bc4..2965f5e 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
@@ -105,6 +105,9 @@ public abstract class DBContextBase implements DBContext
discardAllHandlers();
}
+ /**
+ * Discards all rollback handlers
+ */
protected void discardAllHandlers()
{ // rollback
if (rollbackHandler==null)
@@ -114,6 +117,9 @@ public abstract class DBContextBase implements DBContext
rollbackHandler=null;
}
+ /**
+ * Performs rollback on all rollback handlers
+ */
protected void rollbackAllHandlers()
{ // rollback
if (rollbackHandler==null)