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:
Executable
+63
@@ -0,0 +1,63 @@
|
||||
# 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
|
||||
|
||||
Reference in New Issue
Block a user