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.
This commit is contained in:
+43
@@ -0,0 +1,43 @@
|
||||
# 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 <original>").
|
||||
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.
|
||||
|
||||
---
|
||||
|
||||
Reference in New Issue
Block a user