You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by sa...@apache.org on 2006/03/30 07:44:14 UTC
svn commit: r389997 - in
/jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool: ./
composite/ impl/
Author: sandymac
Date: Wed Mar 29 21:44:13 2006
New Revision: 389997
URL: http://svn.apache.org/viewcvs?rev=389997&view=rev
Log:
Reworked and created unit tests for KeyedObjectPool and implementations.
Added:
jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/composite/TestCompositeKeyedObjectPool.java (with props)
jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/composite/TestCompositeKeyedObjectPool2.java (with props)
Modified:
jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/TestBaseKeyedObjectPool.java
jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/TestBaseObjectPool.java
jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/TestKeyedObjectPool.java
jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/composite/TestAll.java
jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/composite/TestCompositeObjectPool.java
jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/composite/TestWaitLimitManager.java
jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/impl/TestGenericKeyedObjectPool.java
jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/impl/TestStackKeyedObjectPool.java
Modified: jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/TestBaseKeyedObjectPool.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/TestBaseKeyedObjectPool.java?rev=389997&r1=389996&r2=389997&view=diff
==============================================================================
--- jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/TestBaseKeyedObjectPool.java (original)
+++ jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/TestBaseKeyedObjectPool.java Wed Mar 29 21:44:13 2006
@@ -16,7 +16,6 @@
package org.apache.commons.pool;
import junit.framework.Test;
-import junit.framework.TestCase;
import junit.framework.TestSuite;
/**
@@ -24,17 +23,71 @@
* @author Sandy McArthur
* @version $Revision$ $Date$
*/
-public class TestBaseKeyedObjectPool extends TestCase {
- public TestBaseKeyedObjectPool(String testName) {
+public class TestBaseKeyedObjectPool extends TestKeyedObjectPool {
+ private KeyedObjectPool _pool = null;
+
+ public TestBaseKeyedObjectPool(final String testName) {
super(testName);
}
+ protected KeyedObjectPool makeEmptyPool(KeyedPoolableObjectFactory factory) {
+ if (this.getClass() != TestBaseKeyedObjectPool.class) {
+ throw new AssertionError("Subclasses of TestBaseKeyedObjectPool must reimplement this method.");
+ }
+ throw new UnsupportedOperationException("BaseKeyedObjectPool isn't a complete implementation.");
+ }
+
+ /**
+ * Create an {@link KeyedObjectPool} instance
+ * that can contain at least <i>mincapacity</i>
+ * idle and active objects, or
+ * throw {@link IllegalArgumentException}
+ * if such a pool cannot be created.
+ */
+ protected KeyedObjectPool makeEmptyPool(int mincapacity) {
+ if (this.getClass() != TestBaseKeyedObjectPool.class) {
+ throw new AssertionError("Subclasses of TestBaseKeyedObjectPool must reimplement this method.");
+ }
+ throw new UnsupportedOperationException("BaseKeyedObjectPool isn't a complete implementation.");
+ }
+
+ /**
+ * Return what we expect to be the n<sup>th</sup>
+ * object (zero indexed) created by the pool
+ * for the given key.
+ */
+ protected Object getNthObject(Object key, int n) {
+ if (this.getClass() != TestBaseKeyedObjectPool.class) {
+ throw new AssertionError("Subclasses of TestBaseKeyedObjectPool must reimplement this method.");
+ }
+ throw new UnsupportedOperationException("BaseKeyedObjectPool isn't a complete implementation.");
+ }
+
+ protected Object makeKey(int n) {
+ if (this.getClass() != TestBaseKeyedObjectPool.class) {
+ throw new AssertionError("Subclasses of TestBaseKeyedObjectPool must reimplement this method.");
+ }
+ throw new UnsupportedOperationException("BaseKeyedObjectPool isn't a complete implementation.");
+ }
+
public static Test suite() {
return new TestSuite(TestBaseKeyedObjectPool.class);
}
-
+
// tests
+ public void setUp() throws Exception {
+ super.setUp();
+ }
+
+ public void tearDown() throws Exception {
+ _pool = null;
+ super.tearDown();
+ }
+
public void testUnsupportedOperations() throws Exception {
+ if (!getClass().equals(TestBaseKeyedObjectPool.class)) {
+ return; // skip redundant tests
+ }
KeyedObjectPool pool = new BaseKeyedObjectPool() {
public Object borrowObject(Object key) throws Exception {
return null;
@@ -43,7 +96,7 @@
}
public void invalidateObject(Object key, Object obj) throws Exception {
}
- };
+ };
try {
pool.addObject("key");
@@ -80,5 +133,232 @@
pool.close(); // a no-op, probably should be remove
+ }
+
+ protected boolean isLifo() {
+ if (getClass() != TestBaseKeyedObjectPool.class) {
+ throw new AssertionError("Subclasses of TestBaseKeyedObjectPool must reimplement this method.");
+ }
+ return false;
+ }
+
+ protected boolean isFifo() {
+ if (getClass() != TestBaseKeyedObjectPool.class) {
+ throw new AssertionError("Subclasses of TestBaseKeyedObjectPool must reimplement this method.");
+ }
+ return false;
+ }
+
+ public void testBaseBorrowReturn() throws Exception {
+ try {
+ _pool = makeEmptyPool(3);
+ } catch(UnsupportedOperationException uoe) {
+ return; // skip this test if unsupported
+ }
+ Object keya = makeKey(0);
+ Object obj0 = _pool.borrowObject(keya);
+ assertEquals(getNthObject(keya,0),obj0);
+ Object obj1 = _pool.borrowObject(keya);
+ assertEquals(getNthObject(keya,1),obj1);
+ Object obj2 = _pool.borrowObject(keya);
+ assertEquals(getNthObject(keya,2),obj2);
+ _pool.returnObject(keya,obj2);
+ obj2 = _pool.borrowObject(keya);
+ assertEquals(getNthObject(keya,2),obj2);
+ _pool.returnObject(keya,obj1);
+ obj1 = _pool.borrowObject(keya);
+ assertEquals(getNthObject(keya,1),obj1);
+ _pool.returnObject(keya,obj0);
+ _pool.returnObject(keya,obj2);
+ obj2 = _pool.borrowObject(keya);
+ if (isLifo()) {
+ assertEquals(getNthObject(keya,2),obj2);
+ }
+ if (isFifo()) {
+ assertEquals(getNthObject(keya,0),obj2);
+ }
+ obj0 = _pool.borrowObject(keya);
+ if (isLifo()) {
+ assertEquals(getNthObject(keya,0),obj0);
+ }
+ if (isFifo()) {
+ assertEquals(getNthObject(keya,2),obj0);
+ }
+ }
+
+ public void testBaseBorrow() throws Exception {
+ try {
+ _pool = makeEmptyPool(3);
+ } catch(UnsupportedOperationException uoe) {
+ return; // skip this test if unsupported
+ }
+ Object keya = makeKey(0);
+ Object keyb = makeKey(1);
+ assertEquals("1",getNthObject(keya,0),_pool.borrowObject(keya));
+ assertEquals("2",getNthObject(keyb,0),_pool.borrowObject(keyb));
+ assertEquals("3",getNthObject(keyb,1),_pool.borrowObject(keyb));
+ assertEquals("4",getNthObject(keya,1),_pool.borrowObject(keya));
+ assertEquals("5",getNthObject(keyb,2),_pool.borrowObject(keyb));
+ assertEquals("6",getNthObject(keya,2),_pool.borrowObject(keya));
+ }
+
+ public void testBaseNumActiveNumIdle() throws Exception {
+ try {
+ _pool = makeEmptyPool(3);
+ } catch(UnsupportedOperationException uoe) {
+ return; // skip this test if unsupported
+ }
+ Object keya = makeKey(0);
+ assertEquals(0,_pool.getNumActive(keya));
+ assertEquals(0,_pool.getNumIdle(keya));
+ Object obj0 = _pool.borrowObject(keya);
+ assertEquals(1,_pool.getNumActive(keya));
+ assertEquals(0,_pool.getNumIdle(keya));
+ Object obj1 = _pool.borrowObject(keya);
+ assertEquals(2,_pool.getNumActive(keya));
+ assertEquals(0,_pool.getNumIdle(keya));
+ _pool.returnObject(keya,obj1);
+ assertEquals(1,_pool.getNumActive(keya));
+ assertEquals(1,_pool.getNumIdle(keya));
+ _pool.returnObject(keya,obj0);
+ assertEquals(0,_pool.getNumActive(keya));
+ assertEquals(2,_pool.getNumIdle(keya));
+
+ assertEquals(0,_pool.getNumActive("xyzzy12345"));
+ assertEquals(0,_pool.getNumIdle("xyzzy12345"));
+ }
+
+ public void testBaseNumActiveNumIdle2() throws Exception {
+ try {
+ _pool = makeEmptyPool(6);
+ } catch(UnsupportedOperationException uoe) {
+ return; // skip this test if unsupported
+ }
+ Object keya = makeKey(0);
+ Object keyb = makeKey(1);
+ assertEquals(0,_pool.getNumActive());
+ assertEquals(0,_pool.getNumIdle());
+ assertEquals(0,_pool.getNumActive(keya));
+ assertEquals(0,_pool.getNumIdle(keya));
+ assertEquals(0,_pool.getNumActive(keyb));
+ assertEquals(0,_pool.getNumIdle(keyb));
+
+ Object objA0 = _pool.borrowObject(keya);
+ Object objB0 = _pool.borrowObject(keyb);
+
+ assertEquals(2,_pool.getNumActive());
+ assertEquals(0,_pool.getNumIdle());
+ assertEquals(1,_pool.getNumActive(keya));
+ assertEquals(0,_pool.getNumIdle(keya));
+ assertEquals(1,_pool.getNumActive(keyb));
+ assertEquals(0,_pool.getNumIdle(keyb));
+
+ Object objA1 = _pool.borrowObject(keya);
+ Object objB1 = _pool.borrowObject(keyb);
+
+ assertEquals(4,_pool.getNumActive());
+ assertEquals(0,_pool.getNumIdle());
+ assertEquals(2,_pool.getNumActive(keya));
+ assertEquals(0,_pool.getNumIdle(keya));
+ assertEquals(2,_pool.getNumActive(keyb));
+ assertEquals(0,_pool.getNumIdle(keyb));
+
+ _pool.returnObject(keya,objA0);
+ _pool.returnObject(keyb,objB0);
+
+ assertEquals(2,_pool.getNumActive());
+ assertEquals(2,_pool.getNumIdle());
+ assertEquals(1,_pool.getNumActive(keya));
+ assertEquals(1,_pool.getNumIdle(keya));
+ assertEquals(1,_pool.getNumActive(keyb));
+ assertEquals(1,_pool.getNumIdle(keyb));
+
+ _pool.returnObject(keya,objA1);
+ _pool.returnObject(keyb,objB1);
+
+ assertEquals(0,_pool.getNumActive());
+ assertEquals(4,_pool.getNumIdle());
+ assertEquals(0,_pool.getNumActive(keya));
+ assertEquals(2,_pool.getNumIdle(keya));
+ assertEquals(0,_pool.getNumActive(keyb));
+ assertEquals(2,_pool.getNumIdle(keyb));
+ }
+
+ public void testBaseClear() throws Exception {
+ try {
+ _pool = makeEmptyPool(3);
+ } catch(UnsupportedOperationException uoe) {
+ return; // skip this test if unsupported
+ }
+ Object keya = makeKey(0);
+ assertEquals(0,_pool.getNumActive(keya));
+ assertEquals(0,_pool.getNumIdle(keya));
+ Object obj0 = _pool.borrowObject(keya);
+ Object obj1 = _pool.borrowObject(keya);
+ assertEquals(2,_pool.getNumActive(keya));
+ assertEquals(0,_pool.getNumIdle(keya));
+ _pool.returnObject(keya,obj1);
+ _pool.returnObject(keya,obj0);
+ assertEquals(0,_pool.getNumActive(keya));
+ assertEquals(2,_pool.getNumIdle(keya));
+ _pool.clear(keya);
+ assertEquals(0,_pool.getNumActive(keya));
+ assertEquals(0,_pool.getNumIdle(keya));
+ Object obj2 = _pool.borrowObject(keya);
+ assertEquals(getNthObject(keya,2),obj2);
+ }
+
+ public void testBaseInvalidateObject() throws Exception {
+ try {
+ _pool = makeEmptyPool(3);
+ } catch(UnsupportedOperationException uoe) {
+ return; // skip this test if unsupported
+ }
+ Object keya = makeKey(0);
+ assertEquals(0,_pool.getNumActive(keya));
+ assertEquals(0,_pool.getNumIdle(keya));
+ Object obj0 = _pool.borrowObject(keya);
+ Object obj1 = _pool.borrowObject(keya);
+ assertEquals(2,_pool.getNumActive(keya));
+ assertEquals(0,_pool.getNumIdle(keya));
+ _pool.invalidateObject(keya,obj0);
+ assertEquals(1,_pool.getNumActive(keya));
+ assertEquals(0,_pool.getNumIdle(keya));
+ _pool.invalidateObject(keya,obj1);
+ assertEquals(0,_pool.getNumActive(keya));
+ assertEquals(0,_pool.getNumIdle(keya));
+ }
+
+ public void testBaseAddObject() throws Exception {
+ try {
+ _pool = makeEmptyPool(3);
+ } catch(UnsupportedOperationException uoe) {
+ return; // skip this test if unsupported
+ }
+ Object key = makeKey(0);
+ try {
+ assertEquals(0,_pool.getNumIdle());
+ assertEquals(0,_pool.getNumActive());
+ assertEquals(0,_pool.getNumIdle(key));
+ assertEquals(0,_pool.getNumActive(key));
+ _pool.addObject(key);
+ assertEquals(1,_pool.getNumIdle());
+ assertEquals(0,_pool.getNumActive());
+ assertEquals(1,_pool.getNumIdle(key));
+ assertEquals(0,_pool.getNumActive(key));
+ Object obj = _pool.borrowObject(key);
+ assertEquals(getNthObject(key,0),obj);
+ assertEquals(0,_pool.getNumIdle());
+ assertEquals(1,_pool.getNumActive());
+ assertEquals(0,_pool.getNumIdle(key));
+ assertEquals(1,_pool.getNumActive(key));
+ _pool.returnObject(key,obj);
+ assertEquals(1,_pool.getNumIdle());
+ assertEquals(0,_pool.getNumActive());
+ assertEquals(1,_pool.getNumIdle(key));
+ assertEquals(0,_pool.getNumActive(key));
+ } catch(UnsupportedOperationException e) {
+ return; // skip this test if one of those calls is unsupported
+ }
}
}
Modified: jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/TestBaseObjectPool.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/TestBaseObjectPool.java?rev=389997&r1=389996&r2=389997&view=diff
==============================================================================
--- jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/TestBaseObjectPool.java (original)
+++ jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/TestBaseObjectPool.java Wed Mar 29 21:44:13 2006
@@ -71,6 +71,9 @@
// tests
public void testUnsupportedOperations() throws Exception {
+ if (!getClass().equals(TestBaseObjectPool.class)) {
+ return; // skip redundant tests
+ }
ObjectPool pool = new BaseObjectPool() {
public Object borrowObject() throws Exception {
return null;
Modified: jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/TestKeyedObjectPool.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/TestKeyedObjectPool.java?rev=389997&r1=389996&r2=389997&view=diff
==============================================================================
--- jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/TestKeyedObjectPool.java (original)
+++ jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/TestKeyedObjectPool.java Wed Mar 29 21:44:13 2006
@@ -32,15 +32,6 @@
}
/**
- * Create an {@link KeyedObjectPool} instance
- * that can contain at least <i>mincapacity</i>
- * idle and active objects, or
- * throw {@link IllegalArgumentException}
- * if such a pool cannot be created.
- */
- protected abstract KeyedObjectPool makeEmptyPool(int mincapacity);
-
- /**
* Create an <code>KeyedObjectPool</code> with the specified factory.
* The pool should be in a default configuration and conform to the expected
* behaviors described in {@link KeyedObjectPool}.
@@ -48,253 +39,20 @@
*/
protected abstract KeyedObjectPool makeEmptyPool(KeyedPoolableObjectFactory factory);
- /**
- * Return what we expect to be the n<sup>th</sup>
- * object (zero indexed) created by the pool
- * for the given key.
- */
- protected abstract Object getNthObject(Object key, int n);
-
- protected abstract Object makeKey(int n);
-
- /**
- * Is the implementations LIFO?
- */
- protected abstract boolean isLifo();
-
- /**
- * Is the implementationn FIFO?
- */
- protected abstract boolean isFifo();
-
- public void setUp() throws Exception {
- }
-
- public void tearDown() throws Exception {
- _pool = null;
- }
-
- public void testBaseBorrow() throws Exception {
- try {
- _pool = makeEmptyPool(3);
- } catch(IllegalArgumentException e) {
- return; // skip this test if unsupported
- }
- Object keya = makeKey(0);
- Object keyb = makeKey(1);
- assertEquals("1",getNthObject(keya,0),_pool.borrowObject(keya));
- assertEquals("2",getNthObject(keyb,0),_pool.borrowObject(keyb));
- assertEquals("3",getNthObject(keyb,1),_pool.borrowObject(keyb));
- assertEquals("4",getNthObject(keya,1),_pool.borrowObject(keya));
- assertEquals("5",getNthObject(keyb,2),_pool.borrowObject(keyb));
- assertEquals("6",getNthObject(keya,2),_pool.borrowObject(keya));
- }
+ protected final String KEY = "key";
- public void testBaseBorrowReturn() throws Exception {
- try {
- _pool = makeEmptyPool(3);
- } catch(IllegalArgumentException e) {
- return; // skip this test if unsupported
- }
- Object keya = makeKey(0);
- Object obj0 = _pool.borrowObject(keya);
- assertEquals(getNthObject(keya,0),obj0);
- Object obj1 = _pool.borrowObject(keya);
- assertEquals(getNthObject(keya,1),obj1);
- Object obj2 = _pool.borrowObject(keya);
- assertEquals(getNthObject(keya,2),obj2);
- _pool.returnObject(keya,obj2);
- obj2 = _pool.borrowObject(keya);
- assertEquals(getNthObject(keya,2),obj2);
- _pool.returnObject(keya,obj1);
- obj1 = _pool.borrowObject(keya);
- assertEquals(getNthObject(keya,1),obj1);
- _pool.returnObject(keya,obj0);
- _pool.returnObject(keya,obj2);
- obj2 = _pool.borrowObject(keya);
- if (isLifo()) {
- assertEquals(getNthObject(keya,2),obj2);
- }
- if (isFifo()) {
- assertEquals(getNthObject(keya,0),obj2);
- }
- obj0 = _pool.borrowObject(keya);
- if (isLifo()) {
- assertEquals(getNthObject(keya,0),obj0);
- }
- if (isFifo()) {
- assertEquals(getNthObject(keya,2),obj0);
- }
- }
-
- public void testBaseNumActiveNumIdle() throws Exception {
- try {
- _pool = makeEmptyPool(3);
- } catch(IllegalArgumentException e) {
- return; // skip this test if unsupported
- }
- Object keya = makeKey(0);
- assertEquals(0,_pool.getNumActive(keya));
- assertEquals(0,_pool.getNumIdle(keya));
- Object obj0 = _pool.borrowObject(keya);
- assertEquals(1,_pool.getNumActive(keya));
- assertEquals(0,_pool.getNumIdle(keya));
- Object obj1 = _pool.borrowObject(keya);
- assertEquals(2,_pool.getNumActive(keya));
- assertEquals(0,_pool.getNumIdle(keya));
- _pool.returnObject(keya,obj1);
- assertEquals(1,_pool.getNumActive(keya));
- assertEquals(1,_pool.getNumIdle(keya));
- _pool.returnObject(keya,obj0);
- assertEquals(0,_pool.getNumActive(keya));
- assertEquals(2,_pool.getNumIdle(keya));
-
- assertEquals(0,_pool.getNumActive("xyzzy12345"));
- assertEquals(0,_pool.getNumIdle("xyzzy12345"));
- }
-
- public void testBaseNumActiveNumIdle2() throws Exception {
- try {
- _pool = makeEmptyPool(6);
- } catch(IllegalArgumentException e) {
- return; // skip this test if unsupported
- }
- Object keya = makeKey(0);
- Object keyb = makeKey(1);
- assertEquals(0,_pool.getNumActive());
- assertEquals(0,_pool.getNumIdle());
- assertEquals(0,_pool.getNumActive(keya));
- assertEquals(0,_pool.getNumIdle(keya));
- assertEquals(0,_pool.getNumActive(keyb));
- assertEquals(0,_pool.getNumIdle(keyb));
-
- Object objA0 = _pool.borrowObject(keya);
- Object objB0 = _pool.borrowObject(keyb);
-
- assertEquals(2,_pool.getNumActive());
- assertEquals(0,_pool.getNumIdle());
- assertEquals(1,_pool.getNumActive(keya));
- assertEquals(0,_pool.getNumIdle(keya));
- assertEquals(1,_pool.getNumActive(keyb));
- assertEquals(0,_pool.getNumIdle(keyb));
-
- Object objA1 = _pool.borrowObject(keya);
- Object objB1 = _pool.borrowObject(keyb);
-
- assertEquals(4,_pool.getNumActive());
- assertEquals(0,_pool.getNumIdle());
- assertEquals(2,_pool.getNumActive(keya));
- assertEquals(0,_pool.getNumIdle(keya));
- assertEquals(2,_pool.getNumActive(keyb));
- assertEquals(0,_pool.getNumIdle(keyb));
-
- _pool.returnObject(keya,objA0);
- _pool.returnObject(keyb,objB0);
-
- assertEquals(2,_pool.getNumActive());
- assertEquals(2,_pool.getNumIdle());
- assertEquals(1,_pool.getNumActive(keya));
- assertEquals(1,_pool.getNumIdle(keya));
- assertEquals(1,_pool.getNumActive(keyb));
- assertEquals(1,_pool.getNumIdle(keyb));
-
- _pool.returnObject(keya,objA1);
- _pool.returnObject(keyb,objB1);
-
- assertEquals(0,_pool.getNumActive());
- assertEquals(4,_pool.getNumIdle());
- assertEquals(0,_pool.getNumActive(keya));
- assertEquals(2,_pool.getNumIdle(keya));
- assertEquals(0,_pool.getNumActive(keyb));
- assertEquals(2,_pool.getNumIdle(keyb));
- }
-
- public void testBaseClear() throws Exception {
- try {
- _pool = makeEmptyPool(3);
- } catch(IllegalArgumentException e) {
- return; // skip this test if unsupported
- }
- Object keya = makeKey(0);
- assertEquals(0,_pool.getNumActive(keya));
- assertEquals(0,_pool.getNumIdle(keya));
- Object obj0 = _pool.borrowObject(keya);
- Object obj1 = _pool.borrowObject(keya);
- assertEquals(2,_pool.getNumActive(keya));
- assertEquals(0,_pool.getNumIdle(keya));
- _pool.returnObject(keya,obj1);
- _pool.returnObject(keya,obj0);
- assertEquals(0,_pool.getNumActive(keya));
- assertEquals(2,_pool.getNumIdle(keya));
- _pool.clear(keya);
- assertEquals(0,_pool.getNumActive(keya));
- assertEquals(0,_pool.getNumIdle(keya));
- Object obj2 = _pool.borrowObject(keya);
- assertEquals(getNthObject(keya,2),obj2);
- }
-
- public void testBaseInvalidateObject() throws Exception {
- try {
- _pool = makeEmptyPool(3);
- } catch(IllegalArgumentException e) {
- return; // skip this test if unsupported
- }
- Object keya = makeKey(0);
- assertEquals(0,_pool.getNumActive(keya));
- assertEquals(0,_pool.getNumIdle(keya));
- Object obj0 = _pool.borrowObject(keya);
- Object obj1 = _pool.borrowObject(keya);
- assertEquals(2,_pool.getNumActive(keya));
- assertEquals(0,_pool.getNumIdle(keya));
- _pool.invalidateObject(keya,obj0);
- assertEquals(1,_pool.getNumActive(keya));
- assertEquals(0,_pool.getNumIdle(keya));
- _pool.invalidateObject(keya,obj1);
- assertEquals(0,_pool.getNumActive(keya));
- assertEquals(0,_pool.getNumIdle(keya));
- }
-
- public void testBaseAddObject() throws Exception {
+ public void testClosedPoolBehavior() throws Exception {
+ final KeyedObjectPool pool;
try {
- _pool = makeEmptyPool(3);
- } catch(IllegalArgumentException e) {
- return; // skip this test if unsupported
- }
- Object key = makeKey(0);
- try {
- assertEquals(0,_pool.getNumIdle());
- assertEquals(0,_pool.getNumActive());
- assertEquals(0,_pool.getNumIdle(key));
- assertEquals(0,_pool.getNumActive(key));
- _pool.addObject(key);
- assertEquals(1,_pool.getNumIdle());
- assertEquals(0,_pool.getNumActive());
- assertEquals(1,_pool.getNumIdle(key));
- assertEquals(0,_pool.getNumActive(key));
- Object obj = _pool.borrowObject(key);
- assertEquals(getNthObject(key,0),obj);
- assertEquals(0,_pool.getNumIdle());
- assertEquals(1,_pool.getNumActive());
- assertEquals(0,_pool.getNumIdle(key));
- assertEquals(1,_pool.getNumActive(key));
- _pool.returnObject(key,obj);
- assertEquals(1,_pool.getNumIdle());
- assertEquals(0,_pool.getNumActive());
- assertEquals(1,_pool.getNumIdle(key));
- assertEquals(0,_pool.getNumActive(key));
- } catch(UnsupportedOperationException e) {
- return; // skip this test if one of those calls is unsupported
+ pool = makeEmptyPool(new BaseKeyedPoolableObjectFactory() {
+ public Object makeObject(final Object key) throws Exception {
+ return new Object();
+ }
+ });
+ } catch(UnsupportedOperationException uoe) {
+ return; // test not supported
}
- }
-
- private final String KEY = "key";
- public void testClosedPoolBehavior() throws Exception {
- final KeyedObjectPool pool = makeEmptyPool(new BaseKeyedPoolableObjectFactory() {
- public Object makeObject(final Object key) throws Exception {
- return new Object();
- }
- });
Object o1 = pool.borrowObject(KEY);
Object o2 = pool.borrowObject(KEY);
@@ -333,7 +91,12 @@
public void testKPOFAddObjectUsage() throws Exception {
final FailingKeyedPoolableObjectFactory factory = new FailingKeyedPoolableObjectFactory();
- final KeyedObjectPool pool = makeEmptyPool(factory);
+ final KeyedObjectPool pool;
+ try {
+ pool = makeEmptyPool(factory);
+ } catch(UnsupportedOperationException uoe) {
+ return; // test not supported
+ }
final List expectedMethods = new ArrayList();
// addObject should make a new object, pasivate it and put it in the pool
@@ -374,7 +137,12 @@
public void testKPOFBorrowObjectUsages() throws Exception {
final FailingKeyedPoolableObjectFactory factory = new FailingKeyedPoolableObjectFactory();
- final KeyedObjectPool pool = makeEmptyPool(factory);
+ final KeyedObjectPool pool;
+ try {
+ pool = makeEmptyPool(factory);
+ } catch(UnsupportedOperationException uoe) {
+ return; // test not supported
+ }
final List expectedMethods = new ArrayList();
Object obj;
@@ -434,7 +202,12 @@
public void testKPOFReturnObjectUsages() throws Exception {
final FailingKeyedPoolableObjectFactory factory = new FailingKeyedPoolableObjectFactory();
- final KeyedObjectPool pool = makeEmptyPool(factory);
+ final KeyedObjectPool pool;
+ try {
+ pool = makeEmptyPool(factory);
+ } catch(UnsupportedOperationException uoe) {
+ return; // test not supported
+ }
final List expectedMethods = new ArrayList();
Object obj;
int idleCount;
@@ -473,7 +246,12 @@
public void testKPOFInvalidateObjectUsages() throws Exception {
final FailingKeyedPoolableObjectFactory factory = new FailingKeyedPoolableObjectFactory();
- final KeyedObjectPool pool = makeEmptyPool(factory);
+ final KeyedObjectPool pool;
+ try {
+ pool = makeEmptyPool(factory);
+ } catch(UnsupportedOperationException uoe) {
+ return; // test not supported
+ }
final List expectedMethods = new ArrayList();
Object obj;
@@ -500,7 +278,12 @@
public void testKPOFClearUsages() throws Exception {
final FailingKeyedPoolableObjectFactory factory = new FailingKeyedPoolableObjectFactory();
- final KeyedObjectPool pool = makeEmptyPool(factory);
+ final KeyedObjectPool pool;
+ try {
+ pool = makeEmptyPool(factory);
+ } catch(UnsupportedOperationException uoe) {
+ return; // test not supported
+ }
final List expectedMethods = new ArrayList();
/// Test correct behavior code paths
@@ -516,7 +299,12 @@
public void testKPOFCloseUsages() throws Exception {
final FailingKeyedPoolableObjectFactory factory = new FailingKeyedPoolableObjectFactory();
- KeyedObjectPool pool = makeEmptyPool(factory);
+ KeyedObjectPool pool;
+ try {
+ pool = makeEmptyPool(factory);
+ } catch(UnsupportedOperationException uoe) {
+ return; // test not supported
+ }
final List expectedMethods = new ArrayList();
/// Test correct behavior code paths
@@ -532,6 +320,15 @@
pool.close();
}
+ public void testToString() throws Exception {
+ final FailingKeyedPoolableObjectFactory factory = new FailingKeyedPoolableObjectFactory();
+ try {
+ makeEmptyPool(factory).toString();
+ } catch(UnsupportedOperationException uoe) {
+ return; // test not supported
+ }
+ }
+
private void reset(final KeyedObjectPool pool, final FailingKeyedPoolableObjectFactory factory, final List expectedMethods) throws Exception {
pool.clear();
clear(factory, expectedMethods);
@@ -543,9 +340,7 @@
expectedMethods.clear();
}
- private KeyedObjectPool _pool = null;
-
- private static class FailingKeyedPoolableObjectFactory implements KeyedPoolableObjectFactory {
+ protected static class FailingKeyedPoolableObjectFactory implements KeyedPoolableObjectFactory {
private final List methodCalls = new ArrayList();
private int count = 0;
private boolean makeObjectFail;
@@ -553,6 +348,9 @@
private boolean validateObjectFail;
private boolean passivateObjectFail;
private boolean destroyObjectFail;
+
+ public FailingKeyedPoolableObjectFactory() {
+ }
public void reset() {
count = 0;
Modified: jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/composite/TestAll.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/composite/TestAll.java?rev=389997&r1=389996&r2=389997&view=diff
==============================================================================
--- jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/composite/TestAll.java (original)
+++ jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/composite/TestAll.java Wed Mar 29 21:44:13 2006
@@ -62,7 +62,8 @@
// Remaining unit tests
suite.addTest(TestCompositeObjectPool.suite());
- //suite.addTest(TestCompositeKeyedObjectPool.suite());
+ suite.addTest(TestCompositeKeyedObjectPool.suite());
+ suite.addTest(TestCompositeKeyedObjectPool2.suite());
//suite.addTest(TestCompositeObjectPoolFactory.suite());
//suite.addTest(TestCompositeKeyedObjectPoolFactory.suite());
return suite;
Added: jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/composite/TestCompositeKeyedObjectPool.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/composite/TestCompositeKeyedObjectPool.java?rev=389997&view=auto
==============================================================================
--- jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/composite/TestCompositeKeyedObjectPool.java (added)
+++ jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/composite/TestCompositeKeyedObjectPool.java Wed Mar 29 21:44:13 2006
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.pool.composite;
+
+import junit.framework.TestCase;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+import org.apache.commons.pool.TestKeyedObjectPool;
+import org.apache.commons.pool.KeyedObjectPool;
+import org.apache.commons.pool.KeyedPoolableObjectFactory;
+import org.apache.commons.pool.MethodCallPoolableObjectFactory;
+import org.apache.commons.pool.impl.GenericObjectPoolFactory;
+
+/**
+ * Tests for {@link CompositeKeyedObjectPool}
+ * when backed by a {@link CompositeObjectPool}.
+ *
+ * @author Sandy McArthur
+ * @version $Revision$ $Date$
+ */
+public class TestCompositeKeyedObjectPool extends TestKeyedObjectPool {
+ public TestCompositeKeyedObjectPool(final String name) {
+ super(name);
+ }
+
+ public static Test suite() {
+ return new TestSuite(TestCompositeKeyedObjectPool.class);
+ }
+
+ protected KeyedObjectPool makeEmptyPool(final KeyedPoolableObjectFactory factory) {
+ final CompositeKeyedObjectPoolFactory ckopf = new CompositeKeyedObjectPoolFactory(factory);
+ return ckopf.createPool();
+ }
+
+ public void testConstructors() {
+ try {
+ new CompositeKeyedObjectPool(null);
+ } catch (IllegalArgumentException iae) {
+ // expected
+ }
+ }
+
+ public void testSetFactory() {
+ final KeyedObjectPool pool;
+ try {
+ pool = makeEmptyPool(new FailingKeyedPoolableObjectFactory());
+ } catch (UnsupportedOperationException uoe) {
+ return;
+ }
+ try {
+ pool.setFactory(new FailingKeyedPoolableObjectFactory());
+ fail("Expected setFactory to throw an UnsupportedOperationException.");
+ } catch (UnsupportedOperationException uoe) {
+ // expected
+ }
+ }
+}
Propchange: jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/composite/TestCompositeKeyedObjectPool.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/composite/TestCompositeKeyedObjectPool.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Added: jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/composite/TestCompositeKeyedObjectPool2.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/composite/TestCompositeKeyedObjectPool2.java?rev=389997&view=auto
==============================================================================
--- jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/composite/TestCompositeKeyedObjectPool2.java (added)
+++ jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/composite/TestCompositeKeyedObjectPool2.java Wed Mar 29 21:44:13 2006
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.pool.composite;
+
+import org.apache.commons.pool.TestKeyedObjectPool;
+import org.apache.commons.pool.KeyedObjectPool;
+import org.apache.commons.pool.KeyedPoolableObjectFactory;
+import org.apache.commons.pool.MethodCallPoolableObjectFactory;
+import org.apache.commons.pool.ObjectPool;
+import org.apache.commons.pool.PoolUtils;
+import org.apache.commons.pool.impl.GenericObjectPoolFactory;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * Tests for {@link CompositeKeyedObjectPool}
+ * when backed by a generic {@link ObjectPool} implementation.
+ *
+ * @author Sandy McArthur
+ * @version $Revision$ $Date$
+ */
+public class TestCompositeKeyedObjectPool2 extends TestCompositeKeyedObjectPool {
+ public TestCompositeKeyedObjectPool2(final String name) {
+ super(name);
+ }
+
+ public static Test suite() {
+ return new TestSuite(TestCompositeKeyedObjectPool2.class);
+ }
+
+ protected KeyedObjectPool makeEmptyPool(final KeyedPoolableObjectFactory factory) {
+ return CompositeKeyedObjectPoolFactory.createPool(new GenericObjectPoolFactory(PoolUtils.adapt(factory, KEY)));
+ }
+
+ public void testConstructors() {
+ new CompositeKeyedObjectPool(new GenericObjectPoolFactory(new MethodCallPoolableObjectFactory()));
+ }
+}
Propchange: jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/composite/TestCompositeKeyedObjectPool2.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/composite/TestCompositeKeyedObjectPool2.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Modified: jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/composite/TestCompositeObjectPool.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/composite/TestCompositeObjectPool.java?rev=389997&r1=389996&r2=389997&view=diff
==============================================================================
--- jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/composite/TestCompositeObjectPool.java (original)
+++ jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/composite/TestCompositeObjectPool.java Wed Mar 29 21:44:13 2006
@@ -52,9 +52,11 @@
}
public void setUp() throws Exception {
+ super.setUp();
}
public void tearDown() throws Exception {
+ super.tearDown();
if (pool != null) {
pool.close();
pool = null;
Modified: jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/composite/TestWaitLimitManager.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/composite/TestWaitLimitManager.java?rev=389997&r1=389996&r2=389997&view=diff
==============================================================================
--- jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/composite/TestWaitLimitManager.java (original)
+++ jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/composite/TestWaitLimitManager.java Wed Mar 29 21:44:13 2006
@@ -34,7 +34,7 @@
* Because {@link System#currentTimeMillis()} or {@link Object#wait} aren't perfectly granular,
* allow a little leeway.
*/
- private static long FUZZ = 5L;
+ private static long FUZZ = 10L;
/**
* Constructs a test case with the given name.
Modified: jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/impl/TestGenericKeyedObjectPool.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/impl/TestGenericKeyedObjectPool.java?rev=389997&r1=389996&r2=389997&view=diff
==============================================================================
--- jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/impl/TestGenericKeyedObjectPool.java (original)
+++ jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/impl/TestGenericKeyedObjectPool.java Wed Mar 29 21:44:13 2006
@@ -25,12 +25,13 @@
import org.apache.commons.pool.KeyedObjectPool;
import org.apache.commons.pool.KeyedPoolableObjectFactory;
import org.apache.commons.pool.TestKeyedObjectPool;
+import org.apache.commons.pool.TestBaseKeyedObjectPool;
/**
* @author Rodney Waldhoff
* @version $Revision$ $Date$
*/
-public class TestGenericKeyedObjectPool extends TestKeyedObjectPool {
+public class TestGenericKeyedObjectPool extends TestBaseKeyedObjectPool {
public TestGenericKeyedObjectPool(String testName) {
super(testName);
}
@@ -539,7 +540,7 @@
try { Thread.sleep(150L); } catch(Exception e) { }
assertTrue("Should be 10 idle, found " + pool.getNumIdle(),pool.getNumIdle() == 10);
}
-
+
public void testMinIdleNoPopulateImmediately() throws Exception {
pool.setMaxIdle(500);
pool.setMinIdle(5);
@@ -552,15 +553,15 @@
//Generate a random key
String key = "A";
-
+
pool.preparePool(key, false);
-
+
assertTrue("Should be 0 idle, found " + pool.getNumIdle(),pool.getNumIdle() == 0);
-
+
try { Thread.sleep(1500L); } catch(Exception e) { }
assertTrue("Should be 5 idle, found " + pool.getNumIdle(),pool.getNumIdle() == 5);
}
-
+
public void testMinIdleNoPreparePool() throws Exception {
pool.setMaxIdle(500);
pool.setMinIdle(5);
@@ -583,7 +584,7 @@
try { Thread.sleep(150L); } catch(Exception e) { }
assertTrue("Should be 5 idle, found " + pool.getNumIdle(),pool.getNumIdle() == 5);
}
-
+
public void testFIFO() throws Exception {
final Object key = "key";
pool.addObject(key); // "key0"
Modified: jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/impl/TestStackKeyedObjectPool.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/impl/TestStackKeyedObjectPool.java?rev=389997&r1=389996&r2=389997&view=diff
==============================================================================
--- jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/impl/TestStackKeyedObjectPool.java (original)
+++ jakarta/commons/proper/pool/trunk/src/test/org/apache/commons/pool/impl/TestStackKeyedObjectPool.java Wed Mar 29 21:44:13 2006
@@ -26,12 +26,13 @@
import org.apache.commons.pool.KeyedObjectPool;
import org.apache.commons.pool.KeyedPoolableObjectFactory;
import org.apache.commons.pool.TestKeyedObjectPool;
+import org.apache.commons.pool.TestBaseKeyedObjectPool;
/**
* @author Rodney Waldhoff
* @version $Revision$ $Date$
*/
-public class TestStackKeyedObjectPool extends TestKeyedObjectPool {
+public class TestStackKeyedObjectPool extends TestBaseKeyedObjectPool {
public TestStackKeyedObjectPool(String testName) {
super(testName);
}
@@ -52,7 +53,7 @@
protected Object getNthObject(Object key, int n) {
return String.valueOf(key) + String.valueOf(n);
}
-
+
protected Object makeKey(int n) {
return String.valueOf(n);
}
@@ -73,7 +74,7 @@
);
}
-
+
public void tearDown() throws Exception {
super.tearDown();
pool = null;
@@ -116,7 +117,7 @@
assertEquals((i < 8 ? i+1 : 8),pool.getNumIdle(""));
}
}
-
+
public void testPoolWithNullFactory() throws Exception {
KeyedObjectPool pool = new StackKeyedObjectPool(10);
for(int i=0;i<10;i++) {
@@ -137,10 +138,10 @@
}
pool.invalidateObject("X",pool.borrowObject("X"));
pool.invalidateObject("X",pool.borrowObject("X"));
- pool.clear("X");
- pool.clear();
+ pool.clear("X");
+ pool.clear();
}
-
+
public void testVariousConstructors() throws Exception {
{
StackKeyedObjectPool pool = new StackKeyedObjectPool();
@@ -167,7 +168,7 @@
assertNotNull(pool);
}
}
-
+
public void testToString() throws Exception {
StackKeyedObjectPool pool = new StackKeyedObjectPool(new SimpleFactory());
assertNotNull(pool.toString());
@@ -176,7 +177,7 @@
pool.returnObject("key",obj);
assertNotNull(pool.toString());
}
-
+
public void testBorrowFromEmptyPoolWithNullFactory() throws Exception {
KeyedObjectPool pool = new StackKeyedObjectPool();
try {
@@ -186,7 +187,7 @@
// expected
}
}
-
+
public void testSetFactory() throws Exception {
KeyedObjectPool pool = new StackKeyedObjectPool();
try {
@@ -212,20 +213,20 @@
fail("Expected IllegalStateException");
} catch(IllegalStateException e) {
// expected
- }
+ }
}
-
+
public void testCanResetFactoryWithoutActiveObjects() throws Exception {
KeyedObjectPool pool = new StackKeyedObjectPool();
{
pool.setFactory(new SimpleFactory());
- Object obj = pool.borrowObject("x");
+ Object obj = pool.borrowObject("x");
assertNotNull(obj);
pool.returnObject("x",obj);
}
{
pool.setFactory(new SimpleFactory());
- Object obj = pool.borrowObject("x");
+ Object obj = pool.borrowObject("x");
assertNotNull(obj);
pool.returnObject("x",obj);
}
@@ -245,7 +246,7 @@
}
}
public void activateObject(Object key, Object obj) { }
- public void passivateObject(Object key, Object obj) {
+ public void passivateObject(Object key, Object obj) {
if(obj instanceof Integer) {
if((((Integer)obj).intValue() % 3) == 0) {
throw new RuntimeException("Couldn't passivate");
@@ -266,17 +267,17 @@
}
assertEquals(6,pool.getNumIdle("key"));
}
-
+
class SimpleFactory implements KeyedPoolableObjectFactory {
HashMap map = new HashMap();
- public Object makeObject(Object key) {
+ public Object makeObject(Object key) {
int counter = 0;
Integer Counter = (Integer)(map.get(key));
if(null != Counter) {
counter = Counter.intValue();
}
- map.put(key,new Integer(counter + 1));
- return String.valueOf(key) + String.valueOf(counter);
+ map.put(key,new Integer(counter + 1));
+ return String.valueOf(key) + String.valueOf(counter);
}
public void destroyObject(Object key, Object obj) { }
public boolean validateObject(Object key, Object obj) { return true; }
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org