#Projektinventur, Reverse Engineering und Entry Points

Dieses Kapitel zeigt, wie du ein altes Enterprise-Java-Projekt sichtbar machst, bevor du Code änderst.

#Phase A: Legacy Inventory

Erstelle:

text
docs/legacy-inventory.md

Vorlage:

markdown
# Legacy Inventory

## Runtime
- Java Version:
- Application Server:
- Java EE / Jakarta EE Version:
- Build Tool:
- Packaging:
- Deployment Target:
- Betriebssystem / Container:
- Datenbank:
- JMS Provider:
- SOAP Stack:
- JPA Provider:

## Modules
| Modul | Typ | Zweck | Artefakt |
|---|---|---|---|
| legacy-web | WAR | JSP/Servlet UI | legacy-web.war |
| legacy-ejb | EJB-JAR | Business Services | legacy-ejb.jar |
| legacy-ear | EAR | Deployment | legacy.ear |

## External Systems
| System | Typ | Richtung | Zweck | Kritisch |
|---|---|---|---|---|
| PaymentProvider | SOAP | Outbound | Zahlung | ja |
| ERP | SOAP | Inbound/Outbound | Stammdaten | ja |
| OrderQueue | JMS | Async | Bestellverarbeitung | ja |

## Persistence
- Datasources:
- XA enabled:
- Persistence Units:
- wichtige Tabellen:
- Stored Procedures:
- Trigger:
- Views:

## Deployment
- EAR/WAR/JAR Struktur:
- Server Config:
- JNDI Ressourcen:
- Environment-spezifische Properties:

#Code-Suchliste

Starte mit diesen Suchbegriffen:

text
@Stateless
@Stateful
@Singleton
@MessageDriven
@TransactionAttribute
TransactionAttributeType
@Resource
@EJB
@PersistenceContext
@PersistenceUnit
InitialContext
UserTransaction
SessionContext
setRollbackOnly
@WebService
@WebMethod
@WebServiceRef
SOAPFaultException
BindingProvider
@SOAPBinding
@WebServlet
@WebFilter
HttpSession
request.getParameter
session.getAttribute
.jsp
@Schedule
@Timeout
TimerService
@RolesAllowed
@PermitAll
@DenyAll
isUserInRole
getCallerPrincipal

Gruppiere Treffer in:

text
1. EJB Services
2. Message Driven Beans
3. SOAP Endpoints
4. SOAP Clients
5. Transaktionen
6. JPA/JDBC/DAO
7. JSP/Servlet UI
8. Security
9. Scheduler/Timer/Batch
10. JNDI/Runtime Resources

#Entry-Point-Katalog

Erstelle:

text
docs/entry-points.md

Vorlage:

markdown
# Entry Points

## Web / JSP / Servlet

| URL / JSP | Servlet / Controller | Zweck | Session? | Risiko |
|---|---|---|---|---|
| /order/create.jsp | OrderServlet | Bestellung anlegen | ja | hoch |

## SOAP Inbound

| Service | Klasse | Operation | WSDL | Aufrufer | Risiko |
|---|---|---|---|---|---|
| CustomerService | CustomerEndpoint | updateCustomer | customer.wsdl | CRM | hoch |

## JMS Consumers

| Queue / Topic | MDB | Message Type | Zweck | Risiko |
|---|---|---|---|---|
| OrderCreatedQueue | InvoiceMDB | XML/ObjectMessage | Rechnung erzeugen | hoch |

## Timer / Batch

| Job | Klasse | Frequenz | Zweck | Risiko |
|---|---|---|---|---|
| NightlyBillingJob | BillingTimerBean | täglich 02:00 | Abrechnung | hoch |

## Remote EJB

| Interface | Bean | Aufrufer | Zweck | Risiko |
|---|---|---|---|---|
| OrderServiceRemote | OrderServiceBean | externes Modul | Bestellung | hoch |

#JNDI und Runtime Resources

#Was du erfassen musst

  • Datasources
  • XA Datasources
  • JMS ConnectionFactories
  • Queues
  • Topics
  • Mail Sessions
  • EJB JNDI Names
  • Environment Entries
  • Server-spezifische Deployment Descriptors

#Runtime Resources Vorlage

markdown
# Runtime Resources

## Datasources

| JNDI Name | DB | XA? | Genutzt von |
|---|---|---|---|
| java:/jdbc/OrderDS | orderdb | ja | orderPU |

## JMS

| JNDI Name | Typ | Genutzt von |
|---|---|---|
| java:/jms/queue/OrderCreatedQueue | Queue | OrderEventProducer, InvoiceMDB |

## EJB Lookups

| JNDI Name | Interface | Genutzt von |
|---|---|---|
| java:global/app/OrderServiceBean | OrderServiceRemote | JSP, Batch |

Regel:

text
JNDI nicht überall direkt nutzen.
JNDI über zentrale Adapter/Fabriken kapseln.

#Deployment und Build

#Was du verstehen musst

  • EAR
  • WAR
  • EJB-JAR
  • shared lib/
  • application.xml
  • web.xml
  • ejb-jar.xml
  • persistence.xml
  • Server-spezifische Deskriptoren
  • Maven/Ant/Gradle
  • interne Repositories
  • App-Server Libraries
  • Classloader-Grenzen
  • Dependency-Konflikte

#Deployment-Struktur

markdown
# Deployment Structure

| Artifact | Typ | Inhalt | Abhängigkeiten |
|---|---|---|---|
| legacy-web.war | WAR | JSP/Servlet | legacy-ejb.jar |
| legacy-ejb.jar | EJB-JAR | Business Beans | legacy-core.jar |
| legacy-core.jar | JAR | Domain/DTO/Util | shared |
| legacy-soap.war | WAR | SOAP Endpoints | legacy-ejb.jar |

Typische Risiken:

  • gleiche Library in WAR und EAR/lib
  • JAXB-/JAX-WS-Versionen kollidieren
  • Server bringt eigene APIs mit
  • ClassCastException wegen Classloader
  • alte vendor clients
  • manuelle Deployment-Schritte

#Beispiel: kompletter Use-Case-Slice

text
createOrder.jsp
    ↓
OrderServlet#doPost
    ↓
OrderServiceBean#createOrder
    ↓
CreateOrderUseCase#execute
    ↓
OrderRepository#save
    ↓
AuditPort#orderCreated
    ↓
OrderEventPublisher#publishOrderCreated
    ↓
OrderCreatedQueue
    ↓
InvoiceMDB#onMessage
    ↓
InvoiceMessageHandler#handle
    ↓
CreateInvoiceUseCase#execute

Dokumentation:

markdown
# Use Case: Bestellung anlegen

## Entry Point
- JSP:
- Servlet:
- SOAP:
- JMS:
- Scheduler:

## Call Chain
| Schritt | Klasse | Methode | Technologie | Side Effect |
|---|---|---|---|---|

## Transaction
| Klasse | Methode | TX Attribute | Bemerkung |
|---|---|---|---|

## Database
| Tabelle | Operation | Klasse | Risiko |
|---|---|---|---|

## Messaging
| Queue | Producer | Consumer | Message Type | Retry |
|---|---|---|---|---|

## SOAP
| Service | Richtung | Methode | Timeout | Risiko |
|---|---|---|---|---|

## Fehlerfälle
| Fehler | Rollback? | Retry? | Aktion |
|---|---|---|---|

## Modernisierungsstrategie
- KEEP:
- WRAP:
- EXTRACT:
- REPLACE:
- Risiken:

#Risiko-Backlog Vorlage

markdown
# Risk Backlog

| Thema | Risiko | Auswirkung | Modernisierungsaktion | Priorität |
|---|---|---|---|---|
| Payment SOAP in TX | hoch | Deadlocks/Inkonsistenz | Timeout + Adapter + Outbox prüfen | P1 |
| InvoiceMDB nicht idempotent | hoch | doppelte Rechnungen | Idempotency Key einführen | P1 |
| createOrder.jsp enthält Logik | mittel | UI schwer ersetzbar | Logik in Service extrahieren | P2 |
| Audit REQUIRES_NEW | hoch | Semantik kritisch | Verhalten testen/dokumentieren | P1 |
| JNDI Lookups überall | mittel | schwer migrierbar | zentrale Adapter/Fassade | P2 |