This blog is mainly about Java...

Friday, December 12, 2008

Devoxx 2008 conference comes to an end


I have just attended Devoxx (former JavaPolis) in Belgium Antwerpen, and I must say I am pretty amazed. It was not how I expected it to be.

Although it is much smaller than JavaOne, it is however bigger and better than JavaZone. The conference it self was on a big cinema stadium called Metropolis. It was huge, with 8 different rooms, and all the sessions where video recorded and will be available online on Parleys
early next year.

The conference was very much focused on JavaFX since the 1.0 release came out 4th of December 2008.
I attended many different sessions such as JavaFX, WebBeans, Hibernate tuning, Dojo and DWR and how to hack and secure Java web applications, plus a few others.
I will most certainly try to attend next year again, depending on my schedule. However next time, I will try to live a little closer to the event, and not 10 minute drive or an hour walk.

Saturday, December 6, 2008

Damenes tale ved julebord 2008

Idag skal jeg holde damenes tale ved vårt julebord.
Her er talen i sin helhet:

Kjære alle sammen, men mest av alt, kjære til alle damene her ikveld. Jeg vil først og fremst takke for at jeg fikk lov til å stå her ikveld og gjøre stas på dere.
I år har jeg fått den ærefulle oppgave å holde damenes tale, hvilket er veldig rart, for jeg hadde ingen
anelse hvordan man skulle holde damenes tale.

Jeg er som kjent for mange av dere veldig flink til å forføre damene med mine velvalgte ord, og hypnotiserende kroppspråk. 
Her er jeg på hjemmebane som en løve i serengetti på jakt etter sitt utvalgte bytte.
Men det å stå foran en forsamling av velkledde, flotte og lett berusede damer og forsøke å forføre dem alle samtidig, er ingen enkel sak.
Men ingen utfordring er for stor for en velrenommert sjekker som meg. Her er det bare å begrave seg dypt i materie
og en av de første tingene som står der er at man må ha en god wingman til å hjelpe en ute i feltet.

Derfor, som den geeken jeg er tydde jeg til Google som min trofaste wingman og søkte opp "damenes tale", og det første treffet jeg får opp er følgende:

"Damenes tale er som regel en veldig morsom tale. En ganske kompleks tale som krever mye av deg som skal holde den.
Damenes tale er kanskje den mest omtalte talen man kan holde hvis man ser bort fra den likestilte talen Herrenes tale."


Dette høres veldig utfordrende ut men jeg skal gjøre mitt beste og ta tyren ved hornene. 

Det finnes vesentlig store forskjeller mellom gutter og jenter. Ikke minst utspringer disse forskjellene seg i sjekke scenen.

Her følger en typisk sjekke-prosedyre på en bar en sen lørdagskveld nær stengetid sett fra en gutts perspektiv:

- Gutt ser jente som er sexy.
- Gutt tar en stoor slurk av drinken for å manne seg opp
- Gutt venter ti minutter til jente er alene (før han tør å dra bort)
- Gutt tar en ny stooor slurk
- Gutt drar bort og åpner med et sleskete uttrykk: "Hei sexy, hvordan går det?" (blunker)
- Jente ser stygt på gutt og danser videre
- Gutt står å ser dum ut
- Gutt begynner å danse for seg selv i noen sekunder
- Gutt tar en ny slurk og går tilbake til lattermilde kompiser

Og her følger kvinnenes typiske sjekke-prosedyre.

- Jente ser forførende på gutt (pause)
- Jente blir med gutt hjem
- Så lar jeg dere selv sette inn det sensurerte mellom linjene

Ikke mindre vanskelig er det for dere heller tidligere på lørdagskvelden utenfor inngangen til utestedet.

- Jente ankommer utested og ser mil lang kø.
- Jente går forbi køen, smiler til dørvaktene, viser litt pupper og lår, og slipper gratis inn.

- Gutt ankommer utested
- Gutt plasserer seg helt bak den milelange køen bak andre virile og håpefulle beilere i timesvis
- Gutt fryser
- Gutt fryser enda mer
- Timesvis etterpå står gutt håpefull først køen
- Gutt må stå enda noen minutter
- Gutt fryser
- Dørvakt kommer bort til gutt og påminner gutten om at det er et lukket selskap, eller at joggeskoene og manglende skjorte ikke står helt i stil til stedet, som egentlig direkte oversatt betyr:
"Jeg bruker min steroid forspiste kropp som ikke duger til annet enn å krympe ballene og hjernecellene mine til å vise deg at fordi du garantert er mye smartere enn meg
og tjener mer enn meg, så skal jeg bruke min autoritære mulighet til å overbevise meg selv om at livet mitt ikke stinker, og at jeg kan få noen små ynkelige gleder i livet".
- Gutt må betale ekstra til dørvakta for å slippe inn, i tillegg til inngang.

Men det er ikke så rart at vi gutter går gjennom alt dette for dere skjønne piker. Ja, for hva gjør ikke vi gutter for dere jenter? Vi spiste til og med eplet for dere vi.

For hadde det ikke vært for dere hadde vi fortsatt kost oss i Edens have i perfekt harmoni med alle dyrene.

Istedet har dere tatt til takke med en mink i skapet, en jaguar i garasjen, en tiger i senga og en bjellesau som betaler for alt dere vil ha.

Nei men fra spøk til alvor, vi gutter hadde aldri klart å leve uten dere vakre jenter som fyller hverdagen vår. Vi er kjempe glad i dere og derfor spør jeg dere om dere vennligst kan komme opp her alle sammen.

Jeg vil at alle gutta skal se godt på de kjære og vakre jentene vi har i Redpill Linpro. De sørger for å komplementere hverdagen vår og 

bidrar til at vår testosteron nivå balanseres med deres østrogen til å skape en mer eller mindre perfekt symbiose.

Det er veldig vanlig å gi roser til den bedre halvdelen. Men roser varer kun bare noen uker, og de eksisterer kun for å være vakre, og hvis de står en stund så visner de bare.
Så det er det samme som å si at vår kjærlighet baserer seg kun på utseendet.
Derimot, en potet varer evig, og i poteten er det det indre som teller. Faktisk, har du poteten liggende lenge nok, ikke bare vil den IKKE råtne,
men det vokser faktisk ting ut av poteten, så det er det samme som å si at vår kjærlighet vokser gjennom tiden. Derfor vil jeg på vegne av alle gutta beære de vakre jentene i Redpill Linpro med hver sin potet.

- Da vil jeg at alle guttene skal reise seg opp og skåle for verdens vakreste skapninger. Skål!

Takk for meg...

Wednesday, December 3, 2008

Dynamically generate ODT and PDF documents from Java

I would like to generate a OpenOffice document and a PDF document without having a running OpenOffice service in Java. This was not as easy as it sounds, however I have found a solution.

You can create ODT document fairly easy without having a running instance of OpenOffice. However I have not found an easy way to convert that document to a PDF. However, I found a solution for the latter when running Linux. 

All the following libraries are Open Source .

The easiest way to generate ODT documents from templates is by using a (unmaintaned) library by the name of JOOReport. JOOReport uses Freemarker to create ODT documents based on templates. 

Basically what you need to do is create a template odt document in OpenOffice and whereever you want to insert something, you can insert it with the syntax 
${anythingGoesHere}
ie: My name is ${name}

When you have finished implementing the template, you must then create a properties file defining the values. 

ie. 
name=
age=
birthday=
address=


We can then from the Java program get the Properties file, and fill inn already pre defined variables. We then give the template and the properties file as well as the output odt file in arguments to the program. After the creation is successfull, the easiest way is to call a linux program called 
odt2pdf someFile.odt

which takes the odt file as argument and creates a pdf file with the same name. 

Vouila. As easy as that. You can also style the template as you like and the styling will also be implemented in the generated output file.

This is a standalone program that creates a document from a template and a data file and converts it to the specific format. 


// JOOReports - The Open Source Java/OpenOffice Report Engine 
// Copyright (C) 2004-2006 - Mirko Nasato 
// 
// This library is free software; you can redistribute it and/or 
// modify it under the terms of the GNU Lesser General Public 
// License as published by the Free Software Foundation; either 
// version 2.1 of the License, or (at your option) any later version. 
// 
// This library is distributed in the hope that it will be useful, 
// but WITHOUT ANY WARRANTY; without even the implied warranty of 
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 
// Lesser General Public License for more details. 
// http://www.gnu.org/copyleft/lesser.html 
// 
package net.sf.jooreports.tools; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.net.ConnectException; 
import java.util.Properties; 

import org.apache.commons.io.FilenameUtils; 

import net.sf.jooreports.converter.DocumentConverter; 
import net.sf.jooreports.openoffice.connection.OpenOfficeConnection; 
import net.sf.jooreports.openoffice.connection.SocketOpenOfficeConnection; 
import net.sf.jooreports.openoffice.converter.OpenOfficeDocumentConverter; 
import net.sf.jooreports.templates.DocumentTemplate; 
import net.sf.jooreports.templates.UnzippedDocumentTemplate; 
import net.sf.jooreports.templates.ZippedDocumentTemplate; 
import freemarker.ext.dom.NodeModel; 

/** 
 * Command line tool to create a document from a template and a data file 
 * and convert it to the specified format. 
 * 


 * The data file can be in XML format or a simple .properties file. 
 * 


 * Requires an OpenOffice.org service to be running on localhost:8100 
 * (if the output format is other than ODT). 
 */ 
public class CreateAndConvertDocument { 

  public static void main(String[] args) throws Exception { 
  if (args.length < 3) { System.err.println("USAGE: "+ CreateAndConvertDocument.class.getName() +" "); 
  System.exit(0); 
  }  
  File templateFile = new File(args[0]); 
  File dataFile = new File(args[1]); 
  File outputFile = new File(args[2]); 

  DocumentTemplate template = null; 
  if (templateFile.isDirectory()) { 
  template = new UnzippedDocumentTemplate(templateFile); 
  } else { 
  template = new ZippedDocumentTemplate(templateFile); 
  } 
   
  Object model = null; 
  String dataFileExtension = FilenameUtils.getExtension(dataFile.getName()); 
  if (dataFileExtension.equals("xml")) { 
  model = NodeModel.parse(dataFile); 
  } else if (dataFileExtension.equals("properties")) { 
  Properties properties = new Properties(); 
  properties.load(new FileInputStream(dataFile)); 
  model = properties; 
  } else { 
  throw new IllegalArgumentException("data file must be 'xml' or 'properties'; unsupported type: " + dataFileExtension); 
  } 
   
  if ("odt".equals(FilenameUtils.getExtension(outputFile.getName()))) { 
  template.createDocument(model, new FileOutputStream(outputFile)); 
  } else { 
  OpenOfficeConnection connection = new SocketOpenOfficeConnection(); 
  try { 
  connection.connect(); 
  } catch (ConnectException connectException) { 
  System.err.println("ERROR: connection failed. Please make sure OpenOffice.org is running and listening on port "+ SocketOpenOfficeConnection.DEFAULT_PORT +"."); 
  System.exit(1); 
  } 
   
  File temporaryFile = File.createTempFile("document", ".odt"); 
  temporaryFile.deleteOnExit(); 
  template.createDocument(model, new FileOutputStream(temporaryFile)); 
  
  try { 
  DocumentConverter converter = new OpenOfficeDocumentConverter(connection); 
  converter.convert(temporaryFile, outputFile); 
  } finally { 
  connection.disconnect(); 
  } 
  } 
  } 
}




Labels