Files
pi_mcps/java/mss-failsafe/docs/REFRESH_AND_FAKE_ID_MECHANISM.md
Patrick Plate 1a0a56a626 chore(java): consolidate mss-failsafe to single canonical copy
Replace the stale multi-module java/mss-failsafe skeleton (old user-management
prototype) with the active single-module machine-safety inspection app that was
living in its own standalone repo at the repo root.

- Remove old java/mss-failsafe/ multi-module tree (mss, userdata, userManagement,
  mssfailsafe.datalayer, mssfailsafeWeblayer) incl. committed build artifacts
- Add the active app (PrimeFaces 11 / JSF 2.3 / Hibernate 5.6 / iText / POI)
  flattened into java/mss-failsafe/ as the only mss-failsafe in git
- Working tree captured = master tip 2a142b5 + in-progress uncommitted work
  (incl. .github/*.instructions.md AI-context files)
- Archive the standalone repo's 33-commit history in GIT_HISTORY_ARCHIVE.md
  since its .git was not migrated

This is the source of truth / base for the upcoming upgraded rewrite.
2026-06-13 19:55:28 +02:00

5.2 KiB
Executable File
Raw Permalink Blame History

Mechanismus: Refresh & Fake-ID

Problemstellung

Im UI werden häufig neue Objekte in Collections angezeigt, bevor sie persistiert sind. Diese benötigen eine temporäre Identifikation (ID) für Auswahl/Operationen, ohne den Datenbankzustand zu verfälschen.

Fake-ID Strategie

  • Negative Long Werte (< 0) kennzeichnen nicht persistierte Objekte.
  • Erzeugung: AbstractController.createFakeID(Collection<ENT>):
    • Startwert -1.
    • Falls bereits negative IDs existieren → Nimmt die kleinste negative und subtrahiert 1.
    • Ergebnis: Sequenz -1, -2, -3 ... (absteigend).

Persistieren

Vor finalem Speichern (z.B. SecurityAreaController.save()):

  1. Alle Entities mit id < 0setId(null).
  2. AbstractManager.saveAll() unterscheidet durch entity.getId() == null zwischen Persist und Merge.
  3. Datenbank vergibt positive ID (Auto Increment / Sequence).

Vorteile

  • Klare Unterscheidung UI-temporär vs. persistent.
  • Verhindert versehentliches Auslösen von Merge bei noch nicht existierenden DB Zeilen.

Risiken

  • Verwechslung negativ gesetzter IDs mit echten IDs (nicht möglich, da DB positive IDs generiert).
  • Direkte Verwendung negativer IDs in DB-Operationen (vermeiden: Prüfen auf id > 0 vor em.find).

Refresh

  • Methode AbstractController.refrehSelected() (Tippfehler im Namen, historisch) ruft getManager().refresh(selected).
  • AbstractManager.refresh(entity):
    • Falls ID null → save(entity) (persistiert neues Objekt).
    • merge für Managed Zustand und Hibernate.initialize(entity) zur Lazy Init.

Best Practices

  • Nach komplexen Änderungen (Add/Remove Child Collections) Refresh durchführen wenn UI weitere Lazy Properties benötigt.
  • Beim Klonen persistenter Objekte zuerst DB-Laden → danach Kopie erstellen.

Potentielle Verbesserungen

  • Korrektur Tippfehler refrehSelected()refreshSelected() (Refactoring + Suchanpassungen).
  • Kennzeichnung Fake-ID generierender Methoden mit JavaDoc für Klarheit.

Aktualisiert: 2025-10-20

MSS Failsafe Developer Einstieg

Dieses Verzeichnis bündelt technische Instruktionsdateien zur schnelleren Einarbeitung und zur Unterstützung automatischer Code-Generierung.

Quick Start

  1. Java Version: Quell-/Ziellevel im POM: 11 (Property 1.8 ist historisch, der Compiler-Plugin setzt auf 11). Nutze lokal JDK 11.
  2. Application Server: Java EE 8 kompatibel (z.B. Payara 5 / WildFly 20 / GlassFish 5). Dependencies javax.* statt jakarta.*.
  3. Build:
    mvn clean package
    
    Ergebnis: target/mss-1.0-SNAPSHOT.war.
  4. Deployment: WAR in kompatiblen EE 8 Server einspielen. Konfiguriere Datenquelle pu_person (JPA Persistence Unit siehe @PersistenceContext(name = "pu_person")).
  5. Logging: Log4j2 Konfiguration in src/main/resources/log4j2.xml.
  6. Frontend: JSF 2.3 + PrimeFaces 11 + PrimeFlex 2.0.

Wichtigste Schichten

  • model: JPA Entities (AbstractEntity Basis enthält ID).
  • business: *Manager Klassen (Stateless EJBs) kapseln CRUD + Fachlogik.
  • controller: View/Request/Session Scoped JSF Backing Beans (Interaktion UI ↔ Business Layer).
  • webapp: XHTML Seiten (JSF Components + PrimeFaces).
  • resources: Text-/Konfigurationsdateien, Checklisten.

Kern-Patterns

  • Manager erben von AbstractManager<T> (generisches CRUD mit save, saveAll, remove, refresh).
  • Controller erben von AbstractController<E> (Message Handling, Fake-ID-Erzeugung für neue (noch nicht persistierte) Entities, PDF Hilfen, Auswahlzustand selected/created).
  • Negative IDs (< 0) werden als temporäre (noch nicht persistierte) Objekte verwendet wichtig bei UI-Listen vor Sammel-Speichern.
  • Lazy Collections werden vor Nutzung mit Hibernate.initialize(...) initialisiert (Refresh/Reload Methoden).

Erweiterung Schnellanleitung

  1. Neue Entity anlegen (JPA @Entity, extends AbstractEntity).
  2. Manager erstellen: @Stateless, extends AbstractManager<YourEntity>, implementiert getEntityManager(). Zusätzliche Named Queries in Entity definieren.
  3. Controller erstellen: @Named, Scope festlegen (@ViewScoped, @SessionScoped, etc.), extends AbstractController<YourEntity>, injiziere Manager mit @EJB.
  4. XHTML Seite/Fragment erstellen und Controller referenzieren (#{yourController}) + PrimeFaces Komponenten.
  5. Tests (optional, derzeit kaum vorhanden) vorschlagen: Architektur-Test + Manager CRUD Test.

Fragebögen / Sicherheitsbereiche

Ein ausführlicher Workflow liegt in QUESTIONNAIRE_WORKFLOW.md und SECURITY_AREA_DOMAIN.md.

PDF-Erzeugung

  • Verwendet iText (5.x + 7.x Module). Utilities liegen in AbstractController (Tabellen, Kopfzeilen, Seitennummern).
  • Logo Pfad LOGO_PATH = /rundata/logo.png stelle sicher, dass Datei beim Deployment verfügbar ist.

Automatisierte Tools / AI Hinweise

Siehe AI_INSTRUCTIONS.md für formatierte Kontextbereitstellung.

Nächste Verbesserungen (Empfehlungen)

  • Konsolidierung auf iText7 (Legacy 5.x entfernen).
  • Einheitliche Exception-Strategie (momentan Logging + bool Rückgabe).
  • Mehr Unit Tests (Persistenz, Controller Interaktionen via Arquillian / Payara Micro).
  • Migrationspfad Richtung Jakarta EE 9+ (Namespace Wechsel).

Letzte Aktualisierung: 2025-10-20