JBoss 5 ist fertig + Application Servers 2008 Rankings

Nach 3 Jahren gibt es nun (endlich) den JBoss 5 AS. Einige Meldungen und Meinungen dazu:

JBoss 5 taucht aber (noch) nicht als zertifizierter Java EE 5 Container unter http://java.sun.com/javaee/overview/compatibility.jsp auf, obwohl http://sacha.labourey.com/2008/09/15/jboss-as-is-now-ee5-certified/ davon berichtet.

Unter http://www.theserverside.com/news/thread.tss?thread_id=51008 wird der EDC report – "Application Servers 2008 Rankings" (http://www.evansdata.com/reports/viewRelease_download.php?reportID=20) diskutiert. Die Kommentare sind lesenswert. Der Download des Papers verlangt ein Login, ist aber ansonsten frei.

Inselraus: getContextClassLoader() vom Thread

Entwickler von Java-Enterprise-Applikationen haben oft damit zu kämpfen, dass immer der falsche Klassenlader eine Klasse bezieht und die Typen dann nicht zusammenpassen. In unserem Beispiel mit dem statischen Initialisierungsblock ist gut zu erkennen, dass durch das zweimalige Laden die Laufzeitumgebung auch zweimal die Anweisungen ausführt. Hätten wir Singletons definiert, würden ihre statische Anfragemethoden unterschiedliche, nicht kompatible Objekte liefern, obwohl es laut Defini-tion eines Singletons der Fall sein müsste. Allgemein gesprochen: Besonders Fabrikfunktionen liefern bei mehreren Versionen der Klasse unterschiedliche Objekte, die nicht zusammenpassen. Zwei Lösungen gibt es hier: Zum einen bekommen die Fabrikfunktionen einen Klassenlader, in dessen Kontext sie die Klassen erzeugen können, oder sie nutzen den Klassenlader, der mit einem Thread ver-bunden ist.

Jeder Thread ist mit einem Klassenlader assoziiert, der standardmäßig mit dem Standardklassenlader identisch ist. getContextClassLoader() auf dem Thread-Objekt bezieht diesen Klassenlader:

Listing 8.13    com/tutego/insel/lang/ThreadClassLoader.java, main()
ClassLoader loader = Thread.currentThread().getContextClassLoader();
System.out.println( loader );  // sun.misc.Launcher$AppClassLoader@a12a00
loader = ThreadClassloader.class.getClassLoader();
System.out.println( loader );  // sun.misc.Launcher$AppClassLoader@a12a00

Soll der assoziierte Klassenlader geändert werden, bewerkstelligt dies setContextClassLoader().

Inselraus: Ein flexibles Tabellenlayout mit JGrid

Eine JTable ist zwar eine einfache Komponente, doch schon in der HTML-Tabelle gibt es Eigenschaften, die die JTable nicht abbilden kann: Zellen, die über mehrere Zeilen und Spalten gehen. Hier ist einiges an Programmieraufwand nötig, der jedoch für diejenigen unnötig ist, die auf die freie Komponente JGrid zurückgreifen. Die Swing-Komponente gehört zu Pepper (http://jeppers.sourceforge.net/), einer Komponente für Tabellenkalkulationen, die sogar eine Formelauswertung ähnlich Excel versteht. Pepper selbst untersteht zwar der GPL, doch JGrid ist LGPL und lässt sich somit in eigene kommerzielle Anwendungen einbinden.

http://openbook.galileocomputing.de/javainsel7/bilder/jgrid.gif

PS: tutego bietet nun auch ein GWT-Seminar an:

Thema der Woche: SwingX

Die Anzahl Swing-Komponenten ist nicht besonders groß und seit dem Swing in Java 1.2 fest eingeführt wurde, hat sich wenig an Swing verändert. Im Laufe der Zeit sind diverse Projekte mit Zusatzkomponenten und Swing-Erweiterungen entstanden, wobei SwingX (http://swinglabs.org/) zu den bekannteren gehört.

SwingX wurde in den letzten Tagen mit mehr Aufmerksamkeit bedacht, seit dem Sun angekündigt hat, dass SwingX-Projekt nicht mehr zu unterstützten. Zusammen mit diversen Blog-Einträgen ergibt sich der Eindruck, dass Swing für Sun keine besondere Rolle spielt, sondern Sun stattdessen Geld und Entwicklerkapazität in JavaFX steckt. Lese dazu

Joda Time 1.6/JSR 310

Von Joda Time (http://joda-time.sourceforge.net/) gibt es ein neues Update in der Version 1.6 (vom 2008-10-27). Interessant bleibt zu sehen, wie sich Joda Time im Laufe der Zeit gegenüber der JSR 310: A New Java Date/Time API abhebt.

Zur JSR 310, die in Java 7 erwartet wird:

Stephen Colebourne ist einer der treibenden Personen von Joda Time und auch Specification Lead der JSR 310.

Java EE 6 in der Endphase der Spezifikation

Die JSR-316 (http://jcp.org/aboutJava/communityprocess/edr/jsr316/index.html) ist eine Umbrella-API für Java EE 6. Am 22. November 2008 war der Close of Early Draft Review, sodass Java EE 6 nun in die heiße Endphase geht. Interessante neue APIs in Java EE 6 sind:

  • JSR-311 JAX-RS: Java API for RESTful Web Services
  • JSR-299 Web Beans
  • JSR-236 Timer for Application Servers
  • JSR-237 Work Manager for Application Servers

Erwartet Updates gibt es bei

  • Enterprise JavaBeans
  • Java Persistence API
  • Servlets
  • JavaServer Faces
  • JAX-WS
  • Java EE Connector API

NetBeans IDE 6.5

Von der Webseite (http://www.netbeans.org/servlets/NewsItemView?newsItemID=1313):

NetBeans.org is proud to announce the availability of NetBeans IDE 6.5!

NetBeans IDE 6.5 offers simplified and rapid development of web, enterprise, desktop, and mobile applications with PHP, JavaScript, Java, C/C++, Ruby, and Groovy.
New features include a robust IDE for PHP, JavaScript debugging for Firefox and IE, and support for Groovy and Grails. The release also delivers a number of enhancements for Java, Ruby on Rails, and C/C++ development. Java highlights include: built-in support for Hibernate, Eclipse project import, and compile on save. Combining excellent out of the box experience, compelling features, and a great plugin ecosystem, NetBeans IDE 6.5 is a must-download for all developers.
NetBeans IDE 6.5 is currently available in English, Japanese, Simplified Chinese and Brazilian Portuguese. There are several community contributed localization efforts underway to support additional languages. Join the efforts today.
More information about NetBeans IDE 6.5:

As always, we welcome and encourage feedback about your experience using the NetBeans IDE. Share your thoughts on our mailing lists and forums; if you blog about NetBeans add your blog to Planet NetBeans. NetBeans is now on Twitter! Follow us at twitter.com/netbeans to get the latest news and information, ask questions and engage with the NetBeans team.

Diskussion und Anwendung von Ribbon-Komponenten

Kirill Grouchnikov hat unter http://www.pushing-pixels.org/?p=622 einen langen Blog verfasst, in dem er sich mit der Entwicklung und Einsatz der Ribbon-Komponente befasst. Der Blog mit seinen vielen Links ist auf jeden Fall lesenswert. Für Java hat Kirill eine Ribbon Komponente implementiert, die Teil vom Flamingo Framework (https://flamingo.dev.java.net/) ist. Die Dokumentation https://flamingo.dev.java.net/docs/ribbon/ribbon-overview.html zeigt Screenshots und die API dahinter.

Thema der Woche: Das XML-Modell XOM

XOM (http://www.xom.nu/tutorial.xhtml) ist ein XML-Modell von Elliotte Rusty Harold, welches eine Alternative zu DOM, aber auch zu moderneren XML-Modellen JDOM und dom4j ist.

Um die Philosophie hinter dem Design zu verstehen, hat Elliotte Rusty Harold mit Bill Venners auf artima ein Interview geführt.

Aufgabe: Gehe mit XOM und XPath an das XML-Ergebnis einer REST-Abfrage http://www.flickr.com/services/api/flickr.places.findByLatLon.html und gib nur die place_url aus.

http://acs.lbl.gov/nux/ lässt sich als Erweiterung von XOM verstehen. Was macht NUX genau?

Jersey 1.0 (JAX-RS) ist fertig

Im Sun-Blog ist http://blogs.sun.com/theaquarium/entry/jersey_1_0_just_shipped ist zu lesen:

JAX-RS co-spec lead and Jersey lead Paul Sandoz just announced Jersey 1.0 availability. v1.0 moments are always special and this one is certainly no exception given how progress was made on a regular basis from engineering hard work and lots of community feedback. Congrats to Paul and the entire community for a well run open source project !

Jersey 1.0 is obviously a JAX-RS 1.0 implementation, but it also adds Spring integration, a REST client, and obviously is production quality…
One of the signs of a community-involved project is the many ways the bits can be accessed: GlassFish v2 and v3, NetBeans 6.5, Maven 2, zip, etc…

With Jersey 1.0 out the door, you can now freely choose your Web Services style and stick to standards. Java EE 6, scheduled sometime mid-2009, will make this even clearer though a maintenance release.
See Jersey for more stories.

Thema der Woche: Sun Certified Java Programmer (SCJP)

The Sun Certified Java Programmer (SCJP) exam is the entry level Java exam and is a prerequisite to a number of the other Java-related certifications. SCJP 6, designated CX-310-065 by Sun, was released in December 2007. It is designed to have a fairly detailed test of basic knowledge of the essentials of the Java programming language. It tests looping constructs and variables, and does not cover specific technologies such as GUI creation, Web or network programming. It is assessed through an automatically administered multiple-choice test system and consists of 72 questions which the candidate has 210 minutes to answer. At least 47 questions are needed to be correct to pass (around 65%). The SCJP 5 exam tests a candidate on knowledge of declarations, access control, object orientation, assignments, operators, flow control, assertions, string handling, I/O, parsing, formatting, generics, collections, inner classes, threads and the JDK toos (Quelle: http://en.wikipedia.org/wiki/Sun_Certified_Professional).

Zur Vorbereitung auf den SCJP gibt es im Netz viele Fragen, die denen aus dem SCJP sehr ähnlich sind. Auch wer kein SCJP machen möchte, sollte sich mit dem Thema beschäftigen, da es doch das tiefe Verständnis der Sprache Java schärft (weniger den Bibliotheken oder dem Design von großen Anwendungen!)

Aufgabe: Trage 30 der spannendsten Fragen zusammen.

TWAIN-Scannen mit Java

http://www.mms-computing.co.uk/uk/co/mmscomputing/device/twain/ ist eine Java-API für die TWAIN-Schnittstelle, um etwa einen Scanner anzusteuern. Ein Beispiel ist schnell aufgebaut:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;

import org.jdesktop.swingx.JXFrame;
import org.jdesktop.swingx.JXImagePanel;
import org.jdesktop.swingx.JXImagePanel.Style;

import uk.co.mmscomputing.device.scanner.Scanner;
import uk.co.mmscomputing.device.scanner.ScannerIOException;
import uk.co.mmscomputing.device.scanner.ScannerIOMetadata;
import uk.co.mmscomputing.device.scanner.ScannerListener;
public class TwainExample
{
  @SuppressWarnings("serial")
  public static void main( String[] args )
  {
    final JXImagePanel imagePanel = new JXImagePanel();
    imagePanel.setStyle( Style.SCALED_KEEP_ASPECT_RATIO );
    final Scanner scanner = Scanner.getDevice();
    JXFrame f = new JXFrame( "SSP", true );
    Action action = new AbstractAction("Scan") {
      @Override public void actionPerformed( ActionEvent e ) {
        try { scanner.acquire(); } catch ( ScannerIOException ex ) { }
      }
    };
    f.add( new JButton(action), BorderLayout.PAGE_START );
    f.add( imagePanel );
    f.setSize( 1000, 700 );
    f.setVisible( true );
    scanner.addListener( new ScannerListener()
    {
      public void update( ScannerIOMetadata.Type type, ScannerIOMetadata metadata )
      {
        if ( ScannerIOMetadata.ACQUIRED.equals( type ) )
          imagePanel.setImage( metadata.getImage() );
      }
    } );
  }
}

Globale Tastendrücke und Mausoperationen abfangen (Windows)

Globale Mausbewegungen von Java zu überwachen ist mit dem MouseInfo.getPointerInfo().getLocation() kein Problem. Aber mitzubekommen, ob in einer anderen Java-Applikation eine Maustaste oder eine andere Keyboard-Taste gedrückt ist, schon. Wer vor dem Problem steht, dies unter Java und Windows abzufangen, kann SWT zusammen mit den SWT Win32 Extensions (http://www.swtui.cn/index.php) nutzen — auch wenn man selbst nicht mit SWT, sondern mit Swing arbeitet. Soll etwa global die <Pause> Taste abgefangen werden, kann man schreiben:

Hook.KEYBOARD.addListener(new HookEventListener() {
    public void acceptHookData( HookData hookData ) {
      if ( ((KeyboardHookData) hookData).getVirtualKeyCode() == KeyEvent.VK_PAUSE &&
          ! ((KeyboardHookData) hookData).getTransitionState() ) {
         // TU WAS DICH GLÜCKLICH MACHT
      }
} } );
Hook.KEYBOARD.install();

Neben Hook.KEYBOARD gibt es auch Hook.MOUSE.

Möchte man nun beides zusammen haben, also wissen, ob etwa STRG und eine Maustaste gedrückt wurde, meldet man einen HookEventListener für die Maus an und fragt die Taste wie folgt ab:

Extension.GetKeyState(Extension.VK_CONTROL) < 0

Heise schreibt: "Bedarf an Java-Experten legt weiter rasant zu"

http://www.heise.de/newsticker/Bedarf-an-Java-Experten-legt-weiter-rasant-zu–/meldung/116871

Ob man bei der Aussage "Die Ausschreibungen im Bereich Java haben seit Jahresbeginn stark zugenommen und im August erstmals das Niveau der entsprechenden Projektangebote für SAP-Experten erreicht" dies auf Stärke von Java zurückführen kann, oder einfach nur auf die gesunkene Anfrage von SAP sei einmal dahingestellt.

Dass es einen "Aufschwung hat auch die Nachfrage nach Spezialisten für C++" gibt, haben wir bei tutego tatsächlich gemerkt, da vermehrt Anfragen nach C++ und insbesondere der Boost-Bibliothek zu verzeichnen ist.

HOWTO: Change Title, Autor, Subject of a PDF

package com.tutego.traida.util;

import java.io.FileOutputStream;
import java.util.HashMap;

import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfStamper;

public class PdfUtils
{
  public static void setMetaData( String sourceFilename, String targetFilename )
  {
    try
    {
      PdfReader pdfReader = new PdfReader( sourceFilename );
      PdfStamper stamp = new PdfStamper( pdfReader, new FileOutputStream( targetFilename ) );

      @SuppressWarnings("unchecked")
      HashMap<String, String> info = pdfReader.getInfo();
      info.put( "Title", "Rechnung für Beratung" );
      info.put( "Author", "tutego" );
      info.put( "Subject", "Rechnung" );
      info.put( "Keywords", "Rechnung, tutego" );
      info.put( "Creator", "http://www.tutego.com/" );
      info.put( "Producer", "tutego Training Software 1.2" );

      stamp.setMoreInfo( info );
      stamp.close();
      pdfReader.close();
    }
    catch ( Exception e )
    {
      e.printStackTrace();
    }
  }

  public static void main( String[] args )
  {
    setMetaData( "c:/a.pdf", "c:/new.pdf" );
  }
}

With iText of course:  http://www.lowagie.com/iText/

Tja, Neal Gafter geht zu Microsoft

Also mich wundert’s nicht… Von Nealls Webseite http://gafter.com/~neal/:

I work for Microsoft on the dotNet platform languages. To balance my life, my hobby is designing and developing the future of the Java programming language. See, for example, my proposal to add closures to the Java Programming Language. I’ve also been discussing it on my blog.

Also von Sun zu Google und dann zu MS. (Eigentlich hatte MS immer damit zu kämpfen, dass die Mitarbeiter zu Google abwandern.)

Alpha-Version vom JAva COm Bridge (JACOB) Plug-In

Das Eclipse-Plugin http://jacob-project.wiki.sourceforge.net/Jacob+Gen+Plugin erlaubt über einen Menüeintrag einfach das Erzeugen von Stub-Code für den Zugriff auf Windows-DLLs.

 

JacobGenScreenShot.PNG

Der Generator geht einen interessanten Weg über Eclipse JET, wie es die Webseite erklärt:

The plug-in uses the old, JacobGen 0.7, c++ program (dll) which reads a Microsoft’s proprietary TLB file and writes out what it finds on stdout. From the information gathered the plug-in produces an ecore model based of what is found inside the TLB. At this point the plug-in has created a model of what’s inside the DLL file. I.E. what classes and enums exist. The plug-in uses Java Emitter Templates (JET) to generate java code based on the above ecore model. It also produces the java method bodies to automatically call JACOB methods with the correct parameters. This will create a strongly typed java proxy, via JACOB, into the windows DLL.
So to wrap up. The plug-in reads the TLB file (using the existing JacobGEN DLL), creates a model based on the TLB / DLL file, and then produces a java proxy. The JET generated classes are really a proxy into the DLL via JACOB. So the end result is a set of java classes hiding all JACOB internal knowledge.

Und überall sitzt die OSGi Service Platform drunter…

Unter http://www.earthtimes.org/articles/show/world-leading-enterprise-application-server-providers,541827.shtml und http://www.osgi.org/blog/2008/09/impressive-press-release.html führen die Autoren auf, wie beliebt mittlerweile OSGi als Basis für Java EE Container ist. Peter Kriens führt folgende Container auf:

  1. IBM Websphere. They started in 2006 and aggresively moved their code on OSGi. Obviously it helped that IBM has committed itself to OSGi since day -1.
  2. Oracle WebLogic. Formerly known as BEA weblogic. BEA was one of the first companies public touting the advantages of OSGi, clearing the road for others.
  3. Paremus Infiniflow. Paremus has pioneered the use of OSGi in highly distributed application servers allowing the system to scale to unprecendented heights.
  4. ProSyst ModuleFusion. ProSyst is the key provider of OSGi technology in the embedded worlds but originated from the development of a J2EE server. They are now back in this market with an offering based completely on OSGi.
  5. Redhat JBoss. JBoss already worked with a microkernel approach but recognized the advantages of a standard two years ago.
  6. SAP Netweaver. Well, they are not yet based on OSGi, but they clearly see their future based on the OSGi specifications and are becoming more and more active in the OSGi Alliance.
  7. SpringSource Application Platform. The company that simplified Enterprise development with their Spring Framework decided to create their own offering in the application server market completely based on the OSGi specifications.
  8. Sun Glassfish. And last, but definitely not least, Sun decided to use OSGi in the JEE reference implementation Glassfish. They clearly take OSGi extremely serious nowadays since they also hired Richard S. Hall. It is so good to see Sun back at the OSGi Alliance.

Interessant sind zwei Feststellungen:

  1. In der Regel geben die Container die OSGi-Implementierung nicht nach oben weiter, abstrahieren also von den Internas. Nur einige Produkte erlauben, auch selbst OSGi-Bundles anzumelden.
  2. Java EE und das SpringFramework sind beides Nutznießer der OSGi-Plattform. Man kann nun fragen, ob man sich überhaupt noch mit OSGi selbst beschäftigen muss, wenn etwa GlassFish oder http://www.springsource.com/products/suite/applicationplatform gute Abstraktionen bieten.