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
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
|
|
|