No caso do Oracle, por exemplo, criei a classe abaixo:
public class OracleDriver extends oracle.jdbc.driver.OracleDriver {
static {
try {
java.sql.DriverManager.registerDriver(new OracleDriver());
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
System.out.println("Arcadian Oracle wrapper jdbc driver");
}
private static final String URL_PREFIX="jdbc:arcadian:oracle";
@Override
public Connection connect(String url, Properties info) throws SQLException {
if(url.startsWith(URL_PREFIX)){//senha cryptografada
Util.decryptPassword(info);
return super.connect(url.replace(URL_PREFIX, "jdbc:oracle"), info);
} else {//senha não criptografada
return super.connect(url, info);
}
}
@Override
public boolean acceptsURL(String url) {
if(url == null)
return false;
else
return url.startsWith(URL_PREFIX);
}
}
Dessa forma, o caso o url de acesso jdbc comece com o prefixo "jdbc:arcadian" eu sei que a senha está criptografada e o método Util.decryptPassword é chamado pelo método connect antes do método ancestral ser chamado.
Um datasource que use esse mecanismo deve ficar mais ou menos com o seguinte aspecto:
<resource name="jdbc/previne/datasource" auth="Container"
type="javax.sql.DataSource"
driverClassName="com.arcadian.commons.jdbc.OracleDriver"
url="jdbc:arcadian:oracle:thin:@120.120.126.209:5623:DBACC84C"
username="USER987"
password="ui#ghkuyt%--)(*CFR"
maxActive="10"
maxIdle="30"
maxWait="10000"/>
</resource>
Observe que para obter o mesmo efeito para outros bancos basta substituir a classe ancestral...
Um comentário:
Olá Walter, estou enfrentando um problema parecido com o seu, vou testar sua solução, mas desde já agradeço pela sua ideia! muito criativo.
Postar um comentário