Wir müssen migrieren! Was nun?

Preview:

DESCRIPTION

Speaker: Jens Schumann 5. November 2013 | JAX Mainz Viele ältere Java- und Java-EE-Anwendungen haben mittlerweile ihre Halbwertszeit überschritten: Neben den klassischen Problemfeldern Wartbarkeit, Entwicklungsgeschwindigkeit oder verfügbarer Support sprechen aktuelle Java- und Java-EE-Plattformentscheidungen für eine Migration bestehender Anwendungen hin zu einem neueren Technologie-Stack. Doch was bei einer kleinen Anwendung mithilfe von etwas Fleißarbeit erledigt werden kann, entpuppt sich bei großen, über viele Jahre gewachsenen Anwendungen schnell als unlösbare Aufgabe. Glücklicherweise bietet die Java-Community einige Tools und Ideen, mit deren Hilfe Technologiemigrationen vorab besser bewertet und teilweise bis vollständig automatisch realisiert werden können. Diese Session schildert Erfahrungen mit diesen Ansätzen und Tools und zeigt auf, wie serverseitige Migrationen (Komponentenmodell, Datenzugriff ...), aber auch GUI-Migrationen, beispielsweise von Swing zu JavaFX oder Webtechnologien, gemeistert werden können.

Citation preview

Wir müssen migrieren! Was nun?

Jens Schumann open knowledge GmbH

CMP / BMP!

Struts und Verwandte!Swing!

Stateless/Stateful EJB 2.x!J2EE Pattern!

YOUR-APP-Framework!YOUR-DB-Framework!

JSF 1.x!

Unsere Landschaft

Wir müssen migrieren!

Warum? •  Plattform-Support •  Entwicklungsperformance

•  Know-How •  Funktionsumfang

•  Komplexität, Performance, Integration, ...

•  Sex Appeal

Wohin? •  Java Server-Side –  Java EE Stack –  Spring Framework

•  Java Client-Side –  Java FX –  Web

Wohin? •  Beispiel: Java EE Stack

JSF 2.x CDI 1.x

CDI 1.x EJB 3.x

JPA 2.x

Wohin? •  Beispiel: Java EE Stack

JAX-WS CDI 1.x

CDI 1.x EJB 3.x

JAX-WS

Wohin? •  Beispiel: Java EE Stack

JAX-RS CDI 1.x

CDI 1.x EJB 3.x

JAX-RS

Ja aber!

•  Lines of Code •  Complexity

•  Changes

•  Team Staffing •  Development Process

•  Testing

Migrations Ansätze

•  Vollständig –  All-or-nothing

•  Schichtenorientiert –  Layer-by-layer –  Layer-only

•  Modulorientiert

–  Domain or technical

•  Manuell –  Rewrite by hand

•  Vollautomatisiert –  Refactoring

•  Teilautomatisiert –  Refactoring & Cleanup

Migrations Ansätze

•  Das Toolset ist vorhanden –  Eclipse JDT

–  IntelliJ Idea PSI

–  NetBeans Refactoring API Auto

matisierung

•  Das Toolset ist vorhanden –  Rewrite Code –  Rewrite Invocations –  Rewrite Failure Handling

–  Introduce Code –  Move Code –  Remove Code

–  Move Config

Auto matisierung

•  Beispiel JDT Refactoring –  Zugriff auf Abstract Syntax Tree –  Programmiermodell entspricht

GUI Verhalten: 2 Phasen •  Änderungen aufzeichnen

o.e.j.c.d.r.ASTRewrite o.e.j.c.d.r.ImportRewrite o.e.j.c.d.AST (Factory)

•  Änderungen anwenden o.e.j.t.Document o.e.t.e.TextEdit o.e.j.c.IBuffer (falls „auto-commit“)

Auto matisierung

•  Beispiel

–  Migration von EJB 2.x Stateless/Stateful Beans und Pattern zu Java EE 6/7 (CDI, EJB 3.x)

–  Beispiel: PetStore 1.3.2 Auto matisierung

EJB Transformation (1/5) public class CartEJBAction extends EJBActionSupport { public EventResponse perform(Event e) throws …{ CartEvent ce = (CartEvent)e; ShoppingClientFacadeLocal scf = (SCFL)machine.getAttribute(…); ShoppingCartLocal cart = scf.getShoppingCart(); switch (ce.getActionType()) { case CartEvent.ADD_ITEM : { cart.addItem(ce.getItemId()); } … } } }

EJB Transformation (2/5) public class ShoppingClientFacadeLocalEJB implements SessionBean { public ShoppingCartLocal getShoppingCart() { if (cart == null) { try { ServiceLocator sl = new ServiceLocator(); ShoppingCartLocalHome home =(SCLH)sl.getLocalHome(...); cart = home.create(); } catch (javax.ejb.CreateException cx) { ... } catch (ServiceLocatorException slx) { ...} } return cart; } }

EJB Transformation (3/5) public class ShoppingCartLocalEJB implements SessionBean { private HashMap cart; // default to the US English private Locale locale = Locale.US; public ShoppingCartLocalEJB() { cart = new HashMap(); } ... }

EJB Transformation (4/5) @Named @SessionScoped public class CartAction extends ActionSupport { @Inject privat ShoppingCart cart; public EventResponse perform(Event e) throws …{ CartEvent ce = (CartEvent)e; switch (ce.getActionType()) { case CartEvent.ADD_ITEM : { cart.addItem(ce.getItemId()); } … } } }

EJB Transformation (5/5) @Stateful public class ShoppingCart { private HashMap cart; // default to the US English private Locale locale = Locale.US; public ShoppingCart() { cart = new HashMap(); } ... }

•  Beispiel

–  Swing UI Layout Migration nach JSF 2.x

–  Migrationspfad •  Swing -> XMLEncoder ->

XSLT -> XHTML Auto matisierung

Swing Layout Migration (1/3) <java version=“..." class="java.beans.XMLDecoder"> ... <object class=“javax.swing.JPanel"> <void method="add"> ... continued ... </void> <object> </java>

Swing Layout Migration (1/3) <object class=“c.j.m.FormComponent"> <string>javax.swing.JComboBox</string> <void method="setProperty"> <string>name</string> <string>Kunde</string> </void> <void method="setProperty"> <string>nextFocusableComponent</string> <object class=„xxxx.FormReference"> <string>Profil</string> </object> </void> <void property="name"> <string>Kunde</string> </void> </object>

Swing Layout Migration (3/3) <!DOCTYPE html PUBLIC ...> <html xmlns="http://www.w3.org/1999/xhtml" ...> <h:body> <ui:composition template="/templates/master.xhtml"> <div> <h:outputLabel for="Kunde" value="Kunde" /> <h:selectOneMenu id="Kunde" value="#{backingBean.name}" /> .... </div> </ui:composition> </h:body> </html>

Was? •  Bestandaufnahme –  (Veraltete) Technologien –  (Veraltete) Muster –  Unnötige Infrastruktur –  Fehlende Abstraktionen –  Over-engineering –  Architektonische Fehler –  Assets

•  Domain •  Data Access •  Business Logik •  UI

•  Achtung –  Manuelle Bestands-

aufnahme fehleranfällig

•  Daher –  Toolsupport nutzen

–  Beispiel •  JBoss Windup

Was?

JBoss Windup •  High Level Architektur

Analyse –  „Problem Spots“

•  Focus –  Technologien –  Muster –  Konfigurationen

–  JBoss Migrationen

JBoss Windup •  Core Features

–  Java Klassifikation –  XML Klassifikation

–  JBoss Migration Rules –  Rule Extension

–  Reporting

Wie?

•  Discover problem spots •  Design alternatives •  Implement

–  New core features –  Refactorings –  Transformations

•  Automate migration •  Test and improve •  Freeze and Test •  Rollout

Wie?

•  Java2Java –  Refactoring

•  Web2Web –  (Begrenzt) XSLT

•  SwingToXXX –  Layout und „Binding“ via

XMLDecoder und XSLT –  Refactoring

•  Java2XXX –  Refactoring & Code

Generierung

Problem Bereiche

•  Fehlendes Domain Modell

•  Fehlende Muster

•  DB Layer/ OR-Mapping –  Fehlende JPA Features –  Lebenszyklus –  Stateful Handling

•  (UI)-Framework pollution –  Domain und UI Code

•  View Logik

•  Upgrade EJB 2.x –  EJB 3.x, CDI oder Spring

•  Remove J2EE Pattern –  Injection

•  Remove/Simplify YOUR Framework

•  Re-use CMP –  Nur Basis für weiter-

führende Arbeiten •  Swing2JavaFX •  Swing2JSF

Was geht?

Vielen Dank für Ihre Zeit. Kontakt: open knowledge GmbH Bismarckstr. 13 26122 Oldenburg

Q&A

openknowledge@WJAX2013

Dienstag: Java EE Day 12:00 – 13:00 New School Enterprise Architecture 17:45 – 18:45 Wir müssen migrieren! Was nun?

Donnerstag: 08:45 – 09:45 Android goes asynchronous 10:15 – 11:15 JS-Components in JSF-Anwendungen

Freitag: Java EE Experts Day 13:30 – 15:00 JPA: Pitfalls, Patterns und Performance 15:30 – 17:00 Real-Life-Chaos und Best Practices

Links •  http://www.vogella.com/articles/EclipseJDT/article.html •  http://www.eclipse.org/articles/article.php?file=Article-Unleashing-the-

Power-of-Refactoring/index.html •  http://www.eclipse.org/articles/article.php?file=Article-

JavaCodeManipulation_AST/index.html •  http://publib.boulder.ibm.com/infocenter/rtnlhelp/v6r0m0/index.jsp?

topic=%2Forg.eclipse.jdt.doc.isv%2Fguide%2Fjdt_api_manip.htm

Recommended