Files
pi_mcps/java/mss-failsafe/docs/ARCHITECTURE.md
T
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

64 lines
3.3 KiB
Markdown
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Architekturübersicht
## Layer
1. Präsentation: JSF 2.3 + PrimeFaces 11 (XHTML in `webapp/`).
2. Controller Layer: JSF Managed Beans (CDI `@Named`, Scopes) koordiniert UI → Business.
3. Business Layer: Stateless EJB Manager (`business.*Manager`) kapselt Datenzugriff + Fachlogik.
4. Persistenz Layer: JPA (Javax) + Hibernate Provider. Persistence Context Name: `pu_person`.
5. Ressourcen: `src/main/resources` für Log4j2, statische Texte, Checklisten.
## Zentrale Basisklassen
### AbstractManager<T extends AbstractEntity>
- Generisches CRUD: `save`, `saveAll`, `create`, `edit`, `remove`, `refresh`, `find`, `findAll`, `count`.
- Flush nach Persist/Merge (stellt zeitnah DB-Konsistenz sicher).
- Fehlerbehandlung: try/catch + Logging (Verbesserungspotential: Konsistente Exception).
### AbstractController<ENT extends AbstractEntity>
- UI State: `selected`, `created`, `entities`.
- Utility: Faces Messages, PDF Hilfsmethoden, Fake-ID Generator für neue Entities vor Persist.
- `refrehSelected()`: Re-merge & initialize Lazy Collections.
## Entity Lebenszyklus (UI Sicht)
1. Nutzer erstellt neues Objekt → Controller vergibt Fake-ID (negativ) mittels `createFakeID(Collection<ENT>)`.
2. Objekt wird in Listen angezeigt, kann editiert werden bevor persistiert.
3. Beim Speichern werden alle mit `id < 0` auf `null` gesetzt; `AbstractManager.saveAll()` persistiert.
4. Nach Persist: DB generiert positive ID.
## Sicherheitsbereich (SecurityArea)
- Enthält Listen: `SecurityDevices`, `DangerPoints`, `SwitchingDevices`, `Questionnaires`.
- Manager-Methoden: `cloneArea`, add/remove Questionnaire, `reloadWithQuestionnaires`.
- Klonen: Erst DB laden (falls persistent), dann Kopie via Copy-Konstruktor `new SecurityArea(area)`.
## Fragebogen-Zuordnung
- Hinzufügen: `SecurityAreaManager.addQuestionnaireToSecurityArea` erzeugt `SecurityAreaQuestionnaire` Wrapper (assoziative Entity) & persistiert.
- Entfernen: Entities werden aus Sammlung entfernt und via `em.remove(questionnaire)` gelöscht.
- Verfügbare Fragebögen: Alle `Questionaire` minus bereits zugeordnete (Filter per Namen potentielles Verbesserungspotential: Verwendung IDs statt Name).
## Transaktionen
- Methoden mit Schreiboperationen annotiert `@Transactional` (EJB Container verwaltet JTA). In `AbstractManager` ebenfalls.
## Logging
- Log4j2 überall via `LogManager.getLogger(...)`. Konfiguration: `log4j2.xml`.
## PDF Generierung
- `AbstractController` Hilfsmethoden zur Tabellen-Erstellung (iText7) + gemischte Nutzung iText5 (itextpdf 5.5.13) Migration empfohlen.
## Erweiterbarkeit
- Neue Fachbereiche folgen Pattern: Entity → Manager → Controller → UI.
- Reusable generische Methoden vermeiden Duplikate (Beispiel: `saveAll`, `refresh`).
## Bekannte technische Schulden
- Mischung iText5 & iText7.
- Fehlerbehandlung inkonsistent (bool Rückgaben + Logging).
- Kein einheitlicher DTO Layer Controller arbeitet direkt auf Entities (Risk: Lazy Loading im View).
- Wenige Tests im `test/` Verzeichnis.
## Ideen für Refactoring
- Einführung Service Layer (falls Business Logik komplexer wird) zw. Controller und Manager.
- Exceptions mit Custom Runtime (`BusinessException`) statt stiller bool False.
- Verwendung Criteria / NamedQueries für Wiederverwendbarkeit (z.Z. direkte Query Strings in Manager).
---
Aktualisiert: 2025-10-20