diff --git a/impl/extension/jdbc/src/main/java/br/gov/frameworkdemoiselle/internal/producer/ConnectionProducer.java b/impl/extension/jdbc/src/main/java/br/gov/frameworkdemoiselle/internal/producer/ConnectionProducer.java index a96edc8..fc5aaef 100644 --- a/impl/extension/jdbc/src/main/java/br/gov/frameworkdemoiselle/internal/producer/ConnectionProducer.java +++ b/impl/extension/jdbc/src/main/java/br/gov/frameworkdemoiselle/internal/producer/ConnectionProducer.java @@ -37,6 +37,7 @@ public class ConnectionProducer implements Serializable { private ResourceBundle bundle; private final Map cache = Collections.synchronizedMap(new HashMap()); + private final Map statusCache = Collections.synchronizedMap(new HashMap()); @Inject private DataSourceProducer producer; @@ -79,6 +80,7 @@ public class ConnectionProducer implements Serializable { disableAutoCommit(connection); cache.put(name, connection); + statusCache.put(connection, new Status()); logger.info(bundle.getString("connection-was-created", name)); } catch (Exception cause) { @@ -150,5 +152,34 @@ public class ConnectionProducer implements Serializable { public Map getCache() { return cache; } + + public Status getStatus(Connection connection) { + return statusCache.get(connection); + } + + public static class Status implements Serializable { + + private static final long serialVersionUID = 1L; + + private boolean active = false; + + private boolean markedRollback = false; + + public boolean isActive() { + return active; + } + + public void setActive(boolean active) { + this.active = active; + } + + public boolean isMarkedRollback() { + return markedRollback; + } + + public void setRollbackOnly(boolean markedRollback) { + this.markedRollback = markedRollback; + } + } } diff --git a/impl/extension/jdbc/src/main/java/br/gov/frameworkdemoiselle/internal/proxy/ConnectionProxy.java b/impl/extension/jdbc/src/main/java/br/gov/frameworkdemoiselle/internal/proxy/ConnectionProxy.java index c645d39..f4dc94f 100644 --- a/impl/extension/jdbc/src/main/java/br/gov/frameworkdemoiselle/internal/proxy/ConnectionProxy.java +++ b/impl/extension/jdbc/src/main/java/br/gov/frameworkdemoiselle/internal/proxy/ConnectionProxy.java @@ -27,7 +27,7 @@ public class ConnectionProxy implements Connection, Serializable { private static final long serialVersionUID = 1L; private final String dataSourceName; - + public ConnectionProxy(String dataSourceName) { this.dataSourceName = dataSourceName; } @@ -236,4 +236,5 @@ public class ConnectionProxy implements Connection, Serializable { public T unwrap(Class iface) throws SQLException { return getDelegate().unwrap(iface); } + } diff --git a/impl/extension/jdbc/src/main/java/br/gov/frameworkdemoiselle/transaction/JDBCTransaction.java b/impl/extension/jdbc/src/main/java/br/gov/frameworkdemoiselle/transaction/JDBCTransaction.java index d3456d3..ac817dc 100644 --- a/impl/extension/jdbc/src/main/java/br/gov/frameworkdemoiselle/transaction/JDBCTransaction.java +++ b/impl/extension/jdbc/src/main/java/br/gov/frameworkdemoiselle/transaction/JDBCTransaction.java @@ -38,18 +38,16 @@ package br.gov.frameworkdemoiselle.transaction; import static br.gov.frameworkdemoiselle.annotation.Priority.L2_PRIORITY; -import java.io.Serializable; import java.sql.Connection; import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; import br.gov.frameworkdemoiselle.DemoiselleException; import br.gov.frameworkdemoiselle.annotation.Priority; import br.gov.frameworkdemoiselle.internal.producer.ConnectionProducer; +import br.gov.frameworkdemoiselle.internal.producer.ConnectionProducer.Status; import br.gov.frameworkdemoiselle.util.Beans; + /** * Represents the strategy destinated to manage JDBC transactions. * @@ -63,17 +61,22 @@ public class JDBCTransaction implements Transaction { private ConnectionProducer producer; - private Map cache = Collections.synchronizedMap(new HashMap()); + //private Map cache = Collections.synchronizedMap(new HashMap()); + //private List cache = Collections.synchronizedList(new ArrayList()); private ConnectionProducer getProducer() { if (producer == null) { producer = Beans.getReference(ConnectionProducer.class); - for (Connection connection : producer.getCache().values()) { - if (!cache.containsKey(connection)) { - cache.put(connection, new Status()); + /*for (Connection connection : producer.getCache().values()) { + if (!ConnectionProxy.class.isInstance(connection)) { + continue; } - } + + if (!cache.contains(connection)) { + cache.add((ConnectionProxy)connection); + } + }*/ } return producer; @@ -87,7 +90,7 @@ public class JDBCTransaction implements Transaction { public void begin() { Status status; for (Connection connection : getDelegate()) { - status = cache.get(connection); + status = getProducer().getStatus(connection); status.setActive(true); } } @@ -97,9 +100,13 @@ public class JDBCTransaction implements Transaction { */ @Override public void commit() { + Status status; + for (Connection connection : getDelegate()) { try { connection.commit(); + status = getProducer().getStatus(connection); + status.setActive(false); } catch (Exception cause) { throw new DemoiselleException(cause); } @@ -111,9 +118,13 @@ public class JDBCTransaction implements Transaction { */ @Override public void rollback() { + Status status; + for (Connection connection : getDelegate()) { try { connection.rollback(); + status = getProducer().getStatus(connection); + status.setActive(false); } catch (Exception cause) { throw new DemoiselleException(cause); } @@ -124,7 +135,7 @@ public class JDBCTransaction implements Transaction { public void setRollbackOnly() { Status status; for (Connection connection : getDelegate()) { - status = cache.get(connection); + status = getProducer().getStatus(connection); status.setRollbackOnly(true); } } @@ -135,7 +146,7 @@ public class JDBCTransaction implements Transaction { boolean result = true; for (Connection connection : getDelegate()) { - status = cache.get(connection); + status = getProducer().getStatus(connection); result = result && status.isActive(); } @@ -148,14 +159,14 @@ public class JDBCTransaction implements Transaction { boolean result = true; for (Connection connection : getDelegate()) { - status = cache.get(connection); + status = getProducer().getStatus(connection); result = result && status.isMarkedRollback(); } return result; } - private static class Status implements Serializable { + /*private static class Status implements Serializable { private static final long serialVersionUID = 1L; @@ -178,5 +189,5 @@ public class JDBCTransaction implements Transaction { public void setRollbackOnly(boolean markedRollback) { this.markedRollback = markedRollback; } - } + }*/ } -- libgit2 0.21.2