import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.apache.commons.pool.PoolableObjectFactory;
import org.apache.commons.pool.impl.SoftReferenceObjectPool;
import java.util.HashMap;
import java.lang.ref.SoftReference;
public class TestSoftRef extends TestCase {
private SoftReferenceObjectPool pool;
public static TestSuite suite() {
return new TestSuite(TestSoftRef.class);
}
public static void main(String[] args) {
String[] testClassName = { TestSoftRef.class.getName() };
junit.textui.TestRunner.main(testClassName);
}
public TestSoftRef(String s) {
super(s);
}
public void testOutOfMemory() throws Exception {
Object obj = pool.borrowObject();
pool.returnObject(obj);
obj = null;
assertEquals(5, pool.getNumIdle());
try {
HashMap map = new HashMap();
for(int i = 0; i < 1000000; i++) {
map.put(new Integer(i), new String("Fred Flintstone" + i));
}
}catch(OutOfMemoryError ex) {
pool.borrowObject();
pool.borrowObject();
pool.borrowObject();
pool.borrowObject();
pool.borrowObject();
// assertEquals(0, pool.getNumIdle());
}
}
public void setUp() throws Exception {
this.pool = new SoftReferenceObjectPool(new PoolableObjectFactory() {
int counter;
public Object makeObject() { return String.valueOf(counter++); }
public void destroyObject( Object obj ) {}
public boolean validateObject( Object obj ) { return true; }
public void activateObject( Object obj ) {}
public void passivateObject( Object obj ) {}
}, 5);
}
}
-------------------------------------------
import org.apache.commons.pool.BaseKeyedPoolableObjectFactory;
public class SkilledEmployeeFactory extends BaseKeyedPoolableObjectFactory {
public Object makeObject(Object key) {
if(key == null || !(key instanceof String) || ((String)key).length() == 0)
throw new IllegalArgumentException("Invalid key specified");
return new SkilledEmployee(key.toString());
}
/*public boolean validateObject(Object key, Object obj) {
if(obj instanceof Employee) {
if(((Employee)obj).getName() == null)
return true;
}
return false;
}
public void passivateObject(Object obj) throws Exception {
if(obj instanceof Employee) {
((Employee)obj).setName(null);
} else throw new Exception("Unknown object");
}*/
}
---------------------------------------
public class SkilledEmployee extends Employee {
private String skill;
public SkilledEmployee(String skill) {
this.skill = skill;
}
public String getSkill() {
return this.skill;
}
public String toString() {
return getSkill() + " -- " + getName();
}
}
----------------------------------
import org.apache.commons.pool.BasePoolableObjectFactory;
public class EmployeeFactory extends BasePoolableObjectFactory {
public Object makeObject() {
return new Employee();
}
public boolean validateObject(Object obj) {
if(obj instanceof Employee) {
if(((Employee)obj).getName() == null)
return true;
}
return false;
}
public void passivateObject(Object obj) throws Exception {
if(obj instanceof Employee) {
((Employee)obj).setName(null);
} else throw new Exception("Unknown object");
}
}
-------------------------------------
public class Employee {
private static int base = 0;
private int id;
private String name;
public Employee() {
this.id = base++;
}
public int getId() {
return this.id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public void doWork() {
// does nothing
}
public String toString() {
return ("Id: " + this.id + ", Name: " + this.name);
}
public void finalize() {
System.err.println("Employee " + toString() + " made redundant");
}
}
|