Compare commits
1 Commits
master
...
kern_tomca
Author | SHA1 | Date |
---|---|---|
|
4a89c6ec82 | 3 weeks ago |
1956 changed files with 919816 additions and 151335 deletions
File diff suppressed because it is too large
Load Diff
@ -1,262 +0,0 @@
@@ -1,262 +0,0 @@
|
||||
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
|
@ -1,197 +0,0 @@
@@ -1,197 +0,0 @@
|
||||
package de.memtext.db; |
||||
|
||||
import java.io.BufferedReader; |
||||
import java.io.File; |
||||
import java.io.FileReader; |
||||
import java.io.IOException; |
||||
import java.lang.reflect.Constructor; |
||||
import java.lang.reflect.InvocationTargetException; |
||||
import java.sql.Connection; |
||||
import java.sql.DriverManager; |
||||
import java.sql.SQLException; |
||||
import java.util.Iterator; |
||||
|
||||
import javax.xml.transform.TransformerConfigurationException; |
||||
|
||||
import org.apache.commons.dbcp.PoolingDriver; |
||||
|
||||
import de.memtext.baseobjects.coll.NamedObjectSet; |
||||
import de.memtext.tree.KeyParentEqualException; |
||||
|
||||
|
||||
public class MemtextPools extends NamedObjectSet { |
||||
|
||||
private NamedObjectSet pools = new NamedObjectSet(); |
||||
|
||||
public MemtextPools() { |
||||
super(); |
||||
} |
||||
|
||||
public synchronized Connection getConnection(String poolname) |
||||
throws SQLException { |
||||
if (pools.size() == 0) |
||||
throw new IllegalStateException("Kein ConnectionPool gefunden."); |
||||
if (!pools.containsItemWithName(poolname)) |
||||
throw new SQLException("Kein ConnectionPool für Mandant:" |
||||
+ poolname + " gefunden"); |
||||
String pooldrv = "jdbc:apache:commons:dbcp:" + poolname; |
||||
if (DriverManager.getDriver(pooldrv) == null) { |
||||
String msg = "Kein ConnectionPool gefunden "; |
||||
if (!poolname.equals("default")) |
||||
msg += " für Mandant " + poolname; |
||||
throw new SQLException(msg); |
||||
} |
||||
return DriverManager.getConnection(pooldrv); |
||||
} |
||||
|
||||
public MemtextPool get(String poolname) { |
||||
if (!pools.containsItemWithName(poolname)) |
||||
throw new IllegalStateException("Kein ConnectionPool (" + poolname |
||||
+ ") vorhanden"); |
||||
return (MemtextPool) pools.getByName(poolname); |
||||
} |
||||
|
||||
/* void initDefaultOnly() throws SQLException, IOException, |
||||
DBServletException { |
||||
pools.add(new MemtextPool("default")); |
||||
} |
||||
*/ |
||||
/** |
||||
* wenn mehrfach benutzt wird (ConnectionPools für SuperX und Joolap) |
||||
* mind ein sollte namensappendix haben, damit unterscheidbar - |
||||
* sonst wird z.B. Pool für joolap "default" von später erzeugten Pool für superx "default" |
||||
* überschrieben! |
||||
*/ |
||||
public void init(String subpath,Class poolclass, String nameAppendix) throws SQLException, IOException, |
||||
DBServletException { |
||||
if (nameAppendix==null) nameAppendix=""; |
||||
Class[] params = new Class[2]; |
||||
params[0] = String.class; |
||||
params[1] = String.class; |
||||
Constructor constructor; |
||||
try { |
||||
constructor = poolclass.getConstructor(params); |
||||
|
||||
String db_extfile = "mandanten.cfg"; |
||||
if (db_extfile.indexOf(File.separator) == -1) { |
||||
java.net.URL url = MemtextPools.class.getProtectionDomain() |
||||
.getCodeSource().getLocation(); |
||||
File myJar = new File(url.getFile()); |
||||
File myPath = new File(myJar.getParent()); |
||||
String pfad = myPath.getParent(); |
||||
if (subpath!=null) pfad+=File.separator+subpath; |
||||
db_extfile = pfad + File.separator+db_extfile; ; |
||||
|
||||
|
||||
} |
||||
File f = new File(db_extfile); |
||||
if (!f.exists()) { |
||||
//einfach nur normale db.properties (default)
|
||||
System.out.print("Aufbau Datenbank-ConnectionPool"); |
||||
Object[] args = new Object[2]; |
||||
args[0] = "default";//Appendix hängt JoolapPool an
|
||||
args[1] = subpath; |
||||
MemtextPool connectionPool = (MemtextPool) constructor.newInstance(args); |
||||
System.out.println(" OK"); |
||||
System.out.println(" public/private key "+(connectionPool.hasDSAHandler()?" aktiv ":" nicht aktiv")); |
||||
|
||||
pools.add(connectionPool); |
||||
} else { //mehrereMandanten
|
||||
FileReader fr = new FileReader(f); |
||||
BufferedReader bfr = new BufferedReader(fr); |
||||
String line; |
||||
while ((line = bfr.readLine()) != null) { |
||||
System.out.print("Aufbau Datenbank-ConnectionPool für " |
||||
+ line); |
||||
Object[] args = new Object[2]; |
||||
args[0] = line;//Appendix hängt JoolapPool an
|
||||
args[1] = subpath; |
||||
MemtextPool connectionPool = (MemtextPool) constructor.newInstance(args); |
||||
System.out.println("OK"); |
||||
System.out.println(" public/private key"+(connectionPool.hasDSAHandler()?" aktiv ":" nicht aktiv")); |
||||
|
||||
pools.add(connectionPool); |
||||
} |
||||
bfr.close(); |
||||
fr.close(); |
||||
} |
||||
} catch (SecurityException e) { |
||||
e.printStackTrace(); |
||||
throw new DBServletException(e.toString()); |
||||
} catch (NoSuchMethodException e) { |
||||
e.printStackTrace(); |
||||
throw new DBServletException(e.toString()); |
||||
} catch (IllegalArgumentException e) { |
||||
e.printStackTrace(); |
||||
throw new DBServletException(e.toString()); |
||||
} catch (InstantiationException e) { |
||||
e.printStackTrace(); |
||||
throw new DBServletException(e.toString()); |
||||
} catch (IllegalAccessException e) { |
||||
e.printStackTrace(); |
||||
throw new DBServletException(e.toString()); |
||||
} catch (InvocationTargetException e) { |
||||
e.printStackTrace(); |
||||
throw new DBServletException(e.toString()); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Destroys all ConnectionPools |
||||
* |
||||
* @throws Exception |
||||
*/ |
||||
public void closeAll() throws Exception { |
||||
for (Iterator it = pools.iterator(); it.hasNext();) { |
||||
MemtextPool pool = (MemtextPool) it.next(); |
||||
pool.close(); |
||||
} |
||||
|
||||
} |
||||
|
||||
public void main(String args[]) { |
||||
try { |
||||
init("xx",MemtextPool.class, null); |
||||
} catch (Exception e) { |
||||
e.printStackTrace(); |
||||
} |
||||
int i = 1; |
||||
} |
||||
|
||||
public void invalidate(String poolname, Connection con) |
||||
throws DBServletException { |
||||
if (!pools.containsItemWithName(poolname)) |
||||
throw new DBServletException( |
||||
"Kann Connection nicht invalidieren - kein ConnectionPool " |
||||
+ poolname + " gefunden."); |
||||
try { |
||||
PoolingDriver driver = (PoolingDriver) DriverManager |
||||
.getDriver("jdbc:apache:commons:dbcp:"); |
||||
|
||||
//driver.invalidateConnection(con);
|
||||
driver.getConnectionPool(poolname).invalidateObject(con); |
||||
} catch (Exception e) { |
||||
e.printStackTrace(); |
||||
throw new DBServletException("Invalidating connection failed -" + e); |
||||
} |
||||
|
||||
} |
||||
|
||||
public void resetAllPools() |
||||
throws TransformerConfigurationException, KeyParentEqualException, |
||||
SQLException, DBServletException { |
||||
for (Iterator it = pools.iterator(); it.hasNext();) { |
||||
MemtextPool aPool = (MemtextPool) it.next(); |
||||
aPool.init(); |
||||
} |
||||
} |
||||
|
||||
public void clearLogFiles() throws IOException { |
||||
for (Iterator it = pools.iterator(); it.hasNext();) { |
||||
MemtextPool aPool = (MemtextPool) it.next(); |
||||
aPool.clearLogFiles(); |
||||
} |
||||
} |
||||
} |
||||
|
||||
//Created on 04.11.2004 at 20:18:11 als SxPools
|
@ -1,122 +0,0 @@
@@ -1,122 +0,0 @@
|
||||
package de.memtext.hbt; |
||||
|
||||
import java.io.IOException; |
||||
import java.sql.SQLException; |
||||
import java.util.logging.Level; |
||||
import java.util.logging.Logger; |
||||
|
||||
import javax.mail.Flags; |
||||
import javax.mail.Folder; |
||||
import javax.mail.Message; |
||||
import javax.mail.MessagingException; |
||||
import javax.mail.search.FlagTerm; |
||||
|
||||
import de.memtext.util.LogUtils; |
||||
import de.superx.servlet.SxMail; |
||||
import de.superx.servlet.SxPool; |
||||
|
||||
public abstract class AbstractAriel extends Thread { |
||||
// this is defined as private static method to use as little memory as possible,
|
||||
// it would be neglectable in moder computers to create it every time the method
|
||||
// runs, GarbargeCollection would easily do the job
|
||||
// yet I define it that way out of respect for the programmers of beginning in
|
||||
// the 50ies/60ies or whenever
|
||||
// private static FlagTerm flagUnseen = new FlagTerm(new Flags(Flags.Flag.SEEN), true); // ja ich weiß, flagUnseen
|
||||
Flags seen = new Flags(Flags.Flag.RECENT); |
||||
private static FlagTerm flagUnseen = new FlagTerm(new Flags(Flags.Flag.SEEN), false); |
||||
static Flags flagsContainingOnlySeen=new Flags(Flags.Flag.SEEN); |
||||
protected Logger logger=null; |
||||
// wird bisher nicht
|
||||
// benötigt, aber ist doch
|
||||
// klar, dass ich das gleich
|
||||
// nutzen will, dass nervt,
|
||||
// dass die Meldung jetzt
|
||||
// kommt
|
||||
private boolean isActive = true; |
||||
private int interval = 10; |
||||
protected SxMail sxmail; |
||||
|
||||
public AbstractAriel() { |
||||
super(); |
||||
} |
||||
|
||||
public AbstractAriel(Runnable target) { |
||||
super(target); |
||||
} |
||||
|
||||
public AbstractAriel(String name) { |
||||
super(name); |
||||
} |
||||
|
||||
public AbstractAriel(ThreadGroup group, Runnable target) { |
||||
super(group, target); |
||||
} |
||||
|
||||
public AbstractAriel(ThreadGroup group, String name) { |
||||
super(group, name); |
||||
} |
||||
|
||||
public AbstractAriel(Runnable target, String name) { |
||||
super(target, name); |
||||
} |
||||
|
||||
public AbstractAriel(ThreadGroup group, Runnable target, String name) { |
||||
super(group, target, name); |
||||
} |
||||
|
||||
public AbstractAriel(ThreadGroup group, Runnable target, String name, long stackSize) { |
||||
super(group, target, name, stackSize); |
||||
} |
||||
|
||||
public void initLogging()throws IOException |
||||
{ |
||||
String filename=SxPool.getLogDir() + "/superx_" |
||||
+ getArielName() + ".log"; |
||||
LogUtils.initRawFile("superx_" + getArielName(), filename, 20000, 1, true, true); |
||||
System.out.println("Superx Mail logging in "+filename); |
||||
logger=Logger.getLogger("superx_" + getArielName()); |
||||
Level lev = Level.SEVERE; |
||||
logger.setLevel(lev); |
||||
|
||||
|
||||
|
||||
} |
||||
public String getArielName() |
||||
{ |
||||
return "mail"; |
||||
} |
||||
public void run() { |
||||
while (isActive) { |
||||
try { |
||||
Thread.sleep(interval * 1000); |
||||
|
||||
} catch (InterruptedException e) { |
||||
// e.printStackTrace();
|
||||
} |
||||
|
||||
try { |
||||
|
||||
logger.log(Level.INFO,"SuperX is checking mails for new heartbeats..."); |
||||
|
||||
|
||||
Folder inbox=sxmail.getInbox(); |
||||
//if (inbox.hasNewMessages())
|
||||
processNewMessages(inbox.getMessages()); // processed messages will be deleted -> don#t need inbox.search(flagUnseen)); // former first attempt was : processNewMessages(inbox.getMessages()); // should be in differnt colour (<- British English)
|
||||
|
||||
sxmail.closeInbox(); //deletes marked mails
|
||||
} catch (Exception e) { |
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace(); |
||||
} |
||||
|
||||
} |
||||
} |
||||
|
||||
abstract void processNewMessages(Message[] messages) throws MessagingException, IOException, SQLException; |
||||
|
||||
public void setActive(boolean isActive) { |
||||
this.isActive=isActive; |
||||
|
||||
} |
||||
|
||||
} |
@ -1,96 +0,0 @@
@@ -1,96 +0,0 @@
|
||||
package de.memtext.hbt; |
||||
|
||||
import java.io.IOException; |
||||
import java.util.Properties; |
||||
|
||||
import javax.mail.Folder; |
||||
import javax.mail.Message; |
||||
import javax.mail.MessagingException; |
||||
import javax.mail.Session; |
||||
import javax.mail.Store; |
||||
import javax.mail.Transport; |
||||
import javax.mail.internet.AddressException; |
||||
import javax.mail.internet.InternetAddress; |
||||
import javax.mail.internet.MimeMessage; |
||||
|
||||
public class Checker { |
||||
|
||||
public static void check(Session emailSession, String user, String password) |
||||
throws MessagingException, IOException { |
||||
|
||||
// create the POP3 store object and connect with the pop server
|
||||
// pop3s wichtig -> vermutlich secure
|
||||
Store store = emailSession.getStore("pop3s"); |
||||
store.connect(emailSession.getProperty("mail.pop3.host"), user, password); |
||||
|
||||
Folder emailFolder = store.getFolder("INBOX"); |
||||
emailFolder.open(Folder.READ_ONLY); |
||||
|
||||
// messages werden geholt, können nur ausgelesen werden, wenn Folder noch open
|
||||
// ist!
|
||||
Message[] messages = emailFolder.getMessages(); |
||||
|
||||
System.out.println("messages.length---" + messages.length); |
||||
|
||||
for (int i = 0, n = messages.length; i < n; i++) { |
||||
Message message = messages[i]; |
||||
System.out.println("---------------------------------"); |
||||
System.out.println("Email Number " + (i + 1)); |
||||
System.out.println("Subject: " + message.getSubject()); |
||||
System.out.println("From: " + message.getFrom()[0]); |
||||
System.out.println("Text: " + message.getContent().toString()); |
||||
|
||||
} |
||||
|
||||
// close the store and folder objects
|
||||
emailFolder.close(false); |
||||
store.close(); |
||||
|
||||
} |
||||
|
||||
private static void send(Session emailSession, String user, String recipient, String subject, String text, |
||||
String password) throws AddressException, MessagingException { |
||||
MimeMessage replyMessage = new MimeMessage(emailSession); |
||||
// replyMessage = (MimeMessage) message.reply(false);
|
||||
replyMessage.setFrom(new InternetAddress(user)); |
||||
replyMessage.setRecipients(Message.RecipientType.TO, recipient); |
||||
replyMessage.setSubject(subject); |
||||
replyMessage.setText(text); |
||||
Transport t = emailSession.getTransport("smtp"); |
||||
t.connect(user, password); |
||||
t.sendMessage(replyMessage, replyMessage.getAllRecipients()); |
||||
System.out.println("Message sent..."); |
||||
} |
||||
|
||||
private static Session initSession(String pophost, String smtphost) { |
||||
Properties properties = new Properties(); |
||||
properties.put("mail.pop3.host", pophost); |
||||
properties.put("mail.pop3.port", "995"); |
||||
properties.put("mail.pop3.starttls.enable", "true"); |
||||
properties.put("mail.smtp.auth", "true"); |
||||
properties.put("mail.smtp.starttls.enable", "true"); |
||||
properties.put("mail.smtp.host", smtphost); |
||||
properties.put("mail.smtp.port", "25"); |
||||
return Session.getDefaultInstance(properties); |
||||
} |
||||
|
||||
public static void main(String[] args) { |
||||
Session session = initSession("pop3.strato.de", "smtp.strato.de"); |
||||
String username = "heartbeat@mbisping.de"; |
||||
String password = "$Anfang1200"; |
||||
|
||||
try { |
||||
check(session, username, password); |
||||
send(session, username, "danielq@memtext.de", "From Düsseldorf with fun...", "This is the memtext's first digitial 'heartbeat' :-)\n send via java mail - \nThanks and see you around :-)", |
||||
password); |
||||
} catch (MessagingException e) { |
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace(); |
||||
} catch (IOException e) { |
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace(); |
||||
} |
||||
|
||||
} |
||||
|
||||
} |
@ -1,293 +0,0 @@
@@ -1,293 +0,0 @@
|
||||
package de.memtext.hbt; |
||||
|
||||
import java.io.File; |
||||
import java.io.FileOutputStream; |
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
import java.sql.Connection; |
||||
import java.sql.PreparedStatement; |
||||
import java.sql.SQLException; |
||||
import java.sql.Statement; |
||||
import java.util.logging.Level; |
||||
import java.util.regex.Matcher; |
||||
import java.util.regex.Pattern; |
||||
|
||||
import javax.mail.BodyPart; |
||||
import javax.mail.Flags; |
||||
import javax.mail.Message; |
||||
import javax.mail.MessagingException; |
||||
import javax.mail.Multipart; |
||||
import javax.mail.Part; |
||||
import javax.mail.internet.AddressException; |
||||
import javax.mail.internet.MimeMessage; |
||||
|
||||
import clover.com.atlassian.extras.common.org.springframework.util.StringUtils; |
||||
import de.memtext.db.DbUtils; |
||||
import de.memtext.util.FileUtils; |
||||
import de.memtext.util.MailUtils; |
||||
import de.superx.servlet.SuperXManager; |
||||
import de.superx.servlet.SxMail; |
||||
import de.superx.servlet.SxPools; |
||||
|
||||
public class NewHeartBeatAriel extends AbstractAriel { |
||||
private static final Pattern pHbtId = Pattern.compile("@hbt:\\d*@"); |
||||
|
||||
public NewHeartBeatAriel(SxMail sxmail) throws IOException { |
||||
this.sxmail = sxmail; |
||||
initLogging(); |
||||
} |
||||
|
||||
void processNewMessages(Message newMessages[]) throws MessagingException, IOException, SQLException { |
||||
|
||||
|
||||
logger.log(Level.INFO," found " + newMessages.length + " new messages"); |
||||
for (int i = 0, n = newMessages.length; i < n; i++) { |
||||
Message aNewMessage = newMessages[i]; |
||||
|
||||
String content = MailUtils.getContent(aNewMessage); |
||||
if (content.indexOf("@hbt:") == -1) |
||||
createNewHeartBeat(aNewMessage, content); |
||||
else |
||||
appendToHeartBeat(aNewMessage, content); |
||||
// had thought setting via inbox nessary, but that's only the preferred way to
|
||||
// set flags for group of messages since some mail implementations by have
|
||||
// optimized support for groups of messages
|
||||
// inbox.setFlags(new Message[] {message}, , true);
|
||||
// message.setFlags(flagsContainingOnlySeen, true);
|
||||
// unseen wäre schöner, mailapi.jar aktualisieren bei HIS Antrag
|
||||
// nötig,vielleicht klappt mit delete
|
||||
aNewMessage.setFlag(Flags.Flag.DELETED, true); // AbstractAriel.run ruft sxmail.closeInbox() auf mit
|
||||
// Anweisung zu löschen
|
||||
|
||||
// sorry to bother you, Garbage collector , need message only to times, hey or
|
||||
// doesn't that matter anyway since only a simple reference (like in good old
|
||||
// C), but clearer/easier to read if line Message message=.. was superfolous
|
||||
|
||||
} |
||||
} |
||||
|
||||
private void appendToHeartBeat(Message message, String content) |
||||
throws SQLException, IOException, MessagingException { |
||||
StringBuffer result = new StringBuffer(); |
||||
int hbtTid = -1; |
||||
Connection con = SxPools.getConnection(sxmail.getMandantenID()); |
||||
Statement stm = con.createStatement(); |
||||
boolean isHbtFoundInDb = false; |
||||
String feedbackSubject = ""; |
||||
Matcher m = pHbtId.matcher(content); |
||||
boolean foundHbtTag=m.find(); |
||||
if (foundHbtTag) { |
||||
String hbtIdString = content.substring(m.start() + 5, m.end() - 1); |
||||
content=content.replaceAll("@hbt:\\d*@", ""); |
||||
try { |
||||
hbtTid = Integer.parseInt(hbtIdString); |
||||
if (DbUtils.getInt(con, "select count(*) from hbt_heartbeat where tid=?", hbtTid) > 0) |
||||
isHbtFoundInDb = true; |
||||
} catch (NumberFormatException e) { |
||||
result.append(" hbt:" + hbtIdString |
||||
+ " konnte nicht in integer transformiert werden, Nachricht wird zwischengespeichert"); |
||||
isHbtFoundInDb = false; |
||||
} |
||||
if (isHbtFoundInDb) { |
||||
// TODO ggfs. mehrer Topics
|
||||
int maxTopic = DbUtils.getInt(con, "select max(tid) from hbt_topic where hbt_id=?", hbtTid); |
||||
// int maxNote = DbUtils.getInt(stm, "select max(tid) from hbt_note where
|
||||
// hbt_id=" + hbtTid + " hbt_topic_id=" + maxTopic);
|
||||
int newNoteId = createNote(con, stm, hbtTid, maxTopic, message, content); |
||||
feedbackSubject = "Your new note was added to Heartbeat " + hbtTid; |
||||
result.append("Feel free to view this HeartBeat by visiting " + sxmail.getWTFAI() |
||||
+ "/edit/hbt/hbt_viewer.jsp?tid=" + hbtTid + " \n\n" + "Always at your service: \n" |
||||
+ " your HeartBeatAriel @ SuperX"); |
||||
|
||||
} |
||||
} |
||||
|
||||
if (!foundHbtTag || !isHbtFoundInDb) { |
||||
feedbackSubject = "Sorry, target hbt found found ..."; |
||||
PreparedStatement pst=con.prepareStatement("insert into hbt_tmp_note (note) values (?)"); |
||||
pst.setString(1,content); |
||||
pst.execute(); |
||||
pst.close(); |
||||
int newNoteId=DbUtils.getInt(stm, "select max(tid) from hbt_tmp_note"); |
||||
result.append("you can select the right hbt_id by visiting " + sxmail.getWTFAI()+"/servlet/SuperXmlMaske?tid=60040?note_id="+newNoteId); |
||||
} |
||||
stm.close(); |
||||
con.close(); |
||||
sendFeedbackEmail(feedbackSubject, result.toString(), message); |
||||
} |
||||
|
||||
private void createNewHeartBeat(Message inMessage, String content) |
||||
throws SQLException, MessagingException, IOException { |
||||
int newHbtTid = performHbtInsert(inMessage, content); |
||||
String text = "Feel free to complete this heartbeat's details by visiting " + sxmail.getWTFAI() |
||||
+ "/edit/hbt/hbt_edit.jsp?tid=" + newHbtTid + " \n\n" + "Always at your service: \n" |
||||
+ " your HeartBeatAriel @ SuperX"; |
||||
sendFeedbackEmail("Your new digital heartbeat has been created ...", text, inMessage); |
||||
} |
||||
|
||||
/** |
||||
* Performs the creation of a new HeartBeat in the database |
||||
* |
||||
* @param message |
||||
* @return newHbtTid |
||||
* @throws SQLException |
||||
* @throws MessagingException |
||||
* @throws IOException |
||||
*/ |
||||
private int performHbtInsert(Message m, String content) throws SQLException, IOException, MessagingException { |
||||
Connection con = SxPools.getConnection(sxmail.getMandantenID()); |
||||
Statement stm = con.createStatement(); |
||||
|
||||
int newHbtTid = createHbt(con, stm, content, m.getSubject()); |
||||
int newTopicId = createTopic(stm, newHbtTid); |
||||
createNote(con, stm, newHbtTid, newTopicId, m, content); |
||||
con.close(); |
||||
return newHbtTid; |
||||
} |
||||
|
||||
private int createHbt(Connection dbConnection, Statement stm, String content, String subject) |
||||
throws IOException, MessagingException, SQLException { |
||||
String primary_customer_id = identifyPrimaryCustomerId(dbConnection, stm, content); |
||||
String name = StringUtils.replace(subject, "'", "''");// for SQL insert
|
||||
// Sql insert - fuck prepared statements, nobody hacks this, I don't give a
|
||||
// shit, not worth my extra time or effort, I want to get things done now while
|
||||
// having fun :-)
|
||||
stm.execute("select sp_update_sequence('hbt_heartbeat')"); |
||||
String insertSql = "INSERT INTO hbt_heartbeat \n" + "( primary_customer_id,name," + " created_at, \n" |
||||
+ " status \n" + ") \n" + "VALUES \n" + "( " + primary_customer_id + ",'" + name + "', " |
||||
+ " today(), \n" + " 1 \n" + ") " + ""; |
||||
stm.execute(insertSql); |
||||
int newHbtTid = DbUtils.getInt(stm, "select max(tid) from hbt_heartbeat"); |
||||
return newHbtTid; |
||||
} |
||||
|
||||
/** |
||||
* |
||||
* Wenn im Text der weitergeleiteten Email der Absender mit @@ markiert ist, |
||||
* z.B. @@hiber@his.de@@, diesen auslesen zugehörige Organisation auslesen |
||||
* |
||||
* @param m |
||||
* @return String null oder key_apnr z.B. '1001' |
||||
* @throws IOException |
||||
* @throws MessagingException |
||||
* @throws SQLException |
||||
*/ |
||||
private String identifyPrimaryCustomerId(Connection con, Statement stm, String content) |
||||
throws IOException, MessagingException, SQLException { |
||||
String result = "null"; |
||||
int pos1 = content.indexOf("@@"); |
||||
int pos2 = content.substring(pos1 + 2).indexOf("@@"); |
||||
if (pos1 > -1 && pos2 > -1) { |
||||
String absender = content.substring(pos1 + 2); |
||||
absender = absender.substring(0, absender.lastIndexOf("@@")); |
||||
logger.log(Level.INFO," checking customer " + absender); |
||||
int userinfo_id = DbUtils.getInt(con, "select tid from userinfo where email=?", absender); |
||||
result = DbUtils.getString(stm, |
||||
"select min(ch110_institut) from user_institution where userid=" + userinfo_id); |
||||
|
||||
if (result == null) |
||||
result = "null"; |
||||
else |
||||
result = "'" + result + "'"; |
||||
} |
||||
return result; |
||||
} |
||||
|
||||
private int createTopic(Statement stm, int newHbtTid) throws SQLException { |
||||
stm.execute("select sp_update_sequence('hbt_topic')"); |
||||
String insertSql = "INSERT INTO hbt_topic \n" + "( hbt_id,name, created_at)" + "VALUES (" + newHbtTid |
||||
+ ",'Start',now() )"; |
||||
stm.execute(insertSql); |
||||
int newTopicId = DbUtils.getInt(stm, "select max(tid) from hbt_topic"); |
||||
return newTopicId; |
||||
} |
||||
|
||||
private int createNote(Connection con, Statement stm, int hbtId, int topicId, Message m, String content) |
||||
throws IOException, MessagingException, SQLException { |
||||
stm.execute("select sp_update_sequence('hbt_note')"); |
||||
PreparedStatement pst = con |
||||
.prepareStatement(" INSERT INTO hbt_note (hbt_id,hbt_topic_id,note, created_at) VALUES (?,?,?,now());"); |
||||
pst.setInt(1, hbtId); |
||||
pst.setInt(2, topicId); |
||||
|
||||
pst.setString(3, content); |
||||
pst.execute(); |
||||
pst.close(); |
||||
int newNoteId = DbUtils.getInt(stm, "select max(tid) from hbt_note"); |
||||
saveAttachments(stm, hbtId, topicId, newNoteId, m); |
||||
return newNoteId; |
||||
} |
||||
|
||||
private void saveAttachments(Statement stm, int newHbtTid, int newTopicId, int newNoteId, Message m) |
||||
throws IOException, MessagingException, SQLException { |
||||
// List<String> attachments = new ArrayList<String>();
|
||||
Object content = m.getContent(); |
||||
// if (content instanceof String) return null;
|
||||
|
||||
if (content instanceof Multipart) { |
||||
Multipart multipart = (Multipart) content; |
||||
for (int i = 0; i < multipart.getCount(); i++) { |
||||
BodyPart part = multipart.getBodyPart(i); |
||||
logger.log(Level.INFO,part.getFileName() + " " + part.getContentType() + " " + part.getDisposition()); |
||||
if (part.getDisposition() != null && part.getDisposition().equalsIgnoreCase(Part.ATTACHMENT)) { |
||||
// result.addAll(getAttachments(multipart.getBodyPart(i)));
|
||||
String filename = SuperXManager.getWEB_INFPfad()+"/downloads/hbt_"+newHbtTid+"_" +newNoteId+"_"+FileUtils.removeProblemChars(part.getFileName()); |
||||
sxDownloadsInsert(stm, newHbtTid, newTopicId, newNoteId, filename, part.getContentType()); |
||||
// javaxmail >1.4 bodyPart.saveFile(filename);
|
||||
// old version
|
||||
InputStream is = part.getInputStream(); |
||||
File f = new File(filename); |
||||
FileOutputStream fos = new FileOutputStream(f); |
||||
byte[] buf = new byte[4096]; |
||||
int bytesRead; |
||||
while ((bytesRead = is.read(buf)) != -1) { |
||||
fos.write(buf, 0, bytesRead); |
||||
} |
||||
fos.close(); |
||||
logger.log(Level.INFO," saving attachment " + (i++) + " as " + filename); |
||||
} |
||||
} |
||||
|
||||
} |
||||
|
||||
} |
||||
|
||||
private void sxDownloadsInsert(Statement stm, int newHbtTid, int newTopicId, int newNoteId, String filename, |
||||
String contenttype) throws SQLException { |
||||
stm.execute("select sp_update_sequence('sx_downloads')"); |
||||
String filenameShort = filename.substring(filename.indexOf(File.separator + "hbt") + 1); |
||||
String insertSQLSxDownloads = "INSERT INTO sx_downloads \n" + "( \n" + " name, \n" + " importdatum, \n" |
||||
+ " kommentar, \n" + " kommentar_url, \n" + " contenttype, \n" + " datei, \n" + " gueltig_seit, \n" |
||||
+ " gueltig_bis \n" + ") \n" + "VALUES \n" + "( \n" + " '" + filenameShort + "', \n" + " today(), \n" |
||||
+ " 'kommentar_value', \n" + " 'kommentar_url_value', \n" + " '" + contenttype + "', \n" + " '" |
||||
+ filenameShort + "', \n" + " today(), \n" + " date_val('1.1.3000') \n" + ") \n" + ""; |
||||
stm.execute(insertSQLSxDownloads); |
||||
int newDownloadTid = DbUtils.getInt(stm, "select max(tid) from sx_downloads"); |
||||
stm.executeUpdate("insert into hbt_attachment (hbt_id,topic_id,note_id,download_id) values (" + newHbtTid + "," |
||||
+ newTopicId + "," + newNoteId + "," + newDownloadTid + ")"); |
||||
} |
||||
|
||||
/** |
||||
* sendFeedBackEmail -- hier hätte ich gern automatisch newline in Zeile 60 |
||||
* direkt unter createNewHeartBeat automatisch erzeugt, dann nach weiter unten |
||||
* im Quelltext verlagert, damit von der Reihenfolge in |
||||
* createNewHeartBeat(Message message) her passt |
||||
* |
||||
* @param newHbtTid : tid von neuem HeartBeat in der Datenbank |
||||
* @param inMessage |
||||
* @throws MessagingException |
||||
* @throws AddressException |
||||
*/ |
||||
private void sendFeedbackEmail(String subject, String text, Message inMessage) |
||||
throws AddressException, MessagingException { |
||||
MimeMessage reply = sxmail.createMessage(); |
||||
reply.setRecipients(Message.RecipientType.TO, inMessage.getFrom()); |
||||
reply.setSubject(subject); |
||||
reply.setText(text); |
||||
sxmail.setMessage(reply); |
||||
|
||||
logger.log(Level.INFO,"Reply message happily sent..."); |
||||
} |
||||
|
||||
|
||||
} |
@ -1,28 +0,0 @@
@@ -1,28 +0,0 @@
|
||||
package de.memtext.lang; |
||||
public class SingOrPluralWord { |
||||
public final static SingOrPluralWord SEIN=new SingOrPluralWord("ist","sind"); |
||||
private int count; |
||||
private String singular,plural; |
||||
public SingOrPluralWord(String singular,String plural) { |
||||
this.singular=singular; |
||||
this.plural=plural; |
||||
} |
||||
|
||||
public static String format(int count,String sing,String plural) |
||||
{ |
||||
if (count==1) return count+" "+sing; |
||||
else |
||||
return count+" "+plural; |
||||
} |
||||
|
||||
public String say(int count) |
||||
{ |
||||
if (count==1) return singular; |
||||
else |
||||
return plural; |
||||
} |
||||
|
||||
|
||||
} |
||||
|
||||
//Created on 12.12.2003 at 15:53:43
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue