001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the "License");
007 * you may not use this file except in compliance with the License.
008 * You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018 /*
019 * $Id: ObjectPool.java 475981 2006-11-16 23:35:53Z minchau $
020 */
021 package org.apache.xml.utils;
022
023 import java.util.ArrayList;
024
025 import org.apache.xml.res.XMLErrorResources;
026 import org.apache.xml.res.XMLMessages;
027
028
029 /**
030 * Pool of object of a given type to pick from to help memory usage
031 * @xsl.usage internal
032 */
033 public class ObjectPool implements java.io.Serializable
034 {
035 static final long serialVersionUID = -8519013691660936643L;
036
037 /** Type of objects in this pool.
038 * @serial */
039 private final Class objectType;
040
041 /** Stack of given objects this points to.
042 * @serial */
043 private final ArrayList freeStack;
044
045 /**
046 * Constructor ObjectPool
047 *
048 * @param type Type of objects for this pool
049 */
050 public ObjectPool(Class type)
051 {
052 objectType = type;
053 freeStack = new ArrayList();
054 }
055
056 /**
057 * Constructor ObjectPool
058 *
059 * @param className Fully qualified name of the type of objects for this pool.
060 */
061 public ObjectPool(String className)
062 {
063 try
064 {
065 objectType = ObjectFactory.findProviderClass(
066 className, ObjectFactory.findClassLoader(), true);
067 }
068 catch(ClassNotFoundException cnfe)
069 {
070 throw new WrappedRuntimeException(cnfe);
071 }
072 freeStack = new ArrayList();
073 }
074
075
076 /**
077 * Constructor ObjectPool
078 *
079 *
080 * @param type Type of objects for this pool
081 * @param size Size of vector to allocate
082 */
083 public ObjectPool(Class type, int size)
084 {
085 objectType = type;
086 freeStack = new ArrayList(size);
087 }
088
089 /**
090 * Constructor ObjectPool
091 *
092 */
093 public ObjectPool()
094 {
095 objectType = null;
096 freeStack = new ArrayList();
097 }
098
099 /**
100 * Get an instance of the given object in this pool if available
101 *
102 *
103 * @return an instance of the given object if available or null
104 */
105 public synchronized Object getInstanceIfFree()
106 {
107
108 // Check if the pool is empty.
109 if (!freeStack.isEmpty())
110 {
111
112 // Remove object from end of free pool.
113 Object result = freeStack.remove(freeStack.size() - 1);
114 return result;
115 }
116
117 return null;
118 }
119
120 /**
121 * Get an instance of the given object in this pool
122 *
123 *
124 * @return An instance of the given object
125 */
126 public synchronized Object getInstance()
127 {
128
129 // Check if the pool is empty.
130 if (freeStack.isEmpty())
131 {
132
133 // Create a new object if so.
134 try
135 {
136 return objectType.newInstance();
137 }
138 catch (InstantiationException ex){}
139 catch (IllegalAccessException ex){}
140
141 // Throw unchecked exception for error in pool configuration.
142 throw new RuntimeException(XMLMessages.createXMLMessage(XMLErrorResources.ER_EXCEPTION_CREATING_POOL, null)); //"exception creating new instance for pool");
143 }
144 else
145 {
146
147 // Remove object from end of free pool.
148 Object result = freeStack.remove(freeStack.size() - 1);
149
150 return result;
151 }
152 }
153
154 /**
155 * Add an instance of the given object to the pool
156 *
157 *
158 * @param obj Object to add.
159 */
160 public synchronized void freeInstance(Object obj)
161 {
162
163 // Make sure the object is of the correct type.
164 // Remove safety. -sb
165 // if (objectType.isInstance(obj))
166 // {
167 freeStack.add(obj);
168 // }
169 // else
170 // {
171 // throw new IllegalArgumentException("argument type invalid for pool");
172 // }
173 }
174 }