Additional Code is Available for this Article

Listing 1

<ResourceParams name="jdbc/TestDB">
 <parameter>
   <name>factory</name>
   <value>
org.apache.commons.dbcp.BasicDataSourceFactory
   </value>
 </parameter>
 <parameter>
  <name>url</name>
  <value>jdbc:postgresql://localhost/db</value>
 </parameter>
 <parameter>
  <name>driverClassName</name>
  <value>org.postgresql.Driver</value>
 </parameter>
 <parameter>
  <name>username</name>
  <value>postgres_user</value>
 </parameter>
 <parameter>
  <name>password</name>
  <value>postgres_pass</value>
 </parameter>
</ResourceParams>


Listing 2
DataSource
  ds = (DataSource)ctx.lookup("java:comp/env/jdbc/SpiderMan");

org.apache.tomcat.dbcp.dbcp.BasicDataSource
  bds = (org.apache.tomcat.dbcp.dbcp.BasicDataSource)ds;

bds.setUsername("MyUsername");
bds.setPassword("MyPassword");

return bds.getConnection();

LISTING 3

package org.moss.jdj.dbcp;

import java.util.Enumeration;
import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.Name;
import javax.naming.RefAddr;
import javax.naming.Reference;
import javax.naming.StringRefAddr;

import org.apache.commons.dbcp.BasicDataSourceFactory;
import org.moss.jdj.codec.Base64Coder;

public class EncryptedDataSourceFactory extends BasicDataSourceFactory
{

  public Object getObjectInstance(
    Object obj, Name name, Context nameCtx, Hashtable environment)
  throws Exception
  {
    if (obj instanceof Reference) {
      setUsername((Reference) obj);
      setPassword((Reference) obj);
    }
    return super.getObjectInstance(obj, name, nameCtx, environment);
  }

  private void setUsername(Reference ref) throws Exception {
    findDecryptAndReplace("username", ref);
  }

  private void setPassword(Reference ref) throws Exception {
    findDecryptAndReplace("password", ref);
  }

  private void findDecryptAndReplace(String refType, Reference ref)
  throws Exception {
    int idx = find(refType, ref);
    String decrypted = decrypt(idx, ref);
    replace(idx, refType, decrypted, ref);
  }

  private void replace(int idx, String refType, String newValue, Reference ref)
  throws Exception {
    ref.remove(idx);
    ref.add(idx, new StringRefAddr(refType, newValue));
  }

  private String decrypt(int idx, Reference ref) throws Exception {
    return Base64Coder.decode(ref.get(idx).getContent().toString());
  }

  private int find(String addrType, Reference ref) throws Exception {
    Enumeration enu = ref.getAll();
    for (int i = 0; enu.hasMoreElements(); i++) {
      RefAddr addr = (RefAddr) enu.nextElement();
      if (addr.getType().compareTo(addrType) == 0) {
        return i;
      }
    }
    throw new Exception("The \"" + addrType
        + "\" name/value pair was not found"
        + " in the Reference object. The reference Object is" + " "
        + ref.toString());
  }
}

Additional Code is Available for this Article