Thema der Woche: Das XML-Modell XOM
1 Comments Published by Christian Ullenboom on Montag, Oktober 20, 2008 at Montag, Oktober 20, 2008.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.
- Lies die Einführung unter http://www.xom.nu/tutorial.xhtml und implementiere Beispiele
Um die Philosophie hinter dem Design zu verstehen, hat Elliotte Rusty Harold mit Bill Venners auf artima ein Interview geführt.
- In Part I: What's Wrong with XML APIs, Harold discusses the five styles of XML APIs and the problems with data-binding XML APIs.
- In Part II. The Good, the Bad, and the DOM, Harold discusses the problems with the DOM API, and the design lessons he learned from DOM.
- In Part III. A Design Review of JDOM, Harold discusses the problems with the JDOM API.
- In Part IV. Lessons Learned from JDOM, Harold discusses the design lessons he learned from the JDOM API.
- In Part V. Design Principles and XOM, Harold discusses the API design principles that guided the design of XOM.
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?
Labels: Die wöchentliche Dosis Java
Inselupdate: enum mit eigenen Konstruktoren und Methoden
0 Comments Published by Christian Ullenboom on Samstag, Oktober 18, 2008 at Samstag, Oktober 18, 2008.Da eine enum-Klasse mit der Klassendeklaration verwandt ist, kann sie ebenso Attribute und Metho-den deklarieren. Geben wir einer Aufzählung Country eine Methode, die den ISO 3166-2 Landescode des jeweiligen Aufzählungselements liefert:
public enum Country
{
GERMANY, UK, CHINA;
public String getISO3Country()
{
if ( this == GERMANY )
return Locale.GERMANY.getISO3Country();
else if ( this == UK )
return Locale.UK.getISO3Country();
return Locale.CHINA.getISO3Country();
}
}
Die Methode getISO3Country() kann nun auf den Enum-Objekten aufgerufen werden.
System.out.println( Country.CHINA.getISO3Country() ); // CHN
Da switch auf enum erlaubt ist, können wir schreiben:
Country c = Country.GERMANY;
switch ( c )
{
case GERMANY:
System.out.println( "Aha. Ein Krauti" ); // Aha. Ein Krauti
System.out.println( meinLand.getISO3Country() ); // DEU
break;
default: System.out.println( "Anderes Land" );
}
Enum mit Konstruktoren
Neben dieser Variante wollen wir eine zweite Implementierung nutzen, und nun Konstruktoren hinzu-ziehen, um das gleiche Problem auf andere Weise zu lösen:
public enum Country
{
GERMANY( Locale.GERMANY ), UK( Locale.UK ), CHINA( Locale.CHINA );
private Locale country;
private Country( Locale country )
{
this.country = country;
}
public String getISO3Country()
{
return country.getISO3Country();
}
}
Bei der Deklaration der Konstanten wird in runden Klammern ein Argument für den Konstruktor übergeben. Der Konstruktor speichert das zugehörige Locale-Objekt in der internen Variable country, auf die dann getISO3Country() Bezug nimmt.
Enum mit überschriebenen Methoden
In dem Enum-Typen lassen sich nicht nur Methoden hinzufügen, sondern auch Methoden überschrei-ben. Beginnen wir mit einer lokalisierten und überladenen Methode toString().
public enum WeekdayInternational
{
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY;
@Override
public String toString()
{
return new SimpleDateFormat().getDateFormatSymbols().getWeekdays()[ ordinal() + 1 ];
}
public String toString( Locale l )
{
return new SimpleDateFormat("", l).getDateFormatSymbols().getWeekdays()[ ordinal() + 1 ];
}
}
Die erste Methode ist aus unserer Oberklasse Object überschrieben, die zweite als überladene Funk-tion hinzugefügt. Ein Beispiel macht den Aufruf und die Funktionsweise klar:
System.out.println( WeekdayInternational.SATURDAY ); // Samstag
System.out.println( WeekdayInternational.SATURDAY.toString() ); // Samstag
System.out.println( WeekdayInternational.SATURDAY.toString(Locale.FRANCE) ); // samedi
System.out.println( WeekdayInternational.SATURDAY.toString(Locale.ITALY) ); // sabato
An dieser Stelle hören die Möglichkeiten der Enum-Syntax aber noch nicht auf. Ähnlich wie die Syn-tax von inneren anonymen Klassen, die es erlauben, Methoden zu überschreiben, bieten Aufzählungs-typen eine ähnliche Syntax, um gezielt Methoden für eine spezielle Konstante zu überschreiben.
Nehmen wir an, in einem Spiel gibt es eine eigene Währung, denn Ponro Dollar. Nun soll dieser aber mit einer Referenzwährung, dem Euro, in Beziehung gesetzt werden: Der Wechselkurs ist einfach 1:2.
public enum GameCurrency
{
EURO() {
@Override double convertTo( GameCurrency targetCurrency, double value )
{
return targetCurrency == EURO ? value : value / 2;
}
},
PONRODOLLAR() {
@Override double convertTo( GameCurrency targetCurrency, double value )
{
return targetCurrency == PONRODOLLAR ? value : value * 2;
}
};
abstract double convertTo( GameCurrency targetCurrency, double value );
}
Der interessante Teil ist die Deklaration der abstrakten convertTo() Methode und der Implementie-rung lokal bei den einzelnen Konstanten. (Natürlich müssen wir nicht jede Methoden im Enum abs-trakt machen, sondern sie kann auch konkret sein. Dann muss nicht jedes Enum-Element die abstrakte Methode implementieren.)
Mit einem statischen Import für die Aufzählung lässt sich die Nutzung und Funktionalität schnell zeigen:
System.out.println( EURO.convertTo( EURO, 12 ) ); // 12.0
System.out.println( EURO.convertTo( PONRODOLLAR, 12 ) ); // 6.0
System.out.println( PONRODOLLAR.convertTo( EURO, 12 ) ); // 24.0
System.out.println( PONRODOLLAR.convertTo( PONRODOLLAR, 12 ) ); // 12.0
Labels: Insel
Jersey 1.0 (JAX-RS) ist fertig
2 Comments Published by Christian Ullenboom on Dienstag, Oktober 14, 2008 at Dienstag, Oktober 14, 2008.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 Jerseyfor more stories.
Labels: Open Source
Thema der Woche: Sun Certified Java Programmer (SCJP)
0 Comments Published by Christian Ullenboom on Samstag, Oktober 11, 2008 at Samstag, Oktober 11, 2008.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!)
- http://faq.javaranch.com/view?ScjpMockTests
- http://www.javadeveloper.co.in/scjp/scjp-mock-exams.html
- http://www.javadeveloper.co.in/scjp/scjp-simulator.html
- http://certificationking.net/sun.html
- http://www.javaprogrammingworld.com/
- http://www.jchq.net/mockexams/exam1.htm
- http://www.examulator.com/phezam/question.php
- http://www.wickedlysmart.com/SCJPStudyGuide/Java_5_SCJPquestions.html
Labels: Die wöchentliche Dosis Java
TWAIN-Scannen mit Java
3 Comments Published by Christian Ullenboom on Donnerstag, Oktober 09, 2008 at Donnerstag, Oktober 09, 2008.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() );
}
} );
}
}
Labels: Open Source
Konvertierung Bildschirm-Pixel in cm
0 Comments Published by Christian Ullenboom on at Donnerstag, Oktober 09, 2008.Folgende Formel gibt eine Annäherung
int pixel = 1111;
String cm = Math.round(pixel/(Toolkit.getDefaultToolkit().getScreenResolution()/2.54)) + " cm";
Globale Tastendrücke und Mausoperationen abfangen (Windows)
1 Comments Published by Christian Ullenboom on Dienstag, Oktober 07, 2008 at Dienstag, Oktober 07, 2008.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
Labels: Open Source
Heise schreibt: "Bedarf an Java-Experten legt weiter rasant zu"
0 Comments Published by Christian Ullenboom on Donnerstag, Oktober 02, 2008 at Donnerstag, Oktober 02, 2008.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.

for more stories. 