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.
3.3 KiB
Executable File
3.3 KiB
Executable File
Architekturübersicht
Layer
- Präsentation: JSF 2.3 + PrimeFaces 11 (XHTML in
webapp/). - Controller Layer: JSF Managed Beans (CDI
@Named, Scopes) – koordiniert UI → Business. - Business Layer: Stateless EJB Manager (
business.*Manager) – kapselt Datenzugriff + Fachlogik. - Persistenz Layer: JPA (Javax) + Hibernate Provider. Persistence Context Name:
pu_person. - Ressourcen:
src/main/resourcesfü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)
- Nutzer erstellt neues Objekt → Controller vergibt Fake-ID (negativ) mittels
createFakeID(Collection<ENT>). - Objekt wird in Listen angezeigt, kann editiert werden bevor persistiert.
- Beim Speichern werden alle mit
id < 0aufnullgesetzt;AbstractManager.saveAll()persistiert. - 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.addQuestionnaireToSecurityAreaerzeugtSecurityAreaQuestionnaireWrapper (assoziative Entity) & persistiert. - Entfernen: Entities werden aus Sammlung entfernt und via
em.remove(questionnaire)gelöscht. - Verfügbare Fragebögen: Alle
Questionaireminus bereits zugeordnete (Filter per Namen – potentielles Verbesserungspotential: Verwendung IDs statt Name).
Transaktionen
- Methoden mit Schreiboperationen annotiert
@Transactional(EJB Container verwaltet JTA). InAbstractManagerebenfalls.
Logging
- Log4j2 überall via
LogManager.getLogger(...). Konfiguration:log4j2.xml.
PDF Generierung
AbstractControllerHilfsmethoden 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