From 2a67b0b43b3bd3a568a94330471145cbc1973350 Mon Sep 17 00:00:00 2001 From: Stefan Szczesny Date: Wed, 15 Jun 2016 16:50:12 +0200 Subject: [PATCH] #2 Zwischenstand: Neue Klassen --- .../symeda/sormas/api/person/PersonDto.java | 40 +++ .../sormas/api/person/PersonFacade.java | 15 + .../sormas/backend/caze/CaseFacadeEjb.java | 86 ++++++ .../sormas/backend/caze/CaseService.java | 58 ++++ .../backend/common/AbstractAdoService.java | 177 +++++++++++ .../sormas/backend/common/AdoService.java | 63 ++++ .../backend/person/PersonFacadeEjb.java | 55 ++++ .../sormas/backend/person/PersonService.java | 43 +++ .../sormas/backend/user/Permission.java | 284 ++++++++++++++++++ .../sormas/backend/util/ModelConstants.java | 7 + 10 files changed, 828 insertions(+) create mode 100644 sormas-api/src/de/symeda/sormas/api/person/PersonDto.java create mode 100644 sormas-api/src/de/symeda/sormas/api/person/PersonFacade.java create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractAdoService.java create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/common/AdoService.java create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/person/PersonFacadeEjb.java create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/person/PersonService.java create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/user/Permission.java create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/util/ModelConstants.java diff --git a/sormas-api/src/de/symeda/sormas/api/person/PersonDto.java b/sormas-api/src/de/symeda/sormas/api/person/PersonDto.java new file mode 100644 index 00000000000..75577fee22d --- /dev/null +++ b/sormas-api/src/de/symeda/sormas/api/person/PersonDto.java @@ -0,0 +1,40 @@ +package de.symeda.sormas.api.person; + +import de.symeda.sormas.api.caze.DataTransferObject; + +public class PersonDto extends DataTransferObject { + + private static final long serialVersionUID = -8558187171374254398L; + + public static final String FIRST_NAME = "firstName"; + public static final String LAST_NAME = "lastName"; + + private String firstName; + private String lastName; + + + + 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; + } + + + @Override + public String toString() { + return firstName + " " + lastName; + } + + +} diff --git a/sormas-api/src/de/symeda/sormas/api/person/PersonFacade.java b/sormas-api/src/de/symeda/sormas/api/person/PersonFacade.java new file mode 100644 index 00000000000..5f718a8de50 --- /dev/null +++ b/sormas-api/src/de/symeda/sormas/api/person/PersonFacade.java @@ -0,0 +1,15 @@ +package de.symeda.sormas.api.person; + +import java.util.List; + +import javax.ejb.Remote; + +@Remote +public interface PersonFacade { + + public abstract List getAllPerson(); + + public abstract PersonDto getByUuid(String uuid); + + public abstract PersonDto savePerson(PersonDto dto); +} diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java new file mode 100644 index 00000000000..4808ac45e6b --- /dev/null +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java @@ -0,0 +1,86 @@ +package de.symeda.sormas.backend.caze; + +import java.util.ArrayList; +import java.util.List; + +import javax.ejb.EJB; +import javax.ejb.Singleton; + +import de.symeda.sormas.api.caze.CaseDto; +import de.symeda.sormas.api.caze.CaseFacade; +import de.symeda.sormas.api.person.PersonDto; +import de.symeda.sormas.api.person.PersonFacade; +import de.symeda.sormas.backend.mock.MockDataGenerator; +import de.symeda.sormas.backend.person.PersonFacadeEjb; +import de.symeda.sormas.backend.person.PersonService; + +@Singleton(name = "CaseFacade") +public class CaseFacadeEjb implements CaseFacade { + + @EJB + private CaseService cs; + + @EJB + private PersonService ps; + + @EJB + private PersonFacade pf; + + private List cases; + + @Override + public List getAllCases() { + List casesDB = cs.getAll(); + cases = new ArrayList<>(); + if(casesDB!=null && casesDB.size()>0) { + for (Case caze : casesDB) { + cases.add(toDto(caze)); + } + } + return cases; + } + + @Override + public CaseDto getByUuid(String uuid) { + return cases.stream().filter(c -> c.getUuid().equals(uuid)).findFirst().orElse(null); + } + + @Override + public CaseDto saveCase(CaseDto dto) { + +// if(dto.getPerson() != null) { +// PersonDto personDto = pf.savePerson(dto.getPerson()); +// dto.setPersonDto(personDto); +// } + + Case caze = cs.toCase(dto); + cs.ensurePersisted(caze); + + return toDto(caze); + + } + + @Override + public void createDemo() { + List cases = MockDataGenerator.createCases(); + for (CaseDto dto : cases) { + PersonDto personDto = MockDataGenerator.createPerson(); + //personDto = pf.savePerson(personDto); + dto.setPersonDto(personDto); + saveCase(dto); + + } + } + + public static CaseDto toDto(Case caze) { + CaseDto dto = new CaseDto(); + dto.setUuid(caze.getUuid()); + dto.setCaseStatus(caze.getCaseStatus()); + dto.setDescription(caze.getDescription()); + + dto.setPersonDto(PersonFacadeEjb.toDto(caze.getPerson())); + + return dto; + } + +} diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java new file mode 100644 index 00000000000..d9a7ce528cf --- /dev/null +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java @@ -0,0 +1,58 @@ +package de.symeda.sormas.backend.caze; + +import javax.ejb.EJB; +import javax.ejb.LocalBean; +import javax.ejb.Stateless; +import javax.validation.constraints.NotNull; + +import de.symeda.sormas.api.caze.CaseDto; +import de.symeda.sormas.backend.common.AbstractAdoService; +import de.symeda.sormas.backend.person.Person; +import de.symeda.sormas.backend.person.PersonService; + + + +@Stateless +@LocalBean +//@RolesAllowed({ +// Permission._ADMIN, +// Permission._USER }) +//@DeclareRoles({ +// Permission._ADMIN, +// Permission._USER }) +public class CaseService extends AbstractAdoService { + + @EJB + private PersonService ps; + + public CaseService() { + super(Case.class); + } + + public Case createCase(Person person) { + + Case caze = new Case(); + caze.setPerson(person); + return caze; + } + + public Case toCase(@NotNull CaseDto dto) { + Case caze = getByUuid(dto.getUuid()); + + Person person; + if(dto.getPerson()!=null) { + person = ps.toPerson(dto.getPerson()); + } + else { + person = ps.createPerson(); + } + if(caze==null) { + caze = createCase(person); + } + caze.setUuid(dto.getUuid()); + caze.setPerson(person); + caze.setDescription(dto.getDescription()); + caze.setCaseStatus(dto.getCaseStatus()); + return caze; + } +} diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractAdoService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractAdoService.java new file mode 100644 index 00000000000..ea32c010768 --- /dev/null +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractAdoService.java @@ -0,0 +1,177 @@ +package de.symeda.sormas.backend.common; + +import java.sql.Timestamp; +import java.util.List; + +import javax.annotation.Resource; +import javax.annotation.security.DeclareRoles; +import javax.ejb.SessionContext; +import javax.persistence.EntityExistsException; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; + + +import de.symeda.sormas.backend.common.AbstractDomainObject; +import de.symeda.sormas.backend.user.Permission; +import de.symeda.sormas.backend.util.ModelConstants; + +/** + * @author Martin Wahnschaffe + * @param + */ +public abstract class AbstractAdoService implements AdoService { + + + @Resource + private SessionContext context; + + private final Class elementClass; + + @PersistenceContext(unitName = ModelConstants.PERSISTENCE_UNIT_NAME) + protected EntityManager em; + + public AbstractAdoService(Class elementClass) { + this.elementClass = elementClass; + } + + protected Class getElementClass() { + return elementClass; + } + + @Override + protected Object clone() throws CloneNotSupportedException { + throw new CloneNotSupportedException(); + } + + @Override + public List getAll() { + + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(getElementClass()); + Root from = cq.from(getElementClass()); + cq.orderBy(cb.asc(from.get(AbstractDomainObject.ID))); + + return em.createQuery(cq).getResultList(); + } + + @Override + public ADO getById(long id) { + ADO result = em.find(getElementClass(), id); + return result; + } + + @Override + public ADO getByUuid(String uuid) { + //ADO result = JpaHelper.simpleSingleQuery(em, getElementClass(), AbstractDomainObject.UUID, uuid); + return null; + } + + @Override + public void ensurePersisted(ADO ado) throws EntityExistsException { + if (ado.getId() == null) { + em.persist(ado); + } else if (!em.contains(ado)) { + throw new EntityExistsException("Das Entity ist nicht attacht: " + getElementClass().getSimpleName() + "#" + ado.getUuid()); + } + } + + @Override + public void persist(ADO persistme) { + em.persist(persistme); + } + + @Override + public void delete(ADO deleteme) { + em.remove(deleteme); + em.flush(); + } + + @Override + public ADO merge(ADO mergeme) { + return em.merge(mergeme); + } + + @Override + public void doFlush() { + em.flush(); + } + + /** + * Achtung: Für korrekte Funktion muss die aufrufende Klasse {@link Permission#_SYSTEM_ROLE} in {@link DeclareRoles} definiert + * haben. + * + * @return {@code true}, wenn das System selbst der ausführende Benutzer ist. + */ + protected boolean isSystem() { + return context.isCallerInRole(Permission._SYSTEM_ROLE); + } + + /** + * Achtung: Für korrekte Funktion muss die aufrufende Klasse {@link Permission#_ADMIN} in {@link DeclareRoles} definiert + * haben. + * + * @return {@code true}, wenn der ausführende Benutzer {@link Permission#ADMIN} hat. + */ + protected boolean isAdmin() { + return hasPermission(Permission.ADMIN); + } + + /** + * Achtung: Für korrekte Funktion muss die aufrufende Klasse die entsprechende Permission in {@link DeclareRoles} definiert + * haben. + * + * @param permission + * @return {@code true}, wenn der ausführende Benutzer die angegebene {@code permission} hat. + */ + protected boolean hasPermission(Permission permission) { + return context.isCallerInRole(permission.name()); + } + + protected Timestamp requestTransactionDate() { + return (Timestamp) this.em.createNativeQuery("SELECT NOW()").getSingleResult(); + } + + /** + * Prüft, ob ein eindeutig zu vergebener Wert bereits durch eine andere Entity verwendet wird. + * + * @param uuid + * uuid der aktuell in Bearbeitung befindlichen Entity. + * @param propertyName + * Attribut-Name des zu prüfenden Werts. + * @param propertyValue + * Zu prüfender eindeutiger Wert. + * @return + *
    + *
  1. {@code true}, wenn {@code propertyValue == null}.
  2. + *
  3. {@code true}, wenn {@code propertyValue} durch die Entity mit {@code uuid} verwendet wird.
  4. + *
  5. {@code false}, wenn {@code propertyValue} bereits durch einen andere Entity verwendet wird.
  6. + *
+ */ + protected boolean isUnique(String uuid, String propertyName, Object propertyValue) { + + if (propertyValue == null) { + return true; + } else { + ADO foundEntity = getByUniqueAttribute(propertyName, propertyValue); + return foundEntity == null || foundEntity.getUuid().equals(uuid); + } + } + + /** + * Lädt eine Entity anhand einem als eindeutig erwartetem Attribut. + * + * @param propertyName + * Attribut-Name des zu prüfenden Werts. + * @param propertyValue + * Zu prüfender eindeutiger Wert. + * @return {@code null}, wenn es keine Entity gibt, die {@code propertyValue} gesetzt hat. + */ + protected ADO getByUniqueAttribute(String propertyName, Object propertyValue) { + +// return JpaHelper.simpleSingleQuery(em, elementClass, propertyName, propertyValue); + return null; + } +} diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AdoService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AdoService.java new file mode 100644 index 00000000000..1ee060445ab --- /dev/null +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AdoService.java @@ -0,0 +1,63 @@ +package de.symeda.sormas.backend.common; + +import java.util.List; + +import javax.persistence.EntityExistsException; + +import de.symeda.sormas.backend.common.AbstractDomainObject; + +public interface AdoService { + + List getAll(); + + ADO getById(long id); + + ADO getByUuid(String uuid); + +// /** +// * @deprecated Das ist ein Hibernate-spezifisches Feature +// * @param saveme +// */ +// @Deprecated +// void saveOrUpdate(ADO saveme); + + /** + * DELETES an entity from the database! + * + * @param deleteme + */ + void delete(ADO deleteme); + + /** + * @deprecated re-attachen eines detachten Entities ist eher die Ausnahme + * @param mergeme + * @return + */ + @Deprecated + ADO merge(ADO mergeme); + + /** + * Speichert ein neues Objekt in der Datenbank. + * Es darf vorher keine id haben und ist danch attacht. + */ + void persist(ADO persistme); + + /** + * Zum Speichern, wenn das ado neu oder direkt aus der Datenbank ist.
+ * Ruft persist() für neue Entities auf, + * bei attachten wird nichts gemacht. + *
+ * Das ado ist nach dem Aufruf attacht. + * + * @param ado + * @throws EntityExistsException + * wenn das ado detacht ist + */ + void ensurePersisted(ADO ado) throws EntityExistsException; + + /** + * JPA-Session flushen + */ + void doFlush(); + +} \ No newline at end of file diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/person/PersonFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/person/PersonFacadeEjb.java new file mode 100644 index 00000000000..dfd4425d093 --- /dev/null +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/person/PersonFacadeEjb.java @@ -0,0 +1,55 @@ +package de.symeda.sormas.backend.person; + +import java.util.ArrayList; +import java.util.List; + +import javax.ejb.EJB; +import javax.ejb.Singleton; + +import de.symeda.sormas.api.person.PersonDto; +import de.symeda.sormas.api.person.PersonFacade; + +@Singleton(name = "PersonFacade") +public class PersonFacadeEjb implements PersonFacade { + + @EJB + private PersonService ps; + + private List persons; + + @Override + public List getAllPerson() { + List personsDB = ps.getAll(); + persons = new ArrayList<>(); + if(personsDB!=null && personsDB.size()>0) { + for (Person person : personsDB) { + persons.add(toDto(person)); + } + } + return persons; + } + + @Override + public PersonDto getByUuid(String uuid) { + return persons.stream().filter(c -> c.getUuid().equals(uuid)).findFirst().orElse(null); + } + + @Override + public PersonDto savePerson(PersonDto dto) { + Person person = ps.toPerson(dto); + ps.ensurePersisted(person); + + return toDto(person); + + } + + public static PersonDto toDto(Person person) { + PersonDto dto = new PersonDto(); + dto.setUuid(person.getUuid()); + dto.setFirstName(person.getFirstName()); + dto.setLastName(person.getLastName()); + return dto; + } + + +} diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/person/PersonService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/person/PersonService.java new file mode 100644 index 00000000000..4b0af9aa594 --- /dev/null +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/person/PersonService.java @@ -0,0 +1,43 @@ +package de.symeda.sormas.backend.person; + +import javax.ejb.LocalBean; +import javax.ejb.Stateless; +import javax.validation.constraints.NotNull; + +import de.symeda.sormas.api.person.PersonDto; +import de.symeda.sormas.backend.common.AbstractAdoService; +import de.symeda.sormas.backend.person.Person; + + + +@Stateless +@LocalBean +//@RolesAllowed({ +// Permission._ADMIN, +// Permission._USER }) +//@DeclareRoles({ +// Permission._ADMIN, +// Permission._USER }) +public class PersonService extends AbstractAdoService { + + public PersonService() { + super(Person.class); + } + + public Person createPerson() { + + Person person = new Person(); + return person; + } + + public Person toPerson(@NotNull PersonDto dto) { + Person bo = getByUuid(dto.getUuid()); + if(bo==null) { + bo = createPerson(); + } + bo.setUuid(dto.getUuid()); + bo.setFirstName(dto.getFirstName()); + bo.setLastName(dto.getLastName()); + return bo; + } +} diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/user/Permission.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/Permission.java new file mode 100644 index 00000000000..b2f55345da6 --- /dev/null +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/Permission.java @@ -0,0 +1,284 @@ +package de.symeda.sormas.backend.user; + +import java.util.Arrays; +import java.util.EnumSet; +import java.util.LinkedHashSet; +import java.util.Set; + +/** + * Hier werden alle Rechte aufgelistet die für das System relevant sind.
+ * Gruppierte Rechte wie bearbeitbar, einsehbar usw. müssen einen bestimmten + * Suffix haben, der Präfix wird zum Erstellen der Gruppen genutzt. Innerhalb + * der Gruppen müssen die Rechte über die Child-Hierarchie geordnet sein. + * Es sind alle Suffixe erlaubt, die durch {@link SubPermission} abgebildet werden. + * ACHTUNG: Permissions müssen in die glassfish-ejb-jar.xml des ejb-Projekts eingetragen werden. + * Siehe PermissionIllustrator im test-Bereich. + * + * @RolesAllowed-Annotation an EJB verwendet.
+ */ +public enum Permission + implements + Cloneable { + + /** + * Einsehen der eigenen Klienten (Fallmanager und Mitarbeite der Gruppe) + */ + KLIENTEN_EINSEHEN(), + + EPISODEN_EINSEHEN(KLIENTEN_EINSEHEN), + EPISODEN_ALLE_EINSEHEN(EPISODEN_EINSEHEN), + EPISODEN_BEARBEITEN(EPISODEN_EINSEHEN), + EPISODEN_LOESCHEN(EPISODEN_BEARBEITEN), + + ADRESSBUCH_EINSEHEN(), + ADRESSBUCH_BEARBEITEN(ADRESSBUCH_EINSEHEN), + + ABRECHNUNG_EINSEHEN(), + ABRECHNUNG_BEARBEITEN(ABRECHNUNG_EINSEHEN), + + BENUTZER_EINSEHEN(), + BENUTZER_BEARBEITEN(BENUTZER_EINSEHEN), + BERECHTIGUNGSGRUPPE_EINSEHEN(), + BERECHTIGUNGSGRUPPE_BEARBEITEN(BERECHTIGUNGSGRUPPE_EINSEHEN), + BERECHTIGUNGSGRUPPE_LOESCHEN(BERECHTIGUNGSGRUPPE_BEARBEITEN), + + CONTROLLING_EINSEHEN, + + BEFRAGUNG_EINSEHEN, + BEFRAGUNG_BEARBEITEN(BEFRAGUNG_EINSEHEN), + + STAMMDATEN_EINSEHEN(KLIENTEN_EINSEHEN), + STAMMDATEN_BEARBEITEN(STAMMDATEN_EINSEHEN), + DIAGNOSE_EINSEHEN(KLIENTEN_EINSEHEN), + DIAGNOSE_BEARBEITEN(DIAGNOSE_EINSEHEN), + AUFNAHME_EINSEHEN(KLIENTEN_EINSEHEN), + AUFNAHME_BEARBEITEN(AUFNAHME_EINSEHEN), + ENTLASSUNG_EINSEHEN(KLIENTEN_EINSEHEN), + ENTLASSUNG_BEARBEITEN(ENTLASSUNG_EINSEHEN), + + DOKUMENTE_EINSEHEN(KLIENTEN_EINSEHEN), + DOKUMENTE_BEARBEITEN(DOKUMENTE_EINSEHEN), + DOKUMENTE_LOESCHEN(DOKUMENTE_BEARBEITEN), + + JOURNAL_EINSEHEN(), + JOURNAL_BEARBEITEN(JOURNAL_EINSEHEN), + JOURNAL_LOESCHEN(JOURNAL_BEARBEITEN), + AUFGABEN_EINSEHEN(), + AUFGABEN_BEARBEITEN(AUFGABEN_EINSEHEN), + TERMINE_EINSEHEN(), + TERMINE_BEARBEITEN(TERMINE_EINSEHEN), + + LEISTUNGEN_EINSEHEN(), + LEISTUNGEN_BEARBEITEN(LEISTUNGEN_EINSEHEN), + LEISTUNGEN_LOESCHEN(LEISTUNGEN_BEARBEITEN), + LEISTUNGEN_ALLE_BEARBEITEN(LEISTUNGEN_EINSEHEN), + LEISTUNGEN_ALLE_STATUS_BEARBEITEN(LEISTUNGEN_EINSEHEN), + LEISTUNGEN_ALLE_LOESCHEN(LEISTUNGEN_EINSEHEN), + MASSNAHMEN_EINSEHEN(), + MASSNAHMEN_BEARBEITEN(MASSNAHMEN_EINSEHEN), + MASSNAHMEN_LOESCHEN(MASSNAHMEN_BEARBEITEN), + MASSNAHMEN_ASSIGN_THERAPEUT(MASSNAHMEN_BEARBEITEN), + + // Verwaltung der Therapiegruppen: Anlegen, Bearbeiten, Löschen + GRUPPENVERWALTUNG_EINSEHEN, + GRUPPENVERWALTUNG_BEARBEITEN(GRUPPENVERWALTUNG_EINSEHEN), + + // Kurstermine verwalten (ohne Teilnehmer) + KURSTERMIN_EINSEHEN, + KURSTERMIN_BEARBEITEN(KURSTERMIN_EINSEHEN), + KURSTERMIN_LOESCHEN(KURSTERMIN_BEARBEITEN), + + // Teilnehmer von Kursterminen verwalten + KURSTEILNEHMER_EINSEHEN(EPISODEN_EINSEHEN, KURSTERMIN_EINSEHEN), + KURSTEILNEHMER_BEARBEITEN(KURSTEILNEHMER_EINSEHEN), + + TRAININGSBEREICH_EINSEHEN, + TRAININGSBEREICH_BEARBEITEN(TRAININGSBEREICH_EINSEHEN), + + ADRESSBUCH_ROLLEN_EINSEHEN(), + ADRESSBUCH_ROLLEN_BEARBEITEN(ADRESSBUCH_ROLLEN_EINSEHEN), + + /** + * Einsehen aller Klienten + */ + KLIENTEN_ALLE_EINSEHEN(KLIENTEN_EINSEHEN, EPISODEN_ALLE_EINSEHEN), + KLIENTEN_ANLEGEN(KLIENTEN_EINSEHEN, STAMMDATEN_BEARBEITEN, EPISODEN_BEARBEITEN), + KLIENTEN_LOESCHEN(KLIENTEN_ANLEGEN), + + // ########### Andere Rechte + ADMIN(), + USER(),; + + /* + * ACHTUNG: Zum Pflegen der Konstanten: {@link PermissionIllustrator} + */ + + public static final String _KLIENTEN_EINSEHEN = "KLIENTEN_EINSEHEN"; + public static final String _EPISODEN_EINSEHEN = "EPISODEN_EINSEHEN"; + public static final String _EPISODEN_ALLE_EINSEHEN = "EPISODEN_ALLE_EINSEHEN"; + public static final String _EPISODEN_BEARBEITEN = "EPISODEN_BEARBEITEN"; + public static final String _EPISODEN_LOESCHEN = "EPISODEN_LOESCHEN"; + public static final String _ADRESSBUCH_EINSEHEN = "ADRESSBUCH_EINSEHEN"; + public static final String _ADRESSBUCH_BEARBEITEN = "ADRESSBUCH_BEARBEITEN"; + public static final String _ABRECHNUNG_EINSEHEN = "ABRECHNUNG_EINSEHEN"; + public static final String _ABRECHNUNG_BEARBEITEN = "ABRECHNUNG_BEARBEITEN"; + public static final String _BENUTZER_EINSEHEN = "BENUTZER_EINSEHEN"; + public static final String _BENUTZER_BEARBEITEN = "BENUTZER_BEARBEITEN"; + public static final String _BERECHTIGUNGSGRUPPE_EINSEHEN = "BERECHTIGUNGSGRUPPE_EINSEHEN"; + public static final String _BERECHTIGUNGSGRUPPE_BEARBEITEN = "BERECHTIGUNGSGRUPPE_BEARBEITEN"; + public static final String _BERECHTIGUNGSGRUPPE_LOESCHEN = "BERECHTIGUNGSGRUPPE_LOESCHEN"; + public static final String _CONTROLLING_EINSEHEN = "CONTROLLING_EINSEHEN"; + public static final String _BEFRAGUNG_EINSEHEN = "BEFRAGUNG_EINSEHEN"; + public static final String _BEFRAGUNG_BEARBEITEN = "BEFRAGUNG_BEARBEITEN"; + public static final String _STAMMDATEN_EINSEHEN = "STAMMDATEN_EINSEHEN"; + public static final String _STAMMDATEN_BEARBEITEN = "STAMMDATEN_BEARBEITEN"; + public static final String _DIAGNOSE_EINSEHEN = "DIAGNOSE_EINSEHEN"; + public static final String _DIAGNOSE_BEARBEITEN = "DIAGNOSE_BEARBEITEN"; + public static final String _AUFNAHME_EINSEHEN = "AUFNAHME_EINSEHEN"; + public static final String _AUFNAHME_BEARBEITEN = "AUFNAHME_BEARBEITEN"; + public static final String _ENTLASSUNG_EINSEHEN = "ENTLASSUNG_EINSEHEN"; + public static final String _ENTLASSUNG_BEARBEITEN = "ENTLASSUNG_BEARBEITEN"; + public static final String _DOKUMENTE_EINSEHEN = "DOKUMENTE_EINSEHEN"; + public static final String _DOKUMENTE_BEARBEITEN = "DOKUMENTE_BEARBEITEN"; + public static final String _DOKUMENTE_LOESCHEN = "DOKUMENTE_LOESCHEN"; + public static final String _JOURNAL_EINSEHEN = "JOURNAL_EINSEHEN"; + public static final String _JOURNAL_BEARBEITEN = "JOURNAL_BEARBEITEN"; + public static final String _JOURNAL_LOESCHEN = "JOURNAL_LOESCHEN"; + public static final String _AUFGABEN_EINSEHEN = "AUFGABEN_EINSEHEN"; + public static final String _AUFGABEN_BEARBEITEN = "AUFGABEN_BEARBEITEN"; + public static final String _TERMINE_EINSEHEN = "TERMINE_EINSEHEN"; + public static final String _TERMINE_BEARBEITEN = "TERMINE_BEARBEITEN"; + public static final String _LEISTUNGEN_EINSEHEN = "LEISTUNGEN_EINSEHEN"; + public static final String _LEISTUNGEN_BEARBEITEN = "LEISTUNGEN_BEARBEITEN"; + public static final String _LEISTUNGEN_LOESCHEN = "LEISTUNGEN_LOESCHEN"; + public static final String _LEISTUNGEN_ALLE_BEARBEITEN = "LEISTUNGEN_ALLE_BEARBEITEN"; + public static final String _LEISTUNGEN_ALLE_STATUS_BEARBEITEN = "LEISTUNGEN_ALLE_STATUS_BEARBEITEN"; + public static final String _LEISTUNGEN_ALLE_LOESCHEN = "LEISTUNGEN_ALLE_LOESCHEN"; + public static final String _MASSNAHMEN_EINSEHEN = "MASSNAHMEN_EINSEHEN"; + public static final String _MASSNAHMEN_BEARBEITEN = "MASSNAHMEN_BEARBEITEN"; + public static final String _MASSNAHMEN_LOESCHEN = "MASSNAHMEN_LOESCHEN"; + public static final String _MASSNAHMEN_ASSIGN_THERAPEUT = "MASSNAHMEN_ASSIGN_THERAPEUT"; + public static final String _GRUPPENVERWALTUNG_EINSEHEN = "GRUPPENVERWALTUNG_EINSEHEN"; + public static final String _GRUPPENVERWALTUNG_BEARBEITEN = "GRUPPENVERWALTUNG_BEARBEITEN"; + public static final String _KURSTERMIN_EINSEHEN = "KURSTERMIN_EINSEHEN"; + public static final String _KURSTERMIN_BEARBEITEN = "KURSTERMIN_BEARBEITEN"; + public static final String _KURSTERMIN_LOESCHEN = "KURSTERMIN_LOESCHEN"; + public static final String _KURSTEILNEHMER_EINSEHEN = "KURSTEILNEHMER_EINSEHEN"; + public static final String _KURSTEILNEHMER_BEARBEITEN = "KURSTEILNEHMER_BEARBEITEN"; + public static final String _TRAININGSBEREICH_EINSEHEN = "TRAININGSBEREICH_EINSEHEN"; + public static final String _TRAININGSBEREICH_BEARBEITEN = "TRAININGSBEREICH_BEARBEITEN"; + public static final String _ADRESSBUCH_ROLLEN_EINSEHEN = "ADRESSBUCH_ROLLEN_EINSEHEN"; + public static final String _ADRESSBUCH_ROLLEN_BEARBEITEN = "ADRESSBUCH_ROLLEN_BEARBEITEN"; + public static final String _KLIENTEN_ALLE_EINSEHEN = "KLIENTEN_ALLE_EINSEHEN"; + public static final String _KLIENTEN_ANLEGEN = "KLIENTEN_ANLEGEN"; + public static final String _KLIENTEN_LOESCHEN = "KLIENTEN_LOESCHEN"; + public static final String _ADMIN = "ADMIN"; + public static final String _USER = "USER"; + + // ########### Zusätzliche Rechte + public static final String _SYSTEM_ROLE = "SYSTEM_ROLE"; + + private static final Permission[] SIMPLE_PERMISSIONS = { + ADMIN, }; + + private final Permission[] children; + private Permission[] transitivePermissions = null; + + Permission(Permission... includedPermissions) { + this.children = includedPermissions; + } + + /** + * Simple Rechte, die nicht Teil anderer Rechte sind und die auch keine + * anderen Rechte beinhalten + * + * @return + */ + public static Permission[] getSimplePermissions() { + return SIMPLE_PERMISSIONS; + } + + /** + * Wandelt die übergebenen Permissions in ein Set inkl. der transitiven Permissions. + * + * @param selectedPermissions + * Die aktuell ausgewählten/zugewiesenen Permissions. + * @return {@code selectedPermissions} und daraus folgenden transitiven Permissions als {@link Set}. + */ + public static Set convertWithTransitivePermissions(Permission... selectedPermissions) { + + return convertWithTransitivePermissions(Arrays.asList(selectedPermissions)); + } + + /** + * Wandelt die übergebenen Permissions in ein Set inkl. der transitiven Permissions. + * + * @param selectedPermissions + * Die aktuell ausgewählten/zugewiesenen Permissions. + * @return {@code selectedPermissions} und daraus folgenden transitiven Permissions als {@link Set}. + */ + public static Set convertWithTransitivePermissions(Iterable selectedPermissions) { + + final Set permissionsSet = new LinkedHashSet<>(); + for (Permission permission : selectedPermissions) { + // Direkte Permission + permissionsSet.add(permission); + + // Transitive Permissions + permissionsSet.addAll(Arrays.asList(permission.getTransitivePermissions())); + } + + return permissionsSet; + } + + public String getName() { + return toString(); + } + + public Permission[] getChildren() { + return children.clone(); + } + + /** + * @return Permissions, die aufgrund dieser Permission eingeschlossen sind. + */ + public Permission[] getTransitivePermissions() { + return transitivePermissions; + } + + + private static Permission[] calculateTransitivePermissions(Permission permission) { + + if (permission.transitivePermissions != null) { + return permission.transitivePermissions; + } + EnumSet set; + if (permission.children.length == 0) { + set = EnumSet.noneOf(Permission.class); + } else { + set = EnumSet.copyOf(Arrays.asList(permission.children)); + } + for (Permission child : permission.children) { + Permission[] childPermissions = calculateTransitivePermissions(child); + set.addAll(Arrays.asList(childPermissions)); + } + Permission[] array = set.toArray(new Permission[set.size()]); + Arrays.sort(array); + permission.transitivePermissions = array; + return array; + } + + private static void calculateTransitiveClosure() { + for (Permission permission : Permission.values()) { + calculateTransitivePermissions(permission); + } + } + + /* + * Die transitive Hülle kann erst berechet werden nachdem das Enum + * initialisiert wurde. + */ + static { + calculateTransitiveClosure(); + } +} diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/util/ModelConstants.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/util/ModelConstants.java new file mode 100644 index 00000000000..2aa6244f595 --- /dev/null +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/util/ModelConstants.java @@ -0,0 +1,7 @@ +package de.symeda.sormas.backend.util; + +public interface ModelConstants { + + String PERSISTENCE_UNIT_NAME = "SormasPU"; + +}