[jboss-cvs] JBossAS SVN: r110437 - in projects/jboss-jca/trunk: core and 15 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Mon Jan 24 10:11:33 EST 2011
Author: maeste
Date: 2011-01-24 10:11:31 -0500 (Mon, 24 Jan 2011)
New Revision: 110437
Added:
projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/ccm/
projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/ccm/CachedConnectionManagerTestCase.java
projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/ccm/package.html
projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/listener/TxConnectionListenerTestCase.java
projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/listener/package.html
projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/pool/
projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/pool/OnePoolTestCase.java
projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/pool/package.html
projects/jboss-jca/trunk/deployers/src/test/java/org/jboss/jca/test/deployers/spec/rars/testcases/package.html
Modified:
projects/jboss-jca/trunk/common/src/main/resources/schema/ironjacamar_1_0.xsd
projects/jboss-jca/trunk/core/.classpath
projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ccm/CachedConnectionManager.java
projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/listener/TxConnectionListener.java
projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/notx/NoTxConnectionManagerImpl.java
projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/AbstractPool.java
projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/listener/NoTxConnectionListenerTestCase.java
projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/test/core/spec/chapter10/api/WorkManagerRejectingScheduleWorkTestCase.java
projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/test/core/spec/chapter10/api/WorkManagerRejectingStartWorkTestCase.java
projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/test/core/spec/chapter11/section7/WorkContextSetupListenerTestCase.java
projects/jboss-jca/trunk/deployers/src/main/java/org/jboss/jca/deployers/common/AbstractResourceAdapterDeployer.java
projects/jboss-jca/trunk/doc/userguide/en-US/modules/schemas.xml
projects/jboss-jca/trunk/embedded/src/main/java/org/jboss/jca/embedded/Embedded.java
projects/jboss-jca/trunk/embedded/src/main/java/org/jboss/jca/embedded/EmbeddedJCA.java
projects/jboss-jca/trunk/embedded/src/main/java/org/jboss/jca/embedded/arquillian/EmbeddedJCAContainer.java
Log:
JBJCA-495 provide full coverage for core module
Modified: projects/jboss-jca/trunk/common/src/main/resources/schema/ironjacamar_1_0.xsd
===================================================================
--- projects/jboss-jca/trunk/common/src/main/resources/schema/ironjacamar_1_0.xsd 2011-01-24 14:32:08 UTC (rev 110436)
+++ projects/jboss-jca/trunk/common/src/main/resources/schema/ironjacamar_1_0.xsd 2011-01-24 15:11:31 UTC (rev 110437)
@@ -2,7 +2,8 @@
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
targetNamespace="http://www.jboss.org/ironjacamar/schema"
- xmlns="http://www.jboss.org/ironjacamar/schema">
+ xmlns="http://www.jboss.org/ironjacamar/schema"
+ version="1.0">
<xs:complexType name="boolean-presenceType"></xs:complexType>
Modified: projects/jboss-jca/trunk/core/.classpath
===================================================================
--- projects/jboss-jca/trunk/core/.classpath 2011-01-24 14:32:08 UTC (rev 110436)
+++ projects/jboss-jca/trunk/core/.classpath 2011-01-24 15:11:31 UTC (rev 110437)
@@ -23,5 +23,7 @@
<classpathentry kind="lib" path="/ironjacamar-parent/lib/test/mockito-all.jar"/>
<classpathentry kind="lib" path="/ironjacamar-parent/lib/test/h2.jar"/>
<classpathentry combineaccessrules="false" kind="src" path="/ironjacamar-embedded"/>
+ <classpathentry kind="lib" path="/ironjacamar-parent/lib/common/jbossjts-integration.jar"/>
+ <classpathentry kind="lib" path="/ironjacamar-parent/lib/common/jbossjts.jar"/>
<classpathentry kind="output" path="eclipse-target/classes"/>
</classpath>
Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ccm/CachedConnectionManager.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ccm/CachedConnectionManager.java 2011-01-24 14:32:08 UTC (rev 110436)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ccm/CachedConnectionManager.java 2011-01-24 15:11:31 UTC (rev 110437)
@@ -28,7 +28,6 @@
import org.jboss.jca.spi.ComponentStack;
import java.lang.reflect.Method;
-
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
@@ -42,7 +41,6 @@
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.atomic.AtomicBoolean;
-
import javax.resource.ResourceException;
import javax.resource.spi.ConnectionRequestInfo;
import javax.transaction.Synchronization;
@@ -51,7 +49,6 @@
import javax.transaction.TransactionManager;
import org.jboss.logging.Logger;
-
import org.jboss.tm.TxUtils;
import org.jboss.tm.usertx.UserTransactionListener;
import org.jboss.tm.usertx.client.ServerVMClientUserTransaction.UserTransactionStartedListener;
@@ -59,8 +56,8 @@
/**
* CacheConnectionManager.
- *
- * @author <a href="mailto:jesper.pedersen at jboss.org">Jesper Pedersen</a>
+ *
+ * @author <a href="mailto:jesper.pedersen at jboss.org">Jesper Pedersen</a>
*/
public class CachedConnectionManager implements
UserTransactionStartedListener,
@@ -69,19 +66,19 @@
{
/** Log instance */
private static Logger log = Logger.getLogger(CachedConnectionManager.class);
-
+
/** Log trace */
private static boolean trace = log.isTraceEnabled();
-
+
/** Debugging flag */
private static boolean debug = false;
-
+
/** Enabled error handling for debugging */
private static boolean error = false;
-
+
/** Transaction Manager instance */
private final TransactionManager transactionManager;
-
+
/**
* ThreadLocal that holds current calling meta-programming aware
* object, used in case someone is idiotic enough to cache a
@@ -96,15 +93,15 @@
* map of meta-aware object to set of connections it holds, used by
* the idiot spec compliant behavior.
*/
- private final ConcurrentMap<KeyConnectionAssociation,
- ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>>
- objectToConnectionManagerMap = new ConcurrentHashMap<KeyConnectionAssociation,
+ private final ConcurrentMap<KeyConnectionAssociation,
+ ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>>
+ objectToConnectionManagerMap = new ConcurrentHashMap<KeyConnectionAssociation,
ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>>();
/**
* Connection stacktraces
*/
- private Map<Object, Throwable> connectionStackTraces = new WeakHashMap<Object, Throwable>();
+ private final Map<Object, Throwable> connectionStackTraces = new WeakHashMap<Object, Throwable>();
/**
* Creates a new instance.
@@ -114,7 +111,7 @@
{
this.transactionManager = transactionManager;
}
-
+
/**
* Gets transaction manager.
* @return transaction manager
@@ -123,7 +120,7 @@
{
return transactionManager;
}
-
+
/**
* {@inheritDoc}
*/
@@ -132,55 +129,55 @@
KeyConnectionAssociation key = peekMetaAwareObject();
if (trace)
{
- log.trace("user tx started, key: " + key);
+ log.trace("user tx started, key: " + key);
}
if (key == null)
{
- return; //not participating properly in this management scheme.
+ return; //not participating properly in this management scheme.
}
- ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
+ ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
key.getCMToConnectionsMap();
- Iterator<Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>> cmToConnectionsMapIterator =
+ Iterator<Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>> cmToConnectionsMapIterator =
cmToConnectionsMap.entrySet().iterator();
-
+
while (cmToConnectionsMapIterator.hasNext())
{
- Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> entry =
+ Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> entry =
cmToConnectionsMapIterator.next();
ConnectionCacheListener cm = entry.getKey();
CopyOnWriteArrayList<ConnectionRecord> conns = entry.getValue();
-
+
cm.transactionStarted(conns);
}
}
-
+
/**
- *
+ *
* @return stack last meta-aware object
*/
- KeyConnectionAssociation peekMetaAwareObject()
+ private KeyConnectionAssociation peekMetaAwareObject()
{
LinkedList<Object> stack = currentObjects.get();
if (stack == null)
{
- return null;
+ return null;
}
-
+
if (!stack.isEmpty())
{
- return (KeyConnectionAssociation) stack.getLast();
+ return (KeyConnectionAssociation) stack.getLast();
}
-
+
else
{
- return null;
+ return null;
}
}
-
-
+
+
/**
* {@inheritDoc}
*/
@@ -191,20 +188,20 @@
KeyConnectionAssociation oldKey = (KeyConnectionAssociation) stack.removeLast();
if (trace)
{
- log.trace("popped object: " + Strings.defaultToString(oldKey));
+ log.trace("popped object: " + Strings.defaultToString(oldKey));
}
if (!stack.contains(oldKey))
{
disconnect(oldKey, unsharableResources);
} // end of if ()
-
+
if (debug)
{
if (closeAll(oldKey.getCMToConnectionsMap()) && error)
{
throw new ResourceException("Some connections were not closed, " +
- "see the log for the allocation stacktraces");
+ "see the log for the allocation stacktraces");
}
}
}
@@ -216,7 +213,7 @@
* @param connection connection handle
* @param cri connection request info.
*/
- public void registerConnection(ConnectionCacheListener cm, ConnectionListener cl,
+ public void registerConnection(ConnectionCacheListener cm, ConnectionListener cl,
Object connection, ConnectionRequestInfo cri)
{
if (debug)
@@ -228,20 +225,20 @@
}
KeyConnectionAssociation key = peekMetaAwareObject();
-
+
if (trace)
{
log.trace("registering connection from connection manager " + cm +
- ", connection : " + connection + ", key: " + key);
+ ", connection : " + connection + ", key: " + key);
}
-
+
if (key == null)
{
- return; //not participating properly in this management scheme.
+ return; //not participating properly in this management scheme.
}
ConnectionRecord cr = new ConnectionRecord(cl, connection, cri);
- ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
+ ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
key.getCMToConnectionsMap();
CopyOnWriteArrayList<ConnectionRecord> conns = cmToConnectionsMap.get(cm);
@@ -250,7 +247,7 @@
conns = new CopyOnWriteArrayList<ConnectionRecord>();
cmToConnectionsMap.put(cm, conns);
}
-
+
conns.add(cr);
}
@@ -266,9 +263,9 @@
CloseConnectionSynchronization cas = getCloseConnectionSynchronization(false);
if (cas != null)
{
- cas.remove(connection);
+ cas.remove(connection);
}
-
+
synchronized (connectionStackTraces)
{
connectionStackTraces.remove(connection);
@@ -276,39 +273,41 @@
}
KeyConnectionAssociation key = peekMetaAwareObject();
-
+
if (trace)
{
log.trace("unregistering connection from connection manager " + cm +
- ", object: " + connection + ", key: " + key);
+ ", object: " + connection + ", key: " + key);
}
-
+
if (key == null)
{
- return; //not participating properly in this management scheme.
+ return; //not participating properly in this management scheme.
}
- ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
+ ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
key.getCMToConnectionsMap();
CopyOnWriteArrayList<ConnectionRecord> conns = cmToConnectionsMap.get(cm);
if (conns == null)
{
- return; // Can happen if connections are "passed" between contexts
+ return; // Can happen if connections are "passed" between contexts
}
-
- for (Iterator<ConnectionRecord> i = conns.iterator(); i.hasNext();)
+
+ //note iterator of CopyOnWriteArrayList does not support remove method
+ //we use here remove on CopyOnWriteArrayList directly
+ for (ConnectionRecord connectionRecord : conns)
{
- if ((i.next()).getConnection() == connection)
+ if (connectionRecord.getConnection() == connection)
{
- i.remove();
+ conns.remove(connectionRecord);
return;
}
}
-
+
throw new IllegalStateException("Trying to return an unknown connection2! " + connection);
}
-
+
/**
* {@inheritDoc}
*/
@@ -320,29 +319,29 @@
{
if (trace)
{
- log.trace("new stack for key: " + Strings.defaultToString(rawKey));
+ log.trace("new stack for key: " + Strings.defaultToString(rawKey));
}
-
- stack = new LinkedList<Object>();
- currentObjects.set(stack);
+
+ stack = new LinkedList<Object>();
+ currentObjects.set(stack);
}
else
{
if (trace)
{
- log.trace("old stack for key: " + Strings.defaultToString(rawKey));
+ log.trace("old stack for key: " + Strings.defaultToString(rawKey));
}
}
-
+
KeyConnectionAssociation key = new KeyConnectionAssociation(rawKey);
if (!stack.contains(key))
{
reconnect(key, unsharableResources);
}
-
- stack.addLast(key);
+
+ stack.addLast(key);
}
-
+
/**
* The <code>reconnect</code> method gets the cmToConnectionsMap
* from objectToConnectionManagerMap, copies it to the key, and
@@ -355,28 +354,28 @@
@SuppressWarnings("unchecked")
private void reconnect(KeyConnectionAssociation key, Set unsharableResources) throws ResourceException
{
- ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
+ ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
objectToConnectionManagerMap.get(key);
-
+
if (cmToConnectionsMap == null)
- return;
+ return;
key.setCMToConnectionsMap(cmToConnectionsMap);
- Iterator<Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>> cmToConnectionsMapIterator =
+ Iterator<Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>> cmToConnectionsMapIterator =
cmToConnectionsMap.entrySet().iterator();
-
+
while (cmToConnectionsMapIterator.hasNext())
{
- Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> entry =
+ Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> entry =
cmToConnectionsMapIterator.next();
ConnectionCacheListener cm = entry.getKey();
CopyOnWriteArrayList<ConnectionRecord> conns = entry.getValue();
-
+
cm.reconnect(conns, unsharableResources);
}
}
-
+
/**
* Disconnect connections.
* @param key key
@@ -393,62 +392,62 @@
{
objectToConnectionManagerMap.put(key, cmToConnectionsMap);
- Iterator<Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>> cmToConnectionsMapIterator =
+ Iterator<Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>> cmToConnectionsMapIterator =
cmToConnectionsMap.entrySet().iterator();
-
+
while (cmToConnectionsMapIterator.hasNext())
{
- Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> entry =
+ Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> entry =
cmToConnectionsMapIterator.next();
ConnectionCacheListener cm = entry.getKey();
CopyOnWriteArrayList<ConnectionRecord> conns = entry.getValue();
-
+
cm.disconnect(conns, unsharableResources);
}
}
}
-
+
/**
* Describe <code>unregisterConnectionCacheListener</code> method here.
* This is a shutdown method called by a connection manager. It will remove all reference
* to that connection manager from the cache, so cached connections from that manager
* will never be recoverable.
* Possibly this method should not exist.
- *
+ *
* @param cm a <code>ConnectionCacheListener</code> value
- */
+ */
public void unregisterConnectionCacheListener(ConnectionCacheListener cm)
{
if (trace)
{
- log.trace("unregisterConnectionCacheListener: " + cm);
+ log.trace("unregisterConnectionCacheListener: " + cm);
}
-
- Iterator<ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>> it =
+
+ Iterator<ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>> it =
objectToConnectionManagerMap.values().iterator();
-
+
while (it.hasNext())
{
ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap = it.next();
if (cmToConnectionsMap != null)
- cmToConnectionsMap.remove(cm);
+ cmToConnectionsMap.remove(cm);
}
}
-
-
+
+
/**
* Close all connections.
* @param cmToConnectionsMap connection manager to connections
* @return true if close
*/
- private boolean closeAll(ConcurrentMap<ConnectionCacheListener,
+ private boolean closeAll(ConcurrentMap<ConnectionCacheListener,
CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap)
{
if (!debug)
{
- return false;
+ return false;
}
boolean unclosed = false;
@@ -470,15 +469,15 @@
}
else
{
- cas.add(c);
+ cas.add(c);
}
}
}
}
-
+
return unclosed;
}
-
+
/**
* Gets close sync. instance.
* @param createIfNotFound create if not found
@@ -491,23 +490,23 @@
Transaction tx = null;
if (transactionManager != null)
{
- tx = transactionManager.getTransaction();
+ tx = transactionManager.getTransaction();
}
-
+
if (tx != null)
{
TransactionSynchronizer.lock(tx);
try
{
- CloseConnectionSynchronization cas = (CloseConnectionSynchronization)
+ CloseConnectionSynchronization cas = (CloseConnectionSynchronization)
TransactionSynchronizer.getCCMSynchronization(tx);
-
+
if (cas == null && createIfNotFound && TxUtils.isActive(tx))
{
cas = new CloseConnectionSynchronization();
TransactionSynchronizer.registerCCMSynchronization(tx, cas);
}
-
+
return cas;
}
finally
@@ -520,11 +519,11 @@
{
log.debug("Unable to synchronize with transaction", t);
}
-
+
return null;
}
-
-
+
+
/**
* Close connection handle.
* @param connectionHandle connection handle
@@ -534,25 +533,25 @@
try
{
Throwable exception;
-
+
synchronized (connectionStackTraces)
{
exception = connectionStackTraces.remove(connectionHandle);
}
-
+
Method m = connectionHandle.getClass().getMethod("close", new Class[]{});
-
+
try
{
if (exception != null)
{
- log.info("Closing a connection for you. Please close them yourself: " + connectionHandle, exception);
+ log.info("Closing a connection for you. Please close them yourself: " + connectionHandle, exception);
}
else
{
- log.info("Closing a connection for you. Please close them yourself: " + connectionHandle);
+ log.info("Closing a connection for you. Please close them yourself: " + connectionHandle);
}
-
+
m.invoke(connectionHandle, new Object[]{});
}
catch (Throwable t)
@@ -565,16 +564,16 @@
log.info("Could not find a close method on alleged connection objects. Please close your own connections.");
}
}
-
-
+
+
/**
- * Close synch. class.
+ * Close synch. class.
*/
private class CloseConnectionSynchronization implements Synchronization
{
/**Connection handles*/
CopyOnWriteArraySet<Object> connections = new CopyOnWriteArraySet<Object>();
-
+
/**Closing flag*/
AtomicBoolean closing = new AtomicBoolean(false);
@@ -583,7 +582,7 @@
*/
public CloseConnectionSynchronization()
{
-
+
}
/**
@@ -594,7 +593,7 @@
{
if (closing.get())
{
- return;
+ return;
}
connections.add(c);
}
@@ -607,9 +606,9 @@
{
if (closing.get())
{
- return;
+ return;
}
-
+
connections.remove(c);
}
@@ -627,14 +626,26 @@
public void afterCompletion(int status)
{
closing.set(true);
-
+
for (Iterator<Object> i = connections.iterator(); i.hasNext();)
{
- closeConnection(i.next());
+ closeConnection(i.next());
}
-
+
connections.clear();
}
}
-
+
+ /**
+ * Get the currentObjects.
+ * This method is package protected beacause it is intended only for test case use.
+ * Please don't use it in your production code.
+ *
+ * @return the currentObjects.
+ */
+ final ThreadLocal<LinkedList<Object>> getCurrentObjects()
+ {
+ return currentObjects;
+ }
+
}
Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/listener/TxConnectionListener.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/listener/TxConnectionListener.java 2011-01-24 14:32:08 UTC (rev 110436)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/listener/TxConnectionListener.java 2011-01-24 15:11:31 UTC (rev 110437)
@@ -47,20 +47,20 @@
/**
* Tx connection listener.
- * @author <a href="mailto:gurkanerdogdu at yahoo.com">Gurkan Erdogdu</a>
+ * @author <a href="mailto:gurkanerdogdu at yahoo.com">Gurkan Erdogdu</a>
* @version $Rev$
*/
public class TxConnectionListener extends AbstractConnectionListener
{
-
+
/**Transaction synch. instance*/
private TransactionSynchronization transactionSynchronization;
-
+
/**XAResource instance*/
private final XAResource xaResource;
/** Whether there is a local transaction */
- private AtomicBoolean localTransaction = new AtomicBoolean(false);
+ private final AtomicBoolean localTransaction = new AtomicBoolean(false);
/**
* Creates a new tx listener.
@@ -71,33 +71,34 @@
* @param xaResource xaresource instance
* @throws ResourceException if aexception while creating
*/
- public TxConnectionListener(final ConnectionManager cm, final ManagedConnection mc,
+ public TxConnectionListener(final ConnectionManager cm, final ManagedConnection mc,
final Pool pool, final Object context, final XAResource xaResource)
throws ResourceException
{
super(cm, mc, pool, context);
this.xaResource = xaResource;
-
+
if (xaResource instanceof LocalXAResource)
{
- ((LocalXAResource) xaResource).setConnectionListener(this);
+ ((LocalXAResource) xaResource).setConnectionListener(this);
}
- }
-
+ }
+
/**
* {@inheritDoc}
*/
+ @Override
public void enlist() throws SystemException
{
// This method is a bit convulted, but it has to be such because
// there is a race condition in the transaction manager where it
- // unlocks during the enlist of the XAResource. It does this
+ // unlocks during the enlist of the XAResource. It does this
// to avoid distributed deadlocks and to ensure the transaction
// timeout can fail a badly behaving resource during the enlist.
//
- // When two threads in the same transaction are trying to enlist
- // connections they could be from the same resource manager
+ // When two threads in the same transaction are trying to enlist
+ // connections they could be from the same resource manager
// or even the same connection when tracking the connection by transaction.
//
// For the same connection, we only want to do the real enlist once.
@@ -123,7 +124,7 @@
// an earlier thread while it enlists some later thread's resource.
// Since they are all a part of the same transaction, this is probably
// not a real issue.
-
+
// No transaction associated with the thread
TransactionManager tm = getConnectionManager().getTransactionManager();
int status = tm.getStatus();
@@ -134,19 +135,19 @@
String error = "Attempt to use connection outside a transaction when already a tx!";
if (trace)
{
- getLog().trace(error + " " + this);
+ getLog().trace(error + " " + this);
}
-
+
throw new IllegalStateException(error);
}
if (trace)
{
- getLog().trace("No transaction, no need to enlist: " + this);
+ getLog().trace("No transaction, no need to enlist: " + this);
}
-
+
return;
}
-
+
// Inactive transaction
Transaction threadTx = tm.getTransaction();
if (threadTx == null || status != Status.STATUS_ACTIVE)
@@ -154,21 +155,21 @@
String error = "Transaction " + threadTx + " is not active " + TxUtils.getStatusAsString(status);
if (trace)
{
- getLog().trace(error + " cl=" + this);
+ getLog().trace(error + " cl=" + this);
}
-
+
throw new IllegalStateException(error);
}
if (trace)
{
- getLog().trace("Pre-enlist: " + this + " threadTx=" + threadTx);
+ getLog().trace("Pre-enlist: " + this + " threadTx=" + threadTx);
}
-
- // Our synchronization
+
+ // Our synchronization
TransactionSynchronization ourSynchronization = null;
- // Serializes enlistment when two different threads are enlisting
+ // Serializes enlistment when two different threads are enlisting
// different connections in the same transaction concurrently
TransactionSynchronizer synchronizer = null;
@@ -182,18 +183,18 @@
String error = "Can't enlist - already a tx!";
if (trace)
{
- getLog().trace(error + " " + this);
+ getLog().trace(error + " " + this);
}
throw new IllegalStateException(error);
}
-
+
// Check for different transaction
if (transactionSynchronization != null && !transactionSynchronization.currentTx.equals(threadTx))
{
String error = "Trying to change transaction " + threadTx + " in enlist!";
if (trace)
{
- getLog().trace(error + " " + this);
+ getLog().trace(error + " " + this);
}
throw new IllegalStateException(error);
}
@@ -203,9 +204,9 @@
{
if (this.trace)
{
- getLog().trace("Get synchronizer " + this + " threadTx=" + threadTx);
+ getLog().trace("Get synchronizer " + this + " threadTx=" + threadTx);
}
-
+
synchronizer = TransactionSynchronizer.getRegisteredSynchronizer(threadTx);
}
catch (Throwable t)
@@ -221,7 +222,7 @@
synchronizer.addUnenlisted(synchronization);
transactionSynchronization = synchronization;
}
-
+
ourSynchronization = transactionSynchronization;
}
finally
@@ -241,7 +242,7 @@
TransactionSynchronization sync = (TransactionSynchronization) unenlisted.get(i);
if (sync.enlist())
{
- synchronizer.addEnlisted(sync);
+ synchronizer.addEnlisted(sync);
}
}
}
@@ -250,19 +251,20 @@
synchronizer.enlisted();
}
}
-
+
// What was the result of our enlistment?
if (this.trace)
{
- getLog().trace("Check enlisted " + this + " threadTx=" + threadTx);
+ getLog().trace("Check enlisted " + this + " threadTx=" + threadTx);
}
-
+
ourSynchronization.checkEnlisted();
}
/**
* {@inheritDoc}
*/
+ @Override
public void delist() throws ResourceException
{
if (trace)
@@ -282,7 +284,7 @@
synchronizer.removeEnlisted(synchronization);
if (!tx.delistResource(getXAResource(), XAResource.TMSUSPEND))
{
- throw new ResourceException("Failure to delist resource: " + this);
+ throw new ResourceException("Failure to delist resource: " + this);
}
}
}
@@ -306,6 +308,7 @@
/**
* {@inheritDoc}
*/
+ @Override
public void connectionClosed(ConnectionEvent ce)
{
if (trace)
@@ -318,7 +321,7 @@
{
try
{
- this.getCachedConnectionManager().unregisterConnection(this.getConnectionManager(),
+ this.getCachedConnectionManager().unregisterConnection(this.getConnectionManager(),
ce.getConnectionHandle());
}
catch (Throwable t)
@@ -352,6 +355,7 @@
/**
* {@inheritDoc}
*/
+ @Override
public void localTransactionStarted(ConnectionEvent ce)
{
localTransaction.set(true);
@@ -360,6 +364,7 @@
/**
* {@inheritDoc}
*/
+ @Override
public void localTransactionCommitted(ConnectionEvent ce)
{
localTransaction.set(false);
@@ -368,6 +373,7 @@
/**
* {@inheritDoc}
*/
+ @Override
public void localTransactionRolledback(ConnectionEvent ce)
{
localTransaction.set(false);
@@ -376,6 +382,7 @@
/**
* {@inheritDoc}
*/
+ @Override
public void tidyup() throws ResourceException
{
// We have a hanging transaction
@@ -406,6 +413,7 @@
/**
* {@inheritDoc}
*/
+ @Override
public void connectionErrorOccurred(ConnectionEvent ce)
{
transactionSynchronization = null;
@@ -416,6 +424,7 @@
* {@inheritDoc}
*/
//Important method!!
+ @Override
public boolean isManagedConnectionFree()
{
if (isTrackByTx() && transactionSynchronization != null)
@@ -424,7 +433,7 @@
}
/**
- * This method changes the number of handles or
+ * This method changes the number of handles or
* the track-by-tx value depending on the parameter passed in
* @param handle The handle; if <code>null</code> track-by-tx is changed
* @return True if the managed connection was freed
@@ -453,36 +462,39 @@
// Set track-by-tx to false
setTrackByTx(false);
}
-
+
// Return if the managed connection was just freed
return isManagedConnectionFree();
}
-
-
+
/**
- * Transaction sync. class.
+ * Transaction sync. class.
+ * Please note this class has public access is for test purposes only.
+ * Except for test purposes it should be considered private!
+ * Don't use it outside enclosing class or testcase!
*/
- private class TransactionSynchronization implements Synchronization
+ public class TransactionSynchronization implements Synchronization
{
/**Error message*/
- private final Throwable failedToEnlist =
+ private final Throwable failedToEnlist =
new Throwable("Unabled to enlist resource, see the previous warnings.");
-
+
/** Transaction */
- private final Transaction currentTx;
-
+ protected final Transaction currentTx;
+
/** This is the status when we were registered */
private final boolean wasTrackByTx;
/** Whether we are enlisted */
private boolean enlisted;
-
+
/** Any error during enlistment */
private Throwable enlistError;
-
+
/**
- * Create a new TransactionSynchronization.
- *
+ * Create a new TransactionSynchronization.transaction
+ * @param tx transaction
+ *
* @param trackByTx whether this is track by connection
*/
public TransactionSynchronization(final Transaction tx, final boolean trackByTx)
@@ -492,10 +504,10 @@
this.enlisted = false;
this.enlistError = null;
}
-
+
/**
* Get the result of the enlistment.
- *
+ *
* @throws SystemExeption for any error
*/
public void checkEnlisted() throws SystemException
@@ -505,14 +517,14 @@
String error = "Error enlisting resource in transaction=" + this.currentTx;
if (TxConnectionListener.this.trace)
{
- TxConnectionListener.this.getLog().trace(error + " " + TxConnectionListener.this);
+ TxConnectionListener.this.getLog().trace(error + " " + TxConnectionListener.this);
}
// Wrap the error to give a reasonable stacktrace since the resource
// could have been enlisted by a different thread
if (enlistError == failedToEnlist)
{
- throw new SystemException(failedToEnlist + " tx=" + this.currentTx);
+ throw new SystemException(failedToEnlist + " tx=" + this.currentTx);
}
else
{
@@ -526,29 +538,29 @@
String error = "Resource is not enlisted in transaction=" + currentTx;
if (trace)
{
- getLog().trace(error + " " + TxConnectionListener.this);
+ getLog().trace(error + " " + TxConnectionListener.this);
}
throw new IllegalStateException("Resource was not enlisted.");
}
}
-
+
/**
* Enlist the resource
- *
+ *
* @return true when enlisted, false otherwise
*/
public boolean enlist()
{
if (TxConnectionListener.this.trace)
{
- TxConnectionListener.this.getLog().trace("Enlisting resource " + TxConnectionListener.this);
+ TxConnectionListener.this.getLog().trace("Enlisting resource " + TxConnectionListener.this);
}
try
{
XAResource resource = getXAResource();
if (!currentTx.enlistResource(resource))
{
- enlistError = failedToEnlist;
+ enlistError = failedToEnlist;
}
}
catch (Throwable t)
@@ -562,25 +574,25 @@
{
if (trace)
{
- getLog().trace("Failed to enlist resource " + TxConnectionListener.this, enlistError);
+ getLog().trace("Failed to enlist resource " + TxConnectionListener.this, enlistError);
}
-
+
setTrackByTx(false);
transactionSynchronization = null;
-
+
return false;
}
-
+
if (trace)
{
- getLog().trace("Enlisted resource " + TxConnectionListener.this);
+ getLog().trace("Enlisted resource " + TxConnectionListener.this);
}
-
+
enlisted = true;
return true;
}
}
-
+
/**
* {@inheritDoc}
*/
@@ -597,16 +609,16 @@
// The connection got destroyed during the transaction
if (getState().equals(ConnectionState.DESTROYED))
{
- return;
+ return;
}
-
+
// Are we still in the original transaction?
if (!this.equals(transactionSynchronization))
{
// If we are interleaving transactions we have nothing to do
if (!wasTrackByTx)
{
- return;
+ return;
}
else
{
@@ -630,14 +642,15 @@
if (wasFreed(null))
{
- getConnectionManager().returnManagedConnection(TxConnectionListener.this, false);
+ getConnectionManager().returnManagedConnection(TxConnectionListener.this, false);
}
}
}
-
+
/**
* {@inheritDoc}
*/
+ @Override
public String toString()
{
StringBuffer buffer = new StringBuffer();
@@ -649,14 +662,37 @@
return buffer.toString();
}
}
-
+
/**
* {@inheritDoc}
*/
// For debugging
+ @Override
protected void toString(StringBuffer buffer)
{
buffer.append(" xaResource=").append(xaResource);
buffer.append(" txSync=").append(transactionSynchronization);
}
+
+ /**
+ * Get the transactionSynchronization.
+ * Please note this package protected method is for test purposes only. Don't use it!
+ *
+ * @return the transactionSynchronization.
+ */
+ final TransactionSynchronization getTransactionSynchronization()
+ {
+ return transactionSynchronization;
+ }
+
+ /**
+ * Set the transactionSynchronization.
+ * Please note this package protected method is for test purposes only. Don't use it!
+ *
+ * @param transactionSynchronization The transactionSynchronization to set.
+ */
+ final void setTransactionSynchronization(TransactionSynchronization transactionSynchronization)
+ {
+ this.transactionSynchronization = transactionSynchronization;
+ }
}
Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/notx/NoTxConnectionManagerImpl.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/notx/NoTxConnectionManagerImpl.java 2011-01-24 14:32:08 UTC (rev 110436)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/notx/NoTxConnectionManagerImpl.java 2011-01-24 15:11:31 UTC (rev 110437)
@@ -29,6 +29,7 @@
import org.jboss.jca.core.connectionmanager.listener.NoTxConnectionListener;
import java.util.Collection;
+
import javax.resource.ResourceException;
import javax.resource.spi.ManagedConnection;
import javax.transaction.SystemException;
Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/AbstractPool.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/AbstractPool.java 2011-01-24 14:32:08 UTC (rev 110436)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/AbstractPool.java 2011-01-24 15:11:31 UTC (rev 110437)
@@ -63,13 +63,13 @@
/** Is trace enabled */
private boolean trace = false;
-
+
/** The subpools, maps key --> pool */
private final ConcurrentMap<Object, SubPoolContext> subPools = new ConcurrentHashMap<Object, SubPoolContext>();
/** The managed connection factory for this pool */
private final ManagedConnectionFactory mcf;
-
+
/** The connection listener factory for this pool*/
private ConnectionListenerFactory clf;
@@ -77,14 +77,14 @@
private final PoolConfiguration poolConfiguration;
/** Whether to use separate pools for transactional and non-transaction use */
- private boolean noTxSeparatePools;
+ private final boolean noTxSeparatePools;
/** The poolName */
private String poolName;
/**
* Create a new base pool.
- *
+ *
* @param mcf the managed connection factory
* @param pc the pool configuration
* @param noTxSeparatePools noTxSeparatePool
@@ -112,7 +112,7 @@
{
this.poolName = poolName;
}
-
+
/**
* Gets pool name.
* @return pool name
@@ -121,23 +121,23 @@
{
return poolName;
}
-
+
/**
* Retrieve the key for this request.
- *
- * @param subject the subject
+ *
+ * @param subject the subject
* @param cri the connection request information
* @param separateNoTx separateNoTx
* @return the key
* @throws ResourceException for any error
*/
- protected abstract Object getKey(Subject subject, ConnectionRequestInfo cri,
+ protected abstract Object getKey(Subject subject, ConnectionRequestInfo cri,
boolean separateNoTx) throws ResourceException;
/**
* Determine the correct pool for this request,
* creates a new one when necessary.
- *
+ *
* @param key the key to the pool
* @param subject the subject of the pool
* @param cri the connection request info
@@ -149,7 +149,7 @@
SubPoolContext subPoolContext = subPools.get(key);
if (subPoolContext == null)
{
- SubPoolContext newSubPoolContext = new SubPoolContext(getTransactionManager(), mcf, clf, subject,
+ SubPoolContext newSubPoolContext = new SubPoolContext(getTransactionManager(), mcf, clf, subject,
cri, poolConfiguration, this, log);
subPoolContext = subPools.putIfAbsent(key, newSubPoolContext);
if (subPoolContext == null)
@@ -163,22 +163,22 @@
/**
* Get any transaction manager associated with the pool.
- *
+ *
* @return the transaction manager
*/
protected TransactionManager getTransactionManager()
{
if (clf != null)
{
- return clf.getTransactionManager();
+ return clf.getTransactionManager();
}
else
{
- return null;
+ return null;
}
}
-
-
+
+
/**
* {@inheritDoc}
*/
@@ -219,74 +219,74 @@
/**
* {@inheritDoc}
- */
- public ConnectionListener getConnection(Transaction trackByTransaction, Subject subject, ConnectionRequestInfo cri)
+ */
+ public ConnectionListener getConnection(Transaction trackByTransaction, Subject subject, ConnectionRequestInfo cri)
throws ResourceException
{
ConnectionListener cl = null;
-
+
boolean separateNoTx = false;
-
+
if (noTxSeparatePools)
{
separateNoTx = clf.isTransactional();
}
-
+
//Get specific sub-pool key
Object key = getKey(subject, cri, separateNoTx);
-
+
//Find sub-pool related with key
SubPoolContext subPoolContext = getSubPool(key, subject, cri);
-
+
//Sub-pool internal managed connection pool
ManagedConnectionPool imcp = subPoolContext.getSubPool();
// Are we doing track by transaction?
TransactionLocal trackByTx = subPoolContext.getTrackByTx();
-
+
if (trackByTransaction == null || trackByTx == null)
{
cl = getSimpleConnection(subject, cri, subPoolContext);
- } //end of if trackByTransaction
-
+ } //end of if trackByTransaction
+
//Transaction old connections
if (cl == null)
{
cl = getTransactionOldConnection(trackByTx, trackByTransaction);
}
-
+
if (cl == null)
{
//Creats a new connection with given transaction
cl = getTransactionNewConnection(trackByTx, trackByTransaction, imcp, subject, cri);
}
-
+
return cl;
}
-
+
/**
* Gets simple connection listener that wraps connection.
* @param subject subject instance
* @param cri connection request info
* @param separateNoTx seperate pool for tx
* @return connection listener
- * @throws ResourceException
+ * @throws ResourceException ResourceException
*/
- private ConnectionListener getSimpleConnection(final Subject subject, final ConnectionRequestInfo cri,
+ private ConnectionListener getSimpleConnection(final Subject subject, final ConnectionRequestInfo cri,
final SubPoolContext subPoolContext)
throws ResourceException
{
ConnectionListener cl = null;
ManagedConnectionPool imcp = null;
-
+
try
- {
+ {
//Find internal managed pool
imcp = subPoolContext.getSubPool();
-
+
//Get connection from imcp
cl = imcp.getConnection(subject, cri);
-
+
if (trace)
{
dump("Got connection from pool : " + cl);
@@ -300,19 +300,19 @@
if (re instanceof RetryableException)
{
if (log.isDebugEnabled())
- log.debug("Got a RetryableException - trying to reinitialize the pool");
+ log.debug("Got a RetryableException - trying to reinitialize the pool");
// The IMCP is down - retry
imcp = subPoolContext.getSubPool();
// Make sure that IMCP is running
if (!imcp.isRunning())
- imcp.reenable();
-
+ imcp.reenable();
+
//Getting connection from pool
cl = imcp.getConnection(subject, cri);
if (trace)
- dump("Got connection from pool (retried) " + cl);
+ dump("Got connection from pool (retried) " + cl);
return cl;
}
@@ -321,21 +321,23 @@
throw re;
}
}
-
+
}
-
+
/**
* Gets connection listener instance associated with transaction.
+ * This method is package protected beacause it is intended only for test case use.
+ * Please don't use it in your production code.
* @param trackByTx trnasaction local
* @param trackByTransaction transaction instance
* @return connection listener instance
* @throws ResourceException
*/
- private ConnectionListener getTransactionOldConnection(TransactionLocal trackByTx, Transaction trackByTransaction)
+ ConnectionListener getTransactionOldConnection(TransactionLocal trackByTx, Transaction trackByTransaction)
throws ResourceException
{
ConnectionListener cl = null;
-
+
// Track by transaction
try
{
@@ -343,7 +345,7 @@
}
catch (Throwable t)
{
- JBossResourceException.rethrowAsResourceException("Unable to get connection from the pool for tx="
+ JBossResourceException.rethrowAsResourceException("Unable to get connection from the pool for tx="
+ trackByTransaction, t);
}
try
@@ -354,9 +356,9 @@
{
if (trace)
{
- dump("Previous connection tracked by transaction " + cl + " tx=" + trackByTransaction);
+ dump("Previous connection tracked by transaction " + cl + " tx=" + trackByTransaction);
}
-
+
return cl;
}
}
@@ -364,26 +366,28 @@
{
trackByTx.unlock(trackByTransaction);
}
-
+
return cl;
}
/**
* Gets new connection listener if necessary instance with transaction.
+ * This method is package protected beacause it is intended only for test case use.
+ * Please don't use it in your production code.
* @param trackByTx trnasaction local
* @param trackByTransaction transaction instance
* @param mcp pool instance
* @param subject subject instance
* @param cri connection request info
* @return connection listener instance
- * @throws ResourceException
+ * @throws ResourceException ResourceException
*/
- private ConnectionListener getTransactionNewConnection(TransactionLocal trackByTx, Transaction trackByTransaction,
+ ConnectionListener getTransactionNewConnection(TransactionLocal trackByTx, Transaction trackByTransaction,
ManagedConnectionPool mcp, Subject subject, ConnectionRequestInfo cri)
throws ResourceException
{
ConnectionListener cl = null;
-
+
// Need a new one for this transaction
// This must be done outside the tx local lock, otherwise
// the tx timeout won't work and get connection can do a lot of other work
@@ -393,9 +397,9 @@
cl = mcp.getConnection(subject, cri);
if (trace)
{
- dump("Got connection from pool tracked by transaction " + cl + " tx=" + trackByTransaction);
+ dump("Got connection from pool tracked by transaction " + cl + " tx=" + trackByTransaction);
}
-
+
// Relock and check/set status
try
{
@@ -406,11 +410,11 @@
mcp.returnConnection(cl, false);
if (trace)
{
- dump("Had to return connection tracked by transaction " + cl + " tx=" +
- trackByTransaction + " error=" + t.getMessage());
+ dump("Had to return connection tracked by transaction " + cl + " tx=" +
+ trackByTransaction + " error=" + t.getMessage());
}
-
- JBossResourceException.rethrowAsResourceException("Unable to get connection from the pool for tx="
+
+ JBossResourceException.rethrowAsResourceException("Unable to get connection from the pool for tx="
+ trackByTransaction, t);
}
try
@@ -422,28 +426,28 @@
mcp.returnConnection(cl, false);
if (trace)
{
- dump("Another thread already got a connection tracked by transaction " +
- other + " tx=" + trackByTransaction);
+ dump("Another thread already got a connection tracked by transaction " +
+ other + " tx=" + trackByTransaction);
}
-
+
cl = other;
}
-
+
// This is the connection for this transaction
cl.setTrackByTx(true);
trackByTx.set(cl);
-
+
if (trace)
{
- dump("Using connection from pool tracked by transaction " + cl + " tx=" + trackByTransaction);
+ dump("Using connection from pool tracked by transaction " + cl + " tx=" + trackByTransaction);
}
-
+
}
finally
{
trackByTx.unlock(trackByTransaction);
}
-
+
return cl;
}
@@ -457,27 +461,27 @@
/**
* {@inheritDoc}
- */
+ */
public void returnConnection(ConnectionListener cl, boolean kill) throws ResourceException
{
cl.setTrackByTx(false);
//Get connection listener pool
ManagedConnectionPool mcp = (ManagedConnectionPool) cl.getContext();
-
+
//Return connection to the pool
mcp.returnConnection(cl, kill);
-
+
if (trace)
{
dump("Returning connection to pool " + cl);
- }
+ }
}
/**
* {@inheritDoc}
- */
+ */
public void setConnectionListenerFactory(ConnectionListenerFactory clf)
- {
+ {
this.clf = clf;
}
@@ -486,17 +490,9 @@
*/
public void shutdown()
{
- Iterator<SubPoolContext> itSubPoolContexts = subPools.values().iterator();
- SubPoolContext subPoolContext = null;
- while (itSubPoolContexts.hasNext())
- {
- subPoolContext = itSubPoolContexts.next();
- subPoolContext.getSubPool().shutdown();
- }
+ flush();
+ }
- subPools.clear();
- }
-
/**
* Dump the stats to the trace log
* @param info some context
@@ -517,4 +513,15 @@
log.trace(toLog);
}
}
+
+ /**
+ * Get the subPools. This method is package protected beacause it is intended only for test case use.
+ * Please don't use it in your production code.
+ *
+ * @return the subPools.
+ */
+ final ConcurrentMap<Object, SubPoolContext> getSubPools()
+ {
+ return subPools;
+ }
}
Added: projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/ccm/CachedConnectionManagerTestCase.java
===================================================================
--- projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/ccm/CachedConnectionManagerTestCase.java (rev 0)
+++ projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/ccm/CachedConnectionManagerTestCase.java 2011-01-24 15:11:31 UTC (rev 110437)
@@ -0,0 +1,511 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.jca.core.connectionmanager.ccm;
+
+import org.jboss.jca.core.connectionmanager.ConnectionRecord;
+import org.jboss.jca.core.connectionmanager.listener.ConnectionCacheListener;
+import org.jboss.jca.core.connectionmanager.listener.ConnectionListener;
+
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import javax.resource.spi.ConnectionRequestInfo;
+import javax.transaction.TransactionManager;
+
+import org.junit.Test;
+
+import static org.hamcrest.core.Is.is;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+/**
+ *
+ * A CachedConnectionManagerTestCase.
+ *
+ * @author <a href="stefano.maestri at jboss.com">Stefano Maestri</a>
+ *
+ */
+public class CachedConnectionManagerTestCase
+{
+
+ /**
+ *
+ * userTransactionStartedShoudStartTransactionOnEveryConnectionCacheListener
+ *
+ * @throws Exception in case of error
+ */
+ @Test
+ public void userTransactionStartedShoudStartTransactionOnEveryConnectionCacheListener() throws Exception
+ {
+ //given
+ TransactionManager tm = mock(TransactionManager.class);
+ CachedConnectionManager ccm = new CachedConnectionManager(tm);
+ ConnectionCacheListener cm0 = mock(ConnectionCacheListener.class);
+ ConnectionCacheListener cm1 = mock(ConnectionCacheListener.class);
+ ConnectionRecord cr0 = mock(ConnectionRecord.class);
+ ConnectionRecord cr1 = mock(ConnectionRecord.class);
+ ConnectionRecord cr2 = mock(ConnectionRecord.class);
+ ConnectionRecord cr3 = mock(ConnectionRecord.class);
+ CopyOnWriteArrayList<ConnectionRecord> crList0 = new CopyOnWriteArrayList<ConnectionRecord>(Arrays.asList(cr0,
+ cr1));
+ CopyOnWriteArrayList<ConnectionRecord> crList1 = new CopyOnWriteArrayList<ConnectionRecord>(Arrays.asList(cr2,
+ cr3));
+ ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
+ new ConcurrentHashMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>(2);
+ cmToConnectionsMap.put(cm0, crList0);
+ cmToConnectionsMap.put(cm1, crList1);
+
+ LinkedList<Object> keys = new LinkedList<Object>();
+ KeyConnectionAssociation key0 = new KeyConnectionAssociation("stringKey0");
+ key0.setCMToConnectionsMap(cmToConnectionsMap);
+ keys.add(key0);
+
+ //when
+ ccm.getCurrentObjects().set(keys);
+ //then
+ ccm.userTransactionStarted();
+
+ verify(cm0, times(1)).transactionStarted(eq(crList0));
+ verify(cm1, times(1)).transactionStarted(eq(crList1));
+
+ }
+
+ /**
+ *
+ * userTransactionStartedShoudDoNothingForCurrentObjectsNull
+ *
+ * @throws Exception in case of error
+ */
+ @Test
+ public void userTransactionStartedShoudDoNothingForCurrentObjectsNull() throws Exception
+ {
+ //given
+ TransactionManager tm = mock(TransactionManager.class);
+ CachedConnectionManager ccm = new CachedConnectionManager(tm);
+
+ ccm.getCurrentObjects().set(null);
+ //then
+ ccm.userTransactionStarted();
+ }
+
+ /**
+ *
+ * popMetaAwareObjectShoudRemoveAssociationAndDisconnectFromListener
+ *
+ * @throws Exception in case of error
+ */
+ @Test
+ public void popMetaAwareObjectShoudRemoveAssociationAndDisconnectFromListener() throws Exception
+ {
+ //given
+ TransactionManager tm = mock(TransactionManager.class);
+ CachedConnectionManager ccm = new CachedConnectionManager(tm);
+ ConnectionCacheListener cm0 = mock(ConnectionCacheListener.class);
+ ConnectionCacheListener cm1 = mock(ConnectionCacheListener.class);
+ ConnectionRecord cr0 = mock(ConnectionRecord.class);
+ ConnectionRecord cr1 = mock(ConnectionRecord.class);
+ ConnectionRecord cr2 = mock(ConnectionRecord.class);
+ ConnectionRecord cr3 = mock(ConnectionRecord.class);
+ CopyOnWriteArrayList<ConnectionRecord> crList0 = new CopyOnWriteArrayList<ConnectionRecord>(Arrays.asList(cr0,
+ cr1));
+ CopyOnWriteArrayList<ConnectionRecord> crList1 = new CopyOnWriteArrayList<ConnectionRecord>(Arrays.asList(cr2,
+ cr3));
+ ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
+ new ConcurrentHashMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>(2);
+ cmToConnectionsMap.put(cm0, crList0);
+ cmToConnectionsMap.put(cm1, crList1);
+
+ LinkedList<Object> keys = new LinkedList<Object>();
+ KeyConnectionAssociation key0 = new KeyConnectionAssociation("stringKey0");
+ key0.setCMToConnectionsMap(cmToConnectionsMap);
+ keys.add(key0);
+
+ ccm.getCurrentObjects().set(keys);
+ //when
+ Set unsharableResources = mock(Set.class);
+ //then
+ ccm.popMetaAwareObject(unsharableResources);
+
+ verify(cm0, times(1)).disconnect(eq(crList0), eq(unsharableResources));
+ verify(cm1, times(1)).disconnect(eq(crList1), eq(unsharableResources));
+ assertThat(ccm.getCurrentObjects().get().size(), is(0));
+
+ }
+
+ /**
+ *
+ * registerConnectionShoudDoNothingForCurrentObjectsNull
+ *
+ * @throws Exception in case of error
+ */
+ @Test
+ public void registerConnectionShoudDoNothingForCurrentObjectsNull() throws Exception
+ {
+ //given
+ TransactionManager tm = mock(TransactionManager.class);
+ CachedConnectionManager ccm = new CachedConnectionManager(tm);
+
+ ccm.getCurrentObjects().set(null);
+ //then (parameters are not important the key of this test is that given ccm have no associations
+ ccm.registerConnection(null, null, null, null);
+ }
+
+ /**
+ *
+ * registerConnectionShoudAddConnectionRecordToExistingKey
+ *
+ * @throws Exception in case of error
+ */
+ @Test
+ public void registerConnectionShoudAddConnectionRecordToExistingKey() throws Exception
+ {
+ //given
+ TransactionManager tm = mock(TransactionManager.class);
+ CachedConnectionManager ccm = new CachedConnectionManager(tm);
+ ConnectionCacheListener cm0 = mock(ConnectionCacheListener.class);
+ ConnectionCacheListener cm1 = mock(ConnectionCacheListener.class);
+ ConnectionRecord cr0 = mock(ConnectionRecord.class);
+ ConnectionRecord cr1 = mock(ConnectionRecord.class);
+ ConnectionRecord cr2 = mock(ConnectionRecord.class);
+ ConnectionRecord cr3 = mock(ConnectionRecord.class);
+ CopyOnWriteArrayList<ConnectionRecord> crList0 = new CopyOnWriteArrayList<ConnectionRecord>(Arrays.asList(cr0,
+ cr1));
+ CopyOnWriteArrayList<ConnectionRecord> crList1 = new CopyOnWriteArrayList<ConnectionRecord>(Arrays.asList(cr2,
+ cr3));
+ ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
+ new ConcurrentHashMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>(2);
+ cmToConnectionsMap.put(cm0, crList0);
+ cmToConnectionsMap.put(cm1, crList1);
+
+ LinkedList<Object> keys = new LinkedList<Object>();
+ KeyConnectionAssociation key0 = new KeyConnectionAssociation("stringKey0");
+ key0.setCMToConnectionsMap(cmToConnectionsMap);
+ keys.add(key0);
+
+ ccm.getCurrentObjects().set(keys);
+ //when
+ ccm.registerConnection(cm0, mock(ConnectionListener.class), mock(Object.class),
+ mock(ConnectionRequestInfo.class));
+
+ //then
+
+ ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> actualCmMap =
+ ((KeyConnectionAssociation) keys.getLast()).getCMToConnectionsMap();
+ assertThat(actualCmMap.get(cm0).size(), is(3));
+ assertThat(actualCmMap.get(cm1).size(), is(2));
+
+ }
+
+ /**
+ *
+ * registerConnectionShoudAddConnectionRecordToExistingKey
+ *
+ * @throws Exception in case of error
+ */
+ @Test
+ public void registerConnectionShoudAddKey() throws Exception
+ {
+ //given
+ TransactionManager tm = mock(TransactionManager.class);
+ CachedConnectionManager ccm = new CachedConnectionManager(tm);
+ ConnectionCacheListener cm0 = mock(ConnectionCacheListener.class);
+ ConnectionCacheListener cm1 = mock(ConnectionCacheListener.class);
+ ConnectionCacheListener cm2 = mock(ConnectionCacheListener.class);
+
+ ConnectionRecord cr0 = mock(ConnectionRecord.class);
+ ConnectionRecord cr1 = mock(ConnectionRecord.class);
+ ConnectionRecord cr2 = mock(ConnectionRecord.class);
+ ConnectionRecord cr3 = mock(ConnectionRecord.class);
+ CopyOnWriteArrayList<ConnectionRecord> crList0 = new CopyOnWriteArrayList<ConnectionRecord>(Arrays.asList(cr0,
+ cr1));
+ CopyOnWriteArrayList<ConnectionRecord> crList1 = new CopyOnWriteArrayList<ConnectionRecord>(Arrays.asList(cr2,
+ cr3));
+ ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
+ new ConcurrentHashMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>(2);
+ cmToConnectionsMap.put(cm0, crList0);
+ cmToConnectionsMap.put(cm1, crList1);
+
+ LinkedList<Object> keys = new LinkedList<Object>();
+ KeyConnectionAssociation key0 = new KeyConnectionAssociation("stringKey0");
+ key0.setCMToConnectionsMap(cmToConnectionsMap);
+ keys.add(key0);
+
+ ccm.getCurrentObjects().set(keys);
+ //when
+ ccm.registerConnection(cm2, mock(ConnectionListener.class), mock(Object.class),
+ mock(ConnectionRequestInfo.class));
+
+ //then
+
+ ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> actualCmMap =
+ ((KeyConnectionAssociation) keys.getLast()).getCMToConnectionsMap();
+ assertThat(actualCmMap.size(), is(3));
+ assertThat(actualCmMap.get(cm0).size(), is(2));
+ assertThat(actualCmMap.get(cm1).size(), is(2));
+ assertThat(actualCmMap.get(cm2).size(), is(1));
+
+ }
+
+ /**
+ *
+ * unregisterConnectionShoudDoNothingForCurrentObjectsNull
+ *
+ * @throws Exception in case of error
+ */
+ @Test
+ public void unregisterConnectionShoudDoNothingForCurrentObjectsNull() throws Exception
+ {
+ //given
+ TransactionManager tm = mock(TransactionManager.class);
+ CachedConnectionManager ccm = new CachedConnectionManager(tm);
+
+ ccm.getCurrentObjects().set(null);
+ //then (parameters are not important the key of this test is that given ccm have no associations
+ ccm.unregisterConnection(null, null);
+ }
+
+ /**
+ *
+ * unregisterConnectionShoudDoNothingForNullConnectionsInMatchedKey
+ *
+ * @throws Exception in case of error
+ */
+ @Test
+ public void unregisterConnectionShoudDoNothingForNullConnectionsInMatchedKey() throws Exception
+ {
+ //given
+ TransactionManager tm = mock(TransactionManager.class);
+ CachedConnectionManager ccm = new CachedConnectionManager(tm);
+ ConnectionCacheListener cm0 = mock(ConnectionCacheListener.class);
+ ConnectionCacheListener cm1 = mock(ConnectionCacheListener.class);
+ ConnectionRecord cr0 = mock(ConnectionRecord.class);
+ Object connection = mock(Object.class);
+ when(cr0.getConnection()).thenReturn(connection);
+ ConnectionRecord cr1 = mock(ConnectionRecord.class);
+ ConnectionRecord cr2 = mock(ConnectionRecord.class);
+ ConnectionRecord cr3 = mock(ConnectionRecord.class);
+
+ CopyOnWriteArrayList<ConnectionRecord> crList1 = new CopyOnWriteArrayList<ConnectionRecord>(Arrays.asList(cr2,
+ cr3));
+ ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
+ new ConcurrentHashMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>(2);
+ cmToConnectionsMap.put(cm1, crList1);
+
+ LinkedList<Object> keys = new LinkedList<Object>();
+ KeyConnectionAssociation key0 = new KeyConnectionAssociation("stringKey0");
+ key0.setCMToConnectionsMap(cmToConnectionsMap);
+ keys.add(key0);
+
+ ccm.getCurrentObjects().set(keys);
+ //when
+ ccm.unregisterConnection(cm0, connection);
+
+ //then
+
+ ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> actualCmMap =
+ ((KeyConnectionAssociation) keys.getLast()).getCMToConnectionsMap();
+ assertThat(actualCmMap.size(), is(1));
+ assertThat(actualCmMap.get(cm1).size(), is(2));
+
+ }
+
+ /**
+ *
+ * unregisterConnectionShoudRemovedMatchedConnection
+ *
+ * @throws Exception in case of error
+ */
+ @Test
+ public void unregisterConnectionShoudRemovedMatchedConnection() throws Exception
+ {
+ //given
+ TransactionManager tm = mock(TransactionManager.class);
+ CachedConnectionManager ccm = new CachedConnectionManager(tm);
+ ConnectionCacheListener cm0 = mock(ConnectionCacheListener.class);
+ ConnectionCacheListener cm1 = mock(ConnectionCacheListener.class);
+ ConnectionRecord cr0 = mock(ConnectionRecord.class);
+ Object connection = mock(Object.class);
+ when(cr0.getConnection()).thenReturn(connection);
+ ConnectionRecord cr1 = mock(ConnectionRecord.class);
+ ConnectionRecord cr2 = mock(ConnectionRecord.class);
+ ConnectionRecord cr3 = mock(ConnectionRecord.class);
+ CopyOnWriteArrayList<ConnectionRecord> crList0 = new CopyOnWriteArrayList<ConnectionRecord>(Arrays.asList(cr0,
+ cr1));
+ CopyOnWriteArrayList<ConnectionRecord> crList1 = new CopyOnWriteArrayList<ConnectionRecord>(Arrays.asList(cr2,
+ cr3));
+ ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
+ new ConcurrentHashMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>(2);
+ cmToConnectionsMap.put(cm0, crList0);
+ cmToConnectionsMap.put(cm1, crList1);
+
+ LinkedList<Object> keys = new LinkedList<Object>();
+ KeyConnectionAssociation key0 = new KeyConnectionAssociation("stringKey0");
+ key0.setCMToConnectionsMap(cmToConnectionsMap);
+ keys.add(key0);
+
+ ccm.getCurrentObjects().set(keys);
+ //when
+ ccm.unregisterConnection(cm0, connection);
+
+ //then
+
+ ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> actualCmMap =
+ ((KeyConnectionAssociation) keys.getLast()).getCMToConnectionsMap();
+ assertThat(actualCmMap.get(cm0).size(), is(1));
+ assertThat(actualCmMap.get(cm1).size(), is(2));
+
+ }
+
+ /**
+ *
+ * pushMetaAwareObjectShoudCreateStack
+ *
+ * @throws Exception in case of error
+ */
+ @Test
+ public void pushMetaAwareObjectShoudPushANewKey() throws Exception
+ {
+ //given
+ TransactionManager tm = mock(TransactionManager.class);
+ CachedConnectionManager ccm = new CachedConnectionManager(tm);
+
+ //when
+ ccm.pushMetaAwareObject(mock(Object.class), null);
+
+ //then
+ assertThat(ccm.getCurrentObjects().get() == null, is(false));
+
+ }
+
+ /**
+ *
+ * pushMetaAwareObjectShoudCreateStack
+ *
+ * @throws Exception in case of error
+ */
+ @Test
+ public void pushMetaAwareObjectShoudCreateStack() throws Exception
+ {
+ //given
+ TransactionManager tm = mock(TransactionManager.class);
+ CachedConnectionManager ccm = new CachedConnectionManager(tm);
+
+ ConnectionCacheListener cm0 = mock(ConnectionCacheListener.class);
+ ConnectionCacheListener cm1 = mock(ConnectionCacheListener.class);
+ ConnectionRecord cr0 = mock(ConnectionRecord.class);
+ Object connection = mock(Object.class);
+ when(cr0.getConnection()).thenReturn(connection);
+ ConnectionRecord cr1 = mock(ConnectionRecord.class);
+ ConnectionRecord cr2 = mock(ConnectionRecord.class);
+ ConnectionRecord cr3 = mock(ConnectionRecord.class);
+ CopyOnWriteArrayList<ConnectionRecord> crList0 = new CopyOnWriteArrayList<ConnectionRecord>(Arrays.asList(cr0,
+ cr1));
+ CopyOnWriteArrayList<ConnectionRecord> crList1 = new CopyOnWriteArrayList<ConnectionRecord>(Arrays.asList(cr2,
+ cr3));
+ ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
+ new ConcurrentHashMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>(2);
+ cmToConnectionsMap.put(cm0, crList0);
+ cmToConnectionsMap.put(cm1, crList1);
+
+ LinkedList<Object> keys = new LinkedList<Object>();
+ KeyConnectionAssociation key0 = new KeyConnectionAssociation("stringKey0");
+ key0.setCMToConnectionsMap(cmToConnectionsMap);
+ keys.add(key0);
+
+ ccm.getCurrentObjects().set(keys);
+
+ Object rawKey = mock(Object.class);
+
+ //when
+ ccm.pushMetaAwareObject(rawKey, null);
+
+ //then
+ assertThat(ccm.getCurrentObjects().get() == null, is(false));
+ assertThat((KeyConnectionAssociation) ccm.getCurrentObjects().get().getLast(),
+ is(new KeyConnectionAssociation(rawKey)));
+
+ }
+
+ /**
+ *
+ * pushMetaAwareObjectShoudReconnectAPreviouslyDisconnectedConnection
+ *
+ * @throws Exception in case of error
+ */
+ @Test
+ public void pushMetaAwareObjectShoudReconnectAPreviouslyDisconnectedConnection() throws Exception
+ {
+ //given
+ TransactionManager tm = mock(TransactionManager.class);
+ CachedConnectionManager ccm = new CachedConnectionManager(tm);
+
+ ConnectionCacheListener cm0 = mock(ConnectionCacheListener.class);
+ ConnectionCacheListener cm1 = mock(ConnectionCacheListener.class);
+ ConnectionRecord cr0 = mock(ConnectionRecord.class);
+ Object connection = mock(Object.class);
+ when(cr0.getConnection()).thenReturn(connection);
+ ConnectionRecord cr1 = mock(ConnectionRecord.class);
+ ConnectionRecord cr2 = mock(ConnectionRecord.class);
+ ConnectionRecord cr3 = mock(ConnectionRecord.class);
+ CopyOnWriteArrayList<ConnectionRecord> crList0 = new CopyOnWriteArrayList<ConnectionRecord>(Arrays.asList(cr0,
+ cr1));
+ CopyOnWriteArrayList<ConnectionRecord> crList1 = new CopyOnWriteArrayList<ConnectionRecord>(Arrays.asList(cr2,
+ cr3));
+ ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
+ new ConcurrentHashMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>(2);
+ cmToConnectionsMap.put(cm0, crList0);
+ cmToConnectionsMap.put(cm1, crList1);
+
+ LinkedList<Object> keys = new LinkedList<Object>();
+ KeyConnectionAssociation key0 = new KeyConnectionAssociation("stringKey0");
+ key0.setCMToConnectionsMap(cmToConnectionsMap);
+ keys.add(key0);
+
+ ccm.getCurrentObjects().set(keys);
+
+ Set unsharableResources = mock(Set.class);
+ ccm.popMetaAwareObject(unsharableResources);
+
+ //when
+ ccm.pushMetaAwareObject("stringKey0", unsharableResources);
+
+ //then
+
+ verify(cm0, times(1)).disconnect(eq(crList0), eq(unsharableResources));
+ verify(cm1, times(1)).disconnect(eq(crList1), eq(unsharableResources));
+ verify(cm0, times(1)).reconnect(eq(crList0), eq(unsharableResources));
+ verify(cm1, times(1)).reconnect(eq(crList1), eq(unsharableResources));
+
+ assertThat(ccm.getCurrentObjects().get() == null, is(false));
+ assertThat(ccm.getCurrentObjects().get().size(), is(1));
+
+ }
+
+}
Added: projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/ccm/package.html
===================================================================
--- projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/ccm/package.html (rev 0)
+++ projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/ccm/package.html 2011-01-24 15:11:31 UTC (rev 110437)
@@ -0,0 +1,3 @@
+<body>
+Test cases for cached connection manager.
+</body>
Modified: projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/listener/NoTxConnectionListenerTestCase.java
===================================================================
--- projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/listener/NoTxConnectionListenerTestCase.java 2011-01-24 14:32:08 UTC (rev 110436)
+++ projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/listener/NoTxConnectionListenerTestCase.java 2011-01-24 15:11:31 UTC (rev 110437)
@@ -52,6 +52,13 @@
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
+/**
+ *
+ * A NoTxConnectionListenerTestCase.
+ *
+ * @author <a href="stefano.maestri at jboss.com">Stefano Maestri</a>
+ *
+ */
public class NoTxConnectionListenerTestCase
{
@@ -64,6 +71,12 @@
private static Pool pool = null;
+ /**
+ *
+ * testConnectionClosed
+ *
+ * @throws Exception in case of unexpected errors
+ */
@Test
public void testConnectionClosed() throws Exception
{
@@ -85,11 +98,17 @@
ConnectionEvent event = new ConnectionEvent(listener.getManagedConnection(), ConnectionEvent.CONNECTION_CLOSED);
- ((NoTxConnectionListener) listener).connectionClosed(event);
+ ((NoTxConnectionListener) listener).connectionClosed(event);
assertThat(((MockManagedConnection) listener.getManagedConnection()).cleanUpCalled(), is(1));
}
+ /**
+ *
+ * connectionErrorOccuredShouldFreeManagedCOnnection
+ *
+ * @throws Exception in case of unexpected errors
+ */
@Test
public void connectionErrorOccuredShouldFreeManagedCOnnection() throws Exception
{
@@ -116,6 +135,12 @@
assertThat(listener.isManagedConnectionFree(), is(true));
}
+ /**
+ *
+ * unregisterAssociationShouldFreeManagedCOnnection
+ *
+ * @throws Exception in case of unexpected errors
+ */
@Test
public void unregisterAssociationShouldFreeManagedCOnnection() throws Exception
{
@@ -141,6 +166,12 @@
assertThat(listener.isManagedConnectionFree(), is(true));
}
+ /**
+ *
+ * unregisterNotYetCreatedAssociationShouldNotThrowException
+ *
+ * @throws Exception in case of unexpected errors
+ */
@Test
public void unregisterNotYetCreatedAssociationShouldNotThrowException() throws Exception
{
@@ -196,7 +227,7 @@
ConnectionManager connectionManager = cmf.createNonTransactional(TransactionSupportLevel.NoTransaction, pool,
null, null);
- noTxCm = ((NoTxConnectionManagerImpl) connectionManager);
+ noTxCm = ((NoTxConnectionManagerImpl) connectionManager);
}
@@ -222,4 +253,3 @@
}
}
-
Added: projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/listener/TxConnectionListenerTestCase.java
===================================================================
--- projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/listener/TxConnectionListenerTestCase.java (rev 0)
+++ projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/listener/TxConnectionListenerTestCase.java 2011-01-24 15:11:31 UTC (rev 110437)
@@ -0,0 +1,706 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.jca.core.connectionmanager.listener;
+
+import org.jboss.jca.core.api.connectionmanager.pool.PoolConfiguration;
+import org.jboss.jca.core.connectionmanager.ConnectionManagerFactory;
+import org.jboss.jca.core.connectionmanager.TxConnectionManager;
+import org.jboss.jca.core.connectionmanager.ccm.CachedConnectionManager;
+import org.jboss.jca.core.connectionmanager.common.MockManagedConnectionFactory;
+import org.jboss.jca.core.connectionmanager.listener.TxConnectionListener.TransactionSynchronization;
+import org.jboss.jca.core.connectionmanager.pool.api.Pool;
+import org.jboss.jca.core.connectionmanager.pool.api.PoolFactory;
+import org.jboss.jca.core.connectionmanager.pool.api.PoolStrategy;
+import org.jboss.jca.core.connectionmanager.tx.TxConnectionManagerTestCase;
+import org.jboss.jca.embedded.Embedded;
+import org.jboss.jca.embedded.EmbeddedFactory;
+
+import java.net.URL;
+
+import javax.resource.ResourceException;
+import javax.resource.spi.ConnectionEvent;
+import javax.resource.spi.ConnectionManager;
+import javax.resource.spi.LocalTransaction;
+import javax.resource.spi.ManagedConnection;
+import javax.resource.spi.ManagedConnectionFactory;
+import javax.resource.spi.TransactionSupport.TransactionSupportLevel;
+import javax.transaction.Status;
+import javax.transaction.Synchronization;
+import javax.transaction.SystemException;
+import javax.transaction.Transaction;
+import javax.transaction.TransactionManager;
+import javax.transaction.xa.XAResource;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import static org.hamcrest.core.Is.is;
+import static org.hamcrest.core.IsNot.not;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Matchers.anyBoolean;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyObject;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+
+/**
+ *
+ * A TxConnectionListenerTestCase.
+ *
+ * @author <a href="stefano.maestri at jboss.com">Stefano Maestri</a>
+ *
+ */
+public class TxConnectionListenerTestCase
+{
+ /**Embedded JCA*/
+ private static Embedded embedded = null;
+
+ private static TxConnectionManager txConnectionManager = null;
+
+ private static ManagedConnectionFactory mcf = null;
+
+ /**
+ *
+ * delistShouldSetTransactionSynchronizationToNullIfEverythingCommitted
+ *
+ * @throws Exception in case of error
+ */
+ @Test
+ public void delistShouldSetTransactionSynchronizationToNullIfEverythingCommitted() throws Exception
+ {
+ //given
+ TxConnectionListener listener = new TxConnectionListener(txConnectionManager, null, null, null, null);
+ listener.setTrackByTx(false);
+ Transaction tx = mock(Transaction.class);
+ when(tx.getStatus()).thenReturn(Status.STATUS_COMMITTED);
+ TransactionSynchronization transactionSynchronization = listener.new TransactionSynchronization(tx, false);
+ listener.setTransactionSynchronization(transactionSynchronization);
+ //when
+ listener.delist();
+ //then
+ assertThat(listener.getTransactionSynchronization(), is((TransactionSynchronization) null));
+ }
+
+ /**
+ *
+ * delistShouldNotSetTransactionSynchronizationToNullIfTrackByTx
+ *
+ * @throws Exception in case of error
+ */
+ @Test
+ public void delistShouldNotSetTransactionSynchronizationToNullIfTrackByTx() throws Exception
+ {
+ //given
+ TxConnectionListener listener = new TxConnectionListener(txConnectionManager, null, null, null, null);
+ listener.setTrackByTx(true);
+ Transaction tx = mock(Transaction.class);
+ when(tx.getStatus()).thenReturn(Status.STATUS_COMMITTED);
+ TransactionSynchronization transactionSynchronization = listener.new TransactionSynchronization(tx, false);
+ listener.setTransactionSynchronization(transactionSynchronization);
+ //when
+ listener.delist();
+ //then
+ assertThat(listener.getTransactionSynchronization(), not(is((TransactionSynchronization) null)));
+ }
+
+ /**
+ *
+ * enlistShouldThrowSystemExceptionIfEnlistResourceFail
+ *
+ * @throws Exception in case of error
+ */
+ @Test
+ public void deListShouldCompleteCorrectlyAfterARightEnlist() throws Exception
+ {
+ //given
+ TxConnectionManager cm = mock(TxConnectionManager.class);
+ TransactionManager tm = mock(TransactionManager.class);
+ com.arjuna.ats.jta.transaction.Transaction threadTx = mock(com.arjuna.ats.jta.transaction.Transaction.class);
+ when(threadTx.isAlive()).thenReturn(true);
+ when(threadTx.getStatus()).thenReturn(Status.STATUS_ACTIVE);
+ when(threadTx.enlistResource((XAResource) anyObject())).thenReturn(true);
+ when(threadTx.delistResource((XAResource) anyObject(), anyInt())).thenReturn(true);
+
+ when(tm.getStatus()).thenReturn(Status.STATUS_ACTIVE);
+ when(tm.getTransaction()).thenReturn(threadTx);
+ when(cm.getTransactionManager()).thenReturn(tm);
+
+ TxConnectionListener listener = new TxConnectionListener(cm, null, null, null, null);
+ listener.setTrackByTx(false);
+ TransactionSynchronization transactionSynchronization = null;
+ listener.setTransactionSynchronization(transactionSynchronization);
+ listener.enlist();
+ //when
+ listener.delist();
+
+ //then complete without exception
+
+ }
+
+ /**
+ *
+ * enlistShouldThrowSystemExceptionIfEnlistResourceFail
+ *
+ * @throws Exception in case of error
+ */
+ @Test(expected = ResourceException.class)
+ public void deListShouldThrowResourceExceptionIfDelistResourceFailOnTx() throws Exception
+ {
+ //given
+ TxConnectionManager cm = mock(TxConnectionManager.class);
+ TransactionManager tm = mock(TransactionManager.class);
+ com.arjuna.ats.jta.transaction.Transaction threadTx = mock(com.arjuna.ats.jta.transaction.Transaction.class);
+ when(threadTx.isAlive()).thenReturn(true);
+ when(threadTx.getStatus()).thenReturn(Status.STATUS_ACTIVE);
+ when(threadTx.enlistResource((XAResource) anyObject())).thenReturn(true);
+ /*******this is the important GIVEN *******/
+ when(threadTx.delistResource((XAResource) anyObject(), anyInt())).thenReturn(false);
+
+ when(tm.getStatus()).thenReturn(Status.STATUS_ACTIVE);
+ when(tm.getTransaction()).thenReturn(threadTx);
+ when(cm.getTransactionManager()).thenReturn(tm);
+
+ TxConnectionListener listener = new TxConnectionListener(cm, null, null, null, null);
+ listener.setTrackByTx(false);
+ TransactionSynchronization transactionSynchronization = null;
+ listener.setTransactionSynchronization(transactionSynchronization);
+ listener.enlist();
+ //when
+ listener.delist();
+
+ //then complete without exception
+
+ }
+
+
+ /**
+ *
+ * enlistShouldThrowIllegalStateExceptionWithCurrentTxAndStatusNoTransaction
+ *
+ * @throws Exception in case of error
+ */
+ @Test(expected = IllegalStateException.class)
+ public void enlistShouldThrowIllegalStateExceptionWithCurrentTxAndStatusNoTransaction() throws Exception
+ {
+ //given
+ TxConnectionManager cm = mock(TxConnectionManager.class);
+ TransactionManager tm = mock(TransactionManager.class);
+ when(tm.getStatus()).thenReturn(Status.STATUS_NO_TRANSACTION);
+ when(cm.getTransactionManager()).thenReturn(tm);
+ TxConnectionListener listener = new TxConnectionListener(cm, null, null, null, null);
+ listener.setTrackByTx(true);
+ Transaction tx = mock(Transaction.class);
+ TransactionSynchronization transactionSynchronization = listener.new TransactionSynchronization(tx, false);
+ listener.setTransactionSynchronization(transactionSynchronization);
+ //when
+ listener.enlist();
+ //then iLLEGALsTATEeXCEPTION
+
+ }
+
+ /**
+ *
+ * enlistShouldDoNothingForNoStransaction
+ *
+ * @throws Exception in case of error
+ */
+ @Test
+ public void enlistShouldDoNothingForNoStransaction() throws Exception
+ {
+ //given
+ TxConnectionManager cm = mock(TxConnectionManager.class);
+ TransactionManager tm = mock(TransactionManager.class);
+ when(tm.getStatus()).thenReturn(Status.STATUS_NO_TRANSACTION);
+ when(cm.getTransactionManager()).thenReturn(tm);
+ TxConnectionListener listener = new TxConnectionListener(cm, null, null, null, null);
+ listener.setTrackByTx(true);
+ Transaction tx = mock(Transaction.class);
+ TransactionSynchronization transactionSynch = mock(TxConnectionListener.TransactionSynchronization.class);
+ listener.setTransactionSynchronization(transactionSynch);
+ //when
+ listener.enlist();
+ //then
+ verifyZeroInteractions(transactionSynch);
+ }
+
+ /**
+ *
+ * enlistShouldThrowIllegalStateExceptionWithCurrentTxAndStatusNoTransaction
+ *
+ * @throws Exception in case of error
+ */
+ @Test(expected = IllegalStateException.class)
+ public void enlistShouldThrowIllegalStateExceptionWithNoActiveTransaction() throws Exception
+ {
+ //given
+ TxConnectionManager cm = mock(TxConnectionManager.class);
+ TransactionManager tm = mock(TransactionManager.class);
+ when(tm.getStatus()).thenReturn(Status.STATUS_COMMITTING);
+ when(cm.getTransactionManager()).thenReturn(tm);
+
+ TxConnectionListener listener = new TxConnectionListener(cm, null, null, null, null);
+ listener.setTrackByTx(true);
+ Transaction tx = mock(Transaction.class);
+ TransactionSynchronization transactionSynchronization = listener.new TransactionSynchronization(tx, false);
+ listener.setTransactionSynchronization(transactionSynchronization);
+ //when
+ listener.enlist();
+ //then iLLEGALsTATEeXCEPTION
+
+ }
+
+ /**
+ *
+ * enlistShouldThrowIllegalStateExceptionWithCurrentTxAndStatusNoTransaction
+ *
+ * @throws Exception in case of error
+ */
+ @Test(expected = IllegalStateException.class)
+ public void enlistShouldThrowIllegalStateExceptionTryingToChangeTransaction() throws Exception
+ {
+ //given
+ TxConnectionManager cm = mock(TxConnectionManager.class);
+ TransactionManager tm = mock(TransactionManager.class);
+ com.arjuna.ats.jta.transaction.Transaction threadTx = mock(com.arjuna.ats.jta.transaction.Transaction.class);
+ when(threadTx.isAlive()).thenReturn(true);
+ when(threadTx.getStatus()).thenReturn(Status.STATUS_ACTIVE);
+ when(tm.getStatus()).thenReturn(Status.STATUS_ACTIVE);
+ when(tm.getTransaction()).thenReturn(threadTx);
+ when(cm.getTransactionManager()).thenReturn(tm);
+
+ TxConnectionListener listener = new TxConnectionListener(cm, null, null, null, null);
+ listener.setTrackByTx(true);
+ Transaction tx = mock(Transaction.class);
+ TransactionSynchronization transactionSynchronization = listener.new TransactionSynchronization(tx, false);
+ listener.setTransactionSynchronization(transactionSynchronization);
+ //when
+ listener.enlist();
+ //then iLLEGALsTATEeXCEPTION
+
+ }
+
+ /**
+ *
+ * enlistShouldThrowIllegalStateExceptionForCantEnlistAlreadyTx
+ *
+ * @throws Exception in case of error
+ */
+ @Test(expected = IllegalStateException.class)
+ public void enlistShouldThrowIllegalStateExceptionForCantEnlistAlreadyTx() throws Exception
+ {
+ //given
+ TxConnectionManager cm = mock(TxConnectionManager.class);
+ TransactionManager tm = mock(TransactionManager.class);
+ com.arjuna.ats.jta.transaction.Transaction threadTx = mock(com.arjuna.ats.jta.transaction.Transaction.class);
+ when(threadTx.isAlive()).thenReturn(true);
+ when(threadTx.getStatus()).thenReturn(Status.STATUS_ACTIVE);
+ when(tm.getStatus()).thenReturn(Status.STATUS_ACTIVE);
+ when(tm.getTransaction()).thenReturn(threadTx);
+ when(cm.getTransactionManager()).thenReturn(tm);
+
+ TxConnectionListener listener = new TxConnectionListener(cm, null, null, null, null);
+ listener.setTrackByTx(false);
+ TransactionSynchronization transactionSynchronization = listener.new TransactionSynchronization(threadTx, false);
+ listener.setTransactionSynchronization(transactionSynchronization);
+ //when
+ listener.enlist();
+ //then iLLEGALsTATEeXCEPTION
+
+ }
+
+ /**
+ *
+ * enlistShouldThrowIllegalStateExceptionForCantEnlistAlreadyTx
+ *
+ * @throws Exception in case of error
+ */
+ @Test(expected = SystemException.class)
+ public void enlistShouldThrowIllegalStateExceptionForCantEnlistAlreadyTx2() throws Exception
+ {
+ //given
+ TxConnectionManager cm = mock(TxConnectionManager.class);
+ TransactionManager tm = mock(TransactionManager.class);
+ com.arjuna.ats.jta.transaction.Transaction threadTx = mock(com.arjuna.ats.jta.transaction.Transaction.class);
+ when(threadTx.isAlive()).thenReturn(true);
+ when(threadTx.getStatus()).thenReturn(Status.STATUS_ACTIVE);
+ doThrow(new SystemException("ThreadTx Exception")).when(threadTx).registerSynchronization(
+ (Synchronization) anyObject());
+ when(tm.getStatus()).thenReturn(Status.STATUS_ACTIVE);
+ when(tm.getTransaction()).thenReturn(threadTx);
+ when(cm.getTransactionManager()).thenReturn(tm);
+
+ TxConnectionListener listener = new TxConnectionListener(cm, null, null, null, null);
+ listener.setTrackByTx(true);
+ TransactionSynchronization transactionSynchronization = listener.new TransactionSynchronization(threadTx, false);
+ listener.setTransactionSynchronization(transactionSynchronization);
+ //when
+ listener.enlist();
+ //then iLLEGALsTATEeXCEPTION
+
+ }
+
+ /**
+ *
+ * enlistShouldThrowIllegalStateExceptionWithCurrentTxAndStatusNoTransaction
+ *
+ * @throws Exception in case of error
+ */
+ @Test(expected = IllegalStateException.class)
+ public void enlistShouldThrowIllegalStateExceptionForNotEnlistedResources() throws Exception
+ {
+ //given
+ TxConnectionManager cm = mock(TxConnectionManager.class);
+ TransactionManager tm = mock(TransactionManager.class);
+ com.arjuna.ats.jta.transaction.Transaction threadTx = mock(com.arjuna.ats.jta.transaction.Transaction.class);
+ when(threadTx.isAlive()).thenReturn(true);
+ when(threadTx.getStatus()).thenReturn(Status.STATUS_ACTIVE);
+ when(tm.getStatus()).thenReturn(Status.STATUS_ACTIVE);
+ when(tm.getTransaction()).thenReturn(threadTx);
+ when(cm.getTransactionManager()).thenReturn(tm);
+
+ TxConnectionListener listener = new TxConnectionListener(cm, null, null, null, null);
+ listener.setTrackByTx(true);
+ TransactionSynchronization transactionSynchronization = listener.new TransactionSynchronization(threadTx, false);
+ listener.setTransactionSynchronization(transactionSynchronization);
+ //when
+ listener.enlist();
+ //then iLLEGALsTATEeXCEPTION
+
+ }
+
+ /**
+ *
+ * enlistShouldThrowSystemExceptionIfEnlistResourceFail
+ *
+ * @throws Exception in case of error
+ */
+ @Test(expected = SystemException.class)
+ public void enlistShouldThrowSystemExceptionIfEnlistResourceFail() throws Exception
+ {
+ //given
+ TxConnectionManager cm = mock(TxConnectionManager.class);
+ TransactionManager tm = mock(TransactionManager.class);
+ com.arjuna.ats.jta.transaction.Transaction threadTx = mock(com.arjuna.ats.jta.transaction.Transaction.class);
+ when(threadTx.isAlive()).thenReturn(true);
+ when(threadTx.getStatus()).thenReturn(Status.STATUS_ACTIVE);
+ /******* THIS IS THE IMPORTANT GIVEN ****/
+ when(threadTx.enlistResource((XAResource) anyObject())).thenReturn(false);
+
+ when(tm.getStatus()).thenReturn(Status.STATUS_ACTIVE);
+ when(tm.getTransaction()).thenReturn(threadTx);
+ when(cm.getTransactionManager()).thenReturn(tm);
+
+ TxConnectionListener listener = new TxConnectionListener(cm, null, null, null, null);
+ listener.setTrackByTx(true);
+ TransactionSynchronization transactionSynchronization = null;
+ listener.setTransactionSynchronization(transactionSynchronization);
+ //when
+ listener.enlist();
+ //then SystemException
+
+ }
+
+ /**
+ *
+ * enlistShouldThrowSystemExceptionIfEnlistResourceFail
+ *
+ * @throws Exception in case of error
+ */
+ @Test
+ public void enlistShouldCompleteWithoutExceptions() throws Exception
+ {
+ //given
+ TxConnectionManager cm = mock(TxConnectionManager.class);
+ TransactionManager tm = mock(TransactionManager.class);
+ com.arjuna.ats.jta.transaction.Transaction threadTx = mock(com.arjuna.ats.jta.transaction.Transaction.class);
+ when(threadTx.isAlive()).thenReturn(true);
+ when(threadTx.getStatus()).thenReturn(Status.STATUS_ACTIVE);
+ when(threadTx.enlistResource((XAResource) anyObject())).thenReturn(true);
+
+ when(tm.getStatus()).thenReturn(Status.STATUS_ACTIVE);
+ when(tm.getTransaction()).thenReturn(threadTx);
+ when(cm.getTransactionManager()).thenReturn(tm);
+
+ TxConnectionListener listener = new TxConnectionListener(cm, null, null, null, null);
+ listener.setTrackByTx(true);
+ TransactionSynchronization transactionSynchronization = null;
+ listener.setTransactionSynchronization(transactionSynchronization);
+ //when
+ listener.enlist();
+ //then complete without exception
+
+ }
+
+ /**
+ *
+ * connectionClosedShouldThrowIllegalStateExceptionForDifferentManagedConnection
+ *
+ * @throws Exception in case of error
+ */
+ @Test(expected = IllegalArgumentException.class)
+ public void connectionClosedShouldThrowIllegalStateExceptionForDifferentManagedConnection() throws Exception
+ {
+ //given
+ TxConnectionManager cm = mock(TxConnectionManager.class);
+ ManagedConnection mc = mock(ManagedConnection.class);
+ ManagedConnection mc2 = mock(ManagedConnection.class);
+
+ TxConnectionListener listener = new TxConnectionListener(cm, mc, null, null, null);
+ ConnectionEvent ce = new ConnectionEvent(mc2, ConnectionEvent.CONNECTION_CLOSED);
+ //when
+ listener.connectionClosed(ce);
+ //then complete without exception
+
+ }
+
+ /**
+ *
+ * connectionClosedShouldThrowIllegalStateExceptionForDifferentManagedConnection
+ *
+ * @throws Exception in case of error
+ */
+ @Test
+ public void connectionClosedShouldInvokeRightMethodsForNonFreedConnection() throws Exception
+ {
+ //given
+ TxConnectionManager cm = mock(TxConnectionManager.class);
+ ManagedConnection mc = mock(ManagedConnection.class);
+ CachedConnectionManager ccm = mock(CachedConnectionManager.class);
+ when(cm.getCachedConnectionManager()).thenReturn(ccm);
+ TxConnectionListener listener = new TxConnectionListener(cm, mc, null, null, null);
+ listener.setTrackByTx(false);
+ ConnectionEvent ce = new ConnectionEvent(mc, ConnectionEvent.CONNECTION_CLOSED);
+ //when
+ listener.connectionClosed(ce);
+ //then
+ verify(ccm, times(1)).unregisterConnection((ConnectionCacheListener) anyObject(), anyObject());
+ verify(cm, never()).returnManagedConnection(eq(listener), anyBoolean());
+ }
+
+ /**
+ *
+ * connectionClosedShouldInvokeRiightMethodsFreedConnection
+ *
+ * @throws Exception in case of error
+ */
+ @Test
+ public void connectionClosedShouldInvokeRightMethodsForFreedConnection() throws Exception
+ {
+ //given
+ TxConnectionManager cm = mock(TxConnectionManager.class);
+ ManagedConnection mc = mock(ManagedConnection.class);
+ CachedConnectionManager ccm = mock(CachedConnectionManager.class);
+ when(cm.getCachedConnectionManager()).thenReturn(ccm);
+ TxConnectionListener listener = new TxConnectionListener(cm, mc, null, null, null);
+ listener.setTrackByTx(true);
+ ConnectionEvent ce = new ConnectionEvent(mc, ConnectionEvent.CONNECTION_CLOSED);
+ //when
+ listener.connectionClosed(ce);
+ //then
+ verify(ccm, times(1)).unregisterConnection((ConnectionCacheListener) anyObject(), anyObject());
+ verify(cm, times(1)).returnManagedConnection(eq(listener), eq(false));
+ }
+
+ /**
+ *
+ * connectionClosedShouldInvokeRightMethodsInCaseOfExceptions
+ *
+ * @throws Exception in case of error
+ */
+ @Test
+ public void connectionClosedShouldInvokeRightMethodsInCaseOfExceptions() throws Exception
+ {
+ //given
+ TxConnectionManager cm = mock(TxConnectionManager.class);
+ ManagedConnection mc = mock(ManagedConnection.class);
+ CachedConnectionManager ccm = mock(CachedConnectionManager.class);
+ when(cm.getCachedConnectionManager()).thenReturn(ccm);
+ TxConnectionListener listener = new TxConnectionListener(cm, mc, null, null, null);
+ listener.setTrackByTx(true);
+ ConnectionEvent ce = mock(ConnectionEvent.class);
+ when(ce.getSource()).thenReturn(mc);
+ /****** this is the important given *****/
+ when(ce.getConnectionHandle()).thenThrow(new RuntimeException());
+ //when
+ listener.connectionClosed(ce);
+ //then
+ verify(ccm, never()).unregisterConnection((ConnectionCacheListener) anyObject(), anyObject());
+ verify(cm, times(1)).returnManagedConnection(eq(listener), eq(true));
+ }
+
+ /**
+ *
+ * tidyUpShouldDoNothingWithoutLocalTransaction
+ *
+ * @throws Exception in case of error
+ */
+ @Test
+ public void tidyUpShouldDoNothingWithoutLocalTransaction() throws Exception
+ {
+ //given
+ TxConnectionManager cm = mock(TxConnectionManager.class);
+ ManagedConnection mc = mock(ManagedConnection.class);
+ TxConnectionListener listener = new TxConnectionListener(cm, mc, null, null, null);
+ ConnectionEvent ce = mock(ConnectionEvent.class);
+ /****** this is the important given *****/
+ listener.localTransactionCommitted(ce);
+ //when
+ listener.tidyup();
+ //then
+ verify(cm, times(0)).returnManagedConnection(eq(listener), eq(true));
+ }
+
+ /**
+ *
+ * tidyUpShouldDoNothingWithoutLocalTransaction
+ *
+ * @throws Exception in case of error
+ */
+ @Test(expected = ResourceException.class)
+ public void tidyUpShouldRethrowExceptionOfGetLocalTransactionAsResourceException() throws Exception
+ {
+ //given
+ TxConnectionManager cm = mock(TxConnectionManager.class);
+ ManagedConnection mc = mock(ManagedConnection.class);
+ TxConnectionListener listener = new TxConnectionListener(cm, mc, null, null, null);
+ ConnectionEvent ce = mock(ConnectionEvent.class);
+ /****** this is the important given *****/
+ listener.localTransactionStarted(ce);
+ when(mc.getLocalTransaction()).thenThrow(new ResourceException());
+ //when
+ listener.tidyup();
+ //then
+
+ }
+
+ /**
+ *
+ * tidyUpShouldDoNothingWithoutLocalTransaction
+ *
+ * @throws Exception in case of error
+ */
+ @Test(expected = ResourceException.class)
+ public void tidyUpShouldThrowResourceExceptionIfLocalTransactionIsNull() throws Exception
+ {
+ //given
+ TxConnectionManager cm = mock(TxConnectionManager.class);
+ ManagedConnection mc = mock(ManagedConnection.class);
+ TxConnectionListener listener = new TxConnectionListener(cm, mc, null, null, null);
+ ConnectionEvent ce = mock(ConnectionEvent.class);
+ /****** this is the important given *****/
+ listener.localTransactionStarted(ce);
+ when(mc.getLocalTransaction()).thenReturn(null);
+ //when
+ listener.tidyup();
+ //then
+
+ }
+
+ /**
+ *
+ * tidyUpShouldDoNothingWithoutLocalTransaction
+ *
+ * @throws Exception in case of error
+ */
+ @Test
+ public void tidyUpShouldInvokeRollebackOnLocalTransaction() throws Exception
+ {
+ //given
+ TxConnectionManager cm = mock(TxConnectionManager.class);
+ ManagedConnection mc = mock(ManagedConnection.class);
+ TxConnectionListener listener = new TxConnectionListener(cm, mc, null, null, null);
+ ConnectionEvent ce = mock(ConnectionEvent.class);
+ /****** this is the important given *****/
+ listener.localTransactionStarted(ce);
+ LocalTransaction local = mock(LocalTransaction.class);
+ when(mc.getLocalTransaction()).thenReturn(local);
+ //when
+ listener.tidyup();
+ //then
+ verify(local, times(1)).rollback();
+ }
+
+ /**
+ * Lifecycle start, before the suite is executed
+ * @throws Throwable throwable exception
+ */
+ @BeforeClass
+ public static void beforeClass() throws Throwable
+ {
+ // Create and set an embedded JCA instance
+ embedded = EmbeddedFactory.create(false);
+
+ // Startup
+ embedded.startup();
+
+ // Deploy Naming and Transaction
+ URL naming = TxConnectionManagerTestCase.class.getClassLoader().getResource("naming.xml");
+ URL transaction = TxConnectionManagerTestCase.class.getClassLoader().getResource("transaction.xml");
+
+ embedded.deploy(naming);
+ embedded.deploy(transaction);
+
+ TransactionManager tm = embedded.lookup("RealTransactionManager", TransactionManager.class);
+
+ mcf = new MockManagedConnectionFactory();
+ PoolConfiguration pc = new PoolConfiguration();
+ PoolFactory pf = new PoolFactory();
+
+ Pool pool = pf.create(PoolStrategy.ONE_POOL, mcf, pc, true);
+
+ ConnectionManagerFactory cmf = new ConnectionManagerFactory();
+ ConnectionManager connectionManager = cmf.createTransactional(TransactionSupportLevel.LocalTransaction, pool,
+ null, null, tm, null, null, null, null, null);
+
+ txConnectionManager = (TxConnectionManager) connectionManager;
+ }
+
+ /**
+ * Lifecycle stop, after the suite is executed
+ * @throws Throwable throwable exception
+ */
+ @AfterClass
+ public static void afterClass() throws Throwable
+ {
+ // Undeploy Transaction and Naming
+ URL naming = TxConnectionManagerTestCase.class.getClassLoader().getResource("naming.xml");
+ URL transaction = TxConnectionManagerTestCase.class.getClassLoader().getResource("transaction.xml");
+
+ embedded.undeploy(transaction);
+ embedded.undeploy(naming);
+
+ // Shutdown embedded
+ embedded.shutdown();
+
+ // Set embedded to null
+ embedded = null;
+ }
+
+}
+
Added: projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/listener/package.html
===================================================================
--- projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/listener/package.html (rev 0)
+++ projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/listener/package.html 2011-01-24 15:11:31 UTC (rev 110437)
@@ -0,0 +1,3 @@
+<body>
+Test cases for the non connection listeners
+</body>
Added: projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/pool/OnePoolTestCase.java
===================================================================
--- projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/pool/OnePoolTestCase.java (rev 0)
+++ projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/pool/OnePoolTestCase.java 2011-01-24 15:11:31 UTC (rev 110437)
@@ -0,0 +1,415 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.jca.core.connectionmanager.pool;
+
+import org.jboss.jca.core.api.connectionmanager.pool.PoolConfiguration;
+import org.jboss.jca.core.connectionmanager.listener.ConnectionListener;
+import org.jboss.jca.core.connectionmanager.pool.mcp.ManagedConnectionPool;
+import org.jboss.jca.core.connectionmanager.pool.strategy.OnePool;
+
+import javax.resource.ResourceException;
+import javax.resource.spi.ConnectionRequestInfo;
+import javax.resource.spi.ManagedConnectionFactory;
+import javax.security.auth.Subject;
+import javax.transaction.Transaction;
+
+import org.jboss.tm.TransactionLocal;
+
+import org.junit.Test;
+import org.mockito.InOrder;
+import org.mockito.Mockito;
+
+import static org.hamcrest.core.Is.is;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+/**
+ *
+ * A OnePoolTestCase.
+ *
+ * NOTE that this class is in org.jboss.jca.core.connectionmanager.pool and not in
+ * org.jboss.jca.core.connectionmanager.pool.strategy because it needs to access to AbstractPool's
+ * package protected methods. Please don't move it, and keep this class packaging consistent with AbstractPool's
+ *
+ * @author <a href="stefano.maestri at jboss.com">Stefano Maestri</a>
+ *
+ */
+public class OnePoolTestCase
+{
+
+ /**
+ *
+ * getKeyShouldReturnSameBooleanValuePassedAsSeparateNoTx
+ * @throws Exception in case of unexpected errors
+ *
+ */
+ @Test
+ public void getKeyShouldReturnSameBooleanValuePassedAsSeparateNoTx() throws Exception
+ {
+ AbstractPool pool = new OnePool(mock(ManagedConnectionFactory.class), mock(PoolConfiguration.class), false);
+ assertThat((Boolean) pool.getKey(null, null, true), is(true));
+ assertThat((Boolean) pool.getKey(null, null, false), is(false));
+ }
+
+ /**
+ *
+ * getKeyShouldReturnSameBooleanValuePassedAsSeparateNoTx
+ * @throws Exception in case of unexpected errors
+ */
+ @Test(expected = IllegalArgumentException.class)
+ public void constructorShouldThrowIllegalArgumentExceptionForNullManagedConnectionFactory() throws Exception
+ {
+ OnePool pool = new OnePool(null, mock(PoolConfiguration.class), false);
+ }
+
+ /**
+ *
+ * constructorShouldThrowIllegalArgumentExceptionForNullPoolConfiguration
+ * @throws Exception in case of unexpected errors
+ */
+ @Test(expected = IllegalArgumentException.class)
+ public void constructorShouldThrowIllegalArgumentExceptionForNullPoolConfiguration() throws Exception
+ {
+ OnePool pool = new OnePool(mock(ManagedConnectionFactory.class), null, false);
+ }
+
+ /**
+ *
+ * prefillWithSubjectArgumentShouldPopulateSubPool
+ * @throws Exception in case of unexpected errors
+ */
+ @Test
+ public void prefillWithSubjectArgumentShouldPopulateSubPool() throws Exception
+ {
+ //given
+ AbstractPool pool = new OnePool(mock(ManagedConnectionFactory.class), mock(PoolConfiguration.class), false);
+ //when (note: argument is not important, set to null just for convenience)
+ ((OnePool) pool).prefill(null);
+ //then
+ assertThat(pool.getSubPools().get(pool.getKey(null, null, false)) == null, is(false));
+ }
+
+ /**
+ *
+ * prefillWithAllArgumentsShouldPopulateSubPoolIfPoolConfigHasPrefillSetToTrue
+ * @throws Exception in case of unexpected errors
+ */
+ @Test
+ public void prefillWithAllArgumentsShouldPopulateSubPoolIfPoolConfigHasPrefillSetToTrue() throws Exception
+ {
+ //given
+ PoolConfiguration config = new PoolConfiguration();
+ //prefill=true is the default
+ ManagedConnectionFactory mcf = mock(ManagedConnectionFactory.class);
+ AbstractPrefillPool pool = new OnePool(mcf, config, false);
+ Subject subject = new Subject();
+ ConnectionRequestInfo cri = mock(ConnectionRequestInfo.class);
+ boolean noTxnSeperatePool = true;
+ //when
+ pool.prefill(subject, cri, noTxnSeperatePool);
+ //then
+ assertThat(pool.getSubPools().get(pool.getKey(subject, cri, noTxnSeperatePool)) == null, is(false));
+ }
+
+ /**
+ *
+ * prefillWithAllArgumentsShouldPopulateSubPool
+ * @throws Exception in case of unexpected errors
+ */
+ @Test
+ public void prefillWithAllArgumentsShouldDoNothingIfPoolConfigHasPrefillSetToFalse() throws Exception
+ {
+ //given
+ PoolConfiguration config = new PoolConfiguration();
+ config.setPrefill(false);
+ AbstractPrefillPool pool = new OnePool(mock(ManagedConnectionFactory.class), config, false);
+ Subject subject = new Subject();
+ ConnectionRequestInfo cri = mock(ConnectionRequestInfo.class);
+ boolean noTxnSeperatePool = true;
+ //when
+ pool.prefill(subject, cri, noTxnSeperatePool);
+ //then
+ assertThat(pool.getSubPools().get(pool.getKey(subject, cri, noTxnSeperatePool)), is((SubPoolContext) null));
+ }
+
+ /**
+ *
+ * emptySubPoolShouldDoNothing
+ * @throws Exception in case of unexpected errors
+ */
+ @Test
+ public void emptySubPoolShouldDoNothing() throws Exception
+ {
+ //given
+ AbstractPool pool = new OnePool(mock(ManagedConnectionFactory.class), mock(PoolConfiguration.class), false);
+ //when (note: argument is not important, set to null just for convenience)
+ ((OnePool) pool).prefill(null);
+ ((OnePool) pool).emptySubPool(null);
+ //then
+ assertThat(pool.getSubPools().get(pool.getKey(null, null, false)) == null, is(false));
+
+ }
+
+ /**
+ *
+ * flushPoolShouldLeaveSubPoolEmpty
+ * @throws Exception in case of unexpected errors
+ */
+ @Test
+ public void flushPoolShouldLeaveSubPoolEmpty() throws Exception
+ {
+ //given
+ AbstractPool pool = new OnePool(mock(ManagedConnectionFactory.class), mock(PoolConfiguration.class), false);
+ //when (note: argument is not important, set to null just for convenience)
+ ((OnePool) pool).prefill(null);
+ ((OnePool) pool).flush();
+ //then
+ assertThat(pool.getSubPools().size(), is(0));
+
+ }
+
+ /**
+ *
+ * shutdownShouldLeaveSubPoolEmpty
+ * @throws Exception in case of unexpected errors
+ */
+ @Test
+ public void shutdownShouldLeaveSubPoolEmpty() throws Exception
+ {
+ //given
+ AbstractPool pool = new OnePool(mock(ManagedConnectionFactory.class), mock(PoolConfiguration.class), false);
+ //when (note: argument is not important, set to null just for convenience)
+ ((OnePool) pool).prefill(null);
+ ((OnePool) pool).shutdown();
+ //then
+ assertThat(pool.getSubPools().size(), is(0));
+
+ }
+
+ /**
+ *
+ * getTransactionOldConnectionShouldThrowResourceExceptionIfLockFail
+ * @throws Exception in case of unexpected errors
+ */
+ @Test(expected = ResourceException.class)
+ public void getTransactionOldConnectionShouldThrowResourceExceptionIfLockFail() throws Exception
+ {
+ //given
+ AbstractPool pool = new OnePool(mock(ManagedConnectionFactory.class), mock(PoolConfiguration.class), false);
+ TransactionLocal trackByTx = mock(TransactionLocal.class);
+ Transaction trackByTransaction = mock(Transaction.class);
+ doThrow(new InterruptedException()).when(trackByTx).lock(trackByTransaction);
+ //when
+ pool.getTransactionOldConnection(trackByTx, trackByTransaction);
+ //then exception
+
+ }
+
+ /**
+ *
+ * getTransactionOldConnectionShouldReturnNullIfClIsNullButCOrrectlyLockAndUnlock
+ * @throws Exception in case of unexpected errors
+ */
+ @Test
+ public void getTransactionOldConnectionShouldReturnNullIfClIsNullButCorrectlyLockAndUnlock() throws Exception
+ {
+ //given
+ AbstractPool pool = new OnePool(mock(ManagedConnectionFactory.class), mock(PoolConfiguration.class), false);
+ TransactionLocal trackByTx = mock(TransactionLocal.class);
+ Transaction trackByTransaction = mock(Transaction.class);
+ when(trackByTx.get(eq(trackByTransaction))).thenReturn(null);
+ //when
+ Object returnValue = pool.getTransactionOldConnection(trackByTx, trackByTransaction);
+ //then
+ assertThat(returnValue == null, is(true));
+ verify(trackByTx, times(1)).lock(eq(trackByTransaction));
+ verify(trackByTx, times(1)).unlock(eq(trackByTransaction));
+ }
+
+ /**
+ *
+ * getTransactionOldConnectionShouldReturnNullIfClIsNullButCOrrectlyLockAndUnlock
+ * @throws Exception in case of unexpected errors
+ */
+ @Test
+ public void getTransactionOldConnectionShouldReturnValueIfClHasValueAndCorrectlyLockAndUnlock() throws Exception
+ {
+ //given
+ AbstractPool pool = new OnePool(mock(ManagedConnectionFactory.class), mock(PoolConfiguration.class), false);
+ TransactionLocal trackByTx = mock(TransactionLocal.class);
+ Transaction trackByTransaction = mock(Transaction.class);
+ ConnectionListener listener = mock(ConnectionListener.class);
+ when(trackByTx.get(eq(trackByTransaction))).thenReturn(listener);
+ //when
+ ConnectionListener returnValue = pool.getTransactionOldConnection(trackByTx, trackByTransaction);
+ //then
+ assertThat(returnValue, is(listener));
+ verify(trackByTx, times(1)).lock(eq(trackByTransaction));
+ verify(trackByTx, times(1)).unlock(eq(trackByTransaction));
+ }
+
+ /**
+ *
+ * getTransactionNewConnectionShouldGetConnectionBeforeLocking
+ * @throws Exception in case of unexpected errors
+ */
+ @Test
+ public void getTransactionNewConnectionShouldGetConnectionBeforeLocking() throws Exception
+ {
+ //given
+ AbstractPool pool = new OnePool(mock(ManagedConnectionFactory.class), mock(PoolConfiguration.class), false);
+ TransactionLocal trackByTx = mock(TransactionLocal.class);
+ Transaction trackByTransaction = mock(Transaction.class);
+ ConnectionListener listener = mock(ConnectionListener.class);
+ ManagedConnectionPool mcp = mock(ManagedConnectionPool.class);
+ Subject subject = new Subject();
+ ConnectionRequestInfo cri = mock(ConnectionRequestInfo.class);
+ when(trackByTx.get(eq(trackByTransaction))).thenReturn(listener);
+ //when
+ ConnectionListener returnValue = pool.getTransactionNewConnection(trackByTx, trackByTransaction, mcp, subject,
+ cri);
+ //then
+
+ //note: it'simportant the order of inorder.verrify invocations, not inOrder() constructor
+ InOrder inOrder = Mockito.inOrder(mcp, trackByTx);
+ inOrder.verify(mcp, times(1)).getConnection(subject, cri);
+ inOrder.verify(trackByTx, times(1)).lock(eq(trackByTransaction));
+ //always unlock because it's on finally block
+ inOrder.verify(trackByTx, times(1)).unlock(eq(trackByTransaction));
+ }
+
+ /**
+ *
+ * getTransactionNewConnectionShouldThrowResourceExceptionAndReturnCOnnectionInCaseOfLockFails
+ * @throws Exception in case of unexpected errors
+ */
+ @Test(expected = ResourceException.class)
+ public void getTransactionNewConnectionShouldThrowResourceExceptionAndReturnCOnnectionInCaseOfLockFails()
+ throws Exception
+ {
+ //given
+ AbstractPool pool = new OnePool(mock(ManagedConnectionFactory.class), mock(PoolConfiguration.class), false);
+ TransactionLocal trackByTx = mock(TransactionLocal.class);
+ Transaction trackByTransaction = mock(Transaction.class);
+ ManagedConnectionPool mcp = mock(ManagedConnectionPool.class);
+ ConnectionListener cl = mock(ConnectionListener.class);
+ Subject subject = new Subject();
+ ConnectionRequestInfo cri = mock(ConnectionRequestInfo.class);
+ when(mcp.getConnection(subject, cri)).thenReturn(cl);
+
+ doThrow(new InterruptedException()).when(trackByTx).lock(trackByTransaction);
+ ConnectionListener returnValue = pool.getTransactionNewConnection(trackByTx, trackByTransaction, mcp, subject,
+ cri);
+ //then
+
+ //note: it'simportant the order of inorder.verrify invocations, not inOrder() constructor
+ InOrder inOrder = Mockito.inOrder(mcp, trackByTx);
+ inOrder.verify(mcp, times(1)).getConnection(subject, cri);
+ inOrder.verify(trackByTx, times(1)).lock(eq(trackByTransaction));
+ inOrder.verify(mcp, times(1)).returnConnection(eq(cl), eq(false));
+ //always unlock because it's on finally block
+ inOrder.verify(trackByTx, times(1)).unlock(eq(trackByTransaction));
+ }
+
+ /**
+ *
+ * getTransactionNewConnectionShouldThrowResourceExceptionAndReturnCOnnectionInCaseOfLockFails
+ * @throws Exception in case of unexpected errors
+ */
+ @Test
+ public void getTransactionNewConnectionShouldUseTheOtherFromDifferentThreadIfAlreadyTracked() throws Exception
+ {
+ //given
+ AbstractPool pool = new OnePool(mock(ManagedConnectionFactory.class), mock(PoolConfiguration.class), false);
+ TransactionLocal trackByTx = mock(TransactionLocal.class);
+ Transaction trackByTransaction = mock(Transaction.class);
+ ManagedConnectionPool mcp = mock(ManagedConnectionPool.class);
+ ConnectionListener cl = mock(ConnectionListener.class);
+ ConnectionListener other = mock(ConnectionListener.class);
+
+ Subject subject = new Subject();
+ ConnectionRequestInfo cri = mock(ConnectionRequestInfo.class);
+ when(mcp.getConnection(subject, cri)).thenReturn(cl);
+
+ when(trackByTx.get(eq(trackByTransaction))).thenReturn(other);
+ //when
+ ConnectionListener returnValue = pool.getTransactionNewConnection(trackByTx, trackByTransaction, mcp, subject,
+ cri);
+ //then
+
+ //note: it'simportant the order of inorder.verrify invocations, not inOrder() constructor
+ InOrder inOrder = Mockito.inOrder(mcp, trackByTx, other);
+ inOrder.verify(mcp, times(1)).getConnection(subject, cri);
+ inOrder.verify(trackByTx, times(1)).lock(eq(trackByTransaction));
+ inOrder.verify(mcp, times(1)).returnConnection(eq(cl), eq(false));
+ inOrder.verify(other, times(1)).setTrackByTx(eq(true));
+ inOrder.verify(trackByTx, times(1)).set(eq(other));
+ //always unlock because it's on finally block
+ inOrder.verify(trackByTx, times(1)).unlock(eq(trackByTransaction));
+
+ assertThat(returnValue, is(other));
+ }
+
+ /**
+ *
+ * getTransactionNewConnectionShouldThrowResourceExceptionAndReturnCOnnectionInCaseOfLockFails
+ * @throws Exception in case of unexpected errors
+ */
+ @Test
+ public void getTransactionNewConnectionShouldUseMcpReturnedCl() throws Exception
+ {
+ //given
+ AbstractPool pool = new OnePool(mock(ManagedConnectionFactory.class), mock(PoolConfiguration.class), false);
+ TransactionLocal trackByTx = mock(TransactionLocal.class);
+ Transaction trackByTransaction = mock(Transaction.class);
+ ManagedConnectionPool mcp = mock(ManagedConnectionPool.class);
+ ConnectionListener cl = mock(ConnectionListener.class);
+ ConnectionListener other = null;
+
+ Subject subject = new Subject();
+ ConnectionRequestInfo cri = mock(ConnectionRequestInfo.class);
+ when(mcp.getConnection(subject, cri)).thenReturn(cl);
+
+ when(trackByTx.get(eq(trackByTransaction))).thenReturn(other);
+ //when
+ ConnectionListener returnValue = pool.getTransactionNewConnection(trackByTx, trackByTransaction, mcp, subject,
+ cri);
+ //then
+
+ //note: it'simportant the order of inorder.verrify invocations, not inOrder() constructor
+ InOrder inOrder = Mockito.inOrder(mcp, trackByTx, cl);
+ inOrder.verify(mcp, times(1)).getConnection(subject, cri);
+ inOrder.verify(trackByTx, times(1)).lock(eq(trackByTransaction));
+ inOrder.verify(cl, times(1)).setTrackByTx(eq(true));
+ inOrder.verify(trackByTx, times(1)).set(eq(cl));
+ //always unlock because it's on finally block
+ inOrder.verify(trackByTx, times(1)).unlock(eq(trackByTransaction));
+
+ assertThat(returnValue, is(cl));
+ }
+
+}
Added: projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/pool/package.html
===================================================================
--- projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/pool/package.html (rev 0)
+++ projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/pool/package.html 2011-01-24 15:11:31 UTC (rev 110437)
@@ -0,0 +1,3 @@
+<body>
+Test cases for pools.
+</body>
Modified: projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/test/core/spec/chapter10/api/WorkManagerRejectingScheduleWorkTestCase.java
===================================================================
--- projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/test/core/spec/chapter10/api/WorkManagerRejectingScheduleWorkTestCase.java 2011-01-24 14:32:08 UTC (rev 110436)
+++ projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/test/core/spec/chapter10/api/WorkManagerRejectingScheduleWorkTestCase.java 2011-01-24 15:11:31 UTC (rev 110437)
@@ -34,13 +34,12 @@
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
-import static org.junit.Assert.*;
/**
* WorkManagerRejectingScheduleWorkTestCase.
- *
+ *
* Tests for rejecting work instance to the WorkManager scheduleWork() methods
- *
+ *
* @author <a href="mailto:jesper.pedersen at jboss.org">Jesper Pedersen</a>
* @version $Revision: $
*/
@@ -50,10 +49,10 @@
* Embedded
*/
private static Embedded embedded;
-
+
/**
* scheduleWork method
- * @throws Throwable throwable exception
+ * @throws Throwable throwable exception
*/
@Test(expected = WorkRejectedException.class)
public void testScheduleWork() throws Throwable
@@ -64,10 +63,10 @@
workManager.scheduleWork(work);
}
-
+
/**
* scheduleWork method (full signature)
- * @throws Throwable throwable exception
+ * @throws Throwable throwable exception
*/
@Test(expected = WorkRejectedException.class)
public void testScheduleWorkFullSignature() throws Throwable
@@ -76,16 +75,16 @@
ShortRunningWork work = new ShortRunningWork();
MyWorkAdapter wa = new MyWorkAdapter();
-
+
workManager.scheduleWork(work, WorkManager.INDEFINITE, null, wa);
}
-
+
// --------------------------------------------------------------------------------||
// Lifecycle Methods --------------------------------------------------------------||
// --------------------------------------------------------------------------------||
/**
* Lifecycle start, before the suite is executed
- * @throws Throwable throwable exception
+ * @throws Throwable throwable exception
*/
@BeforeClass
public static void beforeClass() throws Throwable
@@ -97,13 +96,11 @@
embedded.startup();
// Deploy Naming, Transaction and WorkManager
- URL naming =
- WorkManagerRejectingScheduleWorkTestCase.class.getClassLoader().getResource("naming.xml");
- URL transaction =
- WorkManagerRejectingScheduleWorkTestCase.class.getClassLoader().getResource("transaction.xml");
- URL wm =
- WorkManagerRejectingScheduleWorkTestCase.class.getClassLoader().
- getResource("rejecting-workmanager.xml");
+ URL naming = WorkManagerRejectingScheduleWorkTestCase.class.getClassLoader().getResource("naming.xml");
+ URL transaction = WorkManagerRejectingScheduleWorkTestCase.class.getClassLoader()
+ .getResource("transaction.xml");
+ URL wm = WorkManagerRejectingScheduleWorkTestCase.class.getClassLoader().getResource(
+ "rejecting-workmanager.xml");
embedded.deploy(naming);
embedded.deploy(transaction);
@@ -112,19 +109,17 @@
/**
* Lifecycle stop, after the suite is executed
- * @throws Throwable throwable exception
+ * @throws Throwable throwable exception
*/
@AfterClass
public static void afterClass() throws Throwable
{
// Undeploy WorkManager, Transaction and Naming
- URL naming =
- WorkManagerRejectingScheduleWorkTestCase.class.getClassLoader().getResource("naming.xml");
- URL transaction =
- WorkManagerRejectingScheduleWorkTestCase.class.getClassLoader().getResource("transaction.xml");
- URL wm =
- WorkManagerRejectingScheduleWorkTestCase.class.getClassLoader().
- getResource("rejecting-workmanager.xml");
+ URL naming = WorkManagerRejectingScheduleWorkTestCase.class.getClassLoader().getResource("naming.xml");
+ URL transaction = WorkManagerRejectingScheduleWorkTestCase.class.getClassLoader()
+ .getResource("transaction.xml");
+ URL wm = WorkManagerRejectingScheduleWorkTestCase.class.getClassLoader().getResource(
+ "rejecting-workmanager.xml");
embedded.undeploy(wm);
embedded.undeploy(transaction);
Modified: projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/test/core/spec/chapter10/api/WorkManagerRejectingStartWorkTestCase.java
===================================================================
--- projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/test/core/spec/chapter10/api/WorkManagerRejectingStartWorkTestCase.java 2011-01-24 14:32:08 UTC (rev 110436)
+++ projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/test/core/spec/chapter10/api/WorkManagerRejectingStartWorkTestCase.java 2011-01-24 15:11:31 UTC (rev 110437)
@@ -34,13 +34,12 @@
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
-import static org.junit.Assert.*;
/**
* WorkManagerRejectingStartWorkTestCase.
- *
+ *
* Tests for rejecting work instance to the WorkManager startWork() methods
- *
+ *
* @author <a href="mailto:jesper.pedersen at jboss.org">Jesper Pedersen</a>
* @version $Revision: $
*/
@@ -50,10 +49,10 @@
* Embedded
*/
private static Embedded embedded;
-
+
/**
* startWork method
- * @throws Throwable throwable exception
+ * @throws Throwable throwable exception
*/
@Test(expected = WorkRejectedException.class)
public void testStartWork() throws Throwable
@@ -64,10 +63,10 @@
workManager.startWork(work);
}
-
+
/**
* startWork method (full signature)
- * @throws Throwable throwable exception
+ * @throws Throwable throwable exception
*/
@Test(expected = WorkRejectedException.class)
public void testStartWorkFullSignature() throws Throwable
@@ -76,16 +75,16 @@
ShortRunningWork work = new ShortRunningWork();
MyWorkAdapter wa = new MyWorkAdapter();
-
+
workManager.startWork(work, WorkManager.INDEFINITE, null, wa);
}
-
+
// --------------------------------------------------------------------------------||
// Lifecycle Methods --------------------------------------------------------------||
// --------------------------------------------------------------------------------||
/**
* Lifecycle start, before the suite is executed
- * @throws Throwable throwable exception
+ * @throws Throwable throwable exception
*/
@BeforeClass
public static void beforeClass() throws Throwable
@@ -97,13 +96,9 @@
embedded.startup();
// Deploy Naming, Transaction and WorkManager
- URL naming =
- WorkManagerRejectingStartWorkTestCase.class.getClassLoader().getResource("naming.xml");
- URL transaction =
- WorkManagerRejectingStartWorkTestCase.class.getClassLoader().getResource("transaction.xml");
- URL wm =
- WorkManagerRejectingStartWorkTestCase.class.getClassLoader().
- getResource("rejecting-workmanager.xml");
+ URL naming = WorkManagerRejectingStartWorkTestCase.class.getClassLoader().getResource("naming.xml");
+ URL transaction = WorkManagerRejectingStartWorkTestCase.class.getClassLoader().getResource("transaction.xml");
+ URL wm = WorkManagerRejectingStartWorkTestCase.class.getClassLoader().getResource("rejecting-workmanager.xml");
embedded.deploy(naming);
embedded.deploy(transaction);
@@ -112,19 +107,15 @@
/**
* Lifecycle stop, after the suite is executed
- * @throws Throwable throwable exception
+ * @throws Throwable throwable exception
*/
@AfterClass
public static void afterClass() throws Throwable
{
// Undeploy WorkManager, Transaction and Naming
- URL naming =
- WorkManagerRejectingStartWorkTestCase.class.getClassLoader().getResource("naming.xml");
- URL transaction =
- WorkManagerRejectingStartWorkTestCase.class.getClassLoader().getResource("transaction.xml");
- URL wm =
- WorkManagerRejectingStartWorkTestCase.class.getClassLoader().
- getResource("rejecting-workmanager.xml");
+ URL naming = WorkManagerRejectingStartWorkTestCase.class.getClassLoader().getResource("naming.xml");
+ URL transaction = WorkManagerRejectingStartWorkTestCase.class.getClassLoader().getResource("transaction.xml");
+ URL wm = WorkManagerRejectingStartWorkTestCase.class.getClassLoader().getResource("rejecting-workmanager.xml");
embedded.undeploy(wm);
embedded.undeploy(transaction);
Modified: projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/test/core/spec/chapter11/section7/WorkContextSetupListenerTestCase.java
===================================================================
--- projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/test/core/spec/chapter11/section7/WorkContextSetupListenerTestCase.java 2011-01-24 14:32:08 UTC (rev 110436)
+++ projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/test/core/spec/chapter11/section7/WorkContextSetupListenerTestCase.java 2011-01-24 15:11:31 UTC (rev 110437)
@@ -27,7 +27,6 @@
import org.jboss.jca.test.core.spec.chapter11.common.DuplicateTransactionContextWork;
import org.jboss.jca.test.core.spec.chapter11.common.TransactionContextCustom;
import org.jboss.jca.test.core.spec.chapter11.common.TransactionContextWork;
-import org.jboss.jca.test.core.spec.chapter11.section4.subsection3.WorkContextHandlingAssignmentTestCase;
import java.net.URL;
@@ -42,7 +41,7 @@
/**
* WorkContextSetupListenerTest
- *
+ *
* @version $Rev$ $Date$
* @author gurkanerdogdu
*/
@@ -54,8 +53,8 @@
private static Embedded embedded;
/**
- * Test {@link WorkContextLifecycleListener} for transaction context.
- *
+ * Test WorkContextLifecycleListener for transaction context.
+ *
* @throws Throwable throws any error
*/
@Test
@@ -63,17 +62,17 @@
{
WorkManager manager = embedded.lookup("WorkManager", WorkManager.class);
manager.doWork(new TransactionContextWork(), WorkManager.INDEFINITE, null, null);
-
+
String errorCode = TransactionContextCustom.getContextSetupFailedErrorCode();
boolean complete = TransactionContextCustom.isContextSetupComplete();
-
+
Assert.assertEquals("", errorCode);
- Assert.assertTrue(complete);
+ Assert.assertTrue(complete);
}
-
+
/**
- * Test {@link WorkContextLifecycleListener} for transaction context.
- *
+ * Test WorkContextLifecycleListener for transaction context.
+ *
* @throws Throwable throws any error
*/
@Test
@@ -82,24 +81,24 @@
WorkManager manager = embedded.lookup("WorkManager", WorkManager.class);
try
{
- manager.doWork(new DuplicateTransactionContextWork(), WorkManager.INDEFINITE, null, null);
+ manager.doWork(new DuplicateTransactionContextWork(), WorkManager.INDEFINITE, null, null);
}
catch (Throwable e)
{
//Swallow
}
-
+
String errorCode = TransactionContextCustom.getContextSetupFailedErrorCode();
boolean complete = TransactionContextCustom.isContextSetupComplete();
-
+
Assert.assertEquals(WorkContextErrorCodes.DUPLICATE_CONTEXTS, errorCode);
- Assert.assertFalse(complete);
+ Assert.assertFalse(complete);
}
-
+
/**
* Before class.
- * @throws Throwable throwable exception
+ * @throws Throwable throwable exception
*/
@BeforeClass
public static void beforeClass() throws Throwable
@@ -112,7 +111,7 @@
// Deploy Naming, Transaction and WorkManager
URL naming = WorkContextSetupListenerTestCase.class.getClassLoader().getResource("naming.xml");
- URL transaction =
+ URL transaction =
WorkContextSetupListenerTestCase.class.getClassLoader().getResource("transaction.xml");
URL wm = WorkContextSetupListenerTestCase.class.getClassLoader().getResource("workmanager.xml");
@@ -124,13 +123,13 @@
/**
* After class.
- * @throws Throwable throwable exception
+ * @throws Throwable throwable exception
*/
@AfterClass
public static void afterClass() throws Throwable
{
URL naming = WorkContextSetupListenerTestCase.class.getClassLoader().getResource("naming.xml");
- URL transaction =
+ URL transaction =
WorkContextSetupListenerTestCase.class.getClassLoader().getResource("transaction.xml");
URL wm = WorkContextSetupListenerTestCase.class.getClassLoader().getResource("workmanager.xml");
Modified: projects/jboss-jca/trunk/deployers/src/main/java/org/jboss/jca/deployers/common/AbstractResourceAdapterDeployer.java
===================================================================
--- projects/jboss-jca/trunk/deployers/src/main/java/org/jboss/jca/deployers/common/AbstractResourceAdapterDeployer.java 2011-01-24 14:32:08 UTC (rev 110436)
+++ projects/jboss-jca/trunk/deployers/src/main/java/org/jboss/jca/deployers/common/AbstractResourceAdapterDeployer.java 2011-01-24 15:11:31 UTC (rev 110437)
@@ -583,7 +583,7 @@
* @throws DeployException DeployException in case of errors
*/
protected Set<Failure> initAdminObject(Connector cmd, ClassLoader cl, List<Validate> archiveValidationObjects,
- List<Object> beanValidationObjects, Set<Failure> failures,
+ List<Object> beanValidationObjects, Set<Failure> failures,
URL url, String deploymentName, boolean activateDeployment,
List<org.jboss.jca.common.api.metadata.common.CommonAdminObject> aosRaXml,
List<org.jboss.jca.common.api.metadata.common.CommonAdminObject> aosIronJacamar,
@@ -644,7 +644,7 @@
{
jndiName = aoRaXml.getJndiName();
- if (aoRaXml.isUseJavaContext() != null &&
+ if (aoRaXml.isUseJavaContext() != null &&
aoRaXml.isUseJavaContext().booleanValue() &&
!jndiName.startsWith("java:/"))
{
@@ -655,14 +655,14 @@
{
jndiName = ijAO.getJndiName();
- if (ijAO.isUseJavaContext() != null &&
+ if (ijAO.isUseJavaContext() != null &&
ijAO.isUseJavaContext().booleanValue() &&
!jndiName.startsWith("java:/"))
{
jndiName = "java:/" + jndiName;
}
}
-
+
bindAdminObject(url, deploymentName, ao, jndiName);
}
else
@@ -670,7 +670,7 @@
String[] names = bindAdminObject(url, deploymentName, ao);
jndiName = names[0];
}
-
+
aos[i] = ao;
aoJndiNames[i] = jndiName;
@@ -759,7 +759,7 @@
if (mgtUniqueId.indexOf("/") != -1)
mgtUniqueId = mgtUniqueId.substring(mgtUniqueId.lastIndexOf("/") + 1);
- org.jboss.jca.core.api.management.Connector mgtConnector =
+ org.jboss.jca.core.api.management.Connector mgtConnector =
new org.jboss.jca.core.api.management.Connector(mgtUniqueId);
ResourceAdapter resourceAdapter = null;
@@ -1018,7 +1018,7 @@
{
jndiName = cdRaXml.getJndiName();
- if (cdRaXml.isUseJavaContext() != null &&
+ if (cdRaXml.isUseJavaContext() != null &&
cdRaXml.isUseJavaContext().booleanValue() &&
!jndiName.startsWith("java:/"))
{
@@ -1029,7 +1029,7 @@
{
jndiName = ijCD.getJndiName();
- if (ijCD.isUseJavaContext() != null &&
+ if (ijCD.isUseJavaContext() != null &&
ijCD.isUseJavaContext().booleanValue() &&
!jndiName.startsWith("java:/"))
{
@@ -1052,7 +1052,7 @@
{
poolName = ijCD.getPoolName();
}
-
+
if (poolName == null)
poolName = jndiName;
@@ -1074,7 +1074,7 @@
{
poolName = ijCD.getPoolName();
}
-
+
if (poolName == null)
poolName = cfJndiNames[0];
@@ -1322,7 +1322,7 @@
{
jndiName = cdRaXml.getJndiName();
- if (cdRaXml.isUseJavaContext() != null &&
+ if (cdRaXml.isUseJavaContext() != null &&
cdRaXml.isUseJavaContext().booleanValue() &&
!jndiName.startsWith("java:/"))
{
@@ -1333,7 +1333,7 @@
{
jndiName = ijCD.getJndiName();
- if (ijCD.isUseJavaContext() != null &&
+ if (ijCD.isUseJavaContext() != null &&
ijCD.isUseJavaContext().booleanValue() &&
!jndiName.startsWith("java:/"))
{
@@ -1356,7 +1356,7 @@
{
poolName = ijCD.getPoolName();
}
-
+
if (poolName == null)
poolName = jndiName;
@@ -1378,7 +1378,7 @@
{
poolName = ijCD.getPoolName();
}
-
+
if (poolName == null)
poolName = cfJndiNames[0];
@@ -1407,10 +1407,8 @@
failures, url, activateDeployment);
failures = initAdminObject(cmd, cl, archiveValidationObjects, beanValidationObjects, failures, url,
- deploymentName, activateDeployment,
- raxml != null ? raxml.getAdminObjects() : null,
- ijmd != null ? ijmd.getAdminObjects() : null,
- aos, aoJndiNames, mgtConnector);
+ deploymentName, activateDeployment, raxml != null ? raxml.getAdminObjects() : null, ijmd != null
+ ? ijmd.getAdminObjects() : null, aos, aoJndiNames, mgtConnector);
}
// Archive validation
@@ -1526,8 +1524,8 @@
* @param cps The config property's
* @return The management view of these
*/
- private List<org.jboss.jca.core.api.management.ConfigProperty>
- createManagementView(List<? extends ConfigProperty> cps)
+ private List<org.jboss.jca.core.api.management.ConfigProperty> createManagementView(
+ List<? extends ConfigProperty> cps)
{
List<org.jboss.jca.core.api.management.ConfigProperty> result =
new ArrayList<org.jboss.jca.core.api.management.ConfigProperty>();
@@ -1551,14 +1549,14 @@
if (confidential == null)
confidential = Boolean.FALSE;
- mgtCp =
+ mgtCp =
new org.jboss.jca.core.api.management.ConfigProperty(
cp.getConfigPropertyName().getValue(),
dynamic.booleanValue(), confidential.booleanValue());
}
else
{
- mgtCp =
+ mgtCp =
new org.jboss.jca.core.api.management.ConfigProperty(
cp.getConfigPropertyName().getValue());
}
Added: projects/jboss-jca/trunk/deployers/src/test/java/org/jboss/jca/test/deployers/spec/rars/testcases/package.html
===================================================================
--- projects/jboss-jca/trunk/deployers/src/test/java/org/jboss/jca/test/deployers/spec/rars/testcases/package.html (rev 0)
+++ projects/jboss-jca/trunk/deployers/src/test/java/org/jboss/jca/test/deployers/spec/rars/testcases/package.html 2011-01-24 15:11:31 UTC (rev 110437)
@@ -0,0 +1,3 @@
+<body>
+Test cases for the deployers.
+</body>
Modified: projects/jboss-jca/trunk/doc/userguide/en-US/modules/schemas.xml
===================================================================
--- projects/jboss-jca/trunk/doc/userguide/en-US/modules/schemas.xml 2011-01-24 14:32:08 UTC (rev 110436)
+++ projects/jboss-jca/trunk/doc/userguide/en-US/modules/schemas.xml 2011-01-24 15:11:31 UTC (rev 110437)
@@ -2720,7 +2720,7 @@
<programlisting language="xml">
<![CDATA[
<?xml version="1.0" encoding="UTF-8"?>
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="1.0">
<xs:complexType name="boolean-presenceType"></xs:complexType>
Modified: projects/jboss-jca/trunk/embedded/src/main/java/org/jboss/jca/embedded/Embedded.java
===================================================================
--- projects/jboss-jca/trunk/embedded/src/main/java/org/jboss/jca/embedded/Embedded.java 2011-01-24 14:32:08 UTC (rev 110436)
+++ projects/jboss-jca/trunk/embedded/src/main/java/org/jboss/jca/embedded/Embedded.java 2011-01-24 15:11:31 UTC (rev 110437)
@@ -74,6 +74,7 @@
/**
* Lookup a bean
+ * @param <T> the generics type
* @param name The bean name
* @param expectedType The expected type for the bean
* @return The bean instance
Modified: projects/jboss-jca/trunk/embedded/src/main/java/org/jboss/jca/embedded/EmbeddedJCA.java
===================================================================
--- projects/jboss-jca/trunk/embedded/src/main/java/org/jboss/jca/embedded/EmbeddedJCA.java 2011-01-24 14:32:08 UTC (rev 110436)
+++ projects/jboss-jca/trunk/embedded/src/main/java/org/jboss/jca/embedded/EmbeddedJCA.java 2011-01-24 15:11:31 UTC (rev 110437)
@@ -51,7 +51,7 @@
private static final int BUFFER_SIZE = 4096;
/** Enable full profile */
- private boolean fullProfile;
+ private final boolean fullProfile;
/** Kernel */
private Kernel kernel;
@@ -150,6 +150,7 @@
/**
* Lookup a bean
+ * @param <T> the generic type
* @param name The bean name
* @param expectedType The expected type for the bean
* @return The bean instance
@@ -177,7 +178,7 @@
public void deploy(URL url) throws Throwable
{
if (url == null)
- throw new IllegalArgumentException("Url is null");
+ throw new IllegalArgumentException("Url is null");
if (!started)
throw new IllegalStateException("Container not started");
@@ -193,17 +194,17 @@
public void deploy(ResourceAdapterArchive raa) throws Throwable
{
if (raa == null)
- throw new IllegalArgumentException("Url is null");
+ throw new IllegalArgumentException("Url is null");
if (!raa.getName().endsWith(".rar"))
- throw new IllegalArgumentException(raa.getName() + " doesn't end with .rar");
+ throw new IllegalArgumentException(raa.getName() + " doesn't end with .rar");
if (!started)
throw new IllegalStateException("Container not started");
InputStream is = raa.as(ZipExporter.class).exportZip();
BufferedInputStream bis = new BufferedInputStream(is, BUFFER_SIZE);
-
+
File parentDirectory = new File(SecurityActions.getSystemProperty("java.io.tmpdir"));
File raaFile = new File(parentDirectory, raa.getName());
@@ -258,7 +259,7 @@
shrinkwrapDeployments = new ArrayList<File>(1);
shrinkwrapDeployments.add(raaFile);
-
+
kernel.getMainDeployer().deploy(raaFile.toURI().toURL());
}
@@ -292,7 +293,7 @@
public void undeploy(URL url) throws Throwable
{
if (url == null)
- throw new IllegalArgumentException("Url is null");
+ throw new IllegalArgumentException("Url is null");
if (!started)
throw new IllegalStateException("Container not started");
@@ -308,7 +309,7 @@
public void undeploy(ResourceAdapterArchive raa) throws Throwable
{
if (raa == null)
- throw new IllegalArgumentException("Url is null");
+ throw new IllegalArgumentException("Url is null");
if (!started)
throw new IllegalStateException("Container not started");
@@ -350,7 +351,7 @@
private void removeDeployment(File deployment) throws IOException
{
if (deployment == null)
- throw new IllegalArgumentException("Deployment is null");
+ throw new IllegalArgumentException("Deployment is null");
if (deployment.exists())
{
@@ -380,7 +381,7 @@
if (files[i].isDirectory())
{
recursiveDelete(files[i]);
- }
+ }
else
{
if (!files[i].delete())
Modified: projects/jboss-jca/trunk/embedded/src/main/java/org/jboss/jca/embedded/arquillian/EmbeddedJCAContainer.java
===================================================================
--- projects/jboss-jca/trunk/embedded/src/main/java/org/jboss/jca/embedded/arquillian/EmbeddedJCAContainer.java 2011-01-24 14:32:08 UTC (rev 110436)
+++ projects/jboss-jca/trunk/embedded/src/main/java/org/jboss/jca/embedded/arquillian/EmbeddedJCAContainer.java 2011-01-24 15:11:31 UTC (rev 110437)
@@ -132,8 +132,9 @@
*
* @param asset asset
* @param name asset
- * @throws FileNotFoundException IOException
+ *
* @throws IOException IOException
+ * @throws FileNotFoundException FileNotFoundException
* @throws MalformedURLException MalformedURLException
* @throws Throwable Throwable
*
More information about the jboss-cvs-commits
mailing list