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:
PHP mit Quercus + Tomcat + Eclipse Java Web-Projekt
- Lade das WAR-Archiv http://quercus.caucho.com/download/quercus-3.2.1.war von http://quercus.caucho.com/.
- Packe der WAR-Archiv aus.
- Lege in Eclipse ein Dynamic Web Project (etwa unter dem Namen php) an.
- Verbinde es mit Tomcat. (Tomcat kann über Eclipse neuerdings auch automatisch heruntergeladen werden.)
- Kopiere aus dem ausgepackten Quercus-WAR das WEB-INF in das WEB-INF vom Eclipse-Web-Projekt (3 Jars in lib und web.xml)
- Kopiere images und index.php aus dem ausgepackten Quercus-WAR in WebContent
- Starte Tomcat in der Eclipse-View
- Gehe im Browser auf http://localhost:8080/php/
SONAR in neuer Version
Sonar http://sonar.codehaus.org/ (SONAR is a code quality management platform, dedicated to continuously analyze and measure technical quality, from the projects portfolio to the class method.) ist nun in der Version 1.6. Den besten Eindrück über das LGPL-Tool gibt die Webseite mit Beispiel-Metriken: http://nemo.sonar.codehaus.org/. Es gibt auch ein Hudson-Plugin für Sonar.
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
- http://java-source.net/open-source/code-coverage
- http://cobertura.sourceforge.net/
- http://www.eclemma.org/
- http://coverlipse.sourceforge.net/
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:
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.
Buchkritik: Pragmatic Unit Testing in Java with JUnit
Andy Hunt, Dave Thomas. The Pragmatic Bookshelf. ISBN 0-9745140-1-2. September 2003. 146 Seiten
Kompaktes und nicht allzu tiefes Buch zu Testkonzepten und dem Testframework JUnit 3.x. Gut gefallen haben mir die Vorstellung des CORRECT-Prinzips (Conformance, Ordering, Range, Reference, Existence, Cardinality, Time), die Kurzvorstellung von Mock-Objekten (hier hätte ich mir allerdings etwas mehr Hinweise gewünscht, wobei immerhin Frameworks wie EasyMock zur Sprache kommen) und die Diskussion, wie die Testbarkeit das Systemdesign (positiv) beeinflusst. Die Codequalität ist in Ordnung, aber Anweisungen wie Integer.valueOf(val).intValue()
hätte ich gerne als Integer.parseInt(val)
gesehen, denn der Aufbau eines Wrapper-Objekts (lassen wir das Caching aus Java 5 außen vor) ist völlig unnötig (aber immerhin ist die Fabrikmethode noch besser als new Integer(val)
, denn sie kann immerhin auf die gecachten Wrapperobjekte im JDK zurückgreifen ). Die Namenskonvention von Sun hält der Autor bei Variablennamen nicht ein (argument_list
, small_list
, naughty_url
, num_degrees
), wobei er auch kein konsistentes Nicht-Einhalten betreibt (ingredientsText
oder exitButton
). Größtes Dilemma dieser Ausgabe ist aber ihr Alter, da nicht der JUnit 4.x-Zweig verwendet wird ebenso wenig wie Java 5, also keine Generics oder Annotationen. Mit der relativ flachen Beschreibung ist das Buch heute wenig attraktiv.
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:
NetBeans 7.0 Roadmap und NetBeans 7.0M1/M2
Die Roadmap sieht so aus:
Der Development Plan spricht vom 22. Juni, dann soll die finale Version kommen.
Mit NetBeans 7.0M2 ist auch die zweite Version aus dem 7er-Zweig raus.
Ein paar Impressionen aus den M1 und M2:
Verbesserte Maven-Unterstützung (super, wo doch jetzt Ivy immer mehr zur Alternative fürs dependency management (nicht builds!!) wird). In den Dialogen, Vervollständigung, Web-Services, …
Viele Neuerungen aus dem PHP-Projekt (netbeans php blog)
- Generating Getters and Setters Improved
- SFTP support added
- Parameter Info
- Code completion for constructors
- Marking returns
- Go to type for class members – improved
- SQL code completion in the PHP editor
- Marking occurrences improved
Und Ruby
Aktualisierung auf JS 1.7
Komlettes Redesign unter Mac OS
Bessere Unterstützung fürs Profiling:
SVG-Komponenten in NB Mobility
Von jHat eine interessante Unterstützung, um im Speicherbaum zumzusuchen.
Bei der C++-IDE: Unterstützung zum Bau vom Qt-Applikationen, Macro-Expansion (Tooltip), Tastaturvervollständigung, Setter/Getter bauen.
Vervollständigung bei Grails:
Insgesamt viele Änderungen, wobei die meisten Sachen nicht in der Java-IDE selbst passieren, sondern im Tooling und in anderen Sprachen.
Video: Java 7, Modularisierung, Jigsaw, was kommt, was geht, 2010
Mark Reinhold spricht über Java 7
Geplante Änderungen:
- re-throw
- null-dereference expressions
- Type-Inference — Wer zu viel Zeit hat, dem ist http://blog.henning.makholm.net/2008/11/java-50-type-inferences-is.html empfohlen
- Multi-Catch
- JSR 203 (More NIO, NIO2)
- JSR 296: Swing Application Framework
- SCTP
- SDP
- Unicode 5
- Swing-Updates wie JXLayer, DatePicker
- G1 GC
- JSR 308, http://groups.csail.mit.edu/pag/jsr308/
Wird (wohl) nicht in Java 7 kommen wird:
- Closures
- Reified Generics
- First Class Properties
- Überladene Operatoren
- BigDecimal Syntax
- JSR 295: Beans Binding
Der Hammer: Java 7 wird Anfang 2010 erwartet.
Wer mal was inspirierendes hören möchte: Unter http://channel9.msdn.com/posts/Charles/C-40-Meet-the-Design-Team/ sprechen C#-Macher Anders Hejlsberg und weitere C#-Experten über die Zukunft von C# und .NET, insbesondere im Kontext dynamischer Sprachen. Hier läuft man meilenweit vor Java; und das Interview ist schon 1 Jahr alt… Unter http://code.msdn.microsoft.com/csharpfuture geht’s es dann mit ein paar Links zur C# 4 und Ideen zu C# 5 weiter.
Linux Tools Project
Dass Linux Tools Project fasst verschiedene Projekte wie automake, Valgrind, Systemtrap-Editoren zur Linux-Entwickung zusammen. Von der Eclipse-Webseite:
The Linux Tools project aims to bring a full-featured C and C++ IDE to Linux developers. We build on the source editing and debugging features of the CDT and integrate popular native development tools such as the GNU Autotools, Valgrind, OProfile, RPM, Systemtap, etc. Current projects include Autotools build integration, a Valgrind heap usage analysis tool, and an OProfile call profiling tool.
Drei Scrrenshots von New and Noteworthy: