... newer stories
Monday, 13. October 2008
Hello World with PatternTesting
javatux, 22:25h

Now we are ready to create a simple Java project with a hello.World class inside:
package hello;
public class World {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}

Next we will integrate the PatternTesting library. Download it from the download page and call the project properties. Select the entry "AspectJ Build" and then the tab "Aspect Path". Add the patterntesting.0.6.0.jar you have downloaded and press ok.

You should see now the warning No logging should be done using System.out! in the problems view. I don't know any program which needs to use System.out for printing so this warning is normally ok. One exception from this rule is this Hello-World program so you can suppress it using the anntoation @SystemOutNeeded:
package hello;
import patterntesting.java.annotation.*;
public class World {
@SystemOutNeeded
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
happy patterntesting...
... link (0 Kommentare) ... comment
Monday, 6. October 2008
PatternTesting 0.6.0 released
javatux, 11:56h

What is still missing are some samples how to use PatternTesting. This will be a task for the next weeks.
Stay tuned...
... link (0 Kommentare) ... comment
Saturday, 27. September 2008
Trouble with Sourceforge
javatux, 00:58h

Also the patterntesting-devel mailing list is not alive at the moment. Sourceforge has moved to a new data center which was announced some days ago. I'm not the only one with this problem so I will wait...
Stay tuned...
... link (0 Kommentare) ... comment
Sunday, 14. September 2008
Java-Konferenz in Berlin
javatux, 11:52h

Auch wenn es die erste Konferenz war und mit bescheidenen finanziellen Mitteln organisiert wurde, machte es eine recht professionellen Eindruck, auch wenn es hin und wieder kleinere Pannen gab. Aber diese machen gerade den Reiz einer solchen Konferenz aus.
Die Konferenz beschränkte sich zwar vorwiegend auf das 2. Stockwerk, dennoch hatte ich einige Male Schwierigkeiten, mich auf dem Campus der FHTW zurechtzufinden. So war ich froh, dass ich aus den Katakomben der Fachhochschule, in die mich die Suche nach der Essensausgabe geführt hat, wieder heil herausgefunden habe. Ich habe mich noch einige Male in dem Gebäude verlaufen und war jedesmal wieder froh, einen der zahlreichen Hinweis-Pfeile zu entdecken, ohne die ich in dem Gebäudekomplex der FHTW verloren gewesen wäre.
Es standen einige interessante Vorträge zur Auswahl, zu denen ich leider nicht alle gehen konnte. Beim abendlichen Grillen hatte man dann Zeit, sich mit dem ein oder anderen auszutauschen, was auch intensiv genutzt wurde. Dankenswerterweise fingen die Vorträge am Sonntag erst um 10 Uhr an.
Meine Folien zur Konferenz:
- Java gestern, heute, morgen helloberlinjar (pdf, 1,316 KB) (Folien zur Begrüßung im Audimax der FHTW)
- Aspektorientierung - gibt es ein Leben nach Java und OO? aspektorientierung (pdf, 3,059 KB)
... link (0 Kommentare) ... comment
Sunday, 15. June 2008
Linux-Camp 2008
javatux, 16:21h

Der spannenste und schwierigste Teil aus meiner Sicht war die Installation, auch wenn sie im Vergleich zu den Anfangszeiten von Linux sehr einfach geworden ist. Als Basis wurde Ubuntu 8.04 (Hardy Heron) verwendet. Bei Fragen dazu ist ubuntuusers.de eine gute Anlaufstelle.
Linkliste: s. JUGS-Forum
... link (0 Kommentare) ... comment
Thursday, 22. May 2008
Update von Gutsy auf Hardy
javatux, 00:54h
Nachdem ich vor einem halben Jahr von SuSE 10.2 auf Ubuntu umgestiegen bin, stand jetzt mit Ubuntu 8.04 ("Hardy Heron") das erste Update an. Leider war es nicht ganz problemlos - das eigentliche Update hat zwar geklappt, aber nach dem Booten waren WLAN und Audio still. Schuld daran waren wohl die Crypto-Module padlock-aes und geode_aes, die ich daraufhin in die Blacklist /etc/modprobe.d/blacklist verbannt habe:
Den entscheidenden Hinweis dazu habe ich aus der Bug-Beschreibung zu Bug #189398 erhalten. Seitdem tut sowohl WLAN als auch Sound wieder.
# these aes modules break the airo driver
blacklist padlock_aes
blacklist geode_aes
Den entscheidenden Hinweis dazu habe ich aus der Bug-Beschreibung zu Bug #189398 erhalten. Seitdem tut sowohl WLAN als auch Sound wieder.
... link (0 Kommentare) ... comment
Tuesday, 6. May 2008
Grady Booch in Second Life
javatux, 23:32h

... link (0 Kommentare) ... comment
Wednesday, 30. April 2008
PatternTesting 0.5.1 released
javatux, 00:38h

... link (0 Kommentare) ... comment
Friday, 25. April 2008
Aspektorientierung - Gibt es ein Leben nach OO?
javatux, 10:55h
Dies war der Titel einer BOF-Session auf der JAX, die ich zusammen mit Achim Demelt geleitet habe. Unsere Befürchtungen, dass sich kein Teilnehmer auf diese Session verirren würde, erwies sich glücklicherweise als unbegründet, trotz der späten Stunden (21:15 Uhr) und prominenter Konkurrenz-Veranstaltungen (z.B. Eclipse Nite oder MDSD mit Eclipse Tools). Rund ein Dutzend Teilnehmer diskutierten recht angeregt, was vielleicht auch an den rechten provokanten Folien lag, in denen der Geist von Markus Völter (hat bei den Vorbereitungen mitgeholfen), mitschwang. Themen wie "AOP ist tot" oder "AOP ist zu mächtig" kann man natürlich nicht so stehen lassen, und so dauerte die Diskussion noch bis nach 23:00 Uhr, ohne dass es langweilig wurde.
Fazit: Interesse ist da für AOP, aber es hat mit noch damit zu kämpfen, dass es ein schlechtes Marketing hat (wer kann sich denn unter "Pointcut", "Joinpoint" oder "Advice" etwas vorstellen?). Auch fehlt es (noch) an guten (Grundlagen-) Büchern. Eines der wenigen Büchern im deutschsprachigen Raum ist dabei "AOP mit AspectJ 5" vom dpunkt-Verlag, aber bei diesem Buch liegt der Fokus mehr auf der Sprache.
Was auch noch fehlt, sind AOP-Bibliotheken. Für AspectJ gibt es Patterntesting, das ich vor einiger Zeit von Vincent Massol und Matt Smith übernommen habe und für das ich aus dieser Diskussion ein paar interessante Ideen (z.B. für die AbstractNullPointerTrap) mitnehmen konnte.
Fazit: Interesse ist da für AOP, aber es hat mit noch damit zu kämpfen, dass es ein schlechtes Marketing hat (wer kann sich denn unter "Pointcut", "Joinpoint" oder "Advice" etwas vorstellen?). Auch fehlt es (noch) an guten (Grundlagen-) Büchern. Eines der wenigen Büchern im deutschsprachigen Raum ist dabei "AOP mit AspectJ 5" vom dpunkt-Verlag, aber bei diesem Buch liegt der Fokus mehr auf der Sprache.
Was auch noch fehlt, sind AOP-Bibliotheken. Für AspectJ gibt es Patterntesting, das ich vor einiger Zeit von Vincent Massol und Matt Smith übernommen habe und für das ich aus dieser Diskussion ein paar interessante Ideen (z.B. für die AbstractNullPointerTrap) mitnehmen konnte.
... link (1 Kommentar) ... comment
Saturday, 19. April 2008
Document-Driven-Development mit FIT (2)
javatux, 19:36h
Im ersten Teil hatten wir eine einfache Tabelle mit Rechnername und Portnummer, die wir mit Hilfe des FIT-Frameworks automatisch überprüft haben. Jetzt wollen wir alle aktiven Ports testen:
Für solche Aufgaben, wo evtl. Tabellen-Zeilen hinzukommen können, bietet sich die RowFixture an:
getTargetClass() liefert eine Klasse zurück, die eine Reihe in der Port-Tabelle vom letzten Mal repräsentiert, und die query()-Methode liefert alle Ergebnisse zurück. Fangen wir mit getTargetClass() an und definieren dafür die PortTester-Klasse:
Für die Klasse gelten die gleichen Regeln wie für die PortScannerFixture-Klasse vom letzten Mal: Überschriften werden zu Attribute bzw. zu Methoden, wenn sie mit "()" enden. Damit können wir jetzt schonmal den FileRunner aufrufen:
FIT bemängelt hier, das beim Test die beiden Zeilen mit Port 22 und 80 fehlen – dies liegt daran, dass query() noch ein leeres Array zurückliefert. Das wollen wir ändern und für jeden offenen Port ein PortTester-Objekt in einem Array sammeln:
Hier werden jeweils für die wellknown Ports zwischen 0 und 1023 ein PortTester-Objekt angelegt. Nur wenn der Aufruf von Status() "aktiv" ist, wird es in die Liste aufgenommen und am Ende als Array zurückgegeben. Das Ergebnis auf meinem Rechner sah danach so aus:
Mit "surplus" werden die Spalten markiert, die hinzugekommen sind. Offensichtlich sind auf meinem Rechner noch die Ports 111 und 631 offen. Ein Blick in List of TCP and UDP port numbers offenbart, dass sich dahinter das "sun protocol" (RPC-Aufruf) und das "Internet Printing Protocol (IPP)" verbirgt.
Damit ist der kleine Ausflug in FIT beendet. Wenn Sie Interesse daran gefunden haben, dann besuchen Sie mich doch auf meinem Vortrag "Wie man tote Dokumente zum Leben erweckt" auf dem Java Forum Stuttgart.
Viel Spaß mit FIT!
de.aosd.PortScannerFixture | ||
Rechner | Portnummer | Status() |
localhost | 22 | aktiv |
localhost | 80 | aktiv |
Für solche Aufgaben, wo evtl. Tabellen-Zeilen hinzukommen können, bietet sich die RowFixture an:
public class PortScannerRowFixture extends RowFixture {
@Override
public Class<?> getTargetClass() {
return PortTester.class;
}
@Override
public Object[] query() throws Exception {
return new Object[0];
}
}
getTargetClass() liefert eine Klasse zurück, die eine Reihe in der Port-Tabelle vom letzten Mal repräsentiert, und die query()-Methode liefert alle Ergebnisse zurück. Fangen wir mit getTargetClass() an und definieren dafür die PortTester-Klasse:
public class PortTester {
public String Rechner;
public int Portnummer;
public String Status() throws UnknownHostException {
return PortScanner.isActive(Rechner, Portnummer) ? "aktiv" : "inaktiv";
}
}
Für die Klasse gelten die gleichen Regeln wie für die PortScannerFixture-Klasse vom letzten Mal: Überschriften werden zu Attribute bzw. zu Methoden, wenn sie mit "()" enden. Damit können wir jetzt schonmal den FileRunner aufrufen:
de.aosd.PortScannerRowFixture | ||
Rechner | Portnummer | Status() |
localhost missing | 22 | aktiv |
localhost missing | 80 | aktiv |
FIT bemängelt hier, das beim Test die beiden Zeilen mit Port 22 und 80 fehlen – dies liegt daran, dass query() noch ein leeres Array zurückliefert. Das wollen wir ändern und für jeden offenen Port ein PortTester-Objekt in einem Array sammeln:
public Object[] query() throws Exception {
ArrayList active = new ArrayList();
for (int i = 0; i < 1023; i++) {
PortTester tester = new PortTester();
tester.Portnummer = i;
tester.Rechner = "localhost";
if (tester.Status().equals("aktiv")) {
active.add(tester);
}
}
return active.toArray();
}
Hier werden jeweils für die wellknown Ports zwischen 0 und 1023 ein PortTester-Objekt angelegt. Nur wenn der Aufruf von Status() "aktiv" ist, wird es in die Liste aufgenommen und am Ende als Array zurückgegeben. Das Ergebnis auf meinem Rechner sah danach so aus:
de.aosd.PortScannerRowFixture | ||
Rechner | Portnummer | Status() |
localhost | 22 | aktiv |
localhost | 80 | aktiv |
localhost surplus | 111 | aktiv |
localhost surplus | 631 | aktiv |
Mit "surplus" werden die Spalten markiert, die hinzugekommen sind. Offensichtlich sind auf meinem Rechner noch die Ports 111 und 631 offen. Ein Blick in List of TCP and UDP port numbers offenbart, dass sich dahinter das "sun protocol" (RPC-Aufruf) und das "Internet Printing Protocol (IPP)" verbirgt.
Damit ist der kleine Ausflug in FIT beendet. Wenn Sie Interesse daran gefunden haben, dann besuchen Sie mich doch auf meinem Vortrag "Wie man tote Dokumente zum Leben erweckt" auf dem Java Forum Stuttgart.
Viel Spaß mit FIT!
Links:
- Beispiel-Projekt: portscanner080419 (zip, 7 KB)
- FIT: fit.c2.com
- Fitnesse: www.fitnesse.org
... link (0 Kommentare) ... comment
Tuesday, 15. April 2008
Tomcat Manager unter Eclipse WTP
javatux, 18:00h
Wenn man Tomcat aus den Eclipse Web Tools startet, hat man das Problem, dass dabei der Tomcat-Manager unter "/manager/html" nicht mitgestartet wird. Man kann zwar in der Server-Konfiguration für den Tomcat "${catalina_home}/webapp/manager" als externes Webmodul hinzufügen, aber das wird beim Starten mit einer SecurityException bestraft:
Ach ja, anmelden muss man sich als User "manager" - der ist nicht standardmäßig in tomcat-users.xml vorhanden. Falls man Probleme mit der Anmeldung hat, muss man evtl. dort nachschauen (falls man die Default-Authorisierung verwendet).
Happy Testing...
java.lang.SecurityException: Servlet of class org.apache.catalina.manager.HTMLManagerServlet is privileged and cannot be loaded by this web application org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) java.lang.Thread.run(Thread.java:595)Die Manager-Anwendung muss als "privileged" gekennzeichnet werden. Unter dem "Servers"-Projekt im Package-Explorer findet man die Tomcat-Konfigurationsdateien. Hier ergänzt man in servers.xml den Manager-Context:
<Context antiJARLocking="false" antiResourceLocking="false" docBase="/opt/tomcat6/webapps/manager" path="/manager" privileged="true" reloadable="false"/>
Die Pfade muss man natürlich an die lokale Gegebenheiten anpassen. Danach müsste der Tomcat-Manager nach Starten des Servers unter http://localhost:8080/manager/html erreichbar sein.Ach ja, anmelden muss man sich als User "manager" - der ist nicht standardmäßig in tomcat-users.xml vorhanden. Falls man Probleme mit der Anmeldung hat, muss man evtl. dort nachschauen (falls man die Default-Authorisierung verwendet).
Happy Testing...
... link (0 Kommentare) ... comment
Sunday, 13. April 2008
Document-Driven-Development mit FIT
javatux, 14:58h
(eine kleine Einführung in das FIT-Framework)
Schon mal TDD (Test-Driven-Development) ausprobiert? Dann wird Ihnen auch sicherlich das FIT-Framework von Ward Cunningham gefallen, dass sich sehr gut mit dem TDD-Ansatz kombinieren lässt.
Basis von FIT sind Tabellen, die als Eingabe für automatische Testfälle dienen. Als Beispiel werden wir eine Tabelle mit Ports heranziehen, die wir etwas abändern werden, um unseren eigenen Rechner damit überprüfen zu können:
Die Tabelle aus Wikipedia wurde um die Spalte "Rechner" und "Status()" ergänzt. Am Anfang der Tabelle wurde noch eine Zeile mit einem sogenannten "Fixture" eingefügt. Dabei handelt es sich um eine Java-Klasse, die später vom FIT-Framework aufgerufen wird:
ColumnFixture ist eine Oberklasse von FIT, die den meisten Komfort im Umgang mit Tabellen bietet. Zwei Dinge sind wichtig für die Imlementierung:
Der zweite Parameter (result.html) gibt die Ausgabedatei an, in der das Ergebnis abgelegt wird. Das Ergebnis entspricht im Wesentlichen der Eingabedatei mit Ausnahme der Tabellen:
Ok, jetzt können wir uns der Implementierung der Status()-Methode widmen, um die roten Tabellen-Einträge wegzubekommen:
Unter der Annahme, dass die PortScanner.isActive()-Methode das Gewünschte leistet, sollten die roten Einträge nun grün werden:
Damit wissen wir nicht nur, dass Port 22 und 80 auf unserem Rechner aktiv sind, sondern haben auch die isActive()-Methode unserer PortScanner-Klasse getestet.
Sollen noch andere Rechner oder Ports getestet werden, wird die Tabelle entsprechend erweitert. Was aber, wenn wir eine Liste aller aktiven Ports vorgeben wollen? Für solch eine Überprüfung bietet sich die RowFixture an – aber das ist ein Thema für's nächste Mal.
stay tuned...
Schon mal TDD (Test-Driven-Development) ausprobiert? Dann wird Ihnen auch sicherlich das FIT-Framework von Ward Cunningham gefallen, dass sich sehr gut mit dem TDD-Ansatz kombinieren lässt.
Basis von FIT sind Tabellen, die als Eingabe für automatische Testfälle dienen. Als Beispiel werden wir eine Tabelle mit Ports heranziehen, die wir etwas abändern werden, um unseren eigenen Rechner damit überprüfen zu können:
de.aosd.PortScannerFixture | ||||
Rechner | Portnummer | Dienst | Beschreibung | Status() |
localhost | 20 | FTP-Data | Dateitransfer (Datentransfer vom Server zum Client) | inaktiv |
localhost | 22 | SSH | Secure Shell | aktiv |
localhost | 80 | HTTP | Webserver | aktiv |
Die Tabelle aus Wikipedia wurde um die Spalte "Rechner" und "Status()" ergänzt. Am Anfang der Tabelle wurde noch eine Zeile mit einem sogenannten "Fixture" eingefügt. Dabei handelt es sich um eine Java-Klasse, die später vom FIT-Framework aufgerufen wird:
public class PortScannerFixture extends ColumnFixture {
public String Rechner;
public int Portnummer;
public String Dienst;
public String Beschreibung;
public String Status() {
return "not implemented";
}
}
ColumnFixture ist eine Oberklasse von FIT, die den meisten Komfort im Umgang mit Tabellen bietet. Zwei Dinge sind wichtig für die Imlementierung:
- ich muss Attribute als "public" bereitstellen, die genauso wie die Tabellen-Überschriften heißen (Rechner, Portnummer, Dienst, Beschreibung);
- Tabellen-Überschriften, die wie Methoden-Aussehen (hier: Status()) müssen implementiert werden und einen String zurückliefern.
> java fit.FileRunner services.html result.html
0 right, 3 wrong, 0 ignored, 0 exceptions
Der zweite Parameter (result.html) gibt die Ausgabedatei an, in der das Ergebnis abgelegt wird. Das Ergebnis entspricht im Wesentlichen der Eingabedatei mit Ausnahme der Tabellen:
de.aosd.PortScannerFixture | ||||
Rechner | Portnummer | Dienst | Beschreibung | Status() |
localhost | 20 | FTP-Data | Dateitransfer (Datentransfer vom Server zum Client) | inaktiv expected not implemented actual |
localhost | 22 | SSH | Secure Shell | aktiv expected not implemented actual |
localhost | 80 | HTTP | Webserver | aktiv expected not implemented actual |
Ok, jetzt können wir uns der Implementierung der Status()-Methode widmen, um die roten Tabellen-Einträge wegzubekommen:
public String Status() throws UnknownHostException {
return PortScanner.isActive(Rechner, Portnummer) ? "aktiv" : "inaktiv";
}
Unter der Annahme, dass die PortScanner.isActive()-Methode das Gewünschte leistet, sollten die roten Einträge nun grün werden:
de.aosd.PortScannerFixture | ||||
Rechner | Portnummer | Dienst | Beschreibung | Status() |
localhost | 20 | FTP-Data | Dateitransfer (Datentransfer vom Server zum Client) | inaktiv |
localhost | 22 | SSH | Secure Shell | aktiv |
localhost | 80 | HTTP | Webserver | aktiv |
Damit wissen wir nicht nur, dass Port 22 und 80 auf unserem Rechner aktiv sind, sondern haben auch die isActive()-Methode unserer PortScanner-Klasse getestet.
Sollen noch andere Rechner oder Ports getestet werden, wird die Tabelle entsprechend erweitert. Was aber, wenn wir eine Liste aller aktiven Ports vorgeben wollen? Für solch eine Überprüfung bietet sich die RowFixture an – aber das ist ein Thema für's nächste Mal.
stay tuned...
Links:
- Beispiel-Projekt: portscanner080413 (zip, 5 KB)
- FIT: fit.c2.com
- Fitnesse: www.fitnesse.org
... link (0 Kommentare) ... comment
Saturday, 1. March 2008
JUGS ObjektForum
javatux, 11:58h
Am 25. Februar gestaltete die Java User Group Stuttgart zusammen mit andrena objects ag eine Abend zum Thema Software-Qualität. |
|
... link (0 Kommentare) ... comment
Sunday, 24. February 2008
Patterntesting on ibiblio.org
javatux, 22:30h

... link (0 Kommentare) ... comment
... older stories