Apache Jackrabbit installieren

Für's Protokoll. Die aktuelle 1.3er Release von Jackrabbit ist kaputt (zumindest das WAR-File).
Eigentlich wollte ich nur mal eine JSR-170-Implementierung evaluieren. Also lad ich mir jackrabbit-webapp-1.3.war herunter, benenn es in "jackrabbit.war" um und kopier es in das webapps-Verzeichnis von Tomcat. Wird mit Exception in catalina.log deployed - aber bei Jakarta ist das ja normal. Ich öffne http://<server>:8080/jackrabbit/. Die Seite erzählt mir, dass kein Repository existiere und ich doch unter http://<server>:8080/jackrabbit/bootstrap/missing.html eines anlegen könne. Den Wizard wiederhole ich ca. 30 mal weil dauernd irgendwelche Fehlermeldungen erschienen. Daher hier nun die funktionierende Version:
  1. Xalan 2.7 herunterladen und die Dateien "serializer.jar" und "xalan.jar" in "webapps/jackrabbit/WEB-INF/lib" kopieren. Die Dateien fehlen in der Release. Tolle Leistung.
  2. Tomcat sicherheitshalber neu starten
  3. Verzeichnis erstellen (bei mir "/export/jackrabbit"), in dem der Tomcat-User (hier "wwwrun") Schreibrechte hat. Wir wollen ja nicht, dass das Repository direkt im webapps-Verzeichnis von Tomcat angelegt wird.
  4. O.g. Wizard erneut starten und ein neues Repository erstellen. Dabei das gerade erstellte Verzeichnis angeben.
  5. Ggf. wirft das einen Fehler, wenn in dem Tomcat bereits eine Anwendung existiert, die eine RMI-Registry erzeugt hat. In dem Fall "webapps/jackrabbit/bootstrap.properties" öffnen und RMI entweder mit "rmi.enabled=false" komplett deaktivieren oder "rmi.port" auf einen Wert != "1099" anpassen.
Spätestens nach einem erneuten Tomcat-Restart sollte nun die Startseite angezeigt werden und u.a. den Zugriff via WebDAV über "webdav://<server>:8080/jackrabbit/server" anbieten.

Jetzt muss es sich nur noch im Einsatz beweisen.

Nachtrag: Jackrabbit legt beim Erstellen des Repositories eine Datei "jackrabbit/bootstrap.properties" an. Es handelt sich hier um eine relative Pfadangabe - ausgehend von dem Verzeichnis, in dem Tomcat gestartet wurde. Da nicht sichergestellt ist, ob Tomcat beim nächsten Mal wieder aus dem gleichen Verzeichnis heraus gestartet wird, kann man in "webapps/jackrabbit/WEB-INF/web.xml" auch einen absoluten Pfad angeben und die erstellte Datei dorthin kopieren. Bei mir:
  <init-param>
    <param-name>bootstrap-config</param-name>
    <param-value>/export/jackrabbit/bootstrap.properties</param-value>
  </init-param>

eHour: Zeiterfassung in schick

eHour ist eine in Java geschriebene Zeiterfassungs-Software. Läuft als Standard-WAR in einem Tomcat und greift auf eine MySQL-Datenbank zu. Druckfertige Rechnungen scheint es zwar noch nicht erzeugen zu können. Allerdings ist das Projekt sehr jung, hat kurze Release-Zyklen und steht mit Spring und Hibernate auf technologisch interessanten Beinen.
Im Auge behalten.

Eclipse: Unbeliebte Klassen ignorieren

Zu den latenten Schikanen bei der Arbeit mit SWT zählt, dass man bei Code-Completion immer wieder versehentlich Klassen aus "java.awt" importiert, da dort viele mit gleichem Namen existieren und sie alphabetisch vor "org.eclipse.swt" einsortiert werden. Ein Package-Filter in den Eclipse-Einstellungen verhindert das und sperrt dabei auch gleich noch "sun.*" aus.

WIFE: Swift-Parser für Java

In Bug #375 machte mich ein User auf einen in Java geschriebenen SWIFT-Parser aufmerksam: WIFE kann solche Dateien nicht nur lesen sondern mittels Velocity auch schreiben. Da der Code unter LGPL veröffentlicht wurde, darf er auch in kommerziellen Anwendungen genutzt werden. Wär also vielleicht auch für meine früheren Kollegen interessant ;)

Pmtool2

Ich hatte hier ja schon einige Mal erwähnt, daß ich Pmtool eventuell mit Java weiterentwickeln würde. Hier im Büro verwende ich nun eine erste Version davon. Es ist ebenfalls als Jameica-Plugin realisiert, eine Taskbar zur Schnellerfassung von Stunden gibt es auch wieder - nur halt nicht als HTML-Seite sondern als kleines SWT-Fenster. Bei der Gelegenheit habe ich auch das Datenbankschema etwas aufgeräumt. Und die erzeugten XML-Rechnungen werden nun nicht mehr in einem XLST-tauglichen Browser gerendert sondern direkt von Pmtool mittels Xalan. Es werden also direkt HTML-Rechnungen erzeugt, die auch in einem Browser angezeigt werden können, der kein XSLT versteht. Pmtool2 ist nun also keine Web-basierte Software mehr sondern quasi eine Richclient-Applikation. Eine offizielle Webseite gibt es noch nicht, wird aber sicher irgendwann folgen. Falls ihr jetzt schon einen Snapshot haben wollt, dann sagt Bescheid und ich stell die bisherige Arbeit als Download zur Verfügung.

Software und Umlaute vertragen sich nicht

Meine Güte, wie mich dieser Mist mit den deutschen Umlauten nervt. Wir fliegen zum Mond, beherrschen das Atom und lesen RSS-Feeds nebenbei. Aber bis heute fallen einem immer wieder "german umlauts" auf die Fusse.
Beispiel: ZIP-Dateien mittels Ant/java.io.zip (im konkreten Fall für SynTAX): Ich habe bisher noch keinen Zeichensatz gefunden, der ZIP-Archive mit Umlauten ermöglicht, die sowohl unter Linux als auch unter Windows fehlerfrei entpackt werden können. Cp437/Cp850 stinken, ISO8859-1 wär schön, kann aber komischerweise Windows nicht so richtig. UTF-8 mag ich nicht, Windows scheinbar auch nicht. Zwei Klopapierrollen voll Kommentare finden sich dazu auch unter http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4415733 und http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4244499.

Ich habe nun die Wahl, entweder auf Umlaute in Dateinamen zu verzichten oder getrennte Deployments für Windows und Linux zu erzeugen. Ersteres will ich nicht und letzteres wäre Unsinn wegen drei betroffenen Dateien. Oder kennt jemand noch einen Zeichensatz?

PS: Ich bin dafur, die Umlaute in der nachsten Rechtschreibreform zu streichen.

TCP-Traffic in Eclipse debuggen

Aus der Reihe "Tools, die man schonmal irgendwo gesehen aber nicht installiert hat und dann später mühsam sucht, wenn man sie doch mal gebrauchen könnte":

Mit NetTunnel kann man TCP-Verbindungen bequem in Eclipse mitschneiden - falls ein SOAP- oder RPC-Aufruf nicht so recht will und sich die Ursache nicht finden läßt. Ist in 30 Sekunden via Update-URL installiert und tut problemlos seinen Dienst.
Angenommen der Server - zu dem die Daten mitgeschnitten werden sollen - läuft auf 192.168.0.1:8080, dann trägt man als "Remote Host" und "Remote Port" "192.168.0.1" bzw. "8080" ein. Als "Local Port" wählt man einen beliebigen freien - z.Bsp. "8888" und verbindet sich mit mit dem Client nun nicht mehr direkt auf den Server sondern auf "127.0.0.1:8888".

Nomad PIM: Personal Information Manager als Eclipse RCP-Anwendung

Über Nomad PIM bin ich vor geraumer Zeit schonmal gestolpert. Manager für Termine und Aufgaben, Zeiterfassung und etwas Finanz-Verwaltung. Zum einen ein technologisch interessantes Projekt (basiert auf Eclipse RCP und nutzt schon eine Reihe neuer Features wie Annotations, Asserts und typsichere Listen aus Java5). Zum anderen kommen mir auch thematisch eine ganze Reihe von netten Ideen. Die Finanzverwaltung könnte man z.Bsp. mit Daten aus Hibiscus füttern, die Zeiterfassung mit denen aus Pmtool. Gerade beim Thema "Weiterentwicklung von Pmtool" spiele ich schon eine Weile mit dem Gedanken, statt PHP künftig Java zu verwenden. Damit könnte man zum Beispiel auch einen Offline-tauglichen Pmtool-Client schreiben.
Aaach, so viele spannende Themen und Ideen - wenn ich nur wüsste, wann ich das alles bauen könnte ;)

Eclipse: Dummy XML-Dateien aus XML-Schema erstellen

Wooo! Genau danach hab ich gesucht!
Gegeben sei ein XML-Schema (XSD). Anhand dessen soll eine neue XML-Datei erstellt werden. Bisher hab ich hierzu den Quelltext des Schemas geöffnet und basierend auf den enthaltenen Regeln mühsam eine XML-Skelett erzeugt, welches dann später via Velocity mit Daten befüllt wird.
Seit Eclipse 3.2 kann man auch umfangreiche Plugins und Features bequem mittels Callisto installieren. Unter anderem auch WTP. Dieses wiederrum enthält einen XML-Editor, der Schema-Dateien nicht nur bunt malen kann sondern auch versteht. Wenn alles installiert ist, klickt man im Navigator auf "New...»Other" und wählt "XML". Daraufhin startet ein Wizard, der mir die Option "Create XML file from an XML schema file" anbietet. Im nächsten Schritt wähle ich den Pfad zur gewünschten Schema-Datei aus und aktiviere die Optionen "create optional attributes/elements" sowie "Fill elements and attributs with data". Tada! Eine neue XML-Datei mit Dummy-Daten, die exakt dem Schema entspricht.

PS: Dieses Posting darf für Buzzword Bingo verwendet werden ;)

Bookmark: Crispy - ein Java-Framework für generischen Service-Zugriff

Damit ich die URL nicht vergesse: Crispy sieht auf den ersten Blick wie eine weitere Schicht im ohnehin schon zu dicken Multi-TIER-Dschungel aus. Hat für bestimmte Einsatzgebiete aber vermutlich seinen Sinn. Angenommen, man will einen kleinen Server schreiben, über den Hibiscus-User Informationen über unterstützte Banken, Sicherheitsmedien oder Erfahrungsberichte abrufen und hochladen können. Welches Protokoll würde man dann verwenden? RMI, XML-RPC oder gar einen ausgewachsenen Webservice? Mit Crispy fällt das nachträgliche Ändern der gewählten Technologie leichter (sowohl auf Client- als auch auf Server-Seite), denn es versteckt den Kram unter einer einheitlichen und simplen API. Lediglich «Property.EXECUTOR_CLASS» entscheidet über die zu verwendende Technik.
Werd ich mir spätestens dann mal genauer anschauen, wenn ich oben genanntes Beispiel endlich mal umsetze ;)

File#delete() unter Linux und Windows

Gegeben sei folgender Test-Code mit dem Fehler, dass ein File#delete() ausgeführt wird, obwohl der OutputStream noch offen ist.

import java.io.*;

public class Test
{
  public static void main(String[] args) throws Exception
  {
    File f = new File("test.txt");
    OutputStream os = null;
   
    try
    {
      os = new FileOutputStream(f);
      os.write("foo".getBytes());
     
      System.out.println("File#delete() liefert: " + f.delete());
      System.out.println("File#exists() liefert: " + f.exists());
    }
    finally
    {
      if (os != null)
        os.close();
    }
  }
}


Interessant hierbei ist weniger der Fehler im Code sondern die Tatsache, dass es sich bei Windows und Linux unterschiedlich auswirkt:

Windows:
D:\test> java Test
File#delete() liefert: false
File#exists() liefert: true


Linux:
$~>java Test
File#delete() liefert: true
File#exists() liefert: false


Sprich: Bei Windows wird die Datei nicht gelöscht, wenn noch ein OutputStream offen ist, bei Linux jedoch schon. Ich will lieber nicht wissen, ob dieses Verhalten vielleicht sogar noch abhängig von verwendetem Filesystem, glibc, Kernel oder Java-Version ist ;)

Thread Dump bei Deadlocks ausgeben

Problem: Eine Java-Anwendung klemmt (vermutlich aufgrund eines Dead-Locks) und man weiss nicht, an welcher Stelle im Code. http://www.weblogic.com/docs51/techsupport/threaddump.html lieferte mir die triviale Lösung mit Java-Bord-Mitteln: Einfach dem Prozess ein SIGQUIT senden. Da hätte ich auch selbst drauf kommen können ;)

"Thread Dump bei Deadlocks ausgeben" vollständig lesen

Paperdog - RCP-basiertes Dokumenten-Management-System

Eigentlich wollte ich nur mal schauen, was es da draussen so an Eclipse-RCP-Anwendungen gibt (mit dem Hintergedanken, Jameica/Hibiscus vielleicht auch irgendwann mal darauf umzustellen). Dabei stolpere ich über Paperdog - ein J2EE-basiertes Dokumenten-Management-System bestehend aus einem JBoss und einem RCP-basierten Client, der trotz SWT (benötigt ja native Libs) komfortabel und ohne Setup via Webstart gestartet werden kann.
"Paperdog - RCP-basiertes Dokumenten-Management-System" vollständig lesen