package org.apache.xpath.axes; import java.util.*; import org.apache.xml.dtm.DTMIterator; import org.apache.xml.utils.WrappedRuntimeException; /** * <meta name="usage" content="internal"/> * Pool of object of a given type to pick from to help memory usage */ public class IteratorPool implements java.io.Serializable { /** Type of objects in this pool. * @serial */ private final DTMIterator m_orig; /** Vector of given objects this points to. * @serial */ private final Vector m_freeStack; /** * Constructor IteratorPool * * @param original The original iterator from which all others will be cloned. */ public IteratorPool(DTMIterator original) { m_orig = original; m_freeStack = new Vector(); } /** * Get an instance of the given object in this pool * * @return An instance of the given object */ public synchronized DTMIterator getInstance() { // Check if the pool is empty. if (m_freeStack.isEmpty()) { // Create a new object if so. try { return (DTMIterator)m_orig.clone(); } catch (Exception ex) { throw new WrappedRuntimeException(ex); } } else { // Remove object from end of free pool. DTMIterator result = (DTMIterator)m_freeStack.lastElement(); m_freeStack.setSize(m_freeStack.size() - 1); return result; } } /** * Add an instance of the given object to the pool * * * @param obj Object to add. */ public synchronized void freeInstance(DTMIterator obj) { m_freeStack.addElement(obj); } }