package org.opendedup.util; import java.io.IOException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.Security; import java.util.ArrayList; import java.util.concurrent.locks.ReentrantLock; import java.util.logging.Level; import java.util.logging.Logger; import org.bouncycastle.jce.provider.BouncyCastleProvider; public class HashFunctionPool { private int poolSize; private ArrayList<MessageDigest> passiveObjects = new ArrayList<MessageDigest>(); private ArrayList<MessageDigest> activeObjects = new ArrayList<MessageDigest>(); private ReentrantLock plock = new ReentrantLock(); private ReentrantLock alock = new ReentrantLock(); private static Logger log = Logger.getLogger("sdfs"); static { Security.addProvider(new BouncyCastleProvider()); } public HashFunctionPool(int size) { this.poolSize = size; this.populatePool(); } public void populatePool() { for (int i = 0; i < poolSize; i++) { try { plock.lock(); this.passiveObjects.add(this.makeObject()); } catch (Exception e) { plock.unlock(); e.printStackTrace(); log.log(Level.SEVERE, "unable to instancial Hash Function pool", e); } finally { if (plock.isLocked()) plock.unlock(); } } } public void activateObject(MessageDigest hc) { } public boolean validateObject(MessageDigest hc) { return false; } public MessageDigest borrowObject() throws IOException { MessageDigest hc = null; try { plock.lock(); if (this.passiveObjects.size() > 0) { hc = this.passiveObjects.remove(0); } } catch (Exception e) { e.printStackTrace(); throw new IOException("Unable to get object out of pool " + e.toString()); } finally { plock.unlock(); } if (hc == null) { try { hc = makeObject(); } catch (NoSuchAlgorithmException e) { throw new IOException(e); } catch (NoSuchProviderException e) { throw new IOException(e); } } try { this.alock.lock(); this.activeObjects.add(hc); } catch (Exception e) { e.printStackTrace(); throw new IOException("Unable to get object out of pool " + e.toString()); } finally { alock.unlock(); } return hc; } public void returnObject(MessageDigest hc) throws IOException { try { hc.reset(); alock.lock(); this.activeObjects.remove(hc); } catch (Exception e) { alock.unlock(); e.printStackTrace(); throw new IOException("Unable to get object out of pool " + e.toString()); } finally { alock.unlock(); } try { plock.lock(); this.passiveObjects.add(hc); } catch (Exception e) { plock.unlock(); e.printStackTrace(); throw new IOException("Unable to get object out of pool " + e.toString()); } finally { plock.unlock(); } } public MessageDigest makeObject() throws NoSuchAlgorithmException, NoSuchProviderException { MessageDigest hc = MessageDigest.getInstance("Tiger", "BC"); return hc; } public void destroyObject(MessageDigest hc) { hc.reset(); hc = null; } }