diff --git a/java/mss-failsafe/.github/ai_context.instructions.md b/java/mss-failsafe/.github/ai_context.instructions.md new file mode 100755 index 0000000..df3b055 --- /dev/null +++ b/java/mss-failsafe/.github/ai_context.instructions.md @@ -0,0 +1,84 @@ +# AI Context Instructions + +## Essentials +- Base Classes: AbstractEntity, AbstractManager, AbstractController +- Fake ID Mechanismus für neue Objekte +- Hibernate.initialize für Lazy Collections +# Architecture Instructions +## Typical Generation Tasks +1. Neue Domain (Entity/Manager/Controller/XHTML) +2. PDF Utility Erweiterung (iText7) +3. Sammel-Speichern (saveAll) bereitstellen +4. Klon-Operationen (IDs null setzen, Collections duplizieren kontrolliert) +5. Fragebogen Zuordnung (add/remove, available list) + +## Edge Cases +- Null Entities im save -> return false +- Negative IDs beim remove -> zuerst persistieren oder aus UI entfernen +- Concurrency Refresh: Nach batch Änderungen refreshSelected() + +## Do / Don't +- DO: Logging bei jeder Exception +- DO: Konsistente Nutzung von @Transactional bei Schreiboperationen +- DON'T: System.out oder ungefangene Exceptions durchreichen ohne Logging +- DON'T: Business Logik direkt in XHTML Event Handler schreiben + +## Upgrade Ideas +- Exception Layer +- Bean Validation +- Service Layer zwischen Controller und Manager falls Logik wächst + +--- +Aktualisiert: 2025-10-20 + +## Purpose +Verdichtete Architekturhinweise für automatische Code-Generierung und schnelle Orientierung. + +## Stack +- Java EE 8 (javax), WAR +- JSF 2.3 + PrimeFaces 11 + PrimeFlex 2.0 +- Hibernate JPA (Persistence Unit: pu_person) +- Log4j2 + +## Layer +1. View (XHTML) +2. Controller (JSF/CDI Beans, extends AbstractController) +3. Business (Stateless EJB Manager, extends AbstractManager) +4. Persistence (JPA Entities, extends AbstractEntity) + +## Base Classes +- AbstractManager: CRUD (save, saveAll, refresh, remove), flush nach Persist/Merge. +- AbstractController: UI State (selected, created, entities), Messages, PDF Utilities, Fake-ID-Erzeugung. + +## Entity Lifecycle UI +- Neue Objekte: erhalten negative Fake-ID +- Vor Persist: negative IDs -> null setzen +- save/saveAll entscheidet anhand id == null zwischen persist/merge + +## Lazy Loading +- Refresh via AbstractManager.refresh(entity) + Hibernate.initialize(entity) +- Für Collections: dedizierte reload Methoden (z.B. SecurityAreaManager.reloadWithQuestionnaires) + +## PDF +- iText7 bevorzugt; Altbestand iText5 (itextpdf 5.5.13) kann später entfernt werden. + +## Logging & Fehler +- LOGGER.error(e) bei Fehlern +- Aktuell viele bool Rückgaben; Verbesserungspotential: BusinessException + +## Erweiterung Pattern +Entity -> Manager -> Controller -> XHTML + +## Schulden / Verbesserungen +- Mischung iText5/7 +- Inkonsistente Fehlerbehandlung +- Kein DTO Layer +- Wenige Tests + +## Empfehlungen für Generator +- Bestehende Signaturen unverändert lassen +- @Transactional nur bei Schreibmethoden hinzufügen +- Collections initialisieren bevor darauf iteriert wird + +--- +Aktualisiert: 2025-10-20 diff --git a/java/mss-failsafe/.github/architecture.instructions.md b/java/mss-failsafe/.github/architecture.instructions.md new file mode 100755 index 0000000..0e75c5d --- /dev/null +++ b/java/mss-failsafe/.github/architecture.instructions.md @@ -0,0 +1,75 @@ +# Architecture Instructions + +Aktualisiert: 2025-10-20 + +## Überblick +Das System folgt einer klassischen 4-Layer Struktur: +1. View: JSF 2.3 / PrimeFaces 11 / XHTML Seiten (Formulare, Tabellen, Dialoge) +2. Controller: CDI/JSF Managed Beans, Zustandsverwaltung & UI-Aktionen (extends AbstractController) +3. Business: Stateless EJB Manager mit CRUD + Fachlogik (extends AbstractManager) +4. Persistence: JPA Entities (extends AbstractEntity) + +## Basisklassen Rollen +- AbstractEntity: Basis-ID (Long, Identity), Timestamps, outdated Flag, equals/hashCode nur über ID. +- AbstractManager: CRUD, save vs saveAll, remove / removeAllIn, refresh (Hibernate.initialize), Fehlerlogging. +- AbstractController: UI State (selected, created, entities), Fake-ID-Erzeugung für neue temporäre Objekte, Messaging, PDF Utilities. + +## Lebenszyklus eines neuen Objekts +1. UI erzeugt neues Objekt (id == null) -> Controller kann negative Fake-ID setzen falls in Collections benötigt. +2. Vor persist: Falls id < 0 -> setId(null) damit JPA Identity funktioniert. +3. save(): id == null => persist + flush, sonst merge + flush. +4. refresh(): sorgt für Managed Entity + Initialisierung Lazy Properties. + +## Negative Fake IDs +- Zweck: Temporäre Unterscheidung mehrerer neu angelegter Einträge im UI bevor persist. +- Erzeugung: createFakeID(Collection) nimmt kleinste vorhandene negative ID - 1. +- Vor persist unbedingt auf null setzen. + +## Lazy Loading & Refresh +- Manager.refresh(entity) -> merge + Hibernate.initialize(entity) für Entität. +- Für Collections: spezielle Reload-Methoden in fachlichen Managern (z.B. reloadWithQuestionnaires). +- Nach Batch-Operationen Controller.refrehSelected() (Tippfehler) nutzen; perspektivisch in refreshSelected() umbenennen. + +## Transaktionen +- Schreiboperationen annotiert mit @Transactional (Container-managed) in AbstractManager.save / saveAll. +- Fachmethoden, die persistieren oder mergen, sollten ebenfalls @Transactional erhalten (Konsistenz). + +## Fehlerbehandlung +- Aktuell: Logging (LOGGER.error) + bool Rückgabe. +- Geplant: Einführung BusinessException für differenzierte Fehlerpfade. + +## Erweiterungsmuster (Domain hinzufügen) +1. Entity erstellen (extends AbstractEntity). Optional Named Queries. +2. Manager: @Stateless extends AbstractManager; spezifische Queries / Reload Methoden. +3. Controller: @Named + Scope (ViewScoped/SessionScoped) extends AbstractController. +4. XHTML Seite inkl. Referenzen zu Controller (DataTable, Dialoge, Commands). +5. Tests: CRUD & fachliche Spezialfunktionen. + +## Typische Fachfunktionen +- Klonen: Quelle re-laden + initialisieren; neue Instanz mit Copy-Konstruktor; Child IDs null; Collections duplizieren kontrolliert. +- Zuordnungen (z.B. Fragebogen): Add/Remove Pattern über Wrapper Entity. + +## PDF-Erstellung +- iText7 Nutzung über Hilfsmethoden in AbstractController (Tabellen, Inner Cells, Paginierung). +- Keine neuen Features mehr mit iText5 API implementieren. + +## Querschnittsthemen & Roadmap +- Vereinheitlichte Exception Layer. +- Bean Validation (javax.validation) für Eingaben & persistente Konsistenz. +- Test Suite (JUnit + ggf. Arquillian / Integrationstests) ausbauen. +- Migration nach Jakarta EE (Namespace Wechsel javax -> jakarta) perspektivisch. + +## Edge Cases & Hinweise +- save(null) => false zurückgeben. +- remove(entity) ohne persistierte ID => false. +- Batch Speichern: leere Liste => true (no-op) statt Fehler. +- Collections initialisieren vor Iteration (Avoid LazyInitializationException). + +## Generator Leitplanken +- Bestehende Signaturen respektieren. +- Keine neuen Frameworks ohne Notwendigkeit. +- Logging immer via LOGGER, niemals System.out. +- Für neue Write-Methoden @Transactional hinzufügen. + +--- + diff --git a/java/mss-failsafe/.github/cloning.instructions.md b/java/mss-failsafe/.github/cloning.instructions.md new file mode 100755 index 0000000..26fcea4 --- /dev/null +++ b/java/mss-failsafe/.github/cloning.instructions.md @@ -0,0 +1,43 @@ +# Cloning Instructions + +Aktualisiert: 2025-10-20 + +## Ziel +Sicheres Klonen von komplexen Domains (z.B. SecurityArea inkl. Sub-Entities) ohne ID-Kollisionen oder versehentliches Persistieren historischer Referenzen. + +## Grundprinzipien +- Nur persistente Quelle klonen (ID > 0) -> Vorher `refresh` zur Initialisierung Lazy Collections. +- Neue Instanzen erhalten `id = null` (oder negative Fake-ID falls im UI direkt angezeigt). +- Child-Entitäten ebenfalls mit `id = null` erzeugen. + +## Vorgehen (Muster) +1. Quelle laden (Manager.find) & `refresh`. +2. Copy-Konstruktor oder Factory-Methode: Primitive Felder kopieren, Collections iterieren. +3. Collections: Neue Collection erzeugen, für jedes Kind tiefes Copy erstellen (kein Reuse Managed Instanz!). +4. IDs aller Kinder null setzen. +5. Optionale Anpassungen (Name -> "Kopie von "). +6. Rückgabe unverpersistiertes Root-Objekt an Controller. + +## Tiefe vs. Flache Kopie +- Tiefe Kopie: Notwendig wenn Kinder eigenständige persistente Entities sind. +- Flache Kopie: Ausreichend falls nur Referenzen (Read-Only) erhalten bleiben sollen; aktuell bevorzugt tiefe Kopie für isolierte Bearbeitung. + +## Edge Cases +- Quelle == null -> abort. +- Quelle mit Lazy Collections nicht initialisiert -> Gefahr LazyInitializationException. +- Zyklische Referenzen -> sorgfältig verhindern Endlosschleifen (ggf. bereits geklonte Instanzen in Map tracken). + +## Fake IDs +- Wenn Klon direkt in UI Collection erscheint: negative ID via `createFakeID` generieren. +- Vor persist -> ID auf null setzen. + +## Verbesserungen +- Einführung eines generischen `CloneService` mit rekursiver Strategie und Zyklus-Erkennung. +- Annotation @SkipClone für Felder die nicht übernommen werden sollen. + +## Generator Leitplanken +- Keine Reflection-Magie für tiefe Kopien; lieber explizite Copy-Konstruktoren für Lesbarkeit. +- Reihenfolge: zuerst Root, dann Kinder. + +--- + diff --git a/java/mss-failsafe/.github/coding_guidelines.instructions.md b/java/mss-failsafe/.github/coding_guidelines.instructions.md new file mode 100755 index 0000000..2e5ec66 --- /dev/null +++ b/java/mss-failsafe/.github/coding_guidelines.instructions.md @@ -0,0 +1,43 @@ +# Coding Guidelines Instructions + +## Naming +- Manager: *Manager +- Controller: *Controller +- Entities: Singular Substantive +- Negative IDs: temporäre Objekte + +## Style +- 4 Spaces +- Logger statt System.out +- Deutsche UI-Texte, Englisch im Code + +## Error Handling +- Log + Rückgabe (bestehend); für neue komplexe Logik optional BusinessException + +## Persistenz +- Neue Entity: id == null vor persist +- refresh(entity) nutzen um Lazy Collections zu initialisieren + +## Transaktionen +- Schreibmethoden: @Transactional (oder rely auf EJB Container) + +## Performance +- Sammeloperationen: saveAll(Collection) + +## UI +- PrimeFaces Dialoge schließen mit closeDialogs +- Negative IDs in Listen bis Sammelspeichern + +## PDF +- Neue Funktionen nur mit iText7 API + +## Tests (Empfehlung) +- CRUD Manager Tests +- Klon & Fragebogen Zuordnung + +## Anti-Pattern +- Logik nicht direkt im Controller wenn generell wiederverwendbar +- Keine duplizierten Query Strings -> Named Queries + +--- +Aktualisiert: 2025-10-20 diff --git a/java/mss-failsafe/.github/error_handling.instructions.md b/java/mss-failsafe/.github/error_handling.instructions.md new file mode 100755 index 0000000..cc1e4d8 --- /dev/null +++ b/java/mss-failsafe/.github/error_handling.instructions.md @@ -0,0 +1,46 @@ +# Error Handling Instructions + +Aktualisiert: 2025-10-20 + +## Aktueller Zustand +- Fehler werden in Managern primär über `LOGGER.error(e)` geloggt. +- Rückgabe bool (true/false) signalisiert Erfolg/Misserfolg. +- Keine differenzierte Fehlerklassifikation (Business vs. System). + +## Ziele +- Konsistente Behandlung & klare Trennung der Fehlerarten. +- Verbesserte Diagnose für Nutzer & Logs. + +## Kategorien +1. Validation Errors (Bean Validation zukünftig) -> Nutzerfeedback. +2. Business Rule Violations -> eigene Exception (z.B. `BusinessException`). +3. System Errors (DB Down, Hibernate Exceptions) -> Logging + generische Fehlermeldung. + +## Kurzfristige Empfehlungen +- Bei allen catch-Blöcken: `LOGGER.error("", e)` statt nur `LOGGER.error(e)`. +- Controller: Nach boolean false -> `errorMessage()` anzeigen. + +## Einführung BusinessException (geplant) +- Checked oder Runtime? Vorschlag: Runtime zur vereinfachten Nutzung. +- Manager Methoden können `throw new BusinessException("Message")` statt false. +- Controller fängt BusinessException und zeigt spezifische Nachricht. + +## Log Format +- Kontext + Entity-ID + Operation. + Beispiel: `LOGGER.error("Failed to persist SecurityArea id={} name={}", area.getId(), area.getName(), e);` + +## Edge Cases +- Null Übergaben -> früh validieren & BusinessException werfen (später) / false zurückgeben (jetzt). +- Sammeloperation: Teilfehler -> aktuell Abort bei erstem Fehler. Optional Sammeln & Aggregatfehler. + +## Verbesserungen +- Central Exception Mapper (JSF PhaseListener / CDI Interceptor). +- Korrelation IDs in Logs (Request ID, User ID). + +## Generator Leitplanken +- Logging immer, auch bei ignorable Exceptions. +- Keine System.out Nutzung. +- Fehler nicht stillschweigend verschlucken (mindestens loggen). + +--- + diff --git a/java/mss-failsafe/.github/extend_project.instructions.md b/java/mss-failsafe/.github/extend_project.instructions.md new file mode 100755 index 0000000..8ed74ba --- /dev/null +++ b/java/mss-failsafe/.github/extend_project.instructions.md @@ -0,0 +1,33 @@ +# Extend Project Instructions + +## Pattern +Entity -> Manager -> Controller -> XHTML -> Navigation + +## Steps (Template) +1. Entity: @Entity extends AbstractEntity +2. Manager: @Stateless extends AbstractManager +3. Controller: @Named + Scope extends AbstractController +4. UI: xhtml mit #{controller} +5. Tests: CRUD + Spezialmethoden + +## Fake IDs +- Neue Objekte in Collections: negative ID (createFakeID) +- Vor Persist: setId(null) + +## Klonen +- Quelle laden & initialisieren +- Copy-Konstruktor +- Child IDs null + +## Checklist +- [ ] Named Queries falls benötigt +- [ ] Logging bei Fehlern +- [ ] @Transactional bei Schreibmethoden +- [ ] Keine System.out + +## Common Pitfalls +- LazyInitializationException -> refresh +- Vergessen negative IDs zurückzusetzen -> Persist fehlschlägt + +--- +Aktualisiert: 2025-10-20 diff --git a/java/mss-failsafe/.github/general_project.instructions.md b/java/mss-failsafe/.github/general_project.instructions.md new file mode 100755 index 0000000..ae04863 --- /dev/null +++ b/java/mss-failsafe/.github/general_project.instructions.md @@ -0,0 +1,31 @@ +# General Project Instructions + +## Quick Facts +- Java EE 8 (javax) / Java 11 / WAR +- JSF + PrimeFaces + PrimeFlex +- Persistence Unit: pu_person +- Logging: Log4j2 + +## Build +mvn clean package -> target/mss-1.0-SNAPSHOT.war + +## Core Patterns +- Manager: CRUD + Fachmethoden (extends AbstractManager) +- Controller: UI State + Messages + PDF (extends AbstractController) +- Negative IDs für temporäre Objekte + +## PDF +- iText7 bevorzugen; Legacy iText5 entfernen später + +## Improvements Roadmap +- Vereinheitlichte Exception Strategie +- Test Suite aufbauen +- Migration nach Jakarta EE (Namespace Wechsel) + +## AI Generation Hints +- Halte Signaturen stabil +- Keine neuen Frameworks +- Initialisiere Lazy Collections vor Nutzung + +--- +Aktualisiert: 2025-10-20 diff --git a/java/mss-failsafe/.github/index.instructions.md b/java/mss-failsafe/.github/index.instructions.md new file mode 100755 index 0000000..8d06f26 --- /dev/null +++ b/java/mss-failsafe/.github/index.instructions.md @@ -0,0 +1,53 @@ +# Index Instructions + +Aktualisiert: 2025-10-20 + +Zentraler Überblick über alle *.instructions.md Dateien im Ordner `.github` für automatische Nutzung. + +## Übersicht Bestehend +- Architektur: `architecture.instructions.md` +- Coding Guidelines: `coding_guidelines.instructions.md` +- Domain (Security Area): `security_area_domain.instructions.md` +- Fragebogen Workflow: `questionnaire_workflow.instructions.md` +- Projekt Erweiterung: `extend_project.instructions.md` +- Refresh & Fake-ID Mechanismus: `refresh_fake_id.instructions.md` +- Allgemeine Projektinfo: `general_project.instructions.md` +- AI Kontext / Generatorhinweise: `ai_context.instructions.md` + +## Neue Spezial-Themen +- Persistence Layer: `persistence.instructions.md` +- PDF Generierung (iText7): `pdf_generation.instructions.md` +- Klon-Strategien: `cloning.instructions.md` +- Fehler & Logging: `error_handling.instructions.md` +- Test-Strategie: `testing_strategy.instructions.md` +- Transaktionen: `transactions.instructions.md` +- Manager/Controller Muster: `manager_controller_pattern.instructions.md` + +## Verwendung (Automatisierung) +1. Start: `general_project.instructions.md` + `architecture.instructions.md` lesen. +2. Bei neuen Entities: `extend_project.instructions.md` + `persistence.instructions.md`. +3. Bei UI/Business Verkettung: `manager_controller_pattern.instructions.md`. +4. Für Fragebogenfunktionen: `questionnaire_workflow.instructions.md` + `security_area_domain.instructions.md`. +5. Für temporäre IDs & Refresh: `refresh_fake_id.instructions.md`. +6. Für PDF Features: `pdf_generation.instructions.md`. +7. Für Klon-Operationen: `cloning.instructions.md`. +8. Für Fehlerstrategie: `error_handling.instructions.md`. +9. Für Transaktionsregeln: `transactions.instructions.md`. +10. Für Qualitätsstil: `coding_guidelines.instructions.md`. + +## Priorität bei Unklarheiten +1. `general_project.instructions.md` +2. `architecture.instructions.md` +3. `coding_guidelines.instructions.md` +4. Spezialthema betreffende Datei + +## Pflegehinweise +- Beim Ändern von Basisklassen (AbstractManager / AbstractController / AbstractEntity) entsprechende Dateien aktualisieren. +- Tippfehler Methode `refrehSelected()` bei Umbenennung in Code auch in `refresh_fake_id.instructions.md` und `architecture.instructions.md` anpassen. +- Neue fachliche Domains erhalten eigene `.instructions.md` Datei mit Operations-, Entity- und Edge Case Liste. + +## Roadmap Dokumentation +- Nach Einführung eines Exception Layers: `error_handling.instructions.md` erweitern. +- Nach Migration zu Jakarta: Alle Dateien Namespace Hinweis aktualisieren. + +--- diff --git a/java/mss-failsafe/.github/manager_controller_pattern.instructions.md b/java/mss-failsafe/.github/manager_controller_pattern.instructions.md new file mode 100755 index 0000000..9f1f39e --- /dev/null +++ b/java/mss-failsafe/.github/manager_controller_pattern.instructions.md @@ -0,0 +1,102 @@ +# Manager/Controller Pattern Instructions + +Aktualisiert: 2025-10-20 + +## Ziele +Klare Trennung zwischen UI-Zustand (Controller) und Geschäftslogik/Persistenz (Manager). + +## Verantwortlichkeiten +Controller: +- Zustände: selected, created, entities. +- UI Nachrichten (FacesMessage). +- Dialogsteuerung (PrimeFaces Widgets schließen). +- Hilfsfunktionen (PDF, Fake-ID-Erzeugung). + +Manager: +- CRUD Operationen (create, edit, save, saveAll, remove, removeAllIn, find, findAll). +- Fachspezifische Queries / Reload. +- Fehlerlogging. + +## Interaktion +- Controller ruft Manager.save / saveAll auf für Persistenz. +- Nach Änderungen: Controller.refrehSelected() (Tippfehler) -> aktualisiert ausgewähltes Objekt. +- Kein direkter EntityManager Zugriff im Controller. + +## Fake-ID Ablauf +1. Controller erzeugt neue Entität (id == null). +2. Falls Sammlung benötigt: setzt negative ID über createFakeID. +3. Bei Save: Manager erkennt id < 0 (nach vorherigem Nullsetzen) -> persist. + +## Methoden-Namenskonventionen +- Manager: Verb + Domänenobjekt (addQuestionnaireToSecurityArea, removeQuestionnaireFromSecurityArea). +- Controller: UI Aktionen (saveSelected, createNew, openDialog, closeDialogs). + +## Edge Cases +- selected == null bei refresh -> no-op. +- entities Liste leer -> UI Tabelle zeigt keine Einträge; Null vermeiden (immer leere Liste). + +## Messaging +- Erfolg: `successMessage()`; Fehler: `errorMessage()`. +- Spezifische Warnungen über `sendWarnMessage`. + +## Verbesserungen +- Umbenennung `refrehSelected()` -> `refreshSelected()` in Basisklasse + alle Verwendungen. +- Einführung eines BasePDFController oder Utility zur Auslagerung PDF Logik. + +## Generator Leitplanken +- Zusätzliche Logik (berechnete Felder, Validierungen) zuerst im Manager statt im Controller (besser testbar, wiederverwendbar). +- Controller schlank halten: keine komplexe Businessregeln. + +--- +# Persistence Instructions + +Aktualisiert: 2025-10-20 + +## Ziele +Konsistente JPA Nutzung (Java EE 8, Hibernate Provider) mit klaren Regeln für IDs, Lazy Loading und Flush. + +## Grundsätze +- Entities extend `AbstractEntity` (Long id, creationDate, changedDate, outdated Flag). +- Identity Generation: `@GeneratedValue(strategy = GenerationType.IDENTITY)` -> Kein manuelles Setzen positiver IDs. +- Equals/HashCode nur auf ID (Basis-Klasse bereitgestellt). + +## ID & Fake-ID Handling +- Temporäre neue Objekte können negative IDs erhalten (Fake) zur UI-Differenzierung. +- Vor persist: if id != null && id < 0 -> `setId(null)` damit JPA eine echte ID generiert. +- Niemals persist mit negativer ID ausführen. + +## Lebenszyklus +1. Konstruktor setzt creationDate & changedDate. +2. Bei Änderungen Fachlogik: changedDate aktualisieren (TODO: zentralisieren via EntityListener). +3. Persist -> flush direkt in `AbstractManager.save` / `saveAll`. + +## Lazy Loading +- Vermeide direkte Iteration über nicht initialisierte Collections außerhalb Transaktion. +- Nutzung `AbstractManager.refresh(entity)` initialisiert das Entity (Hibernate.initialize(entity)). +- Für Collections eigene Reload-Methoden in spezialisierten Managern implementieren. + +## Named Queries & Criteria +- Bevorzugt Criteria API für dynamische Filter. +- Häufig verwendete, statische Abfragen als `@NamedQuery` in der Entity definieren. + +## Performance Hinweise +- `saveAll(Collection)` nutzt einen Flush am Ende; reduziert DB Roundtrips. +- Bulk Delete oder Update lieber über JPQL statt Einzelloops (aktuell: removeAllIn loop; Optimierungspotential). + +## Edge Cases +- `save(null)` => false (kein Fehlerwurf, Logging im Manager). +- Leere Collections in `saveAll` => true (no-op). +- `remove(entity)` mit `entity.getId()==null` => false; vorher persistieren oder ignorieren. + +## Verbesserungs-Ideen +- EntityListener für Timestamps. +- Soft Delete (outdated Flag) statt physischem Löschen für Audit. +- Einführung eines Version-Feldes für Optimistic Locking. + +## Generator Leitplanken +- Keine Änderung der ID-Strategie ohne umfassende Migration. +- Bei neuen Entities standardisierte Felder aus `AbstractEntity` nutzen. +- Collections initialisieren (z.B. `new ArrayList<>()`) im Entity-Konstruktor. + +--- + diff --git a/java/mss-failsafe/.github/pdf_generation.instructions.md b/java/mss-failsafe/.github/pdf_generation.instructions.md new file mode 100755 index 0000000..c6537f0 --- /dev/null +++ b/java/mss-failsafe/.github/pdf_generation.instructions.md @@ -0,0 +1,46 @@ +# PDF Generation Instructions + +Aktualisiert: 2025-10-20 + +## Kontext +PDF-Erstellung erfolgt aktuell über Hilfsmethoden in `AbstractController` mittels iText7. + +## Kern-Hilfsmethoden +- `loadCompanyLogo()` -> Lädt Logo aus LOGO_PATH. +- `generateSorroundingTable(String header, float maxWidth)` -> Einspaltige Rahmen-Tabelle mit Header. +- `generateInnerTable(Text header, boolean last, String... values)` -> 2-Spalten Tabelle mit alternierender Hintergrundfarbe. +- `generateInnerTable(Text header, int nrColumns, boolean last, String... values)` -> Generisch n-Spalten Tabelle. +- `addInnerCells(Table table, String name, String value, boolean isGray)` / Overload -> Fügt Datenzeilen hinzu. +- `addPagenumbers(Document document, String ticketNr, Image nextPagesCompanyLogo)` -> Fügt Seitenzahlen & Logo hinzu. + +## Gestaltungsrichtlinien +- Fonts: Standard Helvetica / Bold (Konstanten `FONT_NORMAL`, `FONT_BOLD`). +- Schriftgrößen klein (8F Inhalte, 11F Header, 12F Hauptheader) für konsistente Layouts. +- Wechselnde Hintergrundfarbe (LIGHT_GRAY) zur besseren Lesbarkeit. + +## Erweiterung +Neue Tabellen-/Layout-Funktionen: +1. Prüfen ob existierende Methoden erweiterbar statt neue Variante. +2. Konsistenz in Font & Spaltenbreiten wahren. +3. Kein Hardcode von absoluten Positionen außer bei Kopf-/Fußzeilen. + +## Ressourcen Pfade +- LOGO_PATH statisch: `/rundata/logo.png`. Anpassungen zentral vornehmen. + +## Fehlerhandhabung +- Aktuell wenige try/catch Blöcke; bei Erweiterung: Fehler loggen (`LOGGER.error(e)`) und Benutzer über Controller Messages informieren. + +## Edge Cases +- Leere Werte -> `-/-` Platzhalter. +- Null Tabelleninstanz in addInnerCells -> early return. + +## Verbesserungen +- Einführung eines PDFUtility Service zur Entkopplung vom Controller. +- Parameterobjekt für dynamische Tabellenkonfiguration (Spaltenbreiten, Farben, Größen). + +## Generator Leitplanken +- iText7 API weiterverwenden; keine neuen PDF Libraries. +- Wiederverwendbare Logik nicht direkt im konkreten Controller implementieren -> Utility / Service. + +--- + diff --git a/java/mss-failsafe/userManagement/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/java/mss-failsafe/.github/persistence.instructions.md old mode 100644 new mode 100755 similarity index 100% rename from java/mss-failsafe/userManagement/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst rename to java/mss-failsafe/.github/persistence.instructions.md diff --git a/java/mss-failsafe/.github/questionnaire_workflow.instructions.md b/java/mss-failsafe/.github/questionnaire_workflow.instructions.md new file mode 100755 index 0000000..a552f4d --- /dev/null +++ b/java/mss-failsafe/.github/questionnaire_workflow.instructions.md @@ -0,0 +1,28 @@ +# Questionnaire Workflow Instructions + +## Add +areaManager.addQuestionnaireToSecurityArea(area, questionnaire) +- area ggf. re-laden +- Wrapper erzeugen +- Persist wrapper + merge area +- Rückgabe: aktualisierte Area + +## Remove +areaManager.removeQuestionnaireFromSecurityArea(area, wrapper) +- area & wrapper re-laden +- Collection remove, em.remove(wrapper), em.merge(area) + +## Available List +getAvailableQuestionnaires(area): SELECT q FROM Questionaire q ORDER BY q.name +- Filter: bereits zugeordnete Namen + +## Edge Cases +- Null area/questionnaire -> Fehlermeldung +- Race condition -> nach Add/Remove refreshSelected() + +## Verbesserungen +- ID statt Name für Filter +- Duplikatprüfung direkt im Manager + +--- +Aktualisiert: 2025-10-20 diff --git a/java/mss-failsafe/.github/refresh_fake_id.instructions.md b/java/mss-failsafe/.github/refresh_fake_id.instructions.md new file mode 100755 index 0000000..5bb05d1 --- /dev/null +++ b/java/mss-failsafe/.github/refresh_fake_id.instructions.md @@ -0,0 +1,25 @@ +# Refresh & Fake ID Instructions + +## Fake ID +- Negative Long Werte (<0) = temporär +- Sequenz: -1, -2, -3 ... (kleinste negative - 1) +- Erzeugung: AbstractController.createFakeID(Collection) + +## Persist +- Vor Speichern: if id < 0 -> setId(null) +- save/saveAll: id == null => persist, sonst merge + +## Refresh +- AbstractController.refrehSelected() (Tippfehler) -> getManager().refresh(selected) +- AbstractManager.refresh(entity): if id == null -> save(entity); merge + Hibernate.initialize(entity) + +## Best Practices +- Nach Add/Remove Child Collections refresh +- Beim Klonen zuerst Quelle laden + +## Verbesserungen +- Methode umbenennen zu refreshSelected() +- JavaDoc für createFakeID + +--- +Aktualisiert: 2025-10-20 diff --git a/java/mss-failsafe/.github/security_area_domain.instructions.md b/java/mss-failsafe/.github/security_area_domain.instructions.md new file mode 100755 index 0000000..eefe473 --- /dev/null +++ b/java/mss-failsafe/.github/security_area_domain.instructions.md @@ -0,0 +1,39 @@ +# Security Area Domain Instructions + +## Entities +- SecurityArea +- SecurityDevice / DangerPoint / SwitchingDevice +- SecurityAreaQuestionnaire (Wrapper) + Questionaire + +## Operations +- cloneArea(SecurityArea) +- addQuestionnaireToSecurityArea(area, questionnaire) +- removeQuestionnaireFromSecurityArea(area, wrapper) +- getAvailableQuestionnaires(area) +- reloadWithQuestionnaires(area) + +## Workflow (Add Questionnaire) +1. Area laden (falls id > 0) +2. Wrapper erstellen & area setzen +3. Persist Wrapper, merge Area +4. Refresh im Controller + +## Deletion Pattern +- Beziehungen lösen (Kinder area = null setzen) +- Kinder entfernen (Manager.removeAllIn) +- Area per Named Query löschen + +## Edge Cases +- Duplicate questionnaire by name -> aktuell Filter per Name +- Verbesserung: Filter per ID + +## Klonen +- Persistente Quelle re-laden, initialisieren +- Copy-Konstruktor & alle Child IDs auf null + +## Verbesserungen +- CascadeSettings prüfen +- Bean Validation einsetzen + +--- +Aktualisiert: 2025-10-20 diff --git a/java/mss-failsafe/.github/testing_strategy.instructions.md b/java/mss-failsafe/.github/testing_strategy.instructions.md new file mode 100755 index 0000000..d0241c9 --- /dev/null +++ b/java/mss-failsafe/.github/testing_strategy.instructions.md @@ -0,0 +1,49 @@ +# Testing Strategy Instructions + +Aktualisiert: 2025-10-20 + +## Ziele +Testabdeckung für kritische Pfade: CRUD, Clone, Fragebogen Zuordnung, Fake-ID Mechanismus. + +## Testarten +1. Unit Tests (reine Logik, z.B. createFakeID, Klon Copy-Konstruktoren). +2. Integration Tests (Persistence + Manager Methoden gegen Test-DB). Möglich mit in-memory H2 + angepasster persistence.xml. +3. UI/Controller Smoke Tests (Optional, z.B. mit Selenium/Arquillian Graphene). + +## Prioritäten +- AbstractManager.save / saveAll Edge Cases. +- remove / removeAllIn (Null, nicht persistierte Entities). +- createFakeID Sequenz (-1, -2, -3 ...). +- Fragebogen Add/Remove Workflow (Wrapper Persistenz, Filterliste). +- Klonen tiefer Objektgraph. + +## Beispiel Unit Test Fälle +- createFakeID(null) => -1. +- createFakeID(leere Liste) => -1. +- createFakeID([id=-1]) => -2. +- createFakeID([id=-3, id=-1]) => -4. + +## Integration Tests (CRUD) +- Persist neue Entity -> ID != null. +- Merge vorhandene Entity -> unverändert Fachfelder korrekt übernommen. +- saveAll mit gemischten (neue + vorhandene) -> alle persistent. + +## Fehlerpfade +- save(null) -> false. +- remove(null) -> false. +- remove(entity ohne ID) -> false. + +## Klon Tests +- Quelle & Klon dürfen nicht gleiche ID haben. +- Child Collections tief kopiert (Referenzen ungleich, Werte gleich). + +## Tooling Vorschlag +- JUnit 5, Mockito für isolierte Tests von Controller-Hilfsmethoden. +- Testcontainers (Optional später) für realistischere DB. + +## Generator Leitplanken +- Für neue Fachlogik minimal 1-2 Unit Tests + 1 Integration Test. +- Keine Abhängigkeit auf Produktionspfade in Unit Tests; Test-spezifische Testdaten-Builder. + +--- + diff --git a/java/mss-failsafe/.github/transactions.instructions.md b/java/mss-failsafe/.github/transactions.instructions.md new file mode 100755 index 0000000..41a6936 --- /dev/null +++ b/java/mss-failsafe/.github/transactions.instructions.md @@ -0,0 +1,40 @@ +# Transactions Instructions + +Aktualisiert: 2025-10-20 + +## Kontext +Container-Managed Transaktionen (Java EE). Verwendung von `@Transactional` auf Manager-Methoden für Schreiboperationen. + +## Grundsätze +- Jede persistierende Operation (create, edit, remove) innerhalb einer Transaktion. +- `save` und `saveAll` bereits mit `@Transactional` versehen. +- Leseoperationen können ohne Annotation auskommen (Default: kein Write-Lock nötig). + +## Batch Operationen +- `saveAll(Collection)`: Ein Transaktionskontext für gesamte Collection -> entweder komplett erfolgreich oder Abbruch beim Fehler. +- Optimierungspotential: Fehler sammeln, nicht sofort abbrechen. + +## Refresh +- `refresh(entity)` führt merge aus; wenn `id == null` vorher persist -> bleibt innerhalb Transaktion falls aufgerufen durch `save`/`saveAll`. + +## Remove +- `remove(entity)` ohne `@Transactional` in Basisklasse -> Empfehlung: Annotation hinzufügen in konkretem Manager wenn Delete-Fachlogik erweitert wird. + +## Edge Cases +- Verschachtelte Aufrufe (save -> intern create/edit): Container handhabt Propagation (`REQUIRED`). +- LazyInitializationException vermeiden: innerhalb Transaktion initialisieren. + +## Empfohlene Annotationen +- Zusätzliche fachliche Write-Methoden stets mit `@Transactional` versehen. +- Pure Read: Performancekritisch -> ggf. explizit `@Transactional(Transactional.TxType.SUPPORTS)` oder weglassen. + +## Fehlerfall Verhalten +- Ungefangene RuntimeException -> Rollback durch Container. +- Aktuell Exceptions geloggt & boolean false -> verhindert Rollback. Verbesserung: BusinessException throw + Rollback. + +## Generator Leitplanken +- Keine eigenen manuell geöffneten Transaktionen (kein `UserTransaction`). +- Konsistenz: Schreibmethoden annotieren, Leseoperationen nur bei Bedarf. + +--- + diff --git a/java/mss-failsafe/.gitignore b/java/mss-failsafe/.gitignore new file mode 100755 index 0000000..ceb5147 --- /dev/null +++ b/java/mss-failsafe/.gitignore @@ -0,0 +1,21 @@ +# Maven Build-Verzeichnis +target/ +/target/ + +# IDE-spezifische Dateien +.idea/ +.vscode/ +*.iml +*.ipr +*.iws + +# OS-spezifische Dateien +.DS_Store +Thumbs.db + +# Logs +*.log + +# Temporäre Dateien +*.tmp +*.temp diff --git a/java/mss-failsafe/GIT_HISTORY_ARCHIVE.md b/java/mss-failsafe/GIT_HISTORY_ARCHIVE.md new file mode 100644 index 0000000..986ea48 --- /dev/null +++ b/java/mss-failsafe/GIT_HISTORY_ARCHIVE.md @@ -0,0 +1,88 @@ +# mss-failsafe — Git History Archive + +> **Why this file exists** +> +> `mss-failsafe` was developed in its own standalone Git repository (no remote) on +> Patrick's workstation. On **2026-06-13** it was consolidated into the `pi_mcps` +> monorepo under [`java/mss-failsafe/`](.) as the single canonical copy. The +> standalone repo's `.git` directory was removed during the flatten, so the original +> per-commit history below is preserved here for reference. +> +> The **flattened working tree** captured at consolidation = tip of `master` +> (`2a142b5`, 2025-10-04) **plus all uncommitted working-tree changes** that were in +> progress at that time (notably the `.github/*.instructions.md` AI-context files and +> `.gitignore` updates). This snapshot is the source of truth and the base for the +> planned upgraded rewrite with Work Lumen. + +## Repository Facts (at time of archival) + +| Property | Value | +|---|---| +| Standalone repo location | `~/pi_mcps/mss-failsafe/` (top-level, pre-consolidation) | +| New canonical location | `java/mss-failsafe/` (inside `pi_mcps` monorepo) | +| Default branch | `master` | +| Tip commit | `2a142b5` (2025-10-04) | +| Total commits (all branches) | 33 | +| First commit | `f2fa7b6` (2025-06-27) | +| Author | Patrick Plate | +| Remote | none (local-only repo) | +| Uncommitted changes at archival | 175 working-tree entries (preserved in the flatten) | + +## Branches (at time of archival) + +| Branch | Tip | Date | Note | +|---|---|---|---| +| `master` | `2a142b5` | 2025-10-04 | Default; newest committed state | +| `bugfix/protocol-creation-speed` | `2a142b5` | 2025-10-04 | Same tip as master | +| `bugfix/overview-pdf-counting` | `0226952` | 2025-09-25 | | +| `feature/zusammenfassung-pdf` | `7e2dd63` | 2025-09-17 | Contains `7e2dd63` not on master | +| `feature/all-checklist-at-once` | `7f68bbf` | 2025-09-13 | | + +### Commits not reachable from `master` + +| Hash | Date | Branch | Subject | +|---|---|---|---| +| `7e2dd63` | 2025-09-17 | `feature/zusammenfassung-pdf` | refactor(questionnaire): improve text handling in SecurityAreaQuestion | +| `b26b211` | 2025-09-15 | (dangling) | refactor: update UI text and logic for machine creation and editing | + +## Full Commit Log (all branches, newest first) + +| Hash | Date | Subject | +|---|---|---| +| `2a142b5` | 2025-10-04 | feat(ticket): optimize ticket fetching and indexing for protocol generation | +| `a28584b` | 2025-10-03 | feat(ticket): optimize protocol generation by reducing DB queries and enhancing ZIP creation logic | +| `0226952` | 2025-09-25 | feat(ticket): add alphabetical ordering for displayed lists and data tables | +| `06f1b0a` | 2025-09-25 | fix(ticket): handle null device roles in security device filtering | +| `5cba533` | 2025-09-17 | feat(ticket): enhance danger point and inspection data in overview protocol | +| `7e2dd63` | 2025-09-17 | refactor(questionnaire): improve text handling in SecurityAreaQuestion | +| `b26b211` | 2025-09-15 | refactor: update UI text and logic for machine creation and editing | +| `d535571` | 2025-09-15 | refactor(ticket): make DateTimeFormatter immutable in OverviewProtocolController | +| `593080e` | 2025-09-15 | refactor(ticket): remove unused imports in OverviewProtocolController | +| `44cb289` | 2025-09-15 | fix(ticket): correct typo in column header and reset flag in protocol generation | +| `1fd6bcf` | 2025-09-14 | feat(ticket): add overview protocol generation and integration | +| `7f68bbf` | 2025-09-13 | refactor(ticket): streamline PDF generation and file handling for machine protocols | +| `daeacc9` | 2025-09-13 | feat(ticket): add functionality to generate and download all machine protocols as ZIP | +| `0166206` | 2025-09-13 | feat(questionnaire): enhance UI and improve questionnaire management logic | +| `24da4a1` | 2025-08-29 | feat(questionnaire): improve questionnaire integration and UI enhancements | +| `913efbb` | 2025-08-29 | feat(questionnaire): enhance questionnaire handling with better UI and data loading | +| `b3782fc` | 2025-08-29 | feat(questionnaire): enhance question position management and text handling | +| `884cb80` | 2025-08-25 | fix(security-area): resolve lazy loading and eager collection conflict for questionnaires | +| `3fd6e2e` | 2025-08-24 | Admin: add System-Logs page and LogFileManager; update admin menu; set active RollingFile to /logs/application.log | +| `11d96cd` | 2025-08-16 | feat(admin): neue Admin-Views (password reset, user management) und Controller | +| `6238521` | 2025-07-26 | Refactor: UserRoleValidationManager als Startup-Service konfiguriert (@Singleton/@Startup, @PostConstruct validateRolesOnStartup) | +| `eeb329d` | 2025-07-26 | Feature: UserRoleValidationManager für automatische Rollenkorrektur | +| `2d72946` | 2025-07-26 | Dokumentation: Detaillierte Kommentare zur Person-Entität hinzugefügt | +| `66bb699` | 2025-07-20 | Implement hierarchical user role assignment system (UserRoleAssignmentHelper) | +| `8ee06b4` | 2025-07-20 | Add comprehensive JavaDoc comments to model classes | +| `3438bcb` | 2025-07-20 | Remove target directory from repository and improve .gitignore | +| `ed70e9f` | 2025-07-15 | Update .gitignore to include an empty /target/ directory | +| `7072410` | 2025-07-03 | Improve UI loading experience and update controller logic | +| `0d9c1fa` | 2025-06-27 | Update multiple controller classes across various modules | +| `0ab4495` | 2025-06-27 | Refactor controllers to remove session dependency and improve transaction management; add .gitignore for target directory | +| `f2fa7b6` | 2025-06-27 | Add initial project structure and configuration files | + +--- + +*Archived 2026-06-13 during the mss-failsafe consolidation into `pi_mcps`. The full +binary Git history of the original standalone repo was not migrated — only this +human-readable log plus the final flattened working tree.* diff --git a/java/mss-failsafe/QUESTIONNAIRES_FOR_SECURITY_AREAS_IMPLEMENTATION_GUIDE.md b/java/mss-failsafe/QUESTIONNAIRES_FOR_SECURITY_AREAS_IMPLEMENTATION_GUIDE.md new file mode 100755 index 0000000..72e1e59 --- /dev/null +++ b/java/mss-failsafe/QUESTIONNAIRES_FOR_SECURITY_AREAS_IMPLEMENTATION_GUIDE.md @@ -0,0 +1,199 @@ +# Questionnaires für SecurityArea - Implementierungsplan + +## Übersicht +Implementierung der Funktionalität zur Hinzufügung von Fragebögen (Questionnaires) zu SecurityArea-Entitäten in den Basisdaten. Dies ermöglicht es, Fragebögen bereits bei der Erstellung von Sicherheitsbereichen zu hinterlegen, anstatt erst bei der Ticket-Erstellung. + +## Hintergrund +- **Aktueller Stand**: Questionnaires werden nur zu TicketSecurityArea hinzugefügt +- **Neues Ziel**: Questionnaires sollen auch zu SecurityArea (Basisdaten) hinzugefügt werden können +- **Grund**: Verbesserung des Workflows entsprechend Kundenwunsch + +## Schritt-für-Schritt Implementierung + +### 1. Datenbankmodell erweitern + +#### 1.1 SecurityArea Entität anpassen +- **Datei**: `src/main/java/model/securityarea/SecurityArea.java` +- **Aufgabe**: + - Neue Beziehung zu Questionnaires hinzufügen + - `@OneToMany` Mapping für `SecurityAreaQuestionnaire` implementieren + - Ähnlich wie bei TicketSecurityArea → SecurityAreaQuestionnaire + +#### 1.2 Neue Entität: SecurityAreaQuestionnaire +- **Datei**: `src/main/java/model/securityarea/SecurityAreaQuestionnaire.java` (neu erstellen) +- **Aufgabe**: + - Entität ähnlich zu `TicketSecurityAreaQuestionnaire` erstellen + - `@ManyToOne` Beziehung zu SecurityArea + - `@OneToMany` Beziehung zu SecurityAreaQuestion + - Konstruktor für Kopieren von Questionnaire → SecurityAreaQuestionnaire + +#### 1.3 Neue Entität: SecurityAreaQuestion +- **Datei**: `src/main/java/model/securityarea/SecurityAreaQuestion.java` (neu erstellen) +- **Aufgabe**: + - Entität ähnlich zu `SecurityAreaQuestion` aus tickets package erstellen + - `@ManyToOne` Beziehung zu SecurityAreaQuestionnaire + - Alle notwendigen Felder für Fragen implementieren + +### 2. Business Logic implementieren + +#### 2.1 SecurityAreaManager erweitern +- **Datei**: `src/main/java/business/securityarea/SecurityAreaManager.java` +- **Aufgabe**: + - Methoden für Questionnaire-Management hinzufügen + - `addQuestionnaireToSecurityArea()` + - `removeQuestionnaireFromSecurityArea()` + - `getAvailableQuestionnaires()` + +#### 2.2 QuestionnaireManager anpassen +- **Datei**: `src/main/java/business/questions/QuestionnaireManager.java` +- **Aufgabe**: + - Methoden für SecurityArea-Questionnaire Verknüpfung + - Validierung für Questionnaire-Zuordnung + +### 3. Controller Layer erweitern + +#### 3.1 SecurityAreaController anpassen +- **Datei**: `src/main/java/controller/securityarea/SecurityAreaController.java` +- **Aufgabe**: + - Properties für Questionnaire-Auswahl hinzufügen + - `selectedQuestionnaire`, `availableQuestionnaires` + - Methoden: `addQuestionnaireToArea()`, `removeQuestionnaireFromArea()` + - Integration in `save()` und `editSelected()` Methoden + +#### 3.2 Neue Controller für SecurityAreaQuestionnaire +- **Datei**: `src/main/java/controller/securityarea/SecurityAreaQuestionnaireController.java` (optional) +- **Aufgabe**: + - Dedicated Controller für Questionnaire-Management + - Ähnlich zu bestehenden Questionnaire-Controllern + +### 4. UI Implementation + +#### 4.1 Hauptseite erweitern +- **Datei**: `src/main/webapp/resources/user/sec/create.xhtml` +- **Aufgabe**: + - Neue Sektion für Questionnaires in SecurityArea-Details hinzufügen + - Position: Nach den DangerPoints, vor dem Bottom-Bereich + - Accordion-Panel für Questionnaires ähnlich wie bei SecurityDevices + +#### 4.2 Questionnaire-Management UI +- **Komponenten hinzufügen**: + - DataTable für angehängte Questionnaires + - Buttons: "Fragebogen hinzufügen", "Bearbeiten", "Entfernen" + - Dialog für Questionnaire-Auswahl + - Dialog für Questionnaire-Bearbeitung + +#### 4.3 Dialog-Implementierung +- **Neue Dialogs in create.xhtml**: + - `dlgAddQuestionnaire`: Auswahl verfügbarer Questionnaires + - `dlgEditQuestionnaire`: Bearbeitung der Questions + - Ähnlich zu bestehenden Device/DangerPoint Dialogs + +### 5. Integration und Workflow + +#### 5.1 Ticket-Erstellung anpassen +- **Aufgabe**: Bei Ticket-Erstellung Questionnaires von SecurityArea automatisch kopieren +- **Dateien**: + - Ticket-Erstellungs-Controller + - TicketSecurityArea-Business-Logic + +#### 5.2 Copy/Clone Funktionalität +- **Aufgabe**: Beim Kopieren von SecurityAreas auch Questionnaires mitkopieren +- **Betroffene Methoden**: `cloneToSelectedMachine()` in SecurityAreaController + +### 6. UI/UX Details + +#### 6.1 SecurityArea-Karte erweitern +```html + +
+ + + + + +
+``` + +#### 6.2 Questionnaire-Management Buttons +- In das "Mehr"-Menü (dynaButton) integrieren +- Neue Menüpunkte: "Fragebogen hinzufügen", "Fragebögen verwalten" + +### 7. Testing und Validierung + +#### 7.1 Unit Tests +- **Neue Test-Klassen**: + - `SecurityAreaQuestionnaireTest` + - `SecurityAreaQuestionTest` + - `SecurityAreaManagerTest` (erweitern) + +#### 7.2 Integration Tests +- Questionnaire-Zuordnung zu SecurityArea +- Kopieren von Questionnaires bei Ticket-Erstellung +- UI-Workflow Tests + +#### 7.3 Datenbank-Migration +- **Aufgabe**: SQL-Scripts für neue Tabellen erstellen +- Tables: `SECURITY_AREA_QUESTIONNAIRE`, `SECURITY_AREA_QUESTION` +- Foreign Key Constraints definieren + +## Reihenfolge der Implementierung + +1. **Phase 1**: Datenbankmodell (SecurityAreaQuestionnaire, SecurityAreaQuestion) +2. **Phase 2**: Business Logic (Manager-Erweiterungen) +3. **Phase 3**: Controller Layer (SecurityAreaController erweitern) +4. **Phase 4**: UI Implementation (create.xhtml erweitern) +5. **Phase 5**: Integration (Ticket-Erstellung anpassen) +6. **Phase 6**: Testing und Finalisierung + +## Wichtige Überlegungen + +### Datenmodell-Konsistenz +- Questionnaires in SecurityArea müssen kompatibel zu TicketSecurityArea sein +- Beim Ticket-Erstellen: SecurityArea-Questionnaires → TicketSecurityArea kopieren + +### UI-Konsistenz +- Gleiche Bedienung wie bei SecurityDevices/DangerPoints +- Accordion-Panel für übersichtliche Darstellung +- Standard CRUD-Operationen (Create, Read, Update, Delete) + +### Performance +- Lazy Loading für Questionnaires implementieren +- Effizienter Datentransfer bei Questionnaire-Kopierung + +## Dependencies + +### Neue Dateien zu erstellen: +- `model/securityarea/SecurityAreaQuestionnaire.java` +- `model/securityarea/SecurityAreaQuestion.java` +- Controller-Erweiterungen +- UI-Erweiterungen in create.xhtml + +### Bestehende Dateien zu modifizieren: +- `model/securityarea/SecurityArea.java` +- `controller/securityarea/SecurityAreaController.java` +- `business/securityarea/SecurityAreaManager.java` +- `resources/user/sec/create.xhtml` + +## Zeitschätzung +- **Phase 1-2**: 2-3 Tage (Backend) +- **Phase 3-4**: 3-4 Tage (Controller + UI) +- **Phase 5-6**: 2-3 Tage (Integration + Testing) +- **Gesamt**: ~8-10 Arbeitstage + +## Risiken und Mitigationen + +### Datenbankmigrationen +- **Risiko**: Bestehende Daten könnten beeinträchtigt werden +- **Mitigation**: Backup vor Migration, schrittweise Einführung + +### UI-Komplexität +- **Risiko**: UI wird zu überladen +- **Mitigation**: Accordion-Panel verwenden, ähnlich zu bestehenden Komponenten + +### Performance +- **Risiko**: Laden von vielen Questionnaires könnte langsam werden +- **Mitigation**: Lazy Loading, Paging implementieren + +--- + +**Nächste Schritte**: Mit Phase 1 (Datenbankmodell) beginnen und die SecurityAreaQuestionnaire Entität implementieren. diff --git a/java/mss-failsafe/docs/AI_INSTRUCTIONS.md b/java/mss-failsafe/docs/AI_INSTRUCTIONS.md new file mode 100755 index 0000000..91863e3 --- /dev/null +++ b/java/mss-failsafe/docs/AI_INSTRUCTIONS.md @@ -0,0 +1,64 @@ +# AI Instruktionen für Code-Generierung + +Ziel: Ein konsistenter Kontext für zukünftige automatische Ergänzungen. + +## Projekt-Kurzprofil +- Typ: Java EE 8 (javax), WAR, JSF + PrimeFaces, Hibernate JPA. +- Java Version: 11 (Compiler Plugin). +- Schichten: Model (Entities), Business (Manager), Controller (JSF Beans), View (XHTML). + +## Wichtige Basisklassen +- `AbstractEntity`: Basisklasse aller Entities (enthält ID – Details nicht gezeigt, aber zentral). +- `AbstractManager`: Generisches CRUD mit `save`, `saveAll`, etc. +- `AbstractController`: UI State & Utilities. + +## Konventionen (Kurz) +- Neue Entities: extend `AbstractEntity`, Named Queries definieren. +- Neue Manager: `@Stateless`, extends `AbstractManager`, implementiert `getEntityManager()`. +- Neue Controller: `@Named`, Scope Annotation (`@ViewScoped` etc.), extends `AbstractController`, implementiert `getManager()`. +- Temporäre (nicht persistierte) Objekte: negative ID (Fake) bis finalem Speichern. + +## CRUD Muster (Beispiel) +```java +@Stateless +public class ExampleEntityManager extends AbstractManager { + @PersistenceContext(name = "pu_person") EntityManager em; + public ExampleEntityManager(){ super(ExampleEntity.class); } + @Override protected EntityManager getEntityManager(){ return em; } +} +``` + +## Typische Aufgaben für Generierung +1. Neue Domain + Entity + Manager + Controller + XHTML. +2. PDF-Ausgabe Erweiterung. +3. Batch-Speichern mehrerer neuer Entities. +4. Klon-Operationen: Copy-Konstruktor nutzen, Child-IDs auf `null` setzen, Referenzen neu knüpfen. +5. Fragebogen-Workflow: add/remove (siehe `QUESTIONNAIRE_WORKFLOW.md`). + +## Qualitätssicherung +- Nach Code-Erzeugung: Prüfe Kompilierung (mvn -q test / package). +- Sicherstellen: Keine direkten System.out Prints in Produktionscode. +- Logging: `LOGGER.error(e)` bei Exceptions. + +## Häufige Edge Cases +- Null Checks vor Persist/Remove. +- Negative ID Objekte dürfen nicht direkt gelöscht (erst persistieren oder aus Collection entfernen). +- Lazy Collections müssen initialisiert vor Iteration (via `refresh` oder `Hibernate.initialize`). + +## Verbesserungsvorschläge (safe additions) +- Service Layer Einführen (wenn Logik Manager übersteigt). +- Bean Validation (@NotNull, @Size) auf Entities. +- Einheitliche Exception Klasse. + +## Generierungs-Präferenzen +- Bevorzugt vorhandene Muster exakt replizieren. +- Keine neuen Frameworks ohne Bedarf. +- Code kommentieren nur bei komplexer Logik. + +## Anti-Pattern vermeiden +- Business Logik direkt im Controller. +- Duplizierte Query Strings ohne Named Query. + +--- +Letzte Aktualisierung: 2025-10-20 + diff --git a/java/mss-failsafe/docs/ARCHITECTURE.md b/java/mss-failsafe/docs/ARCHITECTURE.md new file mode 100755 index 0000000..82ef358 --- /dev/null +++ b/java/mss-failsafe/docs/ARCHITECTURE.md @@ -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 +- 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 + diff --git a/java/mss-failsafe/docs/CODING_GUIDELINES.md b/java/mss-failsafe/docs/CODING_GUIDELINES.md new file mode 100755 index 0000000..a1cd91c --- /dev/null +++ b/java/mss-failsafe/docs/CODING_GUIDELINES.md @@ -0,0 +1,61 @@ +# Coding Guidelines + +## Allgemein +- Sprache: Deutsch in UI-Messages, Englisch im Code (Klassennamen etc.). +- Einrückung: 4 Spaces (NetBeans Standard). Keine Tab-Mischung. +- Zeilenlänge: Empfehlung max. 140 Zeichen. +- Vermeide überflüssige System.out.println – nutze Logger. + +## Packages +- `business.` für Manager/Logik. +- `controller.` für JSF Backing Beans. +- `model.` für Entities/Enums. + +## Benennung +- Manager endet auf `Manager` (CRUD + Fachlogik). +- Controller endet auf `Controller`. +- Entities nutzen Substantive singular (`SecurityArea`, `DangerPoint`). +- Enums nutzen PascalCase Konstanten (`APPROACH_SPEED`, hier bereits gemischt – beibehalten vorhandene Fälle, Konsistenz bei neuen). + +## Fehlerbehandlung +- Aktuell: Logging + bool Rückgabe. Bei neuen komplexen Methoden: Ziehe eigene Exceptions in Betracht (`BusinessException`). +- Niemals stack trace verlieren – immer loggen. Falls Benutzerfeedback nötig → Message über Controller. + +## Persistenz +- Vor Persist neuer Entity: ID muss `null` sein (oder negativ Fake-ID nur temporär). Setze beim finalen Speichern negative IDs auf `null`. +- Verwende `AbstractManager.refresh(entity)` um Lazy Collections zu initialisieren. + +## Transaktionen +- Schreibmethoden erhalten `@Transactional`. Beim EJB Stateless reicht oft Container-Transaktion; Annotation verstärkt Klarheit. + +## Performance +- Sammel-Speicheroperationen bevorzugt `saveAll(Collection)` statt Schleifen mit einzelnen Flushes. +- Beim Klonen großer Objektgraphen prüfen: Nur notwendige Collections initialisieren. + +## UI / JSF +- Vermeide direkte Änderungen an listengebundenen Collections ohne Aktualisierung des Backing Beans (PrimeFaces kann sonst nicht updaten). +- Nutze klare Dialog-Helper (closeDialogs) statt roher JavaScript Strings. + +## PDF +- Konsistenz: Verwende iText7 API für neue Funktionen. Markiere Altcode (iText5) für spätere Entfernung. + +## Sicherheit +- Keine sensiblen Daten in Logs. +- Prüfe vor Löschaktionen, dass referenzielle Integrität gewährleistet (vor Entfernen Beziehungen lösen, wie im `deleteSelected()` umgesetzt). + +## Tests (Empfehlung) +- JUnit + Arquillian für EJB/Entity Tests. +- Test-Namensschema: `Test`. +- Mindestens: CRUD, Klonen, Fragebogen hinzufügen/entfernen. + +## Kommentar-Stil +- Klassenheader: Kurze Beschreibung Funktion/Zweck. +- Methoden: JavaDoc nur bei komplexer Logik / öffentlich verwendeten APIs. + +## Anti-Pattern vermeiden +- "God Controller" – trenne Verantwortlichkeiten (nicht alles in einem Controller ansammeln). +- Direkte UI-Logik im Manager vermeiden. + +--- +Aktualisiert: 2025-10-20 + diff --git a/java/mss-failsafe/docs/HOWTO_EXTEND.md b/java/mss-failsafe/docs/HOWTO_EXTEND.md new file mode 100755 index 0000000..c9c622a --- /dev/null +++ b/java/mss-failsafe/docs/HOWTO_EXTEND.md @@ -0,0 +1,72 @@ +# How-To: Projekt erweitern + +## Neuer Fachbereich (Beispiel: InspectionReport) + +### 1. Entity anlegen +- Paket: `model.report`. +- Klasse: `InspectionReport extends AbstractEntity`. +- Felder: `date`, `inspector`, `machine`, `remarks`. +- Named Queries definieren (z.B. `FIND_BY_MACHINE`). + +### 2. Manager +```java +@Stateless +@Named +public class InspectionReportManager extends AbstractManager { + @PersistenceContext(name = "pu_person") + EntityManager em; + public InspectionReportManager() { super(InspectionReport.class); } + @Override protected EntityManager getEntityManager() { return em; } + // Fachmethoden: findByMachine(Long id) +} +``` + +### 3. Controller +```java +@ViewScoped +@Named +public class InspectionReportController extends AbstractController { + @EJB InspectionReportManager reportManager; + @Inject MachineController machineController; + public InspectionReportController() { setSelected(new InspectionReport()); setCreated(new InspectionReport()); } + @Override protected AbstractManager getManager() { return reportManager; } + @Override public void clearEntries() { setSelected(new InspectionReport()); setCreated(new InspectionReport()); getEntities().clear(); } + public void saveReport(){ reportManager.save(getSelected()); successMessage(); } +} +``` + +### 4. UI Seite +- Pfad: `webapp/report/inspection.xhtml`. +- Binding: `#{inspectionReportController}`. +- Komponenten: Formular für Felder + Speichern Button. + +### 5. Navigation +- Menüeintrag in globaler Navigationsstruktur (Tree oder Topbar) – analog `createMachineMenu()` Ansatz. + +### 6. Tests +- Persistenz Test: Speichern + Laden. +- Manager Fachmethode Test. + +## Erweiterung vorhandener Funktionalität +- Beispiel: Neue PDF Sektion → Ergänze Hilfsmethode in `AbstractController` (sofern allgemein). Falls spezifisch für eine Domäne, eher Hilfsklasse im Domain-Paket. + +## Konsistenz-Checkliste +- [ ] Entity extends `AbstractEntity` +- [ ] Manager extends `AbstractManager` +- [ ] Controller extends `AbstractController` +- [ ] Negative IDs für neue Objekte vor Persist (falls in Listen) +- [ ] Internationale Zeichen (UTF-8) – POM setzt Encoding +- [ ] Logging bei Fehlern + +## Deployment Hinweise +- Sicherstellen, dass neue Named Queries beim Serverstart verfügbar (Entity korrekt gescannt). +- Falls neue Ressourcen (Logos, Templates) → in `resources` pflegen. + +## Typische Stolpersteine +- LazyInitializationException: Lösung `refresh(entity)` oder explizite Initialisierung im Manager. +- Doppelte Referenzen beim Klonen: IDs auf `null` setzen. +- Fehlende Transaktion: Sicherstellen `@Transactional` oder EJB Standard. + +--- +Aktualisiert: 2025-10-20 + diff --git a/java/mss-failsafe/docs/QUESTIONNAIRE_WORKFLOW.md b/java/mss-failsafe/docs/QUESTIONNAIRE_WORKFLOW.md new file mode 100755 index 0000000..f2b0998 --- /dev/null +++ b/java/mss-failsafe/docs/QUESTIONNAIRE_WORKFLOW.md @@ -0,0 +1,52 @@ +# Workflow: Fragebögen in Sicherheitsbereichen + +## Ziel +Zuordnung strukturiert erfassbarer Fragebögen (`Questionaire`) zu einem `SecurityArea` via `SecurityAreaQuestionnaire`. + +## Beteiligte Klassen +- `SecurityAreaController` – UI Aktionen (add/remove, refresh). +- `SecurityAreaManager` – Persistenzoperationen (add/remove/reload, Verfügbarkeitsliste). +- `SecurityAreaQuestionnaire` – Assoziative Entity (enthält Name / ID des Fragebogens + Bezug zum Schutzbereich). +- `QuestionaireManager` (nicht gezeigt) – Verwaltung aller Fragebögen. + +## Hinzufügen Ablauf +1. Nutzer wählt Schutzbereich + Fragebogen im Dialog. +2. Controller ruft `securityAreaManager.addQuestionnaireToSecurityArea(selectedArea, selectedQuestionnaire)`. +3. Manager: + - Lädt `area` (falls persistent) neu per `em.find`. + - Erzeugt neues `SecurityAreaQuestionnaire` Objekt. + - Setzt Relation (wrapper.setArea(area)). + - Persistiert Wrapper, merged Area. +4. Controller: `refrehSelected()` (Merge + Initialize Lazy Collections), zeigt Erfolgsmeldung. + +## Entfernen Ablauf +1. Nutzer wählt zugeordneten Fragebogen (Wrapper-Objekt). +2. Controller ruft `securityAreaManager.removeQuestionnaireFromSecurityArea(area, wrapper)`. +3. Manager lädt Entities (falls notwendig), entfernt aus Collection, `em.remove(wrapper)`, `em.merge(area)`. +4. Controller aktualisiert Verfügbare Liste. + +## Verfügbare Fragebögen +- Abfrage aller Fragebögen: `SELECT q FROM Questionaire q ORDER BY q.name`. +- Filter: Namen bereits zugeordneter Wrapper (Verbesserung: Filter per ID zur Sicherheit gegen Namensduplikate). + +## Edge Cases +- Bereich / Fragebogen null: Controller zeigt Fehlermeldung. +- Concurrent Änderung: Nach Persist immer Refresh durchführen. +- Doppelte Zuordnung: Filter verhindert erneute Anzeige; Manager könnte zusätzlich prüfen (Collection enthält bereits Name). + +## Verbesserungen +- Validierung auf Einzigartigkeit im Manager (statt nur UI Filter). +- Optimierte Fetch Strategie (JOIN FETCH) bei Reload. +- Nutzung eines Service zur Kapselung Geschäftslogik + Manager nur für CRUD. + +## Beispiel Pseudocode (Hinzufügen) +```java +if (questionnaire != null && area != null) { + areaManager.addQuestionnaireToSecurityArea(area, questionnaire); + controller.refrehSelected(); +} +``` + +--- +Aktualisiert: 2025-10-20 + diff --git a/java/mss-failsafe/userdata/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/java/mss-failsafe/docs/README.md old mode 100644 new mode 100755 similarity index 100% rename from java/mss-failsafe/userdata/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst rename to java/mss-failsafe/docs/README.md diff --git a/java/mss-failsafe/docs/REFRESH_AND_FAKE_ID_MECHANISM.md b/java/mss-failsafe/docs/REFRESH_AND_FAKE_ID_MECHANISM.md new file mode 100755 index 0000000..cda8cf0 --- /dev/null +++ b/java/mss-failsafe/docs/REFRESH_AND_FAKE_ID_MECHANISM.md @@ -0,0 +1,97 @@ +# Mechanismus: Refresh & Fake-ID + +## Problemstellung +Im UI werden häufig neue Objekte in Collections angezeigt, bevor sie persistiert sind. Diese benötigen eine temporäre Identifikation (ID) für Auswahl/Operationen, ohne den Datenbankzustand zu verfälschen. + +## Fake-ID Strategie +- Negative Long Werte (< 0) kennzeichnen nicht persistierte Objekte. +- Erzeugung: `AbstractController.createFakeID(Collection)`: + - Startwert -1. + - Falls bereits negative IDs existieren → Nimmt die kleinste negative und subtrahiert 1. + - Ergebnis: Sequenz -1, -2, -3 ... (absteigend). + +## Persistieren +Vor finalem Speichern (z.B. `SecurityAreaController.save()`): +1. Alle Entities mit `id < 0` → `setId(null)`. +2. `AbstractManager.saveAll()` unterscheidet durch `entity.getId() == null` zwischen Persist und Merge. +3. Datenbank vergibt positive ID (Auto Increment / Sequence). + +## Vorteile +- Klare Unterscheidung UI-temporär vs. persistent. +- Verhindert versehentliches Auslösen von Merge bei noch nicht existierenden DB Zeilen. + +## Risiken +- Verwechslung negativ gesetzter IDs mit echten IDs (nicht möglich, da DB positive IDs generiert). +- Direkte Verwendung negativer IDs in DB-Operationen (vermeiden: Prüfen auf `id > 0` vor `em.find`). + +## Refresh +- Methode `AbstractController.refrehSelected()` (Tippfehler im Namen, historisch) ruft `getManager().refresh(selected)`. +- `AbstractManager.refresh(entity)`: + - Falls ID null → `save(entity)` (persistiert neues Objekt). + - `merge` für Managed Zustand und `Hibernate.initialize(entity)` zur Lazy Init. + +## Best Practices +- Nach komplexen Änderungen (Add/Remove Child Collections) Refresh durchführen wenn UI weitere Lazy Properties benötigt. +- Beim Klonen persistenter Objekte zuerst DB-Laden → danach Kopie erstellen. + +## Potentielle Verbesserungen +- Korrektur Tippfehler `refrehSelected()` → `refreshSelected()` (Refactoring + Suchanpassungen). +- Kennzeichnung Fake-ID generierender Methoden mit JavaDoc für Klarheit. + +--- +Aktualisiert: 2025-10-20 +# MSS Failsafe – Developer Einstieg + +Dieses Verzeichnis bündelt technische Instruktionsdateien zur schnelleren Einarbeitung und zur Unterstützung automatischer Code-Generierung. + +## Quick Start +1. Java Version: Quell-/Ziellevel im POM: 11 (Property 1.8 ist historisch, der Compiler-Plugin setzt auf 11). Nutze lokal JDK 11. +2. Application Server: Java EE 8 kompatibel (z.B. Payara 5 / WildFly 20 / GlassFish 5). Dependencies `javax.*` statt `jakarta.*`. +3. Build: + ```cmd + mvn clean package + ``` + Ergebnis: `target/mss-1.0-SNAPSHOT.war`. +4. Deployment: WAR in kompatiblen EE 8 Server einspielen. Konfiguriere Datenquelle `pu_person` (JPA Persistence Unit – siehe `@PersistenceContext(name = "pu_person")`). +5. Logging: Log4j2 Konfiguration in `src/main/resources/log4j2.xml`. +6. Frontend: JSF 2.3 + PrimeFaces 11 + PrimeFlex 2.0. + +## Wichtigste Schichten +- model: JPA Entities (`AbstractEntity` Basis – enthält ID). +- business: `*Manager` Klassen (Stateless EJBs) kapseln CRUD + Fachlogik. +- controller: View/Request/Session Scoped JSF Backing Beans (Interaktion UI ↔ Business Layer). +- webapp: XHTML Seiten (JSF Components + PrimeFaces). +- resources: Text-/Konfigurationsdateien, Checklisten. + +## Kern-Patterns +- Manager erben von `AbstractManager` (generisches CRUD mit `save`, `saveAll`, `remove`, `refresh`). +- Controller erben von `AbstractController` (Message Handling, Fake-ID-Erzeugung für neue (noch nicht persistierte) Entities, PDF Hilfen, Auswahlzustand `selected/created`). +- Negative IDs (< 0) werden als temporäre (noch nicht persistierte) Objekte verwendet – wichtig bei UI-Listen vor Sammel-Speichern. +- Lazy Collections werden vor Nutzung mit `Hibernate.initialize(...)` initialisiert (Refresh/Reload Methoden). + +## Erweiterung – Schnellanleitung +1. Neue Entity anlegen (JPA @Entity, extends `AbstractEntity`). +2. Manager erstellen: `@Stateless`, extends `AbstractManager`, implementiert `getEntityManager()`. Zusätzliche Named Queries in Entity definieren. +3. Controller erstellen: `@Named`, Scope festlegen (`@ViewScoped`, `@SessionScoped`, etc.), extends `AbstractController`, injiziere Manager mit `@EJB`. +4. XHTML Seite/Fragment erstellen und Controller referenzieren (`#{yourController}`) + PrimeFaces Komponenten. +5. Tests (optional, derzeit kaum vorhanden) – vorschlagen: Architektur-Test + Manager CRUD Test. + +## Fragebögen / Sicherheitsbereiche +Ein ausführlicher Workflow liegt in `QUESTIONNAIRE_WORKFLOW.md` und `SECURITY_AREA_DOMAIN.md`. + +## PDF-Erzeugung +- Verwendet iText (5.x + 7.x Module). Utilities liegen in `AbstractController` (Tabellen, Kopfzeilen, Seitennummern). +- Logo Pfad `LOGO_PATH = /rundata/logo.png` – stelle sicher, dass Datei beim Deployment verfügbar ist. + +## Automatisierte Tools / AI Hinweise +Siehe `AI_INSTRUCTIONS.md` für formatierte Kontextbereitstellung. + +## Nächste Verbesserungen (Empfehlungen) +- Konsolidierung auf iText7 (Legacy 5.x entfernen). +- Einheitliche Exception-Strategie (momentan Logging + bool Rückgabe). +- Mehr Unit Tests (Persistenz, Controller Interaktionen via Arquillian / Payara Micro). +- Migrationspfad Richtung Jakarta EE 9+ (Namespace Wechsel). + +--- +Letzte Aktualisierung: 2025-10-20 + diff --git a/java/mss-failsafe/docs/SECURITY_AREA_DOMAIN.md b/java/mss-failsafe/docs/SECURITY_AREA_DOMAIN.md new file mode 100755 index 0000000..1d5c944 --- /dev/null +++ b/java/mss-failsafe/docs/SECURITY_AREA_DOMAIN.md @@ -0,0 +1,54 @@ +# Domain: SecurityArea + +## Zweck +Abbildung eines Schutzbereichs einer Maschine mit zugehörigen Schutzeinrichtungen, Gefahrenstellen und Schaltgeräten sowie Fragebögen zur Bewertung. + +## Haupt-Entitäten (Ausschnitt) +- `SecurityArea` +- `SecurityDevice` (Liste in Area) +- `DangerPoint` +- `SwitchingDevice` +- `SecurityAreaQuestionnaire` (assoziative Entity zwischen Schutzbereich und `Questionaire`) +- `Questionaire` + +## Lebenszyklus +1. Erstellung im UI: Neues `SecurityArea` Objekt mit Fake-ID (negativ). +2. Bearbeitung von Eigenschaften (Name, Typen/Enums: `ProtectionType`, `MountingPosition`, `OverrunMeasurementType`, `ApproachSpeed`). +3. Hinzufügen von Schutzeinrichtungen/Gefahrenstellen/Schaltgeräten (ebenfalls ggf. mit Fake-ID bis persistiert). +4. Speichern: Negative IDs der neuen Objekte werden auf `null` gesetzt → Persist durch `SecurityAreaManager.save` / Sammelspeicher. +5. Nach Persist: Re-Load (`refresh`/`reloadWithQuestionnaires`) vor weiterer Bearbeitung. + +## Klonen +`SecurityAreaManager.cloneArea(SecurityArea area)`: +- Lädt persistente Quelle (falls ID > 0) vollständig. +- Erzeugt neue Kopie via Copy-Konstruktor. +- Controller passt Namen an (`Original (Kopie)`), setzt neue `null` IDs für untergeordnete Objekte. + +## Fragebogen-Verknüpfung +### Hinzufügen +- Methode: `addQuestionnaireToSecurityArea(area, questionnaire)`. +- Erzeugt `SecurityAreaQuestionnaire` Wrapper. +- Persist Wrapper, merge Area. +- UI aktualisiert Liste und sendet Erfolgsmeldung. + +### Entfernen +- `removeQuestionnaireFromSecurityArea(area, securityAreaQuestionnaire)` entfernt Element aus Sammlung & ruft `em.remove`. + +### Verfügbare Fragebögen +- `getAvailableQuestionnaires(area)` holt alle `Questionaire` und filtert bereits zugeordnete anhand Name. Verbesserung: Nutzung ID statt Name zur Eindeutigkeit. + +## Konsistenz / Referentielle Integrität +Beim Löschen eines Schutzbereichs (`deleteSelected()` im Controller): +1. Entfernen aus Maschine. +2. Auflösen aller Kind-Referenzen (SwitchingDevices, DangerPoints, SecurityDevices) durch Setzen der Area auf `null`. +3. Entfernen der Kindobjekte via entsprechende Manager (`removeAllIn`). +4. Löschen des `SecurityArea` via Named Query (`SecurityArea.DELETE`). + +## Potentielle Verbesserungen +- Cascade Settings genauer prüfen (evtl. kann Teil der manuellen Löschlogik automatisiert werden). +- Validierung (Bean Validation) für Pflichtfelder (Name nicht leer, Enums nicht null soweit fachlich notwendig). +- Nutzung DTOs zur Entkopplung UI ↔ JPA (reduziert Lazy Probleme). + +--- +Aktualisiert: 2025-10-20 + diff --git a/java/mss-failsafe/faces-config.NavData b/java/mss-failsafe/faces-config.NavData new file mode 100755 index 0000000..298bfc5 --- /dev/null +++ b/java/mss-failsafe/faces-config.NavData @@ -0,0 +1,6 @@ + + + + + + diff --git a/java/mss-failsafe/mss/pom.xml b/java/mss-failsafe/mss/pom.xml deleted file mode 100644 index 81c9f53..0000000 --- a/java/mss-failsafe/mss/pom.xml +++ /dev/null @@ -1,130 +0,0 @@ - - - 4.0.0 - - mss-failsafe - plate.software - 1.0-SNAPSHOT - - plate.software - mss - 1.0-SNAPSHOT - war - mss-1.0-SNAPSHOT - - - 1.8 - 1.8 - ${project.build.directory}/endorsed - UTF-8 - false - 8.0 - - - - - javax - javaee-api - ${jakartaee} - provided - - - - org.glassfish.soteria - javax.security.enterprise - 1.0 - - - - org.omnifaces - omnifaces - 3.11.1 - - - - javax - javaee-web-api - 8.0 - provided - - - org.glassfish - javax.faces - 2.3.0 - provided - - - org.apache.logging.log4j - log4j-api - 2.14.1 - - - org.apache.logging.log4j - log4j-core - 2.14.1 - - - - org.primefaces - primefaces - 10.0.0 - - - - org.webjars.npm - primeflex - 2.0.0 - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - 1.8 - 1.8 - - ${endorsed.dir} - - - - - org.apache.maven.plugins - maven-war-plugin - 2.3 - - false - - - - org.apache.maven.plugins - maven-dependency-plugin - 2.6 - - - validate - - copy - - - ${endorsed.dir} - true - - - javax - javaee-api - ${jakartaee} - jar - - - - - - - - - diff --git a/java/mss-failsafe/mss/src/main/java/business/AbstractManager.java b/java/mss-failsafe/mss/src/main/java/business/AbstractManager.java deleted file mode 100644 index 04be020..0000000 --- a/java/mss-failsafe/mss/src/main/java/business/AbstractManager.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package business; - -import java.util.List; -import javax.persistence.EntityManager; - -/** - * - * @author Patrick - * @param - */ -public abstract class AbstractManager { - - private Class entityClass; - - public AbstractManager(Class entityClass) { - this.entityClass = entityClass; - } - - protected abstract EntityManager getEntityManager(); - - public void create(T entity) { - getEntityManager().persist(entity); - } - - public void edit(T entity) { - getEntityManager().merge(entity); - } - - public void remove(T entity) { - getEntityManager().remove(getEntityManager().merge(entity)); - } - - public T find(Object id) { - return getEntityManager().find(entityClass, id); - } - - public List findAll() { - javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); - cq.select(cq.from(entityClass)); - return getEntityManager().createQuery(cq).getResultList(); - } - - public List findRange(int[] range) { - javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); - cq.select(cq.from(entityClass)); - javax.persistence.Query q = getEntityManager().createQuery(cq); - q.setMaxResults(range[1] - range[0] + 1); - q.setFirstResult(range[0]); - return q.getResultList(); - } - - public int count() { - javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); - javax.persistence.criteria.Root rt = cq.from(entityClass); - cq.select(getEntityManager().getCriteriaBuilder().count(rt)); - javax.persistence.Query q = getEntityManager().createQuery(cq); - return ((Long) q.getSingleResult()).intValue(); - } - -} diff --git a/java/mss-failsafe/mss/src/main/java/business/user/DemoManager.java b/java/mss-failsafe/mss/src/main/java/business/user/DemoManager.java deleted file mode 100644 index 4668387..0000000 --- a/java/mss-failsafe/mss/src/main/java/business/user/DemoManager.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package business.user; - -import javax.ejb.EJB; -import javax.ejb.Startup; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Named; - -/** - * - * @author patri - */ -@Named(value = "DemoManager") -@ApplicationScoped -@Startup -public class DemoManager { - - @EJB - PersonManager personManager; - - /** - * Creates a new instance of NewJSFManagedBean - */ - public DemoManager() { - runDemos(); - } - - private void runDemos(){ - personManager.demo(); - } - -} diff --git a/java/mss-failsafe/mss/src/main/java/business/user/TokenManager.java b/java/mss-failsafe/mss/src/main/java/business/user/TokenManager.java deleted file mode 100644 index 677a71b..0000000 --- a/java/mss-failsafe/mss/src/main/java/business/user/TokenManager.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package business.user; - -import java.time.Instant; -import static java.time.temporal.ChronoUnit.DAYS; -import static java.util.UUID.randomUUID; -import javax.ejb.Stateless; -import javax.inject.Inject; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; - -import exception.InvalidEmailException; -import model.person.Token; -import model.person.enums.TokenType; -import model.person.Person; - -import java.util.Arrays; -import static java.time.Instant.now; - -/** - * - * @author Patrick - */ -@Stateless -public class TokenManager { - - @PersistenceContext(name = "pu_person") - private EntityManager em; - - @Inject - PasswordManager passwordManager; - - @Inject - PersonManager customerManager; - - public String generate(final String email, final String ipAddress, final String description, - final TokenType tokenType) { - - String rawToken = randomUUID().toString(); - Instant expiration = now().plus(14, DAYS); - - save(rawToken, email, ipAddress, description, tokenType, expiration); - - return rawToken; - } - - public String generateFileToken(final String email, final String description) { - - String rawToken = randomUUID().toString(); - Instant expiration = now().plus(3, DAYS); - - save(rawToken, email, null, description, TokenType.FILE, expiration); - - return rawToken; - } - - public void save(final String rawToken, final String email, final String ipAddress, - final String description, final TokenType tokenType, final Instant expiration) { - - Person user = this.customerManager.getByEmail(email) - .orElseThrow(InvalidEmailException::new); - - Token token = new Token(); - - token.setTokenHash(Arrays.toString(this.passwordManager.hashToken(rawToken))); - token.setExpiration(expiration); - token.setDescription(description); - token.setTokenType(tokenType); - token.setIpAddress(ipAddress); - - user.addToken(token); - - this.em.persist(user); - } - - public void remove(String token) { - this.em.createNamedQuery(Token.REMOVE_TOKEN) - .setParameter("tokenHash", token).executeUpdate(); - } - - public void removeExpired() { - - this.em.createNamedQuery(Token.REMOVE_EXPIRED_TOKEN) - .setParameter("timestamp", Instant.now()) - .executeUpdate(); - } -} diff --git a/java/mss-failsafe/mss/src/main/java/controller/AbstractController.java b/java/mss-failsafe/mss/src/main/java/controller/AbstractController.java deleted file mode 100644 index 5b04e75..0000000 --- a/java/mss-failsafe/mss/src/main/java/controller/AbstractController.java +++ /dev/null @@ -1,53 +0,0 @@ -package controller; -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ - - -import java.io.Serializable; -import javax.faces.application.FacesMessage; -import javax.faces.context.FacesContext; - -/** - * - * @author Patrick - */ -public abstract class AbstractController implements Serializable{ - private static final long serialVersionUID = -5908716187853409719L; - - protected void sendInfoMessage(String title, String message){ - FacesMessage facesMessage = new FacesMessage( - FacesMessage.SEVERITY_INFO, title, message); - addMessage(facesMessage); - } - - protected void sendWarnMessage(String title, String message){ - FacesMessage facesMessage = new FacesMessage( - FacesMessage.SEVERITY_WARN, title, message); - addMessage(facesMessage); - } - - protected void sendErrorMessage(String title, String message){ - FacesMessage facesMessage = new FacesMessage( - FacesMessage.SEVERITY_ERROR, title, message); - addMessage(facesMessage); - } - - protected void sendFatalMessage(String title, String message){ - FacesMessage facesMessage = new FacesMessage( - FacesMessage.SEVERITY_FATAL, title, message); - addMessage(facesMessage); - } - - private void addMessage(FacesMessage message) { - FacesContext.getCurrentInstance().addMessage(null, message); - } - - protected void errorMessage() { - String title = "Fehler!"; - String info = "Es ist ein Fehler aufgetreten, bitte versuchen Sie es erneut!"; - sendErrorMessage(title, info); - } -} diff --git a/java/mss-failsafe/mss/src/main/java/controller/person/PersonEditController.java b/java/mss-failsafe/mss/src/main/java/controller/person/PersonEditController.java deleted file mode 100644 index 486d0d1..0000000 --- a/java/mss-failsafe/mss/src/main/java/controller/person/PersonEditController.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package controller.person; - -import controller.AbstractController; -import javax.annotation.PostConstruct; -import javax.enterprise.context.RequestScoped; -import javax.inject.Inject; -import javax.inject.Named; -import model.person.Person; -import model.person.enums.Call; - -/** - * - * @author patri - */ -@Named -@RequestScoped -public class PersonEditController extends AbstractController{ - @Inject - PersonController personController; - - private String email; - private Call call; - private String telefon; - private String password; - private String mobile; - private String fax; - private String firstname; - private String lastname; - private String title; - - public PersonEditController() { - } - - @PostConstruct - private void loadUserdata(){ - Person activePerson = personController.getActiveUser(); - - email = activePerson.getEmail(); - call = activePerson.getCall(); - telefon = activePerson.getTelefon(); - password = "********"; - mobile = activePerson.getMobile(); - fax = activePerson.getFax(); - firstname = activePerson.getFirstname(); - lastname = activePerson.getLastname(); - title = activePerson.getTitle(); - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public Call getCall() { - return call; - } - - public void setCall(Call call) { - this.call = call; - } - - public String getTelefon() { - return telefon; - } - - public void setTelefon(String telefon) { - this.telefon = telefon; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public String getMobile() { - return mobile; - } - - public void setMobile(String mobile) { - this.mobile = mobile; - } - - public String getFax() { - return fax; - } - - public void setFax(String fax) { - this.fax = fax; - } - - public String getFirstname() { - return firstname; - } - - public void setFirstname(String firstname) { - this.firstname = firstname; - } - - public String getLastname() { - return lastname; - } - - public void setLastname(String lastname) { - this.lastname = lastname; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - -} diff --git a/java/mss-failsafe/mss/src/main/java/controller/person/UserPictureController.java b/java/mss-failsafe/mss/src/main/java/controller/person/UserPictureController.java deleted file mode 100644 index 7f32e37..0000000 --- a/java/mss-failsafe/mss/src/main/java/controller/person/UserPictureController.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package controller.person; - -import business.user.PersonManager; -import business.user.UserPictureManager; -import controller.AbstractController; -import javax.ejb.EJB; -import javax.enterprise.context.RequestScoped; -import javax.inject.Inject; -import javax.inject.Named; -import model.files.Mime; -import model.files.UserPicture; -import model.person.Person; -import org.primefaces.event.FileUploadEvent; -import org.primefaces.model.file.UploadedFile; - -/** - * - * @author patri - */ -@Named -@RequestScoped -public class UserPictureController extends AbstractController { - - private UserPicture picture; - - @Inject - PersonController personController; - - @EJB - UserPictureManager upManager; - - @EJB - PersonManager personManager; - - public void handleUserPictureUpload(FileUploadEvent event) { - UploadedFile file = event.getFile(); - - if (file != null && file.getContent() != null && file.getContent().length > 0 && file.getFileName() != null) { - - if (createSaveUserPicture(file)) { - sendInfoMessage("Erfolg", this.picture.getName() + " wurde hochgeladen!"); - } else { - sendErrorMessage("Fehler", "Es ist ein Fehler aufgetreten. Bitte Versuchen Sie es erneut!"); - } - } - } - - private boolean createSaveUserPicture(UploadedFile file) { - picture = null; - picture = personController.getActiveUser().getUserPicture(); - boolean isNew = picture == null; - - if (isNew) { - picture = new UserPicture(); - } - - setData(picture, file); - Person person = personManager.load(personController.getActiveUser()); - person.setUserPicture(picture); - picture.setPerson(person); - - if (isNew) { - upManager.create(picture); - } else { - upManager.edit(picture); - } - - personManager.save(person); - personController.reloadActivePerson(); - - return true; - } - - private void setData(UserPicture picture, UploadedFile file) { - picture.setName(file.getFileName()); - picture.setFileData(file.getContent()); - picture.setMime(Mime.getByMimeType(file.getContentType())); - } - - public long getMaxFileSize() { - return UserPicture.getSizeLimit(); - } - - public String getFileTypesRE() { - return UserPicture.getAllowedTypesRE(); - } -} diff --git a/java/mss-failsafe/mss/src/main/java/httpauthenticationmechanism/AppIdentityStore.java b/java/mss-failsafe/mss/src/main/java/httpauthenticationmechanism/AppIdentityStore.java deleted file mode 100644 index 4592e1b..0000000 --- a/java/mss-failsafe/mss/src/main/java/httpauthenticationmechanism/AppIdentityStore.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package httpauthenticationmechanism; - -import javax.enterprise.context.ApplicationScoped; -import javax.security.enterprise.credential.CallerOnlyCredential; -import javax.security.enterprise.credential.Credential; -import javax.security.enterprise.credential.UsernamePasswordCredential; -import javax.security.enterprise.identitystore.CredentialValidationResult; -import static javax.security.enterprise.identitystore.CredentialValidationResult.INVALID_RESULT; -import static javax.security.enterprise.identitystore.CredentialValidationResult.NOT_VALIDATED_RESULT; -import javax.security.enterprise.identitystore.IdentityStore; - -import business.user.PersonManager; -import exception.InvalidCredentialException; -import java.util.Set; -import java.util.stream.Collectors; -import javax.ejb.EJB; -import model.person.Person; - -/** - * - * @author Patrick - */ -@ApplicationScoped -public class AppIdentityStore implements IdentityStore { - - @EJB - PersonManager userManager; - - @Override - public int priority() { - return 90; - } - - @Override - public CredentialValidationResult validate(Credential credential) { - try { - - // check if the credential was UsernamePasswordCredential - if (credential instanceof UsernamePasswordCredential) { - String username = ((UsernamePasswordCredential) credential).getCaller(); - String password = ((UsernamePasswordCredential) credential).getPasswordAsString(); - - return validate(this.userManager.getByEmailAndPassword(username, password)); - } - - // check if the credential was CallerOnlyCredential - if (credential instanceof CallerOnlyCredential) { - String username = ((CallerOnlyCredential) credential).getCaller(); - - return validate( - this.userManager.getByEmail(username) - .orElseThrow(InvalidCredentialException::new) - ); - } - - } catch (InvalidCredentialException e) { - return INVALID_RESULT; - } - return NOT_VALIDATED_RESULT; - } - - private CredentialValidationResult validate(Person person) { - Set groups; - - groups = person.getUserGroups().stream() - .map(gr -> gr.toString()) - .collect(Collectors.toSet()); - - return new CredentialValidationResult(person.getEmail(), groups); - } - -} diff --git a/java/mss-failsafe/mss/src/main/java/httpauthenticationmechanism/ApplicationConfig.java b/java/mss-failsafe/mss/src/main/java/httpauthenticationmechanism/ApplicationConfig.java deleted file mode 100644 index 0e03486..0000000 --- a/java/mss-failsafe/mss/src/main/java/httpauthenticationmechanism/ApplicationConfig.java +++ /dev/null @@ -1,85 +0,0 @@ -package httpauthenticationmechanism; - -import business.user.PersonManager; -import javax.annotation.PostConstruct; -import javax.ejb.EJB; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; -import javax.inject.Named; -import javax.security.enterprise.AuthenticationStatus; -import javax.security.enterprise.authentication.mechanism.http.AutoApplySession; -import javax.security.enterprise.authentication.mechanism.http.CustomFormAuthenticationMechanismDefinition; -import javax.security.enterprise.authentication.mechanism.http.HttpAuthenticationMechanism; -import javax.security.enterprise.authentication.mechanism.http.HttpMessageContext; -import javax.security.enterprise.authentication.mechanism.http.LoginToContinue; -import javax.security.enterprise.authentication.mechanism.http.RememberMe; -import javax.security.enterprise.credential.Credential; -import javax.security.enterprise.identitystore.IdentityStore; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - - -/** - * - * @author Patrick - */ -@AutoApplySession // For "Is user already logged-in?" -@RememberMe( - cookieMaxAgeSeconds = 60 * 60 * 24 * 14, // 14 days - cookieSecureOnly = false, // Remove this when login is served over HTTPS. - isRememberMeExpression = "#{self.isRememberMe(httpMessageContext)}" -) -@LoginToContinue( - loginPage = "/index.xhtml", - errorPage = "/error.xhtml", - useForwardToLogin = true -) -@ApplicationScoped -public class ApplicationConfig implements HttpAuthenticationMechanism{ - - final static Logger LOGGER = LogManager.getLogger(ApplicationConfig.class); - - public ApplicationConfig() { - } - - @Inject - private IdentityStore identityStore; - - @Inject - private ManagedPerson managedPerson; - - @EJB - private PersonManager personManager; - - @PostConstruct - private void init(){ - managedPerson.getLogins(); - personManager.demo(); - - System.out.println("PostConstruct DEMO"); - } - - @Override - public AuthenticationStatus validateRequest(HttpServletRequest req, HttpServletResponse res, HttpMessageContext context) { - - Credential credential = context.getAuthParameters().getCredential(); - - if (credential != null) { - return context.notifyContainerAboutLogin(this.identityStore.validate(credential)); - } else { - return context.doNothing(); - } - } - - // this was called on @RememberMe annotations - public Boolean isRememberMe(HttpMessageContext httpMessageContext) { - return httpMessageContext.getAuthParameters().isRememberMe(); - } - - @Override - public void cleanSubject(HttpServletRequest request, HttpServletResponse response, HttpMessageContext httpMessageContext) { - HttpAuthenticationMechanism.super.cleanSubject(request, response, httpMessageContext); - } -} diff --git a/java/mss-failsafe/mss/src/main/java/httpauthenticationmechanism/ManagedPerson.java b/java/mss-failsafe/mss/src/main/java/httpauthenticationmechanism/ManagedPerson.java deleted file mode 100644 index 8cf9081..0000000 --- a/java/mss-failsafe/mss/src/main/java/httpauthenticationmechanism/ManagedPerson.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package httpauthenticationmechanism; - -import java.util.HashSet; -import java.util.Set; -import javax.inject.Named; -import javax.enterprise.context.ApplicationScoped; - -/** - * - * @author Patrick - */ -@Named(value = "managedPerson") -@ApplicationScoped -public class ManagedPerson { - - private Set logins; - - /** - * Creates a new instance of ManagedCustomer - */ - public ManagedPerson() { - } - - public Set getLogins(){ - if (this.logins == null) { - this.logins = new HashSet<>(); - } - - return this.logins; - } - - public void addLogin(String user){ - getLogins().add(user); - } - - public void removeLogin(String user){ - getLogins().remove(user); - } - -} diff --git a/java/mss-failsafe/mss/src/main/java/model/adresses/Address.java b/java/mss-failsafe/mss/src/main/java/model/adresses/Address.java deleted file mode 100644 index 1e5443c..0000000 --- a/java/mss-failsafe/mss/src/main/java/model/adresses/Address.java +++ /dev/null @@ -1,214 +0,0 @@ -package model.adresses; - -import java.util.Objects; -import javax.persistence.MappedSuperclass; -import javax.validation.constraints.NotNull; -import model.AbstractEntity; - -/** - * - * @author Patrick - */ -@MappedSuperclass -public class Address extends AbstractEntity{ - - //Land - @NotNull(message = "Land darf nicht null sein") - private String country; - - //Straßenname - @NotNull(message = "Strasse darf nicht null sein") - private String street; - - //Hausnummer - @NotNull(message = "Hausnummer darf nicht null sein") - private String number; - - //Zusatz - private String extra; - - //PLZ - @NotNull(message = "PLZ darf nicht null sein") - private Integer postnumber; - - //Bundesland - @NotNull(message = "Bundesland darf nicht null sein") - private String county; - - //Ort - @NotNull(message = "Ort darf nicht null sein") - private String place; - - private String contact; - - private String comment; - - public Address() { - } - - public Address(String street, String number, String extra, Integer postnumber, String county, String place) { - this.street = street; - this.number = number; - this.extra = extra; - this.postnumber = postnumber; - this.county = county; - this.place = place; - } - - public Address(String country, String street, String number, String extra, Integer postnumber, String county, String place) { - this.country = country; - this.street = street; - this.number = number; - this.extra = extra; - this.postnumber = postnumber; - this.county = county; - this.place = place; - } - - public Address(String country, String street, String number, String extra, Integer postnumber, String county, String place, String contact, String comment) { - this.country = country; - this.street = street; - this.number = number; - this.extra = extra; - this.postnumber = postnumber; - this.county = county; - this.place = place; - this.contact = contact; - this.comment = comment; - } - - public Address(Address toCopyAddress){ - this.country = toCopyAddress.getCountry(); - this.street = toCopyAddress.getStreet(); - this.number = toCopyAddress.getNumber(); - this.extra = toCopyAddress.getExtra(); - this.postnumber = toCopyAddress.getPostnumber(); - this.county = toCopyAddress.getCounty(); - this.place = toCopyAddress.getPlace(); - this.contact = toCopyAddress.getContact(); - this.comment = toCopyAddress.getComment(); - } - - @Override - public int hashCode() { - int hash = 7; - hash = 83 * hash + Objects.hashCode(this.country); - hash = 83 * hash + Objects.hashCode(this.street); - hash = 83 * hash + Objects.hashCode(this.number); - hash = 83 * hash + Objects.hashCode(this.extra); - hash = 83 * hash + Objects.hashCode(this.postnumber); - hash = 83 * hash + Objects.hashCode(this.county); - hash = 83 * hash + Objects.hashCode(this.place); - hash = 83 * hash + Objects.hashCode(this.contact); - hash = 83 * hash + Objects.hashCode(this.comment); - return hash; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final Address other = (Address) obj; - if (!Objects.equals(this.country, other.country)) { - return false; - } - if (!Objects.equals(this.street, other.street)) { - return false; - } - if (!Objects.equals(this.number, other.number)) { - return false; - } - if (!Objects.equals(this.extra, other.extra)) { - return false; - } - if (!Objects.equals(this.county, other.county)) { - return false; - } - if (!Objects.equals(this.place, other.place)) { - return false; - } - if (!Objects.equals(this.comment, other.comment)) { - return false; - } - return Objects.equals(this.postnumber, other.postnumber); - } - - public String getStreet() { - return street; - } - - public void setStreet(String street) { - this.street = street; - } - - public String getNumber() { - return number; - } - - public void setNumber(String number) { - this.number = number; - } - - public String getExtra() { - return extra; - } - - public void setExtra(String extra) { - this.extra = extra; - } - - public Integer getPostnumber() { - return postnumber; - } - - public void setPostnumber(Integer postnumber) { - this.postnumber = postnumber; - } - - public String getCounty() { - return county; - } - - public void setCounty(String county) { - this.county = county; - } - - public String getPlace() { - return place; - } - - public void setPlace(String place) { - this.place = place; - } - - public String getCountry() { - return country; - } - - public void setCountry(String country) { - this.country = country; - } - - public String getContact() { - return contact; - } - - public void setContact(String contact) { - this.contact = contact; - } - - public String getComment() { - return comment; - } - - public void setComment(String comment) { - this.comment = comment; - } -} diff --git a/java/mss-failsafe/mss/src/main/java/model/company/Location.java b/java/mss-failsafe/mss/src/main/java/model/company/Location.java deleted file mode 100644 index 256971d..0000000 --- a/java/mss-failsafe/mss/src/main/java/model/company/Location.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package model.company; - -import java.util.Set; -import javax.persistence.Entity; -import javax.persistence.ManyToMany; -import javax.persistence.ManyToOne; -import javax.persistence.OneToMany; -import javax.persistence.OneToOne; -import model.AbstractEntity; -import model.adresses.LocationAddress; -import model.customer.Customer; -import model.machine.Machine; -/** - * - * @author patri - */ -@Entity -public class Location extends AbstractEntity{ - - @ManyToOne - private Company company; - - @OneToOne - private LocationAddress address; - - @OneToMany(mappedBy = "location") - private Set machines; - - @ManyToMany - private Set contacts; - - public Location() { - } - - public Company getCompany() { - return company; - } - - public void setCompany(Company company) { - this.company = company; - } - - public LocationAddress getAddress() { - return address; - } - - public void setAddress(LocationAddress address) { - this.address = address; - } - - public Set getMachines() { - return machines; - } - - public void setMachines(Set machines) { - this.machines = machines; - } - - public Set getContacts() { - return contacts; - } - - public void setContacts(Set contacts) { - this.contacts = contacts; - } - - -} diff --git a/java/mss-failsafe/mss/src/main/java/model/customer/Customer.java b/java/mss-failsafe/mss/src/main/java/model/customer/Customer.java deleted file mode 100644 index d943251..0000000 --- a/java/mss-failsafe/mss/src/main/java/model/customer/Customer.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package model.customer; - -import java.util.Set; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.ManyToMany; -import javax.persistence.ManyToOne; -import model.person.Person; -import model.company.Company; -import model.company.Location; - -/** - * - * @author patri - */ -@Entity -public class Customer extends Person{ - - @ManyToOne - private Company company; - - @ManyToMany - private Set locations; - - @Column(nullable = true, length = 210) - private String note; - - public Customer() { - } - - public Customer(Company company) { - this.company = company; - } - - public Company getCompany() { - return company; - } - - public void setCompany(Company company) { - this.company = company; - } - - public Set getLocations() { - return locations; - } - - public void setLocations(Set locations) { - this.locations = locations; - } - - public String getNote() { - return note; - } - - public void setNote(String note) { - this.note = note; - } -} diff --git a/java/mss-failsafe/mss/src/main/java/model/machine/Machine.java b/java/mss-failsafe/mss/src/main/java/model/machine/Machine.java deleted file mode 100644 index efc9561..0000000 --- a/java/mss-failsafe/mss/src/main/java/model/machine/Machine.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package model.machine; - -import javax.persistence.Entity; -import javax.persistence.ManyToOne; -import model.AbstractEntity; -import model.company.Location; - -/** - * - * @author patri - */ -@Entity -public class Machine extends AbstractEntity { - - @ManyToOne - private Location location; - - public Machine() { - } - - public Location getLocation() { - return location; - } - - public void setLocation(Location location) { - this.location = location; - } -} diff --git a/java/mss-failsafe/mss/src/main/java/model/ticket/Comment.java b/java/mss-failsafe/mss/src/main/java/model/ticket/Comment.java deleted file mode 100644 index 9b13e4a..0000000 --- a/java/mss-failsafe/mss/src/main/java/model/ticket/Comment.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package model.ticket; - -import java.time.LocalDateTime; -import java.util.Objects; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.ManyToOne; -import model.AbstractEntity; -import model.person.Person; - -/** - * - * @author Patrick - */ -@Entity -public class Comment extends AbstractEntity implements Comparable { - - @Column(columnDefinition = "longblob") - private String message; - - @ManyToOne - private Person writer; - - private boolean edited; - - @ManyToOne - private Ticket ticket; - - public Comment() { - } - - public Comment(Person writer, String message) { - this.writer = writer; - this.edited = false; - this.message = message; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - edited = true; - } - - public LocalDateTime getLastEditedDate() { - return getChangedDate(); - } - - public boolean isEdited() { - return edited; - } - - public void setEdited(boolean edited) { - this.edited = edited; - setChangedDate(LocalDateTime.now()); - } - - public Ticket getTicket() { - return ticket; - } - - public void setTicket(Ticket ticket) { - this.ticket = ticket; - setChangedDate(LocalDateTime.now()); - } - - public Person getWriter() { - return writer; - } - - @Override - public int hashCode() { - int hash = 7; - hash = 79 * hash + Objects.hashCode(this.message); - hash = 79 * hash + Objects.hashCode(this.writer); - hash = 79 * hash + Objects.hashCode(getCreationDate()); - hash = 79 * hash + Objects.hashCode(getChangedDate()); - hash = 79 * hash + (this.edited ? 1 : 0); - hash = 79 * hash + Objects.hashCode(this.ticket); - return hash; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final Comment other = (Comment) obj; - if (this.edited != other.edited) { - return false; - } - if (!Objects.equals(this.message, other.message)) { - return false; - } - if (!Objects.equals(this.writer, other.writer)) { - return false; - } - if (!Objects.equals(getCreationDate(), other.getCreationDate())) { - return false; - } - if (!Objects.equals(this.ticket, other.ticket)) { - return false; - } - return true; - } - - @Override - public String toString() { - return "Comment{" + "writer=" + writer.getEmail() + ", creationDate=" + getCreationDate() + ", id=" + getId() + ", message="+ message + '}'; - } - - @Override - public int compareTo(Comment c) { - return c.getCreationDate().compareTo(this.getCreationDate()); - } - - -} diff --git a/java/mss-failsafe/mss/src/main/java/model/ticket/FilenameGeneration.java b/java/mss-failsafe/mss/src/main/java/model/ticket/FilenameGeneration.java deleted file mode 100644 index 33c7b38..0000000 --- a/java/mss-failsafe/mss/src/main/java/model/ticket/FilenameGeneration.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package model.ticket; - -/** - * - * @author patri - */ -public enum FilenameGeneration { - INSPEKTIONNR, - MASCHINEDESCRIPTION, - LOCATION; - - @Override - public String toString() { - switch(this){ - case INSPEKTIONNR: - return "inspektionnr"; - case MASCHINEDESCRIPTION: - return "maschinedescription"; - case LOCATION: - return "location"; - } - - return "nothing"; - } - - -} diff --git a/java/mss-failsafe/mss/src/main/java/model/ticket/LocationMachine.java b/java/mss-failsafe/mss/src/main/java/model/ticket/LocationMachine.java deleted file mode 100644 index df43b8e..0000000 --- a/java/mss-failsafe/mss/src/main/java/model/ticket/LocationMachine.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package model.ticket; - -import javax.persistence.Entity; -import javax.persistence.ManyToOne; -import model.AbstractEntity; -import javax.persistence.OneToOne; -import model.machine.Machine; - -/** - * - * @author patri - */ -@Entity -public class LocationMachine extends AbstractEntity{ - @OneToOne - private Machine machine; - - @ManyToOne - private TicketLocation ticketLocation; - - public LocationMachine() { - } - - public Machine getMachine() { - return machine; - } - - public void setMachine(Machine machine) { - this.machine = machine; - } - - public TicketLocation getTicketLocation() { - return ticketLocation; - } - - public void setTicketLocation(TicketLocation ticketLocation) { - this.ticketLocation = ticketLocation; - } - - -} diff --git a/java/mss-failsafe/mss/src/main/java/model/ticket/Ticket.java b/java/mss-failsafe/mss/src/main/java/model/ticket/Ticket.java deleted file mode 100644 index ee12128..0000000 --- a/java/mss-failsafe/mss/src/main/java/model/ticket/Ticket.java +++ /dev/null @@ -1,189 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package model.ticket; - -import java.time.LocalDateTime; -import java.util.List; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.ManyToOne; -import javax.persistence.OneToMany; -import javax.persistence.OneToOne; -import model.AbstractEntity; -import model.adresses.CompanyBillingAddress; -import model.company.Company; -import model.files.Invoice; -import model.files.Report; -import model.person.Person; -import model.person.Token; - -/** - * - * @author patri - */ -@Entity -public class Ticket extends AbstractEntity{ - - @ManyToOne(optional = false) - private Company company; - - @OneToOne - private CompanyBillingAddress billingAddress; - - @Column(nullable = false) - @Enumerated(EnumType.STRING) - private Status status; - - @OneToOne(optional = false) - private Person creator; - - @OneToOne(optional = true) - private Person owner; - - private LocalDateTime startDate; - - private LocalDateTime endDate; - - @OneToMany(mappedBy = "ticket", cascade = CascadeType.ALL) - private List comments; - - private boolean payed; - - @OneToMany(mappedBy = "ticket", orphanRemoval = true, cascade = CascadeType.ALL) - private List tokens; - - @OneToMany(mappedBy = "ticket", cascade = {CascadeType.PERSIST, CascadeType.PERSIST}) - private List reports; - - @OneToMany(mappedBy = "ticket", cascade = {CascadeType.PERSIST, CascadeType.PERSIST}) - private List invoices; - - @OneToMany(mappedBy = "ticket", cascade = {CascadeType.PERSIST, CascadeType.PERSIST}) - private List locations; - - @Column(nullable = false, length = 200) - private String filenameGeneration; - - public Ticket() { - } - - public CompanyBillingAddress getBillingAddress() { - return billingAddress; - } - - public void setBillingAddress(CompanyBillingAddress billingAddress) { - this.billingAddress = billingAddress; - } - - public LocalDateTime getStartDate() { - return startDate; - } - - public void setStartDate(LocalDateTime startDate) { - this.startDate = startDate; - } - - public LocalDateTime getEndDate() { - return endDate; - } - - public void setEndDate(LocalDateTime endDate) { - this.endDate = endDate; - } - - public Company getCompany() { - return company; - } - - public void setCompany(Company company) { - this.company = company; - } - - public List getLocations() { - return locations; - } - - public void setLocations(List locations) { - this.locations = locations; - } - - public Status getStatus() { - return status; - } - - public void setStatus(Status status) { - this.status = status; - } - - public Person getCreator() { - return creator; - } - - public void setCreator(Person creator) { - this.creator = creator; - } - - public Person getOwner() { - return owner; - } - - public void setOwner(Person owner) { - this.owner = owner; - } - - public List getComments() { - return comments; - } - - public void setComments(List comments) { - this.comments = comments; - } - - public boolean isPayed() { - return payed; - } - - public void setPayed(boolean payed) { - this.payed = payed; - } - - public List getTokens() { - return tokens; - } - - public void setTokens(List tokens) { - this.tokens = tokens; - } - - public List getReports() { - return reports; - } - - public void setReports(List reports) { - this.reports = reports; - } - - public List getInvoices() { - return invoices; - } - - public void setInvoices(List invoices) { - this.invoices = invoices; - } - - public String getFilenameGeneration() { - return filenameGeneration; - } - - public void setFilenameGeneration(String filenameGeneration) { - this.filenameGeneration = filenameGeneration; - } - - -} diff --git a/java/mss-failsafe/mss/src/main/java/model/ticket/TicketLocation.java b/java/mss-failsafe/mss/src/main/java/model/ticket/TicketLocation.java deleted file mode 100644 index e612223..0000000 --- a/java/mss-failsafe/mss/src/main/java/model/ticket/TicketLocation.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package model.ticket; - -import javax.persistence.Entity; -import javax.persistence.ManyToOne; -import javax.persistence.OneToOne; -import model.AbstractEntity; -import model.company.Location; -import java.util.List; -import javax.persistence.OneToMany; - -/** - * - * @author patri - */ -@Entity -public class TicketLocation extends AbstractEntity{ - @ManyToOne - private Ticket ticket; - - @OneToOne - private Location location; - - @OneToMany(mappedBy = "ticketLocation") - private List machines; - - - public TicketLocation() { - } - - public Ticket getTicket() { - return ticket; - } - - public void setTicket(Ticket ticket) { - this.ticket = ticket; - } - - public Location getLocation() { - return location; - } - - public void setLocation(Location location) { - this.location = location; - } - - public List getMachines() { - return machines; - } - - public void setMachines(List machines) { - this.machines = machines; - } -} diff --git a/java/mss-failsafe/mss/src/main/webapp/WEB-INF/beans.xml b/java/mss-failsafe/mss/src/main/webapp/WEB-INF/beans.xml deleted file mode 100644 index 93000aa..0000000 --- a/java/mss-failsafe/mss/src/main/webapp/WEB-INF/beans.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - \ No newline at end of file diff --git a/java/mss-failsafe/mss/src/main/webapp/WEB-INF/jboss-app.xml b/java/mss-failsafe/mss/src/main/webapp/WEB-INF/jboss-app.xml deleted file mode 100644 index a3ea92f..0000000 --- a/java/mss-failsafe/mss/src/main/webapp/WEB-INF/jboss-app.xml +++ /dev/null @@ -1,6 +0,0 @@ - - mss-failsafe - diff --git a/java/mss-failsafe/mss/src/main/webapp/admin/welcome.xhtml b/java/mss-failsafe/mss/src/main/webapp/admin/welcome.xhtml deleted file mode 100644 index c4393e2..0000000 --- a/java/mss-failsafe/mss/src/main/webapp/admin/welcome.xhtml +++ /dev/null @@ -1,14 +0,0 @@ - - - - Willkommen #{personController.activeUser.call.toString()} #{personController.activeUser.lastname} - - - -

Willkommen #{personController.activeUser.call.toString()} #{personController.activeUser.lastname}

- -
- \ No newline at end of file diff --git a/java/mss-failsafe/mss/src/main/webapp/index.xhtml b/java/mss-failsafe/mss/src/main/webapp/index.xhtml deleted file mode 100644 index 061d8d2..0000000 --- a/java/mss-failsafe/mss/src/main/webapp/index.xhtml +++ /dev/null @@ -1,35 +0,0 @@ - - - Login Testpage - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/java/mss-failsafe/mss/src/main/webapp/resources/layout/user/template.xhtml b/java/mss-failsafe/mss/src/main/webapp/resources/layout/user/template.xhtml deleted file mode 100644 index 6b9e19a..0000000 --- a/java/mss-failsafe/mss/src/main/webapp/resources/layout/user/template.xhtml +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - - - - <ui:insert name="title"> - Please add a Title! - </ui:insert> - - - - - - -
-
-
- - - -
-
- - - - - - - - - - - - - - - - -
-
-
-
- - - - - - - - - - -
-
-
- - - -
-
- Content -
-
-
-
- Bottom -
- -
-
-
- diff --git a/java/mss-failsafe/mss/src/main/webapp/user/companies.xhtml b/java/mss-failsafe/mss/src/main/webapp/user/companies.xhtml deleted file mode 100644 index 6871385..0000000 --- a/java/mss-failsafe/mss/src/main/webapp/user/companies.xhtml +++ /dev/null @@ -1,19 +0,0 @@ - - - Firmen - - - - Willkommen zuhause - - - - - - - \ No newline at end of file diff --git a/java/mss-failsafe/mss/src/main/webapp/user/profile.xhtml b/java/mss-failsafe/mss/src/main/webapp/user/profile.xhtml deleted file mode 100644 index 38f789b..0000000 --- a/java/mss-failsafe/mss/src/main/webapp/user/profile.xhtml +++ /dev/null @@ -1,110 +0,0 @@ - - - Willkommen #{personController.activeUser.call.toString()} #{personController.activeUser.lastname} - - - -
-
- -
-
- -
- -
-
-
- - -
-
-
- -
- -
- - -
-
-
- -
- -
- - -
-
-
- -
- -
- - -
-
-
- -
-
-
-
-
-
- - -
-
-
- -
- -
- - -
-
-
- -
-
- - -
-
-
- -
- -
- - -
-
-
- -
-
-
-
-
- - - - - -
\ No newline at end of file diff --git a/java/mss-failsafe/mssfailsafe.datalayer/pom.xml b/java/mss-failsafe/mssfailsafe.datalayer/pom.xml deleted file mode 100644 index f8faf5b..0000000 --- a/java/mss-failsafe/mssfailsafe.datalayer/pom.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - 4.0.0 - - plate.software - mss-failsafe - 1.0-SNAPSHOT - - mssfailsafe.datalayer - jar - - 11 - 11 - ${project.build.directory}/endorsed - UTF-8 - false - 8.0 - - - - - plate.software - userdata - 1.0-SNAPSHOT - - - javax - javaee-api - ${jakartaee} - provided - - - org.apache.pdfbox - pdfbox - 2.0.13 - - - - org.apache.logging.log4j - log4j-api - 2.14.1 - - - org.apache.logging.log4j - log4j-core - 2.14.1 - - - plate.software - userManagement - 1.0-SNAPSHOT - classes - - - \ No newline at end of file diff --git a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/adresses/LocationAddress.java b/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/adresses/LocationAddress.java deleted file mode 100644 index 43a1f95..0000000 --- a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/adresses/LocationAddress.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package model.adresses; - -import javax.persistence.Entity; -import javax.persistence.OneToOne; -import model.company.Location; - -/** - * - * @author patri - */ -@Entity -public class LocationAddress extends Address { - - @OneToOne - private Location location; - - public LocationAddress() { - } - - public Location getLocation() { - return location; - } - - public void setLocation(Location location) { - this.location = location; - } -} diff --git a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/company/Company.java b/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/company/Company.java deleted file mode 100644 index ccb40d6..0000000 --- a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/company/Company.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package model.company; - -import java.util.Set; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.OneToMany; -import model.AbstractEntity; -import model.adresses.CompanyBillingAddress; -import model.customer.Customer; - -/** - * - * @author patri - */ -@Entity -public class Company extends AbstractEntity { - - public static final String FIND_BY_NAME = "Company.findByName"; - public static final String FIND_BY_STEUERID = "Company.findBySteuerID"; - public static final String FIND_BY_UMSATZSTEUERID = "Company.findByUmsatzsteuerID"; - public static final String FIND_BY_CUSTOMER = "Company.findByCustomer"; - public static final String FIND_BY_ADDRESS = "Company.findByAddress"; - public static final String FIND_BY_DELIVERYADDRESS = "Company.findByLocation"; - - @Column(unique = true, nullable = false) - private String name; - - @Column(unique = true, nullable = true) - private String steuerNr; - - @Column(unique = true, nullable = true) - private String umsatzSteuerID; - - @Column(unique = true, nullable = true) - private String kundenNr; - - @Column(unique = false, nullable = true) - private String headerInspection; - - @Column(unique = false, nullable = true) - private String headerService; - - @Column(unique = false, nullable = false) - @Enumerated(EnumType.ORDINAL) - private Status status; - - @OneToMany(mappedBy = "company", cascade = CascadeType.ALL) - private Set addresses; - - @OneToMany(mappedBy = "company", cascade = CascadeType.ALL) - private Set locations; - - @OneToMany(mappedBy = "company", cascade = { - CascadeType.MERGE, - CascadeType.REFRESH - }) - private Set customers; - - public Company() { - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getSteuerNr() { - return steuerNr; - } - - public void setSteuerNr(String steuerNr) { - this.steuerNr = steuerNr; - } - - public String getUmsatzSteuerID() { - return umsatzSteuerID; - } - - public void setUmsatzSteuerID(String umsatzSteuerID) { - this.umsatzSteuerID = umsatzSteuerID; - } - - public String getKundenNr() { - return kundenNr; - } - - public void setKundenNr(String kundenNr) { - this.kundenNr = kundenNr; - } - - public String getHeaderInspection() { - return headerInspection; - } - - public void setHeaderInspection(String headerInspection) { - this.headerInspection = headerInspection; - } - - public String getHeaderService() { - return headerService; - } - - public void setHeaderService(String headerService) { - this.headerService = headerService; - } - - public Status getStatus() { - return status; - } - - public void setStatus(Status status) { - this.status = status; - } - - public Set getAddresses() { - return addresses; - } - - public void setAddresses(Set addresses) { - this.addresses = addresses; - } - - public Set getLocations() { - return locations; - } - - public void setLocations(Set locations) { - this.locations = locations; - } - - public Set getCustomers() { - return customers; - } - - public void setCustomers(Set customers) { - this.customers = customers; - } - - -} diff --git a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/company/Location.java b/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/company/Location.java deleted file mode 100644 index 256971d..0000000 --- a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/company/Location.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package model.company; - -import java.util.Set; -import javax.persistence.Entity; -import javax.persistence.ManyToMany; -import javax.persistence.ManyToOne; -import javax.persistence.OneToMany; -import javax.persistence.OneToOne; -import model.AbstractEntity; -import model.adresses.LocationAddress; -import model.customer.Customer; -import model.machine.Machine; -/** - * - * @author patri - */ -@Entity -public class Location extends AbstractEntity{ - - @ManyToOne - private Company company; - - @OneToOne - private LocationAddress address; - - @OneToMany(mappedBy = "location") - private Set machines; - - @ManyToMany - private Set contacts; - - public Location() { - } - - public Company getCompany() { - return company; - } - - public void setCompany(Company company) { - this.company = company; - } - - public LocationAddress getAddress() { - return address; - } - - public void setAddress(LocationAddress address) { - this.address = address; - } - - public Set getMachines() { - return machines; - } - - public void setMachines(Set machines) { - this.machines = machines; - } - - public Set getContacts() { - return contacts; - } - - public void setContacts(Set contacts) { - this.contacts = contacts; - } - - -} diff --git a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/company/Status.java b/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/company/Status.java deleted file mode 100644 index 5d160cf..0000000 --- a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/company/Status.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package model.company; - -import java.util.Locale; - -/** - * - * @author patri - */ -public enum Status { - ACTIVE, - INACTIVE; - - private Status() { - } - - @Override - public String toString() { - switch(this){ - case ACTIVE: - return "aktiv"; - case INACTIVE: - return "inaktiv"; - default: - return ""; - } - } - - public String toLanguageString(Locale locale){ - if (locale == null ||locale.equals(Locale.GERMAN) || locale.equals(Locale.GERMANY)) { - return getGerman(); - } - - if (locale.equals(Locale.ENGLISH)) { - getEnglish(); - } - - return ""; - } - - private String getGerman() { - return toString(); - } - - private String getEnglish(){ - switch(this){ - case ACTIVE: - return "active"; - case INACTIVE: - return "inactive"; - default: - return ""; - } - } -} diff --git a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/customer/Customer.java b/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/customer/Customer.java deleted file mode 100644 index d943251..0000000 --- a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/customer/Customer.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package model.customer; - -import java.util.Set; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.ManyToMany; -import javax.persistence.ManyToOne; -import model.person.Person; -import model.company.Company; -import model.company.Location; - -/** - * - * @author patri - */ -@Entity -public class Customer extends Person{ - - @ManyToOne - private Company company; - - @ManyToMany - private Set locations; - - @Column(nullable = true, length = 210) - private String note; - - public Customer() { - } - - public Customer(Company company) { - this.company = company; - } - - public Company getCompany() { - return company; - } - - public void setCompany(Company company) { - this.company = company; - } - - public Set getLocations() { - return locations; - } - - public void setLocations(Set locations) { - this.locations = locations; - } - - public String getNote() { - return note; - } - - public void setNote(String note) { - this.note = note; - } -} diff --git a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/files/FileDB.java b/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/files/FileDB.java deleted file mode 100644 index f2f80d6..0000000 --- a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/files/FileDB.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package model.files; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.Inheritance; -import javax.persistence.InheritanceType; -import javax.persistence.Lob; -import model.AbstractEntity; - -/** - * - * @author patri - */ -@Entity -@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) -public class FileDB extends AbstractEntity{ - @Column(nullable = false, length = 100) - private String name; - - @Enumerated(EnumType.STRING) - private Mime mime; - - @Lob - private byte[] fileData; - - public FileDB() { - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public byte[] getFileData() { - return fileData; - } - - public void setFileData(byte[] fileData) { - this.fileData = fileData; - } - - public Mime getMime() { - return mime; - } - - public void setMime(Mime mime) { - this.mime = mime; - } -} diff --git a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/files/Invoice.java b/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/files/Invoice.java deleted file mode 100644 index 2fd8489..0000000 --- a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/files/Invoice.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package model.files; - -import javax.persistence.Entity; -import javax.persistence.OneToMany; -import model.ticket.Ticket; - -/** - * - * @author patri - */ -@Entity -public class Invoice extends FileDB { - @OneToMany - private Ticket ticket; - - public Invoice() { - } - - public Invoice(Ticket ticket) { - this.ticket = ticket; - } - - public Ticket getTicket() { - return ticket; - } - - public void setTicket(Ticket ticket) { - this.ticket = ticket; - } -} diff --git a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/files/Mime.java b/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/files/Mime.java deleted file mode 100644 index a7d9960..0000000 --- a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/files/Mime.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package model.files; - -/** - * - * @author patri - */ -public enum Mime { - AAC(".aac", "AAC audio", "audio/aac"), - ABW(".abw", "AbiWord document", "application/x-abiword"), - ARC(".arc", "Archive document (multiple files embedded)", "application/x-freearc"), - AVI(".avi", "AVI: Audio Video Interleave", "video/x-msvideo"), - AZW(".azw", "Amazon Kindle eBook format", "application/vnd.amazon.ebook"), - BIN(".bin", "Any kind of binary data", "application/octet-stream"), - BMP(".bmp", "Windows OS/2 Bitmap Graphics", "image/bmp"), - BZ(".bz", "BZip archive", "application/x-bzip"), - BZ2(".bz2", "BZip2 archive", "application/x-bzip2"), - CDA(".cda", "CD audio", "application/x-cdf"), - CSH(".csh", "C-Shell script", "application/x-csh"), - CSS(".css", "Cascading Style Sheets (CSS)", "text/css"), - CSV(".csv", "Comma-separated values (CSV", "text/csv"), - DOC(".doc", "Microsoft Word", "application/msword"), - DOCX(".docx", "Microsoft Word (OpenXML)", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"), - EOT(".eot", "MS Embedded OpenType fonts", "application/vnd.ms-fontobject"), - EPUB(".epub", "Electronic publication (EPUB)", "application/epub+zip"), - GZ(".gz", "GZip Compressed Archive", "application/gzip"), - GIF(".gif", "Graphics Interchange Format (GIF)", "image/gif"), - HTM(".htm", "HyperText Markup Language (HTML)", "text/html"), - HTML(".html", "HyperText Markup Language (HTML)", "text/html"), - ICO(".ico", "Icon format", "image/vnd.microsoft.icon"), - ICS(".ics", "iCalendar format", "text/calendar"), - JAR(".jar", "Java Archive (JAR)", "application/java-archive"), - JPG(".jpg", "JPEG images", "image/jpeg"), - JPEG(".jpeg", "JPEG images", "image/jpeg"), - JS(".js", "JavaScript", "text/javascript"), - JSON(".json", "JSON format", "application/json"), - JSONLD(".jsonld", "JSON-LD format", "application/ld+json"), - MID(".mid", "Musical Instrument Digital Interface (MIDI)", "audio/midi"), - MIDI(".midi", "Musical Instrument Digital Interface (MIDI)", "audio/midi"), - MJS(".mjs", "JavaScript module", "text/javascript"), - MP3(".mp3", "MP3 audio", "audio/mpeg"), - MP4(".mp4", "MP4 video", "video/mp4"), - MPEG(".mpeg", "MPEG Video", "video/mpeg"), - MPKG(".mpkg", "Apple Installer Package", "application/vnd.apple.installer+xml"), - ODP(".odp", "OpenDocument presentation document", "application/vnd.oasis.opendocument.presentation"), - ODS(".ods", "OpenDocument spreadsheet document", "application/vnd.oasis.opendocument.spreadsheet"), - ODT(".odt", "OpenDocument text document", "application/vnd.oasis.opendocument.text"), - OGA(".oga", "OGG audio", "audio/ogg"), - OGV(".ogv", "OGG video", "video/ogg"), - OGX(".ogx", "OGG", "application/ogg"), - OPUUS(".opus", "Opus audio", "audio/opus"), - OTF(".otf", "OpenType font", "font/otf"), - PNG(".png", "Portable Network Graphics", "image/png"), - PDF(".pdf", "Adobe Portable Document Format (PDF)", "application/pdf"), - PHP(".php", "Hypertext Preprocessor (Personal Home Page)", "application/x-httpd-php"), - PPT(".ppt", "Microsoft PowerPoint", "application/vnd.ms-powerpoint"), - PPTX(".pptx", "Microsoft PowerPoint (OpenXML)", "application/vnd.openxmlformats-officedocument.presentationml.presentation"), - RAR(".rar", "RAR archive", "application/vnd.rar"), - RTF(".rtf", "Rich Text Format (RTF)", "application/rtf"), - SH(".sh", "Bourne shell script", "application/x-sh"), - SVG(".svg", "Scalable Vector Graphics (SVG)", "image/svg+xml"), - SWF(".swf", "Small web format (SWF) or Adobe Flash document", "application/x-shockwave-flash"), - TAR(".tar", "Tape Archive (TAR)", "application/x-tar"), - TIF(".tif", "Tagged Image File Format (TIFF)", "image/tiff"), - TIFF(".tiff", "Tagged Image File Format (TIFF)", "image/tiff"), - TS(".ts", "MPEG transport stream", "video/mp2t"), - TTF(".ttf", "TrueType Font", "font/ttf"), - TXT(".txt", "Text, (generally ASCII or ISO 8859-n)", "text/plain"), - VSD(".vsd", "Microsoft Visio", "application/vnd.visio"), - WAV(".wav", "Waveform Audio Format", "audio/wav"), - WEBA(".weba", "WEBM audio", "audio/webm"), - WEBM(".webm", "WEBM video", "video/webm"), - WEBP(".webp", "WEBP image", "image/webp"), - WOFF(".woff", "Web Open Font Format (WOFF)", "font/woff"), - WOFF2(".woff2", "Web Open Font Format (WOFF)", "font/woff2"), - XHTML(".xhtml", "XHTML", "application/xhtml+xml"), - XLS(".xls", "Microsoft Excel", "application/vnd.ms-excel"), - XLSX(".xlsx", "Microsoft Excel (OpenXML)", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"), - XML(".xml", "XML", "application/xml"), - XUL(".xul", "XUL", "application/vnd.mozilla.xul+xml"), - ZIP(".zip", "ZIP archive", "application/zip"), - GP3V(".3gp", "3GPP audio/video container", "video/3gpp"), - GP3A(".3gp", "3GPP audio/video container", "audio/3gpp"), - G23V(".3g2", "3GPP2 audio/video container", "video/3gpp2"), - G23A(".3g2", "3GPP2 audio/video container", "audio/3gpp2"), - Z7(".7z", "7-zip archive", "application/x-7z-compressed"); - - private final String extension; - private final String kindOfDocument; - private final String mimeType; - - private Mime(String extension, String kindOfDocument, String mimeType) { - this.extension = extension; - this.kindOfDocument = kindOfDocument; - this.mimeType = mimeType; - } - - public String getExtension() { - return extension; - } - - public String getKindOfDocument() { - return kindOfDocument; - } - - public String getMimeType() { - return mimeType; - } -} diff --git a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/files/Report.java b/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/files/Report.java deleted file mode 100644 index ce94af5..0000000 --- a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/files/Report.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package model.files; - -import javax.persistence.Entity; -import javax.persistence.OneToMany; -import model.ticket.Ticket; - -/** - * - * @author patri - */ -@Entity -public class Report extends FileDB{ - - @OneToMany - private Ticket ticket; - - public Report() { - } - - public Ticket getTicket() { - return ticket; - } - - public void setTicket(Ticket ticket) { - this.ticket = ticket; - } -} diff --git a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/machine/Machine.java b/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/machine/Machine.java deleted file mode 100644 index efc9561..0000000 --- a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/machine/Machine.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package model.machine; - -import javax.persistence.Entity; -import javax.persistence.ManyToOne; -import model.AbstractEntity; -import model.company.Location; - -/** - * - * @author patri - */ -@Entity -public class Machine extends AbstractEntity { - - @ManyToOne - private Location location; - - public Machine() { - } - - public Location getLocation() { - return location; - } - - public void setLocation(Location location) { - this.location = location; - } -} diff --git a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/ticket/FilenameGeneration.java b/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/ticket/FilenameGeneration.java deleted file mode 100644 index 33c7b38..0000000 --- a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/ticket/FilenameGeneration.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package model.ticket; - -/** - * - * @author patri - */ -public enum FilenameGeneration { - INSPEKTIONNR, - MASCHINEDESCRIPTION, - LOCATION; - - @Override - public String toString() { - switch(this){ - case INSPEKTIONNR: - return "inspektionnr"; - case MASCHINEDESCRIPTION: - return "maschinedescription"; - case LOCATION: - return "location"; - } - - return "nothing"; - } - - -} diff --git a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/ticket/Ticket.java b/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/ticket/Ticket.java deleted file mode 100644 index ea18116..0000000 --- a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/ticket/Ticket.java +++ /dev/null @@ -1,192 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package model.ticket; - -import java.time.LocalDateTime; -import java.util.List; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.OneToMany; -import javax.persistence.OneToOne; -import model.AbstractEntity; -import model.adresses.CompanyBillingAddress; -import model.company.Company; -import model.company.Location; -import model.files.Invoice; -import model.files.Report; -import model.person.Person; -import model.person.Token; - -/** - * - * @author patri - */ -@Entity -public class Ticket extends AbstractEntity{ - - @Column(nullable = false) - @OneToOne - private Company company; - - @OneToOne - private CompanyBillingAddress billingAddress; - - @OneToMany - private List locations; - - @Column(nullable = false) - @Enumerated(EnumType.STRING) - private Status status; - - @Column(nullable = false) - @OneToOne - private Person creator; - - @Column(nullable = true) - @OneToOne - private Person owner; - - private LocalDateTime startDate; - - private LocalDateTime endDate; - - @OneToMany(mappedBy = "ticket", cascade = CascadeType.ALL) - private List comments; - - private boolean payed; - - @OneToMany(mappedBy = "ticket", orphanRemoval = true, cascade = CascadeType.ALL) - private List tokens; - - @OneToMany(mappedBy = "ticket", cascade = {CascadeType.PERSIST, CascadeType.PERSIST}) - private List reports; - - @OneToMany(mappedBy = "ticket", cascade = {CascadeType.PERSIST, CascadeType.PERSIST}) - private List invoices; - - @Column(nullable = false, length = 200) - private String filenameGeneration; - - public Ticket() { - } - - public CompanyBillingAddress getBillingAddress() { - return billingAddress; - } - - public void setBillingAddress(CompanyBillingAddress billingAddress) { - this.billingAddress = billingAddress; - } - - public LocalDateTime getStartDate() { - return startDate; - } - - public void setStartDate(LocalDateTime startDate) { - this.startDate = startDate; - } - - public LocalDateTime getEndDate() { - return endDate; - } - - public void setEndDate(LocalDateTime endDate) { - this.endDate = endDate; - } - - public Company getCompany() { - return company; - } - - public void setCompany(Company company) { - this.company = company; - } - - public List getLocations() { - return locations; - } - - public void setLocations(List locations) { - this.locations = locations; - } - - public Status getStatus() { - return status; - } - - public void setStatus(Status status) { - this.status = status; - } - - public Person getCreator() { - return creator; - } - - public void setCreator(Person creator) { - this.creator = creator; - } - - public Person getOwner() { - return owner; - } - - public void setOwner(Person owner) { - this.owner = owner; - } - - public List getComments() { - return comments; - } - - public void setComments(List comments) { - this.comments = comments; - } - - public boolean isPayed() { - return payed; - } - - public void setPayed(boolean payed) { - this.payed = payed; - } - - public List getTokens() { - return tokens; - } - - public void setTokens(List tokens) { - this.tokens = tokens; - } - - public List getReports() { - return reports; - } - - public void setReports(List reports) { - this.reports = reports; - } - - public List getInvoices() { - return invoices; - } - - public void setInvoices(List invoices) { - this.invoices = invoices; - } - - public String getFilenameGeneration() { - return filenameGeneration; - } - - public void setFilenameGeneration(String filenameGeneration) { - this.filenameGeneration = filenameGeneration; - } - - -} diff --git a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/ticket/TicketLocation.java b/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/ticket/TicketLocation.java deleted file mode 100644 index 84ce8de..0000000 --- a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/ticket/TicketLocation.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package model.ticket; - -import javax.persistence.Entity; -import javax.persistence.ManyToOne; -import javax.persistence.OneToOne; -import model.AbstractEntity; -import model.company.Location; -import java.util.List; - -/** - * - * @author patri - */ -@Entity -public class TicketLocation extends AbstractEntity{ - @ManyToOne - private Ticket ticket; - - @OneToOne - private Location location; - - - private List machines; - - - public TicketLocation() { - } - - -} diff --git a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/ticket/TicketMachine.java b/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/ticket/TicketMachine.java deleted file mode 100644 index 16bcde8..0000000 --- a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/ticket/TicketMachine.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package model.ticket; - -import javax.persistence.Entity; -import model.AbstractEntity; -import javax.persistence.ManyToOne; -import javax.persistence.OneToOne; -import model.machine.Machine; - -/** - * - * @author patri - */ -@Entity -public class TicketMachine extends AbstractEntity{ - @ManyToOne - private Ticket ticket; - - @OneToOne - private Machine machine; - - public TicketMachine() { - } - - -} diff --git a/java/mss-failsafe/mssfailsafe.datalayer/src/main/resources/META-INF/persistence.xml b/java/mss-failsafe/mssfailsafe.datalayer/src/main/resources/META-INF/persistence.xml deleted file mode 100644 index 94bd1de..0000000 --- a/java/mss-failsafe/mssfailsafe.datalayer/src/main/resources/META-INF/persistence.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - java:/mss-failsave - model.company.Location - model.adresses.LocationAdress - model.machine.Machine - - - - - diff --git a/java/mss-failsafe/mssfailsafe.datalayer/target/classes/META-INF/persistence.xml b/java/mss-failsafe/mssfailsafe.datalayer/target/classes/META-INF/persistence.xml deleted file mode 100644 index 94bd1de..0000000 --- a/java/mss-failsafe/mssfailsafe.datalayer/target/classes/META-INF/persistence.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - java:/mss-failsave - model.company.Location - model.adresses.LocationAdress - model.machine.Machine - - - - - diff --git a/java/mss-failsafe/mssfailsafeWeblayer/nb-configuration.xml b/java/mss-failsafe/mssfailsafeWeblayer/nb-configuration.xml deleted file mode 100644 index a7a084a..0000000 --- a/java/mss-failsafe/mssfailsafeWeblayer/nb-configuration.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - 1.8-web - WildFly - ide - - diff --git a/java/mss-failsafe/mssfailsafeWeblayer/pom.xml b/java/mss-failsafe/mssfailsafeWeblayer/pom.xml deleted file mode 100644 index ce6c161..0000000 --- a/java/mss-failsafe/mssfailsafeWeblayer/pom.xml +++ /dev/null @@ -1,132 +0,0 @@ - - - 4.0.0 - - mss-failsafe - plate.software - 1.0-SNAPSHOT - - plate.software - mssfailsafeWeblayer - 1.0-SNAPSHOT - war - mssfailsafeWeblayer-1.0-SNAPSHOT - - - 1.8 - 1.8 - ${project.build.directory}/endorsed - UTF-8 - false - 8.0 - - - - - plate.software - userdata - 1.0-SNAPSHOT - - - - javax - javaee-api - ${jakartaee} - provided - - - org.apache.pdfbox - pdfbox - 2.0.13 - - - org.glassfish.soteria - javax.security.enterprise - 1.0 - - - org.omnifaces - omnifaces - 3.11.1 - - - - javax - javaee-web-api - 8.0 - provided - - - org.glassfish - javax.faces - 2.3.0 - provided - - - org.apache.logging.log4j - log4j-api - 2.14.1 - - - org.apache.logging.log4j - log4j-core - 2.14.1 - - - - org.primefaces - primefaces - 10.0.0 - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - 1.8 - 1.8 - - ${endorsed.dir} - - - - - org.apache.maven.plugins - maven-war-plugin - 2.3 - - false - - - - org.apache.maven.plugins - maven-dependency-plugin - 2.6 - - - validate - - copy - - - ${endorsed.dir} - true - - - javax - javaee-api - ${jakartaee} - jar - - - - - - - - - diff --git a/java/mss-failsafe/mssfailsafeWeblayer/src/main/java/plate/software/mssfailsafeweblayer/JAXRSConfiguration.java b/java/mss-failsafe/mssfailsafeWeblayer/src/main/java/plate/software/mssfailsafeweblayer/JAXRSConfiguration.java deleted file mode 100644 index dd2f9da..0000000 --- a/java/mss-failsafe/mssfailsafeWeblayer/src/main/java/plate/software/mssfailsafeweblayer/JAXRSConfiguration.java +++ /dev/null @@ -1,13 +0,0 @@ -package plate.software.mssfailsafeweblayer; - -import javax.ws.rs.ApplicationPath; -import javax.ws.rs.core.Application; - -/** - * Configures JAX-RS for the application. - * @author Juneau - */ -@ApplicationPath("resources") -public class JAXRSConfiguration extends Application { - -} diff --git a/java/mss-failsafe/mssfailsafeWeblayer/src/main/java/plate/software/mssfailsafeweblayer/resources/JavaEE8Resource.java b/java/mss-failsafe/mssfailsafeWeblayer/src/main/java/plate/software/mssfailsafeweblayer/resources/JavaEE8Resource.java deleted file mode 100644 index 8fceb5a..0000000 --- a/java/mss-failsafe/mssfailsafeWeblayer/src/main/java/plate/software/mssfailsafeweblayer/resources/JavaEE8Resource.java +++ /dev/null @@ -1,20 +0,0 @@ -package plate.software.mssfailsafeweblayer.resources; - -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.core.Response; - -/** - * - * @author - */ -@Path("javaee8") -public class JavaEE8Resource { - - @GET - public Response ping(){ - return Response - .ok("ping") - .build(); - } -} diff --git a/java/mss-failsafe/mssfailsafeWeblayer/src/main/resources/META-INF/persistence.xml b/java/mss-failsafe/mssfailsafeWeblayer/src/main/resources/META-INF/persistence.xml deleted file mode 100644 index f9d1b69..0000000 --- a/java/mss-failsafe/mssfailsafeWeblayer/src/main/resources/META-INF/persistence.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/java/mss-failsafe/mssfailsafeWeblayer/src/main/webapp/WEB-INF/jboss-app.xml b/java/mss-failsafe/mssfailsafeWeblayer/src/main/webapp/WEB-INF/jboss-app.xml deleted file mode 100644 index a3ea92f..0000000 --- a/java/mss-failsafe/mssfailsafeWeblayer/src/main/webapp/WEB-INF/jboss-app.xml +++ /dev/null @@ -1,6 +0,0 @@ - - mss-failsafe - diff --git a/java/mss-failsafe/mssfailsafeWeblayer/src/main/webapp/WEB-INF/jboss-web.xml b/java/mss-failsafe/mssfailsafeWeblayer/src/main/webapp/WEB-INF/jboss-web.xml deleted file mode 100644 index c09c38f..0000000 --- a/java/mss-failsafe/mssfailsafeWeblayer/src/main/webapp/WEB-INF/jboss-web.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - /mssfailsafeWeblayer-1.0-SNAPSHOT - jaspitest - \ No newline at end of file diff --git a/java/mss-failsafe/mssfailsafeWeblayer/src/main/webapp/WEB-INF/web.xml b/java/mss-failsafe/mssfailsafeWeblayer/src/main/webapp/WEB-INF/web.xml deleted file mode 100644 index 1b91148..0000000 --- a/java/mss-failsafe/mssfailsafeWeblayer/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,90 +0,0 @@ - - - - /index.xhtml - - - - 401 - /error.xhtml - - - - 403 - /error.xhtml - - - - authorise - /user/* - GET - POST - TRACE - HEAD - DELETE - CONNECT - OPTIONS - PUT - - - ADMIN - USER - - - - - - authorise - /admin/* - GET - POST - TRACE - HEAD - DELETE - CONNECT - OPTIONS - PUT - - - ADMIN - - - - - Normal User which got invited - USER - - - Admin user who can change entries, invite new domains and more.. - ADMIN - - - javax.faces.PROJECT_STAGE - Development - - - Faces Servlet - javax.faces.webapp.FacesServlet - 1 - - - Faces Servlet - *.xhtml - - - - 30 - - - true - - - COOKIE - - - diff --git a/java/mss-failsafe/mssfailsafeWeblayer/src/main/webapp/admin/welcome.xhtml b/java/mss-failsafe/mssfailsafeWeblayer/src/main/webapp/admin/welcome.xhtml deleted file mode 100644 index c4393e2..0000000 --- a/java/mss-failsafe/mssfailsafeWeblayer/src/main/webapp/admin/welcome.xhtml +++ /dev/null @@ -1,14 +0,0 @@ - - - - Willkommen #{personController.activeUser.call.toString()} #{personController.activeUser.lastname} - - - -

Willkommen #{personController.activeUser.call.toString()} #{personController.activeUser.lastname}

- -
- \ No newline at end of file diff --git a/java/mss-failsafe/mssfailsafeWeblayer/src/main/webapp/error.xhtml b/java/mss-failsafe/mssfailsafeWeblayer/src/main/webapp/error.xhtml deleted file mode 100644 index 0e553ba..0000000 --- a/java/mss-failsafe/mssfailsafeWeblayer/src/main/webapp/error.xhtml +++ /dev/null @@ -1,13 +0,0 @@ - - - Error Testpage - - - -

Error!

- -
- diff --git a/java/mss-failsafe/mssfailsafeWeblayer/src/main/webapp/index.xhtml b/java/mss-failsafe/mssfailsafeWeblayer/src/main/webapp/index.xhtml deleted file mode 100644 index 67f9887..0000000 --- a/java/mss-failsafe/mssfailsafeWeblayer/src/main/webapp/index.xhtml +++ /dev/null @@ -1,33 +0,0 @@ - - - Login Testpage - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/java/mss-failsafe/mssfailsafeWeblayer/src/main/webapp/user/welcome.xhtml b/java/mss-failsafe/mssfailsafeWeblayer/src/main/webapp/user/welcome.xhtml deleted file mode 100644 index c4393e2..0000000 --- a/java/mss-failsafe/mssfailsafeWeblayer/src/main/webapp/user/welcome.xhtml +++ /dev/null @@ -1,14 +0,0 @@ - - - - Willkommen #{personController.activeUser.call.toString()} #{personController.activeUser.lastname} - - - -

Willkommen #{personController.activeUser.call.toString()} #{personController.activeUser.lastname}

- -
- \ No newline at end of file diff --git a/java/mss-failsafe/mss/nb-configuration.xml b/java/mss-failsafe/nb-configuration.xml old mode 100644 new mode 100755 similarity index 62% rename from java/mss-failsafe/mss/nb-configuration.xml rename to java/mss-failsafe/nb-configuration.xml index 2ae0828..a577538 --- a/java/mss-failsafe/mss/nb-configuration.xml +++ b/java/mss-failsafe/nb-configuration.xml @@ -1,21 +1,29 @@ - - + + - +--> + + - 1.8-web - WildFly - ide - Facelets - - +--> + 8.0-web + WildFly + ide + Facelets + /less:/css + false + false + + + /scss:/css + js/libs + + diff --git a/java/mss-failsafe/pom.xml b/java/mss-failsafe/pom.xml old mode 100644 new mode 100755 index ebafcb3..d0ee1c7 --- a/java/mss-failsafe/pom.xml +++ b/java/mss-failsafe/pom.xml @@ -1,78 +1,193 @@ - + - - - - - - 4.0.0 - - - - - plate.software - - - - - mss-failsafe - - - - - 1.0-SNAPSHOT - - - - - - pom - - - - - - - + 4.0.0 + plate.software + mss + 1.0-SNAPSHOT + war + mss-1.0-SNAPSHOT + + 1.8 + 1.8 + ${project.build.directory}/endorsed + UTF-8 + false + 8.0 + - - - UTF-8 - - - - - - - - - - - - - - - - mssfailsafe.datalayer - - - userdata - - - mssfailsafeWeblayer - - - mss - - - - - - - mss-failsafe + + + javax + javaee-api + ${jakartaee} + provided + + + + org.hibernate + hibernate-core + 5.6.5.Final + provided + + + + + org.apache.poi + poi + 5.2.2 + + + + com.itextpdf + itextpdf + 5.5.13 + + + com.itextpdf + kernel + 7.2.2 + + + com.itextpdf + io + 7.2.2 + + + com.itextpdf + layout + 7.2.2 + + + com.itextpdf + forms + 7.2.2 + + + com.itextpdf + pdfa + 7.2.2 + + + com.itextpdf + sign + 7.2.2 + + + com.itextpdf + barcodes + 7.2.2 + + + com.itextpdf + font-asian + 7.2.2 + + + com.itextpdf + hyph + 7.2.2 + + + + org.omnifaces + omnifaces + 3.11.1 + + + + + javax + javaee-web-api + 8.0 + provided + + + org.glassfish + javax.faces + 2.3.0 + provided + + + org.apache.logging.log4j + log4j-api + 2.17.1 + + + org.apache.logging.log4j + log4j-core + 2.17.1 + + + + org.primefaces + primefaces + 11.0.0 + + + + org.webjars.npm + primeflex + 2.0.0 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + 11 + 11 + + ${endorsed.dir} + + + + + org.apache.maven.plugins + maven-war-plugin + 3.3.2 + + false + + + + org.apache.maven.plugins + maven-dependency-plugin + 2.6 + + + validate + + copy + + + ${endorsed.dir} + true + + + javax + javaee-api + ${jakartaee} + jar + + + + + + + + diff --git a/java/mss-failsafe/src/main/java/business/AbstractManager.java b/java/mss-failsafe/src/main/java/business/AbstractManager.java new file mode 100755 index 0000000..b40f0e8 --- /dev/null +++ b/java/mss-failsafe/src/main/java/business/AbstractManager.java @@ -0,0 +1,197 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package business; + +import java.util.Collection; +import java.util.List; +import javax.persistence.EntityManager; +import javax.transaction.Transactional; +import model.AbstractEntity; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.hibernate.Hibernate; + +/** + * + * @author Patrick + * @param + */ +public abstract class AbstractManager { + + protected final Logger LOGGER = LogManager.getLogger(this.getClass()); + + private final Class entityClass; + + public AbstractManager(Class entityClass) { + this.entityClass = entityClass; + } + + protected abstract EntityManager getEntityManager(); + + @Transactional + public boolean save(T entity) { + if (entity == null) { + return false; + } + + if (entity.getId() != null) { + try { + edit(entity); + getEntityManager().flush(); + } catch (Exception e) { + LOGGER.error(e); + return false; + } + } else { + try { + create(entity); + getEntityManager().flush(); + } catch (Exception e) { + LOGGER.error(e); + return false; + } + } + return true; + } + + @Transactional + public boolean saveAll(Collection entities) { + if (entities == null) { + return false; + } + + if (entities.isEmpty()) { + return true; + } + + for (T entity : entities) { + if (entity.getId() != null) { + try { + edit(entity); + } catch (Exception e) { + LOGGER.error(e); + return false; + } + } else { + try { + create(entity); + } catch (Exception e) { + LOGGER.error(e); + return false; + } + } + } + + getEntityManager().flush(); + return true; + } + + public void create(T entity) { + try { + getEntityManager().persist(entity); + } catch (Exception e) { + LOGGER.error(e); + } + + } + + public void edit(T entity) { + getEntityManager().merge(entity); + } + + public T refresh(T entity) { + if (entity == null) { + return null; + } + if (entity.getId() == null) { + save(entity); + } + + entity = getEntityManager().merge(entity); + Hibernate.initialize(entity); + + return entity; + } + + public boolean removeAllIn(Collection col) { + if (col == null || col.isEmpty()) { + return true; + } + + try { + boolean success = true; + + for (T entity : col) { + if (!remove(entity)) { + success = false; + } + } + + return success; + } catch (Exception e) { + LOGGER.error(e); + } + return false; + } + + public boolean remove(T entity) { + if (entity == null || entity.getId() == null) { + return false; + } + + try { + Hibernate.initialize(entity); + entity = find(entity.getId()); + + getEntityManager().remove(entity); + return true; + } catch (Exception e) { + LOGGER.error(e); + return false; + } + + /* + String queryString = "DELETE FROM " + entityClass.getSimpleName() + " e WHERE e.id = :id"; + Query query = getEntityManager().createQuery(queryString); + query.setParameter("id", entity.getId()); + + try { + query.executeUpdate(); + return true; + } catch (Exception e) { + LOGGER.error(e); + return false; + }*/ + } + + public T find(Object id) { + return getEntityManager().find(entityClass, id); + } + + public List findAll() { + javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); + cq.select(cq.from(entityClass)); + return getEntityManager().createQuery(cq).getResultList(); + } + + public List findRange(int[] range) { + javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); + cq.select(cq.from(entityClass)); + javax.persistence.Query q = getEntityManager().createQuery(cq); + q.setMaxResults(range[1] - range[0] + 1); + q.setFirstResult(range[0]); + return q.getResultList(); + } + + public int count() { + javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); + javax.persistence.criteria.Root rt = cq.from(entityClass); + cq.select(getEntityManager().getCriteriaBuilder().count(rt)); + javax.persistence.Query q = getEntityManager().createQuery(cq); + return ((Long) q.getSingleResult()).intValue(); + } + +} diff --git a/java/mss-failsafe/src/main/java/business/BackupFileManager.java b/java/mss-failsafe/src/main/java/business/BackupFileManager.java new file mode 100755 index 0000000..f1741b7 --- /dev/null +++ b/java/mss-failsafe/src/main/java/business/BackupFileManager.java @@ -0,0 +1,74 @@ +package business; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.Serializable; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.enterprise.context.SessionScoped; +import javax.faces.context.FacesContext; +import javax.inject.Named; +import javax.servlet.http.HttpServletResponse; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.primefaces.model.DefaultStreamedContent; +import org.primefaces.model.StreamedContent; + +@Named +@SessionScoped +public class BackupFileManager implements Serializable { + + private static final Logger logger = LogManager.getLogger(BackupFileManager.class); + private static final String BACKUP_DIRECTORY = "/h2DB/"; + private List backupFiles; + + @PostConstruct + public void init() { + loadBackupFiles(); + } + + public void loadBackupFiles() { + File directory = new File(BACKUP_DIRECTORY); + if (directory.exists() && directory.isDirectory()) { + File[] files = directory.listFiles((dir, name) -> name.startsWith("h2-mss-database-backup_") && name.endsWith(".zip")); + if (files != null) { + backupFiles = Arrays.asList(files); + // Sortiere Dateien nach Änderungsdatum (neueste zuerst) + Collections.sort(backupFiles, (f1, f2) -> Long.compare(f2.lastModified(), f1.lastModified())); + } else { + backupFiles = Collections.emptyList(); + } + } else { + backupFiles = Collections.emptyList(); + logger.warn("Backup-Verzeichnis existiert nicht: " + BACKUP_DIRECTORY); + } + } + + public List getBackupFiles() { + return backupFiles; + } + + public StreamedContent downloadFile(String fileName) { + try { + File file = new File(BACKUP_DIRECTORY + fileName); + return DefaultStreamedContent.builder() + .name(fileName) + .contentType("application/zip") + .stream(() -> { + try { + return new FileInputStream(file); + } catch (IOException e) { + logger.error("Fehler beim Lesen der Backup-Datei: " + fileName, e); + return null; + } + }) + .build(); + } catch (Exception e) { + logger.error("Fehler beim Vorbereiten des Downloads für: " + fileName, e); + return null; + } + } +} \ No newline at end of file diff --git a/java/mss-failsafe/src/main/java/business/ChangeToCLOBManager.java b/java/mss-failsafe/src/main/java/business/ChangeToCLOBManager.java new file mode 100755 index 0000000..b4918f6 --- /dev/null +++ b/java/mss-failsafe/src/main/java/business/ChangeToCLOBManager.java @@ -0,0 +1,156 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package business; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.ejb.Stateless; +import javax.inject.Named; +import javax.persistence.EntityManager; +import javax.persistence.Entity; +import javax.persistence.Lob; +import javax.persistence.NoResultException; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; +import javax.persistence.metamodel.Metamodel; +import javax.persistence.metamodel.ManagedType; +import javax.persistence.metamodel.EntityType; +import javax.persistence.metamodel.Attribute; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author patri + */ +@Stateless +@Named +public class ChangeToCLOBManager { + + // Inject the Logger + private static final Logger logger = LogManager.getLogger(ChangeToCLOBManager.class); + + @PersistenceContext + private EntityManager em; + + @javax.ejb.Asynchronous + public void checkColumnType() { + + /* + Map> tables_values = checkLobAnnotations(em); + logger.info("running check for table values!"); + tables_values.forEach((table, columns) -> { + if (columns == null || columns.isEmpty()) { + return; + } + logger.info("looking for fields in {}", table); + + // Check if the column's data type is VARCHAR + columns.stream().filter(col -> (isVarcharColumn(em, table, col))).map(col -> { + // Change the column's data type to CLOB + changeColumnType(em, table, col); + return col; + }).forEachOrdered(col -> { + logger.info("Changed column type to CLOB of table: {}; column: {}", table, col); + }); + });*/ + } + + private boolean isVarcharColumn(EntityManager em, String tableName, String columnName) { + // Construct the native SQL query + String nativeSql = "SELECT TYPE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ?1 AND COLUMN_NAME = ?2"; + + // Create a native Query + Query nativeQuery = em.createNativeQuery(nativeSql); + + // Set the parameters for the query + nativeQuery.setParameter(1, tableName.toUpperCase()); + nativeQuery.setParameter(2, columnName.toUpperCase()); + + logger.info("Added parameters 1: {}; 2:{}", tableName.toUpperCase(), columnName.toUpperCase()); + String dataType = null; + // Execute the query and get the result + try { + dataType = (String) nativeQuery.getSingleResult(); + } catch (NoResultException e) { + logger.info("NoResult", e); + } + + // Return true if the column's data type is VARCHAR, false otherwise + return dataType != null ? "VARCHAR".equalsIgnoreCase(dataType) : false; + } + + private void changeColumnType(EntityManager em, String tableName, String columnName) { + // Construct the native SQL query + String nativeSql = "ALTER TABLE " + tableName.toUpperCase() + " MODIFY COLUMN " + columnName.toUpperCase() + " CLOB"; + + logger.info(nativeSql); + + // Create a native Query + Query nativeQuery = em.createNativeQuery(nativeSql); + + // Execute the query + nativeQuery.executeUpdate(); + } + + private Map> checkLobAnnotations(EntityManager em) { + // Create a Map to store the results + Map> results = new HashMap<>(); + // Get the Metamodel from the EntityManager + Metamodel metamodel = em.getMetamodel(); + + // Iterate over all the managed types + for (ManagedType managedType : metamodel.getManagedTypes()) { + // Check if the managed type is an Entity + if (managedType.getJavaType().isAnnotationPresent(Entity.class)) { + // Get the EntityType for the managed type + EntityType entityType = (EntityType) managedType; + // Get the table name + + // Iterate over all the attributes + for (Attribute attribute : entityType.getAttributes()) { + String tableName = entityType.getName(); + String columnName = attribute.getName(); + + try { + + logger.info(entityType.getJavaType().getName()); + Class cl = getClass().getClassLoader().loadClass(entityType.getJavaType().getName()); + Field[] fields = getClass().getClassLoader().loadClass(entityType.getJavaType().getName()).getFields(); + for(Field field : fields){ + field.setAccessible(true); + logger.info(field.getName()); + if (field.isAnnotationPresent(Lob.class)) { + logger.info("Field with lob class!!!"); + } + } + + logger.info("entity name : {}; attribute name: {}; isLob: {}", tableName, columnName, "todo"); + } catch (SecurityException ex) { + logger.error("Security"); + } catch (ClassNotFoundException ex) { + logger.error("Classnot"); + } + + // Check if the element has the @Lob annotation + if (attribute.getJavaType().isAnnotationPresent(Lob.class)) { + logger.info("Attribute " + attribute.getName() + " in " + entityType.getName() + " has @Lob annotation"); + if (!results.containsKey(tableName)) { + results.put(tableName, new ArrayList<>()); + } + + results.get(tableName).add(columnName); + } + } + } + } + + return results; + } +} diff --git a/java/mss-failsafe/src/main/java/business/DatabaseBackupManager.java b/java/mss-failsafe/src/main/java/business/DatabaseBackupManager.java new file mode 100755 index 0000000..d66f61b --- /dev/null +++ b/java/mss-failsafe/src/main/java/business/DatabaseBackupManager.java @@ -0,0 +1,60 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package business; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import javax.annotation.PostConstruct; +import javax.ejb.EJB; +import javax.ejb.Schedule; +import javax.ejb.Singleton; +import javax.ejb.Startup; +import javax.inject.Named; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +@Named +@Startup +@Singleton +public class DatabaseBackupManager { + + private static final Logger logger = LogManager.getLogger(DatabaseBackupManager.class); + + @EJB + private ChangeToCLOBManager changeToCLOBManager; + + @PersistenceContext(unitName="pu_person") + private EntityManager entityManager; + + @Schedule(hour="4", minute = "0", second = "0", persistent = true) + public void createDatabaseBackup() { + // Get the current date and time + LocalDateTime now = LocalDateTime.now(); + + // Format the date and time to be included in the filename + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH-mm-ss"); + String formattedDateTime = now.format(formatter); + + // Create the backup filename + String backupFilename = "/h2DB/h2-mss-database-backup_" + formattedDateTime + ".zip"; + + // Use the EntityManager to create a backup of the H2 database + entityManager.createNativeQuery("BACKUP TO '" + backupFilename + "'") + .executeUpdate(); + + // Log a message indicating that the backup was successful + logger.info("Successfully created H2 database backup: " + backupFilename); + } + + @PostConstruct + private void init(){ + changeToCLOBManager.checkColumnType(); + } + +} + diff --git a/java/mss-failsafe/src/main/java/business/LogFileManager.java b/java/mss-failsafe/src/main/java/business/LogFileManager.java new file mode 100755 index 0000000..3f32911 --- /dev/null +++ b/java/mss-failsafe/src/main/java/business/LogFileManager.java @@ -0,0 +1,80 @@ +package business; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.Serializable; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.enterprise.context.SessionScoped; +import javax.inject.Named; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.primefaces.model.DefaultStreamedContent; +import org.primefaces.model.StreamedContent; + +@Named +@SessionScoped +public class LogFileManager implements Serializable { + + private static final Logger logger = LogManager.getLogger(LogFileManager.class); + private static final String LOG_DIRECTORY = "/logs/"; + + private List logFiles; + + @PostConstruct + public void init() { + loadLogFiles(); + } + + public void loadLogFiles() { + File directory = new File(LOG_DIRECTORY); + if (directory.exists() && directory.isDirectory()) { + File[] files = directory.listFiles((dir, name) -> name != null && name.startsWith("application.log")); + if (files != null) { + logFiles = Arrays.asList(files); + Collections.sort(logFiles, (f1, f2) -> Long.compare(f2.lastModified(), f1.lastModified())); + } else { + logFiles = Collections.emptyList(); + } + } else { + logFiles = Collections.emptyList(); + logger.warn("Log-Verzeichnis existiert nicht: " + LOG_DIRECTORY); + } + } + + public List getLogFiles() { + return logFiles; + } + + public StreamedContent downloadFile(String fileName) { + try { + final File file = new File(LOG_DIRECTORY + fileName); + final String contentType; + if (fileName.endsWith(".gz")) { + contentType = "application/gzip"; + } else if (fileName.endsWith(".log")) { + contentType = "text/plain"; + } else { + contentType = "application/octet-stream"; + } + return DefaultStreamedContent.builder() + .name(fileName) + .contentType(contentType) + .stream(() -> { + try { + return new FileInputStream(file); + } catch (IOException e) { + logger.error("Fehler beim Lesen der Log-Datei: " + fileName, e); + return null; + } + }) + .build(); + } catch (Exception e) { + logger.error("Fehler beim Vorbereiten des Downloads für Log-Datei: " + fileName, e); + return null; + } + } +} diff --git a/java/mss-failsafe/src/main/java/business/PasswordResetEJB.java b/java/mss-failsafe/src/main/java/business/PasswordResetEJB.java new file mode 100755 index 0000000..8b1d421 --- /dev/null +++ b/java/mss-failsafe/src/main/java/business/PasswordResetEJB.java @@ -0,0 +1,111 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package business; + +import javax.ejb.Stateless; +import javax.mail.Message; +import javax.mail.Session; +import javax.mail.Transport; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeMessage; +import java.util.Properties; +import javax.activation.DataHandler; +import javax.activation.DataSource; +import javax.activation.FileDataSource; +import javax.inject.Named; +import javax.mail.MessagingException; +import javax.mail.internet.MimeBodyPart; +import javax.mail.internet.MimeMultipart; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +@Named +@Stateless +public class PasswordResetEJB { + + protected final Logger LOGGER = LogManager.getLogger(PasswordResetEJB.class); + + // Set up the email server properties + private static final String SMTP_SERVER = "smtp.gmail.com"; + private static final String USERNAME = "dein@user.gmail.com"; + private static final String PASSWORD = "HierStehtDeinPasswort"; + + // Set up the email message properties + private static final String EMAIL_SUBJECT = "Password Reset Request"; + private static final String EMAIL_BODY + = "Sehr geehrte/r %s,\n\n" + + "Sie haben angefordert, Ihr Passwort zurückzusetzen. Bitte klicken Sie auf den unten stehenden Link, um fortzufahren:\n\n" + + "%s\n\n" + + "Wenn Sie diese Anfrage nicht gestellt haben, ignorieren Sie bitte diese E-Mail.\n\n" + + "Bitte beachten Sie, dass der Link nur einmal verwendet werden kann und innerhalb von 24 Stunden ab Erhalt dieser E-Mail abläuft.\n\n" + + "Wenn Sie weitere Fragen haben, zögern Sie bitte nicht, uns zu kontaktieren.\n\n" + + "Freundliche Grüße,\n\n" + + "%s"; + private static final String COMPANY + = "MSS Machine Safety Services\n" + + "+49162 1322 382\n" + + "kontakt@mss-failsafe.com\n" + + "Lüneburger Str. 48\n" + + "28870 Ottersberg"; + + private static final String imagePath = "/resources/images/logos/logo_small.png"; + private static DataSource dataSource; + + public boolean sendPasswordResetEmail(String to, String name, String resetLink) { + if (dataSource == null) { + dataSource = new FileDataSource(imagePath); + } + // Set up the email server properties + Properties prop = new Properties(); + prop.put("mail.smtp.host", SMTP_SERVER); + prop.put("mail.smtp.port", "587"); + prop.put("mail.smtp.auth", "true"); + prop.put("mail.smtp.starttls.enable", "true"); + + try { + // Set up the email session + Session session = Session.getInstance(prop, null); + + // Create a MimeMultipart object to hold the text and image parts of the email + MimeMultipart multipart = new MimeMultipart("related"); + + // Create a MimeBodyPart object to hold the text of the email + MimeBodyPart messageBodyPart = new MimeBodyPart(); + messageBodyPart.setText(getFormattedMessage(name, resetLink)); + multipart.addBodyPart(messageBodyPart); + + // Create a MimeBodyPart object to hold the image + //MimeBodyPart imagePart = new MimeBodyPart(); + //imagePart.setDataHandler(new DataHandler(dataSource)); + //imagePart.setHeader("Content-ID", "MSS Machine Safety Services"); + //multipart.addBodyPart(imagePart); + + // Set up the email message + MimeMessage message = new MimeMessage(session); + message.setFrom(new InternetAddress(USERNAME)); + message.setRecipients(Message.RecipientType.TO, to); + message.setSubject(EMAIL_SUBJECT); + message.setContent(multipart); + + // Send the email message + Transport transport = session.getTransport("smtp"); + transport.connect(SMTP_SERVER, USERNAME, PASSWORD); + transport.sendMessage(message, message.getAllRecipients()); + transport.close(); + + return true; + } catch (MessagingException e) { + LOGGER.error(e); + } + + return false; + } + + private String getFormattedMessage(String name, String resetLink) { + return String.format(EMAIL_BODY, name, resetLink, COMPANY); + } + +} diff --git a/java/mss-failsafe/src/main/java/business/addresses/CompanyAddressManager.java b/java/mss-failsafe/src/main/java/business/addresses/CompanyAddressManager.java new file mode 100755 index 0000000..f29274e --- /dev/null +++ b/java/mss-failsafe/src/main/java/business/addresses/CompanyAddressManager.java @@ -0,0 +1,36 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package business.addresses; + +import business.AbstractManager; +import javax.ejb.Stateless; +import javax.inject.Named; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import model.company.Location; + +/** + * + * @author patri + */ +@Named +@Stateless +public class CompanyAddressManager extends AbstractManager{ + + @PersistenceContext(name = "pu_person") + EntityManager em; + + public CompanyAddressManager() { + super(Location.class); + } + + @Override + protected EntityManager getEntityManager() { + return em; + } + + +} diff --git a/java/mss-failsafe/src/main/java/business/addresses/LocationAddressManager.java b/java/mss-failsafe/src/main/java/business/addresses/LocationAddressManager.java new file mode 100755 index 0000000..120cd67 --- /dev/null +++ b/java/mss-failsafe/src/main/java/business/addresses/LocationAddressManager.java @@ -0,0 +1,35 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package business.addresses; + +import business.AbstractManager; +import java.util.List; +import javax.ejb.Stateless; +import javax.inject.Named; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import model.company.Location; + +/** + * + * @author patri + */ +@Named +@Stateless +public class LocationAddressManager extends AbstractManager{ + + @PersistenceContext(name = "pu_person") + EntityManager em; + + public LocationAddressManager() { + super(Location.class); + } + + @Override + protected EntityManager getEntityManager() { + return em; + } +} diff --git a/java/mss-failsafe/src/main/java/business/company/CompanyLogoManager.java b/java/mss-failsafe/src/main/java/business/company/CompanyLogoManager.java new file mode 100755 index 0000000..942d489 --- /dev/null +++ b/java/mss-failsafe/src/main/java/business/company/CompanyLogoManager.java @@ -0,0 +1,34 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package business.company; + +import business.AbstractManager; +import javax.ejb.Stateless; +import javax.inject.Named; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import model.company.CompanyLogo; + +/** + * + * @author pplate + */ +@Named +@Stateless +public class CompanyLogoManager extends AbstractManager{ + + @PersistenceContext(name = "pu_person") + EntityManager em; + + public CompanyLogoManager() { + super(CompanyLogo.class); + } + + @Override + protected EntityManager getEntityManager() { + return em; + } + +} diff --git a/java/mss-failsafe/src/main/java/business/company/CompanyManager.java b/java/mss-failsafe/src/main/java/business/company/CompanyManager.java new file mode 100755 index 0000000..74604c1 --- /dev/null +++ b/java/mss-failsafe/src/main/java/business/company/CompanyManager.java @@ -0,0 +1,139 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package business.company; + +import business.AbstractManager; +import javax.ejb.Stateless; +import javax.inject.Named; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.transaction.Transactional; +import model.company.Company; +import model.company.Location; +import model.machine.Machine; +import org.hibernate.Hibernate; +import java.util.List; +import javax.persistence.NoResultException; +import javax.persistence.TypedQuery; + +/** + * + * @author patri + */ +@Named +@Stateless +public class CompanyManager extends AbstractManager { + + @PersistenceContext(name = "pu_person") + EntityManager em; + + private static final String loadWithCollectionQuery = + "SELECT DISTINCT c FROM Company c " + + "LEFT JOIN FETCH c.addresses " + + "LEFT JOIN FETCH c.locations l " + + "LEFT JOIN FETCH l.machines m " + + "LEFT JOIN FETCH m.securityArea sa " + + "LEFT JOIN FETCH sa.securityDevices " + + "LEFT JOIN FETCH sa.dangerPoints " + + "LEFT JOIN FETCH sa.switchingDevices " + + "LEFT JOIN FETCH sa.questionnaires " + + "WHERE c.id = :companyId"; + + public CompanyManager() { + super(Company.class); + } + + @Override + protected EntityManager getEntityManager() { + return em; + } + + @Transactional + public Company findWithAddresses(Company selected) { + Company loaded = null; + + /* + try { + return em.createQuery(loadWithCollectionQuery, Company.class) + .setParameter("companyId", selected.getId()) + .getSingleResult(); + } catch (NoResultException e) { + return null; + } + */ + + try { + loaded = find(selected.getId()); + Hibernate.initialize(loaded); + loaded.getLocations().stream() + .map(Location::getMachines) + .flatMap(List::stream) + .map(Machine::getSecurityArea) + .flatMap(List::stream) + .forEach(area -> { + Hibernate.initialize(area.getSecurityDevices()); + Hibernate.initialize(area.getDangerPoints()); + Hibernate.initialize(area.getSwitchingDevices()); + Hibernate.initialize(area.getQuestionnaires()); + if (area.getQuestionnaires() != null) { + area.getQuestionnaires().forEach(q -> Hibernate.initialize(q.getQuestions())); + } + }); + //loaded.getLocations().size(); + //loaded.getAddresses().size(); + //loaded.getCustomers().size(); + } catch (Exception e) { + LOGGER.error(e); + } + + + return loaded; + } + + public Company findCompanyByName(String name) { + TypedQuery query = em.createNamedQuery(Company.FIND_BY_NAME, Company.class); + query.setParameter("name", name); + + try { + Company loaded = query.getSingleResult(); + if (loaded != null) { + Hibernate.initialize(loaded.getAddresses()); + loaded.getLocations().stream() + .map(Location::getMachines) + .flatMap(List::stream) + .map(Machine::getSecurityArea) + .flatMap(List::stream) + .forEach(area -> { + Hibernate.initialize(area.getSecurityDevices()); + Hibernate.initialize(area.getDangerPoints()); + Hibernate.initialize(area.getSwitchingDevices()); + }); + } + return loaded; + + } catch (NoResultException noRe) { + return null; + } catch (Exception e) { + LOGGER.error(e); + } + + return null; + } + + public Company findWithLocations(Company selected) { + Company loaded = null; + + try { + loaded = find(selected.getId()); + loaded.getCustomers().size(); + loaded.getLocations().size(); + } catch (Exception e) { + LOGGER.error(e); + } + + return loaded; + } +} diff --git a/java/mss-failsafe/src/main/java/business/company/CustomerManager.java b/java/mss-failsafe/src/main/java/business/company/CustomerManager.java new file mode 100755 index 0000000..d9c9463 --- /dev/null +++ b/java/mss-failsafe/src/main/java/business/company/CustomerManager.java @@ -0,0 +1,53 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package business.company; + +import business.AbstractManager; +import javax.ejb.Stateless; +import javax.inject.Named; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.TypedQuery; +import model.customer.Customer; + +/** + * + * @author patri + */ +@Stateless +@Named +public class CustomerManager extends AbstractManager{ + + @PersistenceContext(name = "pu_person") + EntityManager em; + + public CustomerManager() { + super(Customer.class); + } + + @Override + protected EntityManager getEntityManager() { + return em; + } + + public Customer findByEmail(String email){ + Customer result = null; + if (email == null || email.isEmpty()) { + return result; + } + + TypedQuery query = em.createNamedQuery(Customer.GET_BY_EMAIL, Customer.class); + query.setParameter("email", email); + + try { + result = query.getSingleResult(); + } catch (Exception e) { + LOGGER.info(e); + } + + return result; + } +} diff --git a/java/mss-failsafe/src/main/java/business/company/LocationManager.java b/java/mss-failsafe/src/main/java/business/company/LocationManager.java new file mode 100755 index 0000000..295b6bc --- /dev/null +++ b/java/mss-failsafe/src/main/java/business/company/LocationManager.java @@ -0,0 +1,49 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package business.company; + +import business.AbstractManager; +import javax.ejb.Stateless; +import javax.inject.Named; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import model.company.Location; + +/** + * + * @author patri + */ +@Named +@Stateless +public class LocationManager extends AbstractManager{ + + @PersistenceContext(name = "pu_person") + EntityManager em; + + public LocationManager() { + super(Location.class); + } + + @Override + protected EntityManager getEntityManager() { + return em; + } + + public Location loadWithMachines(Long id){ + if (id == null) { + return null; + } + + try { + Location loc = find(id); + loc.getMachines().size(); + return loc; + } catch (Exception e) { + LOGGER.error(e); + return null; + } + } +} diff --git a/java/mss-failsafe/src/main/java/business/machine/ContactManager.java b/java/mss-failsafe/src/main/java/business/machine/ContactManager.java new file mode 100755 index 0000000..ffcc054 --- /dev/null +++ b/java/mss-failsafe/src/main/java/business/machine/ContactManager.java @@ -0,0 +1,36 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package business.machine; + +import business.AbstractManager; +import javax.ejb.Stateless; +import javax.inject.Named; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import model.machine.Contact; + +/** + * + * @author pplate + */ +@Named +@Stateless +public class ContactManager extends AbstractManager{ + + @PersistenceContext(name = "pu_person") + EntityManager em; + + public ContactManager() { + super(Contact.class); + } + + @Override + protected EntityManager getEntityManager() { + return em; + } + + + +} diff --git a/java/mss-failsafe/src/main/java/business/machine/DangerPointManager.java b/java/mss-failsafe/src/main/java/business/machine/DangerPointManager.java new file mode 100755 index 0000000..d4075e7 --- /dev/null +++ b/java/mss-failsafe/src/main/java/business/machine/DangerPointManager.java @@ -0,0 +1,77 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package business.machine; + +import business.AbstractManager; +import java.util.Collection; +import javax.ejb.EJB; +import javax.ejb.Stateless; +import javax.inject.Named; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import model.AbstractEntity; +import model.security.DangerPoint; +import model.security.MeasuringPoint; +import org.hibernate.Hibernate; + +/** + * + * @author pplate + */ +@Named +@Stateless +public class DangerPointManager extends AbstractManager { + + @PersistenceContext(name = "pu_person") + EntityManager em; + + @EJB + MeasuringPointManager measuringPointManager; + + public DangerPointManager() { + super(DangerPoint.class); + } + + @Override + protected EntityManager getEntityManager() { + return em; + } + + @Override + public boolean remove(DangerPoint entity) { + entity = em.find(DangerPoint.class, entity.getId()); + Hibernate.initialize(entity.getMeasuringPoint()); + if (entity.getMeasuringPoint() != null) { + entity.getMeasuringPoint().setDangerPoint(null); + em.remove(entity.getMeasuringPoint()); + //measuringPointManager.remove(entity.getMeasuringPoint()); + entity.setMeasuringPoint(null); + } + + entity = em.find(DangerPoint.class, entity.getId()); + em.remove(entity); + //save(entity); + + //return super.remove(entity); + return true; + } + + @Override + public boolean removeAllIn(Collection col) { + for (DangerPoint dp : col) { + if (dp.getMeasuringPoint() != null) { + dp.getMeasuringPoint().setDangerPoint(null); + MeasuringPoint pt = dp.getMeasuringPoint(); + dp.setMeasuringPoint(null); + measuringPointManager.save(pt); + measuringPointManager.remove(pt); + } + dp.setSecurityArea(null); + save(dp); + } + + return super.removeAllIn(col); + } +} diff --git a/java/mss-failsafe/src/main/java/business/machine/MachineManager.java b/java/mss-failsafe/src/main/java/business/machine/MachineManager.java new file mode 100755 index 0000000..3f94ac3 --- /dev/null +++ b/java/mss-failsafe/src/main/java/business/machine/MachineManager.java @@ -0,0 +1,62 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package business.machine; + +import business.AbstractManager; +import javax.ejb.Stateless; +import javax.inject.Named; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.transaction.Transactional; +import model.company.Location; +import model.machine.Machine; +import model.security.SecurityArea; + +/** + * + * @author patri + */ +@Named +@Stateless +public class MachineManager extends AbstractManager{ + + @PersistenceContext(name = "pu_person") + EntityManager em; + + public MachineManager() { + super(Machine.class); + } + + @Override + protected EntityManager getEntityManager() { + return em; + } + + @Transactional + public Machine copyMachine(Machine mac){ + save(mac); + + mac = refresh(mac); + if (mac.getInspections() != null) { + mac.getInspections().size(); + } + + if (mac.getSecurityArea() != null) { + mac.getSecurityArea().size(); + for(SecurityArea area : mac.getSecurityArea()){ + area.getSecurityDevices().size(); + area.getSwitchingDevices().size(); + area.getDangerPoints().size(); + } + } + + Machine copy = new Machine(mac); + if (save(copy)) { + return copy; + } + return null; + } +} diff --git a/java/mss-failsafe/src/main/java/business/machine/ManufacturerAddressManager.java b/java/mss-failsafe/src/main/java/business/machine/ManufacturerAddressManager.java new file mode 100755 index 0000000..bb64dae --- /dev/null +++ b/java/mss-failsafe/src/main/java/business/machine/ManufacturerAddressManager.java @@ -0,0 +1,34 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package business.machine; + +import business.AbstractManager; +import javax.ejb.Stateless; +import javax.inject.Named; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import model.machine.ManufacturerAddress; + +/** + * + * @author pplate + */ +@Named +@Stateless +public class ManufacturerAddressManager extends AbstractManager{ + + @PersistenceContext(name = "pu_person") + EntityManager em; + + public ManufacturerAddressManager() { + super(ManufacturerAddress.class); + } + + @Override + protected EntityManager getEntityManager() { + return em; + } + +} diff --git a/java/mss-failsafe/src/main/java/business/machine/ManufacturerManager.java b/java/mss-failsafe/src/main/java/business/machine/ManufacturerManager.java new file mode 100755 index 0000000..d2d700a --- /dev/null +++ b/java/mss-failsafe/src/main/java/business/machine/ManufacturerManager.java @@ -0,0 +1,59 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package business.machine; + +import business.AbstractManager; +import javax.ejb.Stateless; +import javax.inject.Named; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import model.machine.Manufacturer; +import org.hibernate.Hibernate; + +/** + * + * @author pplate + */ +@Named +@Stateless +public class ManufacturerManager extends AbstractManager{ + + @PersistenceContext(name = "pu_person") + EntityManager em; + + public ManufacturerManager() { + super(Manufacturer.class); + } + + @Override + protected EntityManager getEntityManager() { + return em; + } + + public Manufacturer reload(Manufacturer manufacturer){ + if (manufacturer == null || manufacturer.getId() == null) { + return new Manufacturer(); + } + + manufacturer = refresh(manufacturer); + Hibernate.initialize(manufacturer.getAdresses()); + Hibernate.initialize(manufacturer.getContacts()); + + return manufacturer; + } + + public Manufacturer reloadWithMachines(Manufacturer manufacturer){ + if (manufacturer == null || manufacturer.getId() == null) { + return new Manufacturer(); + } + + manufacturer = refresh(manufacturer); + Hibernate.initialize(manufacturer.getMachines()); + Hibernate.initialize(manufacturer.getAdresses()); + Hibernate.initialize(manufacturer.getContacts()); + + return manufacturer; + } +} diff --git a/java/mss-failsafe/src/main/java/business/machine/MeasuringPointManager.java b/java/mss-failsafe/src/main/java/business/machine/MeasuringPointManager.java new file mode 100755 index 0000000..a7d960d --- /dev/null +++ b/java/mss-failsafe/src/main/java/business/machine/MeasuringPointManager.java @@ -0,0 +1,32 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package business.machine; + +import business.AbstractManager; +import javax.ejb.Stateless; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import model.security.MeasuringPoint; + +/** + * + * @author pplate + */ +@Stateless +public class MeasuringPointManager extends AbstractManager { + + @PersistenceContext(name = "pu_person") + EntityManager em; + + public MeasuringPointManager() { + super(MeasuringPoint.class); + } + + @Override + protected EntityManager getEntityManager() { + return em; + } + +} diff --git a/java/mss-failsafe/src/main/java/business/machine/SecurityAreaManager.java b/java/mss-failsafe/src/main/java/business/machine/SecurityAreaManager.java new file mode 100755 index 0000000..cf6d887 --- /dev/null +++ b/java/mss-failsafe/src/main/java/business/machine/SecurityAreaManager.java @@ -0,0 +1,166 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package business.machine; + +import business.AbstractManager; +import java.util.List; +import javax.ejb.Stateless; +import javax.inject.Named; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; +import javax.transaction.Transactional; +import model.question.Questionaire; +import model.security.SecurityArea; +import model.security.SecurityAreaQuestionnaire; +import org.hibernate.Hibernate; + +/** + * + * @author patri + */ +@Named +@Stateless +public class SecurityAreaManager extends AbstractManager{ + + @PersistenceContext(name = "pu_person") + EntityManager em; + + public SecurityAreaManager() { + super(SecurityArea.class); + } + + @Transactional + public boolean delete(SecurityArea area){ + Query query = em.createNamedQuery(SecurityArea.DELETE); + query.setParameter("id", area.getId()); + + try{ + query.executeUpdate(); + } catch (Exception e){ + LOGGER.error(e); + return false; + } + + return true; + } + + @Transactional + public SecurityArea cloneArea(SecurityArea area){ + if (area.getId() != null && area.getId() > 0) { + area = em.find(SecurityArea.class, area.getId()); + Hibernate.initialize(area); + //area.getDangerPoints().size(); + //area.getSecurityDevices().size(); + } + + return new SecurityArea(area); + } + + /** + * Adds a questionnaire to a security area + */ + @Transactional + public SecurityArea addQuestionnaireToSecurityArea(SecurityArea area, Questionaire questionaire) { + try { + if (area.getId() != null && area.getId() > 0) { + area = em.find(SecurityArea.class, area.getId()); + } + + SecurityAreaQuestionnaire securityAreaQuestionnaire = new SecurityAreaQuestionnaire(questionaire); + securityAreaQuestionnaire.setArea(area); + + if (area.getQuestionnaires() == null) { + area.setQuestionnaires(new java.util.ArrayList<>()); + } + + area.getQuestionnaires().add(securityAreaQuestionnaire); + em.persist(securityAreaQuestionnaire); + em.merge(area); + + return area; + } catch (Exception e) { + LOGGER.error("Error adding questionnaire to security area", e); + return null; + } + } + + /** + * Removes a questionnaire from a security area + */ + @Transactional + public boolean removeQuestionnaireFromSecurityArea(SecurityArea area, SecurityAreaQuestionnaire questionnaire) { + try { + if (area.getId() != null && area.getId() > 0) { + area = em.find(SecurityArea.class, area.getId()); + } + + if (questionnaire.getId() != null && questionnaire.getId() > 0) { + questionnaire = em.find(SecurityAreaQuestionnaire.class, questionnaire.getId()); + } + + if (area.getQuestionnaires() != null) { + area.getQuestionnaires().remove(questionnaire); + } + + em.remove(questionnaire); + em.merge(area); + + return true; + } catch (Exception e) { + LOGGER.error("Error removing questionnaire from security area", e); + return false; + } + } + + /** + * Gets all available questionnaires that are not yet assigned to the security area + */ + public List getAvailableQuestionnaires(SecurityArea area) { + try { + // Ensure the area is managed to safely access its associations + if (area != null && area.getId() != null && area.getId() > 0) { + area = em.find(SecurityArea.class, area.getId()); + } + + // Get all questionnaires + Query query = em.createQuery("SELECT q FROM Questionaire q ORDER BY q.name"); + List allQuestionnaires = query.getResultList(); + + // Filter out questionnaires already assigned to this security area + if (area != null && area.getQuestionnaires() != null && !area.getQuestionnaires().isEmpty()) { + List assignedNames = area.getQuestionnaires().stream() + .map(SecurityAreaQuestionnaire::getName) + .collect(java.util.stream.Collectors.toList()); + + allQuestionnaires.removeIf(q -> assignedNames.contains(q.getName())); + } + + return allQuestionnaires; + } catch (Exception e) { + LOGGER.error("Error getting available questionnaires", e); + return new java.util.ArrayList<>(); + } + } + + public SecurityArea reloadWithQuestionnaires(SecurityArea area) { + if (area == null || area.getId() == null) { + return area; + } + SecurityArea reloaded = em.find(SecurityArea.class, area.getId()); + Hibernate.initialize(reloaded.getQuestionnaires()); + Hibernate.initialize(reloaded.getSecurityDevices()); + Hibernate.initialize(reloaded.getDangerPoints()); + Hibernate.initialize(reloaded.getSwitchingDevices()); + return reloaded; + } + + @Override + protected EntityManager getEntityManager() { + return em; + } + +} diff --git a/java/mss-failsafe/src/main/java/business/machine/SecurityDeviceCompanyManager.java b/java/mss-failsafe/src/main/java/business/machine/SecurityDeviceCompanyManager.java new file mode 100755 index 0000000..d671e8a --- /dev/null +++ b/java/mss-failsafe/src/main/java/business/machine/SecurityDeviceCompanyManager.java @@ -0,0 +1,88 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package business.machine; + +import business.AbstractManager; +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.Collections; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.ejb.Stateless; +import javax.inject.Named; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import model.security.SecurityDeviceCompany; + +/** + * + * @author pplate + */ +@Named +@Stateless +public class SecurityDeviceCompanyManager extends AbstractManager{ + + public final String FILE_NAME = "Hersteller.txt"; + + private static List companies; + private static boolean hasToReload = false; + + @PersistenceContext(name = "pu_person") + EntityManager em; + + public SecurityDeviceCompanyManager() { + super(SecurityDeviceCompany.class); + } + + @Override + protected EntityManager getEntityManager() { + return em; + } + + public void loadFromFile() { + int count = 0; + ClassLoader classLoader = getClass().getClassLoader(); + InputStream inputStream = classLoader.getResourceAsStream(FILE_NAME); + try (InputStreamReader streamReader = + new InputStreamReader(inputStream, StandardCharsets.UTF_8); + BufferedReader reader = new BufferedReader(streamReader)) + { + String line; + while ((line = reader.readLine()) != null) { + SecurityDeviceCompany company = new SecurityDeviceCompany(); + company.setName(line); + save(company); + count++; + } + System.out.println("Loaded " + count + " SecurityDeviceCompanies from file"); + LOGGER.info("Loaded " + count + " SecurityDeviceCompanies from file"); + } catch (IOException e) { + LOGGER.error(e); + } + } + + public void setHasToReload(){ + hasToReload = true; + } + + public void reloadCompanies(){ + companies = findAll(); + if (companies != null) { + Collections.sort(companies); + } + } + + public List getCompanies(){ + if (hasToReload || companies == null) { + reloadCompanies(); + } + + return companies; + } +} diff --git a/java/mss-failsafe/src/main/java/business/machine/SecurityDeviceManager.java b/java/mss-failsafe/src/main/java/business/machine/SecurityDeviceManager.java new file mode 100755 index 0000000..6add334 --- /dev/null +++ b/java/mss-failsafe/src/main/java/business/machine/SecurityDeviceManager.java @@ -0,0 +1,43 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package business.machine; + +import business.AbstractManager; +import javax.ejb.Stateless; +import javax.inject.Named; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; +import model.security.SecurityDevice; + +/** + * + * @author pplate + */ +@Named +@Stateless +public class SecurityDeviceManager extends AbstractManager{ + + @PersistenceContext(name = "pu_person") + EntityManager em; + + public SecurityDeviceManager() { + super(SecurityDevice.class); + } + + @Override + protected EntityManager getEntityManager() { + return em; + } + + @Override + public boolean remove(SecurityDevice device){ + Query query = em.createNativeQuery("DELETE FROM SECURITYDEVICE WHERE ID = " + device.getId()); + + int result = query.executeUpdate(); + + return result > 0; + } +} diff --git a/java/mss-failsafe/src/main/java/business/machine/SwitchingDeviceManager.java b/java/mss-failsafe/src/main/java/business/machine/SwitchingDeviceManager.java new file mode 100755 index 0000000..7484d09 --- /dev/null +++ b/java/mss-failsafe/src/main/java/business/machine/SwitchingDeviceManager.java @@ -0,0 +1,34 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package business.machine; + +import business.AbstractManager; +import javax.ejb.Stateless; +import javax.inject.Named; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import model.security.switching.SwitchingDevice; + +/** + * + * @author pplate + */ +@Named +@Stateless +public class SwitchingDeviceManager extends AbstractManager { + + @PersistenceContext(name = "pu_person") + EntityManager em; + + public SwitchingDeviceManager() { + super(SwitchingDevice.class); + } + + @Override + protected EntityManager getEntityManager() { + return em; + } + +} diff --git a/java/mss-failsafe/src/main/java/business/questions/QuestionaireManager.java b/java/mss-failsafe/src/main/java/business/questions/QuestionaireManager.java new file mode 100755 index 0000000..e75ca80 --- /dev/null +++ b/java/mss-failsafe/src/main/java/business/questions/QuestionaireManager.java @@ -0,0 +1,167 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package business.questions; + +import business.AbstractManager; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.ejb.Stateless; +import javax.inject.Named; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.TypedQuery; +import model.question.Question; +import model.question.Questionaire; +import model.security.SecurityDeviceCompany; +import org.hibernate.Hibernate; + +/** + * + * @author pplate + */ +@Named +@Stateless +public class QuestionaireManager extends AbstractManager { + + @PersistenceContext(name = "pu_person") + EntityManager em; + + public QuestionaireManager() { + super(Questionaire.class); + } + + @Override + protected EntityManager getEntityManager() { + return em; + } + + public List loadAllWithQuestions() { + List loaded = findAll(); + + if (loaded != null) { + loaded.forEach(l -> { + Hibernate.initialize(l.getQuestions()); + }); + } + return loaded; + } + + public List loadAllGlobals(){ + TypedQuery query = em.createNamedQuery(Questionaire.GET_FOR_ALL_REQUIRED, Questionaire.class); + + try { + List loaded = query.getResultList(); + if (loaded != null && !loaded.isEmpty()) { + loaded.forEach(q -> Hibernate.initialize(q.getQuestions())); + } + + return loaded; + } catch (Exception e) { + LOGGER.error(e); + } + + return new ArrayList<>(); + } + + public void loadAllFromFile(){ + ClassLoader classLoader = getClass().getClassLoader(); + URL resource = classLoader.getResource("checklisten"); + if (resource == null) { + LOGGER.error("Couldn't find checklisten folder!"); + return; + } + + try { + File file = new File("/rundata/checklisten"); + File[] files = file.listFiles(); + + for (File f : files) { + loadFromFile(f); + } + } catch (FileNotFoundException ex) { + LOGGER.error(ex); + } catch (Exception e){ + LOGGER.error(e); + } + } + + private void loadFromFile(File file) throws FileNotFoundException { + LOGGER.debug("loading from file {}; {}", file, file.getAbsolutePath()); + int count = 0; + InputStream inputStream = new FileInputStream(file); + try ( InputStreamReader streamReader + = new InputStreamReader(inputStream, StandardCharsets.UTF_8); BufferedReader reader = new BufferedReader(streamReader)) { + String line; + Questionaire questionaire = new Questionaire(); + questionaire.setQuestions(new ArrayList<>()); + String name = file.getName(); + name = name.replace(".txt", ""); + name = name.replace("_", " "); + questionaire.setName(name); + + while ((line = reader.readLine()) != null) { + count++; + if (count == 1 && line.startsWith("GLOBAL")) { + questionaire.setForAllRequired(true); + count = 0; + continue; + } + Question question = new Question(); + question.setQuestionaire(questionaire); + question.setText(line); + question.setPosition(count); + question.setStandardValues(true); + + questionaire.getQuestions().add(question); + } + + save(questionaire); + LOGGER.info("Loaded " + count + " questions from " + file.getName()); + } catch (IOException e) { + LOGGER.error(e); + LOGGER.error(e.getMessage()); + } + } + + public boolean deleteWithQuestions(Questionaire q) { + if (q == null) { + LOGGER.error("Tried to delete null"); + return false; + } + + Hibernate.initialize(q); + Hibernate.isInitialized(q.getQuestions()); + + if (q.getQuestions() == null || q.getQuestions().isEmpty()) { + return super.remove(q); + } + + List questions = q.getQuestions(); + q.setQuestions(null); + em.merge(q); + + questions.forEach(quest -> { + quest.setQuestionaire(null); + em.merge(quest); + em.remove(quest); + }); + + em.remove(q); + + return true; + } +} diff --git a/java/mss-failsafe/src/main/java/business/tickets/TicketManager.java b/java/mss-failsafe/src/main/java/business/tickets/TicketManager.java new file mode 100755 index 0000000..a6222c1 --- /dev/null +++ b/java/mss-failsafe/src/main/java/business/tickets/TicketManager.java @@ -0,0 +1,331 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package business.tickets; + +import business.AbstractManager; +import business.user.PersonManager; +import java.util.ArrayList; +import java.util.List; +import javax.ejb.EJB; +import javax.ejb.Stateless; +import javax.inject.Named; +import javax.persistence.EntityManager; +import javax.persistence.EntityGraph; +import javax.persistence.PersistenceContext; +import javax.persistence.TypedQuery; +import model.company.Company; +import model.person.Person; +import model.ticket.enums.Status; +import model.ticket.Ticket; +import org.hibernate.Hibernate; + +/** + * + * @author pplate + */ +@Named +@Stateless +public class TicketManager extends AbstractManager { + + public static final int BATCH_SIZE = 100; + + @EJB + PersonManager personManager; + + @PersistenceContext(name = "pu_person") + private EntityManager em; + + public TicketManager() { + super(Ticket.class); + + } + + @Override + protected EntityManager getEntityManager() { + return em; + } + + public Long countByNumber(String number) { + if (number == null) { + return null; + } + + TypedQuery query = getEntityManager().createNamedQuery(Ticket.CHECK_NUMBER_EXISTS, Long.class); + query.setParameter("number", number); + + try { + return query.getSingleResult(); + } catch (Exception e) { + LOGGER.error(e); + } + + return 0L; + } + + public List loadBatchOrderedByCreationDate() { + List results = null; + TypedQuery query = em.createNamedQuery(Ticket.GET_ALL_NEWEST, Ticket.class); + query.setParameter("status", Status.CLOSED); + query.setMaxResults(BATCH_SIZE); + + try { + results = query.getResultList(); + } catch (Exception e) { + LOGGER.error(e); + } + + return results; + } + + public ArrayList loadAllForCompany(Company company) { + ArrayList results = new ArrayList<>(); + if (company == null || company.getId() == null) { + return results; + } + + TypedQuery query = em.createNamedQuery(Ticket.GET_BY_FOR_COMPANY, Ticket.class); + query.setParameter("company", company); + try { + results = new ArrayList<>(query.getResultList()); + } catch (Exception e) { + LOGGER.error(e); + } + + return results; + } + + public ArrayList loadAllForCompany(String id) { + ArrayList results = new ArrayList<>(); + if (id == null || id.isBlank()) { + return results; + } + Long compID; + + try { + compID = Long.valueOf(id); + } catch (Exception e) { + LOGGER.error(e); + return results; + } + + TypedQuery query = em.createNamedQuery(Ticket.GET_ALL_BY_COMPANYID, Ticket.class); + query.setParameter("companyID", compID); + try { + results = new ArrayList<>(query.getResultList()); + } catch (Exception e) { + LOGGER.error(e); + } + + return results; + } + + public ArrayList loadAllForCompanyWithQuestions(Company company) { + ArrayList results = new ArrayList<>(); + if (company == null || company.getId() == null) { + return results; + } + + TypedQuery query = em.createNamedQuery(Ticket.GET_BY_FOR_COMPANY, Ticket.class); + query.setParameter("company", company); + try { + results = new ArrayList<>(query.getResultList()); + if (!results.isEmpty()) { + results.stream().map(t -> t.getLocations()) + .flatMap(List::stream) + .map(l -> l.getMachines()) + .flatMap(List::stream) + .forEach(m -> { + Hibernate.initialize(m.getSecurityAreas()); + m.getSecurityAreas().forEach(sa -> Hibernate.initialize(sa.getQuestionaires())); + }); + } + } catch (Exception e) { + LOGGER.error(e); + } + + return results; + } + + public boolean saveDelete(Ticket ticket) { + if (ticket == null || ticket.getId() == null) { + return false; + } + + //initTicket(ticket); + + if (ticket.getWatchers() != null) { + ticket = find(ticket.getId()); + Hibernate.initialize(ticket.getWatchers()); + for (Person person : ticket.getWatchers()) { + personManager.refresh(person); + Hibernate.initialize(person.getWatchlist()); + person.getWatchlist().remove(ticket); + + personManager.save(person); + } + } + + return remove(ticket); + } + + public List loadBatchOrderedByCreationDateByPerson(Person person) { + List results = null; + TypedQuery query = em.createNamedQuery(Ticket.GET_PERSONAL_ALL_NEWEST, Ticket.class); + query.setParameter("owner", person); + query.setMaxResults(BATCH_SIZE); + + try { + results = query.getResultList(); + } catch (Exception e) { + LOGGER.error(e); + } + + return results; + } + + public List loadPersonalWatchlist(Person person) { + List results = null; + TypedQuery query = em.createNamedQuery(Person.FIND_BY_ID, Person.class); + query.setParameter("id", person.getId()); + + try { + Person loaded = query.getSingleResult(); + Hibernate.initialize(loaded.getWatchlist()); + results = loaded.getWatchlist(); + } catch (Exception e) { + LOGGER.error(e); + } + + return results; + } + + public Ticket reloadWithWatchlist(Ticket toReload) { + if (toReload == null || toReload.getId() == null) { + return null; + } + + Ticket loaded = em.find(Ticket.class, toReload.getId()); + Hibernate.initialize(loaded.getWatchers()); + + return loaded; + } + + public Ticket loadByNumber(String number) { + if (number == null) { + return null; + } + + TypedQuery query = getEntityManager().createNamedQuery(Ticket.GET_BY_NUMBER, Ticket.class); + query.setParameter("number", number); + + try { + Ticket loaded = query.getSingleResult(); + initTicket(loaded); + + return loaded; + } catch (Exception e) { + LOGGER.error(e); + } + + return null; + } + + /** + * Optimized fetch for protocol generation: uses JPA EntityGraph to pre-load the full graph + * needed by ProtocolController without triggering many lazy loads. + */ + public Ticket fetchTicketGraphForProtocolsByNumber(String number) { + if (number == null) { + return null; + } + try { + TypedQuery query = getEntityManager().createQuery( + "SELECT DISTINCT t FROM Ticket t " + + "LEFT JOIN FETCH t.company c " + + "LEFT JOIN FETCH c.addresses " + + "LEFT JOIN FETCH t.serviceAddress " + + "LEFT JOIN FETCH t.billingAddress " + + "WHERE t.number = :number", + Ticket.class); + query.setParameter("number", number); + Ticket loaded = query.getSingleResult(); + return loaded; + } catch (Exception e) { + LOGGER.error(e); + // Fallback to safe loader with initialization + return loadByNumber(number); + } + } + + /** + * Load the full ticket graph needed for editing/protocols without using EntityGraph + * to avoid MultipleBagFetchException. Loads the Ticket and initializes required associations. + */ + public Ticket fetchTicketProtocolGraphById(Long id) { + if (id == null) { + return null; + } + try { + Ticket loaded = getEntityManager().find(Ticket.class, id); + initTicket(loaded); + return loaded; + } catch (Exception e) { + LOGGER.error(e); + return null; + } + } + + /** + * Variant to fetch by ticket number without EntityGraph, delegating to the classic loader. + */ + public Ticket fetchTicketProtocolGraphByNumber(String number) { + return loadByNumber(number); + } + + public void initTicket(Ticket ticket) { + if (ticket == null) { + return; + } + + Hibernate.initialize(ticket.getComments()); + Hibernate.initialize(ticket.getContacts()); + Hibernate.initialize(ticket.getInvoices()); + Hibernate.initialize(ticket.getLocations()); + Hibernate.initialize(ticket.getReports()); + Hibernate.initialize(ticket.getWatchers()); + Hibernate.initialize(ticket.getRequester()); + Hibernate.initialize(ticket.getCompany().getAddresses()); + if (ticket.getLocations() == null) { + return; + } + ticket.getLocations().forEach(loc -> { + Hibernate.initialize(loc.getMachines()); + if (loc.getMachines() == null) { + return; + } + loc.getMachines().forEach(mac -> { + Hibernate.initialize(mac); + if (mac.getQuestionaires() == null) { + return; + } + Hibernate.initialize(mac.getQuestionaires()); + mac.getQuestionaires().forEach(ques -> Hibernate.initialize(ques.getQuestions())); + + Hibernate.initialize(mac.getSecurityAreas()); + + if (mac.getSecurityAreas() != null) { + mac.getSecurityAreas().forEach(area -> { + Hibernate.initialize(area); + Hibernate.initialize(area.getDangerPoints()); + Hibernate.initialize(area.getSecurityDevices()); + Hibernate.initialize(area.getSwitchingDevices()); + Hibernate.initialize(area.getQuestionaires()); + }); + } + }); + }); + + } +} diff --git a/java/mss-failsafe/src/main/java/business/tickets/machine/TicketMachineManager.java b/java/mss-failsafe/src/main/java/business/tickets/machine/TicketMachineManager.java new file mode 100755 index 0000000..4397129 --- /dev/null +++ b/java/mss-failsafe/src/main/java/business/tickets/machine/TicketMachineManager.java @@ -0,0 +1,34 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package business.tickets.machine; + +import business.AbstractManager; +import javax.ejb.Stateless; +import javax.inject.Named; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import model.ticket.dataCopies.TicketMachine; + +/** + * + * @author pplate + */ +@Named +@Stateless +public class TicketMachineManager extends AbstractManager{ + + @PersistenceContext(name = "pu_person") + private EntityManager em; + + public TicketMachineManager() { + super(TicketMachine.class); + } + + @Override + protected EntityManager getEntityManager() { + return em; + } + +} diff --git a/java/mss-failsafe/src/main/java/business/tickets/machine/TicketQuestionManager.java b/java/mss-failsafe/src/main/java/business/tickets/machine/TicketQuestionManager.java new file mode 100755 index 0000000..be414b3 --- /dev/null +++ b/java/mss-failsafe/src/main/java/business/tickets/machine/TicketQuestionManager.java @@ -0,0 +1,33 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package business.tickets.machine; + +import business.AbstractManager; +import javax.ejb.Stateless; +import javax.inject.Named; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import model.ticket.questions.TicketQuestion; + +/** + * + * @author pplate + */ +@Named +@Stateless +public class TicketQuestionManager extends AbstractManager { + + @PersistenceContext(name = "pu_person") + private EntityManager em; + + public TicketQuestionManager() { + super(TicketQuestion.class); + } + + @Override + protected EntityManager getEntityManager() { + return em; + } +} diff --git a/java/mss-failsafe/src/main/java/business/tickets/machine/TicketQuestionaireManager.java b/java/mss-failsafe/src/main/java/business/tickets/machine/TicketQuestionaireManager.java new file mode 100755 index 0000000..f12a703 --- /dev/null +++ b/java/mss-failsafe/src/main/java/business/tickets/machine/TicketQuestionaireManager.java @@ -0,0 +1,33 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package business.tickets.machine; + +import business.AbstractManager; +import javax.ejb.Stateless; +import javax.inject.Named; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import model.ticket.questions.TicketQuestionaire; + +/** + * + * @author pplate + */ +@Named +@Stateless +public class TicketQuestionaireManager extends AbstractManager{ + + @PersistenceContext(name = "pu_person") + private EntityManager em; + + public TicketQuestionaireManager() { + super(TicketQuestionaire.class); + } + + @Override + protected EntityManager getEntityManager() { + return em; + } +} diff --git a/java/mss-failsafe/src/main/java/business/tickets/machine/TicketSecurityAreaManager.java b/java/mss-failsafe/src/main/java/business/tickets/machine/TicketSecurityAreaManager.java new file mode 100755 index 0000000..4ea3715 --- /dev/null +++ b/java/mss-failsafe/src/main/java/business/tickets/machine/TicketSecurityAreaManager.java @@ -0,0 +1,59 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package business.tickets.machine; + +import business.AbstractManager; +import javax.ejb.Stateless; +import javax.inject.Named; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import model.ticket.dataCopies.TicketSecurityArea; +import org.hibernate.Hibernate; + +/** + * + * @author pplate + */ +@Named +@Stateless +public class TicketSecurityAreaManager extends AbstractManager { + + @PersistenceContext(name = "pu_person") + private EntityManager em; + + public TicketSecurityAreaManager() { + super(TicketSecurityArea.class); + } + + public TicketSecurityArea reloadWitchQuestionaires(TicketSecurityArea area) { + if (area == null) { + return null; + } + + TicketSecurityArea reloaded = em.find(TicketSecurityArea.class, area.getId()); + Hibernate.initialize(reloaded.getQuestionaires()); + + return reloaded; + } + + public TicketSecurityArea reloadWithAll(TicketSecurityArea area) { + if (area == null) { + return null; + } + + TicketSecurityArea reloaded = em.find(TicketSecurityArea.class, area.getId()); + reloaded.getQuestionaires().size(); + reloaded.getSecurityDevices().size(); + reloaded.getSwitchingDevices().size(); + reloaded.getDangerPoints().size(); + + return reloaded; + } + + @Override + protected EntityManager getEntityManager() { + return em; + } +} diff --git a/java/mss-failsafe/src/main/java/business/tickets/machine/TicketSecurityAreaQuestionManager.java b/java/mss-failsafe/src/main/java/business/tickets/machine/TicketSecurityAreaQuestionManager.java new file mode 100755 index 0000000..89bd246 --- /dev/null +++ b/java/mss-failsafe/src/main/java/business/tickets/machine/TicketSecurityAreaQuestionManager.java @@ -0,0 +1,34 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package business.tickets.machine; + +import business.AbstractManager; +import javax.ejb.Stateless; +import javax.inject.Named; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import model.ticket.questions.SecurityAreaQuestion; + +/** + * + * @author pplate + */ +@Named +@Stateless +public class TicketSecurityAreaQuestionManager extends AbstractManager { + + public TicketSecurityAreaQuestionManager() { + super(SecurityAreaQuestion.class); + } + + @PersistenceContext(name = "pu_person") + private EntityManager em; + + @Override + protected EntityManager getEntityManager() { + return em; + } + +} diff --git a/java/mss-failsafe/src/main/java/business/tickets/machine/TicketSecurityAreaQuestionaireManager.java b/java/mss-failsafe/src/main/java/business/tickets/machine/TicketSecurityAreaQuestionaireManager.java new file mode 100755 index 0000000..f95c042 --- /dev/null +++ b/java/mss-failsafe/src/main/java/business/tickets/machine/TicketSecurityAreaQuestionaireManager.java @@ -0,0 +1,34 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package business.tickets.machine; + +import business.AbstractManager; +import javax.ejb.Stateless; +import javax.inject.Named; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import model.ticket.questions.SecurityAreaQuestionaire; + +/** + * + * @author pplate + */ +@Named +@Stateless +public class TicketSecurityAreaQuestionaireManager extends AbstractManager { + + public TicketSecurityAreaQuestionaireManager() { + super(SecurityAreaQuestionaire.class); + } + + @PersistenceContext(name = "pu_person") + private EntityManager em; + + @Override + protected EntityManager getEntityManager() { + return em; + } + +} diff --git a/java/mss-failsafe/src/main/java/business/tickets/protocoll/ProtocolManager.java b/java/mss-failsafe/src/main/java/business/tickets/protocoll/ProtocolManager.java new file mode 100755 index 0000000..47e1879 --- /dev/null +++ b/java/mss-failsafe/src/main/java/business/tickets/protocoll/ProtocolManager.java @@ -0,0 +1,34 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package business.tickets.protocoll; + +import business.AbstractManager; +import javax.ejb.Stateless; +import javax.inject.Named; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import model.files.Report; + +/** + * + * @author pplate + */ + @Named + @Stateless +public class ProtocolManager extends AbstractManager { + + @PersistenceContext(name = "pu_person") + private EntityManager em; + + public ProtocolManager() { + super(Report.class); + } + + @Override + protected EntityManager getEntityManager() { + return em; + } + +} diff --git a/java/mss-failsafe/src/main/java/business/user/DemoManager.java b/java/mss-failsafe/src/main/java/business/user/DemoManager.java new file mode 100755 index 0000000..22401c7 --- /dev/null +++ b/java/mss-failsafe/src/main/java/business/user/DemoManager.java @@ -0,0 +1,301 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package business.user; + +import business.company.CompanyManager; +import business.company.CustomerManager; +import business.company.LocationManager; +import business.machine.MachineManager; +import business.machine.SecurityDeviceCompanyManager; +import business.questions.QuestionaireManager; +import httpauthenticationmechanism.ManagedPerson; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import javax.ejb.EJB; +import javax.ejb.Stateless; +import javax.inject.Inject; +import javax.inject.Named; +import model.adresses.CompanyAddress; +import model.company.Company; +import model.company.Location; +import model.company.Status; +import model.customer.Customer; +import model.machine.Machine; +import model.machine.enums.MachineStatus; +import model.machine.enums.MachineType; +import model.person.Preferences; +import model.person.Salt; +import model.person.enums.Call; +import model.person.enums.UserGroup; +import model.security.SecurityArea; +import model.security.enums.ApproachSpeed; +import model.security.enums.MountingPosition; +import model.security.enums.OverrunMeasurementType; +import model.security.enums.ProtectionType; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author patri + */ +@Stateless +@Named +public class DemoManager { + + protected final Logger LOGGER = LogManager.getLogger(DemoManager.class); + + @EJB + PersonManager personManager; + + @EJB + CompanyManager companyManager; + + @EJB + MachineManager machineManager; + + @EJB + LocationManager locationManager; + + @EJB + PasswordManager passwordManager; + + @EJB + SecurityDeviceCompanyManager securityDeviceCompanyManager; + + @EJB + CustomerManager customerManager; + + @EJB + QuestionaireManager questionaireManager; + + @Inject + ManagedPerson managedPerson; + + /** + * Creates a new instance of NewJSFManagedBean + */ + public DemoManager() { + } + + public void runDemos() { + try { + personManager.demo(); + managedPerson.getLogins(); + createDemoCompanies(); + securityDeviceCompanyManager.loadFromFile(); + questionaireManager.loadAllFromFile(); + } catch (Exception e) { + LOGGER.error(e); + LOGGER.error(e.getMessage()); + } + + LOGGER.info("Created Demos from DemoManager!"); + System.out.println("Created Demos from DemoManager!"); + } + + private void createDemoCompanies() { + Company c1 = new Company(); + + c1.setKundenNr("Ger-120810"); + c1.setComment("Testfirma"); + c1.setHeaderInspection("Headertext gets implemented"); + c1.setHeaderService("Serviceheader text for all of you!"); + c1.setName("TestCompany"); + c1.setStatus(Status.ACTIVE); + c1.setSteuerNr("858688"); + c1.setUmsatzSteuerID("7892346589"); + + List addresses1 = new ArrayList<>(); + CompanyAddress ad1 = new CompanyAddress( + c1, + "Deutschland", + "Vor dem crash", + "12", + null, + 121435, + "Frankfurt", + "Niensbergen", + "Hanso Panso", + "Nur hohe Rechnungen und tiefe Ansagen." + ); + + CompanyAddress ad2 = new CompanyAddress( + c1, + "Östereich", + "Vor dem Berg", + "22", + null, + 82316, + "Stadthagen", + "Krammberg", + "Ösi Dösi", + "Hohe Berge, niedriger IQ" + ); + + addresses1.add(ad1); + addresses1.add(ad2); + + companyManager.create(c1); + c1.setAddresses(new HashSet(addresses1)); + addLocationsAndMachines(c1); + createContacts(c1); + companyManager.save(c1); + } + + private void createContacts(Company company) { + Salt salt = new Salt(); + Salt salt3 = new Salt(); + + Set groupUser = new HashSet<>(); + groupUser.add(UserGroup.CUSTOMER); + + Customer test = new Customer( + "karl.kaufgern@test.de", + (passwordManager.hashPassword("test".toCharArray(), salt.getSalt(), salt.getInterations())), + salt, + groupUser + ); + + Preferences p1 = new Preferences(); + p1.setDefaultPreferences(test); + + test.setFirstname("Karl"); + test.setLastname("Kaufgern"); + test.setMobile("0124584589"); + test.setFax("3445565675"); + test.setTelefon("042154585"); + test.setDevision("Einkauf"); + test.setActive(false); + test.setCall(Call.HERR); + test.setCompany(company); + test.setPreferences(p1); + + customerManager.save(test); + + company.addCustomer(test); + + Customer testInactive = new Customer( + "lisa.lustig@test.de", + (passwordManager.hashPassword("test".toCharArray(), salt3.getSalt(), salt3.getInterations())), + salt3, + groupUser + ); + Preferences p3 = new Preferences(); + p3.setDefaultPreferences(testInactive); + + testInactive.setFirstname("Lisa"); + testInactive.setLastname("Lustig"); + testInactive.setDevision("Maschinen"); + testInactive.setCompany(company); + testInactive.setMobile("0124584589"); + testInactive.setFax("3445565675"); + testInactive.setTelefon("042154585"); + testInactive.setActive(false); + testInactive.setCall(Call.FRAU); + testInactive.setPreferences(p3); + + customerManager.save(testInactive); + + company.addCustomer(testInactive); + } + + private void addLocationsAndMachines(Company company) { + Set locations = new HashSet(); + for (int i = 1; i < 6; i++) { + Location loc = createLocation("Halle " + i); + locationManager.create(loc); + addMachines(loc); + locations.add(loc); + } + + locations.forEach(l -> l.setCompany(company)); + company.setLocations(locations); + } + + private Location createLocation(String name) { + Location location = new Location(); + location.setName(name); + location.setComment("Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut l"); + location.setKostenstelle("Lorem ipsum dolor"); + + return location; + } + + private void addMachines(Location location) { + List machines = new ArrayList<>(); + + for (int i = 1; i < 5; i++) { + Machine machine = createMachine("Maschine Demo " + i + " " + location.getName()); + machineManager.create(machine); + machine.setLocation(location); + machine.setSecurityArea(createAreas(machine)); + + machines.add(machine); + } + + location.setMachines(machines); + } + + private List createAreas(Machine machine) { + List areas = new ArrayList<>(); + SecurityArea area1 = createLeftArea(); + SecurityArea area2 = createRightArea(); + + area1.setMachine(machine); + area2.setMachine(machine); + + areas.add(area1); + areas.add(area2); + + return areas; + } + + private SecurityArea createLeftArea() { + SecurityArea area = new SecurityArea(); + + area.setName("Linke Ecke - Hand ab"); + area.setProtectionType(ProtectionType.LS_MOBILE); + area.setApproachSpeed(ApproachSpeed.SPEED_1_6); + area.setMountingPosition(MountingPosition.FRONT); + area.setOverrunMeasurementType(OverrunMeasurementType.AFTER_PROTECTIVE_DEVICE); + area.setComment("Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut l"); + area.setToolNr("Lorem ipsum dolor"); + + return area; + } + + private SecurityArea createRightArea() { + SecurityArea area = new SecurityArea(); + + area.setName("Rechte Ecke - Andere Hand weg"); + area.setApproachSpeed(ApproachSpeed.SPEED_1_6); + area.setProtectionType(ProtectionType.DANGER_POINT_CLOCK); + area.setMountingPosition(MountingPosition.FRONT); + area.setOverrunMeasurementType(OverrunMeasurementType.AFTER_PROTECTIVE_DEVICE); + area.setComment("Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut l"); + area.setToolNr("Lorem ipsum dolor"); + + return area; + } + + private Machine createMachine(String name) { + Machine machine = new Machine(); + machine.setName(name); + machine.setIndentifier("Lorem ipsum"); + machine.setCostCenter("Lorem ipsum"); + machine.setMachineNr("122-123-5565-1"); + machine.setModellType("Lorem ipsum"); + machine.setMachineType(MachineType.MECHANICALPRESS); + machine.setMachineStatus(MachineStatus.ACTIVE); + machine.setChangeYear(2020); + machine.setBuildingYear(2015); + + return machine; + } +} diff --git a/java/mss-failsafe/mss/src/main/java/business/user/PasswordManager.java b/java/mss-failsafe/src/main/java/business/user/PasswordManager.java old mode 100644 new mode 100755 similarity index 77% rename from java/mss-failsafe/mss/src/main/java/business/user/PasswordManager.java rename to java/mss-failsafe/src/main/java/business/user/PasswordManager.java index fa08f23..922cc64 --- a/java/mss-failsafe/mss/src/main/java/business/user/PasswordManager.java +++ b/java/mss-failsafe/src/main/java/business/user/PasswordManager.java @@ -35,9 +35,10 @@ import model.person.Person; @Named(value = "passwordManager") @Stateless public class PasswordManager implements Serializable { - private static final long serialVersionUID = -4563304131856981259L; - final static Logger LOGGER = LogManager.getLogger(PasswordManager.class); + private static final long serialVersionUID = -4563304131856981259L; + + final static Logger LOGGER = LogManager.getLogger(PasswordManager.class); @PersistenceContext(name = "pu_person") private EntityManager em; @@ -79,7 +80,7 @@ public class PasswordManager implements Serializable { return null; } } - + public boolean passwordCheckEmail(final String email, final byte[] password) { TypedQuery query = em.createNamedQuery(Person.FIND_BY_EMAIL, Person.class); query.setParameter("email", email); @@ -101,15 +102,14 @@ public class PasswordManager implements Serializable { @Transactional public boolean passwordCheckCustomer(final Person user, final String password) { - LOGGER.debug("Test " + user.getEmail() + " mit " + password); byte[] pw = hashPasswordUser(password.toCharArray(), user); - + boolean equals = Arrays.equals(pw, user.getPassword().getPassword()); - + for (int i = 0; i < pw.length; i++) { pw[i] = 0; } - + return equals; } @@ -119,20 +119,41 @@ public class PasswordManager implements Serializable { LOGGER.error("Nullcostumer tried to change Password"); return false; } - - if(passwordCheckCustomer(user, oldPassword)){ + + if (passwordCheckCustomer(user, oldPassword)) { + user = em.find(Person.class, user.getId()); user.getPassword().setPassowrd(hashPasswordUser(newPassword.toCharArray(), user)); LOGGER.info("Password changed for " + user.getEmail()); } else { return false; } - + try { - em.persist(user); + em.merge(user); LOGGER.info("Password changed for " + user.getEmail()); return true; } catch (Exception e) { - LOGGER.error("Couldn't save new password to " + user.getEmail() + " with: " + e.toString()); + LOGGER.error("Couldn't save new password to {} with {}", user.getEmail(), e); + return false; + } + } + + public boolean resetPassword(Person user, String newPassword) { + if (user == null) { + LOGGER.error("Nullcostumer tried to change Password"); + return false; + } + + user = em.find(Person.class, user.getId()); + user.getPassword().setPassowrd(hashPasswordUser(newPassword.toCharArray(), user)); + LOGGER.info("Password changed for " + user.getEmail()); + + try { + em.merge(user); + LOGGER.info("Password changed for " + user.getEmail()); + return true; + } catch (Exception e) { + LOGGER.error("Couldn't save new password to {} with {}", user.getEmail(), e); return false; } } @@ -143,14 +164,14 @@ public class PasswordManager implements Serializable { random.nextBytes(bytes); return bytes; } - - public Password gerateNewRandomPasswordClass(Person user){ + + public Password gerateNewRandomPasswordClass(Person user) { Salt salt = user.getSalt(); String pass = Arrays.toString(generateRandomPassword()); return new Password(user, hashPassword(pass.toCharArray(), salt.getSalt(), salt.getInterations())); } - - public byte[] hashToken(String token){ + + public byte[] hashToken(String token) { try { SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256"); byte[] test = "SuperTestSalz".getBytes(); @@ -164,11 +185,11 @@ public class PasswordManager implements Serializable { } } - public Person getUser() { - return user; - } + public Person getUser() { + return user; + } - public void setUser(Person user) { - this.user = user; - } + public void setUser(Person user) { + this.user = user; + } } diff --git a/java/mss-failsafe/mss/src/main/java/business/user/PersonManager.java b/java/mss-failsafe/src/main/java/business/user/PersonManager.java old mode 100644 new mode 100755 similarity index 67% rename from java/mss-failsafe/mss/src/main/java/business/user/PersonManager.java rename to java/mss-failsafe/src/main/java/business/user/PersonManager.java index a54a8f1..b8dbe06 --- a/java/mss-failsafe/mss/src/main/java/business/user/PersonManager.java +++ b/java/mss-failsafe/src/main/java/business/user/PersonManager.java @@ -5,6 +5,8 @@ */ package business.user; +import business.AbstractManager; +import business.user.UserRoleAssignmentHelper; import java.io.Serializable; import java.time.Instant; import java.util.Optional; @@ -29,8 +31,10 @@ import java.util.Set; import model.person.Salt; import model.person.enums.TokenType; import model.person.Person; +import model.person.Preferences; import model.person.enums.Call; import model.person.enums.UserGroup; +import org.hibernate.Hibernate; /** * @@ -38,7 +42,7 @@ import model.person.enums.UserGroup; */ @Named @Stateless -public class PersonManager implements Serializable { +public class PersonManager extends AbstractManager{ private static final long serialVersionUID = -6581582446436303658L; @@ -52,6 +56,10 @@ public class PersonManager implements Serializable { @PersistenceContext(name = "pu_person", type = PersistenceContextType.EXTENDED) private EntityManager em; + + public PersonManager(){ + super(Person.class); + } @Transactional public void demo() { @@ -59,42 +67,47 @@ public class PersonManager implements Serializable { Salt salt2 = new Salt(); Salt salt3 = new Salt(); - Set groupUser = new HashSet<>(); - groupUser.add(UserGroup.USER); - - Set adminUser = new HashSet<>(); - adminUser.add(UserGroup.ADMIN); + // Verwende UserRoleAssignmentHelper für konsistente Rollenzuweisung + Set groupUser = UserRoleAssignmentHelper.assignRolesHierarchically(UserGroup.USER); + Set adminUser = UserRoleAssignmentHelper.assignRolesHierarchically(UserGroup.ADMIN); Person test = new Person( - "user@test.de", - (passwordManager.hashPassword("test".toCharArray(), salt.getSalt(), salt.getInterations())), + "v.jantscha@mss-failsafe.com", + (passwordManager.hashPassword("SuperSonic3D!".toCharArray(), salt.getSalt(), salt.getInterations())), salt, groupUser ); + + Preferences p1 = new Preferences(); + p1.setDefaultPreferences(test); - test.setFirstname("User"); - test.setLastname("Nachname"); - test.setMobile("0124584589"); - test.setFax("3445565675"); - test.setTelefon("042154585"); + test.setFirstname("Vitali"); + test.setLastname("Jantscha"); + test.setMobile("01621322382"); + test.setFax(""); + test.setTelefon(""); test.setActive(true); test.setCall(Call.HERR); + test.setPreferences(p1); em.persist(test); Person testAdmin = new Person( - "admin@test.de", - (passwordManager.hashPassword("admin".toCharArray(), salt2.getSalt(), salt2.getInterations())), + "patrickplate@gmx.de", + (passwordManager.hashPassword("SuperSonic3D!".toCharArray(), salt2.getSalt(), salt2.getInterations())), salt2, adminUser ); + Preferences p2 = new Preferences(); + p2.setDefaultPreferences(testAdmin); - testAdmin.setFirstname("Admin"); - testAdmin.setLastname("Administratori"); - testAdmin.setMobile("0124584589"); - testAdmin.setFax("3445565675"); - testAdmin.setTelefon("042154585"); + testAdmin.setFirstname("Patrick"); + testAdmin.setLastname("Plate"); + testAdmin.setMobile("01626893144"); + testAdmin.setFax(""); + testAdmin.setTelefon("0421487398"); testAdmin.setActive(true); testAdmin.setCall(Call.HERR); + testAdmin.setPreferences(p2); em.persist(testAdmin); Person testInactive = new Person( @@ -103,6 +116,8 @@ public class PersonManager implements Serializable { salt3, groupUser ); + Preferences p3 = new Preferences(); + p3.setDefaultPreferences(testInactive); testInactive.setFirstname("Admin"); testInactive.setLastname("Administratori"); @@ -111,6 +126,7 @@ public class PersonManager implements Serializable { testInactive.setTelefon("042154585"); testInactive.setActive(false); testInactive.setCall(Call.HERR); + testInactive.setPreferences(p3); em.persist(testInactive); } @@ -118,7 +134,10 @@ public class PersonManager implements Serializable { public Person load(Person user) { try { Person loaded = this.em.find(Person.class, user.getId()); - LOGGER.info(loaded); + Hibernate.initialize(loaded); + Hibernate.initialize(loaded.getAssignTickets()); + Hibernate.initialize(loaded.getCreatedTickets()); + Hibernate.initialize(loaded.getUserGroups()); return loaded; } catch (Exception e) { @@ -131,6 +150,21 @@ public class PersonManager implements Serializable { public Person getActiveUser() { try { Person user = em.find(Person.class, userController.getActiveUser().getId()); + Hibernate.initialize(user); + Hibernate.initialize(user.getAssignTickets()); + Hibernate.initialize(user.getCreatedTickets()); + Hibernate.initialize(user.getUserGroups()); + return user; + } catch (Exception e) { + LOGGER.error("couldn't load user: " + e); + return null; + } + } + + public Person getActiveUserWithWatchlist(){ + try { + Person user = em.find(Person.class, userController.getActiveUser().getId()); + Hibernate.initialize(user.getWatchlist()); return user; } catch (Exception e) { LOGGER.error("couldn't load user: " + e); @@ -156,6 +190,9 @@ public class PersonManager implements Serializable { if (person != null) { person.getUserGroups().size(); + if (person.getCreatedTickets() != null) { + person.getCreatedTickets().size(); + } } return Optional.of(person); @@ -213,21 +250,13 @@ public class PersonManager implements Serializable { } } - public void refresh(Person user) { - if (user == null) { - LOGGER.error("Tried to save null or Nullcustomer"); - return; - } - - try { - em.refresh(user); - } catch (Exception e) { - LOGGER.error("Tried to refresh " + user.getEmail() + " with error: " + e); - } - } - public String resetPassword() { //TODO return null; } + + @Override + protected EntityManager getEntityManager(){ + return em; + } } diff --git a/java/mss-failsafe/src/main/java/business/user/PreferencesManager.java b/java/mss-failsafe/src/main/java/business/user/PreferencesManager.java new file mode 100755 index 0000000..9367e4e --- /dev/null +++ b/java/mss-failsafe/src/main/java/business/user/PreferencesManager.java @@ -0,0 +1,32 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package business.user; + +import business.AbstractManager; +import javax.ejb.Stateless; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import model.person.Preferences; + +/** + * + * @author patri + */ +@Stateless +public class PreferencesManager extends AbstractManager{ + + @PersistenceContext(name = "pu_person") + EntityManager em; + + public PreferencesManager() { + super(Preferences.class); + } + + @Override + protected EntityManager getEntityManager() { + return em; + } +} diff --git a/java/mss-failsafe/userdata/src/main/java/business/user/TokenManager.java b/java/mss-failsafe/src/main/java/business/user/TokenManager.java old mode 100644 new mode 100755 similarity index 55% rename from java/mss-failsafe/userdata/src/main/java/business/user/TokenManager.java rename to java/mss-failsafe/src/main/java/business/user/TokenManager.java index 677a71b..75fa5c3 --- a/java/mss-failsafe/userdata/src/main/java/business/user/TokenManager.java +++ b/java/mss-failsafe/src/main/java/business/user/TokenManager.java @@ -9,17 +9,22 @@ import java.time.Instant; import static java.time.temporal.ChronoUnit.DAYS; import static java.util.UUID.randomUUID; import javax.ejb.Stateless; -import javax.inject.Inject; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import exception.InvalidEmailException; +import java.nio.charset.StandardCharsets; import model.person.Token; import model.person.enums.TokenType; import model.person.Person; import java.util.Arrays; import static java.time.Instant.now; +import javax.ejb.EJB; +import javax.ejb.Schedule; +import javax.persistence.TypedQuery; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; /** * @@ -28,15 +33,45 @@ import static java.time.Instant.now; @Stateless public class TokenManager { + protected static final Logger LOGGER = LogManager.getLogger(TokenManager.class); + @PersistenceContext(name = "pu_person") private EntityManager em; - @Inject + @EJB PasswordManager passwordManager; - - @Inject + + @EJB PersonManager customerManager; - + + public Token loadByRaw(String rawToken) { + if (rawToken == null || rawToken.isBlank()) { + return null; + } + + TypedQuery query = em.createNamedQuery(Token.LOAD_BY_RAW, Token.class); + query.setParameter("raw", rawToken); + + try { + return query.getSingleResult(); + } catch (Exception e) { + LOGGER.error("Couldn't find Token for {} with exception {}", rawToken, e); + } + + return null; + } + + public String generatePWResetToken(final String email, final String ipAddress, final String description) { + + String rawToken = randomUUID().toString(); + Instant expiration = now().plus(1, DAYS); + TokenType type = TokenType.RESET_PASSWORD; + + save(rawToken, email, ipAddress, description, type, expiration); + + return rawToken; + } + public String generate(final String email, final String ipAddress, final String description, final TokenType tokenType) { @@ -47,17 +82,17 @@ public class TokenManager { return rawToken; } - + public String generateFileToken(final String email, final String description) { - + String rawToken = randomUUID().toString(); Instant expiration = now().plus(3, DAYS); - + save(rawToken, email, null, description, TokenType.FILE, expiration); return rawToken; } - + public void save(final String rawToken, final String email, final String ipAddress, final String description, final TokenType tokenType, final Instant expiration) { @@ -66,26 +101,50 @@ public class TokenManager { Token token = new Token(); - token.setTokenHash(Arrays.toString(this.passwordManager.hashToken(rawToken))); + token.setPerson(user); + token.setTokenHash(rawToken); token.setExpiration(expiration); token.setDescription(description); token.setTokenType(tokenType); token.setIpAddress(ipAddress); - user.addToken(token); this.em.persist(user); } - + public void remove(String token) { this.em.createNamedQuery(Token.REMOVE_TOKEN) .setParameter("tokenHash", token).executeUpdate(); } - public void removeExpired() { + public void delete(Long id){ + if (id == null) { + return; + } + Token t = em.find(Token.class, id); + + if (t == null) { + return; + } + + em.remove(t); + } + + public void delete(Token token){ + if (token == null || token.getId() == null) { + return; + } + + delete(token.getId()); + } + + @Schedule(hour = "*", minute = "22") + public void removeExspired() { + LOGGER.info("Start to remove exspired tokens"); this.em.createNamedQuery(Token.REMOVE_EXPIRED_TOKEN) .setParameter("timestamp", Instant.now()) .executeUpdate(); + LOGGER.info("Finished removing exspired tokens"); } } diff --git a/java/mss-failsafe/mss/src/main/java/business/user/UserPictureManager.java b/java/mss-failsafe/src/main/java/business/user/UserPictureManager.java old mode 100644 new mode 100755 similarity index 77% rename from java/mss-failsafe/mss/src/main/java/business/user/UserPictureManager.java rename to java/mss-failsafe/src/main/java/business/user/UserPictureManager.java index 441cb49..7378447 --- a/java/mss-failsafe/mss/src/main/java/business/user/UserPictureManager.java +++ b/java/mss-failsafe/src/main/java/business/user/UserPictureManager.java @@ -43,4 +43,16 @@ public class UserPictureManager extends AbstractManager{ public void setPic(UserPicture pic) { this.pic = pic; } + + public UserPicture findWithData(Long id){ + UserPicture pic = find(id); + + if (pic == null) { + return null; + } + + int i = pic.getFileData().length; + + return pic; + } } diff --git a/java/mss-failsafe/src/main/java/business/user/UserRoleAssignmentHelper.java b/java/mss-failsafe/src/main/java/business/user/UserRoleAssignmentHelper.java new file mode 100755 index 0000000..8b57c04 --- /dev/null +++ b/java/mss-failsafe/src/main/java/business/user/UserRoleAssignmentHelper.java @@ -0,0 +1,76 @@ +package business.user; + +import model.person.enums.UserGroup; +import java.util.HashSet; +import java.util.Set; + +/** + * Hilfsmethoden für die hierarchische Rollenzuweisung bei Benutzern. + * + * @author patri + */ +public class UserRoleAssignmentHelper { + + /** + * Erstellt ein Set von UserGroups basierend auf der Hauptrolle. + * Implementiert hierarchische Rollenzuweisung: + * - ADMIN: erhält USER, SUPERUSER, ADMIN + * - SUPERUSER: erhält USER, SUPERUSER + * - USER: erhält nur USER + * - CUSTOMER: erhält nur CUSTOMER + * + * @param primaryRole Die Hauptrolle des Benutzers + * @return Set mit allen zugewiesenen Rollen + */ + public static Set assignRolesHierarchically(UserGroup primaryRole) { + Set roles = new HashSet<>(); + + switch (primaryRole) { + case ADMIN: + // Admin erhält alle Rollen: USER, SUPERUSER, ADMIN + roles.add(UserGroup.USER); + roles.add(UserGroup.SUPERUSER); + roles.add(UserGroup.ADMIN); + break; + case SUPERUSER: + // Superuser erhält USER und SUPERUSER Rollen + roles.add(UserGroup.USER); + roles.add(UserGroup.SUPERUSER); + break; + case USER: + // User erhält nur USER Rolle + roles.add(UserGroup.USER); + break; + case CUSTOMER: + // Customer erhält nur CUSTOMER Rolle + roles.add(UserGroup.CUSTOMER); + break; + default: + // Fallback: Standard USER Rolle + roles.add(UserGroup.USER); + break; + } + + return roles; + } + + /** + * Erstellt ein Set von UserGroups basierend auf der Hauptrolle als String. + * + * @param primaryRoleString Die Hauptrolle als String + * @return Set mit allen zugewiesenen Rollen + */ + public static Set assignRolesHierarchically(String primaryRoleString) { + if (primaryRoleString == null || primaryRoleString.isEmpty()) { + return assignRolesHierarchically(UserGroup.USER); + } + + try { + UserGroup primaryRole = UserGroup.valueOf(primaryRoleString.toUpperCase()); + return assignRolesHierarchically(primaryRole); + } catch (IllegalArgumentException e) { + // Fallback bei ungültiger Rolle + return assignRolesHierarchically(UserGroup.USER); + } + } +} diff --git a/java/mss-failsafe/src/main/java/business/user/UserRoleValidationManager.java b/java/mss-failsafe/src/main/java/business/user/UserRoleValidationManager.java new file mode 100755 index 0000000..6ac80e2 --- /dev/null +++ b/java/mss-failsafe/src/main/java/business/user/UserRoleValidationManager.java @@ -0,0 +1,188 @@ +package business.user; + +import business.AbstractManager; +import model.person.Person; +import model.person.enums.UserGroup; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import javax.annotation.PostConstruct; +import javax.ejb.Singleton; +import javax.ejb.Startup; +import javax.inject.Named; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.TypedQuery; +import javax.transaction.Transactional; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * Startup-Service zur einmaligen Validierung und Korrektur von Benutzerrollen beim Anwendungsstart. + * Überprüft alle bestehenden Benutzer in der Datenbank und korrigiert fehlerhafte Rollenzuweisungen. + * Nach dem initialen Startup wird davon ausgegangen, dass neue Benutzer korrekt mit ihren Rollen erstellt werden. + * + * @author Patrick + */ +@Named +@Singleton +@Startup +public class UserRoleValidationManager extends AbstractManager { + + private static final Logger LOGGER = LogManager.getLogger(UserRoleValidationManager.class); + + @PersistenceContext(name = "pu_person") + private EntityManager em; + + public UserRoleValidationManager() { + super(Person.class); + } + + /** + * Wird automatisch beim Anwendungsstart ausgeführt. + * Validiert und korrigiert alle Benutzerrollen in der Datenbank. + */ + @PostConstruct + @Transactional + public void validateRolesOnStartup() { + LOGGER.info("=== Anwendungsstart: Benutzerrollenvalidierung wird gestartet ==="); + + try { + int correctedUsersCount = validateAndCorrectAllUserRoles(); + + if (correctedUsersCount > 0) { + LOGGER.warn("Beim Anwendungsstart wurden {} Benutzer mit fehlerhaften Rollen korrigiert.", correctedUsersCount); + } else { + LOGGER.info("Alle Benutzerrollen sind korrekt. Keine Korrekturen erforderlich."); + } + + LOGGER.info("=== Benutzerrollenvalidierung beim Anwendungsstart abgeschlossen ==="); + + } catch (Exception e) { + LOGGER.error("Fehler bei der Benutzerrollenvalidierung beim Anwendungsstart: ", e); + } + } + + /** + * Überprüft alle Benutzer in der Datenbank und korrigiert ihre Rollen falls nötig. + * Diese Methode wird hauptsächlich beim Anwendungsstart verwendet. + * + * @return Anzahl der korrigierten Benutzer + */ + @Transactional + public int validateAndCorrectAllUserRoles() { + LOGGER.debug("Lade alle Benutzer für Rollenvalidierung..."); + + List allUsers = getAllUsers(); + int correctedUsersCount = 0; + + LOGGER.info("Validiere Rollen für {} Benutzer...", allUsers.size()); + + for (Person user : allUsers) { + if (validateAndCorrectUserRole(user)) { + correctedUsersCount++; + } + } + + LOGGER.info("Benutzerrollenvalidierung abgeschlossen. {} Benutzer wurden korrigiert.", correctedUsersCount); + return correctedUsersCount; + } + + /** + * Validiert und korrigiert die Rollen eines einzelnen Benutzers. + * + * @param user Der zu überprüfende Benutzer + * @return true wenn Korrekturen vorgenommen wurden, false wenn keine nötig waren + */ + @Transactional + public boolean validateAndCorrectUserRole(Person user) { + if (user == null || user.getUserGroups() == null || user.getUserGroups().isEmpty()) { + LOGGER.warn("Benutzer {} hat keine Rollen zugewiesen. Standard USER-Rolle wird vergeben.", + user != null ? user.getEmail() : "null"); + + if (user != null) { + Set defaultRoles = UserRoleAssignmentHelper.assignRolesHierarchically(UserGroup.USER); + user.setUserGroups(defaultRoles); + em.merge(user); + LOGGER.info("Standard USER-Rolle für Benutzer {} vergeben.", user.getEmail()); + return true; + } + return false; + } + + // Bestimme die höchste Rolle des Benutzers + UserGroup highestRole = determineHighestRole(user.getUserGroups()); + + // Erstelle das korrekte Rollenset basierend auf der höchsten Rolle + Set correctRoles = UserRoleAssignmentHelper.assignRolesHierarchically(highestRole); + + // Vergleiche aktuelle Rollen mit korrekten Rollen + if (!user.getUserGroups().equals(correctRoles)) { + LOGGER.info("Korrigiere Rollen für Benutzer {}. Alte Rollen: {}, Neue Rollen: {}", + user.getEmail(), user.getUserGroups(), correctRoles); + + user.setUserGroups(correctRoles); + em.merge(user); + return true; + } + + return false; + } + + /** + * Bestimmt die höchste Rolle aus einem Set von UserGroups. + * Hierarchie: ADMIN > SUPERUSER > USER > CUSTOMER + * + * @param userGroups Set der Benutzerrollen + * @return Die höchste gefundene Rolle + */ + private UserGroup determineHighestRole(Set userGroups) { + if (userGroups.contains(UserGroup.ADMIN)) { + return UserGroup.ADMIN; + } else if (userGroups.contains(UserGroup.SUPERUSER)) { + return UserGroup.SUPERUSER; + } else if (userGroups.contains(UserGroup.USER)) { + return UserGroup.USER; + } else if (userGroups.contains(UserGroup.CUSTOMER)) { + return UserGroup.CUSTOMER; + } else { + // Fallback: USER als Standardrolle + return UserGroup.USER; + } + } + + /** + * Lädt alle Benutzer aus der Datenbank. + * + * @return Liste aller Benutzer + */ + private List getAllUsers() { + TypedQuery query = em.createQuery("SELECT p FROM Person p", Person.class); + return query.getResultList(); + } + + /** + * Findet alle Benutzer ohne korrekte Rollenzuweisung. + * + * @return Liste der Benutzer mit fehlerhaften Rollen + */ + public List findUsersWithIncorrectRoles() { + List allUsers = getAllUsers(); + return allUsers.stream() + .filter(user -> { + if (user.getUserGroups() == null || user.getUserGroups().isEmpty()) { + return true; + } + UserGroup highestRole = determineHighestRole(user.getUserGroups()); + Set correctRoles = UserRoleAssignmentHelper.assignRolesHierarchically(highestRole); + return !user.getUserGroups().equals(correctRoles); + }) + .collect(Collectors.toList()); + } + + @Override + protected EntityManager getEntityManager() { + return em; + } +} diff --git a/java/mss-failsafe/src/main/java/controller/AbstractController.java b/java/mss-failsafe/src/main/java/controller/AbstractController.java new file mode 100755 index 0000000..83e529d --- /dev/null +++ b/java/mss-failsafe/src/main/java/controller/AbstractController.java @@ -0,0 +1,381 @@ +package controller; + +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +import business.AbstractManager; + +import java.io.IOException; +import java.io.Serializable; +import java.net.MalformedURLException; +import java.util.*; +import java.util.List; +import javax.faces.application.FacesMessage; +import javax.faces.context.FacesContext; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.itextpdf.io.font.constants.StandardFonts; +import com.itextpdf.io.image.ImageData; +import com.itextpdf.io.image.ImageDataFactory; +import com.itextpdf.kernel.colors.ColorConstants; +import com.itextpdf.kernel.font.PdfFontFactory; +import com.itextpdf.layout.Document; +import com.itextpdf.layout.borders.Border; +import com.itextpdf.layout.element.*; +import com.itextpdf.layout.properties.TextAlignment; +import com.itextpdf.layout.properties.VerticalAlignment; +import model.AbstractEntity; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.bouncycastle.util.test.Test; +import org.primefaces.PrimeFaces; + +/** + * + * @author Patrick + * @param + */ +public abstract class AbstractController implements Serializable { + + protected final Logger LOGGER = LogManager.getLogger(this.getClass()); + + public final static String SUCCESS_TITLE = "Erfolg!"; + public final static String SUCCESS_MESSAGE = "Aktion wurde erfolgreich ausgeführt"; + public final static String ERROR_TITLE = "Fehler!"; + public final static String ERROR_MESSAGE = "Es ist ein Fehler aufgetreten, bitte versuchen Sie es erneut!"; + + public final static String LOGO_PATH = "/rundata/logo.png"; + + protected final String FONT_BOLD = StandardFonts.HELVETICA_BOLD; + protected final String FONT_NORMAL = StandardFonts.HELVETICA; + + private ENT selected; + private ENT created; + private List entities; + + private static final long serialVersionUID = -5908716187853409719L; + + public AbstractController() { + entities = new ArrayList<>(); + } + + public void refrehSelected(){ + if (selected == null) { + return; + } + + selected = getManager().refresh(selected); + } + + protected abstract AbstractManager getManager(); + + protected void sendInfoMessage(String title, String message) { + FacesMessage facesMessage = new FacesMessage( + FacesMessage.SEVERITY_INFO, title, message); + addMessage(facesMessage); + } + + protected void sendWarnMessage(String title, String message) { + FacesMessage facesMessage = new FacesMessage( + FacesMessage.SEVERITY_WARN, title, message); + addMessage(facesMessage); + } + + protected void sendErrorMessage(String title, String message) { + FacesMessage facesMessage = new FacesMessage( + FacesMessage.SEVERITY_ERROR, title, message); + addMessage(facesMessage); + } + + protected void sendFatalMessage(String title, String message) { + FacesMessage facesMessage = new FacesMessage( + FacesMessage.SEVERITY_FATAL, title, message); + addMessage(facesMessage); + } + + private void addMessage(FacesMessage message) { + FacesContext.getCurrentInstance().addMessage(null, message); + } + + protected void errorMessage() { + sendErrorMessage(ERROR_TITLE, ERROR_MESSAGE); + } + + protected void successMessage() { + sendInfoMessage(SUCCESS_TITLE, SUCCESS_MESSAGE); + } + + protected void closeDialogs(String... widgets){ + PrimeFaces current = PrimeFaces.current(); + for(String widget : widgets){ + current.executeScript("PF('"+ widget + "').hide()"); + } + } + + public abstract void clearEntries(); + + protected Long createFakeID(Collection col){ + Long out = -1L; + + if (col == null) { + return out; + } + + if (col.isEmpty()) { + return out; + } + + Optional min = col.stream().min((l1, l2) -> Long.compare(l1.getId(), l2.getId())); + + if (min.isEmpty() || min.get().getId() > 0L) { + return out; + } + + out = min.get().getId() - 1L; + + return out; + } + + protected Image loadCompanyLogo() { + ImageData data; + try { + data = ImageDataFactory.create(LOGO_PATH); + } catch (MalformedURLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + return null; + } + + return new Image(data); + } + + protected Table generateSorroundingTable(String header, float maxWidth) throws IOException { + // Creating a table + float[] pointColumnWidths = {maxWidth}; + Table table = new Table(pointColumnWidths, true); + if (header == null || header.isEmpty()) { + return table; + } + + Text text = new Text(header); + text.setFont(PdfFontFactory.createFont(FONT_BOLD)); + text.setFontSize(12F); + Paragraph p = new Paragraph(text); + + table.addHeaderCell(new Cell().add(p).setBorderBottom(Border.NO_BORDER)); + + return table; + } + + protected Cell generateInnerTable(Text header, boolean last, String... values) throws IOException { + Cell cell = new Cell(); + cell.setBorderTop(Border.NO_BORDER); + if (!last) { + cell.setBorderBottom(Border.NO_BORDER); + } + + float[] pointColumnWidths = {270F, 270F}; + Table table = new Table(pointColumnWidths); + + header.setFont(PdfFontFactory.createFont(FONT_NORMAL)); + header.setFontSize(11F); + Paragraph p = new Paragraph(header); + table.addHeaderCell(new Cell().add(p).setBorder(Border.NO_BORDER)); + table.addHeaderCell(new Cell().setBorder(Border.NO_BORDER)); + + table.setBorder(Border.NO_BORDER); + + boolean isGray = true; + + for (int i = 0; i + 1 < values.length; i = i + 2) { + if (values[i] == null || values[i].isEmpty()) { + continue; + } + addInnerCells(table, values[i], values[i + 1], isGray); + isGray = !isGray; + } + + cell.add(table); + return cell; + } + + protected Cell generateInnerTable(Text header, int nrColumns, boolean last, String... values) throws IOException { + Cell outputCell = new Cell(); + outputCell.setBorderTop(Border.NO_BORDER); + if (!last) { + outputCell.setBorderBottom(Border.NO_BORDER); + } + + // calculate column widths + float[] pointColumnWidths = new float[nrColumns]; + Arrays.fill(pointColumnWidths, 540F / nrColumns); + + Table table = new Table(pointColumnWidths); + + header.setFont(PdfFontFactory.createFont(FONT_NORMAL)); + header.setFontSize(11F); + Paragraph p = new Paragraph(header); + table.addHeaderCell(new Cell().add(p).setBorder(Border.NO_BORDER)); + for (int i = 0; i < nrColumns - 1; i++) { + table.addHeaderCell(new Cell().setBorder(Border.NO_BORDER)); + } + + if (values.length < nrColumns) { + return outputCell; + } + + for (int i = 0; i < nrColumns; i++) { + Text headerText = new Text(values[i]); + Cell cell1 = new Cell(); + cell1.setBorder(Border.NO_BORDER); + headerText.setFont(PdfFontFactory.createFont(FONT_BOLD)); + headerText.setFontSize(11F); + Paragraph p1 = new Paragraph(headerText); + cell1.add(p1); + table.addHeaderCell(cell1); + } + + table.setBorder(Border.NO_BORDER); + + boolean isGray = true; + + // add inner cells for n columns + for (int i = nrColumns; i + nrColumns <= values.length; i = i + nrColumns) { + String[] strings = new String[nrColumns - 1]; + System.arraycopy(values, i + 1, strings, 0, nrColumns - 1); + addInnerCells(table, values[i], isGray, strings); + isGray = !isGray; + } + + outputCell.add(table); + return outputCell; + } + + protected void addInnerCells(Table table, String name, String value, boolean isGray) throws IOException { + if (table == null) { + return; + } + + Cell cell1 = new Cell(); + cell1.setBorder(Border.NO_BORDER); + Text t1 = new Text(name != null ? name : " "); + t1.setFont(PdfFontFactory.createFont(FONT_NORMAL)); + t1.setFontSize(8F); + Paragraph p1 = new Paragraph(t1); + p1.setMultipliedLeading(1F); + cell1.add(p1); + + Cell cell2 = new Cell(); + cell2.setBorder(Border.NO_BORDER); + Text t2 = new Text(value != null ? value : "-/-"); + t2.setFont(PdfFontFactory.createFont(FONT_NORMAL)); + t2.setFontSize(8F); + Paragraph p2 = new Paragraph(t2); + p2.setMultipliedLeading(1F); + cell2.add(p2); + + if (isGray) { + cell1.setBackgroundColor(ColorConstants.LIGHT_GRAY, 0.248F); + cell2.setBackgroundColor(ColorConstants.LIGHT_GRAY, 0.248F); + } + + table.addCell(cell1); + table.addCell(cell2); + } + + protected void addInnerCells(Table table, String name, boolean isGray, String... values) throws IOException { + if (table == null) { + return; + } + + Cell cell1 = new Cell(); + cell1.setBorder(Border.NO_BORDER); + Text t1 = new Text(name != null ? name : " "); + t1.setFont(PdfFontFactory.createFont(FONT_NORMAL)); + t1.setFontSize(8F); + Paragraph p1 = new Paragraph(t1); + p1.setMultipliedLeading(1F); + cell1.add(p1); + if (isGray) { + cell1.setBackgroundColor(ColorConstants.LIGHT_GRAY, 0.248F); + } + table.addCell(cell1); + + for (int i = 0; i < values.length; i++) { + Cell cell = new Cell(); + cell.setBorder(Border.NO_BORDER); + Text t2 = new Text(values[i] != null ? values[i] : "-/-"); + t2.setFont(PdfFontFactory.createFont(FONT_NORMAL)); + t2.setFontSize(8F); + Paragraph p2 = new Paragraph(t2); + p2.setMultipliedLeading(1F); + cell.add(p2); + + if (isGray) { + cell.setBackgroundColor(ColorConstants.LIGHT_GRAY, 0.248F); + } + + table.addCell(cell); + } + } + + protected void addPagenumbers(Document document, String ticketNr, Image nextPagesCompanyLogo) throws Exception { + int numberOfPages = document.getPdfDocument().getNumberOfPages(); + LOGGER.info("Found pages {}", numberOfPages); + nextPagesCompanyLogo.scale(0.09F, 0.09F); + + for (int i = 1; i <= numberOfPages; i++) { + // Write aligned text to the specified by parameters point + Text text = new Text(String.format("%s - Seite %s/%s", ticketNr, i, numberOfPages)); + text.setFont(PdfFontFactory.createFont(FONT_NORMAL)); + text.setFontSize(8F); + Paragraph p = new Paragraph(text); + + if (i > 1) { + nextPagesCompanyLogo.setFixedPosition(i, 394F, 796F); + document.add(nextPagesCompanyLogo); + } + + document.showTextAligned(p, + 559, 30, i, TextAlignment.RIGHT, VerticalAlignment.TOP, 0); + } + } + + protected HttpServletRequest getRequest(FacesContext context) { + return (HttpServletRequest) context.getExternalContext().getRequest(); + } + + protected HttpServletResponse getResponse(FacesContext context) { + return (HttpServletResponse) context.getExternalContext().getResponse(); + } + + public ENT getSelected() { + return selected; + } + + public void setSelected(ENT selected) { + this.selected = selected; + } + + public ENT getCreated() { + return created; + } + + public void setCreated(ENT created) { + this.created = created; + } + + public List getEntities() { + return entities; + } + + public void setEntities(List entities) { + this.entities = entities; + } + + +} diff --git a/java/mss-failsafe/src/main/java/controller/TimeController.java b/java/mss-failsafe/src/main/java/controller/TimeController.java new file mode 100755 index 0000000..0859c62 --- /dev/null +++ b/java/mss-failsafe/src/main/java/controller/TimeController.java @@ -0,0 +1,37 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package controller; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import javax.enterprise.context.RequestScoped; +import javax.inject.Named; + +/** + * + * @author pplate + */ +@Named +@RequestScoped +public class TimeController { + + private static final DateTimeFormatter GERMAN_DATE_FORMATTER = DateTimeFormatter.ofPattern("dd.MM.yyyy"); + private static final DateTimeFormatter GERMAN_DATETIME_FORMATTER = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"); + + public String germanDateString(LocalDate localDate) { + if (localDate == null) { + return ""; + } + return localDate.format(GERMAN_DATE_FORMATTER); + } + + public String germanDateString(LocalDateTime localDateTime) { + if (localDateTime == null) { + return ""; + } + return localDateTime.format(GERMAN_DATETIME_FORMATTER); + } +} diff --git a/java/mss-failsafe/src/main/java/controller/admin/AdminPasswordResetController.java b/java/mss-failsafe/src/main/java/controller/admin/AdminPasswordResetController.java new file mode 100755 index 0000000..fae0284 --- /dev/null +++ b/java/mss-failsafe/src/main/java/controller/admin/AdminPasswordResetController.java @@ -0,0 +1,210 @@ +package controller.admin; + +import business.user.PasswordManager; +import business.user.PersonManager; +import controller.AbstractController; +import java.io.Serializable; +import java.util.List; +import java.util.Optional; +import javax.ejb.EJB; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import model.person.Person; + +/** + * Controller für das Admin-Passwort-Reset-Interface. + * Ermöglicht Administratoren das Zurücksetzen von Benutzerpasswörtern + * und das Setzen neuer Passwörter für alle Benutzer im System. + * + * @author Patrick + */ +@Named +@ViewScoped +public class AdminPasswordResetController extends AbstractController implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * E-Mail-Adresse des Benutzers, dessen Passwort zurückgesetzt werden soll. + */ + private String userEmail; + + /** + * Neues Passwort, das für den ausgewählten Benutzer gesetzt werden soll. + */ + private String newPassword; + + /** + * Bestätigung des neuen Passworts zur Vermeidung von Tippfehlern. + */ + private String confirmPassword; + + /** + * Der ausgewählte Benutzer, dessen Passwort zurückgesetzt wird. + */ + private Person selectedUser; + + /** + * Liste aller verfügbaren Benutzer für die Auswahl. + */ + private List allUsers; + + @EJB + private PersonManager personManager; + + @EJB + private PasswordManager passwordManager; + + /** + * Sucht einen Benutzer anhand der E-Mail-Adresse. + * Lädt den Benutzer und bereitet ihn für das Passwort-Reset vor. + */ + public void searchUser() { + if (userEmail == null || userEmail.trim().isEmpty()) { + sendErrorMessage("Fehler", "Bitte geben Sie eine E-Mail-Adresse ein."); + selectedUser = null; + return; + } + + Optional user = personManager.getByEmail(userEmail.trim()); + if (user.isEmpty()) { + sendErrorMessage("Fehler", "Kein Benutzer mit der E-Mail-Adresse '" + userEmail + "' gefunden."); + selectedUser = null; + return; + } + + selectedUser = user.get(); + sendInfoMessage("Erfolg", "Benutzer '" + selectedUser.getFirstname() + " " + + selectedUser.getLastname() + "' gefunden."); + + // Passwort-Felder zurücksetzen + newPassword = null; + confirmPassword = null; + } + + /** + * Setzt das Passwort für den ausgewählten Benutzer zurück. + * Validiert die Eingaben und aktualisiert das Passwort in der Datenbank. + */ + public void resetPassword() { + if (selectedUser == null) { + sendErrorMessage("Fehler", "Bitte wählen Sie zuerst einen Benutzer aus."); + return; + } + + if (newPassword == null || newPassword.trim().isEmpty()) { + sendErrorMessage("Fehler", "Bitte geben Sie ein neues Passwort ein."); + return; + } + + if (newPassword.length() < 6) { + sendErrorMessage("Fehler", "Das Passwort muss mindestens 6 Zeichen lang sein."); + return; + } + + if (!newPassword.equals(confirmPassword)) { + sendErrorMessage("Fehler", "Die Passwort-Bestätigung stimmt nicht überein."); + return; + } + + try { + // Passwort über den PasswordManager zurücksetzen + boolean success = passwordManager.resetPassword(selectedUser, newPassword); + + if (success) { + sendInfoMessage("Erfolg", "Passwort für Benutzer '" + selectedUser.getEmail() + + "' wurde erfolgreich zurückgesetzt."); + + // Eingaben zurücksetzen + clearEntries(); + } else { + sendErrorMessage("Fehler", "Fehler beim Zurücksetzen des Passworts. Bitte versuchen Sie es erneut."); + } + } catch (Exception e) { + LOGGER.error("Fehler beim Zurücksetzen des Passworts für Benutzer: " + selectedUser.getEmail(), e); + sendErrorMessage("Fehler", "Ein unerwarteter Fehler ist aufgetreten. Bitte versuchen Sie es erneut."); + } + } + + /** + * Lädt alle Benutzer für die Dropdown-Auswahl. + * @return Liste aller Benutzer im System + */ + public List getAllUsers() { + if (allUsers == null) { + allUsers = personManager.findAll(); + } + return allUsers; + } + + /** + * Setzt das Passwort direkt für einen aus der Liste ausgewählten Benutzer. + */ + public void setPasswordForSelectedUser() { + if (selectedUser == null) { + sendErrorMessage("Fehler", "Bitte wählen Sie einen Benutzer aus der Liste aus."); + return; + } + + // E-Mail-Feld mit der Auswahl synchronisieren + userEmail = selectedUser.getEmail(); + + // Passwort-Felder zurücksetzen + newPassword = null; + confirmPassword = null; + + sendInfoMessage("Info", "Benutzer '" + selectedUser.getFirstname() + " " + + selectedUser.getLastname() + "' ausgewählt."); + } + + @Override + public void clearEntries() { + userEmail = null; + newPassword = null; + confirmPassword = null; + selectedUser = null; + allUsers = null; + } + + @Override + protected PersonManager getManager() { + return personManager; + } + + // Getter und Setter + public String getUserEmail() { + return userEmail; + } + + public void setUserEmail(String userEmail) { + this.userEmail = userEmail; + } + + public String getNewPassword() { + return newPassword; + } + + public void setNewPassword(String newPassword) { + this.newPassword = newPassword; + } + + public String getConfirmPassword() { + return confirmPassword; + } + + public void setConfirmPassword(String confirmPassword) { + this.confirmPassword = confirmPassword; + } + + public Person getSelectedUser() { + return selectedUser; + } + + public void setSelectedUser(Person selectedUser) { + this.selectedUser = selectedUser; + } + + public void setAllUsers(List allUsers) { + this.allUsers = allUsers; + } +} diff --git a/java/mss-failsafe/src/main/java/controller/admin/AdminUserManagementController.java b/java/mss-failsafe/src/main/java/controller/admin/AdminUserManagementController.java new file mode 100755 index 0000000..ab0749f --- /dev/null +++ b/java/mss-failsafe/src/main/java/controller/admin/AdminUserManagementController.java @@ -0,0 +1,349 @@ +package controller.admin; + +import business.user.PersonManager; +import controller.AbstractController; +import java.io.Serializable; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import javax.ejb.EJB; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import model.person.Person; +import model.person.enums.UserGroup; + +/** + * Controller für das Admin-Interface zum Sperren und Löschen von Benutzern. + * Ermöglicht Administratoren das Verwalten von Benutzerkonten durch: + * - Sperren/Entsperren von Benutzern (active/inactive setzen) + * - Vollständiges Löschen von Benutzerkonten + * - Suche und Anzeige von Benutzerdaten + * + * @author Patrick + */ +@Named +@ViewScoped +public class AdminUserManagementController extends AbstractController implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * E-Mail-Adresse des zu verwaltenden Benutzers. + */ + private String userEmail; + + /** + * Der ausgewählte Benutzer für Verwaltungsaktionen. + */ + private Person selectedUser; + + /** + * Liste aller verfügbaren Benutzer für die Auswahl. + */ + private List allUsers; + + /** + * Bestätigungstext für Löschaktionen. + */ + private String confirmationText; + + @EJB + private PersonManager personManager; + + /** + * Sucht einen Benutzer anhand der E-Mail-Adresse. + * Lädt den Benutzer und bereitet ihn für Verwaltungsaktionen vor. + */ + public void searchUser() { + if (userEmail == null || userEmail.trim().isEmpty()) { + sendErrorMessage("Fehler", "Bitte geben Sie eine E-Mail-Adresse ein."); + selectedUser = null; + return; + } + + Optional user = personManager.getByEmail(userEmail.trim()); + if (user.isEmpty()) { + sendErrorMessage("Fehler", "Kein Benutzer mit der E-Mail-Adresse '" + userEmail + "' gefunden."); + selectedUser = null; + return; + } + + selectedUser = user.get(); + sendInfoMessage("Erfolg", "Benutzer '" + selectedUser.getFirstname() + " " + + selectedUser.getLastname() + "' gefunden."); + + // Bestätigungstext zurücksetzen + confirmationText = null; + } + + /** + * Sperrt einen Benutzer (setzt active = false). + * Der Benutzer kann sich nicht mehr am System anmelden. + */ + public void blockUser() { + if (selectedUser == null) { + sendErrorMessage("Fehler", "Bitte wählen Sie zuerst einen Benutzer aus."); + return; + } + + if (!selectedUser.isActive()) { + sendWarnMessage("Hinweis", "Benutzer '" + selectedUser.getEmail() + "' ist bereits gesperrt."); + return; + } + + try { + selectedUser.setActive(false); + personManager.save(selectedUser); + + sendInfoMessage("Erfolg", "Benutzer '" + selectedUser.getEmail() + + "' wurde erfolgreich gesperrt. Der Benutzer kann sich nicht mehr anmelden."); + + LOGGER.info("Admin blocked user: " + selectedUser.getEmail()); + + // Benutzer neu laden um LazyInitializationException zu vermeiden + refreshSelectedUser(); + + } catch (Exception e) { + LOGGER.error("Fehler beim Sperren des Benutzers: " + selectedUser.getEmail(), e); + sendErrorMessage("Fehler", "Ein Fehler ist beim Sperren des Benutzers aufgetreten."); + } + } + + /** + * Entsperrt einen Benutzer (setzt active = true). + * Der Benutzer kann sich wieder am System anmelden. + */ + public void unblockUser() { + if (selectedUser == null) { + sendErrorMessage("Fehler", "Bitte wählen Sie zuerst einen Benutzer aus."); + return; + } + + if (selectedUser.isActive()) { + sendWarnMessage("Hinweis", "Benutzer '" + selectedUser.getEmail() + "' ist bereits aktiv."); + return; + } + + try { + selectedUser.setActive(true); + personManager.save(selectedUser); + + sendInfoMessage("Erfolg", "Benutzer '" + selectedUser.getEmail() + + "' wurde erfolgreich entsperrt. Der Benutzer kann sich wieder anmelden."); + + LOGGER.info("Admin unblocked user: " + selectedUser.getEmail()); + + // Benutzer neu laden um LazyInitializationException zu vermeiden + refreshSelectedUser(); + + } catch (Exception e) { + LOGGER.error("Fehler beim Entsperren des Benutzers: " + selectedUser.getEmail(), e); + sendErrorMessage("Fehler", "Ein Fehler ist beim Entsperren des Benutzers aufgetreten."); + } + } + + /** + * Deaktiviert einen Benutzer permanent (setzt active = false). + * Dies ist sicherer als das vollständige Löschen, da Referenzen erhalten bleiben. + * ACHTUNG: Diese Aktion sollte nur in Ausnahmefällen verwendet werden! + */ + public void deleteUser() { + if (selectedUser == null) { + sendErrorMessage("Fehler", "Bitte wählen Sie zuerst einen Benutzer aus."); + return; + } + + // Sicherheitscheck: Bestätigungstext muss exakt der E-Mail entsprechen + if (confirmationText == null || !confirmationText.equals(selectedUser.getEmail())) { + sendErrorMessage("Fehler", "Zur Bestätigung der Deaktivierung müssen Sie die E-Mail-Adresse '" + + selectedUser.getEmail() + "' genau eingeben."); + return; + } + + try { + String deletedEmail = selectedUser.getEmail(); + String deletedName = selectedUser.getFirstname() + " " + selectedUser.getLastname(); + + // Benutzer permanent deaktivieren (sicherer als löschen) + selectedUser.setActive(false); + personManager.save(selectedUser); + + sendInfoMessage("Erfolg", "Benutzer '" + deletedName + "' (" + deletedEmail + + ") wurde permanent deaktiviert. Der Benutzer kann sich nicht mehr anmelden."); + + LOGGER.warn("Admin permanently deactivated user: " + deletedEmail + " (" + deletedName + ")"); + + // Eingaben zurücksetzen + clearEntries(); + + } catch (Exception e) { + LOGGER.error("Fehler beim Deaktivieren des Benutzers: " + selectedUser.getEmail(), e); + sendErrorMessage("Fehler", "Ein Fehler ist beim Deaktivieren des Benutzers aufgetreten."); + } + } + + /** + * Setzt einen Benutzer aus der Liste für Verwaltungsaktionen. + */ + public void setUserFromList() { + if (selectedUser == null) { + sendErrorMessage("Fehler", "Bitte wählen Sie einen Benutzer aus der Liste aus."); + return; + } + + try { + // Benutzer mit load() neu laden um userGroups korrekt zu initialisieren + selectedUser = personManager.load(selectedUser); + + if (selectedUser == null) { + sendErrorMessage("Fehler", "Benutzer konnte nicht geladen werden."); + return; + } + + // E-Mail-Feld mit der Auswahl synchronisieren + userEmail = selectedUser.getEmail(); + + // Bestätigungstext zurücksetzen + confirmationText = null; + + sendInfoMessage("Info", "Benutzer '" + selectedUser.getFirstname() + " " + + selectedUser.getLastname() + "' für Verwaltung ausgewählt."); + + } catch (Exception e) { + LOGGER.error("Fehler beim Laden des ausgewählten Benutzers: " + (selectedUser != null ? selectedUser.getEmail() : "null"), e); + sendErrorMessage("Fehler", "Fehler beim Laden der Benutzerdaten."); + selectedUser = null; + } + } + + /** + * Gibt eine sichere String-Darstellung der Benutzergruppen zurück. + * Verhindert LazyInitializationException durch sichere Behandlung der Collection. + * @param user Der Benutzer + * @return Komma-getrennte Liste der Benutzergruppen oder "Nicht verfügbar" + */ + public String getUserGroupsAsString(Person user) { + if (user == null) { + return "Nicht verfügbar"; + } + + try { + Set groups = user.getUserGroups(); + + // Prüfe auf null ohne isEmpty() zu verwenden (vermeidet Lazy Loading) + if (groups == null) { + return "Keine Gruppen"; + } + + // Verwende Iterator um Lazy Loading zu vermeiden + StringBuilder sb = new StringBuilder(); + boolean first = true; + + for (UserGroup group : groups) { + if (!first) { + sb.append(", "); + } + sb.append(group.toString()); + first = false; + } + + // Falls keine Gruppen durchlaufen wurden + if (first) { + return "Keine Gruppen"; + } + + return sb.toString(); + + } catch (Exception e) { + // Logge nur als DEBUG statt WARN um Log-Spam zu reduzieren + LOGGER.debug("Could not load user groups for user: " + user.getEmail(), e); + return "Nicht verfügbar"; + } + } + + /** + * Lädt einen Benutzer mit allen Beziehungen neu aus der Datenbank. + * Stellt sicher, dass lazy-loaded Collections verfügbar sind. + */ + private void refreshSelectedUser() { + if (selectedUser != null) { + try { + // Benutzer mit allen Beziehungen neu laden + selectedUser = personManager.load(selectedUser); + } catch (Exception e) { + LOGGER.warn("Could not refresh selected user: " + selectedUser.getEmail(), e); + } + } + } + + /** + * Lädt alle Benutzer für die Dropdown-Auswahl. + * @return Liste aller Benutzer im System + */ + public List getAllUsers() { + if (allUsers == null) { + allUsers = personManager.findAll(); + } + return allUsers; + } + + /** + * Gibt den Status-Text für einen Benutzer zurück. + * @param user Der Benutzer + * @return "Aktiv" oder "Gesperrt" + */ + public String getUserStatus(Person user) { + return user != null && user.isActive() ? "Aktiv" : "Gesperrt"; + } + + /** + * Gibt die CSS-Klasse für den Status zurück. + * @param user Der Benutzer + * @return CSS-Klasse für Styling + */ + public String getUserStatusClass(Person user) { + return user != null && user.isActive() ? "ui-button-success" : "ui-button-danger"; + } + + @Override + public void clearEntries() { + userEmail = null; + selectedUser = null; + allUsers = null; + confirmationText = null; + } + + @Override + protected PersonManager getManager() { + return personManager; + } + + // Getter und Setter + public String getUserEmail() { + return userEmail; + } + + public void setUserEmail(String userEmail) { + this.userEmail = userEmail; + } + + public Person getSelectedUser() { + return selectedUser; + } + + public void setSelectedUser(Person selectedUser) { + this.selectedUser = selectedUser; + } + + public void setAllUsers(List allUsers) { + this.allUsers = allUsers; + } + + public String getConfirmationText() { + return confirmationText; + } + + public void setConfirmationText(String confirmationText) { + this.confirmationText = confirmationText; + } +} diff --git a/java/mss-failsafe/src/main/java/controller/admin/CreateUserController.java b/java/mss-failsafe/src/main/java/controller/admin/CreateUserController.java new file mode 100755 index 0000000..9034d4f --- /dev/null +++ b/java/mss-failsafe/src/main/java/controller/admin/CreateUserController.java @@ -0,0 +1,104 @@ +package controller.admin; + +import business.user.PasswordManager; +import business.user.PersonManager; +import business.user.UserRoleAssignmentHelper; +import java.io.Serializable; +import java.util.HashSet; +import java.util.Set; +import javax.ejb.EJB; +import javax.faces.application.FacesMessage; +import javax.faces.context.FacesContext; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import model.person.Person; +import model.person.Preferences; +import model.person.Salt; +import model.person.Password; +import model.person.enums.UserGroup; + +@Named +@ViewScoped +public class CreateUserController implements Serializable { + + private static final long serialVersionUID = 1L; + + private Person user = new Person(); + private String password; + private String selectedGroup; // "USER" or "ADMIN" + + @EJB + private PersonManager personManager; + + @EJB + private PasswordManager passwordManager; + + public Person getUser() { + return user; + } + + public void setUser(Person user) { + this.user = user; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getSelectedGroup() { + return selectedGroup; + } + + public void setSelectedGroup(String selectedGroup) { + this.selectedGroup = selectedGroup; + } + + public void createUser() { + Salt salt = new Salt(); + byte[] hashedPassword = passwordManager.hashPassword( + password.toCharArray(), + salt.getSalt(), + salt.getInterations() + ); + + // Verwende hierarchische Rollenzuweisung über Helper + Set groups = UserRoleAssignmentHelper.assignRolesHierarchically(selectedGroup); + + // Erstelle einen neuen Benutzer mit dem korrekten Konstruktor + Person newUser = new Person(user.getEmail(), hashedPassword, salt, groups); + + // Übertrage die anderen Eigenschaften vom Formular + newUser.setFirstname(user.getFirstname()); + newUser.setLastname(user.getLastname()); + newUser.setMobile(user.getMobile()); + newUser.setFax(user.getFax()); + newUser.setTelefon(user.getTelefon()); + newUser.setActive(true); + newUser.setCall(user.getCall()); + newUser.setTitle(user.getTitle()); + + // Erstelle Preferences + Preferences preferences = new Preferences(); + preferences.setDefaultPreferences(newUser); + newUser.setPreferences(preferences); + + // Speichere den neuen Benutzer + boolean saved = personManager.save(newUser); + + if (saved) { + FacesContext.getCurrentInstance().addMessage(null, + new FacesMessage(FacesMessage.SEVERITY_INFO, "Erfolg", "Benutzer " + newUser.getEmail() + " wurde erstellt.")); + // Setze Formular zurück + user = new Person(); + password = null; + selectedGroup = null; + } else { + FacesContext.getCurrentInstance().addMessage(null, + new FacesMessage(FacesMessage.SEVERITY_ERROR, "Fehler", "Benutzer konnte nicht erstellt werden. Überprüfen Sie die Logdateien für mehr Informationen.")); + } + } +} diff --git a/java/mss-failsafe/src/main/java/controller/adresses/AddressController.java b/java/mss-failsafe/src/main/java/controller/adresses/AddressController.java new file mode 100755 index 0000000..4fb8369 --- /dev/null +++ b/java/mss-failsafe/src/main/java/controller/adresses/AddressController.java @@ -0,0 +1,325 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package controller.adresses; + +import business.AbstractManager; +import business.addresses.CompanyAddressManager; +import business.addresses.LocationAddressManager; +import controller.AbstractController; +import controller.company.CompanyController; +import java.util.ArrayList; +import java.util.List; +import javax.ejb.EJB; +import javax.faces.view.ViewScoped; +import javax.inject.Inject; +import javax.inject.Named; +import model.adresses.Address; +import model.adresses.CompanyAddress; +import model.adresses.LocationAddress; +import model.company.Company; +import model.company.Location; + +/** + * + * @author patri + */ +@ViewScoped +@Named +public class AddressController extends AbstractController
{ + + @EJB + CompanyAddressManager companyAddressManager; + + @EJB + LocationAddressManager locationAddressManager; + + @Inject + CompanyController companyController; + + //Firma + private Company company; + + //Standort + private Location location; + + //Land + private String country; + + //Straßenname + private String street; + + //Hausnummer + private String number; + + //Zusatz + private String extra; + + //PLZ + private Integer postnumber; + + //Bundesland + private String county; + + //Ort + private String place; + + //Ansprechpartner + private String contact; + + //Kommentar + private String comment; + + private List companyAddresses; + private List locationAddresses; + + private CompanyAddress selectedCompanyAddress; + private LocationAddress selectedLocationAddress; + + public AddressController() { + companyAddresses = new ArrayList<>(); + locationAddresses = new ArrayList<>(); + } + + public void setCompanyToAll(Company selected) { + if (companyAddresses == null) { + return; + } + + companyAddresses.forEach(c -> c.setCompany(selected)); + } + + public void clearNegativIDsFromComps() { + if (companyAddresses == null) { + return; + } + + companyAddresses.stream() + .filter(c -> c.getId() < 0) + .forEach(c -> c.setId(null)); + } + + public void setLocationToAll(Location selected) { + if (companyAddresses == null) { + return; + } + + locationAddresses.forEach(c -> c.setLocation(selected)); + } + + public void createAddToCompany() { + LOGGER.info("createAddToCompany"); + + CompanyAddress address = new CompanyAddress(null, country, street, number, extra, postnumber, county, place, contact, comment); + address.setId(new Long((companyAddresses.size() + 1) * (-1))); + companyAddresses.add(address); + + sendInfoMessage("Erfolg", "Addresse wurde hinzugefügt!"); + clearCreation(); + } + + public void selectToEdit() { + if (selectedCompanyAddress == null) { + LOGGER.error("selected Company address is null"); + sendErrorMessage("Fehler", "Es ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut!"); + return; + } + + this.company = selectedCompanyAddress.getCompany(); + this.country = selectedCompanyAddress.getCountry(); + this.street = selectedCompanyAddress.getStreet(); + this.number = selectedCompanyAddress.getNumber(); + this.extra = selectedCompanyAddress.getExtra(); + this.postnumber = selectedCompanyAddress.getPostnumber(); + this.county = selectedCompanyAddress.getCounty(); + this.place = selectedCompanyAddress.getPlace(); + this.comment = selectedCompanyAddress.getComment(); + this.contact = selectedCompanyAddress.getContact(); + } + + public void editToCompany() { + LOGGER.info("editToCompany"); + + selectedCompanyAddress.setCountry(country); + selectedCompanyAddress.setStreet(street); + selectedCompanyAddress.setNumber(number); + selectedCompanyAddress.setExtra(extra); + selectedCompanyAddress.setPostnumber(postnumber); + selectedCompanyAddress.setCounty(county); + selectedCompanyAddress.setPlace(place); + selectedCompanyAddress.setComment(comment); + selectedCompanyAddress.setContact(contact); + + sendInfoMessage("Erfolg", "Addresse wurde bearbeitet!"); + clearCreation(); + } + + public void deleteSelected() { + if (selectedCompanyAddress == null || companyAddresses.isEmpty()) { + sendErrorMessage("Fehler", "Es ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut!"); + return; + } + + for (int i = 0; i < companyAddresses.size(); i++) { + CompanyAddress add = companyAddresses.get(i); + if (add.getId().equals(selectedCompanyAddress.getId())) { + companyAddresses.remove(i); + } + } + + sendInfoMessage("Erfolg", "Adresse wurde gelöscht!"); + clearCreation(); + } + + public void clearCreation() { + this.company = null; + this.location = null; + this.country = null; + this.street = null; + this.number = null; + this.extra = null; + this.postnumber = null; + this.county = null; + this.place = null; + this.comment = null; + this.contact = null; + this.selectedCompanyAddress = null; + this.selectedLocationAddress = null; + } + + @Override + public void clearEntries() { + clearCreation(); + this.companyAddresses.clear(); + this.locationAddresses.clear(); + this.selectedCompanyAddress = null; + this.selectedLocationAddress = null; + } + + public Company getCompany() { + return company; + } + + public String getContact() { + return contact; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public void setContact(String contact) { + this.contact = contact; + } + + public CompanyAddress getSelectedCompanyAddress() { + return selectedCompanyAddress; + } + + public void setSelectedCompanyAddress(CompanyAddress selectedCompanyAddress) { + this.selectedCompanyAddress = selectedCompanyAddress; + } + + public LocationAddress getSelectedLocationAddress() { + return selectedLocationAddress; + } + + public void setSelectedLocationAddress(LocationAddress selectedLocationAddress) { + this.selectedLocationAddress = selectedLocationAddress; + } + + public void setCompany(Company company) { + this.company = company; + } + + public Location getLocation() { + return location; + } + + public void setLocation(Location location) { + this.location = location; + } + + public String getCountry() { + return country; + } + + public void setCountry(String country) { + this.country = country; + } + + public String getStreet() { + return street; + } + + public void setStreet(String street) { + this.street = street; + } + + public String getNumber() { + return number; + } + + public void setNumber(String number) { + this.number = number; + } + + public String getExtra() { + return extra; + } + + public void setExtra(String extra) { + this.extra = extra; + } + + public Integer getPostnumber() { + return postnumber; + } + + public void setPostnumber(Integer postnumber) { + this.postnumber = postnumber; + } + + public String getCounty() { + return county; + } + + public void setCounty(String county) { + this.county = county; + } + + public String getPlace() { + return place; + } + + public void setPlace(String place) { + this.place = place; + } + + public List getCompanyAddresses() { + return companyAddresses; + } + + public void setCompanyAddresses(List companyAddresses) { + this.companyAddresses = companyAddresses; + } + + public List getLocationAddresses() { + return locationAddresses; + } + + public void setLocationAddresses(List locationAddresses) { + this.locationAddresses = locationAddresses; + } + + @Override + protected AbstractManager
getManager() { + return null; + } +} diff --git a/java/mss-failsafe/src/main/java/controller/company/CompanyController.java b/java/mss-failsafe/src/main/java/controller/company/CompanyController.java new file mode 100755 index 0000000..31f575c --- /dev/null +++ b/java/mss-failsafe/src/main/java/controller/company/CompanyController.java @@ -0,0 +1,373 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package controller.company; + +import business.AbstractManager; +import business.company.CompanyManager; +import controller.AbstractController; +import controller.adresses.AddressController; +import controller.machine.SecurityAreaController; +import controller.person.PersonController; +import controller.search.SearchController; +import controller.tickets.TicketController; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import javax.ejb.EJB; +import javax.enterprise.context.SessionScoped; +import javax.faces.view.ViewScoped; +import javax.inject.Inject; +import javax.inject.Named; +import javax.transaction.Transactional; +import model.adresses.CompanyAddress; +import model.company.Company; +import model.company.Location; +import model.company.Status; + +/** + * + * @author Patrick + */ +@Named +@SessionScoped +public class CompanyController extends AbstractController { + + @Inject + PersonController personController; + + @Inject + AddressController addressController; + + @Inject + CustomerController customerController; + + @Inject + LocationController locationController; + + @Inject + SecurityAreaController securityAreaController; + + @Inject + TicketController ticketController; + + @Inject + SearchController searchController; + + @EJB + CompanyManager companyManager; + + private Company selected; + + private List companíes; + + //Vars of a company + private String name; + private String steuerNr; + private String umsatzsteuerNr; + private String comment; + private ArrayList addresses; + private ArrayList locations; + private String kundenNr; + private String headerInspection; + private String headerService; + private Status status; + + + + public CompanyController() { + setCreated(new Company()); + } + + @Transactional + public void addFromSelected() { + selected = companyManager.findWithAddresses(selected); + refrehSelected(); + + addressController.setCompanyAddresses(new ArrayList<>(selected.getAddresses())); + customerController.setCustomers(new ArrayList<>(selected.getCustomers())); + if (selected.getLocations() == null) { + selected.setLocations(new HashSet<>()); + } + locationController.setLocations(new ArrayList<>(selected.getLocations())); + securityAreaController.createMachineMenu(); + + name = selected.getName(); + steuerNr = selected.getSteuerNr(); + umsatzsteuerNr = selected.getUmsatzSteuerID(); + comment = selected.getComment(); + kundenNr = selected.getKundenNr(); + status = selected.getStatus(); + headerService = selected.getHeaderService(); + headerInspection = selected.getHeaderInspection(); + + ticketController.createSelectedLocations(); + searchController.setFromSelectedCompany(); + } + + @Transactional + public void addFromSelectedFromSearch() { + selected = companyManager.findWithAddresses(selected); + refrehSelected(); + + addressController.setCompanyAddresses(new ArrayList<>(selected.getAddresses())); + customerController.setCustomers(new ArrayList<>(selected.getCustomers())); + if (selected.getLocations() == null) { + selected.setLocations(new HashSet<>()); + } + locationController.setLocations(new ArrayList<>(selected.getLocations())); + securityAreaController.createMachineMenu(); + + name = selected.getName(); + steuerNr = selected.getSteuerNr(); + umsatzsteuerNr = selected.getUmsatzSteuerID(); + comment = selected.getComment(); + kundenNr = selected.getKundenNr(); + status = selected.getStatus(); + headerService = selected.getHeaderService(); + headerInspection = selected.getHeaderInspection(); + } + + public void save() { + LOGGER.info("Length of address lists {}", addressController.getCompanyAddresses().size()); + + if (selected != null && selected.getId() != null) { + LOGGER.info("Update of " + selected.getName() + + " with ID " + selected.getId() + " initiated from " + + personController.getActiveUser()); + + addressController.setCompanyToAll(selected); + + addressController.clearNegativIDsFromComps(); + selected.setAddresses(new HashSet(addressController.getCompanyAddresses())); + + selected.setName(name); + selected.setSteuerNr(steuerNr != null && steuerNr.isEmpty() ? null : steuerNr); + selected.setUmsatzSteuerID(umsatzsteuerNr != null && umsatzsteuerNr.isBlank() ? null : umsatzsteuerNr); + selected.setComment(comment); + selected.setKundenNr(kundenNr); + selected.setStatus(status); + selected.setHeaderService(headerService); + selected.setHeaderInspection(headerInspection); + + try { + companyManager.save(selected); + } catch (Exception e) { + LOGGER.error(e); + sendErrorMessage("Fehler", "Es ist ein Fehler beim Speichern aufgetreten. \n bitte Versuchen Sie es erneut!"); + return; + } + + sendInfoMessage("Unternehmen geändert", "Das Unternemen mit dem Namen " + selected.getName() + " wurde geändert"); + clearEntries(); + + } else { + + Company comp = new Company(); + addressController.clearNegativIDsFromComps(); + addressController.setCompanyToAll(comp); + + comp.setAddresses(new HashSet(addressController.getCompanyAddresses())); + comp.setName(name); + comp.setSteuerNr(steuerNr != null && steuerNr.isEmpty() ? null : steuerNr); + comp.setUmsatzSteuerID(umsatzsteuerNr != null && umsatzsteuerNr.isBlank() ? null : umsatzsteuerNr); + comp.setComment(comment); + comp.setKundenNr(kundenNr); + comp.setStatus(status); + comp.setHeaderService(headerService); + comp.setHeaderInspection(headerInspection); + + try { + companyManager.save(comp); + } catch (Exception e) { + LOGGER.error(e); + sendErrorMessage("Fehler", "Es ist ein Fehler beim Speichern aufgetreten. \n bitte Versuchen Sie es erneut!"); + return; + } + + clearEntries(); + + sendInfoMessage("Unternehmen erstellt", "Das Unternemen mit dem Namen " + comp.getName() + " wurde erstellt"); + } + } + + public boolean saveSelected(){ + if (selected == null || selected.getId() == null) { + return false; + } + + companyManager.edit(selected); + + return true; + } + + public void deleteSelected(){ + if (selected == null) { + sendErrorMessage("Fehler", "Es ist ein Fehler beim Speichern aufgetreten. \n bitte Versuchen Sie es erneut!"); + clearEntries(); + return; + } + + try { + companyManager.remove(selected); + sendInfoMessage("Erfolg", "Firma \"" + selected.getName() + "\" wurde gelöscht!"); + clearEntries(); + } catch (Exception e) { + LOGGER.error(e); + sendErrorMessage("Fehler", "Es ist ein Fehler beim Speichern aufgetreten. \n bitte Versuchen Sie es erneut!"); + } + } + + @Override + public void clearEntries() { + name = ""; + steuerNr = ""; + umsatzsteuerNr = ""; + kundenNr = null; + headerInspection = ""; + headerService = ""; + status = null; + comment = null; + + addressController.clearEntries(); + selected = null; + } + + public Company getCompanyByName(String name){ + if (name == null || name.isBlank()) { + return null; + } + + return companyManager.findCompanyByName(name); + } + + public Status[] getAllStatus() { + return Status.values(); + } + + public List allStatusAsList(){ + + return Arrays.asList(getAllStatus()); + } + + public List getAllCompanys() { + return companyManager.findAll(); + } + + public void reloadCompanys() { + this.companíes = companyManager.findAll(); + } + + public List getCompanys() { + if (companíes == null) { + reloadCompanys(); + } + return companíes; + } + + public String getName() { + return name; + } + + public String getKundenNr() { + return kundenNr; + } + + public void setKundenNr(String kundenNr) { + this.kundenNr = kundenNr; + } + + public String getHeaderInspection() { + return headerInspection; + } + + public void setHeaderInspection(String headerInspection) { + this.headerInspection = headerInspection; + } + + public String getHeaderService() { + return headerService; + } + + public void setHeaderService(String headerService) { + this.headerService = headerService; + } + + public Status getStatus() { + return status; + } + + public void setStatus(Status status) { + this.status = status; + } + + public void setName(String name) { + this.name = name; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public String getSteuerNr() { + return steuerNr; + } + + public void setSteuerNr(String steuerNr) { + this.steuerNr = steuerNr; + } + + public String getUmsatzsteuerNr() { + return umsatzsteuerNr; + } + + public void setUmsatzsteuerNr(String umsatzsteuerNr) { + this.umsatzsteuerNr = umsatzsteuerNr; + } + + public List getCompaníes() { + return companíes; + } + + public void setCompaníes(List companíes) { + this.companíes = companíes; + } + + public ArrayList getAddresses() { + return addresses; + } + + public void setAddresses(ArrayList addresses) { + this.addresses = addresses; + } + + @Override + public Company getSelected() { + return selected; + } + + @Override + public void setSelected(Company selected) { + this.selected = selected; + } + + public ArrayList getLocations() { + return locations; + } + + public void setLocations(ArrayList locations) { + this.locations = locations; + } + + @Override + protected AbstractManager getManager() { + return companyManager; + } +} diff --git a/java/mss-failsafe/src/main/java/controller/company/CompanyLogoController.java b/java/mss-failsafe/src/main/java/controller/company/CompanyLogoController.java new file mode 100755 index 0000000..04debdc --- /dev/null +++ b/java/mss-failsafe/src/main/java/controller/company/CompanyLogoController.java @@ -0,0 +1,188 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package controller.company; + +import business.AbstractManager; +import business.company.CompanyLogoManager; +import business.company.CompanyManager; +import controller.AbstractController; +import java.io.ByteArrayInputStream; +import javax.ejb.EJB; +import javax.enterprise.context.SessionScoped; +import javax.faces.view.ViewScoped; +import javax.inject.Inject; +import javax.inject.Named; +import model.company.CompanyLogo; +import model.files.Mime; +import org.primefaces.event.FileUploadEvent; +import org.primefaces.model.CroppedImage; +import org.primefaces.model.DefaultStreamedContent; +import org.primefaces.model.StreamedContent; +import org.primefaces.model.file.UploadedFile; + +/** + * + * @author pplate + */ +@Named +@SessionScoped +public class CompanyLogoController extends AbstractController { + @Inject + CompanyController companyController; + + @EJB + CompanyManager companyManager; + + @EJB + CompanyLogoManager logoManager; + + private CroppedImage croppedImage; + + + public CompanyLogoController() { + super(); + setSelected(new CompanyLogo()); + setCreated(new CompanyLogo()); + getEntities().clear(); + } + + public void handleCreatedUpload(FileUploadEvent event) { + UploadedFile file = event.getFile(); + + + + if (file != null && file.getContent() != null && file.getContent().length > 0 && file.getFileName() != null) { + + if (createSaveLogo(file, true)) { + sendInfoMessage("Erfolg", getCreated().getName() + " wurde hochgeladen!"); + } else { + sendErrorMessage("Fehler", "Es ist ein Fehler aufgetreten. Bitte Versuchen Sie es erneut!"); + } + } + } + + public void handleSelectedUpload(FileUploadEvent event) { + UploadedFile file = event.getFile(); + + if (file != null && file.getContent() != null && file.getContent().length > 0 && file.getFileName() != null) { + + setData(getSelected(), file); + + /* + if (createSaveLogo(file, false)) { + sendInfoMessage("Erfolg", getCreated().getName() + " wurde hochgeladen!"); + } else { + sendErrorMessage("Fehler", "Es ist ein Fehler aufgetreten. Bitte Versuchen Sie es erneut!"); + }*/ + } + } + + public StreamedContent getUploaded(){ + System.out.println("getUpload"); + return DefaultStreamedContent.builder() + .contentType(getCreated().getFileData() == null ? null : getCreated().getMime().getMimeType()) + .stream(() -> { + if (getCreated() == null + || getCreated().getFileData()== null + || getCreated().getFileData().length == 0) { + System.out.println("No output " + getCreated()); + return null; + } + + try { + System.out.println("GetCreated as output stream! " + getCreated().getName()); + return new ByteArrayInputStream(getCreated().getFileData()); + } + catch (Exception e) { + System.out.println(e); + e.printStackTrace(); + return null; + } + }) + .build(); + } + + public void crop() { + getUploaded(); + if (this.croppedImage == null || this.croppedImage.getBytes() == null || this.croppedImage.getBytes().length == 0) { + sendErrorMessage(ERROR_TITLE, ERROR_MESSAGE); + } + else { + sendInfoMessage(SUCCESS_TITLE, SUCCESS_MESSAGE); + } + } + + public StreamedContent getCropped() { + return DefaultStreamedContent.builder() + .contentType(getCreated() == null ? null : getCreated().getMime().getMimeType()) + .stream(() -> { + if (croppedImage == null + || croppedImage.getBytes() == null + || croppedImage.getBytes().length == 0) { + return null; + } + + try { + return new ByteArrayInputStream(this.croppedImage.getBytes()); + } + catch (Exception e) { + e.printStackTrace(); + return null; + } + }) + .build(); + } + + private boolean createSaveLogo(UploadedFile file, boolean isCreated) { + CompanyLogo logo; + if (isCreated) { + logo = getCreated(); + } else { + logo = getSelected(); + } + + setData(logo, file); + + if (isCreated) { + logo.setCompany(companyController.getCreated()); + companyController.getCreated().setCompanyLogo(logo); + setCreated(logo); + return true; + } + + logo.setCompany(companyController.getSelected()); + logoManager.save(logo); + companyController.getSelected().setCompanyLogo(logo); + setSelected(logo); + + return companyController.saveSelected(); + } + + private void setData(CompanyLogo picture, UploadedFile file) { + picture.setName(file.getFileName()); + picture.setFileData(file.getContent()); + picture.setMime(Mime.getByMimeType(file.getContentType())); + } + + @Override + protected AbstractManager getManager() { + return logoManager; + } + + @Override + public void clearEntries() { + setSelected(new CompanyLogo()); + setCreated(new CompanyLogo()); + getEntities().clear(); + } + + public CroppedImage getCroppedImage() { + return croppedImage; + } + + public void setCroppedImage(CroppedImage croppedImage) { + this.croppedImage = croppedImage; + } +} diff --git a/java/mss-failsafe/src/main/java/controller/company/CustomerController.java b/java/mss-failsafe/src/main/java/controller/company/CustomerController.java new file mode 100755 index 0000000..1f901d6 --- /dev/null +++ b/java/mss-failsafe/src/main/java/controller/company/CustomerController.java @@ -0,0 +1,236 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package controller.company; + +import business.AbstractManager; +import business.company.CustomerManager; +import business.user.PasswordManager; +import controller.AbstractController; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import model.person.Password; +import javax.annotation.PostConstruct; +import javax.ejb.EJB; +import javax.faces.view.ViewScoped; +import javax.inject.Inject; +import javax.inject.Named; +import model.customer.Customer; +import model.person.Salt; +import model.person.Token; +import model.person.enums.Call; + +/** + * + * @author patri + */ +@ViewScoped +@Named +public class CustomerController extends AbstractController{ + + @Inject + CompanyController companyController; + + @EJB + PasswordManager passwordManager; + + private Customer selected; + private List customers; + private Customer created; + + @EJB + CustomerManager customerManager; + + public CustomerController() { + } + + @PostConstruct + private void init(){ + selected = new Customer(); + created = new Customer(); + customers = new ArrayList<>(); + } + + public void addNewCustomer(){ + Customer cust = new Customer(); + + Long fakeId = createFakeID(customers); + cust.setId(fakeId); + + customers.add(cust); + + sendInfoMessage(SUCCESS_TITLE, "Ansprechpartner Nr. "+ (customers.indexOf(cust) + 1) + " wurde hinzugefügt!"); + } + + public void removeCustomer(Customer customer){ + if (customer == null || customer.getId() == null) { + errorMessage(); + return; + } + + int nr = customers.indexOf(customer); + nr++; + + if (customer.getId() > 0) { + companyController.getSelected().getCustomers().remove(customer); + companyController.saveSelected(); + customerManager.remove(customer); + } else { + customers.remove(customer); + } + + sendInfoMessage("Erfolg", "Ansprechpartner Nr. " + nr + " wurde entfernt."); + } + + public void saveAllToCompany(){ + companyController.saveSelected(); + + customers.stream().filter(cust -> (cust.getId() != null && cust.getId() <= 0)).forEachOrdered(cust -> { + cust.setId(null); + cust.setCompany(companyController.getSelected()); + cust.setTokens(new ArrayList()); + autoGeneratePasswordAndSalt(cust); + }); + + customers.forEach(c-> { + customerManager.save(c); + }); + + + companyController.getSelected().setCustomers(new HashSet<>(customers)); + + companyController.saveSelected(); + + sendInfoMessage(SUCCESS_TITLE, "Firma \"" + companyController.getSelected().getKundenNr() + "\" wurde gespeichert"); + + companyController.addFromSelected(); + } + + private void autoGeneratePasswordAndSalt(Customer customer){ + Salt salt = new Salt(); + customer.setSalt(salt); + + Password password = passwordManager.gerateNewRandomPasswordClass(customer); + customer.setPassword(password); + } + + public void updateSelected(){ + if (selected == null) { + errorMessage(); + return; + } + + int index = customers.indexOf(selected); + customers.remove(index); + customers.add(index, selected); + + sendInfoMessage(SUCCESS_TITLE, selected.getEmail() + " wurde erfolgreich editiert."); + + selected = new Customer(); + } + + public void clearSelected(){ + selected = new Customer(); + } + + public void saveToCompany(Customer customer){ + if (customer == null || customer.getId() == null) { + errorMessage(); + return; + } + + if (customer.getId() < 0) { + customer.setId(null); + } + + customer.setCompany(companyController.getSelected()); + + if (customerManager.save(customer)) { + companyController.getSelected().addCustomer(customer); + if (companyController.saveSelected()) { + sendInfoMessage(SUCCESS_TITLE, "Ansprechpartner Nr. " + customers.indexOf(customer) + 1 + " wurde gespeichert!"); + return; + } + } + + errorMessage(); + } + + @Override + public void clearEntries() { + selected = new Customer(); + customers.clear(); + created = new Customer(); + companyController.clearEntries(); + } + + public void clearCreated(){ + created = new Customer(); + } + + public void addClearCreatedCustomer(){ + if (created.getEmail() != null) { + Customer found = customerManager.findByEmail(created.getEmail()); + if(found != null){ + sendErrorMessage("Fehler", "Benutzer mit der Emailadresse \""+ created.getEmail() + "\" existiert bereits in der Firma \""+ found.getCompany().getKundenNr() + "\" !"); + return; + } + } + + for(Customer c : customers){ + if (c.getEmail().equals(created.getEmail())) { + sendErrorMessage("Fehler", "Benutzer mit der Emailadresse \""+ created.getEmail() + "\" existiert bereits in dieser Firma !"); + return; + } + } + + Long fakeId = createFakeID(customers); + created.setId(fakeId); + + try { + customers.add(created.clone()); + System.out.println(created.getCall() + " " + created.getTitle()); + sendInfoMessage(SUCCESS_TITLE, "Ansprechpartner \"" + created.getEmail() + "\" wurde erstellt!"); + created = new Customer(); + } catch (CloneNotSupportedException ex) { + LOGGER.error(ex); + errorMessage(); + } + } + + public Call[] getCalls(){ + return Call.values(); + } + + public Customer getSelected() { + return selected; + } + + public void setSelected(Customer selected) { + this.selected = selected; + } + + public List getCustomers() { + return customers; + } + + public void setCustomers(List customers) { + this.customers = customers; + } + + public Customer getCreated() { + return created; + } + + public void setCreated(Customer created) { + this.created = created; + } + + @Override + protected AbstractManager getManager() { + return customerManager; + } +} diff --git a/java/mss-failsafe/src/main/java/controller/company/LocationController.java b/java/mss-failsafe/src/main/java/controller/company/LocationController.java new file mode 100755 index 0000000..1e9be14 --- /dev/null +++ b/java/mss-failsafe/src/main/java/controller/company/LocationController.java @@ -0,0 +1,224 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package controller.company; + +import business.AbstractManager; +import business.company.CompanyManager; +import business.company.LocationManager; +import controller.AbstractController; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.ejb.EJB; +import javax.faces.view.ViewScoped; +import javax.inject.Inject; +import javax.inject.Named; +import model.company.Company; +import model.company.Location; + +/** + * + * @author patri + */ +@Named +@ViewScoped +public class LocationController extends AbstractController { + + @Inject + CompanyController companyController; + + @Inject + CustomerController customerController; + + private Location selected; + private Location created; + private Location target; + + @EJB + LocationManager locationManager; + + @EJB + CompanyManager companyManager; + + private Company company; + + private List locations; + + public LocationController() { + } + + public boolean renderTabs() { + return locations != null && !locations.isEmpty(); + } + + public void save() { + if (company == null || company.getId() == null || company.getId() < 0) { + sendErrorMessage("Fehler", "Bitte wählen Sie eine Firma!"); + return; + } + + boolean wasNew = selected.getId() == null; + + if (selected.getCompany() == null) { + selected.setCompany(company); + } + + if (locationManager.save(selected)) { + company = companyManager.findWithLocations(company); + company.addLocation(selected); + + if (companyManager.save(company)) { + sendInfoMessage("Erfolg", "Standort \"" + selected.getName() + "\" wurde erfolgreich gespeichert zu Firma \"" + company.getName() + "\" !"); + clearEntries(); + return; + } + } + + errorMessage(); + } + + public void saveAllToCompany(){ + companyController.saveSelected(); + + locations.stream().filter(loc -> (loc.getId() != null && loc.getId() <= 0)).forEachOrdered(loc -> { + loc.setId(null); + loc.setCompany(companyController.getSelected()); + }); + + locations.forEach(l -> { + locationManager.save(l); + }); + + companyController.getSelected().setLocations(new HashSet<>(locations)); + + companyController.saveSelected(); + + sendInfoMessage(SUCCESS_TITLE, "Firma \"" + companyController.getSelected().getKundenNr() + "\" wurde gespeichert"); + + companyController.addFromSelected(); + } + + public void saveSelected(){ + locationManager.save(selected); + locations.set(locations.indexOf(selected), selected); + companyController.getSelected().setLocations(new HashSet<>(locations)); + companyController.saveSelected(); + } + + @PostConstruct + void init() { + selected = new Location(); + created = new Location(); + company = new Company(); + locations = new ArrayList<>(); + + if (companyController.getSelected() != null) { + company = companyController.getSelected(); + locations = new ArrayList<>(company.getLocations()); + } else { + companyController.clearEntries(); + } + } + + public void addNewLocation() { + Location loc = new Location(created); + + Long fakeId = createFakeID(locations); + loc.setId(fakeId); + locations.add(loc); + + created = new Location(); + sendInfoMessage("Erfolg", "Standort Nr. " + locations.size() + " hinzugefügt."); + } + + public void editLocation(){ + if (selected == null) { + errorMessage(); + return; + } + + sendInfoMessage(SUCCESS_TITLE, "Der Standort \"" + selected.getName() + "\" wurde bearbeitet"); + selected = new Location(); + } + + public void removeCreateLocation(Location location){ + if (location == null || location.getId() == null) { + errorMessage(); + return; + } + + int nr = locations.indexOf(location); + nr++; + + locations.remove(location); + + if (location.getId() > 0) { + companyController.getSelected().getLocations().remove(location); + companyController.saveSelected(); + locationManager.remove(location); + companyController.addFromSelected(); + } + + sendInfoMessage(SUCCESS_TITLE, "Standort Nr. " + nr + " wurde entfernt."); + } + + @Override + public void clearEntries() { + this.init(); + target = null; + companyController.clearEntries(); + } + + public int getPos(Location location) { + return locations.indexOf(location) + 1; + } + + public Company getCompany() { + return company; + } + + public void setCompany(Company company) { + this.company = company; + } + + public List getLocations() { + return locations; + } + + public void setLocations(List locations) { + this.locations = locations; + } + + public Location getSelected() { + return selected; + } + + public void setSelected(Location selected) { + this.selected = selected; + } + + public Location getCreated() { + return created; + } + + public void setCreated(Location created) { + this.created = created; + } + + @Override + protected AbstractManager getManager() { + return locationManager; + } + + public Location getTarget() { + return target; + } + + public void setTarget(Location target) { + this.target = target; + } +} diff --git a/java/mss-failsafe/src/main/java/controller/company/PdfReaderController.java b/java/mss-failsafe/src/main/java/controller/company/PdfReaderController.java new file mode 100755 index 0000000..cef55a1 --- /dev/null +++ b/java/mss-failsafe/src/main/java/controller/company/PdfReaderController.java @@ -0,0 +1,855 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package controller.company; + +import business.AbstractManager; +import business.company.CompanyManager; +import business.company.LocationManager; +import business.machine.MachineManager; +import com.itextpdf.text.pdf.PdfReader; +import com.itextpdf.text.pdf.parser.PdfTextExtractor; +import controller.AbstractController; +import controller.machine.SecurityDeviceCompanyController; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Scanner; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; +import javax.ejb.EJB; +import javax.faces.view.ViewScoped; +import javax.inject.Inject; +import javax.inject.Named; +import model.adresses.CompanyAddress; +import model.company.Company; +import model.company.Location; +import model.company.Status; +import model.files.Mime; +import model.machine.Machine; +import model.machine.enums.MachineStatus; +import model.machine.enums.MachineType; +import model.machine.enums.Option; +import model.machine.enums.norms.AOPD_AOPDDR; +import model.machine.enums.norms.ArrayApproach; +import model.machine.enums.norms.ControlParts; +import model.security.DangerPoint; +import model.security.MeasuringPoint; +import model.security.SecurityArea; +import model.security.SecurityDevice; +import model.security.enums.ApproachSpeed; +import model.security.enums.Component; +import model.security.enums.DeviceRole; +import model.security.enums.MountingPosition; +import model.security.enums.MutingBlankingModus; +import model.security.enums.MutingSignals; +import model.security.enums.OverrunMeasurementType; +import model.security.enums.ProtectionType; +import model.security.enums.SecurityCategory; +import model.security.enums.SecurityType; +import model.security.enums.SfAlignment; +import model.security.switching.SwitchingDevice; +import org.primefaces.event.FileUploadEvent; +import org.primefaces.event.FilesUploadEvent; +import org.primefaces.model.file.UploadedFile; +import org.primefaces.model.file.UploadedFiles; + +/** + * + * @author pplate + */ +@Named +@ViewScoped +public class PdfReaderController extends AbstractController { + + public static final List allowedFileTypes = Arrays.asList(Mime.PDF); + public static final long sizeLimit = 20000000L; + private static final Pattern streetPattern = Pattern.compile("^(.*[^0-9])(\\d+.*)$"); + private static final Pattern countyPattern = Pattern.compile("^(\\d+)([^0-9].*)$"); + private static final Pattern areaPattern = Pattern.compile("C\\.\\d+ .*"); + + @EJB + MachineManager machineManager; + + @EJB + CompanyManager companyManager; + + @EJB + LocationManager locationManager; + + @Inject + LocationController locationController; + + @Inject + CompanyController companyController; + + @Inject + SecurityDeviceCompanyController securityDeviceCompanyController; + + private UploadedFiles files; + private String log; + + public PdfReaderController() { + super(); + setCreated(new Machine()); + setSelected(new Machine()); + log = ""; + } + + @Override + protected AbstractManager getManager() { + return machineManager; + } + + @Override + public void clearEntries() { + setCreated(new Machine()); + setSelected(new Machine()); + getEntities().clear(); + log = ""; + } + + public void handleFilesUpload(FilesUploadEvent event) { + for (UploadedFile f : event.getFiles().getFiles()) { + sendErrorMessage(SUCCESS_TITLE, "Datei \"" + f.getFileName() + "\" wurde hochgeladen."); + } + + files = event.getFiles(); + Map data = createCompanyDataFromPDF(); + + readPDFDate(data); + } + + public void handleFileUpload(FileUploadEvent event) { + List uploaded = new ArrayList<>(); + uploaded.add(event.getFile()); + files = new UploadedFiles(uploaded); + + Map data = createCompanyDataFromPDF(); + + readPDFDate(data); + } + + private void readPDFDate(Map uploaded) { + if (uploaded.isEmpty()) { + return; + } + + uploaded.forEach((name, data) -> { + sendInfoMessage("Lese " + name, "Starte das einlesen von den Daten von " + name); + Location location; + Machine created = null; + Company company = null; + + try { + //Create Location and Machine + PdfReader reader = new PdfReader(data); + boolean isBeforeCompanyData = true; + boolean isBeforeMachineData = true; + String lines = PdfTextExtractor.getTextFromPage(reader, 1); + //Check for ServiceProtocol + Scanner scanner = new Scanner(lines); + if (!checkForRightDocument(scanner, name)) { + sendErrorMessage("Falsches Dokument", "Dokument \"" + name + "\" wird übersprungen"); + return; + } + + while (isBeforeCompanyData) { + isBeforeCompanyData = !scanner.nextLine().startsWith("A.1"); + } + + company = createCompanyFromPage(scanner); + companyManager.save(company); + //Hibernate.initialize(company); + + if (company.getLocations() == null) { + company.setLocations(new HashSet<>()); + } + + String linesCopy = lines; + location = createLocationFromPage(new Scanner(linesCopy), company.getLocations()); + + //Jump to machine data + while (isBeforeMachineData) { + isBeforeMachineData = !scanner.nextLine().startsWith("B.1"); + } + created = createMachineFromPage(scanner); + + location.addMachine(created); + created.setLocation(location); + + StringBuilder secDevData = new StringBuilder(); + + //Creation of Schutzbereiche starting with page 2 + //Last page is skipped; No valuable data + for (int i = 2; i < reader.getNumberOfPages(); i++) { + secDevData.append(PdfTextExtractor.getTextFromPage(reader, i)); + } + scanner = new Scanner(secDevData.toString()); + //Give Area creation all pages + List createdAreas = createSecurityAreasFromPage(scanner); + + if (created.getSecurityArea() == null) { + created.setSecurityArea(new ArrayList<>()); + } + + created.getSecurityArea().addAll(createdAreas); + for (SecurityArea area : created.getSecurityArea()) { + area.setMachine(created); + } + + location.setCompany(company); + //companyManager.refresh(company); + company.addLocation(location); + companyManager.save(company); + } catch (IOException ex) { + LOGGER.error(ex); + sendErrorMessage(ERROR_TITLE, "Die Datei \"" + name + "\" konnte nicht gelesen werden!"); + return; + } catch (Exception e) { + sendErrorMessage(ERROR_TITLE, "Die Datei \"" + name + "\" konnte nicht gelesen werden!"); + e.printStackTrace(); + } + + sendInfoMessage(SUCCESS_TITLE, "Das einlesen von den Daten von " + name + " war erfolgreich!"); + }); + } + + private boolean checkForRightDocument(Scanner scanner, String name) { + if (scanner.hasNextLine()) { + String line = scanner.nextLine(); + if (!line.startsWith("Leuze")) { + LOGGER.error("Document didn't start with Leuze header"); + //sendErrorMessage(ERROR_TITLE, "Die Datei \"" + name + "\" konnte nicht gelesen werden, falscher Inhalt!"); + if (scanner.hasNextLine()) { + if (!line.startsWith("Inspektionsprotokoll")) { + LOGGER.error("Exspected \"Inspektionsprotokoll\" in second line"); + sendErrorMessage(ERROR_TITLE, "Die Datei \"" + name + "\" konnte nicht gelesen werden, falscher Inhalt!"); + return false; + } + + return true; + } else { + sendErrorMessage(ERROR_TITLE, "Die Datei \"" + name + "\" konnte nicht gelesen werden, falscher Inhalt!"); + return false; + } + } + } else { + sendErrorMessage(ERROR_TITLE, "Die Datei \"" + name + "\" konnte nicht gelesen werden, falscher Inhalt!"); + return false; + } + if (scanner.hasNextLine()) { + String line = scanner.nextLine(); + if (!line.startsWith("Inspektionsprotokoll")) { + LOGGER.error("Exspected \"Inspektionsprotokoll\" in second line"); + sendErrorMessage(ERROR_TITLE, "Die Datei \"" + name + "\" konnte nicht gelesen werden, falscher Inhalt!"); + return false; + } + } else { + sendErrorMessage(ERROR_TITLE, "Die Datei \"" + name + "\" konnte nicht gelesen werden, falscher Inhalt!"); + return false; + } + + return true; + } + + private synchronized Company createCompanyFromPage(Scanner scanner) { + Company output = new Company(); + output.setStatus(Status.ACTIVE); + Company loaded = null; + + String line = scanner.nextLine(); + line = line.replace("Firmenname", "").trim(); + loaded = companyController.getCompanyByName(line); + if (loaded != null) { + loaded = createAddressForCompany(scanner, loaded); + return loaded; + } + output.setName(line); + output = createAddressForCompany(scanner, output); + + line = scanner.nextLine(); + line = line.replace("Kundennummer", "").trim(); + output.setKundenNr(line); + + return output; + } + + private Company createAddressForCompany(Scanner scanner, Company company) { + if (company.getAddresses() == null) { + company.setAddresses(new HashSet<>()); + + } + String line = scanner.nextLine(); + String strNr = line.replace("Straße/Hsnr.", "").trim(); + + line = scanner.nextLine(); + String plzOrt = line.replace("Plz/Ort", "").trim(); + + line = scanner.nextLine(); + String country = line.replace("Staat", "").trim(); + + for (CompanyAddress add : company.getAddresses()) { + if (!strNr.contains(add.getStreet())) { + continue; + } + if (!strNr.contains(add.getNumber())) { + continue; + } + if (!plzOrt.contains(add.getPostnumber().toString())) { + continue; + } + + return company; + } + + CompanyAddress addr = new CompanyAddress(); + + addr.setCompany(company); + Matcher streetMatcher = streetPattern.matcher(strNr); + streetMatcher.find(); + addr.setStreet(streetMatcher.group(1)); + addr.setNumber(streetMatcher.group(2)); + + Matcher countyMachter = countyPattern.matcher(plzOrt); + countyMachter.find(); + addr.setPostnumber(Integer.valueOf(countyMachter.group(1))); + addr.setCounty(countyMachter.group(2)); + + addr.setPlace(addr.getCounty()); + addr.setCountry(country); + + company.getAddresses().add(addr); + + return company; + } + + private Machine createMachineFromPage(Scanner scanner) { + Machine output = new Machine(); + output.setMachineStatus(MachineStatus.ACTIVE); + String cleaned; + String nullValue = "-/-"; + String line = scanner.nextLine(); + + System.out.println(line); + + if (line.startsWith("Bezeichnung")) { + cleaned = line.replace("Bezeichnung ", "").trim(); + output.setName(cleaned); + //Skip Standort line + scanner.nextLine(); + line = scanner.nextLine(); + } + + if (line.startsWith("Hersteller")) { + line = scanner.nextLine(); + } + + if (line.startsWith("Maschinenart")) { + cleaned = line.replace("Maschinenart", "").trim(); + output.setMachineType(MachineType.getByString(cleaned)); + line = scanner.nextLine(); + } + + if (line.startsWith("Modell/Typ")) { + cleaned = line.replace("Modell/Typ ", "").trim(); + if (!cleaned.contains(nullValue)) { + output.setModellType(cleaned); + } + line = scanner.nextLine(); + } + + if (line.startsWith("Maschinen-Nr.")) { + cleaned = line.replace("Maschinen-Nr. ", "").trim(); + if (!cleaned.contains(nullValue)) { + output.setMachineNr(cleaned); + } + line = scanner.nextLine(); + } + + if (line.startsWith("Inventar-Nr.")) { + cleaned = line.replace("Inventar-Nr. ", "").trim(); + if (!cleaned.contains(nullValue)) { + output.setInventarNr(cleaned); + } + line = scanner.nextLine(); + } + + if (line.startsWith("Kostenstelle")) { + cleaned = line.replace("Kostenstelle ", "").trim(); + if (!cleaned.contains(nullValue)) { + output.setCostCenter(cleaned); + } + line = scanner.nextLine(); + } + + if (line.startsWith("Baujahr")) { + cleaned = line.replace("Baujahr ", "").trim(); + if (!cleaned.contains(nullValue)) { + output.setBuildingYear(Integer.valueOf(cleaned)); + } + line = scanner.nextLine(); + } + + if (line.startsWith("Umbau-Jahr")) { + cleaned = line.replace("Umbau-Jahr ", "").trim(); + if (!cleaned.contains(nullValue)) { + output.setChangeYear(Integer.valueOf(cleaned)); + } + line = scanner.nextLine(); + } + + if (line.startsWith("B.2")) { + line = scanner.nextLine(); + } + + if (line.startsWith("Norm 'sicherheitsbez. Teile einer Steuerung'")) { + output.setControlParts(ControlParts.getFromString(line)); + line = scanner.nextLine(); + } + + if (line.startsWith("Norm 'Anordnung/ Annäherung'")) { + output.setArrayApproach(ArrayApproach.getFromString(line)); + line = scanner.nextLine(); + } + + if (line.startsWith("Norm 'Anw. von AOPD/AOPDDR'")) { + output.setAopd_aopddr(AOPD_AOPDDR.getFromString(line)); + line = scanner.nextLine(); + } + + if (line.startsWith("B.3")) { + line = scanner.nextLine(); + while (!line.startsWith("Bemerkungen zur gesamten Maschine")) { + line = scanner.nextLine(); + } + cleaned = line.replace("Bemerkungen zur gesamten Maschine ", "").trim(); + if (!cleaned.contains(nullValue)) { + StringBuilder builder = new StringBuilder(); + builder.append(cleaned); + while (!(line = scanner.nextLine()).startsWith("Monat der n")) { + builder.append(line); + } + + output.setComment(builder.toString()); + } + } + + return output; + } + + private Location createLocationFromPage(Scanner scanner, Set loadedData) { + String locName = null; + while (locName == null && scanner.hasNextLine()) { + String line = scanner.nextLine(); + if (line.startsWith("Maschinenstandort")) { + locName = line.replace("Maschinenstandort ", "").trim(); + } + } + + Location location = null; + if (!loadedData.isEmpty()) { + for (Location loc : loadedData) { + if (loc.getName().equals(locName)) { + location = loc; + } + } + } + if (location == null) { + location = new Location(); + location.setName(locName); + loadedData.add(location); + } + + return location; + } + + private List createSecurityAreasFromPage(Scanner scanner) { + SecurityArea area = new SecurityArea(); + List output = new ArrayList<>(); + String line; + + while (scanner.hasNextLine()) { + line = scanner.nextLine(); + + //Skip headline + if (line.startsWith("C. Schutzbereich")) { + continue; + } + + Matcher areaMatcher = areaPattern.matcher(line); + + //Start of a new Schutzbereich + if (areaMatcher.find()) { + area = new SecurityArea(); + area = extractSecurityAreaData(scanner, line, area); + area.setSecurityDevices(new ArrayList<>()); + area.setDangerPoints(new ArrayList<>()); + area.setSwitchingDevices(new ArrayList<>()); + output.add(area); + + continue; + } + + //If there is one or Security Devices + if (SecurityType.getByString(line) != null) { + SecurityDevice dev = createSecurityDeviceFromPage(scanner, line); + if (dev != null) { + dev.setArea(area); + area.getSecurityDevices().add(dev); + } + } + + //If there is a Schaltkomponente(Switchingdevice) + if (line.startsWith("Schaltkomponente:")) { + SwitchingDevice swd = createSwitchingDeviceFromPage(scanner, line); + if (swd != null) { + swd.setArea(area); + area.getSwitchingDevices().add(swd); + } + } + //Gefahrenpunkte coming last + if (line.startsWith("Gefahrpunkt:")) { + DangerPoint dp = null; + try { + dp = createDangerPointFromPage(scanner, line, area.getSecurityDevices()); + } catch (Exception e) { + LOGGER.error(e); + } + + if (dp != null) { + dp.setSecurityArea(area); + area.getDangerPoints().add(dp); + } + } + } + + return output; + } + + //Starts at position "C\\.\\d)" e.g.: "C.1" Header of SecurityArea + private SecurityArea extractSecurityAreaData(Scanner scanner, String start, SecurityArea area) { + start = start.replaceFirst("C\\.\\d+ ", ""); + start = start.replaceFirst("\\d+-\\d+ - Seite \\d+\\/\\d+", ""); + area.setName(start.trim()); + String line; + scanner.nextLine(); + + //Next 5 lines contains data for area + line = scanner.nextLine(); + area.setProtectionType(ProtectionType.getFromString(line)); + + line = scanner.nextLine(); + area.setMountingPosition(MountingPosition.getFromString(line)); + + line = scanner.nextLine().replace("Werkzeug-/ Vorrichtungsnr. ", ""); + if (!line.contains("-/-")) { + area.setToolNr(line.replace("", "")); + } + + line = scanner.nextLine(); + area.setOverrunMeasurementType(OverrunMeasurementType.getFromString(line)); + + line = scanner.nextLine(); + area.setApproachSpeed(ApproachSpeed.getFromString(line)); + + System.out.println(area); + return area; + } + + private SecurityDevice createSecurityDeviceFromPage(Scanner scanner, String line) { + SecurityDevice output = new SecurityDevice(); + + System.out.println(line); + + output.setType(SecurityType.getByString(line)); + output.setDescription(line.replace(output.getType().getName() + ":", "").trim()); + + //Creation of Manufacturer not so Easy for device + line = scanner.nextLine(); + if (!line.startsWith("Hersteller")) { + return null; + } + line = line.replace("Hersteller", "").trim(); + output.setCompany(securityDeviceCompanyController.getByName(line)); + + //Not clear if Role is printed on Laserscanner + if (output.getType() != SecurityType.LASERRSCANNER) { + line = scanner.nextLine(); + output.setDeviceRole(DeviceRole.getByString(line)); + } + line = scanner.nextLine(); + + if (line.startsWith("Rolle")) { + line = scanner.nextLine(); + } + line = line.replace("Sicherheitskategorie / Typ", "").trim(); + output.setSecurityCategory(SecurityCategory.getByString(line)); + + line = scanner.nextLine(); + output.setSfAlignment(SfAlignment.getbyString(line)); + + line = scanner.nextLine(); + output.setMutingBlankingModus(MutingBlankingModus.getbyString(line)); + + line = scanner.nextLine(); + output.setMutingSignals(MutingSignals.getByString(line)); + + line = scanner.nextLine(); + line = line.replace("Serien-Nr(n). Sender/Optikteil/SK", "").trim(); + output.setSerialNrSender(line); + + line = scanner.nextLine(); + line = line.replace("Serien-Nr(n). Empfänger/Refl.", "").trim(); + output.setSerialNrReceiver(line); + + line = scanner.nextLine(); + output.seteSPE_Paramable(Option.getByString(line)); + + line = scanner.nextLine(); + line = line.replace("Identifikation der Konfiguration", "").trim(); + output.setConfigID(line); + + line = scanner.nextLine(); + line = line.replace("RFID", "").trim(); + output.setRfid(line); + + line = scanner.nextLine(); + output.setComponent(Component.getByString(line)); + + line = scanner.nextLine(); + if (!line.contains("-/-")) { + line = line.replace("Schutzfeldbreite (mm)", "").trim(); + output.setsFdWidth(Integer.valueOf(line.split(";")[0])); + } + + line = scanner.nextLine(); + if (!line.contains("-/-")) { + line = line.replace("Vert.-SF: Höhe, Horiz.-SF: Tiefe (mm)", "").trim(); + output.setsFHeightDepth(Integer.valueOf(line)); + } + + line = scanner.nextLine(); + if (!line.contains("-/-")) { + line = line.replace("Höhe ob. Strahl ü. Bezugsebene (mm)", "").trim(); + output.setHeightTopRay(Integer.valueOf(line)); + } + + line = scanner.nextLine(); + if (!line.contains("-/-")) { + line = line.replace("Höhe SF ü. Bezugsebene (mm)", "").trim(); + output.setHeightOverReference(Integer.valueOf(line)); + } + + line = scanner.nextLine(); + if (!line.contains("-/-")) { + line = line.replace("Abstand zum Maschinentisch (mm)", "").trim(); + output.setDistanceTable(Integer.valueOf(line)); + } + + line = scanner.nextLine(); + if (!line.contains("-/-")) { + line = line.replace("Detektionsvermögen (mm) [=>C]", "").trim(); + output.setDetectionCapacity(Integer.valueOf(line)); + } + + line = scanner.nextLine(); + if (!line.contains("-/-")) { + line = line.replace("Ansprechzeit t1 (ms)", "").trim(); + output.setResponseTime(Integer.valueOf(line)); + } + + return output; + } + + private SwitchingDevice createSwitchingDeviceFromPage(Scanner scanner, String line) { + SwitchingDevice output = new SwitchingDevice(); + + line = line.replace("Schaltkomponente:", "").trim(); + output.setDescription(line); + + line = scanner.nextLine(); + line = line.replace("Hersteller", "").trim(); + output.setCompany(securityDeviceCompanyController.getByName(line)); + + line = scanner.nextLine(); + line = line.replace("Sicherheitskategorie / Typ", "").trim(); + output.setSecurityCategory(SecurityCategory.getByString(line)); + + line = scanner.nextLine(); + line = line.replace("Serien-Nr(n). Sender/Optikteil/SK", "").trim(); + output.setSerialNrSender(line); + + line = scanner.nextLine(); + line = line.replace("Identifikation der Konfiguration", "").trim(); + output.setConfigID(line); + + line = scanner.nextLine(); + output.setComponent(Component.getByString(line)); + + line = scanner.nextLine(); + if (!line.contains("-/-")) { + line = line.replace("Bemerkung", "").trim(); + output.setComment(line); + } + + return output; + } + + private DangerPoint createDangerPointFromPage(Scanner scanner, String line, List devices) { + DangerPoint dp = new DangerPoint(); + MeasuringPoint mp = new MeasuringPoint(); + dp.setMeasuringPoint(mp); + mp.setDangerPoint(dp); + + line = line.replace("Gefahrpunkt:", "").trim(); + dp.setDescription(line); + + System.out.println(line); + + line = scanner.nextLine(); + if (line.matches("C\\.\\d+\\.\\d+.*")) { + LOGGER.warn("Empty Dangerpoint {}", dp.getDescription()); + return null; + } + + for (SecurityDevice dev : devices) { + if (line.contains(dev.getDescription())) { + dp.setSecurityDevice(dev); + } + } + + line = scanner.nextLine(); + if (!line.contains("-/-")) { + line = line.replace("Ist-Abstand (mm)", "").trim(); + mp.setActualDistance(Integer.valueOf(line)); + } + + line = scanner.nextLine(); + if (!line.contains("-/-")) { + line = line.replace("Abstand lt. Angabe (mm)", "").trim(); + mp.setDistanceSpec(Integer.valueOf(line)); + } + + line = scanner.nextLine(); + if (!line.contains("-/-")) { + line = line.replace("Nachlaufzeit lt. Angabe (ms)", "").trim(); + mp.setFollowUpTimeSpec(Integer.valueOf(line)); + } + + line = scanner.nextLine(); + if (!line.contains("-/-")) { + line = line.replace("Nachlaufweg lt. Angabe (mm)", "").trim(); + mp.setFollowUpCoveredDistanceSpec(Integer.valueOf(line)); + } + + line = scanner.nextLine(); + if (!line.contains("-/-")) { + line = line.replace("Höhe Gefahrpunkt (mm)", "").trim(); + mp.setHeight(Integer.valueOf(line)); + } + + line = scanner.nextLine(); + if (!line.contains("-/-")) { + line = line.replace("CRT/CRO (mm) - ersetzt formelbasierte Berechnung!", "").trim(); + mp.setCrtCro(Integer.valueOf(line)); + } + + return dp; + } + + private Map createCompanyDataFromPDF() { + Map output = new HashMap<>(); + for (UploadedFile f : files.getFiles()) { + if (f.getContentType().contains("pdf")) { + try { + output.put(f.getFileName(), f.getInputStream().readAllBytes()); + } catch (IOException ex) { + LOGGER.error(ex); + sendErrorMessage(ERROR_TITLE, "Die Datei \"" + f.getFileName() + "\" konnte nicht gelesen werden!"); + } + continue; + } + + if (f.getContentType().contains("zip")) { + output.putAll(getFilesFromZip(f)); + } + } + + return output; + } + + private Map getFilesFromZip(UploadedFile f) { + Map fileMap = new HashMap<>(); + + try { + ZipInputStream zipStream = new ZipInputStream(f.getInputStream()); + ZipEntry zipEntry = zipStream.getNextEntry(); + while (zipEntry != null) { + if (zipEntry.isDirectory()) { + continue; + } + + if (zipEntry.getName().toLowerCase().endsWith(".pdf")) { + fileMap.put(zipEntry.getName(), zipStream.readAllBytes()); + } + } + } catch (IOException ex) { + LOGGER.error(ex); + return null; + } + + return fileMap; + } + + private File newFile(File destinationDir, ZipEntry zipEntry) throws IOException { + File destFile = new File(destinationDir, zipEntry.getName()); + + String destDirPath = destinationDir.getCanonicalPath(); + String destFilePath = destFile.getCanonicalPath(); + + if (!destFilePath.startsWith(destDirPath + File.separator)) { + throw new IOException("Entry is outside of the target dir: " + zipEntry.getName()); + } + + return destFile; + } + + public String getAllowedTypesRE() { + StringBuilder output = new StringBuilder(allowedFileTypes.size() * 4); + + output.append("/(\\.|\\/)("); + + for (int i = 0; i < allowedFileTypes.size(); i++) { + output.append(allowedFileTypes.get(i).getExtension()); + if (i < allowedFileTypes.size() - 1) { + output.append('|'); + } + } + + output.append(")$/"); + + return output.toString(); + } + + public static long getSizeLimit() { + return sizeLimit; + } + + public UploadedFiles getFiles() { + return files; + } + + public void setFiles(UploadedFiles files) { + this.files = files; + } +} diff --git a/java/mss-failsafe/src/main/java/controller/company/SessionCompanyController.java b/java/mss-failsafe/src/main/java/controller/company/SessionCompanyController.java new file mode 100755 index 0000000..d03976d --- /dev/null +++ b/java/mss-failsafe/src/main/java/controller/company/SessionCompanyController.java @@ -0,0 +1,74 @@ +package controller.company; + +import business.company.CompanyManager; +import java.io.Serializable; +import javax.annotation.PostConstruct; +import javax.ejb.EJB; +import javax.enterprise.context.SessionScoped; +import javax.inject.Named; +import model.company.Company; + +/** + * Dieser Controller speichert die zuletzt ausgewählte Firma in der Benutzersitzung, + * damit diese Information über mehrere Seiten hinweg erhalten bleibt. + */ +@Named +@SessionScoped +public class SessionCompanyController implements Serializable { + + private static final long serialVersionUID = 1L; + + @EJB + CompanyManager companyManager; + + private Company selectedCompany; + private Long selectedCompanyId; + + @PostConstruct + public void init() { + selectedCompany = null; + selectedCompanyId = null; + } + + /** + * Speichert die ausgewählte Firma für die Benutzersitzung + * @param company Die ausgewählte Firma + */ + public void setSelectedCompany(Company company) { + this.selectedCompany = company; + if (company != null) { + this.selectedCompanyId = company.getId(); + } else { + this.selectedCompanyId = null; + } + } + + /** + * Gibt die ausgewählte Firma zurück. Wenn die Firma nicht vollständig geladen wurde, + * wird sie aus der Datenbank neu geladen. + * @return Die ausgewählte Firma oder null wenn keine ausgewählt wurde + */ + public Company getSelectedCompany() { + if (selectedCompany == null && selectedCompanyId != null) { + // Lade die Firma neu, falls notwendig + selectedCompany = companyManager.find(selectedCompanyId); + } + return selectedCompany; + } + + /** + * Gibt zurück, ob eine Firma ausgewählt wurde + * @return true wenn eine Firma ausgewählt wurde, sonst false + */ + public boolean hasSelectedCompany() { + return selectedCompanyId != null; + } + + /** + * Löscht die ausgewählte Firma + */ + public void clearSelectedCompany() { + selectedCompany = null; + selectedCompanyId = null; + } +} diff --git a/java/mss-failsafe/src/main/java/controller/machine/ContactController.java b/java/mss-failsafe/src/main/java/controller/machine/ContactController.java new file mode 100755 index 0000000..5e086a8 --- /dev/null +++ b/java/mss-failsafe/src/main/java/controller/machine/ContactController.java @@ -0,0 +1,137 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package controller.machine; + +import business.AbstractManager; +import business.machine.ContactManager; +import controller.AbstractController; +import java.util.ArrayList; +import java.util.List; +import javax.ejb.EJB; +import javax.faces.view.ViewScoped; +import javax.inject.Inject; +import javax.inject.Named; +import model.machine.Contact; +import model.machine.Manufacturer; + +/** + * + * @author pplate + */ +@Named +@ViewScoped +public class ContactController extends AbstractController{ + + private static final String[] WIDGETS = {"dlgCreateCustomer", "dlgEditCustomer"}; + + @EJB + ContactManager contactManager; + + @Inject + ManufacturerController manufacturerController; + + public ContactController() { + super(); + setSelected(new Contact()); + setCreated(new Contact()); + getEntities().clear(); + } + + @Override + protected AbstractManager getManager() { + return contactManager; + } + + @Override + public void clearEntries() { + setSelected(new Contact()); + setCreated(new Contact()); + getEntities().clear(); + } + + public void addFromCreated(){ + if (getCreated() == null) { + errorMessage(); + return; + } + Manufacturer manufacturer = manufacturerController.getSelected(); + + if (manufacturer == null) { + errorMessage(); + return; + } + + List contacts = manufacturer.getContacts(); + if (contacts == null) { + contacts = new ArrayList<>(); + } + + Long id = createFakeID(contacts); + + getCreated().setId(id); + getCreated().setManufacturer(manufacturer); + + contacts.add(getCreated()); + manufacturer.setContacts(contacts); + + sendInfoMessage(SUCCESS_TITLE, "Kontakt wurde erstellt!"); + clearCreated(); + + closeDialogs(WIDGETS); + } + + public void editSelected(){ + if (getSelected() == null) { + errorMessage(); + closeDialogs(WIDGETS); + return; + } + + sendInfoMessage(SUCCESS_TITLE, "Kontakt wurde bearbeitet!"); + closeDialogs(WIDGETS); + clearSelected(); + } + + public void deleteSelected(){ + if (getSelected() == null || manufacturerController.getSelected() == null) { + errorMessage(); + return; + } + + String message = String.format("Die Kontakt %s, %s, %s wurde erfolgreich entfernt", getSelected().getEmail(), getSelected().getLastname(), getSelected().getFirstname()); + manufacturerController.getSelected().getContacts().remove(getSelected()); + + if (getSelected().getId() != null && getSelected().getId() > 0) { + contactManager.remove(getSelected()); + } + + clearSelected(); + sendInfoMessage(SUCCESS_TITLE, message); + } + + public void save(){ + List contacts = manufacturerController.getSelected().getContacts(); + + if (contacts == null || contacts.isEmpty()) { + return; + } + + contacts.forEach(contact -> { + if (contact.getId() != null && contact.getId() < 0) { + contact.setId(null); + } + + contactManager.save(contact); + }); + } + + public void clearCreated(){ + setCreated(new Contact()); + } + + public void clearSelected(){ + setSelected(new Contact()); + } +} diff --git a/java/mss-failsafe/src/main/java/controller/machine/DangerPointController.java b/java/mss-failsafe/src/main/java/controller/machine/DangerPointController.java new file mode 100755 index 0000000..7a0aaff --- /dev/null +++ b/java/mss-failsafe/src/main/java/controller/machine/DangerPointController.java @@ -0,0 +1,134 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package controller.machine; + +import business.AbstractManager; +import business.machine.DangerPointManager; +import controller.AbstractController; +import java.util.ArrayList; +import java.util.List; +import javax.ejb.EJB; +import javax.faces.view.ViewScoped; +import javax.inject.Inject; +import javax.inject.Named; +import model.security.DangerPoint; +import model.security.MeasuringPoint; + +/** + * + * @author pplate + */ +@Named +@ViewScoped +public class DangerPointController extends AbstractController{ + + private static final String[] WIDGETS = {"dlgCreDP", "dlgEditDP"}; + + @EJB + DangerPointManager dangerPointManager; + + @Inject + SecurityDeviceController securityDeviceController; + + @Inject + SecurityAreaController securityAreaController; + + public DangerPointController() { + super(); + setSelected(new DangerPoint()); + getSelected().setMeasuringPoint(new MeasuringPoint()); + setCreated(new DangerPoint()); + getCreated().setMeasuringPoint(new MeasuringPoint()); + } + + @Override + protected AbstractManager getManager() { + return dangerPointManager; + } + + @Override + public void clearEntries() { + setSelected(new DangerPoint()); + getSelected().setMeasuringPoint(new MeasuringPoint()); + setCreated(new DangerPoint()); + getCreated().setMeasuringPoint(new MeasuringPoint()); + getEntities().clear(); + } + + public void addFromCreated(){ + getCreated().setSecurityArea(securityAreaController.getSelected()); + dangerPointManager.save(getCreated()); + + List dangerPoints = securityAreaController.getSelected().getDangerPoints(); + + if (dangerPoints == null) { + dangerPoints = new ArrayList<>(); + securityAreaController.getSelected().setDangerPoints(dangerPoints); + } + + dangerPoints.add(getCreated()); + securityAreaController.saveSelected(); + + sendInfoMessage(SUCCESS_TITLE, "Gefahrenpunkt wurde hinzugefügt"); + + clearEntries(); + closeDialogs(WIDGETS); + } + + public void addFromSelected(){ + + sendInfoMessage(SUCCESS_TITLE, "Gefahrenpunkt wurde bearbeitet"); + dangerPointManager.save(getSelected()); + clearEntries(); + closeDialogs(WIDGETS); + } + + public void copy(){ + DangerPoint dp = new DangerPoint(getSelected()); + dangerPointManager.save(dp); + + List dangerPoints = securityAreaController.getSelected().getDangerPoints(); + + if (dangerPoints == null) { + dangerPoints = new ArrayList<>(); + securityAreaController.getSelected().setDangerPoints(dangerPoints); + } + + dangerPoints.add(dp); + securityAreaController.saveSelected(); + + sendInfoMessage(SUCCESS_TITLE, "Gefahrenpunkt wurde kopiert"); + clearEntries(); + } + + public void deleteSelected(){ + dangerPointManager.remove(getSelected()); + + List dangerPoints = securityAreaController.getSelected().getDangerPoints(); + + if (dangerPoints == null) { + dangerPoints = new ArrayList<>(); + } + + dangerPoints.remove(getSelected()); + securityAreaController.getSelected().setDangerPoints(dangerPoints); + securityAreaController.saveSelected(); + + sendInfoMessage(SUCCESS_TITLE, "Gefahrenpunkt wurde gelöscht"); + clearEntries(); + } + + public void calcSecurityDistance(DangerPoint dp){ + if (dp == null) { + return; + } + + try { + + } catch (Exception e) { + + } + } +} diff --git a/java/mss-failsafe/src/main/java/controller/machine/MachineController.java b/java/mss-failsafe/src/main/java/controller/machine/MachineController.java new file mode 100755 index 0000000..af0bf01 --- /dev/null +++ b/java/mss-failsafe/src/main/java/controller/machine/MachineController.java @@ -0,0 +1,333 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package controller.machine; + +import business.AbstractManager; +import business.company.CompanyManager; +import business.company.LocationManager; +import business.machine.MachineManager; +import business.machine.ManufacturerManager; +import controller.AbstractController; +import controller.company.CompanyController; +import controller.company.LocationController; +import controller.company.SessionCompanyController; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.ejb.EJB; +import javax.faces.view.ViewScoped; +import javax.inject.Inject; +import javax.inject.Named; +import javax.transaction.Transactional; + +import model.machine.Machine; +import model.machine.enums.MachineStatus; +import model.machine.enums.MachineType; +import model.machine.enums.norms.AOPD_AOPDDR; +import model.machine.enums.norms.ArrayApproach; +import model.machine.enums.norms.ControlParts; +import model.company.Company; +import model.company.Location; +import model.machine.Manufacturer; +import model.machine.enums.norms.NothaltElectric; +import model.machine.enums.norms.NothaltGestaltung; +import model.machine.enums.norms.NothaltVerriegel; +import model.security.SecurityArea; +import org.hibernate.Hibernate; + +/** + * + * @author patri + */ +@ViewScoped +@Named +public class MachineController extends AbstractController { + + @Inject + CompanyController companyController; + + @Inject + LocationController locationController; + + @Inject + SessionCompanyController sessionCompanyController; + + @EJB + LocationManager locationManager; + + @EJB + MachineManager machineManager; + + @EJB + ManufacturerManager manufacturerManager; + + @EJB + CompanyManager companyManager; + + private String[] widgets = {"dlgMoveMac", "dlgEditMac", "dlgCreMac"}; + + public MachineController() { + setSelected(new Machine()); + setCreated(new Machine()); + setEntities(new ArrayList<>()); + } + + @PostConstruct + @Transactional + public void init() { + if (companyController != null && companyController.getSelected() != null) { + companyController.addFromSelected(); + } + } + + @Override + public void clearEntries() { + setSelected(new Machine()); + setCreated(new Machine()); + getEntities().clear(); + companyController.clearEntries(); + locationController.clearEntries(); + } + + public void save() { + locationController.getLocations() + .stream() + .map(Location::getMachines) + .flatMap(List::stream) + .forEach(mac -> { + if (mac.getId() == null) { + machineManager.create(mac); + return; + } + if (mac.getId() < 0) { + mac.setId(null); + machineManager.create(mac); + return; + } + machineManager.edit(mac); + }); + + locationController.saveAllToCompany(); + companyController.saveSelected(); + + sendInfoMessage(SUCCESS_TITLE, "Maschinen wurden gespeichert zu Firma \"" + companyController.getName() + "\""); + clearEntries(); + } + + public void removeManufacturerFromSelected(){ + if (getSelected() == null) { + return; + } + + removeManufacturer(getSelected()); + } + + public void moveMachineToLocation() { + if (getSelected() == null || locationController.getTarget() == null) { + errorMessage(); + closeDialogs(widgets); + return; + } + + if(!getSelected().getLocation().getMachines().remove(getSelected())){ + errorMessage(); + closeDialogs(widgets); + return; + } + + getSelected().setLocation(locationController.getTarget()); + + if(!machineManager.save(getSelected())){ + errorMessage(); + getSelected().setLocation(locationController.getSelected()); + locationController.getSelected().addMachine(getSelected()); + closeDialogs(widgets); + return; + } + + locationController.getTarget().addMachine(getSelected()); + + if(!locationManager.save(locationController.getTarget())){ + errorMessage(); + getSelected().setLocation(locationController.getSelected()); + locationController.getSelected().addMachine(getSelected()); + closeDialogs(widgets); + return; + } + + locationController.saveSelected(); + + sendInfoMessage(SUCCESS_TITLE, "Maschine wurden vorschoben zu Standort \"" + locationController.getTarget().getName() + "\""); + locationController.setTarget(null); + closeDialogs(widgets); + } + + public void removeManufacturerFromCreated(){ + if (getCreated() == null) { + return; + } + + removeManufacturer(getCreated()); + } + + private void removeManufacturer(Machine machine) { + Manufacturer man = machine.getManufacturer(); + machine.setManufacturer(null); + if (man == null) { + return; + } + if (man.getId() == null) { + return; + } + + man = manufacturerManager.reloadWithMachines(man); + man.getMachines().remove(getCreated()); + + manufacturerManager.save(man); + } + + public void addMachineToLocation() { + if (getCreated() == null || locationController.getSelected() == null) { + errorMessage(); + return; + } + + Machine mac = new Machine(getCreated()); + mac.setLocation(locationController.getSelected()); + Long fakeId = createFakeID(locationController.getSelected().getMachines()); + mac.setId(fakeId); + locationController.getSelected().addMachine(mac); + + setCreated(new Machine()); + sendInfoMessage(SUCCESS_TITLE, "Maschine Nr. " + (locationController.getSelected().getMachines().indexOf(mac) + 1) + " wurde zu Standort \"" + locationController.getSelected().getName() + "\" hinzugefügt."); + } + + public void copySelectedMachineToLocation(){ + if (getSelected() == null) { + errorMessage(); + return; + } + if (locationController.getSelected() == null) { + errorMessage(); + return; + } + + Machine copy = machineManager.copyMachine(getSelected()); + + if(copy != null){ + locationController.getSelected().addMachine(copy); + locationController.saveSelected(); + successMessage(); + } else { + errorMessage(); + } + } + + public void editSelectedMachine() { + sendInfoMessage(SUCCESS_TITLE, "Maschine Nr. \"" + (locationController.getSelected().getMachines().indexOf(getSelected()) + 1) + "\" wurde bei Standort \"" + locationController.getSelected().getName() + "\" geändert."); + setSelected(new Machine()); + } + + public boolean saveSelected(){ + if (getSelected() == null) { + errorMessage(); + return false; + } + + if (getSelected().getId() == null || getSelected().getId() > 0) { + machineManager.save(getSelected()); + return true; + } + + if (getSelected().getId() < 0) { + getSelected().setId(null); + machineManager.save(getSelected()); + return true; + } + + return false; + } + + public void clearSelected() { + setSelected(new Machine()); + } + + public void deleteSelected() { + if (getSelected() == null) { + errorMessage(); + return; + } + + locationController.getSelected().getMachines().remove(getSelected()); + getSelected().getLocation().getMachines().remove(getSelected()); + locationManager.save(getSelected().getLocation()); + locationController.saveSelected(); + + getSelected().setLocation(null); + saveSelected(); + + if (getSelected().getId() > 0) { + if(machineManager.remove(getSelected())){ + companyController.addFromSelected(); + sendInfoMessage(SUCCESS_TITLE, "Machine \"" + getSelected().getName() + "\" wurde entfernt"); + } else { + errorMessage(); + } + } + setSelected(new Machine()); + } + + public void addSecurityAreaToSelected(SecurityArea area){ + if (area == null){ + LOGGER.error("Tried to add null to Machine"); + return; + } + + if (getSelected().getSecurityArea() == null){ + getSelected().setSecurityArea(new ArrayList<>()); + } + + getSelected().getSecurityArea().add(area); + } + + public MachineStatus[] getAllStatus() { + return MachineStatus.values(); + } + + public MachineType[] getAllTypes() { + return MachineType.values(); + } + + public ControlParts[] getControlParts() { + return ControlParts.values(); + } + + public ArrayApproach[] getArrayApproach() { + return ArrayApproach.values(); + } + + public AOPD_AOPDDR[] getAopd_aopddr() { + return AOPD_AOPDDR.values(); + } + + public NothaltElectric[] getNothaltElectrics(){ + return NothaltElectric.values(); + } + + public NothaltGestaltung[] getNothaltGestaltungs(){ + return NothaltGestaltung.values(); + } + + public NothaltVerriegel[] getNothaltVerriegels(){ + return NothaltVerriegel.values(); + } + + @Override + protected AbstractManager getManager() { + return machineManager; + } + +} diff --git a/java/mss-failsafe/src/main/java/controller/machine/ManufacturerAdressController.java b/java/mss-failsafe/src/main/java/controller/machine/ManufacturerAdressController.java new file mode 100755 index 0000000..74f3ddf --- /dev/null +++ b/java/mss-failsafe/src/main/java/controller/machine/ManufacturerAdressController.java @@ -0,0 +1,129 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package controller.machine; + +import business.AbstractManager; +import business.machine.ManufacturerAddressManager; +import controller.AbstractController; +import java.util.ArrayList; +import java.util.List; +import javax.ejb.EJB; +import javax.faces.view.ViewScoped; +import javax.inject.Inject; +import javax.inject.Named; +import model.machine.Manufacturer; +import model.machine.ManufacturerAddress; +import org.primefaces.PrimeFaces; + +/** + * + * @author pplate + */ +@Named +@ViewScoped +public class ManufacturerAdressController extends AbstractController{ + + private static final String[] WIDGETS = {"dlgAddAddress", "dlgEditAddress"}; + + @EJB + ManufacturerAddressManager manufacturerAddressManager; + + @Inject + ManufacturerController manufacturerController; + + public ManufacturerAdressController() { + super(); + setSelected(new ManufacturerAddress()); + setCreated(new ManufacturerAddress()); + } + + @Override + protected AbstractManager getManager() { + return manufacturerAddressManager; + } + + @Override + public void clearEntries() { + setSelected(new ManufacturerAddress()); + setCreated(new ManufacturerAddress()); + getEntities().clear(); + } + + public void deleteSelected(){ + if (getSelected() == null || manufacturerController.getSelected() == null) { + errorMessage(); + return; + } + + String message = String.format("Die Adresse %s, %s, %s wurde erfolgreich entfernt", + getSelected().getCountry(), getSelected().getStreet(), getSelected().getNumber()); + + manufacturerController.getSelected().getAdresses().remove(getSelected()); + + if (getSelected().getId() != null && getSelected().getId() > 0) { + manufacturerAddressManager.remove(getSelected()); + } + + setSelected(new ManufacturerAddress()); + sendInfoMessage(SUCCESS_TITLE, message); + } + + public void addToSelected(){ + if (getCreated() == null) { + errorMessage(); + return; + } + Manufacturer manufacturer = manufacturerController.getSelected(); + + if (manufacturer == null) { + errorMessage(); + return; + } + List addresses = manufacturer.getAdresses(); + if (addresses == null) { + addresses = new ArrayList<>(); + } + + Long id = createFakeID(addresses); + + getCreated().setId(id); + getCreated().setManufacturer(manufacturer); + + addresses.add(getCreated()); + manufacturer.setAdresses(addresses); + + sendInfoMessage(SUCCESS_TITLE, "Adresse wurde erstellt!"); + setCreated(new ManufacturerAddress()); + closeDialogs(WIDGETS); + } + + public void editSelected(){ + if (getSelected() == null) { + errorMessage(); + closeDialogs(WIDGETS); + return; + } + + sendInfoMessage(SUCCESS_TITLE, "Adresse wurde bearbeitet!"); + closeDialogs(WIDGETS); + setSelected(new ManufacturerAddress()); + } + + public void save(){ + List addresses = manufacturerController.getSelected().getAdresses(); + + if (addresses == null || addresses.isEmpty()) { + return; + } + + addresses.forEach(addr -> { + if (addr.getId() != null && addr.getId() < 0) { + addr.setId(null); + } + + manufacturerAddressManager.save(addr); + }); + } +} diff --git a/java/mss-failsafe/src/main/java/controller/machine/ManufacturerController.java b/java/mss-failsafe/src/main/java/controller/machine/ManufacturerController.java new file mode 100755 index 0000000..4a18895 --- /dev/null +++ b/java/mss-failsafe/src/main/java/controller/machine/ManufacturerController.java @@ -0,0 +1,185 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package controller.machine; + +import business.AbstractManager; +import business.machine.MachineManager; +import business.machine.ManufacturerManager; +import controller.AbstractController; +import controller.tickets.machine.TicketMachineController; +import java.util.ArrayList; +import java.util.List; +import javax.ejb.EJB; +import javax.faces.view.ViewScoped; +import javax.inject.Inject; +import javax.inject.Named; +import model.machine.Manufacturer; +import model.machine.Machine; + +/** + * + * @author pplate + */ +@Named +@ViewScoped +public class ManufacturerController extends AbstractController{ + + private static final String[] WIDGETS = {"dlgEditComp", "dlgEditComp2"}; + + @EJB + ManufacturerManager manufacturerManager; + + @EJB + MachineManager machineManager; + + @Inject + ContactController contactController; + + @Inject + ManufacturerAdressController adressController; + + @Inject + MachineController machineController; + + @Inject + TicketMachineController ticketMachineController; + + private static List allManufacturers; + + public ManufacturerController() { + setSelected(new Manufacturer()); + setCreated(new Manufacturer()); + getEntities().clear(); + } + + public void loadFromSelected(){ + if (getSelected() == null || getSelected().getId() == null) { + errorMessage(); + return; + } + + setSelected(manufacturerManager.reload(getSelected())); + closeDialogs(WIDGETS); + } + + public void loadFromSelectedAddToMachine(){ + if (getSelected() == null || getSelected().getId() == null) { + errorMessage(); + return; + } + + Manufacturer man = machineController.getCreated().getManufacturer(); + + if (man != null && man.getId() != null) { + machineController.removeManufacturerFromSelected(); + } + + setSelected(manufacturerManager.reloadWithMachines(getSelected())); + machineController.getSelected().setManufacturer(getSelected()); + + List machines = getSelected().getMachines(); + if (machines == null) { + machines = new ArrayList<>(); + } + + machines.add(machineController.getSelected()); + closeDialogs(WIDGETS); + } + + public void loadFromSelectedAddToCreatedMachine(){ + if (getSelected() == null || getSelected().getId() == null) { + errorMessage(); + return; + } + Manufacturer man = machineController.getCreated().getManufacturer(); + + if (man != null && man.getId() != null) { + machineController.removeManufacturerFromCreated(); + } + + setSelected(manufacturerManager.reloadWithMachines(getSelected())); + machineController.getCreated().setManufacturer(getSelected()); + + List machines = getSelected().getMachines(); + if (machines == null) { + machines = new ArrayList<>(); + } + + machines.add(machineController.getSelected()); + closeDialogs(WIDGETS); + } + + @Override + protected AbstractManager getManager() { + return manufacturerManager; + } + + @Override + public void clearEntries() { + setSelected(new Manufacturer()); + setCreated(new Manufacturer()); + getEntities().clear(); + } + + public void saveSelected(){ + if (getSelected() == null) { + errorMessage(); + return; + } + if (getSelected().getId() == null) { + if (getSelected().getAdresses() != null) { + getSelected().getAdresses().forEach(addr -> addr.setId(null)); + } + if (getSelected().getContacts() != null) { + getSelected().getContacts().forEach(contact -> contact.setId(null)); + } + } else { + adressController.save(); + contactController.save(); + } + + boolean saved = manufacturerManager.save(getSelected()); + + if (saved) { + refreshAllManufacturers(); + sendInfoMessage(SUCCESS_TITLE, "Die Firma \"" + getSelected().getName() + "\" wurde erfolgreich gespeichert!"); + } else { + errorMessage(); + } + } + + public void deleteSelected(){ + if (getSelected() == null || getSelected().getId() == null || getSelected().getId() < 0) { + errorMessage(); + return; + } + + setSelected(manufacturerManager.reloadWithMachines(getSelected())); + String message = String.format("Der Hersteller %s wurde gelöscht. %d Maschinen sind nun ohne Hersteller!", getSelected().getName(), getSelected().getMachines() != null ? getSelected().getMachines().size() : 0); + + if (getSelected().getMachines() != null) { + getSelected().getMachines().forEach(mac -> { + mac.setManufacturer(null); + machineManager.save(mac); + }); + } + + manufacturerManager.remove(getSelected()); + sendInfoMessage(SUCCESS_TITLE, message); + clearEntries(); + refreshAllManufacturers(); + } + + public void refreshAllManufacturers(){ + allManufacturers = manufacturerManager.findAll(); + } + + public List getAllManufacturers() { + if (allManufacturers == null) { + refreshAllManufacturers(); + } + return allManufacturers; + } +} diff --git a/java/mss-failsafe/src/main/java/controller/machine/SecurityAreaController.java b/java/mss-failsafe/src/main/java/controller/machine/SecurityAreaController.java new file mode 100755 index 0000000..6f765e5 --- /dev/null +++ b/java/mss-failsafe/src/main/java/controller/machine/SecurityAreaController.java @@ -0,0 +1,428 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package controller.machine; + +import business.AbstractManager; +import business.machine.DangerPointManager; +import business.machine.SecurityAreaManager; +import business.machine.SecurityDeviceManager; +import business.machine.SwitchingDeviceManager; +import business.questions.QuestionaireManager; +import controller.AbstractController; + +import javax.annotation.PostConstruct; +import javax.ejb.EJB; +import javax.faces.view.ViewScoped; +import javax.inject.Inject; +import javax.inject.Named; +import javax.transaction.Transactional; + +import controller.company.CompanyController; +import controller.company.LocationController; +import controller.company.SessionCompanyController; +import model.company.Company; +import model.machine.Machine; +import model.security.SecurityArea; +import org.hibernate.Hibernate; +import org.primefaces.model.DefaultTreeNode; +import org.primefaces.model.TreeNode; +import org.primefaces.model.menu.DefaultSubMenu; + +import java.util.ArrayList; +import java.util.List; +import model.security.enums.MountingPosition; +import model.security.enums.OverrunMeasurementType; +import model.security.enums.ProtectionType; +import model.company.Location; +import model.security.enums.ApproachSpeed; +import model.security.DangerPoint; +import model.question.Questionaire; +import model.security.SecurityAreaQuestionnaire; + +/** + * + * @author patri + */ +@ViewScoped +@Named +public class SecurityAreaController extends AbstractController{ + + @EJB + SecurityAreaManager securityAreaManager; + + @EJB + SecurityDeviceManager deviceManager; + + @EJB + DangerPointManager dangerPointManager; + + @EJB + SwitchingDeviceManager switchingDeviceManager; + + @EJB + QuestionaireManager questionaireManager; + + @Inject + MachineController machineController; + + @Inject + LocationController locationController; + + @Inject + SecurityDeviceController securityDeviceController; + + @Inject + CompanyController companyController; + + @Inject + SessionCompanyController sessionCompanyController; + + private TreeNode root; + private TreeNode selectedNode; + + private Machine machine; + + // Questionnaire-specific properties + private Questionaire selectedQuestionnaire; + private SecurityAreaQuestionnaire selectedSecurityAreaQuestionnaire; + private List availableQuestionnaires; + + public SecurityAreaController() { + setSelected(new SecurityArea()); + setCreated(new SecurityArea()); + setEntities(new ArrayList<>()); + } + + public void save(){ + securityDeviceController.save(); + List newOnes = new ArrayList<>(); + companyController.getSelected().getLocations() + .stream() + .map(loc -> loc.getMachines()) + .flatMap(List::stream) + .map(mac -> mac.getSecurityArea()) + .flatMap(List::stream) + .filter(area -> area.getId() != null && area.getId() < 0) + .forEach(area -> { + area.setId(null); + newOnes.add(area); + //securityAreaManager.save(area); + }); + + securityAreaManager.saveAll(newOnes); + + companyController.saveSelected(); + sendInfoMessage(SUCCESS_TITLE, "Änderungen wurden gespeichert!"); + } + + public void addAreaToMachine(){ + if (getCreated() == null || machineController.getSelected() == null) { + errorMessage(); + LOGGER.error("getCreated {}, getSelected {}", getCreated(), machineController.getSelected()); + return; + } + + getCreated().setMachine(machineController.getSelected()); + securityAreaManager.save(getCreated()); + + machineController.addSecurityAreaToSelected(getCreated()); + machineController.saveSelected(); + + sendInfoMessage(SUCCESS_TITLE, "Schutzbereich \"" + getCreated().getName() + "\" wurde erfolgreich zur " + + "Maschine \"" + machineController.getSelected().getName() + "\" hinzugefügt!"); + clearEntries(); + } + + public void deleteSelected(){ + if (getSelected() == null) { + errorMessage(); + return; + } + if (getSelected().getId() == null || getSelected().getId() < 0) { + machineController.getSelected().getSecurityArea().remove(getSelected()); + sendInfoMessage(SUCCESS_TITLE, "Schutzbereich \"" + getSelected().getName() + "\" wurde erfolgreich von " + + "Maschine \"" + machineController.getSelected().getName() + "\" entfernt!"); + return; + } + + machineController.getSelected().getSecurityArea().remove(getSelected()); + machineController.saveSelected(); + + if (getSelected().getSwitchingDevices() != null) { + // Referenzen auf Schutzbereich entfernen + getSelected().getSwitchingDevices().forEach(device -> device.setArea(null)); + switchingDeviceManager.removeAllIn(getSelected().getSwitchingDevices()); + getSelected().setSwitchingDevices(null); + } + + if (getSelected().getDangerPoints() != null) { + // Referenzen auf Schutzbereich entfernen + getSelected().getDangerPoints().forEach(point -> point.setSecurityArea(null)); + List dps = getSelected().getDangerPoints(); + getSelected().setDangerPoints(null); + dangerPointManager.removeAllIn(dps); + } + + if (getSelected().getSecurityDevices() != null) { + // Referenzen auf Schutzbereich entfernen + getSelected().getSecurityDevices().forEach(device -> device.setArea(null)); + deviceManager.removeAllIn(getSelected().getSecurityDevices()); + getSelected().setSecurityDevices(null); + } + + System.out.println(getSelected().getId()); + getSelected().setMachine(null); + securityAreaManager.delete(getSelected()); + + sendInfoMessage(SUCCESS_TITLE, "Schutzbereich \"" + getSelected().getName() + "\" wurde erfolgreich von " + + "Maschine \"" + machineController.getSelected().getName() + "\" entfernt!"); + setSelected(new SecurityArea()); + } + + public void editSelected(){ + LOGGER.info("Mac: {}, Area: {}", machineController.getSelected(), getSelected()); + sendInfoMessage(SUCCESS_TITLE, "Schutzbereich \"" + getSelected().getName() + "\" wurde erfolgreich an " + + "Maschine \"" + machineController.getSelected().getName() + "\" geändert!"); + clearEntries(); + } + + public void saveSelected(){ + securityAreaManager.save(getSelected()); + } + + public void createMachineMenu(){ + if (companyController.getSelected() == null){ + return; + } + root = new DefaultTreeNode(companyController.getSelected(), null); + + List locations = locationController.getLocations(); + List subMenus = new ArrayList<>(locations.size()); + + for (Location location : locations){ + TreeNode locNode = new DefaultTreeNode(location, root); + locNode.setSelectable(false); + if (location.getMachines() == null){ + continue; + } + for (Machine machine : location.getMachines()){ + new DefaultTreeNode(machine, locNode); + } + } + } + + public void addMachineFromMenu(Machine machine){ + machineController.setSelected(machine); + locationController.setSelected(machine.getLocation()); + } + + public void cloneToSelectedMachine(){ + LOGGER.info(machineController.getSelected()); + SecurityArea area = securityAreaManager.cloneArea(getSelected()); + + // Explizit den Namen des geklonten Bereichs setzen, um zu verhindern, dass er zurückgesetzt wird + String originalName = getSelected().getName(); + area.setName(originalName + " (Kopie)"); + + area.setMachine(machineController.getSelected()); + + // Schutzeinrichtungen neu verknüpfen, falls vorhanden + if (area.getSecurityDevices() != null && !area.getSecurityDevices().isEmpty()) { + area.getSecurityDevices().forEach(device -> { + device.setId(null); // Neue ID für Kopien erzwingen + device.setArea(area); // Referenz aktualisieren + }); + } + + // Gefahrenstellen neu verknüpfen, falls vorhanden + if (area.getDangerPoints() != null && !area.getDangerPoints().isEmpty()) { + area.getDangerPoints().forEach(point -> { + point.setId(null); // Neue ID für Kopien erzwingen + point.setSecurityArea(area); // Referenz aktualisieren + }); + } + + // Schaltgeräte neu verknüpfen, falls vorhanden + if (area.getSwitchingDevices() != null && !area.getSwitchingDevices().isEmpty()) { + area.getSwitchingDevices().forEach(device -> { + device.setId(null); // Neue ID für Kopien erzwingen + device.setArea(area); // Referenz aktualisieren + }); + } + + // Speichern des komplett aktualisierten Schutzbereichs + securityAreaManager.save(area); + machineController.getSelected().getSecurityArea().add(area); + + sendInfoMessage(SUCCESS_TITLE, "Sicherheitsbereich \""+ area.getName() +"\" wurde erfolgreich zu Maschine \"" + machineController.getSelected().getName() + "\" hinzugefügt!"); + } + + // Questionnaire Management Methods + + /** + * Adds a questionnaire to the selected security area + */ + @Transactional + public void addQuestionnaireToArea() { + if (getSelected() == null || selectedQuestionnaire == null) { + sendErrorMessage("Fehler", "Bitte wählen Sie einen Schutzbereich und einen Fragebogen aus!"); + return; + } + + SecurityArea area = securityAreaManager.addQuestionnaireToSecurityArea(getSelected(), selectedQuestionnaire); + if (area != null) { + refrehSelected(); + + sendInfoMessage(SUCCESS_TITLE, "Fragebogen \"" + selectedQuestionnaire.getName() + + "\" wurde erfolgreich zu Schutzbereich \"" + getSelected().getName() + "\" hinzugefügt!"); + selectedQuestionnaire = null; + //refreshAvailableQuestionnaires(); + } else { + sendErrorMessage("Fehler", "Fragebogen konnte nicht hinzugefügt werden!"); + } + } + + /** + * Removes a questionnaire from the selected security area + */ + public void removeQuestionnaireFromArea() { + if (getSelected() == null || selectedSecurityAreaQuestionnaire == null) { + sendErrorMessage("Fehler", "Bitte wählen Sie einen Schutzbereich und einen zu entfernenden Fragebogen aus!"); + return; + } + + boolean success = securityAreaManager.removeQuestionnaireFromSecurityArea(getSelected(), selectedSecurityAreaQuestionnaire); + if (success) { + sendInfoMessage(SUCCESS_TITLE, "Fragebogen \"" + selectedSecurityAreaQuestionnaire.getName() + + "\" wurde erfolgreich von Schutzbereich \"" + getSelected().getName() + "\" entfernt!"); + selectedSecurityAreaQuestionnaire = null; + refreshAvailableQuestionnaires(); + } else { + sendErrorMessage("Fehler", "Fragebogen konnte nicht entfernt werden!"); + } + } + + /** + * Refreshes the list of available questionnaires + */ + public void refreshAvailableQuestionnaires() { + if (getSelected() != null) { + availableQuestionnaires = securityAreaManager.getAvailableQuestionnaires(getSelected()); + } else { + availableQuestionnaires = new ArrayList<>(); + } + } + + /** + * Prepares questionnaire dialog for adding + */ + public void prepareAddQuestionnaire() { + selectedQuestionnaire = null; + refreshAvailableQuestionnaires(); + } + + /** + * Prepares questionnaire dialog for editing + */ + public void prepareEditQuestionnaire(SecurityAreaQuestionnaire questionnaire) { + selectedSecurityAreaQuestionnaire = questionnaire; + } + + @Override + public void clearEntries() { + setSelected(new SecurityArea()); + getEntities().clear(); + setCreated(new SecurityArea()); + selectedQuestionnaire = null; + selectedSecurityAreaQuestionnaire = null; + availableQuestionnaires = null; + } + + public TreeNode getRoot() { + return root; + } + + public void setRoot(TreeNode root) { + this.root = root; + } + + public TreeNode getSelectedNode() { + return selectedNode; + } + + public void setSelectedNode(TreeNode selectedNode) { + this.selectedNode = selectedNode; + if (selectedNode != null){ + addMachineFromMenu((Machine) selectedNode.getData()); + } else { + machineController.setSelected(null); + locationController.setSelected(null); + } + } + + public ProtectionType[] getProtectionTypes(){ + return ProtectionType.values(); + } + + public MountingPosition[] getMountingPositions(){ + return MountingPosition.values(); + } + + public OverrunMeasurementType[] getOverrunMeasurementTypes(){ + return OverrunMeasurementType.values(); + } + + public ApproachSpeed[] getApproachSpeeds(){ + return ApproachSpeed.values(); + } + + @Override + protected AbstractManager getManager() { + return securityAreaManager; + } + + public Machine getMachine() { + return machine; + } + + public void setMachine(Machine machine) { + this.machine = machine; + } + + @Override + public void setSelected(SecurityArea selected) { + super.setSelected(selected); + } + + // Questionnaire Getters and Setters + + public Questionaire getSelectedQuestionnaire() { + return selectedQuestionnaire; + } + + public void setSelectedQuestionnaire(Questionaire selectedQuestionnaire) { + this.selectedQuestionnaire = selectedQuestionnaire; + } + + public SecurityAreaQuestionnaire getSelectedSecurityAreaQuestionnaire() { + return selectedSecurityAreaQuestionnaire; + } + + public void setSelectedSecurityAreaQuestionnaire(SecurityAreaQuestionnaire selectedSecurityAreaQuestionnaire) { + this.selectedSecurityAreaQuestionnaire = selectedSecurityAreaQuestionnaire; + } + + public List getAvailableQuestionnaires() { + if (availableQuestionnaires == null) { + refreshAvailableQuestionnaires(); + } + return availableQuestionnaires; + } + + public void setAvailableQuestionnaires(List availableQuestionnaires) { + this.availableQuestionnaires = availableQuestionnaires; + } +} diff --git a/java/mss-failsafe/src/main/java/controller/machine/SecurityDeviceCompanyController.java b/java/mss-failsafe/src/main/java/controller/machine/SecurityDeviceCompanyController.java new file mode 100755 index 0000000..6cdf6d8 --- /dev/null +++ b/java/mss-failsafe/src/main/java/controller/machine/SecurityDeviceCompanyController.java @@ -0,0 +1,111 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package controller.machine; + +import business.AbstractManager; +import business.machine.SecurityDeviceCompanyManager; +import controller.AbstractController; +import java.util.List; +import javax.ejb.EJB; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import model.security.SecurityDeviceCompany; +import org.primefaces.PrimeFaces; + +/** + * + * @author pplate + */ +@Named +@ViewScoped +public class SecurityDeviceCompanyController extends AbstractController{ + + @EJB + SecurityDeviceCompanyManager securityDeviceCompanyManager; + + public SecurityDeviceCompanyController() { + super(); + setSelected(new SecurityDeviceCompany()); + setCreated(new SecurityDeviceCompany()); + } + + @Override + protected AbstractManager getManager() { + return securityDeviceCompanyManager; + } + + @Override + public void clearEntries() { + setSelected(new SecurityDeviceCompany()); + getEntities().clear(); + setCreated(new SecurityDeviceCompany()); + } + + public List getAllCompanies(){ + return securityDeviceCompanyManager.getCompanies(); + } + + public SecurityDeviceCompany getByName(String name){ + if (name == null || name.contains("-/-")) { + return null; + } + for(SecurityDeviceCompany comp : getAllCompanies()){ + if (comp.getName().contains(name)) { + return comp; + } + } + + return null; + } + + public void saveSelected(){ + if (getSelected() == null) { + errorMessage(); + return; + } + boolean saved = securityDeviceCompanyManager.save(getSelected()); + securityDeviceCompanyManager.reloadCompanies(); + + if (saved) { + sendInfoMessage(SUCCESS_TITLE, getSelected().getName() + " wurde erfolgreich gespeichert!"); + } else { + errorMessage(); + } + + setSelected(new SecurityDeviceCompany()); + closeDialogs(); + } + + public void deleteSelected(){ + if (getSelected() == null || getSelected().getId() == null) { + errorMessage(); + return; + } + + boolean success = securityDeviceCompanyManager.remove(getSelected()); + if (success) { + sendInfoMessage(SUCCESS_TITLE, getSelected().getName() + " wurde erfolgreich gelöscht"); + closeDialogs(); + getAllCompanies().remove(getSelected()); + setSelected(new SecurityDeviceCompany()); + } else { + errorMessage(); + } + } + + private void closeDialogs(){ + PrimeFaces current = PrimeFaces.current(); + current.executeScript("PF('dlgEditComp').hide()"); + current.executeScript("PF('dlgFindComp').hide()"); + current.executeScript("PF('dlgDelComp').hide()"); + } + + public SecurityDeviceCompany getCompany(Long id){ + if (id == null) { + return null; + } + return securityDeviceCompanyManager.find(id); + } +} diff --git a/java/mss-failsafe/src/main/java/controller/machine/SecurityDeviceController.java b/java/mss-failsafe/src/main/java/controller/machine/SecurityDeviceController.java new file mode 100755 index 0000000..55c1851 --- /dev/null +++ b/java/mss-failsafe/src/main/java/controller/machine/SecurityDeviceController.java @@ -0,0 +1,412 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package controller.machine; + +import business.AbstractManager; +import business.machine.SecurityDeviceManager; +import controller.AbstractController; +import controller.company.CompanyController; +import java.util.ArrayList; +import java.util.List; +import javax.ejb.EJB; +import javax.faces.view.ViewScoped; +import javax.inject.Inject; +import javax.inject.Named; +import model.security.SecurityDevice; +import model.company.Location; +import model.machine.Machine; +import model.machine.enums.Option; +import model.security.DangerPoint; +import model.security.SecurityArea; +import model.security.SecurityDeviceCompany; +import model.security.enums.BuildType; +import model.security.enums.Component; +import model.security.enums.DeviceRole; +import model.security.enums.MutingBlankingModus; +import model.security.enums.MutingSignals; +import model.security.enums.NotHaltContact; +import model.security.enums.NotHaltType; +import model.security.enums.Principle; +import model.security.enums.SecurityCategory; +import model.security.enums.SecurityType; +import model.security.enums.SfAlignment; +import model.security.enums.StopCategory; +import org.primefaces.PrimeFaces; + +/** + * + * @author pplate + */ +@Named +@ViewScoped +public class SecurityDeviceController extends AbstractController { + + private static final String[] WIDGETS = {"dlgCreDev", "dlgEditDev"}; + + @Inject + SecurityAreaController areaController; + + @Inject + CompanyController companyController; + + @Inject + SecurityDeviceCompanyController securityDeviceCompanyController; + + @EJB + SecurityDeviceManager deviceManager; + @Named + @Inject + private SecurityAreaController securityAreaController; + + public SecurityDeviceController() { + setSelected(new SecurityDevice()); + setCreated(new SecurityDevice()); + setEntities(new ArrayList<>()); + } + + @Override + public void clearEntries() { + setSelected(new SecurityDevice()); + setCreated(new SecurityDevice()); + getEntities().clear(); + } + + public void save() { + //Get ALL SecurityDevices from all Machines and Locations + //check for negativ id and save + List toSaves = new ArrayList<>(); + + companyController.getSelected().getLocations() + .stream() + .map(Location::getMachines) + .flatMap(List::stream) + .map(Machine::getSecurityArea) + .flatMap(List::stream) + .filter(area -> area.getSecurityDevices() != null) + .map(SecurityArea::getSecurityDevices) + .flatMap(List::stream) + .forEach(dev -> { + dev = checkCorrectNegativID(dev); + toSaves.add(dev); + LOGGER.info("dev {}; width2: {}", dev.getDescription(), dev.getsFdWidthTwo()); + //deviceManager.save(dev); + }); + + deviceManager.saveAll(toSaves); + + sendInfoMessage(SUCCESS_TITLE, "Alle Sicherheitsgeräte wurden gespeichert für \"" + + companyController.getSelected().getName() + "\""); + } + + public boolean hasRole() { + if (getSelected().getType() == null) { + return true; + } + + return (getSelected().getType() != SecurityType.LASERRSCANNER); + } + + public boolean createdHasRole() { + if (getCreated() == null || getCreated().getType() == null) { + return true; + } + + switch (getCreated().getType()) { + case DOOR_SECURITY_SWITCH: + case NOT_HALT_BEFEHLSGERAET: + case LASERRSCANNER: + return false; + default: + return true; + } + } + + public boolean createdIsStandardView() { + if (getCreated() == null || getCreated().getType() == null) { + return true; + } + + switch (getCreated().getType()) { + case DOOR_SECURITY_SWITCH: + case NOT_HALT_BEFEHLSGERAET: + return false; + default: + return true; + } + } + + public boolean selectedIsStandardView() { + if (getSelected() == null || getSelected().getType() == null) { + return true; + } + + switch (getSelected().getType()) { + case DOOR_SECURITY_SWITCH: + case NOT_HALT_BEFEHLSGERAET: + return false; + default: + return true; + } + } + + public boolean createdIsSecuritySwitch(){ + if (getCreated() == null || getCreated().getType() == null) { + return false; + } + + return getCreated().getType() == SecurityType.DOOR_SECURITY_SWITCH; + } + + public boolean selectedIsSecuritySwitch(){ + if (getSelected() == null || getSelected().getType() == null) { + return false; + } + + return getSelected().getType() == SecurityType.DOOR_SECURITY_SWITCH; + } + + public boolean createdIsNothalt() { + if (getCreated() == null || getCreated().getType() == null) { + return false; + } + + return getCreated().getType() == SecurityType.NOT_HALT_BEFEHLSGERAET; + } + + public boolean selectedIsNothalt() { + if (getSelected() == null || getSelected().getType() == null) { + return false; + } + + return getSelected().getType() == SecurityType.NOT_HALT_BEFEHLSGERAET; + } + + private SecurityDevice checkCorrectNegativID(SecurityDevice dev) { + if (dev.getId() != null && dev.getId() < 0) { + dev.setId(null); + } + + return dev; + } + + public void saveSelected() { + if (getSelected() == null) { + errorMessage(); + return; + } + + setSelected(checkCorrectNegativID(getSelected())); + deviceManager.save(getSelected()); + + sendInfoMessage(SUCCESS_TITLE, "Sicherheitsgerät wurde gespeichert!"); + setSelected(new SecurityDevice()); + } + + public void cloneToSelectedArea() { + if (getSelected() == null) { + errorMessage(); + return; + } + if (areaController.getSelected() == null) { + errorMessage(); + return; + } + + SecurityDevice device = new SecurityDevice(getSelected()); + device.setArea(areaController.getSelected()); + + areaController.getSelected().getSecurityDevices().add(device); + + sendInfoMessage(SUCCESS_TITLE, getSelected().getType() + " wurde kopiert!"); + } + + public void editSelected() { + PrimeFaces current = PrimeFaces.current(); + current.executeScript("PF('dlgEditDev').hide()"); + } + + public void deleteSelected() { + if (getSelected() == null) { + errorMessage(); + return; + } + + SecurityArea area = areaController.getSelected(); + boolean bound = false; + + for(DangerPoint dp : area.getDangerPoints()){ + if (dp.getSecurityDevice().equals(getSelected())) { + bound = true; + } + } + + if (bound) { + sendErrorMessage(ERROR_TITLE, "Schutzeinrichtung an Gefahrenpunkt gebunden.\r\n Zuerst den Gefahrenpunkt einer anderen Schutzeinrichtung zuweisen oder löschen!"); + return; + } + + + String message = "Sicherheitsgerät wurde gelöscht!"; + + if (getSelected().getId() == null || getSelected().getId() < 0) { + setSelected(new SecurityDevice()); + sendInfoMessage(SUCCESS_TITLE, message); + LOGGER.info("removed unsaved SecurityDevice"); + return; + } + + setSelected(deviceManager.refresh(getSelected())); + Integer toRemove = null; + + for(int i=0; i < areaController.getSelected().getSecurityDevices().size(); i++){ + SecurityDevice device = areaController.getSelected().getSecurityDevices().get(i); + if (device.getId() != null && device.getId().equals(getSelected().getId())) { + toRemove = i; + } + } + if (toRemove == null) { + errorMessage(); + return; + } + + areaController.getSelected().getSecurityDevices().remove(toRemove.intValue()); + areaController.saveSelected(); + + SecurityDeviceCompany comp = getSelected().getCompany(); + securityDeviceCompanyController.setSelected(comp); + comp.getSecurityDevices().remove(getSelected()); + securityDeviceCompanyController.saveSelected(); + + getSelected().setCompany(null); + getSelected().setArea(null); + + boolean deleted = deviceManager.remove(getSelected()); + + if (deleted) { + //areaController.getSelected().getSecurityDevices().remove(getSelected()); + //areaController.saveSelected(); + LOGGER.info("removed SecurityDevice with {}", getSelected().getId()); + setSelected(new SecurityDevice()); + sendInfoMessage(SUCCESS_TITLE, message); + } else { + sendErrorMessage(ERROR_TITLE, "Konnte Gerät nicht löschen. Gefahrenpunkt verbunden??"); + } + + + + } + + public void addFromCreated() { + if (getCreated() == null || areaController.getSelected() == null) { + errorMessage(); + return; + } + + getCreated().setArea(areaController.getSelected()); + deviceManager.save(getCreated()); + + List devices = areaController.getSelected().getSecurityDevices(); + + if (devices == null) { + devices = new ArrayList<>(); + } + + devices.add(getCreated()); + areaController.getSelected().setSecurityDevices(devices); + areaController.saveSelected(); + + sendInfoMessage(SUCCESS_TITLE, getCreated().getType() + " wurde erfolgreich für den Sicherheitsbereich \"" + areaController.getSelected().getName() + "\" erstellt!"); + + clearEntries(); + closeDialogs(WIDGETS); + } + + public void addFromSelected() { + if (getSelected() == null || areaController.getSelected() == null) { + errorMessage(); + return; + } + + deviceManager.save(getSelected()); + sendInfoMessage(SUCCESS_TITLE, getCreated().getType() + " wurde erfolgreich für den Sicherheitsbereich \"" + areaController.getSelected().getName() + "\" bearbeitet!"); + + clearEntries(); + closeDialogs(WIDGETS); + } + + public SecurityDevice getDevice(Long id) { + if (id == null || areaController.getSelected() == null) { + return null; + } + if (areaController.getSelected().getSecurityDevices() == null) { + return null; + } + + for (SecurityDevice device : areaController.getSelected().getSecurityDevices()) { + if (device.getId().equals(id)) { + return device; + } + } + + return null; + } + + public SecurityType[] getSecurityTypes() { + return SecurityType.values(); + } + + public BuildType[] getBuildTypes() { + return BuildType.values(); + } + + public Principle[] getPrinciples(){ + return Principle.values(); + } + + public NotHaltType[] getHaltTypes(){ + return NotHaltType.values(); + } + + public DeviceRole[] getDeviceRoles() { + return DeviceRole.values(); + } + + public SecurityCategory[] getSecurityCategorys() { + return SecurityCategory.values(); + } + + public SfAlignment[] getSfAlignments() { + return SfAlignment.values(); + } + + public MutingBlankingModus[] getMutingBlankingModuses() { + return MutingBlankingModus.values(); + } + + public MutingSignals[] getMutingSignals() { + return MutingSignals.values(); + } + + public Option[] getEspeParambles() { + return Option.values(); + } + + public Component[] getComponents() { + return Component.values(); + } + + public StopCategory[] getStopCategorys(){ + return StopCategory.values(); + } + + public NotHaltContact[] getNotHaltContact(){ + return NotHaltContact.values(); + } + + @Override + protected AbstractManager getManager() { + return deviceManager; + } +} diff --git a/java/mss-failsafe/src/main/java/controller/machine/SwitchingDeviceController.java b/java/mss-failsafe/src/main/java/controller/machine/SwitchingDeviceController.java new file mode 100755 index 0000000..fddd6bf --- /dev/null +++ b/java/mss-failsafe/src/main/java/controller/machine/SwitchingDeviceController.java @@ -0,0 +1,114 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package controller.machine; + +import business.AbstractManager; +import business.machine.SwitchingDeviceManager; +import controller.AbstractController; +import static controller.AbstractController.SUCCESS_TITLE; +import java.util.ArrayList; +import java.util.List; +import javax.ejb.EJB; +import javax.faces.view.ViewScoped; +import javax.inject.Inject; +import javax.inject.Named; +import model.security.switching.SwitchingDevice; + +/** + * + * @author pplate + */ +@Named +@ViewScoped +public class SwitchingDeviceController extends AbstractController{ + + private static final String[] WIDGETS = {"dlgCreSD", "dlgEditSD"}; + + @EJB + SwitchingDeviceManager switchingDeviceManager; + + @Inject + SecurityAreaController securityAreaController; + + public SwitchingDeviceController() { + super(); + setSelected(new SwitchingDevice()); + setCreated(new SwitchingDevice()); + } + + @Override + protected AbstractManager getManager() { + return switchingDeviceManager; + } + + @Override + public void clearEntries() { + setSelected(new SwitchingDevice()); + setCreated(new SwitchingDevice()); + getEntities().clear(); + } + + public void addFromCreated(){ + getCreated().setArea(securityAreaController.getSelected()); + switchingDeviceManager.save(getCreated()); + + List devices = securityAreaController.getSelected().getSwitchingDevices(); + + if (devices == null) { + devices = new ArrayList<>(); + securityAreaController.getSelected().setSwitchingDevices(devices); + } + + devices.add(getCreated()); + securityAreaController.saveSelected(); + + sendInfoMessage(SUCCESS_TITLE, "Schaltkomponente wurde hinzugefügt"); + + clearEntries(); + closeDialogs(WIDGETS); + } + + public void addFromSelected(){ + + sendInfoMessage(SUCCESS_TITLE, "Schaltkomponente wurde bearbeitet"); + switchingDeviceManager.save(getSelected()); + clearEntries(); + closeDialogs(WIDGETS); + } + + public void copy(){ + SwitchingDevice dp = new SwitchingDevice(getSelected()); + switchingDeviceManager.save(dp); + + List devices = securityAreaController.getSelected().getSwitchingDevices(); + + if (devices == null) { + devices = new ArrayList<>(); + securityAreaController.getSelected().setSwitchingDevices(devices); + } + + devices.add(dp); + securityAreaController.saveSelected(); + + sendInfoMessage(SUCCESS_TITLE, "Schaltkomponente wurde kopiert"); + clearEntries(); + } + + public void deleteSelected(){ + switchingDeviceManager.remove(getSelected()); + + List devices = securityAreaController.getSelected().getSwitchingDevices(); + + if (devices == null) { + devices = new ArrayList<>(); + } + + devices.remove(getSelected()); + securityAreaController.saveSelected(); + + sendInfoMessage(SUCCESS_TITLE, "Schaltkomponente wurde gelöscht"); + clearEntries(); + } +} diff --git a/java/mss-failsafe/src/main/java/controller/person/PasswordresetController.java b/java/mss-failsafe/src/main/java/controller/person/PasswordresetController.java new file mode 100755 index 0000000..9ecace5 --- /dev/null +++ b/java/mss-failsafe/src/main/java/controller/person/PasswordresetController.java @@ -0,0 +1,154 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package controller.person; + +import business.AbstractManager; +import business.PasswordResetEJB; +import business.user.PasswordManager; +import business.user.PersonManager; +import business.user.TokenManager; +import controller.AbstractController; +import java.util.Optional; +import javax.annotation.PostConstruct; +import javax.ejb.EJB; +import javax.faces.context.FacesContext; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import model.person.Person; +import model.person.Token; +import model.person.enums.TokenType; +import org.omnifaces.cdi.Param; +import static org.omnifaces.util.Faces.redirect; + +/** + * + * @author pplate + */ +@Named +@ViewScoped +public class PasswordresetController extends AbstractController{ + + @Param(name = "token") + private String tokenID; + + private String email; + private String password; + private Token loaded; + + private boolean valid = false; + + @EJB + private TokenManager tokenManager; + + @EJB + private PasswordManager passwordManager; + + @EJB + private PersonManager personManager; + + @EJB + private PasswordResetEJB passwordResetManager; + + @PostConstruct + private void checkToken() { + FacesContext context = FacesContext.getCurrentInstance(); + String path = getRequest(context).getRequestURI(); + + if (path == null || !path.contains("passwordreset.xhtml")) { + return; + } + + if (tokenID == null) { + return; + } + + loaded = tokenManager.loadByRaw(tokenID); + if (loaded == null) { + LOGGER.error("couldn't find token for {}", tokenID); + redirect("error.xhtml"); + return; + } + + valid = true; + } + + public boolean isValid(){ + if (!valid) { + redirect("error.xhtml"); + } + + return valid; + } + + public void sendResetEmail(){ + if (email == null || email.isBlank()) { + errorMessage(); + return; + } + + Optional loadedPerson = personManager.getByEmail(email); + + if (loadedPerson.isEmpty()) { + sendErrorMessage(ERROR_TITLE, "Kein Benutzer für diese Emailadresse!"); + return; + } + Person p = loadedPerson.get(); + String name = p.getFirstname() + " " + p.getLastname(); + String token = tokenManager.generatePWResetToken(email, "ip", "PW Reset Token"); + + if (token == null || token.isBlank()) { + errorMessage(); + return; + } + + if(passwordResetManager.sendPasswordResetEmail(email, name, "http://plate.software:8080/mss/passwordreset.xhtml?token=" + token)) { + successMessage(); + return; + } + + errorMessage(); + } + + public String resetPassword(){ + if (!valid || loaded == null) { + return "error.xhtml"; + } + + if(passwordManager.resetPassword(loaded.getPerson(), password)) { + sendInfoMessage(SUCCESS_TITLE, "Ihr Passwort wurde geändert"); + tokenManager.delete(loaded); + } else { + errorMessage(); + } + + return "index.xhtml"; + } + + @Override + protected AbstractManager getManager() { + return null; + } + + @Override + public void clearEntries() { + email = null; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} diff --git a/java/mss-failsafe/mss/src/main/java/controller/person/PersonController.java b/java/mss-failsafe/src/main/java/controller/person/PersonController.java old mode 100644 new mode 100755 similarity index 60% rename from java/mss-failsafe/mss/src/main/java/controller/person/PersonController.java rename to java/mss-failsafe/src/main/java/controller/person/PersonController.java index 4886698..44d07fa --- a/java/mss-failsafe/mss/src/main/java/controller/person/PersonController.java +++ b/java/mss-failsafe/src/main/java/controller/person/PersonController.java @@ -1,5 +1,7 @@ package controller.person; +import business.AbstractManager; +import business.user.DemoManager; import business.user.PersonManager; import javax.enterprise.context.SessionScoped; import javax.faces.context.FacesContext; @@ -11,9 +13,6 @@ import javax.security.enterprise.credential.Password; import javax.security.enterprise.credential.UsernamePasswordCredential; import javax.servlet.http.HttpSession; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - import controller.AbstractController; import exception.InvalidEmailException; import exception.InvalidPasswordException; @@ -27,14 +26,14 @@ import static javax.security.enterprise.AuthenticationStatus.SUCCESS; import java.io.Serializable; import java.util.Set; +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; import javax.ejb.EJB; import static javax.security.enterprise.authentication.mechanism.http.AuthenticationParameters.withParams; +import static org.omnifaces.util.Faces.redirect; import model.files.UserPicture; import model.person.enums.UserGroup; -import org.omnifaces.cdi.Param; -import static org.omnifaces.util.Faces.getRequest; -import static org.omnifaces.util.Faces.getResponse; -import static org.omnifaces.util.Faces.redirect; +import org.omnifaces.util.Faces; import org.primefaces.model.DefaultStreamedContent; import org.primefaces.model.StreamedContent; @@ -44,31 +43,42 @@ import org.primefaces.model.StreamedContent; */ @Named @SessionScoped -public class PersonController extends AbstractController implements Serializable { +public class PersonController extends AbstractController implements Serializable { private static final long serialVersionUID = -2257766986862616262L; - final static Logger LOGGER = LogManager.getLogger(PersonController.class); private String username; private String password; private boolean rememberMe = false; - @Inject + private String id; + + @Inject SecurityContext securityContext; + @Inject + PreferencesController preferencesController; + @Inject ManagedPerson managedPerson; - @Param(name = "continue") // Defined in @LoginToContinue of SecurityFormAuthenticationMechanism - private boolean loginToContinue; - private Person activePerson; - + @EJB PersonManager personManager; public PersonController() { } + + @PostConstruct + private void register(){ + id = managedPerson.addController(this); + } + + @PreDestroy + private void unregister(){ + managedPerson.removeController(id); + } public String submit() { @@ -76,14 +86,20 @@ public class PersonController extends AbstractController implements Serializable // credential that want to be validate was UsernamePasswordCredential UsernamePasswordCredential credential = new UsernamePasswordCredential(username, new Password(password)); + FacesContext context = FacesContext.getCurrentInstance(); + String cont = getRequest(context).getParameter("continue"); + String path = getRequest(context).getRequestURI(); + + System.out.println(path); + // this will call our security configuration to authorize the user AuthenticationStatus status = securityContext.authenticate( - getRequest(), - getResponse(), + getRequest(context), + getResponse(context), withParams() - .credential(credential) - .newAuthentication(!loginToContinue) - .rememberMe(rememberMe) + .credential(credential) + .newAuthentication(cont == null) + .rememberMe(rememberMe) ); // When logged in choose the right page by class. When more then one group @@ -91,22 +107,23 @@ public class PersonController extends AbstractController implements Serializable if (status.equals(SUCCESS)) { managedPerson.addLogin(username); activePerson = personManager.getByEmail(username).get(); - + preferencesController.clearEntries(); + FacesContext facesContext = FacesContext.getCurrentInstance(); HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true); session.setAttribute("user", this); session.setAttribute("realUsername", username); - + if (securityContext.isCallerInRole(UserGroup.ADMIN.toString())) { LOGGER.info("Login succesfull " + username + " with role: ADMIN"); return "admin/welcome.xhtml?faces-redirect=true"; } - if (securityContext.isCallerInRole(UserGroup.USER.toString())) { + if (securityContext.isCallerInRole(UserGroup.USER.toString()) || securityContext.isCallerInRole(UserGroup.SUPERUSER.toString())) { LOGGER.info("Login succesfull " + username + " with role: USER"); - return "user/welcome.xhtml?faces-redirect=true"; + return "/resources/user/welcome.xhtml?faces-redirect=true"; } - + if (securityContext.isCallerInRole(UserGroup.CUSTOMER.toString())) { LOGGER.info("Login succesfull " + username + " with role: USER"); return "customer/welcome.xhtml?faces-redirect=true"; @@ -115,31 +132,31 @@ public class PersonController extends AbstractController implements Serializable redirect("index.xhtml"); } else if (status.equals(SEND_FAILURE)) { - - sendErrorMessage("Fehler!", "Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut!."); + sendErrorMessage("Fehler!", "Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut!. Status " + SEND_FAILURE); return ""; } } catch (InvalidPasswordException | InvalidEmailException e) { LOGGER.info("Wrong Email or Password: " + username); sendErrorMessage("Fehler!", "Falsche Email oder Passwort!"); return ""; - } catch (PersonInaktiveException p){ + } catch (PersonInaktiveException p) { sendErrorMessage("Fehler!", " Ihr Konto ist inatkiv. Bitte wenden Sie sich an den Administator."); return ""; } catch (Exception e) { LOGGER.error("Login error with " + e); + e.printStackTrace(); sendErrorMessage("Fehler!", "Ein Fehler ist aufgetreten, bitte versuchen Sie es erneut!"); return ""; } return ""; } - + public StreamedContent getImage() { if (activePerson == null) { return null; } UserPicture picture = activePerson.getUserPicture(); - + return DefaultStreamedContent.builder() .contentType(picture == null ? null : picture.getMime().getMimeType()) .stream(() -> { @@ -149,37 +166,87 @@ public class PersonController extends AbstractController implements Serializable try { return new ByteArrayInputStream(picture.getFileData()); - } - catch (Exception e) { + } catch (Exception e) { LOGGER.error(e); return null; } }) .build(); } - - public boolean hasPicture(){ + + public Person getActivePersonWithWatchlist() { + activePerson = personManager.getActiveUserWithWatchlist(); + return activePerson; + } + + public boolean hasPicture() { + if (activePerson == null) { + return false; + } + return activePerson.getUserPicture() != null; } + public String createInitials() { + try { + String first = activePerson.getFirstname().substring(0, 1); + String last = activePerson.getLastname().substring(0, 1); + + return first.toUpperCase() + last.toUpperCase(); + } catch (Exception e) { + LOGGER.error(e); + } + + return ""; + } + + public void checkSessionStatus() { + HttpSession session = Faces.getSession(); + + if (session == null || Faces.hasSessionTimedOut()) { + LOGGER.info("Users \"{}\" Session time out", activePerson != null ? activePerson.getEmail() : ""); + logout(); + return; + } + LOGGER.info("MaxInactive {}, last accessed {}", Faces.getSessionMaxInactiveInterval(), session.getLastAccessedTime()); + } + public String logout() { LOGGER.info("User is logging out: " + username); + try { - FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); + FacesContext context = FacesContext.getCurrentInstance(); + + // Session invalidieren und Cleanup + context.getExternalContext().invalidateSession(); managedPerson.removeLogin(username); activePerson = null; - redirect("index.xhtml"); - } catch (Exception e) { - LOGGER.error("couldn't logout " + username + "with:" + e); - } + unregister(); - return "index.xhtml"; + // Nur ein Redirect verwenden - absoluter Pfad für korrekte Weiterleitung + String contextPath = context.getExternalContext().getRequestContextPath(); + context.getExternalContext().redirect(contextPath + "/index.xhtml"); + + // Response ist jetzt committed, kein weiterer Code nach redirect + return null; + + } catch (Exception e) { + LOGGER.error("Logout failed for user: " + username, e); + + // Bei Fehler: JSF-Navigation verwenden (falls Response noch nicht committed) + try { + return "/index.xhtml?faces-redirect=true"; + } catch (Exception ex) { + LOGGER.error("Fallback navigation also failed", ex); + return null; + } + } } - - public void saveActivePerson(){ + + public void saveActivePerson() { personManager.refresh(activePerson); } - + public void reloadActivePerson() { this.activePerson = personManager.load(activePerson); } @@ -207,7 +274,7 @@ public class PersonController extends AbstractController implements Serializable public void setRememberMe(boolean rememberMe) { this.rememberMe = rememberMe; } - + public Person getActiveUser() { return activePerson; } @@ -219,4 +286,16 @@ public class PersonController extends AbstractController implements Serializable public Set getLogins() { return managedPerson.getLogins(); } + + @Override + public void clearEntries() { + this.username = null; + this.activePerson = null; + this.password = null; + } + + @Override + protected AbstractManager getManager() { + return personManager; + } } diff --git a/java/mss-failsafe/src/main/java/controller/person/PersonEditController.java b/java/mss-failsafe/src/main/java/controller/person/PersonEditController.java new file mode 100755 index 0000000..28b5bea --- /dev/null +++ b/java/mss-failsafe/src/main/java/controller/person/PersonEditController.java @@ -0,0 +1,328 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package controller.person; + +import business.AbstractManager; +import business.user.PasswordManager; +import business.user.PersonManager; +import controller.AbstractController; +import javax.annotation.PostConstruct; +import javax.ejb.EJB; +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.inject.Named; +import javax.mail.internet.AddressException; +import javax.mail.internet.InternetAddress; +import model.person.Person; +import model.person.Salt; +import model.person.enums.Call; +import java.util.Base64; + +/** + * + * @author patri + */ +@Named +@RequestScoped +public class PersonEditController extends AbstractController { + + @Inject + PersonController personController; + + @EJB + PasswordManager passwordManager; + + @EJB + PersonManager personManager; + + private String email; + private String emailOld; + private String email2; + private String email3; + private Call call; + private String telefon; + private String password; + private String passwordOld; + private String password2; + private String mobile; + private String fax; + private String firstname; + private String lastname; + private String title; + private String choosenButton; + private byte[] signature; + private boolean autoSignature; + private String signatureValue; + + public PersonEditController() { + } + + @PostConstruct + private void loadUserdata() { + Person activePerson = personController.getActiveUser(); + + email = activePerson.getEmail(); + call = activePerson.getCall(); + telefon = activePerson.getTelefon(); + password = "********"; + mobile = activePerson.getMobile(); + fax = activePerson.getFax(); + firstname = activePerson.getFirstname(); + lastname = activePerson.getLastname(); + title = activePerson.getTitle(); + signature = activePerson.getSignature(); + autoSignature = activePerson.isAutoSignature(); + + // Konvertiere die gespeicherte Signatur in das Signatur-Format, falls vorhanden + if (signature != null && signature.length > 0) { + signatureValue = new String(signature); + } + } + + public void changepassword() { + if (!checkOldPassword(passwordOld)) { + sendErrorMessage("Fehler", "Aktuelles Passwort stimmt nicht!"); + return; + } + + passwordManager.changePassword(personController.getActiveUser(), password2, passwordOld); + + sendInfoMessage("Erfolg!", "Password wurde geändert!"); + } + + public void changeEmail() { + if (!emailOld.equals(email)) { + sendErrorMessage("Fehler", "Alte Emailadresse stimmt nicht!"); + return; + } + + if (!email2.equals(email3)) { + sendErrorMessage("Fehler", "Neue Emails stimmen nicht überein!"); + return; + } + + try { + InternetAddress emailAdd = new InternetAddress(email2); + emailAdd.validate(); + } catch (AddressException a) { + sendErrorMessage("Fehler", "Keine Korrekte Emailadresse " + email2); + return; + } + + if (personManager.getByEmail(email2).isPresent()) { + sendErrorMessage("Fehler", "Keine Email bereits vergeben!" + email2); + return; + } + + Person user = personManager.load(personController.getActiveUser()); + user.setEmail(email2); + personManager.save(user); + + personController.reloadActivePerson(); + + sendInfoMessage("Erfolg", "Email \"" + emailOld + "\" wurde zu \"" + email2 + "\" geändert!"); + } + + public void saveSignature() { + if (signatureValue != null && !signatureValue.isEmpty()) { + Person user = personManager.load(personController.getActiveUser()); + user.setSignature(signatureValue.getBytes()); + user.setAutoSignature(autoSignature); + personManager.save(user); + personController.reloadActivePerson(); + this.signature = personController.getActiveUser().getSignature(); + sendInfoMessage("Erfolg!", "Signatur wurde gespeichert!"); + } else { + sendErrorMessage("Hinweis", "Keine Signatur vorhanden zum Speichern."); + } + } + + public void clearSignature() { + this.signatureValue = null; + } + + private boolean checkOldPassword(String pw) { + return passwordManager.passwordCheckCustomer(personController.getActiveUser(), pw); + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public Call getCall() { + return call; + } + + public void setCall(Call call) { + this.call = call; + } + + public String getTelefon() { + return telefon; + } + + public void setTelefon(String telefon) { + this.telefon = telefon; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getEmailOld() { + return emailOld; + } + + public void setEmailOld(String emailOld) { + this.emailOld = emailOld; + } + + public String getFax() { + return fax; + } + + public void setFax(String fax) { + this.fax = fax; + } + + public String getFirstname() { + return firstname; + } + + public void setFirstname(String firstname) { + this.firstname = firstname; + } + + public String getLastname() { + return lastname; + } + + public void setLastname(String lastname) { + this.lastname = lastname; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getEmail2() { + return email2; + } + + public void setEmail2(String email2) { + this.email2 = email2; + } + + public String getEmail3() { + return email3; + } + + public void setEmail3(String email3) { + this.email3 = email3; + } + + public String getPassword2() { + return password2; + } + + public void setPassword2(String password2) { + this.password2 = password2; + } + + public String getChoosenButton() { + return choosenButton; + } + + public void setChoosenButton(String choosenButton) { + this.choosenButton = choosenButton; + } + + public String getPasswordOld() { + return passwordOld; + } + + public void setPasswordOld(String passwordOld) { + this.passwordOld = passwordOld; + } + + public byte[] getSignature() { + return signature; + } + + public void setSignature(byte[] signature) { + this.signature = signature; + } + + public boolean isAutoSignature() { + return autoSignature; + } + + public void setAutoSignature(boolean autoSignature) { + this.autoSignature = autoSignature; + } + + public String getSignatureAsBase64() { + if (signature != null && signature.length > 0) { + return Base64.getEncoder().encodeToString(signature); + } + return ""; + } + + public String getSignatureValue() { + return signatureValue; + } + + public void setSignatureValue(String signatureValue) { + this.signatureValue = signatureValue; + } + + @Override + public void clearEntries() { + this.email = null; + this.emailOld = null; + this.email2 = null; + this.email3 = null; + this.call = null; + this.telefon = null; + this.password = null; + this.passwordOld = null; + this.password2 = null; + this.mobile = null; + this.fax = null; + this.firstname = null; + this.lastname = null; + this.title = null; + this.choosenButton = null; + this.signature = null; + this.autoSignature = false; + this.signatureValue = null; + } + + @Override + protected AbstractManager getManager() { + return personManager; + } +} diff --git a/java/mss-failsafe/src/main/java/controller/person/PreferencesController.java b/java/mss-failsafe/src/main/java/controller/person/PreferencesController.java new file mode 100755 index 0000000..322e664 --- /dev/null +++ b/java/mss-failsafe/src/main/java/controller/person/PreferencesController.java @@ -0,0 +1,122 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package controller.person; + +import business.AbstractManager; +import business.user.PreferencesManager; +import controller.AbstractController; +import java.util.TimeZone; +import javax.ejb.EJB; +import javax.enterprise.context.SessionScoped; +import javax.inject.Inject; +import javax.inject.Named; +import model.person.Person; +import model.person.Preferences; + +/** + * + * @author patri + */ +@SessionScoped +@Named +public class PreferencesController extends AbstractController{ + private static final String background_light = "#EEF7FC"; + private static final String background_dark = "#121212"; + private static final String comp_logo_light = "/resources/images/logos/logo_small.png"; + private static final String comp_logo_dark = "/resources/images/logos/MSS-Logo-weiss-RGB.png"; + private static final String css_icon_location_light = ""; + private static final String css_icon_location_dark = ""; + private static final String CSS_LIGHT = "light.css"; + private static final String CSS_DARK = "dark.css"; + + @Inject + PersonController personController; + + @EJB + PreferencesManager preferencesManager; + + private String theme; + private String timeZone; + + public PreferencesController() { + } + + @Override + public void clearEntries() { + Person p = personController.getActiveUser(); + if (p == null) { + return; + } + + Preferences pref = p.getPreferences(); + + theme = pref.getTheme(); + timeZone = pref.getTimeZone(); + } + + public void save(){ + personController.reloadActivePerson(); + Preferences pref = preferencesManager.find(personController.getActiveUser().getPreferences().getId()); + pref.setTheme(theme); + pref.setTimeZone(timeZone); + preferencesManager.save(pref); + personController.reloadActivePerson(); + clearEntries(); + } + + public String[] timeZones(){ + return TimeZone.getAvailableIDs(); + } + + public String getTheme() { + if (theme == null || theme.isEmpty()) { + return "vela"; + } + return theme; + } + + public String getBackgroundColor(){ + if (getTheme().equals("saga") || getTheme().startsWith("nova")) { + return background_light; + } + + return background_dark; + } + + public String getCompanyLogo(){ + if (getTheme().equals("saga") || getTheme().startsWith("nova")) { + return comp_logo_light; + } + + return comp_logo_dark; + } + + public String getStyleClass(){ + if (getTheme().equals("saga") || getTheme().startsWith("nova")) { + return CSS_LIGHT; + } + + return CSS_DARK; + } + + public void setTheme(String theme) { + this.theme = theme; + LOGGER.info(theme); + } + + public String getTimeZone() { + return timeZone; + } + + public void setTimeZone(String timeZone) { + this.timeZone = timeZone; + } + + @Override + protected AbstractManager getManager() { + return preferencesManager; + } +} diff --git a/java/mss-failsafe/src/main/java/controller/person/UserPictureController.java b/java/mss-failsafe/src/main/java/controller/person/UserPictureController.java new file mode 100755 index 0000000..ee5f866 --- /dev/null +++ b/java/mss-failsafe/src/main/java/controller/person/UserPictureController.java @@ -0,0 +1,170 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package controller.person; + +import business.AbstractManager; +import business.user.PersonManager; +import business.user.UserPictureManager; +import controller.AbstractController; +import java.io.ByteArrayInputStream; +import java.util.HashMap; +import java.util.Map; +import javax.ejb.EJB; +import javax.enterprise.context.SessionScoped; +import javax.inject.Inject; +import javax.inject.Named; +import model.files.Mime; +import model.files.UserPicture; +import model.person.Person; +import org.primefaces.event.FileUploadEvent; +import org.primefaces.model.DefaultStreamedContent; +import org.primefaces.model.StreamedContent; +import org.primefaces.model.file.UploadedFile; + +/** + * + * @author patri + */ +@Named +@SessionScoped +public class UserPictureController extends AbstractController { + + private UserPicture picture; + + @Inject + PersonController personController; + + @EJB + UserPictureManager upManager; + + @EJB + PersonManager personManager; + + private Map loaded; + + public void handleUserPictureUpload(FileUploadEvent event) { + UploadedFile file = event.getFile(); + + if (file != null && file.getContent() != null && file.getContent().length > 0 && file.getFileName() != null) { + + if (createSaveUserPicture(file)) { + sendInfoMessage("Erfolg", this.picture.getName() + " wurde hochgeladen!"); + } else { + sendErrorMessage("Fehler", "Es ist ein Fehler aufgetreten. Bitte Versuchen Sie es erneut!"); + } + } + } + + private boolean createSaveUserPicture(UploadedFile file) { + picture = null; + picture = personController.getActiveUser().getUserPicture(); + boolean isNew = picture == null; + + if (isNew) { + picture = new UserPicture(); + } + + setData(picture, file); + Person person = personManager.load(personController.getActiveUser()); + person.setUserPicture(picture); + picture.setPerson(person); + + if (isNew) { + upManager.create(picture); + } else { + upManager.edit(picture); + } + + personManager.save(person); + personController.reloadActivePerson(); + + return true; + } + + private void setData(UserPicture picture, UploadedFile file) { + picture.setName(file.getFileName()); + picture.setFileData(file.getContent()); + picture.setMime(Mime.getByMimeType(file.getContentType())); + } + + public long getMaxFileSize() { + return UserPicture.getSizeLimit(); + } + + public String getFileTypesRE() { + return UserPicture.getAllowedTypesRE(); + } + + @Override + public void clearEntries() { + this.picture = null; + } + + @Override + protected AbstractManager getManager() { + return upManager; + } + + public StreamedContent pictureStream(UserPicture upicture){ + UserPicture loadedPicture = getDataForID(upicture); + if (loadedPicture == null || loadedPicture.getFileData() == null) { + System.out.println("Landed on null"); + return null; + } + System.out.println(loadedPicture.getId()); + return DefaultStreamedContent.builder() + .contentType(loadedPicture.getFileData() == null ? null : loadedPicture.getMime().getMimeType()) + .stream(() -> { + if (getCreated() == null + || loadedPicture.getFileData()== null + || loadedPicture.getFileData().length == 0) { + System.out.println("Landed on null 2"); + return null; + } + + try { + return new ByteArrayInputStream(upicture.getFileData()); + } + catch (Exception e) { + LOGGER.error(e); + System.out.println("Landed on null 3"); + return null; + } + }) + .build(); + } + + public UserPicture getDataForID(UserPicture userPicture){ + if (userPicture == null || userPicture.getId() == null) { + return null; + } + + if (loaded == null) { + initLoaded(); + } + + if (loaded.containsKey(userPicture.getId()) && loaded.get(userPicture.getId()) != null) { + return loaded.get(userPicture.getId()); + } else { + UserPicture dbPicture = upManager.findWithData(userPicture.getId()); + if (dbPicture != null) { + System.out.println(dbPicture.getFileData().length); + loaded.put(dbPicture.getId(), dbPicture); + return dbPicture; + } + } + + return null; + } + + private void initLoaded(){ + loaded = new HashMap<>(100); + } + + public Map getLoaded() { + return loaded; + } +} diff --git a/java/mss-failsafe/src/main/java/controller/questions/QuestionaireController.java b/java/mss-failsafe/src/main/java/controller/questions/QuestionaireController.java new file mode 100755 index 0000000..48d01c1 --- /dev/null +++ b/java/mss-failsafe/src/main/java/controller/questions/QuestionaireController.java @@ -0,0 +1,233 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package controller.questions; + +import business.AbstractManager; +import business.questions.QuestionaireManager; +import controller.AbstractController; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import javax.ejb.EJB; +import javax.faces.view.ViewScoped; +import javax.inject.Named; +import model.question.Question; +import model.question.Questionaire; + +/** + * + * @author pplate + */ +@Named +@ViewScoped +public class QuestionaireController extends AbstractController { + + @EJB + QuestionaireManager questionaireManager; + + private Question selectedQuestion; + + private List allQuestionaires; + + public QuestionaireController() { + super(); + setSelected(new Questionaire()); + getSelected().setQuestions(new ArrayList<>()); + setCreated(new Questionaire()); + getEntities().clear(); + } + + public void addQuestionToSelected() { + if (getSelected() == null) { + clearEntries(); + } + Question q = new Question(); + q.setQuestionaire(getSelected()); + q.setAnswers(new ArrayList<>()); + q.setPosition(getMinPosition(getSelected().getQuestions())); + q.setStandardValues(true); + getSelected().getQuestions().add(q); + + sendInfoMessage(SUCCESS_TITLE, "Neue Frage Nr. " + q.getPosition() + " wurde hinzugefügt"); + } + + public List getAllGlobals(){ + return questionaireManager.loadAllGlobals(); + } + + public Integer getMinPosition(List questions){ + if (questions == null || questions.isEmpty()) { + return 1; + } + + Integer size = questions.size(); + + Optional max = questions.stream().map(Question::getPosition).max((q1, q2) -> q1.compareTo(q2)); + + if (max.isEmpty()) { + return size + 1; + } + + return Integer.max(size, max.get()) + 1; + } + + public void saveSelected() { + Questionaire selected = getSelected(); + + if (questionaireManager.save(selected)) { + sendInfoMessage(SUCCESS_TITLE, selected.getName() + " wurde gespeichert!"); + clearEntries(); + return; + } + + sendErrorMessage(ERROR_TITLE, ERROR_MESSAGE); + } + + public void delete(){ + try{ + if(questionaireManager.deleteWithQuestions(getSelected())){ + sendInfoMessage(SUCCESS_TITLE, getSelected().getName() + " wurde gelöscht"); + clearEntries(); + return; + } + + errorMessage(); + } catch(Exception e) { + errorMessage(); + } + } + + public void loadQuestionaires(){ + setEntities(questionaireManager.loadAllWithQuestions()); + } + + public void removeQuestion(){ + if (selectedQuestion == null || selectedQuestion.getPosition() == null) { + errorMessage(); + return; + } + + Integer pos = selectedQuestion.getPosition(); + boolean success = getSelected().getQuestions().removeIf(que -> que.getPosition().equals(pos)); + + if (success) { + sendInfoMessage(SUCCESS_TITLE, "Frage wurde entfernt"); + return; + } + + errorMessage(); + } + + public void moveSelectedQuestionLeft() { + moveSelectedQuestion(-1); + } + + public void moveSelectedQuestionRight() { + moveSelectedQuestion(1); + } + + private void moveSelectedQuestion(int delta) { + if (selectedQuestion == null || selectedQuestion.getPosition() == null) { + return; + } + List questions = getSelected() != null ? getSelected().getQuestions() : null; + if (questions == null || questions.isEmpty()) { + return; + } + Integer current = selectedQuestion.getPosition(); + int target = current + delta; + if (target < 1) { + // out of bounds: do nothing + return; + } + int maxPos = getMaxPosition(); + if (target > maxPos) { + // at the end already + return; + } + if (target == current) { + return; + } + Question other = null; + for (Question q : questions) { + if (q != selectedQuestion && q.getPosition() != null && q.getPosition().intValue() == target) { + other = q; + break; + } + } + if (other != null) { + other.setPosition(current); + selectedQuestion.setPosition(target); + } else { + selectedQuestion.setPosition(target); + } + Collections.sort(questions); + } + + private int getMaxPosition() { + List questions = getSelected() != null ? getSelected().getQuestions() : null; + if (questions == null || questions.isEmpty()) { + return 0; + } + int max = 0; + for (Question q : questions) { + if (q != null && q.getPosition() != null && q.getPosition() > max) { + max = q.getPosition(); + } + } + return max; + } + + public void autoArrangePositions() { + List questions = getSelected() != null ? getSelected().getQuestions() : null; + if (questions == null || questions.isEmpty()) { + return; + } + List sorted = new ArrayList<>(questions); + Collections.sort(sorted, (a, b) -> { + Integer pa = a != null ? a.getPosition() : null; + Integer pb = b != null ? b.getPosition() : null; + if (pa == null && pb == null) return 0; + if (pa == null) return 1; + if (pb == null) return -1; + return Integer.compare(pa, pb); + }); + int pos = 1; + for (Question q : sorted) { + q.setPosition(pos++); + } + Collections.sort(questions); + sendInfoMessage(SUCCESS_TITLE, "Fragen automatisch angeordnet"); + } + + @Override + protected AbstractManager getManager() { + return questionaireManager; + } + + @Override + public void clearEntries() { + setSelected(new Questionaire()); + getSelected().setQuestions(new ArrayList<>()); + setCreated(new Questionaire()); + getEntities().clear(); + } + + public Question getSelectedQuestion() { + return selectedQuestion; + } + + public void setSelectedQuestion(Question selectedQuestion) { + this.selectedQuestion = selectedQuestion; + } + + public List getAllQuestionaires() { + if (allQuestionaires == null || allQuestionaires.isEmpty()) { + allQuestionaires = questionaireManager.loadAllWithQuestions(); + } + return allQuestionaires; + } +} diff --git a/java/mss-failsafe/src/main/java/controller/search/SearchController.java b/java/mss-failsafe/src/main/java/controller/search/SearchController.java new file mode 100755 index 0000000..76a418c --- /dev/null +++ b/java/mss-failsafe/src/main/java/controller/search/SearchController.java @@ -0,0 +1,173 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package controller.search; + +import business.AbstractManager; +import business.tickets.TicketManager; +import controller.AbstractController; +import controller.company.CompanyController; +import java.util.Collections; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.ejb.EJB; +import javax.faces.context.FacesContext; +import javax.faces.view.ViewScoped; +import javax.inject.Inject; +import javax.inject.Named; +import javax.servlet.http.HttpServletRequest; +import model.ticket.enums.Status; +import model.ticket.Ticket; +import org.omnifaces.cdi.Param; + +/** + * + * @author patri + */ +@Named +@ViewScoped +public class SearchController extends AbstractController { + + private String searchText; + private List results; + + @Inject + CompanyController companyController; + + @EJB + TicketManager ticketManager; + + @Param(name = "company") + private String companyParam; + + List tickets; + List filteredTickets; + + Ticket selectedTicket; + + public SearchController() { + } + + public void search() { + + } + + @PostConstruct + private void init(){ + if (companyParam == null) { + return; + } + + tickets = ticketManager.loadAllForCompany(companyParam); + if (!tickets.isEmpty()) { + companyController.setSelected(tickets.get(0).getCompany()); + companyController.addFromSelectedFromSearch(); + Collections.sort(tickets); + Collections.reverse(tickets); + } + } + + public void setFromSelectedCompany() { + HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); + String url = request.getRequestURL().toString(); + + if (url != null && !url.contains("search")) { + LOGGER.info(url); + return; + } + + tickets = ticketManager.loadAllForCompany(companyController.getSelected()); + Collections.sort(tickets); + Collections.reverse(tickets); + } + + public void deleteTicket(){ + LOGGER.info("Trying to delete {}", selectedTicket); + + if (selectedTicket == null) { + errorMessage(); + return; + } + + if(ticketManager.saveDelete(selectedTicket)){ + sendInfoMessage(SUCCESS_TITLE, "Ticket " + selectedTicket.getNumber() + " wurde gelöscht"); + LOGGER.info("Ticket is deleted"); + selectedTicket = null; + setFromSelectedCompany(); + } else { + errorMessage(); + LOGGER.error("Couldn't delete ticket"); + } + } + + public void deleteTicket(Ticket ticket){ + LOGGER.info("Trying to delete {}", ticket); + + if (ticket == null) { + errorMessage(); + return; + } + + if(ticketManager.saveDelete(selectedTicket)){ + sendInfoMessage(SUCCESS_TITLE, "Ticket " + selectedTicket.getNumber() + " wurde gelöscht"); + LOGGER.info("Ticket is deleted"); + setFromSelectedCompany(); + } else { + errorMessage(); + LOGGER.error("Couldn't delete ticket"); + } + } + + @Override + public void clearEntries() { + this.searchText = null; + this.results.clear(); + } + + public String getSearchText() { + return searchText; + } + + public void setSearchText(String searchText) { + this.searchText = searchText; + } + + public List getResults() { + return results; + } + + @Override + protected AbstractManager getManager() { + return ticketManager; + } + + public Ticket getSelectedTicket() { + return selectedTicket; + } + + public void setSelectedTicket(Ticket selectedTicket) { + this.selectedTicket = selectedTicket; + } + + public List getTickets() { + return tickets; + } + + public void setTickets(List tickets) { + this.tickets = tickets; + } + + public List getFilteredTickets() { + return filteredTickets; + } + + public void setFilteredTickets(List filteredTickets) { + this.filteredTickets = filteredTickets; + } + + public Status[] getAllStatuses(){ + return Status.values(); + } +} diff --git a/java/mss-failsafe/src/main/java/controller/tickets/PersonalTicketController.java b/java/mss-failsafe/src/main/java/controller/tickets/PersonalTicketController.java new file mode 100755 index 0000000..24cc19e --- /dev/null +++ b/java/mss-failsafe/src/main/java/controller/tickets/PersonalTicketController.java @@ -0,0 +1,67 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package controller.tickets; + +import business.AbstractManager; +import business.tickets.TicketManager; +import controller.AbstractController; +import controller.person.PersonController; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.ejb.EJB; +import javax.faces.view.ViewScoped; +import javax.inject.Inject; +import javax.inject.Named; +import model.ticket.Ticket; + +/** + * + * @author pplate + */ +@Named +@ViewScoped +public class PersonalTicketController extends AbstractController{ + @EJB + TicketManager ticketManager; + + @Inject + PersonController personController; + + private List loadedTickets; + private List watchedTickets; + + public PersonalTicketController() { + super(); + setCreated(null); + setSelected(null); + getEntities().clear(); + } + + @PostConstruct + private void init(){ + loadedTickets = ticketManager.loadBatchOrderedByCreationDateByPerson(personController.getActiveUser()); + watchedTickets = ticketManager.loadPersonalWatchlist(personController.getActiveUser()); + } + + @Override + protected AbstractManager getManager() { + return ticketManager; + } + + @Override + public void clearEntries() { + setCreated(null); + setSelected(null); + getEntities().clear(); + } + + public List getWatchedTickets() { + return watchedTickets; + } + + public List getLoadedTickets() { + return loadedTickets; + } +} diff --git a/java/mss-failsafe/src/main/java/controller/tickets/TicketController.java b/java/mss-failsafe/src/main/java/controller/tickets/TicketController.java new file mode 100755 index 0000000..d5aa242 --- /dev/null +++ b/java/mss-failsafe/src/main/java/controller/tickets/TicketController.java @@ -0,0 +1,463 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package controller.tickets; + +import business.AbstractManager; +import business.tickets.TicketManager; +import business.user.PersonManager; +import controller.AbstractController; +import controller.company.CompanyController; +import controller.person.PersonController; +import controller.questions.QuestionaireController; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.TreeMap; +import java.util.stream.Collectors; +import javax.ejb.EJB; +import javax.faces.view.ViewScoped; +import javax.inject.Inject; +import javax.inject.Named; +import model.company.Location; +import model.customer.Customer; +import model.machine.Machine; +import model.person.Person; +import model.question.Questionaire; +import model.question.enums.Answer; +import model.ticket.enums.FilenameGeneration; +import model.ticket.enums.Status; +import model.ticket.Ticket; +import model.ticket.dataCopies.TicketLocation; +import model.ticket.dataCopies.TicketMachine; +import model.ticket.dataCopies.TicketSecurityArea; +import model.ticket.questions.SecurityAreaQuestionaire; +import org.hibernate.Hibernate; + +/** + * + * @author pplate + */ +@Named +@ViewScoped +public class TicketController extends AbstractController { + + @EJB + TicketManager ticketManager; + + @EJB + PersonManager personManager; + + @Inject + CompanyController companyController; + + @Inject + PersonController personController; + + @Inject + TicketScrollController scrollController; + + @Inject + QuestionaireController questionaireController; + + private List contacts; + private List requester; + + private List selectedLocations; + private List machineContainers; + + private boolean loadTicketData; + + public TicketController() { + super(); + setCreated(new Ticket()); + getCreated().setStartDate(LocalDateTime.now()); + getCreated().setEndDate(LocalDateTime.now().plusDays(7)); + getCreated().setPayed(false); + + setSelected(new Ticket()); + selectedLocations = new ArrayList<>(); + machineContainers = new ArrayList<>(); + contacts = new ArrayList<>(); + requester = new ArrayList<>(); + this.loadTicketData = true; + } + + public void createSelectedLocations() { + companyController.getSelected().getLocations().size(); + setSelectedLocations(new ArrayList<>(companyController.getSelected().getLocations())); + } + + public void createTicket() { + if (checkNameExists(getCreated().getNumber())) { + sendErrorMessage(ERROR_TITLE, "Ticketnummer existiert bereits!"); + return; + } + + if (getCreated().getBillingAddress() == null) { + sendErrorMessage(ERROR_TITLE, "Adresse Auftraggeber nicht gesetzt!"); + return; + } + + if (getCreated().getServiceAddress() == null) { + sendErrorMessage(ERROR_TITLE, "Serviceadresse/ Einsatzort nicht gesetzt!"); + return; + } + + getCreated().setCompany(companyController.getSelected()); + + List ticketLocations = new ArrayList<>(machineContainers.size()); + + machineContainers.forEach(con -> { + Location location = con.getLocation(); + LOGGER.debug(con.getLocation().getName()); + location.setMachines(con.selectedMachines); + con.selectedMachines.forEach(mac -> LOGGER.debug(mac.getName())); + TicketLocation created = new TicketLocation(location); + created.setTicket(getCreated()); + ticketLocations.add(created); + }); + + List loadedCompTickets = ticketManager.loadAllForCompanyWithQuestions(companyController.getSelected()); + + if (!loadTicketData || loadedCompTickets == null || loadedCompTickets.isEmpty()) { + List globals = questionaireController.getAllGlobals(); + ticketLocations.forEach(loc -> { + loc.getMachines().forEach(mac -> { + mac.getSecurityAreas().stream().filter(area -> area != null).forEach(area -> { + List areaQuestionaires = globals.stream().map(SecurityAreaQuestionaire::new).collect(Collectors.toList()); + area.setQuestionaires(areaQuestionaires); + areaQuestionaires.forEach(ques -> { + ques.setArea(area); + ques.getQuestions().stream() + .forEach(q -> q.setAnswer(Answer.YES)); + }); + }); + }); + }); + } else { + findAddFilledQuestionaires(loadedCompTickets, ticketLocations); + } + + getCreated().setLocations(ticketLocations); + getCreated().setStatus(Status.NEW); + + personController.reloadActivePerson(); + getCreated().setCreator(personController.getActiveUser()); + ticketManager.save(getCreated()); + getCreated().setContacts(contacts); + getCreated().setRequester(requester); + ticketManager.save(getCreated()); + + List createdTickets = personController.getActiveUser().getCreatedTickets(); + + if (createdTickets == null) { + createdTickets = new ArrayList<>(); + } + + createdTickets.add(getCreated()); + personController.saveActivePerson(); + sendInfoMessage(SUCCESS_TITLE, "Ticket \"" + getCreated().getNumber() + "\" wurde erstellt"); + clearEntries(); + } + + private void findAddFilledQuestionaires(List loadedTickets, List ticketLocations) { + List globals = questionaireController.getAllGlobals(); + //TreeMap> dataTree = new TreeMap>(); + TreeMap>>> dataTree = new TreeMap<>(); + + //Create all Location Trees + ticketLocations.forEach(loc -> { + if (!dataTree.containsKey(loc.getName())) { + dataTree.put(loc.getName(), new TreeMap<>()); + } + + loc.getMachines().forEach(mac -> { + TreeMap> tree = new TreeMap<>(); + mac.getSecurityAreas().forEach(sa -> tree.put(sa.getName(), null)); + + dataTree.get(loc.getName()).put(mac.getName(), tree); + }); + }); + + //Find newest questionaires from tickets + loadedTickets.stream() + .map(ticket -> ticket.getLocations()) + .filter(locs -> locs != null) + .flatMap(List::stream) + .filter(loc -> loc != null) + .filter(loc -> dataTree.containsKey(loc.getName())) + .forEach(loc -> { + loc.getMachines().stream() + .filter(mac -> dataTree.get(loc.getName()).containsKey(mac.getName())) + .forEach(mac -> { + mac.getSecurityAreas().stream() + .filter(sa -> dataTree.get(loc.getName()).get(mac.getName()).containsKey(sa.getName())) + .filter(sa -> sa.getQuestionaires() != null) + .filter(sa -> !sa.getQuestionaires().isEmpty()) + .forEach(sa -> { + if (dataTree.get(loc.getName()).get(mac.getName()).get(sa.getName()) == null) { + dataTree.get(loc.getName()).get(mac.getName()).put(sa.getName(), sa.getQuestionaires()); + return; + } + + List quests = dataTree.get(loc.getName()).get(mac.getName()).get(sa.getName()); + if (quests.isEmpty()) { + dataTree.get(loc.getName()).get(mac.getName()).put(sa.getName(), sa.getQuestionaires()); + return; + } + + if (quests.get(0).getCreationDate().isBefore(sa.getQuestionaires().get(0).getCreationDate())) { + dataTree.get(loc.getName()).get(mac.getName()).put(sa.getName(), sa.getQuestionaires()); + } + }); + }); + }); + + //Try to load and add from newest old Ticket + ticketLocations.forEach(loc -> { + loc.getMachines().forEach(mac -> { + mac.getSecurityAreas().forEach(sa -> { + List quests = dataTree.get(loc.getName()).get(mac.getName()).get(sa.getName()); + + if (quests != null) { + LOGGER.info("Found {} for Location \"{}\", Machine \"{}\", SecArea \"{}\"", quests.size(), loc.getName(), mac.getName(), sa.getName()); + try { + String comment = quests.get(0).getArea().getMachine().getComment(); + mac.setComment(comment); + } catch (Exception e) { + } + + try { + String oldInspectionNr = quests.get(0).getArea().getMachine().getInspectID(); + mac.setOldInspectionID(oldInspectionNr); + } catch (Exception e) { + } + + List created = quests.stream().map(q -> new SecurityAreaQuestionaire(q, sa)).collect(Collectors.toList()); + sa.setQuestionaires(created); + sa.setComment(quests.get(0).getArea().getComment()); + return; + } + + LOGGER.info("Not Found for Location \"{}\", Machine \"{}\", SecArea \"{}\"", loc.getName(), mac.getName(), sa.getName()); + List areaQuestionaires = globals.stream().map(SecurityAreaQuestionaire::new).collect(Collectors.toList()); + sa.setQuestionaires(areaQuestionaires); + areaQuestionaires.forEach(ques -> { + ques.setArea(sa); + ques.getQuestions().stream() + .filter(q -> q.isStandardValues()) + .forEach(q -> q.setAnswer(Answer.YES)); + }); + }); + }); + }); + + } + + public void addSelectedToWatchlist() { + if (getSelected() == null) { + errorMessage(); + return; + } + setSelected(ticketManager.reloadWithWatchlist(getSelected())); + if (getSelected() == null) { + errorMessage(); + return; + } + List userList = personController.getActivePersonWithWatchlist().getWatchlist(); + List ticketList = getSelected().getWatchers(); + if (userList == null) { + userList = new ArrayList<>(); + } + if (ticketList == null) { + ticketList = new ArrayList<>(); + } + + if (!ticketList.contains(personController.getActiveUser())) { + ticketList.add(personController.getActiveUser()); + } + if (!userList.contains(getSelected())) { + userList.add(getSelected()); + } + + personController.saveActivePerson(); + ticketManager.save(getSelected()); + + sendInfoMessage(SUCCESS_TITLE, "Ticket \"" + getSelected().getNumber() + "\" wurde der Beobachtungsliste hinzugefügt!"); + scrollController.reloadScrollList(); + } + + public void setSelectedToClosed() { + if (getSelected() == null) { + errorMessage(); + } + getSelected().setStatus(Status.CLOSED); + ticketManager.save(getSelected()); + + scrollController.reloadScrollList(); + + successMessage(); + } + + public void assignSelectedToActiveUser() { + if (getSelected() == null) { + errorMessage(); + return; + } + + setSelected(ticketManager.refresh(getSelected())); + try { + if (getSelected().getOwner() != null) { + if (getSelected().getOwner().getId().equals(personController.getActiveUser().getId())) { + //Nothing to do + sendInfoMessage("Bereits zugewiesen", "Dieses Ticket ist Ihnen bereits zugewiesen!"); + return; + } + + Person oldOwner = getSelected().getOwner(); + oldOwner = personManager.load(oldOwner); + Hibernate.initialize(oldOwner.getAssignTickets()); + oldOwner.getAssignTickets().remove(getSelected()); + personManager.save(oldOwner); + } + + personController.reloadActivePerson(); + Person newOwner = personController.getActiveUser(); + Hibernate.initialize(newOwner); + Hibernate.initialize(newOwner.getAssignTickets()); + if (newOwner.getAssignTickets() == null) { + newOwner.setAssignTickets(new ArrayList<>()); + } + newOwner.getAssignTickets().add(getSelected()); + getSelected().setOwner(newOwner); + personManager.save(newOwner); + ticketManager.save(getSelected()); + + scrollController.reloadScrollList(); + + sendInfoMessage(SUCCESS_TITLE, "Ticket \"" + getSelected().getNumber() + "\" wurde der wurde Ihnen zugewiesen!"); + + } catch (Exception e) { + LOGGER.error(e); + errorMessage(); + return; + } + + } + + private boolean checkNameExists(String number) { + Long count = ticketManager.countByNumber(number); + return count != null ? count > 0L : false; + } + + @Override + protected AbstractManager getManager() { + return ticketManager; + } + + @Override + public void clearEntries() { + setCreated(new Ticket()); + getCreated().setStartDate(LocalDateTime.now()); + getCreated().setEndDate(LocalDateTime.now().plusDays(7)); + getCreated().setPayed(false); + + setSelected(new Ticket()); + getEntities().clear(); + selectedLocations = new ArrayList<>(); + machineContainers = new ArrayList<>(); + contacts = new ArrayList<>(); + requester = new ArrayList<>(); + + companyController.clearEntries(); + loadTicketData = true; + } + + public List getSelectedLocations() { + return selectedLocations; + } + + public void setSelectedLocations(List selectedLocations) { + this.selectedLocations = selectedLocations; + if (selectedLocations != null && !selectedLocations.isEmpty()) { + this.machineContainers = new ArrayList<>(); + selectedLocations.stream() + .filter(loc -> loc.getMachines() != null) + .filter(loc -> !loc.getMachines().isEmpty()) + .forEach(loc -> { + LOGGER.debug(loc.getMachines().size()); + machineContainers.add(new MachineContainer(loc)); + }); + } + } + + public List getMachineContainers() { + return machineContainers; + } + + public void setMachineContainers(List machineContainers) { + this.machineContainers = machineContainers; + } + + public FilenameGeneration[] getFilenameGenerations() { + return FilenameGeneration.values(); + } + + public class MachineContainer { + + private Location location; + private List selectedMachines; + + public MachineContainer(Location location) { + this.location = location; + selectedMachines = location.getMachines(); + } + + public Location getLocation() { + return location; + } + + public void setLocation(Location location) { + this.location = location; + } + + public List getSelectedMachines() { + return selectedMachines; + } + + public void setSelectedMachines(List selectedMachines) { + this.selectedMachines = selectedMachines; + } + } + + public Answer[] getAnswers() { + return Answer.values(); + } + + public List getContacts() { + return contacts; + } + + public void setContacts(List contacts) { + this.contacts = contacts; + } + + public List getRequester() { + return requester; + } + + public void setRequester(List requester) { + this.requester = requester; + } + + public boolean isLoadTicketData() { + return loadTicketData; + } + + public void setLoadTicketData(boolean loadTicketData) { + this.loadTicketData = loadTicketData; + } + +} diff --git a/java/mss-failsafe/src/main/java/controller/tickets/TicketEditController.java b/java/mss-failsafe/src/main/java/controller/tickets/TicketEditController.java new file mode 100755 index 0000000..384595d --- /dev/null +++ b/java/mss-failsafe/src/main/java/controller/tickets/TicketEditController.java @@ -0,0 +1,312 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package controller.tickets; + +import business.AbstractManager; +import business.tickets.TicketManager; +import controller.AbstractController; +import controller.tickets.protocoll.OverviewProtocolController; +import controller.tickets.protocoll.ProtocolController; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; +import javax.annotation.PostConstruct; +import javax.ejb.EJB; +import javax.faces.view.ViewScoped; +import javax.inject.Inject; +import javax.inject.Named; +import model.files.Mime; +import model.files.Report; +import model.ticket.Ticket; +import model.ticket.dataCopies.TicketLocation; +import model.ticket.dataCopies.TicketMachine; +import model.ticket.dataCopies.TicketSecurityArea; +import model.ticket.enums.Status; +import model.ticket.questions.SecurityAreaQuestionaire; +import org.hibernate.Hibernate; +import org.omnifaces.cdi.Param; +import org.primefaces.model.DefaultStreamedContent; +import org.primefaces.model.StreamedContent; + +/** + * + * @author pplate + */ +@Named +@ViewScoped +public class TicketEditController extends AbstractController{ + + @EJB + TicketManager ticketManager; + + @Inject + ProtocolController protocolController; + + @Inject + OverviewProtocolController overviewProtocolController; + + @Param(name = "number") + private String nameParam; + + private TicketLocation selectedLocation; + private TicketLocation bkpLocation; + private String[] widgets = {"dlgSelAddr1", "dlgSelAddr2"}; + + public TicketEditController() { + super(); + } + + @PostConstruct + private void init(){ + setSelected(ticketManager.loadByNumber(nameParam)); + //initializeSelected(); + } + + public void initializeSelected(){ + if (getSelected() != null) { + Hibernate.initialize(getSelected()); + Hibernate.initialize(getSelected().getCompany().getAddresses()); + Hibernate.initialize(getSelected().getComments()); + Hibernate.initialize(getSelected().getContacts()); + Hibernate.initialize(getSelected().getInvoices()); + Hibernate.initialize(getSelected().getLocations()); + Hibernate.initialize(getSelected().getReports()); + Hibernate.initialize(getSelected().getWatchers()); + Hibernate.initialize(getSelected().getRequester()); + + for(TicketLocation loc : getSelected().getLocations()){ + for(TicketMachine mac : loc.getMachines()){ + for(TicketSecurityArea area : mac.getSecurityAreas()){ + Hibernate.initialize(area); + Hibernate.initialize(area.getDangerPoints()); + Hibernate.initialize(area.getSecurityDevices()); + Hibernate.initialize(area.getSwitchingDevices()); + Hibernate.initialize(area.getQuestionaires()); + for (SecurityAreaQuestionaire q : area.getQuestionaires()) { + Hibernate.initialize(q.getQuestions()); + } + } + } + } + + Hibernate.initialize(getSelected()); + + } + } + + @Override + protected AbstractManager getManager() { + return ticketManager; + } + + @Override + public void clearEntries() { + setSelected(null); + setCreated(null); + getEntities().clear(); + } + + public TicketLocation getSelectedLocation() { + return selectedLocation; + } + + public void saveSelected(){ + if (getSelected() == null) { + errorMessage(); + return; + } + + ticketManager.save(getSelected()); + ticketManager.refresh(getSelected()); + + sendInfoMessage(SUCCESS_TITLE, "Ticket " + getSelected().getNumber() + " wurde gespeichert!"); + closeDialogs(widgets); + } + + public void setTicketStatus(String name){ + Status loaded = Status.getFromName(name); + + if (loaded == null) { + errorMessage(); + return; + } + + getSelected().setStatus(loaded); + sendInfoMessage(SUCCESS_TITLE, "Status wurde geändert zu " + loaded); + saveSelected(); + } + + public void setSelectedLocation(TicketLocation selectedLocation) { + if (selectedLocation != null) { + bkpLocation = selectedLocation; + } + this.selectedLocation = selectedLocation; + if (selectedLocation == null && bkpLocation != null) { + this.selectedLocation = bkpLocation; + } + } + + public StreamedContent createOverviewProtocol() { + if (getSelected() == null) { + errorMessage(); + return null; + } + + try { + Report report = overviewProtocolController.createOverviewReport(getSelected()); + StreamedContent file = DefaultStreamedContent.builder() + .name(report.getName()) + .contentType(report.getMime().getMimeType()) + .stream(() -> new ByteArrayInputStream(report.getFileData())) + .build(); + + sendInfoMessage(SUCCESS_TITLE, "Übersichtsprotokoll wurde erfolgreich erstellt!"); + return file; + + } catch (Exception io) { + LOGGER.error(io); + errorMessage(); + return null; + } + } + + public StreamedContent createAllProtocolsAsZip() { + if (getSelected() == null) { + errorMessage(); + return null; + } + + try { + // Prefetch full graph for protocol generation + //initializeSelected(); + // Collect all machines from all locations + List allMachines = new ArrayList<>(); + for (TicketLocation location : getSelected().getLocations()) { + if (location.getMachines() != null) { + allMachines.addAll(location.getMachines()); + } + } + + if (allMachines.isEmpty()) { + sendErrorMessage("Fehler", "Keine Maschinen im Ticket vorhanden!"); + return null; + } + + // Create ZIP file + ByteArrayOutputStream zipStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(zipStream); + HashMap fileNameCountMap = new HashMap<>(); + + for (TicketMachine machine : allMachines) { + try { + // Generate PDF report for each machine + Report report = protocolController.createReportForMachine(machine); + + // Add PDF to ZIP with sanitized filename to avoid folder creation in ZIP + String baseName = cleanFileName(report.getName()); + String entryName = baseName; + int duplicateCount = fileNameCountMap.getOrDefault(baseName, 0); + if (duplicateCount > 0) { + entryName = appendSuffixToFileName(baseName, "_" + (duplicateCount + 1)); + } + fileNameCountMap.put(baseName, duplicateCount + 1); + + ZipEntry entry = new ZipEntry(entryName); + zip.putNextEntry(entry); + zip.write(report.getFileData()); + zip.closeEntry(); + + } catch (Exception e) { + LOGGER.error("Fehler beim Erstellen des Protokolls für Maschine: " + machine.getName(), e); + sendErrorMessage("Fehler", "Fehler beim Erstellen des Protokolls für Maschine: " + machine.getName()); + } + } + + //Add overview protocol + try { + Report overviewReport = overviewProtocolController.createOverviewReport(getSelected()); + String overviewBaseName = cleanFileName(overviewReport.getName()); + String overviewEntryName = overviewBaseName; + int overviewCount = fileNameCountMap.getOrDefault(overviewBaseName, 0); + if (overviewCount > 0) { + overviewEntryName = appendSuffixToFileName(overviewBaseName, "_" + (overviewCount + 1)); + } + fileNameCountMap.put(overviewBaseName, overviewCount + 1); + ZipEntry overviewEntry = new ZipEntry(overviewEntryName); + zip.putNextEntry(overviewEntry); + zip.write(overviewReport.getFileData()); + zip.closeEntry(); + } catch (Exception e) { + LOGGER.error("Fehler beim Erstellen des Übersichtsprotokolls", e); + sendErrorMessage("Fehler", "Fehler beim Erstellen des Übersichtsprotokolls"); + } + + zip.close(); + + // Create filename for ZIP + String zipFileName = cleanFileName("Protokolle_Ticket_" + getSelected().getNumber() + ".zip"); + + // Return ZIP as StreamedContent + StreamedContent file = DefaultStreamedContent.builder() + .name(zipFileName) + .contentType("application/zip") + .stream(() -> new ByteArrayInputStream(zipStream.toByteArray())) + .build(); + + sendInfoMessage(SUCCESS_TITLE, "Alle Protokolle wurden erfolgreich erstellt (" + allMachines.size() + " Maschinen)!"); + return file; + + } catch (IOException io) { + LOGGER.error("Fehler beim Erstellen der ZIP-Datei", io); + sendErrorMessage("Fehler", "Fehler beim Erstellen der ZIP-Datei!"); + return null; + } + } + + private static String cleanFileName(String original) { + if (original == null || original.isEmpty()) { + return "file"; + } + String cleaned = original.trim(); + cleaned = cleaned.replaceAll("[\\\\/:*?\"<>|]", "_"); + cleaned = cleaned.replaceAll("[\\p{Cntrl}]", "_"); + cleaned = cleaned.replaceAll("[^A-Za-z0-9._ -]", "_"); + cleaned = cleaned.replaceAll("_+", "_").trim(); + if (cleaned.isEmpty() || cleaned.replace(".", "").trim().isEmpty()) { + cleaned = "file"; + } + if (cleaned.length() > 200) { + int dot = cleaned.lastIndexOf('.'); + if (dot > 0 && dot < cleaned.length() - 1) { + String name = cleaned.substring(0, dot); + String ext = cleaned.substring(dot); + int maxNameLen = Math.max(1, 200 - ext.length()); + if (name.length() > maxNameLen) { + name = name.substring(0, maxNameLen); + } + cleaned = name + ext; + } else { + cleaned = cleaned.substring(0, 200); + } + } + return cleaned; + } + + private static String appendSuffixToFileName(String name, String suffix) { + if (name == null || name.isEmpty()) { + return cleanFileName("file" + suffix); + } + int dot = name.lastIndexOf('.'); + if (dot > 0 && dot < name.length() - 1) { + return name.substring(0, dot) + suffix + name.substring(dot); + } + return name + suffix; + } +} diff --git a/java/mss-failsafe/src/main/java/controller/tickets/TicketScrollController.java b/java/mss-failsafe/src/main/java/controller/tickets/TicketScrollController.java new file mode 100755 index 0000000..cd22079 --- /dev/null +++ b/java/mss-failsafe/src/main/java/controller/tickets/TicketScrollController.java @@ -0,0 +1,94 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package controller.tickets; + +import business.AbstractManager; +import business.tickets.TicketManager; +import controller.AbstractController; +import controller.person.PersonController; +import java.util.ArrayList; +import java.util.List; +import javax.annotation.PostConstruct; +import javax.ejb.EJB; +import javax.faces.context.FacesContext; +import javax.faces.view.ViewScoped; +import javax.inject.Inject; +import javax.inject.Named; +import model.ticket.Ticket; + +/** + * + * @author pplate + */ +@Named +@ViewScoped +public class TicketScrollController extends AbstractController{ + @EJB + TicketManager ticketManager; + + @Inject + PersonController personController; + + private List loaded = new ArrayList<>(TicketManager.BATCH_SIZE); + + public TicketScrollController() { + super(); + } + + @PostConstruct + private void init(){ + loaded = ticketManager.loadBatchOrderedByCreationDate(); + } + + @Override + protected AbstractManager getManager() { + return ticketManager; + } + + public void reloadScrollList(){ + loaded = ticketManager.loadBatchOrderedByCreationDate(); + } + + public void deleteTicket(){ + LOGGER.info("Trying to delete {}", getSelected()); + + + if(ticketManager.saveDelete(getSelected())){ + sendInfoMessage(SUCCESS_TITLE, "Ticket " + getSelected().getNumber() + " wurde gelöscht"); + LOGGER.info("Ticket is deleted"); + reloadScrollList(); + setSelected(null); + } else { + errorMessage(); + LOGGER.error("Couldn't delete ticket"); + } + } + + protected void refreshTicketInList(){ + if (getSelected() == null || loaded == null) { + return; + } + + if (loaded.contains(getSelected())) { + int i = loaded.indexOf(getSelected()); + //Ticket fromLoaded = loaded.get(i); + //fromLoaded = ticketManager.refresh(fromLoaded); + loaded.set(i, getSelected()); + } + + FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add("mainform"); + } + + @Override + public void clearEntries() { + setCreated(null); + setSelected(null); + getEntities().clear(); + } + + public List getLoaded() { + return loaded; + } +} diff --git a/java/mss-failsafe/src/main/java/controller/tickets/machine/TicketMachineController.java b/java/mss-failsafe/src/main/java/controller/tickets/machine/TicketMachineController.java new file mode 100755 index 0000000..fc9daac --- /dev/null +++ b/java/mss-failsafe/src/main/java/controller/tickets/machine/TicketMachineController.java @@ -0,0 +1,223 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package controller.tickets.machine; + +import business.AbstractManager; +import business.tickets.machine.TicketMachineManager; +import business.tickets.machine.TicketQuestionManager; +import business.tickets.machine.TicketQuestionaireManager; +import controller.AbstractController; +import controller.questions.QuestionaireController; +import controller.tickets.protocoll.ProtocolController; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import javax.ejb.EJB; +import javax.faces.view.ViewScoped; +import javax.inject.Inject; +import javax.inject.Named; +import model.files.Report; +import model.ticket.enums.SimpleAnswer; +import model.ticket.dataCopies.TicketMachine; +import model.ticket.enums.InspectionType; +import model.ticket.questions.TicketQuestion; +import model.ticket.questions.TicketQuestionaire; +import org.primefaces.model.DefaultStreamedContent; +import org.primefaces.model.StreamedContent; + +/** + * + * @author pplate + */ +@Named +@ViewScoped +public class TicketMachineController extends AbstractController { + + @Inject + QuestionaireController questionaireController; + + @EJB + TicketQuestionaireManager ticketQuestionaireManager; + + @EJB + TicketQuestionManager ticketQuestionManager; + + @EJB + TicketMachineManager machineManager; + + @Inject + ProtocolController protocolController; + + private TicketQuestionaire selectedQuestionaire; + + private TicketMachine bkpMachine; + + private List filteredMachines; + + private static final String[] WIDGETS = {"dlgEditSec"}; + + public TicketMachineController() { + super(); + } + + public void addQuestionaire() { + + if (questionaireController.getSelected() == null || bkpMachine == null) { + System.out.println("controller.tickets.machine.TicketMachineController.addQuestionaire()" + questionaireController.getSelected() + " / " + getSelected()); + errorMessage(); + return; + } + + setSelected(bkpMachine); + + TicketQuestionaire created = new TicketQuestionaire(questionaireController.getSelected()); + created.setMachine(getSelected()); + + if (getSelected().getQuestionaires() == null) { + getSelected().setQuestionaires(new ArrayList<>()); + } + + getSelected().getQuestionaires().add(created); + + saveSelected(); + sendInfoMessage(SUCCESS_TITLE, "Checkliste " + created.getName() + " wurde hinzugefügt!"); + } + + public void removeQuestionaire() { + if (selectedQuestionaire == null || bkpMachine == null) { + System.out.println("controller.tickets.machine.TicketMachineController.removeQ()" + questionaireController.getSelected() + " / " + getSelected()); + errorMessage(); + return; + } + + setSelected(bkpMachine); + TicketQuestionaire toDelete = null; + + for (int i = 0; i < getSelected().getQuestionaires().size(); i++) { + TicketQuestionaire q = getSelected().getQuestionaires().get(i); + System.out.println(q.getId() + " / " + selectedQuestionaire.getId()); + if (q.getId().equals(selectedQuestionaire.getId())) { + toDelete = q; + } + } + + if (toDelete == null) { + System.err.println("Not found toDelete"); + errorMessage(); + return; + } + + getSelected().getQuestionaires().remove(toDelete); + + List questions = toDelete.getQuestions(); + questions.forEach(q -> q.setQuestionaire(null)); + toDelete.setQuestions(null); + ticketQuestionaireManager.save(toDelete); + ticketQuestionManager.removeAllIn(questions); + ticketQuestionaireManager.remove(toDelete); + + saveSelected(); + sendInfoMessage(SUCCESS_TITLE, "Checkliste " + questionaireController.getSelected().getName() + " wurde entfernt!"); + } + + public void saveSelected() { + if (getSelected() == null) { + setSelected(bkpMachine); + } + machineManager.save(getSelected()); + machineManager.refresh(getSelected()); + sendInfoMessage(SUCCESS_TITLE, "Machine " + getSelected().getName() + " wurde gespeichert!"); + } + + public void saveSelectedChanges() { + if (getSelected() == null) { + setSelected(bkpMachine); + } + machineManager.save(getSelected()); + machineManager.refresh(getSelected()); + sendInfoMessage(SUCCESS_TITLE, "Machine " + getSelected().getName() + " wurde gespeichert!"); + + closeDialogs(WIDGETS); + } + + public void resetSelectMachine() { + saveSelected(); + setSelected(null); + } + + public StreamedContent createSelectedMachinePrint() { + try { + Report report = protocolController.createReportForMachine(bkpMachine); + StreamedContent file = DefaultStreamedContent.builder() + .name(report.getName()) + .contentType(report.getMime().getMimeType()) + .stream(() -> { + return new ByteArrayInputStream(report.getFileData()); + }) + .build(); + + return file; + } catch (IOException io) { + LOGGER.error(io); + errorMessage(); + } + + return null; + } + + @Override + protected AbstractManager getManager() { + return machineManager; + } + + @Override + public void setSelected(TicketMachine selected) { + if (selected != null) { + bkpMachine = selected; + } + super.setSelected(selected); + } + + @Override + public void clearEntries() { + getEntities().clear(); + setSelected(null); + setCreated(null); + } + + public SimpleAnswer[] getSimpleAnswers() { + return SimpleAnswer.values(); + } + + public TicketQuestionaire getSelectedQuestionaire() { + return selectedQuestionaire; + } + + public void setSelectedQuestionaire(TicketQuestionaire selectedQuestionaire) { + this.selectedQuestionaire = selectedQuestionaire; + } + + public TicketMachine getBkpMachine() { + return bkpMachine; + } + + public void setBkpMachine(TicketMachine bkpMachine) { + this.bkpMachine = bkpMachine; + } + + public List getFilteredMachines() { + return filteredMachines; + } + + public void setFilteredMachines(List filteredMachines) { + this.filteredMachines = filteredMachines; + } + + public InspectionType[] getInspectionTypes(){ + return InspectionType.values(); + } + +} diff --git a/java/mss-failsafe/src/main/java/controller/tickets/machine/TicketSecurityAreaController.java b/java/mss-failsafe/src/main/java/controller/tickets/machine/TicketSecurityAreaController.java new file mode 100755 index 0000000..a37d5ac --- /dev/null +++ b/java/mss-failsafe/src/main/java/controller/tickets/machine/TicketSecurityAreaController.java @@ -0,0 +1,156 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package controller.tickets.machine; + +import business.AbstractManager; +import business.tickets.machine.TicketSecurityAreaManager; +import business.tickets.machine.TicketSecurityAreaQuestionManager; +import business.tickets.machine.TicketSecurityAreaQuestionaireManager; +import controller.AbstractController; +import static controller.AbstractController.SUCCESS_TITLE; +import controller.questions.QuestionaireController; +import java.util.ArrayList; +import java.util.List; +import javax.ejb.EJB; +import javax.faces.view.ViewScoped; +import javax.inject.Inject; +import javax.inject.Named; +import javax.transaction.Transactional; +import model.ticket.dataCopies.TicketLocation; +import model.ticket.dataCopies.TicketMachine; +import model.ticket.dataCopies.TicketSecurityArea; +import model.ticket.questions.SecurityAreaQuestion; +import model.ticket.questions.SecurityAreaQuestionaire; +import org.hibernate.Hibernate; + +/** + * + * @author pplate + */ +@ViewScoped +@Named +public class TicketSecurityAreaController extends AbstractController { + + @EJB + TicketSecurityAreaManager ticketSecurityAreaManager; + + @EJB + TicketSecurityAreaQuestionaireManager questionaireManager; + + @EJB + TicketSecurityAreaQuestionManager questionManager; + + @Inject + QuestionaireController questionaireController; + + @Inject + TicketMachineController machineController; + + private TicketSecurityArea bkpArea; + + private SecurityAreaQuestionaire selectedQuestionaire; + + @Override + protected AbstractManager getManager() { + return ticketSecurityAreaManager; + } + + @Override + public void clearEntries() { + setSelected(new TicketSecurityArea()); + setCreated(null); + getEntities().clear(); + } + + public void addQuestionaire() { + + if (questionaireController.getSelected() == null || bkpArea == null) { + LOGGER.error("controller.tickets.machine.TicketMachineController.addQuestionaire()" + questionaireController.getSelected() + " / " + getSelected()); + errorMessage(); + return; + } + + SecurityAreaQuestionaire created = new SecurityAreaQuestionaire(questionaireController.getSelected()); + created.setArea(getSelected()); + + if (getSelected().getQuestionaires() == null) { + getSelected().setQuestionaires(new ArrayList<>()); + } + + getSelected().getQuestionaires().add(created); + questionaireManager.save(created); + saveSelected(); + + sendInfoMessage(SUCCESS_TITLE, "Checkliste " + created.getName() + " wurde hinzugefügt!"); + machineController.setSelected(getSelected().getMachine()); + } + + public void removeQuestionaire() { + if (selectedQuestionaire == null || bkpArea == null) { + System.out.println("controller.tickets.machine.TicketMachineController.removeQ()" + questionaireController.getSelected() + " / " + getSelected()); + errorMessage(); + return; + } + + SecurityAreaQuestionaire toDelete = null; + + for (int i = 0; i < getSelected().getQuestionaires().size(); i++) { + SecurityAreaQuestionaire q = getSelected().getQuestionaires().get(i); + LOGGER.debug(q.getId() + " / " + selectedQuestionaire.getId()); + if (q.getId().equals(selectedQuestionaire.getId())) { + toDelete = q; + } + } + + if (toDelete == null) { + System.err.println("Not found toDelete"); + errorMessage(); + return; + } + + getSelected().getQuestionaires().remove(toDelete); + + //List questions = toDelete.getQuestions(); + //questions.forEach(q -> q.setQuestionaire(null)); + //toDelete.setQuestions(null); + //questionaireManager.save(toDelete); + //questionManager.removeAllIn(questions); + questionaireManager.remove(toDelete); + + saveSelected(); + sendInfoMessage(SUCCESS_TITLE, "Checkliste wurde entfernt!"); + machineController.setSelected(getSelected().getMachine()); + //machineController.saveSelected(); + } + + public void saveSelected() { + if (getSelected() == null) { + setSelected(bkpArea); + } + ticketSecurityAreaManager.save(getSelected()); + sendInfoMessage(SUCCESS_TITLE, "Schutzbereich " + getSelected().getName() + " wurde gespeichert!"); + } + + @Override + @Transactional + public void setSelected(TicketSecurityArea selected) { + + super.setSelected(selected); + + if (selected != null) { + bkpArea = selected; + } + + } + + public SecurityAreaQuestionaire getSelectedQuestionaire() { + return selectedQuestionaire; + } + + public void setSelectedQuestionaire(SecurityAreaQuestionaire selectedQuestionaire) { + this.selectedQuestionaire = selectedQuestionaire; + } + +} diff --git a/java/mss-failsafe/src/main/java/controller/tickets/protocoll/OverviewProtocolController.java b/java/mss-failsafe/src/main/java/controller/tickets/protocoll/OverviewProtocolController.java new file mode 100755 index 0000000..725c2fc --- /dev/null +++ b/java/mss-failsafe/src/main/java/controller/tickets/protocoll/OverviewProtocolController.java @@ -0,0 +1,505 @@ +package controller.tickets.protocoll; + +import business.AbstractManager; +import business.tickets.machine.TicketMachineManager; +import business.tickets.machine.TicketSecurityAreaManager; +import business.tickets.protocoll.ProtocolManager; +import com.itextpdf.io.font.constants.StandardFonts; +import com.itextpdf.layout.borders.Border; +import com.itextpdf.layout.borders.SolidBorder; +import controller.AbstractController; +import controller.person.PersonController; +import controller.tickets.TicketEditController; +import model.files.Mime; +import model.files.Report; + +import javax.ejb.EJB; +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.inject.Named; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.time.format.DateTimeFormatter; +import java.util.*; + +import com.itextpdf.kernel.font.PdfFontFactory; +import com.itextpdf.kernel.geom.PageSize; +import com.itextpdf.kernel.pdf.PdfDocument; +import com.itextpdf.kernel.pdf.PdfDocumentInfo; +import com.itextpdf.kernel.pdf.PdfReader; +import com.itextpdf.kernel.pdf.PdfWriter; +import com.itextpdf.layout.Document; +import com.itextpdf.layout.element.Cell; +import com.itextpdf.layout.element.Image; +import com.itextpdf.layout.element.Paragraph; +import com.itextpdf.layout.element.Table; +import com.itextpdf.layout.element.Text; +import model.security.enums.DeviceRole; +import model.ticket.Ticket; +import model.ticket.dataCopies.*; + +@Named +@RequestScoped +public class OverviewProtocolController extends AbstractController { + + @EJB + ProtocolManager protocolManager; + + @Inject + TicketEditController editController; + + @Inject + PersonController personController; + + @EJB + TicketMachineManager machineManager; + + @EJB + TicketSecurityAreaManager areaManager; + + private Image logo; + + private static final String FONT_BOLD = StandardFonts.HELVETICA_BOLD; + private static final String FONT_NORMAL = StandardFonts.HELVETICA; + private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy"); + + public OverviewProtocolController() { + super(); + } + + public Report createOverviewReport(Ticket selected) { + if (selected == null) { + sendErrorMessage("Fehler","Es wurde kein Ticket zum Erstellen des Protokolls ausgewählt!"); + return null; + } + byte[] pdfData = createPDFInMemory(); + if (pdfData == null) { + return null; + } + + Report created = new Report(); + created = new Report(); + created.setName("Serviceprotokoll_" + selected.getNumber() + ".pdf"); + created.setFileData(pdfData); + created.setMime(Mime.PDF); + + return created; + } + + private byte[] createPDFInMemory() { + ByteArrayOutputStream pdfStream = new ByteArrayOutputStream(); + PdfWriter writer; + PdfDocument document; + Document doc; + + logo = logo == null ? loadCompanyLogo() : logo; + + if (logo == null) { + LOGGER.warn("Logo could not be loaded from path: " + LOGO_PATH); + return null; + } + + try { + // Create first PDF in memory + writer = new PdfWriter(pdfStream); + document = new PdfDocument(writer); + doc = new Document(document, PageSize.A4, true); + doc.setMargins(45F, 35F, 35F, 35F); + + Ticket ticket = editController.getSelected(); + if (ticket == null) { + sendErrorMessage("Fehler","Es wurde kein Ticket zum Erstellen des Protokolls ausgewählt!"); + return null; + } + + addDocumentInfo(document, ticket); + addHeader(doc); + addHeadline(doc, "Serviceprotokoll " + ticket.getNumber()); + addAuftragsdaten(doc, ticket); + addNachlaufMessungen(doc, ticket); + addAnzahlProSchutzeinrichtung(doc, ticket); + addAnzahlInspektionenMaschinen(doc, ticket); + addHinweiseUndErlaeuterungen(doc, ticket); + + doc.close(); + document.close(); + writer.close(); + + // Create final PDF with page numbers in memory + ByteArrayOutputStream finalPdfStream = new ByteArrayOutputStream(); + PdfReader reader = new PdfReader(new ByteArrayInputStream(pdfStream.toByteArray())); + writer = new PdfWriter(finalPdfStream); + document = new PdfDocument(reader, writer); + doc = new Document(document); + addPagenumbers(doc, ticket.getNumber() == null ? "-/-" : ticket.getNumber(), loadCompanyLogo()); + doc.close(); + document.close(); + reader.close(); + writer.close(); + + return finalPdfStream.toByteArray(); + } catch (Exception e) { + LOGGER.error(e); + errorMessage(); + return null; + } + } + + private void addDocumentInfo(PdfDocument document, Ticket ticket) { + PdfDocumentInfo info = document.getDocumentInfo(); + info.setTitle("Serviceprotokoll - " + ticket.getNumber()); + info.setAuthor((ticket.getOwner() == null ? "-/-" : ticket.getOwner().getLastname() + ", " + ticket.getOwner().getFirstname())); + info.setKeywords("Protokoll maschinell generiert"); + info.setCreator("Softwarehersteller fuer Mss-Safety"); + } + + private void addHeader(Document doc) throws IOException { + // Creating a table + float[] pointColumnWidths = {250F, 250F}; + Table table = new Table(pointColumnWidths); + table.setBorder(Border.NO_BORDER); + table.setMarginTop(-20F); + + logo.scale(0.13F, 0.13F); + logo.setMarginTop(-5F); + Cell logoCell = new Cell().add(logo); + logoCell.setBorder(Border.NO_BORDER); + table.addCell(logoCell); + + Text textHead = new Text( + "MSS Machine Safety Services GmbH \r\n" + + "Lüneburger Str. 48 \r\n" + + "D-28870 Ottersberg \r\n" + + "E-Mail: Kontakt@MSS-Failsafe.com" + ); + + textHead.setFont(PdfFontFactory.createFont(FONT_BOLD)); + textHead.setFontSize(10F); + textHead.setHorizontalScaling(0.9F); + + Paragraph pheader = new Paragraph(); + pheader.add(textHead); + pheader.setMarginLeft(10F); + pheader.setMultipliedLeading(1F); + + Cell addressCell = new Cell().add(pheader); + addressCell.setBorder(Border.NO_BORDER); + table.addCell(addressCell); + doc.add(table); + } + + private void addHeadline(Document doc, String headline) throws IOException { + Paragraph pheadline = new Paragraph(headline); + pheadline.setFont(PdfFontFactory.createFont(FONT_BOLD)); + pheadline.setFontSize(16F); + pheadline.setMarginTop(20F); + pheadline.setMarginLeft(20F); + doc.add(pheadline); + } + + private void addAuftragsdaten(Document doc, Ticket ticket) throws IOException { + Table auftragsdaten = generateSorroundingTable("Auftragsdaten", 520F); + String dateString; + if (ticket.getStartDate() != null && ticket.getEndDate() != null) { + dateString = formatter.format(ticket.getStartDate()) + " - " + formatter.format(ticket.getEndDate()); + } else if (ticket.getStartDate() != null) { + dateString = formatter.format(ticket.getStartDate()); + } else { + dateString = "-/-"; + } + + Cell firma = generateInnerTable(new Text("Firma"), true, + "Firmenname", ticket.getCompany().getName(), + "Straße/Hsnr.", ticket.getServiceAddress().getStreet() + (ticket.getServiceAddress().getNumber() == null ? "" : ticket.getServiceAddress().getNumber()), + "Plz/Ort", String.format("%05d %s", ticket.getServiceAddress().getPostnumber(), ticket.getServiceAddress().getPlace()), + "Staat", ticket.getServiceAddress().getCountry(), + "Ticket-Nr.", ticket.getNumber(), + "Kundennummer", ticket.getCompany().getKundenNr(), + "Prüfer", (ticket.getOwner() == null ? "-/-" : ticket.getOwner().getLastname() + ", " + ticket.getOwner().getFirstname()), + "Datum", dateString + ); + + auftragsdaten.addCell(firma); + auftragsdaten.setBorderBottom(new SolidBorder(0.5F)); + auftragsdaten.setMarginBottom(10.0F); + doc.add(auftragsdaten); + auftragsdaten.complete(); + } + + private void addNachlaufMessungen(Document doc, Ticket ticket) throws IOException { + Table table = generateSorroundingTable("Anzahl Inspektionen und Nachlaufmessungen", 520F); + if (ticket.getLocations() == null || ticket.getLocations().isEmpty()) { + LOGGER.warn("No locations found for ticket: " + ticket.getNumber()); + return; + } + + Map herstellerCounts = new HashMap<>(); + Map gefahrenpunktCounts = new HashMap<>(); + for (TicketLocation location : ticket.getLocations()) { + if (location.getMachines() == null || location.getMachines().isEmpty()) { + continue; + } + for (TicketMachine machine : location.getMachines()) { + if (machine.getSecurityAreas() == null || machine.getSecurityAreas().isEmpty()) { + continue; + } + //machine = machineManager.refresh(machine); + //Hibernate.initialize(machine.getSecurityAreas()); + + for(TicketSecurityArea area : machine.getSecurityAreas()){ + //area = areaManager.reloadWithAll(area); + + area.getSecurityDevices().stream() + .filter(device -> device.getType() != null) + .filter(device -> (device.getDeviceRole() == DeviceRole.BASE || device.getDeviceRole() == DeviceRole.HOST || device.getDeviceRole() == null)) + .forEach(device ->{ + String hersteller = device.getCompany() == null ? "Unbekannt" : device.getCompany().getName(); + herstellerCounts.put(hersteller, herstellerCounts.getOrDefault(hersteller, 0) + 1); + }); + area.getDangerPoints().stream() + .filter(dp -> dp.getMessung() != null && dp.getMessung() == true) + .filter(dp -> dp.getMeasuringPoint() != null) + .filter(dp -> dp.getSecurityDistance() != null && dp.getSecurityDistance() > 0) + .forEach(dp -> { + String hersteller = dp.getSecurityDevice().getCompany() == null ? "Unbekannt" : dp.getSecurityDevice().getCompany().getName(); + gefahrenpunktCounts.put(hersteller, gefahrenpunktCounts.getOrDefault(hersteller, 0) + 1); + }); + /* + area.getSwitchingDevices().forEach(device ->{ + String hersteller = device.getCompany() == null ? "Unbekannt" : device.getCompany().getName(); + herstellerCounts.put(hersteller, herstellerCounts.getOrDefault(hersteller, 0) + 1); + });*/ + } + } + } + + String[] tableValues = new String[herstellerCounts.size() * 3 + 6]; + tableValues[0] = "Schutzeinrichtung\r\n-Hersteller"; + tableValues[1] = "Anzahl Inspektionen"; + tableValues[2] = "Anzahl NLZ-Messungen"; + int index = 3; + for (Map.Entry entry : herstellerCounts.entrySet()) { + tableValues[index] = entry.getKey(); + tableValues[index + 1] = String.valueOf(entry.getValue()); + tableValues[index + 2] = String.valueOf(gefahrenpunktCounts.getOrDefault(entry.getKey(), 0)); + index += 3; + } + + tableValues[index] = "Gesamtanzahl"; + tableValues[index + 1] = String.valueOf(herstellerCounts.values().stream().mapToInt(Integer::intValue).sum()); + tableValues[index + 2] = String.valueOf(gefahrenpunktCounts.values().stream().mapToInt(Integer::intValue).sum()); + + Cell innerTable = generateInnerTable(new Text(""),3, true, tableValues); + + table.addCell(innerTable); + table.setBorderBottom(new SolidBorder(0.5F)); + table.setMarginBottom(10.0F); + doc.add(table); + table.complete(); + } + + private void addAnzahlProSchutzeinrichtung(Document doc, Ticket ticket) throws IOException { + Table table = generateSorroundingTable("Anzahl Inspektionen und Nachlaufmessungen", 520F); + if (ticket.getLocations() == null || ticket.getLocations().isEmpty()) { + LOGGER.warn("No locations found for ticket: " + ticket.getNumber()); + return; + } + Map schutztypCounts = new HashMap<>(); + Map dpCounts = new HashMap<>(); + + for (TicketLocation location : ticket.getLocations()) { + if (location.getMachines() == null || location.getMachines().isEmpty()) { + continue; + } + for (TicketMachine machine : location.getMachines()) { + if (machine.getSecurityAreas() == null || machine.getSecurityAreas().isEmpty()) { + continue; + } + //machine = machineManager.refresh(machine); + //Hibernate.initialize(machine.getSecurityAreas()); + + for(TicketSecurityArea area : machine.getSecurityAreas()){ + //area = areaManager.reloadWithAll(area); + + area.getSecurityDevices().stream() + .filter(device -> device.getType() != null) + .filter(device -> (device.getDeviceRole() == DeviceRole.BASE || device.getDeviceRole() == DeviceRole.HOST || device.getDeviceRole() == null)) + .forEach(device ->{ + String type = device.getType() == null ? "Unbekannt" : device.getType().getName(); + schutztypCounts.put(type, schutztypCounts.getOrDefault(type, 0) + 1); + }); + area.getDangerPoints().stream() + .filter(dp -> dp.getMessung() != null && dp.getMessung() == true) + .filter(dp -> dp.getMeasuringPoint() != null) + .filter(dp -> dp.getSecurityDistance() != null && dp.getSecurityDistance() > 0) + .forEach(dp -> { + String type = dp.getSecurityDevice().getType() == null ? "Unbekannt" : dp.getSecurityDevice().getType().getName(); + dpCounts.put(type, dpCounts.getOrDefault(type, 0) + 1); + }); + } + } + } + + String[] tableValues = new String[schutztypCounts.size() * 3 + 6]; + tableValues[0] = "Anzahl Inspektionen pro Schutzeinrichtungstyp"; + tableValues[1] = "Anzahl Inspektionen"; + tableValues[2] = "Anzahl NLZ-Messungen Standard"; + int index = 3; + for (Map.Entry entry : schutztypCounts.entrySet()) { + tableValues[index] = entry.getKey(); + tableValues[index + 1] = String.valueOf(entry.getValue()); + tableValues[index + 2] = String.valueOf(dpCounts.getOrDefault(entry.getKey(), 0)); + index += 3; + } + tableValues[index] = "Gesamtanzahl"; + tableValues[index + 1] = String.valueOf(schutztypCounts.values().stream().mapToInt(Integer::intValue).sum()); + tableValues[index + 2] = String.valueOf(dpCounts.values().stream().mapToInt(Integer::intValue).sum()); + + Cell innerTable = generateInnerTable(new Text(""),3, true, tableValues); + + table.addCell(innerTable); + + table.setBorderBottom(new SolidBorder(0.5F)); + table.setMarginBottom(10.0F); + doc.add(table); + table.complete(); + } + + private void addAnzahlInspektionenMaschinen(Document doc, Ticket ticket) throws IOException { + Table table = generateSorroundingTable("Anzahl Inspektionen pro Maschine", 520F); + if (ticket.getLocations() == null || ticket.getLocations().isEmpty()) { + LOGGER.warn("No locations found for ticket: " + ticket.getNumber()); + return; + } + + List data = new ArrayList<>(); + String[] headers = new String[]{ + "Standort", + "Maschine", + "Inspektionsnr.", + "Anzahl Inspektionen", + "Anzahl NLZ-Messungen Standard", + "Anzahl NLZ-Messungen erweitert" + }; + data.add(headers); + int totalInspections = 0; + int totalNLZStandard = 0; + for (TicketLocation location : ticket.getLocations()) { + if (location.getMachines() == null || location.getMachines().isEmpty()) { + continue; + } + + boolean isFirstMachine = true; + for (TicketMachine machine : location.getMachines()) { + int inspections = 0; + int nlzStandard = 0; + for(TicketSecurityArea area : machine.getSecurityAreas()){ + //area = areaManager.reloadWithAll(area); + for (TicketSecurityDevice device : area.getSecurityDevices()){ + if (device.getDeviceRole() == null){ + inspections++; + continue; + } + if(device.getDeviceRole() == DeviceRole.BASE || device.getDeviceRole() == DeviceRole.HOST){ + inspections++; + } + } + for(TicketDangerPoint dp : area.getDangerPoints()){ + if (dp.getMessung() != null && dp.getMessung() == true + && dp.getMeasuringPoint() != null + && dp.getSecurityDistance() != null + && dp.getSecurityDistance() > 0){ + nlzStandard++; + } + } + } + + String[] row = new String[6]; + row[0] = isFirstMachine ? location.getName() : ""; + row[1] = machine.getName(); + row[2] = machine.getInspectID() == null ? "-/-" : machine.getInspectID (); + row[3] = String.valueOf(inspections); + row[4] = String.valueOf(nlzStandard); + row[5] = ""; + data.add(row); + isFirstMachine = false; + totalInspections += inspections; + totalNLZStandard += nlzStandard; + } + } + String[] totalRow = new String[6]; + totalRow[0] = "Gesamtanzahl"; + totalRow[1] = ""; + totalRow[2] = ""; + totalRow[3] = String.valueOf(totalInspections); + totalRow[4] = String.valueOf(totalNLZStandard); + totalRow[5] = ""; + data.add(totalRow); + + // Convert List to a single String[] for the table generation + String[] tableValues = data.stream().flatMap(Arrays::stream).toArray(String[]::new); + Cell innerTable = generateInnerTable(new Text(""),6, true, tableValues); + table.addCell(innerTable); + + table.setBorderBottom(new SolidBorder(0.5F)); + table.setMarginBottom(10.0F); + doc.add(table); + table.complete(); + } + + private void addHinweiseUndErlaeuterungen(Document doc, Ticket ticket) throws IOException { + Table table = generateSorroundingTable("Inspektionen mit Hinweisen und Erläuterungen", 520F); + if (ticket.getLocations() == null || ticket.getLocations().isEmpty()) { + LOGGER.warn("No locations found for ticket: " + ticket.getNumber()); + return; + } + + List data = new ArrayList<>(); + String[] headers = new String[]{ + "Standort Maschine Inspektionsnummer", + "Schutzbereich/Wirkbereich", + "Bemerkungen zur Inspektion" + }; + data.add(headers); + for (TicketLocation location : ticket.getLocations()) { + if (location.getMachines() == null || location.getMachines().isEmpty()) { + continue; + } + boolean isFirstMachine = true; + for (TicketMachine machine : location.getMachines()) { + for(TicketSecurityArea area : machine.getSecurityAreas()){ + //area = areaManager.reloadWithAll(area); + + String[] row = new String[3]; + row[0] = isFirstMachine ? location.getName() + "\r\n" + machine.getName() + "\r\n" + (machine.getInspectID() == null ? "-/-" : machine.getInspectID ()) : ""; + row[1] = area.getName(); + row[2] = area.getComment() == null ? "" : area.getComment(); + data.add(row); + isFirstMachine = false; + } + isFirstMachine = true; + } + } + + // Convert List to a single String[] for the table generation + String[] tableValues = data.stream().flatMap(Arrays::stream).toArray(String[]::new); + Cell innerTable = generateInnerTable(new Text(""),3, true, tableValues); + table.addCell(innerTable); + + table.setBorderBottom(new SolidBorder(0.5F)); + table.setMarginBottom(10.0F); + doc.add(table); + table.complete(); + } + + @Override + protected AbstractManager getManager() { + return protocolManager; + } + + @Override + public void clearEntries() { + + } +} diff --git a/java/mss-failsafe/src/main/java/controller/tickets/protocoll/ProtocolController.java b/java/mss-failsafe/src/main/java/controller/tickets/protocoll/ProtocolController.java new file mode 100755 index 0000000..a0a5ceb --- /dev/null +++ b/java/mss-failsafe/src/main/java/controller/tickets/protocoll/ProtocolController.java @@ -0,0 +1,1216 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package controller.tickets.protocoll; + +import business.AbstractManager; +import business.tickets.machine.TicketMachineManager; +import business.tickets.machine.TicketSecurityAreaManager; +import business.tickets.protocoll.ProtocolManager; +import com.itextpdf.io.font.constants.StandardFonts; +import controller.AbstractController; +import controller.person.PersonController; +import controller.tickets.TicketEditController; +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.inject.Named; +import model.files.Report; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.net.MalformedURLException; + +import com.itextpdf.io.image.ImageData; +import com.itextpdf.io.image.ImageDataFactory; +import com.itextpdf.kernel.colors.ColorConstants; +import com.itextpdf.kernel.font.PdfFontFactory; +import com.itextpdf.kernel.geom.PageSize; +import com.itextpdf.kernel.pdf.EncryptionConstants; +import com.itextpdf.kernel.pdf.PdfDocument; +import com.itextpdf.kernel.pdf.PdfDocumentInfo; +import com.itextpdf.kernel.pdf.PdfReader; +import com.itextpdf.kernel.pdf.PdfWriter; +import com.itextpdf.kernel.pdf.WriterProperties; +import com.itextpdf.layout.Document; +import com.itextpdf.layout.element.AreaBreak; +import com.itextpdf.layout.element.Cell; +import com.itextpdf.layout.element.Image; +import com.itextpdf.layout.element.Paragraph; +import com.itextpdf.layout.element.Table; +import com.itextpdf.layout.element.Text; +import java.io.File; +import java.nio.file.Files; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; +import javax.ejb.EJB; +import model.files.Mime; +import model.question.enums.Answer; +import model.security.enums.SecurityType; +import model.ticket.enums.SimpleAnswer; +import model.ticket.Ticket; +import model.ticket.dataCopies.TicketDangerPoint; +import model.ticket.dataCopies.TicketLocation; +import model.ticket.dataCopies.TicketMachine; +import model.ticket.dataCopies.TicketSecurityArea; +import model.ticket.dataCopies.TicketSecurityDevice; +import model.ticket.dataCopies.TicketSwitchingDevice; +import model.ticket.questions.SecurityAreaQuestion; +import model.ticket.questions.SecurityAreaQuestionaire; +import com.itextpdf.layout.borders.Border; +import com.itextpdf.layout.borders.SolidBorder; +import com.itextpdf.layout.element.ListItem; +import com.itextpdf.layout.properties.AreaBreakType; +import com.itextpdf.layout.properties.TextAlignment; +import com.itextpdf.layout.properties.VerticalAlignment; +import java.io.FileOutputStream; +import java.io.OutputStream; +import java.util.Collections; +import model.ticket.enums.FilenameGeneration; +import org.hibernate.Hibernate; + +/** + * + * @author pplate + */ +@Named +@RequestScoped +public class ProtocolController extends AbstractController { + + private int counter = 0; + private final String TEMP_FILE = "/rundata/temp" + counter + ".pdf"; + private final String TEMP_FILE2 = "/rundata/temp" + counter + 1 + ".pdf"; + public final static String PAGE_ONE_HEADER = "Inspektionsprotokoll für Berührungslos Wirkende Schutzeinrichtungen"; + public final static String PAGE_ONE_HEADER_TICKET = "Serviceprotokoll"; + private static final String OWNER_PW = "failsafe"; + + @EJB + ProtocolManager protocolManager; + + @Inject + TicketEditController editController; + + @Inject + PersonController personController; + + @EJB + TicketMachineManager machineManager; + + @EJB + TicketSecurityAreaManager areaManager; + + private Image companyLogo; + private Image nextPagesCompanyLogo; + + public ProtocolController() { + super(); + } + + @Override + protected AbstractManager getManager() { + return protocolManager; + } + + @Override + public void clearEntries() { + setCreated(null); + setSelected(null); + getEntities().clear(); + } + + private byte[] createPDFInMemory(TicketMachine machine) { + ByteArrayOutputStream firstPdfStream = new ByteArrayOutputStream(); + PdfWriter writer; + PdfDocument document; + Document doc; + companyLogo = loadCompanyLogo(); + nextPagesCompanyLogo = loadCompanyLogo(); + + if (companyLogo == null) { + LOGGER.error("No Logofile found!"); + errorMessage(); + return null; + } + + try { + // Create first PDF in memory + writer = new PdfWriter(firstPdfStream); + document = new PdfDocument(writer); + + try { + Ticket ticket = machine.getLocation().getTicket(); + PdfDocumentInfo info = document.getDocumentInfo(); + info.setTitle("Protokoll - " + machine.getName()); + info.setAuthor((ticket.getOwner() == null ? "-/-" : ticket.getOwner().getLastname() + ", " + ticket.getOwner().getFirstname())); + info.setKeywords("Protokoll maschinell generiert"); + info.setCreator("Softwarehersteller fuer Mss-Safety"); + + } catch (Exception e) { + LOGGER.error(e); + } + + doc = new Document(document, PageSize.A4, true); + doc.setMargins(45F, 35F, 35F, 35F); + + try { + createFirstPage(doc, machine); + doc.add(new AreaBreak(AreaBreakType.NEXT_PAGE)); + createSecurityAreaPages(machine, doc); + document.removePage(document.getNumberOfPages()); + addAbschliessendeBemerkungNeu(doc); + addBegriffserklaerung(doc); + } catch (IOException e) { + LOGGER.error(e); + errorMessage(); + return null; + } + + try { + doc.close(); + document.close(); + writer.close(); + } catch (Exception e) { + LOGGER.error(e); + return null; + } + + // Create final PDF with page numbers in memory + ByteArrayOutputStream finalPdfStream = new ByteArrayOutputStream(); + try { + PdfReader reader = new PdfReader(new ByteArrayInputStream(firstPdfStream.toByteArray())); + writer = new PdfWriter(finalPdfStream, hardenDocument()); + document = new PdfDocument(reader, writer); + doc = new Document(document); + addPagenumbers(doc, machine.getInspectID() == null ? "-/-" : machine.getInspectID(), nextPagesCompanyLogo); + doc.close(); + document.close(); + reader.close(); + writer.close(); + + return finalPdfStream.toByteArray(); + + } catch (Exception e) { + LOGGER.error(e); + errorMessage(); + return null; + } + + } catch (Exception e) { + LOGGER.error(e); + errorMessage(); + return null; + } + } + + private PdfDocument createTempTicketPDF(Ticket ticket) { + PdfWriter writer; + OutputStream outputStream; + PdfDocument document; + Document doc; + companyLogo = loadCompanyLogo(); + nextPagesCompanyLogo = loadCompanyLogo(); + + if (companyLogo == null) { + LOGGER.error("No Logofile found!"); + errorMessage(); + return null; + } + try { + outputStream + = new FileOutputStream(new File(TEMP_FILE)); + writer = new PdfWriter(outputStream); + + } catch (FileNotFoundException e) { + LOGGER.error(e); + errorMessage(); + return null; + } + document = new PdfDocument(writer); + + try { + PdfDocumentInfo info = document.getDocumentInfo(); + info.setTitle(PAGE_ONE_HEADER_TICKET + " " + ticket.getNumber()); + info.setAuthor((ticket.getOwner() == null ? "-/-" : ticket.getOwner().getLastname() + ", " + ticket.getOwner().getFirstname())); + info.setKeywords("Protokoll maschinell generiert"); + info.setCreator("Softwarehersteller fuer Mss-Safety"); + + } catch (Exception e) { + LOGGER.error(e); + } + + doc = new Document(document, PageSize.A4, true); + doc.setMargins(45F, 35F, 35F, 35F); + + return document; + } + + private WriterProperties hardenDocument() { + WriterProperties props = new WriterProperties(); + + props.setStandardEncryption(null, OWNER_PW.getBytes(), EncryptionConstants.ALLOW_PRINTING, EncryptionConstants.DO_NOT_ENCRYPT_METADATA); + + return props; + } + + public Report createReportForMachine(TicketMachine machine) throws IOException { + Report created; + + // Create PDF entirely in memory - no temp files needed + byte[] data = createPDFInMemory(machine); + + if (data == null) { + throw new IOException("Failed to create PDF in memory"); + } + + Ticket ticket = editController.getSelected(); + FilenameGeneration fgen = ticket.getFilenameGeneration(); + + created = new Report(); + created.setName(genFileName(machine, fgen)); + created.setFileData(data); + created.setMime(Mime.PDF); + + return created; + } + + private String genFileName(TicketMachine machine, FilenameGeneration gen) { + String ins = machine.getInspectID() == null ? "Inspektionsnummer" : machine.getInspectID(); + String desc = machine.getName(); + String standort = machine.getLocation() != null ? machine.getLocation().getName() : "Standort"; + + if (gen == FilenameGeneration.INSPEKTIONNR) { + return ins + ".pdf"; + } + + if (gen == FilenameGeneration.MASCHINEDESCRIPTION) { + return desc + '_' + ins + ".pdf"; + } + + if (gen == FilenameGeneration.LOCATION) { + return standort + '_' + desc + '_' + ins + ".pdf"; + } + + return "downloaded.pdf"; + } + + public void createFirstPage(Document document, TicketMachine machine) throws IOException { + + // Creating a table + float[] pointColumnWidths = {250F, 250F}; + Table table = new Table(pointColumnWidths); + table.setBorder(Border.NO_BORDER); + table.setMarginTop(-20F); + + companyLogo.scale(0.13F, 0.13F); + companyLogo.setMarginTop(-5F); + Cell logoCell = new Cell().add(companyLogo); + logoCell.setBorder(Border.NO_BORDER); + table.addCell(logoCell); + + Text textHead = new Text( + "MSS Machine Safety Services GmbH \r\n" + + "Lüneburger Str. 48 \r\n" + + "D-28870 Ottersberg \r\n" + + "E-Mail: Kontakt@MSS-Failsafe.com" + ); + + textHead.setFont(PdfFontFactory.createFont(FONT_BOLD)); + textHead.setFontSize(10F); + textHead.setHorizontalScaling(0.9F); + + Paragraph pheader = new Paragraph(); + pheader.add(textHead); + pheader.setMarginLeft(10F); + pheader.setMultipliedLeading(1F); + + Cell addressCell = new Cell().add(pheader); + addressCell.setBorder(Border.NO_BORDER); + table.addCell(addressCell); + document.add(table); + + Text headline = new Text(PAGE_ONE_HEADER); + headline.setFont(PdfFontFactory.createFont(FONT_BOLD)); + headline.setFontSize(14F); + + Paragraph pheadline = new Paragraph(headline); + pheadline.setMarginTop(20F); + pheadline.setMarginLeft(20F); + document.add(pheadline); + + TicketLocation loc = machine.getLocation(); + Ticket ticket = machine.getLocation().getTicket(); + + Table auftragsdaten = generateSorroundingTable("Auftragsdaten", 520F); + Cell firma = generateInnerTable(new Text("Firma"), false, + "Firmenname", ticket.getCompany().getName(), + "Straße/Hsnr.", ticket.getServiceAddress().getStreet() + (ticket.getServiceAddress().getNumber() == null ? "" : ticket.getServiceAddress().getNumber()), + "Plz/Ort", String.format("%05d %s", ticket.getServiceAddress().getPostnumber(), ticket.getServiceAddress().getPlace()), + "Staat", ticket.getServiceAddress().getCountry(), + "Kundennummer", ticket.getCompany().getKundenNr() + ); + auftragsdaten.addCell(firma); + + Cell inpektionsdaten = generateInnerTable(new Text("Inspektionsdaten"), true, + "Inspektionsnr.", machine.getInspectID() == null ? "-/-" : machine.getInspectID(), + "Inspektionsart", machine.getInspectionType() == null ? "Erstinspektion (oder Insp. nach Umbau/Umzug)" : machine.getInspectionType().getName(), + "Einsatzort", ticket.getServiceAddress() == null ? "-/-" : ticket.getServiceAddress().getPlace(), + "Ticket-Nr.", ticket.getNumber(), + "Prüfer", (ticket.getOwner() == null ? "-/-" : ticket.getOwner().getLastname() + ", " + ticket.getOwner().getFirstname()) + ); + auftragsdaten.addCell(inpektionsdaten); + auftragsdaten.setBorderBottom(new SolidBorder(0.5F)); + document.add(auftragsdaten); + auftragsdaten.complete(); + + switch (machine.getMachineType()) { + default: + Table informationMachine = createTechnicalTable(machine); + document.add(informationMachine); + informationMachine.complete(); + break; + } + + Table norm = generateSorroundingTable(null, 520F); + Cell normCell = createMachineNormCell(machine); + norm.addCell(normCell); + document.add(norm); + norm.complete(); + + Table inspek = generateSorroundingTable(null, 520F); + Cell notes = generateInnerTable(new Text("Bemerkungen für die Inspektion"), true, + "Sind alle relevanten Anforderungen aus den normativen Referenzen erfüllt?", machine.getSpecsFullfilled() == null || machine.getSpecsFullfilled() == SimpleAnswer.NA ? "" : machine.getSpecsFullfilled().value, + machine.getReceivedBatch() == null || machine.getReceivedBatch() == SimpleAnswer.NA ? "" : "Verwendetes Nachlaufmessgerät: hhb safetyman DT2", machine.getReceivedBatch() == null || machine.getReceivedBatch() == SimpleAnswer.NA ? "" : machine.getReceivedBatch().value, + "Bemerkungen zur gesamten Maschine", machine.getComment(), + "Monat der nächsten Prüfung laut Prüfplakette", machine.getNextInspectionDate() == null ? "" : String.format("%02d/%4d", machine.getNextInspectionDate().getMonthValue(), machine.getNextInspectionDate().getYear()) + ); + inspek.addCell(notes); + inspek.setBorderBottom(new SolidBorder(0.5F)); + document.add(inspek); + inspek.complete(); + } + + private Table createTechnicalTable(TicketMachine machine) throws IOException { + Table informationMachine = generateSorroundingTable("Informationen zur Maschine", 520F); + informationMachine.setMarginTop(10F); + + Cell technical = generateInnerTable(new Text("Technische Daten"), false, + "Bezeichnung", machine.getName(), + "Maschinenstandort", machine.getLocation() == null ? "-/-" : machine.getLocation().getName(), + "Hersteller", machine.getManufacturer() == null ? "-/-" : machine.getManufacturer().getName(), + "Maschinenart", machine.getMachineType() == null ? "-/-" : machine.getMachineType().getName(), + "Modell/Typ", machine.getModellType() == null ? "-/-" : machine.getModellType(), + "Maschinen-Nr.", machine.getIndentifier() == null ? "-/-" : machine.getIndentifier(), + "Inventar-Nr.", machine.getInventarNr() == null ? "-/-" : machine.getInventarNr(), + "Kostenstelle", machine.getCostCenter() == null ? "-/-" : machine.getCostCenter(), + "Baujahr", machine.getBuildingYear() == null ? "-/-" : machine.getBuildingYear().toString(), + "Umbau-Jahr", machine.getChangeYear() == null ? "-/-" : machine.getChangeYear().toString() + ); + informationMachine.addCell(technical); + + return informationMachine; + } + + private Cell createMachineNormCell(TicketMachine machine) throws IOException { + ArrayList values = new ArrayList<>(); + + values.add("Norm 'sicherheitsbez. Teile einer Steuerung'"); + values.add(machine.getControlParts() == null ? "-/-" : machine.getControlParts().getName()); + + values.add("Norm 'Anordnung/ Annäherung'"); + values.add(machine.getArrayApproach() == null ? "-/-" : machine.getArrayApproach().getName()); + + values.add("Norm 'Anw. von AOPD/AOPDDR'"); + values.add(machine.getAopd_aopddr() == null ? "-/-" : machine.getAopd_aopddr().getName()); + + if (machine.getNothaltGestaltung() != null) { + values.add("Norm Not-Halt"); + values.add(machine.getNothaltGestaltung().getName()); + } + + if (machine.getNothaltVerriegel() != null) { + values.add("Norm Verriegel.einr."); + values.add(machine.getNothaltVerriegel().getName()); + } + + String[] valuesArray = new String[values.size()]; + valuesArray = values.toArray(valuesArray); + + Cell cell = generateInnerTable( + new Text("Normative Referenzen für die Inspektion"), + true, + valuesArray + ); + + return cell; + } + + private void createSecurityAreaPages(TicketMachine machine, Document doc) throws IOException { + // Prefetched: avoid refresh/reload to reduce DB load + List areas = machine.getSecurityAreas(); + + int counter = 0; + Text text = new Text("Schutzbereich/ Schutzeinrichtung"); + text.setFont(PdfFontFactory.createFont(FONT_BOLD)); + text.setFontSize(14F); + Paragraph p = new Paragraph(text); + doc.add(p); + + for (TicketSecurityArea area : areas) { + Table areaTable = createAreaTable(area, doc); + areaTable.setBorder(new SolidBorder(0.5F)); + doc.add(areaTable); + areaTable.complete(); + + doc.add(new AreaBreak(AreaBreakType.NEXT_PAGE)); + + Text header = new Text("Inspektionsergebnis: " + area.getName()); + header.setFont(PdfFontFactory.createFont(FONT_BOLD)); + header.setFontSize(14F); + Paragraph pheader = new Paragraph(header); + doc.add(pheader); + + LOGGER.info("Starting to create for area: {}", area.getName()); + + for (SecurityAreaQuestionaire questionaire : area.getQuestionaires()) { + LOGGER.info("Starting to create for questionaire: {}", questionaire.getName()); + Table t = generateSorroundingTable(null, 520F); + doc.add(t); + t.setBorderTop(new SolidBorder(0.5F)); + ArrayList values = new ArrayList<>(questionaire.getQuestions().size() * 2); + + LOGGER.debug(questionaire.getQuestions().size()); + //Collections.sort(questionaire.getQuestions()); + for (int i = 0; i < questionaire.getQuestions().size(); i++) { + SecurityAreaQuestion q = questionaire.getQuestions().get(i); + LOGGER.debug(q.getText()); + if (q.isStandardValues()) { + if (q.getAnswer() == null || q.getAnswer() == Answer.NA) { + LOGGER.debug("skipping {}", q.getAnswer()); + continue; + } + } else { + if (q.getOwnAnswer() == null || q.getOwnAnswer().startsWith("dontUseThis")) { + LOGGER.debug("skipping"); + continue; + } + } + + values.add(q.getText()); + + if (q.isStandardValues()) { + values.add(q.getAnswer().value); + } else { + values.add(q.getOwnAnswer()); + } + + } + + String[] valuesArray = new String[values.size()]; + valuesArray = values.toArray(valuesArray); + t.addCell(generateInnerTable(new Text("" + questionaire.getName()), true, valuesArray)); + + t.setBorderBottom(new SolidBorder(0.5F)); + t.setMarginBottom(10F); + t.complete(); + + } + + if (area.getComment() != null && !area.getComment().isEmpty()) { + Table t = generateSorroundingTable(null, 520F); + doc.add(t); + t.setBorderTop(new SolidBorder(0.5F)); + + Text cHeader = new Text("Bemerkungen zum Gefährdungsbereich"); + cHeader.setFont(PdfFontFactory.createFont(FONT_NORMAL)); + cHeader.setFontSize(11F); + Paragraph pHeader = new Paragraph(cHeader); + pHeader.setMarginLeft(2F); + Cell headerCell = new Cell(); + headerCell.add(pHeader); + headerCell.setBorderBottom(Border.NO_BORDER); + + t.addCell(headerCell); + + Text content = new Text(area.getComment()); + content.setFont(PdfFontFactory.createFont(FONT_NORMAL)); + content.setFontSize(8F); + Paragraph pcontent = new Paragraph(content); + pcontent.setMarginLeft(2F); + Cell contentCell = new Cell(); + contentCell.add(pcontent); + contentCell.setBorderTop(Border.NO_BORDER); + + t.addCell(contentCell); + + t.complete(); + } + doc.add(new AreaBreak(AreaBreakType.NEXT_PAGE)); + } + } + + private Table createAreaTable(TicketSecurityArea area, Document doc) throws IOException { + Table t = generateSorroundingTable(area.getName(), 520F); + + + if (area.getSecurityDevices() != null) { + boolean hasNothalt = false; + for (TicketSecurityDevice device : area.getSecurityDevices()) { + if (device != null + && device.getType() != null + && device.getType() == SecurityType.NOT_HALT_BEFEHLSGERAET) { + hasNothalt = true; + } + } + if (!hasNothalt) { + t.addCell(generateInnerTable(new Text("Technische Daten"), false, + "Absicherungs-/ Betriebsart", area.getProtectionType() == null ? "-/-" : area.getProtectionType().name, + "Anbauposition der Schutzeinrichtung(en)", area.getMountingPosition() == null ? "-/-" : area.getMountingPosition().name, + "Werkzeug-/ Vorrichtungsnr.", area.getToolNr() == null ? "-/-" : area.getToolNr(), + "Nachlaufmessung", area.getOverrunMeasurementType() == null ? "-/-" : area.getOverrunMeasurementType().name, + "Annäherungsgeschw. K (m/s)", area.getApproachSpeed() == null ? "-/-" : area.getApproachSpeed().name + )); + } + for (TicketSecurityDevice device : area.getSecurityDevices()) { + t.addCell(createSecurityDeviceCell(device)); + } + } else { + t.addCell(generateInnerTable(new Text("Technische Daten"), false, + "Absicherungs-/ Betriebsart", area.getProtectionType() == null ? "-/-" : area.getProtectionType().name, + "Anbauposition der Schutzeinrichtung(en)", area.getMountingPosition() == null ? "-/-" : area.getMountingPosition().name, + "Werkzeug-/ Vorrichtungsnr.", area.getToolNr() == null ? "-/-" : area.getToolNr(), + "Nachlaufmessung", area.getOverrunMeasurementType() == null ? "-/-" : area.getOverrunMeasurementType().name, + "Annäherungsgeschw. K (m/s)", area.getApproachSpeed() == null ? "-/-" : area.getApproachSpeed().name + )); + } + + if (area.getSwitchingDevices() != null) { + for (TicketSwitchingDevice device : area.getSwitchingDevices()) { + t.addCell(createSwitchingDeviceCell(device)); + } + } + + if (area.getDangerPoints() != null) { + for (TicketDangerPoint dp : area.getDangerPoints()) { + t.addCell(createDangerPointCell(dp)); + if (dp.getMessung() != null && dp.getMessung()) { + t.addCell(createMeasuring(dp)); + } + } + } + + return t; + } + + private Cell createSecurityDeviceCell(TicketSecurityDevice device) throws IOException { + ArrayList values = new ArrayList<>(); + + if (device.getType() == SecurityType.DOOR_SECURITY_SWITCH) { + return createSecDevTuerSicherData(device); + } + + if (device.getType() == SecurityType.NOT_HALT_BEFEHLSGERAET) { + return createSecDevNothaltData(device); + } + + values.add("Hersteller"); + values.add(device.getCompany() == null ? "-/-" : device.getCompany().getName()); + if (!(device.getType() == SecurityType.LASERRSCANNER)) { + values.add("Rolle"); + values.add(device.getDeviceRole() == null ? "-/-" : device.getDeviceRole().NAME); + } + values.add("Sicherheitskategorie / Typ "); + values.add(device.getSecurityCategory() == null ? "-/-" : device.getSecurityCategory().getName()); + values.add("Schutzfeldausrichtung"); + values.add(device.getSfAlignment() == null ? "-/-" : device.getSfAlignment().NAME); + values.add("Muting-/Blanking-Modus"); + values.add(device.getMutingBlankingModus() == null ? "-/-" : device.getMutingBlankingModus().NAME); + values.add("Muting-Signale"); + values.add(device.getMutingSignals() == null ? "-/-" : device.getMutingSignals().NAME); + if (device.getType() == SecurityType.LASERRSCANNER) { + values.add("Serien-Nr(n). Sender/Optikteil/SK"); + values.add(device.getSerialNrSender() == null ? "-/-" : device.getSerialNrSender()); + values.add("Serien-Nr(n). Programmierstecker "); + values.add(device.getSerialNrReceiver() == null ? "-/-" : device.getSerialNrReceiver()); + } else { + values.add("Serien-Nr(n) Sender/Optikteil"); + values.add(device.getSerialNrSender() == null ? "-/-" : device.getSerialNrSender()); + values.add("Serien-Nr(n). Empfänger/Refl."); + values.add(device.getSerialNrReceiver() == null ? "-/-" : device.getSerialNrReceiver()); + } + values.add("ESPE parametrierbar"); + values.add(device.geteSPE_Paramable() == null ? "-/-" : device.geteSPE_Paramable().getName()); + values.add("Identifikation der Konfiguration"); + values.add(device.getConfigID() == null ? "-/-" : device.getConfigID()); + values.add("BMK"); + values.add(device.getBmk() == null ? "-/-" : device.getBmk()); + //values.add("RFID"); + //values.add("-/-"); + values.add("Schutzfeldbreite (mm) "); + String toSF = device.getsFdWidth() == null ? "-/-" : device.getsFdWidth().toString(); + toSF += ";"; + toSF += device.getsFdWidth2() == null ? "" : device.getsFdWidth2().toString(); + values.add(toSF); + values.add("Vert.-SF: Höhe, Horiz.-SF: Tiefe (mm)"); + values.add(device.getsFHeightDepth() == null ? "-/-" : device.getsFHeightDepth().toString()); + values.add("Höhe ob. Strahl ü. Bezugsebene (mm)"); + values.add(device.getHeightTopRay() == null ? "-/-" : device.getHeightTopRay().toString()); + values.add("Höhe SF ü. Bezugsebene (mm)"); + values.add(device.getHeightOverReference() == null ? "-/-" : device.getHeightOverReference().toString()); + values.add("Abstand zum Maschinentisch (mm)"); + values.add(device.getDistanceTable() == null ? "-/-" : device.getDistanceTable().toString()); + values.add("Detektionsvermögen (mm) [=>C]"); + values.add(device.getDetectionCapacity() == null ? "-/-" : device.getDetectionCapacity().toString()); + values.add("Ansprechzeit t1 (ms)"); + values.add(device.getResponseTime() == null ? "-/-" : device.getResponseTime().toString()); + if (device.getType() == SecurityType.LASERRSCANNER) { + values.add("Zuschlag ZSM (mm)"); + values.add(device.getZsm() == null ? "-/-" : device.getZsm().toString()); + values.add("Bodenfreiheit HF (mm)"); + values.add(device.getFloorspace() == null ? "-/-" : device.getFloorspace().toString()); + } + + if (device.getComment() != null) { + values.add("Notiz"); + values.add(device.getComment()); + } + + String[] valuesArray = new String[values.size()]; + valuesArray = values.toArray(valuesArray); + + Cell cell = generateInnerTable( + new Text(device.getType().getName() + ": " + device.getDescription()), + true, + valuesArray + ); + + return cell; + } + + private Cell createSecDevNothaltData(TicketSecurityDevice device) throws IOException { + ArrayList values = new ArrayList<>(); + + values.add("Hersteller"); + values.add(device.getCompany() == null ? "-/-" : device.getCompany().getName()); + + values.add("Bauart/Typ "); + values.add(device.getNotHaltType() == null ? "-/-" : device.getNotHaltType().toString()); + + values.add("Kontaktausführung "); + values.add(device.getNotHaltContact() == null ? "-/-" : device.getNotHaltContact().name); + + values.add("Sicherheitskategorie / Typ "); + values.add(device.getSecurityCategory() == null ? "-/-" : device.getSecurityCategory().getName()); + + values.add("BMK"); + values.add(device.getBmk() == null ? "-/-" : device.getBmk()); + + values.add("Stopp-Kategorie "); + values.add(device.getStopCategory() == null ? "-/-" : device.getStopCategory().name); + + values.add("Serien-Nr(n)"); + values.add(device.getSerialNrSender() == null ? "-/-" : device.getSerialNrSender()); + + if (device.getComment() != null) { + values.add("Notiz"); + values.add(device.getComment()); + } + + String[] valuesArray = new String[values.size()]; + valuesArray = values.toArray(valuesArray); + + Cell cell = generateInnerTable( + new Text(device.getType().getName() + ": " + device.getDescription()), + true, + valuesArray + ); + + return cell; + } + + private Cell createSecDevTuerSicherData(TicketSecurityDevice device) throws IOException { + ArrayList values = new ArrayList<>(); + + values.add("Hersteller"); + values.add(device.getCompany() == null ? "-/-" : device.getCompany().getName()); + + values.add("Bauart"); + values.add(device.getBuildType() == null ? "-/-" : device.getBuildType().getName()); + + values.add("Betätigung "); + values.add(device.getConfirmation() == null ? "-/-" : device.getConfirmation()); + + values.add("Sicherheitskategorie / Typ "); + values.add(device.getSecurityCategory() == null ? "-/-" : device.getSecurityCategory().getName()); + + values.add("Prinzip "); + values.add(device.getPrinciple()== null ? "-/-" : device.getPrinciple().toString()); + + values.add("Codierung vorhanden"); + values.add(device.getCoded() == null || !device.getCoded() ? "Nein" : "Ja"); + + values.add("Zuhaltung vorhanden"); + values.add(device.getPimped()== null || !device.getPimped() ? "Nein" : "Ja"); + + values.add("Serien-Nr(n)"); + values.add(device.getSerialNrSender() == null ? "-/-" : device.getSerialNrSender()); + + if (device.getComment() != null) { + values.add("Notiz"); + values.add(device.getComment()); + } + + String[] valuesArray = new String[values.size()]; + valuesArray = values.toArray(valuesArray); + + Cell cell = generateInnerTable( + new Text(device.getType().getName() + ": " + device.getDescription()), + true, + valuesArray + ); + + return cell; + } + + private Cell createSwitchingDeviceCell(TicketSwitchingDevice sw) throws IOException { + ArrayList values = new ArrayList<>(); + + values.add("Hersteller"); + values.add(sw.getCompany() == null ? "-/-" : sw.getCompany().getName()); + values.add("Sicherheitskategorie / Typ "); + values.add(sw.getSecurityCategory() == null ? "-/-" : sw.getSecurityCategory().getName()); + values.add("Seriennummer"); + values.add(sw.getSerialNrSender() == null ? "-/-" : sw.getSerialNrSender()); + values.add("Identifikation der Konfiguration"); + values.add(sw.getConfigID() == null ? "-/-" : sw.getConfigID()); + + if(sw.getComponent() != null){ + values.add("zusätzliche Komponenten"); + values.add(sw.getComponent().NAME); + } + + if(sw.getRemark() != null){ + values.add("BMK"); + values.add(sw.getRemark()); + } + + if(sw.getComment() != null){ + values.add("Notiz"); + values.add(sw.getComment()); + } + + + String[] valuesArray = new String[values.size()]; + valuesArray = values.toArray(valuesArray); + + Cell cell = generateInnerTable( + new Text("Schaltkomponente/Auswertegerät: " + sw.getDescription()), + true, + valuesArray + ); + + return cell; + } + + private Cell createDangerPointCell(TicketDangerPoint dp) throws IOException { + ArrayList values = new ArrayList<>(); + + values.add("Ist-Abstand (mm)"); + values.add(dp.getMeasuringPoint().getActualDistance() == null || dp.getMeasuringPoint().getActualDistance() == 0 ? "-/-" : dp.getMeasuringPoint().getActualDistance().toString()); + values.add("Abstand lt. Angabe (mm)"); + values.add(dp.getMeasuringPoint().getDistanceSpec() == null || dp.getMeasuringPoint().getDistanceSpec() == 0 ? "-/-" : dp.getMeasuringPoint().getDistanceSpec().toString()); + values.add("Nachlaufzeit lt. Angabe (ms)"); + values.add(dp.getMeasuringPoint().getFollowUpTimeSpec() == null || dp.getMeasuringPoint().getFollowUpTimeSpec() == 0 ? "-/-" : dp.getMeasuringPoint().getFollowUpTimeSpec().toString()); + values.add("Nachlaufweg lt. Angabe (mm)"); + values.add(dp.getMeasuringPoint().getFollowUpCoveredDistanceSpec() == null || dp.getMeasuringPoint().getFollowUpCoveredDistanceSpec() == 0 ? "-/-" : dp.getMeasuringPoint().getFollowUpCoveredDistanceSpec().toString()); + values.add("Höhe Gefahrpunkt (mm)"); + values.add(dp.getMeasuringPoint().getHeight() == null || dp.getMeasuringPoint().getHeight() == 0 ? "-/-" : dp.getMeasuringPoint().getHeight().toString()); + values.add("CRT/CRO (mm) - ersetzt formelbasierte Berechnung!"); + values.add(dp.getMeasuringPoint().getCrtCro() == null || dp.getMeasuringPoint().getCrtCro() == 0 ? "-/-" : dp.getMeasuringPoint().getCrtCro().toString()); + + boolean isToBeAdded = false; + // check if any value is not "-/-" + for(int i = 1; i < values.size(); i = i + 2){ + if(!values.get(i).equals("-/-")){ + isToBeAdded = true; + } + } + String[] valuesArray; + if (isToBeAdded) { + valuesArray = new String[values.size()]; + valuesArray = values.toArray(valuesArray); + } else { + valuesArray = new String[0]; + } + + Text text = new Text("Gefahrpunkt: " + dp.getDescription() + "\r\n" + + dp.getSecurityDevice().getType().getName() + ": " + dp.getSecurityDevice().getDescription()); + text.setFont(PdfFontFactory.createFont(FONT_BOLD)); + + Cell cell = generateInnerTable( + text, + false, + valuesArray + ); + + return cell; + } + + private Cell createMeasuring(TicketDangerPoint dp) throws IOException { + Cell cell = new Cell(); + + float[] pointColumnWidths = {80F, 80F, 80F, 80F, 210F}; + Table table = new Table(pointColumnWidths); + table.setFont(PdfFontFactory.createFont(FONT_NORMAL)); + table.setFontSize(8F); + table.setBorderLeft(Border.NO_BORDER); + table.setBorderRight(Border.NO_BORDER); + + Cell cell1 = new Cell(); + cell1.add(new Paragraph("Zeit (ms)")); + table.addCell(cell1); + + Cell cell2 = new Cell(); + cell2.add(new Paragraph("Weg (mm)")); + table.addCell(cell2); + + Cell cell3 = new Cell(); + cell3.add(new Paragraph(new Text("SPM-P (mm)"))); + table.addCell(cell3); + + Cell cell4 = new Cell(); + cell4.add(new Paragraph("SPM-G (mm/s)")); + table.addCell(cell4); + + Cell cell5 = new Cell(); + cell5.add(new Paragraph("Berechneter Sicherheitsabstand S (mm)")); + table.addCell(cell5); + + Cell cell6 = new Cell(); + cell6.add(new Paragraph(dp.getTimeMesasured() == null || dp.getTimeMesasured() == 0 ? "-/-" : dp.getTimeMesasured().toString())); + table.addCell(cell6); + + Cell cell7 = new Cell(); + cell7.add(new Paragraph(dp.getMovement() == null || dp.getMovement() == 0 ? "-/-" : dp.getMovement().toString())); + table.addCell(cell7); + + Cell cell8 = new Cell(); + cell8.add(new Paragraph(dp.getsPMP() == null || dp.getsPMP() == 0 ? "-/-" : dp.getsPMP().toString())); + table.addCell(cell8); + + Cell cell9 = new Cell(); + cell9.add(new Paragraph(dp.getsPMG() == null || dp.getsPMG() == 0 ? "-/-" : dp.getsPMG().toString())); + table.addCell(cell9); + + Cell cell10 = new Cell(); + cell10.add(new Paragraph(dp.getSecurityDistance() == null || dp.getSecurityDistance() == 0 ? "-/-" : dp.getSecurityDistance().toString())); + table.addCell(cell10); + + cell.add(table); + + return cell; + } + + private void addAbschliessendeBemerkung(Document doc) throws IOException { + String header = "Abschließende Bemerkungen"; + Text text = new Text(header); + text.setFont(PdfFontFactory.createFont(FONT_BOLD)); + text.setFontSize(12F); + Paragraph ph = new Paragraph(text); + + doc.add(ph); + + Text t1 = new Text( + "Die Betriebssicherheitsverordnung gilt generell für " + + "die Verwendung von Arbeitsmitteln. In §3 Absatz 6 und §10 definiert sie die Verantwortung" + + "des Arbeitgebers, geeignete Maßnahmen zur Aufrechterhaltung der Sicherheit auf Basis einer individuellen Gefährdungsbeurteilung des " + + "Arbeitsmittels zu definieren." + ); + + t1.setFont(PdfFontFactory.createFont(FONT_NORMAL)); + t1.setFontSize(8F); + Paragraph p1 = new Paragraph(t1); + + doc.add(p1); + + Text t2 = new Text( + "Die regelmäßige Sicherheitsinspektion ist eine geeignete Maßnahme, die Wirksamkeit aktiver optoelektronischer Schutzeinrichtungen " + + "nachzuweisen. Es werden bei der Inspektion, basierend auf den relevanten Normen und Standards, die Funktion der Schutzeinrichtung, die " + + "Installation und die Montagebedingungen überprüft und im Inspektionsprotokoll dokumentiert." + ); + + t2.setFont(PdfFontFactory.createFont(FONT_NORMAL)); + t2.setFontSize(8F); + Paragraph p2 = new Paragraph(t2); + + doc.add(p2); + + Text t4 = new Text( + "Bei Abweichungen zu normativen Vorgaben wenden Sie sich bitte an den Hersteller der Maschine bezüglich der Überarbeitung des " + + "bestehenden Sicherheitskonzepts. Gerne unterstützen auch wir Sie bei der Korrektur gegebenenfalls vorhandener Abweichungen." + ); + + t4.setFont(PdfFontFactory.createFont(FONT_NORMAL)); + t4.setFontSize(8F); + Paragraph p4 = new Paragraph(t4); + + doc.add(p4); + + Text t5 = new Text( + "Die Prüfung bezieht sich nur auf die einwandfreie Funktion der ESPE und ersetzt nicht die Prüfung der Maschine durch den " + + "Maschinenhersteller. Bitte beachten Sie, dass die Validierung der Konfiguration von programmierbaren sicherheitsgerichteten Steuerungen " + + "sowie die direkte Einbindung von ESPE in ein sicherheitsgerichtetes Bussystem nicht im Prüfumfang enthalten ist. Hierzu bieten wir zusätzliche " + + "Validierungs- und Verifikationsdienstleistungen an." + ); + + t5.setFont(PdfFontFactory.createFont(FONT_NORMAL)); + t5.setFontSize(8F); + Paragraph p5 = new Paragraph(t5); + + doc.add(p5); + + Text t6 = new Text( + "Die Prüfplakette dient nur der Kennzeichnung des nächsten Prüftermins, " + + "Änderungen an der ESPE oder Maschine können die Schutzwirkung beeinträchtigen." + ); + + t6.setFont(PdfFontFactory.createFont(FONT_BOLD)); + t6.setFontSize(8F); + Paragraph p6 = new Paragraph(t6); + + doc.add(p6); + } + + private void addAbschliessendeBemerkungNeu(Document doc) throws IOException { + String header = "Abschließende Informationen"; + Text text = new Text(header); + text.setFont(PdfFontFactory.createFont(FONT_BOLD)); + text.setFontSize(12F); + Paragraph ph = new Paragraph(text); + + doc.add(ph); + + Text t1 = new Text( + "Die Betriebssicherheitsverordnung (BetrSichV) ist die deutsche Arbeitsmittelbenutzungsrichtlinie " + + "und regelt die Bereitstellung von Arbeitsmitteln durch den Arbeitgeber, die Benutzung von " + + "Arbeitsmitteln durch die Beschäftigten bei der Arbeit, sowie die Errichtung und den Betrieb " + + "von überwachungsbedürftigen Anlagen im Sinne des Arbeitsschutzes. " + ); + + t1.setFont(PdfFontFactory.createFont(FONT_NORMAL)); + t1.setFontSize(8F); + Paragraph p1 = new Paragraph(t1); + + doc.add(p1); + + Text t11 = new Text( + "Der Arbeitgeber hat vor der Verwendung von Arbeitsmitteln die auftretenden Gefährdungen zu beurteilen " + + "(Gefährdungsbeurteilung) und daraus notwendige und geeignete Schutzmaßnahmen abzuleiten. Das " + + "Vorhandensein einer CE-Kennzeichnung am Arbeitsmittel entbindet nicht von der Pflicht zur " + + "Durchführung einer Gefährdungsbeurteilung." + ); + + t11.setFont(PdfFontFactory.createFont(FONT_NORMAL)); + t11.setFontSize(8F); + Paragraph p11 = new Paragraph(t11); + + doc.add(p11); + + Text t2 = new Text( + "Die regelmäßige Sicherheitsinspektion/Prüfung ist eine geeignete Maßnahme, die " + + "Wirksamkeit einer Schutzeinrichtung festzustellen und der Betreiberpflicht nachzukommen." + ); + + t2.setFont(PdfFontFactory.createFont(FONT_NORMAL)); + t2.setFontSize(8F); + t2.setUnderline(); + Paragraph p2 = new Paragraph(t2); + + doc.add(p2); + + Text t3 = new Text( + "Es werden bei der Inspektion/Prüfung, basierend auf den relevanten Normen und Standards nach dem " + + "aktuellen Stand der Technik, die Funktion der Schutzeinrichtung, die Installation und die " + + "Montagebedingungen überprüft und im Inspektionsprotokoll rechtskonform dokumentiert." + ); + + t3.setFont(PdfFontFactory.createFont(FONT_NORMAL)); + t3.setFontSize(8F); + Paragraph p3 = new Paragraph(t3); + + doc.add(p3); + + Text t4 = new Text( + "Bei normativen Abweichungen zum aktuellen Stand der Technik, sind geeignete Maßnahmen durch den Betreiber " + + "festzulegen und umzusetzen. Hierzu wenden Sie sich bitte an den Hersteller der Maschine, bezüglich " + + "der Überarbeitung des bestehenden Sicherheitskonzepts. Gerne unterstützen auch wir Sie bei der " + + "Nachrüstung bzw. Behebung gegebenenfalls vorhandener normativer Abweichungen und Mängel." + ); + + t4.setFont(PdfFontFactory.createFont(FONT_NORMAL)); + t4.setFontSize(8F); + Paragraph p4 = new Paragraph(t4); + + doc.add(p4); + + Text t5 = new Text( + "Bitte beachten Sie, dass die Validierung der Konfiguration von programmierbaren sicherheitsgerichteten Steuerungen, " + + "sowie die direkte Einbindung von Schutzeinrichtugen in ein sicherheitsgerichtetes Bussystem nicht im " + + "Prüfumfang enthalten ist. Hierzu bieten wir zusätzliche Validierungs- und Verifikationsdienstleistungen an." + ); + + t5.setFont(PdfFontFactory.createFont(FONT_NORMAL)); + t5.setFontSize(8F); + Paragraph p5 = new Paragraph(t5); + + doc.add(p5); + + Text t6 = new Text( + "Die Prüfplakette dient nur der Kennzeichnung des nächsten Prüftermins und beschreibt " + + "unter der jeweiligen Protokoll-ID das Ergebnis der Prüfungen." + ); + + t6.setFont(PdfFontFactory.createFont(FONT_NORMAL)); + t6.setFontSize(8F); + Paragraph p6 = new Paragraph(t6); + + doc.add(p6); + + Text t7 = new Text( + "Die Prüfung bezieht sich nur auf die einwandfreie Funktion der Schutzeinrichtung im Zusammenwirken " + + "mit der Steuerung der Maschine/Anlage und ersetzt nicht die sicherheitstechnische " + + "Überprüfung der Maschine durch den Maschinenhersteller." + ); + + t7.setFont(PdfFontFactory.createFont(FONT_BOLD)); + t7.setFontSize(8F); + Paragraph p7 = new Paragraph(t7); + + doc.add(p7); + + Text t8 = new Text( + "Die Wirksamkeit der Schutzeinrichtung kann durch Fehlfunktionen der Maschine aufgehoben werden. " + + "Die Bedienungsanleitung des Herstellers zur ordnungs- bestimmungsgemäßen Verwendung " + + "der Schutzeinrichtung ist zu beachten." + ); + + t8.setFont(PdfFontFactory.createFont(FONT_BOLD)); + t8.setFontSize(8F); + Paragraph p8 = new Paragraph(t8); + + doc.add(p8); + + Text t9 = new Text( + "Änderungen an der Schutzeinrichtung oder Maschine können die Schutzwirkung beeinträchtigen." + ); + + t9.setFont(PdfFontFactory.createFont(FONT_BOLD)); + t9.setFontSize(8F); + Paragraph p9 = new Paragraph(t9); + doc.add(p9); + + Text t10 = new Text( + "Datum: " + LocalDate.now().format(DateTimeFormatter.ofPattern("dd.MM.yyyy")) + ); + t10.setFont(PdfFontFactory.createFont(FONT_BOLD)); + t10.setFontSize(8F); + Paragraph p10 = new Paragraph(t10); + doc.add(p10); + + Text t011 = new Text( + "Maschinell erstelltes, gesichertes Protokoll, daher ist dieses auch ohne Unterschrift gültig." + ); + t011.setFont(PdfFontFactory.createFont(FONT_BOLD)); + t011.setFontSize(8F); + Paragraph p011 = new Paragraph(t011); + doc.add(p011); + + Text t012 = new Text( + "Prüfbericht erstellt von: " + personController.getActiveUser().getLastname() +", " + personController.getActiveUser().getFirstname() + ); + + t012.setFont(PdfFontFactory.createFont(FONT_BOLD)); + t012.setFontSize(8F); + Paragraph p012 = new Paragraph(t012); + doc.add(p012); + } + + private void addBegriffserklaerung(Document doc) throws IOException { + String header = " \nBegriffserklärung"; + Text text = new Text(header); + text.setFont(PdfFontFactory.createFont(FONT_BOLD)); + text.setFontSize(12F); + Paragraph p = new Paragraph(text); + + doc.add(p); + + String espe = "Electro Sensitive Protective Equipment - Geräte oder Systeme, die zur sicherheitsbezogenen Erkennung von " + + "Personen oder Körperteilen eingesetzt werden. Unter dem Oberbegriff ESPE werden alle berührungslos " + + "wirkenden Sensorprinzipien wie z.B. AOPD und AOPDDR zusammengefasst."; + createHeaderPara("ESPE/BWS:", espe, doc); + + String aopd = "Electro Sensitive Protective Equipment - Geräte oder Systeme, die zur sicherheitsbezogenen Erkennung von " + + "Personen oder Körperteilen eingesetzt werden. Unter dem Oberbegriff ESPE werden alle berührungslos " + + "wirkenden Sensorprinzipien wie z.B. AOPD und AOPDDR zusammengefasst."; + createHeaderPara("AOPD:", aopd, doc); + + String ddr = "AOPD responsive to Diffuse Reflection - Sicherheits-Laserscanner, die in einem durch zwei Dimensionen " + + "festgelegten Schutzfeld Objekte detektieren können."; + createHeaderPara("AOPDDR/LASERSCANNER:", ddr, doc); + + String wieder = "Eine Einrichtung zur Verhinderung eines automatischen Wiederanlaufs einer Maschine nach Unterbrechen " + + "und Wiederfreigabe des Schutzfeldes während eines gefährlichen Teils des Maschinenzyklus, " + + "bzw. nach einer Änderung der Betriebsart oder der Betätigungsart der Maschine."; + createHeaderPara("WIEDERANLAUFSPERRE/QUITTIERUNG/RESET:", wieder, doc); + + String edm = "External Device Monitoring - Schaltkreis eines Sicherheitsbausteins zur Überwachung der extern " + + "angeschlossenen Relais/Schütze mit zwangsgeführten Kontakten. Über die Öffnerkontakte " + + "der Relais/Schütze wird überwacht, ob die Relais/Schütze vor deren erneuten Ansteuerung " + + "ihren sicheren Zustand eingenommen haben."; + createHeaderPara("EDM:", edm, doc); + + String ftf = "Fahrerloses Transportfahrzeug - bezeichnet ein fahrerloses Flurförderzeug im Sinne der DIN EN ISO 3691-4:2020-11"; + createHeaderPara("FTF:", ftf, doc); + + String cro = "Sicherheitsabstand hinsichtlich der Reichweite beim Hindurchreichen/ Hinüberreichen durch/über ein " + + "vertikales Schutzfeld zum Erreichen der Gefährdung."; + createHeaderPara("CRO/CRT – DDO, DDT, DDU:", cro, doc); + } + + private ListItem createListItem(String symbol, String text) throws IOException { + Text tsymbol = new Text(symbol); + tsymbol.setFont(PdfFontFactory.createFont(FONT_BOLD)); + tsymbol.setFontSize(8F); + ListItem listitem = new ListItem(text); + listitem.setListSymbol(tsymbol); + + return listitem; + } + + private void createHeaderPara(String header, String content, Document doc) throws IOException { + Text text = new Text(header + '\n'); + text.setFont(PdfFontFactory.createFont(FONT_BOLD)); + text.setFontSize(8F); + Paragraph ph = new Paragraph(text); + + Text tC = new Text(content); + tC.setFont(PdfFontFactory.createFont(FONT_NORMAL)); + tC.setFontSize(8F); + ph.add(tC); + //Paragraph p6 = new Paragraph(tC); + + doc.add(ph); + //doc.add(p6); + } + + private void createNextPageHeader(Document doc) { + nextPagesCompanyLogo.scale(0.05F, 0.05F); + nextPagesCompanyLogo.setMarginTop(-10F); + nextPagesCompanyLogo.setMarginLeft(285F); + + doc.add(nextPagesCompanyLogo); + } +} diff --git a/java/mss-failsafe/src/main/java/converter/QuestionnaireConverter.java b/java/mss-failsafe/src/main/java/converter/QuestionnaireConverter.java new file mode 100755 index 0000000..1792200 --- /dev/null +++ b/java/mss-failsafe/src/main/java/converter/QuestionnaireConverter.java @@ -0,0 +1,46 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package converter; + +import business.questions.QuestionaireManager; +import javax.ejb.EJB; +import javax.faces.component.UIComponent; +import javax.faces.context.FacesContext; +import javax.faces.convert.Converter; +import javax.faces.convert.FacesConverter; +import model.question.Questionaire; + +/** + * + * @author pplate + */ +@FacesConverter(value = "questionnaireConverter", managed = true) +public class QuestionnaireConverter implements Converter { + + @EJB + private QuestionaireManager questionaireManager; + + @Override + public Questionaire getAsObject(FacesContext context, UIComponent component, String value) { + if (value == null || value.trim().isEmpty()) { + return null; + } + + try { + Long id = Long.valueOf(value); + return questionaireManager.find(id); + } catch (NumberFormatException e) { + return null; + } + } + + @Override + public String getAsString(FacesContext context, UIComponent component, Questionaire value) { + if (value == null || value.getId() == null) { + return ""; + } + return value.getId().toString(); + } +} diff --git a/java/mss-failsafe/src/main/java/converter/SeDeCoConverter.java b/java/mss-failsafe/src/main/java/converter/SeDeCoConverter.java new file mode 100755 index 0000000..6f54488 --- /dev/null +++ b/java/mss-failsafe/src/main/java/converter/SeDeCoConverter.java @@ -0,0 +1,42 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package converter; + +import controller.machine.SecurityDeviceCompanyController; +import javax.el.ValueExpression; +import javax.faces.component.UIComponent; +import javax.faces.context.FacesContext; +import javax.faces.convert.Converter; +import javax.faces.convert.FacesConverter; +import model.security.SecurityDeviceCompany; + +/** + * + * @author pplate + */ +@FacesConverter(value = "seDeCoConverter") +public class SeDeCoConverter implements Converter { + @Override + public Object getAsObject(FacesContext ctx, UIComponent uiComponent, String beerId) { + ValueExpression vex = + ctx.getApplication().getExpressionFactory() + .createValueExpression(ctx.getELContext(), + "#{securityDeviceCompanyController}", SecurityDeviceCompanyController.class); + + SecurityDeviceCompanyController controller = (SecurityDeviceCompanyController)vex.getValue(ctx.getELContext()); + if (beerId == null) { + return null; + } + return controller.getCompany(Long.valueOf(beerId)); + } + + @Override + public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object securityDeviceCompany) { + if (securityDeviceCompany == null) { + return ""; + } + return ((SecurityDeviceCompany)securityDeviceCompany).getId().toString(); + } +} diff --git a/java/mss-failsafe/src/main/java/converter/SeDeConverter.java b/java/mss-failsafe/src/main/java/converter/SeDeConverter.java new file mode 100755 index 0000000..845b435 --- /dev/null +++ b/java/mss-failsafe/src/main/java/converter/SeDeConverter.java @@ -0,0 +1,42 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package converter; + +import controller.machine.SecurityDeviceController; +import model.security.SecurityDevice; +import javax.el.ValueExpression; +import javax.faces.component.UIComponent; +import javax.faces.context.FacesContext; +import javax.faces.convert.Converter; +import javax.faces.convert.FacesConverter; + +/** + * + * @author pplate + */ +@FacesConverter(value = "seDeConverter") +public class SeDeConverter implements Converter { + @Override + public Object getAsObject(FacesContext ctx, UIComponent uiComponent, String beerId) { + ValueExpression vex = + ctx.getApplication().getExpressionFactory() + .createValueExpression(ctx.getELContext(), + "#{securityDeviceController}", SecurityDeviceController.class); + + SecurityDeviceController controller = (SecurityDeviceController)vex.getValue(ctx.getELContext()); + if (beerId == null) { + return null; + } + return controller.getDevice(Long.valueOf(beerId)); + } + + @Override + public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object securityDevice) { + if (securityDevice == null) { + return ""; + } + return ((SecurityDevice)securityDevice).getId().toString(); + } +} diff --git a/java/mss-failsafe/mss/src/main/java/exception/AbstractBusinessException.java b/java/mss-failsafe/src/main/java/exception/AbstractBusinessException.java old mode 100644 new mode 100755 similarity index 100% rename from java/mss-failsafe/mss/src/main/java/exception/AbstractBusinessException.java rename to java/mss-failsafe/src/main/java/exception/AbstractBusinessException.java diff --git a/java/mss-failsafe/mss/src/main/java/exception/InvalidCredentialException.java b/java/mss-failsafe/src/main/java/exception/InvalidCredentialException.java old mode 100644 new mode 100755 similarity index 100% rename from java/mss-failsafe/mss/src/main/java/exception/InvalidCredentialException.java rename to java/mss-failsafe/src/main/java/exception/InvalidCredentialException.java diff --git a/java/mss-failsafe/mss/src/main/java/exception/InvalidEmailException.java b/java/mss-failsafe/src/main/java/exception/InvalidEmailException.java old mode 100644 new mode 100755 similarity index 100% rename from java/mss-failsafe/mss/src/main/java/exception/InvalidEmailException.java rename to java/mss-failsafe/src/main/java/exception/InvalidEmailException.java diff --git a/java/mss-failsafe/mss/src/main/java/exception/InvalidPasswordException.java b/java/mss-failsafe/src/main/java/exception/InvalidPasswordException.java old mode 100644 new mode 100755 similarity index 100% rename from java/mss-failsafe/mss/src/main/java/exception/InvalidPasswordException.java rename to java/mss-failsafe/src/main/java/exception/InvalidPasswordException.java diff --git a/java/mss-failsafe/mss/src/main/java/exception/PersonInaktiveException.java b/java/mss-failsafe/src/main/java/exception/PersonInaktiveException.java old mode 100644 new mode 100755 similarity index 100% rename from java/mss-failsafe/mss/src/main/java/exception/PersonInaktiveException.java rename to java/mss-failsafe/src/main/java/exception/PersonInaktiveException.java diff --git a/java/mss-failsafe/userdata/src/main/java/httpauthenticationmechanism/AppIdentityStore.java b/java/mss-failsafe/src/main/java/httpauthenticationmechanism/AppIdentityStore.java old mode 100644 new mode 100755 similarity index 69% rename from java/mss-failsafe/userdata/src/main/java/httpauthenticationmechanism/AppIdentityStore.java rename to java/mss-failsafe/src/main/java/httpauthenticationmechanism/AppIdentityStore.java index 7c4cbb7..28598d7 --- a/java/mss-failsafe/userdata/src/main/java/httpauthenticationmechanism/AppIdentityStore.java +++ b/java/mss-failsafe/src/main/java/httpauthenticationmechanism/AppIdentityStore.java @@ -5,6 +5,8 @@ */ package httpauthenticationmechanism; +import business.ChangeToCLOBManager; +import business.user.DemoManager; import javax.enterprise.context.ApplicationScoped; import javax.security.enterprise.credential.CallerOnlyCredential; import javax.security.enterprise.credential.Credential; @@ -16,11 +18,15 @@ import javax.security.enterprise.identitystore.IdentityStore; import business.user.PersonManager; import exception.InvalidCredentialException; -import exception.PersonInaktiveException; +import java.util.HashSet; +import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; +import javax.annotation.PostConstruct; import javax.ejb.EJB; import model.person.Person; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; /** * @@ -29,18 +35,28 @@ import model.person.Person; @ApplicationScoped public class AppIdentityStore implements IdentityStore { + protected final Logger LOGGER = LogManager.getLogger(this.getClass()); @EJB PersonManager userManager; - + + @EJB + DemoManager demos; + @Override public int priority() { - return 90; + return 1; + } + + @PostConstruct + void init() { + if (userManager.count() < 1) { + demos.runDemos(); + } } @Override public CredentialValidationResult validate(Credential credential) { try { - // check if the credential was UsernamePasswordCredential if (credential instanceof UsernamePasswordCredential) { String username = ((UsernamePasswordCredential) credential).getCaller(); @@ -67,7 +83,7 @@ public class AppIdentityStore implements IdentityStore { private CredentialValidationResult validate(Person person) { Set groups; - + groups = person.getUserGroups().stream() .map(gr -> gr.toString()) .collect(Collectors.toSet()); @@ -75,4 +91,20 @@ public class AppIdentityStore implements IdentityStore { return new CredentialValidationResult(person.getEmail(), groups); } + @Override + public Set getCallerGroups(CredentialValidationResult validationResult) { + Optional person = userManager.getByEmail(validationResult.getCallerPrincipal().getName()); + + if (person.isEmpty()) { + return new HashSet<>(); + } + + Set stringGroups = person.get() + .getUserGroups() + .stream() + .map(gr -> gr.toString()) + .collect(Collectors.toSet()); + + return stringGroups; + } } diff --git a/java/mss-failsafe/mss/src/main/java/httpauthenticationmechanism/AppRememberMeIdentityStore.java b/java/mss-failsafe/src/main/java/httpauthenticationmechanism/AppRememberMeIdentityStore.java old mode 100644 new mode 100755 similarity index 100% rename from java/mss-failsafe/mss/src/main/java/httpauthenticationmechanism/AppRememberMeIdentityStore.java rename to java/mss-failsafe/src/main/java/httpauthenticationmechanism/AppRememberMeIdentityStore.java diff --git a/java/mss-failsafe/src/main/java/httpauthenticationmechanism/ApplicationConfig.java b/java/mss-failsafe/src/main/java/httpauthenticationmechanism/ApplicationConfig.java new file mode 100755 index 0000000..3d19a46 --- /dev/null +++ b/java/mss-failsafe/src/main/java/httpauthenticationmechanism/ApplicationConfig.java @@ -0,0 +1,20 @@ +package httpauthenticationmechanism; + +import javax.enterprise.context.ApplicationScoped; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * + * @author Patrick + */ +@ApplicationScoped +public class ApplicationConfig { + + final static Logger LOGGER = LogManager.getLogger(ApplicationConfig.class); + + public ApplicationConfig() { + } + + +} diff --git a/java/mss-failsafe/userManagement/src/main/java/httpauthenticationmechanism/ApplicationConfig.java b/java/mss-failsafe/src/main/java/httpauthenticationmechanism/CustomAuthenticationMechanism.java old mode 100644 new mode 100755 similarity index 70% rename from java/mss-failsafe/userManagement/src/main/java/httpauthenticationmechanism/ApplicationConfig.java rename to java/mss-failsafe/src/main/java/httpauthenticationmechanism/CustomAuthenticationMechanism.java index 0e03486..5d3ae75 --- a/java/mss-failsafe/userManagement/src/main/java/httpauthenticationmechanism/ApplicationConfig.java +++ b/java/mss-failsafe/src/main/java/httpauthenticationmechanism/CustomAuthenticationMechanism.java @@ -1,14 +1,9 @@ package httpauthenticationmechanism; -import business.user.PersonManager; -import javax.annotation.PostConstruct; -import javax.ejb.EJB; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; -import javax.inject.Named; import javax.security.enterprise.AuthenticationStatus; import javax.security.enterprise.authentication.mechanism.http.AutoApplySession; -import javax.security.enterprise.authentication.mechanism.http.CustomFormAuthenticationMechanismDefinition; import javax.security.enterprise.authentication.mechanism.http.HttpAuthenticationMechanism; import javax.security.enterprise.authentication.mechanism.http.HttpMessageContext; import javax.security.enterprise.authentication.mechanism.http.LoginToContinue; @@ -20,7 +15,6 @@ import javax.servlet.http.HttpServletResponse; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; - /** * * @author Patrick @@ -32,52 +26,35 @@ import org.apache.logging.log4j.Logger; isRememberMeExpression = "#{self.isRememberMe(httpMessageContext)}" ) @LoginToContinue( - loginPage = "/index.xhtml", - errorPage = "/error.xhtml", - useForwardToLogin = true -) + loginPage = "/index.xhtml", + errorPage = "/error.xhtml", + useForwardToLogin = true) @ApplicationScoped -public class ApplicationConfig implements HttpAuthenticationMechanism{ +public class CustomAuthenticationMechanism implements HttpAuthenticationMechanism { - final static Logger LOGGER = LogManager.getLogger(ApplicationConfig.class); + final static Logger LOGGER = LogManager.getLogger(CustomAuthenticationMechanism.class); - public ApplicationConfig() { + public CustomAuthenticationMechanism() { } - + @Inject private IdentityStore identityStore; - - @Inject - private ManagedPerson managedPerson; - - @EJB - private PersonManager personManager; - @PostConstruct - private void init(){ - managedPerson.getLogins(); - personManager.demo(); - - System.out.println("PostConstruct DEMO"); - } - @Override public AuthenticationStatus validateRequest(HttpServletRequest req, HttpServletResponse res, HttpMessageContext context) { - Credential credential = context.getAuthParameters().getCredential(); - if (credential != null) { return context.notifyContainerAboutLogin(this.identityStore.validate(credential)); } else { return context.doNothing(); } } - + // this was called on @RememberMe annotations public Boolean isRememberMe(HttpMessageContext httpMessageContext) { return httpMessageContext.getAuthParameters().isRememberMe(); } - + @Override public void cleanSubject(HttpServletRequest request, HttpServletResponse response, HttpMessageContext httpMessageContext) { HttpAuthenticationMechanism.super.cleanSubject(request, response, httpMessageContext); diff --git a/java/mss-failsafe/mss/src/main/java/httpauthenticationmechanism/LogoutListener.java b/java/mss-failsafe/src/main/java/httpauthenticationmechanism/LogoutListener.java old mode 100644 new mode 100755 similarity index 80% rename from java/mss-failsafe/mss/src/main/java/httpauthenticationmechanism/LogoutListener.java rename to java/mss-failsafe/src/main/java/httpauthenticationmechanism/LogoutListener.java index 088d77e..669ea74 --- a/java/mss-failsafe/mss/src/main/java/httpauthenticationmechanism/LogoutListener.java +++ b/java/mss-failsafe/src/main/java/httpauthenticationmechanism/LogoutListener.java @@ -12,6 +12,8 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import controller.person.PersonController; +import javax.faces.context.FacesContext; +import javax.servlet.http.HttpServletResponse; /** @@ -37,4 +39,8 @@ public class LogoutListener implements HttpSessionListener{ userManager.getLogins().remove(username); } } + + private static HttpServletResponse getResponse(FacesContext context) { + return (HttpServletResponse) context.getExternalContext().getResponse(); + } } diff --git a/java/mss-failsafe/src/main/java/httpauthenticationmechanism/ManagedPerson.java b/java/mss-failsafe/src/main/java/httpauthenticationmechanism/ManagedPerson.java new file mode 100755 index 0000000..bb3c71c --- /dev/null +++ b/java/mss-failsafe/src/main/java/httpauthenticationmechanism/ManagedPerson.java @@ -0,0 +1,77 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package httpauthenticationmechanism; + +import controller.person.PersonController; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Random; +import java.util.Set; +import static java.util.UUID.randomUUID; +import javax.inject.Named; +import javax.enterprise.context.ApplicationScoped; + +/** + * + * @author Patrick + */ +@Named(value = "managedPerson") +@ApplicationScoped +public class ManagedPerson { + + private Set logins; + private Map loggedInController; + + /** + * Creates a new instance of ManagedCustomer + */ + public ManagedPerson() { + } + + public Set getLogins(){ + if (this.logins == null) { + this.logins = new HashSet<>(); + } + + return this.logins; + } + + public Map getControllers() { + if (loggedInController == null) { + this.loggedInController = new HashMap<>(); + } + + return loggedInController; + } + + public boolean isLoggedIn(String user) { + return logins == null || logins.contains(user); + } + + public void addLogin(String user){ + getLogins().add(user); + } + + public void removeLogin(String user){ + getLogins().remove(user); + } + + public String addController(PersonController ctlr){ + String id = randomUUID().toString(); + while(getControllers().containsKey(id)){ + id = randomUUID().toString(); + } + + getControllers().put(id, ctlr); + return id; + } + + public void removeController(String id){ + getControllers().remove(id); + } + +} diff --git a/java/mss-failsafe/mss/src/main/java/model/AbstractEntity.java b/java/mss-failsafe/src/main/java/model/AbstractEntity.java old mode 100644 new mode 100755 similarity index 100% rename from java/mss-failsafe/mss/src/main/java/model/AbstractEntity.java rename to java/mss-failsafe/src/main/java/model/AbstractEntity.java diff --git a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/adresses/Address.java b/java/mss-failsafe/src/main/java/model/adresses/Address.java old mode 100644 new mode 100755 similarity index 86% rename from java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/adresses/Address.java rename to java/mss-failsafe/src/main/java/model/adresses/Address.java index 1e5443c..a5b13da --- a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/adresses/Address.java +++ b/java/mss-failsafe/src/main/java/model/adresses/Address.java @@ -1,7 +1,10 @@ package model.adresses; import java.util.Objects; +import javax.persistence.Column; +import javax.persistence.Lob; import javax.persistence.MappedSuperclass; +import javax.persistence.PostLoad; import javax.validation.constraints.NotNull; import model.AbstractEntity; @@ -43,6 +46,10 @@ public class Address extends AbstractEntity{ private String comment; + @Lob + @Column(columnDefinition = "CLOB") + private String comment2; + public Address() { } @@ -74,7 +81,7 @@ public class Address extends AbstractEntity{ this.county = county; this.place = place; this.contact = contact; - this.comment = comment; + this.comment2 = comment; } public Address(Address toCopyAddress){ @@ -86,7 +93,7 @@ public class Address extends AbstractEntity{ this.county = toCopyAddress.getCounty(); this.place = toCopyAddress.getPlace(); this.contact = toCopyAddress.getContact(); - this.comment = toCopyAddress.getComment(); + this.comment2 = toCopyAddress.getComment(); } @Override @@ -140,6 +147,13 @@ public class Address extends AbstractEntity{ return Objects.equals(this.postnumber, other.postnumber); } + @PostLoad + private void switchToClobComment(){ + if (comment != null && comment2 == null) { + comment2 = comment; + } + } + public String getStreet() { return street; } @@ -205,10 +219,15 @@ public class Address extends AbstractEntity{ } public String getComment() { - return comment; + return comment2; } public void setComment(String comment) { - this.comment = comment; + if (comment != null && comment.length() > 256) { + comment2 = comment; + } else { + this.comment2 = comment; + this.comment = comment; + } } } diff --git a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/adresses/CompanyBillingAddress.java b/java/mss-failsafe/src/main/java/model/adresses/CompanyAddress.java old mode 100644 new mode 100755 similarity index 51% rename from java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/adresses/CompanyBillingAddress.java rename to java/mss-failsafe/src/main/java/model/adresses/CompanyAddress.java index e5829bc..50081ef --- a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/adresses/CompanyBillingAddress.java +++ b/java/mss-failsafe/src/main/java/model/adresses/CompanyAddress.java @@ -14,24 +14,20 @@ import model.company.Company; * @author Patrick */ @Entity -public class CompanyBillingAddress extends Address{ +public class CompanyAddress extends Address{ @ManyToOne private Company company; - - private boolean delivery; - public CompanyBillingAddress() { + public CompanyAddress() { } - public CompanyBillingAddress(Company company, boolean delivery) { + public CompanyAddress(Company company) { this.company = company; - this.delivery = delivery; } - public CompanyBillingAddress(Company company, boolean delivery,String country, String street, String number, String extra, Integer postnumber, String county, String place) { - super(country, street, number, extra, postnumber, county, place); + public CompanyAddress(Company company, String country, String street, String number, String extra, Integer postnumber, String county, String place, String contact, String comment) { + super(country, street, number, extra, postnumber, county, place, contact, comment); this.company = company; - this.delivery = delivery; } public Company getCompany() { @@ -41,12 +37,4 @@ public class CompanyBillingAddress extends Address{ public void setCompany(Company company) { this.company = company; } - - public boolean isDelivery() { - return delivery; - } - - public void setDelivery(boolean delivery) { - this.delivery = delivery; - } } diff --git a/java/mss-failsafe/mss/src/main/java/model/adresses/CompanyBillingAddress.java b/java/mss-failsafe/src/main/java/model/adresses/CompanyBillingAddress.java old mode 100644 new mode 100755 similarity index 100% rename from java/mss-failsafe/mss/src/main/java/model/adresses/CompanyBillingAddress.java rename to java/mss-failsafe/src/main/java/model/adresses/CompanyBillingAddress.java diff --git a/java/mss-failsafe/mss/src/main/java/model/adresses/LocationAddress.java b/java/mss-failsafe/src/main/java/model/adresses/LocationAddress.java old mode 100644 new mode 100755 similarity index 100% rename from java/mss-failsafe/mss/src/main/java/model/adresses/LocationAddress.java rename to java/mss-failsafe/src/main/java/model/adresses/LocationAddress.java diff --git a/java/mss-failsafe/mss/src/main/java/model/company/Company.java b/java/mss-failsafe/src/main/java/model/company/Company.java old mode 100644 new mode 100755 similarity index 62% rename from java/mss-failsafe/mss/src/main/java/model/company/Company.java rename to java/mss-failsafe/src/main/java/model/company/Company.java index 8c968d3..58cdc7b --- a/java/mss-failsafe/mss/src/main/java/model/company/Company.java +++ b/java/mss-failsafe/src/main/java/model/company/Company.java @@ -5,16 +5,13 @@ */ package model.company; +import java.util.HashSet; import java.util.List; import java.util.Set; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.OneToMany; +import javax.persistence.*; +import javax.validation.constraints.Size; import model.AbstractEntity; -import model.adresses.CompanyBillingAddress; +import model.adresses.CompanyAddress; import model.customer.Customer; import model.ticket.Ticket; @@ -23,8 +20,11 @@ import model.ticket.Ticket; * @author patri */ @Entity +@NamedQueries( + @NamedQuery(name = Company.FIND_BY_NAME, query = "SELECT c FROM Company c WHERE c.name = :name") +) public class Company extends AbstractEntity { - + public static final String FIND_BY_NAME = "Company.findByName"; public static final String FIND_BY_STEUERID = "Company.findBySteuerID"; public static final String FIND_BY_UMSATZSTEUERID = "Company.findByUmsatzsteuerID"; @@ -36,12 +36,14 @@ public class Company extends AbstractEntity { private String name; @Column(unique = true, nullable = true) + @Size(min = 0, max = 255) private String steuerNr; @Column(unique = true, nullable = true) + @Size(min = 0, max = 255) private String umsatzSteuerID; - @Column(unique = true, nullable = true) + @Column(unique = true, nullable = true) private String kundenNr; @Column(unique = false, nullable = true) @@ -53,25 +55,73 @@ public class Company extends AbstractEntity { @Column(unique = false, nullable = false) @Enumerated(EnumType.ORDINAL) private Status status; + + @Column(unique = false, nullable = true, length = 210) + private String comment; - @OneToMany(mappedBy = "company", cascade = CascadeType.ALL) - private Set addresses; + @OneToMany(mappedBy = "company", cascade = {CascadeType.ALL, CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}) + private Set addresses; - @OneToMany(mappedBy = "company", cascade = CascadeType.ALL) + @OneToMany(mappedBy = "company", cascade = {CascadeType.ALL, CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}) + @OrderBy("name ASC") private Set locations; @OneToMany(mappedBy = "company", cascade = { + CascadeType.PERSIST, CascadeType.MERGE, - CascadeType.REFRESH + CascadeType.REFRESH, }) private Set customers; @OneToMany(mappedBy = "company") private List tickets; + @OneToOne(cascade = CascadeType.ALL) + private CompanyLogo companyLogo; + public Company() { } + public CompanyLogo getCompanyLogo() { + return companyLogo; + } + + public void setCompanyLogo(CompanyLogo companyLogo) { + this.companyLogo = companyLogo; + } + + public void addCustomer(Customer customer){ + if (customers == null) { + customers = new HashSet<>(); + } + + if (customer == null) { + return; + } + + customers.add(customer); + } + + public void addLocation(Location location){ + if (locations == null) { + locations = new HashSet<>(); + } + + if (location == null) { + return; + } + + locations.add(location); + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + public String getName() { return name; } @@ -128,11 +178,11 @@ public class Company extends AbstractEntity { this.status = status; } - public Set getAddresses() { + public Set getAddresses() { return addresses; } - public void setAddresses(Set addresses) { + public void setAddresses(Set addresses) { this.addresses = addresses; } diff --git a/java/mss-failsafe/src/main/java/model/company/CompanyLogo.java b/java/mss-failsafe/src/main/java/model/company/CompanyLogo.java new file mode 100755 index 0000000..cbf82e4 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/company/CompanyLogo.java @@ -0,0 +1,61 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package model.company; + +import java.util.Arrays; +import java.util.List; +import javax.persistence.Entity; +import javax.persistence.OneToOne; +import model.files.FileDB; +import model.files.Mime; + +/** + * + * @author pplate + */ +@Entity +public class CompanyLogo extends FileDB { + private static final List ALLOWED_FILE_TYPES = Arrays.asList(Mime.JPEG, Mime.JPG, Mime.PNG, Mime.BMP, Mime.PNG); + private static final long SIZE_LIMIT = 2000000L; + + @OneToOne + private Company company; + + public CompanyLogo() { + } + + public static String getAllowedTypesRE(){ + StringBuilder output = new StringBuilder(ALLOWED_FILE_TYPES.size() * 4); + + output.append("/(\\.|\\/)("); + + for(int i = 0; i < ALLOWED_FILE_TYPES.size(); i++){ + output.append(ALLOWED_FILE_TYPES.get(i).getExtension()); + if (i < ALLOWED_FILE_TYPES.size() -1) { + output.append('|'); + } + } + + output.append(")$/"); + + return output.toString(); + } + + public static List getALLOWED_FILE_TYPES() { + return ALLOWED_FILE_TYPES; + } + + public static long getSIZE_LIMIT() { + return SIZE_LIMIT; + } + + public Company getCompany() { + return company; + } + + public void setCompany(Company company) { + this.company = company; + } +} diff --git a/java/mss-failsafe/src/main/java/model/company/Location.java b/java/mss-failsafe/src/main/java/model/company/Location.java new file mode 100755 index 0000000..4db48b7 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/company/Location.java @@ -0,0 +1,121 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package model.company; + +import java.util.ArrayList; +import java.util.List; +import javax.persistence.*; + +import model.AbstractEntity; +import model.machine.Machine; +/** + * + * @author patri + */ +@Entity +public class Location extends AbstractEntity{ + + @ManyToOne + private Company company; + + private String name; + + private String kostenstelle; + + private String comment; + + @Lob + @Column(columnDefinition = "CLOB") + private String comment2; + + @OneToMany(mappedBy = "location", fetch = FetchType.EAGER, cascade = CascadeType.ALL) + @OrderBy("name ASC") + private List machines; + + public Location() { + } + + public Location(Company company, String name, String kostenstelle, List machines, String comment) { + this.company = company; + this.name = name; + this.kostenstelle = kostenstelle; + this.machines = machines; + this.comment2 = comment; + } + + public Location(Location location) { + this.company = location.getCompany(); + this.name = location.getName(); + this.kostenstelle = location.getKostenstelle(); + this.machines = location.getMachines(); + this.comment2 = location.getComment(); + } + + @PostLoad + private void switchToClobComment(){ + if (comment != null && comment2 == null) { + comment2 = comment; + } + } + + @Override + public String toString() { + return name; + } + + public String getComment() { + return comment2; + } + + public void setComment(String comment) { + if (comment != null && comment.length() > 256) { + comment2 = comment; + } else { + this.comment2 = comment; + this.comment = comment; + } + } + + public Company getCompany() { + return company; + } + + public void setCompany(Company company) { + this.company = company; + } + + public List getMachines() { + return machines; + } + + public void setMachines(List machines) { + this.machines = machines; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getKostenstelle() { + return kostenstelle; + } + + public void setKostenstelle(String kostenstelle) { + this.kostenstelle = kostenstelle; + } + + public void addMachine(Machine mac) { + if (this.machines == null) { + this.machines = new ArrayList<>(); + } + + machines.add(mac); + } +} diff --git a/java/mss-failsafe/mss/src/main/java/model/company/Status.java b/java/mss-failsafe/src/main/java/model/company/Status.java old mode 100644 new mode 100755 similarity index 100% rename from java/mss-failsafe/mss/src/main/java/model/company/Status.java rename to java/mss-failsafe/src/main/java/model/company/Status.java diff --git a/java/mss-failsafe/src/main/java/model/customer/Customer.java b/java/mss-failsafe/src/main/java/model/customer/Customer.java new file mode 100755 index 0000000..59ef249 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/customer/Customer.java @@ -0,0 +1,109 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package model.customer; + +import java.util.HashSet; +import java.util.Set; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.ManyToOne; +import javax.persistence.NamedQueries; +import javax.persistence.NamedQuery; +import model.person.Person; +import model.company.Company; +import model.person.Salt; +import model.person.enums.UserGroup; + +/** + * + * @author patri + */ +@Entity +@NamedQueries({ + @NamedQuery(name = Customer.GET_BY_EMAIL, query = "SELECT c FROM Customer c WHERE c.email = :email") +}) +public class Customer extends Person{ + + public static final String GET_BY_EMAIL = "Customer.getByEmail"; + + @ManyToOne + private Company company; + + @Column(nullable = true, length = 210) + private String note; + + private String devision; + + public Customer() { + addGroup(UserGroup.CUSTOMER); + } + + public Customer(String email, byte[] password, Salt salt, Set usergroups) { + super(email, password, salt, usergroups); + } + + public String getDevision() { + return devision; + } + + public void setDevision(String devision) { + this.devision = devision; + } + + public Customer(Company company) { + this.company = company; + } + + public Company getCompany() { + return company; + } + + public void setCompany(Company company) { + this.company = company; + } + + public String getNote() { + return note; + } + + public void setNote(String note) { + this.note = note; + } + + /** + * + * @return + * @throws CloneNotSupportedException + */ + @Override + public Customer clone() throws CloneNotSupportedException { + Customer clone = new Customer(); + + clone.setActive(this.isActive()); + clone.setCall(this.getCall()); + clone.setDevision(this.getDevision()); + clone.setChangedDate(this.getChangedDate()); + clone.setCompany(this.getCompany()); + clone.setCreationDate(this.getCreationDate()); + clone.setEmail(this.getEmail()); + clone.setFax(this.getFax()); + clone.setFirstname(this.getFirstname()); + clone.setId(this.getId()); + clone.setLastname(this.getLastname()); + clone.setMobile(this.getMobile()); + clone.setNote(this.getNote()); + clone.setOutdated(false); + clone.setPassword(this.getPassword()); + clone.setSalt(this.getSalt()); + clone.setTelefon(this.getTelefon()); + clone.setTitle(this.getTitle()); + clone.setTokens(this.getTokens()); + clone.setUserGroups(this.getUserGroups()); + clone.setUserPicture(this.getUserPicture()); + + return clone; + } +} diff --git a/java/mss-failsafe/mss/src/main/java/model/files/FileDB.java b/java/mss-failsafe/src/main/java/model/files/FileDB.java old mode 100644 new mode 100755 similarity index 100% rename from java/mss-failsafe/mss/src/main/java/model/files/FileDB.java rename to java/mss-failsafe/src/main/java/model/files/FileDB.java diff --git a/java/mss-failsafe/mss/src/main/java/model/files/Invoice.java b/java/mss-failsafe/src/main/java/model/files/Invoice.java old mode 100644 new mode 100755 similarity index 100% rename from java/mss-failsafe/mss/src/main/java/model/files/Invoice.java rename to java/mss-failsafe/src/main/java/model/files/Invoice.java diff --git a/java/mss-failsafe/mss/src/main/java/model/files/Mime.java b/java/mss-failsafe/src/main/java/model/files/Mime.java old mode 100644 new mode 100755 similarity index 100% rename from java/mss-failsafe/mss/src/main/java/model/files/Mime.java rename to java/mss-failsafe/src/main/java/model/files/Mime.java diff --git a/java/mss-failsafe/mss/src/main/java/model/files/Report.java b/java/mss-failsafe/src/main/java/model/files/Report.java old mode 100644 new mode 100755 similarity index 100% rename from java/mss-failsafe/mss/src/main/java/model/files/Report.java rename to java/mss-failsafe/src/main/java/model/files/Report.java diff --git a/java/mss-failsafe/mss/src/main/java/model/files/UserPicture.java b/java/mss-failsafe/src/main/java/model/files/UserPicture.java old mode 100644 new mode 100755 similarity index 100% rename from java/mss-failsafe/mss/src/main/java/model/files/UserPicture.java rename to java/mss-failsafe/src/main/java/model/files/UserPicture.java diff --git a/java/mss-failsafe/src/main/java/model/machine/Contact.java b/java/mss-failsafe/src/main/java/model/machine/Contact.java new file mode 100755 index 0000000..6879240 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/machine/Contact.java @@ -0,0 +1,121 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package model.machine; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.ManyToOne; +import model.AbstractEntity; +import model.person.enums.Call; + +/** + * + * @author pplate + */ +@Entity +public class Contact extends AbstractEntity{ + + @ManyToOne + private Manufacturer manufacturer; + + @Enumerated(EnumType.STRING) + @Column(name = "Anrede") + private Call call; + private String firstname; + private String lastname; + private String email; + private String phoneNr; + private String mobileNr; + private String faxNr; + private String title; + private String comment; + + public Contact() { + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public Manufacturer getManufacturer() { + return manufacturer; + } + + public Call getCall() { + return call; + } + + public void setCall(Call call) { + this.call = call; + } + + public void setManufacturer(Manufacturer manufacturer) { + this.manufacturer = manufacturer; + } + + public String getFirstname() { + return firstname; + } + + public void setFirstname(String firstname) { + this.firstname = firstname; + } + + public String getLastname() { + return lastname; + } + + public void setLastname(String lastname) { + this.lastname = lastname; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPhoneNr() { + return phoneNr; + } + + public void setPhoneNr(String phoneNr) { + this.phoneNr = phoneNr; + } + + public String getMobileNr() { + return mobileNr; + } + + public void setMobileNr(String mobileNr) { + this.mobileNr = mobileNr; + } + + public String getFaxNr() { + return faxNr; + } + + public void setFaxNr(String faxNr) { + this.faxNr = faxNr; + } + + +} diff --git a/java/mss-failsafe/src/main/java/model/machine/Inspection.java b/java/mss-failsafe/src/main/java/model/machine/Inspection.java new file mode 100755 index 0000000..ba1672a --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/machine/Inspection.java @@ -0,0 +1,268 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package model.machine; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.ManyToOne; +import model.AbstractEntity; +import model.machine.enums.Option; + +/** + * + * @author patri + */ +@Entity +public class Inspection extends AbstractEntity { + @ManyToOne + private Machine machine; + + @Column(length = 1000) + private String comment; + + @Column(length = 1000) + private String dangerAreaDescription; + + @Enumerated(EnumType.ORDINAL) + private Option inspectionBadge; + + @Enumerated(EnumType.ORDINAL) + private Option edm; + + @Enumerated(EnumType.ORDINAL) + private Option outputESPE; + + @Enumerated(EnumType.ORDINAL) + private Option viewable; + + @Enumerated(EnumType.ORDINAL) + private Option commandDevice; + + @Enumerated(EnumType.ORDINAL) + private Option res; + + @Enumerated(EnumType.ORDINAL) + private Option movementESPE; + + @Enumerated(EnumType.ORDINAL) + private Option shutdownESPE; + + @Enumerated(EnumType.ORDINAL) + private Option normMinimumDistance; + + @Enumerated(EnumType.ORDINAL) + private Option declaratedMinimumDistance; + + @Enumerated(EnumType.ORDINAL) + private Option beamHeights; + + @Enumerated(EnumType.ORDINAL) + private Option testRod; + + @Enumerated(EnumType.ORDINAL) + private Option diameterTestRod; + + @Enumerated(EnumType.ORDINAL) + private Option securedEntry; + + @Enumerated(EnumType.ORDINAL) + private Option grabbingDenied; + + @Enumerated(EnumType.ORDINAL) + private Option attendanceMonitoring; + + @Enumerated(EnumType.ORDINAL) + private Option readableTypeSignsESPE; + + public Inspection() { + } + + public Inspection(Inspection ins) { + this.comment = ins.comment; + this.dangerAreaDescription = ins.dangerAreaDescription; + this.inspectionBadge = ins.inspectionBadge; + this.edm = ins.edm; + this.outputESPE = ins.outputESPE; + this.viewable = ins.viewable; + this.commandDevice = ins.commandDevice; + this.res = ins.res; + this.movementESPE = ins.movementESPE; + this.shutdownESPE = ins.shutdownESPE; + this.normMinimumDistance = ins.normMinimumDistance; + this.declaratedMinimumDistance = ins.declaratedMinimumDistance; + this.beamHeights = ins.beamHeights; + this.testRod = ins.testRod; + this.diameterTestRod = ins.diameterTestRod; + this.securedEntry = ins.securedEntry; + this.grabbingDenied = ins.grabbingDenied; + this.attendanceMonitoring = ins.attendanceMonitoring; + this.readableTypeSignsESPE = ins.readableTypeSignsESPE; + } + + + + public Machine getMachine() { + return machine; + } + + public void setMachine(Machine machine) { + this.machine = machine; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public String getDangerAreaDescription() { + return dangerAreaDescription; + } + + public void setDangerAreaDescription(String dangerAreaDescription) { + this.dangerAreaDescription = dangerAreaDescription; + } + + public Option getInspectionBadge() { + return inspectionBadge; + } + + public void setInspectionBadge(Option inspectionBadge) { + this.inspectionBadge = inspectionBadge; + } + + public Option getEdm() { + return edm; + } + + public void setEdm(Option edm) { + this.edm = edm; + } + + public Option getOutputESPE() { + return outputESPE; + } + + public void setOutputESPE(Option outputESPE) { + this.outputESPE = outputESPE; + } + + public Option getViewable() { + return viewable; + } + + public void setViewable(Option viewable) { + this.viewable = viewable; + } + + public Option getCommandDevice() { + return commandDevice; + } + + public void setCommandDevice(Option commandDevice) { + this.commandDevice = commandDevice; + } + + public Option getRes() { + return res; + } + + public void setRes(Option res) { + this.res = res; + } + + public Option getMovementESPE() { + return movementESPE; + } + + public void setMovementESPE(Option movementESPE) { + this.movementESPE = movementESPE; + } + + public Option getShutdownESPE() { + return shutdownESPE; + } + + public void setShutdownESPE(Option shutdownESPE) { + this.shutdownESPE = shutdownESPE; + } + + public Option getNormMinimumDistance() { + return normMinimumDistance; + } + + public void setNormMinimumDistance(Option normMinimumDistance) { + this.normMinimumDistance = normMinimumDistance; + } + + public Option getDeclaratedMinimumDistance() { + return declaratedMinimumDistance; + } + + public void setDeclaratedMinimumDistance(Option declaratedMinimumDistance) { + this.declaratedMinimumDistance = declaratedMinimumDistance; + } + + public Option getBeamHeights() { + return beamHeights; + } + + public void setBeamHeights(Option beamHeights) { + this.beamHeights = beamHeights; + } + + public Option getTestRod() { + return testRod; + } + + public void setTestRod(Option testRod) { + this.testRod = testRod; + } + + public Option getDiameterTestRod() { + return diameterTestRod; + } + + public void setDiameterTestRod(Option diameterTestRod) { + this.diameterTestRod = diameterTestRod; + } + + public Option getSecuredEntry() { + return securedEntry; + } + + public void setSecuredEntry(Option securedEntry) { + this.securedEntry = securedEntry; + } + + public Option getGrabbingDenied() { + return grabbingDenied; + } + + public void setGrabbingDenied(Option grabbingDenied) { + this.grabbingDenied = grabbingDenied; + } + + public Option getAttendanceMonitoring() { + return attendanceMonitoring; + } + + public void setAttendanceMonitoring(Option attendanceMonitoring) { + this.attendanceMonitoring = attendanceMonitoring; + } + + public Option getReadableTypeSignsESPE() { + return readableTypeSignsESPE; + } + + public void setReadableTypeSignsESPE(Option readableTypeSignsESPE) { + this.readableTypeSignsESPE = readableTypeSignsESPE; + } +} diff --git a/java/mss-failsafe/src/main/java/model/machine/Machine.java b/java/mss-failsafe/src/main/java/model/machine/Machine.java new file mode 100755 index 0000000..208ef98 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/machine/Machine.java @@ -0,0 +1,383 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package model.machine; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import javax.persistence.*; + +import model.AbstractEntity; +import model.company.Location; +import model.machine.enums.MachineStatus; +import model.machine.enums.MachineType; +import model.machine.enums.norms.AOPD_AOPDDR; +import model.machine.enums.norms.ArrayApproach; +import model.machine.enums.norms.ControlParts; +import model.machine.enums.norms.NothaltElectric; +import model.machine.enums.norms.NothaltGestaltung; +import model.machine.enums.norms.NothaltVerriegel; +import model.security.SecurityArea; + +/** + * + * @author patri + */ +@Entity +public class Machine extends AbstractEntity { + + @ManyToOne + private Location location; + + @ManyToOne + private Manufacturer manufacturer; + + @OneToMany(mappedBy = "machine", cascade = CascadeType.ALL, fetch = FetchType.EAGER) + @OrderBy("name ASC") + private List securityArea; + + @OneToMany(mappedBy = "machine", cascade = CascadeType.ALL, fetch = FetchType.LAZY) + private List inspections; + + private String name; + private String indentifier; + private String costCenter; + private String machineNr; + private String modellType; + private String inventarNr; + private Integer buildingYear; + private Integer changeYear; + + @Lob + @Column + private String comment; + + @Lob + @Column(columnDefinition = "CLOB") + private String comment2; + + @ElementCollection + private List relevantNorms; + + @Column(unique = false, nullable = false) + @Enumerated(EnumType.ORDINAL) + private MachineStatus machineStatus; + + @Column(unique = false, nullable = false) + @Enumerated(EnumType.ORDINAL) + private MachineType machineType; + + @Column(unique = false) + @Enumerated(EnumType.ORDINAL) + private ControlParts controlParts; + + @Column(unique = false) + @Enumerated(EnumType.ORDINAL) + private ArrayApproach arrayApproach; + + @Column(unique = false) + @Enumerated(EnumType.ORDINAL) + private AOPD_AOPDDR aopd_aopddr; + + @Enumerated(EnumType.ORDINAL) + private NothaltGestaltung nothaltGestaltung; + + @Enumerated(EnumType.ORDINAL) + private NothaltElectric nothaltElectric; + + @Enumerated(EnumType.ORDINAL) + private NothaltVerriegel nothaltVerriegel; + + //Neues Feld, der Herr möchte mehrere auswählen können + /* + @ElementCollection + @Enumerated(EnumType.ORDINAL) + @CollectionTable(name = "NOTHALTGESTALTUNGEN") + @Column(name = "NOTHALTGESTALTUNGEN") + private Set nothaltGestaltungs; + */ + public Machine() { + this.inspections = new ArrayList<>(); + this.relevantNorms = new ArrayList<>(); + this.securityArea = new ArrayList<>(); + //this.nothaltGestaltungs = new HashSet<>(); + } + + public Machine( + Location location, List securityArea, String name, + String indentifier, String costCenter, String machineNr, String modellType, + String inventarNr, Integer buildingYear, Integer changeYear, String comment, + List relevantNorms, MachineStatus machineStatus, MachineType machineType, + ControlParts controlParts, ArrayApproach arrayApproach, AOPD_AOPDDR aopd_aopddr, + NothaltGestaltung nothaltGestaltung, NothaltElectric nothaltElectric, NothaltVerriegel nothaltVerriegel + ) { + this.location = location; + this.securityArea = securityArea; + this.name = name; + this.indentifier = indentifier; + this.costCenter = costCenter; + this.machineNr = machineNr; + this.modellType = modellType; + this.inventarNr = inventarNr; + this.buildingYear = buildingYear; + this.changeYear = changeYear; + this.comment2 = comment; + this.relevantNorms = relevantNorms; + this.machineStatus = machineStatus; + this.machineType = machineType; + this.controlParts = controlParts; + this.arrayApproach = arrayApproach; + this.aopd_aopddr = aopd_aopddr; + + this.nothaltGestaltung = nothaltGestaltung; + this.nothaltElectric = nothaltElectric; + this.nothaltVerriegel = nothaltVerriegel; + } + + public Machine(Machine machine) { + this.location = machine.getLocation(); + this.name = machine.getName(); + this.indentifier = machine.getIndentifier(); + this.costCenter = machine.getCostCenter(); + this.machineNr = machine.getMachineNr(); + this.modellType = machine.getModellType(); + this.inventarNr = machine.getInventarNr(); + this.buildingYear = machine.getBuildingYear(); + this.changeYear = machine.getChangeYear(); + this.comment2 = machine.getComment(); + this.relevantNorms = new ArrayList<>(); + if (machine.getRelevantNorms() != null) { + for (String norm : machine.getRelevantNorms()) { + this.relevantNorms.add(norm); + } + } + this.machineStatus = machine.getMachineStatus(); + this.machineType = machine.getMachineType(); + this.controlParts = machine.getControlParts(); + this.arrayApproach = machine.getArrayApproach(); + this.aopd_aopddr = machine.getAopd_aopddr(); + this.inspections = machine.getInspections(); + this.manufacturer = machine.manufacturer; + if (machine.securityArea != null) { + this.securityArea = machine.getSecurityArea().stream().filter(s -> s != null).map(area -> new SecurityArea(area)).collect(Collectors.toList()); + this.securityArea.stream().forEach(s -> s.setMachine(this)); + } + //this.inspections.stream().filter(i -> i != null).map(i -> new Inspection(i)).forEach(i -> i.setMachine(this)); + this.inspections = new ArrayList<>(); + + this.nothaltGestaltung = machine.nothaltGestaltung; + this.nothaltElectric = machine.nothaltElectric; + this.nothaltVerriegel = machine.nothaltVerriegel; + //this.nothaltGestaltungs = new HashSet<>(machine.nothaltGestaltungs); + } + + @PostLoad + private void switchToClobComment(){ + if (comment != null && comment2 == null) { + comment2 = comment; + } + } + + @Override + public String toString() { + return name; + } + + public Manufacturer getManufacturer() { + return manufacturer; + } + + public void setManufacturer(Manufacturer manufacturer) { + this.manufacturer = manufacturer; + } + + public List getInspections() { + return inspections; + } + + public void setInspections(List inspections) { + this.inspections = inspections; + } + + public String getMachineNr() { + return machineNr; + } + + public void setMachineNr(String machineNr) { + this.machineNr = machineNr; + } + + public String getModellType() { + return modellType; + } + + public void setModellType(String modellType) { + this.modellType = modellType; + } + + public AOPD_AOPDDR getAopd_aopddr() { + return aopd_aopddr; + } + + public void setAopd_aopddr(AOPD_AOPDDR aopd_aopddr) { + this.aopd_aopddr = aopd_aopddr; + } + + public ArrayApproach getArrayApproach() { + return arrayApproach; + } + + public void setArrayApproach(ArrayApproach arrayApproach) { + this.arrayApproach = arrayApproach; + } + + public ControlParts getControlParts() { + return controlParts; + } + + public void setControlParts(ControlParts controlParts) { + this.controlParts = controlParts; + } + + public List getRelevantNorms() { + return relevantNorms; + } + + public void setRelevantNorms(List relevantNorms) { + this.relevantNorms = relevantNorms; + } + + public Location getLocation() { + return location; + } + + public void setLocation(Location location) { + this.location = location; + } + + public List getSecurityArea() { + return securityArea; + } + + public void setSecurityArea(List securityArea) { + this.securityArea = securityArea; + } + + public String getCostCenter() { + return costCenter; + } + + public void setCostCenter(String costCenter) { + this.costCenter = costCenter; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getInventarNr() { + return inventarNr; + } + + public void setInventarNr(String inventarNr) { + this.inventarNr = inventarNr; + } + + public Integer getBuildingYear() { + return buildingYear; + } + + public void setBuildingYear(Integer buildingYear) { + this.buildingYear = buildingYear; + } + + public Integer getChangeYear() { + return changeYear; + } + + public void setChangeYear(Integer changeYear) { + this.changeYear = changeYear; + } + + public String getComment() { + return comment2; + } + + public void setComment(String comment) { + if (comment != null && comment.length() > 256) { + comment2 = comment; + } else { + this.comment2 = comment; + this.comment = comment; + } + } + + public String getIndentifier() { + return indentifier; + } + + public void setIndentifier(String indentifier) { + this.indentifier = indentifier; + } + + public MachineStatus getMachineStatus() { + return machineStatus; + } + + public void setMachineStatus(MachineStatus machineStatus) { + this.machineStatus = machineStatus; + } + + public MachineType getMachineType() { + return machineType; + } + + public void setMachineType(MachineType machineType) { + this.machineType = machineType; + } + + public NothaltGestaltung getNothaltGestaltung() { + return nothaltGestaltung; + } + + public void setNothaltGestaltung(NothaltGestaltung nothaltGestaltung) { + this.nothaltGestaltung = nothaltGestaltung; + } + + public NothaltElectric getNothaltElectric() { + return nothaltElectric; + } + + public void setNothaltElectric(NothaltElectric nothaltElectric) { + this.nothaltElectric = nothaltElectric; + } + + public NothaltVerriegel getNothaltVerriegel() { + return nothaltVerriegel; + } + + public void setNothaltVerriegel(NothaltVerriegel nothaltVerriegel) { + this.nothaltVerriegel = nothaltVerriegel; + } + + /* + public Set getNothaltGestaltungs() { + if (nothaltGestaltungs.isEmpty() && nothaltGestaltung != null) { + nothaltGestaltungs.add(nothaltGestaltung); + } + return nothaltGestaltungs; + } + + public void setNothaltGestaltungs(Set nothaltGestaltungs) { + this.nothaltGestaltungs = nothaltGestaltungs; + }*/ +} diff --git a/java/mss-failsafe/src/main/java/model/machine/Manufacturer.java b/java/mss-failsafe/src/main/java/model/machine/Manufacturer.java new file mode 100755 index 0000000..c7dea35 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/machine/Manufacturer.java @@ -0,0 +1,111 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package model.machine; + +import java.util.List; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.OneToMany; +import model.AbstractEntity; + +/** + * + * @author pplate + */ +@Entity +public class Manufacturer extends AbstractEntity { + + @Column(unique = true, nullable = false) + private String name; + + @Column(unique = false, nullable = true, length = 210) + private String comment; + + @Column(unique = false, nullable = true) + private String headerInspection; + + @Column(unique = false, nullable = true) + private String headerService; + + @Column(unique = false, nullable = true) + private String web; + + @OneToMany(mappedBy = "manufacturer") + private List machines; + + @OneToMany(mappedBy = "manufacturer", cascade = CascadeType.ALL) + private List contacts; + + @OneToMany(mappedBy = "manufacturer", cascade = CascadeType.ALL) + private List adresses; + + public Manufacturer() { + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public String getHeaderInspection() { + return headerInspection; + } + + public void setHeaderInspection(String headerInspection) { + this.headerInspection = headerInspection; + } + + public String getHeaderService() { + return headerService; + } + + public void setHeaderService(String headerService) { + this.headerService = headerService; + } + + public String getWeb() { + return web; + } + + public void setWeb(String web) { + this.web = web; + } + + public List getMachines() { + return machines; + } + + public void setMachines(List machines) { + this.machines = machines; + } + + public List getContacts() { + return contacts; + } + + public void setContacts(List contacts) { + this.contacts = contacts; + } + + public List getAdresses() { + return adresses; + } + + public void setAdresses(List adresses) { + this.adresses = adresses; + } +} diff --git a/java/mss-failsafe/src/main/java/model/machine/ManufacturerAddress.java b/java/mss-failsafe/src/main/java/model/machine/ManufacturerAddress.java new file mode 100755 index 0000000..27b62fc --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/machine/ManufacturerAddress.java @@ -0,0 +1,36 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package model.machine; + +import javax.persistence.Entity; +import javax.persistence.ManyToOne; +import model.adresses.Address; + +/** + * + * @author pplate + */ +@Entity +public class ManufacturerAddress extends Address { + + @ManyToOne + private Manufacturer manufacturer; + + public ManufacturerAddress() { + } + + public ManufacturerAddress(Manufacturer manufacturer, Address toCopyAddress) { + super(toCopyAddress); + this.manufacturer = manufacturer; + } + + public Manufacturer getManufacturer() { + return manufacturer; + } + + public void setManufacturer(Manufacturer manufacturer) { + this.manufacturer = manufacturer; + } +} diff --git a/java/mss-failsafe/src/main/java/model/machine/enums/MachineStatus.java b/java/mss-failsafe/src/main/java/model/machine/enums/MachineStatus.java new file mode 100755 index 0000000..0a66ab1 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/machine/enums/MachineStatus.java @@ -0,0 +1,31 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package model.machine.enums; + +/** + * + * @author patri + */ +public enum MachineStatus { + ACTIVE("aktiv"), + DONE("beendet"), + PLANNED("geplant"); + + private final String name; + + @Override + public String toString() { + return name; + } + + private MachineStatus(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/java/mss-failsafe/src/main/java/model/machine/enums/MachineType.java b/java/mss-failsafe/src/main/java/model/machine/enums/MachineType.java new file mode 100755 index 0000000..c3c09bf --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/machine/enums/MachineType.java @@ -0,0 +1,69 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package model.machine.enums; + +/** + * + * @author patri + */ +public enum MachineType { + DRIVERLESS_FLOORTRANSPORTER("fahrerloses Flurförderzeug (DIN EN ISO 3691-4)"), + PRODUCTIONSYSTEM_AUTOMATED("Fertigungssystem automatisiert"), + INDUSTRYROBOT("Industrieroboter"), + POWERTOOL("kraftbetr. Arbeitsmittel (ZH 1/597)"), + PALETTE_WRAP_MACHNINCE("Paletteneinschlagmaschine"), + PALETTE_WRAP_MACHNINCE_EN415_6("Paletteneinschlagmaschine (EN 415-6)"), + HYDROLICPRESS("Presse Hydraulisch (EN ISO 16092)"), + METALLPRESS("Presse kraftb.Metallbearb. (ZH 1/281)"), + MECHANICALPRESS("Presse mechanisch (EN ISO 16092)"), + AUTOMATIC_STORAGE_TOOL("Regalbediengerät automatisiert"), + STEADY_CONVEYOR("Stetigförderer"); + + private final String name; + + private MachineType(String name) { + this.name = name; + } + + public static MachineType getByString(String name) { + System.out.println(name); + switch (name) { + case "fahrerloses Flurförderzeug (DIN EN ISO 3691-4)": + return DRIVERLESS_FLOORTRANSPORTER; + case "Fertigungssystem automatisiert": + return PRODUCTIONSYSTEM_AUTOMATED; + case "Industrieroboter": + return INDUSTRYROBOT; + case "kraftbetr. Arbeitsmittel (ZH 1/597)": + return POWERTOOL; + case "Paletteneinschlagmaschine": + return PALETTE_WRAP_MACHNINCE; + case "Paletteneinschlagmaschine (EN 415-6)": + return PALETTE_WRAP_MACHNINCE_EN415_6; + case "Presse Hydraulisch (EN ISO 16092)": + return HYDROLICPRESS; + case "Presse kraftb.Metallbearb. (ZH 1/281)": + return METALLPRESS; + case "Presse mechanisch (EN ISO 16092)": + return MECHANICALPRESS; + case "Regalbediengerät automatisiert": + return AUTOMATIC_STORAGE_TOOL; + case "Stetigförderer": + return STEADY_CONVEYOR; + default: + return null; + } + } + + @Override + public String toString() { + return name; + } + + public String getName() { + return name; + } +} diff --git a/java/mss-failsafe/src/main/java/model/machine/enums/Option.java b/java/mss-failsafe/src/main/java/model/machine/enums/Option.java new file mode 100755 index 0000000..518bdad --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/machine/enums/Option.java @@ -0,0 +1,47 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package model.machine.enums; + +/** + * + * @author patri + */ +public enum Option { + NA("n/a"), + YES("ja"), + NO("nein"); + + private final String name; + + private Option(String name) { + this.name = name; + } + + public static Option getByString(String value){ + if (value == null || value.contains("-/-")) { + return null; + } + + for(Option o : values()){ + if (value.contains(o.name)) { + return o; + } + } + + return null; + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return name; + } + + +} diff --git a/java/mss-failsafe/src/main/java/model/machine/enums/norms/AOPD_AOPDDR.java b/java/mss-failsafe/src/main/java/model/machine/enums/norms/AOPD_AOPDDR.java new file mode 100755 index 0000000..293984a --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/machine/enums/norms/AOPD_AOPDDR.java @@ -0,0 +1,41 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package model.machine.enums.norms; + +/** + * + * @author patri + */ +public enum AOPD_AOPDDR { + IEC_62046("IEC 62046 - ab 08/2006"); + + private final String name; + + private AOPD_AOPDDR(String name) { + this.name = name; + } + + public static AOPD_AOPDDR getFromString(String value){ + if (value == null) { + return null; + } + + if (value.contains("IEC 62046")) { + return IEC_62046; + } + + return null; + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return name; + } +} diff --git a/java/mss-failsafe/src/main/java/model/machine/enums/norms/ArrayApproach.java b/java/mss-failsafe/src/main/java/model/machine/enums/norms/ArrayApproach.java new file mode 100755 index 0000000..c989209 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/machine/enums/norms/ArrayApproach.java @@ -0,0 +1,41 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package model.machine.enums.norms; + +/** + * Norm Anordnung/Annäherung + * @author patri + */ +public enum ArrayApproach { + EN_ISO_13855("EN ISO 13855 - ab 11/2010"); + + private final String name; + + private ArrayApproach(String name) { + this.name = name; + } + + public static ArrayApproach getFromString(String value){ + if (value == null) { + return null; + } + + if (value.contains("EN ISO 13855")) { + return EN_ISO_13855; + } + + return null; + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return name; + } +} diff --git a/java/mss-failsafe/src/main/java/model/machine/enums/norms/ControlParts.java b/java/mss-failsafe/src/main/java/model/machine/enums/norms/ControlParts.java new file mode 100755 index 0000000..83270b2 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/machine/enums/norms/ControlParts.java @@ -0,0 +1,46 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package model.machine.enums.norms; + +/** + * Norm sicherheitsbezeichnung Teile einer Steuerung + * @author patri + */ +public enum ControlParts { + EN_ISO_13849("EN ISO 13849 - ab 12/2009"), + EN_ISO_13849_2("EN ISO 13849 - ab 2023"); + + private final String name; + + private ControlParts(String name) { + this.name = name; + } + + public static ControlParts getFromString(String value){ + if (value == null) { + return null; + } + + if (value.contains("ab 12/2009")) { + return EN_ISO_13849; + } + + if (value.contains("ab 2023")) { + return EN_ISO_13849_2; + } + + return null; + } + + @Override + public String toString() { + return name; + } + + public String getName() { + return name; + } +} diff --git a/java/mss-failsafe/userdata/src/main/java/exception/PersonInaktiveException.java b/java/mss-failsafe/src/main/java/model/machine/enums/norms/EmergencyStopDesign.java old mode 100644 new mode 100755 similarity index 67% rename from java/mss-failsafe/userdata/src/main/java/exception/PersonInaktiveException.java rename to java/mss-failsafe/src/main/java/model/machine/enums/norms/EmergencyStopDesign.java index dcbd2b7..cf57080 --- a/java/mss-failsafe/userdata/src/main/java/exception/PersonInaktiveException.java +++ b/java/mss-failsafe/src/main/java/model/machine/enums/norms/EmergencyStopDesign.java @@ -3,12 +3,12 @@ * To change this template file, choose Tools | Templates * and open the template in the editor. */ -package exception; +package model.machine.enums.norms; /** * * @author patri */ -public class PersonInaktiveException extends AbstractBusinessException{ +public enum EmergencyStopDesign { } diff --git a/java/mss-failsafe/userManagement/src/main/java/exception/PersonInaktiveException.java b/java/mss-failsafe/src/main/java/model/machine/enums/norms/EmergencyStopElectricalEquipment.java old mode 100644 new mode 100755 similarity index 67% rename from java/mss-failsafe/userManagement/src/main/java/exception/PersonInaktiveException.java rename to java/mss-failsafe/src/main/java/model/machine/enums/norms/EmergencyStopElectricalEquipment.java index dcbd2b7..42a7ba0 --- a/java/mss-failsafe/userManagement/src/main/java/exception/PersonInaktiveException.java +++ b/java/mss-failsafe/src/main/java/model/machine/enums/norms/EmergencyStopElectricalEquipment.java @@ -3,12 +3,12 @@ * To change this template file, choose Tools | Templates * and open the template in the editor. */ -package exception; +package model.machine.enums.norms; /** * * @author patri */ -public class PersonInaktiveException extends AbstractBusinessException{ +public enum EmergencyStopElectricalEquipment { } diff --git a/java/mss-failsafe/userManagement/src/main/java/model/person/enums/UserGroup.java b/java/mss-failsafe/src/main/java/model/machine/enums/norms/Lockout.java old mode 100644 new mode 100755 similarity index 67% rename from java/mss-failsafe/userManagement/src/main/java/model/person/enums/UserGroup.java rename to java/mss-failsafe/src/main/java/model/machine/enums/norms/Lockout.java index 6aba03b..1121564 --- a/java/mss-failsafe/userManagement/src/main/java/model/person/enums/UserGroup.java +++ b/java/mss-failsafe/src/main/java/model/machine/enums/norms/Lockout.java @@ -3,14 +3,12 @@ * To change this template file, choose Tools | Templates * and open the template in the editor. */ -package model.person.enums; +package model.machine.enums.norms; /** * * @author patri */ -public enum UserGroup { - USER, - ADMIN, - CUSTOMER; +public enum Lockout { + } diff --git a/java/mss-failsafe/src/main/java/model/machine/enums/norms/NothaltElectric.java b/java/mss-failsafe/src/main/java/model/machine/enums/norms/NothaltElectric.java new file mode 100755 index 0000000..6f74522 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/machine/enums/norms/NothaltElectric.java @@ -0,0 +1,41 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package model.machine.enums.norms; + +/** + * + * @author patri + */ +public enum NothaltElectric { + EN_13849("EN ISO 13849 – ab 2023"); + + private final String name; + + private NothaltElectric(String name) { + this.name = name; + } + + public static NothaltElectric getFromString(String value){ + if (value == null) { + return null; + } + + if (value.contains("13849")) { + return EN_13849; + } + + return null; + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return name; + } +} diff --git a/java/mss-failsafe/src/main/java/model/machine/enums/norms/NothaltGestaltung.java b/java/mss-failsafe/src/main/java/model/machine/enums/norms/NothaltGestaltung.java new file mode 100755 index 0000000..b04488d --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/machine/enums/norms/NothaltGestaltung.java @@ -0,0 +1,46 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package model.machine.enums.norms; + +/** + * + * @author patri + */ +public enum NothaltGestaltung { + EN_13850("'Gestaltungsleitsätze' EN 13850 – ab 2015"), + EN_60204("'elektr. Ausrüstung' EN 60204 – ab 2018"); + + private final String name; + + private NothaltGestaltung(String name) { + this.name = name; + } + + public static NothaltGestaltung getFromString(String value){ + if (value == null) { + return null; + } + + if (value.contains("13850")) { + return EN_13850; + } + + if (value.contains("60204")) { + return EN_60204; + } + + return null; + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return name; + } +} diff --git a/java/mss-failsafe/src/main/java/model/machine/enums/norms/NothaltVerriegel.java b/java/mss-failsafe/src/main/java/model/machine/enums/norms/NothaltVerriegel.java new file mode 100755 index 0000000..ce0c410 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/machine/enums/norms/NothaltVerriegel.java @@ -0,0 +1,41 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package model.machine.enums.norms; + +/** + * + * @author patri + */ +public enum NothaltVerriegel { + DIN_EN_14119("'Gestaltung+Auswahl' EN ISO 14119 – ab 2013"); + + private final String name; + + private NothaltVerriegel(String name) { + this.name = name; + } + + public static NothaltVerriegel getFromString(String value){ + if (value == null) { + return null; + } + + if (value.contains("14119")) { + return DIN_EN_14119; + } + + return null; + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return name; + } +} diff --git a/java/mss-failsafe/src/main/java/model/machine/enums/norms/TwoHandedFunctional.java b/java/mss-failsafe/src/main/java/model/machine/enums/norms/TwoHandedFunctional.java new file mode 100755 index 0000000..0872795 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/machine/enums/norms/TwoHandedFunctional.java @@ -0,0 +1,14 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package model.machine.enums.norms; + +/** + * + * @author patri + */ +public enum TwoHandedFunctional { + +} diff --git a/java/mss-failsafe/src/main/java/model/machine/enums/norms/TwoHandedRequirements.java b/java/mss-failsafe/src/main/java/model/machine/enums/norms/TwoHandedRequirements.java new file mode 100755 index 0000000..624862f --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/machine/enums/norms/TwoHandedRequirements.java @@ -0,0 +1,14 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package model.machine.enums.norms; + +/** + * + * @author patri + */ +public enum TwoHandedRequirements { + +} diff --git a/java/mss-failsafe/mss/src/main/java/model/person/Password.java b/java/mss-failsafe/src/main/java/model/person/Password.java old mode 100644 new mode 100755 similarity index 100% rename from java/mss-failsafe/mss/src/main/java/model/person/Password.java rename to java/mss-failsafe/src/main/java/model/person/Password.java diff --git a/java/mss-failsafe/mss/src/main/java/model/person/Person.java b/java/mss-failsafe/src/main/java/model/person/Person.java old mode 100644 new mode 100755 similarity index 52% rename from java/mss-failsafe/mss/src/main/java/model/person/Person.java rename to java/mss-failsafe/src/main/java/model/person/Person.java index f0f380c..f5d18c0 --- a/java/mss-failsafe/mss/src/main/java/model/person/Person.java +++ b/java/mss-failsafe/src/main/java/model/person/Person.java @@ -2,7 +2,6 @@ package model.person; import model.person.enums.Call; import java.io.Serializable; -import java.util.AbstractSet; import java.util.ArrayList; import java.util.HashSet; import java.util.List; @@ -13,10 +12,21 @@ import javax.persistence.*; import model.AbstractEntity; import model.files.UserPicture; import model.person.enums.UserGroup; +import model.ticket.Ticket; /** - * Entity implementation class for Entity: User + * Entity implementation class for Entity: Person * + * Diese Klasse repräsentiert einen Benutzer im System und enthält alle relevanten + * Informationen wie Kontaktdaten, Authentifizierung und Rollenzuweisungen. + * + * Die Klasse unterstützt verschiedene Benutzertypen durch das UserGroup-System: + * - USER: Standardbenutzer mit Basisfunktionalität + * - SUPERUSER: Erweiterte Benutzerrechte + * - ADMIN: Vollzugriff auf das System + * - CUSTOMER: Kundenspezifische Rechte + * + * @author Patrick */ @Entity @Inheritance(strategy = InheritanceType.JOINED) @@ -36,13 +46,25 @@ public class Person extends AbstractEntity implements Serializable { private static final long serialVersionUID = 1L; + /** + * Eindeutige E-Mail-Adresse des Benutzers. + * Dient als primärer Identifikator für die Anmeldung. + */ @Column(name = "Email", unique = true, nullable = false) private String email; + /** + * Verschlüsseltes Passwort des Benutzers. + * Wird zusammen mit dem Salt für sichere Authentifizierung verwendet. + */ @OneToOne(cascade = CascadeType.ALL) @JoinColumn(name = "Password_ID", nullable = false, unique = true) private Password password; + /** + * Salt-Wert für die Passwort-Verschlüsselung. + * Erhöht die Sicherheit durch Salting des Hash-Algorithmus. + */ @OneToOne(cascade = CascadeType.ALL) @JoinColumn(name = "Salt_ID", nullable = false, unique = true) private Salt salt; @@ -51,44 +73,122 @@ public class Person extends AbstractEntity implements Serializable { @Column(name = "Anrede") private Call call; + /** + * Authentifizierungs-Token für den Benutzer. + * Unterstützt verschiedene Token-Typen für unterschiedliche Zwecke. + */ @OneToMany(mappedBy = "person", orphanRemoval = true, cascade = CascadeType.ALL) private List tokens; + /** + * Benutzergruppen/Rollen des Benutzers. + * Definiert die Zugriffsrechte und verfügbaren Funktionen im System. + * Unterstützt hierarchische Rollenzuweisung über UserRoleAssignmentHelper. + */ @ElementCollection(targetClass = UserGroup.class) @Enumerated(EnumType.STRING) @JoinTable(name = "UserGroups", joinColumns = @JoinColumn(name = "UserID")) @Column(name = "UserGroups", nullable = false) private Set userGroups; + /** + * Telefonnummer des Benutzers (optional). + */ @Column(nullable = true) private String telefon; + /** + * Mobiltelefonnummer des Benutzers (optional). + */ @Column(nullable = true) private String mobile; + /** + * Faxnummer des Benutzers (optional). + */ @Column(nullable = true) private String fax; + /** + * Vorname des Benutzers (erforderlich). + */ @Column(nullable = false) private String firstname; + /** + * Nachname des Benutzers (optional). + */ @Column(nullable = true) private String lastname; + /** + * Titel des Benutzers (optional). + */ @Column(nullable = true) private String title; + /** + * Status, ob der Benutzer aktiv ist. + * Inaktive Benutzer können sich nicht am System anmelden. + */ @Column(nullable = true) private boolean active; @OneToOne(optional = true, cascade = CascadeType.ALL) private UserPicture userPicture; + + @Lob + @Column(nullable = true) + private byte[] signature; + @Column(nullable = false, columnDefinition = "boolean default false") + private boolean autoSignature = false; + + @OneToOne(optional = true, cascade = CascadeType.ALL) + private Preferences preferences; + + /** + * Liste der vom Benutzer erstellten Tickets. + * Bidirektionale Beziehung zur Ticket-Entität. + */ + @OneToMany(mappedBy = "creator") + private List createdTickets; + + /** + * Liste der dem Benutzer zugewiesenen Tickets. + * Ermöglicht die Verfolgung von Arbeitsaufträgen. + */ + @OneToMany(mappedBy = "owner") + private List assignTickets; + + /** + * Watchlist mit Tickets, die der Benutzer beobachtet. + * Many-to-Many Beziehung für Benachrichtigungen und Verfolgung. + */ + @ManyToMany + @JoinTable(name = "Person_Watchlist", + joinColumns = @JoinColumn(name = "Person_ID", referencedColumnName = "ID"), + inverseJoinColumns = @JoinColumn(name = "Ticket_ID", referencedColumnName = "ID") + ) + private List watchlist; + + /** + * Standard-Konstruktor. + * Initialisiert den Benutzer als inaktiv. + */ public Person() { super(); active = false; } + /** + * Konstruktor für neuen Benutzer mit allen erforderlichen Daten. + * + * @param email E-Mail-Adresse des Benutzers + * @param password Verschlüsseltes Passwort + * @param salt Salt für Passwort-Verschlüsselung + * @param usergroups Zugewiesene Benutzergruppen/Rollen + */ public Person(String email, byte[] password, Salt salt, Set usergroups) { this.email = email; this.tokens = new ArrayList<>(); @@ -97,6 +197,22 @@ public class Person extends AbstractEntity implements Serializable { this.userGroups = usergroups; } + public List getCreatedTickets() { + return createdTickets; + } + + public void setCreatedTickets(List createdTickets) { + this.createdTickets = createdTickets; + } + + public List getAssignTickets() { + return assignTickets; + } + + public void setAssignTickets(List assignTickets) { + this.assignTickets = assignTickets; + } + public String getEmail() { return email; } @@ -224,4 +340,36 @@ public class Person extends AbstractEntity implements Serializable { public void setUserPicture(UserPicture userPicture) { this.userPicture = userPicture; } + + public byte[] getSignature() { + return signature; + } + + public void setSignature(byte[] signature) { + this.signature = signature; + } + + public boolean isAutoSignature() { + return autoSignature; + } + + public void setAutoSignature(boolean autoSignature) { + this.autoSignature = autoSignature; + } + + public Preferences getPreferences() { + return preferences; + } + + public void setPreferences(Preferences preferences) { + this.preferences = preferences; + } + + public List getWatchlist() { + return watchlist; + } + + public void setWatchlist(List watchlist) { + this.watchlist = watchlist; + } } diff --git a/java/mss-failsafe/src/main/java/model/person/Preferences.java b/java/mss-failsafe/src/main/java/model/person/Preferences.java new file mode 100755 index 0000000..61a1acf --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/person/Preferences.java @@ -0,0 +1,67 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package model.person; + +import java.util.TimeZone; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.OneToOne; +import model.AbstractEntity; + +/** + * + * @author patri + */ +@Entity +public class Preferences extends AbstractEntity{ + + @OneToOne(optional = false) + private Person person; + + @Column(nullable = false) + private String theme; + + private String timeZone; + + public Preferences() { + } + + public Preferences(Person person, String theme, String timeZone) { + this.person = person; + this.theme = theme; + this.timeZone = timeZone; + } + + public void setDefaultPreferences(Person person){ + setTheme("vela"); + setTimeZone(TimeZone.getDefault().getID()); + setPerson(person); + } + + public Person getPerson() { + return person; + } + + public void setPerson(Person person) { + this.person = person; + } + + public String getTheme() { + return theme; + } + + public void setTheme(String theme) { + this.theme = theme; + } + + public String getTimeZone() { + return timeZone; + } + + public void setTimeZone(String timeZone) { + this.timeZone = timeZone; + } +} diff --git a/java/mss-failsafe/mss/src/main/java/model/person/Salt.java b/java/mss-failsafe/src/main/java/model/person/Salt.java old mode 100644 new mode 100755 similarity index 100% rename from java/mss-failsafe/mss/src/main/java/model/person/Salt.java rename to java/mss-failsafe/src/main/java/model/person/Salt.java diff --git a/java/mss-failsafe/mss/src/main/java/model/person/Token.java b/java/mss-failsafe/src/main/java/model/person/Token.java old mode 100644 new mode 100755 similarity index 90% rename from java/mss-failsafe/mss/src/main/java/model/person/Token.java rename to java/mss-failsafe/src/main/java/model/person/Token.java index 3419726..f85d366 --- a/java/mss-failsafe/mss/src/main/java/model/person/Token.java +++ b/java/mss-failsafe/src/main/java/model/person/Token.java @@ -34,13 +34,15 @@ import model.ticket.Ticket; }) @NamedQueries({ @NamedQuery(name = Token.REMOVE_TOKEN, query = "DELETE FROM Token t where t.tokenHash = :tokenHash"), - @NamedQuery(name = Token.REMOVE_EXPIRED_TOKEN, query = "DELETE FROM Token t where t.expiration < :timestamp") + @NamedQuery(name = Token.REMOVE_EXPIRED_TOKEN, query = "DELETE FROM Token t where t.expiration < :timestamp"), + @NamedQuery(name = Token.LOAD_BY_RAW, query = "SELECT t FROM Token t where t.tokenHash = :raw") }) public class Token extends AbstractEntity { private static final long serialVersionUID = -6632692800064453512L; public static final String REMOVE_TOKEN = "Token.removeToken"; public static final String REMOVE_EXPIRED_TOKEN = "Token.removeExpiredToken"; + public static final String LOAD_BY_RAW = "Token.loadByRawToken"; @Column(name = "token_hash") private String tokenHash; @@ -58,7 +60,7 @@ public class Token extends AbstractEntity { private Instant expiration; - @ManyToOne(fetch = FetchType.LAZY) + @ManyToOne @JoinColumn(name = "account_id") private Person person; diff --git a/java/mss-failsafe/mss/src/main/java/model/person/enums/Call.java b/java/mss-failsafe/src/main/java/model/person/enums/Call.java old mode 100644 new mode 100755 similarity index 100% rename from java/mss-failsafe/mss/src/main/java/model/person/enums/Call.java rename to java/mss-failsafe/src/main/java/model/person/enums/Call.java diff --git a/java/mss-failsafe/mss/src/main/java/model/person/enums/TokenType.java b/java/mss-failsafe/src/main/java/model/person/enums/TokenType.java old mode 100644 new mode 100755 similarity index 100% rename from java/mss-failsafe/mss/src/main/java/model/person/enums/TokenType.java rename to java/mss-failsafe/src/main/java/model/person/enums/TokenType.java diff --git a/java/mss-failsafe/mss/src/main/java/model/person/enums/UserGroup.java b/java/mss-failsafe/src/main/java/model/person/enums/UserGroup.java old mode 100644 new mode 100755 similarity index 86% rename from java/mss-failsafe/mss/src/main/java/model/person/enums/UserGroup.java rename to java/mss-failsafe/src/main/java/model/person/enums/UserGroup.java index 6aba03b..8e72dd4 --- a/java/mss-failsafe/mss/src/main/java/model/person/enums/UserGroup.java +++ b/java/mss-failsafe/src/main/java/model/person/enums/UserGroup.java @@ -12,5 +12,6 @@ package model.person.enums; public enum UserGroup { USER, ADMIN, - CUSTOMER; + CUSTOMER, + SUPERUSER; } diff --git a/java/mss-failsafe/src/main/java/model/question/Question.java b/java/mss-failsafe/src/main/java/model/question/Question.java new file mode 100755 index 0000000..6e516df --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/question/Question.java @@ -0,0 +1,100 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package model.question; + +import java.util.List; +import javax.persistence.*; + +import model.AbstractEntity; + +/** + * + * @author pplate + */ +@Entity +public class Question extends AbstractEntity implements Comparable{ + + @ManyToOne + private Questionaire questionaire; + + @Column(length = 255, unique = false) + private String text; + + @Lob + @Column(columnDefinition = "CLOB") + private String text2; + + private Integer position; + + private boolean standardValues; + + @ElementCollection(fetch = FetchType.EAGER) + @CollectionTable( + name = "QUESTIONAIRE_ANSWERS", + joinColumns = @JoinColumn(name = "id", referencedColumnName = "id") + ) + @Column(name = "answers") + private List answers; + + public Question() { + } + + @PostLoad + private void switchToClobText(){ + if (text != null && text2 == null) { + text2 = text; + } + } + + public boolean isStandardValues() { + return standardValues; + } + + public void setStandardValues(boolean standardValues) { + this.standardValues = standardValues; + } + + public List getAnswers() { + return answers; + } + + public void setAnswers(List answers) { + this.answers = answers; + } + + public Integer getPosition() { + return position; + } + + public void setPosition(Integer position) { + this.position = position; + } + + public String getText() { + return text2; + } + + public void setText(String text) { + if (text != null && text.length() > 256) { + this.text2 = text; + } else { + this.text2 = text; + this.text = text; + } + } + + public Questionaire getQuestionaire() { + return questionaire; + } + + public void setQuestionaire(Questionaire questionaire) { + this.questionaire = questionaire; + } + + @Override + public int compareTo(Question t) { + return Integer.compare(position, t.position); + } +} diff --git a/java/mss-failsafe/src/main/java/model/question/Questionaire.java b/java/mss-failsafe/src/main/java/model/question/Questionaire.java new file mode 100755 index 0000000..170b46a --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/question/Questionaire.java @@ -0,0 +1,58 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package model.question; + +import java.util.List; +import javax.persistence.*; + +import model.AbstractEntity; + +/** + * + * @author pplate + */ +@Entity +@NamedQueries({ + @NamedQuery(name = Questionaire.GET_FOR_ALL_REQUIRED, query = "SELECT q FROM Questionaire q WHERE q.forAllRequired = TRUE") +}) +public class Questionaire extends AbstractEntity { + + public final static String GET_FOR_ALL_REQUIRED = "Questionaire.getForAllRequired"; + + @OneToMany(mappedBy = "questionaire", cascade = CascadeType.ALL, orphanRemoval = true) + @OrderBy("position ASC") + private List questions; + + private boolean forAllRequired; + + private String name; + + public Questionaire() { + } + + public List getQuestions() { + return questions; + } + + public void setQuestions(List questions) { + this.questions = questions; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public boolean isForAllRequired() { + return forAllRequired; + } + + public void setForAllRequired(boolean forAllRequired) { + this.forAllRequired = forAllRequired; + } +} diff --git a/java/mss-failsafe/src/main/java/model/question/enums/Answer.java b/java/mss-failsafe/src/main/java/model/question/enums/Answer.java new file mode 100755 index 0000000..ee833a8 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/question/enums/Answer.java @@ -0,0 +1,26 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Enum.java to edit this template + */ +package model.question.enums; + +/** + * + * @author pplate + */ +public enum Answer { + YES("Ja"), + NO("Nein"), + NO_CHECK("Nicht prüfbar"), + NA("n/a"); + + public final String value; + + private Answer(String name) { + value = name; + } + + public String getValue() { + return value; + } +} diff --git a/java/mss-failsafe/src/main/java/model/security/DangerPoint.java b/java/mss-failsafe/src/main/java/model/security/DangerPoint.java new file mode 100755 index 0000000..85e9878 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/security/DangerPoint.java @@ -0,0 +1,186 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package model.security; + +import javax.persistence.*; + +import model.AbstractEntity; + +/** + * + * @author patri + */ +@Entity +public class DangerPoint extends AbstractEntity{ + + @ManyToOne + private SecurityArea securityArea; + + @ManyToOne + private SecurityDevice securityDevice; + + private String description; + + @Lob + private String comment; + + @Lob + @Column(columnDefinition = "CLOB") + private String comment2; + + @OneToOne(cascade = CascadeType.ALL) + private MeasuringPoint measuringPoint; + + //Actual Measurement + + private Integer timeMesasured; + private Integer movement; + private Integer sPMG; + private Integer sPMP; + private Integer CRT; + private Integer securityDistance; + @Column(nullable = true) + private Boolean messung; + + public DangerPoint() { + messung = false; + } + + public DangerPoint(DangerPoint point) { + this.securityArea = point.securityArea; + this.description = point.description; + this.comment2 = point.getComment(); + this.measuringPoint = new MeasuringPoint(point.measuringPoint); + this.measuringPoint.setDangerPoint(this); + this.securityDevice = point.securityDevice; + this.timeMesasured = point.timeMesasured; + this.movement = point.movement; + this.sPMG = point.sPMG; + this.sPMP = point.sPMP; + this.CRT = point.CRT; + this.securityDistance = point.securityDistance; + this.messung = point.messung; + } + + @PostLoad + private void switchToClobComment(){ + if (comment != null && comment2 == null) { + comment2 = comment; + } + } + + public String messMessage(){ + if (isMessung()) { + return " - Mit Messung"; + } + + return ""; + } + + public boolean isMessung() { + if (messung == null) { + return false; + } + return messung; + } + + public void setMessung(boolean messung) { + this.messung = messung; + } + + public Integer getCRT() { + return CRT; + } + + public void setCRT(Integer CRT) { + this.CRT = CRT; + } + + public Integer getTimeMesasured() { + return timeMesasured; + } + + public void setTimeMesasured(Integer timeMesasured) { + this.timeMesasured = timeMesasured; + } + + public Integer getMovement() { + return movement; + } + + public void setMovement(Integer movement) { + this.movement = movement; + } + + public Integer getsPMG() { + return sPMG; + } + + public void setsPMG(Integer sPMG) { + this.sPMG = sPMG; + } + + public Integer getsPMP() { + return sPMP; + } + + public void setsPMP(Integer sPMP) { + this.sPMP = sPMP; + } + + public Integer getSecurityDistance() { + return securityDistance; + } + + public void setSecurityDistance(Integer securityDistance) { + this.securityDistance = securityDistance; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getComment() { + return comment2; + } + + public void setComment(String comment) { + if (comment != null && comment.length() > 256) { + comment2 = comment; + } else { + this.comment2 = comment; + this.comment = comment; + } + } + + public MeasuringPoint getMeasuringPoint() { + return measuringPoint; + } + + public void setMeasuringPoint(MeasuringPoint measuringPoint) { + this.measuringPoint = measuringPoint; + } + + public SecurityDevice getSecurityDevice() { + return securityDevice; + } + + public void setSecurityDevice(SecurityDevice securityDevice) { + this.securityDevice = securityDevice; + } + + public SecurityArea getSecurityArea() { + return securityArea; + } + + public void setSecurityArea(SecurityArea securityArea) { + this.securityArea = securityArea; + } +} diff --git a/java/mss-failsafe/src/main/java/model/security/MeasuringPoint.java b/java/mss-failsafe/src/main/java/model/security/MeasuringPoint.java new file mode 100755 index 0000000..30cfd92 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/security/MeasuringPoint.java @@ -0,0 +1,105 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package model.security; + +import javax.persistence.Entity; +import javax.persistence.ManyToOne; +import javax.persistence.OneToOne; +import model.AbstractEntity; + +/** + * + * @author patri + */ +@Entity +public class MeasuringPoint extends AbstractEntity { + + @OneToOne + private DangerPoint dangerPoint; + + //All in mm + private Integer actualDistance; + private Integer distanceSpec; + private Integer followUpCoveredDistanceSpec; + private Integer height; + private Integer crtCro; + + //In ms + private Integer followUpTimeSpec; + + public MeasuringPoint() { + } + + public MeasuringPoint(MeasuringPoint point) { + this.dangerPoint = point.dangerPoint; + this.actualDistance = point.actualDistance; + this.distanceSpec = point.distanceSpec; + this.followUpCoveredDistanceSpec = point.followUpCoveredDistanceSpec; + this.height = point.height; + this.crtCro = point.crtCro; + this.followUpTimeSpec = point.followUpTimeSpec; + } + + + + public DangerPoint getDangerPoint() { + return dangerPoint; + } + + public void setDangerPoint(DangerPoint dangerPoint) { + this.dangerPoint = dangerPoint; + } + + public Integer getActualDistance() { + return actualDistance; + } + + public void setActualDistance(Integer actualDistance) { + this.actualDistance = actualDistance; + } + + public Integer getDistanceSpec() { + return distanceSpec; + } + + public void setDistanceSpec(Integer distanceSpec) { + this.distanceSpec = distanceSpec; + } + + public Integer getFollowUpTimeSpec() { + return followUpTimeSpec; + } + + public void setFollowUpTimeSpec(Integer followUpTimeSpec) { + this.followUpTimeSpec = followUpTimeSpec; + } + + public Integer getFollowUpCoveredDistanceSpec() { + return followUpCoveredDistanceSpec; + } + + public void setFollowUpCoveredDistanceSpec(Integer followUpCoveredDistanceSpec) { + this.followUpCoveredDistanceSpec = followUpCoveredDistanceSpec; + } + + public Integer getHeight() { + return height; + } + + public void setHeight(Integer height) { + this.height = height; + } + + public Integer getCrtCro() { + return crtCro; + } + + public void setCrtCro(Integer crtCro) { + this.crtCro = crtCro; + } + + +} diff --git a/java/mss-failsafe/src/main/java/model/security/SecurityArea.java b/java/mss-failsafe/src/main/java/model/security/SecurityArea.java new file mode 100755 index 0000000..225013a --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/security/SecurityArea.java @@ -0,0 +1,243 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package model.security; + +import java.util.ArrayList; +import java.util.List; +import javax.persistence.*; + +import model.AbstractEntity; +import model.machine.Machine; +import model.security.enums.ApproachSpeed; +import model.security.enums.ProtectionType; +import model.security.enums.MountingPosition; +import model.security.enums.OverrunMeasurementType; +import model.security.switching.SwitchingDevice; + +/** + * + * @author patri + */ +@Entity +@NamedQueries( + @NamedQuery(name = SecurityArea.DELETE, query = "DELETE FROM SecurityArea s WHERE s.id = :id") +) +public class SecurityArea extends AbstractEntity{ + public static final String DELETE = "SecurityArea.delete"; + + //Identifikation + private String name; + private String toolNr; + + //Eigenschaften/Typisierung + @Enumerated(EnumType.ORDINAL) + private ProtectionType protectionType; + + @Enumerated(EnumType.ORDINAL) + private MountingPosition mountingPosition; + + @Enumerated(EnumType.ORDINAL) + private OverrunMeasurementType overrunMeasurementType; + + @Enumerated(EnumType.ORDINAL) + private ApproachSpeed approachSpeed; + + + //Children + @OneToMany(mappedBy = "area", cascade = CascadeType.ALL, fetch = FetchType.EAGER) + @OrderBy("description ASC") + private List securityDevices; + + @OneToMany(mappedBy = "securityArea", cascade = CascadeType.ALL) + private List dangerPoints; + + @OneToMany(mappedBy = "area", cascade = CascadeType.ALL) + private List switchingDevices; + + @OneToMany(mappedBy = "area", cascade = CascadeType.ALL, fetch = FetchType.LAZY) + private List questionnaires; + + //Parent + @ManyToOne(optional = false) + private Machine machine; + + //Notizen + @Lob + @Column(columnDefinition = "CLOB") + private String comment; + + @Lob + @Column(columnDefinition = "CLOB") + private String comment2; + + public SecurityArea() { + } + + public SecurityArea(SecurityArea area) { + this.name = area.name; + this.toolNr = area.toolNr; + this.protectionType = area.protectionType; + this.mountingPosition = area.mountingPosition; + this.overrunMeasurementType = area.overrunMeasurementType; + this.comment2 = area.getComment(); + this.approachSpeed = area.approachSpeed; + + if (area.securityDevices != null) { + this.securityDevices = new ArrayList<>(area.securityDevices.size()); + area.securityDevices.forEach(dev -> { + SecurityDevice device = new SecurityDevice(dev); + device.setArea(this); + this.securityDevices.add(device); + }); + } + if (area.dangerPoints != null) { + this.dangerPoints = new ArrayList<>(area.dangerPoints.size()); + area.dangerPoints.forEach(dp -> { + DangerPoint danger = new DangerPoint(dp); + danger.setSecurityArea(this); + if (dp.getSecurityDevice() != null && this.securityDevices != null) { + for(int i = 0; i < securityDevices.size() && danger.getSecurityDevice() == null; i++){ + SecurityDevice dev = securityDevices.get(i); + if (dp.getSecurityDevice().equals(dev)) { + danger.setSecurityDevice(dev); + } + } + } + this.dangerPoints.add(danger); + }); + } + if (area.switchingDevices != null) { + this.switchingDevices = new ArrayList<>(area.switchingDevices.size()); + area.switchingDevices.forEach(sd -> { + SwitchingDevice device = new SwitchingDevice(sd); + device.setArea(this); + switchingDevices.add(device); + }); + } + if (area.questionnaires != null) { + this.questionnaires = new ArrayList<>(area.questionnaires.size()); + area.questionnaires.forEach(q -> { + SecurityAreaQuestionnaire questionnaire = new SecurityAreaQuestionnaire(q, this); + questionnaire.setArea(this); + questionnaires.add(questionnaire); + }); + } + this.machine = area.machine; + } + + @PostLoad + private void switchToClobComment(){ + if (comment != null && comment2 == null) { + comment2 = comment; + } + } + + @Override + public String toString() { + return "SecurityArea{" + "name=" + name + ", toolNr=" + toolNr + ", protectionType=" + protectionType + ", mountingPosition=" + mountingPosition + ", overrunMeasurementType=" + overrunMeasurementType + ", approachSpeed=" + approachSpeed + ", comment=" + comment + '}'; + } + + public List getSwitchingDevices() { + return switchingDevices; + } + + public void setSwitchingDevices(List switchingDevices) { + this.switchingDevices = switchingDevices; + } + + public ApproachSpeed getApproachSpeed() { + return approachSpeed; + } + + public void setApproachSpeed(ApproachSpeed approachSpeed) { + this.approachSpeed = approachSpeed; + } + + public OverrunMeasurementType getOverrunMeasurementType() { + return overrunMeasurementType; + } + + public void setOverrunMeasurementType(OverrunMeasurementType overrunMeasurementType) { + this.overrunMeasurementType = overrunMeasurementType; + } + + public String getComment() { + return comment2; + } + + public void setComment(String comment) { + if (comment != null && comment.length() > 256) { + comment2 = comment; + } else { + this.comment2 = comment; + this.comment = comment; + } + } + + public ProtectionType getProtectionType() { + return protectionType; + } + + public void setProtectionType(ProtectionType protectionType) { + this.protectionType = protectionType; + } + + public String getToolNr() { + return toolNr; + } + + public void setToolNr(String toolNr) { + this.toolNr = toolNr; + } + + public MountingPosition getMountingPosition() { + return mountingPosition; + } + + public void setMountingPosition(MountingPosition mountingPosition) { + this.mountingPosition = mountingPosition; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getDangerPoints() { + return dangerPoints; + } + + public void setDangerPoints(List dangerPoints) { + this.dangerPoints = dangerPoints; + } + + public List getSecurityDevices() { + return securityDevices; + } + + public void setSecurityDevices(List securityDevices) { + this.securityDevices = securityDevices; + } + + public Machine getMachine() { + return machine; + } + + public void setMachine(Machine machine) { + this.machine = machine; + } + + public List getQuestionnaires() { + return questionnaires; + } + + public void setQuestionnaires(List questionnaires) { + this.questionnaires = questionnaires; + } +} diff --git a/java/mss-failsafe/src/main/java/model/security/SecurityAreaQuestion.java b/java/mss-failsafe/src/main/java/model/security/SecurityAreaQuestion.java new file mode 100755 index 0000000..9b9e676 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/security/SecurityAreaQuestion.java @@ -0,0 +1,128 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package model.security; + +import java.util.ArrayList; +import java.util.List; +import javax.persistence.*; + +import model.AbstractEntity; +import model.question.Question; +import model.question.enums.Answer; + +/** + * + * @author pplate + */ +@Entity +public class SecurityAreaQuestion extends AbstractEntity { + + @ManyToOne + private SecurityAreaQuestionnaire questionnaire; + + @Lob + @Column(columnDefinition = "CLOB") + private String text; + + @Enumerated(EnumType.ORDINAL) + private Answer answer; + + private String ownAnswer; + + private boolean standardValues; + + private Integer position; + + @ElementCollection(fetch = FetchType.LAZY) + @CollectionTable( + name = "SECURITYAREA_QUESTIONNAIRE_ANSWERS", + joinColumns = @JoinColumn(name = "question_id", referencedColumnName = "id") + ) + @Column(name = "answer_value") + private List answers; + + public SecurityAreaQuestion() { + } + + public SecurityAreaQuestion(Question question) { + this.text = question.getText(); + this.standardValues = question.isStandardValues(); + this.position = question.getPosition(); + if (standardValues) { + answer = Answer.YES; + } + if (question.getAnswers() != null) { + this.answers = new ArrayList<>(question.getAnswers()); + } + } + + public SecurityAreaQuestion(SecurityAreaQuestion other, SecurityAreaQuestionnaire questionnaire) { + this.questionnaire = questionnaire; + this.text = other.text; + this.answer = other.answer; + this.ownAnswer = other.ownAnswer; + this.standardValues = other.standardValues; + this.position = other.position; + if (other.answers != null) { + this.answers = new ArrayList<>(other.answers); + } + } + + public String getOwnAnswer() { + return ownAnswer; + } + + public void setOwnAnswer(String ownAnswer) { + this.ownAnswer = ownAnswer; + } + + public boolean isStandardValues() { + return standardValues; + } + + public void setStandardValues(boolean standardValues) { + this.standardValues = standardValues; + } + + public List getAnswers() { + return answers; + } + + public void setAnswers(List answers) { + this.answers = answers; + } + + public Answer getAnswer() { + return answer; + } + + public void setAnswer(Answer answer) { + this.answer = answer; + } + + public SecurityAreaQuestionnaire getQuestionnaire() { + return questionnaire; + } + + public void setQuestionnaire(SecurityAreaQuestionnaire questionnaire) { + this.questionnaire = questionnaire; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public Integer getPosition() { + return position; + } + + public void setPosition(Integer position) { + this.position = position; + } +} diff --git a/java/mss-failsafe/src/main/java/model/security/SecurityAreaQuestionnaire.java b/java/mss-failsafe/src/main/java/model/security/SecurityAreaQuestionnaire.java new file mode 100755 index 0000000..9eb233d --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/security/SecurityAreaQuestionnaire.java @@ -0,0 +1,81 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package model.security; + +import java.util.ArrayList; +import java.util.List; +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import model.AbstractEntity; +import model.question.Question; +import model.question.Questionaire; + +/** + * + * @author pplate + */ +@Entity +public class SecurityAreaQuestionnaire extends AbstractEntity { + + @OneToMany(mappedBy = "questionnaire", cascade = CascadeType.ALL, fetch = FetchType.LAZY) + private List questions; + + @ManyToOne + private SecurityArea area; + + private String name; + + public SecurityAreaQuestionnaire() { + } + + public SecurityAreaQuestionnaire(Questionaire questionaire) { + this.questions = new ArrayList<>(); + this.name = questionaire.getName(); + if (questionaire.getQuestions() != null) { + for(Question q : questionaire.getQuestions()){ + SecurityAreaQuestion quest = new SecurityAreaQuestion(q); + quest.setQuestionnaire(this); + questions.add(quest); + } + } + } + + public SecurityAreaQuestionnaire(SecurityAreaQuestionnaire other, SecurityArea area) { + if (other.getQuestions() != null) { + this.questions = new ArrayList<>(other.getQuestions().size()); + other.questions.forEach(q -> questions.add(new SecurityAreaQuestion(q, this))); + } + + this.area = area; + this.name = other.name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getQuestions() { + return questions; + } + + public void setQuestions(List questions) { + this.questions = questions; + } + + public SecurityArea getArea() { + return area; + } + + public void setArea(SecurityArea area) { + this.area = area; + } +} diff --git a/java/mss-failsafe/src/main/java/model/security/SecurityDevice.java b/java/mss-failsafe/src/main/java/model/security/SecurityDevice.java new file mode 100755 index 0000000..08be075 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/security/SecurityDevice.java @@ -0,0 +1,612 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package model.security; + +import java.util.Objects; +import model.machine.enums.Option; +import model.security.enums.*; + +import javax.persistence.*; + +import model.AbstractEntity; +import model.security.enums.SecurityType; + +/** + * + * @author patri + */ +@Entity +public class SecurityDevice extends AbstractEntity{ + + private transient Long oldID; + + @ManyToOne + private SecurityArea area; + + @ManyToOne + private SecurityDeviceCompany company; + + @Enumerated(EnumType.STRING) + private SecurityType type; + + //Identifikation + private String description; + private String serialNrSender; + private String serialNrReceiver; + private String configID; + private String bmk; + private String rfid; + + //Eigenschaften/Typisierung + @Enumerated(EnumType.ORDINAL) + private DeviceRole deviceRole; + @Enumerated(EnumType.ORDINAL) + private SecurityCategory securityCategory; + @Enumerated(EnumType.ORDINAL) + private SfAlignment sfAlignment; + @Enumerated(EnumType.ORDINAL) + private MutingBlankingModus mutingBlankingModus; + @Enumerated(EnumType.ORDINAL) + private MutingSignals mutingSignals; + @Enumerated(EnumType.ORDINAL) + private Option eSPE_Paramable; + @Enumerated(EnumType.ORDINAL) + private Component component; + + //For Type Tuerschalter + @Enumerated(EnumType.ORDINAL) + private BuildType buildType; + + //Zahlen- und Datumswerte + //mm + private Integer sFdWidth; + private Integer sFdWidthTwo; + private Integer sFHeightDepth; + private Integer heightTopRay; + private Integer heightOverReference; + private Integer distanceTable; + private Integer detectionCapacity; + + //Only Laserscanner (mm) + private Integer zsm; + private Integer floorspace; + + //ms + private Integer responseTime; + + @Lob + private String comment; + + @Lob + @Column(columnDefinition = "CLOB") + private String comment2; + + //for table changes + @Enumerated(EnumType.ORDINAL) + private NotHaltType notHaltType; + + @Enumerated(EnumType.ORDINAL) + private Principle principle; + + @Enumerated(EnumType.ORDINAL) + private StopCategory stopCategory; + + @Enumerated(EnumType.ORDINAL) + private NotHaltContact notHaltContact; + + private String confirmation; + private Boolean coded; + private Boolean pimped; + + public SecurityDevice() { + } + + public SecurityDevice(SecurityDevice device) { + setId(null); + oldID = device.getId(); + this.sFdWidthTwo = device.sFdWidthTwo; + this.floorspace = device.floorspace; + this.zsm = device.zsm; + this.area = device.area; + this.company = device.company; + this.type = device.type; + this.description = device.description; + this.serialNrSender = device.serialNrSender; + this.serialNrReceiver = device.serialNrReceiver; + this.configID = device.configID; + this.bmk = device.bmk; + this.deviceRole = device.deviceRole; + this.securityCategory = device.securityCategory; + this.sfAlignment = device.sfAlignment; + this.mutingBlankingModus = device.mutingBlankingModus; + this.mutingSignals = device.mutingSignals; + this.eSPE_Paramable = device.eSPE_Paramable; + this.component = device.component; + this.sFdWidth = device.sFdWidth; + this.sFHeightDepth = device.sFHeightDepth; + this.heightTopRay = device.heightTopRay; + this.heightOverReference = device.heightOverReference; + this.distanceTable = device.distanceTable; + this.detectionCapacity = device.detectionCapacity; + this.responseTime = device.responseTime; + this.comment2 = device.getComment(); + + this.rfid = device.rfid; + this.buildType = device.buildType; + this.principle = device.principle; + this.confirmation = device.confirmation; + this.coded = device.coded; + this.pimped = device.pimped; + this.notHaltType = device.notHaltType; + this.stopCategory = device.stopCategory; + this.notHaltContact = device.notHaltContact; + } + + @PostLoad + private void switchToClobComment(){ + if (comment != null && comment2 == null) { + comment2 = comment; + } + } + + @Override + public int hashCode() { + int hash = 3; + hash = 29 * hash + Objects.hashCode(this.company); + hash = 29 * hash + Objects.hashCode(this.type); + hash = 29 * hash + Objects.hashCode(this.description); + hash = 29 * hash + Objects.hashCode(this.serialNrSender); + hash = 29 * hash + Objects.hashCode(this.serialNrReceiver); + hash = 29 * hash + Objects.hashCode(this.configID); + hash = 29 * hash + Objects.hashCode(this.bmk); + hash = 29 * hash + Objects.hashCode(this.rfid); + hash = 29 * hash + Objects.hashCode(this.deviceRole); + hash = 29 * hash + Objects.hashCode(this.securityCategory); + hash = 29 * hash + Objects.hashCode(this.sfAlignment); + hash = 29 * hash + Objects.hashCode(this.mutingBlankingModus); + hash = 29 * hash + Objects.hashCode(this.mutingSignals); + hash = 29 * hash + Objects.hashCode(this.eSPE_Paramable); + hash = 29 * hash + Objects.hashCode(this.component); + hash = 29 * hash + Objects.hashCode(this.buildType); + hash = 29 * hash + Objects.hashCode(this.sFdWidth); + hash = 29 * hash + Objects.hashCode(this.sFdWidthTwo); + hash = 29 * hash + Objects.hashCode(this.sFHeightDepth); + hash = 29 * hash + Objects.hashCode(this.heightTopRay); + hash = 29 * hash + Objects.hashCode(this.heightOverReference); + hash = 29 * hash + Objects.hashCode(this.distanceTable); + hash = 29 * hash + Objects.hashCode(this.detectionCapacity); + hash = 29 * hash + Objects.hashCode(this.zsm); + hash = 29 * hash + Objects.hashCode(this.floorspace); + hash = 29 * hash + Objects.hashCode(this.responseTime); + hash = 29 * hash + Objects.hashCode(this.comment2); + hash = 29 * hash + Objects.hashCode(this.notHaltType); + hash = 29 * hash + Objects.hashCode(this.principle); + hash = 29 * hash + Objects.hashCode(this.stopCategory); + hash = 29 * hash + Objects.hashCode(this.notHaltContact); + hash = 29 * hash + Objects.hashCode(this.confirmation); + hash = 29 * hash + Objects.hashCode(this.coded); + hash = 29 * hash + Objects.hashCode(this.pimped); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final SecurityDevice other = (SecurityDevice) obj; + if (!Objects.equals(this.description, other.description)) { + return false; + } + if (!Objects.equals(this.serialNrSender, other.serialNrSender)) { + return false; + } + if (!Objects.equals(this.serialNrReceiver, other.serialNrReceiver)) { + return false; + } + if (!Objects.equals(this.configID, other.configID)) { + return false; + } + if (!Objects.equals(this.bmk, other.bmk)) { + return false; + } + if (!Objects.equals(this.rfid, other.rfid)) { + return false; + } + if (!Objects.equals(this.comment2, other.comment2)) { + return false; + } + if (!Objects.equals(this.confirmation, other.confirmation)) { + return false; + } + if (!Objects.equals(this.company, other.company)) { + return false; + } + if (this.type != other.type) { + return false; + } + if (this.deviceRole != other.deviceRole) { + return false; + } + if (this.securityCategory != other.securityCategory) { + return false; + } + if (this.sfAlignment != other.sfAlignment) { + return false; + } + if (this.mutingBlankingModus != other.mutingBlankingModus) { + return false; + } + if (this.mutingSignals != other.mutingSignals) { + return false; + } + if (this.eSPE_Paramable != other.eSPE_Paramable) { + return false; + } + if (this.component != other.component) { + return false; + } + if (this.buildType != other.buildType) { + return false; + } + if (!Objects.equals(this.sFdWidth, other.sFdWidth)) { + return false; + } + if (!Objects.equals(this.sFdWidthTwo, other.sFdWidthTwo)) { + return false; + } + if (!Objects.equals(this.sFHeightDepth, other.sFHeightDepth)) { + return false; + } + if (!Objects.equals(this.heightTopRay, other.heightTopRay)) { + return false; + } + if (!Objects.equals(this.heightOverReference, other.heightOverReference)) { + return false; + } + if (!Objects.equals(this.distanceTable, other.distanceTable)) { + return false; + } + if (!Objects.equals(this.detectionCapacity, other.detectionCapacity)) { + return false; + } + if (!Objects.equals(this.zsm, other.zsm)) { + return false; + } + if (!Objects.equals(this.floorspace, other.floorspace)) { + return false; + } + if (!Objects.equals(this.responseTime, other.responseTime)) { + return false; + } + if (this.notHaltType != other.notHaltType) { + return false; + } + if (this.principle != other.principle) { + return false; + } + if (this.stopCategory != other.stopCategory) { + return false; + } + if (this.notHaltContact != other.notHaltContact) { + return false; + } + if (!Objects.equals(this.coded, other.coded)) { + return false; + } + if (!Objects.equals(this.pimped, other.pimped)) { + return false; + } + return true; + } + + + + public Integer getsFdWidthTwo() { + return sFdWidthTwo; + } + + public void setsFdWidthTwo(Integer sFdWidthTwo) { + this.sFdWidthTwo = sFdWidthTwo; + } + + public Integer getZsm() { + return zsm; + } + + public void setZsm(Integer zsm) { + this.zsm = zsm; + } + + public Integer getFloorspace() { + return floorspace; + } + + public void setFloorspace(Integer floorspace) { + this.floorspace = floorspace; + } + + public Component getComponent() { + return component; + } + + public void setComponent(Component component) { + this.component = component; + } + + public Option geteSPE_Paramable() { + return eSPE_Paramable; + } + + public void seteSPE_Paramable(Option eSPE_Paramable) { + this.eSPE_Paramable = eSPE_Paramable; + } + + public MutingSignals getMutingSignals() { + return mutingSignals; + } + + public void setMutingSignals(MutingSignals mutingSignals) { + this.mutingSignals = mutingSignals; + } + + public SfAlignment getSfAlignment() { + return sfAlignment; + } + + public void setSfAlignment(SfAlignment sfAlignment) { + this.sfAlignment = sfAlignment; + } + + public MutingBlankingModus getMutingBlankingModus() { + return mutingBlankingModus; + } + + public void setMutingBlankingModus(MutingBlankingModus mutingBlankingModus) { + this.mutingBlankingModus = mutingBlankingModus; + } + + public DeviceRole getDeviceRole() { + return deviceRole; + } + + public void setDeviceRole(DeviceRole deviceRole) { + this.deviceRole = deviceRole; + } + + public SecurityCategory getSecurityCategory() { + return securityCategory; + } + + public void setSecurityCategory(SecurityCategory securityCategory) { + this.securityCategory = securityCategory; + } + + public SecurityArea getArea() { + return area; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getSerialNrSender() { + return serialNrSender; + } + + public void setSerialNrSender(String serialNrSender) { + this.serialNrSender = serialNrSender; + } + + public String getSerialNrReceiver() { + return serialNrReceiver; + } + + public void setSerialNrReceiver(String serialNrReceiver) { + this.serialNrReceiver = serialNrReceiver; + } + + public String getConfigID() { + return configID; + } + + public void setConfigID(String configID) { + this.configID = configID; + } + + public String getBmk() { + return bmk; + } + + public void setBmk(String bmk) { + this.bmk = bmk; + } + + public Integer getsFdWidth() { + return sFdWidth; + } + + public void setsFdWidth(Integer sFdWidth) { + this.sFdWidth = sFdWidth; + } + + public Integer getsFHeightDepth() { + return sFHeightDepth; + } + + public void setsFHeightDepth(Integer sFHeightDepth) { + this.sFHeightDepth = sFHeightDepth; + } + + public Integer getHeightTopRay() { + return heightTopRay; + } + + public void setHeightTopRay(Integer heightTopRay) { + this.heightTopRay = heightTopRay; + } + + public Integer getHeightOverReference() { + return heightOverReference; + } + + public void setHeightOverReference(Integer heightOverReference) { + this.heightOverReference = heightOverReference; + } + + public Integer getDistanceTable() { + return distanceTable; + } + + public void setDistanceTable(Integer distanceTable) { + this.distanceTable = distanceTable; + } + + public Integer getDetectionCapacity() { + return detectionCapacity; + } + + public void setDetectionCapacity(Integer detectionCapacity) { + this.detectionCapacity = detectionCapacity; + } + + public Integer getResponseTime() { + return responseTime; + } + + public void setResponseTime(Integer responseTime) { + this.responseTime = responseTime; + } + + public String getComment() { + return comment2; + } + + public void setComment(String comment) { + if (comment != null && comment.length() > 256) { + comment2 = comment; + } else { + this.comment2 = comment; + this.comment = comment; + } + } + + public void setArea(SecurityArea area) { + this.area = area; + } + + public SecurityType getType() { + return type; + } + + public void setType(SecurityType type) { + this.type = type; + } + + public SecurityDeviceCompany getCompany() { + return company; + } + + public void setCompany(SecurityDeviceCompany company) { + this.company = company; + } + + public String getRfid() { + return rfid; + } + + public void setRfid(String rfid) { + this.rfid = rfid; + } + + public BuildType getBuildType() { + return buildType; + } + + public void setBuildType(BuildType buildType) { + this.buildType = buildType; + } + + public Principle getPrinciple() { + return principle; + } + + public void setPrinciple(Principle principle) { + this.principle = principle; + } + + public String getConfirmation() { + return confirmation; + } + + public void setConfirmation(String confirmation) { + this.confirmation = confirmation; + } + + public Boolean getCoded() { + if (coded == null) { + coded = false; + } + return coded; + } + + public void setCoded(Boolean coded) { + this.coded = coded; + } + + public Boolean getPimped() { + if (pimped == null) { + pimped = false; + } + return pimped; + } + + public void setPimped(Boolean pimped) { + this.pimped = pimped; + } + + public NotHaltType getNotHaltType() { + return notHaltType; + } + + public void setNotHaltType(NotHaltType notHaltType) { + this.notHaltType = notHaltType; + } + + public StopCategory getStopCategory() { + return stopCategory; + } + + public void setStopCategory(StopCategory stopCategory) { + this.stopCategory = stopCategory; + } + + public NotHaltContact getNotHaltContact() { + return notHaltContact; + } + + public void setNotHaltContact(NotHaltContact notHaltContact) { + this.notHaltContact = notHaltContact; + } + + public Long getOldID() { + return oldID; + } + + public void setOldID(Long oldID) { + this.oldID = oldID; + } +} diff --git a/java/mss-failsafe/src/main/java/model/security/SecurityDeviceCompany.java b/java/mss-failsafe/src/main/java/model/security/SecurityDeviceCompany.java new file mode 100755 index 0000000..9911950 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/security/SecurityDeviceCompany.java @@ -0,0 +1,54 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package model.security; + +import java.util.List; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.OneToMany; +import model.AbstractEntity; + +/** + * + * @author pplate + */ +@Entity +public class SecurityDeviceCompany extends AbstractEntity implements Comparable{ + + @OneToMany(mappedBy = "company", fetch = FetchType.EAGER) + private List securityDevices; + + private String name; + + public SecurityDeviceCompany() { + } + + public List getSecurityDevices() { + return securityDevices; + } + + public void setSecurityDevices(List securityDevices) { + this.securityDevices = securityDevices; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public int compareTo(SecurityDeviceCompany arg0) { + if (name == null) { + return -1; + } + if (arg0 == null || arg0.getName() == null) { + return 1; + } + return String.CASE_INSENSITIVE_ORDER.compare(name, arg0.name); + } +} diff --git a/java/mss-failsafe/src/main/java/model/security/SecurityType.java b/java/mss-failsafe/src/main/java/model/security/SecurityType.java new file mode 100755 index 0000000..cdd2f75 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/security/SecurityType.java @@ -0,0 +1,34 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package model.security; + +/** + * + * @author patri + */ +public enum SecurityType { + LIGHTGRID("Lichtgitter"), + LIGHTCURTAIN("Lichtvorhang"), + LASERRSCANNER("Laserscanner"), + TUER_SICHERHEITSSCHALTER("Tür-Sicherheitsschalter"), + ZWEIHANDSCHALTUNG("Zweihandschaltung"), + NOT_HALT_BEFEHLSGERAET("Not Halt Befehlsgerät"); + + public final String name; + + private SecurityType(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return name; + } +} diff --git a/java/mss-failsafe/src/main/java/model/security/enums/ApproachSpeed.java b/java/mss-failsafe/src/main/java/model/security/enums/ApproachSpeed.java new file mode 100755 index 0000000..077eeda --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/security/enums/ApproachSpeed.java @@ -0,0 +1,44 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Enum.java to edit this template + */ +package model.security.enums; + +import java.math.BigDecimal; + +/** + * + * @author pplate + */ +public enum ApproachSpeed { + SPEED_0_6("0,6 m/s", new BigDecimal("0.6")), + SPEED_1_6("1,6 m/s", new BigDecimal("1.6")), + SPEED_2_0("2,0 m/s", new BigDecimal("2.0")); + + public final String name; + public final BigDecimal realValue; + + private ApproachSpeed(String name, BigDecimal bd) { + this.name = name; + this.realValue = bd; + } + + public static ApproachSpeed getFromString(String value){ + if (value == null || value.contains("-/-")) { + return null; + } + + for(ApproachSpeed app : values()){ + if (value.contains(app.name)) { + return app; + } + } + + return null; + } + + @Override + public String toString() { + return name; + } +} diff --git a/java/mss-failsafe/src/main/java/model/security/enums/BuildType.java b/java/mss-failsafe/src/main/java/model/security/enums/BuildType.java new file mode 100755 index 0000000..a2e429d --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/security/enums/BuildType.java @@ -0,0 +1,45 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Enum.java to edit this template + */ +package model.security.enums; + +/** + * + * @author pplate + */ +public enum BuildType { + ONE("1"), + TWO("2"), + THREE("3"), + FOUR("4"); + + private final String name; + + private BuildType(String name) { + this.name = name; + } + + public static BuildType getByString(String value){ + if (value == null || value.contains("-/-")) { + return null; + } + + for(BuildType cat : values()){ + if (value.equals(cat.name)) { + return cat; + } + } + + return null; + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return name; + } +} diff --git a/java/mss-failsafe/src/main/java/model/security/enums/Component.java b/java/mss-failsafe/src/main/java/model/security/enums/Component.java new file mode 100755 index 0000000..2c7548b --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/security/enums/Component.java @@ -0,0 +1,36 @@ +package model.security.enums; + +public enum Component { + DEFLECTION_MIRROR("Umlenkspiegel"), + MUTING_SENSOR_MODUL("Muting-Sensor-Modul"), + SECURITY_IO_MODUL("Sicherheits-I/O-Modul"), + EXTNSION_MODUL("Erweiterungsmodul"), + PROTECTIVE_SCREEN("Schutzscheibe"), + EX_PROTECTIVE_CASE("Ex-Schutzgehäuse"), + PROTECTOR("Protektor"); + + public final String NAME; + + private Component(String NAME) { + this.NAME = NAME; + } + + public static Component getByString(String value){ + if (value == null || value.contains("-/-")) { + return null; + } + + for(Component c : values()){ + if (value.contains(c.NAME)) { + return c; + } + } + + return null; + } + + @Override + public String toString() { + return NAME; + } +} diff --git a/java/mss-failsafe/src/main/java/model/security/enums/DeviceRole.java b/java/mss-failsafe/src/main/java/model/security/enums/DeviceRole.java new file mode 100755 index 0000000..3542ab3 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/security/enums/DeviceRole.java @@ -0,0 +1,33 @@ +package model.security.enums; + +public enum DeviceRole { + BASE("Grundgerät"), + BASE_EXTENSION("Grundgerät zur SF-Erweiterung"), + HOST("Host"), + GUEST("Guest (Folgegerät)"); + + public final String NAME; + + private DeviceRole(String name) { + this.NAME = name; + } + + public static DeviceRole getByString(String value){ + if (value == null || value.contains("-/-")) { + return null; + } + + for(DeviceRole role : values()){ + if (value.contains(role.NAME)) { + return role; + } + } + + return null; + } + + @Override + public String toString() { + return NAME; + } +} diff --git a/java/mss-failsafe/src/main/java/model/security/enums/MountingPosition.java b/java/mss-failsafe/src/main/java/model/security/enums/MountingPosition.java new file mode 100755 index 0000000..7fe9c3f --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/security/enums/MountingPosition.java @@ -0,0 +1,45 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Enum.java to edit this template + */ +package model.security.enums; + +/** + * + * @author pplate + */ +public enum MountingPosition { + FRONT("Vorderseite"), + BACK("Rückseite"), + ENTRY("Einlauf"), + EXIT("Auslauf"), + LEFT("linke Seite"), + MID("Mitte"), + RIGHT("rechte Seite"), + MULTIPLE("mehrere"); + + public final String name; + + public static MountingPosition getFromString(String value){ + if (value == null || value.contains("-/-")) { + return null; + } + + for(MountingPosition pos : values()){ + if (value.contains(pos.name)) { + return pos; + } + } + + return null; + } + + private MountingPosition(String name) { + this.name = name; + } + + @Override + public String toString() { + return name; + } +} diff --git a/java/mss-failsafe/src/main/java/model/security/enums/MutingBlankingModus.java b/java/mss-failsafe/src/main/java/model/security/enums/MutingBlankingModus.java new file mode 100755 index 0000000..28d7de8 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/security/enums/MutingBlankingModus.java @@ -0,0 +1,36 @@ +package model.security.enums; + +public enum MutingBlankingModus { + TWO_SENSOR_TIME("2-Sensor-Zeitsteuerung"), + FOUR_SENSOR_TIME("4-Sensor-Zeitsteuerung"), + TWO_SENSOR_SEQUENCE("2-Sensor-Sequenzsteuerung"), + FOUR_SENSOR_SEQUENCE("4-Sensor-Sequenzsteuerung"), + OBJECT_DETECTION("Objekterkennung o. Signal"), + FIXED_BLANKING("Ortsfeste Ausblendung"), + RELOCATABLE_BLANKING("Ortsveränderliche Ausblendung"); + + public final String NAME; + + private MutingBlankingModus(String name){ + this.NAME = name; + } + + public static MutingBlankingModus getbyString(String value){ + if (value == null || value.contains("-/-")) { + return null; + } + + for(MutingBlankingModus m : values()){ + if (value.contains(m.NAME)) { + return m; + } + } + + return null; + } + + @Override + public String toString() { + return NAME; + } +} diff --git a/java/mss-failsafe/src/main/java/model/security/enums/MutingSignals.java b/java/mss-failsafe/src/main/java/model/security/enums/MutingSignals.java new file mode 100755 index 0000000..828b1bb --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/security/enums/MutingSignals.java @@ -0,0 +1,42 @@ +package model.security.enums; + +public enum MutingSignals { + REFLEXION_LS("Reflexions-LS"), + REFLEXION_LT("Reflexions-LT"), + ONEWAY_LS("Einweg-LS"), + REFLEXION_LS_PLC("Reflexions-LS / PLC"), + REFLEXION_LT_PLC("Reflexions-LT / PLC"), + ONEWAY_LS_PLC("Einweg-LS / PLC"), + PLC("PLC"), + INDUCTIVE_SIGNALS("Induktive-Sensoren"), + INDUCTIVE_SIGNALS_PLC("Induktive-Sensoren / PLC"), + SUPERSONIC_SENSORS("Ultaschall-Sensoren"), + SUPERSONIC_SENSORS_PLC("Ultaschall-Sensoren / PLC"), + CONTACT_LOOP("Kontaktschleife(n)"), + MECHANIC_SWITCHING_CONTACTS("Mech. Schaltkontakte"); + + public final String NAME; + + private MutingSignals(String name){ + this.NAME = name; + } + + public static MutingSignals getByString(String value){ + if (value == null || value.contains("-/-")) { + return null; + } + + for(MutingSignals m : values()){ + if (value.contains(m.NAME)) { + return m; + } + } + + return null; + } + + @Override + public String toString() { + return NAME; + } +} diff --git a/java/mss-failsafe/src/main/java/model/security/enums/NotHaltContact.java b/java/mss-failsafe/src/main/java/model/security/enums/NotHaltContact.java new file mode 100755 index 0000000..c239511 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/security/enums/NotHaltContact.java @@ -0,0 +1,41 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package model.security.enums; + +/** + * + * @author patri + */ +public enum NotHaltContact { + CHANNEL1("Kanäle 1"), + CHANNEL2("Kanäle 2"); + + public final String name; + + public static NotHaltContact getFromString(String value){ + if (value == null || value.contains("-/-")) { + return null; + } + + NotHaltContact[] types = values(); + for (NotHaltContact type : types) { + if (value.contains(type.name)) { + return type; + } + } + + return null; + } + + private NotHaltContact(String name) { + this.name = name; + } + + @Override + public String toString() { + return name; + } +} diff --git a/java/mss-failsafe/src/main/java/model/security/enums/NotHaltType.java b/java/mss-failsafe/src/main/java/model/security/enums/NotHaltType.java new file mode 100755 index 0000000..ec7e305 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/security/enums/NotHaltType.java @@ -0,0 +1,46 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package model.security.enums; + +/** + * + * @author patri + */ +public enum NotHaltType { + ZUG("Not-Halt-Pilzdrucktaster mit Zugentriegelung"), + SCHUTZ("Not-Halt-Pilzdrucktaster mit Zugentriegelung und Schutzkragen"), + SCHLUESSEL("Not-Halt-Pilzdrucktaster mit Schlüsselentriegelung"), + MAIN("Not-Aus-Hauptschalter"), + PULLER("Seilzugschalter"), + FOOT("Fußschalter ohne mechanischen Schutz"), + PILZ("Drucktastenbetätigter Schalter (palmen- oder pilzkopfförmig)"); + + public final String name; + + public static NotHaltType getFromString(String value){ + if (value == null || value.contains("-/-")) { + return null; + } + + NotHaltType[] types = values(); + for (NotHaltType type : types) { + if (value.contains(type.name)) { + return type; + } + } + + return null; + } + + private NotHaltType(String name) { + this.name = name; + } + + @Override + public String toString() { + return name; + } +} diff --git a/java/mss-failsafe/src/main/java/model/security/enums/OverrunMeasurementType.java b/java/mss-failsafe/src/main/java/model/security/enums/OverrunMeasurementType.java new file mode 100755 index 0000000..9ebe667 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/security/enums/OverrunMeasurementType.java @@ -0,0 +1,59 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Enum.java to edit this template + */ +package model.security.enums; + +/** + * + * @author pplate + */ +public enum OverrunMeasurementType { + TOTAL_OVERRUN("Gesamtnachlaufzeit"), + AFTER_PROTECTIVE_DEVICE("nach Schutzeinrichtung"), + NO_MEASUREMENT_TECHNICAL("keine Messung, technisch nicht möglich"), + NO_MEASUREMENT_FORMULA("keine Messung, Formel nicht anwendbar"), + NO_MEASUREMENT_ALREADY_DONE("keine Messung, bereits durchgeführt"), + NO_MEASUREMENT_CUSTOMER_WISH("keine Messung, kundenseitig n. erwünscht"), + NO_MEASUREMENT_REDUCED_FUNCTION("keine Messung, eingeschränkte Funktion"), + NO_MEASUREMENT_CUSTOMER_SELF("keine Messung, führt Kunde selbst durch"), + NO_MEASUREMENT_MACHINE_VALUES("keine Messung, Maschinenwerte übernommen"), + NO_MEASUREMENT_CUSTOMER_RECEIVED("keine Messung, Werte vom Kunden erhalten"), + NO_MEASUREMENT_COMMENT("keine Messung, siehe Bemerkung"); + + public final String name; + + private OverrunMeasurementType(String name) { + this.name = name; + } + + public static OverrunMeasurementType getFromString(String value){ + if (value == null || value.contains("-/-")) { + return null; + } + + for(OverrunMeasurementType type : values()){ + if (value.contains(type.name)) { + return type; + } + } + + return null; + } + + public boolean hasToMeasure(){ + switch (this) { + case TOTAL_OVERRUN: + return true; + case AFTER_PROTECTIVE_DEVICE: + return true; + default: + return false; + } + } + + @Override + public String toString() { + return name; + } +} diff --git a/java/mss-failsafe/src/main/java/model/security/enums/Principle.java b/java/mss-failsafe/src/main/java/model/security/enums/Principle.java new file mode 100755 index 0000000..9592435 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/security/enums/Principle.java @@ -0,0 +1,46 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package model.security.enums; + +/** + * + * @author patri + */ +public enum Principle { + CONTACT("Kontakt/Kraft/Druck"), + INDUCTIVE("induktiv"), + MAGNETIC("magnetisch"), + CAPACETIVE("kapazitiv"), + SONIC("Ultraschall"), + RFID("RFID"), + OPTICLE("OPTISCH"); + + public final String name; + + public static Principle getFromString(String value){ + if (value == null || value.contains("-/-")) { + return null; + } + + Principle[] types = values(); + for (Principle type : types) { + if (value.contains(type.name)) { + return type; + } + } + + return null; + } + + private Principle(String name) { + this.name = name; + } + + @Override + public String toString() { + return name; + } +} diff --git a/java/mss-failsafe/src/main/java/model/security/enums/ProtectionType.java b/java/mss-failsafe/src/main/java/model/security/enums/ProtectionType.java new file mode 100755 index 0000000..356cdc4 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/security/enums/ProtectionType.java @@ -0,0 +1,55 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Enum.java to edit this template + */ +package model.security.enums; + +/** + * + * @author pplate + */ +public enum ProtectionType { + DANGER_POINT("Gefahrstelle"), + DANGER_POINT_CLOCK("Gefahrstelle mit Taktsteuerung"), + DANGER_POINT_MUTING("Gefahrstelle mit Muting"), + DANGER_POINT_BLANKING("Gefahrstelle mit Blanking"), + ATTENDANCE_MONITORING("Anwesenheitsüberwachung"), + ENTRY("Zugang"), + ENTRY_MUTING("Zugang mit Muting"), + ENTRY_GATING("Zugang mit Gating (SPG)"), + ENTRY_MULTIPLE("Zugang mehrfach"), + ENTRY_ALL_AROUNG("Zugang rundum"), + LS_MOBILE("LS mobil: Gefahrbereich"), + LS_STATION_DANGER("LS stationär: Gefahrber./Stelle/Zugang"), + LS_STATION_MUTING("LS stationär: Zugang mit Muting"), + TS_ENTRY("TS: Zugang"), + TS_FLAP("TS: Klappe"), + TS_HOOD("TS: Haube"); + + + public final String name; + + public static ProtectionType getFromString(String value){ + if (value == null || value.contains("-/-")) { + return null; + } + + ProtectionType[] types = values(); + for (ProtectionType type : types) { + if (value.contains(type.name)) { + return type; + } + } + + return null; + } + + private ProtectionType(String name) { + this.name = name; + } + + @Override + public String toString() { + return name; + } +} diff --git a/java/mss-failsafe/src/main/java/model/security/enums/SecurityCategory.java b/java/mss-failsafe/src/main/java/model/security/enums/SecurityCategory.java new file mode 100755 index 0000000..2788c24 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/security/enums/SecurityCategory.java @@ -0,0 +1,52 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package model.security.enums; + +/** + * + * @author patri + */ +public enum SecurityCategory { + B("B"), + ONE("1"), + TWO("2"), + THREE("3"), + FOUR("4"), + BWS_S("BWS-S"), + KAT1("Kat 1 / Typ I-IIIA"), + KAT3("Kat 3 / Typ II-IIIB"), + KAT4("Kat 4 / Typ IIIC"), + NA("n/a"); + + private final String name; + + private SecurityCategory(String name) { + this.name = name; + } + + public static SecurityCategory getByString(String value){ + if (value == null || value.contains("-/-")) { + return null; + } + + for(SecurityCategory cat : values()){ + if (value.equals(cat.name)) { + return cat; + } + } + + return null; + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return name; + } +} diff --git a/java/mss-failsafe/src/main/java/model/security/enums/SecurityType.java b/java/mss-failsafe/src/main/java/model/security/enums/SecurityType.java new file mode 100755 index 0000000..641d0ed --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/security/enums/SecurityType.java @@ -0,0 +1,68 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package model.security.enums; + +/** + * + * @author patri + */ +public enum SecurityType { + LIGHTGRID("Lichtgitter", "LG"), + LIGHTCURTAIN("Lichtvorhang", "LV"), + LASERRSCANNER("Laserscanner", "LS"), + DOOR_SECURITY_SWITCH("Tür-Sicherheitsschalter", "TS"), + TWO_HANDED_SWITCH("Zweihandschaltung", "ZS"), + NOT_HALT_BEFEHLSGERAET("Not-Halt-Befehlsgerät", "NHB"), + RADARSENSOR("Radarsensor", "RS"); + + private final String name; + private final String shortName; + + private SecurityType(String name, String shortName) { + this.name = name; + this.shortName = shortName; + } + + public static String[] getNames(){ + SecurityType[] types = values(); + String[] names = new String[types.length]; + + for (int i = 0; i < types.length; i++){ + names[i] = types[i].name; + } + + return names; + } + + public static SecurityType getByString(String value){ + if (value == null || value.contains("-/-")) { + return null; + } + + for(SecurityType type : values()){ + if (value.startsWith(type.name)) { + return type; + } + } + + return null; + } + + public String getName() { + return name; + } + + public String getShortName() { + return shortName; + } + + @Override + public String toString() { + return name; + } + + +} diff --git a/java/mss-failsafe/src/main/java/model/security/enums/SfAlignment.java b/java/mss-failsafe/src/main/java/model/security/enums/SfAlignment.java new file mode 100755 index 0000000..ffcfacd --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/security/enums/SfAlignment.java @@ -0,0 +1,32 @@ +package model.security.enums; + +public enum SfAlignment { + VERTICAL("vertikal"), + DIAGONAL("diagonal"), + HORIZONTAL("horizontal"); + + public final String NAME; + + private SfAlignment(String name){ + this.NAME = name; + } + + public static SfAlignment getbyString(String value){ + if (value == null || value.contains("-/-")) { + return null; + } + + for(SfAlignment sf : values()){ + if (value.contains(sf.NAME)) { + return sf; + } + } + + return null; + } + + @Override + public String toString() { + return NAME; + } +} diff --git a/java/mss-failsafe/src/main/java/model/security/enums/StopCategory.java b/java/mss-failsafe/src/main/java/model/security/enums/StopCategory.java new file mode 100755 index 0000000..c9c603f --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/security/enums/StopCategory.java @@ -0,0 +1,42 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package model.security.enums; + +/** + * + * @author patri + */ +public enum StopCategory { + ZERO("0"), + ONE("1"), + TWO("2"); + + public final String name; + + public static StopCategory getFromString(String value){ + if (value == null || value.contains("-/-")) { + return null; + } + + StopCategory[] types = values(); + for (StopCategory type : types) { + if (value.contains(type.name)) { + return type; + } + } + + return null; + } + + private StopCategory(String name) { + this.name = name; + } + + @Override + public String toString() { + return name; + } +} diff --git a/java/mss-failsafe/src/main/java/model/security/switching/SwitchingDevice.java b/java/mss-failsafe/src/main/java/model/security/switching/SwitchingDevice.java new file mode 100755 index 0000000..098ddfb --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/security/switching/SwitchingDevice.java @@ -0,0 +1,145 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package model.security.switching; + +import javax.persistence.*; + +import model.AbstractEntity; +import model.security.SecurityArea; +import model.security.SecurityDeviceCompany; +import model.security.enums.Component; +import model.security.enums.SecurityCategory; + +/** + * + * @author pplate + */ +@Entity +public class SwitchingDevice extends AbstractEntity { + + @ManyToOne + private SecurityArea area; + + @ManyToOne + private SecurityDeviceCompany company; + + @Enumerated(EnumType.ORDINAL) + private SecurityCategory securityCategory; + + //Identifikation + private String description; + private String serialNrSender; + private String configID; + private String remark; + + @Lob + private String comment; + + @Lob + @Column(columnDefinition = "CLOB") + private String comment2; + + @Enumerated(EnumType.ORDINAL) + private Component component; + + public SwitchingDevice() { + } + + public SwitchingDevice(SwitchingDevice sd) { + this.area = sd.area; + this.company = sd.company; + this.securityCategory = sd.securityCategory; + this.description = sd.description; + this.serialNrSender = sd.serialNrSender; + this.configID = sd.configID; + this.remark = sd.remark; + this.comment2 = sd.getComment(); + this.component = sd.component; + } + + @PostLoad + private void switchToClobComment(){ + if (comment != null && comment2 == null) { + comment2 = comment; + } + } + + public Component getComponent() { + return component; + } + + public void setComponent(Component component) { + this.component = component; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public SecurityArea getArea() { + return area; + } + + public void setArea(SecurityArea area) { + this.area = area; + } + + public SecurityDeviceCompany getCompany() { + return company; + } + + public void setCompany(SecurityDeviceCompany company) { + this.company = company; + } + + public SecurityCategory getSecurityCategory() { + return securityCategory; + } + + public void setSecurityCategory(SecurityCategory securityCategory) { + this.securityCategory = securityCategory; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getSerialNrSender() { + return serialNrSender; + } + + public void setSerialNrSender(String serialNrSender) { + this.serialNrSender = serialNrSender; + } + + public String getConfigID() { + return configID; + } + + public void setConfigID(String configID) { + this.configID = configID; + } + + public String getComment() { + return comment2; + } + + public void setComment(String comment) { + if (comment != null && comment.length() > 256) { + comment2 = comment; + } else { + this.comment2 = comment; + this.comment = comment; + } + } +} diff --git a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/ticket/Comment.java b/java/mss-failsafe/src/main/java/model/ticket/Comment.java old mode 100644 new mode 100755 similarity index 94% rename from java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/ticket/Comment.java rename to java/mss-failsafe/src/main/java/model/ticket/Comment.java index 9b13e4a..fde2b8c --- a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/ticket/Comment.java +++ b/java/mss-failsafe/src/main/java/model/ticket/Comment.java @@ -20,7 +20,7 @@ import model.person.Person; @Entity public class Comment extends AbstractEntity implements Comparable { - @Column(columnDefinition = "longblob") + @Column(columnDefinition = "BLOB") private String message; @ManyToOne diff --git a/java/mss-failsafe/src/main/java/model/ticket/FilenameGeneration.java b/java/mss-failsafe/src/main/java/model/ticket/FilenameGeneration.java new file mode 100755 index 0000000..189f573 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/ticket/FilenameGeneration.java @@ -0,0 +1,26 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package model.ticket; + +/** + * + * @author patri + */ +public enum FilenameGeneration { + INSPEKTIONNR("Inspektionsnummer"), + MASCHINEDESCRIPTION("Maschinenbezeichnung - Inspektionsnr."), + LOCATION("Standort - Maschinenbez. - Inspektionsnr."); + + private final String name; + + private FilenameGeneration(String name) { + this.name = name; + } + @Override + public String toString() { + return name; + } +} diff --git a/java/mss-failsafe/mss/src/main/java/model/ticket/Status.java b/java/mss-failsafe/src/main/java/model/ticket/Status.java old mode 100644 new mode 100755 similarity index 100% rename from java/mss-failsafe/mss/src/main/java/model/ticket/Status.java rename to java/mss-failsafe/src/main/java/model/ticket/Status.java diff --git a/java/mss-failsafe/src/main/java/model/ticket/Ticket.java b/java/mss-failsafe/src/main/java/model/ticket/Ticket.java new file mode 100755 index 0000000..f11fc41 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/ticket/Ticket.java @@ -0,0 +1,288 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package model.ticket; + +import model.ticket.enums.Status; +import model.ticket.enums.FilenameGeneration; +import java.time.LocalDateTime; +import java.util.List; +import javax.persistence.*; + +import model.AbstractEntity; +import model.adresses.CompanyAddress; +import model.company.Company; +import model.customer.Customer; +import model.files.Invoice; +import model.files.Report; +import model.person.Person; +import model.person.Token; +import model.ticket.dataCopies.TicketLocation; + +/** + * + * @author patri + */ +@Entity +@Table(indexes = { + @Index(name = "idx_ticket_number", columnList = "number") +}) +@NamedQueries({ + @NamedQuery(name = Ticket.CHECK_NUMBER_EXISTS, query = "SELECT COUNT(t.id) FROM Ticket t WHERE t.number = :number"), + @NamedQuery(name = Ticket.GET_ALL_NEWEST, query = "SELECT t FROM Ticket t WHERE t.status <> :status ORDER BY t.creationDate DESC, t.startDate DESC, t.number DESC"), + @NamedQuery(name = Ticket.GET_PERSONAL_ALL_NEWEST, query = "SELECT t FROM Ticket t WHERE t.owner = :owner ORDER BY t.creationDate DESC, t.startDate DESC, t.number DESC"), + @NamedQuery(name = Ticket.GET_BY_NUMBER, query = "SELECT t FROM Ticket t WHERE t.number = :number"), + @NamedQuery(name = Ticket.GET_BY_FOR_COMPANY, query = "SELECT t FROM Ticket t WHERE t.company = :company"), + @NamedQuery(name = Ticket.GET_ALL_BY_COMPANYID, query = "SELECT t FROM Ticket t WHERE t.company.id = :companyID") +}) +public class Ticket extends AbstractEntity implements Comparable{ + + public static final String CHECK_NUMBER_EXISTS = "Ticket.CheckNumberExists"; + public static final String GET_ALL_NEWEST = "Ticket.getAllNewest"; + public static final String GET_PERSONAL_ALL_NEWEST = "Ticket.getAllPersonalNewest"; + public static final String GET_BY_NUMBER = "Ticket.getByNumber"; + public static final String GET_BY_FOR_COMPANY = "Ticket.getForCompany"; + public static final String GET_ALL_BY_COMPANYID = "Ticket.getForCompanyID"; + + @ManyToOne(optional = false) + private Company company; + + @ManyToOne + private CompanyAddress serviceAddress; + + @ManyToOne + private CompanyAddress billingAddress; + + @Column(nullable = false) + @Enumerated(EnumType.STRING) + private Status status; + + @Column(unique = true) + private String number; + + @ManyToOne(optional = false) + private Person creator; + + @ManyToOne(optional = true) + private Person owner; + + @ManyToMany + private List watchers; + + private LocalDateTime startDate; + + private LocalDateTime endDate; + + @OneToMany(mappedBy = "ticket", cascade = CascadeType.ALL) + private List comments; + + private boolean payed; + + @OneToMany(mappedBy = "ticket", cascade = CascadeType.ALL) + private List tokens; + + @OneToMany(mappedBy = "ticket", cascade = CascadeType.ALL) + private List reports; + + @OneToMany(mappedBy = "ticket", cascade = CascadeType.ALL) + private List invoices; + + @OneToMany(mappedBy = "ticket", cascade = CascadeType.ALL) + @OrderBy("name ASC") + private List locations; + + @ManyToMany + @JoinTable(name = "Ticket_Contacts", + joinColumns = @JoinColumn(name = "Ticket_ID", referencedColumnName = "ID"), + inverseJoinColumns = @JoinColumn(name = "Customer_ID", referencedColumnName = "ID") + ) + private List contacts; + + @ManyToMany + @JoinTable( + name = "Ticket_Requester", + joinColumns = @JoinColumn(name = "Ticket_ID", referencedColumnName = "ID"), + inverseJoinColumns = @JoinColumn(name = "Customer_ID", referencedColumnName = "ID") + ) + private List requester; + + @Enumerated(EnumType.STRING) + private FilenameGeneration filenameGeneration; + + @Lob + private String comment; + + public Ticket() { + } + + public CompanyAddress getServiceAddress() { + return serviceAddress; + } + + public void setServiceAddress(CompanyAddress serviceAddress) { + this.serviceAddress = serviceAddress; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public List getRequester() { + return requester; + } + + public void setRequester(List requester) { + this.requester = requester; + } + + public List getContacts() { + return contacts; + } + + public void setContacts(List contacts) { + this.contacts = contacts; + } + + public String getNumber() { + return number; + } + + public void setNumber(String number) { + this.number = number; + } + + public CompanyAddress getBillingAddress() { + return billingAddress; + } + + public void setBillingAddress(CompanyAddress billingAddress) { + this.billingAddress = billingAddress; + } + + public LocalDateTime getStartDate() { + return startDate; + } + + public void setStartDate(LocalDateTime startDate) { + this.startDate = startDate; + } + + public LocalDateTime getEndDate() { + return endDate; + } + + public void setEndDate(LocalDateTime endDate) { + this.endDate = endDate; + } + + public Company getCompany() { + return company; + } + + public void setCompany(Company company) { + this.company = company; + } + + public List getLocations() { + return locations; + } + + public void setLocations(List locations) { + this.locations = locations; + } + + public Status getStatus() { + return status; + } + + public void setStatus(Status status) { + this.status = status; + } + + public Person getCreator() { + return creator; + } + + public void setCreator(Person creator) { + this.creator = creator; + } + + public Person getOwner() { + return owner; + } + + public void setOwner(Person owner) { + this.owner = owner; + } + + public List getComments() { + return comments; + } + + public void setComments(List comments) { + this.comments = comments; + } + + public boolean isPayed() { + return payed; + } + + public void setPayed(boolean payed) { + this.payed = payed; + } + + public List getTokens() { + return tokens; + } + + public void setTokens(List tokens) { + this.tokens = tokens; + } + + public List getReports() { + return reports; + } + + public void setReports(List reports) { + this.reports = reports; + } + + public List getInvoices() { + return invoices; + } + + public void setInvoices(List invoices) { + this.invoices = invoices; + } + + public FilenameGeneration getFilenameGeneration() { + return filenameGeneration; + } + + public void setFilenameGeneration(FilenameGeneration filenameGeneration) { + this.filenameGeneration = filenameGeneration; + } + + public List getWatchers() { + return watchers; + } + + public void setWatchers(List watchers) { + this.watchers = watchers; + } + + @Override + public int compareTo(Ticket t) { + if (t == null || t.getCreationDate() == null) { + return 0; + } + + return getCreationDate().compareTo(t.getCreationDate()); + } +} diff --git a/java/mss-failsafe/src/main/java/model/ticket/dataCopies/TicketDangerPoint.java b/java/mss-failsafe/src/main/java/model/ticket/dataCopies/TicketDangerPoint.java new file mode 100755 index 0000000..224f579 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/ticket/dataCopies/TicketDangerPoint.java @@ -0,0 +1,178 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package model.ticket.dataCopies; + +import javax.persistence.*; + +import model.AbstractEntity; +import model.security.DangerPoint; + +/** + * + * @author pplate + */ +@Entity +@Table(indexes = { + @Index(name = "idx_tdang_area", columnList = "area_id"), + @Index(name = "idx_tdang_secdev", columnList = "securityDevice_id") +}) +public class TicketDangerPoint extends AbstractEntity{ + + @ManyToOne(cascade = CascadeType.ALL) + private TicketSecurityDevice securityDevice; + + @ManyToOne + private TicketSecurityArea area; + + @OneToOne(cascade = CascadeType.ALL) + private TicketMeasuringPoint measuringPoint; + + private String description; + + @Lob + private String comment; + + @Lob + @Column(columnDefinition = "CLOB") + private String comment2; + + //Actual Measurement + + private Integer timeMesasured; + private Integer movement; + private Integer sPMG; + private Integer sPMP; + private Integer CRT; + private Integer securityDistance; + @Column(nullable = true) + private Boolean messung; + + public TicketDangerPoint() { + } + + public TicketDangerPoint(DangerPoint point) { + this.measuringPoint = new TicketMeasuringPoint(point.getMeasuringPoint()); + if (point.getSecurityDevice() != null) { + this.securityDevice = new TicketSecurityDevice(point.getSecurityDevice()); + } + this.description = point.getDescription(); + this.comment2 = point.getComment(); + this.timeMesasured = point.getTimeMesasured(); + this.movement = point.getMovement(); + this.sPMG = point.getsPMG(); + this.sPMP = point.getsPMP(); + this.CRT = point.getCRT(); + this.securityDistance = point.getSecurityDistance(); + this.messung = point.isMessung(); + } + + @PostLoad + private void switchToClobComment(){ + if (comment != null && comment2 == null) { + comment2 = comment; + } + } + + public Integer getTimeMesasured() { + return timeMesasured; + } + + public void setTimeMesasured(Integer timeMesasured) { + this.timeMesasured = timeMesasured; + } + + public Integer getMovement() { + return movement; + } + + public void setMovement(Integer movement) { + this.movement = movement; + } + + public Integer getsPMG() { + return sPMG; + } + + public void setsPMG(Integer sPMG) { + this.sPMG = sPMG; + } + + public Integer getsPMP() { + return sPMP; + } + + public void setsPMP(Integer sPMP) { + this.sPMP = sPMP; + } + + public Integer getCRT() { + return CRT; + } + + public void setCRT(Integer CRT) { + this.CRT = CRT; + } + + public Integer getSecurityDistance() { + return securityDistance; + } + + public void setSecurityDistance(Integer securityDistance) { + this.securityDistance = securityDistance; + } + + public Boolean getMessung() { + return messung; + } + + public void setMessung(Boolean messung) { + this.messung = messung; + } + + public TicketMeasuringPoint getMeasuringPoint() { + return measuringPoint; + } + + public void setMeasuringPoint(TicketMeasuringPoint measuringPoint) { + this.measuringPoint = measuringPoint; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getComment() { + return comment2; + } + + public void setComment(String comment) { + if (comment != null && comment.length() > 256) { + comment2 = comment; + } else { + this.comment2 = comment; + this.comment = comment; + } + } + + public TicketSecurityArea getArea() { + return area; + } + + public void setArea(TicketSecurityArea area) { + this.area = area; + } + + public TicketSecurityDevice getSecurityDevice() { + return securityDevice; + } + + public void setSecurityDevice(TicketSecurityDevice securityDevice) { + this.securityDevice = securityDevice; + } +} diff --git a/java/mss-failsafe/src/main/java/model/ticket/dataCopies/TicketLocation.java b/java/mss-failsafe/src/main/java/model/ticket/dataCopies/TicketLocation.java new file mode 100755 index 0000000..bbd53e0 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/ticket/dataCopies/TicketLocation.java @@ -0,0 +1,121 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package model.ticket.dataCopies; + +import java.util.ArrayList; +import java.util.List; +import javax.persistence.*; + +import model.AbstractEntity; +import model.company.Location; +import model.machine.Machine; +import model.ticket.Ticket; + +/** + * + * @author pplate + */ +@Entity +@Table(indexes = { + @Index(name = "idx_ticketlocation_ticket", columnList = "ticket_id") +}) +public class TicketLocation extends AbstractEntity { + + @ManyToOne + private Ticket ticket; + + private String name; + private String kostenstelle; + + @Lob + private String comment; + + @Lob + @Column(columnDefinition = "CLOB") + private String comment2; + + @OneToMany(mappedBy = "location", cascade = CascadeType.ALL, fetch = FetchType.EAGER) + @OrderBy("name ASC") + private List machines; + + public TicketLocation() { + } + + public TicketLocation(Location location) { + this.name = location.getName(); + this.kostenstelle = location.getKostenstelle(); + this.comment2 = location.getComment(); + this.machines = new ArrayList<>(); + + if (location.getMachines() != null) { + for(Machine mac : location.getMachines()){ + if (mac == null) { + continue; + } + TicketMachine created = new TicketMachine(mac); + created.setLocation(this); + machines.add(created); + } + /* + location.getMachines().forEach(mac -> { + TicketMachine created = new TicketMachine(mac); + created.setLocation(this); + machines.add(created); + });*/ + } + } + + @PostLoad + private void switchToClobComment(){ + if (comment != null && comment2 == null) { + comment2 = comment; + } + } + + public Ticket getTicket() { + return ticket; + } + + public void setTicket(Ticket ticket) { + this.ticket = ticket; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getKostenstelle() { + return kostenstelle; + } + + public void setKostenstelle(String kostenstelle) { + this.kostenstelle = kostenstelle; + } + + public String getComment() { + return comment2; + } + + public void setComment(String comment) { + if (comment != null && comment.length() > 256) { + comment2 = comment; + } else { + this.comment2 = comment; + this.comment = comment; + } + } + + public List getMachines() { + return machines; + } + + public void setMachines(List machines) { + this.machines = machines; + } +} diff --git a/java/mss-failsafe/src/main/java/model/ticket/dataCopies/TicketMachine.java b/java/mss-failsafe/src/main/java/model/ticket/dataCopies/TicketMachine.java new file mode 100755 index 0000000..1bbe22c --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/ticket/dataCopies/TicketMachine.java @@ -0,0 +1,393 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package model.ticket.dataCopies; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; +import javax.persistence.*; + +import model.AbstractEntity; +import model.machine.Manufacturer; +import model.machine.enums.MachineStatus; +import model.machine.enums.MachineType; +import model.machine.enums.norms.AOPD_AOPDDR; +import model.machine.enums.norms.ArrayApproach; +import model.machine.enums.norms.ControlParts; +import model.machine.Machine; +import model.machine.enums.norms.NothaltElectric; +import model.machine.enums.norms.NothaltGestaltung; +import model.machine.enums.norms.NothaltVerriegel; +import model.ticket.enums.SimpleAnswer; +import model.ticket.enums.InspectionType; +import model.ticket.questions.TicketQuestionaire; + +/** + * + * @author pplate + */ +@Entity +@Table(indexes = { + @Index(name = "idx_ticketmachine_location", columnList = "location_id"), + @Index(name = "idx_ticketmachine_inspectid", columnList = "inspectID") +}) +public class TicketMachine extends AbstractEntity{ + + @ManyToOne + private Manufacturer manufacturer; + + @ManyToOne + private TicketLocation location; + + @OneToMany(mappedBy = "machine", cascade = CascadeType.ALL, fetch = FetchType.EAGER) + @OrderBy("name ASC") + private List securityAreas; + + private String name; + private String indentifier; + private String costCenter; + private String machineNr; + private String modellType; + private String inventarNr; + private Integer buildingYear; + private Integer changeYear; + + @Lob + @Column + private String comment; + + @Lob + @Column(columnDefinition = "CLOB") + private String comment2; + + @ElementCollection + private List relevantNorms; + + @Column(unique = false, nullable = false) + @Enumerated(EnumType.ORDINAL) + private MachineStatus machineStatus; + + @Column(unique = false, nullable = true) + @Enumerated(EnumType.ORDINAL) + private InspectionType inspectionType; + + @Column(unique = false, nullable = false) + @Enumerated(EnumType.ORDINAL) + private MachineType machineType; + + @Column(unique = false) + @Enumerated(EnumType.ORDINAL) + private ControlParts controlParts; + + @Column(unique = false) + @Enumerated(EnumType.ORDINAL) + private ArrayApproach arrayApproach; + + @Column(unique = false) + @Enumerated(EnumType.ORDINAL) + private AOPD_AOPDDR aopd_aopddr; + + private String inspectID; + + private String oldInspectionID; + + private String commentDangerZone; + + @OneToMany(mappedBy = "machine", cascade = CascadeType.ALL) + private List questionaires; + + private LocalDate nextInspectionDate; + + private SimpleAnswer receivedBatch; + private SimpleAnswer specsFullfilled; + + @Enumerated(EnumType.ORDINAL) + private NothaltGestaltung nothaltGestaltung; + + @Enumerated(EnumType.ORDINAL) + private NothaltElectric nothaltElectric; + + @Enumerated(EnumType.ORDINAL) + private NothaltVerriegel nothaltVerriegel; + + public TicketMachine() { + } + + public TicketMachine(Machine machine) { + this.manufacturer = machine.getManufacturer(); + if (machine.getSecurityArea() != null) { + List loaded = new ArrayList<>(); + machine.getSecurityArea().forEach(area -> { + TicketSecurityArea created = new TicketSecurityArea(area); + created.setMachine(this); + loaded.add(created); + }); + this.securityAreas = loaded; + } + this.name = machine.getName(); + this.indentifier = machine.getIndentifier(); + this.costCenter = machine.getCostCenter(); + this.machineNr = machine.getMachineNr(); + this.modellType = machine.getModellType(); + this.inventarNr = machine.getInventarNr(); + this.buildingYear = machine.getBuildingYear(); + this.changeYear = machine.getChangeYear(); + this.comment2 = machine.getComment(); + this.relevantNorms = machine.getRelevantNorms(); + this.machineStatus = machine.getMachineStatus(); + this.machineType = machine.getMachineType(); + this.controlParts = machine.getControlParts(); + this.arrayApproach = machine.getArrayApproach(); + this.aopd_aopddr = machine.getAopd_aopddr(); + + this.nothaltGestaltung = machine.getNothaltGestaltung(); + this.nothaltElectric = machine.getNothaltElectric(); + this.nothaltVerriegel = machine.getNothaltVerriegel(); + } + + @PostLoad + private void switchToClobComment(){ + if (comment != null && comment2 == null) { + comment2 = comment; + } + } + + public InspectionType getInspectionType() { + return inspectionType; + } + + public void setInspectionType(InspectionType inspectionType) { + this.inspectionType = inspectionType; + } + + public SimpleAnswer getReceivedBatch() { + return receivedBatch; + } + + public void setReceivedBatch(SimpleAnswer receivedBatch) { + this.receivedBatch = receivedBatch; + } + + public SimpleAnswer getSpecsFullfilled() { + return specsFullfilled; + } + + public void setSpecsFullfilled(SimpleAnswer specsFullfilled) { + this.specsFullfilled = specsFullfilled; + } + + public LocalDate getNextInspectionDate() { + return nextInspectionDate; + } + + public void setNextInspectionDate(LocalDate nextInspectionDate) { + this.nextInspectionDate = nextInspectionDate; + } + + public String getCommentDangerZone() { + return commentDangerZone; + } + + public void setCommentDangerZone(String commentDangerZone) { + this.commentDangerZone = commentDangerZone; + } + + public String getOldInspectionID() { + return oldInspectionID; + } + + public void setOldInspectionID(String oldInspectionID) { + this.oldInspectionID = oldInspectionID; + } + + public String getInspectID() { + return inspectID; + } + + public void setInspectID(String inspectID) { + this.inspectID = inspectID; + } + + public List getQuestionaires() { + return questionaires; + } + + public void setQuestionaires(List questionaires) { + this.questionaires = questionaires; + } + + public List getSecurityAreas() { + return securityAreas; + } + + public void setSecurityAreas(List securityAreas) { + this.securityAreas = securityAreas; + } + + public Manufacturer getManufacturer() { + return manufacturer; + } + + public void setManufacturer(Manufacturer manufacturer) { + this.manufacturer = manufacturer; + } + + public TicketLocation getLocation() { + return location; + } + + public void setLocation(TicketLocation location) { + this.location = location; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getIndentifier() { + return indentifier; + } + + public void setIndentifier(String indentifier) { + this.indentifier = indentifier; + } + + public String getCostCenter() { + return costCenter; + } + + public void setCostCenter(String costCenter) { + this.costCenter = costCenter; + } + + public String getMachineNr() { + return machineNr; + } + + public void setMachineNr(String machineNr) { + this.machineNr = machineNr; + } + + public String getModellType() { + return modellType; + } + + public void setModellType(String modellType) { + this.modellType = modellType; + } + + public String getInventarNr() { + return inventarNr; + } + + public void setInventarNr(String inventarNr) { + this.inventarNr = inventarNr; + } + + public Integer getBuildingYear() { + return buildingYear; + } + + public void setBuildingYear(Integer buildingYear) { + this.buildingYear = buildingYear; + } + + public Integer getChangeYear() { + return changeYear; + } + + public void setChangeYear(Integer changeYear) { + this.changeYear = changeYear; + } + + public String getComment() { + return comment2; + } + + public void setComment(String comment) { + if (comment != null && comment.length() > 256) { + comment2 = comment; + } else { + this.comment2 = comment; + this.comment = comment; + } + } + + public List getRelevantNorms() { + return relevantNorms; + } + + public void setRelevantNorms(List relevantNorms) { + this.relevantNorms = relevantNorms; + } + + public MachineStatus getMachineStatus() { + return machineStatus; + } + + public void setMachineStatus(MachineStatus machineStatus) { + this.machineStatus = machineStatus; + } + + public MachineType getMachineType() { + return machineType; + } + + public void setMachineType(MachineType machineType) { + this.machineType = machineType; + } + + public ControlParts getControlParts() { + return controlParts; + } + + public void setControlParts(ControlParts controlParts) { + this.controlParts = controlParts; + } + + public ArrayApproach getArrayApproach() { + return arrayApproach; + } + + public void setArrayApproach(ArrayApproach arrayApproach) { + this.arrayApproach = arrayApproach; + } + + public AOPD_AOPDDR getAopd_aopddr() { + return aopd_aopddr; + } + + public void setAopd_aopddr(AOPD_AOPDDR aopd_aopddr) { + this.aopd_aopddr = aopd_aopddr; + } + + public NothaltGestaltung getNothaltGestaltung() { + return nothaltGestaltung; + } + + public void setNothaltGestaltung(NothaltGestaltung nothaltGestaltung) { + this.nothaltGestaltung = nothaltGestaltung; + } + + public NothaltElectric getNothaltElectric() { + return nothaltElectric; + } + + public void setNothaltElectric(NothaltElectric nothaltElectric) { + this.nothaltElectric = nothaltElectric; + } + + public NothaltVerriegel getNothaltVerriegel() { + return nothaltVerriegel; + } + + public void setNothaltVerriegel(NothaltVerriegel nothaltVerriegel) { + this.nothaltVerriegel = nothaltVerriegel; + } +} diff --git a/java/mss-failsafe/src/main/java/model/ticket/dataCopies/TicketMeasuringPoint.java b/java/mss-failsafe/src/main/java/model/ticket/dataCopies/TicketMeasuringPoint.java new file mode 100755 index 0000000..16dd810 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/ticket/dataCopies/TicketMeasuringPoint.java @@ -0,0 +1,101 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package model.ticket.dataCopies; + +import javax.persistence.Entity; +import javax.persistence.OneToOne; +import model.AbstractEntity; +import model.security.MeasuringPoint; + +/** + * + * @author pplate + */ +@Entity +public class TicketMeasuringPoint extends AbstractEntity { + + @OneToOne + private TicketDangerPoint dangerPoint; + + //All in mm + private Integer actualDistance; + private Integer distanceSpec; + private Integer followUpCoveredDistanceSpec; + private Integer height; + private Integer crtCro; + + //In ms + private Integer followUpTimeSpec; + + public TicketMeasuringPoint() { + } + + public TicketMeasuringPoint(MeasuringPoint point) { + this.actualDistance = point.getActualDistance(); + this.distanceSpec = point.getDistanceSpec(); + this.followUpCoveredDistanceSpec = point.getFollowUpCoveredDistanceSpec(); + this.height = point.getHeight(); + this.crtCro = point.getCrtCro(); + this.followUpTimeSpec = point.getFollowUpTimeSpec(); + } + + public TicketDangerPoint getDangerPoint() { + return dangerPoint; + } + + public void setDangerPoint(TicketDangerPoint dangerPoint) { + this.dangerPoint = dangerPoint; + } + + public Integer getActualDistance() { + return actualDistance; + } + + public void setActualDistance(Integer actualDistance) { + this.actualDistance = actualDistance; + } + + public Integer getDistanceSpec() { + return distanceSpec; + } + + public void setDistanceSpec(Integer distanceSpec) { + this.distanceSpec = distanceSpec; + } + + public Integer getFollowUpCoveredDistanceSpec() { + return followUpCoveredDistanceSpec; + } + + public void setFollowUpCoveredDistanceSpec(Integer followUpCoveredDistanceSpec) { + this.followUpCoveredDistanceSpec = followUpCoveredDistanceSpec; + } + + public Integer getHeight() { + return height; + } + + public void setHeight(Integer height) { + this.height = height; + } + + public Integer getCrtCro() { + return crtCro; + } + + public void setCrtCro(Integer crtCro) { + this.crtCro = crtCro; + } + + public Integer getFollowUpTimeSpec() { + return followUpTimeSpec; + } + + public void setFollowUpTimeSpec(Integer followUpTimeSpec) { + this.followUpTimeSpec = followUpTimeSpec; + } + + +} diff --git a/java/mss-failsafe/src/main/java/model/ticket/dataCopies/TicketSecurityArea.java b/java/mss-failsafe/src/main/java/model/ticket/dataCopies/TicketSecurityArea.java new file mode 100755 index 0000000..2f90deb --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/ticket/dataCopies/TicketSecurityArea.java @@ -0,0 +1,216 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package model.ticket.dataCopies; + +import java.util.ArrayList; +import java.util.List; +import javax.persistence.*; + +import model.AbstractEntity; +import model.security.SecurityArea; +import model.security.enums.ApproachSpeed; +import model.security.enums.MountingPosition; +import model.security.enums.OverrunMeasurementType; +import model.security.enums.ProtectionType; +import model.ticket.questions.SecurityAreaQuestionaire; + +/** + * + * @author pplate + */ +@Entity +@Table(indexes = { + @Index(name = "idx_tsecarea_machine", columnList = "machine_id") +}) +public class TicketSecurityArea extends AbstractEntity { + + @ManyToOne + private TicketMachine machine; + + //Identifikation + private String name; + private String toolNr; + + //Notizen + @Lob + @Column(name = "dangerAreaComment") + private String comment; + + @Lob + @Column(columnDefinition = "CLOB") + private String comment2; + + //Eigenschaften/Typisierung + @Enumerated(EnumType.ORDINAL) + private ProtectionType protectionType; + + @Enumerated(EnumType.ORDINAL) + private MountingPosition mountingPosition; + + @Enumerated(EnumType.ORDINAL) + private OverrunMeasurementType overrunMeasurementType; + + @Enumerated(EnumType.ORDINAL) + private ApproachSpeed approachSpeed; + + //Children + @OneToMany(mappedBy = "area", cascade = CascadeType.ALL) + private List securityDevices; + + @OneToMany(mappedBy = "area", cascade = CascadeType.ALL) + private List dangerPoints; + + @OneToMany(mappedBy = "area", cascade = CascadeType.ALL) + private List switchingDevices; + + @OneToMany(mappedBy = "area", cascade = CascadeType.ALL) + private List questionaires; + + public TicketSecurityArea() { + } + + public TicketSecurityArea(SecurityArea area) { + this.name = area.getName(); + this.toolNr = area.getToolNr(); + this.comment2 = area.getComment(); + this.protectionType = area.getProtectionType(); + this.mountingPosition = area.getMountingPosition(); + this.overrunMeasurementType = area.getOverrunMeasurementType(); + this.approachSpeed = area.getApproachSpeed(); + this.securityDevices = new ArrayList<>(); + this.dangerPoints = new ArrayList<>(); + this.switchingDevices = new ArrayList<>(); + + if (area.getSecurityDevices() != null) { + area.getSecurityDevices().forEach(dev -> { + TicketSecurityDevice created = new TicketSecurityDevice(dev); + created.setArea(this); + this.securityDevices.add(created); + }); + } + if (area.getDangerPoints() != null) { + area.getDangerPoints().forEach(point -> { + TicketDangerPoint created = new TicketDangerPoint(point); + created.setArea(this); + this.dangerPoints.add(created); + }); + } + if (area.getSwitchingDevices() != null) { + area.getSwitchingDevices().forEach(dev -> { + TicketSwitchingDevice created = new TicketSwitchingDevice(dev); + created.setArea(this); + this.switchingDevices.add(created); + }); + } + } + + @PostLoad + private void switchToClobComment(){ + if (comment != null && comment2 == null) { + comment2 = comment; + } + } + + public List getQuestionaires() { + return questionaires; + } + + public void setQuestionaires(List questionaires) { + this.questionaires = questionaires; + } + + public List getSwitchingDevices() { + return switchingDevices; + } + + public void setSwitchingDevices(List switchingDevices) { + this.switchingDevices = switchingDevices; + } + + public List getDangerPoints() { + return dangerPoints; + } + + public void setDangerPoints(List dangerPoints) { + this.dangerPoints = dangerPoints; + } + + public List getSecurityDevices() { + return securityDevices; + } + + public void setSecurityDevices(List securityDevices) { + this.securityDevices = securityDevices; + } + + public TicketMachine getMachine() { + return machine; + } + + public String getComment() { + return comment2; + } + + public void setComment(String comment) { + if (comment != null && comment.length() > 256) { + comment2 = comment; + } else { + this.comment2 = comment; + this.comment = comment; + } + } + + public void setMachine(TicketMachine machine) { + this.machine = machine; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getToolNr() { + return toolNr; + } + + public void setToolNr(String toolNr) { + this.toolNr = toolNr; + } + + public ProtectionType getProtectionType() { + return protectionType; + } + + public void setProtectionType(ProtectionType protectionType) { + this.protectionType = protectionType; + } + + public MountingPosition getMountingPosition() { + return mountingPosition; + } + + public void setMountingPosition(MountingPosition mountingPosition) { + this.mountingPosition = mountingPosition; + } + + public OverrunMeasurementType getOverrunMeasurementType() { + return overrunMeasurementType; + } + + public void setOverrunMeasurementType(OverrunMeasurementType overrunMeasurementType) { + this.overrunMeasurementType = overrunMeasurementType; + } + + public ApproachSpeed getApproachSpeed() { + return approachSpeed; + } + + public void setApproachSpeed(ApproachSpeed approachSpeed) { + this.approachSpeed = approachSpeed; + } +} diff --git a/java/mss-failsafe/src/main/java/model/ticket/dataCopies/TicketSecurityDevice.java b/java/mss-failsafe/src/main/java/model/ticket/dataCopies/TicketSecurityDevice.java new file mode 100755 index 0000000..1f6bef2 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/ticket/dataCopies/TicketSecurityDevice.java @@ -0,0 +1,447 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package model.ticket.dataCopies; + +import javax.persistence.*; + +import model.AbstractEntity; +import model.machine.enums.Option; +import model.security.SecurityDevice; +import model.security.SecurityDeviceCompany; +import model.security.enums.BuildType; +import model.security.enums.Component; +import model.security.enums.DeviceRole; +import model.security.enums.MutingBlankingModus; +import model.security.enums.MutingSignals; +import model.security.enums.NotHaltContact; +import model.security.enums.NotHaltType; +import model.security.enums.Principle; +import model.security.enums.SecurityCategory; +import model.security.enums.SecurityType; +import model.security.enums.SfAlignment; +import model.security.enums.StopCategory; + +/** + * + * @author pplate + */ +@Entity +@Table(indexes = { + @Index(name = "idx_tsecdev_area", columnList = "area_id"), + @Index(name = "idx_tsecdev_company", columnList = "company_id") +}) +public class TicketSecurityDevice extends AbstractEntity{ + + @ManyToOne + private TicketSecurityArea area; + + @ManyToOne + private SecurityDeviceCompany company; + + @Enumerated(EnumType.STRING) + private SecurityType type; + + //Identifikation + private String description; + private String serialNrSender; + private String serialNrReceiver; + private String configID; + private String bmk; + private String rfid; + + //Eigenschaften/Typisierung + @Enumerated(EnumType.ORDINAL) + private DeviceRole deviceRole; + @Enumerated(EnumType.ORDINAL) + private SecurityCategory securityCategory; + @Enumerated(EnumType.ORDINAL) + private SfAlignment sfAlignment; + @Enumerated(EnumType.ORDINAL) + private MutingBlankingModus mutingBlankingModus; + @Enumerated(EnumType.ORDINAL) + private MutingSignals mutingSignals; + @Enumerated(EnumType.ORDINAL) + private Option eSPE_Paramable; + @Enumerated(EnumType.ORDINAL) + private Component component; + + //Zahlen- und Datumswerte + //mm + private Integer sFdWidth; + private Integer sFdWidth2; + private Integer sFHeightDepth; + private Integer heightTopRay; + private Integer heightOverReference; + private Integer distanceTable; + private Integer detectionCapacity; + + //ms + private Integer responseTime; + + //Only Laserscanner (mm) + private Integer zsm; + private Integer floorspace; + + @Lob + private String comment; + + @Lob + @Column(columnDefinition = "CLOB") + private String comment2; + + //For Type Tuerschalter + @Enumerated(EnumType.ORDINAL) + private BuildType buildType; + + //for table changes + @Enumerated(EnumType.ORDINAL) + private NotHaltType notHaltType; + + @Enumerated(EnumType.ORDINAL) + private Principle principle; + + @Enumerated(EnumType.ORDINAL) + private StopCategory stopCategory; + + @Enumerated(EnumType.ORDINAL) + private NotHaltContact notHaltContact; + + private String confirmation; + private Boolean coded; + private Boolean pimped; + + public TicketSecurityDevice() { + } + + public TicketSecurityDevice(SecurityDevice device) { + this.company = device.getCompany(); + this.type = device.getType(); + this.description = device.getDescription(); + this.serialNrSender = device.getSerialNrSender(); + this.serialNrReceiver = device.getSerialNrReceiver(); + this.configID = device.getConfigID(); + this.bmk = device.getBmk(); + this.deviceRole = device.getDeviceRole(); + this.securityCategory = device.getSecurityCategory(); + this.sfAlignment = device.getSfAlignment(); + this.mutingBlankingModus = device.getMutingBlankingModus(); + this.mutingSignals = device.getMutingSignals(); + this.eSPE_Paramable = device.geteSPE_Paramable(); + this.component = device.getComponent(); + this.sFdWidth = device.getsFdWidth(); + this.sFdWidth2 = device.getsFdWidthTwo(); + this.sFHeightDepth = device.getsFHeightDepth(); + this.heightTopRay = device.getHeightTopRay(); + this.heightOverReference = device.getHeightOverReference(); + this.distanceTable = device.getDistanceTable(); + this.detectionCapacity = device.getDetectionCapacity(); + this.responseTime = device.getResponseTime(); + this.comment2 = device.getComment(); + this.zsm = device.getZsm(); + this.floorspace = device.getFloorspace(); + + this.rfid = device.getRfid(); + this.buildType = device.getBuildType(); + this.principle = device.getPrinciple(); + this.confirmation = device.getConfirmation(); + this.coded = device.getCoded(); + this.pimped = device.getPimped(); + this.notHaltType = device.getNotHaltType(); + this.stopCategory = device.getStopCategory(); + this.notHaltContact = device.getNotHaltContact(); + } + + @PostLoad + private void switchToClobComment(){ + if (comment != null && comment2 == null) { + comment2 = comment; + } + } + + public Integer getsFdWidth2() { + return sFdWidth2; + } + + public void setsFdWidth2(Integer sFdWidth2) { + this.sFdWidth2 = sFdWidth2; + } + + public Integer getZsm() { + return zsm; + } + + public void setZsm(Integer zsm) { + this.zsm = zsm; + } + + public Integer getFloorspace() { + return floorspace; + } + + public void setFloorspace(Integer floorspace) { + this.floorspace = floorspace; + } + + public SecurityDeviceCompany getCompany() { + return company; + } + + public void setCompany(SecurityDeviceCompany company) { + this.company = company; + } + + public SecurityType getType() { + return type; + } + + public void setType(SecurityType type) { + this.type = type; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getSerialNrSender() { + return serialNrSender; + } + + public void setSerialNrSender(String serialNrSender) { + this.serialNrSender = serialNrSender; + } + + public String getSerialNrReceiver() { + return serialNrReceiver; + } + + public void setSerialNrReceiver(String serialNrReceiver) { + this.serialNrReceiver = serialNrReceiver; + } + + public String getConfigID() { + return configID; + } + + public void setConfigID(String configID) { + this.configID = configID; + } + + public String getBmk() { + return bmk; + } + + public void setBmk(String bmk) { + this.bmk = bmk; + } + + public DeviceRole getDeviceRole() { + return deviceRole; + } + + public void setDeviceRole(DeviceRole deviceRole) { + this.deviceRole = deviceRole; + } + + public SecurityCategory getSecurityCategory() { + return securityCategory; + } + + public void setSecurityCategory(SecurityCategory securityCategory) { + this.securityCategory = securityCategory; + } + + public SfAlignment getSfAlignment() { + return sfAlignment; + } + + public void setSfAlignment(SfAlignment sfAlignment) { + this.sfAlignment = sfAlignment; + } + + public MutingBlankingModus getMutingBlankingModus() { + return mutingBlankingModus; + } + + public void setMutingBlankingModus(MutingBlankingModus mutingBlankingModus) { + this.mutingBlankingModus = mutingBlankingModus; + } + + public MutingSignals getMutingSignals() { + return mutingSignals; + } + + public void setMutingSignals(MutingSignals mutingSignals) { + this.mutingSignals = mutingSignals; + } + + public Option geteSPE_Paramable() { + return eSPE_Paramable; + } + + public void seteSPE_Paramable(Option eSPE_Paramable) { + this.eSPE_Paramable = eSPE_Paramable; + } + + public Component getComponent() { + return component; + } + + public void setComponent(Component component) { + this.component = component; + } + + public Integer getsFdWidth() { + return sFdWidth; + } + + public void setsFdWidth(Integer sFdWidth) { + this.sFdWidth = sFdWidth; + } + + public Integer getsFHeightDepth() { + return sFHeightDepth; + } + + public void setsFHeightDepth(Integer sFHeightDepth) { + this.sFHeightDepth = sFHeightDepth; + } + + public Integer getHeightTopRay() { + return heightTopRay; + } + + public void setHeightTopRay(Integer heightTopRay) { + this.heightTopRay = heightTopRay; + } + + public Integer getHeightOverReference() { + return heightOverReference; + } + + public void setHeightOverReference(Integer heightOverReference) { + this.heightOverReference = heightOverReference; + } + + public Integer getDistanceTable() { + return distanceTable; + } + + public void setDistanceTable(Integer distanceTable) { + this.distanceTable = distanceTable; + } + + public Integer getDetectionCapacity() { + return detectionCapacity; + } + + public void setDetectionCapacity(Integer detectionCapacity) { + this.detectionCapacity = detectionCapacity; + } + + public Integer getResponseTime() { + return responseTime; + } + + public void setResponseTime(Integer responseTime) { + this.responseTime = responseTime; + } + + public String getComment() { + return comment2; + } + + public void setComment(String comment) { + if (comment != null && comment.length() > 256) { + comment2 = comment; + } else { + this.comment2 = comment; + this.comment = comment; + } + } + + public TicketSecurityArea getArea() { + return area; + } + + public void setArea(TicketSecurityArea area) { + this.area = area; + } + + public String getRfid() { + return rfid; + } + + public void setRfid(String rfid) { + this.rfid = rfid; + } + + public BuildType getBuildType() { + return buildType; + } + + public void setBuildType(BuildType buildType) { + this.buildType = buildType; + } + + public NotHaltType getNotHaltType() { + return notHaltType; + } + + public void setNotHaltType(NotHaltType notHaltType) { + this.notHaltType = notHaltType; + } + + public Principle getPrinciple() { + return principle; + } + + public void setPrinciple(Principle principle) { + this.principle = principle; + } + + public StopCategory getStopCategory() { + return stopCategory; + } + + public void setStopCategory(StopCategory stopCategory) { + this.stopCategory = stopCategory; + } + + public NotHaltContact getNotHaltContact() { + return notHaltContact; + } + + public void setNotHaltContact(NotHaltContact notHaltContact) { + this.notHaltContact = notHaltContact; + } + + public String getConfirmation() { + return confirmation; + } + + public void setConfirmation(String confirmation) { + this.confirmation = confirmation; + } + + public Boolean getCoded() { + return coded; + } + + public void setCoded(Boolean coded) { + this.coded = coded; + } + + public Boolean getPimped() { + return pimped; + } + + public void setPimped(Boolean pimped) { + this.pimped = pimped; + } +} diff --git a/java/mss-failsafe/src/main/java/model/ticket/dataCopies/TicketSwitchingDevice.java b/java/mss-failsafe/src/main/java/model/ticket/dataCopies/TicketSwitchingDevice.java new file mode 100755 index 0000000..1c91fe3 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/ticket/dataCopies/TicketSwitchingDevice.java @@ -0,0 +1,148 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package model.ticket.dataCopies; + +import javax.persistence.*; + +import model.AbstractEntity; +import model.security.SecurityDeviceCompany; +import model.security.enums.Component; +import model.security.enums.SecurityCategory; +import model.security.switching.SwitchingDevice; + +/** + * + * @author pplate + */ +@Entity +@Table(indexes = { + @Index(name = "idx_tswitchdev_area", columnList = "area_id"), + @Index(name = "idx_tswitchdev_company", columnList = "company_id") +}) +public class TicketSwitchingDevice extends AbstractEntity{ + + @ManyToOne + private TicketSecurityArea area; + + @ManyToOne + private SecurityDeviceCompany company; + + @Enumerated(EnumType.ORDINAL) + private SecurityCategory securityCategory; + + //Identifikation + private String description; + private String serialNrSender; + private String configID; + private String remark; + + @Lob + private String comment; + + @Lob + @Column(columnDefinition = "CLOB") + private String comment2; + + @Enumerated(EnumType.ORDINAL) + private Component component; + + public TicketSwitchingDevice() { + } + + public TicketSwitchingDevice(SwitchingDevice device) { + this.company = device.getCompany(); + this.securityCategory = device.getSecurityCategory(); + this.description = device.getDescription(); + this.serialNrSender = device.getSerialNrSender(); + this.configID = device.getConfigID(); + this.remark = device.getRemark(); + this.comment2 = device.getComment(); + this.component = device.getComponent(); + } + + @PostLoad + private void switchToClobComment(){ + if (comment != null && comment2 == null) { + comment2 = comment; + } + } + + public SecurityDeviceCompany getCompany() { + return company; + } + + public void setCompany(SecurityDeviceCompany company) { + this.company = company; + } + + public SecurityCategory getSecurityCategory() { + return securityCategory; + } + + public void setSecurityCategory(SecurityCategory securityCategory) { + this.securityCategory = securityCategory; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getSerialNrSender() { + return serialNrSender; + } + + public void setSerialNrSender(String serialNrSender) { + this.serialNrSender = serialNrSender; + } + + public String getConfigID() { + return configID; + } + + public void setConfigID(String configID) { + this.configID = configID; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getComment() { + return comment2; + } + + public void setComment(String comment) { + if (comment != null && comment.length() > 256) { + comment2 = comment; + } else { + this.comment2 = comment; + this.comment = comment; + } + } + + public Component getComponent() { + return component; + } + + public void setComponent(Component component) { + this.component = component; + } + + public TicketSecurityArea getArea() { + return area; + } + + public void setArea(TicketSecurityArea area) { + this.area = area; + } +} diff --git a/java/mss-failsafe/src/main/java/model/ticket/enums/FilenameGeneration.java b/java/mss-failsafe/src/main/java/model/ticket/enums/FilenameGeneration.java new file mode 100755 index 0000000..a932c81 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/ticket/enums/FilenameGeneration.java @@ -0,0 +1,26 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package model.ticket.enums; + +/** + * + * @author patri + */ +public enum FilenameGeneration { + INSPEKTIONNR("Inspektionsnummer"), + MASCHINEDESCRIPTION("Maschinenbezeichnung - Inspektionsnr."), + LOCATION("Standort - Maschinenbez. - Inspektionsnr."); + + private final String name; + + private FilenameGeneration(String name) { + this.name = name; + } + @Override + public String toString() { + return name; + } +} diff --git a/java/mss-failsafe/src/main/java/model/ticket/enums/InspectionType.java b/java/mss-failsafe/src/main/java/model/ticket/enums/InspectionType.java new file mode 100755 index 0000000..02e8bd2 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/ticket/enums/InspectionType.java @@ -0,0 +1,32 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Enum.java to edit this template + */ +package model.ticket.enums; + +/** + * + * @author pplate + */ +public enum InspectionType { + FIRST("Erstinspektion (oder Insp. nach Umbau/Umzug)", "Erstinspektion"), + REPEATED("Wiederholungsinspektion", "Wiederholungsinspektion"), + FOLLOW("Folgeinspektion", "Folgeinspektion"); + + private final String name; + public final String label; + + private InspectionType(String name, String label) { + this.name = name; + this.label = label; + } + + @Override + public String toString() { + return label; + } + + public String getName() { + return name; + } +} diff --git a/java/mss-failsafe/src/main/java/model/ticket/enums/SimpleAnswer.java b/java/mss-failsafe/src/main/java/model/ticket/enums/SimpleAnswer.java new file mode 100755 index 0000000..3e77fdc --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/ticket/enums/SimpleAnswer.java @@ -0,0 +1,25 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Enum.java to edit this template + */ +package model.ticket.enums; + +/** + * + * @author pplate + */ +public enum SimpleAnswer { + YES("Ja"), + NO("Nein"), + NA("N/A"); + + public final String value; + + private SimpleAnswer(String value) { + this.value = value; + } + + public String getValue() { + return value; + } +} diff --git a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/ticket/Status.java b/java/mss-failsafe/src/main/java/model/ticket/enums/Status.java old mode 100644 new mode 100755 similarity index 61% rename from java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/ticket/Status.java rename to java/mss-failsafe/src/main/java/model/ticket/enums/Status.java index 5c6d316..d85adaa --- a/java/mss-failsafe/mssfailsafe.datalayer/src/main/java/model/ticket/Status.java +++ b/java/mss-failsafe/src/main/java/model/ticket/enums/Status.java @@ -3,7 +3,7 @@ * To change this template file, choose Tools | Templates * and open the template in the editor. */ -package model.ticket; +package model.ticket.enums; /** * @@ -24,6 +24,20 @@ public enum Status { private Status(String name) { this.name = name; } + + public static Status getFromName(String name){ + if (name == null || name.isBlank()) { + return null; + } + + for(Status status : values()){ + if (status.name.equals(name)) { + return status; + } + } + + return null; + } @Override public String toString() { diff --git a/java/mss-failsafe/src/main/java/model/ticket/questions/SecurityAreaQuestion.java b/java/mss-failsafe/src/main/java/model/ticket/questions/SecurityAreaQuestion.java new file mode 100755 index 0000000..e8aa898 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/ticket/questions/SecurityAreaQuestion.java @@ -0,0 +1,146 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package model.ticket.questions; + +import java.util.ArrayList; +import java.util.List; +import javax.persistence.*; + +import model.AbstractEntity; +import model.question.Question; +import model.question.enums.Answer; + +/** + * + * @author pplate + */ +@Entity +@Table(indexes = { + @Index(name = "idx_question_questionaire", columnList = "questionaire_id") +}) +public class SecurityAreaQuestion extends AbstractEntity { + + @ManyToOne + private SecurityAreaQuestionaire questionaire; + + @Column(length = 255, unique = false) + private String text; + + @Lob + @Column(columnDefinition = "CLOB") + private String text2; + + @Enumerated(EnumType.ORDINAL) + private Answer answer; + + private String ownAnswer; + + private boolean standardValues; + + private Integer position; + + @ElementCollection(fetch = FetchType.EAGER) + @CollectionTable( + name = "TICKETAREA_QUESTIONAIRE_ANSWERS", + joinColumns = @JoinColumn(name = "id", referencedColumnName = "id") + ) + @Column(name = "ticketquestion_answers") + private List ticketanswers; + + public SecurityAreaQuestion() { + } + + public SecurityAreaQuestion (Question question) { + setText(question.getText()); + this.position = question.getPosition(); + this.standardValues = question.isStandardValues(); + if (standardValues) { + answer = Answer.YES; + } + if (question.getAnswers() != null) { + this.ticketanswers = new ArrayList<>(); + for(String val : question.getAnswers()){ + ticketanswers.add(val); + } + } + } + + public SecurityAreaQuestion(SecurityAreaQuestion other, SecurityAreaQuestionaire questionaire) { + this.questionaire = questionaire; + this.text = other.text; + this.answer = other.answer; + this.ownAnswer = other.ownAnswer; + this.standardValues = other.standardValues; + this.ticketanswers = other.ticketanswers; + } + + @PostLoad + private void switchToClobText(){ + if (text != null && text2 == null) { + text2 = text; + } + } + + public Integer getPosition() { + return position; + } + + public void setPosition(Integer position) { + this.position = position; + } + + public String getOwnAnswer() { + return ownAnswer; + } + + public void setOwnAnswer(String ownAnswer) { + this.ownAnswer = ownAnswer; + } + + public boolean isStandardValues() { + return standardValues; + } + + public void setStandardValues(boolean standardValues) { + this.standardValues = standardValues; + } + + public List getTicketanswers() { + return ticketanswers; + } + + public void setTicketanswers(List ticketanswers) { + this.ticketanswers = ticketanswers; + } + + public Answer getAnswer() { + return answer; + } + + public void setAnswer(Answer answer) { + this.answer = answer; + } + + public SecurityAreaQuestionaire getQuestionaire() { + return questionaire; + } + + public void setQuestionaire(SecurityAreaQuestionaire questionaire) { + this.questionaire = questionaire; + } + + public String getText() { + return text2; + } + + public void setText(String text) { + if (text != null && text.length() > 256) { + this.text2 = text; + } else { + this.text2 = text; + this.text = text; + } + } +} diff --git a/java/mss-failsafe/src/main/java/model/ticket/questions/SecurityAreaQuestionaire.java b/java/mss-failsafe/src/main/java/model/ticket/questions/SecurityAreaQuestionaire.java new file mode 100755 index 0000000..216eb79 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/ticket/questions/SecurityAreaQuestionaire.java @@ -0,0 +1,82 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package model.ticket.questions; + +import java.util.ArrayList; +import java.util.List; +import javax.persistence.*; + +import model.AbstractEntity; +import model.question.Question; +import model.question.Questionaire; +import model.ticket.dataCopies.TicketSecurityArea; + +/** + * + * @author pplate + */ +@Entity +@Table(indexes = { + @Index(name = "idx_qnaire_area", columnList = "area_id") +}) +public class SecurityAreaQuestionaire extends AbstractEntity { + @OneToMany(mappedBy = "questionaire",cascade = CascadeType.ALL, fetch = FetchType.EAGER) + @OrderBy("position ASC") + private List questions; + + @ManyToOne + private TicketSecurityArea area; + + private String name; + + public SecurityAreaQuestionaire() { + } + + public SecurityAreaQuestionaire (Questionaire questionaire) { + this.questions = new ArrayList<>(); + this.name = questionaire.getName(); + if (questionaire.getQuestions() != null) { + for(Question q : questionaire.getQuestions()){ + SecurityAreaQuestion quest = new SecurityAreaQuestion(q); + quest.setQuestionaire(this); + questions.add(quest); + } + } + } + + public SecurityAreaQuestionaire(SecurityAreaQuestionaire other, TicketSecurityArea area) { + if (other.getQuestions() != null) { + this.questions = new ArrayList<>(other.getQuestions().size()); + other.questions.forEach(q -> questions.add(new SecurityAreaQuestion(q, this))); + } + + this.area = area; + this.name = other.name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getQuestions() { + return questions; + } + + public void setQuestions(List questions) { + this.questions = questions; + } + + public TicketSecurityArea getArea() { + return area; + } + + public void setArea(TicketSecurityArea area) { + this.area = area; + } +} diff --git a/java/mss-failsafe/src/main/java/model/ticket/questions/TicketQuestion.java b/java/mss-failsafe/src/main/java/model/ticket/questions/TicketQuestion.java new file mode 100755 index 0000000..2a2148d --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/ticket/questions/TicketQuestion.java @@ -0,0 +1,149 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package model.ticket.questions; + +import java.util.ArrayList; +import java.util.List; +import javax.persistence.*; + +import model.AbstractEntity; +import model.question.Question; +import model.question.enums.Answer; + +/** + * + * @author pplate + */ +@Entity +public class TicketQuestion extends AbstractEntity implements Comparable{ + + @ManyToOne + private TicketQuestionaire questionaire; + + @Column(length = 255, unique = false) + private String text; + + @Lob + @Column(columnDefinition = "CLOB") + private String text2; + + @Enumerated(EnumType.ORDINAL) + private Answer answer; + + private String ownAnswer; + + private boolean standardValues; + + private Integer position; + + @ElementCollection + @CollectionTable( + name = "TICKET_QUESTIONAIRE_ANSWERS", + joinColumns = @JoinColumn(name = "id", referencedColumnName = "id") + ) + @Column(name = "ticketquestion_answers") + private List ticketanswers; + + public TicketQuestion() { + } + + public TicketQuestion(Question question) { + setText(question.getText()); + this.standardValues = question.isStandardValues(); + this.position = question.getPosition(); + if (standardValues) { + answer = Answer.YES; + } + + if (question.getAnswers() != null) { + this.ticketanswers = new ArrayList<>(); + for(String val : question.getAnswers()){ + ticketanswers.add(val); + } + } + } + + @PostLoad + private void switchToClobText(){ + if (text != null && text2 == null) { + text2 = text; + } + } + + public Integer getPosition() { + return position; + } + + public void setPosition(Integer position) { + this.position = position; + } + + public String getOwnAnswer() { + return ownAnswer; + } + + public void setOwnAnswer(String ownAnswer) { + this.ownAnswer = ownAnswer; + } + + public boolean isStandardValues() { + return standardValues; + } + + public void setStandardValues(boolean standardValues) { + this.standardValues = standardValues; + } + + public List getTicketanswers() { + return ticketanswers; + } + + public void setTicketanswers(List ticketanswers) { + this.ticketanswers = ticketanswers; + } + + public Answer getAnswer() { + return answer; + } + + public void setAnswer(Answer answer) { + this.answer = answer; + } + + public TicketQuestionaire getQuestionaire() { + return questionaire; + } + + public void setQuestionaire(TicketQuestionaire questionaire) { + this.questionaire = questionaire; + } + + public String getText() { + return text2; + } + + public void setText(String text) { + if (text != null && text.length() > 256) { + this.text2 = text; + } else { + this.text2 = text; + this.text = text; + } + } + + @Override + public int compareTo(Object t) { + if (t == null) { + return 1; + } + + if (!(t instanceof TicketQuestion)) { + return 1; + } + + TicketQuestion other = (TicketQuestion) t; + return Integer.compare(position, other.position); + } +} diff --git a/java/mss-failsafe/src/main/java/model/ticket/questions/TicketQuestionaire.java b/java/mss-failsafe/src/main/java/model/ticket/questions/TicketQuestionaire.java new file mode 100755 index 0000000..d68b112 --- /dev/null +++ b/java/mss-failsafe/src/main/java/model/ticket/questions/TicketQuestionaire.java @@ -0,0 +1,73 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package model.ticket.questions; + +import java.util.ArrayList; +import java.util.List; +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.OrderBy; +import model.AbstractEntity; +import model.question.Question; +import model.question.Questionaire; +import model.ticket.dataCopies.TicketMachine; + +/** + * + * @author pplate + */ +@Entity +public class TicketQuestionaire extends AbstractEntity { + @OneToMany(mappedBy = "questionaire",cascade = CascadeType.ALL) + @OrderBy("position ASC") + private List questions; + + @ManyToOne + private TicketMachine machine; + + private String name; + + public TicketQuestionaire() { + } + + public TicketQuestionaire(Questionaire questionaire) { + this.questions = new ArrayList<>(); + this.name = questionaire.getName(); + if (questionaire != null && questionaire.getQuestions() != null) { + for(Question q : questionaire.getQuestions()){ + TicketQuestion quest = new TicketQuestion(q); + quest.setQuestionaire(this); + questions.add(quest); + } + } + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public TicketMachine getMachine() { + return machine; + } + + public void setMachine(TicketMachine machine) { + this.machine = machine; + } + + public List getQuestions() { + return questions; + } + + public void setQuestions(List questions) { + this.questions = questions; + } +} diff --git a/java/mss-failsafe/src/main/resources/Checkliste_Beurteilung.txt b/java/mss-failsafe/src/main/resources/Checkliste_Beurteilung.txt new file mode 100755 index 0000000..dc7b4cc --- /dev/null +++ b/java/mss-failsafe/src/main/resources/Checkliste_Beurteilung.txt @@ -0,0 +1,30 @@ +GLOBAL +Liegen die EG-Konformitätserklärung und die Bedienungsanleitung der Maschine vor? +Entspricht die Art der ESPE dem bestimmungsmäßigen Gebrauch der Maschine? +Ist das Umgehen der ESPE verhindert? +Ist der Gefährdungsbereich der Maschine nur durch das Schutzfeld oder durch gesicherte Zugänge erreichbar? +Ist das Hintertreten der ESPE verhindert? +Wird das Erreichen der gefahrbringenden Bewegung durch Untergreifen, Übergreifen oder Umgreifen des Schutzfeldes verhindert? +Anwesenheitsüberwachung: Wird ein unerkannter Aufenthalt im Gefährdungsbereich verhindert? +Sind die Typenschilder der ESPE lesbar? +Entspricht der Prüfstabdurchmesser der geforderten Hindernisgröße des Schutzfeldes der ESPE? +Wird ein Prüfstab / Testkörper mit der richtigen Hindernisgröße an jeder Stelle innerhalb des Schutzfeldes oder der jeweils aktiven SchutzfeldKontur erkannt? +Wird ein Mindestabstand, entsprechend den Angaben an der Maschine, eingehalten? +Sind die normativ erforderlichen Strahlhöhen eingehalten? +Wird der normativ errechnete Mindestabstand eingehalten? +Wird durch das Abschalten der Ausgangssignale der ESPE die gefahrbringende Bewegung gestoppt? +Ist das Hintertreten der BWS ausgeschlossen? +Falls notwendig, ist eine Wiederanlaufsperre (Reset/Quittierung) konfiguriert? +Ist das Befehlsgerät zum Rücksetzen der Wiederanlaufsperre dynamisch und funktionsgerecht ausgeführt? +Ist das Rücksetzen der Wiederanlaufsperre aus dem Gefährdungsbereich heraus ausgeschlossen? +Ist der gesamte Gefährdungsbereich vom Anbauort des Befehlsgeräts zum Rücksetzen der Wiederanlaufsperre aus einsehbar? +Sind die Ausgangssignale der ESPE gemäß Herstellerangaben mit dem Steuerungssystem bzw. Sekundärschalteinrichtung verknüpft? +EDM: Werden Aktorik-Elemente überwacht? +Ist die ESPE ordnungsgemäß mit dem Schutzleiter verbunden? +Ist die ESPE zweikanalig in die Steuerung eingebunden? +Ist die ESPE während des gesamten gefahrbringenden Zustandes aktiv? +Ist die ESPE wirksam bei Automatikbetrieb? +Ist die ESPE wirksam bei Handbetrieb? +Wird beim Ausschalten (Spannungsausfall) der ESPE die gefahrbringende Bewegung gestoppt? +Kann eine gefahrbringende Bewegung nach Einschalten der ESPE oder nach Umschalten der Betriebsart der Maschine nur nach Betätigen eines Befehlsgerätes eingeleitet werden? +Entsprechen die Schutzzaunhöhen den normativen Vorgaben? (Unterkante 20 mm, Oberkante 2000 mm)? \ No newline at end of file diff --git a/java/mss-failsafe/src/main/resources/Checkliste_Blanking.txt b/java/mss-failsafe/src/main/resources/Checkliste_Blanking.txt new file mode 100755 index 0000000..dfa1b25 --- /dev/null +++ b/java/mss-failsafe/src/main/resources/Checkliste_Blanking.txt @@ -0,0 +1,3 @@ +Ist der ausgeblendete Bereich kontinuierlich und vollständig versperrt? +Stoppt die gefahrbringende Bewegung beim Entfernen des ausgeblendeten Objekts aus dem Schutzfeld? +Entspricht der Abstand der ESPE zur Gefahrstelle dem wegen der Ausblendung ggf. veränderten Detektionsvermögen der ESPE? \ No newline at end of file diff --git a/java/mss-failsafe/src/main/resources/Checkliste_Muting.txt b/java/mss-failsafe/src/main/resources/Checkliste_Muting.txt new file mode 100755 index 0000000..a1b22b0 --- /dev/null +++ b/java/mss-failsafe/src/main/resources/Checkliste_Muting.txt @@ -0,0 +1,8 @@ +Wird die Überbrückungsfunktion durch mindestens 2 unabhängige elektrische Signale aktiviert? +Kann Muting-Override nur durch ein handbetätigtes Befehlsgerät eingeleitet werden? +Ist ausgeschlossen, dass während des Mutings vor, neben oder hinter dem Transportgut Personen durch das Schutzfeld in den Gefährdungsbereich eindringen? +Wird die Überbrückungs-Funktion unmittelbar vor bzw. nach der Unterbrechung des Schutzfeld durch das Transportgut aktiviert bzw. beendet? +Ist ein Muting-Leuchtmelder in der Nähe des Schutzfeldes gut sichtbar angebracht? +Sind Mutingsensoren so angeordnet, das die Überbrückungsfunktion nur nach Erkennung des Fördergutes eingeleitet wird? +Liegt beim zeitgesteuerten 2-Sensor-Muting der Kreuzungspunkt der beiden Überbrückungssensoren auf der selben Höhe oder höher als der niedrigste Strahl der ESPE? +Befindet sich der Kreuzungspunkt der beiden Überbrückungssensoren beim zeitgesteuerten 2-Sensor-Muting hinter der ESPE im Gefährdungsbereich? \ No newline at end of file diff --git a/java/mss-failsafe/src/main/resources/Checkliste_SPG_GATING.txt b/java/mss-failsafe/src/main/resources/Checkliste_SPG_GATING.txt new file mode 100755 index 0000000..609053c --- /dev/null +++ b/java/mss-failsafe/src/main/resources/Checkliste_SPG_GATING.txt @@ -0,0 +1,6 @@ +Wird die Einleitung der Gating-Sequenz durch ein nicht einfach zu manipulierendes Signal bereitgestellt (CS-Signal)? +Wird das CS-Schaltsignal erst erzeugt, wenn sich das Transportgut max. 200mm vor dem Schutzfeld befindet? +Wird die Gating-Sequenz beendet, wenn sich das Transportgut max. 200mm hinter dem Schutzfeld befindet? +Ist ausgeschlossen, dass während des Gatings vor, neben oder hinter dem Transportgut Personen durch das Schutzfeld in den Gefährdungsbereich eindringen? +Entspricht die Fördergeschwindigkeit der ausgewählten Betriebsart oder sind andere Maßnahmen, gegen einen unerkannten Zugang, entsprechend der Betriebsart getroffen? +Kann Gating-Override nur durch ein handbetätigtes Befehlsgerät eingeleitet werden? \ No newline at end of file diff --git a/java/mss-failsafe/src/main/resources/Checkliste_Scanner.txt b/java/mss-failsafe/src/main/resources/Checkliste_Scanner.txt new file mode 100755 index 0000000..765902a --- /dev/null +++ b/java/mss-failsafe/src/main/resources/Checkliste_Scanner.txt @@ -0,0 +1,8 @@ +Ist das Übersteigen des Schutzfeldes verhindert? +Werden externe Teile der Steuerung gemäß dem erforderlichen Diagnosedeckungsgrad DC überwacht (EDM)? +Wird verhindert, dass Reflektoren oder glänzende Flächen die ESPE beinflussen? +Ist die ESPE sowie das Montagesystem fest fixiert? +horizontales Schutzfeld: Entspricht das geforderte Detektionsvermögen der Montagehöhe? +Ist eine Schutzfeldmarkierung am Fußboden angebracht? +ESPE als Durchgangskontrolle: Wird eine Referenzkontur überwacht? +ESPE als Durchgangskontrolle: Ist bei normaler Annäherung zum Schutzfeld das Detektionsvermögen der ESPE < 200 mm ? \ No newline at end of file diff --git a/java/mss-failsafe/src/main/resources/Checkliste_Scanner_bei_FTF.txt b/java/mss-failsafe/src/main/resources/Checkliste_Scanner_bei_FTF.txt new file mode 100755 index 0000000..6023068 --- /dev/null +++ b/java/mss-failsafe/src/main/resources/Checkliste_Scanner_bei_FTF.txt @@ -0,0 +1,4 @@ +Stoppt das FTF bei einem normkonformen Prüfkörper, bevor das FTF oder dessen Ladung den Prüfkörper berührt? +Wird ein automatischer Wiederanlauf und der Fahrtrichtungswechsel akustisch und/oder optisch angezeigt? +Wird die zulässige Einbauhöhe der ESPE bei mobiler Anwendung von Hmax = 200 mm eingehalten? +Wird verhindert, dass es zwischen dem seitlichem Zutritt und Aufbauten in der Umgebung zu Quetschgefahren kommt? \ No newline at end of file diff --git a/java/mss-failsafe/src/main/resources/Checkliste_Taktsteuerung.txt b/java/mss-failsafe/src/main/resources/Checkliste_Taktsteuerung.txt new file mode 100755 index 0000000..8c31623 --- /dev/null +++ b/java/mss-failsafe/src/main/resources/Checkliste_Taktsteuerung.txt @@ -0,0 +1,9 @@ +Ist das Detektionsvermögen der ESPE mit Schutz- und Steuerfunktion gleich oder kleiner 30 mm? +Ist der normativ erforderliche Mindestabstand der ESPE mit Schutz- und Steuerfunktion zur Gefährdungsstelle entsprechend der Auflösung eingehalten? +Sind wirksame Maßnahmen getroffen, die verhindern dass Personen sich vollständig hinter dem Schutzfeld der ESPE innerhalb des Gefährdungsbereiches aufhalten können? +Ist die Steuerfunktion 'Zyklische Auslösung' auf genau eine ESPE pro Maschine (Montage Maschinenvorderseite) beschränkt? +Wird die minimale Tischhöhe eingehalten? +Werden die Anforderungen an Öffnungshub und Pressentischtiefe eingehalten? +Kann eine weitere gefahrbringende Bewegung nach Beenden eines Bewegungs-Zyklus' durch Eingreifen in das Schutzfeld der ESPE nur innerhalb von max. 30 Sek. eingeleitet werden? +Wird beim Umschalten der Taktsteuer- Betriebsart die jeweils eingeleitete gefahrbringende Bewegung gestoppt? +Entspricht die ESPE mindestens dem geforderten Sicherheitsniveau Typ 4? \ No newline at end of file diff --git a/java/mss-failsafe/src/main/resources/Hersteller.txt b/java/mss-failsafe/src/main/resources/Hersteller.txt new file mode 100755 index 0000000..88c6cbd --- /dev/null +++ b/java/mss-failsafe/src/main/resources/Hersteller.txt @@ -0,0 +1,146 @@ +ABB AB Jokab Safety +ABB Asea Brown Boveri Ltd +AECO SRL +AEG AG +Allen Bradley +ASTEEL SENSOR +Bachmann eletronisch +BACO +Balluff GmbH +Banner Engineering Corporation +BARTEC GmbH +Baumüller GmbH +BBH PRODUCTS GmbH +BeamStar +Beckhoff Automation GmbH +Beldrive Engineering GmbH +Bernstein AG +beta SENSORIK GmbH +Bihl+Wiedemann GmbH +Bosch Rexroth Electric Drives and Contro +B&R Industrie Elektronik GmbH +Burgess Micro Switch Co Ltd. +CAPTRON Electronic GmbH +Carl Cloos Schweißtechnik GmbH +Carl Geisser AG +Carl Zeiss AG +Carlo Gavazzi +CEAG Notlichtsysteme GmbH +CEDES Safety & Automation AG +Celex-Industrietechnik GmbH & Co. KG +Comat AG +CONTRINEX SENSOR GmbH +DATALOGIC S.p.A. +DATASENSOR GmbH +Demag Cranes & Components GmbH +DIELL Sensors +DINA Elektronik GmbH +Dipiem +di-soric GmbH & Co. KG +Dittelbach und Kerzler GmbH & Co KG +Dold & Söhne KG +Eaton Industries GmbH +Elan Schaltelemente GmbH & Co. KG +ELESTA GmbH Elektronik +elobau +ELOKON GmbH +EUCHNER GmbH + Co. KG +Fanuc Deutschland GmbH +Fasnacht +FESTO GmbH & Co. KG +Fiber +Fiessler Elektronik GmbH & Co. KG +FIN Electric Ltd. +FINDER GmbH +Fortress Interlocks +Frost Controls Inc. +Grein S.r.l. +Grundig electronic +GUARDSCAN +Hans & Jos. KRONENBERG GmbH +Honeywell International Inc. +ifm electronic GmbH +IGM Geophysik Messtechnik GmbH +Ines-Elektronik-GmbH +Inframatic GmbH +Inxpect S.p.A. +ipf electronic GmbH +JAY electronique +Jetter AG +Jokab Safety / ABB Group +Kardex Produktion Deutschland GmbH +Kedu Electric Co.Ltd +Keli Photoelectronic Industrial Co., Ltd +KEYENCE GmbH +Kiepe electric GmbH +Kinemotion GmbH +Klinger & Born GmbH +Klöckner-Moeller AG +Kuhnke Contacts +Lagertechnik Müller & Partner +Lazer Safe Pty. Ltd. +Lenze +Leuze electronic GmbH + Co. KG +Leuze lumiflex GmbH + Co. KG +Liros Electronic +LUCOM GmbH +lumiflex +Mayser GmbH & Co KG +Melsa (Mitsubishi Electric Saudi Ltd.) +METZ CONNECT GmbH +Mitsubishi Electric Europe B. V. +Moeller AG +MT Robot AG +Murrelektronik GmbH +nicht ermittelbar +OMRON ELECTRONICS GmbH +OMRON STI +Panasonic Corporation +Pepperl+Fuchs GmbH +PHOENIX CONTACT GmbH & Co. KG +Pilz GmbH & Co. KG +Pizzato Elettrica S.r.l. +R. STAHL Aktiengesellschaft +RAFI GmbH & Co. KG +ReeR SpA - Safety +riese electronic GmbH +Rockford Systems LLC +Rockwell Automation GmbH +ROSS EUROPA GmbH +RS Components GmbH +Safety Control GmbH +Saia-Burgess Controls AG +Schiele-Vollmar GmbH +Schlegel Elektrokontakt GmbH +Schleicher Electronic GmbH & Co. KG +SCHMERSAL Holding GmbH & Co. KG +Schneider Electric SA +SCHRACK Technik GmbH +SEW EURODRIVE GmbH & Co. KG +Sick AG +Siemens AG +SIGMATEK GmbH & Co. KG +sitron Sensor GmbH +SMARTSCAN Ltd. +Sonstige +SQUARE +SSP safety systems productsGmbH & Co.KG +Star Automation Europe S.P.A. +Starkstrom Gummersbach +steute Technologies GmbH & Co. KG +SUNX Sensors +Tapeswitch Ltd. +TECHNO GR S.r.l. +Telemecanique Electric +TESCH GmbH +Tippkemper-Matrix GmbH +UNIMATE ROBOTICA +Universal Robots A/S +VIPA GmbH +Visolux-Elektronik +WAGO Kontakttechnik GmbH & Co. KG +Weidmüller GmbH & Co KG +wenglor sensoric GmbH +WERAC Elektronik GmbH +Wieland Electric GmbH +Zander Aachen \ No newline at end of file diff --git a/java/mss-failsafe/mss/src/main/resources/META-INF/persistence.xml b/java/mss-failsafe/src/main/resources/META-INF/persistence.xml old mode 100644 new mode 100755 similarity index 54% rename from java/mss-failsafe/mss/src/main/resources/META-INF/persistence.xml rename to java/mss-failsafe/src/main/resources/META-INF/persistence.xml index 47726fc..059fac2 --- a/java/mss-failsafe/mss/src/main/resources/META-INF/persistence.xml +++ b/java/mss-failsafe/src/main/resources/META-INF/persistence.xml @@ -1,11 +1,13 @@ - - java:/mss-failsave + + java:/mss-failsafe false - + + + diff --git a/java/mss-failsafe/src/main/resources/checklisten/Beurteilung.txt b/java/mss-failsafe/src/main/resources/checklisten/Beurteilung.txt new file mode 100755 index 0000000..dc7b4cc --- /dev/null +++ b/java/mss-failsafe/src/main/resources/checklisten/Beurteilung.txt @@ -0,0 +1,30 @@ +GLOBAL +Liegen die EG-Konformitätserklärung und die Bedienungsanleitung der Maschine vor? +Entspricht die Art der ESPE dem bestimmungsmäßigen Gebrauch der Maschine? +Ist das Umgehen der ESPE verhindert? +Ist der Gefährdungsbereich der Maschine nur durch das Schutzfeld oder durch gesicherte Zugänge erreichbar? +Ist das Hintertreten der ESPE verhindert? +Wird das Erreichen der gefahrbringenden Bewegung durch Untergreifen, Übergreifen oder Umgreifen des Schutzfeldes verhindert? +Anwesenheitsüberwachung: Wird ein unerkannter Aufenthalt im Gefährdungsbereich verhindert? +Sind die Typenschilder der ESPE lesbar? +Entspricht der Prüfstabdurchmesser der geforderten Hindernisgröße des Schutzfeldes der ESPE? +Wird ein Prüfstab / Testkörper mit der richtigen Hindernisgröße an jeder Stelle innerhalb des Schutzfeldes oder der jeweils aktiven SchutzfeldKontur erkannt? +Wird ein Mindestabstand, entsprechend den Angaben an der Maschine, eingehalten? +Sind die normativ erforderlichen Strahlhöhen eingehalten? +Wird der normativ errechnete Mindestabstand eingehalten? +Wird durch das Abschalten der Ausgangssignale der ESPE die gefahrbringende Bewegung gestoppt? +Ist das Hintertreten der BWS ausgeschlossen? +Falls notwendig, ist eine Wiederanlaufsperre (Reset/Quittierung) konfiguriert? +Ist das Befehlsgerät zum Rücksetzen der Wiederanlaufsperre dynamisch und funktionsgerecht ausgeführt? +Ist das Rücksetzen der Wiederanlaufsperre aus dem Gefährdungsbereich heraus ausgeschlossen? +Ist der gesamte Gefährdungsbereich vom Anbauort des Befehlsgeräts zum Rücksetzen der Wiederanlaufsperre aus einsehbar? +Sind die Ausgangssignale der ESPE gemäß Herstellerangaben mit dem Steuerungssystem bzw. Sekundärschalteinrichtung verknüpft? +EDM: Werden Aktorik-Elemente überwacht? +Ist die ESPE ordnungsgemäß mit dem Schutzleiter verbunden? +Ist die ESPE zweikanalig in die Steuerung eingebunden? +Ist die ESPE während des gesamten gefahrbringenden Zustandes aktiv? +Ist die ESPE wirksam bei Automatikbetrieb? +Ist die ESPE wirksam bei Handbetrieb? +Wird beim Ausschalten (Spannungsausfall) der ESPE die gefahrbringende Bewegung gestoppt? +Kann eine gefahrbringende Bewegung nach Einschalten der ESPE oder nach Umschalten der Betriebsart der Maschine nur nach Betätigen eines Befehlsgerätes eingeleitet werden? +Entsprechen die Schutzzaunhöhen den normativen Vorgaben? (Unterkante 20 mm, Oberkante 2000 mm)? \ No newline at end of file diff --git a/java/mss-failsafe/src/main/resources/checklisten/Blanking.txt b/java/mss-failsafe/src/main/resources/checklisten/Blanking.txt new file mode 100755 index 0000000..dfa1b25 --- /dev/null +++ b/java/mss-failsafe/src/main/resources/checklisten/Blanking.txt @@ -0,0 +1,3 @@ +Ist der ausgeblendete Bereich kontinuierlich und vollständig versperrt? +Stoppt die gefahrbringende Bewegung beim Entfernen des ausgeblendeten Objekts aus dem Schutzfeld? +Entspricht der Abstand der ESPE zur Gefahrstelle dem wegen der Ausblendung ggf. veränderten Detektionsvermögen der ESPE? \ No newline at end of file diff --git a/java/mss-failsafe/src/main/resources/checklisten/Muting.txt b/java/mss-failsafe/src/main/resources/checklisten/Muting.txt new file mode 100755 index 0000000..a1b22b0 --- /dev/null +++ b/java/mss-failsafe/src/main/resources/checklisten/Muting.txt @@ -0,0 +1,8 @@ +Wird die Überbrückungsfunktion durch mindestens 2 unabhängige elektrische Signale aktiviert? +Kann Muting-Override nur durch ein handbetätigtes Befehlsgerät eingeleitet werden? +Ist ausgeschlossen, dass während des Mutings vor, neben oder hinter dem Transportgut Personen durch das Schutzfeld in den Gefährdungsbereich eindringen? +Wird die Überbrückungs-Funktion unmittelbar vor bzw. nach der Unterbrechung des Schutzfeld durch das Transportgut aktiviert bzw. beendet? +Ist ein Muting-Leuchtmelder in der Nähe des Schutzfeldes gut sichtbar angebracht? +Sind Mutingsensoren so angeordnet, das die Überbrückungsfunktion nur nach Erkennung des Fördergutes eingeleitet wird? +Liegt beim zeitgesteuerten 2-Sensor-Muting der Kreuzungspunkt der beiden Überbrückungssensoren auf der selben Höhe oder höher als der niedrigste Strahl der ESPE? +Befindet sich der Kreuzungspunkt der beiden Überbrückungssensoren beim zeitgesteuerten 2-Sensor-Muting hinter der ESPE im Gefährdungsbereich? \ No newline at end of file diff --git a/java/mss-failsafe/src/main/resources/checklisten/SPG_GATING.txt b/java/mss-failsafe/src/main/resources/checklisten/SPG_GATING.txt new file mode 100755 index 0000000..609053c --- /dev/null +++ b/java/mss-failsafe/src/main/resources/checklisten/SPG_GATING.txt @@ -0,0 +1,6 @@ +Wird die Einleitung der Gating-Sequenz durch ein nicht einfach zu manipulierendes Signal bereitgestellt (CS-Signal)? +Wird das CS-Schaltsignal erst erzeugt, wenn sich das Transportgut max. 200mm vor dem Schutzfeld befindet? +Wird die Gating-Sequenz beendet, wenn sich das Transportgut max. 200mm hinter dem Schutzfeld befindet? +Ist ausgeschlossen, dass während des Gatings vor, neben oder hinter dem Transportgut Personen durch das Schutzfeld in den Gefährdungsbereich eindringen? +Entspricht die Fördergeschwindigkeit der ausgewählten Betriebsart oder sind andere Maßnahmen, gegen einen unerkannten Zugang, entsprechend der Betriebsart getroffen? +Kann Gating-Override nur durch ein handbetätigtes Befehlsgerät eingeleitet werden? \ No newline at end of file diff --git a/java/mss-failsafe/src/main/resources/checklisten/Scanner.txt b/java/mss-failsafe/src/main/resources/checklisten/Scanner.txt new file mode 100755 index 0000000..765902a --- /dev/null +++ b/java/mss-failsafe/src/main/resources/checklisten/Scanner.txt @@ -0,0 +1,8 @@ +Ist das Übersteigen des Schutzfeldes verhindert? +Werden externe Teile der Steuerung gemäß dem erforderlichen Diagnosedeckungsgrad DC überwacht (EDM)? +Wird verhindert, dass Reflektoren oder glänzende Flächen die ESPE beinflussen? +Ist die ESPE sowie das Montagesystem fest fixiert? +horizontales Schutzfeld: Entspricht das geforderte Detektionsvermögen der Montagehöhe? +Ist eine Schutzfeldmarkierung am Fußboden angebracht? +ESPE als Durchgangskontrolle: Wird eine Referenzkontur überwacht? +ESPE als Durchgangskontrolle: Ist bei normaler Annäherung zum Schutzfeld das Detektionsvermögen der ESPE < 200 mm ? \ No newline at end of file diff --git a/java/mss-failsafe/src/main/resources/checklisten/Scanner_bei_FTF.txt b/java/mss-failsafe/src/main/resources/checklisten/Scanner_bei_FTF.txt new file mode 100755 index 0000000..6023068 --- /dev/null +++ b/java/mss-failsafe/src/main/resources/checklisten/Scanner_bei_FTF.txt @@ -0,0 +1,4 @@ +Stoppt das FTF bei einem normkonformen Prüfkörper, bevor das FTF oder dessen Ladung den Prüfkörper berührt? +Wird ein automatischer Wiederanlauf und der Fahrtrichtungswechsel akustisch und/oder optisch angezeigt? +Wird die zulässige Einbauhöhe der ESPE bei mobiler Anwendung von Hmax = 200 mm eingehalten? +Wird verhindert, dass es zwischen dem seitlichem Zutritt und Aufbauten in der Umgebung zu Quetschgefahren kommt? \ No newline at end of file diff --git a/java/mss-failsafe/src/main/resources/checklisten/Taktsteuerung.txt b/java/mss-failsafe/src/main/resources/checklisten/Taktsteuerung.txt new file mode 100755 index 0000000..8c31623 --- /dev/null +++ b/java/mss-failsafe/src/main/resources/checklisten/Taktsteuerung.txt @@ -0,0 +1,9 @@ +Ist das Detektionsvermögen der ESPE mit Schutz- und Steuerfunktion gleich oder kleiner 30 mm? +Ist der normativ erforderliche Mindestabstand der ESPE mit Schutz- und Steuerfunktion zur Gefährdungsstelle entsprechend der Auflösung eingehalten? +Sind wirksame Maßnahmen getroffen, die verhindern dass Personen sich vollständig hinter dem Schutzfeld der ESPE innerhalb des Gefährdungsbereiches aufhalten können? +Ist die Steuerfunktion 'Zyklische Auslösung' auf genau eine ESPE pro Maschine (Montage Maschinenvorderseite) beschränkt? +Wird die minimale Tischhöhe eingehalten? +Werden die Anforderungen an Öffnungshub und Pressentischtiefe eingehalten? +Kann eine weitere gefahrbringende Bewegung nach Beenden eines Bewegungs-Zyklus' durch Eingreifen in das Schutzfeld der ESPE nur innerhalb von max. 30 Sek. eingeleitet werden? +Wird beim Umschalten der Taktsteuer- Betriebsart die jeweils eingeleitete gefahrbringende Bewegung gestoppt? +Entspricht die ESPE mindestens dem geforderten Sicherheitsniveau Typ 4? \ No newline at end of file diff --git a/java/mss-failsafe/src/main/resources/log4j2.xml b/java/mss-failsafe/src/main/resources/log4j2.xml new file mode 100755 index 0000000..02349e5 --- /dev/null +++ b/java/mss-failsafe/src/main/resources/log4j2.xml @@ -0,0 +1,33 @@ + + + + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} %-5p %c{1}:%L - %m%n + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} %-5p %c{1}:%L - %m%n + + + + + + + + + + + + + + + + + diff --git a/java/mss-failsafe/src/main/webapp/WEB-INF/faces-config.xml b/java/mss-failsafe/src/main/webapp/WEB-INF/faces-config.xml new file mode 100755 index 0000000..3e01af2 --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/WEB-INF/faces-config.xml @@ -0,0 +1,25 @@ + + + + + java.lang.Enum + javax.faces.convert.EnumConverter + + + + /Bundle + bundle + + + + + javax.faces.application.ViewExpiredException + /index.xhtml + + + + \ No newline at end of file diff --git a/java/mss-failsafe/src/main/webapp/WEB-INF/jboss-deployment-structure.xml b/java/mss-failsafe/src/main/webapp/WEB-INF/jboss-deployment-structure.xml new file mode 100755 index 0000000..cfbffa6 --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/WEB-INF/jboss-deployment-structure.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/java/mss-failsafe/mss/src/main/webapp/WEB-INF/jboss-web.xml b/java/mss-failsafe/src/main/webapp/WEB-INF/jboss-web.xml old mode 100644 new mode 100755 similarity index 76% rename from java/mss-failsafe/mss/src/main/webapp/WEB-INF/jboss-web.xml rename to java/mss-failsafe/src/main/webapp/WEB-INF/jboss-web.xml index ebbcf56..f3fd7e5 --- a/java/mss-failsafe/mss/src/main/webapp/WEB-INF/jboss-web.xml +++ b/java/mss-failsafe/src/main/webapp/WEB-INF/jboss-web.xml @@ -1,5 +1,6 @@ /mss - jaspitest + + MSSAPPSEC \ No newline at end of file diff --git a/java/mss-failsafe/mss/src/main/webapp/WEB-INF/web.xml b/java/mss-failsafe/src/main/webapp/WEB-INF/web.xml old mode 100644 new mode 100755 similarity index 76% rename from java/mss-failsafe/mss/src/main/webapp/WEB-INF/web.xml rename to java/mss-failsafe/src/main/webapp/WEB-INF/web.xml index 363b1e8..f8ec49c --- a/java/mss-failsafe/mss/src/main/webapp/WEB-INF/web.xml +++ b/java/mss-failsafe/src/main/webapp/WEB-INF/web.xml @@ -8,15 +8,21 @@ 401 /error.xhtml + 403 /error.xhtml + + + javax.faces.application.ViewExpiredException + /index.xhtml + authorise - /user/* + /resources/user/* GET POST TRACE @@ -28,6 +34,7 @@ ADMIN + SUPERUSER USER + + Benutzer auswählen + Suchen Sie den Benutzer, dessen Passwort zurückgesetzt werden soll. + + + + + + + + + + + + + +

Oder wählen Sie einen Benutzer aus der Liste:

+ + + + + + + + +
+ + + + Neues Passwort setzen + + Setzen Sie ein neues Passwort für: + #{adminPasswordResetController.selectedUser.firstname} #{adminPasswordResetController.selectedUser.lastname} + (#{adminPasswordResetController.selectedUser.email}) + + + + + + + + + + + + +
+ + + +
+
+ + + + + + + + + + Hinweise +
    +
  • Das neue Passwort muss mindestens 6 Zeichen lang sein
  • +
  • Der Benutzer wird über die Änderung nicht automatisch benachrichtigt
  • +
  • Das neue Passwort wird sofort aktiv und das alte Passwort ist nicht mehr gültig
  • +
  • Stellen Sie sicher, dass Sie dem Benutzer das neue Passwort sicher mitteilen
  • +
+
+ + + + + diff --git a/java/mss-failsafe/src/main/webapp/admin/userManagement.xhtml b/java/mss-failsafe/src/main/webapp/admin/userManagement.xhtml new file mode 100755 index 0000000..5ea232d --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/admin/userManagement.xhtml @@ -0,0 +1,221 @@ + + + + + + Benutzerverwaltung - Sperren/Löschen + + + +

Benutzerverwaltung

+
+ + + + + + + Benutzer auswählen + Suchen Sie den Benutzer, den Sie verwalten möchten. + + + + + + + + + + + + + +

Oder wählen Sie einen Benutzer aus der Liste:

+ + + + + + + + +
+ + + + Benutzer verwalten + + Ausgewählter Benutzer: + #{adminUserManagementController.selectedUser.firstname} #{adminUserManagementController.selectedUser.lastname} + (#{adminUserManagementController.selectedUser.email}) + + + + + + + + + + + + + + + + + + + + + + + + +

Verfügbare Aktionen:

+ +
+ + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+
+
+ + +

WARNUNG: Das permanente Deaktivieren eines Benutzers verhindert dessen Anmeldung!

+

Sie sind dabei, den folgenden Benutzer permanent zu deaktivieren:

+
    +
  • Name: #{adminUserManagementController.selectedUser.firstname} #{adminUserManagementController.selectedUser.lastname}
  • +
  • E-Mail: #{adminUserManagementController.selectedUser.email}
  • +
+ +

Zur Bestätigung geben Sie bitte die E-Mail-Adresse des Benutzers ein:

+ + +

Hinweis: Die Benutzerdaten bleiben erhalten, aber der Benutzer kann sich nicht mehr anmelden.

+
+
+
+
+ + + + + +
+ + + + Hinweise zur Benutzerverwaltung +
    +
  • Sperren: Gesperrte Benutzer können sich nicht am System anmelden, ihre Daten bleiben aber erhalten
  • +
  • Entsperren: Entsperrte Benutzer können sich wieder normal anmelden
  • +
  • Löschen: Gelöschte Benutzer werden permanent aus dem System entfernt (NICHT rückgängig machbar!)
  • +
  • Datenabhängigkeiten: Benutzer mit verknüpften Tickets oder anderen Daten können möglicherweise nicht gelöscht werden
  • +
  • Sicherheit: Alle Aktionen werden protokolliert und erfordern Admin-Rechte
  • +
+
+ +
+
+ +
diff --git a/java/mss-failsafe/src/main/webapp/admin/welcome.xhtml b/java/mss-failsafe/src/main/webapp/admin/welcome.xhtml new file mode 100755 index 0000000..ab04508 --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/admin/welcome.xhtml @@ -0,0 +1,35 @@ + + + + Willkommen #{personController.activeUser.call.toString()} #{personController.activeUser.lastname} + + + + + + + + + + + + Eingeloggte Personen + + + + + #{person} + + + + + + + + + + + diff --git a/java/mss-failsafe/mss/src/main/webapp/error.xhtml b/java/mss-failsafe/src/main/webapp/error.xhtml old mode 100644 new mode 100755 similarity index 100% rename from java/mss-failsafe/mss/src/main/webapp/error.xhtml rename to java/mss-failsafe/src/main/webapp/error.xhtml diff --git a/java/mss-failsafe/src/main/webapp/index.xhtml b/java/mss-failsafe/src/main/webapp/index.xhtml new file mode 100755 index 0000000..e106cc5 --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/index.xhtml @@ -0,0 +1,68 @@ + + + Login Machine Safety Services + + + + + +
+
+ + + + + + Wilkommen bei Machine Safety Services + + +
+ + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+ +
+
+
+
+
+
+ + + + +
+
+
+ +
+
+ +
+
+ +
+
+
+
+
+ diff --git a/java/mss-failsafe/src/main/webapp/passwordreset.xhtml b/java/mss-failsafe/src/main/webapp/passwordreset.xhtml new file mode 100755 index 0000000..6c5c0bf --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/passwordreset.xhtml @@ -0,0 +1,44 @@ + + + Passwortreset Machine Safety Services + + + + + +
+
+ + + + + + + + + +
+ +
+ +
+
+ +
+ +
+ +
+
+ + +
+
+
+
+
+ diff --git a/java/mss-failsafe/src/main/webapp/resources/css/dark.css b/java/mss-failsafe/src/main/webapp/resources/css/dark.css new file mode 100755 index 0000000..53981cf --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/resources/css/dark.css @@ -0,0 +1,13 @@ +/* +To change this license header, choose License Headers in Project Properties. +To change this template file, choose Tools | Templates +and open the template in the editor. +*/ +/* + Created on : 16.12.2021, 00:03:48 + Author : patri +*/ + +.ui-tabs-panel{ + background-color: #121212 !important; +} \ No newline at end of file diff --git a/java/mss-failsafe/mss/src/main/webapp/resources/css/default.css b/java/mss-failsafe/src/main/webapp/resources/css/default.css old mode 100644 new mode 100755 similarity index 74% rename from java/mss-failsafe/mss/src/main/webapp/resources/css/default.css rename to java/mss-failsafe/src/main/webapp/resources/css/default.css index c9ee291..f789e06 --- a/java/mss-failsafe/mss/src/main/webapp/resources/css/default.css +++ b/java/mss-failsafe/src/main/webapp/resources/css/default.css @@ -3,22 +3,89 @@ width: 1300px; } -.ui-selectonemenu{ - width: 250px !important; +body { } +.ui-avatar-circle{ +} +/* +.ui-menuitem:hover { + background-color: #CBE7F6 !important; +} + +.ui-menuitem-link.ui-state-hover{ + background-color: #CBE7F6 !important; +} + +.ui-datatable tr.ui-datatable-even:hover, .ui-datatable tr.ui-datatable-odd:hover{ + background-color: #CBE7F6 !important; +} +*/ +/* .contentPanel{ background-color: white; +}*/ + +.dataScrollerCard:hover{ + box-shadow: 0px 10px 13px -7px #000000, 5px 5px 10px 5px rgba(255,255,255,0.2); + border: 0.5px solid cadetblue; +} + +.dataScrollerCard{ + border: 0.5px solid #121212; } .avatar:hover{ cursor: pointer; + box-shadow: 0px 10px 13px -7px #000000, 5px 5px 10px 5px rgba(255,255,255,0.2); + border: 1.0px solid #002A2A; +} + +.avatar{ + } .bodyPanel{ background-color: lightgray; } +.ui-contextmenu { + white-space: nowrap; + width: auto !important; + min-width: 18em; +} + +.ui-contextmenu:hover { + box-shadow: 0px 10px 13px -7px #000000, 5px 5px 10px 5px rgba(255,255,255,0.2); + border: 0.5px solid cadetblue; +} + +.ui-tabs-panel { + padding: 0 0 0 0 !important; + margin: 0 0 0 0 !important; +} + +.ui-growl-item-container.ui-growl-info { + background-color: #CDE7B0 !important; + border-color: green !important; + color: black !important; +} + +.ui-messages-info { + background-color: #CDE7B0 !important; + border-color: green !important; + color: black !important; +} + +.ui-growl-image-info { + color: green !important; +} + +.ui-messages-info-icon { + color: green !important; +} + +/* .ui-tooltip { width: 500px; } @@ -34,7 +101,7 @@ border-radius: 10px; -moz-border-radius: 10px; -webkit-border-radius: 10px; -} +}*/ .alignTop { vertical-align: top; diff --git a/java/mss-failsafe/mss/src/main/webapp/resources/css/icons.css b/java/mss-failsafe/src/main/webapp/resources/css/icons.css old mode 100644 new mode 100755 similarity index 75% rename from java/mss-failsafe/mss/src/main/webapp/resources/css/icons.css rename to java/mss-failsafe/src/main/webapp/resources/css/icons.css index 102c29b..ed6da78 --- a/java/mss-failsafe/mss/src/main/webapp/resources/css/icons.css +++ b/java/mss-failsafe/src/main/webapp/resources/css/icons.css @@ -25,6 +25,14 @@ and open the template in the editor. background-image: url('../resources/images/icons/location_icon.png') !important; } +.icon.location-light{ + background-image: url('../resources/images/icons/location_icon_light.png') !important; +} + .icon.security{ background-image: url('../resources/images/icons/security_icon.png') !important; +} + +.icon.manufacturer{ + background-image: url('../resources/images/icons/manufacturer_icon.png') !important; } \ No newline at end of file diff --git a/java/mss-failsafe/src/main/webapp/resources/css/light.css b/java/mss-failsafe/src/main/webapp/resources/css/light.css new file mode 100755 index 0000000..b3b21e5 --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/resources/css/light.css @@ -0,0 +1,13 @@ +/* +To change this license header, choose License Headers in Project Properties. +To change this template file, choose Tools | Templates +and open the template in the editor. +*/ +/* + Created on : 16.12.2021, 00:04:22 + Author : patri +*/ + +.ui-tabs-panel{ + background-color: #EEF7FC !important; +} \ No newline at end of file diff --git a/java/mss-failsafe/src/main/webapp/resources/css/primeflex.css b/java/mss-failsafe/src/main/webapp/resources/css/primeflex.css new file mode 100755 index 0000000..62e0b58 --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/resources/css/primeflex.css @@ -0,0 +1,4660 @@ +.p-grid { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin-right: -0.5rem; + margin-left: -0.5rem; + margin-top: -0.5rem; +} + +.p-grid > .p-col, +.p-grid > [class*=p-col] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.p-nogutter { + margin-right: 0; + margin-left: 0; + margin-top: 0; +} + +.p-nogutter > .p-col, +.p-nogutter > [class*=p-col-] { + padding: 0; +} + +.p-col { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-preferred-size: 0; + flex-basis: 0; + padding: 0.5rem; +} + +.p-col-fixed { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + padding: 0.5rem; +} + +.p-col-1, +.p-col-2, +.p-col-3, +.p-col-4, +.p-col-5, +.p-col-6, +.p-col-7, +.p-col-8, +.p-col-9, +.p-col-10, +.p-col-11, +.p-col-12 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + padding: 0.5rem; +} + +.p-col-1 { + width: 8.3333%; +} + +.p-col-2 { + width: 16.6667%; +} + +.p-col-3 { + width: 25%; +} + +.p-col-4 { + width: 33.3333%; +} + +.p-col-5 { + width: 41.6667%; +} + +.p-col-6 { + width: 50%; +} + +.p-col-7 { + width: 58.3333%; +} + +.p-col-8 { + width: 66.6667%; +} + +.p-col-9 { + width: 75%; +} + +.p-col-10 { + width: 83.3333%; +} + +.p-col-11 { + width: 91.6667%; +} + +.p-col-12 { + width: 100%; +} + +.p-offset-12 { + margin-left: 100%; +} + +.p-offset-11 { + margin-left: 91.66666667%; +} + +.p-offset-10 { + margin-left: 83.33333333%; +} + +.p-offset-9 { + margin-left: 75%; +} + +.p-offset-8 { + margin-left: 66.66666667%; +} + +.p-offset-7 { + margin-left: 58.33333333%; +} + +.p-offset-6 { + margin-left: 50%; +} + +.p-offset-5 { + margin-left: 41.66666667%; +} + +.p-offset-4 { + margin-left: 33.33333333%; +} + +.p-offset-3 { + margin-left: 25%; +} + +.p-offset-2 { + margin-left: 16.66666667%; +} + +.p-offset-1 { + margin-left: 8.33333333%; +} + +.p-offset-0 { + margin-left: 0%; +} + +.p-sm-1, +.p-sm-2, +.p-sm-3, +.p-sm-4, +.p-sm-5, +.p-sm-6, +.p-sm-7, +.p-sm-8, +.p-sm-9, +.p-sm-10, +.p-sm-11, +.p-sm-12, +.p-md-1, +.p-md-2, +.p-md-3, +.p-md-4, +.p-md-5, +.p-md-6, +.p-md-7, +.p-md-8, +.p-md-9, +.p-md-10, +.p-md-11, +.p-md-12, +.p-lg-1, +.p-lg-2, +.p-lg-3, +.p-lg-4, +.p-lg-5, +.p-lg-6, +.p-lg-7, +.p-lg-8, +.p-lg-9, +.p-lg-10, +.p-lg-11, +.p-lg-12, +.p-xl-1, +.p-xl-2, +.p-xl-3, +.p-xl-4, +.p-xl-5, +.p-xl-6, +.p-xl-7, +.p-xl-8, +.p-xl-9, +.p-xl-10, +.p-xl-11, +.p-xl-12 { + padding: 0.5rem; +} + +.p-col-nogutter { + padding: 0; +} + +@media screen and (min-width: 576px) { + .p-sm-1, +.p-sm-2, +.p-sm-3, +.p-sm-4, +.p-sm-5, +.p-sm-6, +.p-sm-7, +.p-sm-8, +.p-sm-9, +.p-sm-10, +.p-sm-11, +.p-sm-12 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + } + + .p-sm-1 { + width: 8.3333%; + } + + .p-sm-2 { + width: 16.6667%; + } + + .p-sm-3 { + width: 25%; + } + + .p-sm-4 { + width: 33.3333%; + } + + .p-sm-5 { + width: 41.6667%; + } + + .p-sm-6 { + width: 50%; + } + + .p-sm-7 { + width: 58.3333%; + } + + .p-sm-8 { + width: 66.6667%; + } + + .p-sm-9 { + width: 75%; + } + + .p-sm-10 { + width: 83.3333%; + } + + .p-sm-11 { + width: 91.6667%; + } + + .p-sm-12 { + width: 100%; + } + + .p-sm-offset-12 { + margin-left: 100%; + } + + .p-sm-offset-11 { + margin-left: 91.66666667%; + } + + .p-sm-offset-10 { + margin-left: 83.33333333%; + } + + .p-sm-offset-9 { + margin-left: 75%; + } + + .p-sm-offset-8 { + margin-left: 66.66666667%; + } + + .p-sm-offset-7 { + margin-left: 58.33333333%; + } + + .p-sm-offset-6 { + margin-left: 50%; + } + + .p-sm-offset-5 { + margin-left: 41.66666667%; + } + + .p-sm-offset-4 { + margin-left: 33.33333333%; + } + + .p-sm-offset-3 { + margin-left: 25%; + } + + .p-sm-offset-2 { + margin-left: 16.66666667%; + } + + .p-sm-offset-1 { + margin-left: 8.33333333%; + } + + .p-sm-offset-0 { + margin-left: 0%; + } +} +@media screen and (min-width: 768px) { + .p-md-1, +.p-md-2, +.p-md-3, +.p-md-4, +.p-md-5, +.p-md-6, +.p-md-7, +.p-md-8, +.p-md-9, +.p-md-10, +.p-md-11, +.p-md-12 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + } + + .p-md-1 { + width: 8.3333%; + } + + .p-md-2 { + width: 16.6667%; + } + + .p-md-3 { + width: 25%; + } + + .p-md-4 { + width: 33.3333%; + } + + .p-md-5 { + width: 41.6667%; + } + + .p-md-6 { + width: 50%; + } + + .p-md-7 { + width: 58.3333%; + } + + .p-md-8 { + width: 66.6667%; + } + + .p-md-9 { + width: 75%; + } + + .p-md-10 { + width: 83.3333%; + } + + .p-md-11 { + width: 91.6667%; + } + + .p-md-12 { + width: 100%; + } + + .p-md-offset-12 { + margin-left: 100%; + } + + .p-md-offset-11 { + margin-left: 91.66666667%; + } + + .p-md-offset-10 { + margin-left: 83.33333333%; + } + + .p-md-offset-9 { + margin-left: 75%; + } + + .p-md-offset-8 { + margin-left: 66.66666667%; + } + + .p-md-offset-7 { + margin-left: 58.33333333%; + } + + .p-md-offset-6 { + margin-left: 50%; + } + + .p-md-offset-5 { + margin-left: 41.66666667%; + } + + .p-md-offset-4 { + margin-left: 33.33333333%; + } + + .p-md-offset-3 { + margin-left: 25%; + } + + .p-md-offset-2 { + margin-left: 16.66666667%; + } + + .p-md-offset-1 { + margin-left: 8.33333333%; + } + + .p-md-offset-0 { + margin-left: 0%; + } +} +@media screen and (min-width: 992px) { + .p-lg-1, +.p-lg-2, +.p-lg-3, +.p-lg-4, +.p-lg-5, +.p-lg-6, +.p-lg-7, +.p-lg-8, +.p-lg-9, +.p-lg-10, +.p-lg-11, +.p-lg-12 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + } + + .p-lg-1 { + width: 8.3333%; + } + + .p-lg-2 { + width: 16.6667%; + } + + .p-lg-3 { + width: 25%; + } + + .p-lg-4 { + width: 33.3333%; + } + + .p-lg-5 { + width: 41.6667%; + } + + .p-lg-6 { + width: 50%; + } + + .p-lg-7 { + width: 58.3333%; + } + + .p-lg-8 { + width: 66.6667%; + } + + .p-lg-9 { + width: 75%; + } + + .p-lg-10 { + width: 83.3333%; + } + + .p-lg-11 { + width: 91.6667%; + } + + .p-lg-12 { + width: 100%; + } + + .p-lg-offset-12 { + margin-left: 100%; + } + + .p-lg-offset-11 { + margin-left: 91.66666667%; + } + + .p-lg-offset-10 { + margin-left: 83.33333333%; + } + + .p-lg-offset-9 { + margin-left: 75%; + } + + .p-lg-offset-8 { + margin-left: 66.66666667%; + } + + .p-lg-offset-7 { + margin-left: 58.33333333%; + } + + .p-lg-offset-6 { + margin-left: 50%; + } + + .p-lg-offset-5 { + margin-left: 41.66666667%; + } + + .p-lg-offset-4 { + margin-left: 33.33333333%; + } + + .p-lg-offset-3 { + margin-left: 25%; + } + + .p-lg-offset-2 { + margin-left: 16.66666667%; + } + + .p-lg-offset-1 { + margin-left: 8.33333333%; + } + + .p-lg-offset-0 { + margin-left: 0%; + } +} +@media screen and (min-width: 1200px) { + .p-xl-1, +.p-xl-2, +.p-xl-3, +.p-xl-4, +.p-xl-5, +.p-xl-6, +.p-xl-7, +.p-xl-8, +.p-xl-9, +.p-xl-10, +.p-xl-11, +.p-xl-12 { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + } + + .p-xl-1 { + width: 8.3333%; + } + + .p-xl-2 { + width: 16.6667%; + } + + .p-xl-3 { + width: 25%; + } + + .p-xl-4 { + width: 33.3333%; + } + + .p-xl-5 { + width: 41.6667%; + } + + .p-xl-6 { + width: 50%; + } + + .p-xl-7 { + width: 58.3333%; + } + + .p-xl-8 { + width: 66.6667%; + } + + .p-xl-9 { + width: 75%; + } + + .p-xl-10 { + width: 83.3333%; + } + + .p-xl-11 { + width: 91.6667%; + } + + .p-xl-12 { + width: 100%; + } + + .p-xl-offset-12 { + margin-left: 100%; + } + + .p-xl-offset-11 { + margin-left: 91.66666667%; + } + + .p-xl-offset-10 { + margin-left: 83.33333333%; + } + + .p-xl-offset-9 { + margin-left: 75%; + } + + .p-xl-offset-8 { + margin-left: 66.66666667%; + } + + .p-xl-offset-7 { + margin-left: 58.33333333%; + } + + .p-xl-offset-6 { + margin-left: 50%; + } + + .p-xl-offset-5 { + margin-left: 41.66666667%; + } + + .p-xl-offset-4 { + margin-left: 33.33333333%; + } + + .p-xl-offset-3 { + margin-left: 25%; + } + + .p-xl-offset-2 { + margin-left: 16.66666667%; + } + + .p-xl-offset-1 { + margin-left: 8.33333333%; + } + + .p-xl-offset-0 { + margin-left: 0%; + } +} +.p-justify-start { + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; +} + +.p-justify-end { + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; +} + +.p-justify-center { + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +.p-justify-between { + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; +} + +.p-justify-around { + -ms-flex-pack: distribute; + justify-content: space-around; +} + +.p-justify-even { + -webkit-box-pack: space-evenly; + -ms-flex-pack: space-evenly; + justify-content: space-evenly; +} + +.p-align-start { + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; +} + +.p-align-end { + -webkit-box-align: end; + -ms-flex-align: end; + align-items: flex-end; +} + +.p-align-center { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} + +.p-align-baseline { + -webkit-box-align: baseline; + -ms-flex-align: baseline; + align-items: baseline; +} + +.p-align-stretch { + -webkit-box-align: stretch; + -ms-flex-align: stretch; + align-items: stretch; +} + +.p-col-align-start { + -ms-flex-item-align: start; + align-self: flex-start; +} + +.p-col-align-end { + -ms-flex-item-align: end; + align-self: flex-end; +} + +.p-col-align-center { + -ms-flex-item-align: center; + -ms-grid-row-align: center; + align-self: center; +} + +.p-col-align-baseline { + -ms-flex-item-align: baseline; + align-self: baseline; +} + +.p-col-align-stretch { + -ms-flex-item-align: stretch; + -ms-grid-row-align: stretch; + align-self: stretch; +} + +.p-dir-row { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; +} + +.p-dir-rev { + -webkit-box-orient: horizontal; + -webkit-box-direction: reverse; + -ms-flex-direction: row-reverse; + flex-direction: row-reverse; +} + +.p-dir-col { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; +} + +.p-dir-col-rev { + -webkit-box-orient: vertical; + -webkit-box-direction: reverse; + -ms-flex-direction: column-reverse; + flex-direction: column-reverse; +} + +.p-dir-col > .p-col, +.p-dir-col-rev > .p-col { + -ms-flex-preferred-size: auto; + flex-basis: auto; +} + +.p-col-order-first { + -ms-flex-order: -1; + order: -1; +} + +.p-col-order-last { + -ms-flex-order: 13; + order: 13; +} + +.p-col-order-0 { + -ms-flex-order: 0; + order: 0; +} + +.p-col-order-1 { + -ms-flex-order: 1; + order: 1; +} + +.p-col-order-2 { + -ms-flex-order: 2; + order: 2; +} + +.p-col-order-3 { + -ms-flex-order: 3; + order: 3; +} + +.p-col-order-4 { + -ms-flex-order: 4; + order: 4; +} + +.p-col-order-5 { + -ms-flex-order: 5; + order: 5; +} + +.p-col-order-6 { + -ms-flex-order: 6; + order: 6; +} + +.p-col-order-7 { + -ms-flex-order: 7; + order: 7; +} + +.p-col-order-8 { + -ms-flex-order: 8; + order: 8; +} + +.p-col-order-9 { + -ms-flex-order: 9; + order: 9; +} + +.p-col-order-10 { + -ms-flex-order: 10; + order: 10; +} + +.p-col-order-11 { + -ms-flex-order: 11; + order: 11; +} + +.p-col-order-12 { + -ms-flex-order: 12; + order: 12; +} + +@media screen and (min-width: 576px) { + .p-sm-order-first { + -ms-flex-order: -1; + order: -1; + } + + .p-sm-order-last { + -ms-flex-order: 13; + order: 13; + } + + .p-sm-order-0 { + -ms-flex-order: 0; + order: 0; + } + + .p-sm-order-1 { + -ms-flex-order: 1; + order: 1; + } + + .p-sm-order-2 { + -ms-flex-order: 2; + order: 2; + } + + .p-sm-order-3 { + -ms-flex-order: 3; + order: 3; + } + + .p-sm-order-4 { + -ms-flex-order: 4; + order: 4; + } + + .p-sm-order-5 { + -ms-flex-order: 5; + order: 5; + } + + .p-sm-order-6 { + -ms-flex-order: 6; + order: 6; + } + + .p-sm-order-7 { + -ms-flex-order: 7; + order: 7; + } + + .p-sm-order-8 { + -ms-flex-order: 8; + order: 8; + } + + .p-sm-order-9 { + -ms-flex-order: 9; + order: 9; + } + + .p-sm-order-10 { + -ms-flex-order: 10; + order: 10; + } + + .p-sm-order-11 { + -ms-flex-order: 11; + order: 11; + } + + .p-sm-order-12 { + -ms-flex-order: 12; + order: 12; + } +} +@media screen and (min-width: 768px) { + .p-md-order-first { + -ms-flex-order: -1; + order: -1; + } + + .p-md-order-last { + -ms-flex-order: 13; + order: 13; + } + + .p-md-order-0 { + -ms-flex-order: 0; + order: 0; + } + + .p-md-order-1 { + -ms-flex-order: 1; + order: 1; + } + + .p-md-order-2 { + -ms-flex-order: 2; + order: 2; + } + + .p-md-order-3 { + -ms-flex-order: 3; + order: 3; + } + + .p-md-order-4 { + -ms-flex-order: 4; + order: 4; + } + + .p-md-order-5 { + -ms-flex-order: 5; + order: 5; + } + + .p-md-order-6 { + -ms-flex-order: 6; + order: 6; + } + + .p-md-order-7 { + -ms-flex-order: 7; + order: 7; + } + + .p-md-order-8 { + -ms-flex-order: 8; + order: 8; + } + + .p-md-order-9 { + -ms-flex-order: 9; + order: 9; + } + + .p-md-order-10 { + -ms-flex-order: 10; + order: 10; + } + + .p-md-order-11 { + -ms-flex-order: 11; + order: 11; + } + + .p-md-order-12 { + -ms-flex-order: 12; + order: 12; + } +} +@media screen and (min-width: 992px) { + .p-lg-order-first { + -ms-flex-order: -1; + order: -1; + } + + .p-lg-order-last { + -ms-flex-order: 13; + order: 13; + } + + .p-lg-order-0 { + -ms-flex-order: 0; + order: 0; + } + + .p-lg-order-1 { + -ms-flex-order: 1; + order: 1; + } + + .p-lg-order-2 { + -ms-flex-order: 2; + order: 2; + } + + .p-lg-order-3 { + -ms-flex-order: 3; + order: 3; + } + + .p-lg-order-4 { + -ms-flex-order: 4; + order: 4; + } + + .p-lg-order-5 { + -ms-flex-order: 5; + order: 5; + } + + .p-lg-order-6 { + -ms-flex-order: 6; + order: 6; + } + + .p-lg-order-7 { + -ms-flex-order: 7; + order: 7; + } + + .p-lg-order-8 { + -ms-flex-order: 8; + order: 8; + } + + .p-lg-order-9 { + -ms-flex-order: 9; + order: 9; + } + + .p-lg-order-10 { + -ms-flex-order: 10; + order: 10; + } + + .p-lg-order-11 { + -ms-flex-order: 11; + order: 11; + } + + .p-lg-order-12 { + -ms-flex-order: 12; + order: 12; + } +} +@media screen and (min-width: 1200px) { + .p-xl-order-first { + -ms-flex-order: -1; + order: -1; + } + + .p-xl-order-last { + -ms-flex-order: 13; + order: 13; + } + + .p-xl-order-0 { + -ms-flex-order: 0; + order: 0; + } + + .p-xl-order-1 { + -ms-flex-order: 1; + order: 1; + } + + .p-xl-order-2 { + -ms-flex-order: 2; + order: 2; + } + + .p-xl-order-3 { + -ms-flex-order: 3; + order: 3; + } + + .p-xl-order-4 { + -ms-flex-order: 4; + order: 4; + } + + .p-xl-order-5 { + -ms-flex-order: 5; + order: 5; + } + + .p-xl-order-6 { + -ms-flex-order: 6; + order: 6; + } + + .p-xl-order-7 { + -ms-flex-order: 7; + order: 7; + } + + .p-xl-order-8 { + -ms-flex-order: 8; + order: 8; + } + + .p-xl-order-9 { + -ms-flex-order: 9; + order: 9; + } + + .p-xl-order-10 { + -ms-flex-order: 10; + order: 10; + } + + .p-xl-order-11 { + -ms-flex-order: 11; + order: 11; + } + + .p-xl-order-12 { + -ms-flex-order: 12; + order: 12; + } +} +.p-field { + margin-bottom: 1rem; +} + +.p-field > label { + display: inline-block; + margin-bottom: 0.5rem; +} + +.p-field.p-grid > label { + display: flex; + align-items: center; +} + +.p-field > small { + margin-top: 0.25rem; +} + +.p-field.p-grid, +.p-formgrid.p-grid { + margin-top: 0; +} + +.p-field.p-grid .p-col-fixed, +.p-formgrid.p-grid .p-col-fixed, +.p-field.p-grid .p-col, +.p-formgrid.p-grid .p-col, +.p-field.p-grid .p-col-1, +.p-formgrid.p-grid .p-col-1, +.p-field.p-grid .p-col-2, +.p-formgrid.p-grid .p-col-2, +.p-field.p-grid .p-col-3, +.p-formgrid.p-grid .p-col-3, +.p-field.p-grid .p-col-4, +.p-formgrid.p-grid .p-col-4, +.p-field.p-grid .p-col-5, +.p-formgrid.p-grid .p-col-5, +.p-field.p-grid .p-col-6, +.p-formgrid.p-grid .p-col-6, +.p-field.p-grid .p-col-7, +.p-formgrid.p-grid .p-col-7, +.p-field.p-grid .p-col-8, +.p-formgrid.p-grid .p-col-8, +.p-field.p-grid .p-col-9, +.p-formgrid.p-grid .p-col-9, +.p-field.p-grid .p-col-10, +.p-formgrid.p-grid .p-col-10, +.p-field.p-grid .p-col-11, +.p-formgrid.p-grid .p-col-11, +.p-field.p-grid .p-col-12, +.p-formgrid.p-grid .p-col-12 { + padding-top: 0; + padding-bottom: 0; +} + +.p-formgroup-inline { + display: flex; + flex-wrap: wrap; + align-items: flex-start; +} + +.p-formgroup-inline .p-field, +.p-formgroup-inline .p-field-checkbox, +.p-formgroup-inline .p-field-radiobutton { + margin-right: 1rem; +} + +.p-formgroup-inline .p-field > label, +.p-formgroup-inline .p-field-checkbox > label, +.p-formgroup-inline .p-field-radiobutton > label { + margin-right: 0.5rem; + margin-bottom: 0; +} + +.p-field-checkbox, +.p-field-radiobutton { + margin-bottom: 1rem; + display: flex; + align-items: center; +} + +.p-field-checkbox > label, +.p-field-radiobutton > label { + margin-left: 0.5rem; + line-height: 1; +} + +.p-d-none { + display: none !important; +} + +.p-d-inline { + display: inline !important; +} + +.p-d-inline-block { + display: inline-block !important; +} + +.p-d-block { + display: block !important; +} + +.p-d-flex { + display: flex !important; +} + +.p-d-inline-flex { + display: inline-flex !important; +} + +@media screen and (min-width: 576px) { + .p-d-sm-none { + display: none !important; + } + + .p-d-sm-inline { + display: inline !important; + } + + .p-d-sm-inline-block { + display: inline-block !important; + } + + .p-d-sm-block { + display: block !important; + } + + .p-d-sm-flex { + display: flex !important; + } + + .p-d-sm-inline-flex { + display: inline-flex !important; + } +} +@media screen and (min-width: 768px) { + .p-d-md-none { + display: none !important; + } + + .p-d-md-inline { + display: inline !important; + } + + .p-d-md-inline-block { + display: inline-block !important; + } + + .p-d-md-block { + display: block !important; + } + + .p-d-md-flex { + display: flex !important; + } + + .p-d-md-inline-flex { + display: inline-flex !important; + } +} +@media screen and (min-width: 992px) { + .p-d-lg-none { + display: none !important; + } + + .p-d-lg-inline { + display: inline !important; + } + + .p-d-lg-inline-block { + display: inline-block !important; + } + + .p-d-lg-block { + display: block !important; + } + + .p-d-lg-flex { + display: flex !important; + } + + .p-d-lg-inline-flex { + display: inline-flex !important; + } +} +@media screen and (min-width: 1200px) { + .p-d-xl-none { + display: none !important; + } + + .p-d-xl-inline { + display: inline !important; + } + + .p-d-xl-inline-block { + display: inline-block !important; + } + + .p-d-xl-block { + display: block !important; + } + + .p-d-xl-flex { + display: flex !important; + } + + .p-d-xl-inline-flex { + display: inline-flex !important; + } +} +@media print { + .p-d-print-none { + display: none !important; + } + + .p-d-print-inline { + display: inline !important; + } + + .p-d-print-inline-block { + display: inline-block !important; + } + + .p-d-print-block { + display: block !important; + } + + .p-d-print-flex { + display: flex !important; + } + + .p-d-print-inline-flex { + display: inline-flex !important; + } +} +.p-text-justify { + text-align: justify !important; +} + +.p-text-left { + text-align: left !important; +} + +.p-text-right { + text-align: right !important; +} + +.p-text-center { + text-align: center !important; +} + +.p-text-nowrap { + white-space: nowrap !important; +} + +.p-text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.p-text-lowercase { + text-transform: lowercase !important; +} + +.p-text-uppercase { + text-transform: uppercase !important; +} + +.p-text-capitalize { + text-transform: capitalize !important; +} + +.p-text-bold { + font-weight: 700 !important; +} + +.p-text-normal { + font-weight: 400 !important; +} + +.p-text-light { + font-weight: 300 !important; +} + +.p-text-italic { + font-style: italic !important; +} + +@media screen and (min-width: 576px) { + .p-text-sm-justify { + text-align: justify !important; + } + + .p-text-sm-left { + text-align: left !important; + } + + .p-text-sm-right { + text-align: right !important; + } + + .p-text-sm-center { + text-align: center !important; + } +} +@media screen and (min-width: 768px) { + .p-text-md-justify { + text-align: justify !important; + } + + .p-text-md-left { + text-align: left !important; + } + + .p-text-md-right { + text-align: right !important; + } + + .p-text-md-center { + text-align: center !important; + } +} +@media screen and (min-width: 992px) { + .p-text-lg-justify { + text-align: justify !important; + } + + .p-text-lg-left { + text-align: left !important; + } + + .p-text-lg-right { + text-align: right !important; + } + + .p-text-lg-center { + text-align: center !important; + } +} +@media screen and (min-width: 1200px) { + .p-text-xl-justify { + text-align: justify !important; + } + + .p-text-xl-left { + text-align: left !important; + } + + .p-text-xl-right { + text-align: right !important; + } + + .p-text-xl-center { + text-align: center !important; + } +} +.p-flex-row { + flex-direction: row !important; +} + +.p-flex-row-reverse { + flex-direction: row-reverse !important; +} + +.p-flex-column { + flex-direction: column !important; +} + +.p-flex-column-reverse { + flex-direction: column-reverse !important; +} + +@media screen and (min-width: 576px) { + .p-flex-sm-row { + flex-direction: row !important; + } + + .p-flex-sm-row-reverse { + flex-direction: row-reverse !important; + } + + .p-flex-sm-column { + flex-direction: column !important; + } + + .p-flex-sm-column-reverse { + flex-direction: column-reverse !important; + } +} +@media screen and (min-width: 768px) { + .p-flex-md-row { + flex-direction: row !important; + } + + .p-flex-md-row-reverse { + flex-direction: row-reverse !important; + } + + .p-flex-md-column { + flex-direction: column !important; + } + + .p-flex-md-column-reverse { + flex-direction: column-reverse !important; + } +} +@media screen and (min-width: 992px) { + .p-flex-lg-row { + flex-direction: row !important; + } + + .p-flex-lg-row-reverse { + flex-direction: row-reverse !important; + } + + .p-flex-lg-column { + flex-direction: column !important; + } + + .p-flex-lg-column-reverse { + flex-direction: column-reverse !important; + } +} +@media screen and (min-width: 1200px) { + .p-flex-xl-row { + flex-direction: row !important; + } + + .p-flex-xl-row-reverse { + flex-direction: row-reverse !important; + } + + .p-flex-xl-column { + flex-direction: column !important; + } + + .p-flex-xl-column-reverse { + flex-direction: column-reverse !important; + } +} +.p-jc-start { + justify-content: flex-start; +} + +.p-jc-end { + justify-content: flex-end; +} + +.p-jc-center { + justify-content: center; +} + +.p-jc-between { + justify-content: space-between; +} + +.p-jc-around { + justify-content: space-around; +} + +.p-jc-evenly { + justify-content: space-evenly; +} + +@media screen and (min-width: 576px) { + .p-jc-sm-start { + justify-content: flex-start; + } + + .p-jc-sm-end { + justify-content: flex-end; + } + + .p-jc-sm-center { + justify-content: center; + } + + .p-jc-sm-between { + justify-content: space-between; + } + + .p-jc-sm-around { + justify-content: space-around; + } + + .p-jc-sm-evenly { + justify-content: space-evenly; + } +} +@media screen and (min-width: 768px) { + .p-jc-md-start { + justify-content: flex-start; + } + + .p-jc-md-end { + justify-content: flex-end; + } + + .p-jc-md-center { + justify-content: center; + } + + .p-jc-md-between { + justify-content: space-between; + } + + .p-jc-md-around { + justify-content: space-around; + } + + .p-jc-md-evenly { + justify-content: space-evenly; + } +} +@media screen and (min-width: 992px) { + .p-jc-lg-start { + justify-content: flex-start; + } + + .p-jc-lg-end { + justify-content: flex-end; + } + + .p-jc-lg-center { + justify-content: center; + } + + .p-jc-lg-between { + justify-content: space-between; + } + + .p-jc-lg-around { + justify-content: space-around; + } + + .p-jc-lg-evenly { + justify-content: space-evenly; + } +} +@media screen and (min-width: 1200px) { + .p-jc-xl-start { + justify-content: flex-start; + } + + .p-jc-xl-end { + justify-content: flex-end; + } + + .p-jc-xl-center { + justify-content: center; + } + + .p-jc-xl-between { + justify-content: space-between; + } + + .p-jc-xl-around { + justify-content: space-around; + } + + .p-jc-xl-evenly { + justify-content: space-evenly; + } +} +.p-ai-start { + align-items: flex-start; +} + +.p-ai-end { + align-items: flex-end; +} + +.p-ai-center { + align-items: center; +} + +.p-ai-baseline { + align-items: baseline; +} + +.p-ai-stretch { + align-items: stretch; +} + +@media screen and (min-width: 576px) { + .p-ai-sm-start { + align-items: flex-start; + } + + .p-ai-sm-end { + align-items: flex-end; + } + + .p-ai-sm-center { + align-items: center; + } + + .p-ai-sm-baseline { + align-items: baseline; + } + + .p-ai-sm-stretch { + align-items: stretch; + } +} +@media screen and (min-width: 768px) { + .p-ai-md-start { + align-items: flex-start; + } + + .p-ai-md-end { + align-items: flex-end; + } + + .p-ai-md-center { + align-items: center; + } + + .p-ai-md-baseline { + align-items: baseline; + } + + .p-ai-md-stretch { + align-items: stretch; + } +} +@media screen and (min-width: 992px) { + .p-ai-lg-start { + align-items: flex-start; + } + + .p-ai-lg-end { + align-items: flex-end; + } + + .p-ai-lg-center { + align-items: center; + } + + .p-ai-lg-baseline { + align-items: baseline; + } + + .p-ai-lg-stretch { + align-items: stretch; + } +} +@media screen and (min-width: 1200px) { + .p-ai-xl-start { + align-items: flex-start; + } + + .p-ai-xl-end { + align-items: flex-end; + } + + .p-ai-xl-center { + align-items: center; + } + + .p-ai-xl-baseline { + align-items: baseline; + } + + .p-ai-xl-stretch { + align-items: stretch; + } +} +.p-as-start { + align-self: start; +} + +.p-as-end { + align-self: flex-end; +} + +.p-as-center { + align-self: center; +} + +.p-as-baseline { + align-self: baseline; +} + +.p-as-stretch { + align-self: stretch; +} + +@media screen and (min-width: 576px) { + .p-as-sm-start { + align-self: start; + } + + .p-as-sm-end { + align-self: flex-end; + } + + .p-as-sm-center { + align-self: center; + } + + .p-as-sm-baseline { + align-self: baseline; + } + + .p-as-sm-stretch { + align-self: stretch; + } +} +@media screen and (min-width: 768px) { + .p-as-md-start { + align-self: start; + } + + .p-as-md-end { + align-self: flex-end; + } + + .p-as-md-center { + align-self: center; + } + + .p-as-md-baseline { + align-self: baseline; + } + + .p-as-md-stretch { + align-self: stretch; + } +} +@media screen and (min-width: 992px) { + .p-as-lg-start { + align-self: start; + } + + .p-as-lg-end { + align-self: flex-end; + } + + .p-as-lg-center { + align-self: center; + } + + .p-as-lg-baseline { + align-self: baseline; + } + + .p-as-lg-stretch { + align-self: stretch; + } +} +@media screen and (min-width: 1200px) { + .p-as-xl-start { + align-self: start; + } + + .p-as-xl-end { + align-self: flex-end; + } + + .p-as-xl-center { + align-self: center; + } + + .p-as-xl-baseline { + align-self: baseline; + } + + .p-as-xl-stretch { + align-self: stretch; + } +} +.p-ac-start { + align-content: flex-start; +} + +.p-ac-end { + align-content: flex-end; +} + +.p-ac-center { + align-content: center; +} + +.p-ac-around { + align-content: space-around; +} + +.p-ac-stretch { + align-content: stretch; +} + +.p-ac-between { + align-content: space-between; +} + +@media screen and (min-width: 576px) { + .p-ac-sm-start { + align-content: flex-start; + } + + .p-ac-sm-end { + align-content: flex-end; + } + + .p-ac-sm-center { + align-content: center; + } + + .p-ac-sm-around { + align-content: space-around; + } + + .p-ac-sm-stretch { + align-content: stretch; + } + + .p-ac-sm-between { + align-content: space-between; + } +} +@media screen and (min-width: 768px) { + .p-ac-md-start { + align-content: flex-start; + } + + .p-ac-md-end { + align-content: flex-end; + } + + .p-ac-md-center { + align-content: center; + } + + .p-ac-md-around { + align-content: space-around; + } + + .p-ac-md-stretch { + align-content: stretch; + } + + .p-ac-md-between { + align-content: space-between; + } +} +@media screen and (min-width: 992px) { + .p-ac-lg-start { + align-content: flex-start; + } + + .p-ac-lg-end { + align-content: flex-end; + } + + .p-ac-lg-center { + align-content: center; + } + + .p-ac-lg-around { + align-content: space-around; + } + + .p-ac-lg-stretch { + align-content: stretch; + } + + .p-ac-lg-between { + align-content: space-between; + } +} +@media screen and (min-width: 1200px) { + .p-ac-xl-start { + align-content: flex-start; + } + + .p-ac-xl-end { + align-content: flex-end; + } + + .p-ac-xl-center { + align-content: center; + } + + .p-ac-xl-around { + align-content: space-around; + } + + .p-ac-xl-stretch { + align-content: stretch; + } + + .p-ac-xl-between { + align-content: space-between; + } +} +.p-order-0 { + order: 0; +} + +.p-order-1 { + order: 1; +} + +.p-order-2 { + order: 2; +} + +.p-order-3 { + order: 3; +} + +.p-order-4 { + order: 4; +} + +.p-order-5 { + order: 5; +} + +.p-order-6 { + order: 6; +} + +@media screen and (min-width: 576px) { + .p-order-sm-0 { + order: 0; + } + + .p-order-sm-1 { + order: 1; + } + + .p-order-sm-2 { + order: 2; + } + + .p-order-sm-3 { + order: 3; + } + + .p-order-sm-4 { + order: 4; + } + + .p-order-sm-5 { + order: 5; + } + + .p-order-sm-6 { + order: 6; + } +} +@media screen and (min-width: 768px) { + .p-order-md-0 { + order: 0; + } + + .p-order-md-1 { + order: 1; + } + + .p-order-md-2 { + order: 2; + } + + .p-order-md-3 { + order: 3; + } + + .p-order-md-4 { + order: 4; + } + + .p-order-md-5 { + order: 5; + } + + .p-order-md-6 { + order: 6; + } +} +@media screen and (min-width: 992px) { + .p-order-lg-0 { + order: 0; + } + + .p-order-lg-1 { + order: 1; + } + + .p-order-lg-2 { + order: 2; + } + + .p-order-lg-3 { + order: 3; + } + + .p-order-lg-4 { + order: 4; + } + + .p-order-lg-5 { + order: 5; + } + + .p-order-lg-6 { + order: 6; + } +} +@media screen and (min-width: 1200px) { + .p-order-xl-0 { + order: 0; + } + + .p-order-xl-1 { + order: 1; + } + + .p-order-xl-2 { + order: 2; + } + + .p-order-xl-3 { + order: 3; + } + + .p-order-xl-4 { + order: 4; + } + + .p-order-xl-5 { + order: 5; + } + + .p-order-xl-6 { + order: 6; + } +} +.p-flex-nowrap { + flex-wrap: nowrap; +} + +.p-flex-wrap { + flex-wrap: wrap; +} + +.p-flex-wrap-reverse { + flex-wrap: wrap-reverse; +} + +@media screen and (min-width: 576px) { + .p-flex-sm-nowrap { + flex-wrap: nowrap; + } + + .p-flex-sm-wrap { + flex-wrap: wrap; + } + + .p-flex-sm-wrap-reverse { + flex-wrap: wrap-reverse; + } +} +@media screen and (min-width: 768px) { + .p-flex-md-nowrap { + flex-wrap: nowrap; + } + + .p-flex-md-wrap { + flex-wrap: wrap; + } + + .p-flex-md-wrap-reverse { + flex-wrap: wrap-reverse; + } +} +@media screen and (min-width: 992px) { + .p-flex-lg-nowrap { + flex-wrap: nowrap; + } + + .p-flex-lg-wrap { + flex-wrap: wrap; + } + + .p-flex-lg-wrap-reverse { + flex-wrap: wrap-reverse; + } +} +@media screen and (min-width: 1200px) { + .p-flex-xl-nowrap { + flex-wrap: nowrap; + } + + .p-flex-xl-wrap { + flex-wrap: wrap; + } + + .p-flex-xl-wrap-reverse { + flex-wrap: wrap-reverse; + } +} +.p-pt-0 { + padding-top: 0 !important; +} + +.p-pt-1 { + padding-top: 0.25rem !important; +} + +.p-pt-2 { + padding-top: 0.5rem !important; +} + +.p-pt-3 { + padding-top: 1rem !important; +} + +.p-pt-4 { + padding-top: 1.5rem !important; +} + +.p-pt-5 { + padding-top: 2rem !important; +} + +.p-pt-6 { + padding-top: 3rem !important; +} + +.p-pr-0 { + padding-right: 0 !important; +} + +.p-pr-1 { + padding-right: 0.25rem !important; +} + +.p-pr-2 { + padding-right: 0.5rem !important; +} + +.p-pr-3 { + padding-right: 1rem !important; +} + +.p-pr-4 { + padding-right: 1.5rem !important; +} + +.p-pr-5 { + padding-right: 2rem !important; +} + +.p-pr-6 { + padding-right: 3rem !important; +} + +.p-pl-0 { + padding-left: 0 !important; +} + +.p-pl-1 { + padding-left: 0.25rem !important; +} + +.p-pl-2 { + padding-left: 0.5rem !important; +} + +.p-pl-3 { + padding-left: 1rem !important; +} + +.p-pl-4 { + padding-left: 1.5rem !important; +} + +.p-pl-5 { + padding-left: 2rem !important; +} + +.p-pl-6 { + padding-left: 3rem !important; +} + +.p-pb-0 { + padding-bottom: 0 !important; +} + +.p-pb-1 { + padding-bottom: 0.25rem !important; +} + +.p-pb-2 { + padding-bottom: 0.5rem !important; +} + +.p-pb-3 { + padding-bottom: 1rem !important; +} + +.p-pb-4 { + padding-bottom: 1.5rem !important; +} + +.p-pb-5 { + padding-bottom: 2rem !important; +} + +.p-pb-6 { + padding-bottom: 3rem !important; +} + +.p-px-0 { + padding-left: 0 !important; + padding-right: 0 !important; +} + +.p-px-1 { + padding-left: 0.25rem !important; + padding-right: 0.25rem !important; +} + +.p-px-2 { + padding-left: 0.5rem !important; + padding-right: 0.5rem !important; +} + +.p-px-3 { + padding-left: 1rem !important; + padding-right: 1rem !important; +} + +.p-px-4 { + padding-left: 1.5rem !important; + padding-right: 1.5rem !important; +} + +.p-px-5 { + padding-left: 2rem !important; + padding-right: 2rem !important; +} + +.p-px-6 { + padding-left: 3rem !important; + padding-right: 3rem !important; +} + +.p-py-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; +} + +.p-py-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; +} + +.p-py-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; +} + +.p-py-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; +} + +.p-py-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; +} + +.p-py-5 { + padding-top: 2rem !important; + padding-bottom: 2rem !important; +} + +.p-py-6 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; +} + +.p-p-0 { + padding: 0 !important; +} + +.p-p-1 { + padding: 0.25rem !important; +} + +.p-p-2 { + padding: 0.5rem !important; +} + +.p-p-3 { + padding: 1rem !important; +} + +.p-p-4 { + padding: 1.5rem !important; +} + +.p-p-5 { + padding: 2rem !important; +} + +.p-p-6 { + padding: 3rem !important; +} + +@media screen and (min-width: 576px) { + .p-pt-sm-0 { + padding-top: 0 !important; + } + + .p-pt-sm-1 { + padding-top: 0.25rem !important; + } + + .p-pt-sm-2 { + padding-top: 0.5rem !important; + } + + .p-pt-sm-3 { + padding-top: 1rem !important; + } + + .p-pt-sm-4 { + padding-top: 1.5rem !important; + } + + .p-pt-sm-5 { + padding-top: 2rem !important; + } + + .p-pt-sm-6 { + padding-top: 3rem !important; + } + + .p-pr-sm-0 { + padding-right: 0 !important; + } + + .p-pr-sm-1 { + padding-right: 0.25rem !important; + } + + .p-pr-sm-2 { + padding-right: 0.5rem !important; + } + + .p-pr-sm-3 { + padding-right: 1rem !important; + } + + .p-pr-sm-4 { + padding-right: 1.5rem !important; + } + + .p-pr-sm-5 { + padding-right: 2rem !important; + } + + .p-pr-sm-6 { + padding-right: 3rem !important; + } + + .p-pl-sm-0 { + padding-left: 0 !important; + } + + .p-pl-sm-1 { + padding-left: 0.25rem !important; + } + + .p-pl-sm-2 { + padding-left: 0.5rem !important; + } + + .p-pl-sm-3 { + padding-left: 1rem !important; + } + + .p-pl-sm-4 { + padding-left: 1.5rem !important; + } + + .p-pl-sm-5 { + padding-left: 2rem !important; + } + + .p-pl-sm-6 { + padding-left: 3rem !important; + } + + .p-pb-sm-0 { + padding-bottom: 0 !important; + } + + .p-pb-sm-1 { + padding-bottom: 0.25rem !important; + } + + .p-pb-sm-2 { + padding-bottom: 0.5rem !important; + } + + .p-pb-sm-3 { + padding-bottom: 1rem !important; + } + + .p-pb-sm-4 { + padding-bottom: 1.5rem !important; + } + + .p-pb-sm-5 { + padding-bottom: 2rem !important; + } + + .p-pb-sm-6 { + padding-bottom: 3rem !important; + } + + .p-px-sm-0 { + padding-left: 0 !important; + padding-right: 0 !important; + } + + .p-px-sm-1 { + padding-left: 0.25rem !important; + padding-right: 0.25rem !important; + } + + .p-px-sm-2 { + padding-left: 0.5rem !important; + padding-right: 0.5rem !important; + } + + .p-px-sm-3 { + padding-left: 1rem !important; + padding-right: 1rem !important; + } + + .p-px-sm-4 { + padding-left: 1.5rem !important; + padding-right: 1.5rem !important; + } + + .p-px-sm-5 { + padding-left: 2rem !important; + padding-right: 2rem !important; + } + + .p-px-sm-6 { + padding-left: 3rem !important; + padding-right: 3rem !important; + } + + .p-py-sm-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + + .p-py-sm-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + + .p-py-sm-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + + .p-py-sm-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + + .p-py-sm-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + + .p-py-sm-5 { + padding-top: 2rem !important; + padding-bottom: 2rem !important; + } + + .p-py-sm-6 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + + .p-p-sm-0 { + padding: 0 !important; + } + + .p-p-sm-1 { + padding: 0.25rem !important; + } + + .p-p-sm-2 { + padding: 0.5rem !important; + } + + .p-p-sm-3 { + padding: 1rem !important; + } + + .p-p-sm-4 { + padding: 1.5rem !important; + } + + .p-p-sm-5 { + padding: 2rem !important; + } + + .p-p-sm-6 { + padding: 3rem !important; + } +} +@media screen and (min-width: 768px) { + .p-pt-md-0 { + padding-top: 0 !important; + } + + .p-pt-md-1 { + padding-top: 0.25rem !important; + } + + .p-pt-md-2 { + padding-top: 0.5rem !important; + } + + .p-pt-md-3 { + padding-top: 1rem !important; + } + + .p-pt-md-4 { + padding-top: 1.5rem !important; + } + + .p-pt-md-5 { + padding-top: 2rem !important; + } + + .p-pt-md-6 { + padding-top: 3rem !important; + } + + .p-pr-md-0 { + padding-right: 0 !important; + } + + .p-pr-md-1 { + padding-right: 0.25rem !important; + } + + .p-pr-md-2 { + padding-right: 0.5rem !important; + } + + .p-pr-md-3 { + padding-right: 1rem !important; + } + + .p-pr-md-4 { + padding-right: 1.5rem !important; + } + + .p-pr-md-5 { + padding-right: 2rem !important; + } + + .p-pr-md-6 { + padding-right: 3rem !important; + } + + .p-pl-md-0 { + padding-left: 0 !important; + } + + .p-pl-md-1 { + padding-left: 0.25rem !important; + } + + .p-pl-md-2 { + padding-left: 0.5rem !important; + } + + .p-pl-md-3 { + padding-left: 1rem !important; + } + + .p-pl-md-4 { + padding-left: 1.5rem !important; + } + + .p-pl-md-5 { + padding-left: 2rem !important; + } + + .p-pl-md-6 { + padding-left: 3rem !important; + } + + .p-pb-md-0 { + padding-bottom: 0 !important; + } + + .p-pb-md-1 { + padding-bottom: 0.25rem !important; + } + + .p-pb-md-2 { + padding-bottom: 0.5rem !important; + } + + .p-pb-md-3 { + padding-bottom: 1rem !important; + } + + .p-pb-md-4 { + padding-bottom: 1.5rem !important; + } + + .p-pb-md-5 { + padding-bottom: 2rem !important; + } + + .p-pb-md-6 { + padding-bottom: 3rem !important; + } + + .p-px-md-0 { + padding-left: 0 !important; + padding-right: 0 !important; + } + + .p-px-md-1 { + padding-left: 0.25rem !important; + padding-right: 0.25rem !important; + } + + .p-px-md-2 { + padding-left: 0.5rem !important; + padding-right: 0.5rem !important; + } + + .p-px-md-3 { + padding-left: 1rem !important; + padding-right: 1rem !important; + } + + .p-px-md-4 { + padding-left: 1.5rem !important; + padding-right: 1.5rem !important; + } + + .p-px-md-5 { + padding-left: 2rem !important; + padding-right: 2rem !important; + } + + .p-px-md-6 { + padding-left: 3rem !important; + padding-right: 3rem !important; + } + + .p-py-md-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + + .p-py-md-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + + .p-py-md-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + + .p-py-md-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + + .p-py-md-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + + .p-py-md-5 { + padding-top: 2rem !important; + padding-bottom: 2rem !important; + } + + .p-py-md-6 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + + .p-p-md-0 { + padding: 0 !important; + } + + .p-p-md-1 { + padding: 0.25rem !important; + } + + .p-p-md-2 { + padding: 0.5rem !important; + } + + .p-p-md-3 { + padding: 1rem !important; + } + + .p-p-md-4 { + padding: 1.5rem !important; + } + + .p-p-md-5 { + padding: 2rem !important; + } + + .p-p-md-6 { + padding: 3rem !important; + } +} +@media screen and (min-width: 992px) { + .p-pt-lg-0 { + padding-top: 0 !important; + } + + .p-pt-lg-1 { + padding-top: 0.25rem !important; + } + + .p-pt-lg-2 { + padding-top: 0.5rem !important; + } + + .p-pt-lg-3 { + padding-top: 1rem !important; + } + + .p-pt-lg-4 { + padding-top: 1.5rem !important; + } + + .p-pt-lg-5 { + padding-top: 2rem !important; + } + + .p-pt-lg-6 { + padding-top: 3rem !important; + } + + .p-pt-lg-auto { + padding-top: 3rem !important; + } + + .p-pr-lg-0 { + padding-right: 0 !important; + } + + .p-pr-lg-1 { + padding-right: 0.25rem !important; + } + + .p-pr-lg-2 { + padding-right: 0.5rem !important; + } + + .p-pr-lg-3 { + padding-right: 1rem !important; + } + + .p-pr-lg-4 { + padding-right: 1.5rem !important; + } + + .p-pr-lg-5 { + padding-right: 2rem !important; + } + + .p-pr-lg-6 { + padding-right: 3rem !important; + } + + .p-pl-lg-0 { + padding-left: 0 !important; + } + + .p-pl-lg-1 { + padding-left: 0.25rem !important; + } + + .p-pl-lg-2 { + padding-left: 0.5rem !important; + } + + .p-pl-lg-3 { + padding-left: 1rem !important; + } + + .p-pl-lg-4 { + padding-left: 1.5rem !important; + } + + .p-pl-lg-5 { + padding-left: 2rem !important; + } + + .p-pl-lg-6 { + padding-left: 3rem !important; + } + + .p-pb-lg-0 { + padding-bottom: 0 !important; + } + + .p-pb-lg-1 { + padding-bottom: 0.25rem !important; + } + + .p-pb-lg-2 { + padding-bottom: 0.5rem !important; + } + + .p-pb-lg-3 { + padding-bottom: 1rem !important; + } + + .p-pb-lg-4 { + padding-bottom: 1.5rem !important; + } + + .p-pb-lg-5 { + padding-bottom: 2rem !important; + } + + .p-pb-lg-6 { + padding-bottom: 3rem !important; + } + + .p-px-lg-0 { + padding-left: 0 !important; + padding-right: 0 !important; + } + + .p-px-lg-1 { + padding-left: 0.25rem !important; + padding-right: 0.25rem !important; + } + + .p-px-lg-2 { + padding-left: 0.5rem !important; + padding-right: 0.5rem !important; + } + + .p-px-lg-3 { + padding-left: 1rem !important; + padding-right: 1rem !important; + } + + .p-px-lg-4 { + padding-left: 1.5rem !important; + padding-right: 1.5rem !important; + } + + .p-px-lg-5 { + padding-left: 2rem !important; + padding-right: 2rem !important; + } + + .p-px-lg-6 { + padding-left: 3rem !important; + padding-right: 3rem !important; + } + + .p-py-lg-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + + .p-py-lg-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + + .p-py-lg-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + + .p-py-lg-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + + .p-py-lg-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + + .p-py-lg-5 { + padding-top: 2rem !important; + padding-bottom: 2rem !important; + } + + .p-py-lg-6 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + + .p-p-lg-0 { + padding: 0 !important; + } + + .p-p-lg-1 { + padding: 0.25rem !important; + } + + .p-p-lg-2 { + padding: 0.5rem !important; + } + + .p-p-lg-3 { + padding: 1rem !important; + } + + .p-p-lg-4 { + padding: 1.5rem !important; + } + + .p-p-lg-5 { + padding: 2rem !important; + } + + .p-p-lg-6 { + padding: 3rem !important; + } +} +@media screen and (min-width: 1200px) { + .p-pt-xl-0 { + padding-top: 0 !important; + } + + .p-pt-xl-1 { + padding-top: 0.25rem !important; + } + + .p-pt-xl-2 { + padding-top: 0.5rem !important; + } + + .p-pt-xl-3 { + padding-top: 1rem !important; + } + + .p-pt-xl-4 { + padding-top: 1.5rem !important; + } + + .p-pt-xl-5 { + padding-top: 2rem !important; + } + + .p-pt-xl-6 { + padding-top: 3rem !important; + } + + .p-pr-xl-0 { + padding-right: 0 !important; + } + + .p-pr-xl-1 { + padding-right: 0.25rem !important; + } + + .p-pr-xl-2 { + padding-right: 0.5rem !important; + } + + .p-pr-xl-3 { + padding-right: 1rem !important; + } + + .p-pr-xl-4 { + padding-right: 1.5rem !important; + } + + .p-pr-xl-5 { + padding-right: 2rem !important; + } + + .p-pr-xl-6 { + padding-right: 3rem !important; + } + + .p-pl-xl-0 { + padding-left: 0 !important; + } + + .p-pl-xl-1 { + padding-left: 0.25rem !important; + } + + .p-pl-xl-2 { + padding-left: 0.5rem !important; + } + + .p-pl-xl-3 { + padding-left: 1rem !important; + } + + .p-pl-xl-4 { + padding-left: 1.5rem !important; + } + + .p-pl-xl-5 { + padding-left: 2rem !important; + } + + .p-pl-xl-6 { + padding-left: 3rem !important; + } + + .p-pb-xl-0 { + padding-bottom: 0 !important; + } + + .p-pb-xl-1 { + padding-bottom: 0.25rem !important; + } + + .p-pb-xl-2 { + padding-bottom: 0.5rem !important; + } + + .p-pb-xl-3 { + padding-bottom: 1rem !important; + } + + .p-pb-xl-4 { + padding-bottom: 1.5rem !important; + } + + .p-pb-xl-5 { + padding-bottom: 2rem !important; + } + + .p-pb-xl-6 { + padding-bottom: 3rem !important; + } + + .p-px-xl-0 { + padding-left: 0 !important; + padding-right: 0 !important; + } + + .p-px-xl-1 { + padding-left: 0.25rem !important; + padding-right: 0.25rem !important; + } + + .p-px-xl-2 { + padding-left: 0.5rem !important; + padding-right: 0.5rem !important; + } + + .p-px-xl-3 { + padding-left: 1rem !important; + padding-right: 1rem !important; + } + + .p-px-xl-4 { + padding-left: 1.5rem !important; + padding-right: 1.5rem !important; + } + + .p-px-xl-5 { + padding-left: 2rem !important; + padding-right: 2rem !important; + } + + .p-px-xl-6 { + padding-left: 3rem !important; + padding-right: 3rem !important; + } + + .p-py-xl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + + .p-py-xl-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + + .p-py-xl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + + .p-py-xl-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + + .p-py-xl-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + + .p-py-xl-5 { + padding-top: 2rem !important; + padding-bottom: 2rem !important; + } + + .p-py-xl-6 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + + .p-p-xl-0 { + padding: 0 !important; + } + + .p-p-xl-1 { + padding: 0.25rem !important; + } + + .p-p-xl-2 { + padding: 0.5rem !important; + } + + .p-p-xl-3 { + padding: 1rem !important; + } + + .p-p-xl-4 { + padding: 1.5rem !important; + } + + .p-p-xl-5 { + padding: 2rem !important; + } + + .p-p-xl-6 { + padding: 3rem !important; + } +} +.p-mt-0 { + margin-top: 0 !important; +} + +.p-mt-1 { + margin-top: 0.25rem !important; +} + +.p-mt-2 { + margin-top: 0.5rem !important; +} + +.p-mt-3 { + margin-top: 1rem !important; +} + +.p-mt-4 { + margin-top: 1.5rem !important; +} + +.p-mt-5 { + margin-top: 2rem !important; +} + +.p-mt-6 { + margin-top: 3rem !important; +} + +.p-mt-auto { + margin-top: auto !important; +} + +.p-mr-0 { + margin-right: 0 !important; +} + +.p-mr-1 { + margin-right: 0.25rem !important; +} + +.p-mr-2 { + margin-right: 0.5rem !important; +} + +.p-mr-3 { + margin-right: 1rem !important; +} + +.p-mr-4 { + margin-right: 1.5rem !important; +} + +.p-mr-5 { + margin-right: 2rem !important; +} + +.p-mr-6 { + margin-right: 3rem !important; +} + +.p-mr-auto { + margin-right: auto !important; +} + +.p-ml-0 { + margin-left: 0 !important; +} + +.p-ml-1 { + margin-left: 0.25rem !important; +} + +.p-ml-2 { + margin-left: 0.5rem !important; +} + +.p-ml-3 { + margin-left: 1rem !important; +} + +.p-ml-4 { + margin-left: 1.5rem !important; +} + +.p-ml-5 { + margin-left: 2rem !important; +} + +.p-ml-6 { + margin-left: 3rem !important; +} + +.p-ml-auto { + margin-left: auto !important; +} + +.p-mb-0 { + margin-bottom: 0 !important; +} + +.p-mb-1 { + margin-bottom: 0.25rem !important; +} + +.p-mb-2 { + margin-bottom: 0.5rem !important; +} + +.p-mb-3 { + margin-bottom: 1rem !important; +} + +.p-mb-4 { + margin-bottom: 1.5rem !important; +} + +.p-mb-5 { + margin-bottom: 2rem !important; +} + +.p-mb-6 { + margin-bottom: 3rem !important; +} + +.p-mb-auto { + margin-bottom: auto !important; +} + +.p-mx-0 { + margin-left: 0 !important; + margin-right: 0 !important; +} + +.p-mx-1 { + margin-left: 0.25rem !important; + margin-right: 0.25rem !important; +} + +.p-mx-2 { + margin-left: 0.5rem !important; + margin-right: 0.5rem !important; +} + +.p-mx-3 { + margin-left: 1rem !important; + margin-right: 1rem !important; +} + +.p-mx-4 { + margin-left: 1.5rem !important; + margin-right: 1.5rem !important; +} + +.p-mx-5 { + margin-left: 2rem !important; + margin-right: 2rem !important; +} + +.p-mx-6 { + margin-left: 3rem !important; + margin-right: 3rem !important; +} + +.p-mx-auto { + margin-left: auto !important; + margin-right: auto !important; +} + +.p-my-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; +} + +.p-my-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; +} + +.p-my-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; +} + +.p-my-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; +} + +.p-my-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; +} + +.p-my-5 { + margin-top: 2rem !important; + margin-bottom: 2rem !important; +} + +.p-my-6 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; +} + +.p-my-auto { + margin-top: auto !important; + margin-bottom: auto !important; +} + +.p-m-0 { + margin: 0 !important; +} + +.p-m-1 { + margin: 0.25rem !important; +} + +.p-m-2 { + margin: 0.5rem !important; +} + +.p-m-3 { + margin: 1rem !important; +} + +.p-m-4 { + margin: 1.5rem !important; +} + +.p-m-5 { + margin: 2rem !important; +} + +.p-m-6 { + margin: 3rem !important; +} + +.p-m-auto { + margin: auto !important; +} + +@media screen and (min-width: 576px) { + .p-mt-sm-0 { + margin-top: 0 !important; + } + + .p-mt-sm-1 { + margin-top: 0.25rem !important; + } + + .p-mt-sm-2 { + margin-top: 0.5rem !important; + } + + .p-mt-sm-3 { + margin-top: 1rem !important; + } + + .p-mt-sm-4 { + margin-top: 1.5rem !important; + } + + .p-mt-sm-5 { + margin-top: 2rem !important; + } + + .p-mt-sm-6 { + margin-top: 3rem !important; + } + + .p-mt-sm-auto { + margin-top: 3rem !important; + } + + .p-mr-sm-0 { + margin-right: 0 !important; + } + + .p-mr-sm-1 { + margin-right: 0.25rem !important; + } + + .p-mr-sm-2 { + margin-right: 0.5rem !important; + } + + .p-mr-sm-3 { + margin-right: 1rem !important; + } + + .p-mr-sm-4 { + margin-right: 1.5rem !important; + } + + .p-mr-sm-5 { + margin-right: 2rem !important; + } + + .p-mr-sm-6 { + margin-right: 3rem !important; + } + + .p-mr-sm-auto { + margin-right: auto !important; + } + + .p-ml-sm-0 { + margin-left: 0 !important; + } + + .p-ml-sm-1 { + margin-left: 0.25rem !important; + } + + .p-ml-sm-2 { + margin-left: 0.5rem !important; + } + + .p-ml-sm-3 { + margin-left: 1rem !important; + } + + .p-ml-sm-4 { + margin-left: 1.5rem !important; + } + + .p-ml-sm-5 { + margin-left: 2rem !important; + } + + .p-ml-sm-6 { + margin-left: 3rem !important; + } + + .p-ml-sm-auto { + margin-left: auto !important; + } + + .p-mb-sm-0 { + margin-bottom: 0 !important; + } + + .p-mb-sm-1 { + margin-bottom: 0.25rem !important; + } + + .p-mb-sm-2 { + margin-bottom: 0.5rem !important; + } + + .p-mb-sm-3 { + margin-bottom: 1rem !important; + } + + .p-mb-sm-4 { + margin-bottom: 1.5rem !important; + } + + .p-mb-sm-5 { + margin-bottom: 2rem !important; + } + + .p-mb-sm-6 { + margin-bottom: 3rem !important; + } + + .p-mb-sm-auto { + margin-bottom: auto !important; + } + + .p-mx-sm-0 { + margin-left: 0 !important; + margin-right: 0 !important; + } + + .p-mx-sm-1 { + margin-left: 0.25rem !important; + margin-right: 0.25rem !important; + } + + .p-mx-sm-2 { + margin-left: 0.5rem !important; + margin-right: 0.5rem !important; + } + + .p-mx-sm-3 { + margin-left: 1rem !important; + margin-right: 1rem !important; + } + + .p-mx-sm-4 { + margin-left: 1.5rem !important; + margin-right: 1.5rem !important; + } + + .p-mx-sm-5 { + margin-left: 2rem !important; + margin-right: 2rem !important; + } + + .p-mx-sm-6 { + margin-left: 3rem !important; + margin-right: 3rem !important; + } + + .p-mx-sm-auto { + margin-left: auto !important; + margin-right: auto !important; + } + + .p-my-sm-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + + .p-my-sm-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + + .p-my-sm-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + + .p-my-sm-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + + .p-my-sm-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + + .p-my-sm-5 { + margin-top: 2rem !important; + margin-bottom: 2rem !important; + } + + .p-my-sm-6 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + + .p-my-sm-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + + .p-m-sm-0 { + margin: 0 !important; + } + + .p-m-sm-1 { + margin: 0.25rem !important; + } + + .p-m-sm-2 { + margin: 0.5rem !important; + } + + .p-m-sm-3 { + margin: 1rem !important; + } + + .p-m-sm-4 { + margin: 1.5rem !important; + } + + .p-m-sm-5 { + margin: 2rem !important; + } + + .p-m-sm-6 { + margin: 3rem !important; + } + + .p-m-sm-auto { + margin: auto !important; + } +} +@media screen and (min-width: 768px) { + .p-mt-md-0 { + margin-top: 0 !important; + } + + .p-mt-md-1 { + margin-top: 0.25rem !important; + } + + .p-mt-md-2 { + margin-top: 0.5rem !important; + } + + .p-mt-md-3 { + margin-top: 1rem !important; + } + + .p-mt-md-4 { + margin-top: 1.5rem !important; + } + + .p-mt-md-5 { + margin-top: 2rem !important; + } + + .p-mt-md-6 { + margin-top: 3rem !important; + } + + .p-mt-md-auto { + margin-top: 3rem !important; + } + + .p-mr-md-0 { + margin-right: 0 !important; + } + + .p-mr-md-1 { + margin-right: 0.25rem !important; + } + + .p-mr-md-2 { + margin-right: 0.5rem !important; + } + + .p-mr-md-3 { + margin-right: 1rem !important; + } + + .p-mr-md-4 { + margin-right: 1.5rem !important; + } + + .p-mr-md-5 { + margin-right: 2rem !important; + } + + .p-mr-md-6 { + margin-right: 3rem !important; + } + + .p-mr-md-auto { + margin-right: auto !important; + } + + .p-ml-md-0 { + margin-left: 0 !important; + } + + .p-ml-md-1 { + margin-left: 0.25rem !important; + } + + .p-ml-md-2 { + margin-left: 0.5rem !important; + } + + .p-ml-md-3 { + margin-left: 1rem !important; + } + + .p-ml-md-4 { + margin-left: 1.5rem !important; + } + + .p-ml-md-5 { + margin-left: 2rem !important; + } + + .p-ml-md-6 { + margin-left: 3rem !important; + } + + .p-ml-md-auto { + margin-left: auto !important; + } + + .p-mb-md-0 { + margin-bottom: 0 !important; + } + + .p-mb-md-1 { + margin-bottom: 0.25rem !important; + } + + .p-mb-md-2 { + margin-bottom: 0.5rem !important; + } + + .p-mb-md-3 { + margin-bottom: 1rem !important; + } + + .p-mb-md-4 { + margin-bottom: 1.5rem !important; + } + + .p-mb-md-5 { + margin-bottom: 2rem !important; + } + + .p-mb-md-6 { + margin-bottom: 3rem !important; + } + + .p-mb-md-auto { + margin-bottom: auto !important; + } + + .p-mx-md-0 { + margin-left: 0 !important; + margin-right: 0 !important; + } + + .p-mx-md-1 { + margin-left: 0.25rem !important; + margin-right: 0.25rem !important; + } + + .p-mx-md-2 { + margin-left: 0.5rem !important; + margin-right: 0.5rem !important; + } + + .p-mx-md-3 { + margin-left: 1rem !important; + margin-right: 1rem !important; + } + + .p-mx-md-4 { + margin-left: 1.5rem !important; + margin-right: 1.5rem !important; + } + + .p-mx-md-5 { + margin-left: 2rem !important; + margin-right: 2rem !important; + } + + .p-mx-md-6 { + margin-left: 3rem !important; + margin-right: 3rem !important; + } + + .p-mx-md-auto { + margin-left: auto !important; + margin-right: auto !important; + } + + .p-my-md-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + + .p-my-md-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + + .p-my-md-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + + .p-my-md-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + + .p-my-md-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + + .p-my-md-5 { + margin-top: 2rem !important; + margin-bottom: 2rem !important; + } + + .p-my-md-6 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + + .p-my-md-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + + .p-m-md-0 { + margin: 0 !important; + } + + .p-m-md-1 { + margin: 0.25rem !important; + } + + .p-m-md-2 { + margin: 0.5rem !important; + } + + .p-m-md-3 { + margin: 1rem !important; + } + + .p-m-md-4 { + margin: 1.5rem !important; + } + + .p-m-md-5 { + margin: 2rem !important; + } + + .p-m-md-6 { + margin: 3rem !important; + } + + .p-m-md-auto { + margin: auto !important; + } +} +@media screen and (min-width: 992px) { + .p-mt-lg-0 { + margin-top: 0 !important; + } + + .p-mt-lg-1 { + margin-top: 0.25rem !important; + } + + .p-mt-lg-2 { + margin-top: 0.5rem !important; + } + + .p-mt-lg-3 { + margin-top: 1rem !important; + } + + .p-mt-lg-4 { + margin-top: 1.5rem !important; + } + + .p-mt-lg-5 { + margin-top: 2rem !important; + } + + .p-mt-lg-6 { + margin-top: 3rem !important; + } + + .p-mt-lg-auto { + margin-top: 3rem !important; + } + + .p-mr-lg-0 { + margin-right: 0 !important; + } + + .p-mr-lg-1 { + margin-right: 0.25rem !important; + } + + .p-mr-lg-2 { + margin-right: 0.5rem !important; + } + + .p-mr-lg-3 { + margin-right: 1rem !important; + } + + .p-mr-lg-4 { + margin-right: 1.5rem !important; + } + + .p-mr-lg-5 { + margin-right: 2rem !important; + } + + .p-mr-lg-6 { + margin-right: 3rem !important; + } + + .p-mr-lg-auto { + margin-right: auto !important; + } + + .p-ml-lg-0 { + margin-left: 0 !important; + } + + .p-ml-lg-1 { + margin-left: 0.25rem !important; + } + + .p-ml-lg-2 { + margin-left: 0.5rem !important; + } + + .p-ml-lg-3 { + margin-left: 1rem !important; + } + + .p-ml-lg-4 { + margin-left: 1.5rem !important; + } + + .p-ml-lg-5 { + margin-left: 2rem !important; + } + + .p-ml-lg-6 { + margin-left: 3rem !important; + } + + .p-ml-lg-auto { + margin-left: auto !important; + } + + .p-mb-lg-0 { + margin-bottom: 0 !important; + } + + .p-mb-lg-1 { + margin-bottom: 0.25rem !important; + } + + .p-mb-lg-2 { + margin-bottom: 0.5rem !important; + } + + .p-mb-lg-3 { + margin-bottom: 1rem !important; + } + + .p-mb-lg-4 { + margin-bottom: 1.5rem !important; + } + + .p-mb-lg-5 { + margin-bottom: 2rem !important; + } + + .p-mb-lg-6 { + margin-bottom: 3rem !important; + } + + .p-mb-lg-auto { + margin-bottom: auto !important; + } + + .p-mx-lg-0 { + margin-left: 0 !important; + margin-right: 0 !important; + } + + .p-mx-lg-1 { + margin-left: 0.25rem !important; + margin-right: 0.25rem !important; + } + + .p-mx-lg-2 { + margin-left: 0.5rem !important; + margin-right: 0.5rem !important; + } + + .p-mx-lg-3 { + margin-left: 1rem !important; + margin-right: 1rem !important; + } + + .p-mx-lg-4 { + margin-left: 1.5rem !important; + margin-right: 1.5rem !important; + } + + .p-mx-lg-5 { + margin-left: 2rem !important; + margin-right: 2rem !important; + } + + .p-mx-lg-6 { + margin-left: 3rem !important; + margin-right: 3rem !important; + } + + .p-mx-lg-auto { + margin-left: auto !important; + margin-right: auto !important; + } + + .p-my-lg-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + + .p-my-lg-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + + .p-my-lg-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + + .p-my-lg-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + + .p-my-lg-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + + .p-my-lg-5 { + margin-top: 2rem !important; + margin-bottom: 2rem !important; + } + + .p-my-lg-6 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + + .p-my-lg-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + + .p-m-lg-0 { + margin: 0 !important; + } + + .p-m-lg-1 { + margin: 0.25rem !important; + } + + .p-m-lg-2 { + margin: 0.5rem !important; + } + + .p-m-lg-3 { + margin: 1rem !important; + } + + .p-m-lg-4 { + margin: 1.5rem !important; + } + + .p-m-lg-5 { + margin: 2rem !important; + } + + .p-m-lg-6 { + margin: 3rem !important; + } + + .p-m-lg-auto { + margin: auto !important; + } +} +@media screen and (min-width: 1200px) { + .p-mt-xl-0 { + margin-top: 0 !important; + } + + .p-mt-xl-1 { + margin-top: 0.25rem !important; + } + + .p-mt-xl-2 { + margin-top: 0.5rem !important; + } + + .p-mt-xl-3 { + margin-top: 1rem !important; + } + + .p-mt-xl-4 { + margin-top: 1.5rem !important; + } + + .p-mt-xl-5 { + margin-top: 2rem !important; + } + + .p-mt-xl-6 { + margin-top: 3rem !important; + } + + .p-mt-xl-auto { + margin-top: 3rem !important; + } + + .p-mr-xl-0 { + margin-right: 0 !important; + } + + .p-mr-xl-1 { + margin-right: 0.25rem !important; + } + + .p-mr-xl-2 { + margin-right: 0.5rem !important; + } + + .p-mr-xl-3 { + margin-right: 1rem !important; + } + + .p-mr-xl-4 { + margin-right: 1.5rem !important; + } + + .p-mr-xl-5 { + margin-right: 2rem !important; + } + + .p-mr-xl-6 { + margin-right: 3rem !important; + } + + .p-mr-xl-auto { + margin-right: auto !important; + } + + .p-ml-xl-0 { + margin-left: 0 !important; + } + + .p-ml-xl-1 { + margin-left: 0.25rem !important; + } + + .p-ml-xl-2 { + margin-left: 0.5rem !important; + } + + .p-ml-xl-3 { + margin-left: 1rem !important; + } + + .p-ml-xl-4 { + margin-left: 1.5rem !important; + } + + .p-ml-xl-5 { + margin-left: 2rem !important; + } + + .p-ml-xl-6 { + margin-left: 3rem !important; + } + + .p-ml-xl-auto { + margin-left: auto !important; + } + + .p-mb-xl-0 { + margin-bottom: 0 !important; + } + + .p-mb-xl-1 { + margin-bottom: 0.25rem !important; + } + + .p-mb-xl-2 { + margin-bottom: 0.5rem !important; + } + + .p-mb-xl-3 { + margin-bottom: 1rem !important; + } + + .p-mb-xl-4 { + margin-bottom: 1.5rem !important; + } + + .p-mb-xl-5 { + margin-bottom: 2rem !important; + } + + .p-mb-xl-6 { + margin-bottom: 3rem !important; + } + + .p-mb-xl-auto { + margin-bottom: auto !important; + } + + .p-mx-xl-0 { + margin-left: 0 !important; + margin-right: 0 !important; + } + + .p-mx-xl-1 { + margin-left: 0.25rem !important; + margin-right: 0.25rem !important; + } + + .p-mx-xl-2 { + margin-left: 0.5rem !important; + margin-right: 0.5rem !important; + } + + .p-mx-xl-3 { + margin-left: 1rem !important; + margin-right: 1rem !important; + } + + .p-mx-xl-4 { + margin-left: 1.5rem !important; + margin-right: 1.5rem !important; + } + + .p-mx-xl-5 { + margin-left: 2rem !important; + margin-right: 2rem !important; + } + + .p-mx-xl-6 { + margin-left: 3rem !important; + margin-right: 3rem !important; + } + + .p-mx-xl-auto { + margin-left: auto !important; + margin-right: auto !important; + } + + .p-my-xl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + + .p-my-xl-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + + .p-my-xl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + + .p-my-xl-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + + .p-my-xl-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + + .p-my-xl-5 { + margin-top: 2rem !important; + margin-bottom: 2rem !important; + } + + .p-my-xl-6 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + + .p-my-xl-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + + .p-m-xl-0 { + margin: 0 !important; + } + + .p-m-xl-1 { + margin: 0.25rem !important; + } + + .p-m-xl-2 { + margin: 0.5rem !important; + } + + .p-m-xl-3 { + margin: 1rem !important; + } + + .p-m-xl-4 { + margin: 1.5rem !important; + } + + .p-m-xl-5 { + margin: 2rem !important; + } + + .p-m-xl-6 { + margin: 3rem !important; + } + + .p-m-xl-auto { + margin: auto !important; + } +} +.p-shadow-1 { + box-shadow: 0 2px 1px -1px rgba(0, 0, 0, 0.2), 0 1px 1px 0 rgba(0, 0, 0, 0.14), 0 1px 3px 0 rgba(0, 0, 0, 0.12); +} + +.p-shadow-2 { + box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12); +} + +.p-shadow-3 { + box-shadow: 0 3px 3px -2px rgba(0, 0, 0, 0.2), 0 3px 4px 0 rgba(0, 0, 0, 0.14), 0 1px 8px 0 rgba(0, 0, 0, 0.12); +} + +.p-shadow-4 { + box-shadow: 0 2px 4px -1px rgba(0, 0, 0, 0.2), 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12); +} + +.p-shadow-5 { + box-shadow: 0 3px 5px -1px rgba(0, 0, 0, 0.2), 0 5px 8px 0 rgba(0, 0, 0, 0.14), 0 1px 14px 0 rgba(0, 0, 0, 0.12); +} + +.p-shadow-6 { + box-shadow: 0 3px 5px -1px rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.14), 0 1px 18px 0 rgba(0, 0, 0, 0.12); +} + +.p-shadow-7 { + box-shadow: 0 4px 5px -2px rgba(0, 0, 0, 0.2), 0 7px 10px 1px rgba(0, 0, 0, 0.14), 0 2px 16px 1px rgba(0, 0, 0, 0.12); +} + +.p-shadow-8 { + box-shadow: 0 5px 5px -3px rgba(0, 0, 0, 0.2), 0 8px 10px 1px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12); +} + +.p-shadow-9 { + box-shadow: 0 5px 6px -3px rgba(0, 0, 0, 0.2), 0 9px 12px 1px rgba(0, 0, 0, 0.14), 0 3px 16px 2px rgba(0, 0, 0, 0.12); +} + +.p-shadow-10 { + box-shadow: 0 6px 6px -3px rgba(0, 0, 0, 0.2), 0 10px 14px 1px rgba(0, 0, 0, 0.14), 0 4px 18px 3px rgba(0, 0, 0, 0.12); +} + +.p-shadow-11 { + box-shadow: 0 6px 7px -4px rgba(0, 0, 0, 0.2), 0 11px 15px 1px rgba(0, 0, 0, 0.14), 0 4px 20px 3px rgba(0, 0, 0, 0.12); +} + +.p-shadow-12 { + box-shadow: 0 7px 8px -4px rgba(0, 0, 0, 0.2), 0 12px 17px 2px rgba(0, 0, 0, 0.14), 0 5px 22px 4px rgba(0, 0, 0, 0.12); +} + +.p-shadow-13 { + box-shadow: 0 7px 8px -4px rgba(0, 0, 0, 0.2), 0 13px 19px 2px rgba(0, 0, 0, 0.14), 0 5px 24px 4px rgba(0, 0, 0, 0.12); +} + +.p-shadow-14 { + box-shadow: 0 7px 9px -4px rgba(0, 0, 0, 0.2), 0 14px 21px 2px rgba(0, 0, 0, 0.14), 0 5px 26px 4px rgba(0, 0, 0, 0.12); +} + +.p-shadow-15 { + box-shadow: 0 8px 9px -5px rgba(0, 0, 0, 0.2), 0 15px 22px 2px rgba(0, 0, 0, 0.14), 0 6px 28px 5px rgba(0, 0, 0, 0.12); +} + +.p-shadow-16 { + box-shadow: 0 8px 10px -5px rgba(0, 0, 0, 0.2), 0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12); +} + +.p-shadow-17 { + box-shadow: 0 8px 11px -5px rgba(0, 0, 0, 0.2), 0 17px 26px 2px rgba(0, 0, 0, 0.14), 0 6px 32px 5px rgba(0, 0, 0, 0.12); +} + +.p-shadow-18 { + box-shadow: 0 9px 11px -5px rgba(0, 0, 0, 0.2), 0 18px 28px 2px rgba(0, 0, 0, 0.14), 0 7px 34px 6px rgba(0, 0, 0, 0.12); +} + +.p-shadow-19 { + box-shadow: 0 9px 12px -6px rgba(0, 0, 0, 0.2), 0 19px 29px 2px rgba(0, 0, 0, 0.14), 0 7px 36px 6px rgba(0, 0, 0, 0.12); +} + +.p-shadow-20 { + box-shadow: 0 10px 13px -6px rgba(0, 0, 0, 0.2), 0 20px 31px 3px rgba(0, 0, 0, 0.14), 0 8px 38px 7px rgba(0, 0, 0, 0.12); +} + +.p-shadow-21 { + box-shadow: 0 10px 13px -6px rgba(0, 0, 0, 0.2), 0 21px 33px 3px rgba(0, 0, 0, 0.14), 0 8px 40px 7px rgba(0, 0, 0, 0.12); +} + +.p-shadow-22 { + box-shadow: 0 10px 14px -6px rgba(0, 0, 0, 0.2), 0 22px 35px 3px rgba(0, 0, 0, 0.14), 0 8px 42px 7px rgba(0, 0, 0, 0.12); +} + +.p-shadow-23 { + box-shadow: 0 11px 14px -7px rgba(0, 0, 0, 0.2), 0 23px 36px 3px rgba(0, 0, 0, 0.14), 0 9px 44px 8px rgba(0, 0, 0, 0.12); +} + +.p-shadow-24 { + box-shadow: 0 11px 15px -7px rgba(0, 0, 0, 0.2), 0 24px 38px 3px rgba(0, 0, 0, 0.14), 0 9px 46px 8px rgba(0, 0, 0, 0.12); +} + +/*# sourceMappingURL=primeflex.css.map */ diff --git a/java/mss-failsafe/src/main/webapp/resources/css/primeflex.css.map b/java/mss-failsafe/src/main/webapp/resources/css/primeflex.css.map new file mode 100755 index 0000000..23c1b3d --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/resources/css/primeflex.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["src/_grid.scss","src/_variables.scss","src/_grid_deprecated.scss","src/_formlayout.scss","src/_display.scss","src/_text.scss","src/flexbox/_direction.scss","src/flexbox/_justify_content.scss","src/flexbox/_align_items.scss","src/flexbox/_align_self.scss","src/flexbox/_align_content.scss","src/flexbox/_order.scss","src/flexbox/_wrap.scss","src/_padding.scss","src/_margin.scss","src/_elevation.scss"],"names":[],"mappings":"AAAA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;EAEI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;AAAA;EAEI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA,SC/BI;;;ADkCR;EACI;EACA;EACA;EACA,SCtCI;;;ADyCR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAYI;EACA;EACA;EACA,SCxDI;;;AD2DR;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAgDI,SC/MI;;;ADkNR;EACI;;;AAGJ;EACI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;IAYI;IACA;IACA;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AAIR;EACI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;IAYI;IACA;IACA;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AAIR;EACI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;IAYI;IACA;IACA;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AAIR;EACI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;IAYI;IACA;IACA;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AElrBR;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;;;AAKJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;;;AAIJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;AAAA;EAEE;EACA;;;AAGF;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;AAIR;EACI;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;AAIR;EACI;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;AAIR;EACI;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;EAGJ;IACI;IACA;;;AC5fR;EACI,eFKU;;;AEFd;EACI;EACA,eFCe;;;AEEnB;EACI;EACA;;;AAGJ;EACI,YFPe;;;AEUnB;AAAA;EAEI;;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EA4BI;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;AAAA;AAAA;EAGI,cF1DU;;;AE6Dd;AAAA;AAAA;EAGI,cF/De;EEgEf;;;AAGJ;AAAA;EAEI,eFtEU;EEuEV;EACA;;;AAGJ;AAAA;EAEI,aF5Ee;EE6Ef;;;ACpFJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AAIR;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AAIR;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AAIR;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AAIR;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;ACtJR;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AAIR;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AAIR;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AAIR;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AC1HR;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AAIR;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AAIR;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AAIR;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;ACpFR;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AAIR;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AAIR;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AAIR;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AC5HR;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AAIR;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AAIR;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AAIR;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;ACxGR;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AAIR;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AAIR;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AAIR;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;ACxGR;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AAIR;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AAIR;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AAIR;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AC5HR;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AAIR;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AAIR;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AAIR;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AChJR;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AAIR;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AAIR;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AAIR;EACI;IACI;;;EAGJ;IACI;;;EAGJ;IACI;;;AChER;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AAET;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AAET;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AAET;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AAET;EAAS;EAA0B;;;AACnC;EAAS;EAAuC;;;AAChD;EAAS;EAAsC;;;AAC/C;EAAS;EAAoC;;;AAC7C;EAAS;EAAsC;;;AAC/C;EAAS;EAAoC;;;AAC7C;EAAS;EAAoC;;;AAE7C;EAAS;EAAyB;;;AAClC;EAAS;EAAsC;;;AAC/C;EAAS;EAAqC;;;AAC9C;EAAS;EAAmC;;;AAC5C;EAAS;EAAqC;;;AAC9C;EAAS;EAAmC;;;AAC5C;EAAS;EAAmC;;;AAE5C;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AAER;EACI;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EAEZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EAEZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EAEZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EAEZ;IAAY;IAA0B;;;EACtC;IAAY;IAAuC;;;EACnD;IAAY;IAAsC;;;EAClD;IAAY;IAAoC;;;EAChD;IAAY;IAAsC;;;EAClD;IAAY;IAAoC;;;EAChD;IAAY;IAAoC;;;EAEhD;IAAY;IAAyB;;;EACrC;IAAY;IAAsC;;;EAClD;IAAY;IAAqC;;;EACjD;IAAY;IAAmC;;;EAC/C;IAAY;IAAqC;;;EACjD;IAAY;IAAmC;;;EAC/C;IAAY;IAAmC;;;EAE/C;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;AAGf;EACI;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EAEZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EAEZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EAEZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EAEZ;IAAY;IAA0B;;;EACtC;IAAY;IAAuC;;;EACnD;IAAY;IAAsC;;;EAClD;IAAY;IAAoC;;;EAChD;IAAY;IAAsC;;;EAClD;IAAY;IAAoC;;;EAChD;IAAY;IAAoC;;;EAEhD;IAAY;IAAyB;;;EACrC;IAAY;IAAsC;;;EAClD;IAAY;IAAqC;;;EACjD;IAAY;IAAmC;;;EAC/C;IAAY;IAAqC;;;EACjD;IAAY;IAAmC;;;EAC/C;IAAY;IAAmC;;;EAE/C;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;AAGf;EACI;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAe;;;EAEf;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EAEZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EAEZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EAEZ;IAAY;IAA0B;;;EACtC;IAAY;IAAuC;;;EACnD;IAAY;IAAsC;;;EAClD;IAAY;IAAoC;;;EAChD;IAAY;IAAsC;;;EAClD;IAAY;IAAoC;;;EAChD;IAAY;IAAoC;;;EAEhD;IAAY;IAAyB;;;EACrC;IAAY;IAAsC;;;EAClD;IAAY;IAAqC;;;EACjD;IAAY;IAAmC;;;EAC/C;IAAY;IAAqC;;;EACjD;IAAY;IAAmC;;;EAC/C;IAAY;IAAmC;;;EAE/C;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;AAGf;EACI;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EAEZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EAEZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EAEZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EAEZ;IAAY;IAA0B;;;EACtC;IAAY;IAAuC;;;EACnD;IAAY;IAAsC;;;EAClD;IAAY;IAAoC;;;EAChD;IAAY;IAAsC;;;EAClD;IAAY;IAAoC;;;EAChD;IAAY;IAAoC;;;EAEhD;IAAY;IAAyB;;;EACrC;IAAY;IAAsC;;;EAClD;IAAY;IAAqC;;;EACjD;IAAY;IAAmC;;;EAC/C;IAAY;IAAqC;;;EACjD;IAAY;IAAmC;;;EAC/C;IAAY;IAAmC;;;EAE/C;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;AC9Rf;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAY;;;AAEZ;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAY;;;AAEZ;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAY;;;AAEZ;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAS;;;AACT;EAAY;;;AAEZ;EAAS;EAAyB;;;AAClC;EAAS;EAAsC;;;AAC/C;EAAS;EAAqC;;;AAC9C;EAAS;EAAmC;;;AAC5C;EAAS;EAAqC;;;AAC9C;EAAS;EAAmC;;;AAC5C;EAAS;EAAmC;;;AAC5C;EAAY;EAA4B;;;AAExC;EAAS;EAAwB;;;AACjC;EAAS;EAAqC;;;AAC9C;EAAS;EAAoC;;;AAC7C;EAAS;EAAkC;;;AAC3C;EAAS;EAAoC;;;AAC7C;EAAS;EAAkC;;;AAC3C;EAAS;EAAkC;;;AAC3C;EAAY;EAA2B;;;AAEvC;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAQ;;;AACR;EAAW;;;AAEX;EACI;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAe;;;EAEf;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAe;;;EAEf;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAe;;;EAEf;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAe;;;EAEf;IAAY;IAAyB;;;EACrC;IAAY;IAAsC;;;EAClD;IAAY;IAAqC;;;EACjD;IAAY;IAAmC;;;EAC/C;IAAY;IAAqC;;;EACjD;IAAY;IAAmC;;;EAC/C;IAAY;IAAmC;;;EAC/C;IAAe;IAA4B;;;EAE3C;IAAY;IAAwB;;;EACpC;IAAY;IAAqC;;;EACjD;IAAY;IAAoC;;;EAChD;IAAY;IAAkC;;;EAC9C;IAAY;IAAoC;;;EAChD;IAAY;IAAkC;;;EAC9C;IAAY;IAAkC;;;EAC9C;IAAe;IAA2B;;;EAE1C;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAc;;;AAGlB;EACI;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAe;;;EAEf;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAe;;;EAEf;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAe;;;EAEf;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAe;;;EAEf;IAAY;IAAyB;;;EACrC;IAAY;IAAsC;;;EAClD;IAAY;IAAqC;;;EACjD;IAAY;IAAmC;;;EAC/C;IAAY;IAAqC;;;EACjD;IAAY;IAAmC;;;EAC/C;IAAY;IAAmC;;;EAC/C;IAAe;IAA4B;;;EAE3C;IAAY;IAAwB;;;EACpC;IAAY;IAAqC;;;EACjD;IAAY;IAAoC;;;EAChD;IAAY;IAAkC;;;EAC9C;IAAY;IAAoC;;;EAChD;IAAY;IAAkC;;;EAC9C;IAAY;IAAkC;;;EAC9C;IAAe;IAA2B;;;EAE1C;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAc;;;AAGlB;EACI;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAe;;;EAEf;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAe;;;EAEf;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAe;;;EAEf;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAe;;;EAEf;IAAY;IAAyB;;;EACrC;IAAY;IAAsC;;;EAClD;IAAY;IAAqC;;;EACjD;IAAY;IAAmC;;;EAC/C;IAAY;IAAqC;;;EACjD;IAAY;IAAmC;;;EAC/C;IAAY;IAAmC;;;EAC/C;IAAe;IAA4B;;;EAE3C;IAAY;IAAwB;;;EACpC;IAAY;IAAqC;;;EACjD;IAAY;IAAoC;;;EAChD;IAAY;IAAkC;;;EAC9C;IAAY;IAAoC;;;EAChD;IAAY;IAAkC;;;EAC9C;IAAY;IAAkC;;;EAC9C;IAAe;IAA2B;;;EAE1C;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAc;;;AAGlB;EACI;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAe;;;EAEf;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAe;;;EAEf;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAe;;;EAEf;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAY;;;EACZ;IAAe;;;EAEf;IAAY;IAAyB;;;EACrC;IAAY;IAAsC;;;EAClD;IAAY;IAAqC;;;EACjD;IAAY;IAAmC;;;EAC/C;IAAY;IAAqC;;;EACjD;IAAY;IAAmC;;;EAC/C;IAAY;IAAmC;;;EAC/C;IAAe;IAA4B;;;EAE3C;IAAY;IAAwB;;;EACpC;IAAY;IAAqC;;;EACjD;IAAY;IAAoC;;;EAChD;IAAY;IAAkC;;;EAC9C;IAAY;IAAoC;;;EAChD;IAAY;IAAkC;;;EAC9C;IAAY;IAAkC;;;EAC9C;IAAe;IAA2B;;;EAE1C;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAW;;;EACX;IAAc;;;AChUlB;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI","file":"primeflex.css"} \ No newline at end of file diff --git a/java/mss-failsafe/src/main/webapp/resources/images/icons/HelloFace.png b/java/mss-failsafe/src/main/webapp/resources/images/icons/HelloFace.png new file mode 100755 index 0000000..2c98499 Binary files /dev/null and b/java/mss-failsafe/src/main/webapp/resources/images/icons/HelloFace.png differ diff --git a/java/mss-failsafe/mss/src/main/webapp/resources/images/icons/company_icon.png b/java/mss-failsafe/src/main/webapp/resources/images/icons/company_icon.png old mode 100644 new mode 100755 similarity index 100% rename from java/mss-failsafe/mss/src/main/webapp/resources/images/icons/company_icon.png rename to java/mss-failsafe/src/main/webapp/resources/images/icons/company_icon.png diff --git a/java/mss-failsafe/mss/src/main/webapp/resources/images/icons/location_icon.png b/java/mss-failsafe/src/main/webapp/resources/images/icons/location_icon.png old mode 100644 new mode 100755 similarity index 100% rename from java/mss-failsafe/mss/src/main/webapp/resources/images/icons/location_icon.png rename to java/mss-failsafe/src/main/webapp/resources/images/icons/location_icon.png diff --git a/java/mss-failsafe/src/main/webapp/resources/images/icons/location_icon_light.png b/java/mss-failsafe/src/main/webapp/resources/images/icons/location_icon_light.png new file mode 100755 index 0000000..9fbfc9d Binary files /dev/null and b/java/mss-failsafe/src/main/webapp/resources/images/icons/location_icon_light.png differ diff --git a/java/mss-failsafe/mss/src/main/webapp/resources/images/icons/machine_icon.png b/java/mss-failsafe/src/main/webapp/resources/images/icons/machine_icon.png old mode 100644 new mode 100755 similarity index 100% rename from java/mss-failsafe/mss/src/main/webapp/resources/images/icons/machine_icon.png rename to java/mss-failsafe/src/main/webapp/resources/images/icons/machine_icon.png diff --git a/java/mss-failsafe/src/main/webapp/resources/images/icons/manufacturer_icon.png b/java/mss-failsafe/src/main/webapp/resources/images/icons/manufacturer_icon.png new file mode 100755 index 0000000..ed4f157 Binary files /dev/null and b/java/mss-failsafe/src/main/webapp/resources/images/icons/manufacturer_icon.png differ diff --git a/java/mss-failsafe/mss/src/main/webapp/resources/images/icons/security_icon.png b/java/mss-failsafe/src/main/webapp/resources/images/icons/security_icon.png old mode 100644 new mode 100755 similarity index 100% rename from java/mss-failsafe/mss/src/main/webapp/resources/images/icons/security_icon.png rename to java/mss-failsafe/src/main/webapp/resources/images/icons/security_icon.png diff --git a/java/mss-failsafe/mss/src/main/webapp/resources/images/logo.jpg b/java/mss-failsafe/src/main/webapp/resources/images/logo.jpg old mode 100644 new mode 100755 similarity index 100% rename from java/mss-failsafe/mss/src/main/webapp/resources/images/logo.jpg rename to java/mss-failsafe/src/main/webapp/resources/images/logo.jpg diff --git a/java/mss-failsafe/src/main/webapp/resources/images/logos/MSS-Logo-RGB.png b/java/mss-failsafe/src/main/webapp/resources/images/logos/MSS-Logo-RGB.png new file mode 100755 index 0000000..1ede1ec Binary files /dev/null and b/java/mss-failsafe/src/main/webapp/resources/images/logos/MSS-Logo-RGB.png differ diff --git a/java/mss-failsafe/src/main/webapp/resources/images/logos/MSS-Logo-blau-RGB.png b/java/mss-failsafe/src/main/webapp/resources/images/logos/MSS-Logo-blau-RGB.png new file mode 100755 index 0000000..3f91a51 Binary files /dev/null and b/java/mss-failsafe/src/main/webapp/resources/images/logos/MSS-Logo-blau-RGB.png differ diff --git a/java/mss-failsafe/src/main/webapp/resources/images/logos/MSS-Logo-schwarz-RGB.png b/java/mss-failsafe/src/main/webapp/resources/images/logos/MSS-Logo-schwarz-RGB.png new file mode 100755 index 0000000..d77342e Binary files /dev/null and b/java/mss-failsafe/src/main/webapp/resources/images/logos/MSS-Logo-schwarz-RGB.png differ diff --git a/java/mss-failsafe/src/main/webapp/resources/images/logos/MSS-Logo-weiss-RGB.png b/java/mss-failsafe/src/main/webapp/resources/images/logos/MSS-Logo-weiss-RGB.png new file mode 100755 index 0000000..ec089ad Binary files /dev/null and b/java/mss-failsafe/src/main/webapp/resources/images/logos/MSS-Logo-weiss-RGB.png differ diff --git a/java/mss-failsafe/src/main/webapp/resources/images/logos/MSS_Logo-RGB.jpg b/java/mss-failsafe/src/main/webapp/resources/images/logos/MSS_Logo-RGB.jpg new file mode 100755 index 0000000..72d8cc8 Binary files /dev/null and b/java/mss-failsafe/src/main/webapp/resources/images/logos/MSS_Logo-RGB.jpg differ diff --git a/java/mss-failsafe/src/main/webapp/resources/images/logos/logo_small.png b/java/mss-failsafe/src/main/webapp/resources/images/logos/logo_small.png new file mode 100755 index 0000000..9432f46 Binary files /dev/null and b/java/mss-failsafe/src/main/webapp/resources/images/logos/logo_small.png differ diff --git a/java/mss-failsafe/mss/src/main/webapp/resources/layout/manager/template.xhtml b/java/mss-failsafe/src/main/webapp/resources/layout/manager/template.xhtml old mode 100644 new mode 100755 similarity index 100% rename from java/mss-failsafe/mss/src/main/webapp/resources/layout/manager/template.xhtml rename to java/mss-failsafe/src/main/webapp/resources/layout/manager/template.xhtml diff --git a/java/mss-failsafe/src/main/webapp/resources/layout/user/template.xhtml b/java/mss-failsafe/src/main/webapp/resources/layout/user/template.xhtml new file mode 100755 index 0000000..ff0b138 --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/resources/layout/user/template.xhtml @@ -0,0 +1,178 @@ + + + + + + + + + + + + + + <ui:insert name="title"> + Please add a Title! + </ui:insert> + + + + +
+
+
+ + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+
+ + +
+ +
+ +
+ +
+ + + + + + + + + + + +
+ +
+ + + + + + + + + + + +
+ +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ Content +
+
+
+ Bottom +
+
+ diff --git a/java/mss-failsafe/src/main/webapp/resources/layout/user/templateticket.xhtml b/java/mss-failsafe/src/main/webapp/resources/layout/user/templateticket.xhtml new file mode 100755 index 0000000..771c5fc --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/resources/layout/user/templateticket.xhtml @@ -0,0 +1,181 @@ + + + + + + + + + + + + + + <ui:insert name="title"> + Please add a Title! + </ui:insert> + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + +
+
+
+ + +
+
+ + +
+ +
+ +
+ +
+ + + + + + + + + + + +
+ +
+ + + + + + + + + + + +
+ +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ Content +
+
+
+ Bottom +
+
+ diff --git a/java/mss-failsafe/src/main/webapp/resources/user/com/create.xhtml b/java/mss-failsafe/src/main/webapp/resources/user/com/create.xhtml new file mode 100755 index 0000000..7678980 --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/resources/user/com/create.xhtml @@ -0,0 +1,305 @@ + + + + + Firmen erstellen + + + +

Firmen erstellen

+
+ + + + + + + + + +
+
+ + + + + + + + + +
+
+ +
+
+ + +
+ Stammdaten + + +
+
+ +
+
+ + + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ +
+ + +
+ Weitere Daten +
+
+ +
+
+ + +
+
+
+ + + + +
+
+ + +
+
+ + +
+
+
+
+
+
+
+
+ + + + Adressen + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + +
+
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+ + +
+
+
+
+ + + +
+
+
+
+ + + + + + + + +
+
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
+
+
+
+
diff --git a/java/mss-failsafe/src/main/webapp/resources/user/com/delete.xhtml b/java/mss-failsafe/src/main/webapp/resources/user/com/delete.xhtml new file mode 100755 index 0000000..3a97247 --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/resources/user/com/delete.xhtml @@ -0,0 +1,101 @@ + + + + + Firmen löschen + + + +

Firmen löschen

+
+ + + + + + + + + +
+
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
diff --git a/java/mss-failsafe/src/main/webapp/resources/user/com/edit.xhtml b/java/mss-failsafe/src/main/webapp/resources/user/com/edit.xhtml new file mode 100755 index 0000000..3637f09 --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/resources/user/com/edit.xhtml @@ -0,0 +1,358 @@ + + + + + Firmen bearbeiten + + + +

Firmen bearbeiten

+
+ + + + + + + + + +
+
+ + + + + + + + + +
+
+ +
+
+ + +
+ Stammdaten + + + +
+
+ +
+
+ + + + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ +
+ + +
+ Weitere Daten +
+
+ +
+
+ + +
+
+
+ + + + +
+
+ + +
+
+ + +
+
+
+
+
+
+
+
+ + + + Adressen + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + +
+
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+ + +
+
+
+
+ + + +
+
+
+
+ + + + + + + + +
+
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
+
+
+
diff --git a/java/mss-failsafe/src/main/webapp/resources/user/companies.xhtml b/java/mss-failsafe/src/main/webapp/resources/user/companies.xhtml new file mode 100755 index 0000000..88871fc --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/resources/user/companies.xhtml @@ -0,0 +1,59 @@ + + + + Firmen bearbeiten + + + +

Firmen bearbeiten

+
+ + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
\ No newline at end of file diff --git a/java/mss-failsafe/src/main/webapp/resources/user/cus/create.xhtml b/java/mss-failsafe/src/main/webapp/resources/user/cus/create.xhtml new file mode 100755 index 0000000..28cebdf --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/resources/user/cus/create.xhtml @@ -0,0 +1,370 @@ + + + + + Ansprechparter + + + +

Ansprechparter Erstellen, Bearbeiten & Löschen

+
+ + + + + + + + + +
+
+ + + + + + +
+
+ +
+
+ + +
+
+ Firma +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+ +
+ + +
+
+ Ansprechpartner Nr. #{customerController.customers.indexOf(customer) + 1} +
+
+ +
+
+ + + + + + + + +
+
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
+
+ + + + +
+
+
+
+ +
+
+
+ +
+
+
+ + + + + +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+ + + + + + + + +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+
+ + + + +
+
+
+
+ +
+
+
+ +
+
+
+ + + + + +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+ + + + + + + + +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+
+
+
diff --git a/java/mss-failsafe/src/main/webapp/resources/user/cus/delete.xhtml b/java/mss-failsafe/src/main/webapp/resources/user/cus/delete.xhtml new file mode 100755 index 0000000..0a7b537 --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/resources/user/cus/delete.xhtml @@ -0,0 +1,108 @@ + + + + + Ansprechparter löschen + + + +

Ansprechparter löschen

+
+ + + + + + + + + +
+
+ + + + + + + + + + +
+
+ +
+
+ + + + + +
+
+
+
+
+
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
+
+
+
diff --git a/java/mss-failsafe/src/main/webapp/resources/user/cus/edit.xhtml b/java/mss-failsafe/src/main/webapp/resources/user/cus/edit.xhtml new file mode 100755 index 0000000..0d914b1 --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/resources/user/cus/edit.xhtml @@ -0,0 +1,108 @@ + + + + + Ansprechparter bearbeiten + + + +

Ansprechparter bearbeiten

+
+ + + + + + + + + +
+
+ + + + + + + + + + +
+
+ +
+
+ + + + + +
+
+
+
+
+
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
+
+
+
diff --git a/java/mss-failsafe/src/main/webapp/resources/user/loc/create.xhtml b/java/mss-failsafe/src/main/webapp/resources/user/loc/create.xhtml new file mode 100755 index 0000000..c55eddd --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/resources/user/loc/create.xhtml @@ -0,0 +1,261 @@ + + + + + Standorte + + + +

Ansprechparter Erstellen, Bearbeiten & Löschen

+
+ + + + + + + + + +
+
+ + + + + + +
+ +
+ +
+ + +
+
+ Firma +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+ + +
+
+ Standort Nr. #{locationController.locations.indexOf(location) + 1} +
+
+ +
+
+ + + +
+
+ + + + + +
+
+
+
+
+ +
+
+
+ +
+
+
+
+
+ + +
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+
+ + +
+
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
+
+ + + +
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+
+ + + +
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+
diff --git a/java/mss-failsafe/src/main/webapp/resources/user/loc/delete.xhtml b/java/mss-failsafe/src/main/webapp/resources/user/loc/delete.xhtml new file mode 100755 index 0000000..c56ed47 --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/resources/user/loc/delete.xhtml @@ -0,0 +1,45 @@ + + + + + Standorte löschen + + + +

Standorte löschen

+
+ + + + + + + + + +
+
+ + + + + + + + + + +
+
+
+ + + + +
diff --git a/java/mss-failsafe/src/main/webapp/resources/user/loc/edit.xhtml b/java/mss-failsafe/src/main/webapp/resources/user/loc/edit.xhtml new file mode 100755 index 0000000..758a324 --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/resources/user/loc/edit.xhtml @@ -0,0 +1,45 @@ + + + + + Standorte bearbeiten + + + +

Standorte bearbeiten

+
+ + + + + + + + + +
+
+ + + + + + + + + + +
+
+
+ + + + +
diff --git a/java/mss-failsafe/mss/src/main/webapp/user/locations.xhtml b/java/mss-failsafe/src/main/webapp/resources/user/locations.xhtml old mode 100644 new mode 100755 similarity index 100% rename from java/mss-failsafe/mss/src/main/webapp/user/locations.xhtml rename to java/mss-failsafe/src/main/webapp/resources/user/locations.xhtml diff --git a/java/mss-failsafe/src/main/webapp/resources/user/mac/create.xhtml b/java/mss-failsafe/src/main/webapp/resources/user/mac/create.xhtml new file mode 100755 index 0000000..ff4378a --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/resources/user/mac/create.xhtml @@ -0,0 +1,626 @@ + + + + + Maschinen erstellen + + + + + + + +

Maschinen erstellen

+
+ + +

Maschinen erstellen

+
+ + + + + + +
+ + + + + + +
+ + + + + + +
+
+ +
+ + +
+
+ Firma +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+ +
+ +
+ + + + +
+
+
+ +
+
+ + + + + + +
+ + +
+
+ Maschine Nr. #{location.machines.indexOf(machine) + 1} +
+
+ + + + +
+
+ + + + +
+
+ + + + +
+
+ + + + + +
+
+ + + + + +
+ +
+
+
+
+ +
+
+
+ +
+ +
+
+
+
+ +
+
+
+ +
+
+
+ + + + + +
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
+
+ + + +
+
+ +
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + + + +
+
+
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + +
+
+
+ + + + +
+
+
+ + + + +
+
+
+
+ +
+
+ +
+
+
+
+
+ + + +
+
+ +
+
+
+
+ +
+
+
+ +
+
+
+ + + +
+
+
+ +
+
+
+ + +
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + + + +
+
+
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + + + +
+
+
+
+ +
+
+
+
+ +
+
+ +
+
+
+ + + + + +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+
+
+
+ + + +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+
+
+
+ + + +
+
+
+ + + + + + + + + + +
+
+
+
+ +
+
+ +
+
+
+
+
+ + + +
+
+
+ + + + + + + + + + +
+
+
+
+ +
+
+ +
+
+
+
+
+ + + +
+
+
+ + + + + + + + + + + + + + + +
+
+
+
+ +
+
+ + + +
+
+
+
+
+ + + + diff --git a/java/mss-failsafe/mss/src/main/webapp/user/machines.xhtml b/java/mss-failsafe/src/main/webapp/resources/user/machines.xhtml old mode 100644 new mode 100755 similarity index 100% rename from java/mss-failsafe/mss/src/main/webapp/user/machines.xhtml rename to java/mss-failsafe/src/main/webapp/resources/user/machines.xhtml diff --git a/java/mss-failsafe/src/main/webapp/resources/user/man/device.xhtml b/java/mss-failsafe/src/main/webapp/resources/user/man/device.xhtml new file mode 100755 index 0000000..f2bef6b --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/resources/user/man/device.xhtml @@ -0,0 +1,187 @@ + + + + + Hersteller Schutzeinrichtung + + + + + + + +

Hersteller Schutzeinrichtung

+
+ + +

Hersteller Schutzeinrichtung

+
+ + + + + + +
+
+ + + + + + + + +
+
+
+ + + +
+ + Firma +
+
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+
+
+
+
+
+
+ + + + +
+
+
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+
+ + + +
+
+
+ + + + + + + + + + +
+
+
+
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+
+ + + +
+
+
+ + + + + + + + + + +
+
+
+
+
+ +
+
+
+
+ + + + + + + +
+
+ +
+
+
+
+
+
+ +
+ diff --git a/java/mss-failsafe/src/main/webapp/resources/user/man/machine.xhtml b/java/mss-failsafe/src/main/webapp/resources/user/man/machine.xhtml new file mode 100755 index 0000000..19c8db4 --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/resources/user/man/machine.xhtml @@ -0,0 +1,516 @@ + + + + + Hersteller Maschine + + + +

Hersteller Maschine

+
+ + +

Hersteller Maschine

+
+ + + + + + +
+
+ + + + + + + + +
+
+ +
+
+ + +
+ + Firma +
+
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+ + + Stammdaten + +
+
+ + +
+
+ + +
+
+ + + +
+
+ + +
+
+ + +
+
+
+
+
+
+
+ + +
+ Firmenkontakte +
+
+
+ +
+
+ +
+
+ + + +
+
+
+ + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+ Firmenadressen +
+
+
+ +
+
+ +
+
+ + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+ + + + + + + + + + + +
+
+
+ + + + + + + + + + +
+
+
+
+ +
+
+ +
+
+
+
+
+ + + +
+
+
+ + + + + + + + + + +
+
+
+
+ + + +
+
+ +
+
+
+
+
+ + + +
+
+
+
+ + + + + + + + + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+ + +
+
+
+
+ + + +
+
+
+
+ + + + + + + + + +
+
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+ + +
+
+
+
+ + + +
+
+
+
+ +
+
+
+ + + + + +
+
+
+ +
+
+
+ +
+
+
+
+
+ + + + + + + + +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+
+ + + +
+
+
+
+ +
+
+
+ + + + + +
+
+
+ +
+
+
+ +
+
+
+
+
+ + + + + + + + +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+
+
+
\ No newline at end of file diff --git a/java/mss-failsafe/src/main/webapp/resources/user/profile.xhtml b/java/mss-failsafe/src/main/webapp/resources/user/profile.xhtml new file mode 100755 index 0000000..ac00928 --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/resources/user/profile.xhtml @@ -0,0 +1,126 @@ + + + Willkommen #{personController.activeUser.call.toString()} #{personController.activeUser.lastname} + + + + + + + +
+
+ + + Profilbild hochladen + + + +
+
+ + + Aktuelles Profilbild + + + + + + + + +
+ + +
+ + + Signatur + +
+
+ + + +
+
+ +
+
+ +
+
+
+
+
+ + + Vorschau + + + + + Keine Signatur vorhanden + + + +
+ +
+
+
+
+
+
+ +
+ +
+ +
+
+
+
+ +
+ +
+
+
+
+
+
+ + + + + +
diff --git a/java/mss-failsafe/src/main/webapp/resources/user/que/questionaire.xhtml b/java/mss-failsafe/src/main/webapp/resources/user/que/questionaire.xhtml new file mode 100755 index 0000000..ba3b191 --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/resources/user/que/questionaire.xhtml @@ -0,0 +1,182 @@ + + + + Checklisten erstellen/bearbeiten + + + +

Checklisten erstellen/bearbeiten

+
+ + + + + + + + + + + +
+
+ + +
+
+ Checklisten +
+
+
+
+ +
+
+ +
+
+ +
+
+ + + +
+ + + + +
+
+
+
+
+ + + +
+
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+ + +
+ + +
+
+ Frage Nr. #{question.position} +
+
+ + + +
+
+ + + +
+
+ + + + +
+
+
+ +
+
+
+ + + +
+
+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+
+
+
+
+ +
+
+ +
+
+
+
+
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
+
+
+ +
\ No newline at end of file diff --git a/java/mss-failsafe/src/main/webapp/resources/user/search/ticketsearch.xhtml b/java/mss-failsafe/src/main/webapp/resources/user/search/ticketsearch.xhtml new file mode 100755 index 0000000..be311ee --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/resources/user/search/ticketsearch.xhtml @@ -0,0 +1,208 @@ + + + + + + + + Ticket Suche + + + +

Ticket Suche

+
+ + + + + + + + + + + + + + + + + +
+ + +
+
+ Firma +
+
+ +
+
+ +
+
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+
+ + + + +
+
+ + + + + +
+
+ +
+
+
+
+ + + + +
+ +
+ + + + +
\ No newline at end of file diff --git a/java/mss-failsafe/src/main/webapp/resources/user/sec/create.xhtml b/java/mss-failsafe/src/main/webapp/resources/user/sec/create.xhtml new file mode 100755 index 0000000..fcb3e79 --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/resources/user/sec/create.xhtml @@ -0,0 +1,2107 @@ + + + + + Sicherheitsbereiche erstellen + + + + + + + +

Schutzbereiche

+
+ + +

Schutzbereiche

+
+ + + + + + +
+
+ + + + + + +
+
+ + + + +
+ + +
+
+ Firma +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+ +
+ +
+ + + + + + + + +
+
+ + + Maschinen + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Schutzbereiche + + + + + + + + + + + + +
+
+ + + + + +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+ + + +
+
+
+ + +
+
+ +
+
+
+
+ + +
+
+ + + + +
+
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+
+
+
+ +
+
+
+ + +
+
+
+ + + + +
+
+ + + + + +
+
+ + + + +
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+
+
+ + +
+
+
+ + + + +
+
+ + + + + +
+
+ + + + +
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+
+
+ + +
+
+
+ + + + +
+
+ + + + + +
+
+ + + + +
+
+
+
+
+ +
+
+
+ +
+
+
+
+
+ +
+
+
+
+ +
+
+

Messpunkt

+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+ +
+
+

Messung

+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+
+
+
+
+ + + + + + + : #{questionaire.name} + + + + + + + +
+ +
+
+ +
+
+ + + + + + + + + + +
+ +
+
+
+
+
+
+
+
+
+ + + + +
+
+
+
+
+
+
+ + + + + +

#{ticketSecurityAreaController.selected.name}

+
+
+ + + + + + + + + + + + + + + + + + + +
+
+
+ + +
+
+ +
+
+
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
+
+ + + +
+
+ +
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + + + +
+
+
+
+ + + + +
+
+
+
+
+ +
+
+ +
+
+
+
+
+ + + +
+
+ +
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + + + +
+
+
+
+ +
+
+ +
+
+
+
+
+ + + + +
+
+
+
+ + + + + +
+
+
+ + + + + +
+
+
+ + + +
+
+ +
+ + + +
+
+ +
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+
+
+
+ + + + + + +
+ + + + + +
+
+
+ + + + + +
+
+
+ + + + + +
+
+
+ + + + + +
+
+
+ + + + + +
+
+
+ + + + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+
+
+ + + +
+
+
+
+ + + + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+
+
+ + + + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+
+
+ + + + + +
+
+
+ + + + + +
+
+
+
+ + +
+
+
+
+ + + + + +
+
+
+ + + + + +
+
+
+ + + +
+
+ + + + +
+
+
+
+
+ + + + + +
+
+
+ + + + + +
+
+
+ + + + + + +
+
+
+ + + + + +
+
+
+ +
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +
+
+ +
+
+
+ +
+
+ +
+
+
+
+
+ + + + +
+
+
+
+ + + + + +
+
+
+ + + + + +
+
+
+ + + +
+
+ +
+ + + +
+
+ +
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+
+
+
+ + + + + +
+
+
+ + + + + +
+
+
+ + + + + +
+
+
+ + + + + +
+
+
+ + + + + +
+
+
+ + + + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+
+
+ + + +
+
+
+
+ + + + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+
+
+ + + + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+
+
+ + + + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+
+ + +
+
+
+
+ + + + + +
+
+
+ + + + + +
+
+
+ + + +
+
+ + + + +
+
+
+
+
+ + + + + +
+
+
+ + + + + +
+
+
+ + + + + + +
+
+
+ + + + + +
+
+
+ +
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+
+
+ + + +
+
+
+

Gefahrenpunkt

+
+
+
+
+ + + +
+
+
+ + + + + +
+
+
+
+
+ + + +
+
+
+
+
+
+

Messpunkt

+
+
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+
+
+
+
+
+

Messung

+
+
+ + + +
+
+
+
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+
+
+
+
+ +
+
+ +
+
+
+
+
+ + + +
+
+
+

Gefahrenpunkt

+
+
+
+
+ + + +
+
+
+ + + + + +
+
+
+
+
+ + + +
+
+
+
+
+
+

Messpunkt

+
+
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+
+
+
+
+
+

Messung

+
+
+ + + +
+
+
+
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+
+
+
+
+ +
+
+ +
+
+
+
+
+ + + +
+
+
+
+ +
+
+
+ + + + + +
+
+
+ + + + +
+
+
+ + + + +
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+
+ + + +
+
+
+
+ +
+
+
+ + + + + +
+
+
+ + + + +
+
+
+ + + + +
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+
+ + +
+
\ No newline at end of file diff --git a/java/mss-failsafe/src/main/webapp/resources/user/sec/create_alt.xhtml b/java/mss-failsafe/src/main/webapp/resources/user/sec/create_alt.xhtml new file mode 100755 index 0000000..3d45bc7 --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/resources/user/sec/create_alt.xhtml @@ -0,0 +1,231 @@ + + + + + Sicherheitsbereiche erstellen + + + +

Sicherheitsbereiche erstellen

+
+ + +

Sicherheitsbereiche erstellen

+
+ + + + + + +
+
+ + + + + + +
+
+ +
+ + +
+
+ Firma +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+ +
+ +
+ + + + + + + + + + + + +
+
+ + +
+
+ +
+ + +
+
+ SB: #{area.name} +
+
+ + + +
+
+ + + + +
+
+ + + + + +
+
+
+
+
+
+
+
+
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
+
+ + + +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+
+
+
+ + + +
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+
+
+
+
+
\ No newline at end of file diff --git a/java/mss-failsafe/src/main/webapp/resources/user/sec/dialogs/questionaire.xhtml b/java/mss-failsafe/src/main/webapp/resources/user/sec/dialogs/questionaire.xhtml new file mode 100755 index 0000000..3a080ba --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/resources/user/sec/dialogs/questionaire.xhtml @@ -0,0 +1,200 @@ + + + + + + + + +
+
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + + + + +
+
+ +
+
+ + + + + + + +
+
+ +
+
+ + +
+
+
+ + +
+
+ + + + + + +
+
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + + + + +
+
+ +
+
+ + + + + + + +
+
+ +
+
+ + +
+
+
+ + +
+
+ + + + + + +
+
+ +

+ + +
+
+ + +
+
+ + + + + +
+ +
+ +
+
+ +
diff --git a/java/mss-failsafe/src/main/webapp/resources/user/settings.xhtml b/java/mss-failsafe/src/main/webapp/resources/user/settings.xhtml new file mode 100755 index 0000000..d2c590d --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/resources/user/settings.xhtml @@ -0,0 +1,72 @@ + + + + + Einstellungen + + + +

Einstellungen

+
+ + + + + + + + + + +
+
+ + +
+
+
+ + + + + + + + + + + + + +
+
+
+
+
+
+ + +
+
+
+ + + + +
+
+
+
+
+
+
+ + + +
diff --git a/java/mss-failsafe/src/main/webapp/resources/user/ticket/create.xhtml b/java/mss-failsafe/src/main/webapp/resources/user/ticket/create.xhtml new file mode 100755 index 0000000..568b03a --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/resources/user/ticket/create.xhtml @@ -0,0 +1,485 @@ + + + + + Ticketerstellung + + + + + + + +

Ticketerstellung

+
+ + + + + + + + + + +
+
+ + + + +
+ + +
+
+ Firma +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + +
+
+
+
+
+ + + Ticketinformationen + +
+
+
+ + + +
+ + + + +
+
+
+ + + + + +
+
+
+
+
+ + + +
+
+
+ + + +
+
+
+
+
+ + + +
+
+
+
+
+
+ + + Serviceadresse/ Einsatzort + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Adresse Auftraggeber + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + Ansprechpartner vor Ort + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Auftraggeber Ansprechpartner + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ + + Standorte auswählen + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + #{container.location.name}: Maschinen auswählen + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
+
+
+
diff --git a/java/mss-failsafe/src/main/webapp/resources/user/ticket/edit.xhtml b/java/mss-failsafe/src/main/webapp/resources/user/ticket/edit.xhtml new file mode 100755 index 0000000..658cb01 --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/resources/user/ticket/edit.xhtml @@ -0,0 +1,1268 @@ + + + #{ticketEditController.selected.number} + + + +

Ticket: #{ticketEditController.selected.number}

+
+ + + + + + + + + + + + + + + + +
+ +

Ticket wird geladen...

+
+
+ +
+ + + + + + + + +
+ +

Bitte warten, das Ticket wird geladen...

+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + Firma + + +
+
+
+
+ +
+
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+
+
+
+
+ + + Notiz - Ticket + +
+
+
+ + + +
+
+
+
+
+ + + +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+ + +
+
+
+
+ + +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+ + +
+
+
+
+
+
+
+ +
+
+ + +
+
+ + + #{location.name}: Maschinen auswählen + + +
+
+ + + +
+
+ +
+
+ + + + + + + + + + + + + + + + + +
+ + + Schutzbereiche + + + + + + + + + + + + + + + + + + + Steuerung + + +
+
+ +
+
+ + +
+
+
+
+ + + +
+
+ +
+
+
+ + + Bemerkungen der Inspektion + + +
+
+
+ + + + + +
+ +
+
+ + + + + +
+ +
+
+ + + +
+ +
+
+ + + + + +
+ +
+
+ + + +
+
+
+
+
+
+ + + + + + + + + + +
+
+
+
+ +
+
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+
+
+
+ +
+
+
+ + + +
+
+
+
+
+ + + +
+
+
+
+
+
+ + + + + +
+
+
+
+ +
+
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+
+
+
+ +
+
+
+ + +
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+
+
+ + +
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+
+
+ + +
+
+
+
+ +
+
+
+ +
+
+
+
+
+ +
+
+
+
+ +
+
+

Messpunkt

+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+ +
+
+

Messung

+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+
+
+
+
+ + + + + +
+
+ #{questionaire.name} +
+
+ + - + + +
+
+
+
+ +
+
+ +
+
+ + + + + + + + + + +
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + +
+
+ + + + +

#{ticketSecurityAreaController.selected.name}

+
+
+ + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ +
+
+
+
+
+ + + +

#{ticketEditController.selectedLocation.name}

+
+
+
+ +
+
+ +
+
+
+
+
+ + + +
+
+ +
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + + + +
+
+
+
+ +
+
+ +
+
+
+
+
+ + + +
+
+ +
+
+
+
+ +
+
+
+ +
+
+
+ + + +
+
+
+ +
+
+
+ + +
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ + + + +
+
+
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + + + +
+
+
+
+ +
+
+
+
+ +
+
+ +
+
+
+ + + + + +
+
+
+ + + + + + + + + + +
+
+
+
+ +
+
+ +
+
+
+
+
+ + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+
+ +
+
+
+
+
+ + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+
+ +
+
+
+
+
+ + + + diff --git a/java/mss-failsafe/src/main/webapp/resources/user/ticket/editmachine.xhtml b/java/mss-failsafe/src/main/webapp/resources/user/ticket/editmachine.xhtml new file mode 100755 index 0000000..2dca594 --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/resources/user/ticket/editmachine.xhtml @@ -0,0 +1,57 @@ + + + + + + + + Maschine bearbeiten + + + +

Maschine bearbeiten

+
+ + + + + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/java/mss-failsafe/src/main/webapp/resources/user/ticket/mytickets.xhtml b/java/mss-failsafe/src/main/webapp/resources/user/ticket/mytickets.xhtml new file mode 100755 index 0000000..6df26d2 --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/resources/user/ticket/mytickets.xhtml @@ -0,0 +1,109 @@ + + + Meine Tickets + + + +

Meine Tickets

+
+ + + + + + + + + +
+
+ + + + Mir zugewiesen + + + + +
+
+ #{ticket.number} +
+
+
+
+ + +
+
+ + + + +
+
+ + +
+
+ + + + +
+
+ + + + + +
+
+
+
+
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ + + + + +
\ No newline at end of file diff --git a/java/mss-failsafe/src/main/webapp/resources/user/ticket/watchlist.xhtml b/java/mss-failsafe/src/main/webapp/resources/user/ticket/watchlist.xhtml new file mode 100755 index 0000000..d662157 --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/resources/user/ticket/watchlist.xhtml @@ -0,0 +1,112 @@ + + + Watchlist + + + +

Beobachtungsliste

+
+ + + + + + + + + +
+
+ + + + Meine beobachteten Tickets + + + + +
+
+ #{ticket.number} +
+
+
+
+ + +
+
+ + + + + +
+
+ + +
+
+ + + + +
+
+ + + + + +
+
+
+
+
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+ + +
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ + + + + +
\ No newline at end of file diff --git a/java/mss-failsafe/src/main/webapp/resources/user/upload/genfrompdf.xhtml b/java/mss-failsafe/src/main/webapp/resources/user/upload/genfrompdf.xhtml new file mode 100755 index 0000000..5d7319c --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/resources/user/upload/genfrompdf.xhtml @@ -0,0 +1,52 @@ + + + Daten aus PDFs Einlesen + + + +

Daten aus PDFs Einlesen

+
+ + +

Daten aus PDFs Einlesen

+
+ + + + + + +
+
+ + + + Dateien uploaden. PDFs sind möglich. + + + + +
+
+
+ + + + + +
\ No newline at end of file diff --git a/java/mss-failsafe/src/main/webapp/resources/user/welcome.xhtml b/java/mss-failsafe/src/main/webapp/resources/user/welcome.xhtml new file mode 100755 index 0000000..cdeeb84 --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/resources/user/welcome.xhtml @@ -0,0 +1,155 @@ + + + Willkommen #{personController.activeUser.call.toString()} #{personController.activeUser.lastname} + + + + + + Willkommen + + + +

Willkommen #{personController.activeUser.call.toString()} #{personController.activeUser.lastname}

+
+ + +
+
+ + + + + + + + + + + + + Aktive Tickets (#{ticketScrollController.loaded.size()}) + + + + +
+
+ #{ticket.number} +
+
+
+
+ + +
+
+ + + + + +
+
+ + + + +
+
+ + +
+
+ + + + +
+
+ + + + + +
+
+
+
+
+ +
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+ + +
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ + + + + + + + + + +
\ No newline at end of file diff --git a/java/mss-failsafe/src/main/webapp/user/com/create.xhtml b/java/mss-failsafe/src/main/webapp/user/com/create.xhtml new file mode 100755 index 0000000..a3f2754 --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/user/com/create.xhtml @@ -0,0 +1,62 @@ + + + +
+ + + +
+ + + Stammdaten + + + + + + + + + + + + + + + + + + + + + + +
+
+ +

Include page erstellen

+

Include page blah blah lorem ipsum

+
+
+ +
+ +

Include page erstellen

+

Include page blah blah lorem ipsum

+
+
+
+ +

Include page erstellen

+

Include page blah blah lorem ipsum

+
+
+
+ + +
diff --git a/java/mss-failsafe/src/main/webapp/user/com/delete.xhtml b/java/mss-failsafe/src/main/webapp/user/com/delete.xhtml new file mode 100755 index 0000000..c5c2274 --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/user/com/delete.xhtml @@ -0,0 +1,10 @@ + + + +

Include page Löschen

+

Include page blah blah lorem ipsum

+
diff --git a/java/mss-failsafe/src/main/webapp/user/com/edit.xhtml b/java/mss-failsafe/src/main/webapp/user/com/edit.xhtml new file mode 100755 index 0000000..9bc0eb9 --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/user/com/edit.xhtml @@ -0,0 +1,10 @@ + + + +

Include page bearbeiten

+

Include page blah blah lorem ipsum

+
diff --git a/java/mss-failsafe/src/main/webapp/user/companies.xhtml b/java/mss-failsafe/src/main/webapp/user/companies.xhtml new file mode 100755 index 0000000..9db9bfb --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/user/companies.xhtml @@ -0,0 +1,61 @@ + + + + Firmen bearbeiten + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +
+ + + +
+
+
+ + + + + +
\ No newline at end of file diff --git a/java/mss-failsafe/src/main/webapp/user/profile.xhtml b/java/mss-failsafe/src/main/webapp/user/profile.xhtml new file mode 100755 index 0000000..c9902ca --- /dev/null +++ b/java/mss-failsafe/src/main/webapp/user/profile.xhtml @@ -0,0 +1,222 @@ + + + Willkommen #{personController.activeUser.call.toString()} #{personController.activeUser.lastname} + + + +
+
+ + + Profilbild hochladen + + + +
+
+ + + Aktuelles Profilbild + + + + + + + + +
+ +
+ +
+
+ + +
+
+
+ +
+ +
+ + +
+
+
+ +
+ +
+ + +
+
+
+ +
+ +
+ + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+
+ +
+ +
+ + +
+
+
+ +
+
+ + +
+
+
+ +
+ +
+ + +
+
+
+ +
+
+
+
+ +
+ + + Unterschrift + +
+
+ + + +
+
+ + +
+ +
+
+ + + +
+
+
+
+
+
+ + + + + + + + +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ + + +
+
+ + + + + + + +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ + + +
+
+
+ +
+ diff --git a/java/mss-failsafe/mss/src/main/webapp/user/protection.xhtml b/java/mss-failsafe/src/main/webapp/user/protection.xhtml old mode 100644 new mode 100755 similarity index 100% rename from java/mss-failsafe/mss/src/main/webapp/user/protection.xhtml rename to java/mss-failsafe/src/main/webapp/user/protection.xhtml diff --git a/java/mss-failsafe/mss/src/main/webapp/user/welcome.xhtml b/java/mss-failsafe/src/main/webapp/user/welcome.xhtml old mode 100644 new mode 100755 similarity index 84% rename from java/mss-failsafe/mss/src/main/webapp/user/welcome.xhtml rename to java/mss-failsafe/src/main/webapp/user/welcome.xhtml index 086900c..fa3c1c9 --- a/java/mss-failsafe/mss/src/main/webapp/user/welcome.xhtml +++ b/java/mss-failsafe/src/main/webapp/user/welcome.xhtml @@ -8,8 +8,11 @@ Willkommen #{personController.activeUser.call.toString()} #{personController.activeUser.lastname} - - Willkommen zuhause + + + Willkommen zuhause + + diff --git a/java/mss-failsafe/src/test/resources/project_description.md b/java/mss-failsafe/src/test/resources/project_description.md new file mode 100755 index 0000000..9d4ad54 --- /dev/null +++ b/java/mss-failsafe/src/test/resources/project_description.md @@ -0,0 +1,87 @@ +# Project Description: MSS-Failsafe + +## 1. Overview +MSS-Failsafe is a Java-based web application designed for managing machine safety inspections and audits. It allows users to document the safety status of industrial machines, track security devices, identify danger points, and manage safety-related questionnaires. The system generates detailed inspection reports (PDF) based on the collected data. + +## 2. Technology Stack +- **Runtime**: Java 11 +- **Platform**: Java EE 8 (utilizing `javax.*` namespaces) +- **Web Framework**: JSF 2.3 with PrimeFaces 11 and PrimeFlex +- **Utility Library**: OmniFaces 3.11 +- **Dependency Injection & Lifecycle**: CDI (Contexts and Dependency Injection) +- **Business Logic**: Stateless EJB (Enterprise JavaBeans) +- **Persistence**: JPA 2.2 with Hibernate 5.6 as the provider +- **Database**: H2 (typically used for development/testing), managed via JNDI datasource `java:/mss-failsafe` +- **Security**: Java EE Security API (JSR 375) with `HttpAuthenticationMechanism` and `IdentityStore` +- **Logging**: Log4j2 +- **PDF Generation**: iText 5 and iText 7 +- **Excel/Office Processing**: Apache POI 5.2 +- **Build System**: Maven + +## 3. Architecture and Design Patterns +The project follows a layered architecture with consistent patterns for CRUD and state management: + +### A. Presentation Layer (JSF) +- Located in `src/main/webapp`. +- Uses XHTML templates with PrimeFaces components and PrimeFlex for layout. +- Views are organized by user role (`admin/`, `user/`) and shared resources (`resources/`). + +### B. Controller Layer (JSF Managed Beans) +- Controllers reside in `src/main/java/controller` and typically extend `AbstractController`. +- Base functionality includes common UI state management (`selected`, `entities`, `created`), FacesMessages, and PDF helpers. +- **Fake-ID Mechanism**: Handles temporary object state by assigning negative IDs to new entities before they are persisted, allowing them to be managed in UI collections. +- Lazy collections are explicitly initialized before view rendering to prevent `LazyInitializationException`. + +### C. Business Layer (EJB Managers) +- Managers reside in `src/main/java/business` and usually extend `AbstractManager`. +- Annotated with `@Stateless`. +- **Generic CRUD**: `AbstractManager` provides standardized methods for `save`, `edit`, `remove`, `find`, `findAll`, and `count`. +- Transaction management is handled by the EJB container (JTA). + +### D. Persistence Layer (JPA) +- Entities reside in `src/main/java/model`. +- **AbstractEntity**: Base class providing a common `id` field. +- **pu_person**: The primary persistence unit defined in `persistence.xml`. + +## 4. Domain Model (Core Entities) +The domain focuses on machine safety and inspection workflows: + +- **Person**: User entity with roles (UserGroups), authentication data, and preferences. +- **Company & Location**: Hierarchical representation of client organizations. +- **Machine**: The primary object of inspection, containing multiple `SecurityArea` instances. +- **SecurityArea**: A logical or physical zone within a `Machine`. Aggregates: + - `SecurityDevice`: Specific safety components (e.g., light curtains, emergency stops). + - `DangerPoint`: Identified hazards. + - `SwitchingDevice`: Control logic components. + - `SecurityAreaQuestionnaire`: Links the area to specific safety check templates. +- **Questionaire & Question**: Templates for structured safety assessments. +- **Ticket**: An inspection record. It creates a "Snapshot" of relevant data by copying master data into `Ticket*` entities (e.g., `TicketMachine`, `TicketSecurityArea`). This ensures that future changes to the master data do not affect historical inspection records. +- **Protocol**: The output of an inspection, generated as a PDF report. + +## 5. Key Technical Implementation Details +- **Data Snapshotting**: Crucial for audit trails; uses specialized entities to store a copy of the machine state at the time of the ticket creation/closure. +- **Generic Architecture**: Minimizes boilerplate by using inheritance and generics for both the business logic and UI controllers. +- **PDF Engine**: Transitioning from iText 5 to iText 7; utility methods in `AbstractController` facilitate table and document generation. +- **Authentication**: Custom implementation using Java EE 8 security standards, supporting "Remember Me" and custom identity stores. + +## 6. Project Structure +- `src/main/java`: + - `model/`: JPA Entities (partitioned by sub-domain). + - `business/`: EJB Managers (CRUD and logic). + - `controller/`: JSF Backing Beans. + - `httpauthenticationmechanism/`: Security configuration and implementation. + - `converter/`: Custom JSF converters for entities. +- `src/main/resources`: + - `META-INF/persistence.xml`: JPA configuration. + - `log4j2.xml`: Logging configuration. + - `checklisten/`: Static resources for checklists. +- `src/main/webapp`: + - `WEB-INF/`: Web application configuration (e.g., `web.xml`, `faces-config.xml`). + - `admin/`, `user/`: Role-specific XHTML views. +- `docs/`: In-depth documentation on architecture, workflows, and domain details. + +## 7. Build and Deployment +- **Packaging**: WAR file. +- **Build Command**: `mvn clean package`. +- **Target Artifact**: `target/mss-1.0-SNAPSHOT.war`. +- **Database Schema**: Typically updated/managed via Hibernate `hbm2ddl.auto`. diff --git a/java/mss-failsafe/src/test/resources/speedup_protocol.md b/java/mss-failsafe/src/test/resources/speedup_protocol.md new file mode 100755 index 0000000..6fa445c --- /dev/null +++ b/java/mss-failsafe/src/test/resources/speedup_protocol.md @@ -0,0 +1,148 @@ +# Performance-Assessment: Erstellung von Protokollen (ProtocolController) und ZIP-Export + +Datum: 2025-10-03 +Autor: Junie (Assessment / kein Code-Change in diesem Schritt) + +Ziel: Maßnahmen vorschlagen, um die Erstellung einzelner und mehrerer Protokolle zu beschleunigen und die Anzahl der Datenbankabfragen deutlich zu reduzieren. Implementierung folgt in separatem Schritt nach Review. + + +## 1) Kurzüberblick / Problemstellung +- Die Funktion `createAllProtocolsAsZip` im Ticket-Editor erstellt für alle Maschinen eines Tickets je ein PDF über den `ProtocolController` und packt sie gemeinsam (inkl. Übersicht) in ein ZIP. + - Datei: `controller\tickets\TicketEditController.java`, Zeilen 175–259. + - Iteriert alle Locations/Maschinen und ruft je Maschine `ProtocolController.createReportForMachine(...)` auf. +- Der `ProtocolController` lädt/initialisiert Entitäten mehrmals erneut, insbesondere in `createSecurityAreaPages` und `createAreaTable`. Dies verursacht pro Maschine und pro Schutzbereich mehrere DB-Operationen (N+1-Pattern, redundante Reloads), führt zu hoher DB-Last und langen Laufzeiten. +- Der `OverviewProtocolController` ist spürbar schneller; dort wurden frühere `refresh`/`reload`/`initialize`-Aufrufe auskommentiert/entfernt und die Logik arbeitet überwiegend auf einer bereits geladenen Entitätsstruktur. + + +## 2) Relevante Code-Stellen (mit Zeilennummern) +- Ticket-Editor (ZIP-Erstellung): + - `createAllProtocolsAsZip`: `...\TicketEditController.java:175–259` – sammelt Maschinen und ruft je Maschine den `ProtocolController` (potenziell triggert das viele Lazy-Loads/Reloads). + - Hinweis: `init()` (65–69) ruft die umfangreiche Prefetch-Methode `initializeSelected()` (71–97) aktuell nicht, d. h. viele Assoziationen bleiben lazily. + +- ProtocolController: + - `createReportForMachine`: `...\ProtocolController.java:259–278` – delegiert an `createPDFInMemory(machine)`. + - `createPDFInMemory`: `125–207` – baut PDF auf und ruft u. a. `createFirstPage(...)` (300–394) und `createSecurityAreaPages(...)` (451–559). + - Hotspot: `createSecurityAreaPages`: `451–559` – enthält explizite Datenbankzugriffe pro Maschine/Schutzbereich: + - `machine = machineManager.refresh(machine);` (452) + - für jeden Bereich: `area = areaManager.reloadWithAll(area);` (457) + - später nochmals: `area = areaManager.reloadWitchQuestionaires(area);` (483) + - → Mehrfache Reloads pro Bereich; erzeugt sehr viele DB-Abfragen. + - Hotspot: `createAreaTable`: `561–613` – ruft erneut `areaManager.reloadWithAll(area)` (564) auf, obwohl die Bereiche kurz zuvor bereits reloaded wurden. + +- OverviewProtocolController: + - Arbeitet performant, weil er auf der vorhandenen Objektstruktur iteriert; ehemals teure Reloads sind auskommentiert: + - `addNachlaufMessungen`: `...\OverviewProtocolController.java:230–300` (kommentierte `refresh`/`initialize`: 247–273) + - `addAnzahlProSchutzeinrichtung`: `302–367` (kommentiert: 319–332) + - `addAnzahlInspektionenMaschinen`: `369–449` (kommentiert: 397–404) + + +## 3) Hypothese zur Ursache der Performanceprobleme +- Klassisches N+1-Query-Problem und redundante Nachladevorgänge: + - Pro Maschine mindestens ein Refresh; pro Schutzbereich mindestens ein, teils zwei Reloads (inkl. weiterer Sammlungen). Zusätzlich ruft `createAreaTable` nochmals Reloads auf – doppelte Arbeit. +- `TicketEditController.init()` ruft keine umfassende Initialisierung; dadurch fehlen Prefetches, was wiederum die Reloads im `ProtocolController` „nötig“ erscheinen lässt. +- Ergebnis: Sehr viele DB-Roundtrips, hohe Last, langsame Protokollerstellung (insb. bei vielen Maschinen/Bereichen). + + +## 4) Zielbild (High Level) +- Vor dem PDF-Bau die gesamte benötigte Objektgraf (Ticket → Locations → Machines → SecurityAreas → SecurityDevices/SwitchingDevices/DangerPoints → Questionnaires/Questions) gezielt mit einem oder sehr wenigen Queries laden. +- Innerhalb von `ProtocolController` keine `refresh()`/`reload*()`-Aufrufe mehr in den inneren Schleifen. Stattdessen auf der vorab vollständig geladenen Objektgraf iterieren. +- Optional: Batching/BatchSize und/oder Second-Level-Cache für wiederverwendete Nachschlagewerte. + + +## 5) Konkrete Maßnahmen (Vorschlag, noch nicht implementiert) +1) Prefetch der benötigten Daten mit JOIN FETCH oder EntityGraph + - Neue Methode im Ticket-/Machine-Layer, z. B. in `TicketManager`: + - `Ticket fetchTicketGraphForProtocolsByNumber(String number)` + - JPQL-Skizze (JOIN FETCH + DISTINCT): + - `SELECT DISTINCT t FROM Ticket t` + - `JOIN FETCH t.locations l` + - `JOIN FETCH l.machines m` + - `LEFT JOIN FETCH m.securityAreas a` + - `LEFT JOIN FETCH a.securityDevices sd` + - `LEFT JOIN FETCH a.switchingDevices sw` + - `LEFT JOIN FETCH a.dangerPoints dp` + - `LEFT JOIN FETCH a.questionaires q` + - `LEFT JOIN FETCH q.questions qs` + - `WHERE t.number = :number` + - Achtung: Evtl. mehrere Queries für große Graphen (Splitting), um Cartesian Explosion zu vermeiden. + - Alternativ/ergänzend: Pro Ticket alle Machines via IDs sammeln und je Subgraph in Batches laden (z. B. 50/100 IDs pro Query) – reduziert Memory- und Join-Breite. + +2) Ticket-Initialisierung anpassen (nur wenn nötig) + - Option A: In `TicketEditController.init()` statt `loadByNumber` die neue `fetchTicketGraphForProtocolsByNumber` verwenden. + - Option B: Separate „Vorladen“-Methode nur für die PDF-Generierung (z. B. `prefetchForProtocolGeneration(Ticket)`), die per Bedarf aufgerufen wird (z. B. gleich zu Beginn von `createAllProtocolsAsZip`). + +3) Reduktion von Reloads im ProtocolController + - In `createSecurityAreaPages` (451–559): + - Entfernen von `machineManager.refresh(machine)` (452), falls die Maschine aus dem vorab geladenen Graph stammt und alle Sammlungen gefüllt sind. + - Entfernen von `areaManager.reloadWithAll(area)` (457) und `areaManager.reloadWitchQuestionaires(area)` (483); stattdessen direkt die vorab geladenen Collections verwenden. + - In `createAreaTable` (561–613): + - Entfernen des erneuten `areaManager.reloadWithAll(area)` (564). Collections (`securityDevices`, `switchingDevices`, `dangerPoints`) müssen vorher bereits geladen sein. + +4) Hibernate/JPA Tuning + - EntityGraphen für selektive Ladepläne; wo JOIN FETCH zu viele Duplikate erzeugt, mehrere zielgerichtete Queries. + - `@BatchSize` auf Collections/Assoziationen, die nicht via JOIN FETCH geladen werden (z. B. 25/50). + - Read-only Transaktionen (falls möglich) und Second-Level-Cache für statische Stammdaten (z. B. Gerätetypen, Hersteller), um Wiederholabfragen zu vermeiden. + +5) Parallelisierung (optional, erst nach Prefetch) + - PDF-Erstellung kann IO-/CPU-lastig sein. Nach dem Prefetch die PDF-Generierung pro Maschine parallelisieren (Thread-Pool, begrenzte Größe). Wichtig: Prefetch zuerst erledigen, nicht mit lazy Proxies in Threads arbeiten (EntityManager ist nicht threadsafe). + +6) Dateiname und I/O + - Bereits ok; Duplikate werden im ZIP abgefedert. Keine DB-Relevanz. + + +## 6) Validierungs- und Messplan +- Metriken vor/nach Umbau: + - Anzahl DB-Statements (Hibernate-Statistiken oder SQL-Log) bei z. B. 1, 10, 50 Maschinen, jeweils mit 3–5 Schutzbereichen inkl. Devices/DangerPoints. + - Gesamtlaufzeit der ZIP-Erstellung. + - Heap/GC-Last (durch größere Prefetch-Graphen) beobachten. +- Zielwerte: + - Reduktion der DB-Roundtrips um >70–90% bei Tickets mit vielen Maschinen/Bereichen. + - Spürbare Reduktion der Laufzeit (>50% je nach Größe). +- Testszenarien: + - Ticket ohne Maschinen (Fehlermeldung bleibt korrekt). + - Ticket mit wenigen Maschinen/Bereichen. + - Ticket mit vielen Maschinen/Bereichen (Worst Case: tiefe Graphen, viele Fragen/Questionaires). + - Regression: `OverviewProtocolController.createOverviewReport` weiterhin performant. + + +## 7) Risiken und Gegenmaßnahmen +- JOIN-FETCH-Cartesian Explosion → Aufteilung in mehrere Queries/Batches; DISTINCT nutzen; ggf. Teilgraph nacheinander laden. +- Speicherverbrauch (große Graphen) → Batch-Laden; evtl. Maschinen in Chunks verarbeiten (z. B. 20 Maschinen pro Durchlauf), PDFs direkt streamen. +- LazyInitializationExceptions bei Parallelisierung → strikt nach Prefetch arbeiten; keine JPA-Entities über Threads hinausreichen, stattdessen DTOs oder detachtes Objektgraph. + + +## 8) Schritt-für-Schritt-Umsetzungsplan (für die folgende PR) +1) Datenzugriffs-Schicht + - Neue Methode im `TicketManager` (oder dedizierter Query-Helper) zum Laden des Protokoll-Graphen (JOIN FETCH/EntityGraph). Distinct und ggf. Query-Splitting. +2) Controller-Anpassungen + - `TicketEditController.createAllProtocolsAsZip` vor der Schleife Prefetch aufrufen (oder schon in `init()` replace `loadByNumber`). + - `ProtocolController.createSecurityAreaPages`/`createAreaTable` – alle `refresh`/`reload*` entfernen und auf Prefetch verlassen. +3) Optional: Übersicht beibehalten + - `OverviewProtocolController` unverändert lassen; dient als Referenz für die Arbeitsweise ohne Reloads. +4) Tuning & Tests + - BatchSize-Annotationen prüfen/ergänzen. Messungen durchführen, Zahlen dokumentieren. +5) Rollout + - Feature-Flag oder schrittweise Aktivierung (erst Prefetch, dann Entfernen der Reloads), um Risiko zu reduzieren. + + +## 9) Akzeptanzkriterien +- Funktional identische PDFs (Inhalt, Benennung) im Vergleich zu vorher. +- DB-Statement-Anzahl bei Tickets mit vielen Maschinen um mindestens 70% reduziert. +- Laufzeit der ZIP-Erstellung signifikant verkürzt (Richtwert: >50% bei größeren Tickets). +- Keine neuen Fehler bei Tickets ohne/mit wenigen Maschinen; Übersichtsdokument bleibt performant. + + +## 10) Referenzen (Dateien/Zeilen) +- Ticket-Editor ZIP: + - `...\TicketEditController.java:175–259`, `init():65–69`, `initializeSelected():71–97` +- ProtocolController: + - `createReportForMachine:259–278`, `createPDFInMemory:125–207`, `createFirstPage:300–394`, + - `createSecurityAreaPages:451–559` (Refresh/Reloads), `createAreaTable:561–613` (erneuter Reload) +- OverviewProtocolController: + - `createOverviewReport:71–88`, `createPDFInMemory:90–147`, + - `addNachlaufMessungen:230–300` (kommentierte Reloads: 247–273), + - `addAnzahlProSchutzeinrichtung:302–367` (kommentierte Reloads: 319–332), + - `addAnzahlInspektionenMaschinen:369–449` (kommentiert: 397–404) + + +— Ende des Assessments — diff --git a/java/mss-failsafe/userManagement/nb-configuration.xml b/java/mss-failsafe/userManagement/nb-configuration.xml deleted file mode 100644 index 2ae0828..0000000 --- a/java/mss-failsafe/userManagement/nb-configuration.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - 1.8-web - WildFly - ide - Facelets - - diff --git a/java/mss-failsafe/userManagement/pom.xml b/java/mss-failsafe/userManagement/pom.xml deleted file mode 100644 index 0c43ca2..0000000 --- a/java/mss-failsafe/userManagement/pom.xml +++ /dev/null @@ -1,127 +0,0 @@ - - - 4.0.0 - - mss-failsafe - plate.software - 1.0-SNAPSHOT - - plate.software - userManagement - 1.0-SNAPSHOT - war - userManagement-1.0-SNAPSHOT - - - 1.8 - 1.8 - ${project.build.directory}/endorsed - UTF-8 - false - 8.0 - - - - - javax - javaee-api - ${jakartaee} - provided - - - org.apache.pdfbox - pdfbox - 2.0.13 - - - org.glassfish.soteria - javax.security.enterprise - 1.0 - - - org.omnifaces - omnifaces - 3.11.1 - - - - javax - javaee-web-api - 8.0 - provided - - - org.glassfish - javax.faces - 2.3.0 - provided - - - org.apache.logging.log4j - log4j-api - 2.14.1 - - - org.apache.logging.log4j - log4j-core - 2.14.1 - - - - org.primefaces - primefaces - 10.0.0 - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - 1.8 - 1.8 - - ${endorsed.dir} - - - - - org.apache.maven.plugins - maven-war-plugin - 2.3 - - false - true - - - - org.apache.maven.plugins - maven-dependency-plugin - 2.6 - - - validate - - copy - - - ${endorsed.dir} - true - - - javax - javaee-api - ${jakartaee} - jar - - - - - - - - - diff --git a/java/mss-failsafe/userManagement/src/main/java/business/user/DemoManager.java b/java/mss-failsafe/userManagement/src/main/java/business/user/DemoManager.java deleted file mode 100644 index 4668387..0000000 --- a/java/mss-failsafe/userManagement/src/main/java/business/user/DemoManager.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package business.user; - -import javax.ejb.EJB; -import javax.ejb.Startup; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Named; - -/** - * - * @author patri - */ -@Named(value = "DemoManager") -@ApplicationScoped -@Startup -public class DemoManager { - - @EJB - PersonManager personManager; - - /** - * Creates a new instance of NewJSFManagedBean - */ - public DemoManager() { - runDemos(); - } - - private void runDemos(){ - personManager.demo(); - } - -} diff --git a/java/mss-failsafe/userManagement/src/main/java/business/user/PasswordManager.java b/java/mss-failsafe/userManagement/src/main/java/business/user/PasswordManager.java deleted file mode 100644 index fa08f23..0000000 --- a/java/mss-failsafe/userManagement/src/main/java/business/user/PasswordManager.java +++ /dev/null @@ -1,174 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package business.user; - -import java.io.Serializable; -import java.security.NoSuchAlgorithmException; -import java.security.SecureRandom; -import java.security.spec.InvalidKeySpecException; -import java.util.Arrays; -import javax.crypto.SecretKey; -import javax.crypto.SecretKeyFactory; -import javax.crypto.spec.PBEKeySpec; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.NoResultException; -import javax.persistence.PersistenceContext; -import javax.persistence.TypedQuery; -import javax.transaction.Transactional; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import model.person.Password; -import model.person.Salt; -import model.person.Person; - -/** - * - * @author Patrick - */ -@Named(value = "passwordManager") -@Stateless -public class PasswordManager implements Serializable { - private static final long serialVersionUID = -4563304131856981259L; - - final static Logger LOGGER = LogManager.getLogger(PasswordManager.class); - - @PersistenceContext(name = "pu_person") - private EntityManager em; - - //private Password password; - private Person user; - - private final int keyLength = 256; - - public byte[] hashPassword(final char[] password, final byte[] salt, final int iterations) { - try { - SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512"); - PBEKeySpec spec = new PBEKeySpec(password, salt, iterations, this.keyLength); - SecretKey key = skf.generateSecret(spec); - //this.password = new Password(this.costumer, key.getEncoded()); - LOGGER.debug("Hash created!"); - return key.getEncoded(); - } catch (NoSuchAlgorithmException | InvalidKeySpecException e) { - LOGGER.error("Failure creating hash for with:" + e); - return null; - //throw new RuntimeException( e ); - } - } - - public byte[] hashPasswordUser(final char[] password, Person user) { - - if (user == null) { - LOGGER.error("Tried to create hash for Nullcostumer!"); - return null; - } - try { - SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512"); - PBEKeySpec spec = new PBEKeySpec(password, user.getSalt().getSalt(), user.getSalt().getInterations(), keyLength); - SecretKey key = skf.generateSecret(spec); - LOGGER.debug("Hash created!"); - return key.getEncoded(); - } catch (NoSuchAlgorithmException | InvalidKeySpecException e) { - LOGGER.error("Failure creating hash for" + user.getEmail() + "with: " + e); - return null; - } - } - - public boolean passwordCheckEmail(final String email, final byte[] password) { - TypedQuery query = em.createNamedQuery(Person.FIND_BY_EMAIL, Person.class); - query.setParameter("email", email); - try { - Person user; - user = query.getSingleResult(); - - boolean equals = Arrays.equals(password, user.getPassword().getPassword()); - - for (int i = 0; i < password.length; i++) { - password[i] = 0; - } - - return equals; - } catch (NoResultException e) { - return false; - } - } - - @Transactional - public boolean passwordCheckCustomer(final Person user, final String password) { - LOGGER.debug("Test " + user.getEmail() + " mit " + password); - byte[] pw = hashPasswordUser(password.toCharArray(), user); - - boolean equals = Arrays.equals(pw, user.getPassword().getPassword()); - - for (int i = 0; i < pw.length; i++) { - pw[i] = 0; - } - - return equals; - - } - - public boolean changePassword(Person user, String newPassword, String oldPassword) { - if (user == null) { - LOGGER.error("Nullcostumer tried to change Password"); - return false; - } - - if(passwordCheckCustomer(user, oldPassword)){ - user.getPassword().setPassowrd(hashPasswordUser(newPassword.toCharArray(), user)); - LOGGER.info("Password changed for " + user.getEmail()); - } else { - return false; - } - - try { - em.persist(user); - LOGGER.info("Password changed for " + user.getEmail()); - return true; - } catch (Exception e) { - LOGGER.error("Couldn't save new password to " + user.getEmail() + " with: " + e.toString()); - return false; - } - } - - public byte[] generateRandomPassword() { - SecureRandom random = new SecureRandom(); - byte bytes[] = new byte[20]; - random.nextBytes(bytes); - return bytes; - } - - public Password gerateNewRandomPasswordClass(Person user){ - Salt salt = user.getSalt(); - String pass = Arrays.toString(generateRandomPassword()); - return new Password(user, hashPassword(pass.toCharArray(), salt.getSalt(), salt.getInterations())); - } - - public byte[] hashToken(String token){ - try { - SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256"); - byte[] test = "SuperTestSalz".getBytes(); - PBEKeySpec spec = new PBEKeySpec(token.toCharArray(), test, 200, this.keyLength); - SecretKey key = skf.generateSecret(spec); - LOGGER.debug("TokenHash created!"); - return key.getEncoded(); - } catch (NoSuchAlgorithmException | InvalidKeySpecException e) { - LOGGER.error("Failure creating tokenhash for " + token + " with: " + e); - return null; - } - } - - public Person getUser() { - return user; - } - - public void setUser(Person user) { - this.user = user; - } -} diff --git a/java/mss-failsafe/userManagement/src/main/java/business/user/PersonManager.java b/java/mss-failsafe/userManagement/src/main/java/business/user/PersonManager.java deleted file mode 100644 index c826c66..0000000 --- a/java/mss-failsafe/userManagement/src/main/java/business/user/PersonManager.java +++ /dev/null @@ -1,229 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package business.user; - -import java.io.Serializable; -import java.time.Instant; -import java.util.Optional; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.inject.Inject; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.PersistenceContextType; -import javax.transaction.Transactional; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import controller.person.PersonController; -import exception.InvalidEmailException; -import exception.InvalidPasswordException; -import exception.PersonInaktiveException; -import java.util.HashSet; -import java.util.Set; -import model.person.Salt; -import model.person.enums.TokenType; -import model.person.Person; -import model.person.enums.UserGroup; - -/** - * - * @author Patrick - */ -@Named -@Stateless -public class PersonManager implements Serializable { - - private static final long serialVersionUID = -6581582446436303658L; - - final static Logger LOGGER = LogManager.getLogger(PersonManager.class); - - @EJB - private PasswordManager passwordManager; - - @Inject - private PersonController userController; - - @PersistenceContext(name = "pu_person", type = PersistenceContextType.EXTENDED) - private EntityManager em; - - @Transactional - public void demo() { - Salt salt = new Salt(); - Salt salt2 = new Salt(); - Salt salt3 = new Salt(); - - Set groupUser = new HashSet<>(); - groupUser.add(UserGroup.USER); - - Set adminUser = new HashSet<>(); - adminUser.add(UserGroup.ADMIN); - - Person test = new Person( - "user@test.de", - (passwordManager.hashPassword("test".toCharArray(), salt.getSalt(), salt.getInterations())), - salt, - groupUser - ); - - test.setFirstname("User"); - test.setLastname("Nachname"); - test.setMobile("0124584589"); - test.setFax("3445565675"); - test.setTelefon("042154585"); - test.setActive(true); - em.persist(test); - - Person testAdmin = new Person( - "admin@test.de", - (passwordManager.hashPassword("admin".toCharArray(), salt2.getSalt(), salt2.getInterations())), - salt2, - adminUser - ); - - testAdmin.setFirstname("Admin"); - testAdmin.setLastname("Administratori"); - testAdmin.setMobile("0124584589"); - testAdmin.setFax("3445565675"); - testAdmin.setTelefon("042154585"); - testAdmin.setActive(true); - em.persist(testAdmin); - - Person testInactive = new Person( - "inaktive@test.de", - (passwordManager.hashPassword("test".toCharArray(), salt3.getSalt(), salt3.getInterations())), - salt3, - groupUser - ); - - testInactive.setFirstname("Admin"); - testInactive.setLastname("Administratori"); - testInactive.setMobile("0124584589"); - testInactive.setFax("3445565675"); - testInactive.setTelefon("042154585"); - testInactive.setActive(false); - em.persist(testInactive); - } - - @Transactional - public Person load(Person user) { - try { - Person loaded = this.em.find(Person.class, user.getId()); - LOGGER.info(loaded); - - return loaded; - } catch (Exception e) { - LOGGER.error("Error", e); - return null; - } - } - - @Transactional - public Person getActiveUser() { - try { - Person user = em.find(Person.class, userController.getActiveUser().getId()); - return user; - } catch (Exception e) { - LOGGER.error("couldn't load user: " + e); - return null; - } - } - - @Transactional - public Person getPlainActiveUser() { - try { - Person user = em.find(Person.class, userController.getActiveUser().getId()); - return user; - } catch (Exception e) { - LOGGER.error("couldn't load user: " + e); - return null; - } - } - - public Optional getByEmail(String email) { - try { - Person person = this.em.createNamedQuery(Person.FIND_BY_EMAIL, Person.class) - .setParameter("email", email).getSingleResult(); - - if (person != null) { - person.getUserGroups().size(); - } - - return Optional.of(person); - } catch (Exception e) { - return Optional.empty(); - } - } - - public Optional getByLoginToken(String loginToken, TokenType tokenType) { - Optional optional; - try { - - optional = Optional.of(this.em.createNamedQuery(Person.FIND_BY_TOKEN, Person.class) - .setParameter("tokenHash", this.passwordManager.hashToken(loginToken)) - .setParameter("tokenType", tokenType) - .setParameter("timestamp", Instant.now()) - .getSingleResult() - ); - return optional; - } catch (Exception e) { - return Optional.empty(); - } - } - - public Person getByEmailAndPassword(String email, String password) { - Person managedUser = getByEmail(email).orElseThrow(InvalidEmailException::new); - LOGGER.debug("Loaded " + managedUser.getEmail()); - if (!passwordManager.passwordCheckCustomer(managedUser, password)) { - throw new InvalidPasswordException(); - } - if (!managedUser.isActive()) { - throw new PersonInaktiveException(); - } - userController.setActiveUser(managedUser); - return managedUser; - } - - @Transactional - public boolean save(Person user) { - if (user == null) { - LOGGER.error("Tried to save null or Nullcustomer"); - return false; - } - try { - if (user.getId() != null && user.getId() > 0) { - em.merge(user); - } else { - em.persist(user); - } - LOGGER.info("Saved " + user.getEmail()); - return true; - } catch (Exception e) { - LOGGER.error("Tried to save " + user.getEmail() + " with error: " + e); - return false; - } - } - - public void refresh(Person user) { - if (user == null) { - LOGGER.error("Tried to save null or Nullcustomer"); - return; - } - - try { - em.refresh(user); - } catch (Exception e) { - LOGGER.error("Tried to refresh " + user.getEmail() + " with error: " + e); - } - } - - public String resetPassword() { - //TODO - return null; - } -} diff --git a/java/mss-failsafe/userManagement/src/main/java/business/user/TokenManager.java b/java/mss-failsafe/userManagement/src/main/java/business/user/TokenManager.java deleted file mode 100644 index 677a71b..0000000 --- a/java/mss-failsafe/userManagement/src/main/java/business/user/TokenManager.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package business.user; - -import java.time.Instant; -import static java.time.temporal.ChronoUnit.DAYS; -import static java.util.UUID.randomUUID; -import javax.ejb.Stateless; -import javax.inject.Inject; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; - -import exception.InvalidEmailException; -import model.person.Token; -import model.person.enums.TokenType; -import model.person.Person; - -import java.util.Arrays; -import static java.time.Instant.now; - -/** - * - * @author Patrick - */ -@Stateless -public class TokenManager { - - @PersistenceContext(name = "pu_person") - private EntityManager em; - - @Inject - PasswordManager passwordManager; - - @Inject - PersonManager customerManager; - - public String generate(final String email, final String ipAddress, final String description, - final TokenType tokenType) { - - String rawToken = randomUUID().toString(); - Instant expiration = now().plus(14, DAYS); - - save(rawToken, email, ipAddress, description, tokenType, expiration); - - return rawToken; - } - - public String generateFileToken(final String email, final String description) { - - String rawToken = randomUUID().toString(); - Instant expiration = now().plus(3, DAYS); - - save(rawToken, email, null, description, TokenType.FILE, expiration); - - return rawToken; - } - - public void save(final String rawToken, final String email, final String ipAddress, - final String description, final TokenType tokenType, final Instant expiration) { - - Person user = this.customerManager.getByEmail(email) - .orElseThrow(InvalidEmailException::new); - - Token token = new Token(); - - token.setTokenHash(Arrays.toString(this.passwordManager.hashToken(rawToken))); - token.setExpiration(expiration); - token.setDescription(description); - token.setTokenType(tokenType); - token.setIpAddress(ipAddress); - - user.addToken(token); - - this.em.persist(user); - } - - public void remove(String token) { - this.em.createNamedQuery(Token.REMOVE_TOKEN) - .setParameter("tokenHash", token).executeUpdate(); - } - - public void removeExpired() { - - this.em.createNamedQuery(Token.REMOVE_EXPIRED_TOKEN) - .setParameter("timestamp", Instant.now()) - .executeUpdate(); - } -} diff --git a/java/mss-failsafe/userManagement/src/main/java/controller/AbstractController.java b/java/mss-failsafe/userManagement/src/main/java/controller/AbstractController.java deleted file mode 100644 index 5b04e75..0000000 --- a/java/mss-failsafe/userManagement/src/main/java/controller/AbstractController.java +++ /dev/null @@ -1,53 +0,0 @@ -package controller; -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ - - -import java.io.Serializable; -import javax.faces.application.FacesMessage; -import javax.faces.context.FacesContext; - -/** - * - * @author Patrick - */ -public abstract class AbstractController implements Serializable{ - private static final long serialVersionUID = -5908716187853409719L; - - protected void sendInfoMessage(String title, String message){ - FacesMessage facesMessage = new FacesMessage( - FacesMessage.SEVERITY_INFO, title, message); - addMessage(facesMessage); - } - - protected void sendWarnMessage(String title, String message){ - FacesMessage facesMessage = new FacesMessage( - FacesMessage.SEVERITY_WARN, title, message); - addMessage(facesMessage); - } - - protected void sendErrorMessage(String title, String message){ - FacesMessage facesMessage = new FacesMessage( - FacesMessage.SEVERITY_ERROR, title, message); - addMessage(facesMessage); - } - - protected void sendFatalMessage(String title, String message){ - FacesMessage facesMessage = new FacesMessage( - FacesMessage.SEVERITY_FATAL, title, message); - addMessage(facesMessage); - } - - private void addMessage(FacesMessage message) { - FacesContext.getCurrentInstance().addMessage(null, message); - } - - protected void errorMessage() { - String title = "Fehler!"; - String info = "Es ist ein Fehler aufgetreten, bitte versuchen Sie es erneut!"; - sendErrorMessage(title, info); - } -} diff --git a/java/mss-failsafe/userManagement/src/main/java/controller/person/PersonController.java b/java/mss-failsafe/userManagement/src/main/java/controller/person/PersonController.java deleted file mode 100644 index 5642f07..0000000 --- a/java/mss-failsafe/userManagement/src/main/java/controller/person/PersonController.java +++ /dev/null @@ -1,173 +0,0 @@ -package controller.person; - -import javax.enterprise.context.SessionScoped; -import javax.faces.context.FacesContext; -import javax.inject.Inject; -import javax.inject.Named; -import javax.security.enterprise.AuthenticationStatus; -import javax.security.enterprise.SecurityContext; -import javax.security.enterprise.credential.Password; -import javax.security.enterprise.credential.UsernamePasswordCredential; -import javax.servlet.http.HttpSession; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import controller.AbstractController; -import exception.InvalidEmailException; -import exception.InvalidPasswordException; -import exception.PersonInaktiveException; -import httpauthenticationmechanism.ManagedPerson; -import model.person.Person; - -import static javax.security.enterprise.AuthenticationStatus.SEND_FAILURE; -import static javax.security.enterprise.AuthenticationStatus.SUCCESS; - -import java.io.Serializable; -import java.util.Set; -import static javax.security.enterprise.authentication.mechanism.http.AuthenticationParameters.withParams; -import model.person.enums.UserGroup; -import org.omnifaces.cdi.Param; -import static org.omnifaces.util.Faces.getRequest; -import static org.omnifaces.util.Faces.getResponse; -import static org.omnifaces.util.Faces.redirect; - -/** - * - * @author Patrick - */ -@Named -@SessionScoped -public class PersonController extends AbstractController implements Serializable { - - private static final long serialVersionUID = -2257766986862616262L; - final static Logger LOGGER = LogManager.getLogger(PersonController.class); - private String username; - private String password; - private boolean rememberMe = false; - - @Inject - SecurityContext securityContext; - - @Inject - ManagedPerson managedPerson; - - @Param(name = "continue") // Defined in @LoginToContinue of SecurityFormAuthenticationMechanism - private boolean loginToContinue; - - private Person activePerson; - - public PersonController() { - - } - - public String submit() { - - try { - // credential that want to be validate was UsernamePasswordCredential - UsernamePasswordCredential credential = new UsernamePasswordCredential(username, new Password(password)); - - // this will call our security configuration to authorize the user - AuthenticationStatus status = securityContext.authenticate( - getRequest(), - getResponse(), - withParams() - .credential(credential) - .newAuthentication(!loginToContinue) - .rememberMe(rememberMe) - ); - - // When logged in choose the right page by class. When more then one group - // fits then the higher order is used - if (status.equals(SUCCESS)) { - managedPerson.addLogin(username); - - FacesContext facesContext = FacesContext.getCurrentInstance(); - HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true); - session.setAttribute("user", this); - session.setAttribute("realUsername", username); - - if (securityContext.isCallerInRole(UserGroup.ADMIN.toString())) { - LOGGER.info("Login succesfull " + username + " with role: ADMIN"); - return "admin/welcome.xhtml?faces-redirect=true"; - } - - if (securityContext.isCallerInRole(UserGroup.USER.toString())) { - LOGGER.info("Login succesfull " + username + " with role: USER"); - return "user/welcome.xhtml?faces-redirect=true"; - } - - if (securityContext.isCallerInRole(UserGroup.CUSTOMER.toString())) { - LOGGER.info("Login succesfull " + username + " with role: USER"); - return "customer/welcome.xhtml?faces-redirect=true"; - } - - redirect("index.xhtml"); - - } else if (status.equals(SEND_FAILURE)) { - - sendErrorMessage("Fehler!", "Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut!."); - return ""; - } - } catch (InvalidPasswordException | InvalidEmailException e) { - LOGGER.info("Wrong Email or Password: " + username); - sendErrorMessage("Fehler!", "Falsche Email oder Passwort!"); - return ""; - } catch (PersonInaktiveException p){ - sendErrorMessage("Fehler!", " Ihr Konto ist inatkiv. Bitte wenden Sie sich an den Administator."); - return ""; - } catch (Exception e) { - LOGGER.error("Login error with " + e); - sendErrorMessage("Fehler!", "Ein Fehler ist aufgetreten, bitte versuchen Sie es erneut!"); - return ""; - } - return ""; - } - - public String logout() { - LOGGER.info("User is logging out: " + username); - try { - FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); - } catch (Exception e) { - LOGGER.error("couldn't logout " + username + "with:" + e); - } - - return "index.xhtml?faces-redirect=true"; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public boolean isRememberMe() { - return rememberMe; - } - - public void setRememberMe(boolean rememberMe) { - this.rememberMe = rememberMe; - } - - public Person getActiveUser() { - return activePerson; - } - - public void setActiveUser(Person activeUser) { - this.activePerson = activeUser; - } - - public Set getLogins() { - return managedPerson.getLogins(); - } -} diff --git a/java/mss-failsafe/userManagement/src/main/java/exception/AbstractBusinessException.java b/java/mss-failsafe/userManagement/src/main/java/exception/AbstractBusinessException.java deleted file mode 100644 index 8cbb7e2..0000000 --- a/java/mss-failsafe/userManagement/src/main/java/exception/AbstractBusinessException.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package exception; - -import javax.ejb.ApplicationException; - -/** - * - * @author Patrick - */ -@ApplicationException(rollback = true) -public abstract class AbstractBusinessException extends RuntimeException { -} - diff --git a/java/mss-failsafe/userManagement/src/main/java/exception/InvalidCredentialException.java b/java/mss-failsafe/userManagement/src/main/java/exception/InvalidCredentialException.java deleted file mode 100644 index a851022..0000000 --- a/java/mss-failsafe/userManagement/src/main/java/exception/InvalidCredentialException.java +++ /dev/null @@ -1,14 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package exception; - -/** - * - * @author Patrick - */ -public class InvalidCredentialException extends AbstractBusinessException{ - -} diff --git a/java/mss-failsafe/userManagement/src/main/java/exception/InvalidEmailException.java b/java/mss-failsafe/userManagement/src/main/java/exception/InvalidEmailException.java deleted file mode 100644 index 13bea8f..0000000 --- a/java/mss-failsafe/userManagement/src/main/java/exception/InvalidEmailException.java +++ /dev/null @@ -1,13 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package exception; - -/** - * - * @author Patrick - */ -public class InvalidEmailException extends AbstractBusinessException { -} diff --git a/java/mss-failsafe/userManagement/src/main/java/exception/InvalidPasswordException.java b/java/mss-failsafe/userManagement/src/main/java/exception/InvalidPasswordException.java deleted file mode 100644 index d1a662b..0000000 --- a/java/mss-failsafe/userManagement/src/main/java/exception/InvalidPasswordException.java +++ /dev/null @@ -1,14 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package exception; - -/** - * - * @author Patrick - */ -public class InvalidPasswordException extends AbstractBusinessException { - -} diff --git a/java/mss-failsafe/userManagement/src/main/java/httpauthenticationmechanism/AppIdentityStore.java b/java/mss-failsafe/userManagement/src/main/java/httpauthenticationmechanism/AppIdentityStore.java deleted file mode 100644 index 7c4cbb7..0000000 --- a/java/mss-failsafe/userManagement/src/main/java/httpauthenticationmechanism/AppIdentityStore.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package httpauthenticationmechanism; - -import javax.enterprise.context.ApplicationScoped; -import javax.security.enterprise.credential.CallerOnlyCredential; -import javax.security.enterprise.credential.Credential; -import javax.security.enterprise.credential.UsernamePasswordCredential; -import javax.security.enterprise.identitystore.CredentialValidationResult; -import static javax.security.enterprise.identitystore.CredentialValidationResult.INVALID_RESULT; -import static javax.security.enterprise.identitystore.CredentialValidationResult.NOT_VALIDATED_RESULT; -import javax.security.enterprise.identitystore.IdentityStore; - -import business.user.PersonManager; -import exception.InvalidCredentialException; -import exception.PersonInaktiveException; -import java.util.Set; -import java.util.stream.Collectors; -import javax.ejb.EJB; -import model.person.Person; - -/** - * - * @author Patrick - */ -@ApplicationScoped -public class AppIdentityStore implements IdentityStore { - - @EJB - PersonManager userManager; - - @Override - public int priority() { - return 90; - } - - @Override - public CredentialValidationResult validate(Credential credential) { - try { - - // check if the credential was UsernamePasswordCredential - if (credential instanceof UsernamePasswordCredential) { - String username = ((UsernamePasswordCredential) credential).getCaller(); - String password = ((UsernamePasswordCredential) credential).getPasswordAsString(); - - return validate(this.userManager.getByEmailAndPassword(username, password)); - } - - // check if the credential was CallerOnlyCredential - if (credential instanceof CallerOnlyCredential) { - String username = ((CallerOnlyCredential) credential).getCaller(); - - return validate( - this.userManager.getByEmail(username) - .orElseThrow(InvalidCredentialException::new) - ); - } - - } catch (InvalidCredentialException e) { - return INVALID_RESULT; - } - return NOT_VALIDATED_RESULT; - } - - private CredentialValidationResult validate(Person person) { - Set groups; - - groups = person.getUserGroups().stream() - .map(gr -> gr.toString()) - .collect(Collectors.toSet()); - - return new CredentialValidationResult(person.getEmail(), groups); - } - -} diff --git a/java/mss-failsafe/userManagement/src/main/java/httpauthenticationmechanism/AppRememberMeIdentityStore.java b/java/mss-failsafe/userManagement/src/main/java/httpauthenticationmechanism/AppRememberMeIdentityStore.java deleted file mode 100644 index b97978e..0000000 --- a/java/mss-failsafe/userManagement/src/main/java/httpauthenticationmechanism/AppRememberMeIdentityStore.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package httpauthenticationmechanism; - -import static javax.security.enterprise.identitystore.CredentialValidationResult.INVALID_RESULT; - -import java.util.Optional; -import java.util.Set; -import javax.ejb.EJB; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; -import javax.security.enterprise.CallerPrincipal; -import javax.security.enterprise.credential.RememberMeCredential; -import javax.security.enterprise.identitystore.CredentialValidationResult; -import javax.security.enterprise.identitystore.RememberMeIdentityStore; -import javax.servlet.http.HttpServletRequest; - -import business.user.TokenManager; -import business.user.PersonManager; -import model.person.Person; -import static model.person.enums.TokenType.REMEMBER_ME; - -/** - * - * @author Patrick - */ -@ApplicationScoped -public class AppRememberMeIdentityStore implements RememberMeIdentityStore { - @Inject - HttpServletRequest request; - - @EJB - PersonManager userManager; - - @EJB - TokenManager tokenManager; - - @Override - public CredentialValidationResult validate(RememberMeCredential rmc) { - Optional user = this.userManager.getByLoginToken(rmc.getToken(), REMEMBER_ME); - - if (user.isPresent()) { - return new CredentialValidationResult(user.get().getEmail()); - } else { - return INVALID_RESULT; - } - } - - @Override - public String generateLoginToken(CallerPrincipal cp, Set set) { - return this.tokenManager.generate(cp.getName(), getRemoteAddr(request), getDescription(), REMEMBER_ME); - } - - @Override - public void removeLoginToken(String string) { - this.tokenManager.remove(string); - } - - private String getRemoteAddr(HttpServletRequest request){ - return request.getRemoteAddr(); - } - - private String getDescription() { - return "Remember me session: " + this.request.getHeader("User-Agent"); - } -} diff --git a/java/mss-failsafe/userManagement/src/main/java/httpauthenticationmechanism/LogoutListener.java b/java/mss-failsafe/userManagement/src/main/java/httpauthenticationmechanism/LogoutListener.java deleted file mode 100644 index 088d77e..0000000 --- a/java/mss-failsafe/userManagement/src/main/java/httpauthenticationmechanism/LogoutListener.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package httpauthenticationmechanism; - -import javax.servlet.annotation.WebListener; -import javax.servlet.http.HttpSessionEvent; -import javax.servlet.http.HttpSessionListener; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import controller.person.PersonController; - - -/** - * - * @author Patrick - */ -@WebListener -public class LogoutListener implements HttpSessionListener{ - final static Logger LOGGER = LogManager.getLogger(LogoutListener.class); - - @Override - public void sessionCreated(HttpSessionEvent event) { - // NOOP. - } - - @Override - public void sessionDestroyed(HttpSessionEvent event) { - LOGGER.info("Session destroyed"); - PersonController userManager = (PersonController) event.getSession().getAttribute("user"); - String username = (String) event.getSession().getAttribute("realUsername"); - if (userManager != null && username != null) { - LOGGER.info("not nulls"); - userManager.getLogins().remove(username); - } - } -} diff --git a/java/mss-failsafe/userManagement/src/main/java/httpauthenticationmechanism/ManagedPerson.java b/java/mss-failsafe/userManagement/src/main/java/httpauthenticationmechanism/ManagedPerson.java deleted file mode 100644 index 8cf9081..0000000 --- a/java/mss-failsafe/userManagement/src/main/java/httpauthenticationmechanism/ManagedPerson.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package httpauthenticationmechanism; - -import java.util.HashSet; -import java.util.Set; -import javax.inject.Named; -import javax.enterprise.context.ApplicationScoped; - -/** - * - * @author Patrick - */ -@Named(value = "managedPerson") -@ApplicationScoped -public class ManagedPerson { - - private Set logins; - - /** - * Creates a new instance of ManagedCustomer - */ - public ManagedPerson() { - } - - public Set getLogins(){ - if (this.logins == null) { - this.logins = new HashSet<>(); - } - - return this.logins; - } - - public void addLogin(String user){ - getLogins().add(user); - } - - public void removeLogin(String user){ - getLogins().remove(user); - } - -} diff --git a/java/mss-failsafe/userManagement/src/main/java/model/AbstractEntity.java b/java/mss-failsafe/userManagement/src/main/java/model/AbstractEntity.java deleted file mode 100644 index c61176a..0000000 --- a/java/mss-failsafe/userManagement/src/main/java/model/AbstractEntity.java +++ /dev/null @@ -1,89 +0,0 @@ -package model; - - -import java.io.Serializable; -import java.time.LocalDateTime; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.MappedSuperclass; - -/** - * - * @author Patrick Plate - */ -@MappedSuperclass -public class AbstractEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - private LocalDateTime changedDate; - - private LocalDateTime creationDate; - - private boolean outdated; - - public AbstractEntity() { - this.creationDate = LocalDateTime.now(); - this.changedDate = this.creationDate; - this.outdated = false; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - @Override - public int hashCode() { - int hash = 0; - hash += (id != null ? id.hashCode() : 0); - return hash; - } - - @Override - public boolean equals(Object object) { - if (object == null) { - return false; - } - if (!(object.getClass() == this.getClass())) { - return false; - } - AbstractEntity other = (AbstractEntity) object; - if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { - return false; - } - return true; - } - - public boolean isOutdated() { - return outdated; - } - - public void setOutdated(boolean outdated) { - this.outdated = outdated; - } - - public LocalDateTime getChangedDate() { - return changedDate; - } - - public void setChangedDate(LocalDateTime changedDate) { - this.changedDate = changedDate; - } - - public void setCreationDate (LocalDateTime creationDate) { - this.creationDate = creationDate; - } - - public LocalDateTime getCreationDate() { - return creationDate; - } -} diff --git a/java/mss-failsafe/userManagement/src/main/java/model/person/Password.java b/java/mss-failsafe/userManagement/src/main/java/model/person/Password.java deleted file mode 100644 index d784e91..0000000 --- a/java/mss-failsafe/userManagement/src/main/java/model/person/Password.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package model.person; - -import java.util.Arrays; -import java.util.Objects; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.OneToOne; - -import model.AbstractEntity; - -/** - * - * @author Patrick - */ -@Entity -@NamedQueries({ - @NamedQuery(name = "Password.findByPassword", - query = "SELECT p FROM Password p WHERE p.password = :password"), - @NamedQuery(name = "Password.findByCostumerID", - query = "SELECT p FROM Password p WHERE p.person = :person") -}) -public class Password extends AbstractEntity { - private static final long serialVersionUID = -1924150926160449302L; - - @OneToOne - private Person person; - - @Column(name="password") - private byte[] password; - - public Password() { - } - - public Password (Person person, byte[] password) { - this.person = person; - this.password = password; - } - - public Person getPerson() { - return person; - } - - public byte[] getPassword() { - return password; - } - - public void setPassowrd(byte[] password){ - this.password = password; - } - - @Override - public int hashCode() { - int hash = 3; - hash = 79 * hash + Objects.hashCode(this.person); - hash = 79 * hash + Arrays.hashCode(this.password); - return hash; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final Password other = (Password) obj; - if (!Objects.equals(this.person, other.person)) { - return false; - } - if (!Arrays.equals(this.password, other.password)) { - return false; - } - return true; - } -} diff --git a/java/mss-failsafe/userManagement/src/main/java/model/person/Person.java b/java/mss-failsafe/userManagement/src/main/java/model/person/Person.java deleted file mode 100644 index d5db1e2..0000000 --- a/java/mss-failsafe/userManagement/src/main/java/model/person/Person.java +++ /dev/null @@ -1,215 +0,0 @@ -package model.person; - -import model.person.enums.Call; -import java.io.Serializable; -import java.util.AbstractSet; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import javax.persistence.*; - -import model.AbstractEntity; -import model.person.enums.UserGroup; - -/** - * Entity implementation class for Entity: User - * - */ -@Entity -@Inheritance(strategy = InheritanceType.JOINED) -@NamedQueries({ - @NamedQuery(name = Person.FIND_BY_EMAIL, - query = "SELECT p FROM Person p WHERE p.email = :email"), - @NamedQuery(name = Person.FIND_BY_ID, - query = "SELECT p FROM Person p WHERE p.id = :id"), - @NamedQuery(name = Person.FIND_BY_TOKEN, - query = "SELECT p FROM Person p inner join p.tokens t where t.tokenHash = :tokenHash and t.tokenType = :tokenType and t.expiration > :timestamp") -}) -public class Person extends AbstractEntity implements Serializable { - - public static final String FIND_BY_EMAIL = "Person.findByEmail"; - public static final String FIND_BY_ID = "Person.findByID"; - public static final String FIND_BY_TOKEN = "Person.findByToken"; - - private static final long serialVersionUID = 1L; - - @Column(name = "Email", unique = true, nullable = false) - private String email; - - @OneToOne(cascade = CascadeType.ALL) - @JoinColumn(name = "Password_ID", nullable = false, unique = true) - private Password password; - - @OneToOne(cascade = CascadeType.ALL) - @JoinColumn(name = "Salt_ID", nullable = false, unique = true) - private Salt salt; - - @Enumerated(EnumType.STRING) - @Column(name = "Anrede") - private Call call; - - @OneToMany(mappedBy = "person", orphanRemoval = true, cascade = CascadeType.ALL) - private List tokens; - - @ElementCollection(targetClass = UserGroup.class) - @Enumerated(EnumType.STRING) - @JoinTable(name = "UserGroups", joinColumns = @JoinColumn(name = "UserID")) - @Column(name = "UserGroups", nullable = false) - private Set userGroups; - - @Column(nullable = true) - private String telefon; - - @Column(nullable = true) - private String mobile; - - @Column(nullable = true) - private String fax; - - @Column(nullable = false) - private String firstname; - - @Column(nullable = true) - private String lastname; - - @Column(nullable = true) - private String title; - - @Column(nullable = true) - private boolean active; - - public Person() { - super(); - active = false; - } - - public Person(String email, byte[] password, Salt salt, Set usergroups) { - this.email = email; - this.tokens = new ArrayList<>(); - this.salt = salt; - this.password = new Password(this, password); - this.userGroups = usergroups; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public Password getPassword() { - return password; - } - - public void setPassword(Password password) { - this.password = password; - } - - public Salt getSalt() { - return salt; - } - - public void setSalt(Salt salt) { - this.salt = salt; - } - - public Call getCall() { - return call; - } - - public void setCall(Call call) { - this.call = call; - } - - public String getTelefon() { - return telefon; - } - - public void setTelefon(String telefon) { - this.telefon = telefon; - } - - public String getMobile() { - return mobile; - } - - public void setMobile(String mobile) { - this.mobile = mobile; - } - - public String getFax() { - return fax; - } - - public void setFax(String fax) { - this.fax = fax; - } - - public String getFirstname() { - return firstname; - } - - public void setFirstname(String firstname) { - this.firstname = firstname; - } - - public String getLastname() { - return lastname; - } - - public void setLastname(String lastname) { - this.lastname = lastname; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public List getTokens() { - return tokens; - } - - public void setTokens(List tokens) { - this.tokens = tokens; - } - - public void addToken(Token token) { - if (this.tokens == null) { - tokens = new ArrayList<>(); - } - - tokens.add(token); - } - - public Set getUserGroups() { - return userGroups; - } - - public void setUserGroups(Set userGroups) { - this.userGroups = userGroups; - } - - public void addGroup(UserGroup userGroup){ - if (this.userGroups == null) { - this.userGroups = new HashSet<>(); - } - - this.userGroups.add(userGroup); - } - - public boolean isActive() { - return active; - } - - public void setActive(boolean active) { - this.active = active; - } -} diff --git a/java/mss-failsafe/userManagement/src/main/java/model/person/Salt.java b/java/mss-failsafe/userManagement/src/main/java/model/person/Salt.java deleted file mode 100644 index 1a99251..0000000 --- a/java/mss-failsafe/userManagement/src/main/java/model/person/Salt.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package model.person; - -//import java.nio.charset.Charset; -import java.security.SecureRandom; -import java.util.Arrays; -import javax.persistence.Entity; - -import model.AbstractEntity; - -/** - * - * @author Patrick - */ -@Entity -public class Salt extends AbstractEntity { - - //private final Charset UTF8_CHARSET = Charset.forName("UTF-8"); - private static final long serialVersionUID = -1068077226987746862L; - private byte[] salt; - private int interations; - - public Salt() { - interations = 3072; - generateSalt(); - } - - private void generateSalt() { - SecureRandom random = new SecureRandom(); - byte bytes[] = new byte[64]; - random.nextBytes(bytes); - salt = bytes; - } - - public java.lang.String bytetoString(byte[] input) { - return Arrays.toString(input); - } - - public byte[] getSalt() { - return salt; - } - - public int getInterations() { - return interations; - } - - @Override - public int hashCode() { - int hash = 7; - hash = 79 * hash + Arrays.hashCode(this.salt); - hash = 79 * hash + this.interations; - return hash; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final Salt other = (Salt) obj; - if (this.interations != other.interations) { - return false; - } - if (!Arrays.equals(this.salt, other.salt)) { - return false; - } - return true; - } -} diff --git a/java/mss-failsafe/userManagement/src/main/java/model/person/Token.java b/java/mss-failsafe/userManagement/src/main/java/model/person/Token.java deleted file mode 100644 index bb21f45..0000000 --- a/java/mss-failsafe/userManagement/src/main/java/model/person/Token.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package model.person; - -import model.person.enums.TokenType; -import static java.time.temporal.ChronoUnit.MONTHS; -import java.time.Instant; -import java.util.Objects; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.FetchType; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.PrePersist; -import javax.persistence.Table; -import javax.persistence.UniqueConstraint; -import model.AbstractEntity; - -/** - * - * @author Patrick - */ -@Entity -@Table(name = "token", uniqueConstraints = { - @UniqueConstraint(columnNames = {"token_hash"}) -}) -@NamedQueries({ - @NamedQuery(name = Token.REMOVE_TOKEN, query = "DELETE FROM Token t where t.tokenHash = :tokenHash"), - @NamedQuery(name = Token.REMOVE_EXPIRED_TOKEN, query = "DELETE FROM Token t where t.expiration < :timestamp") -}) -public class Token extends AbstractEntity { - - private static final long serialVersionUID = -6632692800064453512L; - public static final String REMOVE_TOKEN = "Token.removeToken"; - public static final String REMOVE_EXPIRED_TOKEN = "Token.removeExpiredToken"; - - @Column(name = "token_hash") - private String tokenHash; - - @Column(name = "token_type") - @Enumerated(EnumType.STRING) - private TokenType tokenType; - - @Column(name = "ip_address", length = 45) - private String ipAddress; - - private String description; - - private Instant created; - - private Instant expiration; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "account_id") - private Person person; - - public Token() { - } - - @PrePersist - public void generateInformation() { - this.created = Instant.now(); - if (this.expiration == null) { - this.expiration = this.created.plus(1, MONTHS); - } - } - - public String getTokenHash() { - return tokenHash; - } - - public void setTokenHash(String tokenHash) { - this.tokenHash = tokenHash; - } - - public TokenType getTokenType() { - return tokenType; - } - - public void setTokenType(TokenType tokenType) { - this.tokenType = tokenType; - } - - public String getIpAddress() { - return ipAddress; - } - - public void setIpAddress(String ipAddress) { - this.ipAddress = ipAddress; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public Instant getCreated() { - return created; - } - - public void setCreated(Instant created) { - this.created = created; - } - - public Instant getExpiration() { - return expiration; - } - - public void setExpiration(Instant expiration) { - this.expiration = expiration; - } - - public Person getPerson() { - return person; - } - - public void setPerson(Person person) { - this.person = person; - } - - /* don't depend on natural identifier for equality checks, see: https://vladmihalcea.com/2017/03/29/the-best-way-to-map-a-onetomany-association-with-jpa-and-hibernate/#more-7143 */ - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null || getClass() != obj.getClass()) { - return false; - } - Token token = (Token) obj; - return Objects.equals(getId(), token.getId()); - } - - @Override - public int hashCode() { - return Objects.hash(getId()); - } - - @Override - public String toString() { - return "Token{ id " + getId() + '}'; - } -} diff --git a/java/mss-failsafe/userManagement/src/main/java/model/person/enums/Call.java b/java/mss-failsafe/userManagement/src/main/java/model/person/enums/Call.java deleted file mode 100644 index b190dbc..0000000 --- a/java/mss-failsafe/userManagement/src/main/java/model/person/enums/Call.java +++ /dev/null @@ -1,56 +0,0 @@ -package model.person.enums; - -import java.util.Locale; - -public enum Call { - HERR(0), FRAU(1), DIVERS(2), UNBESTIMMT(3); - - private final int type; - private Locale locale = null; - - private Call(int type) { - this.type = type; - } - - public Locale getLocale() { - return locale; - } - - public void setLocale(Locale locale) { - this.locale = locale; - } - - public int getType() { - return type; - } - - @Override - public String toString() { - if (locale == null || Locale.GERMAN.equals(locale)) { - switch (this) { - case HERR: - return "Herr"; - case FRAU: - return "Frau"; - case DIVERS: - return "Divers"; - case UNBESTIMMT: - return "Unbestimmt"; - } - } - - if (locale.equals(Locale.ENGLISH)) { - switch (this) { - case HERR: - return "Mr"; - case FRAU: - return "Mrs"; - case DIVERS: - return "divers"; - case UNBESTIMMT: - return "unknown"; - } - } - return super.toString(); - } -} diff --git a/java/mss-failsafe/userManagement/src/main/java/model/person/enums/TokenType.java b/java/mss-failsafe/userManagement/src/main/java/model/person/enums/TokenType.java deleted file mode 100644 index e592454..0000000 --- a/java/mss-failsafe/userManagement/src/main/java/model/person/enums/TokenType.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package model.person.enums; - -/** - * - * @author Patrick - */ -public enum TokenType { - REMEMBER_ME, - API, - RESET_PASSWORD, - FILE -} diff --git a/java/mss-failsafe/userManagement/src/main/resources/META-INF/persistence.xml b/java/mss-failsafe/userManagement/src/main/resources/META-INF/persistence.xml deleted file mode 100644 index e9b1e5c..0000000 --- a/java/mss-failsafe/userManagement/src/main/resources/META-INF/persistence.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - java:/mss-failsave - model.person.Token - model.person.Salt - model.person.Person - model.person.Password - - - - - diff --git a/java/mss-failsafe/userManagement/src/main/webapp/WEB-INF/jboss-app.xml b/java/mss-failsafe/userManagement/src/main/webapp/WEB-INF/jboss-app.xml deleted file mode 100644 index a3ea92f..0000000 --- a/java/mss-failsafe/userManagement/src/main/webapp/WEB-INF/jboss-app.xml +++ /dev/null @@ -1,6 +0,0 @@ - - mss-failsafe - diff --git a/java/mss-failsafe/userManagement/src/main/webapp/WEB-INF/jboss-web.xml b/java/mss-failsafe/userManagement/src/main/webapp/WEB-INF/jboss-web.xml deleted file mode 100644 index 4f89b44..0000000 --- a/java/mss-failsafe/userManagement/src/main/webapp/WEB-INF/jboss-web.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - /userManagement-1.0-SNAPSHOT - jaspitest - \ No newline at end of file diff --git a/java/mss-failsafe/userManagement/src/main/webapp/WEB-INF/web.xml b/java/mss-failsafe/userManagement/src/main/webapp/WEB-INF/web.xml deleted file mode 100644 index 1b91148..0000000 --- a/java/mss-failsafe/userManagement/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,90 +0,0 @@ - - - - /index.xhtml - - - - 401 - /error.xhtml - - - - 403 - /error.xhtml - - - - authorise - /user/* - GET - POST - TRACE - HEAD - DELETE - CONNECT - OPTIONS - PUT - - - ADMIN - USER - - - - - - authorise - /admin/* - GET - POST - TRACE - HEAD - DELETE - CONNECT - OPTIONS - PUT - - - ADMIN - - - - - Normal User which got invited - USER - - - Admin user who can change entries, invite new domains and more.. - ADMIN - - - javax.faces.PROJECT_STAGE - Development - - - Faces Servlet - javax.faces.webapp.FacesServlet - 1 - - - Faces Servlet - *.xhtml - - - - 30 - - - true - - - COOKIE - - - diff --git a/java/mss-failsafe/userManagement/src/main/webapp/admin/welcome.xhtml b/java/mss-failsafe/userManagement/src/main/webapp/admin/welcome.xhtml deleted file mode 100644 index c4393e2..0000000 --- a/java/mss-failsafe/userManagement/src/main/webapp/admin/welcome.xhtml +++ /dev/null @@ -1,14 +0,0 @@ - - - - Willkommen #{personController.activeUser.call.toString()} #{personController.activeUser.lastname} - - - -

Willkommen #{personController.activeUser.call.toString()} #{personController.activeUser.lastname}

- -
- \ No newline at end of file diff --git a/java/mss-failsafe/userManagement/src/main/webapp/error.xhtml b/java/mss-failsafe/userManagement/src/main/webapp/error.xhtml deleted file mode 100644 index 0e553ba..0000000 --- a/java/mss-failsafe/userManagement/src/main/webapp/error.xhtml +++ /dev/null @@ -1,13 +0,0 @@ - - - Error Testpage - - - -

Error!

- -
- diff --git a/java/mss-failsafe/userManagement/src/main/webapp/index.xhtml b/java/mss-failsafe/userManagement/src/main/webapp/index.xhtml deleted file mode 100644 index 67f9887..0000000 --- a/java/mss-failsafe/userManagement/src/main/webapp/index.xhtml +++ /dev/null @@ -1,33 +0,0 @@ - - - Login Testpage - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/java/mss-failsafe/userManagement/src/main/webapp/user/welcome.xhtml b/java/mss-failsafe/userManagement/src/main/webapp/user/welcome.xhtml deleted file mode 100644 index c4393e2..0000000 --- a/java/mss-failsafe/userManagement/src/main/webapp/user/welcome.xhtml +++ /dev/null @@ -1,14 +0,0 @@ - - - - Willkommen #{personController.activeUser.call.toString()} #{personController.activeUser.lastname} - - - -

Willkommen #{personController.activeUser.call.toString()} #{personController.activeUser.lastname}

- -
- \ No newline at end of file diff --git a/java/mss-failsafe/userManagement/target/classes/META-INF/persistence.xml b/java/mss-failsafe/userManagement/target/classes/META-INF/persistence.xml deleted file mode 100644 index e9b1e5c..0000000 --- a/java/mss-failsafe/userManagement/target/classes/META-INF/persistence.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - java:/mss-failsave - model.person.Token - model.person.Salt - model.person.Person - model.person.Password - - - - - diff --git a/java/mss-failsafe/userManagement/target/classes/business/user/DemoManager.class b/java/mss-failsafe/userManagement/target/classes/business/user/DemoManager.class deleted file mode 100644 index 87f278b..0000000 Binary files a/java/mss-failsafe/userManagement/target/classes/business/user/DemoManager.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/classes/business/user/PasswordManager.class b/java/mss-failsafe/userManagement/target/classes/business/user/PasswordManager.class deleted file mode 100644 index 5b8b520..0000000 Binary files a/java/mss-failsafe/userManagement/target/classes/business/user/PasswordManager.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/classes/business/user/PersonManager.class b/java/mss-failsafe/userManagement/target/classes/business/user/PersonManager.class deleted file mode 100644 index dea588c..0000000 Binary files a/java/mss-failsafe/userManagement/target/classes/business/user/PersonManager.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/classes/business/user/TokenManager.class b/java/mss-failsafe/userManagement/target/classes/business/user/TokenManager.class deleted file mode 100644 index 96b0627..0000000 Binary files a/java/mss-failsafe/userManagement/target/classes/business/user/TokenManager.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/classes/controller/AbstractController.class b/java/mss-failsafe/userManagement/target/classes/controller/AbstractController.class deleted file mode 100644 index c6d9def..0000000 Binary files a/java/mss-failsafe/userManagement/target/classes/controller/AbstractController.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/classes/controller/person/PersonController.class b/java/mss-failsafe/userManagement/target/classes/controller/person/PersonController.class deleted file mode 100644 index 036c8b5..0000000 Binary files a/java/mss-failsafe/userManagement/target/classes/controller/person/PersonController.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/classes/exception/AbstractBusinessException.class b/java/mss-failsafe/userManagement/target/classes/exception/AbstractBusinessException.class deleted file mode 100644 index 0652e95..0000000 Binary files a/java/mss-failsafe/userManagement/target/classes/exception/AbstractBusinessException.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/classes/exception/InvalidCredentialException.class b/java/mss-failsafe/userManagement/target/classes/exception/InvalidCredentialException.class deleted file mode 100644 index c12b152..0000000 Binary files a/java/mss-failsafe/userManagement/target/classes/exception/InvalidCredentialException.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/classes/exception/InvalidEmailException.class b/java/mss-failsafe/userManagement/target/classes/exception/InvalidEmailException.class deleted file mode 100644 index b017770..0000000 Binary files a/java/mss-failsafe/userManagement/target/classes/exception/InvalidEmailException.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/classes/exception/InvalidPasswordException.class b/java/mss-failsafe/userManagement/target/classes/exception/InvalidPasswordException.class deleted file mode 100644 index 98f0fd6..0000000 Binary files a/java/mss-failsafe/userManagement/target/classes/exception/InvalidPasswordException.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/classes/exception/PersonInaktiveException.class b/java/mss-failsafe/userManagement/target/classes/exception/PersonInaktiveException.class deleted file mode 100644 index b0537c9..0000000 Binary files a/java/mss-failsafe/userManagement/target/classes/exception/PersonInaktiveException.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/classes/httpauthenticationmechanism/AppIdentityStore.class b/java/mss-failsafe/userManagement/target/classes/httpauthenticationmechanism/AppIdentityStore.class deleted file mode 100644 index 8c31297..0000000 Binary files a/java/mss-failsafe/userManagement/target/classes/httpauthenticationmechanism/AppIdentityStore.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/classes/httpauthenticationmechanism/AppRememberMeIdentityStore.class b/java/mss-failsafe/userManagement/target/classes/httpauthenticationmechanism/AppRememberMeIdentityStore.class deleted file mode 100644 index 7868e7c..0000000 Binary files a/java/mss-failsafe/userManagement/target/classes/httpauthenticationmechanism/AppRememberMeIdentityStore.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/classes/httpauthenticationmechanism/ApplicationConfig.class b/java/mss-failsafe/userManagement/target/classes/httpauthenticationmechanism/ApplicationConfig.class deleted file mode 100644 index 958ffae..0000000 Binary files a/java/mss-failsafe/userManagement/target/classes/httpauthenticationmechanism/ApplicationConfig.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/classes/httpauthenticationmechanism/LogoutListener.class b/java/mss-failsafe/userManagement/target/classes/httpauthenticationmechanism/LogoutListener.class deleted file mode 100644 index 9826989..0000000 Binary files a/java/mss-failsafe/userManagement/target/classes/httpauthenticationmechanism/LogoutListener.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/classes/httpauthenticationmechanism/ManagedPerson.class b/java/mss-failsafe/userManagement/target/classes/httpauthenticationmechanism/ManagedPerson.class deleted file mode 100644 index e33f70d..0000000 Binary files a/java/mss-failsafe/userManagement/target/classes/httpauthenticationmechanism/ManagedPerson.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/classes/model/AbstractEntity.class b/java/mss-failsafe/userManagement/target/classes/model/AbstractEntity.class deleted file mode 100644 index 3d32f2a..0000000 Binary files a/java/mss-failsafe/userManagement/target/classes/model/AbstractEntity.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/classes/model/person/Password.class b/java/mss-failsafe/userManagement/target/classes/model/person/Password.class deleted file mode 100644 index 774ba96..0000000 Binary files a/java/mss-failsafe/userManagement/target/classes/model/person/Password.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/classes/model/person/Person.class b/java/mss-failsafe/userManagement/target/classes/model/person/Person.class deleted file mode 100644 index 2174a38..0000000 Binary files a/java/mss-failsafe/userManagement/target/classes/model/person/Person.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/classes/model/person/Salt.class b/java/mss-failsafe/userManagement/target/classes/model/person/Salt.class deleted file mode 100644 index b7855ef..0000000 Binary files a/java/mss-failsafe/userManagement/target/classes/model/person/Salt.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/classes/model/person/Token.class b/java/mss-failsafe/userManagement/target/classes/model/person/Token.class deleted file mode 100644 index 46de5a5..0000000 Binary files a/java/mss-failsafe/userManagement/target/classes/model/person/Token.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/classes/model/person/enums/Call$1.class b/java/mss-failsafe/userManagement/target/classes/model/person/enums/Call$1.class deleted file mode 100644 index a33eddc..0000000 Binary files a/java/mss-failsafe/userManagement/target/classes/model/person/enums/Call$1.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/classes/model/person/enums/Call.class b/java/mss-failsafe/userManagement/target/classes/model/person/enums/Call.class deleted file mode 100644 index d547c60..0000000 Binary files a/java/mss-failsafe/userManagement/target/classes/model/person/enums/Call.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/classes/model/person/enums/TokenType.class b/java/mss-failsafe/userManagement/target/classes/model/person/enums/TokenType.class deleted file mode 100644 index 80beda2..0000000 Binary files a/java/mss-failsafe/userManagement/target/classes/model/person/enums/TokenType.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/classes/model/person/enums/UserGroup.class b/java/mss-failsafe/userManagement/target/classes/model/person/enums/UserGroup.class deleted file mode 100644 index 1242af8..0000000 Binary files a/java/mss-failsafe/userManagement/target/classes/model/person/enums/UserGroup.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/endorsed/javaee-api-8.0.jar b/java/mss-failsafe/userManagement/target/endorsed/javaee-api-8.0.jar deleted file mode 100644 index 1045b8f..0000000 Binary files a/java/mss-failsafe/userManagement/target/endorsed/javaee-api-8.0.jar and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/maven-archiver/pom.properties b/java/mss-failsafe/userManagement/target/maven-archiver/pom.properties deleted file mode 100644 index b8fed52..0000000 --- a/java/mss-failsafe/userManagement/target/maven-archiver/pom.properties +++ /dev/null @@ -1,5 +0,0 @@ -#Generated by Maven -#Sat Oct 09 18:48:13 CEST 2021 -groupId=plate.software -artifactId=userManagement -version=1.0-SNAPSHOT diff --git a/java/mss-failsafe/userManagement/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/java/mss-failsafe/userManagement/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted file mode 100644 index 795ec9e..0000000 --- a/java/mss-failsafe/userManagement/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ /dev/null @@ -1,25 +0,0 @@ -model\person\Password.class -httpauthenticationmechanism\AppRememberMeIdentityStore.class -model\person\enums\Call.class -business\user\PersonManager.class -business\user\TokenManager.class -exception\InvalidPasswordException.class -model\person\Salt.class -httpauthenticationmechanism\LogoutListener.class -httpauthenticationmechanism\ManagedPerson.class -exception\PersonInaktiveException.class -model\person\enums\UserGroup.class -controller\AbstractController.class -business\user\PasswordManager.class -model\person\enums\Call$1.class -controller\person\PersonController.class -exception\AbstractBusinessException.class -httpauthenticationmechanism\AppIdentityStore.class -model\person\enums\TokenType.class -httpauthenticationmechanism\ApplicationConfig.class -model\person\Person.class -business\user\DemoManager.class -model\AbstractEntity.class -exception\InvalidEmailException.class -model\person\Token.class -exception\InvalidCredentialException.class diff --git a/java/mss-failsafe/userManagement/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/java/mss-failsafe/userManagement/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index 51539c4..0000000 --- a/java/mss-failsafe/userManagement/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1,24 +0,0 @@ -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userManagement\src\main\java\model\person\Person.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userManagement\src\main\java\httpauthenticationmechanism\LogoutListener.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userManagement\src\main\java\model\person\enums\TokenType.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userManagement\src\main\java\model\person\Token.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userManagement\src\main\java\business\user\PasswordManager.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userManagement\src\main\java\exception\InvalidEmailException.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userManagement\src\main\java\httpauthenticationmechanism\ApplicationConfig.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userManagement\src\main\java\model\person\enums\UserGroup.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userManagement\src\main\java\model\AbstractEntity.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userManagement\src\main\java\controller\AbstractController.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userManagement\src\main\java\exception\InvalidCredentialException.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userManagement\src\main\java\httpauthenticationmechanism\AppIdentityStore.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userManagement\src\main\java\httpauthenticationmechanism\AppRememberMeIdentityStore.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userManagement\src\main\java\exception\PersonInaktiveException.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userManagement\src\main\java\httpauthenticationmechanism\ManagedPerson.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userManagement\src\main\java\model\person\enums\Call.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userManagement\src\main\java\business\user\TokenManager.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userManagement\src\main\java\model\person\Salt.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userManagement\src\main\java\business\user\DemoManager.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userManagement\src\main\java\model\person\Password.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userManagement\src\main\java\exception\InvalidPasswordException.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userManagement\src\main\java\business\user\PersonManager.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userManagement\src\main\java\controller\person\PersonController.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userManagement\src\main\java\exception\AbstractBusinessException.java diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT-classes.jar b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT-classes.jar deleted file mode 100644 index b68c2d7..0000000 Binary files a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT-classes.jar and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT.war b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT.war deleted file mode 100644 index 2937248..0000000 Binary files a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT.war and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/META-INF/persistence.xml b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/META-INF/persistence.xml deleted file mode 100644 index e9b1e5c..0000000 --- a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/META-INF/persistence.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - java:/mss-failsave - model.person.Token - model.person.Salt - model.person.Person - model.person.Password - - - - - diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/business/user/DemoManager.class b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/business/user/DemoManager.class deleted file mode 100644 index 87f278b..0000000 Binary files a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/business/user/DemoManager.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/business/user/PasswordManager.class b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/business/user/PasswordManager.class deleted file mode 100644 index 5b8b520..0000000 Binary files a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/business/user/PasswordManager.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/business/user/PersonManager.class b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/business/user/PersonManager.class deleted file mode 100644 index dea588c..0000000 Binary files a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/business/user/PersonManager.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/business/user/TokenManager.class b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/business/user/TokenManager.class deleted file mode 100644 index 96b0627..0000000 Binary files a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/business/user/TokenManager.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/controller/AbstractController.class b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/controller/AbstractController.class deleted file mode 100644 index c6d9def..0000000 Binary files a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/controller/AbstractController.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/controller/person/PersonController.class b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/controller/person/PersonController.class deleted file mode 100644 index 449da8c..0000000 Binary files a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/controller/person/PersonController.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/exception/AbstractBusinessException.class b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/exception/AbstractBusinessException.class deleted file mode 100644 index 0652e95..0000000 Binary files a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/exception/AbstractBusinessException.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/exception/InvalidCredentialException.class b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/exception/InvalidCredentialException.class deleted file mode 100644 index c12b152..0000000 Binary files a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/exception/InvalidCredentialException.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/exception/InvalidEmailException.class b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/exception/InvalidEmailException.class deleted file mode 100644 index b017770..0000000 Binary files a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/exception/InvalidEmailException.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/exception/InvalidPasswordException.class b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/exception/InvalidPasswordException.class deleted file mode 100644 index 98f0fd6..0000000 Binary files a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/exception/InvalidPasswordException.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/exception/PersonInaktiveException.class b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/exception/PersonInaktiveException.class deleted file mode 100644 index b0537c9..0000000 Binary files a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/exception/PersonInaktiveException.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/httpauthenticationmechanism/AppIdentityStore.class b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/httpauthenticationmechanism/AppIdentityStore.class deleted file mode 100644 index 8c31297..0000000 Binary files a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/httpauthenticationmechanism/AppIdentityStore.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/httpauthenticationmechanism/AppRememberMeIdentityStore.class b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/httpauthenticationmechanism/AppRememberMeIdentityStore.class deleted file mode 100644 index 7868e7c..0000000 Binary files a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/httpauthenticationmechanism/AppRememberMeIdentityStore.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/httpauthenticationmechanism/ApplicationConfig.class b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/httpauthenticationmechanism/ApplicationConfig.class deleted file mode 100644 index 958ffae..0000000 Binary files a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/httpauthenticationmechanism/ApplicationConfig.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/httpauthenticationmechanism/LogoutListener.class b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/httpauthenticationmechanism/LogoutListener.class deleted file mode 100644 index 9826989..0000000 Binary files a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/httpauthenticationmechanism/LogoutListener.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/httpauthenticationmechanism/ManagedPerson.class b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/httpauthenticationmechanism/ManagedPerson.class deleted file mode 100644 index e33f70d..0000000 Binary files a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/httpauthenticationmechanism/ManagedPerson.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/model/AbstractEntity.class b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/model/AbstractEntity.class deleted file mode 100644 index 3d32f2a..0000000 Binary files a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/model/AbstractEntity.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/model/person/Password.class b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/model/person/Password.class deleted file mode 100644 index 774ba96..0000000 Binary files a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/model/person/Password.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/model/person/Person.class b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/model/person/Person.class deleted file mode 100644 index 2174a38..0000000 Binary files a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/model/person/Person.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/model/person/Salt.class b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/model/person/Salt.class deleted file mode 100644 index b7855ef..0000000 Binary files a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/model/person/Salt.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/model/person/Token.class b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/model/person/Token.class deleted file mode 100644 index 46de5a5..0000000 Binary files a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/model/person/Token.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/model/person/enums/Call$1.class b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/model/person/enums/Call$1.class deleted file mode 100644 index a33eddc..0000000 Binary files a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/model/person/enums/Call$1.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/model/person/enums/Call.class b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/model/person/enums/Call.class deleted file mode 100644 index d547c60..0000000 Binary files a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/model/person/enums/Call.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/model/person/enums/TokenType.class b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/model/person/enums/TokenType.class deleted file mode 100644 index 80beda2..0000000 Binary files a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/model/person/enums/TokenType.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/model/person/enums/UserGroup.class b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/model/person/enums/UserGroup.class deleted file mode 100644 index 1242af8..0000000 Binary files a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/classes/model/person/enums/UserGroup.class and /dev/null differ diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/jboss-app.xml b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/jboss-app.xml deleted file mode 100644 index a3ea92f..0000000 --- a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/jboss-app.xml +++ /dev/null @@ -1,6 +0,0 @@ - - mss-failsafe - diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/jboss-web.xml b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/jboss-web.xml deleted file mode 100644 index 4f89b44..0000000 --- a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/jboss-web.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - /userManagement-1.0-SNAPSHOT - jaspitest - \ No newline at end of file diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/web.xml b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/web.xml deleted file mode 100644 index 1b91148..0000000 --- a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WEB-INF/web.xml +++ /dev/null @@ -1,90 +0,0 @@ - - - - /index.xhtml - - - - 401 - /error.xhtml - - - - 403 - /error.xhtml - - - - authorise - /user/* - GET - POST - TRACE - HEAD - DELETE - CONNECT - OPTIONS - PUT - - - ADMIN - USER - - - - - - authorise - /admin/* - GET - POST - TRACE - HEAD - DELETE - CONNECT - OPTIONS - PUT - - - ADMIN - - - - - Normal User which got invited - USER - - - Admin user who can change entries, invite new domains and more.. - ADMIN - - - javax.faces.PROJECT_STAGE - Development - - - Faces Servlet - javax.faces.webapp.FacesServlet - 1 - - - Faces Servlet - *.xhtml - - - - 30 - - - true - - - COOKIE - - - diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WildFly.dpf b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WildFly.dpf deleted file mode 100644 index 800e6b7..0000000 --- a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/WildFly.dpf +++ /dev/null @@ -1,5 +0,0 @@ - - - /userManagement-1.0-SNAPSHOT - jaspitest - diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/admin/welcome.xhtml b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/admin/welcome.xhtml deleted file mode 100644 index c4393e2..0000000 --- a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/admin/welcome.xhtml +++ /dev/null @@ -1,14 +0,0 @@ - - - - Willkommen #{personController.activeUser.call.toString()} #{personController.activeUser.lastname} - - - -

Willkommen #{personController.activeUser.call.toString()} #{personController.activeUser.lastname}

- -
- \ No newline at end of file diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/error.xhtml b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/error.xhtml deleted file mode 100644 index 0e553ba..0000000 --- a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/error.xhtml +++ /dev/null @@ -1,13 +0,0 @@ - - - Error Testpage - - - -

Error!

- -
- diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/index.xhtml b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/index.xhtml deleted file mode 100644 index 67f9887..0000000 --- a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/index.xhtml +++ /dev/null @@ -1,33 +0,0 @@ - - - Login Testpage - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/user/welcome.xhtml b/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/user/welcome.xhtml deleted file mode 100644 index c4393e2..0000000 --- a/java/mss-failsafe/userManagement/target/userManagement-1.0-SNAPSHOT/user/welcome.xhtml +++ /dev/null @@ -1,14 +0,0 @@ - - - - Willkommen #{personController.activeUser.call.toString()} #{personController.activeUser.lastname} - - - -

Willkommen #{personController.activeUser.call.toString()} #{personController.activeUser.lastname}

- -
- \ No newline at end of file diff --git a/java/mss-failsafe/userdata/pom.xml b/java/mss-failsafe/userdata/pom.xml deleted file mode 100644 index fac089e..0000000 --- a/java/mss-failsafe/userdata/pom.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - 4.0.0 - - plate.software - mss-failsafe - 1.0-SNAPSHOT - - userdata - jar - - 11 - 11 - false - 8.0 - - - - - javax - javaee-api - ${jakartaee} - provided - - - org.apache.pdfbox - pdfbox - 2.0.13 - - - org.glassfish.soteria - javax.security.enterprise - 1.0 - - - org.omnifaces - omnifaces - 3.11.1 - - - - javax - javaee-web-api - 8.0 - provided - - - org.glassfish - javax.faces - 2.3.0 - provided - - - org.apache.logging.log4j - log4j-api - 2.14.1 - - - org.apache.logging.log4j - log4j-core - 2.14.1 - - - - org.primefaces - primefaces - 10.0.0 - - - \ No newline at end of file diff --git a/java/mss-failsafe/userdata/src/main/java/business/user/DemoManager.java b/java/mss-failsafe/userdata/src/main/java/business/user/DemoManager.java deleted file mode 100644 index 4668387..0000000 --- a/java/mss-failsafe/userdata/src/main/java/business/user/DemoManager.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package business.user; - -import javax.ejb.EJB; -import javax.ejb.Startup; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Named; - -/** - * - * @author patri - */ -@Named(value = "DemoManager") -@ApplicationScoped -@Startup -public class DemoManager { - - @EJB - PersonManager personManager; - - /** - * Creates a new instance of NewJSFManagedBean - */ - public DemoManager() { - runDemos(); - } - - private void runDemos(){ - personManager.demo(); - } - -} diff --git a/java/mss-failsafe/userdata/src/main/java/business/user/PasswordManager.java b/java/mss-failsafe/userdata/src/main/java/business/user/PasswordManager.java deleted file mode 100644 index fa08f23..0000000 --- a/java/mss-failsafe/userdata/src/main/java/business/user/PasswordManager.java +++ /dev/null @@ -1,174 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package business.user; - -import java.io.Serializable; -import java.security.NoSuchAlgorithmException; -import java.security.SecureRandom; -import java.security.spec.InvalidKeySpecException; -import java.util.Arrays; -import javax.crypto.SecretKey; -import javax.crypto.SecretKeyFactory; -import javax.crypto.spec.PBEKeySpec; -import javax.ejb.Stateless; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.NoResultException; -import javax.persistence.PersistenceContext; -import javax.persistence.TypedQuery; -import javax.transaction.Transactional; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import model.person.Password; -import model.person.Salt; -import model.person.Person; - -/** - * - * @author Patrick - */ -@Named(value = "passwordManager") -@Stateless -public class PasswordManager implements Serializable { - private static final long serialVersionUID = -4563304131856981259L; - - final static Logger LOGGER = LogManager.getLogger(PasswordManager.class); - - @PersistenceContext(name = "pu_person") - private EntityManager em; - - //private Password password; - private Person user; - - private final int keyLength = 256; - - public byte[] hashPassword(final char[] password, final byte[] salt, final int iterations) { - try { - SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512"); - PBEKeySpec spec = new PBEKeySpec(password, salt, iterations, this.keyLength); - SecretKey key = skf.generateSecret(spec); - //this.password = new Password(this.costumer, key.getEncoded()); - LOGGER.debug("Hash created!"); - return key.getEncoded(); - } catch (NoSuchAlgorithmException | InvalidKeySpecException e) { - LOGGER.error("Failure creating hash for with:" + e); - return null; - //throw new RuntimeException( e ); - } - } - - public byte[] hashPasswordUser(final char[] password, Person user) { - - if (user == null) { - LOGGER.error("Tried to create hash for Nullcostumer!"); - return null; - } - try { - SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512"); - PBEKeySpec spec = new PBEKeySpec(password, user.getSalt().getSalt(), user.getSalt().getInterations(), keyLength); - SecretKey key = skf.generateSecret(spec); - LOGGER.debug("Hash created!"); - return key.getEncoded(); - } catch (NoSuchAlgorithmException | InvalidKeySpecException e) { - LOGGER.error("Failure creating hash for" + user.getEmail() + "with: " + e); - return null; - } - } - - public boolean passwordCheckEmail(final String email, final byte[] password) { - TypedQuery query = em.createNamedQuery(Person.FIND_BY_EMAIL, Person.class); - query.setParameter("email", email); - try { - Person user; - user = query.getSingleResult(); - - boolean equals = Arrays.equals(password, user.getPassword().getPassword()); - - for (int i = 0; i < password.length; i++) { - password[i] = 0; - } - - return equals; - } catch (NoResultException e) { - return false; - } - } - - @Transactional - public boolean passwordCheckCustomer(final Person user, final String password) { - LOGGER.debug("Test " + user.getEmail() + " mit " + password); - byte[] pw = hashPasswordUser(password.toCharArray(), user); - - boolean equals = Arrays.equals(pw, user.getPassword().getPassword()); - - for (int i = 0; i < pw.length; i++) { - pw[i] = 0; - } - - return equals; - - } - - public boolean changePassword(Person user, String newPassword, String oldPassword) { - if (user == null) { - LOGGER.error("Nullcostumer tried to change Password"); - return false; - } - - if(passwordCheckCustomer(user, oldPassword)){ - user.getPassword().setPassowrd(hashPasswordUser(newPassword.toCharArray(), user)); - LOGGER.info("Password changed for " + user.getEmail()); - } else { - return false; - } - - try { - em.persist(user); - LOGGER.info("Password changed for " + user.getEmail()); - return true; - } catch (Exception e) { - LOGGER.error("Couldn't save new password to " + user.getEmail() + " with: " + e.toString()); - return false; - } - } - - public byte[] generateRandomPassword() { - SecureRandom random = new SecureRandom(); - byte bytes[] = new byte[20]; - random.nextBytes(bytes); - return bytes; - } - - public Password gerateNewRandomPasswordClass(Person user){ - Salt salt = user.getSalt(); - String pass = Arrays.toString(generateRandomPassword()); - return new Password(user, hashPassword(pass.toCharArray(), salt.getSalt(), salt.getInterations())); - } - - public byte[] hashToken(String token){ - try { - SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256"); - byte[] test = "SuperTestSalz".getBytes(); - PBEKeySpec spec = new PBEKeySpec(token.toCharArray(), test, 200, this.keyLength); - SecretKey key = skf.generateSecret(spec); - LOGGER.debug("TokenHash created!"); - return key.getEncoded(); - } catch (NoSuchAlgorithmException | InvalidKeySpecException e) { - LOGGER.error("Failure creating tokenhash for " + token + " with: " + e); - return null; - } - } - - public Person getUser() { - return user; - } - - public void setUser(Person user) { - this.user = user; - } -} diff --git a/java/mss-failsafe/userdata/src/main/java/business/user/PersonManager.java b/java/mss-failsafe/userdata/src/main/java/business/user/PersonManager.java deleted file mode 100644 index c826c66..0000000 --- a/java/mss-failsafe/userdata/src/main/java/business/user/PersonManager.java +++ /dev/null @@ -1,229 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package business.user; - -import java.io.Serializable; -import java.time.Instant; -import java.util.Optional; -import javax.ejb.EJB; -import javax.ejb.Stateless; -import javax.inject.Inject; -import javax.inject.Named; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.PersistenceContextType; -import javax.transaction.Transactional; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import controller.person.PersonController; -import exception.InvalidEmailException; -import exception.InvalidPasswordException; -import exception.PersonInaktiveException; -import java.util.HashSet; -import java.util.Set; -import model.person.Salt; -import model.person.enums.TokenType; -import model.person.Person; -import model.person.enums.UserGroup; - -/** - * - * @author Patrick - */ -@Named -@Stateless -public class PersonManager implements Serializable { - - private static final long serialVersionUID = -6581582446436303658L; - - final static Logger LOGGER = LogManager.getLogger(PersonManager.class); - - @EJB - private PasswordManager passwordManager; - - @Inject - private PersonController userController; - - @PersistenceContext(name = "pu_person", type = PersistenceContextType.EXTENDED) - private EntityManager em; - - @Transactional - public void demo() { - Salt salt = new Salt(); - Salt salt2 = new Salt(); - Salt salt3 = new Salt(); - - Set groupUser = new HashSet<>(); - groupUser.add(UserGroup.USER); - - Set adminUser = new HashSet<>(); - adminUser.add(UserGroup.ADMIN); - - Person test = new Person( - "user@test.de", - (passwordManager.hashPassword("test".toCharArray(), salt.getSalt(), salt.getInterations())), - salt, - groupUser - ); - - test.setFirstname("User"); - test.setLastname("Nachname"); - test.setMobile("0124584589"); - test.setFax("3445565675"); - test.setTelefon("042154585"); - test.setActive(true); - em.persist(test); - - Person testAdmin = new Person( - "admin@test.de", - (passwordManager.hashPassword("admin".toCharArray(), salt2.getSalt(), salt2.getInterations())), - salt2, - adminUser - ); - - testAdmin.setFirstname("Admin"); - testAdmin.setLastname("Administratori"); - testAdmin.setMobile("0124584589"); - testAdmin.setFax("3445565675"); - testAdmin.setTelefon("042154585"); - testAdmin.setActive(true); - em.persist(testAdmin); - - Person testInactive = new Person( - "inaktive@test.de", - (passwordManager.hashPassword("test".toCharArray(), salt3.getSalt(), salt3.getInterations())), - salt3, - groupUser - ); - - testInactive.setFirstname("Admin"); - testInactive.setLastname("Administratori"); - testInactive.setMobile("0124584589"); - testInactive.setFax("3445565675"); - testInactive.setTelefon("042154585"); - testInactive.setActive(false); - em.persist(testInactive); - } - - @Transactional - public Person load(Person user) { - try { - Person loaded = this.em.find(Person.class, user.getId()); - LOGGER.info(loaded); - - return loaded; - } catch (Exception e) { - LOGGER.error("Error", e); - return null; - } - } - - @Transactional - public Person getActiveUser() { - try { - Person user = em.find(Person.class, userController.getActiveUser().getId()); - return user; - } catch (Exception e) { - LOGGER.error("couldn't load user: " + e); - return null; - } - } - - @Transactional - public Person getPlainActiveUser() { - try { - Person user = em.find(Person.class, userController.getActiveUser().getId()); - return user; - } catch (Exception e) { - LOGGER.error("couldn't load user: " + e); - return null; - } - } - - public Optional getByEmail(String email) { - try { - Person person = this.em.createNamedQuery(Person.FIND_BY_EMAIL, Person.class) - .setParameter("email", email).getSingleResult(); - - if (person != null) { - person.getUserGroups().size(); - } - - return Optional.of(person); - } catch (Exception e) { - return Optional.empty(); - } - } - - public Optional getByLoginToken(String loginToken, TokenType tokenType) { - Optional optional; - try { - - optional = Optional.of(this.em.createNamedQuery(Person.FIND_BY_TOKEN, Person.class) - .setParameter("tokenHash", this.passwordManager.hashToken(loginToken)) - .setParameter("tokenType", tokenType) - .setParameter("timestamp", Instant.now()) - .getSingleResult() - ); - return optional; - } catch (Exception e) { - return Optional.empty(); - } - } - - public Person getByEmailAndPassword(String email, String password) { - Person managedUser = getByEmail(email).orElseThrow(InvalidEmailException::new); - LOGGER.debug("Loaded " + managedUser.getEmail()); - if (!passwordManager.passwordCheckCustomer(managedUser, password)) { - throw new InvalidPasswordException(); - } - if (!managedUser.isActive()) { - throw new PersonInaktiveException(); - } - userController.setActiveUser(managedUser); - return managedUser; - } - - @Transactional - public boolean save(Person user) { - if (user == null) { - LOGGER.error("Tried to save null or Nullcustomer"); - return false; - } - try { - if (user.getId() != null && user.getId() > 0) { - em.merge(user); - } else { - em.persist(user); - } - LOGGER.info("Saved " + user.getEmail()); - return true; - } catch (Exception e) { - LOGGER.error("Tried to save " + user.getEmail() + " with error: " + e); - return false; - } - } - - public void refresh(Person user) { - if (user == null) { - LOGGER.error("Tried to save null or Nullcustomer"); - return; - } - - try { - em.refresh(user); - } catch (Exception e) { - LOGGER.error("Tried to refresh " + user.getEmail() + " with error: " + e); - } - } - - public String resetPassword() { - //TODO - return null; - } -} diff --git a/java/mss-failsafe/userdata/src/main/java/controller/AbstractController.java b/java/mss-failsafe/userdata/src/main/java/controller/AbstractController.java deleted file mode 100644 index 5b04e75..0000000 --- a/java/mss-failsafe/userdata/src/main/java/controller/AbstractController.java +++ /dev/null @@ -1,53 +0,0 @@ -package controller; -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ - - -import java.io.Serializable; -import javax.faces.application.FacesMessage; -import javax.faces.context.FacesContext; - -/** - * - * @author Patrick - */ -public abstract class AbstractController implements Serializable{ - private static final long serialVersionUID = -5908716187853409719L; - - protected void sendInfoMessage(String title, String message){ - FacesMessage facesMessage = new FacesMessage( - FacesMessage.SEVERITY_INFO, title, message); - addMessage(facesMessage); - } - - protected void sendWarnMessage(String title, String message){ - FacesMessage facesMessage = new FacesMessage( - FacesMessage.SEVERITY_WARN, title, message); - addMessage(facesMessage); - } - - protected void sendErrorMessage(String title, String message){ - FacesMessage facesMessage = new FacesMessage( - FacesMessage.SEVERITY_ERROR, title, message); - addMessage(facesMessage); - } - - protected void sendFatalMessage(String title, String message){ - FacesMessage facesMessage = new FacesMessage( - FacesMessage.SEVERITY_FATAL, title, message); - addMessage(facesMessage); - } - - private void addMessage(FacesMessage message) { - FacesContext.getCurrentInstance().addMessage(null, message); - } - - protected void errorMessage() { - String title = "Fehler!"; - String info = "Es ist ein Fehler aufgetreten, bitte versuchen Sie es erneut!"; - sendErrorMessage(title, info); - } -} diff --git a/java/mss-failsafe/userdata/src/main/java/controller/person/PersonController.java b/java/mss-failsafe/userdata/src/main/java/controller/person/PersonController.java deleted file mode 100644 index 5642f07..0000000 --- a/java/mss-failsafe/userdata/src/main/java/controller/person/PersonController.java +++ /dev/null @@ -1,173 +0,0 @@ -package controller.person; - -import javax.enterprise.context.SessionScoped; -import javax.faces.context.FacesContext; -import javax.inject.Inject; -import javax.inject.Named; -import javax.security.enterprise.AuthenticationStatus; -import javax.security.enterprise.SecurityContext; -import javax.security.enterprise.credential.Password; -import javax.security.enterprise.credential.UsernamePasswordCredential; -import javax.servlet.http.HttpSession; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import controller.AbstractController; -import exception.InvalidEmailException; -import exception.InvalidPasswordException; -import exception.PersonInaktiveException; -import httpauthenticationmechanism.ManagedPerson; -import model.person.Person; - -import static javax.security.enterprise.AuthenticationStatus.SEND_FAILURE; -import static javax.security.enterprise.AuthenticationStatus.SUCCESS; - -import java.io.Serializable; -import java.util.Set; -import static javax.security.enterprise.authentication.mechanism.http.AuthenticationParameters.withParams; -import model.person.enums.UserGroup; -import org.omnifaces.cdi.Param; -import static org.omnifaces.util.Faces.getRequest; -import static org.omnifaces.util.Faces.getResponse; -import static org.omnifaces.util.Faces.redirect; - -/** - * - * @author Patrick - */ -@Named -@SessionScoped -public class PersonController extends AbstractController implements Serializable { - - private static final long serialVersionUID = -2257766986862616262L; - final static Logger LOGGER = LogManager.getLogger(PersonController.class); - private String username; - private String password; - private boolean rememberMe = false; - - @Inject - SecurityContext securityContext; - - @Inject - ManagedPerson managedPerson; - - @Param(name = "continue") // Defined in @LoginToContinue of SecurityFormAuthenticationMechanism - private boolean loginToContinue; - - private Person activePerson; - - public PersonController() { - - } - - public String submit() { - - try { - // credential that want to be validate was UsernamePasswordCredential - UsernamePasswordCredential credential = new UsernamePasswordCredential(username, new Password(password)); - - // this will call our security configuration to authorize the user - AuthenticationStatus status = securityContext.authenticate( - getRequest(), - getResponse(), - withParams() - .credential(credential) - .newAuthentication(!loginToContinue) - .rememberMe(rememberMe) - ); - - // When logged in choose the right page by class. When more then one group - // fits then the higher order is used - if (status.equals(SUCCESS)) { - managedPerson.addLogin(username); - - FacesContext facesContext = FacesContext.getCurrentInstance(); - HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true); - session.setAttribute("user", this); - session.setAttribute("realUsername", username); - - if (securityContext.isCallerInRole(UserGroup.ADMIN.toString())) { - LOGGER.info("Login succesfull " + username + " with role: ADMIN"); - return "admin/welcome.xhtml?faces-redirect=true"; - } - - if (securityContext.isCallerInRole(UserGroup.USER.toString())) { - LOGGER.info("Login succesfull " + username + " with role: USER"); - return "user/welcome.xhtml?faces-redirect=true"; - } - - if (securityContext.isCallerInRole(UserGroup.CUSTOMER.toString())) { - LOGGER.info("Login succesfull " + username + " with role: USER"); - return "customer/welcome.xhtml?faces-redirect=true"; - } - - redirect("index.xhtml"); - - } else if (status.equals(SEND_FAILURE)) { - - sendErrorMessage("Fehler!", "Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut!."); - return ""; - } - } catch (InvalidPasswordException | InvalidEmailException e) { - LOGGER.info("Wrong Email or Password: " + username); - sendErrorMessage("Fehler!", "Falsche Email oder Passwort!"); - return ""; - } catch (PersonInaktiveException p){ - sendErrorMessage("Fehler!", " Ihr Konto ist inatkiv. Bitte wenden Sie sich an den Administator."); - return ""; - } catch (Exception e) { - LOGGER.error("Login error with " + e); - sendErrorMessage("Fehler!", "Ein Fehler ist aufgetreten, bitte versuchen Sie es erneut!"); - return ""; - } - return ""; - } - - public String logout() { - LOGGER.info("User is logging out: " + username); - try { - FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); - } catch (Exception e) { - LOGGER.error("couldn't logout " + username + "with:" + e); - } - - return "index.xhtml?faces-redirect=true"; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public boolean isRememberMe() { - return rememberMe; - } - - public void setRememberMe(boolean rememberMe) { - this.rememberMe = rememberMe; - } - - public Person getActiveUser() { - return activePerson; - } - - public void setActiveUser(Person activeUser) { - this.activePerson = activeUser; - } - - public Set getLogins() { - return managedPerson.getLogins(); - } -} diff --git a/java/mss-failsafe/userdata/src/main/java/exception/AbstractBusinessException.java b/java/mss-failsafe/userdata/src/main/java/exception/AbstractBusinessException.java deleted file mode 100644 index 8cbb7e2..0000000 --- a/java/mss-failsafe/userdata/src/main/java/exception/AbstractBusinessException.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package exception; - -import javax.ejb.ApplicationException; - -/** - * - * @author Patrick - */ -@ApplicationException(rollback = true) -public abstract class AbstractBusinessException extends RuntimeException { -} - diff --git a/java/mss-failsafe/userdata/src/main/java/exception/InvalidCredentialException.java b/java/mss-failsafe/userdata/src/main/java/exception/InvalidCredentialException.java deleted file mode 100644 index a851022..0000000 --- a/java/mss-failsafe/userdata/src/main/java/exception/InvalidCredentialException.java +++ /dev/null @@ -1,14 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package exception; - -/** - * - * @author Patrick - */ -public class InvalidCredentialException extends AbstractBusinessException{ - -} diff --git a/java/mss-failsafe/userdata/src/main/java/exception/InvalidEmailException.java b/java/mss-failsafe/userdata/src/main/java/exception/InvalidEmailException.java deleted file mode 100644 index 13bea8f..0000000 --- a/java/mss-failsafe/userdata/src/main/java/exception/InvalidEmailException.java +++ /dev/null @@ -1,13 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package exception; - -/** - * - * @author Patrick - */ -public class InvalidEmailException extends AbstractBusinessException { -} diff --git a/java/mss-failsafe/userdata/src/main/java/exception/InvalidPasswordException.java b/java/mss-failsafe/userdata/src/main/java/exception/InvalidPasswordException.java deleted file mode 100644 index d1a662b..0000000 --- a/java/mss-failsafe/userdata/src/main/java/exception/InvalidPasswordException.java +++ /dev/null @@ -1,14 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package exception; - -/** - * - * @author Patrick - */ -public class InvalidPasswordException extends AbstractBusinessException { - -} diff --git a/java/mss-failsafe/userdata/src/main/java/httpauthenticationmechanism/AppRememberMeIdentityStore.java b/java/mss-failsafe/userdata/src/main/java/httpauthenticationmechanism/AppRememberMeIdentityStore.java deleted file mode 100644 index b97978e..0000000 --- a/java/mss-failsafe/userdata/src/main/java/httpauthenticationmechanism/AppRememberMeIdentityStore.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package httpauthenticationmechanism; - -import static javax.security.enterprise.identitystore.CredentialValidationResult.INVALID_RESULT; - -import java.util.Optional; -import java.util.Set; -import javax.ejb.EJB; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; -import javax.security.enterprise.CallerPrincipal; -import javax.security.enterprise.credential.RememberMeCredential; -import javax.security.enterprise.identitystore.CredentialValidationResult; -import javax.security.enterprise.identitystore.RememberMeIdentityStore; -import javax.servlet.http.HttpServletRequest; - -import business.user.TokenManager; -import business.user.PersonManager; -import model.person.Person; -import static model.person.enums.TokenType.REMEMBER_ME; - -/** - * - * @author Patrick - */ -@ApplicationScoped -public class AppRememberMeIdentityStore implements RememberMeIdentityStore { - @Inject - HttpServletRequest request; - - @EJB - PersonManager userManager; - - @EJB - TokenManager tokenManager; - - @Override - public CredentialValidationResult validate(RememberMeCredential rmc) { - Optional user = this.userManager.getByLoginToken(rmc.getToken(), REMEMBER_ME); - - if (user.isPresent()) { - return new CredentialValidationResult(user.get().getEmail()); - } else { - return INVALID_RESULT; - } - } - - @Override - public String generateLoginToken(CallerPrincipal cp, Set set) { - return this.tokenManager.generate(cp.getName(), getRemoteAddr(request), getDescription(), REMEMBER_ME); - } - - @Override - public void removeLoginToken(String string) { - this.tokenManager.remove(string); - } - - private String getRemoteAddr(HttpServletRequest request){ - return request.getRemoteAddr(); - } - - private String getDescription() { - return "Remember me session: " + this.request.getHeader("User-Agent"); - } -} diff --git a/java/mss-failsafe/userdata/src/main/java/httpauthenticationmechanism/ApplicationConfig.java b/java/mss-failsafe/userdata/src/main/java/httpauthenticationmechanism/ApplicationConfig.java deleted file mode 100644 index 0e03486..0000000 --- a/java/mss-failsafe/userdata/src/main/java/httpauthenticationmechanism/ApplicationConfig.java +++ /dev/null @@ -1,85 +0,0 @@ -package httpauthenticationmechanism; - -import business.user.PersonManager; -import javax.annotation.PostConstruct; -import javax.ejb.EJB; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; -import javax.inject.Named; -import javax.security.enterprise.AuthenticationStatus; -import javax.security.enterprise.authentication.mechanism.http.AutoApplySession; -import javax.security.enterprise.authentication.mechanism.http.CustomFormAuthenticationMechanismDefinition; -import javax.security.enterprise.authentication.mechanism.http.HttpAuthenticationMechanism; -import javax.security.enterprise.authentication.mechanism.http.HttpMessageContext; -import javax.security.enterprise.authentication.mechanism.http.LoginToContinue; -import javax.security.enterprise.authentication.mechanism.http.RememberMe; -import javax.security.enterprise.credential.Credential; -import javax.security.enterprise.identitystore.IdentityStore; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - - -/** - * - * @author Patrick - */ -@AutoApplySession // For "Is user already logged-in?" -@RememberMe( - cookieMaxAgeSeconds = 60 * 60 * 24 * 14, // 14 days - cookieSecureOnly = false, // Remove this when login is served over HTTPS. - isRememberMeExpression = "#{self.isRememberMe(httpMessageContext)}" -) -@LoginToContinue( - loginPage = "/index.xhtml", - errorPage = "/error.xhtml", - useForwardToLogin = true -) -@ApplicationScoped -public class ApplicationConfig implements HttpAuthenticationMechanism{ - - final static Logger LOGGER = LogManager.getLogger(ApplicationConfig.class); - - public ApplicationConfig() { - } - - @Inject - private IdentityStore identityStore; - - @Inject - private ManagedPerson managedPerson; - - @EJB - private PersonManager personManager; - - @PostConstruct - private void init(){ - managedPerson.getLogins(); - personManager.demo(); - - System.out.println("PostConstruct DEMO"); - } - - @Override - public AuthenticationStatus validateRequest(HttpServletRequest req, HttpServletResponse res, HttpMessageContext context) { - - Credential credential = context.getAuthParameters().getCredential(); - - if (credential != null) { - return context.notifyContainerAboutLogin(this.identityStore.validate(credential)); - } else { - return context.doNothing(); - } - } - - // this was called on @RememberMe annotations - public Boolean isRememberMe(HttpMessageContext httpMessageContext) { - return httpMessageContext.getAuthParameters().isRememberMe(); - } - - @Override - public void cleanSubject(HttpServletRequest request, HttpServletResponse response, HttpMessageContext httpMessageContext) { - HttpAuthenticationMechanism.super.cleanSubject(request, response, httpMessageContext); - } -} diff --git a/java/mss-failsafe/userdata/src/main/java/httpauthenticationmechanism/LogoutListener.java b/java/mss-failsafe/userdata/src/main/java/httpauthenticationmechanism/LogoutListener.java deleted file mode 100644 index 088d77e..0000000 --- a/java/mss-failsafe/userdata/src/main/java/httpauthenticationmechanism/LogoutListener.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package httpauthenticationmechanism; - -import javax.servlet.annotation.WebListener; -import javax.servlet.http.HttpSessionEvent; -import javax.servlet.http.HttpSessionListener; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import controller.person.PersonController; - - -/** - * - * @author Patrick - */ -@WebListener -public class LogoutListener implements HttpSessionListener{ - final static Logger LOGGER = LogManager.getLogger(LogoutListener.class); - - @Override - public void sessionCreated(HttpSessionEvent event) { - // NOOP. - } - - @Override - public void sessionDestroyed(HttpSessionEvent event) { - LOGGER.info("Session destroyed"); - PersonController userManager = (PersonController) event.getSession().getAttribute("user"); - String username = (String) event.getSession().getAttribute("realUsername"); - if (userManager != null && username != null) { - LOGGER.info("not nulls"); - userManager.getLogins().remove(username); - } - } -} diff --git a/java/mss-failsafe/userdata/src/main/java/httpauthenticationmechanism/ManagedPerson.java b/java/mss-failsafe/userdata/src/main/java/httpauthenticationmechanism/ManagedPerson.java deleted file mode 100644 index 8cf9081..0000000 --- a/java/mss-failsafe/userdata/src/main/java/httpauthenticationmechanism/ManagedPerson.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package httpauthenticationmechanism; - -import java.util.HashSet; -import java.util.Set; -import javax.inject.Named; -import javax.enterprise.context.ApplicationScoped; - -/** - * - * @author Patrick - */ -@Named(value = "managedPerson") -@ApplicationScoped -public class ManagedPerson { - - private Set logins; - - /** - * Creates a new instance of ManagedCustomer - */ - public ManagedPerson() { - } - - public Set getLogins(){ - if (this.logins == null) { - this.logins = new HashSet<>(); - } - - return this.logins; - } - - public void addLogin(String user){ - getLogins().add(user); - } - - public void removeLogin(String user){ - getLogins().remove(user); - } - -} diff --git a/java/mss-failsafe/userdata/src/main/java/model/AbstractEntity.java b/java/mss-failsafe/userdata/src/main/java/model/AbstractEntity.java deleted file mode 100644 index c61176a..0000000 --- a/java/mss-failsafe/userdata/src/main/java/model/AbstractEntity.java +++ /dev/null @@ -1,89 +0,0 @@ -package model; - - -import java.io.Serializable; -import java.time.LocalDateTime; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.MappedSuperclass; - -/** - * - * @author Patrick Plate - */ -@MappedSuperclass -public class AbstractEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - private LocalDateTime changedDate; - - private LocalDateTime creationDate; - - private boolean outdated; - - public AbstractEntity() { - this.creationDate = LocalDateTime.now(); - this.changedDate = this.creationDate; - this.outdated = false; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - @Override - public int hashCode() { - int hash = 0; - hash += (id != null ? id.hashCode() : 0); - return hash; - } - - @Override - public boolean equals(Object object) { - if (object == null) { - return false; - } - if (!(object.getClass() == this.getClass())) { - return false; - } - AbstractEntity other = (AbstractEntity) object; - if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { - return false; - } - return true; - } - - public boolean isOutdated() { - return outdated; - } - - public void setOutdated(boolean outdated) { - this.outdated = outdated; - } - - public LocalDateTime getChangedDate() { - return changedDate; - } - - public void setChangedDate(LocalDateTime changedDate) { - this.changedDate = changedDate; - } - - public void setCreationDate (LocalDateTime creationDate) { - this.creationDate = creationDate; - } - - public LocalDateTime getCreationDate() { - return creationDate; - } -} diff --git a/java/mss-failsafe/userdata/src/main/java/model/person/Password.java b/java/mss-failsafe/userdata/src/main/java/model/person/Password.java deleted file mode 100644 index d784e91..0000000 --- a/java/mss-failsafe/userdata/src/main/java/model/person/Password.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package model.person; - -import java.util.Arrays; -import java.util.Objects; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.OneToOne; - -import model.AbstractEntity; - -/** - * - * @author Patrick - */ -@Entity -@NamedQueries({ - @NamedQuery(name = "Password.findByPassword", - query = "SELECT p FROM Password p WHERE p.password = :password"), - @NamedQuery(name = "Password.findByCostumerID", - query = "SELECT p FROM Password p WHERE p.person = :person") -}) -public class Password extends AbstractEntity { - private static final long serialVersionUID = -1924150926160449302L; - - @OneToOne - private Person person; - - @Column(name="password") - private byte[] password; - - public Password() { - } - - public Password (Person person, byte[] password) { - this.person = person; - this.password = password; - } - - public Person getPerson() { - return person; - } - - public byte[] getPassword() { - return password; - } - - public void setPassowrd(byte[] password){ - this.password = password; - } - - @Override - public int hashCode() { - int hash = 3; - hash = 79 * hash + Objects.hashCode(this.person); - hash = 79 * hash + Arrays.hashCode(this.password); - return hash; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final Password other = (Password) obj; - if (!Objects.equals(this.person, other.person)) { - return false; - } - if (!Arrays.equals(this.password, other.password)) { - return false; - } - return true; - } -} diff --git a/java/mss-failsafe/userdata/src/main/java/model/person/Person.java b/java/mss-failsafe/userdata/src/main/java/model/person/Person.java deleted file mode 100644 index d5db1e2..0000000 --- a/java/mss-failsafe/userdata/src/main/java/model/person/Person.java +++ /dev/null @@ -1,215 +0,0 @@ -package model.person; - -import model.person.enums.Call; -import java.io.Serializable; -import java.util.AbstractSet; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import javax.persistence.*; - -import model.AbstractEntity; -import model.person.enums.UserGroup; - -/** - * Entity implementation class for Entity: User - * - */ -@Entity -@Inheritance(strategy = InheritanceType.JOINED) -@NamedQueries({ - @NamedQuery(name = Person.FIND_BY_EMAIL, - query = "SELECT p FROM Person p WHERE p.email = :email"), - @NamedQuery(name = Person.FIND_BY_ID, - query = "SELECT p FROM Person p WHERE p.id = :id"), - @NamedQuery(name = Person.FIND_BY_TOKEN, - query = "SELECT p FROM Person p inner join p.tokens t where t.tokenHash = :tokenHash and t.tokenType = :tokenType and t.expiration > :timestamp") -}) -public class Person extends AbstractEntity implements Serializable { - - public static final String FIND_BY_EMAIL = "Person.findByEmail"; - public static final String FIND_BY_ID = "Person.findByID"; - public static final String FIND_BY_TOKEN = "Person.findByToken"; - - private static final long serialVersionUID = 1L; - - @Column(name = "Email", unique = true, nullable = false) - private String email; - - @OneToOne(cascade = CascadeType.ALL) - @JoinColumn(name = "Password_ID", nullable = false, unique = true) - private Password password; - - @OneToOne(cascade = CascadeType.ALL) - @JoinColumn(name = "Salt_ID", nullable = false, unique = true) - private Salt salt; - - @Enumerated(EnumType.STRING) - @Column(name = "Anrede") - private Call call; - - @OneToMany(mappedBy = "person", orphanRemoval = true, cascade = CascadeType.ALL) - private List tokens; - - @ElementCollection(targetClass = UserGroup.class) - @Enumerated(EnumType.STRING) - @JoinTable(name = "UserGroups", joinColumns = @JoinColumn(name = "UserID")) - @Column(name = "UserGroups", nullable = false) - private Set userGroups; - - @Column(nullable = true) - private String telefon; - - @Column(nullable = true) - private String mobile; - - @Column(nullable = true) - private String fax; - - @Column(nullable = false) - private String firstname; - - @Column(nullable = true) - private String lastname; - - @Column(nullable = true) - private String title; - - @Column(nullable = true) - private boolean active; - - public Person() { - super(); - active = false; - } - - public Person(String email, byte[] password, Salt salt, Set usergroups) { - this.email = email; - this.tokens = new ArrayList<>(); - this.salt = salt; - this.password = new Password(this, password); - this.userGroups = usergroups; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public Password getPassword() { - return password; - } - - public void setPassword(Password password) { - this.password = password; - } - - public Salt getSalt() { - return salt; - } - - public void setSalt(Salt salt) { - this.salt = salt; - } - - public Call getCall() { - return call; - } - - public void setCall(Call call) { - this.call = call; - } - - public String getTelefon() { - return telefon; - } - - public void setTelefon(String telefon) { - this.telefon = telefon; - } - - public String getMobile() { - return mobile; - } - - public void setMobile(String mobile) { - this.mobile = mobile; - } - - public String getFax() { - return fax; - } - - public void setFax(String fax) { - this.fax = fax; - } - - public String getFirstname() { - return firstname; - } - - public void setFirstname(String firstname) { - this.firstname = firstname; - } - - public String getLastname() { - return lastname; - } - - public void setLastname(String lastname) { - this.lastname = lastname; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public List getTokens() { - return tokens; - } - - public void setTokens(List tokens) { - this.tokens = tokens; - } - - public void addToken(Token token) { - if (this.tokens == null) { - tokens = new ArrayList<>(); - } - - tokens.add(token); - } - - public Set getUserGroups() { - return userGroups; - } - - public void setUserGroups(Set userGroups) { - this.userGroups = userGroups; - } - - public void addGroup(UserGroup userGroup){ - if (this.userGroups == null) { - this.userGroups = new HashSet<>(); - } - - this.userGroups.add(userGroup); - } - - public boolean isActive() { - return active; - } - - public void setActive(boolean active) { - this.active = active; - } -} diff --git a/java/mss-failsafe/userdata/src/main/java/model/person/Salt.java b/java/mss-failsafe/userdata/src/main/java/model/person/Salt.java deleted file mode 100644 index 1a99251..0000000 --- a/java/mss-failsafe/userdata/src/main/java/model/person/Salt.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package model.person; - -//import java.nio.charset.Charset; -import java.security.SecureRandom; -import java.util.Arrays; -import javax.persistence.Entity; - -import model.AbstractEntity; - -/** - * - * @author Patrick - */ -@Entity -public class Salt extends AbstractEntity { - - //private final Charset UTF8_CHARSET = Charset.forName("UTF-8"); - private static final long serialVersionUID = -1068077226987746862L; - private byte[] salt; - private int interations; - - public Salt() { - interations = 3072; - generateSalt(); - } - - private void generateSalt() { - SecureRandom random = new SecureRandom(); - byte bytes[] = new byte[64]; - random.nextBytes(bytes); - salt = bytes; - } - - public java.lang.String bytetoString(byte[] input) { - return Arrays.toString(input); - } - - public byte[] getSalt() { - return salt; - } - - public int getInterations() { - return interations; - } - - @Override - public int hashCode() { - int hash = 7; - hash = 79 * hash + Arrays.hashCode(this.salt); - hash = 79 * hash + this.interations; - return hash; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final Salt other = (Salt) obj; - if (this.interations != other.interations) { - return false; - } - if (!Arrays.equals(this.salt, other.salt)) { - return false; - } - return true; - } -} diff --git a/java/mss-failsafe/userdata/src/main/java/model/person/Token.java b/java/mss-failsafe/userdata/src/main/java/model/person/Token.java deleted file mode 100644 index bb21f45..0000000 --- a/java/mss-failsafe/userdata/src/main/java/model/person/Token.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package model.person; - -import model.person.enums.TokenType; -import static java.time.temporal.ChronoUnit.MONTHS; -import java.time.Instant; -import java.util.Objects; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; -import javax.persistence.FetchType; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.PrePersist; -import javax.persistence.Table; -import javax.persistence.UniqueConstraint; -import model.AbstractEntity; - -/** - * - * @author Patrick - */ -@Entity -@Table(name = "token", uniqueConstraints = { - @UniqueConstraint(columnNames = {"token_hash"}) -}) -@NamedQueries({ - @NamedQuery(name = Token.REMOVE_TOKEN, query = "DELETE FROM Token t where t.tokenHash = :tokenHash"), - @NamedQuery(name = Token.REMOVE_EXPIRED_TOKEN, query = "DELETE FROM Token t where t.expiration < :timestamp") -}) -public class Token extends AbstractEntity { - - private static final long serialVersionUID = -6632692800064453512L; - public static final String REMOVE_TOKEN = "Token.removeToken"; - public static final String REMOVE_EXPIRED_TOKEN = "Token.removeExpiredToken"; - - @Column(name = "token_hash") - private String tokenHash; - - @Column(name = "token_type") - @Enumerated(EnumType.STRING) - private TokenType tokenType; - - @Column(name = "ip_address", length = 45) - private String ipAddress; - - private String description; - - private Instant created; - - private Instant expiration; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "account_id") - private Person person; - - public Token() { - } - - @PrePersist - public void generateInformation() { - this.created = Instant.now(); - if (this.expiration == null) { - this.expiration = this.created.plus(1, MONTHS); - } - } - - public String getTokenHash() { - return tokenHash; - } - - public void setTokenHash(String tokenHash) { - this.tokenHash = tokenHash; - } - - public TokenType getTokenType() { - return tokenType; - } - - public void setTokenType(TokenType tokenType) { - this.tokenType = tokenType; - } - - public String getIpAddress() { - return ipAddress; - } - - public void setIpAddress(String ipAddress) { - this.ipAddress = ipAddress; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public Instant getCreated() { - return created; - } - - public void setCreated(Instant created) { - this.created = created; - } - - public Instant getExpiration() { - return expiration; - } - - public void setExpiration(Instant expiration) { - this.expiration = expiration; - } - - public Person getPerson() { - return person; - } - - public void setPerson(Person person) { - this.person = person; - } - - /* don't depend on natural identifier for equality checks, see: https://vladmihalcea.com/2017/03/29/the-best-way-to-map-a-onetomany-association-with-jpa-and-hibernate/#more-7143 */ - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null || getClass() != obj.getClass()) { - return false; - } - Token token = (Token) obj; - return Objects.equals(getId(), token.getId()); - } - - @Override - public int hashCode() { - return Objects.hash(getId()); - } - - @Override - public String toString() { - return "Token{ id " + getId() + '}'; - } -} diff --git a/java/mss-failsafe/userdata/src/main/java/model/person/enums/Call.java b/java/mss-failsafe/userdata/src/main/java/model/person/enums/Call.java deleted file mode 100644 index b190dbc..0000000 --- a/java/mss-failsafe/userdata/src/main/java/model/person/enums/Call.java +++ /dev/null @@ -1,56 +0,0 @@ -package model.person.enums; - -import java.util.Locale; - -public enum Call { - HERR(0), FRAU(1), DIVERS(2), UNBESTIMMT(3); - - private final int type; - private Locale locale = null; - - private Call(int type) { - this.type = type; - } - - public Locale getLocale() { - return locale; - } - - public void setLocale(Locale locale) { - this.locale = locale; - } - - public int getType() { - return type; - } - - @Override - public String toString() { - if (locale == null || Locale.GERMAN.equals(locale)) { - switch (this) { - case HERR: - return "Herr"; - case FRAU: - return "Frau"; - case DIVERS: - return "Divers"; - case UNBESTIMMT: - return "Unbestimmt"; - } - } - - if (locale.equals(Locale.ENGLISH)) { - switch (this) { - case HERR: - return "Mr"; - case FRAU: - return "Mrs"; - case DIVERS: - return "divers"; - case UNBESTIMMT: - return "unknown"; - } - } - return super.toString(); - } -} diff --git a/java/mss-failsafe/userdata/src/main/java/model/person/enums/TokenType.java b/java/mss-failsafe/userdata/src/main/java/model/person/enums/TokenType.java deleted file mode 100644 index e592454..0000000 --- a/java/mss-failsafe/userdata/src/main/java/model/person/enums/TokenType.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package model.person.enums; - -/** - * - * @author Patrick - */ -public enum TokenType { - REMEMBER_ME, - API, - RESET_PASSWORD, - FILE -} diff --git a/java/mss-failsafe/userdata/src/main/java/model/person/enums/UserGroup.java b/java/mss-failsafe/userdata/src/main/java/model/person/enums/UserGroup.java deleted file mode 100644 index 6aba03b..0000000 --- a/java/mss-failsafe/userdata/src/main/java/model/person/enums/UserGroup.java +++ /dev/null @@ -1,16 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package model.person.enums; - -/** - * - * @author patri - */ -public enum UserGroup { - USER, - ADMIN, - CUSTOMER; -} diff --git a/java/mss-failsafe/userdata/src/main/resources/META-INF/persistence.xml b/java/mss-failsafe/userdata/src/main/resources/META-INF/persistence.xml deleted file mode 100644 index e9b1e5c..0000000 --- a/java/mss-failsafe/userdata/src/main/resources/META-INF/persistence.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - java:/mss-failsave - model.person.Token - model.person.Salt - model.person.Person - model.person.Password - - - - - diff --git a/java/mss-failsafe/userdata/target/classes/META-INF/persistence.xml b/java/mss-failsafe/userdata/target/classes/META-INF/persistence.xml deleted file mode 100644 index e9b1e5c..0000000 --- a/java/mss-failsafe/userdata/target/classes/META-INF/persistence.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - java:/mss-failsave - model.person.Token - model.person.Salt - model.person.Person - model.person.Password - - - - - diff --git a/java/mss-failsafe/userdata/target/classes/business/user/DemoManager.class b/java/mss-failsafe/userdata/target/classes/business/user/DemoManager.class deleted file mode 100644 index b59f051..0000000 Binary files a/java/mss-failsafe/userdata/target/classes/business/user/DemoManager.class and /dev/null differ diff --git a/java/mss-failsafe/userdata/target/classes/business/user/PasswordManager.class b/java/mss-failsafe/userdata/target/classes/business/user/PasswordManager.class deleted file mode 100644 index 4cc9627..0000000 Binary files a/java/mss-failsafe/userdata/target/classes/business/user/PasswordManager.class and /dev/null differ diff --git a/java/mss-failsafe/userdata/target/classes/business/user/PersonManager.class b/java/mss-failsafe/userdata/target/classes/business/user/PersonManager.class deleted file mode 100644 index 78d0a33..0000000 Binary files a/java/mss-failsafe/userdata/target/classes/business/user/PersonManager.class and /dev/null differ diff --git a/java/mss-failsafe/userdata/target/classes/business/user/TokenManager.class b/java/mss-failsafe/userdata/target/classes/business/user/TokenManager.class deleted file mode 100644 index e6a5823..0000000 Binary files a/java/mss-failsafe/userdata/target/classes/business/user/TokenManager.class and /dev/null differ diff --git a/java/mss-failsafe/userdata/target/classes/controller/AbstractController.class b/java/mss-failsafe/userdata/target/classes/controller/AbstractController.class deleted file mode 100644 index 8ec7f64..0000000 Binary files a/java/mss-failsafe/userdata/target/classes/controller/AbstractController.class and /dev/null differ diff --git a/java/mss-failsafe/userdata/target/classes/controller/person/PersonController.class b/java/mss-failsafe/userdata/target/classes/controller/person/PersonController.class deleted file mode 100644 index 88b6bf7..0000000 Binary files a/java/mss-failsafe/userdata/target/classes/controller/person/PersonController.class and /dev/null differ diff --git a/java/mss-failsafe/userdata/target/classes/exception/AbstractBusinessException.class b/java/mss-failsafe/userdata/target/classes/exception/AbstractBusinessException.class deleted file mode 100644 index e673ad1..0000000 Binary files a/java/mss-failsafe/userdata/target/classes/exception/AbstractBusinessException.class and /dev/null differ diff --git a/java/mss-failsafe/userdata/target/classes/exception/InvalidCredentialException.class b/java/mss-failsafe/userdata/target/classes/exception/InvalidCredentialException.class deleted file mode 100644 index 0623e7b..0000000 Binary files a/java/mss-failsafe/userdata/target/classes/exception/InvalidCredentialException.class and /dev/null differ diff --git a/java/mss-failsafe/userdata/target/classes/exception/InvalidEmailException.class b/java/mss-failsafe/userdata/target/classes/exception/InvalidEmailException.class deleted file mode 100644 index b1d53fa..0000000 Binary files a/java/mss-failsafe/userdata/target/classes/exception/InvalidEmailException.class and /dev/null differ diff --git a/java/mss-failsafe/userdata/target/classes/exception/InvalidPasswordException.class b/java/mss-failsafe/userdata/target/classes/exception/InvalidPasswordException.class deleted file mode 100644 index 798d2fd..0000000 Binary files a/java/mss-failsafe/userdata/target/classes/exception/InvalidPasswordException.class and /dev/null differ diff --git a/java/mss-failsafe/userdata/target/classes/exception/PersonInaktiveException.class b/java/mss-failsafe/userdata/target/classes/exception/PersonInaktiveException.class deleted file mode 100644 index 7a5d1b9..0000000 Binary files a/java/mss-failsafe/userdata/target/classes/exception/PersonInaktiveException.class and /dev/null differ diff --git a/java/mss-failsafe/userdata/target/classes/httpauthenticationmechanism/AppIdentityStore.class b/java/mss-failsafe/userdata/target/classes/httpauthenticationmechanism/AppIdentityStore.class deleted file mode 100644 index 1061799..0000000 Binary files a/java/mss-failsafe/userdata/target/classes/httpauthenticationmechanism/AppIdentityStore.class and /dev/null differ diff --git a/java/mss-failsafe/userdata/target/classes/httpauthenticationmechanism/AppRememberMeIdentityStore.class b/java/mss-failsafe/userdata/target/classes/httpauthenticationmechanism/AppRememberMeIdentityStore.class deleted file mode 100644 index e9c1829..0000000 Binary files a/java/mss-failsafe/userdata/target/classes/httpauthenticationmechanism/AppRememberMeIdentityStore.class and /dev/null differ diff --git a/java/mss-failsafe/userdata/target/classes/httpauthenticationmechanism/ApplicationConfig.class b/java/mss-failsafe/userdata/target/classes/httpauthenticationmechanism/ApplicationConfig.class deleted file mode 100644 index 194ee73..0000000 Binary files a/java/mss-failsafe/userdata/target/classes/httpauthenticationmechanism/ApplicationConfig.class and /dev/null differ diff --git a/java/mss-failsafe/userdata/target/classes/httpauthenticationmechanism/LogoutListener.class b/java/mss-failsafe/userdata/target/classes/httpauthenticationmechanism/LogoutListener.class deleted file mode 100644 index 92c1b5c..0000000 Binary files a/java/mss-failsafe/userdata/target/classes/httpauthenticationmechanism/LogoutListener.class and /dev/null differ diff --git a/java/mss-failsafe/userdata/target/classes/httpauthenticationmechanism/ManagedPerson.class b/java/mss-failsafe/userdata/target/classes/httpauthenticationmechanism/ManagedPerson.class deleted file mode 100644 index 357e51c..0000000 Binary files a/java/mss-failsafe/userdata/target/classes/httpauthenticationmechanism/ManagedPerson.class and /dev/null differ diff --git a/java/mss-failsafe/userdata/target/classes/model/AbstractEntity.class b/java/mss-failsafe/userdata/target/classes/model/AbstractEntity.class deleted file mode 100644 index b8afa87..0000000 Binary files a/java/mss-failsafe/userdata/target/classes/model/AbstractEntity.class and /dev/null differ diff --git a/java/mss-failsafe/userdata/target/classes/model/person/Password.class b/java/mss-failsafe/userdata/target/classes/model/person/Password.class deleted file mode 100644 index 0068d6c..0000000 Binary files a/java/mss-failsafe/userdata/target/classes/model/person/Password.class and /dev/null differ diff --git a/java/mss-failsafe/userdata/target/classes/model/person/Person.class b/java/mss-failsafe/userdata/target/classes/model/person/Person.class deleted file mode 100644 index 9c57a95..0000000 Binary files a/java/mss-failsafe/userdata/target/classes/model/person/Person.class and /dev/null differ diff --git a/java/mss-failsafe/userdata/target/classes/model/person/Salt.class b/java/mss-failsafe/userdata/target/classes/model/person/Salt.class deleted file mode 100644 index 79e72b8..0000000 Binary files a/java/mss-failsafe/userdata/target/classes/model/person/Salt.class and /dev/null differ diff --git a/java/mss-failsafe/userdata/target/classes/model/person/Token.class b/java/mss-failsafe/userdata/target/classes/model/person/Token.class deleted file mode 100644 index d7781ff..0000000 Binary files a/java/mss-failsafe/userdata/target/classes/model/person/Token.class and /dev/null differ diff --git a/java/mss-failsafe/userdata/target/classes/model/person/enums/Call$1.class b/java/mss-failsafe/userdata/target/classes/model/person/enums/Call$1.class deleted file mode 100644 index 5311755..0000000 Binary files a/java/mss-failsafe/userdata/target/classes/model/person/enums/Call$1.class and /dev/null differ diff --git a/java/mss-failsafe/userdata/target/classes/model/person/enums/Call.class b/java/mss-failsafe/userdata/target/classes/model/person/enums/Call.class deleted file mode 100644 index 56aad5b..0000000 Binary files a/java/mss-failsafe/userdata/target/classes/model/person/enums/Call.class and /dev/null differ diff --git a/java/mss-failsafe/userdata/target/classes/model/person/enums/TokenType.class b/java/mss-failsafe/userdata/target/classes/model/person/enums/TokenType.class deleted file mode 100644 index f8bf253..0000000 Binary files a/java/mss-failsafe/userdata/target/classes/model/person/enums/TokenType.class and /dev/null differ diff --git a/java/mss-failsafe/userdata/target/classes/model/person/enums/UserGroup.class b/java/mss-failsafe/userdata/target/classes/model/person/enums/UserGroup.class deleted file mode 100644 index 21dd0e6..0000000 Binary files a/java/mss-failsafe/userdata/target/classes/model/person/enums/UserGroup.class and /dev/null differ diff --git a/java/mss-failsafe/userdata/target/maven-archiver/pom.properties b/java/mss-failsafe/userdata/target/maven-archiver/pom.properties deleted file mode 100644 index 5135056..0000000 --- a/java/mss-failsafe/userdata/target/maven-archiver/pom.properties +++ /dev/null @@ -1,5 +0,0 @@ -#Generated by Maven -#Mon Oct 11 22:39:39 CEST 2021 -groupId=plate.software -artifactId=userdata -version=1.0-SNAPSHOT diff --git a/java/mss-failsafe/userdata/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/java/mss-failsafe/userdata/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted file mode 100644 index 795ec9e..0000000 --- a/java/mss-failsafe/userdata/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ /dev/null @@ -1,25 +0,0 @@ -model\person\Password.class -httpauthenticationmechanism\AppRememberMeIdentityStore.class -model\person\enums\Call.class -business\user\PersonManager.class -business\user\TokenManager.class -exception\InvalidPasswordException.class -model\person\Salt.class -httpauthenticationmechanism\LogoutListener.class -httpauthenticationmechanism\ManagedPerson.class -exception\PersonInaktiveException.class -model\person\enums\UserGroup.class -controller\AbstractController.class -business\user\PasswordManager.class -model\person\enums\Call$1.class -controller\person\PersonController.class -exception\AbstractBusinessException.class -httpauthenticationmechanism\AppIdentityStore.class -model\person\enums\TokenType.class -httpauthenticationmechanism\ApplicationConfig.class -model\person\Person.class -business\user\DemoManager.class -model\AbstractEntity.class -exception\InvalidEmailException.class -model\person\Token.class -exception\InvalidCredentialException.class diff --git a/java/mss-failsafe/userdata/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/java/mss-failsafe/userdata/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index e020b8f..0000000 --- a/java/mss-failsafe/userdata/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1,24 +0,0 @@ -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userdata\src\main\java\exception\AbstractBusinessException.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userdata\src\main\java\business\user\DemoManager.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userdata\src\main\java\httpauthenticationmechanism\AppRememberMeIdentityStore.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userdata\src\main\java\model\person\enums\TokenType.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userdata\src\main\java\model\person\Salt.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userdata\src\main\java\exception\InvalidCredentialException.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userdata\src\main\java\business\user\TokenManager.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userdata\src\main\java\model\person\enums\Call.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userdata\src\main\java\httpauthenticationmechanism\ApplicationConfig.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userdata\src\main\java\business\user\PersonManager.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userdata\src\main\java\controller\person\PersonController.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userdata\src\main\java\exception\InvalidPasswordException.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userdata\src\main\java\exception\PersonInaktiveException.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userdata\src\main\java\httpauthenticationmechanism\LogoutListener.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userdata\src\main\java\controller\AbstractController.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userdata\src\main\java\model\person\Password.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userdata\src\main\java\httpauthenticationmechanism\AppIdentityStore.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userdata\src\main\java\httpauthenticationmechanism\ManagedPerson.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userdata\src\main\java\model\AbstractEntity.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userdata\src\main\java\model\person\Person.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userdata\src\main\java\exception\InvalidEmailException.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userdata\src\main\java\business\user\PasswordManager.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userdata\src\main\java\model\person\enums\UserGroup.java -C:\Users\patri\Documents\NetBeansProjects\mss-failsafe\userdata\src\main\java\model\person\Token.java diff --git a/java/mss-failsafe/userdata/target/userdata-1.0-SNAPSHOT.jar b/java/mss-failsafe/userdata/target/userdata-1.0-SNAPSHOT.jar deleted file mode 100644 index c512a18..0000000 Binary files a/java/mss-failsafe/userdata/target/userdata-1.0-SNAPSHOT.jar and /dev/null differ