Java ist auch eine Insel

Mittwoch, Mai 30, 2007

Some more information about eBays J2EE application?

The presentation The eBay Architecture – Striking a balance between site stability, feature velocity, performance and cost gave me a first impression of the internal architecture but I would like to know a little bit more about the realization. J2EE is (inglorious) “famous” for EJBs, JMS, JCA, … but these terms are not mentioned in the pdf. I got the impression that eBay is not really using the „hard“ stuff.

  • “eBay internally-developed pure Java OR mapping solution.” OK. No CMP. That implies that the container is not responsible for CMT.
  • “Keep Application Tier Completely Stateless”. Ok. No Stateful Session Beans.
  • “eBay scales on Servlets and a rewritten connection pool.” Hm. So no JDBC 2 connection pool from a vendor. So why is this a Java EE application? Because of Stateless Session Beans? (Then JNDI is in the boat.) The Spring folks will see a opportunity for POJOs on Tomcat/Jetty, … :-)

Does anyone have some more information about this?

AddThis Social Bookmark Button

Dienstag, Mai 29, 2007

Insel: Eine Kopie von java.awt.Graphics erstellen

Das Zeichensystem übergibt an die paintXXX()-Methoden ein Graphics-Objekt, das wir zum Zeichnen oft verändern, etwa um einen Farbe für nachfolgende Operationen zu setzen. Stehen eigene Zeichenfunktion jedoch nicht am Ende der Zeichenfolge, ist es wichtig, den Grafikkontext so zu restaurieren, wie er am Anfang war, um nachfolgende Zeichenoperationen nicht zu beeinflussen. Wichtig ist dies etwa bei Swing-Komponenten, wo paint() die Methoden

  • protected void paintComponent( Graphics g )
  • protected void paintBorder( Graphics g )
  • protected void paintChildren( Graphics g )

aufruft. Nun lässt sich leicht ausmalen, was passiert, wenn unsere Funktion paintComponent() ein verhunztes Graphics-Objekt hinterlässt.

Die erste Lösung ist, sich die alten Zustände zu merken und zurückzusetzen:

Color oldColor = g.getColor();

g.setColor( newColor );

g.setColor( oldColor ); // Farbe zurücksetzten

Bei wenigen Eigenschaften funktioniert das gut, doch werden es mehr, ist es sinnvoller, eine Kopie aller Zustände des Grafik-Kontexts vorzunehmen. Dazu dient die Funktion create(). Von großer Wichtigkeit ist hier, diesen temporäreren Kontext auf jeden Fall mit dispose() wieder freizugeben, um keinen Speicherplatz zu blockieren.

@Override protected void paintComponent( Graphics g )

Graphics gcopy = g.create(); // Kopie erfragen

try {

gcopy.draw… // Alle Zeichenopertationen über gcopy

}

finally {

gcopy.dispose(); // Kopie freigeben

}

Ist definitiv keine Ausnahme zu erwarten, kann der try/catch-Block entfallen.

Labels:

AddThis Social Bookmark Button

Sonntag, Mai 20, 2007

Gegenüberstellung Java und C#

Die Webseite http://www.25hoursaday.com/CsharpVsJava.html widmet sich sehr detailiert den Unterschieden (und natürlich Gemeinsamkeiten) der beiden Sprachen Java und C#.  Die Diskussion ist auf der Basis von Java 6 und C# 2.0, wobei der Autor Dare Obasanjo in seiner Zusammenfassung auch Bezüge zu C# 3.0 herstellt.

AddThis Social Bookmark Button

Erste Implementierung für JSR 308

Die JSR 308 (Annotations on Java Types) hat unter anderem das Ziel, Annotationen an weiteren Dingen festzumachen:

  • for generic type arguments to parameterized classes:
        Map<@NonNull String, @NonEmpty List<@Readonly Document>> files;

  • for generic type arguments in a generic method or constructor invocation:
        o.<@NonNull String>m("...");

  • for type parameter bounds and wildcards:
        class Folder<F extends @Existing File> { ... }
    Collection<? super @Existing File>

  • for class inheritance:
        class UnmodifiableList<T> implements @Readonly List<@Readonly T> { ... }

  • for throws clauses:
        void monitorTemperature() throws @Critical TemperatureException { ... }

  • for typecasts:
        myString = (@NonNull String) myObject;

  • for type tests:
        boolean isNonNull = myString instanceof @NonNull String;

  • for object creation:
        new @NonEmpty @Readonly List<String>(myNonEmptyStringSet)

    For generic constructors (JLS section 8.8.4), the annotation follows the explicit type arguments (JLS section 15.9):

        new <String> @Interned MyObject()

  • for method receivers:
        public int size() @Readonly { ... }

  • for class literals:
        Class<@NonNull String> c = @NonNull String.class;

  • for arrays:
        Document[@Readonly][] docs4 = new Document[@Readonly 2][12];
    Document[][@Readonly] docs5 = new Document[2][@Readonly 12];

    This syntax permits independent annotations for each distinct level of array, and for the elements; see Section 3.4 for alternative syntaxes.


Die Beispiele stammen aus dem working document von Michael D. Ernst. Auf seiner Homepage lässt sich die Compilererweiterung herunterladen und alles über die JSR 308 nachlesen.

AddThis Social Bookmark Button

Donnerstag, Mai 17, 2007

Java-Spiel FreeCol - Remake von Sid Meier’s Colonization

FreeCol ist ein Open-Source (GPL) Spiel in Java und ist stark angelehnt an Sid Meier’s Colonization.

Die Grafiken sind ausgezeichnet: http://www.freecol.org/index.php?section=5.

AddThis Social Bookmark Button

Samstag, Mai 12, 2007

NASA stellt seine World Wind Applikation in Java vor

Eigentlich ganz cool und flott in der Darstellung. Es gibt eine JNLP-Datei für Web-Start, mit der man das gleich ausprobieren kann. Interessant ist auch folgende Aussage:

With this SDK, developers can embed World Wind technology in their own applications. The API documentation will be made available later.

Mit "Place Name" würde ich mir jetzt irgendwie Ortsnamen wünschen, die kommen aber nicht. Der Server könnte auch schneller sein und für feine Auflösungen sind nicht immer Kacheln dabei. Sehr merkwürdig, dass beim Zoom mal Kacheln kommen und dann wieder verschwinden.

Eine erste Programmieranleitung habe ich hier gefunden.

AddThis Social Bookmark Button

Insel: Ist eine Datei eine Verknüpfung (.lnk-Datei unter Windows)?

Bisher ist die File-Klasse noch nicht so ausgestattet, dass sie alle Fragen ohne Hacks beantwortet. Mit der JSR 203: „More New I/O APIs for the Java Platform“ ist hoffentlich Besserung auf dem Weg, aber heute kann die Frage nach der Dateiverknüpfung nur eine interne sun.awt.shell.ShellFolder beantworten. Die Klasse liefert bei .lnk-Dateien unter Windows mit isLink() ein klares true/false, gibt die Zieladresse mit getLinkLocation() und auf Anfrage mit getIcon() das assoziierte Datei-Icon als Image dazu.

String s = "C:\\Dokumente und Einstellungen\\All Users\\Startmenü\\Programmzugriff und -standards.lnk"
ShellFolder folder = ShellFolder.getShellFolder( new File( s ) );
System.out.println( folder.getFolderType() ); // Verknüpfung
if ( folder.isLink() )
System.out.println( folder.getLinkLocation() ); // C:\WINDOWS\system32\control.exe

Labels:

AddThis Social Bookmark Button

Mittwoch, Mai 09, 2007

Contact to javax.beans.binding

This little example will show you how to bind a JTextField to a name property of a Person with Beans Binding (JSR-295). First the Person:

package com.tutego.binding;

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;

public class Person
{
private PropertyChangeSupport pcs = new PropertyChangeSupport( this );

private String name = "";

public void addPropertyChangeListener( PropertyChangeListener x )
{
pcs.addPropertyChangeListener( x );
}

public void removePropertyChangeListener( PropertyChangeListener x )
{
pcs.removePropertyChangeListener( x );
}

public String getName()
{
return name;
}

public void setName( String name )
{
String old = getName();
this.name = name;
pcs.firePropertyChange( "name", old, getName() );

System.out.println( "Changed name!" );
}
}

The code for the JavaBean Person is a litte bit cumbersome because of the PropertyChangeListener who will notify the Binding Framework if the model change.

package com.tutego.binding;

import javax.beans.binding.BindingContext;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class BindingDemo
{
public static void main( String[] args )
{
Person p = new Person();

JTextField tf = new JTextField();

BindingContext bindingContext = new BindingContext();
bindingContext.addBinding( p, "${name}", tf, "text" );
bindingContext.bind();


JFrame f = new JFrame();
f.add( tf );
f.pack();
f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
f.setVisible( true );

p.setName( "Christian Ullenboom" );
}
}


Swing on the other side will although notify the model if the user type text in the text field and press Return. This will change the model.

AddThis Social Bookmark Button

Letztes Milestone 7 von Eclipse bis zur finalen Version im Juni

Wie ich mich doch verändert habe. Nicht nur, dass es im Laufe der Jahre weniger Haare wurden, sondern auch, dass ich mir nicht mehr alle Tage einen neuen Eclipse Integration Build installiere. Daher ist mir auch ganz entgangen, dass seit einer Woche der 7. Milestone auf den Servern liegt. Neues in M7 gibt es das ein oder andere, wobei die Entwickler sich natürlich zurückhalten, da das Team nur noch wichtige Bug-Fixes vor dem finalen Schuss machen sollte. Kleine kosmetische Korrekturen gehören dazu wie

default tab colors

aber auch unterstütztung von Ant 1.7 und das Renaming wurde wieder geändert (das war ja auch 'ne Qual):

In-place rename mode

Der Formatter kann auch etwas mehr:

Screenshot showing the formatter preferences modify dialogScreenshot showing the formatter preferences modify dialog

Labels:

AddThis Social Bookmark Button

Montag, Mai 07, 2007

Using format()/printf() for formatting and Scanner for parsing localized elements

format() from String or printf() from e.g. PrintWriter will use the default language except you give a Local object as the first argument:

String s1 = String.format( Locale.ENGLISH, "%,.2f", 1000234234.56772345 );
String s2 = String.format( Locale.FRANCE, "%,.2f", 1000234234.56772345 );
System.out.println( s1 ); // 1,000,234,234.57
System.out.println( s2 ); // 1 000 234 234,57

And the class Scanner offers nextDouble() that uses the default language too except you use useLocale().

double s1p = new Scanner( s1 ).useLocale( Locale.ENGLISH ).nextDouble();
double s2p = new Scanner( s2 ).useLocale( Locale.FRENCH ).nextDouble();
The methods format()/printf() and the class Scanner are very handy and easy to use.

AddThis Social Bookmark Button

Donnerstag, Mai 03, 2007

Verhältnis von deprecated Elementen zur Gesamtheit

Die Standardbibliothek enthält 200 Pakete, die Java in der Version 6 deklariert. Sie beschreiben zusammen 3777 Typen, davon 2457 Klassen, 972 Schnittstellen, 49 Aufzählungen, 473 Ausnahmeklassen und 32 Errorklassen. Insgesamt gibt es 1482 Objektvariablen, 4408 statische Variablen/Konstanten, 21881 Objektmethoden in Klassen und 5226 aus Schnittstellen, 3039 Klassenmethoden sowie 4973 Konstruktoren. (In Java 1.0 verteilten sich 212 Klassen auf 8 Pakete.)

Veraltetes hat sich im Laufe der Zeit einiges angesammelt. In Java 6 sind über 334 Methoden, 20 Konstruktoren, 54 Variablen/Konstanten, 21 Klassen (zuzüglich 4 Exceptions), 17 Schnittstellen (viele aus CORBA), 3 Annotationstypen und ein Annotationselement veraltet. Dennoch ist das in Relation zur Gesamtheit klein:

Setzen wir beides in Relation (# Elemente/#deprecated davon)

Klassen: 2457/21 = 0,85%

Schnittstellen: 972/17=1,75%

Exceptions: 473/4=0,85%

Methoden: 21881/334=1,53%

Konstruktoren: 4973/20=0,40%

Variablen/Konstanten: 4408/54=1,22%

AddThis Social Bookmark Button

Mittwoch, Mai 02, 2007

Einmal Finalizier, vielleicht mehrmals der GC

Objekte von Klassen, die eine finalize()-Methode besitzen, kann Suns JVM nicht so schnell erzeugen und entfernen, wie Klassen ohne finalize(). Das liegt auch daran, dass der GC vielleicht mehrmals laufen muss, um das Objekt zu löschen. Es gilt zwar, dass der GC aus dem Grund finalize() aufruft, weil das Objekt nicht mehr benötigt wird, es kann aber sein, dass aus der finalize()-Funktion die this-Referenz nach außen gegeben wurde, sodass das Objekt wegen einer bestehenden Referenz nicht gelöscht werden kann. Das Objekt wird zwar irgendwann entfernt, aber der Finalizer läuft nur einmal und nicht immer pro GC-Versuch. Einige Hintergründe erfährt der Leser unter http://www.iecc.com/gclist/GC-lang.html#Finalization.

Löst eine Anweisung in finalize() eine Ausnahme aus, so wird diese ignoriert. Das heißt aber, dass die Finalizierung des Objekts stehen bleibt. Den GC beeinflusst das in seiner Arbeit aber nicht.

AddThis Social Bookmark Button