Java ist auch eine Insel

Samstag, November 24, 2007

Branching with Eclipse and CVS

http://www.eclipse.org/resources/resource.php?id=395

  • [html] Part 1 September 2007. by Paul Glezen and James Neethling
  • [html] Part 2 September 2007. by Paul Glezen

Labels:

AddThis Social Bookmark Button

Freitag, November 23, 2007

jodconverter für OpenOffice Dateiformatkonvertierungen

Der zweite Schritt meiner Rechnungserstellung ist die Konvertierung in PDF. Auch dazu gibt es eine prima Bibliothek: http://www.artofsolving.com/opensource/jodconverter. (Einziger Nachteil: viele Jars.) Damit kann man Word, PowerPoint, RTF und alles andere in ein bliebiges Zielformat bringen.

private static void ensureStartedOpenOfficeService()
{
  try
  {
    new Socket( "127.0.0.1", 8100 );
  }
  catch ( Exception e )
  {
    String path = "C:/Programme/OpenOffice.org 2.3/program/";
    ProcessBuilder processBuilder = new ProcessBuilder( path+"soffice", "-headless", "-accept=\"socket,host=127.0.0.1,port=8100;urp;\"", "-nofirststartwizard" );

    try
    {
      processBuilder.start();
    }
    catch ( IOException ioe )
    {
      throw new RuntimeException( ioe );
    }
  }
}

public static void convert( String source, String destination )
{
  ensureStartedOpenOfficeService();

  OpenOfficeConnection connection = null;

  try
  {
    connection = new SocketOpenOfficeConnection( 8100 );     
    connection.connect();
    DocumentConverter converter = new OpenOfficeDocumentConverter( connection );
    File inputFile = new File( source );
    File outputFile = new File( destination );
    converter.convert( inputFile, outputFile );
  }
  catch ( ConnectException e )
  {
    throw new RuntimeException( e );
  }
  finally
  {
    connection.disconnect();
  }
}

Für meine Rechnungen also:

String destination    = "S:/Private/Traida/Bills/bill1";
String destinationOds = destination + ".ods";
String destinationPdf = destination + ".pdf";
convert( destinationOds, destinationPdf );

Labels: ,

AddThis Social Bookmark Button

OpenOffice als Template-Engine: Dokument einlesen, verändern, schreiben

Da ich meine Rechnungen automatisch generiert und als PDF konvertiert haben möchte, habe nach einer Lösung gesucht, wie ich die Rechnungsdaten aus einer Datenquelle in der Template einsetzten kann, und am Ende eine PDF bekomme. Klar sind Report-Generatoren dafür auf der Welt, aber meine Vorlagen möchte ich nicht für Eclipse BIRT oder Jasper schreiben, sondern in Word bzw. OpenOffice. RTF ist relativ leicht zu schreiben und für ein Template meines Erachtens ganz gut. Meine Gedanken kreisten daher einige Zeit um RTF->PDF, doch da gibt es keine freie Lösung. Auch Wege wie RTF->FO->PDF sind möglich, aber dafür gibt es ebenfalls keine leichtgewichtigen freien Lösungen.

Schon für meinen PowerPoint->PDF-Konverter habe ich mit OpenOffice gearbeitet und das klappte ganz gut. Das habe ich für meine Templates nun wieder überlegt -- ein recht harter Weg für simple RTFs zwar, aber es funktioniert. Doch anstatt RTF zu nutzen, wollte ich gleich das XML-Format verwenden. Dazu muss man wissen, dass OO ein Zip-Archiv für das OO-Dokument vorsieht und dort in einer XML-Datei den Content ablegt. Mit der großartigen Open-Source-Bibliothek https://truezip.dev.java.net/ ist der Zugriff auf Archive sehr einfach.

Mit TrueZIP ist eine einfache Lösung entstanden, ein OO-Dokument mit Template-Anweisungen wie ${address} zu lesen, Ersetzungen vorzunehmen, und alles wieder zu schreiben. Diesen Text hier zu schreiben hat länger gedauert, als die 90 Zeilen Quellcode. Also los:


import java.io.*;
import java.nio.channels.FileChannel;
import de.schlichtherle.io.ArchiveDetector;

public class OpenOfficeUtils
{
  public static void main( String[] args )
  {
    String source      = "S:/Private/Traida/Bills/template.ods";
    String destination = "S:/Private/Traida/Bills/bill1.ods";

    copyFile( source, destination );

    String content = readOpenOfficeContent( source );

    content = content.replace( "${addressline1}", "Christian Ullenboom" );

    writeOpenOfficeContent( destination, content );
  }

  public static String readOpenOfficeContent( String filename )
  {
    Reader is = null;

    try
    {
      de.schlichtherle.io.File file = new de.schlichtherle.io.File( filename + "/content.xml", ArchiveDetector.ALL );
      char[] fileContent = new char[ (int) file.length() ];
      is = new de.schlichtherle.io.FileReader( file );  // TODO: <?xml version="1.0" encoding="UTF-8"?>
      is.read( fileContent );

      return new String(fileContent);
    }
    catch ( IOException e )
    {
      throw new IllegalArgumentException( e );
    }
    finally
    {
      try { is.close(); } catch ( Exception e ) { }
    }
  }

  public static void writeOpenOfficeContent( String filename, String content )
  {
    Writer os = null;

    try
    {
      de.schlichtherle.io.File file = new de.schlichtherle.io.File( filename + "/content.xml", ArchiveDetector.ALL );
      os = new de.schlichtherle.io.FileWriter( file );
      os.write( content );
    }
    catch ( IOException e )
    {
      throw new IllegalArgumentException( e );
    }
    finally
    {
      try { os.close(); } catch ( Exception e ) { }
    }
  }

  public static void copyFile( String in, String out )
  {
    FileChannel inChannel  = null;
    FileChannel outChannel = null;

    try
    {
      inChannel  = new FileInputStream( new File(in) ).getChannel();
      outChannel = new FileOutputStream( new File(out) ).getChannel();
      inChannel.transferTo( 0, inChannel.size(), outChannel );
    }
    catch ( IOException e )
    {
      throw new IllegalArgumentException( e );
    }
    finally
    {
      try { inChannel.close(); } catch ( Exception e ) { }
      try { outChannel.close(); } catch ( Exception e ) { }
    }
  }
}

Labels: ,

AddThis Social Bookmark Button

Strg+F11: Noch so eine komische Eclipse-Änderung

Vor nicht allzulanger Zeit startete Eclipse mit Strg+F11 das letzte Programm. Dann änderte man dies und Eclipse versuchte automatisch das im Editor aktive Programm zu starten. Ich denke, dass diese Umstellung eher lästig ist und eines der ersten Sachen sein dürfte, die man abschaltet. Das geht so: In den Preferences unter Run/Debug > Launching den Schalter bei Always launch the ... einstellen.

image

Labels:

AddThis Social Bookmark Button

Freitag, November 09, 2007

1 Stunde Suchen für eine doofe Eclipse-Einstellung

<Sarkasmus>Dankenswerterweise</Sarkasmus> hat Eclipse eine neue Einstellung bekommen, in dem gewissen Daten vom Kopieren in den Output-Folder ausgenommen werden können. Dass sich diese Einstellung unter Java > Compiler > Building befindet, fand ich erst nach langem Suchen hier: http://www.codecommit.com/blog/eclipse/wtps-crazy-and-undocumented-setting-change

wtp-screwup

Mein Problem: Bei der Entwicklung mit Wicket stehen die HTML-Seiten Seite an Seite mit den Java-Klassen. In den classes-Folder für die Web-Anwendung gingen aber nur die Klassen und nicht die HTML-Dateien. Da gestern auf einer anderen Eclipse-Version alles noch lief, war ich heute lange verzweifelt und kann glücklicherweise nach dieser Einstellung wieder an die Arbeit gehen.

Labels:

AddThis Social Bookmark Button

Sonntag, November 04, 2007

Eclipse 3.4 M3

Der dritte Milestone der Eclipse IDE ist seit sem 2.11 raus und integriert wieder interessante Features.

Von der JDT-Seite gibt es unter anderem neue Quick-Assists:

Instanceof Completion Proposals

Angaben von Eigenschaften, die über ein statisches Import hineinkommen können:

Static Members Completion

Besondere Hervorhebung von Zahlen

Picture showing custom color for numbers

Konstantenberechnungen

Picture showing Javadoc hover with constant value

Warnungen bei möglichen NullPointerExceptions

Null Pointer Access Warning Example

Labels:

AddThis Social Bookmark Button

Donnerstag, November 01, 2007

SQL für Objekte: JoSQL (SQL for Java Objects)

JoSQL (SQL for Java Objects) unter http://josql.sourceforge.net/index.html ist eine Open-Source Biblitohek, um SQL-Anfragen an Objektgrafen zu stellen. Die Webseite gibt interessante Beispiele.

String query = "SELECT * FROM   java.io.File WHERE  name LIKE '%.mp3'";
Query q = new Query();
q.parse( query );
QueryResults results = q.execute( Arrays.asList( new File("C:/Data/Musik/").listFiles() ) );
System.out.println( results.getResults() );

Oder für Ausdrücke:

/*
* Use as a file filter.
*/
String exp = "lastModified BETWEEN toDate('10/May/2007') AND toDate('28/Jun/2007') " +
"AND " +
"length >= 10 * 1024" +
"AND " +
"path LIKE '%/subdir/%'";

ExpressionEvaluator ee = new ExpressionEvaluator (exp, File.class);

if (ee.isTrue (myfile))
{
// Process the file.
}

AddThis Social Bookmark Button