You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by ps...@apache.org on 2005/05/29 22:26:12 UTC
svn commit: r178982 - in /jakarta/commons/proper/math/trunk: ./
src/java/org/apache/commons/math/linear/
src/test/org/apache/commons/math/linear/ xdocs/
Author: psteitz
Date: Sun May 29 13:26:11 2005
New Revision: 178982
URL: http://svn.apache.org/viewcvs?rev=178982&view=rev
Log:
Added setSubMatrix methods to RealMatrix, BigMatrix.
Modified copyIn methods to use setSubMatrix and moved array argument checking
from constructors and copyIn to setSubMatrix.
PR # 35007
Base implementation contributed by Rodrigo di Lorenzo Lopes
Modified:
jakarta/commons/proper/math/trunk/project.xml
jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/linear/BigMatrix.java
jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/linear/BigMatrixImpl.java
jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/linear/RealMatrix.java
jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/linear/RealMatrixImpl.java
jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/linear/BigMatrixImplTest.java
jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/linear/RealMatrixImplTest.java
jakarta/commons/proper/math/trunk/xdocs/changes.xml
Modified: jakarta/commons/proper/math/trunk/project.xml
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/math/trunk/project.xml?rev=178982&r1=178981&r2=178982&view=diff
==============================================================================
--- jakarta/commons/proper/math/trunk/project.xml (original)
+++ jakarta/commons/proper/math/trunk/project.xml Sun May 29 13:26:11 2005
@@ -121,6 +121,9 @@
<name>C. Scott Ananian</name>
</contributor>
<contributor>
+ <name>Rodrigo di Lorenzo Lopes</name>
+ </contributor>
+ <contributor>
<name>Ken Geis</name>
</contributor>
<contributor>
Modified: jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/linear/BigMatrix.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/linear/BigMatrix.java?rev=178982&r1=178981&r2=178982&view=diff
==============================================================================
--- jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/linear/BigMatrix.java (original)
+++ jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/linear/BigMatrix.java Sun May 29 13:26:11 2005
@@ -146,6 +146,34 @@
throws MatrixIndexException;
/**
+ * Replace the submatrix starting at <code>row, column</code> using data in
+ * the input <code>subMatrix</code> array. Indexes are 0-based.
+ * <p>
+ * Example:<br>
+ * Starting with <pre>
+ * 1 2 3 4
+ * 5 6 7 8
+ * 9 0 1 2
+ * </pre>
+ * and <code>subMatrix = {{3, 4} {5,6}}</code>, invoking
+ * <code>setSubMatrix(subMatrix,1,1))</code> will result in <pre>
+ * 1 2 3 4
+ * 5 3 4 8
+ * 9 5 6 2
+ * </pre>
+ *
+ * @param subMatrix array containing the submatrix replacement data
+ * @param row row coordinate of the top, left element to be replaced
+ * @param column column coordinate of the top, left element to be replaced
+ * @throws MatrixIndexException if subMatrix does not fit into this
+ * matrix from element in (row, column)
+ * @throws IllegalArgumentException if <code>subMatrix</code> is not rectangular
+ * (not all rows have the same length) or empty
+ * @throws NullPointerException if <code>subMatrix</code> is null
+ */
+ public void setSubMatrix(BigDecimal subMatrix[][], int row, int column) throws MatrixIndexException;
+
+ /**
* Returns the entries in row number <code>row</code>
* as a row matrix. Row indices start at 0.
*
Modified: jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/linear/BigMatrixImpl.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/linear/BigMatrixImpl.java?rev=178982&r1=178981&r2=178982&view=diff
==============================================================================
--- jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/linear/BigMatrixImpl.java (original)
+++ jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/linear/BigMatrixImpl.java Sun May 29 13:26:11 2005
@@ -113,22 +113,6 @@
* @throws NullPointerException if <code>d</code> is null
*/
public BigMatrixImpl(BigDecimal[][] d) {
- int nRows = d.length;
- if (nRows == 0) {
- throw new IllegalArgumentException(
- "Matrix must have at least one row.");
- }
- int nCols = d[0].length;
- if (nCols == 0) {
- throw new IllegalArgumentException(
- "Matrix must have at least one column.");
- }
- for (int row = 1; row < nRows; row++) {
- if (d[row].length != nCols) {
- throw new IllegalArgumentException(
- "All input rows must have the same length.");
- }
- }
this.copyIn(d);
lu = null;
}
@@ -504,6 +488,70 @@
}
/**
+ * Replace the submatrix starting at <code>row, column</code> using data in
+ * the input <code>subMatrix</code> array. Indexes are 0-based.
+ * <p>
+ * Example:<br>
+ * Starting with <pre>
+ * 1 2 3 4
+ * 5 6 7 8
+ * 9 0 1 2
+ * </pre>
+ * and <code>subMatrix = {{3, 4} {5,6}}</code>, invoking
+ * <code>setSubMatrix(subMatrix,1,1))</code> will result in <pre>
+ * 1 2 3 4
+ * 5 3 4 8
+ * 9 5 6 2
+ * </pre>
+ *
+ * @param subMatrix array containing the submatrix replacement data
+ * @param row row coordinate of the top, left element to be replaced
+ * @param column column coordinate of the top, left element to be replaced
+ * @throws MatrixIndexException if subMatrix does not fit into this
+ * matrix from element in (row, column)
+ * @throws IllegalArgumentException if <code>subMatrix</code> is not rectangular
+ * (not all rows have the same length) or empty
+ * @throws NullPointerException if <code>subMatrix</code> is null
+ */
+ public void setSubMatrix(BigDecimal[][] subMatrix, int row, int column)
+ throws MatrixIndexException {
+ if ((row < 0) || (column < 0)){
+ throw new MatrixIndexException
+ ("invalid row or column index selection");
+ }
+ int nRows = subMatrix.length;
+ if (nRows == 0) {
+ throw new IllegalArgumentException(
+ "Matrix must have at least one row.");
+ }
+ int nCols = subMatrix[0].length;
+ if (nCols == 0) {
+ throw new IllegalArgumentException(
+ "Matrix must have at least one column.");
+ }
+ for (int r = 1; r < nRows; r++) {
+ if (subMatrix[r].length != nCols) {
+ throw new IllegalArgumentException(
+ "All input rows must have the same length.");
+ }
+ }
+ if (data == null) {
+ if ((row > 0)||(column > 0)) throw new MatrixIndexException
+ ("matrix must be initialized to perfom this method");
+ data = new BigDecimal[nRows][nCols];
+ System.arraycopy(subMatrix, 0, data, 0, subMatrix.length);
+ }
+ if (((nRows + row) > this.getRowDimension())
+ || (nCols + column > this.getColumnDimension()))
+ throw new MatrixIndexException(
+ "invalid row or column index selection");
+ for (int i = 0; i < nRows; i++) {
+ System.arraycopy(subMatrix[i], 0, data[row + i], column, nCols);
+ }
+ lu = null;
+ }
+
+ /**
* Returns the entries in row number <code>row</code>
* as a row matrix. Row indices start at 0.
*
@@ -1205,18 +1253,16 @@
/**
* Replaces data with a fresh copy of the input array.
+ * <p>
+ * Verifies that the input array is rectangular and non-empty.
*
* @param in data to copy in
+ * @throws IllegalArgumentException if input array is emtpy or not
+ * rectangular
+ * @throws NullPointerException if input array is null
*/
private void copyIn(BigDecimal[][] in) {
- int nRows = in.length;
- int nCols = in[0].length;
- data = new BigDecimal[nRows][nCols];
- System.arraycopy(in, 0, data, 0, in.length);
- for (int i = 0; i < nRows; i++) {
- System.arraycopy(in[i], 0, data[i], 0, nCols);
- }
- lu = null;
+ setSubMatrix(in,0,0);
}
/**
Modified: jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/linear/RealMatrix.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/linear/RealMatrix.java?rev=178982&r1=178981&r2=178982&view=diff
==============================================================================
--- jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/linear/RealMatrix.java (original)
+++ jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/linear/RealMatrix.java Sun May 29 13:26:11 2005
@@ -1,5 +1,5 @@
/*
- * Copyright 2003-2004 The Apache Software Foundation.
+ * Copyright 2003-2005 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.
@@ -25,7 +25,6 @@
* @version $Revision$ $Date$
*/
public interface RealMatrix {
-
/**
* Returns a (deep) copy of this.
*
@@ -128,6 +127,35 @@
*/
RealMatrix getSubMatrix(int[] selectedRows, int[] selectedColumns)
throws MatrixIndexException;
+
+ /**
+ * Replace the submatrix starting at <code>row, column</code> using data in
+ * the input <code>subMatrix</code> array. Indexes are 0-based.
+ * <p>
+ * Example:<br>
+ * Starting with <pre>
+ * 1 2 3 4
+ * 5 6 7 8
+ * 9 0 1 2
+ * </pre>
+ * and <code>subMatrix = {{3, 4} {5,6}}</code>, invoking
+ * <code>setSubMatrix(subMatrix,1,1))</code> will result in <pre>
+ * 1 2 3 4
+ * 5 3 4 8
+ * 9 5 6 2
+ * </pre>
+ *
+ * @param subMatrix array containing the submatrix replacement data
+ * @param row row coordinate of the top, left element to be replaced
+ * @param column column coordinate of the top, left element to be replaced
+ * @throws MatrixIndexException if subMatrix does not fit into this
+ * matrix from element in (row, column)
+ * @throws IllegalArgumentException if <code>subMatrix</code> is not rectangular
+ * (not all rows have the same length) or empty
+ * @throws NullPointerException if <code>subMatrix</code> is null
+ */
+ public void setSubMatrix(double subMatrix[][], int row, int column) throws MatrixIndexException;
+
/**
* Returns the entries in row number <code>row</code>
Modified: jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/linear/RealMatrixImpl.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/linear/RealMatrixImpl.java?rev=178982&r1=178981&r2=178982&view=diff
==============================================================================
--- jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/linear/RealMatrixImpl.java (original)
+++ jakarta/commons/proper/math/trunk/src/java/org/apache/commons/math/linear/RealMatrixImpl.java Sun May 29 13:26:11 2005
@@ -1,5 +1,5 @@
/*
- * Copyright 2003-2004 The Apache Software Foundation.
+ * Copyright 2003-2005 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.
@@ -104,22 +104,6 @@
* @throws NullPointerException if <code>data</code> is null
*/
public RealMatrixImpl(double[][] d) {
- int nRows = d.length;
- if (nRows == 0) {
- throw new IllegalArgumentException(
- "Matrix must have at least one row.");
- }
- int nCols = d[0].length;
- if (nCols == 0) {
- throw new IllegalArgumentException(
- "Matrix must have at least one column.");
- }
- for (int row = 1; row < nRows; row++) {
- if (d[row].length != nCols) {
- throw new IllegalArgumentException(
- "All input rows must have the same length.");
- }
- }
this.copyIn(d);
lu = null;
}
@@ -371,12 +355,76 @@
}
return subMatrix;
}
+
+ /**
+ * Replace the submatrix starting at <code>row, column</code> using data in
+ * the input <code>subMatrix</code> array. Indexes are 0-based.
+ * <p>
+ * Example:<br>
+ * Starting with <pre>
+ * 1 2 3 4
+ * 5 6 7 8
+ * 9 0 1 2
+ * </pre>
+ * and <code>subMatrix = {{3, 4} {5,6}}</code>, invoking
+ * <code>setSubMatrix(subMatrix,1,1))</code> will result in <pre>
+ * 1 2 3 4
+ * 5 3 4 8
+ * 9 5 6 2
+ * </pre>
+ *
+ * @param subMatrix array containing the submatrix replacement data
+ * @param row row coordinate of the top, left element to be replaced
+ * @param column column coordinate of the top, left element to be replaced
+ * @throws MatrixIndexException if subMatrix does not fit into this
+ * matrix from element in (row, column)
+ * @throws IllegalArgumentException if <code>subMatrix</code> is not rectangular
+ * (not all rows have the same length) or empty
+ * @throws NullPointerException if <code>subMatrix</code> is null
+ */
+ public void setSubMatrix(double[][] subMatrix, int row, int column)
+ throws MatrixIndexException {
+ if ((row < 0) || (column < 0)){
+ throw new MatrixIndexException
+ ("invalid row or column index selection");
+ }
+ int nRows = subMatrix.length;
+ if (nRows == 0) {
+ throw new IllegalArgumentException(
+ "Matrix must have at least one row.");
+ }
+ int nCols = subMatrix[0].length;
+ if (nCols == 0) {
+ throw new IllegalArgumentException(
+ "Matrix must have at least one column.");
+ }
+ for (int r = 1; r < nRows; r++) {
+ if (subMatrix[r].length != nCols) {
+ throw new IllegalArgumentException(
+ "All input rows must have the same length.");
+ }
+ }
+ if (data == null) {
+ if ((row > 0)||(column > 0)) throw new MatrixIndexException
+ ("matrix must be initialized to perfom this method");
+ data = new double[nRows][nCols];
+ System.arraycopy(subMatrix, 0, data, 0, subMatrix.length);
+ }
+ if (((nRows + row) > this.getRowDimension())
+ || (nCols + column > this.getColumnDimension()))
+ throw new MatrixIndexException(
+ "invalid row or column index selection");
+ for (int i = 0; i < nRows; i++) {
+ System.arraycopy(subMatrix[i], 0, data[row + i], column, nCols);
+ }
+ lu = null;
+ }
/**
- * Returns the entries in row number <code>row</code>
- * as a row matrix. Row indices start at 0.
- *
- * @param row the row to be fetched
+ * Returns the entries in row number <code>row</code> as a row matrix.
+ * Row indices start at 0.
+ *
+ * @param row the row to be fetched
* @return row matrix
* @throws MatrixIndexException if the specified row index is invalid
*/
@@ -955,18 +1003,16 @@
/**
* Replaces data with a fresh copy of the input array.
+ * <p>
+ * Verifies that the input array is rectangular and non-empty
*
* @param in data to copy in
+ * @throws IllegalArgumentException if input array is emtpy or not
+ * rectangular
+ * @throws NullPointerException if input array is null
*/
private void copyIn(double[][] in) {
- int nRows = in.length;
- int nCols = in[0].length;
- data = new double[nRows][nCols];
- System.arraycopy(in, 0, data, 0, in.length);
- for (int i = 0; i < nRows; i++) {
- System.arraycopy(in[i], 0, data[i], 0, nCols);
- }
- lu = null;
+ setSubMatrix(in,0,0);
}
/**
Modified: jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/linear/BigMatrixImplTest.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/linear/BigMatrixImplTest.java?rev=178982&r1=178981&r2=178982&view=diff
==============================================================================
--- jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/linear/BigMatrixImplTest.java (original)
+++ jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/linear/BigMatrixImplTest.java Sun May 29 13:26:11 2005
@@ -1,5 +1,5 @@
/*
- * Copyright 2004 The Apache Software Foundation.
+ * Copyright 2004-2005 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.
@@ -634,6 +634,75 @@
m = new BigMatrixImpl();
assertEquals("BigMatrixImpl{}",
m.toString());
+ }
+
+ public void testSetSubMatrix() throws Exception {
+ BigDecimal[][] detData3 =
+ MatrixUtils.createBigMatrix(detData2).getData();
+ BigMatrixImpl m = new BigMatrixImpl(testData);
+ m.setSubMatrix(detData3,1,1);
+ BigMatrix expected = MatrixUtils.createBigMatrix
+ (new double[][] {{1.0,2.0,3.0},{2.0,1.0,3.0},{1.0,2.0,4.0}});
+ assertEquals(expected, m);
+
+ m.setSubMatrix(detData3,0,0);
+ expected = MatrixUtils.createBigMatrix
+ (new double[][] {{1.0,3.0,3.0},{2.0,4.0,3.0},{1.0,2.0,4.0}});
+ assertEquals(expected, m);
+
+ BigDecimal[][] testDataPlus3 =
+ MatrixUtils.createBigMatrix(testDataPlus2).getData();
+ m.setSubMatrix(testDataPlus3,0,0);
+ expected = MatrixUtils.createBigMatrix
+ (new double[][] {{3.0,4.0,5.0},{4.0,7.0,5.0},{3.0,2.0,10.0}});
+ assertEquals(expected, m);
+
+ // javadoc example
+ BigMatrix matrix = MatrixUtils.createBigMatrix
+ (new double[][] {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 0, 1 , 2}});
+ matrix.setSubMatrix(new BigDecimal[][] {{new BigDecimal(3),
+ new BigDecimal(4)}, {new BigDecimal(5), new BigDecimal(6)}}, 1, 1);
+ expected = MatrixUtils.createBigMatrix
+ (new BigDecimal[][] {{new BigDecimal(1), new BigDecimal(2),
+ new BigDecimal(3), new BigDecimal(4)}, {new BigDecimal(5),
+ new BigDecimal(3), new BigDecimal(4), new BigDecimal(8)},
+ {new BigDecimal(9), new BigDecimal(5) , new BigDecimal(6),
+ new BigDecimal(2)}});
+ assertEquals(expected, matrix);
+
+ // dimension overflow
+ try {
+ m.setSubMatrix(matrix.getData(),1,1);
+ fail("expecting MatrixIndexException");
+ } catch (MatrixIndexException e) {
+ // expected
+ }
+
+ // null
+ try {
+ m.setSubMatrix(null,1,1);
+ fail("expecting NullPointerException");
+ } catch (NullPointerException e) {
+ // expected
+ }
+
+ // ragged
+ try {
+ m.setSubMatrix(new BigDecimal[][] {{new BigDecimal(1)},
+ {new BigDecimal(2), new BigDecimal(3)}}, 0, 0);
+ fail("expecting IllegalArgumentException");
+ } catch (IllegalArgumentException e) {
+ // expected
+ }
+
+ // empty
+ try {
+ m.setSubMatrix(new BigDecimal[][] {{}}, 0, 0);
+ fail("expecting IllegalArgumentException");
+ } catch (IllegalArgumentException e) {
+ // expected
+ }
+
}
//--------------- -----------------Protected methods
Modified: jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/linear/RealMatrixImplTest.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/linear/RealMatrixImplTest.java?rev=178982&r1=178981&r2=178982&view=diff
==============================================================================
--- jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/linear/RealMatrixImplTest.java (original)
+++ jakarta/commons/proper/math/trunk/src/test/org/apache/commons/math/linear/RealMatrixImplTest.java Sun May 29 13:26:11 2005
@@ -1,5 +1,5 @@
/*
- * Copyright 2003-2004 The Apache Software Foundation.
+ * Copyright 2003-2005 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.
@@ -608,6 +608,65 @@
m = new RealMatrixImpl();
assertEquals("RealMatrixImpl{}",
m.toString());
+ }
+
+ public void testSetSubMatrix() throws Exception {
+ RealMatrixImpl m = new RealMatrixImpl(testData);
+ m.setSubMatrix(detData2,1,1);
+ RealMatrix expected = MatrixUtils.createRealMatrix
+ (new double[][] {{1.0,2.0,3.0},{2.0,1.0,3.0},{1.0,2.0,4.0}});
+ assertEquals(expected, m);
+
+ m.setSubMatrix(detData2,0,0);
+ expected = MatrixUtils.createRealMatrix
+ (new double[][] {{1.0,3.0,3.0},{2.0,4.0,3.0},{1.0,2.0,4.0}});
+ assertEquals(expected, m);
+
+ m.setSubMatrix(testDataPlus2,0,0);
+ expected = MatrixUtils.createRealMatrix
+ (new double[][] {{3.0,4.0,5.0},{4.0,7.0,5.0},{3.0,2.0,10.0}});
+ assertEquals(expected, m);
+
+ // javadoc example
+ RealMatrix matrix = MatrixUtils.createRealMatrix
+ (new double[][] {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 0, 1 , 2}});
+ matrix.setSubMatrix(new double[][] {{3, 4}, {5, 6}}, 1, 1);
+ expected = MatrixUtils.createRealMatrix
+ (new double[][] {{1, 2, 3, 4}, {5, 3, 4, 8}, {9, 5 ,6, 2}});
+ assertEquals(expected, matrix);
+
+ // dimension overflow
+ try {
+ m.setSubMatrix(testData,1,1);
+ fail("expecting MatrixIndexException");
+ } catch (MatrixIndexException e) {
+ // expected
+ }
+
+ // null
+ try {
+ m.setSubMatrix(null,1,1);
+ fail("expecting NullPointerException");
+ } catch (NullPointerException e) {
+ // expected
+ }
+
+ // ragged
+ try {
+ m.setSubMatrix(new double[][] {{1}, {2, 3}}, 0, 0);
+ fail("expecting IllegalArgumentException");
+ } catch (IllegalArgumentException e) {
+ // expected
+ }
+
+ // empty
+ try {
+ m.setSubMatrix(new double[][] {{}}, 0, 0);
+ fail("expecting IllegalArgumentException");
+ } catch (IllegalArgumentException e) {
+ // expected
+ }
+
}
//--------------- -----------------Protected methods
Modified: jakarta/commons/proper/math/trunk/xdocs/changes.xml
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/math/trunk/xdocs/changes.xml?rev=178982&r1=178981&r2=178982&view=diff
==============================================================================
--- jakarta/commons/proper/math/trunk/xdocs/changes.xml (original)
+++ jakarta/commons/proper/math/trunk/xdocs/changes.xml Sun May 29 13:26:11 2005
@@ -39,6 +39,9 @@
<body>
<release version="1.1" date="In Development"
description="Jakarta Commons Math 1.1 - Development">
+ <action dev="psteitz" type="update" issue="35007" due-to="Rodrigo di Lorenzo Lopes">
+ Added setSubMatrix methods to RealMatrix, BigMatrix.
+ </action>
<action dev="psteitz" type="update">
Added createXIdentityMatrix methods to MatrixUtils and deprecated
getIdentity methods in RealMatrixImpl, BigMatrixImpl.
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org