# 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)`. 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