SuperX-Kernmodul
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

262 lines
9.9 KiB

package de.memtext.db;
import java.io.File;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SignatureException;
import java.security.spec.InvalidKeySpecException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import javax.xml.transform.TransformerConfigurationException;
import org.apache.commons.dbcp.ConnectionFactory;
import org.apache.commons.dbcp.DriverManagerConnectionFactory;
import org.apache.commons.dbcp.PoolableConnectionFactory;
import org.apache.commons.dbcp.PoolingDriver;
import org.apache.commons.pool.impl.GenericObjectPool;
import de.memtext.baseobjects.NamedObjectI;
import de.memtext.tree.KeyParentEqualException;
import de.memtext.util.DSAHandler;
/**
* A new Connection pool making use of Jakarta Commons dbcp.
*/
public class MemtextPool extends GenericObjectPool implements NamedObjectI {
private String name, subpath;
private String nameNoAppendix;
private Properties props = new Properties();
private String privateKeyEncoded = null;
private String publicKeyEncoded = null;
private DSAHandler dsaHandler;
public MemtextPool(String name, String nameAppendix, String subpath)
throws SQLException, IOException, DBServletException {
this.subpath = subpath;
nameNoAppendix = name;
this.setName(name + nameAppendix);
try {
readPropertiesAndUrl();
System.out
.print(" (" + props.getProperty("connectionURL") + ") ..");
} catch (Exception e) {
System.out
.println("Konnte properties / Passwort nicht lesen. " + e);
e.printStackTrace();
throw new DBServletException(
"Konnte properties / Passwort nicht lesen. " + e);
}
try {
Class.forName(props.getProperty("driverName"));
} catch (ClassNotFoundException e1) {
throw new DBServletException("Treiber "
+ props.getProperty("driverName")
+ " nicht gefunden. Ggfs. nach tomcat/common/lib kopieren.");
}
initLogging();
this.setTestOnBorrow(true);
int minIdle = 5;
if (props.getProperty("minIdle") != null
&& !props.getProperty("minIdle").trim().equals("")) {
minIdle = Integer.parseInt(props.getProperty("minIdle"));
}
this.setMinIdle(minIdle);
int maxIdle = -1;
if (props.getProperty("maxIdle") != null
&& !props.getProperty("maxIdle").trim().equals("")) {
maxIdle = Integer.parseInt(props.getProperty("maxIdle"));
}
if (maxIdle != -1)
setMaxIdle(maxIdle);
int maxActive = -1;
if (props.getProperty("maxActive") != null
&& !props.getProperty("maxActive").trim().equals("")) {
maxActive = Integer.parseInt(props.getProperty("maxActive"));
}
if (maxActive != -1)
setMaxActive(maxActive);
ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(
props.getProperty("connectionURL"), props);
PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(
connectionFactory, this, null, "select count(*) from xdummy;" //validationQuery
, false, true);
int i = 1;
try {
// PoolingDriver driver = new PoolingDriver();
Class.forName("org.apache.commons.dbcp.PoolingDriver");
} catch (ClassNotFoundException e2) {
throw new DBServletException(
"ConnectionPool Klasse org.apache.commons.dbcp.PoolingDriver nicht gefunden.\ncommons-dbcp nach tomcat/common/lib stellen.");
}
PoolingDriver driver = (PoolingDriver) DriverManager
.getDriver("jdbc:apache:commons:dbcp:");
driver.registerPool(this.getName(), this);
Object x = driver.getConnectionPool(this.getName());
try {
Connection con = this.getConnection();
Statement st = con.createStatement();
ResultSet rs = st
.executeQuery("select value from properties where name='privatekey'");
while (rs.next()) {
privateKeyEncoded = rs.getString(1);
}
rs.close();
rs = st
.executeQuery("select value from properties where name='publickey'");
while (rs.next()) {
publicKeyEncoded = rs.getString(1);
}
rs.close();
st.close();
con.close();
} catch (SQLException e) {
String msg = "Fehler beim Aufbau des ConnectionPools ";
if (!getName().startsWith("default"))
msg += " für Mandant: " + getName();
msg += "\nKonnte keine Connection aus dem Pool holen.\n" + e;
throw new SQLException(msg);
}
if (privateKeyEncoded != null)
initDSAHandler();
}
protected void initLogging() throws IOException {
/*
* LogUtils.initRawFile("superx_" + getName(), getLogDir() + "/superx_" +
* name + ".log", 2000, 1, false, true); LogUtils.initRawFile("superx_" +
* getName() + "_xml", getLogDir() + "/superx_" + name + "_xml.log",
* 2000, 1, false, true);
*
* Level lev = Level.SEVERE;
*
* try { if (props.getProperty("logLevelSQL") != null) lev =
* Level.parse(props.getProperty("logLevelSQL")); } catch
* (IllegalArgumentException e) { String msg = "Ungültiger Level für
* sqlLogger "; if (!this.getName().equals("default")) msg += "(Mandant :" +
* getName() + ") "; msg += " :" + props.getProperty("logLevelSQL");
* System.out.println(msg); } Logger.getLogger("superx_" +
* getName()).setLevel(lev); lev = Level.SEVERE;
*
* try { if (props.getProperty("logLevelXML") != null) lev =
* Level.parse(props.getProperty("logLevelXML")); } catch
* (IllegalArgumentException e) { String msg = "Ungültiger Level für
* XMLLogger "; if (!this.getName().equals("default")) msg += "(Mandant :" +
* getName() + ") "; msg += " :" + props.getProperty("logLevelXML");
* System.out.println(msg); } Logger.getLogger("superx_" + getName() +
* "_xml").setLevel(lev);
*/
}
public static String getLogDir() {
String tomcat_home = System.getProperty("catalina.home"); //tomcat 4
// and 5
if (tomcat_home == null)
tomcat_home = System.getProperty("tomcat.home"); //tomcat 3.x
if (tomcat_home == null)
tomcat_home = "/home/superx/webserver/tomcat";
return tomcat_home + "/logs";
}
public Properties getProperties() {
return props;
}
private void readPropertiesAndUrl() throws Exception {
String propname = "db_" + nameNoAppendix + ".properties";
if (nameNoAppendix.equals("default"))
propname = "db.properties";
java.net.URL url = MemtextPool.class.getProtectionDomain()
.getCodeSource().getLocation();
File myJar = new File(url.getFile());
File myPath = new File(myJar.getParent());
String pfad = myPath.getParent() + System.getProperty("file.separator");
if (subpath != null)
pfad += subpath + System.getProperty("file.separator");
props = PropsReader.prepareProps(new File(pfad + propname));
int i = 1;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void close() throws SQLException {
PoolingDriver driver = (PoolingDriver) DriverManager
.getDriver("jdbc:apache:commons:dbcp:");
driver.closePool(this.getName());
}
public Connection getConnection() throws SQLException {
return DriverManager.getConnection("jdbc:apache:commons:dbcp:"
+ this.getName());
}
public void init() throws TransformerConfigurationException,
KeyParentEqualException, SQLException, DBServletException {
}
public void clearLogFiles() throws IOException {
}
private void initDSAHandler() throws DBServletException {
//privateKey wird ggfs. im Konstruktur bei Connection-Test, public key
// aus properties eingelesen
if (privateKeyEncoded == null)
throw new IllegalStateException(
"privatekey war null - properties-table auf Eintrag überprüfen");
if (publicKeyEncoded == null)
throw new IllegalStateException(
"publickey war null - properties-table prüfen");
try {
dsaHandler = new DSAHandler(privateKeyEncoded, publicKeyEncoded);
} catch (Exception e) {
throw new DBServletException(e.toString());
}
}
public boolean hasDSAHandler() {
return dsaHandler != null;
}
public boolean verifiy(String data, String signature)
throws InvalidKeyException, NoSuchAlgorithmException,
InvalidKeySpecException, SignatureException {
if (dsaHandler == null)
throw new IllegalStateException(
"DSAHandler ist null, public und private key definition prüfen");
return dsaHandler.verify(data, signature);
}
public String getPrivateKey() {
return privateKeyEncoded;
}
}
//Created on 04.11.2004 at 20:18:11 as SxPool