1a0a56a626
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.
64 lines
3.3 KiB
Markdown
Executable File
64 lines
3.3 KiB
Markdown
Executable File
# 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
|
||
|