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

3.3 KiB
Executable File
Raw Blame History

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

  • 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

  • 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