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