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]

Reply via email to