Von http://www.netbeans.com/ gibt es eine neue Version, die insbesondere im Bereich des neuen Java EE 6 punktet. Die Neuigkeiten führt http://wiki.netbeans.org/NewAndNoteworthyNB68 auf.
Google App Engine 1.3
Kurz nach 1.2.8 veröffentlich Google nun die Google App Engine 1.3. Von http://googleappengine.blogspot.com/2009/12/app-engine-sdk-130-released-including.html:
Store and Serve – Files can be uploaded and stored as blobs, to be served later in response to user requests. Developers can build their own organizational structures and access controls on top of blobs.
Pricing and Quotas – We include blob storage and transfer under the same datastore pricing and quotas you’re already familiar with. For more information, see the App Engine quotas page.
The new Blobstore API is now available in both App Engine SDKs for local development. At this time it can only be used by applications that have enabled billing. There’s a lot more information about the API and how it works in the Blobstore documentation (Python, Java) so please check that out and post any questions to the groups.
This release also includes some performance tweaks to the Java runtime. For example, we’ve sped up many reflective operations by up to 10x resulting in improvements on the order of 10% for applications based on dynamic languages. As always, there are a few other minor changes and bug fixes in this release, so make sure to read our release notes (Python, Java).
Thema der Woche: MVC/MVP
Lies die Einträge
- http://de.wikipedia.org/wiki/Model_View_Presenter
- http://blogs.infragistics.com/blogs/todd_snyder/archive/2007/10/17/mvc-or-mvp-pattern-whats-the-difference.aspx
und skizziere kurz die Unterschiede zwischen den beiden Gui-Pattern MVC und MVP.
Skizziert http://www.c-sharpcorner.com/UploadFile/OVZh/Introducing_MVCSharp_framework03062008064516AM/Images/Untitled-2.gif den Unterschied? Was hat das allen mit Testen zu tun?
Das MVP ist weiterhin gültig, aber der Name hat sich etwas verändert. Erkläre das am Beispiel des Diagramms http://geekswithblogs.net/dchristiansen/archive/2007/12/07/microsoft-patterns-and-practices-team-release-the-model-view-presenter.aspx.
Schreibe ein Beispielprogramm.
- Eine Maske soll nach dem Benutzernamen und Passwort fragen.
- Ein Fake-Login-Service soll eine bekanntes Username/Passwort-Pärchen authentifizieren. Sind die Werte korrekt, soll eine einfache Meldung erscheinen und der Dialog geschlossen werden.
- Schreibe einen JUnit-Testfall
IntelliJ IDEA 9 ist draußen – kommerziell und die Open-Source-Version
Die Webseite http://www.jetbrains.com/idea/whatsnew/index.htm listet die wichtigsten Neuerungen auf:
- Faster Environment
- Improved Code Understanding
- Cleaner, More Productive Coding
- More Efficient User Interface
- More Flexible Project Structure
- Preliminary Java 7 Features Support
- Java EE 6 Support
- Improved Groovy support
- Extended Polyglot Arsenal
- New Web Frameworks Support
- OSGi Application Development
- Enhanced Maven Support
- Android Development
- Better JavaScript and HTML
- Flex Development
- Context Management
- UML Support
- Version Control Integration
- Other Interesting Things
GlassFish v3 und Java EE 6 freigegeben
Unter http://www.theserverside.com/news/thread.tss?thread_id=58858 ist heute zu lesen:
Sun has released the Java Platform Enterprise Edition 6and the GlassFish Enterprise Server v3.
Java EE 6 includes new specifications that add new functionality to the platform, like dependency injection, Bean Valiation and RESTful services, as well as improvements to the existing specifications including very significant improvements to Java Server Faces, Enterprise Java Beans, JPA, Servlets and Java Connectors. Java EE 6 also includes a Web Profile. Additional information on Java EE 6 is available from the WebSite and this Overview Article.
The GlassFish v3 Server implements the Java EE 6 specification. GlassFish v3 is Open Source and fully modular, built on an OSGi kernel and the Grizzly NIO infrastructure. GlassFish v3 is suitable for a wide range of applications, from development to deployments. The long list of additional GFv3 features includes embeddability, very fast startup, redeploy-on-save, session state persistence, dynamic language support, management and monitoring facilities, graphical, CLI and REST command interfaces, and an update center. GlassFish v3 is supported by NetBeans, Eclipse and IntelliJ IDEA.
Additional information on GlassFish v3 Server is available from the Product Page and our main Team Announcement. GFv3 can be downloaded here; the full version is 70MB and the Web Profile 50MB.
GWT 2.0 ist fertig
App Engine Java SDK 1.2.8 aktualisiert
Von der http://code.google.com/p/googleappengine/ gibt’s eine neue Version. Die Neuerungen in kürze:
- Support for JAXB. JAXB is included in JDK 1.6 (and App Engine’s production servers). If you’re using JDK 1.5 with your local dev_appserver, you will need to include the JAXB libraries with your application to use it.
- New support for application pre-compilation to reduce the length of loading requests. To enable pre-compilation on your application, add this flag to your appengine-web.xml:
- <precompilation-enabled>true</precompilation-enabled>
- If you have trouble deploying your application, you should remove this flag or set it to false.
- Added Quota API (com.google.appengine.api.quota) to match Python
- Low-level Memcache API now supports incrementAll()
- HTTPResponse object now has getFinalUrl() method for 302 redirects.
- Java Dev Appserver now automatically executes tasks. If you prefer the old behavior where tasks do not automatically execute you can use the –jvm_flag=-Dtask_queue.disable_auto_task_execution flag when starting the server.
- Additional file extensions permitted when sending mail.
- Fixed issue with Java mail handler not processing multipart messages correctly
- Fixed agent code included in appengine-local-runtime.jar results in RuntimeException
- Fixed issue with sort orders defined on properties that allow multiple values
- Fixed problem with dropped query strings after requiring log-in
- Removed limitation preventing multiple parameters with the same name
- Fixed issue with local datastore incorrectly sorting results of ancestor queries
Neu: Release 5.0
Vom Quellcode-Checker Checkstyle gibt es eine neue Version 5. Die Änderungen beschreiben die Seite http://checkstyle.sourceforge.net/releasenotes.html.
The following checks were added since release 4.4:
- AnnotationUseStyle
- MissingDeprecated
- MissingOverride
- PackageAnnotation
- SuppressWarnings
- EqualsAvoidNull
- NoClone
- NoFinalizer
- AvoidStaticImport
- JavadocPackage
- ClassTypeParameterName
- MethodTypeParameterName
- RegexpMultiline
- RegexpSingleline
- RegexpSinglelineJava
- OuterTypeNumber
- FileTabCharacter
- GenericWhitespace
JUnit 4.8 freigegeben
Die Infos gibt es unter http://kentbeck.github.com/junit/doc/ReleaseNotes4.8.html. Die Änderungen halten sich in Grenzen:
Summary of Changes in version 4.8
Categories
From a given set of test classes, the
Categories
runner runs only the classes and methods that are annotated with either the category given with the@IncludeCategory
annotation, or a subtype of that category. Either classes or interfaces can be used as categories. Subtyping works, so if you say@IncludeCategory(SuperClass.class)
, a test marked@Category({SubClass.class})
will be run.You can also exclude categories by using the
@ExcludeCategory
annotationExample:
public interface FastTests { /* category marker */ }
public interface SlowTests { /* category marker */ }
public static class A {
@Test
public void a() {
fail();
}
@Category(SlowTests.class)
@Test
public void b() {
}
}
@Category({SlowTests.class, FastTests.class})
public static class B {
@Test
public void c() {
}
}
@RunWith(Categories.class)
@IncludeCategory(SlowTests.class)
@SuiteClasses( { A.class, B.class }) // Note that Categories is a kind of Suite
public static class SlowTestSuite {
// Will run A.b and B.c, but not A.a
}
@RunWith(Categories.class)
@IncludeCategory(SlowTests.class)
@ExcludeCategory(FastTests.class)
@SuiteClasses( { A.class, B.class }) // Note that Categories is a kind of Suite
public static class SlowTestSuite {
// Will run A.b, but not A.a or B.c
}Bug fixes
- github#16: thread safety of Result counting
Update von Swing Look and Feel Synthetica V2.9 – tolle Screenshots
Die Version 2.9 verbesser der Aussehen insbesondere bei den neuen Java 6 Updates. Infos gibt http://weblogs.java.net/blog/wzberger/archive/2009/11/22/synthetica-blackeye-highlights.
Frustrierend: Java 7 doch später
Heute auf der Devoxx Konferenz gab es die Info, dass wegen der neuen Spracheigenschaften sich Java 7 von Februar auf etwa September verschieben wird. Immerhin wird es dann wohl Closures geben und das Projekt Coin wird vermutlich noch mehr aufnehmen, etwa die Aufzählung von mehreren Exceptions im catch-Block.
Überraschung: Wohl doch Closures in Java 7
GWT 2.0 RC1 ist raus, Updates beim Google Eclipse Plugin
Infos dazu hier: http://code.google.com/p/google-web-toolkit/wiki/GWT_2_0_RC.
Major New Features in the GWT SDK
- In-Browser Development Mode
- Prior to 2.0, GWT hosted mode provided a special-purpose „hosted browser“ to debug your GWT code. In 2.0, the web page being debugged is viewed within a regular-old browser. Development mode is supported through the use of a native-code plugin called the „Google Web Toolkit Developer Plugin“ for many popular browsers. In other words, you can use development mode directly from Safari, Firefox, IE, and Chrome.
- Developer-guided Code Splitting
- Code splitting using GWT.runAsync(), along with compile reports (also known as The Story of Your Compile) allows you to chunk your GWT code into multiple fragments for faster startup. Imagine having to download a whole movie before being able to watch it. Well, that’s what you have to do with most Ajax apps these days — download the whole thing before using it. With code splitting, you can arrange to load just the minimum script needed to get the application running and the user interacting, while the rest of the app is downloaded as needed.
- Declarative User Interfaces with UiBinder
- GWT’s UiBinder now allows you to create user interfaces mostly declaratively. Previously, widgets had to be created and assembled programmatically, requiring lots of code. Now, you can use XML to declare your UI, making the code more readable, easier to maintain, and faster to develop. The Mail sample has been updated to show a practical example of using UiBinder.
- Bundling of Resources via ClientBundle
- GWT introduced ImageBundle in 1.4 to provide automatic spriting of images. ClientBundle generalizes this technique, bringing the power of combining and optimizing resources into one download to things like text files, CSS, and XML. This means fewer network round trips, which in turn can decrease application latency — especially on mobile applications.
- Simplified Unit Testing with HtmlUnit
- Using HtmlUnit for running test cases based on GWTTestCase: Prior to 2.0, GWTTestCase relied on SWT and native code versions of actual browsers to run unit tests. As a result, running unit tests required starting an actual browser. As of 2.0, GWTTestCase no longer uses SWT or native code. Instead, it uses HtmlUnit as the built-in browser. Because HtmlUnit is written entirely in the Java language, there is no longer any native code involved in typical test-driven development. Debugging GWT Tests in development mode can be done entirely in a Java debugger.
Major New Features in the Google Plugin for Eclipse
- Development Mode Launch View
- Integrates your Development Mode logs right into Eclipse, which means one less window to shuffle around
- UiBinder Support
- The UiBinder template editor provides auto-completion and formatting for editing ui.xml files (and embedded CSS blocks)
Validation of UiBinder templates and backing Java classes
New UiBinder wizard to quickly get started- ClientBundle Support
- „New ClientBundle“ wizard to bundle CSS and other resources together to minimize HTTP round-trips
As-you-type validation ensures that your app’s static resources are always in the right place- RPC Refactoring
- Automatically updates sync/async pairs of RPC interfaces and their methods
- JNSI Reference Auto-completion
- Auto-completion takes the pain out of referencing Java members from JSNI methods
Merkwürdige Geschäftsbedingungen für Android Market
Darüber berichtet Heise:
Ein Entwickler, der sein Produkt aus dem Market aus unterschiedlichen Gründen (z.B. aufgrund von Urheberrechtsverletzungen) zurückzieht, muss alle Einkünfte, die er innerhalb eines Jahres, bevor die Software entfernt wurde, an die Endverbraucher, die für das Produkt gezahlt haben, zurückerstatten.
Vielleicht ist das aber gar nicht so falsch. Wenn ich mit Nacktbildern von Angela M. richtig viel Kohle mache, dann aber wegen unsittlichen urheberrechtlich geschützten Privatfotos meine App zurückziehen muss, habe ich dann schon auf dem Rücken von Angela M. (oh, ja, welch’ Bild) viel verdient. Bin gespannt, wie sich das entwickelt.
Java 7 Milestone 5: Build b76 vorgestellt
Download gibt es unter http://download.java.net/jdk7/m5/, die Neuerungen bei http://download.java.net/jdk7/changes/jdk7-b76.html. Am Interessantesten dürfen sein:
- bb3. 6865582. jsr166y – jsr166 maintenance update
- 6865571. Add a lightweight task framework known as ForkJoin
- 6445158. Phaser – an improved CyclicBarrier
- 6865579. Add TransferQueue/LinkedTransferQueue
und
- 8fb9b4be3cb1. 6827009. Project Coin: Strings in Switch
Release von JProfiler 6.0
Während man die Profiler TPTP und den NetBeans Profiler als Standards im Open-Source Umfeld bezeichnen kann, so ist das auf der kommerziellen Seite JProfiler und YourKit Java Profiler 8.0. Die ej-technologies GmbH stellt mit dem JProfiler nun ein Tool vor, das interessante Neuigkeiten bietet. Ein Trend ist die Zuwendung zu einem Tool welches Möglichkeiten bietet Thread-Locks zu visualisieren, was es klarer Hinweis ist, dass Entwickler um die parallele Programmierung nicht mehr rumkommen und Hilfe bei der Optimierung der (gedachten) Optimierung benötigen.
Neu ist auch die Darstellung, welche Locks wie oft angefragt werden:
Auch folgende Darstellung ist neu und von einem Klassiker inspiriert, der Dateigrößen erstmalig so darstellte. Nun ist das auf die Ausführungszeiten und Speicherverbrauch angewendet. Eine wunderbare Idee:
Kommen jetzt die Androids?
Vor nicht all zu Langer Zeit kam Google mit Android 2.0 um die Ecke und nun kommt es mir vor, dass alle möglichen Hersteller Android-Geräte ankündigen. Heise gibt nun auch ein Handy von LG an. Damit wächst die Liste der Android-Handys auf 13. Einige sind jedoch nur Ankündigungen doch ich bin überzeugt, es werden mehr. Es wäre Zeit, nun ein Android-Buch zu schreiben …
Thema der Woche: Ladebalken über dem Textfeld
Mit JXLayer (https://jxlayer.dev.java.net/) lassen sich beliebige Swing-Komponenten mit anderen Swing-Komponenten (oder Zeichnungen) auf eine Ebene legen und somit interessante Effekte und Lösungen entwerfen.
- Schreibe eine kleine Swing-Anwendung mit einem Textfeld und einer Schaltfläche. Wird die Schaltfläche gedrückt soll ein Web-Server kontaktiert und die Daten von dort geladen und in das Textfeld gesetzt werden.
- Das Laden soll künstlich verzögert werden. Schreibe einen eigenen ThrottleReader, der den FilterReader erweitert und deine künstliche Verzögerung einführt.
- Beim Laden soll nun ein (indefinite) Fortschrittsbalken mit JXLayer über dem Textfeld erscheinen, der dann ausgeblendet wird, wenn der Text geladen wurde.
- Überlege, wie sich der Fortschnitt des Fortschrittsbalken bestmöglich an der Anzahl geladenen Zeichen festmachen lässt.
JSON-Serialisierung mit Jackson
Nehmen wir folgende Zeile JavaScript-Code, das ein Person-Objekt mit zwei Properties für Name und Alter definiert. Eine Property wird über ein Schlüssel/Werte-Paar beschrieben:
var person = { „name“ : „Michael Jackson“, „age“ : 50 };
Die Definition eines Objekts geschieht in der JSON (JavaScript Object Notation). Als Datentypen unterstützt JSON Zahlen, Wahreiswerte, Strings, Arrays, null und Objekte – wie unser Beispiel zeigt. Die Deklarationen können geschachtelt sein, um Unterobjekte aufzubauen.
Zum Zugriff auf die JSON-Daten kommt der Punkt zum Einsatz, sodass der Name nach der Auswertung durch person.name zugänglich ist.
Eine Personenbeschreibung wie diese kann auch in einem String stehen, die von JavaScript zur Laufzeit ausgewertet wird.
var json = ‚person = { „name“ : „Michael Jackson“, „age“ : 50 };‘;
eval( json );
Der Zugriff auf person.name liefert wie vorher den Namen, denn nach der Auswertung mit eval() wird JavaScript ein neues Objekt mit person im Kontext anlegen.
JSON ist besonders praktisch, wenn es darum geht, Daten zwischen einem Server und Browser mit JavaScript-Interpreter auszutauschen. Denn wenn der String json nicht von Hand mit einem String initialisiert wurde, sondern ein Server die Zeichenkette person = { … }; liefert, haben wir das, was heutzutage in modernen Ajax-Webanwendungen passiert. Die letzte Frage ist nun, wie elegant der Server Zeichenketten im Datenaustauschformat JSON erzeugt und so Objekte überträgt. Den String per Hand aufzubauen ist eine Lösung, aber es geht besser.
Die Open-Source Bibliothek Jackson (http://jackson.codehaus.org/) gehört zu den populärsten Lösungen, die JSON-Daten einliest und ausgibt und auf JavaBeans überträgt, sodass eine unkomplizierte Serialisierung in JSON möglich wird.
ObjectMapper mapper = new ObjectMapper();
MyClass myObject = mapper.readValue( input, MyClass.class );
mapper.writeValue( output, myObject );
Der ObjectMapper übernimmt das Lesen/Schreiben. In der zweiten Zeile wird aus der Eingabequelle input gelesen und ein Objekt vom Typ MyClass rekonstruiert. In der dritten Zeile wird es in die Ausgabe output geschrieben.
JSON ist nicht nur für die Objektübertragung zwischen Server und Browser gut, sondern ist eine elegante Alternative zu XML, wenn es etwa um lokale Konfigurationsdateien geht. JSON ist viel kürzer als XML und kann somit zum Beispiel für Konfigurationsdateien übersichtlicher sein.
Bean-Zustände kopieren
In mehrschichtigen Anwendungen gibt es oft das Muster, dass eine JavaBean etwa über eine Objekt-Relationale-Mapping-Technologie automatisch aus einer Datenbankzeile aufgebaut wird und dann internen in der Geschäftsschicht verwendet wird. Soll nun diese Information über das Netzwerk an einen anderen Rechner verteilt werden, ist es nicht immer angebracht, diese JavaBean etwa direkt über Serialisierung zu versenden. Stattdessen kann ein Transfer-Objekt aufgebaut werden, eine spezielle JavaBean zum Beispiel, sodass der Empfänger keine Abhängigkeit zu der Bean in der internen Geschäftsschicht hat. Nun werden sich aber diese Geschäftsschicht-Bean und Transfer-Bean sehr ähnlich sein und viele Entwickler scheuen die Mühe, lästigen Kopiercode zu erstellen. Doch manuelle Arbeit ist nicht nötig und eine Lösung für das Kopierproblem ist über Refection schnell geschrieben. Über die BeanInfo kommen wir an den PropertyDescriptor (siehe dazu „Properties einer Bean erfragen“) und dann liefern getReadMethod() und getWriteMethod() die Setter/Getter. Bei einer eigenen Kopiermethode wie copyProperties(Object source, Object target) müssen wir bei der Quell-Bean jede Property auslesen und entsprechend beim Ziel-Bean nach der Property suchen und den Setter aufrufen. Wenn das ganze ohne Typkonvertierungen programmiert werden soll, sind es nur wenige Zeilen Programmcode. Kommen einfache Konvertierungen dazu, etwa wenn einmal ein Wrapper als Property-Typ genutzt wird und einmal der primitive Datentyp, ist es etwas mehr.
Der Aufwand mit einer eigenen Implementierung ist allerdings nicht nötig, denn zwei populäre Implementierungen können helfen:
• Apache Commons BeanUtils (http://commons.apache.org/beanutils/). Die Klasse org.apache.commons.beanutils.BeanUtils bietet praktische statische Methoden wie copyProperty(Object bean, String name, Object value), copyProperties(Object dest, Object orig), Object cloneBean(Object bean) oder populate(Object bean, Map properties).
• Dozer (http://dozer.sourceforge.net/). Dozer bringt ausgefeilte Mapping-Möglichkeiten mit, die weit über BeansUtils hinausgehen. Das geht soweit, dass es ein Eclipse-Plugin zur Konfiguration der Abbildungen gibt.