Java: convert inputStream to String

easy.

private String inputStreamToString(InputStream in) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in));
StringBuilder stringBuilder = new StringBuilder();
String line = null;

while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line + „n“);
}

bufferedReader.close();
return stringBuilder.toString();
}

Apache Tomcat mit eigener Java VM starten

Apache Tomcat velangt nach einer Java VM – jedoch möchte man ggf eine andere verwenden, als auf dem System installiert ist?!

Apache Tomcat wird über ein Script gestartet, in dem sich auch wunderbar die entsprechenden Variablen überschreiben lassen. Wichtig ist dann nur, dies auch für das Shutdown-Script zu erledigen.

Durch Anpassung des startup.sh – Scriptes ist dies also einfach möglich!

# set my own java path
export JRE_HOME=/usr/java/jre1.6.0_01
# increase memory size
export JAVA_OPTS=-XX:MaxPermSize=512m

Es wird nun eine Java VM von einem bestimmten Pfad verwende, und auch die Optionen um den zu nutzenden Speicher zu vergrößern können gleichmit angegeben werden.

In der Datei shutdown.sh sollte jedoch mindesten die Zeile export JRE_HOME=/usr/java/jre1.6.0_01 nochmals angegeben werden, da ansonsten wieder die systemweit genutzte Environment-Variable verwendet werden würde.

Hibernate: table / character encoding beeinflussen

MySQL in Version 5 will gern und viel seine Tabellen mit dem characterEncoding latin1_swedish_ci anlegen. Das führt jedoch bei Strings mit Sonderzeichen (zum Beispiel Buchstaben aus dem griechischen Alphabet) zu einigen Problemem. Ein generelles Encoding auf utf8 löst die meisten.

Leider kann Hibernate von Haus aus dieses Encoding nicht einstellen. Verschiedene Testes führen nicht zum Erfolg:

Versuch 1: der Entity-Annotation einen Parameter mitgeben. Leider gibt es hier aber keinen Paramter der diese Einstellung verwalten kann. Auch ein alter table nach dem @Entity via @SQLUpdate(sql=“ALTER TABLE …. CHARACTER SET utf8 COLLATE utf8_general_ci;“) führt nicht zum Erfolg.

Versuch 2: in der Konfiguration hibernate.cfg.xml die Connection URL anpassen:

<property name=“connection.url“> jdbc:mysql://server/database?useUnicode=true&characterEncoding=UTF8 </property>

… doch in bezug auf das Anlegen der Tabellen zeigt dies keine Wirkung.

Versuch 3: Einen eigenen SQL Dialekt schreiben! das geht bei Hibernate denkbar einfach, da man die bestehenden Dialekte überschreiben kann.

import org.hibernate.dialect.MySQLMyISAMDialect;
/**
* MySQL Dialect for using utf8 table types
*/
public class MysqlDialectUtf8 extends MySQLMyISAMDialect {
public String getTableTypeString() {
return “ ENGINE=MyISAM DEFAULT CHARSET=utf8″;
}
}

In der hibernate.cfg.xml wird nun einfach auf den eigenen Dialect verwiesen:

<property name=“dialect“>
de.my-container.project.hibernate.dialect.MysqlDialectUtf8
</property>

et voila. Die Tabellen werden nun mit dem characterEncoding UTF 8 angelegt, womit Sonderzeichen keine Probleme mehr machen!

java.util.Date(): Datumsdifferenzen berechnen

Java stellt zur Datumsberechnung einige Klassen in Java.util.* bereit. Zur berechnung von Differnzen eignen sich die Klassen Date() und Calendar(). Beispiel:

private void deleteOldLogmessages(int beforeMonths) {
// heute:
Date now = new Date();

// Formatierung fuer Ausgabe
String DATE_FORMAT = „dd-MM-yyyy“;
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(DATE_FORMAT);

Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
System.out.println(„cal now: „+sdf.format(calendar.getTime()));

// Calendar.add(): Datumsdiferent, diese Funktion ist Sicher über Jahresgrenzen hinweg!
calendar.add(Calendar.MONTH, beforeMonths);
System.out.println(„cal -3: „+sdf.format(calendar.getTime()));

// debug…
Date deleteBeforedate = new Date();
deleteBeforedate = calendar.getTime();
System.out.println(„now: „+now.getTime());
System.out.println(„sub: „+deleteBeforedate.getTime());
System.out.println(„diff: „+(now.getTime() – deleteBeforedate.getTime()));
}