Files
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

1.9 KiB
Executable File

Cloning Instructions

Aktualisiert: 2025-10-20

Ziel

Sicheres Klonen von komplexen Domains (z.B. SecurityArea inkl. Sub-Entities) ohne ID-Kollisionen oder versehentliches Persistieren historischer Referenzen.

Grundprinzipien

  • Nur persistente Quelle klonen (ID > 0) -> Vorher refresh zur Initialisierung Lazy Collections.
  • Neue Instanzen erhalten id = null (oder negative Fake-ID falls im UI direkt angezeigt).
  • Child-Entitäten ebenfalls mit id = null erzeugen.

Vorgehen (Muster)

  1. Quelle laden (Manager.find) & refresh.
  2. Copy-Konstruktor oder Factory-Methode: Primitive Felder kopieren, Collections iterieren.
  3. Collections: Neue Collection erzeugen, für jedes Kind tiefes Copy erstellen (kein Reuse Managed Instanz!).
  4. IDs aller Kinder null setzen.
  5. Optionale Anpassungen (Name -> "Kopie von ").
  6. Rückgabe unverpersistiertes Root-Objekt an Controller.

Tiefe vs. Flache Kopie

  • Tiefe Kopie: Notwendig wenn Kinder eigenständige persistente Entities sind.
  • Flache Kopie: Ausreichend falls nur Referenzen (Read-Only) erhalten bleiben sollen; aktuell bevorzugt tiefe Kopie für isolierte Bearbeitung.

Edge Cases

  • Quelle == null -> abort.
  • Quelle mit Lazy Collections nicht initialisiert -> Gefahr LazyInitializationException.
  • Zyklische Referenzen -> sorgfältig verhindern Endlosschleifen (ggf. bereits geklonte Instanzen in Map tracken).

Fake IDs

  • Wenn Klon direkt in UI Collection erscheint: negative ID via createFakeID generieren.
  • Vor persist -> ID auf null setzen.

Verbesserungen

  • Einführung eines generischen CloneService mit rekursiver Strategie und Zyklus-Erkennung.
  • Annotation @SkipClone für Felder die nicht übernommen werden sollen.

Generator Leitplanken

  • Keine Reflection-Magie für tiefe Kopien; lieber explizite Copy-Konstruktoren für Lesbarkeit.
  • Reihenfolge: zuerst Root, dann Kinder.