Beispiel, um Ext GWT in Eclipse zu nutzen

Voraussetzung: http://www.tutego.com/blog/javainsel/2008/05/gwt-beispiel-in-eclipse.html

  1. Lade unter http://extjs.com/products/gxt/download.php das Ext GWT 1.2.3 SDK http://extjs.com/products/gxt/download.php?dl=gxt123 und entpacke es.
  2. Setzte gxt.jar in das WebContent/WEB-INF/lib Verzeichnis (oder überall anderes hin, die Jar-Datei spielt später keine Rolle mehr). Füge das Java-Archiv zum Klassenpfad hinzu (Java Build Path > Add)
  3. Die Host-Page im public-Ordner bekommt einen Verweis auf das Sytesheet. Setzte unter <head>:
    <link rel=“stylesheet“ type=“text/css“ href=“css/ext-all.css“ />
  4. Im public-Verzeichnis gibt es ebenfalls die Modul-XML Datei. Füge hinzu:
    <inherits name=’com.extjs.gxt.ui.GXT’/>
  5. In onModuleLoad() kann man nun ein Demoprogramm schreiben, was eine Ext GWT Komponente nutzt:
    RootPanel.get().add( new DatePicker() );
    Imports wieder automatisch generieren lassen. Aufpassen, dass man bei Mehrdeutigkeiten die korrekten import-Anweisungen generiert werden. So gibt es Window zum Beispiel zweimal.
  6. Die API-Doku http://extjs.com/deploy/gxtdocs/ und die Beispiele vom ShowCase http://extjs.com/explorer/#overview zeigen den Gebrauch der API.

Java Web App Deployment Advice für JavaSE 6u10

Seit dem Update u10 von Java 6 ist eine neue Möglichkeit hinzukommen, Java-Applets und Web-Start Anwendungen in HTML zu deklarieren. Statt sich wie bisher mit <applet>, <object> Tags rumzuärgern, oder einen Konverter über die HTML-Datei drüber laufen zu lassen, kann man eine JavaScript Biblitothek von Sun verwenden. Die Technik stellt http://java.sun.com/javase/6/docs/technotes/guides/jweb/deployment_advice.html vor. Es wird dann:

<script src=“[…]/deploy.js“>
Deploy.applet(„app.jar“,“com.bla.App“,“1.5+“);
</script>

Java 7 und Named Capturing Group

Hatte man bei reguläre Ausdrücken und Gruppen auf die Gruppen über eine Index zugreifen müssen, so kann man dies in Java 7 auch über einen Namen tun; das ganze nennt sich dann named capturing group:

  String pStr = "0x(?<bytes>\\p{XDigit}{1,4})\\s++u\\+(?<char>\\p{XDigit}{4})(?:\\s++)?";
    Matcher m = Pattern.compile(pStr).matcher(INPUTTEXT);
    if (m.matches()) {
        int bs = Integer.valueOf(m.group("bytes"), 16);
        int c =  Integer.valueOf(m.group("char"), 16);
        System.out.printf("[%x] -> [%04x]%n", bs, c);
    }

Der Blog-Eintrag http://blogs.sun.com/xuemingshen/entry/named_capturing_group_in_jdk7 gibt es in paar mehr Infos.

Thema der Woche: OSGi

Zentrale Merkmale der Java-basierten OSGi-Service-Plattform sind das dynamische Einführen, Aktualisieren und Entfernen von Service-Anwendungen zur Laufzeit. Lese das Tutorial http://www.theserverside.com/tt/articles/content/OSGiforBeginners/article.html und führe die Beispiele praktisch durch. (Das mit JSR 277: Java Module System bitte vergessen, denn das ist tot.) Lese anschließend http://en.wikipedia.org/wiki/OSGi#OSGi_Tutorial und finde einige Unterschieden zwischen http://en.wikipedia.org/wiki/Knopflerfish, http://en.wikipedia.org/wiki/Apache_Felix und http://en.wikipedia.org/wiki/Equinox_OSGi.

Thema der Woche: JUnit 4.x

Dass JUnit 4 auf Annotationen baut, ist bekannt (Kurzeinführung). Weniger bekannt sind die anderen Features, die es zu Erarbeiten geht:

  • Überfliege die Neuerungen http://junit.sourceforge.net/README.html
  • Was ergibt assertEquals( 1, new Long(1) );?
  • Was macht @RunWith?
  • Wie stellt man Filters und Sorters ein? Wozu sind sie nützlich und was steckt im Paket org.junit.runner.manipulation?
  • Was ist und wie setzt assumeThat() sie um? Was ist das Hamcrest-Projekt und was für Hamcrest Erweiterungen gibt es?
  • Was ist eine Theorie?
  • Wie schreibt man parametrisierte Tests?

Alphanum Algorithm

Der Alphanum Algorithm bietet eine alternative (bessere?) Sortierung für Zeichenketten mit gemischten Zahlen an:

Traditional  Alphanum
z1.doc

z10.doc

z100.doc

z101.doc

z102.doc

z11.doc

z12.doc

z13.doc

z14.doc

z15.doc

z16.doc

z17.doc

z18.doc

z19.doc

z2.doc

z20.doc

z3.doc

z4.doc

z5.doc

z6.doc

z7.doc

z8.doc

z9.doc

z1.doc

z2.doc

z3.doc

z4.doc

z5.doc

z6.doc

z7.doc

z8.doc

z9.doc

z10.doc

z11.doc

z12.doc

z13.doc

z14.doc

z15.doc

z16.doc

z17.doc

z18.doc

z19.doc

z20.doc

z100.doc

z101.doc

z102.doc

Der Alg. ist für Java über den AlphanumComparator (LGPL) implementiert.

Fluent Interface-based API für Java Reflection: FEST-Reflect

FEST-Reflect is a Java library that provides a Fluent Interface-based API that simplifies the usage of Java Reflection, resulting in improved readability and type safety. It supports class loading, access to static inner classes constructors, methods and fields, and more!

Die Aufrufen sind dann hübsch kompakt:

Steht zur Compilezeit etwa

  String name = names.get(8);

wird mit FEST-Reflect daraus

  String name = method("get").withReturnType(String.class)
.withParameterTypes(int.class)
.in(names)
.invoke(8);

Ein paar weitere Beispiele:

  Person person = constructor().withParameterTypes(String.class)
.in(Person.class)
.newInstance("Yoda");

method("setName").withParameterTypes(String.class)
.in(person)
.invoke("Luke");

field("name").ofType(String.class)
.in(person)
.set("Anakin");

List<String> powers = field("powers").ofType(new TypeRef<List<String>>() {})
.in(jedi)
.get();

Ehrlicher Kommentar: "Swing 2: Pissing in the Wind"

Elliott Hughes hat unter http://elliotth.blogspot.com/2009/02/swing-2-pissing-in-wind.html einen ehrlichen (bösen) Kommentar zu Projekt Swing 2 abgegeben. Mit der Kritik kann ich im Wesentlichen anschließen. Vielleicht ist aus diesem Grund auf der Homepage http://kenai.com/projects/swing2/ auch noch kein einziger Topic aufgeführt und Quellcode verfügbar. War vermutlich nur ’ne verrückte Idee, denn ein Fork macht wenig Sinn und eine Intergration im Kern der Java SE ist nötig. Zum Weiterlesen über Swing 2:

Dead Code Detector (DCD)

Von der Webseite https://dcd.dev.java.net/:

If you are a developer or a team leader, Dead Code Detector (DCD) simply finds never used code in your Java/JEE applications. Deleting dead code helps to reduce cost of maintenance and to improve quality of code, and as a side effect it improves code coverage metrics of tests by deleting code that can’t be tested.  Provide a directory of compiled classes, a jar or a war file in the UI and DCD lists suspects of dead code. Dead code found can be private, package-private and even protected or public. Unread local variables, self assignments, toString on String and useless initializations are also detected. Please remember that dead code found by DCD is just suspects. DCD can not detect that reflection or other is used: ask to people who know your application and don’t complain if you don’t. You can read the usage manual to know how to launch and use DCD or check the FAQ if you have questions. The search is very fast (2000 classes/s on warm files) and made by static analysis of compiled classes without running the application or loading classes. DCD uses the library ASM (licence open source, BSD) from ObjectWeb/OW2 to do the job.

Die letzte Version ist DCD 1.1 und vom 13.2.2009. Das Tool lässt sich auch über Java Web Start starten:

https://dcd.dev.java.net/screenshot.png

PHP mit Quercus + Tomcat + Eclipse Java Web-Projekt

  1. Lade das WAR-Archiv http://quercus.caucho.com/download/quercus-3.2.1.war von http://quercus.caucho.com/.
  2. Packe der WAR-Archiv aus.
  3. Lege in Eclipse ein Dynamic Web Project (etwa unter dem Namen php) an.
  4. Verbinde es mit Tomcat. (Tomcat kann über Eclipse neuerdings auch automatisch heruntergeladen werden.)
  5. Kopiere aus dem ausgepackten Quercus-WAR das WEB-INF in das WEB-INF vom Eclipse-Web-Projekt (3 Jars in lib und web.xml)
  6. Kopiere images und index.php aus dem ausgepackten Quercus-WAR in WebContent
  7. Starte Tomcat in der Eclipse-View
  8. Gehe im Browser auf http://localhost:8080/php/

JRuby 1.2.0RC1 Released

Aus den News JRuby 1.2.0RC1 Released:

JRuby 1.2.0RC1 has fixed many many compatibility issues and continued to improve general performance. Highlights:
– Improved Ruby 1.9 support (via –1.9)
  – Compiler now works
  – Almost all of the missing 1.9 methods have been added
– New experimental –fast flag which does more aggressive optimizations
– Large scale compiler and runtime cleanup and performance audit
– Parsing is 3-6x faster now.
– Preliminary android support (Ruboto)
– Rails pathname issue fixed on Windows
– Major bug triage since last release
– 1052 revisions since 1.1.6
– 232 bugs fixed since 1.1.6

mobile.de nutzt also Tomcat, Spring und Freemarker

Aufruf von http://suchen.mobile.de/fahrzeuge/anbieter-521268-seite81-112.html

macro city [on line 30, column 9 in search/vlisting/listSearchResults.ftl] in user-directive city [on line 76, column 229 in search/vlisting/listSearchResults.ftl] in user-directive rd.html [on line 62, column 9 in search/vlisting/listSearchResults.ftl] ———- Java backtrace for programmers: ———- freemarker.template.TemplateException: Error executing macro: city required parameter: resultView is not specified. at freemarker.core.Macro$Context.sanityCheck(Macro.java:181) at freemarker.core.Macro$Context.runMacro(Macro.java:161) at freemarker.core.Environment.visit(Environment.java:537) at freemarker.core.UnifiedCall.accept(UnifiedCall.java:128) at freemarker.core.Environment.visit(Environment.java:196) at freemarker.core.MixedContent.accept(MixedContent.java:92) at freemarker.core.Environment.visit(Environment.java:196) at freemarker.core.Case.accept(Case.java:80) at freemarker.core.Environment.visit

:

:

org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:542) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151) at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:200) at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:283) at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:773) at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:703) at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:895) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685) at java.lang.Thread.run(Thread.java:619)

Wenn man in Google nach "org.springframework.web.servlet.view" sucht,  bekommt man auch noch mehr indexierte Webseiten, die diese Fehler aufweisen.

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.

Thema der Woche: Abdecker

Bei der Codeabdeckung geht es darum herauszufinden, wie viel Programmcode ein Test (etwa von JUnit) abläuft. Wirf einen Blick auf

Schreibe einen eigenen Testfall mit JUnit und suche eine Apache-Commons-Bibliothek mit Testfällen aus und lasse ein Coverage-Tool laufen.

http://www.atlassian.com/software/clover/ ist ein kommerziellen Tool. Finde heraus, was Clover im Gegensatz zu den freien Tools für Vorteile hat.

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.