Java AMF Client aus BlazeDS ziemlich beschränkt

BlazeDS (http://opensource.adobe.com/wiki/display/blazeds/BlazeDS/) ist

the server-based Java remoting and web messaging technology that enables developers to easily connect to back-end distributed data and push data in real-time to Adobe® Flex™ and Adobe AIR™ applications for more responsive rich Internet application (RIA) experiences.

Zunächst habe ich angenommen, das die API symmetrisch ist, also nicht nur Java auf der Serverseite das Protokoll VOLLSTÄNGIG implementiert, sondern auch auf der Clientseite. Ursprünglich gab es gar keine Java-Client-API, aber mit http://opensource.adobe.com/wiki/display/blazeds/Java+AMF+Client ist die Klasse http://livedocs.adobe.com/blazeds/1/javadoc/flex/messaging/io/amf/client/AMFConnection.html dazugekommen.

Using this feature, customers will be able to write and read AMF messages using Java on the client (i.e. no Flash player). This in turn will enable Java applications talk to AMF compliant servers such as BlazeDS, LCDS, or AMFPHP.

Beispiele, wie mit dieser API ein remote-Aufruf gemacht wird, zeigen etwa

  • http://www.infoaccelerator.net/blog/post.cfm/remoting-from-java-to-coldfusion-by-example
  • http://java.dzone.com/news/calling-flex-data-services-piv

Nun interessieren mit RCP-Aufrufe überhaupt nicht, viel interessanter fand ich Messaging-Möglichkeiten über RTMP (http://en.wikipedia.org/wiki/Real_Time_Messaging_Protocol). Doch das gibt es leider in BlazeDS nicht, wie die Doku schreibt:

What this feature is not: 1) It is not full implementation of BlazeDS Actionscript client libraries. It will strictly be a mirror of Flash player’s NetConnection but no Channels will be built on top of it. Similarly, no Consumer, Producer, etc. of BlazeDS will be implemented on top. 2) Flash player’s NetConnection supports RTMP. AMFConnection will not support RTMP, and hence the name AMFConnection instead of NetConnection.

Vielleicht wird ja http://www.osflash.org/red5 eine vollständige Java-Client-API für  RTMP anbieten.

macwidgets – Collection of Mac style widgets written in Java

Gibt es unter http://code.google.com/p/macwidgets/. Von der Webseite:

Mac Widgets for Java are a collection of widgets seen in OS X applications, offered in a Java API. These widgets help Java developers create more Mac-like applications. There usage is not restricted to Mac though, as they will render across platforms.

Sieht nett aus und die API ist einfach zu nutzen.

Darauf hat die Welt gewartet: Wieder ein neues/altes Web-Framework

Apache Click http://incubator.apache.org/click/ heißt es und läuft ab Java 1.4. Super. Kommt damit 5 Jahre zu spät. Also nix mit Annotationen. Schön XML und so. (Click 0.3 gab es auch schon im März 2005, also ist das Projekt nicht wirklich jung.) Das Wort Ajax taucht auf den ganzen Webseiten nicht auf. Immerhin gibt es eine http://incubator.apache.org/click/docs/click-ide.html auf Eclipse 3.4 Basis. Toll die Antwort auf die Frage "Why develop a new Web Application Framework?" Antwort: "Because the existing frameworks did not meet my needs. Struts doesn’t really do much, while Tapestry is too complicated. For a more comprehensive answer please see Why Click." Klar, als ob es nur Struts und Tapestry gibt. Vor 10 Jahren vielleicht. Bei Struts 1.x ist die Zeit schon lange abgelaufen und bei Tapestry 5 hält man sich noch ein wenig mit DI/IoC über Wasser.

emite – Chat-Client und GWT XMPP Bibliothek

Eine tolle GWT-Anwendung/Bibliothek ist http://code.google.com/p/emite/:

Der Chat-Client läuft im Browser als GWT-Anwendung. Über einen Proxy kann dann der Client (Browser) direkt mit dem Xmpp Server sprechen. (Noch ist ein Proxy nötig, siehe http://ejohn.org/blog/cross-site-xmlhttprequest/). Das heißt, emite implementiert das Extensible Messaging and Presence Protocol (XMPP), um über Bidirectional-streams Over Synchronous HTTP (BOSH) die Daten zum Chat-Server zu senden. Da emite auf der einen Seite eine Bibliothek ist und auf der anderen Seiten ein Chat-Client mit der hübschen Gui, lässt sich die Bib. natürlich auch getrennt nutzen; eine Nachricht wird etwas so versandt:

Session session = Suco.get(Session.class);
session.login(XmppURI.uri("me@domain", "myPassword");
Message message = new Message("send this");
session.send(message);

Intern setzt emite auf http://code.google.com/p/suco/ auf. Suco ist ein einfaches DI-Framework für GWT-Applikationen zusammen mit einem Eventing-Framework. (Suco ist nicht Annotationsgetrieben, da kein echtes Reflection mit GWT möglich ist. Mit einem speziellen Builder könnte man da aber was machen. Hm…)

GWT API’s for SmartClient

SmartClient Ajax (http://www.smartclient.com/) ist eine (weitere) Ajax-Bibliothek für RIA-Anwendungen. Die Demos unter http://www.smartclient.com/index.jsp#_Welcome zeigen auch, was man heute von RIA-Frameworks erwartet: Nette Komponenten, Layout-Manager und Data-Binding über diverse Datenquellen. Es geht nicht nur um hübsche Widgets allein und die Optik ist auch nur OK. (Obwohl http://extjs.com/ in meinen Augen immer noch aus optischen Gründen vorne liegt, hat doch SmartClient Ajax einen sehr großen Vorteil: SmartClient Ajax platform now open source under LGPL. Ext JS ist, wenn man es denn kommerziell einsetzten möchte, nicht ganz billig.)

Für die JS-Library gibt es mit http://code.google.com/p/smartgwt/ auch eine GWT-Wrapper SmartGWT. Der Showcase liegt unter http://www.smartclient.com/smartgwt/showcase/, die JavaDoc unter http://www.smartclient.com/smartgwt/javadoc/. SmartGWT liegt wie auch SmartClient Ajax unter der LGPL. Der Port ist mehr oder weniger die (Fleiß)Arbeit einer Person Sanjiv Jivan. Die folgenden Screenshots stammen aus seinem Blog http://www.jroller.com/sjivan/entry/smartgwt_1_0_released:

Miller Columns

Filter Builder

Zwei interessante GWT-Erweiterungen: Gilead und GWT-SL

Sind

Gilead (früher Hibernate4GWT), abgeleitet von "Generic Light Entity Adapter" ist ein interessantes Projekt mit folgendem Konzept:

transform persistent entities back to simple Plain Old Java Object, by removing code instrumentation and replacing persistent collections with their regular counterpart.

Kommt zum Beispiel eine JPA-Bean mit Assoziationen mit Eager-fetching rein, kommt ein vollständig geladener Objektgraph raus. Das ist praktisch genau dann, wenn man einen Daten-Service hat, den man von der GWT-Oberfläche zum Holen der Daten nutzt, aber die JPA-Implementierung baut diverse Proxies ein.

Das SF-Projekt "GWT-Widgets" besteht aus zwei Teilen: Der GWT Server Library (GWT-SL) und der GWT Widget Library. Die GWT-SL ist eine GWT-Spring-Integration. Mit dem GWTRPCServiceExporter können etwa die Spring-POJOs als GWT-Services veröffentlicht werden. Die Doku stellt die Arbeitsweise kurz vor.

Folien zum Einsatz von Annotationen in Spring

Habe bei SlideShare interessante Folien zum Einsatz von Annotationen in der Spring-Entwicklung gefunden. Zunächst werden allgemeine Annotationen aus dem Java SE und besonders aus dem Java EE-Umfeld vorgestellt. Dann werden JPA und REST im Kontext von Spring an Beispielen erklärt. Zum Schluss folgt noch etwa Spring MVC und wie dort Annotationen die Konfiguration vereinfachen.

GWT 1.6 Milestone 1

Der erste Milestone von GWT 1.6 ist unter http://code.google.com/p/google-web-toolkit/downloads/list?can=1&q=1.6.0 verfügbar. In einem Google Group Beitrag werden die Neuerungen genannt:

*** New Project Structure in GWT 1.6 ***
One of the biggest changes to GWT 1.6 is a new project structure. The old
output format has been replaced by the standard Java web app expanded „war“
format, and the actual directory name does default to „/war“. Note that the
war directory is not only for compiler output; it is also intended to
contain handwritten static resources that you want to be included in your
webapp alongside GWT modules (that is, things you’d want to version
control). Please also note that the „GWTShell“ and „GWTCompiler“ tools will
maintain their legacy behavior, but they have been deprecated in favor of
new „HostedMode“ and „Compiler“ tools which use the new war output. When 1.6
is officially released, we will be encouraging existing projects to update
to the new directory format and to use the new tools to take advantage of
new features and for compatibility with future GWT releases.
The sample projects provided in the GWT distribution provide an example of
correct new project configurations. For more details on the specifics of the
new project format, please see GWT 1.6 WAR design document (
http://code.google.com/p/google-web-toolkit/wiki/WAR_Design_1_6).
A couple of important changes we should highlight here:
– Projects with server-side code (GWT RPC) must configure a „web.xml“ file
at „/war/WEB-INF/web.xml“. This web.xml file must define and publish any
servlets associated with the web application. See the included DynaTable
sample. Additionally, server-side library dependencies must be copied into
„/war/WEB-INF/lib“. For example, any GWT RPC servlets must have a copy of
gwt-servlet.jar in this folder.
– HTML host pages will no longer typically be located in a GWT module’s
public path. Instead, we’ll be recommending that people take advantage of
the natural web app behavior for serving static files by placing host pages
anywhere in the war structure that makes sense. For exmaple, you might want
to load a GWT module from a JSP page located in the root of your web app. To
keep such handwritten static files separate from those produced by the GWT
compiler, the latter will be placed into module-specific subdirectories. Any
page that wishes to include a GWT module can do so via a script tag by
referencing the GWT-produced „<module>.nocache.js script“ within that
module’s subdirectory. As of 1.6, we’ll be recommending that only
module-specific resources used directly by GWT code, such as image files
needed by widgets, should remain on the public path. See the included
Showcase sample for some examples of this distinction.
– When you do need to load resources from a module’s public path, always
construct an absolute URL by prepending GWT.getModuleBaseURL(). For example,
‚GWT.getModuleBaseURL() + „dir/file.ext“‚. This advice has not changed, but
in the past it was easy to be sloppy with this, because the host page and
GWT module typically lived in the same directory, so using a relative URL
would usually do the right thing. Now that GWT modules live in a
subdirectory, you must reference public resources through
GWT.getModuleBaseURL().
*** Hosted Mode Enhancements ***
Although the legacy GWTShell still uses an embedded Tomcat server, the new
HostedMode runs Jetty instead. There is also a new „Restart Server“ button
on the main hosted mode window. Clicking this button restarts the internal
Jetty server, which allows Java code changes to take effect on the server
without having to completely exit and restart hosted mode. This is useful
when making code changes to RPC servlets, or when serializable RPC types are modified and the server and client are out of sync.
*** New EventHandler System ***
Event handlers have been added to replace the old event listeners used by
Widgets, History, and various other classes. The new system has a few
differences from the old system:
– EventHandler methods always take a single parameter: the GwtEvent that the Widget fired. For example, ClickHandler has a single method
onClick(ClickEvent).
– Each GwtEvent contains accessors relevant to the event, such as the key
that was pressed on KeyEvents. Native events provide access to the
underlying native event object.
– Each EventHandler defines only one method, so you do not need to create
empty methods just to satisfy the interface requirements.
For users who create their own Widgets, you no longer need to manage
listeners manually. Every Widget has a HandlerManager that manages all of
its handlers. For native events, such as ClickEvent, just call
addDomHandler() from within your code to register a handler and sink the
associated event on the Widget. When the native event is detected, the
handler will automatically be called. For logical events, such as
SelectionEvent, call addHandler() and fire the event manually using the
fireEvent() method.
You can see examples of EventHandler usage in many of the updated GWT
widgets and samples, or in new projects created with the new webAppCreator tool.
You can now trigger a native event on almost any Element. Create a new
native event using the Document.create*Event() methods, then dispatch it on a specific Element by calling Element.dispatchEvent(). These methods allow you to expand your test coverage in ways that were previously impossible.
*** New Widgets ***
DatePicker
The new DatePicker and DateBox widgets allow your users to select a date
from a calendar. The Showcase sample provides examples of both of these
widgets.
LazyPanel
The new LazyPanel widget allows you to delay the creation of certain
sections of your application until they are first accessed, improving
startup performance. For example, if your application has a seldom used
„Help“ section, you can wrap it in a LazyPanel and create the user interface
only if and when the user tries to access it. To use the LazyPanel, extend
the class and override the abstract createWidget() method. The
createWidget() method will be called the first time you call setVisible() on
the LazyPanel.

Apache Jackrabbit 1.5

Jackrabbit (http://jackrabbit.apache.org/) ist eine Implementierung der Content Repository API (JSR 170/JSR 283). (Bei dem JCR geht es darum, Datenquellen eines CR unter einer einheitlichen API anzusprechen. Die Anfrage werden mit XPath getellt.) Wichtige Neuerungen zählt http://www.apache.org/dist/jackrabbit/RELEASE-NOTES-1.5.0.txt auf. Zwei Sachen finde ich besonders interessant:

  • The standalone Jackrabbit server component. The runnable jackrabbit-standalone jar makes it very easy to start and run Jackrabbit as a standalone server with WebDAV and RMI access.
  • Simple Google-style query language. The new GQL query syntax makes it very easy to express simple full text queries.

Die aktuelle Version geht also deutliche Schritte in Richtung der neuen Version JSR-283. http://www.magnolia-cms.com/home.html ist ein bekanntes CMS, welche auf den Jack-Hasen setzt.

SpringSource und Groovy/Grails und SpringSource mit Adobe

SpringSource (http://www.springsource.com/) macht große Schritte. Zum einen durch den Aufkauf von G2one (http://www.g2one.com/), die sich der Beratung von Weiterentwicklung von Groovy und Grails verschrieben haben:

SpringSource,
the maker of the Spring framework have just announced they are acquiring G2One, Inc.,
the Groovy/Grails company. You can learn more about this announcement here:

Nun arbeitet SpringSource auch mit Adobe zusammen und Flash näher an Spring zu setzen. Das Spring-Framework integriert dazu BlazeDS (http://opensource.adobe.com/wiki/display/blazeds/BlazeDS/), eine unter LGPL stehende Remoting- und Messaging-Technologie. Mit BlazeDS kann Flex auf Java-Methoden auf der Serverseite zugreifen, so wie es auch JavaScript über DWR (http://directwebremoting.org/) kann. Die Ankündigung zur Zusammenarbeit:

  • http://www.springsource.com/node/1077

XStream mit JSON-Serialisierung

XStream (http://xstream.codehaus.org/) ist neben
XmlBeans einer der bekanntesten XML-Serialisierer. Nun haben die Entwickler die Bibliothek erweitert, dass XStream auch als XML-JSON-Serialisierer (http://xstream.codehaus.org/json-tutorial.html) arbeitet. Die Methodenamen sind mit toXML() und fromXML() zwar nicht so passend, aber der Aufruf dennoch einfach:

Product product = new Product("Banana", "123", 23.00);
XStream xstream = new XStream(new JettisonMappedXmlDriver());
xstream.setMode(XStream.NO_REFERENCES);
xstream.alias("product", Product.class);
System.out.println(xstream.toXML(product));

Der andere Weg:

String json = "{\"product\":{\"name\":\"Banana\",\"id\":\"123\"" +
",\"price\":\"23.0\"}}";
XStream xstream = new XStream(new JettisonMappedXmlDriver());
xstream.alias("product", Product.class);
Product product = (Product)xstream.fromXML(json);
System.out.println(product.getName());

JavaFX 1.0 offiziell veröffentlicht

http://upload.wikimedia.org/wikipedia/en/4/4a/JavaFXCup200x230.pngSun hat Anfang Dezember 2008 JavaFX veröffentlicht. Es ist als Alternative zu MS Silverlight und Flash + Flex für Rich Internet Applications gedacht. Einige Links dazu:

Zentrale Punkte von JavaFX 1.0 sind: (Zitiert von http://blogs.sun.com/javafx/entry/javafx_1_0_is_live)

  • Fast and easy to use 2D graphics
  • PerspectiveTransform for 3D effects
  • KeyFrame animation
  • Video and Audio support using both native and cross-platform codecs
  • Swing Integration
  • XML & JSON web services
  • Pixel-filters and visual effects with GPU hardware acceleration
  • CSS styling (more on that later)
  • Windows XP+ and Mac 10.4+ support with Linux & Solaris in the works (more on that later too)
  • The new JavaFX Script language with binding and animation built in, running 10->20x faster than Javascript
  • Visually rich applets that you can drag to your desktop and save for later
  • Integration with Photoshop and Illustrator
  • Access to the world’s huge library of Java code and APIs
  • A new website with docs, tutorials, and tons of BSD licensed sample code and as a nice bonus:
  • A sneak-peek beta of JavaFX on mobile devices

Der Punkt Support with Linux & Solaris in the works macht sicherlich nicht jeden in der Community glücklich, aber gut…

Sun hat die schöne Seite http://javafx.com/ aufgebaut, um mehr über JavaFX zu lernen. Die NetBeans IDE 6.5 bringt volle Unterstützung für JavaFX (http://www.netbeans.org/features/javafx/index.html) mit. Für Eclipse gibt es bisher keine große Unterstützung.

http://www.netbeans.org/images/v6/5/screenshots/javafx.png

http://www.reportmill.com/jfx/ bringt passend ein Tool auf Markt. Zentrale Elemente sind (Zitiert von der Webseite):

  • Powerful Visual Designer
  • Animation, Illustration and Page Layout
  • Video, Sound and Image Effects
  • Drag & Drop Application Components
  • JDBC and POJO Data Binding
  • HTTP Form Generation and Binding
  • Navbar Generation, Page Transitions
  • Graphs, Charts, Tables and Reports
  • Full Featured Player/Document Reader
  • Extension Plugins with Internet Directory

http://www.reportmill.com/jfx/JFXBScreenShotFull.jpg

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: 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:

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.

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.