Java Tipp: Initialisierung einer Map

Der übliche Weg führt über ein put(), wobei man das unterschiedlich schreiben kann:

Map<String, String> map = new HashMap<String, String>();
map.put( "name", "chris" );
map.put( "email", "a@b.c" );

Oder auch mit einem Exemplarinitialisierer (das ist aber schmutzig in meinen Augen!):

Map<String, String> map = new HashMap<String, String>() {{
  put( "name", "chris" );
  put( "email", "a@b.c" );
}};

Alternative: http://commons.apache.org/collections/api-release/org/apache/commons/collections/MapUtils.html#putAll(java.util.Map,%20java.lang.Object[]). Die API nennt ein Beispiel:

Map colorMap = MapUtils.putAll(new HashMap(), new String[][] {
     {"RED", "#FF0000"},
     {"GREEN", "#00FF00"},
     {"BLUE", "#0000FF"}
});

Die Apache Common Collections sind aber erst einmal nicht generisch!

Für http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Maps.html ist so was wohl geplant, aber bisher noch nicht implementiert.

HOWTO Build a REST-Application with Jersey and Jetty

Resource first:

package com.tutego.traida.server;

import javax.ws.rs.*;

@Path( "/" )
public class GreetingResource
{
@GET @ProduceMime("text/plain")

public String get()
{
return "Yea!";
}
}

Bring it to Jetty

package com.tutego.traida.server;

import org.mortbay.jetty.Server;
import org.mortbay.jetty.servlet.Context;
import org.mortbay.jetty.servlet.ServletHolder;
import com.sun.jersey.spi.container.servlet.ServletContainer;

public class Application 
{
public static void main( String[] args ) throws Exception
{
ServletHolder sh = new ServletHolder( ServletContainer.class );

sh.setInitParameter( "com.sun.jersey.config.property.resourceConfigClass",
"com.sun.jersey.api.core.PackagesResourceConfig" );
sh.setInitParameter( "com.sun.jersey.config.property.packages", "com.tutego.traida.server" );

Server server = new Server( 9999 );
Context context = new Context( server, "/", Context.SESSIONS );

context.addServlet( sh, "/*" );
server.start();

}
}

To use REST-parameters

@Path( "/edit-customer/{customerid}" )
public class EditCustomerResource
{
@GET @ProduceMime("text/plain")
public String editUser( @PathParam("customerid") String customerId )
{
....
}
}

Sehr interessanter Java/C-Benchmark

Stefan hat unter http://www.stefankrause.net/wp/?p=9 die Ausführungszeit von Programme mit unterschiedliche JVMs und C-Compilern getestet. Zwar misst er keine OOP-Eigenschaften, wie die Heap-Allokation, GC oder Kosten für dynamisch gebundene Methodenaufrufe, aber eben die Effizient für Low-Level-Operationen. Gut zu sehen, dass Java auch da schon extrem gut mithalten kann. Ich hätte die Performance bei arithmetischen Operationen gar nicht so gut eingeschätzt. Im Endeffekt gibt es folgendes Ergebnis:

  • Der GCC-Compiler und die C-Programme sind in der Regel am Schnellsten. Mal ist Suns JVM sogar schneller.
  • Der native-Compiler JET von Excelsior bringt ausgezeichnete Ergebnisse (Platz 2).
  • Der oft gepriesene C-Compiler LLVM ist nicht so gut wie gedacht.
  • Die Performance von Suns JVM schwankt stark. Mal ist sie ausgezeichnet im Gewinnerfeld, mal weit abgeschlagen in der absoluten Verliererzone.

Praxisrelevant sind diese Benchmarks nur zum Teil. Jetzt ist es interessant zu wissen, wie OOP-Eigenschaften vom C++-Compiler oder von JET umgesetzt werden.

Paket sun.jvmstat: Wie man selbst ein jps schreibt

jps (Java Virtual Machine Process Status Tool) ist ein Utility, welches neu bei Java 5 ist. Es zeigt die aktuellen laufenden Java VM-Instanzen an.

$ jps 
2256
2960 Jps

$ jps -mlvV
1692 sun.tools.jps.Jps -mlvV -Dapplication.home=C:\Programme\Java\jdk1.6.0 -Xms8m
2256 -Xbootclasspath/a:C:\PROGRA~1\Java\JRE16~1.0\lib\deploy.jar;C:\PROGRA~1\Java\JRE16~1.0\lib\plugin.jar -Xmx96m ...

Um ein eigenes jps zu schreiben ist, ist das Java-Archiv tools.jar aus dem lib-Verzeichnis des JDK im Klassenpfad nötig. Dort gibt es das zentrale (interne!) Paket sun.jvmstat.

import java.util.Set;
import sun.jvmstat.monitor.*;

public class T
{
@SuppressWarnings("unchecked")
public static void main( String[] args ) throws Exception
{
MonitoredHost monitoredhost = MonitoredHost.getMonitoredHost( "//localhost" );
for ( int id : (Set<Integer>) monitoredhost.activeVms() ) {
VmIdentifier vmidentifier = new VmIdentifier( "" + id );
MonitoredVm monitoredvm = monitoredhost.getMonitoredVm( vmidentifier, 0 );
System.out.printf( "%d %s %s %s%n", id,
MonitoredVmUtil.mainClass( monitoredvm, true ),
MonitoredVmUtil.jvmArgs( monitoredvm ),
MonitoredVmUtil.mainArgs( monitoredvm ) );
}
}
}

Die Ausgabe ist

2984  -Dosgi.requiredJavaVersion=1.5 -Xms40m -Xmx512m -XX:MaxPermSize=256M null 
360 T -Dfile.encoding=Cp1252 null
2256 -Xbootclasspath/a:C:\PROGRA~1\Java\JRE16~1.0\lib\deploy.jar;C:\PROGRA~1\Java\JRE16~1.0\lib\plugin.jar -Xmx96m ...

Nützlich kann das ganze sein, um etwa herauszufinden, ob schon ein Exemplar des aktuellen Programms läuft. Denn das zweite Programm findet über mainClass() zweimal die gleiche Klasse.

JVM auf iPhone

Apple ist zwar bisher gegen eine Java VM (und auch gegen Flash — angeblich zu langsam, hahaha), aber Sun hat eine Implementierung für das iPhone angekündigt:

Da das iPhone auf OS X 10 basiert (http://www.roughlydrafted.com/2007/07/13/iphone-os-x-architecture-the-mach-kernel-and-ram/), ist es durchaus möglich, das Sun auch für „normale“ Apple-Computer ein JDK ausliefert. Wenn bei Sun schon Linux, Solaris und Windows dazugehört, passt OS X auch noch ganz gut rein.

Java Swing Framework hat sich wohl erledigt

Das AppFramework (RI von JSR 296) ist wohl tot. Von Pushing-Pixels:

Hans Muller confirms what many have already guessed. His e-mail on the users mailing list of AppFramework (reference implementation of JSR 296) confirms that the development of this project has been dead since last November and will continue to be so through this summer. The subsequent discussion on the mailing list indicates that it is quite unlikely that somebody will step up and be able to provide leadership that is much needed for JSR-level projects. The inclusion in JDK 7 looks like it’s in jeopardy as well.

Hans Muller schreibt dazu:

I’m the spec lead for JSR-296 and the only developer as well. I’ve been neglecting the project for the past several months to focus exclusively on Sun’s Java FX initiative. You can see the results of some of that work in the Scenario project (http:www.scenegraph.dev.java.net), and before too long in the revised („Reprise“) version of the graphics/UI library for the FX Script language. I’d originally expected to be heads-down on FX for a couple of weeks and then after that return to devoting part of my time to this project. Unfortunately that hasn’t happened and it’s unlikely to change through this summer.

I’m proud of how far along Application Framework is and it’s inspiring to see how the developer community has responded. It’s particularly gratifying to see questions asked and answered on this list and proposals floated and discussed. I’d like to restore the project’s ability to make some progress, by adding a few developers to the project who’ll be able to update the code and make decisions about how to evolve the design. If you’re interested and if you feel you have the time and the right kind of experience, please send me an email. I’m going to try and resolve this in the next week or so.

Tja. Hoffentlich bleibt dann das Bean-Binding stehen. Obwohl — da schreibt Pushing-Pixels weiter:

John O’Connor has an article on Beans Binding (reference implementation of JSR 295). Unfortunately, these two projects are twin victims of JavaFX for the better part of this year, and one could only hope that JavaFX will live up to its promise and to the investment in engineering resources that have been subverted to it.

So viel zum Thema: „Wir bringen Java zurück zum Desktop. In Java 7.“ Klar.

Alternative Sprachen für die und auf der JVM

Java hat seine Monopolstellung eingebüßt – die hochoptimierte JVM und die umfangreichen Java-Bibliotheken lassen sich mittlerweile durch alternative Programmiersprachen nutzen. Auf der einen Seite existieren klassische Interpreter und Compiler für existierende Sprachen, wie Ruby, Prolog, LISP, BASIC, Python, die bestmöglich auf die Java-Umgebung portiert werden. Auf der anderen Seite sind es ganz neue Programmiersprachen (wie Groovy), die sich als echte Alternative zur Programmiersprache Java etablieren. Skriptsprachen werden oft über die JSR 223: Scripting for the Java Platform, einer standardisierten API, angesprochen.

JavaScript

Seit Java 6 ist über Rhino – ein Projekt der Mozilla Foundation – eine JavaScript-Laufzeitumgebung integriert. Die Script-Engine erlaubt die dynamische Übersetzung in Bytecode, was schnelle Ausführungszeiten der prozeduralen, funktionalen, objektorientierten Programmiersprache garantiert.

Groovy

[Logo]Groovy bietet eine starke Syntax mit Closures, Listen/Mengen, Reguläre Ausdrücke, eine dynamische und statische Typisierung und vielem mehr. Moderne IDEs wie Eclipse oder NetBeans unterstützen Groovy durch Plugins. Der Groovy-Compiler erzeugt für die Groovy-Klassen den typischen Bytecode, sodass normale Java-Klassen problemlos Groovy-Klassen nutzen können – oder umgekehrt. Zwei Vorträge zum Einlesen:

JRuby

[Logo]JRuby ist die Java-Version der dynamisch getypten Programmiersprache Ruby. Sun beschäftigt mit Charles Nutter und Thomas Enebo (die ›JRuby Guys‹) zwei Entwickler, und bringt auch mit der Integration in die NetBeans IDE (J)Ruby weit nach vorne. Ruby wird mit einem Atemzug mit dem Web-Framework Ruby on Rails genannt, ein Framework für Web-Applikationen, welches dank JRuby auch auf jedem Tomcat und Java Application-Server läuft.

Jython

[Logo]Die beliebte Programmiersprache Python bringt Jython auf die Java-Plattform. Auch Jython übersetzt Python-Programme in Java-Bytecode und erlaubt relativ schnelle Ausführungszeiten. Jython 2.2 implementiert Python auf 2.2, doch hat sich (C-)Python mit Version 2.6 und 3 schon weiter entwickelt. Auch sonst gibt es Unterschiede, etwa bei den eingebauten (nativen) Funktionen. Sun hat im März 2008 Ted Leung und Frank Wierzbicki (Hauptentwickler von Jython) eingestellt, um Python auf der JVM weiter zu fördern.

Scala

[Logo]Scala ist eine Funktionale, objektorientierte Programmiersprache, die in der Java-Community große Zustimmung findet, obwohl sie von Martin Odersky erst 2001 entwickelt und 2004 vorgestellt wurde. Ein Eclipse-Plugin steht ebenfalls bereit. Für die .NET-Plattform gibt es ebenfalls eine Implementierung. Besonders zeichnet Scala ein durchdachtes Typsystem aus.

Quercus

Quercus ist eine Implementierung von PHP, welches insbesondere dazu geeignet ist, bestehende und beliebte PHP-Projekte in einer Java-Umgebung ablaufen zu lassen. In der Java-Welt werden zwar nicht alle PHP-Funktionen unterstützt, aber es gibt in der Java-Welt keine Speicherüberläufe oder Sicherheitsprobleme.

Jatha

Jatha ist eine ›Common LISP library in Java‹, eine Implementierung von Common LISP. Mit einer API lassen sich LISP-Programme aus Java heraus aufrufen.

LuaJava

[Logo]LuaJava implementiert die Programmiersprache Lua für die JVM. Die aus Brasilien stammende dynamisch getypte Programmiersprache Lua zählt zu den performantesten, interpretierten Skriptsprachen. Sie ist in erster Linie als eingebettete Programmiersprache zur Applikationssteuerung entworfen worden; prominete Nutzer sind Sim City, World of Worcraft, Adobe Photoshop Lightroom, SciTE.

Pnuts

Pnuts gehört zu den schnellsten Skriptsprachen auf der JVM. Die Sprache hat eine einfache Syntax und übersetzt Programme ebenfalls in Bytecode.

JBasic

Mit JBasic gibt es für die Java-Plattform einen BASIC-Dialekt, der sich an GW-BASIC anlehnt.

JLog

JLog implementiert einen ISO-Standardisierten PROLOG-Interpreter. JLog läuft in einem eigenen Fenster mit Quellcode-Editor, Query-Panel, Hilfe, Debugger, oder es kann in einem eigenen Java-Programm eingebettet werden.

Jacl

Jacl implementiert einen TCL-Interpreter in Java. Die Entwicklung ist nicht mehr aktiv.

 

Die Webseite http://www.robert-tolksdorf.de/vmlanguages.html führt weitere Programmiersprachen für die JVM auf. Allerdings sind viele der gelisteten Sprachen für sehr spezielle Anwendungsfälle entworfen, experimentell oder werden nicht mehr gepflegt.

Mikroformate mit JAXB in XML abbilden

Die Informationen von Mikroformaten lassen sich mit JAXB relativ leicht in XML konvertieren:

import java.util.*;
import javax.xml.bind.*;
import javax.xml.bind.annotation.*;

public class MicroformatViaJaxb
{
public static void main( String[] args ) throws JAXBException
{
Microformat mf = new Microformat();
mf.elements.add( new Element( "name", "Christian Ullenboom" ) );
mf.elements.add( new Element( "address", "tutego Allee" ) );
mf.elements.add( new Element( "phone", "2873568956928" ) );

JAXBContext context = JAXBContext.newInstance( Microformat.class );
Marshaller m = context.createMarshaller();
m.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE );
m.marshal( mf, System.out );
}
}
@XmlRootElement( name = "div" )
class Microformat
{
@XmlAttribute( name = "class" )
public String key = "person";
@XmlElement( name = "span" )
public List<Element> elements = new ArrayList<Element>();
}
class Element
{
@XmlAttribute( name = "class" )
public String key;
@XmlValue
public String value;
public Element() { }
public Element( String key, String value )
{
this.key = key;
this.value = value;
}
}

Got all this abbreviations?

XML HK2 WSIT ESB JMS SSO SAO JSR JAX-RS JCP DOJO AJAX WSDP jBMP RIFE RAILS MC4J CAPS SAML WS-* WSRP SAW JXTA HTTP URL IIOP ORB JMX TCP/IP WSDL MEX XWSS MTOM XSD SMTP WSA SOAP JBI JCA CMT LDAP BMT CMPI VJM CDDL GPL BSD API JAX-B StAX JSP JSTL EJB JPA TCK JDBC JDK JRE JAXP XOP REST POJO SQL GUI URI XMLDSig JAAS GSSAPI META-INF NIO ACL JNL CORBA CDC CLDC MIDP ACID SSL DRDA UML SAX DOM XOM XML-RPC MVC XSLT DAO SVG COM FTP PDF JNA ANTLR SLF4J

Alles klar?

Unterlagen von Sun Tech Days Dezember 2007 online

Die PDFs sind zwar schon länger online, aber für Interessierte noch der Link: http://de.sun.com/sunnews/events/2007/20071203/agenda_frankfurt.jsp#agenda-2:

Sun Microsystems Country Manager Introduction:Donatus Schmid, Marketing Director Germany
Download PDF

Demo. Showcase: Tomorrow’s Technologies in action Today
Sang Shin, Simon Ritter, Sridhar Reddy, Carol McDonald, Philip Torchinsky, Joey Shen, Inyoung Cho
Sun Spot

Java EE, GlassFish and their Future
Daniel Adelhardt
Download PDF

Java SE 6 Top 10 Features, Java SE 7 and OpenJDK
Inyoung Cho
Download PDF

What Makes Solaris Interesting?
Frank Curran
Download PDF

Oracle Sponsor Session: Discover Oracle
Wolfgang Ehrenthaler
Download PDF

Easy Deployment: Leaner and Meaner Runtime
Simon Ritter
Download PDF

New Security Features in Solaris and OpenSolaris
Scott Rotondo
Download PDF

Sun Keynote – James Gosling
Download PDF

Java DB: The Multi-tier Database
Dag H. Wanvik
Download PDF

A Rich Application Platform: JavaFX
Sridhar Reddy
Download PDF

Building High Performance Applications on Multicore Systems Using Sun Studio Compilers and Tools
Vijay Tatkar
Download PDF

Solaris Virtualization for Systems Administrators
Philip Torchinsky
Download PDF

Rapid Development with Ruby, JRuby and Rails
Joey Shen
Download PDF

Real-time Java
Simon Ritter
Download PDF

Performance Tuning With Sun Studio Analyzer, Race Detection Tools, Dtrace (D-Light)
Boris Ivanovsky
Download PDF

Efficient System Administration Using Sun’s System Management Technologies
Juergen Fleischer
Download PDF

Developing Applications Using Spring and JPA
Eberhard Wolff
Download PDF

Effective Concurrency for the Java Platform
Sang Shin
Download PDF

Let SMF Deal With That
Detlef Drewanz
Download PDF

Java Persistence API: Further Simplifying Persistence
Simon Ritter
Download PDF

Isolating Performance Bottlenecks and Memory Leaks
Jaroslav Bachorik
Download PDF

Enterprise Database Inside: The PostgreSQL In Your Solaris
Paul van den Bogaard
Download PDF

Sun Community Keynote: Developing in a Polyglot World by Craig McClanahan
Download PDF

Ajax and Web 2.0 Related Frameworks and Toolkits
Carol McDonald
Download PDF

Programming for Cool Devices using the Open Source Java ME PhoneME Stack
Terrence Barr
Download PDF

ZFS – Using Its Full Potential
Uli Graef
Download PDF

Building Rich Web Applications using jMaki
Joey Shen
Download PDF

More Concurrency: The Ten Unofficial Laws
Heinz Kabutz and Kirk Pepperdine
Download PDF

NFS and pNFS: High Performance Shared Data Stores for HPC Applications
Guenter Herbert
Download PDF

AMS GmbH Sponsor Session: jBEAM – A Framework for Desktop and Web Based Analysis and Reporting Systems
Dr. Bernhard Sünder
Download PDF

OpenSolaris Testing
Joaquim Rosell &
Sean McGrath

Download PDF

AMD Sponsor Session: Optimizing for Quad-core Solaris Systems based on AMD platforms
Raj Kharran
Download PDF

Metro and REST: Everyday Web Services
Harold Carr and Carol McDonald
Download PDF

Web Services Security, OpenSSO and Access Management for SOA
Abdi Mohammadi
Download PDF

Intel Technical Session: What are we doing to optimize Solaris on Intel Architecture?
Download PDF

Java ME GUI Makeover with Ajax Mashup
Terrence Barr
Download PDF

Performance Tuning Applications: GC Friendly Java Programming
Simon Ritter
Download PDF

How to Develop Solaris Parallel Applications
Leonid Lenyashin
Download PDF

DTrace Web 2.0 Applications, JavaScript, PHP, Java and the SAMP Stack
Peter Karlsson and Philip Torchinsky
Download PDF

SOA Using OpenESB, BPEL and NetBeans
Armin Wallrab
Download PDF

Get Your Parallel Applications Onto The Grid With Sun Grid Engine
Guenter Herbert
Download PDF

Verzeichnisstrukturen für Java-Projekte

In den Java-Projekten haben sich unterschiedliche Verzeichnisstrukturen durchgesetzt. Je nach Komplexität ist eine einfache ausreichend oder eine starke Strukturierung gibt eine Vorgabe.

Eine einfache Vorgabe ist, die Order mit dem Quellcode und den übersetzten Klassendateien zu trennen. Die üblichen Ordnernamen für Java SE-Projekte sind src und bin. Entwicklungsumgebungen wie Eclipse übersetzten Java-Typen aus dem src- in den bin-Ordner und kopieren Ressourcen wie Bilder und Übersetzungsdateien bei jedem Build ebenfalls in den bin-Ordner. Eclipse unterstützte diesen Aufbau standardmäßig, wenn beim Dialog für ein neues Java-Projekt unter „Project Layout“ die Option „Create separate folders vor source and class files“ aktiviert ist.

Unter NetBeans ist die Standardstruktur etwas anders und eng mit dem Build-Tool Ant verbunden. Der Ordner src enthält die Standard-Klasen und Ressourcen, ein zweiter Ordner test die Test-Klassen und Ressourcen. Die übersetzten Java-Klassen nimmt der Ordner build/classes auf. Das Ergebnis des Builds, eine Jar-Datei im Fall eines einfachen Java-Projekts, steht im Ordner dist.

Einen deutlichen Schritt weiter geht die Anregung vom Build-Manager Maven. Es schlägt zwei Hauptordner src und target vor. Der src-Ordner enthält alle Quellen und Ressourcen und ein build übersetzt das Projekt in den target-Ordner. Maven empfiehlt, den src-Ordner weiter nach Artefakten zu unterteilen: main (eigentliche Applikation oder Bibliothek), test (Testfälle), demo (Beispiele). Unter diesen Artifakten-Ordnern folgenden weitere Unterordner. Der wichtigste Ordner ist für Java-Projekte java. Es kommen optional hinzu: ressources (für Ressourcen), config (Konfigurationsdaten), webapp (Dateien einer Web-Applikation). Für den Ausgabeordner target wiederum sieht Maven die Unterteilung in classes (übersetze Klassen aus src/main/java und Kopie aus src/main/resources), javadoc (Java-Doc von src/main/java), test-classes (Test-Klassen aus src/test/java und Kopie aus src/test/resources).

Inconsistent lower/uppercase abbreviations in Java type names

Library

Uppercase Variant

Lowercase Variant

Special Case

Java SE

GZIPOutputStream

ZipOutputStream

HttpURLConnection

DGC

MidiSystem

StAXSource

AWTError

JdbcRowSet

 

HTML

Clob, Blob, NClob

 

ImageIO

 

 

JAXBContext

 

 

JMXConnector

 

 

JPEGImageWriteParam

 

 

PBEKey

 

 

RMIClassLoader

 

 

RSAKey

 

 

SAXParser

 

 

SOAPElement

 

 

SQLException

 

 

SSLContext

 

 

UIDefaults

 

 

URI, URL, PrinterURI

ReferenceUriSchemesSupported

 

Java EE

XMLEvent

XmlElement

W3CDomHandler

XMLOutputFactory

XmlSchema

 

XMLType

XmlType

 

EJB

Xid

 

ELResolver

JspTag

 

HTTPBinding

HtmlMessage

 

JAXBElement

SqlResultSetMapping

 

JDBCStats

HttpServlet

 

JMSSessionStats

 

 

JVMStats

 

 

SAAJResult

 

 

SOAPBinding

 

 

URIValidator

 

 

XAConnection

 

 

Spring

MessageEOFException

JmsException

 

OC4JJtaTransactionManager

JmxUtils

 

SQLErrorCodes

SqlCall

 

SQLExceptionTranslator

SqlFunction

 

URIEditor

UrlResource

 

 

JndiRmiClientInterceptor

 

 

JpaTemplate

 

 

JstlView

 

 

MimeMailMessage

 

 

SimpleJaxWsServiceExporter

 

 

XmlBeanFactory

 

Apache Commons

NTPUDPClient

NtpUtils

HttpURL

FTPClient, POP3Client

HttpClient

 

SimpleSMTPHeader

 

 

NTLMScheme

 

 

RFC2965Spec

 

 

URI

 

 

 

What is your favourite example or inconsistent usage?

 

 

Werbung: Wir haben neue Java-Seminare!