Download - Wir müssen migrieren! Was nun?
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