sobota, 4 grudnia 2010

Generacja dokumentów za pomocą szablonów ODT (JODReports)

Chciałbym dziś pokazać prosty przykład jak łatwo możemy generować dokumenty *.odt na podstawie szablonów, z wykorzystaniem biblioteki JODReports. Biblioteka ta pozwala nam tworzyc dokumeny z dynamicznie generowaną treścią. Najłatwiej będzie zademonstrować to na przykładzie, a więc zaczynamy...

Najpierw potrzebujemy szablon dokumentu programu OpenOffice. Tworzymy nowy dokument i wypełniamy go dowolną treścią. W miejsu gdzie chcemy podstawić dane generowane dynamicznie stosujemy specjalne zmienne: ${nazwa_zmiennej}. Dokument możemy formatować dowolnie według naszych potrzeb.

Przykładowa treść:

listing pliku: template.odt
Pan ${dluznik} ma wpłacić zaległość za fakturę nr ${nr_faktury}, firmie ${nazwa_firmy} w kwocie ${kwota} zł.


Kolejnym etapem jest wygenerowanie dokumentu na podstawie powyższego szablonu. Będziemy tutaj potrzebowali biblioteki JODReports. Tworzymy prosty program w Javie, który podstawi nam odpowiednie wartośći w miejscu wystąpienia zmiennej w szablonie.

listing pliku: GenerateDocument.java
import java.awt.Desktop;
import java.io.File;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.Map;
import net.sf.jooreports.templates.DocumentTemplate;
import net.sf.jooreports.templates.DocumentTemplateFactory;

public class GenerateDocument
{
    public static void main(String[] args) throws Exception
    {
        File templateFile = new File("template.odt"); //plik szablonu
        File outputFile = new File("document.odt"); //plik wynikowy

          DocumentTemplate template = template = new DocumentTemplateFactory().getTemplate(templateFile); //tworzymy szablon

        Map data = new HashMap(); //mapa zmiennych i ich wartosci
        data.put("nazwa_firmy", "\"Computers\"");
        data.put("nr_faktury", "AF4563/11/2010");
        data.put("dluznik", "Jan Kowlaski");
        data.put("kwota", "358,56");

        template.createDocument(data, new FileOutputStream(outputFile)); //genruje nowy dokument na podstawie szablonu i danych z mapy

          Desktop.getDesktop().open(outputFile); //otwieramy wygenerowany plik
    } 
}

Uruchomienie powyższego programu utworzy nam nowy dokument na podstawie szablonu. Poniżej wynik takiego uruchomienia:

listing pliku: document.odt
Pan Jan Kowlaski ma wpłacić zaległość za fakturę nr AF4563/11/2010, firmie "Computers" w kwocie 358,56 zł.

Wykorzystanie tej biblioteki pozowoli na zautomatyzowanie tworzenia dokumentów o stałej treści np. dla różnych klientów. Wartości zmiennych możemy wyciągać z bazy danych, pliku, itp. W przypadku gdy nie chcemy, bądź nie mamy czasu na pisanie w Javie mechanizmów odpowiedzialnych za wydruk dokumentów, formularzy, możemy wykorzystać pakiet OpenOffice do stworzenia takiej funkcjonalności właśnie dzieki wykorzystaniu szablonów. Na zakończenie dodam że biblioteka JODReports obsługuje również pliki z rozszerzeniem *.ods(arkusz kalkulacyjny).

sobota, 14 listopada 2009

Metody natywne

Zaczynamy! Mój pierwszy blog, mój pierwszy post. Dziś będzie o metodach natywnych(ang. native mathod) w Javie. Najpierw może krótko napiszę po co nam to. Metody natywne wykorzystujemy do odpalenia w Javie kodu napisanego w innym języku np C, C++, (Fortran chyba tez jest obsługiwany). Jeśli mamy duże ilości kodu napisanego w innym języku programowania to przepisanie tego na Jave będzie wymagało dużo czasu i pracy, do tego dojdą jeszcze testy itp.
Znacznie efektywniejszym sposobem jest użycie metod natywnych. Dodatkowo możemy używać metod natywnych żeby przyspieszyć działanie aplikacji pisanych w Javie. Implementacje metod natywnych zademonstruje na prostym przykładzie, który mam nadzieje zachęci Was do zglebienia bardziej szczegółowych informacji odnośnie tego tematu.

Na początku musimy napisać kod w Javie, implementujemy prosta klasę

listing HelloWorld.java
class HelloWorld
{
 public native static void print();

 static
 {
  System.loadLibrary("HelloWorld");
 }

 public static void main(String[] args)
 {
  print();
 }
}

Kod nie jest skomplikowany, wywołujemy natywna metodę print. Niżej w statycznym bloku ładujemy bibliotekę HelloWorld.

Następnie kompilujemy nasz kod:

$ javac HelloWorld.java

Kolejnym krokiem jest stworzenie pliku nagłówkowego HelloWorld.h, nie musimy jednak tworzyć tego sami.
Polecenie:

$ javah HelloWorld

wykona to za nas.

Oto listing pliku HelloWorld.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */

#ifndef _Included_HelloWorld
#define _Included_Helloworld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloWorld
 * Method:    print
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloWorld_print
  ();

#ifdef __cplusplus
}
#endif
#endif

Teraz możemy przystąpić do napisania naszej biblioteki w C

listing pliku HelloWorld.c
#include "HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloWorld_print()
{
 printf("Hello World! \n");
}

Nazwę funkcji kopiujemy z pliku nagłówkowego.

Kompilacje wykonujemy za pomocą polecenia:

$ gcc -fPIC -I jdk/include -I jdk/include -shared -o libHelloWorld.so HelloWorld.c

gdzie jdk to ścieżka do katalogu w którym znajduje się JDK, w moim przypadku wygląda to tak:

$ gcc -fPIC -I /usr/lib/jvm/java-6-sun-1.6.0.15/include
-I /usr/lib/jvm/java-6-sun-1.6.0.15/include -shared -o libHelloNative.so HelloNative.c

Nadszedł czas by sprawdzić działanie naszego programu. Ale wcześniej musimy jeszcze skonfigurować zmienną środowiskową:

$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH

i test działania:

$ java HelloWorld

Hello World!

Oczywiście metody natywne mogą przyjmować parametry czego akurat nie pokazałem w przykładzie, ale nie jest to takie trudne. Zachęcam do zainteresowania się metodami natywnymi, w internecie można znaleźć wiele informacji na ten temat. Pozwoli Wam to znacznie rozszerzyć możliwości Waszych programów np. poprzez wykorzystanie sterowników.