1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one 3 * or more contributor license agreements. See the NOTICE file 4 * distributed with this work for additional information 5 * regarding copyright ownership. The ASF licenses this file 6 * to you under the Apache License, Version 2.0 (the "License"); 7 * you may not use this file except in compliance with the License. 8 * You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, software 13 * distributed under the License is distributed on an "AS IS" BASIS, 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 * See the License for the specific language governing permissions and 16 * limitations under the License. 17 */ 18 /* 19 * $Id: IteratorPool.java 475981 2006-11-16 23:35:53Z minchau $ 20 */ 21 package org.apache.xpath.axes; 22 23 import java.util.ArrayList; 24 25 import org.apache.xml.dtm.DTMIterator; 26 import org.apache.xml.utils.WrappedRuntimeException; 27 28 /** 29 * Pool of object of a given type to pick from to help memory usage 30 * @xsl.usage internal 31 */ 32 public final class IteratorPool implements java.io.Serializable 33 { 34 static final long serialVersionUID = -460927331149566998L; 35 36 /** 37 * Type of objects in this pool. 38 */ 39 private final DTMIterator m_orig; 40 41 /** 42 * Stack of given objects this points to. 43 */ 44 private final ArrayList m_freeStack; 45 46 /** 47 * Constructor IteratorPool 48 * 49 * @param original The original iterator from which all others will be cloned. 50 */ IteratorPool(DTMIterator original)51 public IteratorPool(DTMIterator original) 52 { 53 m_orig = original; 54 m_freeStack = new ArrayList(); 55 } 56 57 /** 58 * Get an instance of the given object in this pool 59 * 60 * @return An instance of the given object 61 */ getInstanceOrThrow()62 public synchronized DTMIterator getInstanceOrThrow() 63 throws CloneNotSupportedException 64 { 65 // Check if the pool is empty. 66 if (m_freeStack.isEmpty()) 67 { 68 69 // Create a new object if so. 70 return (DTMIterator)m_orig.clone(); 71 } 72 else 73 { 74 // Remove object from end of free pool. 75 DTMIterator result = (DTMIterator)m_freeStack.remove(m_freeStack.size() - 1); 76 return result; 77 } 78 } 79 80 /** 81 * Get an instance of the given object in this pool 82 * 83 * @return An instance of the given object 84 */ getInstance()85 public synchronized DTMIterator getInstance() 86 { 87 // Check if the pool is empty. 88 if (m_freeStack.isEmpty()) 89 { 90 91 // Create a new object if so. 92 try 93 { 94 return (DTMIterator)m_orig.clone(); 95 } 96 catch (Exception ex) 97 { 98 throw new WrappedRuntimeException(ex); 99 } 100 } 101 else 102 { 103 // Remove object from end of free pool. 104 DTMIterator result = (DTMIterator)m_freeStack.remove(m_freeStack.size() - 1); 105 return result; 106 } 107 } 108 109 /** 110 * Add an instance of the given object to the pool 111 * 112 * 113 * @param obj Object to add. 114 */ freeInstance(DTMIterator obj)115 public synchronized void freeInstance(DTMIterator obj) 116 { 117 m_freeStack.add(obj); 118 } 119 } 120