SW-Archäologie mit AspectJ

Ähnliche Dokumente
AOP by Examples. JavaLand, 25. März 2015, Oliver Böhm. Photo from

SW-Archäologie mit AOP (Praxisbericht)

AOP by Examples A P. 3. August Folie 1. AOP by Examples. agentes GmbH

Die NullPointerException-Falle

Ist AOP reif für die Praxis? (AOP = Aspektorientierte Programmierung) aop. Juli agentes AG

ung AOP und AspectJ 2005 agentes AG

AOP Day 07. eine Veranstaltung der SIG AspectJ. organisiert vom AOP-Komitee. und der guten Fee. powered by. Oliver Böhm Darko Palic Ludger Solbach

spectj AOP mit Java, Konzepte und Beispiele

OOP. Tagesprogramm. Aspektorientierte Programmierung. Annotationen

Aspektorientierte Programmierung

Advanced Software Engineering WS0910 Kapitel4. Dr. Dominik Haneberg

Analyse der Klasse Konto

Aspekt Orientierte Programmierung

Einführung in AOP. Rico Schiekel rschiekel@web.de. Agenda. Kernproblem der Objekt Orientierung

Javaaktuell. Sonderdruck. in Höchstform. iii iii iii ijug. iii. Java EE 6: GlassFish, JBoss und Geronimo, Seite 11

Arrays von Objekten. Dr. Philipp Wendler. Zentralübung zur Vorlesung Einführung in die Informatik: Programmierung und Softwareentwicklung

Testen mit JUnit. Martin Wirsing. Ziele. Arten von Tests. Testen. Whitebox-Test. Unit-Test

Testen mit JUnit. Martin Wirsing. Ziele. Arten von Tests. Testen. Lernen Unit Tests zu schreiben Lernen mit Unit-Testen mit JUnit durchzuführen

Einführung in die Programmierung mit Java

Einführung in die Aspect Orientierte Programmierung (AOP) Arno Schmidmeier, AspectSoft JUGS Zürich, Januar 2003

Aspektorientierte Programmierung (aspect-oriented programming, AOP)

6. Übung zu Software Engineering

Instrumentation von Android Anwendungen mit ExplorViz

3.2 Objekte und Klassen. Wir werden uns in diesem Kapitel näher mit Objekten und Klassen in Java beschäftigen.

3. Dokumentieren und Testen Advanced Programming Techniques Prof. Dr. Bernhard Humm FB Informatik, Hochschule Darmstadt

Beispiel: DB-Mock (1/7)

Aspekt-orientierte Programmierung

Tag 8 Repetitorium Informatik (Java)

Ich liebe Java && Ich liebe C# Rolf Borst

UML / Fujaba. Generierung von Java-Quellcode aus UML-Diagrammen. Marcel Friedrich

Programmieren. JUnit-Tests. Heusch -- Ratz -- Institut für Angewandte Informatik

Application Frameworks

Kapitel 15. Systemarchitektur

Einführung in die Programmierung für NF. Vererbung

Arrays Fortgeschrittene Verwendung

Unit Tests. Programmiermethodik. Eva Zangerle Universität Innsbruck

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 15/16. Kapitel 7. Grafische Benutzeroberflächen 1

Advices enthalten den eigentlichen Code, der vom AspectJ-Compiler über die Pointcuts an den entsprechenden Stellen eingeflochten wird.

Behutsame Modernisierung

Fifty Shades of Red. Oder wie man es schafft, dass Entwickler (endlich) unter Ihrer eigenen (schlechten) Software leiden müssen

Testen mit JUnit. Martin Wirsing. Ziele. in Zusammenarbeit mit Michael Barth, Philipp Meier und Gefei Zhang

Programmieren I. Dr. Klaus Höppner. Hochschule Darmstadt Wintersemester 2009/ / 22

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 12/13. Kapitel 11. Fehler und Ausnahmen

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 13/14. Kapitel 11. Fehler und Ausnahmen

Ausnahmebehandlung in Java

Einführung in die Programmierung für NF. Fehler und Ausnahmen

Oracle & Java HOW TO

SEP 114. Design by Contract

Objekte und Klassen. Eigene Definition von Klassen. Methoden. Konstruktoren. Instanzvariablen. UML Notation. Gleichheit von Objekten

Web-Testen mit JUnit und HttpUnit. Kai Schmitz-Hofbauer Lehrstuhl für Software-Technik Ruhr-Universität Bochum

Arrays von Objekten. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

4.2 Workshop EJB. Entwicklung von EJB-Anwendungen

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 14/15. Kapitel 11. Fehler und Ausnahmen 1

5.2 Workshop EJB. Entwicklung von EJB-Anwendungen. Das JOnAS-System

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik Ausnahmen

Kapitel 6. Vererbung

Programmieren. JUnit-Tests. Heusch -- Ratz -- Institut für Angewandte Informatik

JUnit. Software-Tests

Software-Engineering Software-Management

Große Übung Praktische Informatik 1

UNIVERSITÄT ULM Fakultät für Ingenieurswissenschaften und Informatik Institut für Datenbanken und Informationssysteme

Anwendung der Aspektorientierung : Security

Verifikation und AO Florian Wagner

Theorie zu Übung 8 Implementierung in Java

Ersetzbarkeit und Verhalten

Arrays von Objekten. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Programmieren I. Fehlerbehandlung Exceptions. Heusch 2. Bd, 3 Ratz 10. Institut für Angewandte Informatik

Vererbung. Martin Wirsing. Ziele. Vererbung

Java Übung. Übung Mai Universität Duisburg-Essen Kommedia, Übung EinPro SS06, Einführung in Java - Übung.

Repetitorium Informatik (Java)

Konsequent agile Entwicklung mit funk4onaler Programmierung. Michael Sperber

1 Einführung in Aspektorientierung

System.out.println("TEXT");

Swp08-6 Verantwortliche: Yundensuren, Baigalmaa. Testkonzept

Client-Server-Beziehungen

Lernteam OOP2 SW Programmieren 1 - H1103 Felix Rohrer

Kapitel 14. Systemarchitektur

JUnit a Cook s Tour. Framework in Java Automatisierter Ablauf von Testfällen Testläufe kombinieren. Unterlagen als PDF auf der Übungsseite!

Hauptseminar AOSD. Aspektorientierte Programmierung am Beispiel AspectJ

Aspekt-orientierte Programmierung

Kapitel 6. Vererbung

! 1. Unterklassen und Vererbung! 2. Abstrakte Klassen und Interfaces! 3. Modularität und Pakete. II.4.2 Abstrakte Klassen und Interfaces - 1 -

Programmiertechnik Ausnahmen

1 Motivation und Einleitung

Synchronisation in Java. Invisible Web

Kapitel 6. Vererbung

Software Engineering Klassendiagramme Einführung

2. Übung zu Software Engineering

SS Björn Berezowski B.Sc. Marco Münch B.Sc. Michael Roth B.Sc. Repetitorium PG 1. Übungsblatt. 1 Übung - Probeklausur SS 2010 Typ Prof.

Variablenarten. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java

Erste Java-Programme (Scopes und Rekursion)

// Zeigt den insgesamt einbezahlten Betrag auf der Bank. // Muss 1600 GE sein. System.out.println("Current Bank balance: " + b.

Transkript:

SW-Archäologie mit AspectJ Ausgrabungen vergangener SW-Architekturen Java Forum Stuttgart 2015 oliver.boehm@aosd.de 1

Agenda. 1.0 2.0 3.0 4.0 5.0 Die klassische Herangehensweise Ein kleiner Ausflug mit AOP Herangehensweise mit AOP Fazit Diskussion Es gibt zwei Arten von Programmen: Die einen laufen nicht, und die anderen sind veraltet. 09/24/13 2

1.0 Die klassische Herangehensweise Eigentlich waren wir noch nicht fertig, aber wir mussten liefern. 3

Wunsch! die Anwendung ist dokumentiert! die Doku ist aktuell! Test-System vorhanden! Unit-Tests u. Integrationstests! Testergebnisse reproduzierbar! Know-How vorhanden

Wunsch und Realität! die Anwendung ist dokumentiert! die Doku ist aktuell! Test-System vorhanden! Unit-Tests u. Integrationstests! Testergebnisse reproduzierbar! Know-How vorhanden! Doku? Welche Doku?! Doku wurde nie aktualisiert! Test-System = Produktivsystem! viele rote JUnit-Tests! agile Test-Daten! ehem. Entwickler verschwunden

Einstieg Dokumentation! Pflichtenheft! Architektur-Dokumente! hilfreich: Übersicht über die Architektur! Klassendiagramme und andere UML-Diagramme! Infrastruktur! beteiligte Systeme! Firewalls

https://www.flickr.com/photos/98640399@n08/10030588973/ Für wen? Aktualität? Wo? Ansprechpartner?

Realität Die aktuell gültige Quelle ist der Source-Code!

Alles was mir hilft, den Sourcecode zu verstehen, hilft mir das System zu verstehen. streng vertraulich, vertraulich, intern, öffentlich Autor / Thema der Präsentation 09/24/13 9

Testsysteme vorhanden? https://www.flickr.com/photos/astrablog/5243795143/

Testfälle dokumentieren die dynamische Sicht des Systems 09/24/13 11

2.0 Ein kleiner Ausflug mit AOP Wir haben s nochmal neu geschrieben, weil 1.0 nicht wartbar war. 12

Ein kleiner Abstecher in AOP

public class Konto { private double kontostand = 0.0; public double abfragen() { return kontostand; public void einzahlen(double betrag) { kontostand = kontostand + betrag; public void abheben(double betrag) { kontostand = kontostand - betrag; public void ueberweisen(double betrag, Konto andereskonto) { abheben(betrag); andereskonto.einzahlen(betrag);

public class Konto { private double kontostand = 0.0; alle Kontobewegungen müssen protokolliert werden public double abfragen() { return kontostand; public void einzahlen(double betrag) { kontostand = kontostand + betrag; public void abheben(double betrag) { kontostand = kontostand - betrag; public void ueberweisen(double betrag, Konto andereskonto) { abheben(betrag); andereskonto.einzahlen(betrag);

public class Konto { private static Logger log = Logger.getLogger(Konto.class); private double kontostand = 0.0; werden public double abfragen() { return kontostand; public void einzahlen(double betrag) { kontostand = kontostand + betrag; log.info("neuer Kontostand: " + kontostand); public void abheben(double betrag) { kontostand = kontostand - betrag; alle Kontobewegungen müssen protokolliert public void ueberweisen(double betrag, Konto andereskonto) { abheben(betrag); andereskonto.einzahlen(betrag); log.info("neuer Kontostand: " + kontostand);

fachliche Concerns Einzahlung Auszahlung Überweisung Dauerauftrag technische Concerns Authorisierung Sicherheit Logging GUI Transaktionen

fachliche Concerns Einzahlung Auszahlung Überweisung Dauerauftrag technische Concerns Authorisierung Sicherheit Logging GUI Transaktionen Konto kontostand abfragen einzahlen + logging abheben + logging überweisen

fachliche Concerns Einzahlung Auszahlung Überweisung Dauerauftrag technische Concerns Authorisierung Sicherheit Logging GUI Transaktionen Konto kontostand abfragen einzahlen abheben überweisen LogAspect logging

public aspect LogAspect { wenn sich der Kontostand ändert, gib eine Log- Meldung aus private static Logger log = Logger.getLogger(LogAspect.class); pointcut setkontostand() : set(double bank.konto.kontostand); after(double neu) : setkontostand() && args(neu) { log.info("neuer Kontostand: " + neu);

Program Execution JoinPoints

Pointcuts Program Execution JoinPoints

Pointcuts Program Execution Advice

JoinPoints können sein call execution initialization set/get handler

Konto konto = new Konto(); konto.einzahlen(500.0); 1. call 2. initialization 3. call 4.execution

pointcut setkontostand() : set(double bank.konto.kontostand); pointcut callbankmethods() : call(* bank.*konto.*(*)) call(* bank..*konto.*(..));

Program Execution before Advice after Advice around Advice

after(double neu) : setkontostand() && args(neu) { log.info("neuer Kontostand von " + thisjoinpoint.getthis() + ": " + neu); before() : callbankmethods() { log.debug("test: " + thisjoinpoint);

Object around() : loginrequiredexecutions() { if (!AccessControl.loggedIn()) { log.info("anmeldung notwendig"); try { AccessControl.login(); catch (LoginException e) { throw new AccessControlException("login failed"); return proceed();

public aspect AccessControlAspect { pointcut loginrequiredexecutions() : execution(@loginrequired * bank.konto.*(..));

private double kontostand = 0.0; Konto public void einzahlen(double betrag) { kontostand = kontostand + betrag; public void abheben(double betrag) { kontostand = kontostand - betrag; public void ueberweisen(double betrag, Konto andereskonto) { this.auszahlen(betrag); andereskonto.einzahlen(betrag); KontoAspect pointcut kontobewegung(double betrag): (call(public void bank.konto.einzahlen(double)) call(public void bank.konto.abheben(double))) && args(betrag); before(double betrag) : kontobewegung(betrag) { if (betrag < 0) { throw new IllegalArgumentException("negativer Betrag"); Konto.class private double kontostand = 0.0; public void einzahlen(doube betrag) { if (betrag < 0) { throw new IllegalArgumentException("negativer Betrag"); kontostand = kontostand + betrag; public void abheben(double betrag) { if (betrag < 0) { throw new IllegalArgumentException("negativer Betrag"); kontostand = kontostand - betrag; public void ueberweisen(double betrag, Konto andereskonto) { this.auszahlen(betrag); andereskonto.einzahlen(betrag);

3.0 Herangehensweise mit AOP Jetzt kann man damit arbeiten.

https://www.flickr.com/photos/cadencrawford/8422302030/ Herangehensweise mit AOP Schnittstellen beobachten

https://www.flickr.com/photos/cadencrawford/8422302030/ Schnittstellen beobachten Webbrowser Blackbox System X DB-Host java.net.socketexception: Übersicht java.net.connectexception: (Beispiel) Connection refused at com.mysql.jdbc.standardsocketfactory.connect(standardsocketfactory.java:156) at com.mysql.jdbc.mysqlio.<init>(mysqlio.java:283) at com.mysql.jdbc.connection.createnewio(connection.java:2541) at com.mysql.jdbc.connection.<init>(connection.java:1474) at com.mysql.jdbc.nonregisteringdriver.connect(nonregisteringdriver.java:264) at java.sql.drivermanager.getconnection(drivermanager.java:525) at java.sql.drivermanager.getconnection(drivermanager.java:193) at bank.archiv.init(archiv.java:25)...

https://www.flickr.com/photos/cadencrawford/8422302030/ DB-Verbindungen after() returning(object ret) : call(* java.sql.*.*(..)) { log.trace(joinpointhelper.getasstring(thisjoinpoint) + " = " + ret); java.sql.drivermanager.getconnection("jdbc:mysql://miniserver07:3306/test") = com.mysql.jdbc.connection@16a9d42 java.sql.connection.preparestatement("select kontostand from konto WHERE kontonr =?") = com.mysql.jdbc.serverpreparedstatement[1] - SELECT kontostand from konto WHERE kontonr = nu java.sql.preparedstatement.setint(1, 1) = (null) java.sql.preparedstatement.executequery() = com.mysql.jdbc.resultset@183f74d java.sql.resultset.next() = true java.sql.resultset.getdouble(1) = 5055.94 java.sql.resultset.close() = (null)

https://www.flickr.com/photos/cadencrawford/8422302030/ Aufruf von außen (1) public pointcut executepublic() : (execution(public * bank..*.*(..)) execution(public bank..*.new(..))) &&!within(environmentaspect); public pointcut executeframework() : execution(* bank..*.*(..)) execution(bank..*.new(..)); public pointcut calledfromoutside() : executepublic() &&!cflowbelow(executeframework()); before() : calledfromoutside() { Signature sig = thisjoinpoint.getsignature(); String caller = getcaller(thread.currentthread().getstacktrace(), sig); log.info(caller + " calls " + sig);

https://www.flickr.com/photos/cadencrawford/8422302030/ Aufruf von außen (2) Webbrowser org.apache.jsp.index_jsp._jspservice(index_jsp.java:54) calls bank.konto(int) org.apache.jsp.index_jsp._jspservice(index_jsp.java:58) calls void bank.konto.einzahlen(double) org.apache.jsp.index_jsp._jspservice(index_jsp.java:60) calls double bank.konto.abfragen() org.apache.jsp.index_jsp._jspservice(index_jsp.java:54) calls bank.konto(int) org.apache.jsp.index_jsp._jspservice(index_jsp.java:58) calls void bank.konto.einzahlen(double) org.apache.jsp.index_jsp._jspservice(index_jsp.java:60) calls double bank.konto.abfragen() Blackbox System X Übersicht (Beispiel) DB-Host

Daten-Recorder (Objekt-Log aufzeichnen) after() returning(object ret) : sqlcall() { objlogger.log(thisjoinpoint, ret); https://www.flickr.com/photos/mattblaze/2695044170/

Daten-Recorder (Objekt-Log einspielen) Object around() : sqlcall() { Object logged = loganalyzer.getreturnvalue(thisjoinpoint); return logged; https://www.flickr.com/photos/mattblaze/2695044170/

Demo? http://www.flickr.com/photos/dhaun/4926434047

Ergebnis! zusätzliches Logging! Tests laufen ohne DB! Auslagerung von Code-Änderungen https://www.flickr.com/photos/maxbell/4008717429/

UMLGraph BankRepositoryTest 0:Account 1:Account BankRepository getbalance() 0 transfer(account 1, Account 0... transfer(200, Account 0) debit(200) deposit(200) getbalance() 200

4.0 Fazit Wir halten uns an den Standard.

https://www.flickr.com/photos/thepositiveaboutnegatives/8636477712/ Fazit! Dokumentation ist Teil des Problems! Source ist die einzig aktuelle Dokumentation! Einarbeiten heißt Ausprobieren! Testfälle = Problemfälle! zusätzliche Erkenntnisse durch AOP

AOP kann helfen! beim Logging! beim Capture & Replay! beim Zeit zurückdrehen! Trennung Code - Änderungen aber: AOP kann keine Tests ersetzen AOP ist kein Allheilmittel https://www.flickr.com/photos/engine_lover_2/6465986755/

Links & Literatur! Oliver Böhm Aspektorientierte Programmierung mit AspectJ 5 http://www.aosd.de/buecher/aop_aspectj/! Media-Streamer in Java ein Fallbeispiel mit AOP http://www.jugs.de/protokolle/2005-02-17/jmf.pdf! UMLGraph http://www.umlgraph.org/! websequence diagrams https://www.websequencediagrams.com/! ObjectRecorder, SequenceGrapher http://patterntesting.org/! Java aktuell

Fragen! 5.0 Fragen? Oliver Böhm (o.boehm@optica.de) http://oli.blogger.de/20150628/ http://patterntesting.org