http://jcp.org/aboutJava/communityprocess/edr/jsr308/index2.html
Java –> Flash mit PlayN
Sehr sehr cool, mit http://code.google.com/p/playn/ kann man mit GWT eine Java-Anwendung schreiben und der GWT-Compiler setzt das nicht nur in JavaScript um, sondern in ActionScript, und da hinten kommt Flash raus.
Inselupdate: Gepoolte Datenbankverbindungen
Da der Auf- und Abbau von Datenbankverbindungen relativ teuer ist, soll eine Java-Applikation die Verbindung nur vordergründig schließen, ein spezieller pooling-fähiger Datenbanktreiber soll die Verbindung allerdings für die nächste Operation offen halten. Für gepoolte Datenbankverbindungen gibt es eine Reihe quelloffener Implementierungen; zu ihnen zählen Apache Commons DBCP (http://commons.apache.org/dbcp/), c3p0 (http://sourceforge.net/projects/c3p0/) und Proxool (http://proxool.sourceforge.net/).
In der Regel sind für den Programmierer gepoolete Datenbankverbindungen transparent, denn ein poolender Treiber verhält sich wie ein ganz normaler JDBC-Treiber. Jeder Java EE-Container nutzt standardmäßig gepoolte Verbindungen, sodass sich Enterprise-Entwickler damit nicht beschäftigen müssen – nur Administratoren müssen spezielle Eigenschaften wie die maximale Anzahl offener Verbindungen konfigurieren. In Client-Anwendungen ist die Nutzung anders, auch der Bezug einer Verbindung. Bei Proxool wird zum Beispiel statt der JDBC-Treiberklasse die Proxool-Treiberklasse genannt, und die der Verbindungs-URL kodiert dann die eigentlichen JDBC-Treiberklasse; das sieht etwa so aus: Class.forName("org.logicalcobwebs.proxool.ProxoolDriver"); con = DriverManager.getConnection("proxool.example:org.hsqldb.jdbcDriver:jdbc:hsqldb:file:TutegoDB");. Anders ist das bei c3po, hier wird eine spezielle Klasse ComboPooledDataSource eingesetzt, die vom Typ DataSource ist.[1]
Simple-JNDI (http://openbook.galileocomputing.de/javainsel9/javainsel_24_011.htm) unterstützt DBCP direkt, sodass wir es an dieser Stelle einsetzen wollen. Eine zusätzliche Zeile pool=true in der Konfigurationsdatei veranlasst Simple-JNDI dazu:
Listing 1.14: TutegoDS.properties
type=javax.sql.DataSource
driver=org.hsqldb.jdbcDriver
url=jdbc:hsqldb:file:TutegoDB;shutdown=true
user=sa
password=
pool=true
Dazu sind in den Klassenpfad das Haupt-Archiv commons-dbcp-1.4.jar (Download unter http://commons.apache.org/dbcp/download_dbcp.cgi) und zusätzlich das Java-Archiv commons-pool-1.3.jar (von Jakarta Commons Pool, Download unter http://commons.apache.org/pool/download_pool.cgi) aufzunehmen.
[1] Weitere Details unter http://www.mchange.com/projects/c3p0/index.html.
JMeter 2.6
Änderungen: http://jmeter.apache.org/changes.html
Thema der Woche: Besondere Methoden der Renderer
Der “Bug” http://bugs.sun.com/view_bug.do?bug_id=4706356 führte zu einer Änderung, die http://docs.oracle.com/javase/7/docs/technotes/guides/swing/1.5/index.html so beschreibt:
Swing’s cell rendenders override a handful of methods to do nothing as they are not needed for cell renderers. They should override a couple of methods that are now being called to do nothing.
The following methods were added to DefaultTableCellRenderer, DefaultListCellRenderer and DefaultTreeCellRenderer
/** * Overridden for performance reasons. * See the <a href="#override">Implementation Note</a> * for more information. * * @since 1.5 */ public void invalidate(); /** * Overridden for performance reasons. * See the <a href="#override">Implementation Note</a> * for more information. * * @since 1.5 */ public void repaint();
Erkläre die Arbeitsweise und warum die Methoden überschrieben wurden. (Ist das Listing oben überhaupt korrekt?) Wie sieht das bei Komponenten bei SwingX aus?
Thema der Woche: Statische Analysetools und eigene Regelwerke
- FindBugs, PMD und Checkstyle sind drei statische Codeanalysetools. Sie nutzen unterschiedliche Eingaben für ihre Analyse. Wo liegt der Unterschied?
- PMD, FindBugs und Checkstyle kann man um eigene Regeln erweitern. Lies, wie das geht und gib eine kurze Übersicht.
- Im Quellcode von Java gibt es (immer noch) Stellen, in denen unsinnigerweise von java.lang.Object geerbt wird, etwa bei der java.lang.Character-Klasse (in Java 7 gefixt):
public final class Character extends java.lang.Object
implements java.io.Serializable, Comparable<Character>
Schreibe eine Regel (in einem beliebigen Framework), um genau solche Klassen zu finden.
Thema der Woche: unshared objects
Erkläre die Bedeutung der Methoden:
ObjectInputStream.readUnshared()
ObjectOutputStream.writeUnshared(Object obj)
ObjectStreamField(String name, Class type, boolean unshared)
Lies dazu http://ld2011.scusa.lsu.edu/java/6-docs/platform/serialization/spec/security.html#4271. Nenne drei Szenarien, in denen die Methoden nützlich sind. Schaue auch im JDK nach Anwendungen.
Erster Draft für “Annotations on Java Types” (JSR-308)
http://jcp.org/aboutJava/communityprocess/edr/jsr308/index2.html. Aus der Spezi:
JSR 308 extends Java to allow annotations on any use of a type, and on type parameter declarations.
Beispiele:
for generic type arguments to parameterized classes:
Map<@NonNull String, @NonEmpty List<@Readonly Document>> files;
for generic type arguments in a generic method or constructor invocation:
o.<@NonNull String>m("…");
for type parameter bounds, including wildcard bounds:
class Folder<F extends @Existing File> { … }
Collection<? super @Existing File>
for class inheritance:
class UnmodifiableList<T> implements @Readonly List<@Readonly T> { … }
for throws clauses:
void monitorTemperature() throws @Critical TemperatureException { … }
for typecasts:
myString = (@NonNull String) myObject;
It is not permitted to omit the Java type, as in myString = (@NonNull) myObject;.
for constructor invocation results (that is, for object creation):
new @Interned MyObject()
new @NonEmpty @Readonly List<String>(myNonEmptyStringSet)
myVar . new @Tainted NestedClass
For generic constructors (JLS §8.8.4), the annotation follows the explicit type arguments (JLS §15.9):
new <String> @Interned MyObject()
for type tests:
boolean isNonNull = myString instanceof @NonNull String;
It is not permitted to omit the Java type, as in myString instanceof @NonNull.
Damit einher geht eine krasse Änderung, das bei Objektmethoden einfach so ein this Übergeben werden kann.
It is permitted to explicitly declare the method receiver as the first formal parameter
As an example, here are the standard definitions for toString and equals:
class MyClass {
…
public String toString() { … }
public boolean equals(Object other) { … }
}
It is equivalent to write instead
class MyClass {
…
public String toString(MyClass this) { … }
public boolean equals(MyClass this, Object other) { … }
}
and then it would be possible to annotate the receiver’s type:
class MyClass {
…
public String toString(@Readonly MyClass this) { … }
public boolean equals(@Readonly MyClass this, @Readonly Object other) { … }
}
Interessant finde ich noch:
To ease the transition from standard Java SE 7 code to code with type annotations, the reference implementation
recognizes the type annotations when surrounded by comment markers:
List</*@Readonly*/ Object> myList;
This permits use of both standard Java SE 7 tools and the new annotations even before Java SE 8 is released
Thema der Woche: Java "Smart and Simple Web Crawler"
http://java.net/projects/crawler/ ist ein Web-Crawler in Java. Die API könnte zwar viel einfacher sein, aber dennoch ist mit Hilfe der beigefügten Beispiele (http://java.net/projects/crawler/downloads/directory/1.3.0) schnell ein Programm implementiert.
Aufgabe: Liste die ersten 5 Links auf, die von der Hauptseite spiegel.de in den den Bereich http://www.spiegel.de/thema/ führen. Überlege dazu ein Fragment wie
LinkFilterUtil.and( new ServerFilter( “..” ), new BeginningPathFilter( "/…/" ) )
zu nutzen.
Offtopic: Schöll AG und die Kopie der Seminarbeschreibungen, Teil 2
Nachdem ich 2009 im Beitrag http://www.tutego.de/blog/javainsel/2009/05/offtopic-content-klau-der-scholl-ag/ von dem “Entlehnen” meiner Semianarbeschreibungen berichtet habe, ist mir ganz entgangen, von dem Ausgang zu berichten.
Genau einen Tag vor dem Ablauf meiner gesetzten Zweiwochenfrist kommt ein Fax vom einer Anwalts-Sozietät in Darmstadt. (Über die Qualität der Web-Seite und der Rechtschreibung (“Angiffen”, “Umstrukturierunvon”) kann man streiten. Und “in englisch und französisch” schreibt man eigentlich “in Englisch und Französisch”, da als Substantive gebrauchte Adjektive und Partizipien großgeschrieben werden.)
Anstatt das ein Verantwortlicher der Schöll AG sagt; “Sory, dummer Fehler, kommt nicht wieder vor” gibt es kein Schuldeingeständnis. Schlimmer ist die Erklärung, mit der sich Schöll rauswinden will. Der Rechtsanwalt schreibt: “Unser Mandantin war aufgrund der zuvor geführten Gespräche zudem der Auffassung, Sie seien mit den Inhalten einverstanden. Wir werten Ihre E-Mail insoweit als Kündigung einer bestehenden Nutzungsberechtigung […]”. Ohne Frage gab es keine “zuvor geführten Gespräche” und von einer “bestehenden Nutzungsberechtigung” auszugehen ist falsch.
Daher habe ich nach dem Faxempfang am Freitag (29.05.2009) eine E-Mail an Schöll gesendet mit den Fragen
- wie viele Gespräche wir geführt haben,
- mit wem ich welches Gespräch geführt habe,
- zu welchem Zeitpunkt die Gespräche stattfanden und
- welchen Inhalt die Gespräche hatten.
Auf eine Antwort warte ich bis heute.
Rechtsanwalt Dr. Becker vertritt die Meinung, dass mein Inhaltsverzeichnis nicht “die für einen Urheberrechtsschutz erforderliche Schöpfungshöhe erreicht”. Die gängigen Urteile beziehen sich jedoch auf Inhaltsverzeichnisse von Büchern, nicht aber auf die Inhalte von Seminarbeschreibungen. Die Frage der Schöpfungshöhe und damit die des Urheberrechts müsste ein Gericht erst klären. Gibt es mangelnde Schöpfungshöhe, also das, was Dr. Becker hier durchscheinen lässt, gilt die Gemeinfreiheit. Das heißt, es gilt kein Urheberrecht und jeder könnte von jedem den Seminarinhalte übernehmen. Darüber wäre Schöll sicherlich auch nicht glücklich, wenn ich deren Seminareinhalte auf meine Webseite setze. Und das Problem der unerlaubten Leistungsübernahme ist hier noch nicht einmal angesprochen.
In der Summe halte ich die Öffentlichkeitsarbeit der Schöll AG für ein Desaster. Es zeigt sich immer, wie wenig Eier Unternehmen in der Hose habe um kurz und knapp “Sorry” zu sagen. Stattdessen ignorieren Unternehmen wie die Schöll AG Anfragen und schicken feige einen Anwalt vor. Naja, seit 3 Jahre ist die Sache abgeschlossen und Schöll hat fix eigene Seminarbeschreibungen aufgebaut. Die sind auch immer noch auf dem Stand von 2009 …
Es ist niemals schwieriger, das rechte Wort zu finden, als wenn man sich schämt.
– François de La Rochefoucauld (1613 – 1680)
Thema der Woche: Temporal Patterns
Lies http://www.martinfowler.com/eaaDev/timeNarrative.html und http://www.infoq.com/news/2008/01/bitemporal. Welches Problem geht das Pattern an und um welche Daten geht es? Welche Lösungsansätze werden beschrieben? Mit welchen anderen Pattern ist das Temporal-Pattern verbunden?
Nützliches GWT-Wissen
- GWT.isScript() liefert false, wenn die Anwendung im Entwicklungsmodus läuft. isScript() liefert dann true, wenn die GWT-Anwendung in JavaScript übersetzt wurde. Die Funktion ist nützlich, wenn in der der lokalen Umgebung Dinge anders sind (etwa Pfade), als in der übersetzten Produktivversion.
- GWT.getModuleBaseURL() liefert die URL zum Wurzelverzeichnis der GWT-Applikation. Siehe dazu auch http://code.google.com/support/bin/answer.py?answer=60560&topic=10211.
GWT.setUncaughtExceptionHandler()
setzt einen Handler, der immer dann aufgerufen wird, wenn die Applikation eine RuntimeException sieht. Debuggen kann man etwa mit http://www.asquare.net/gwttk/apps/demo/Demo.html#debug.- GWT 1.6 bringt einen neuen Eventing-Mechanismus mit (erinnert an EventBus). http://www.itsolut.com/chrismusings/2009/04/28/business-events-with-gwt-16/ stellt ihn vor.
- Neben dem Paket server und client gibt es das Paket public (etwa src/com/example/cal/public/), in das alles kopiert wird, das die Client als statische Ressourcen verwenden möchte. Es kommt zu den anderen compilierten Dokumenten. Siehe http://code.google.com/webtoolkit/doc/1.6/DevGuideOrganizingProjects.html#DevGuideDirectoriesPackageConventions.
- Eine eigene CSS-Datei für das Styling (etwa lala.css) setzt man zunächst in den in den public-Ordner. In der Bla.gwt.xml bei den <inherits> fügt man dann die Zeile <stylesheet src="lala.css"/> hinzu.
- panel.setHorizontalAlignment() setzt nicht den Panel selbst nach rechts/links, sondern alle Elemente, die folgen.
- Soll in einer Zeile ein Element rechts, das andere Links angeordnet sein, so kann man ein
HorizontalPanel
aufbauen, das auf 100% setzen, zwei Elemente rechts und links setzen und dann die Zellen jeweils mitsetCellHorizontalAlignment(w1, HorizontalPanel.ALIGN_LEFT) und setCellHorizontalAlignment(w2, HorizontalPanel.ALIGN_RIGHT)
ausrichten.
Eclipse 3.8M5 und 4.2M5 Neuerungen
Siehe http://download.eclipse.org/eclipse/downloads/drops4/S-4.2M5-201201271145/eclipse-news-M5.html. Zwei Neuerungen sind interessant: Erkennen von Zugriffen auf null-Referenzen und Prüfungen bei AutoCloseable. Download unter
http://download.eclipse.org/eclipse/downloads/eclipse3x.php und
Update der Swing JIDE Komponenten auf Version 3.3.4
Kleine Änderungen bei den http://www.jidesoft.com/products/component.htm:
- (Common) Added CheckBoxListSelectionModel#setCheckAllEntry() to control the default behavior of CheckBoxList for "all" entry.
- (Common) Added isEnsureFontExistence to FontNameConverter.
- (Common) Added IconBorder class which can paint an icon as part of the border which is perfect to be used in the table cell through the CellStyle feature.
- (Common) Added a new component StyledToolTip.
- (Component) Set tooltip to the PregressStatusBarItem so that the message can still be shown even when the message is too long.
- (Grids) Fixed so that CellStyleTableHeader could support the new StyledToolTip.
- (Grids) Added overlayCellPainter and underlayCellPainter to CellStyle.
- (Grids) Added HeaderLineWrapModel interface to configure the line wrap properties for column header easier.
- (Grids) Added paintCellUnderlay method to paint the cell background below the cell content.
- (Grids) Added JideTableTransferHandler to accept importing data by default.
- (Grids) Added MarginExpandablePanel#getIcon(Node) to customize the icon easier.
- (Pivot) Added two APIs in PivotTablePane to customize the data table selection behavior. See the enhancement request here.
- (TreeMap) Improved robustness of colormap creation.
- (TreeMap) Added support for opening File instances through context menu.
- (TreeMap) Added support for ordering by ascending sizes.
Mehr unter http://www.jidesoft.com/history/.
Freies Buch “The Architecture of Open Source Applications”
http://www.aosabook.org/en/index.html:
Inhalt:
Amy Brown and Greg Wilson |
ix |
||
1. |
1 |
||
2. |
15 |
||
3. |
29 |
||
4. |
45 |
||
5. |
67 |
||
6. |
77 |
||
7. |
101 |
||
8. |
Robert Chansler, Hairong Kuang, Sanjay Radia, |
111 |
|
9. |
125 |
||
10. |
139 |
||
11. |
155 |
||
12. |
171 |
||
13. |
185 |
||
14. |
205 |
||
15. |
229 |
||
16. |
245 |
||
17. |
271 |
||
18. |
291 |
||
19. |
303 |
||
20. |
325 |
||
21. |
345 |
||
22. |
361 |
||
23. |
Juliana Freire, David Koop, Emanuele Santos, |
377 |
|
24. |
395 |
||
25. |
411 |
||
Sehr schön gemachte Seite über das Design von Android-Apps
Update der Hibernate Version 4.0.1
Erst ein paar Tage ist es her, da kam Hibernate 4 heraus. Nun gibt es auch schon das erste Update. Die Änderungen: https://hibernate.onjira.com/secure/ReleaseNote.jspa?projectId=10031&version=11754
Diagnose Kommandos kommen in Java 8 und Java 7u4
Das werden wir im nächsten Build bekommen, Quellen schon mal hier: http://hg.openjdk.java.net/jdk8/jdk8/jdk/rev/0194fe5ca404.
A diagnostic command is an action that can be invoked dynamically mainly for troubleshooting and diagnosis.
Die Idee ist also, das man ein Kommandozeilentool jcmd hat, mit dem man Kommandos an die JVM schicken kann. Dabei sind unterschiedliche Kommandos vordefiniert. Mit dem Argument PerfCounter.perf werden Performance-Kenngrößen ausgegeben.
Kleine Korrekturen im Java 7 Update 2
http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u2-download-1377129.html. Der Blog-Eintrag http://blogs.oracle.com/darcy/entry/project_coin_7u2_fixes gibt zwei Beispiele für Fehler aus den neuen Sprachfeatures, die gefixt sind.
NetBeans 7.1 Code-Transformation nach Java 7
Wähle im Menü Refactor > Inspect and Transform … und dann im Dialog bei Use:/Configuration: den Eintrag Convert to Java 7 aus. Ein Klick auf Inspect startet die Suche und listet Änderungsmöglichkeiten auf und bietet an, die Stellen automatisch zu beheben.
Ich habe das Tool auf den Beispielen meines Buches angewendet und die meisten Hinweise beziehen sich auf Diamond und natürlich im IO-Kapitel auf auf try-mit-Ressourcen. Damit habe ich heute den ganzen Tag verbracht und auch noch ein paar kleine Fehler gefunden. Eine Stelle ist interessant:
XMLOutputFactory factory = XMLOutputFactory.newInstance();
XMLStreamWriter writer = factory.createXMLStreamWriter( new FileOutputStream( "writenParty.xml" ) );
XMLStreamWriter hat close() aber kein AutoCloseable. Kann man als Fehler ansehen.
Das hier formt der Konverter nicht um, er beginnt erst bei “fett” mit dem switch, das liegt am zweiten if, was nicht als if else formuliert ist.
if ( "Ende".equals(e.getActionCommand()) )
System.exit( 0 );
if ( "fett".equals(e.getActionCommand()) )
t.setFont( font = font.deriveFont( font.getStyle() ^ Font.BOLD ) );
else if ( "kursiv".equals(e.getActionCommand()) )
t.setFont( font = font.deriveFont( font.getStyle() ^ Font.ITALIC ) );