Author: jochen
Date: Fri Nov 17 15:15:49 2006
New Revision: 476358
URL: http://svn.apache.org/viewvc?view=rev&rev=476358
Log:
The factory methods of StAXUtils didn't work with Java 6.
PR: WSCOMMONS-127
Submitted-By: Tim Putnam, [EMAIL PROTECTED]
The method StAXUtils.reset() wasn't synchronized and the
factory pool had no upper limit.
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/util/StAXUtils.java
webservices/commons/trunk/modules/axiom/src/changes/changes.xml
Modified:
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/util/StAXUtils.java
URL:
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/util/StAXUtils.java?view=diff&rev=476358&r1=476357&r2=476358
==============================================================================
---
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/util/StAXUtils.java
(original)
+++
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/util/StAXUtils.java
Fri Nov 17 15:15:49 2006
@@ -9,35 +9,92 @@
import java.io.OutputStream;
import java.io.Reader;
import java.io.Writer;
-import java.util.Stack;
+import java.util.ArrayList;
+import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+
public class StAXUtils {
+ private static interface ObjectCreator {
+ Object newObject();
+ }
+
+ private static class Pool {
+ private final int MAX_POOL_SIZE = 100;
+ private final List objects = new ArrayList();
+ private final ObjectCreator objectCreator;
+ Pool(ObjectCreator[] creators) {
+ ObjectCreator oc = null;
+ for (int i = 0; i < creators.length; i++) {
+ try {
+ Object o = creators[i].newObject();
+ oc = creators[i];
+ break;
+ } catch (Throwable t) {
+ // Ignore me
+ }
+ }
+ if (oc == null) {
+ throw new IllegalStateException("No valid
ObjectCreator found.");
+ }
+ objectCreator = oc;
+ }
+ synchronized Object getInstance() {
+ final int size = objects.size();
+ if (size > 0) {
+ return objects.remove(size-1);
+ }
+ return objectCreator.newObject();
+ }
+ synchronized void releaseInstance(Object object) {
+ if (objects.size() < MAX_POOL_SIZE) {
+ objects.add(object);
+ }
+ }
+ synchronized void clear() {
+ objects.clear();
+ }
+ }
+
+ private static final Pool xmlInputFactoryPool = new Pool(new
ObjectCreator[]{
+ new ObjectCreator(){
+ public Object newObject() {
+ return
XMLInputFactory.newInstance("javax.xml.stream.XMLInputFactory",
StAXUtils.class.getClassLoader());
+ }
+ },
+ new ObjectCreator(){
+ public Object newObject() {
+ return XMLInputFactory.newInstance();
+ }
+ }
+ });
+
+ private static final Pool xmlOutputFactoryPool = new Pool(new
ObjectCreator[]{
+ new ObjectCreator(){
+ public Object newObject() {
+ return
XMLOutputFactory.newInstance("javax.xml.stream.XMLOutputFactory",
StAXUtils.class.getClassLoader());
+ }
+ },
+ new ObjectCreator(){
+ public Object newObject() {
+ return XMLOutputFactory.newInstance();
+ }
+ }
+ });
+
private static Log log = LogFactory.getLog(StAXUtils.class);
- /**
- * Pool of XMLOutputFactory instances
- */
- private static Stack xmlOutputFactoryPool = new Stack();
- /**
- * Pool of XMLInputFactory instances
- */
- private static Stack xmlInputFactoryPool = new Stack();
-
- /**
+ /**
* Gets an XMLInputFactory instance from pool.
*
* @return an XMLInputFactory instance.
*/
- synchronized public static XMLInputFactory getXMLInputFactory() {
- if (!xmlInputFactoryPool.empty()) {
- return (XMLInputFactory) xmlInputFactoryPool.pop();
- }
- return XMLInputFactory.newInstance("javax.xml.stream.XMLInputFactory",
StAXUtils.class.getClassLoader());
+ public static XMLInputFactory getXMLInputFactory() {
+ return (XMLInputFactory) xmlInputFactoryPool.getInstance();
}
/**
@@ -45,8 +102,8 @@
*
* @param factory An XMLInputFactory instance that is available for reuse
*/
- synchronized public static void releaseXMLInputFactory(XMLInputFactory
factory) {
- xmlInputFactoryPool.push(factory);
+ public static void releaseXMLInputFactory(XMLInputFactory factory) {
+ xmlInputFactoryPool.releaseInstance(factory);
}
public static XMLStreamReader createXMLStreamReader(InputStream in, String
encoding)
@@ -90,11 +147,8 @@
*
* @return an XMLOutputFactory instance.
*/
- synchronized public static XMLOutputFactory getXMLOutputFactory() {
- if (!xmlOutputFactoryPool.empty()) {
- return (XMLOutputFactory) xmlOutputFactoryPool.pop();
- }
- return
XMLOutputFactory.newInstance("javax.xml.stream.XMLOutputFactory",
StAXUtils.class.getClassLoader());
+ public static XMLOutputFactory getXMLOutputFactory() {
+ return (XMLOutputFactory) xmlOutputFactoryPool.getInstance();
}
/**
@@ -102,8 +156,8 @@
*
* @param factory An XMLOutputFactory instance that is available for reuse.
*/
- synchronized public static void releaseXMLOutputFactory(XMLOutputFactory
factory) {
- xmlOutputFactoryPool.push(factory);
+ public static void releaseXMLOutputFactory(XMLOutputFactory factory) {
+ xmlOutputFactoryPool.releaseInstance(factory);
}
public static XMLStreamWriter createXMLStreamWriter(OutputStream out)
@@ -131,7 +185,7 @@
}
public static void reset() {
- xmlOutputFactoryPool.removeAllElements();
- xmlInputFactoryPool.removeAllElements();
+ xmlOutputFactoryPool.clear();
+ xmlInputFactoryPool.clear();
}
}
Modified: webservices/commons/trunk/modules/axiom/src/changes/changes.xml
URL:
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/src/changes/changes.xml?view=diff&rev=476358&r1=476357&r2=476358
==============================================================================
--- webservices/commons/trunk/modules/axiom/src/changes/changes.xml (original)
+++ webservices/commons/trunk/modules/axiom/src/changes/changes.xml Fri Nov 17
15:15:49 2006
@@ -3,6 +3,17 @@
<title>Changes in Apache Axiom</title>
</properties>
<body>
+ <release version="1.3" date="Not yet released">
+ <action dev="jochen" type="fix" issue="WSCOMMONS-127"
+ due-to="Tim Putnam" due-to-email="[EMAIL PROTECTED]">
+ The factory methods of StAXUtils didn't work with
+ Java 6.
+ </action>
+ <action dev="jochen" type="fix">
+ The method StAXUtils.reset() wasn't synchronized and the
+ factory pool had no upper limit.
+ </action>
+ </release>
<release version="1.1" date="Not yet released">
<action dev="jochen" type="add">
Added support for Maven 2 as the build system.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]