diff --git a/.env b/.env index abfd8c55f..31c132e98 100644 --- a/.env +++ b/.env @@ -1,6 +1,6 @@ -TAG=6.2.1 -ENV=dev +TAG=6.3.0 +ENV=prod PROFILE=production -AOT=no-aot -ELASTIC_VERSION=6.2.1 +AOT=aot +ELASTIC_VERSION=6.3.0 ELASTIC_PASSWORD=changeme diff --git a/.gitignore b/.gitignore index a064ebc2a..8bd13f118 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,15 @@ dmp-backend/web/src/main/ui-resources/static/ dmp-backend/data/target/data-1.0-SNAPSHOT.jar dmp-backend/data/target/ dmp-backend/queryable/target/ +dmp-backend/elastic/target/ +dmp-backend/queryengine/target/ +*.tar +*.gz +final/ +temp/ +*.jar +*.lst +dmp-frontend/.vscode/ +*.docx + + diff --git a/ELK.Docker/.env b/ELK.Docker/.env index fcb78b08a..d2aa1da5a 100644 --- a/ELK.Docker/.env +++ b/ELK.Docker/.env @@ -1,3 +1,3 @@ -TAG=6.2.1 -ELASTIC_VERSION=6.2.1 +TAG=6.3.1 +ELASTIC_VERSION=6.3.1 ELASTIC_PASSWORD=changeme diff --git a/ELK.Docker/docker-compose.yml b/ELK.Docker/docker-compose.yml index 28357dce4..e64762965 100644 --- a/ELK.Docker/docker-compose.yml +++ b/ELK.Docker/docker-compose.yml @@ -100,7 +100,72 @@ services: networks: ['stack'] depends_on: ['kibana'] -#volumes: + +##########################DOCSBOX###################################################################### + web: + restart: always + build: ./docsbox-master/docsbox + expose: + - "8000" + links: + - redis:redis + volumes: + - docsbox:/home/docsbox + - media:/home/docsbox/media + command: gunicorn -b :8000 docsbox:app + networks: ['stack'] + + rqworker: + restart: always + build: ./docsbox-master/docsbox + links: + - redis:redis + volumes: + - web + command: rq worker -c docsbox.settings + networks: ['stack'] + + rqscheduler: + restart: always + build: ./docsbox-master/docsbox + links: + - redis:redis + volumes: + - web + command: rqscheduler -H redis -p 6379 -d 0 + networks: ['stack'] + + nginx: + restart: always + build: ./docsbox-master/nginx/ + ports: + - "81:80" + volumes: + - web + links: + - web:web + networks: ['stack'] + + redis: + restart: always + image: redis:latest + expose: + - "6379" + volumes: + - redisdata:/data + networks: ['stack'] + + +##########################SETTIGNS###################################################################### + +volumes: #esdata: - # driver: local + #driver: local + redisdata: + driver: local + docsbox: + driver: local + media: + driver: local networks: {stack: {}} + diff --git a/dmp-backend/Dockerfile b/dmp-backend/Dockerfile index 79cf08791..8701a23a0 100644 --- a/dmp-backend/Dockerfile +++ b/dmp-backend/Dockerfile @@ -1,5 +1,11 @@ FROM openjdk:8-jdk-alpine +RUN apk add --update \ + curl \ + && rm -rf /var/cache/apk/* VOLUME /tmp -ARG PROFILE=dev +ARG PROFILE=production +ENV PROF $PROFILE +ADD web/src/main/resources/ProjectConfiguration.xml /tmp/ProjectConfiguration.xml +ADD web/src/main/resources/ExternalUrls.xml /tmp/ExternalUrls.xml ADD web/target/web-1.0-SNAPSHOT.jar app.jar -ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom -Dspring.profiles.active=${PROFILE}","-jar","/app.jar"] \ No newline at end of file +ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom" ,"-Dspring.profiles.active=${PROF}","-jar","/app.jar"] \ No newline at end of file diff --git a/dmp-backend/data/pom.xml b/dmp-backend/data/pom.xml index c7cfef263..7a256c0ea 100644 --- a/dmp-backend/data/pom.xml +++ b/dmp-backend/data/pom.xml @@ -21,5 +21,10 @@ queryable 1.0-SNAPSHOT + + eu.eudat + elastic + 1.0.0-SNAPSHOT + \ No newline at end of file diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/converters/DateToUTCConverter.java b/dmp-backend/data/src/main/java/eu/eudat/data/converters/DateToUTCConverter.java new file mode 100644 index 000000000..35fb84dae --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/data/converters/DateToUTCConverter.java @@ -0,0 +1,46 @@ +package eu.eudat.data.converters; + +import org.springframework.format.datetime.DateFormatter; + +import javax.persistence.AttributeConverter; +import javax.persistence.Converter; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; + +/** + * Created by ikalyvas on 9/25/2018. + */ +@Converter +public class DateToUTCConverter implements AttributeConverter { + + @Override + public Date convertToDatabaseColumn(Date attribute) { + if(attribute == null) return null; + DateFormat formatterIST = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + formatterIST.setTimeZone(TimeZone.getTimeZone("UTC")); + try { + String date = formatterIST.format(attribute); + return formatterIST.parse(date); + } catch (ParseException e) { + e.printStackTrace(); + } + return null; + } + + @Override + public Date convertToEntityAttribute(Date dbData) { + if(dbData == null) return null; + DateFormat formatterIST = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + formatterIST.setTimeZone(TimeZone.getTimeZone("UTC")); + try { + String date = formatterIST.format(dbData); + return formatterIST.parse(date); + } catch (ParseException e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/DataManagementPlanCriteria.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/DataManagementPlanCriteria.java index d79643daf..09376a3ab 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/DataManagementPlanCriteria.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/DataManagementPlanCriteria.java @@ -1,7 +1,8 @@ package eu.eudat.data.dao.criteria; import eu.eudat.data.entities.DMP; -import eu.eudat.data.entities.Project; + +import eu.eudat.data.entities.Grant; import java.util.Date; import java.util.List; @@ -10,39 +11,19 @@ import java.util.UUID; public class DataManagementPlanCriteria extends Criteria { private Date periodStart; private Date periodEnd; + private List grants; private boolean allVersions; private List groupIds; - - private List projects; - - public boolean getAllVersions() { - return allVersions; - } - - public void setAllVersions(boolean allVersions) { - this.allVersions = allVersions; - } - - public List getGroupIds() { - return groupIds; - } - - public void setGroupIds(List groupIds) { - this.groupIds = groupIds; - } + private Integer status; + private List organisations; + private Integer role; + private List collaborators; + private List datasetTemplates; + private boolean isPublic; public Date getPeriodStart() { return periodStart; } - - public List getProjects() { - return projects; - } - - public void setProjects(List projects) { - this.projects = projects; - } - public void setPeriodStart(Date periodStart) { this.periodStart = periodStart; } @@ -50,9 +31,70 @@ public class DataManagementPlanCriteria extends Criteria { public Date getPeriodEnd() { return periodEnd; } - public void setPeriodEnd(Date periodEnd) { this.periodEnd = periodEnd; } + public List getGrants() { + return grants; + } + public void setGrants(List grants) { + this.grants = grants; + } + + public boolean getAllVersions() { + return allVersions; + } + public void setAllVersions(boolean allVersions) { + this.allVersions = allVersions; + } + + public List getGroupIds() { + return groupIds; + } + public void setGroupIds(List groupIds) { + this.groupIds = groupIds; + } + + public Integer getStatus() { + return status; + } + public void setStatus(Integer status) { + this.status = status; + } + + public List getOrganisations() { + return organisations; + } + public void setOrganisations(List organisations) { + this.organisations = organisations; + } + + public Integer getRole() { + return role; + } + public void setRole(Integer role) { + this.role = role; + } + + public List getCollaborators() { + return collaborators; + } + public void setCollaborators(List collaborators) { + this.collaborators = collaborators; + } + + public List getDatasetTemplates() { + return datasetTemplates; + } + public void setDatasetTemplates(List datasetTemplates) { + this.datasetTemplates = datasetTemplates; + } + + public boolean getIsPublic() { + return isPublic; + } + public void setIsPublic(boolean isPublic) { + this.isPublic = isPublic; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/DataManagementPlanPublicCriteria.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/DataManagementPlanPublicCriteria.java new file mode 100644 index 000000000..bd3d049bf --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/DataManagementPlanPublicCriteria.java @@ -0,0 +1,42 @@ +package eu.eudat.data.dao.criteria; + +import eu.eudat.data.entities.DMP; +import eu.eudat.types.grant.GrantStateType; + +import java.util.List; +import java.util.UUID; + +public class DataManagementPlanPublicCriteria extends Criteria { + private GrantStateType grantStatus; + private List grants; + public List datasetProfile; + private List dmpOrganisations; + + public GrantStateType getGrantStatus() { + return grantStatus; + } + public void setGrantStatus(GrantStateType grantStatus) { + this.grantStatus = grantStatus; + } + + public List getGrants() { + return grants; + } + public void setGrants(List grants) { + this.grants = grants; + } + + public List getDatasetProfile() { + return datasetProfile; + } + public void setDatasetProfile(List datasetProfile) { + this.datasetProfile = datasetProfile; + } + + public List getDmpOrganisations() { + return dmpOrganisations; + } + public void setDmpOrganisations(List dmpOrganisations) { + this.dmpOrganisations = dmpOrganisations; + } +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/DatasetCriteria.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/DatasetCriteria.java index 2ffabff41..8dac2b30f 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/DatasetCriteria.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/DatasetCriteria.java @@ -1,6 +1,7 @@ package eu.eudat.data.dao.criteria; import eu.eudat.data.entities.Dataset; +import eu.eudat.elastic.entities.Tag; import java.util.Date; import java.util.List; @@ -12,12 +13,18 @@ public class DatasetCriteria extends Criteria { private Date periodStart; private Date periodEnd; private List dmpIds; + private List tags; private boolean allVersions; + private UUID profileDatasetId; + private List organisations; + private Integer role; + private List grants; + private List collaborators; + private List datasetTemplates; public boolean getAllVersions() { return allVersions; } - public void setAllVersions(boolean allVersions) { this.allVersions = allVersions; } @@ -25,7 +32,6 @@ public class DatasetCriteria extends Criteria { public Integer getStatus() { return status; } - public void setStatus(Integer status) { this.status = status; } @@ -33,7 +39,6 @@ public class DatasetCriteria extends Criteria { public Date getPeriodStart() { return periodStart; } - public void setPeriodStart(Date periodStart) { this.periodStart = periodStart; } @@ -41,7 +46,6 @@ public class DatasetCriteria extends Criteria { public Date getPeriodEnd() { return periodEnd; } - public void setPeriodEnd(Date periodEnd) { this.periodEnd = periodEnd; } @@ -49,8 +53,56 @@ public class DatasetCriteria extends Criteria { public List getDmpIds() { return dmpIds; } - public void setDmpIds(List dmpIds) { this.dmpIds = dmpIds; } + + public List getTags() { + return tags; + } + public void setTags(List tags) { + this.tags = tags; + } + + public UUID getProfileDatasetId() { + return profileDatasetId; + } + public void setProfileDatasetId(UUID profileDatasetId) { + this.profileDatasetId = profileDatasetId; + } + + public List getOrganisations() { + return organisations; + } + public void setOrganisations(List organisations) { + this.organisations = organisations; + } + + public Integer getRole() { + return role; + } + public void setRole(Integer role) { + this.role = role; + } + + public List getGrants() { + return grants; + } + public void setGrants(List grants) { + this.grants = grants; + } + + public List getCollaborators() { + return collaborators; + } + public void setCollaborators(List collaborators) { + this.collaborators = collaborators; + } + + public List getDatasetTemplates() { + return datasetTemplates; + } + public void setDatasetTemplates(List datasetTemplates) { + this.datasetTemplates = datasetTemplates; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/DatasetProfileCriteria.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/DatasetProfileCriteria.java index 6c2624d29..0bf07564c 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/DatasetProfileCriteria.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/DatasetProfileCriteria.java @@ -2,6 +2,54 @@ package eu.eudat.data.dao.criteria; import eu.eudat.data.entities.DatasetProfile; +import java.util.List; +import java.util.UUID; public class DatasetProfileCriteria extends Criteria { + + public enum DatasetProfileFilter { + DMPs((short) 0), Datasets((short) 1); + + private short value; + private DatasetProfileFilter(short value) { + this.value = value; + } + public short getValue() { return value; } + + public static DatasetProfileFilter fromInteger(short value) { + switch (value) { + case 0: + return DMPs; + case 1: + return Datasets; + default: + throw new RuntimeException("Unsupported DatasetProfile filter"); + } + } + } + + private boolean allVersions; + private List groupIds; + private Short filter; + private UUID userId; + + public boolean getAllVersions() { return allVersions; } + public void setAllVersions(boolean allVersions) { this.allVersions = allVersions; } + + public List getGroupIds() { return groupIds; } + public void setGroupIds(List groupIds) { this.groupIds = groupIds; } + + public Short getFilter() { + return filter; + } + public void setFilter(Short filter) { + this.filter = filter; + } + + public UUID getUserId() { + return userId; + } + public void setUserId(UUID userId) { + this.userId = userId; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/DatasetPublicCriteria.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/DatasetPublicCriteria.java new file mode 100644 index 000000000..fd4934d7a --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/DatasetPublicCriteria.java @@ -0,0 +1,62 @@ +package eu.eudat.data.dao.criteria; + +import eu.eudat.data.entities.Dataset; +import eu.eudat.elastic.entities.Tag; +import eu.eudat.types.grant.GrantStateType; + +import java.util.List; +import java.util.UUID; + +/** + * Created by ikalyvas on 10/2/2018. + */ +public class DatasetPublicCriteria extends Criteria{ + private GrantStateType grantStatus; + private List grants; + private List datasetProfile; + private List dmpOrganisations; + private List tags; + private List dmpIds; + + public GrantStateType getGrantStatus() { + return grantStatus; + } + public void setGrantStatus(GrantStateType grantStatus) { + this.grantStatus = grantStatus; + } + + public List getGrants() { + return grants; + } + public void setGrants(List grants) { + this.grants = grants; + } + + public List getDatasetProfile() { + return datasetProfile; + } + public void setDatasetProfile(List datasetProfile) { + this.datasetProfile = datasetProfile; + } + + public List getDmpOrganisations() { + return dmpOrganisations; + } + public void setDmpOrganisations(List dmpOrganisations) { + this.dmpOrganisations = dmpOrganisations; + } + + public List getTags() { + return tags; + } + public void setTags(List tags) { + this.tags = tags; + } + + public List getDmpIds() { + return dmpIds; + } + public void setDmpIds(List dmpIds) { + this.dmpIds = dmpIds; + } +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/FunderCriteria.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/FunderCriteria.java new file mode 100644 index 000000000..c8c23038c --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/FunderCriteria.java @@ -0,0 +1,14 @@ +package eu.eudat.data.dao.criteria; + +import eu.eudat.data.entities.Funder; + +public class FunderCriteria extends Criteria { + private String reference; + + public String getReference() { + return reference; + } + public void setReference(String reference) { + this.reference = reference; + } +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/GrantCriteria.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/GrantCriteria.java new file mode 100644 index 000000000..a216b2264 --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/GrantCriteria.java @@ -0,0 +1,65 @@ +package eu.eudat.data.dao.criteria; + +import eu.eudat.data.entities.Grant; +import eu.eudat.types.grant.GrantStateType; + +import java.util.Date; + +public class GrantCriteria extends Criteria { + private Date periodStart; + private Date periodEnd; + private String reference; + private Integer grantStateType; + private boolean isPublic; + private String funderId; + private String funderReference; + + public Date getPeriodStart() { + return periodStart; + } + public void setPeriodStart(Date periodStart) { + this.periodStart = periodStart; + } + + public Date getPeriodEnd() { + return periodEnd; + } + public void setPeriodEnd(Date periodEnd) { + this.periodEnd = periodEnd; + } + + public String getReference() { + return reference; + } + public void setReference(String reference) { + this.reference = reference; + } + + public Integer getGrantStateType() { + return grantStateType; + } + public void setGrantStateType(Integer grantStateType) { + this.grantStateType = grantStateType; + } + + public boolean isPublic() { + return isPublic; + } + public void setPublic(boolean aPublic) { + isPublic = aPublic; + } + + public String getFunderId() { + return funderId; + } + public void setFunderId(String funderId) { + this.funderId = funderId; + } + + public String getFunderReference() { + return funderReference; + } + public void setFunderReference(String funderReference) { + this.funderReference = funderReference; + } +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/LoginConfirmationEmailCriteria.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/LoginConfirmationEmailCriteria.java new file mode 100644 index 000000000..4ec5be026 --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/LoginConfirmationEmailCriteria.java @@ -0,0 +1,6 @@ +package eu.eudat.data.dao.criteria; + +import eu.eudat.data.entities.LoginConfirmationEmail; + +public class LoginConfirmationEmailCriteria extends Criteria{ +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/OrganisationCriteria.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/OrganisationCriteria.java index ab1890db4..5cc857a24 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/OrganisationCriteria.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/OrganisationCriteria.java @@ -3,4 +3,20 @@ package eu.eudat.data.dao.criteria; import eu.eudat.data.entities.Organisation; public class OrganisationCriteria extends Criteria { + private String labelLike; + private Boolean isPublic; + + public String getLabelLike() { + return labelLike; + } + public void setLabelLike(String labelLike) { + this.labelLike = labelLike; + } + + public Boolean getPublic() { + return isPublic; + } + public void setPublic(Boolean aPublic) { + isPublic = aPublic; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/ProjectCriteria.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/ProjectCriteria.java index aa2d835a0..1450c8661 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/ProjectCriteria.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/ProjectCriteria.java @@ -2,34 +2,13 @@ package eu.eudat.data.dao.criteria; import eu.eudat.data.entities.Project; -import java.util.Date; - public class ProjectCriteria extends Criteria { - private Date periodStart; - private Date periodEnd; - private String reference; + private String reference; - public Date getPeriodStart() { - return periodStart; - } - - public void setPeriodStart(Date periodStart) { - this.periodStart = periodStart; - } - - public Date getPeriodEnd() { - return periodEnd; - } - - public void setPeriodEnd(Date periodEnd) { - this.periodEnd = periodEnd; - } - - public String getReference() { - return reference; - } - - public void setReference(String reference) { - this.reference = reference; - } + public String getReference() { + return reference; + } + public void setReference(String reference) { + this.reference = reference; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/UserInfoCriteria.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/UserInfoCriteria.java index 546a2f5f6..3d21d809e 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/UserInfoCriteria.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/criteria/UserInfoCriteria.java @@ -8,11 +8,11 @@ import java.util.List; public class UserInfoCriteria extends Criteria { private String email; private List appRoles; + private String collaboratorLike; public List getAppRoles() { return appRoles; } - public void setAppRoles(List appRoles) { this.appRoles = appRoles; } @@ -20,8 +20,14 @@ public class UserInfoCriteria extends Criteria { public String getEmail() { return email; } - public void setEmail(String email) { this.email = email; } + + public String getCollaboratorLike() { + return collaboratorLike; + } + public void setCollaboratorLike(String collaboratorLike) { + this.collaboratorLike = collaboratorLike; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/databaselayer/context/DatabaseContext.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/databaselayer/context/DatabaseContext.java index c0a92f01c..49f823d63 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/databaselayer/context/DatabaseContext.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/databaselayer/context/DatabaseContext.java @@ -4,6 +4,7 @@ import eu.eudat.queryable.QueryableList; import eu.eudat.queryable.jpa.hibernatequeryablelist.QueryableHibernateList; import eu.eudat.queryable.queryableentity.DataEntity; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ContentDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ContentDaoImpl.java index 7c68cb3ea..1d3f559d5 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ContentDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ContentDaoImpl.java @@ -5,6 +5,7 @@ import eu.eudat.data.dao.databaselayer.service.DatabaseService; import eu.eudat.data.entities.Content; import eu.eudat.queryable.QueryableList; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import java.util.UUID; @@ -27,6 +28,7 @@ public class ContentDaoImpl extends DatabaseAccess implements ContentDa } @Override + @Async public CompletableFuture createOrUpdateAsync(Content item) { return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPDao.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPDao.java index ff29a6b79..03cf68d74 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPDao.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPDao.java @@ -4,6 +4,7 @@ import eu.eudat.data.dao.DatabaseAccessLayer; import eu.eudat.data.dao.criteria.DataManagementPlanCriteria; import eu.eudat.data.dao.criteria.DatasetWizardUserDmpCriteria; import eu.eudat.data.entities.DMP; +import eu.eudat.data.entities.UserDMP; import eu.eudat.data.entities.UserInfo; import eu.eudat.queryable.QueryableList; @@ -15,6 +16,6 @@ public interface DMPDao extends DatabaseAccessLayer { QueryableList getUserDmps(DatasetWizardUserDmpCriteria datasetWizardAutocompleteRequest, UserInfo userInfo); - QueryableList getAuthenticated(QueryableList query, UserInfo principal); + QueryableList getAuthenticated(QueryableList query, UUID principalId); } \ No newline at end of file diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPDaoImpl.java index f2b106fc9..9684373a5 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPDaoImpl.java @@ -5,13 +5,16 @@ import eu.eudat.data.dao.criteria.DataManagementPlanCriteria; import eu.eudat.data.dao.criteria.DatasetWizardUserDmpCriteria; import eu.eudat.data.dao.databaselayer.service.DatabaseService; import eu.eudat.data.entities.DMP; +import eu.eudat.data.entities.UserDMP; import eu.eudat.data.entities.UserInfo; import eu.eudat.queryable.QueryableList; import eu.eudat.queryable.types.FieldSelectionType; import eu.eudat.queryable.types.SelectionField; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; +import javax.persistence.criteria.JoinType; import java.util.Arrays; import java.util.UUID; import java.util.concurrent.CompletableFuture; @@ -29,23 +32,52 @@ public class DMPDaoImpl extends DatabaseAccess implements DMPDao { public QueryableList getWithCriteria(DataManagementPlanCriteria criteria) { QueryableList query = getDatabaseService().getQueryable(DMP.getHints(), DMP.class); if (criteria.getLike() != null && !criteria.getLike().isEmpty()) - query.where((builder, root) -> builder.like(root.get("label"), "%" + criteria.getLike() + "%")); + query.where((builder, root) -> builder.or( + builder.like(builder.upper(root.get("label")), "%" + criteria.getLike().toUpperCase() + "%"), + builder.like(builder.upper(root.get("description")), "%" + criteria.getLike().toUpperCase() + "%"))); if (criteria.getPeriodEnd() != null) query.where((builder, root) -> builder.lessThan(root.get("created"), criteria.getPeriodEnd())); if (criteria.getPeriodStart() != null) query.where((builder, root) -> builder.greaterThan(root.get("created"), criteria.getPeriodStart())); - if (criteria.getProjects() != null && !criteria.getProjects().isEmpty()) - query.where(((builder, root) -> root.get("project").in(criteria.getProjects()))); + if (criteria.getGrants() != null && !criteria.getGrants().isEmpty()) + query.where(((builder, root) -> root.get("grant").in(criteria.getGrants()))); if (!criteria.getAllVersions()) - query.initSubQuery(String.class).where((builder, root) -> builder.equal(root.get("version"), query.subQueryMax((builder1, externalRoot, nestedRoot) -> builder1.equal(externalRoot.get("groupId"), nestedRoot.get("groupId")), Arrays.asList(new SelectionField(FieldSelectionType.FIELD, "version")), String.class))); + query.initSubQuery(String.class).where((builder, root) -> builder.equal(root.get("version"), + query.subQueryMax((builder1, externalRoot, nestedRoot) -> builder1.equal(externalRoot.get("groupId"), + nestedRoot.get("groupId")), Arrays.asList(new SelectionField(FieldSelectionType.FIELD, "version")), String.class))); if (criteria.getGroupIds() != null && !criteria.getGroupIds().isEmpty()) query.where((builder, root) -> root.get("groupId").in(criteria.getGroupIds())); + if (criteria.getStatus() != null) { + if (criteria.getStatus() == DMP.DMPStatus.FINALISED.getValue()) { + query.where((builder, root) -> builder.and(builder.equal(root.get("status"), DMP.DMPStatus.FINALISED.getValue()), builder.notEqual(root.get("isPublic"), true))); + } else if (criteria.getStatus() == DMP.DMPStatus.ACTIVE.getValue()) { + query.where((builder, root) -> builder.equal(root.get("status"), DMP.DMPStatus.ACTIVE.getValue())); + } + } + if (criteria.getIsPublic()) + query.where(((builder, root) -> builder.equal(root.get("isPublic"), true))); + if (criteria.getRole() != null) { + if (criteria.getRole().equals(UserDMP.UserDMPRoles.OWNER.getValue())) { + query.where((builder, root) -> builder.equal(root.join("users", JoinType.LEFT).get("role"), UserDMP.UserDMPRoles.OWNER.getValue())); + } else if (criteria.getRole().equals(UserDMP.UserDMPRoles.USER.getValue())) { + query.where((builder, root) -> builder.equal(root.join("users", JoinType.LEFT).get("role"), UserDMP.UserDMPRoles.USER.getValue())); + } + } + if (criteria.getOrganisations() != null && !criteria.getOrganisations().isEmpty()) { + query.where((builder, root) -> root.join("organisations").get("reference").in(criteria.getOrganisations())); + } + if (criteria.getCollaborators() != null && !criteria.getCollaborators().isEmpty()) { + query.where((builder, root) -> root.join("users", JoinType.LEFT).join("user", JoinType.LEFT).get("id").in(criteria.getCollaborators())); + } + if (criteria.getDatasetTemplates() != null && !criteria.getDatasetTemplates().isEmpty()) { + query.where(((builder, root) -> root.join("associatedDmps", JoinType.LEFT).get("id").in(criteria.getDatasetTemplates()))); + } query.where((builder, root) -> builder.notEqual(root.get("status"), DMP.DMPStatus.DELETED.getValue())); return query; } - public QueryableList getAuthenticated(QueryableList query, UserInfo principal) { - query.where((builder, root) -> builder.or(builder.equal(root.get("creator"), principal), builder.isMember(principal, root.get("users")))); + public QueryableList getAuthenticated(QueryableList query, UUID principal) { + query.where((builder, root) -> builder.equal(root.join("users", JoinType.LEFT).join("user").get("id"), principal)); return query; } @@ -78,6 +110,7 @@ public class DMPDaoImpl extends DatabaseAccess implements DMPDao { return this.getDatabaseService().getQueryable(DMP.class); } + @Async @Override public CompletableFuture createOrUpdateAsync(DMP item) { return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPProfileDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPProfileDaoImpl.java index b1ee83a96..b5198d86d 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPProfileDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPProfileDaoImpl.java @@ -6,6 +6,7 @@ import eu.eudat.data.dao.databaselayer.service.DatabaseService; import eu.eudat.data.entities.DMPProfile; import eu.eudat.queryable.QueryableList; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import java.util.UUID; @@ -22,6 +23,7 @@ public class DMPProfileDaoImpl extends DatabaseAccess implements DMP super(databaseService); } + @Async @Override public CompletableFuture createOrUpdateAsync(DMPProfile item) { return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); @@ -59,7 +61,8 @@ public class DMPProfileDaoImpl extends DatabaseAccess implements DMP public QueryableList getWithCriteria(DataManagementPlanProfileCriteria criteria) { QueryableList query = getDatabaseService().getQueryable(DMPProfile.class); if (criteria.getLike() != null && !criteria.getLike().isEmpty()) - query.where((builder, root) -> builder.like(root.get("label"), "%" + criteria.getLike() + "%")); + query.where((builder, root) -> builder.like(builder.upper(root.get("label")), "%" + criteria.getLike().toUpperCase() + "%")); + query.where(((builder, root) -> builder.notEqual(root.get("status"), DMPProfile.Status.DELETED.getValue()))); return query; } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DataRepositoryDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DataRepositoryDaoImpl.java index 546d5a2d8..c74a997d6 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DataRepositoryDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DataRepositoryDaoImpl.java @@ -6,6 +6,7 @@ import eu.eudat.data.dao.databaselayer.service.DatabaseService; import eu.eudat.data.entities.DataRepository; import eu.eudat.queryable.QueryableList; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import java.util.UUID; @@ -38,6 +39,7 @@ public class DataRepositoryDaoImpl extends DatabaseAccess implem } @Override + @Async public CompletableFuture createOrUpdateAsync(DataRepository item) { return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetDao.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetDao.java index a4d3bf709..b3e81ec03 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetDao.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetDao.java @@ -14,4 +14,6 @@ public interface DatasetDao extends DatabaseAccessLayer { QueryableList getAuthenticated(QueryableList query, UserInfo principal); + Dataset isPublicDataset(UUID id); + } \ No newline at end of file diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetDaoImpl.java index 1be6557ae..fec0ab7cb 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetDaoImpl.java @@ -3,14 +3,17 @@ package eu.eudat.data.dao.entities; import eu.eudat.data.dao.DatabaseAccess; import eu.eudat.data.dao.criteria.DatasetCriteria; import eu.eudat.data.dao.databaselayer.service.DatabaseService; +import eu.eudat.data.entities.DMP; import eu.eudat.data.entities.Dataset; import eu.eudat.data.entities.UserInfo; import eu.eudat.queryable.QueryableList; import eu.eudat.queryable.types.FieldSelectionType; import eu.eudat.queryable.types.SelectionField; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; +import javax.persistence.criteria.JoinType; import java.util.Arrays; import java.util.UUID; import java.util.concurrent.CompletableFuture; @@ -19,17 +22,19 @@ import java.util.concurrent.CompletableFuture; public class DatasetDaoImpl extends DatabaseAccess implements DatasetDao { @Autowired - public DatasetDaoImpl(DatabaseService databaseService) { - super(databaseService); - } + public DatasetDaoImpl(DatabaseService databaseService) { super(databaseService); } @Override public QueryableList getWithCriteria(DatasetCriteria criteria) { QueryableList query = getDatabaseService().getQueryable(Dataset.getHints(), Dataset.class); if (criteria.getLike() != null && !criteria.getLike().isEmpty()) - query.where((builder, root) -> builder.like(root.get("label"), "%" + criteria.getLike() + "%")); + query.where((builder, root) -> builder.or( + builder.like(builder.upper(root.get("label")), "%" + criteria.getLike().toUpperCase() + "%"), + builder.like(builder.upper(root.get("description")), "%" + criteria.getLike().toUpperCase() + "%"))); if (criteria.getStatus() != null) query.where((builder, root) -> builder.equal(root.get("status"), criteria.getStatus())); + if (criteria.getProfileDatasetId() != null) + query.where((builder, root) -> builder.equal(root.get("profile").get("id"), criteria.getProfileDatasetId())); if (criteria.getPeriodEnd() != null) query.where((builder, root) -> builder.lessThan(root.get("created"), criteria.getPeriodEnd())); if (criteria.getPeriodStart() != null) @@ -38,6 +43,18 @@ public class DatasetDaoImpl extends DatabaseAccess implements DatasetDa query.initSubQuery(String.class).where((builder, root) -> builder.equal(root.get("dmp").get("version"), query.subQueryMax((builder1, externalRoot, nestedRoot) -> builder1.equal(externalRoot.get("dmp").get("groupId"), nestedRoot.get("dmp").get("groupId")), Arrays.asList(new SelectionField(FieldSelectionType.COMPOSITE_FIELD, "dmp:version")), String.class))); if (criteria.getDmpIds() != null && !criteria.getDmpIds().isEmpty()) query.where((builder, root) -> root.get("dmp").get("id").in(criteria.getDmpIds())); + if (criteria.getRole() != null) + query.where((builder, root) -> builder.equal(root.join("dmp").join("users").get("role"), criteria.getRole())); + if (criteria.getOrganisations() != null && !criteria.getOrganisations().isEmpty()) + query.where((builder, root) -> root.join("dmp").join("organisations").get("reference").in(criteria.getOrganisations())); + if (criteria.getGrants() != null && !criteria.getGrants().isEmpty()) + query.where((builder, root) -> root.join("dmp").join("grant").get("id").in(criteria.getGrants())); + if (criteria.getCollaborators() != null && !criteria.getCollaborators().isEmpty()) + query.where((builder, root) -> root.join("dmp", JoinType.LEFT).join("users", JoinType.LEFT).join("user", JoinType.LEFT).get("id").in(criteria.getCollaborators())); + if (criteria.getDatasetTemplates() != null && !criteria.getDatasetTemplates().isEmpty()) + query.where(((builder, root) -> root.get("profile").get("id").in(criteria.getDatasetTemplates()))); + query.where(((builder, root) -> builder.notEqual(root.get("status"), Dataset.Status.DELETED.getValue()))); + query.where(((builder, root) -> builder.notEqual(root.get("status"), Dataset.Status.CANCELED.getValue()))); return query; } @@ -48,18 +65,30 @@ public class DatasetDaoImpl extends DatabaseAccess implements DatasetDa @Override public Dataset find(UUID id) { - return getDatabaseService().getQueryable(Dataset.class).where((builder, root) -> builder.equal((root.get("id")), id)).getSingle(); + return getDatabaseService().getQueryable(Dataset.class) + .where((builder, root) -> builder.and(builder.notEqual(root.get("status"),Dataset.Status.DELETED.getValue()), builder.notEqual(root.get("status"),Dataset.Status.CANCELED.getValue()), builder.equal((root.get("id")), id))).getSingle(); } @Override public Dataset find(UUID id, String hint) { - return getDatabaseService().getQueryable(Dataset.getHints(), Dataset.class).withHint(hint).where((builder, root) -> builder.equal((root.get("id")), id)).getSingle(); + return getDatabaseService().getQueryable(Dataset.getHints(), Dataset.class).withHint(hint) + .where((builder, root) -> builder.and(builder.notEqual(root.get("status"),Dataset.Status.DELETED.getValue()), builder.notEqual(root.get("status"),Dataset.Status.CANCELED.getValue()), builder.equal((root.get("id")), id))).getSingle(); + } + + @Override + public Dataset isPublicDataset(UUID id) { + QueryableList query = getDatabaseService().getQueryable(Dataset.getHints(), Dataset.class); + query.where(((builder, root) -> builder.equal(root.get("id"), id))); + + return query.withHint("datasetListingModel").getSingle(); } @Override public QueryableList getAuthenticated(QueryableList query, UserInfo principal) { - query.where((builder, root) -> builder.or(builder.equal(root.get("dmp").get("creator"), principal), builder.isMember(principal, root.get("dmp").get("users")) - , builder.equal(root.get("isPublic"), true))); + if (principal.getId() == null) query.where((builder, root) -> builder.equal(root.get("isPublic"), true)); + else { + query.where((builder, root) -> builder.or(builder.equal(root.get("dmp").get("creator"), principal), builder.equal(root.join("dmp", JoinType.LEFT).join("users", JoinType.LEFT).join("user", JoinType.LEFT).get("id"), principal.getId()))); + } return query; } @@ -73,6 +102,7 @@ public class DatasetDaoImpl extends DatabaseAccess implements DatasetDa return this.getDatabaseService().getQueryable(Dataset.class); } + @Async public CompletableFuture createOrUpdateAsync(Dataset item) { return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetExternalDatasetDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetExternalDatasetDaoImpl.java index 25e1b09fa..ed76b6376 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetExternalDatasetDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetExternalDatasetDaoImpl.java @@ -6,6 +6,7 @@ import eu.eudat.data.entities.DatasetExternalDataset; import eu.eudat.data.entities.DatasetProfile; import eu.eudat.queryable.QueryableList; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import java.util.UUID; @@ -33,6 +34,7 @@ public class DatasetExternalDatasetDaoImpl extends DatabaseAccess builder.equal(root.get("id"), id)).getSingle(); } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetProfileDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetProfileDaoImpl.java index a9bcfaa70..42a7f8082 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetProfileDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetProfileDaoImpl.java @@ -5,9 +5,14 @@ import eu.eudat.data.dao.criteria.DatasetProfileCriteria; import eu.eudat.data.dao.databaselayer.service.DatabaseService; import eu.eudat.data.entities.DatasetProfile; import eu.eudat.queryable.QueryableList; +import eu.eudat.queryable.types.FieldSelectionType; +import eu.eudat.queryable.types.SelectionField; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; +import javax.persistence.criteria.JoinType; +import java.util.Arrays; import java.util.UUID; import java.util.concurrent.CompletableFuture; @@ -23,7 +28,31 @@ public class DatasetProfileDaoImpl extends DatabaseAccess implem public QueryableList getWithCriteria(DatasetProfileCriteria criteria) { QueryableList query = getDatabaseService().getQueryable(DatasetProfile.class); if (criteria.getLike() != null && !criteria.getLike().isEmpty()) - query.where((builder, root) -> builder.like(root.get("label"), "%" + criteria.getLike() + "%")); + query.where((builder, root) -> builder.like(builder.upper(root.get("label")), "%" + criteria.getLike().toUpperCase() + "%")); + if (!criteria.getAllVersions()) + query.initSubQuery(String.class).where((builder, root) -> builder.equal(root.get("version"), + query.subQueryMax((builder1, externalRoot, nestedRoot) -> builder1.equal(externalRoot.get("groupId"), + nestedRoot.get("groupId")), Arrays.asList(new SelectionField(FieldSelectionType.FIELD, "version")), String.class))); + if (criteria.getGroupIds() != null && !criteria.getGroupIds().isEmpty()) + query.where((builder, root) -> root.get("groupId").in(criteria.getGroupIds())); + if (criteria.getFilter() != null && criteria.getUserId() != null) { + if (criteria.getFilter().equals(DatasetProfileCriteria.DatasetProfileFilter.DMPs.getValue())) { + query.initSubQuery(UUID.class).where((builder, root) -> + builder.and(root.get("id").in( + query.subQuery((builder1, root1) -> builder1.equal(root1.join("dmps", JoinType.LEFT).join("users", JoinType.LEFT).join("user", JoinType.LEFT).get("id"), criteria.getUserId()), + Arrays.asList(new SelectionField(FieldSelectionType.FIELD, "id")))), + builder.notEqual(root.get("id"), criteria.getUserId()))); + //query.where(((builder, root) -> builder.equal(root.join("dmps", JoinType.LEFT).join("users", JoinType.LEFT).join("user", JoinType.LEFT).get("id"), criteria.getUserId()))); + } + if (criteria.getFilter().equals(DatasetProfileCriteria.DatasetProfileFilter.Datasets.getValue())) { + query.initSubQuery(UUID.class).where((builder, root) -> + builder.and(root.get("id").in( + query.subQuery((builder1, root1) -> builder1.equal(root1.join("dataset", JoinType.LEFT).join("dmp", JoinType.LEFT).join("users", JoinType.LEFT).join("user", JoinType.LEFT).get("id"), criteria.getUserId()), + Arrays.asList(new SelectionField(FieldSelectionType.FIELD, "id")))), + builder.notEqual(root.get("id"), criteria.getUserId()))); + } + } + query.where(((builder, root) -> builder.notEqual(root.get("status"), DatasetProfile.Status.DELETED.getValue()))); return query; } @@ -52,6 +81,7 @@ public class DatasetProfileDaoImpl extends DatabaseAccess implem return this.getDatabaseService().getQueryable(DatasetProfile.class); } + @Async @Override public CompletableFuture createOrUpdateAsync(DatasetProfile item) { return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetServiceDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetServiceDaoImpl.java index 6ffcf1adf..fd40d37ae 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetServiceDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetServiceDaoImpl.java @@ -7,6 +7,7 @@ import eu.eudat.data.entities.DatasetProfile; import eu.eudat.data.entities.DatasetService; import eu.eudat.queryable.QueryableList; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import java.util.UUID; @@ -28,6 +29,7 @@ public class DatasetServiceDaoImpl extends DatabaseAccess implem return this.getDatabaseService().createOrUpdate(item, DatasetService.class); } + @Async @Override public CompletableFuture createOrUpdateAsync(DatasetService item) { return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ExternalDatasetDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ExternalDatasetDaoImpl.java index ee0242250..76b1ec4f7 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ExternalDatasetDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ExternalDatasetDaoImpl.java @@ -6,6 +6,7 @@ import eu.eudat.data.dao.databaselayer.service.DatabaseService; import eu.eudat.data.entities.ExternalDataset; import eu.eudat.queryable.QueryableList; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import java.util.UUID; @@ -24,7 +25,7 @@ public class ExternalDatasetDaoImpl extends DatabaseAccess impl public QueryableList getWithCriteria(ExternalDatasetCriteria criteria) { QueryableList query = this.getDatabaseService().getQueryable(ExternalDataset.class); if (criteria.getLike() != null && !criteria.getLike().isEmpty()) - query.where((builder, root) -> builder.like(root.get("label"), "%" + criteria.getLike() + "%")); + query.where((builder, root) -> builder.like(builder.upper(root.get("label")), "%" + criteria.getLike().toUpperCase() + "%")); return query; } @@ -48,6 +49,7 @@ public class ExternalDatasetDaoImpl extends DatabaseAccess impl return this.getDatabaseService().getQueryable(ExternalDataset.class); } + @Async @Override public CompletableFuture createOrUpdateAsync(ExternalDataset item) { return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/FunderDao.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/FunderDao.java new file mode 100644 index 000000000..7c884a9e5 --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/FunderDao.java @@ -0,0 +1,16 @@ +package eu.eudat.data.dao.entities; + +import eu.eudat.data.dao.DatabaseAccessLayer; +import eu.eudat.data.dao.criteria.FunderCriteria; +import eu.eudat.data.entities.Funder; +import eu.eudat.data.entities.UserInfo; +import eu.eudat.queryable.QueryableList; + +import java.util.UUID; + +public interface FunderDao extends DatabaseAccessLayer { + + QueryableList getWithCritetia(FunderCriteria criteria); + + QueryableList getAuthenticated(QueryableList query, UserInfo principal); +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/FunderDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/FunderDaoImpl.java new file mode 100644 index 000000000..8335f71e5 --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/FunderDaoImpl.java @@ -0,0 +1,70 @@ +package eu.eudat.data.dao.entities; + +import eu.eudat.data.dao.DatabaseAccess; +import eu.eudat.data.dao.criteria.FunderCriteria; +import eu.eudat.data.dao.databaselayer.service.DatabaseService; +import eu.eudat.data.entities.Funder; +import eu.eudat.data.entities.UserInfo; +import eu.eudat.queryable.QueryableList; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.UUID; +import java.util.concurrent.CompletableFuture; + +@Component("funderDao") +public class FunderDaoImpl extends DatabaseAccess implements FunderDao { + + @Autowired + public FunderDaoImpl(DatabaseService databaseService) { + super(databaseService); + } + + @Override + public QueryableList getWithCritetia(FunderCriteria criteria) { + QueryableList query = getDatabaseService().getQueryable(Funder.class); + if (criteria.getLike() != null && !criteria.getLike().isEmpty()) + query.where((builder, root) -> + builder.or(builder.like(builder.upper(root.get("label")), "%" + criteria.getLike().toUpperCase() + "%"), + builder.or(builder.like(builder.upper(root.get("definition")), "%" + criteria.getLike().toUpperCase() + "%")))); + if (criteria.getReference() != null) + query.where((builder, root) -> builder.like(root.get("reference"), "%" + criteria.getReference() + "%")); + query.where((builder, root) -> builder.notEqual(root.get("status"), Funder.Status.DELETED.getValue())); + return query; + } + + @Override + public QueryableList getAuthenticated(QueryableList query, UserInfo principal) { + return null; + } + + @Override + public Funder createOrUpdate(Funder item) { + return this.getDatabaseService().createOrUpdate(item, Funder.class); + } + + @Override + public CompletableFuture createOrUpdateAsync(Funder item) { + return null; + } + + @Override + public Funder find(UUID id) { + return this.getDatabaseService().getQueryable(Funder.class).where((builder, root) -> builder.equal(root.get("id"), id)).getSingle(); + } + + @Override + public Funder find(UUID id, String hint) { + throw new UnsupportedOperationException(); + } + + @Override + public void delete(Funder item) { + throw new UnsupportedOperationException(); + } + + @Override + public QueryableList asQueryable() { + return this.getDatabaseService().getQueryable(Funder.class); + } +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/GrantDao.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/GrantDao.java new file mode 100644 index 000000000..ef9316632 --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/GrantDao.java @@ -0,0 +1,17 @@ +package eu.eudat.data.dao.entities; + +import eu.eudat.data.dao.DatabaseAccessLayer; +import eu.eudat.data.dao.criteria.GrantCriteria; +import eu.eudat.data.entities.Grant; +import eu.eudat.data.entities.UserInfo; +import eu.eudat.queryable.QueryableList; + +import java.util.UUID; + +public interface GrantDao extends DatabaseAccessLayer { + + QueryableList getWithCriteria(GrantCriteria criteria); + + QueryableList getAuthenticated(QueryableList query, UserInfo principal); + +} \ No newline at end of file diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/GrantDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/GrantDaoImpl.java new file mode 100644 index 000000000..47d22c064 --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/GrantDaoImpl.java @@ -0,0 +1,93 @@ +package eu.eudat.data.dao.entities; + +import eu.eudat.data.dao.DatabaseAccess; +import eu.eudat.data.dao.criteria.GrantCriteria; +import eu.eudat.data.dao.databaselayer.service.DatabaseService; +import eu.eudat.data.entities.DMP; +import eu.eudat.data.entities.Grant; +import eu.eudat.data.entities.UserInfo; +import eu.eudat.queryable.QueryableList; +import eu.eudat.types.grant.GrantStateType; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import javax.persistence.criteria.JoinType; +import java.util.Date; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; + +@Component("grantDao") +public class GrantDaoImpl extends DatabaseAccess implements GrantDao { + + @Autowired + public GrantDaoImpl(DatabaseService databaseService) { + super(databaseService); + } + + @Override + public QueryableList getWithCriteria(GrantCriteria criteria) { + QueryableList query = getDatabaseService().getQueryable(Grant.class); + if (criteria.getLike() != null && !criteria.getLike().isEmpty()) + query.where((builder, root) -> + builder.or(builder.like(builder.upper(root.get("label")), "%" + criteria.getLike().toUpperCase() + "%"), + builder.or(builder.like(builder.upper(root.get("description")), "%" + criteria.getLike().toUpperCase() + "%")))); + if (criteria.getPeriodEnd() != null) + query.where((builder, root) -> builder.lessThan(root.get("enddate"), criteria.getPeriodEnd())); + if (criteria.getPeriodStart() != null) + query.where((builder, root) -> builder.greaterThan(root.get("startdate"), criteria.getPeriodStart())); + if (criteria.getReference() != null) + query.where((builder, root) -> builder.like(root.get("reference"), "%" + criteria.getReference() + "%")); + if (criteria.getGrantStateType() != null) { + if (criteria.getGrantStateType().equals(GrantStateType.FINISHED.getValue())) + query.where((builder, root) -> builder.lessThan(root.get("enddate"), new Date())); + if (criteria.getGrantStateType().equals(GrantStateType.ONGOING.getValue())) + query.where((builder, root) -> + builder.or(builder.greaterThan(root.get("enddate"), new Date()) + , builder.isNull(root.get("enddate")))); + } + if (criteria.isPublic()) { + query.where((builder, root) -> builder.equal(root.join("dmps").get("status"), DMP.DMPStatus.FINALISED.getValue())).distinct(); + } + if (criteria.getFunderId() != null && !criteria.getFunderId().trim().isEmpty()) + query.where((builder, root) -> builder.equal(root.get("funder").get("id"), UUID.fromString(criteria.getFunderId()))); + query.where((builder, root) -> builder.notEqual(root.get("status"), Grant.Status.DELETED.getValue())); + return query; + } + + @Override + public Grant createOrUpdate(Grant item) { + return getDatabaseService().createOrUpdate(item, Grant.class); + } + + @Override + public Grant find(UUID id) { + return getDatabaseService().getQueryable(Grant.class).where((builder, root) -> builder.equal((root.get("id")), id)).getSingle(); + } + + @Override + public void delete(Grant item) { + this.getDatabaseService().delete(item); + } + + @Override + public QueryableList asQueryable() { + return this.getDatabaseService().getQueryable(Grant.class); + } + + public QueryableList getAuthenticated(QueryableList query, UserInfo principal) { + query.where((builder, root) -> builder.or(builder.equal(root.get("creationUser"), principal), builder.equal(root.join("dmps", JoinType.LEFT).join("users", JoinType.LEFT).join("user", JoinType.LEFT).get("id"), principal.getId()))).distinct(); + return query; + } + + @Async + @Override + public CompletableFuture createOrUpdateAsync(Grant item) { + return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); + } + + @Override + public Grant find(UUID id, String hint) { + throw new UnsupportedOperationException(); + } +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/InvitationDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/InvitationDaoImpl.java index 7b9e66332..eba6d5669 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/InvitationDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/InvitationDaoImpl.java @@ -6,6 +6,7 @@ import eu.eudat.data.dao.databaselayer.service.DatabaseService; import eu.eudat.data.entities.Invitation; import eu.eudat.queryable.QueryableList; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import java.util.UUID; @@ -45,6 +46,7 @@ public class InvitationDaoImpl extends DatabaseAccess implements Inv return this.getDatabaseService().getQueryable(Invitation.class); } + @Async @Override public CompletableFuture createOrUpdateAsync(Invitation item) { return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/LoginConfirmationEmailDao.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/LoginConfirmationEmailDao.java new file mode 100644 index 000000000..71edce65e --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/LoginConfirmationEmailDao.java @@ -0,0 +1,13 @@ +package eu.eudat.data.dao.entities; + +import eu.eudat.data.dao.DatabaseAccessLayer; +import eu.eudat.data.dao.criteria.LoginConfirmationEmailCriteria; +import eu.eudat.data.entities.LoginConfirmationEmail; +import eu.eudat.queryable.QueryableList; + +import java.util.UUID; + +public interface LoginConfirmationEmailDao extends DatabaseAccessLayer { + + QueryableList getWithCriteria(LoginConfirmationEmailCriteria criteria); +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/LoginConfirmationEmailDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/LoginConfirmationEmailDaoImpl.java new file mode 100644 index 000000000..691c6b663 --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/LoginConfirmationEmailDaoImpl.java @@ -0,0 +1,56 @@ +package eu.eudat.data.dao.entities; + +import eu.eudat.data.dao.DatabaseAccess; +import eu.eudat.data.dao.criteria.LoginConfirmationEmailCriteria; +import eu.eudat.data.dao.databaselayer.service.DatabaseService; +import eu.eudat.data.entities.LoginConfirmationEmail; +import eu.eudat.queryable.QueryableList; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.UUID; +import java.util.concurrent.CompletableFuture; + +@Service("LoginConfirmationEmailDao") +public class LoginConfirmationEmailDaoImpl extends DatabaseAccess implements LoginConfirmationEmailDao { + + @Autowired + public LoginConfirmationEmailDaoImpl(DatabaseService databaseService) { + super(databaseService); + } + + @Override + public QueryableList getWithCriteria(LoginConfirmationEmailCriteria criteria) { + return null; + } + + @Override + public LoginConfirmationEmail createOrUpdate(LoginConfirmationEmail item) { + return this.getDatabaseService().createOrUpdate(item, LoginConfirmationEmail.class); + } + + @Override + public CompletableFuture createOrUpdateAsync(LoginConfirmationEmail item) { + return null; + } + + @Override + public LoginConfirmationEmail find(UUID id) { + return this.getDatabaseService().getQueryable(LoginConfirmationEmail.class).where((builder, root) -> builder.equal(root.get("id"), id)).getSingle(); + } + + @Override + public LoginConfirmationEmail find(UUID id, String hint) { + throw new UnsupportedOperationException(); + } + + @Override + public void delete(LoginConfirmationEmail item) { + throw new UnsupportedOperationException(); + } + + @Override + public QueryableList asQueryable() { + return this.getDatabaseService().getQueryable(LoginConfirmationEmail.class); + } +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/OrganisationDao.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/OrganisationDao.java index 54d8e8470..900873ada 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/OrganisationDao.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/OrganisationDao.java @@ -3,6 +3,7 @@ package eu.eudat.data.dao.entities; import eu.eudat.data.dao.DatabaseAccessLayer; import eu.eudat.data.dao.criteria.OrganisationCriteria; import eu.eudat.data.entities.Organisation; +import eu.eudat.data.entities.UserInfo; import eu.eudat.queryable.QueryableList; import java.util.UUID; @@ -10,5 +11,6 @@ import java.util.UUID; public interface OrganisationDao extends DatabaseAccessLayer { QueryableList getWithCriteria(OrganisationCriteria criteria); + QueryableList getAuthenticated(QueryableList query, UserInfo principal); } \ No newline at end of file diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/OrganisationDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/OrganisationDaoImpl.java index 57a82ea8f..4240840f4 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/OrganisationDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/OrganisationDaoImpl.java @@ -3,11 +3,15 @@ package eu.eudat.data.dao.entities; import eu.eudat.data.dao.DatabaseAccess; import eu.eudat.data.dao.criteria.OrganisationCriteria; import eu.eudat.data.dao.databaselayer.service.DatabaseService; +import eu.eudat.data.entities.DMP; import eu.eudat.data.entities.Organisation; +import eu.eudat.data.entities.UserInfo; import eu.eudat.queryable.QueryableList; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; +import javax.persistence.criteria.JoinType; import java.util.UUID; import java.util.concurrent.CompletableFuture; @@ -24,6 +28,12 @@ public class OrganisationDaoImpl extends DatabaseAccess implements QueryableList query = this.getDatabaseService().getQueryable(Organisation.class); if (criteria.getLike() != null) query.where((builder, root) -> builder.equal(root.get("reference"), criteria.getLike())); + if (criteria.getLabelLike() != null) { + query.where((builder, root) -> builder.like(builder.upper(root.get("label")), "%" + criteria.getLabelLike().toUpperCase() + "%")); + } + if (criteria.getPublic() != null && criteria.getPublic()) { + query.where((builder, root) -> builder.equal(root.join("dmps", JoinType.LEFT).get("status"), DMP.DMPStatus.FINALISED.getValue())); + } return query; } @@ -47,11 +57,17 @@ public class OrganisationDaoImpl extends DatabaseAccess implements return this.getDatabaseService().getQueryable(Organisation.class); } + @Async @Override public CompletableFuture createOrUpdateAsync(Organisation item) { return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); } + public QueryableList getAuthenticated(QueryableList query, UserInfo principal) { + query.where((builder, root) -> builder.equal(root.join("dmps").get("creator"), principal)); + return query; + } + @Override public Organisation find(UUID id, String hint) { throw new UnsupportedOperationException(); diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ProjectDao.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ProjectDao.java index a9cadd97f..1c82fc0ed 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ProjectDao.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ProjectDao.java @@ -10,8 +10,7 @@ import java.util.UUID; public interface ProjectDao extends DatabaseAccessLayer { - QueryableList getWithCriteria(ProjectCriteria criteria); + QueryableList getWithCritetia(ProjectCriteria criteria); - QueryableList getAuthenticated(QueryableList query, UserInfo principal); - -} \ No newline at end of file + QueryableList getAuthenticated(QueryableList query, UserInfo principal); +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ProjectDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ProjectDaoImpl.java index cbd98f97e..eac00713a 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ProjectDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ProjectDaoImpl.java @@ -6,68 +6,64 @@ import eu.eudat.data.dao.databaselayer.service.DatabaseService; import eu.eudat.data.entities.Project; import eu.eudat.data.entities.UserInfo; import eu.eudat.queryable.QueryableList; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; import javax.persistence.criteria.JoinType; import java.util.UUID; import java.util.concurrent.CompletableFuture; -@Component("projectDao") +@Service("projectDao") public class ProjectDaoImpl extends DatabaseAccess implements ProjectDao { - @Autowired - public ProjectDaoImpl(DatabaseService databaseService) { - super(databaseService); - } + public ProjectDaoImpl(DatabaseService databaseService) { + super(databaseService); + } - @Override - public QueryableList getWithCriteria(ProjectCriteria criteria) { - QueryableList query = getDatabaseService().getQueryable(Project.class); - if (criteria.getLike() != null && !criteria.getLike().isEmpty()) - query.where((builder, root) -> builder.like(root.get("label"), "%" + criteria.getLike() + "%")); - if (criteria.getPeriodEnd() != null) - query.where((builder, root) -> builder.lessThan(root.get("enddate"), criteria.getPeriodEnd())); - if (criteria.getPeriodStart() != null) - query.where((builder, root) -> builder.greaterThan(root.get("startdate"), criteria.getPeriodStart())); - if (criteria.getReference() != null) - query.where((builder, root) -> builder.equal(root.get("reference"), criteria.getReference())); - query.where((builder, root) -> builder.notEqual(root.get("status"), Project.Status.DELETED.getValue())); - return query; - } + @Override + public QueryableList getWithCritetia(ProjectCriteria criteria) { + QueryableList query = getDatabaseService().getQueryable(Project.class); + if (criteria.getLike() != null && !criteria.getLike().isEmpty()) + query.where((builder, root) -> + builder.or(builder.like(builder.upper(root.get("label")), "%" + criteria.getLike().toUpperCase() + "%"), + builder.or(builder.like(builder.upper(root.get("description")), "%" + criteria.getLike().toUpperCase() + "%")))); + if (criteria.getReference() != null) + query.where((builder, root) -> builder.like(root.get("reference"), "%" + criteria.getReference() + "%")); + query.where((builder, root) -> builder.notEqual(root.get("status"), Project.Status.DELETED.getValue())); + return query; + } - @Override - public Project createOrUpdate(Project item) { - return getDatabaseService().createOrUpdate(item, Project.class); - } + public QueryableList getAuthenticated(QueryableList query, UserInfo principal) { + query.where((builder, root) -> builder.or(builder.equal(root.get("creationUser"), principal), builder.equal(root.join("dmps", JoinType.LEFT).join("users", JoinType.LEFT).join("user", JoinType.LEFT).get("id"), principal.getId()))).distinct(); + return query; + } - @Override - public Project find(UUID id) { - return getDatabaseService().getQueryable(Project.class).where((builder, root) -> builder.equal((root.get("id")), id)).getSingle(); - } + @Override + public Project createOrUpdate(Project item) { + return this.getDatabaseService().createOrUpdate(item, Project.class); + } - @Override - public void delete(Project item) { - this.getDatabaseService().delete(item); - } + @Override + public CompletableFuture createOrUpdateAsync(Project item) { + return null; + } - @Override - public QueryableList asQueryable() { - return this.getDatabaseService().getQueryable(Project.class); - } + @Override + public Project find(UUID id) { + return this.getDatabaseService().getQueryable(Project.class).where((builder, root) -> builder.equal(root.get("id"), id)).getSingle(); + } - public QueryableList getAuthenticated(QueryableList query, UserInfo principal) { - query.where((builder, root) -> builder.or(builder.equal(root.get("creationUser"), principal), builder.isMember(principal, root.join("dmps", JoinType.LEFT).get("users")))).distinct(); - return query; - } + @Override + public Project find(UUID id, String hint) { + throw new UnsupportedOperationException(); + } - @Override - public CompletableFuture createOrUpdateAsync(Project item) { - return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); - } + @Override + public void delete(Project item) { + throw new UnsupportedOperationException(); + } - @Override - public Project find(UUID id, String hint) { - throw new UnsupportedOperationException(); - } + @Override + public QueryableList asQueryable() { + return this.getDatabaseService().getQueryable(Project.class); + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/RegistryDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/RegistryDaoImpl.java index f4bb048dc..c7ed94b75 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/RegistryDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/RegistryDaoImpl.java @@ -6,6 +6,7 @@ import eu.eudat.data.dao.databaselayer.service.DatabaseService; import eu.eudat.data.entities.Registry; import eu.eudat.queryable.QueryableList; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import java.util.UUID; @@ -47,6 +48,7 @@ public class RegistryDaoImpl extends DatabaseAccess implements Registr return this.getDatabaseService().getQueryable(Registry.class); } + @Async @Override public CompletableFuture createOrUpdateAsync(Registry item) { return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ResearcherDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ResearcherDaoImpl.java index d9318903d..086adf820 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ResearcherDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ResearcherDaoImpl.java @@ -6,6 +6,7 @@ import eu.eudat.data.dao.databaselayer.service.DatabaseService; import eu.eudat.data.entities.Researcher; import eu.eudat.queryable.QueryableList; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import java.util.UUID; @@ -21,11 +22,11 @@ public class ResearcherDaoImpl extends DatabaseAccess implements Res @Override public QueryableList getWithCriteria(ResearcherCriteria criteria) { - QueryableList query = this.getDatabaseService().getQueryable(Researcher.class); - if (criteria.getLike() != null) - query.where((builder, root) -> builder.equal(root.get("reference"), criteria.getLike())); - if (criteria.getName() != null) - query.where((builder, root) -> builder.equal(root.get("label"), criteria.getName())); + QueryableList query = asQueryable(); + if (criteria.getLike() != null && !criteria.getLike().isEmpty()) + query.where((builder, root) ->builder.or(builder.like(builder.upper(root.get("reference")), "%" + criteria.getLike().toUpperCase() + "%"))); + if (criteria.getName() != null && !criteria.getName().isEmpty()) + query.where((builder, root) ->builder.or(builder.like(builder.upper(root.get("label")), "%" + criteria.getName().toUpperCase() + "%"))); return query; } @@ -49,6 +50,7 @@ public class ResearcherDaoImpl extends DatabaseAccess implements Res return this.getDatabaseService().getQueryable(Researcher.class); } + @Async @Override public CompletableFuture createOrUpdateAsync(Researcher item) { return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ServiceDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ServiceDaoImpl.java index cee85c95c..00406ab91 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ServiceDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ServiceDaoImpl.java @@ -6,6 +6,7 @@ import eu.eudat.data.dao.databaselayer.service.DatabaseService; import eu.eudat.data.entities.Service; import eu.eudat.queryable.QueryableList; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import java.util.UUID; @@ -47,6 +48,7 @@ public class ServiceDaoImpl extends DatabaseAccess implements ServiceDa return this.getDatabaseService().getQueryable(Service.class); } + @Async @Override public CompletableFuture createOrUpdateAsync(Service item) { return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserDmpDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserDmpDaoImpl.java index 9f23d023f..eb99c65e3 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserDmpDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserDmpDaoImpl.java @@ -5,6 +5,7 @@ import eu.eudat.data.dao.databaselayer.service.DatabaseService; import eu.eudat.data.entities.UserDMP; import eu.eudat.queryable.QueryableList; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import java.util.UUID; @@ -41,6 +42,7 @@ public class UserDmpDaoImpl extends DatabaseAccess implements UserDmpDa return this.getDatabaseService().getQueryable(UserDMP.class); } + @Async @Override public CompletableFuture createOrUpdateAsync(UserDMP item) { return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserInfoDao.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserInfoDao.java index a6f3e7b8e..4abb033f5 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserInfoDao.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserInfoDao.java @@ -11,4 +11,5 @@ public interface UserInfoDao extends DatabaseAccessLayer { QueryableList getWithCriteria(UserInfoCriteria criteria); + QueryableList getAuthenticated(QueryableList users, UUID principalId); } \ No newline at end of file diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserInfoDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserInfoDaoImpl.java index 7d601863c..60526bd6a 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserInfoDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserInfoDaoImpl.java @@ -5,59 +5,76 @@ import eu.eudat.data.dao.criteria.UserInfoCriteria; import eu.eudat.data.dao.databaselayer.service.DatabaseService; import eu.eudat.data.entities.UserInfo; import eu.eudat.queryable.QueryableList; +import eu.eudat.queryable.types.FieldSelectionType; +import eu.eudat.queryable.types.SelectionField; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; +import java.util.Arrays; import java.util.UUID; import java.util.concurrent.CompletableFuture; @Component("userInfoDao") public class UserInfoDaoImpl extends DatabaseAccess implements UserInfoDao { - @Autowired - public UserInfoDaoImpl(DatabaseService databaseService) { - super(databaseService); - } + @Autowired + public UserInfoDaoImpl(DatabaseService databaseService) { + super(databaseService); + } - @Override - public QueryableList getWithCriteria(UserInfoCriteria criteria) { - QueryableList users = this.getDatabaseService().getQueryable(UserInfo.class); - if (criteria.getAppRoles() != null && !criteria.getAppRoles().isEmpty()) - users.where((builder, root) -> root.join("userRoles").get("role").in(criteria.getAppRoles())); - if (criteria.getLike() != null) - users.where((builder, root) -> builder.or(builder.like(root.get("name"), "%" + criteria.getLike() + "%"), builder.like(root.get("email"), "%" + criteria.getLike() + "%"))); - if (criteria.getEmail() != null) - users.where((builder, root) -> builder.equal(root.get("email"), criteria.getEmail())); - return users; - } + @Override + public QueryableList getWithCriteria(UserInfoCriteria criteria) { + QueryableList users = this.getDatabaseService().getQueryable(UserInfo.class); + if (criteria.getAppRoles() != null && !criteria.getAppRoles().isEmpty()) + users.where((builder, root) -> root.join("userRoles").get("role").in(criteria.getAppRoles())); + if (criteria.getLike() != null) + users.where((builder, root) -> builder.or(builder.like(builder.upper(root.get("name")), "%" + criteria.getLike().toUpperCase() + "%"), builder.like(root.get("email"), "%" + criteria.getLike() + "%"))); + if (criteria.getEmail() != null) + users.where((builder, root) -> builder.equal(root.get("email"), criteria.getEmail())); + if (criteria.getCollaboratorLike() != null) + users.where((builder, root) -> builder.or(builder.like(builder.upper(root.get("name")), "%" + criteria.getCollaboratorLike().toUpperCase() + "%"), builder.like(root.get("email"), "%" + criteria.getCollaboratorLike() + "%"))); + return users; + } - @Override - public UserInfo createOrUpdate(UserInfo item) { - return this.getDatabaseService().createOrUpdate(item, UserInfo.class); - } + @Override + public QueryableList getAuthenticated(QueryableList users, UUID principalId) { + users.initSubQuery(UUID.class).where((builder, root) -> + builder.and(root.join("dmps").get("id").in( + users.subQuery((builder1, root1) -> builder1.equal(root1.get("id"), principalId), + Arrays.asList(new SelectionField(FieldSelectionType.COMPOSITE_FIELD, "dmps:id")))), + builder.notEqual(root.get("id"), principalId))); + return users; + } - @Override - public UserInfo find(UUID id) { - return this.getDatabaseService().getQueryable(UserInfo.class).where((builder, root) -> builder.equal(root.get("id"), id)).getSingle(); - } + @Override + public UserInfo createOrUpdate(UserInfo item) { + return this.getDatabaseService().createOrUpdate(item, UserInfo.class); + } - @Override - public void delete(UserInfo item) { - this.getDatabaseService().delete(item); - } + @Override + public UserInfo find(UUID id) { + return this.getDatabaseService().getQueryable(UserInfo.class).where((builder, root) -> builder.equal(root.get("id"), id)).getSingle(); + } - @Override - public QueryableList asQueryable() { - return this.getDatabaseService().getQueryable(UserInfo.class); - } + @Override + public void delete(UserInfo item) { + this.getDatabaseService().delete(item); + } - @Override - public CompletableFuture createOrUpdateAsync(UserInfo item) { - return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); - } + @Override + public QueryableList asQueryable() { + return this.getDatabaseService().getQueryable(UserInfo.class); + } - @Override - public UserInfo find(UUID id, String hint) { - throw new UnsupportedOperationException(); - } + @Async + @Override + public CompletableFuture createOrUpdateAsync(UserInfo item) { + return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); + } + + @Override + public UserInfo find(UUID id, String hint) { + throw new UnsupportedOperationException(); + } } \ No newline at end of file diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserRoleDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserRoleDaoImpl.java index c22a51747..96a1522c4 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserRoleDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserRoleDaoImpl.java @@ -7,6 +7,7 @@ import eu.eudat.data.entities.UserInfo; import eu.eudat.data.entities.UserRole; import eu.eudat.queryable.QueryableList; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import java.util.List; @@ -57,6 +58,7 @@ public class UserRoleDaoImpl extends DatabaseAccess implements UserRol return this.getDatabaseService().getQueryable(UserRole.class); } + @Async @Override public CompletableFuture createOrUpdateAsync(UserRole item) { return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Content.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Content.java index 99217114a..cd3bb937e 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Content.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Content.java @@ -1,9 +1,11 @@ package eu.eudat.data.entities; +import eu.eudat.data.entities.helpers.EntityBinder; import eu.eudat.queryable.queryableentity.DataEntity; import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; +import java.util.List; import java.util.UUID; /** @@ -13,134 +15,141 @@ import java.util.UUID; @Table(name = "\"Content\"") public class Content implements DataEntity { - public enum ParentType { - PROJECT(0); + public enum ParentType { + GRANT(0); - private int value; + private int value; - private ParentType(int value) { - this.value = value; - } + private ParentType(int value) { + this.value = value; + } - public int getValue() { - return value; - } + public int getValue() { + return value; + } - public static ParentType fromInteger(int value) { - switch (value) { - case 0: - return PROJECT; - default: - throw new RuntimeException("Unsupported Content Parent Type Status"); - } - } - } + public static ParentType fromInteger(int value) { + switch (value) { + case 0: + return GRANT; + default: + throw new RuntimeException("Unsupported Content Parent Type Status"); + } + } + } - public enum LocationType { - EXTERNAL(0), INTERNAL(1); + public enum LocationType { + EXTERNAL(0), INTERNAL(1); - private Integer value; + private Integer value; - private LocationType(Integer value) { - this.value = value; - } + private LocationType(Integer value) { + this.value = value; + } - public Integer getValue() { - return value; - } + public Integer getValue() { + return value; + } - public static LocationType fromInteger(int value) { - switch (value) { - case 0: - return EXTERNAL; - case 1: - return INTERNAL; - default: - throw new RuntimeException("Unsupported Content Location Type"); - } - } - } + public static LocationType fromInteger(int value) { + switch (value) { + case 0: + return EXTERNAL; + case 1: + return INTERNAL; + default: + throw new RuntimeException("Unsupported Content Location Type"); + } + } + } - @Id - @GeneratedValue - @GenericGenerator(name = "uuid2", strategy = "uuid2") - @Column(name = "\"Id\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") - private UUID id; + @Id + @GeneratedValue + @GenericGenerator(name = "uuid2", strategy = "uuid2") + @Column(name = "\"Id\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") + private UUID id; - @Column(name = "\"Filename\"", nullable = false) - private String label; + @Column(name = "\"Filename\"", nullable = false) + private String label; - @Column(name = "\"Extension\"", nullable = false) - private String extension; + @Column(name = "\"Extension\"", nullable = false) + private String extension; - @Column(name = "\"ParentType\"", nullable = false) - private Integer parentType; + @Column(name = "\"ParentType\"", nullable = false) + private Integer parentType; - @Column(name = "\"Uri\"", nullable = false) - private String uri; + @Column(name = "\"Uri\"", nullable = false) + private String uri; - @Column(name = "\"LocationType\"", nullable = false) - private Integer locationType; + @Column(name = "\"LocationType\"", nullable = false) + private Integer locationType; - public UUID getId() { - return id; - } + public UUID getId() { + return id; + } - public void setId(UUID id) { - this.id = id; - } + public void setId(UUID id) { + this.id = id; + } - public String getLabel() { - return label; - } + public String getLabel() { + return label; + } - public void setLabel(String label) { - this.label = label; - } + public void setLabel(String label) { + this.label = label; + } - public String getExtension() { - return extension; - } + public String getExtension() { + return extension; + } - public void setExtension(String extension) { - this.extension = extension; - } + public void setExtension(String extension) { + this.extension = extension; + } - public Integer getParentType() { - return parentType; - } + public Integer getParentType() { + return parentType; + } - public void setParentType(Integer parentType) { - this.parentType = parentType; - } + public void setParentType(Integer parentType) { + this.parentType = parentType; + } - public String getUri() { - return uri; - } + public String getUri() { + return uri; + } - public void setUri(String uri) { - this.uri = uri; - } + public void setUri(String uri) { + this.uri = uri; + } - public Integer getLocationType() { - return locationType; - } + public Integer getLocationType() { + return locationType; + } - public void setLocationType(Integer locationType) { - this.locationType = locationType; - } + public void setLocationType(Integer locationType) { + this.locationType = locationType; + } - @Override - public void update(Content entity) { - this.extension = entity.getExtension(); - this.label = entity.getLabel(); - this.locationType = entity.getLocationType(); - this.parentType = entity.getParentType(); - this.uri = entity.getUri(); - } + @Override + public void update(Content entity) { + this.extension = entity.getExtension(); + this.label = entity.getLabel(); + this.locationType = entity.getLocationType(); + this.parentType = entity.getParentType(); + this.uri = entity.getUri(); + } - @Override - public UUID getKeys() { - return this.id; - } + @Override + public UUID getKeys() { + return this.id; + } + + @Override + public Content buildFromTuple(List tuple, List fields, String base) { + String currentBase = base.isEmpty() ? "" : base + "."; + if (fields.contains(currentBase + "id")) this.id = EntityBinder.fromTuple(tuple, currentBase + "id"); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Credential.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Credential.java index 91330c29e..7181abfb9 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Credential.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Credential.java @@ -1,143 +1,157 @@ package eu.eudat.data.entities; +import eu.eudat.data.converters.DateToUTCConverter; +import eu.eudat.data.entities.helpers.EntityBinder; import eu.eudat.queryable.queryableentity.DataEntity; import javax.persistence.*; import java.util.Date; +import java.util.List; import java.util.UUID; @Entity @Table(name = "\"Credential\"") @NamedEntityGraphs({ - @NamedEntityGraph( - name = "credentialUserInfo", - attributeNodes = {@NamedAttributeNode("userInfo")}) + @NamedEntityGraph( + name = "credentialUserInfo", + attributeNodes = {@NamedAttributeNode("userInfo")}) }) -public class Credential implements DataEntity { +public class Credential implements DataEntity { - @Id - @Column(name = "\"Id\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") - private UUID id; + @Id + @Column(name = "\"Id\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") + private UUID id; - @ManyToOne - @JoinColumn(name = "\"UserId\"", nullable = false) - private UserInfo userInfo; + @ManyToOne + @JoinColumn(name = "\"UserId\"", nullable = false) + private UserInfo userInfo; - @Column(name = "\"Status\"", nullable = false) - private Integer status; + @Column(name = "\"Status\"", nullable = false) + private Integer status; - @Column(name = "\"Provider\"", nullable = false) - private Integer provider; - @Column(name = "\"Public\"", nullable = false) - private String publicValue; - @Column(name = "\"Secret\"", nullable = false) - private String secret; - @Column(name = "\"CreationTime\"", nullable = false) - private Date creationTime; - @Column(name = "\"LastUpdateTime\"", nullable = false) - private Date lastUpdateTime; + @Column(name = "\"Provider\"", nullable = false) + private Integer provider; + @Column(name = "\"Public\"", nullable = false) + private String publicValue; + @Column(name = "\"Secret\"", nullable = false) + private String secret; - @Column(name = "\"ExternalId\"", nullable = false) - private String externalId; + @Column(name = "\"CreationTime\"", nullable = false) + @Convert(converter = DateToUTCConverter.class) + private Date creationTime; - public UUID getId() { - return id; - } + @Column(name = "\"LastUpdateTime\"", nullable = false) + @Convert(converter = DateToUTCConverter.class) + private Date lastUpdateTime; - public void setId(UUID id) { - this.id = id; - } + @Column(name = "\"ExternalId\"", nullable = false) + private String externalId; - public UserInfo getUserInfo() { - return userInfo; - } + public UUID getId() { + return id; + } - public void setUserInfo(UserInfo userInfo) { - this.userInfo = userInfo; - } + public void setId(UUID id) { + this.id = id; + } - public Integer getStatus() { - return status; - } + public UserInfo getUserInfo() { + return userInfo; + } - public void setStatus(Integer status) { - this.status = status; - } + public void setUserInfo(UserInfo userInfo) { + this.userInfo = userInfo; + } - public Integer getProvider() { - return provider; - } + public Integer getStatus() { + return status; + } - public void setProvider(Integer provider) { - this.provider = provider; - } + public void setStatus(Integer status) { + this.status = status; + } - public String getPublicValue() { - return publicValue; - } + public Integer getProvider() { + return provider; + } - public void setPublicValue(String publicValue) { - this.publicValue = publicValue; - } + public void setProvider(Integer provider) { + this.provider = provider; + } - public String getSecret() { - return secret; - } + public String getPublicValue() { + return publicValue; + } - public void setSecret(String secret) { - this.secret = secret; - } + public void setPublicValue(String publicValue) { + this.publicValue = publicValue; + } - public Date getCreationTime() { - return creationTime; - } + public String getSecret() { + return secret; + } - public void setCreationTime(Date creationTime) { - this.creationTime = creationTime; - } + public void setSecret(String secret) { + this.secret = secret; + } - public Date getLastUpdateTime() { - return lastUpdateTime; - } + public Date getCreationTime() { + return creationTime; + } - public void setLastUpdateTime(Date lastUpdateTime) { - this.lastUpdateTime = lastUpdateTime; - } + public void setCreationTime(Date creationTime) { + this.creationTime = creationTime; + } - public String getExternalId() { - return externalId; - } + public Date getLastUpdateTime() { + return lastUpdateTime; + } - public void setExternalId(String externalId) { - this.externalId = externalId; - } + public void setLastUpdateTime(Date lastUpdateTime) { + this.lastUpdateTime = lastUpdateTime; + } - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + public String getExternalId() { + return externalId; + } - Credential that = (Credential) o; + public void setExternalId(String externalId) { + this.externalId = externalId; + } - return provider.intValue() == that.provider.intValue(); - } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; - @Override - public int hashCode() { - return provider.intValue(); - } + Credential that = (Credential) o; - @Override - public void update(Credential entity) { - this.status = entity.status; - this.publicValue = entity.getPublicValue(); - this.secret = entity.getSecret(); - this.lastUpdateTime = new Date(); - } + return provider.intValue() == that.provider.intValue(); + } - @Override - public UUID getKeys() { - return this.id; - } + @Override + public int hashCode() { + return provider.intValue(); + } + + @Override + public void update(Credential entity) { + this.status = entity.status; + this.publicValue = entity.getPublicValue(); + this.secret = entity.getSecret(); + this.lastUpdateTime = new Date(); + } + + @Override + public UUID getKeys() { + return this.id; + } + + @Override + public Credential buildFromTuple(List tuple, List fields, String base) { + String currentBase = base.isEmpty() ? "" : base + "."; + if (fields.contains(currentBase + "id")) this.id = EntityBinder.fromTuple(tuple, currentBase + "id"); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DMP.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DMP.java index 8ccd7c8c6..58ecc4922 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DMP.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DMP.java @@ -1,12 +1,13 @@ package eu.eudat.data.entities; +import eu.eudat.data.converters.DateToUTCConverter; import eu.eudat.queryable.queryableentity.DataEntity; import org.hibernate.annotations.GenericGenerator; -import org.hibernate.annotations.Type; import javax.persistence.*; import java.util.*; +import java.util.stream.Collectors; @Entity @@ -14,13 +15,16 @@ import java.util.*; @NamedEntityGraphs({ @NamedEntityGraph( name = "dataManagementPlanListingModel", - attributeNodes = {@NamedAttributeNode("organisations"), @NamedAttributeNode("researchers"), - @NamedAttributeNode("project"), @NamedAttributeNode("creator"), @NamedAttributeNode("profile"), @NamedAttributeNode("dataset")} + attributeNodes = {@NamedAttributeNode("organisations"), @NamedAttributeNode("researchers"), @NamedAttributeNode("associatedDmps"), + @NamedAttributeNode("grant"), @NamedAttributeNode(value = "users", subgraph = "users"), @NamedAttributeNode("creator"), @NamedAttributeNode("profile"), @NamedAttributeNode("dataset")}, + subgraphs = { + @NamedSubgraph(name = "users", attributeNodes = {@NamedAttributeNode("user")}), + } ), @NamedEntityGraph( name = "fullyDetailed", attributeNodes = { - @NamedAttributeNode("project"), @NamedAttributeNode("profile"), + @NamedAttributeNode("grant"), @NamedAttributeNode("profile"), @NamedAttributeNode("users"), @NamedAttributeNode("organisations"), @NamedAttributeNode("researchers")}), @NamedEntityGraph( name = "dmpRecentActivity", @@ -30,7 +34,7 @@ import java.util.*; public class DMP implements DataEntity { public enum DMPStatus { - ACTIVE((short) 0), DELETED((short) 1); + ACTIVE((short) 0), FINALISED((short) 1),DELETED((short) 99); private short value; @@ -47,6 +51,8 @@ public class DMP implements DataEntity { case 0: return ACTIVE; case 1: + return FINALISED; + case 99: return DELETED; default: throw new RuntimeException("Unsupported DMP Status"); @@ -80,13 +86,20 @@ public class DMP implements DataEntity { @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "\"Project\"") - private Project project; + @JoinColumn(name = "\"Grant\"") + private Grant grant; - @Type(type = "eu.eudat.configurations.typedefinition.XMLType") + /*@Type(type = "eu.eudat.configurations.typedefinition.XMLType") @Column(name = "\"AssociatedDmps\"", columnDefinition = "xml", nullable = true) - private String associatedDmps; + private String associatedDmps;*/ + @OneToMany(fetch = FetchType.LAZY) + @JoinTable(name = "\"DMPDatasetProfile\"", + joinColumns = {@JoinColumn(name = "\"dmp\"", referencedColumnName = "\"ID\"")}, + inverseJoinColumns = {@JoinColumn(name = "\"datasetprofile\"", referencedColumnName = "\"ID\"")} + ) + private Set associatedDmps; + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "\"Profile\"") @@ -114,12 +127,13 @@ public class DMP implements DataEntity { private Set researchers; - @OneToMany(fetch = FetchType.LAZY) + @OneToMany(mappedBy = "dmp", fetch = FetchType.LAZY) + /*@OneToMany(fetch = FetchType.LAZY) @JoinTable(name = "\"UserDMP\"", joinColumns = {@JoinColumn(name = "dmp", referencedColumnName = "\"ID\"")}, inverseJoinColumns = {@JoinColumn(name = "usr", referencedColumnName = "id")} - ) - private Set users; + )*/ + private Set users; @Column(name = "\"Status\"", nullable = false) @@ -132,79 +146,80 @@ public class DMP implements DataEntity { private String dmpProperties; @Column(name = "\"Created\"") + @Convert(converter = DateToUTCConverter.class) private Date created = null; @Column(name = "\"Modified\"") + @Convert(converter = DateToUTCConverter.class) private Date modified = new Date(); - @Column(name = "\"Description\"") private String description; + @Column(name= "\"FinalizedAt\"") + @Convert(converter = DateToUTCConverter.class) + private Date finalizedAt; + + @Column(name = "\"isPublic\"", nullable = false) + private boolean isPublic; + + @Column(name= "\"PublishedAt\"") + @Convert(converter = DateToUTCConverter.class) + private Date publishedAt; + + @Column(name = "\"DOI\"") + private String doi; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "\"Project\"") + private Project project; + public String getDescription() { return description; } - - public void setDescription(String description) { this.description = description; } - public UserInfo getCreator() { return creator; } - - public void setCreator(UserInfo creator) { this.creator = creator; } - public Short getStatus() { return status; } - - public void setStatus(Short status) { this.status = status; } - public Date getCreated() { return created; } - - public void setCreated(Date created) { this.created = created; } - public Date getModified() { return modified; } - - public void setModified(Date modified) { this.modified = modified; } - - public Set getUsers() { + public Set getUsers() { return users; } - - public void setUsers(Set users) { + public void setUsers(Set users) { this.users = users; } - public UUID getId() { return id; } - public void setId(UUID id) { this.id = id; } @@ -212,7 +227,6 @@ public class DMP implements DataEntity { public UUID getGroupId() { return groupId; } - public void setGroupId(UUID groupId) { this.groupId = groupId; } @@ -220,7 +234,6 @@ public class DMP implements DataEntity { public String getLabel() { return label; } - public void setLabel(String label) { this.label = label; } @@ -228,31 +241,27 @@ public class DMP implements DataEntity { public Integer getVersion() { return version; } - public void setVersion(Integer version) { this.version = version; } - public Project getProject() { - return project; + public Grant getGrant() { + return grant; + } + public void setGrant(Grant grant) { + this.grant = grant; } - public void setProject(Project project) { - this.project = project; - } - - public String getAssociatedDmps() { + public Set getAssociatedDmps() { return associatedDmps; } - - public void setAssociatedDmps(String associatedDmps) { + public void setAssociatedDmps(Set associatedDmps) { this.associatedDmps = associatedDmps; } public DMPProfile getProfile() { return profile; } - public void setProfile(DMPProfile profile) { this.profile = profile; } @@ -260,7 +269,6 @@ public class DMP implements DataEntity { public Set getDataset() { return dataset; } - public void setDataset(Set dataset) { this.dataset = dataset; } @@ -268,7 +276,6 @@ public class DMP implements DataEntity { public Set getOrganisations() { return organisations; } - public void setOrganisations(Set organisations) { this.organisations = organisations; } @@ -276,7 +283,6 @@ public class DMP implements DataEntity { public Set getResearchers() { return researchers; } - public void setResearchers(Set researchers) { this.researchers = researchers; } @@ -284,7 +290,6 @@ public class DMP implements DataEntity { public String getProperties() { return properties; } - public void setProperties(String properties) { this.properties = properties; } @@ -292,11 +297,45 @@ public class DMP implements DataEntity { public String getDmpProperties() { return dmpProperties; } - public void setDmpProperties(String dmpProperties) { this.dmpProperties = dmpProperties; } + public Date getFinalizedAt() { + return finalizedAt; + } + public void setFinalizedAt(Date finalizedAt) { + this.finalizedAt = finalizedAt; + } + + public boolean isPublic() { + return isPublic; + } + public void setPublic(boolean aPublic) { + isPublic = aPublic; + } + + public Date getPublishedAt() { + return publishedAt; + } + public void setPublishedAt(Date publishedAt) { + this.publishedAt = publishedAt; + } + + public String getDoi() { + return doi; + } + public void setDoi(String doi) { + this.doi = doi; + } + + public Project getProject() { + return project; + } + public void setProject(Project project) { + this.project = project; + } + @Override public void update(DMP entity) { this.associatedDmps = entity.associatedDmps; @@ -305,13 +344,18 @@ public class DMP implements DataEntity { this.status = entity.getStatus(); this.created = entity.created; this.properties = entity.getProperties(); - this.project = entity.getProject(); + this.grant = entity.getGrant(); this.description = entity.getDescription(); this.researchers = entity.getResearchers(); this.organisations = entity.getOrganisations(); this.dmpProperties = entity.getDmpProperties(); + this.isPublic = entity.isPublic; + this.project = entity.getProject(); this.setModified(new Date()); + if (entity.getStatus().equals(DMPStatus.FINALISED.getValue())) this.setFinalizedAt(new Date()); + if (entity.isPublic) this.setPublishedAt(new Date()); if (entity.getUsers() != null) this.users = entity.getUsers(); + if (entity.getDoi() != null && entity.getDoi().trim().isEmpty()) this.doi = entity.doi; } @Override @@ -319,4 +363,11 @@ public class DMP implements DataEntity { return this.id; } + @Override + public DMP buildFromTuple(List tuple, List fields, String base) { + this.id = tuple.get(0).get(base.isEmpty() ? "id" : base + "." + "id", UUID.class); + this.dataset = tuple.stream().map(x -> new Dataset().buildFromTuple(tuple, fields ,base.isEmpty() ? "dataset" : base + "." + "dataset")).collect(Collectors.toSet()); + this.creator = tuple.stream().map(x -> new UserInfo().buildFromTuple(tuple, fields , base.isEmpty() ? "creator" : base + "." + "creator")).collect(Collectors.toList()).get(0); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DMPProfile.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DMPProfile.java index 729f70587..ea48c196a 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DMPProfile.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DMPProfile.java @@ -1,12 +1,15 @@ package eu.eudat.data.entities; +import eu.eudat.data.converters.DateToUTCConverter; +import eu.eudat.data.entities.helpers.EntityBinder; import eu.eudat.queryable.queryableentity.DataEntity; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Type; import javax.persistence.*; import java.util.Date; +import java.util.List; import java.util.Set; import java.util.UUID; @@ -15,6 +18,33 @@ import java.util.UUID; @Table(name = "\"DMPProfile\"") public class DMPProfile implements DataEntity { + public enum Status { + SAVED((short) 0), FINALIZED((short) 1), DELETED((short) 99); + + private short value; + + private Status(short value) { + this.value = value; + } + + public short getValue() { + return value; + } + + public static Status fromInteger(int value) { + switch (value) { + case 0: + return SAVED; + case 1: + return FINALIZED; + case 99: + return DELETED; + default: + throw new RuntimeException("Unsupported Dmp Profile Status"); + } + } + } + @Id @GeneratedValue @GenericGenerator(name = "uuid2", strategy = "uuid2") @@ -39,9 +69,11 @@ public class DMPProfile implements DataEntity { @Column(name = "\"Created\"") + @Convert(converter = DateToUTCConverter.class) private Date created = null; @Column(name = "\"Modified\"") + @Convert(converter = DateToUTCConverter.class) private Date modified = new Date(); public int getStatus() { @@ -105,10 +137,18 @@ public class DMPProfile implements DataEntity { this.modified = new Date(); this.definition = entity.getDefinition(); this.label = entity.getLabel(); + this.status= entity.getStatus(); } @Override public UUID getKeys() { return this.id; } + + @Override + public DMPProfile buildFromTuple(List tuple,List fields, String base) { + String currentBase = base.isEmpty() ? "" : base + "."; + if (fields.contains(currentBase + "id")) this.id = EntityBinder.fromTuple(tuple, currentBase + "id"); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DataRepository.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DataRepository.java index 72a3ed3d9..a65eda92f 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DataRepository.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DataRepository.java @@ -1,6 +1,7 @@ package eu.eudat.data.entities; +import eu.eudat.data.entities.helpers.EntityBinder; import eu.eudat.queryable.queryableentity.DataEntity; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Type; @@ -8,143 +9,151 @@ import org.hibernate.annotations.Type; import javax.persistence.*; import java.io.Serializable; import java.util.Date; +import java.util.List; import java.util.Set; import java.util.UUID; @Entity @Table(name = "\"DataRepository\"") -public class DataRepository implements Serializable, DataEntity { +public class DataRepository implements Serializable, DataEntity { - @Id - @GeneratedValue - @GenericGenerator(name = "uuid2", strategy = "uuid2") - @Column(name = "\"ID\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") - private UUID id; + @Id + @GeneratedValue + @GenericGenerator(name = "uuid2", strategy = "uuid2") + @Column(name = "\"ID\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") + private UUID id; - @Column(name = "\"Label\"") - private String label; + @Column(name = "\"Label\"") + private String label; - @Column(name = "\"Abbreviation\"") - private String abbreviation; + @Column(name = "\"Abbreviation\"") + private String abbreviation; - @Column(name = "\"Reference\"", nullable = false) - private String reference; + @Column(name = "\"Reference\"", nullable = false) + private String reference; - @Column(name = "\"Uri\"") - private String uri; + @Column(name = "\"Uri\"") + private String uri; - @Type(type = "eu.eudat.configurations.typedefinition.XMLType") - @Column(name = "\"Definition\"", columnDefinition = "xml", nullable = true) - private String definition; + @Type(type = "eu.eudat.configurations.typedefinition.XMLType") + @Column(name = "\"Definition\"", columnDefinition = "xml", nullable = true) + private String definition; - @OneToMany(mappedBy = "dataRepository", cascade = CascadeType.ALL, orphanRemoval = true) - private Set datasetDataRepositories; + @OneToMany(mappedBy = "dataRepository", cascade = CascadeType.ALL, orphanRemoval = true) + private Set datasetDataRepositories; - @Column(name = "\"Status\"", nullable = false) - private Short status; + @Column(name = "\"Status\"", nullable = false) + private Short status; - @Column(name = "\"Created\"") - private Date created = null; + @Column(name = "\"Created\"") + private Date created = null; - @Column(name = "\"Modified\"") - private Date modified = new Date(); + @Column(name = "\"Modified\"") + private Date modified = new Date(); - public Short getStatus() { - return status; - } + public Short getStatus() { + return status; + } - public void setStatus(Short status) { - this.status = status; - } + public void setStatus(Short status) { + this.status = status; + } - public Date getCreated() { - return created; - } + public Date getCreated() { + return created; + } - public void setCreated(Date created) { - this.created = created; - } + public void setCreated(Date created) { + this.created = created; + } - public Date getModified() { - return modified; - } + public Date getModified() { + return modified; + } - public void setModified(Date modified) { - this.modified = modified; - } + public void setModified(Date modified) { + this.modified = modified; + } - public UUID getId() { - return id; - } + public UUID getId() { + return id; + } - public void setId(UUID id) { - this.id = id; - } + public void setId(UUID id) { + this.id = id; + } - public String getLabel() { - return label; - } + public String getLabel() { + return label; + } - public void setLabel(String label) { - this.label = label; - } + public void setLabel(String label) { + this.label = label; + } - public String getAbbreviation() { - return abbreviation; - } + public String getAbbreviation() { + return abbreviation; + } - public void setAbbreviation(String abbreviation) { - this.abbreviation = abbreviation; - } + public void setAbbreviation(String abbreviation) { + this.abbreviation = abbreviation; + } - public String getReference() { - return reference; - } + public String getReference() { + return reference; + } - public void setReference(String reference) { - this.reference = reference; - } + public void setReference(String reference) { + this.reference = reference; + } - public String getUri() { - return uri; - } + public String getUri() { + return uri; + } - public void setUri(String uri) { - this.uri = uri; - } + public void setUri(String uri) { + this.uri = uri; + } - public String getDefinition() { - return definition; - } + public String getDefinition() { + return definition; + } - public void setDefinition(String definition) { - this.definition = definition; - } + public void setDefinition(String definition) { + this.definition = definition; + } - public Set getDatasetDataRepositories() { - return datasetDataRepositories; - } + public Set getDatasetDataRepositories() { + return datasetDataRepositories; + } - public void setDatasetDataRepositories(Set datasetDataRepositories) { - this.datasetDataRepositories = datasetDataRepositories; - } + public void setDatasetDataRepositories(Set datasetDataRepositories) { + this.datasetDataRepositories = datasetDataRepositories; + } - @Override - public void update(DataRepository entity) { + @Override + public void update(DataRepository entity) { - } + } - @Override - public UUID getKeys() { - return this.id; - } + @Override + public UUID getKeys() { + return this.id; + } + + @Override + public DataRepository buildFromTuple(List tuple, List fields, String base) { + String currentBase = base.isEmpty() ? "" : base + "."; + if (fields.contains(currentBase + "id")) this.id = EntityBinder.fromTuple(tuple, currentBase + "id"); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Dataset.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Dataset.java index 58969ef3b..3763b6de6 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Dataset.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Dataset.java @@ -1,6 +1,8 @@ package eu.eudat.data.entities; +import eu.eudat.data.converters.DateToUTCConverter; +import eu.eudat.data.entities.helpers.EntityBinder; import eu.eudat.queryable.queryableentity.DataEntity; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Type; @@ -12,312 +14,311 @@ import java.util.stream.Collectors; @Entity @Table(name = "\"Dataset\"") @NamedEntityGraphs({ - @NamedEntityGraph( - name = "datasetListingModel", - attributeNodes = {@NamedAttributeNode("services"), @NamedAttributeNode("datasetDataRepositories"), @NamedAttributeNode("datasetExternalDatasets"), @NamedAttributeNode("registries"), - @NamedAttributeNode(value = "dmp", subgraph = "dmp"), @NamedAttributeNode("profile"), @NamedAttributeNode("creator")}, - subgraphs = @NamedSubgraph(name = "dmp", attributeNodes = {@NamedAttributeNode("creator"), @NamedAttributeNode("users")})), - @NamedEntityGraph( - name = "datasetWizardModel", - attributeNodes = {@NamedAttributeNode("services"), @NamedAttributeNode("datasetDataRepositories"), @NamedAttributeNode("datasetExternalDatasets"), @NamedAttributeNode("registries"), - @NamedAttributeNode("dmp"), @NamedAttributeNode("profile"), @NamedAttributeNode("creator")}), - @NamedEntityGraph( - name = "datasetRecentActivity", - attributeNodes = {@NamedAttributeNode(value = "dmp", subgraph = "dmp"), @NamedAttributeNode("creator")}, - subgraphs = @NamedSubgraph(name = "dmp", attributeNodes = {@NamedAttributeNode("creator"), @NamedAttributeNode("users")})) + @NamedEntityGraph( + name = "datasetListingModel", + attributeNodes = {@NamedAttributeNode("services"), @NamedAttributeNode(value = "datasetDataRepositories", subgraph = "datasetDataRepositories"), + @NamedAttributeNode(value = "datasetExternalDatasets", subgraph = "datasetExternalDatasets"), @NamedAttributeNode("registries"), + @NamedAttributeNode(value = "dmp", subgraph = "dmp"), @NamedAttributeNode("profile"), @NamedAttributeNode("creator")}, + subgraphs = { + @NamedSubgraph(name = "dmp", attributeNodes = {@NamedAttributeNode("creator"), @NamedAttributeNode("users"), @NamedAttributeNode("grant"), @NamedAttributeNode("organisations")}), + @NamedSubgraph(name = "datasetDataRepositories", attributeNodes = {@NamedAttributeNode("dataRepository")}), + @NamedSubgraph(name = "datasetExternalDatasets", attributeNodes = {@NamedAttributeNode("externalDataset")}) + }), + + @NamedEntityGraph( + name = "datasetWizardModel", + attributeNodes = {@NamedAttributeNode("services"), @NamedAttributeNode("datasetDataRepositories"), @NamedAttributeNode("datasetExternalDatasets"), @NamedAttributeNode("registries"), + @NamedAttributeNode("dmp"), @NamedAttributeNode("profile"), @NamedAttributeNode("creator")}), + @NamedEntityGraph( + name = "datasetRecentActivity", + attributeNodes = {@NamedAttributeNode(value = "dmp", subgraph = "dmp")}, + subgraphs = @NamedSubgraph(name = "dmp", attributeNodes = {@NamedAttributeNode("users")})), + @NamedEntityGraph( + name = "datasetDataRepositories", + attributeNodes = {@NamedAttributeNode(value = "dmp", subgraph = "dmp"), @NamedAttributeNode("creator")}, + subgraphs = @NamedSubgraph(name = "dmp", attributeNodes = {@NamedAttributeNode("creator"), @NamedAttributeNode("users")})) }) public class Dataset implements DataEntity { - public static Set getHints() { - return hints; - } + public static Set getHints() { + return hints; + } - private static final Set hints = new HashSet<>(Arrays.asList("datasetListingModel")); + private static final Set hints = new HashSet<>(Arrays.asList("datasetListingModel")); - public enum Status { - SAVED((short) 0), FINALISED((short) 1), DELETED((short) 99); + public enum Status { + SAVED((short) 0), FINALISED((short) 1), CANCELED((short) 2), DELETED((short) 99),; - private short value; + private short value; - private Status(short value) { - this.value = value; - } + private Status(short value) { + this.value = value; + } - public short getValue() { - return value; - } + public short getValue() { + return value; + } - public static Status fromInteger(int value) { - switch (value) { - case 0: - return SAVED; - case 1: - return FINALISED; - default: - throw new RuntimeException("Unsupported Project Status"); - } - } - } + public static Status fromInteger(int value) { + switch (value) { + case 0: + return SAVED; + case 1: + return FINALISED; + case 2: + return CANCELED; + case 99: + return DELETED; + default: + throw new RuntimeException("Unsupported Dataset Status"); + } + } + } - @Id - @GeneratedValue - @GenericGenerator(name = "uuid2", strategy = "uuid2") - @Column(name = "\"ID\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") - private UUID id; + @Id + @GeneratedValue + @GenericGenerator(name = "uuid2", strategy = "uuid2") + @Column(name = "\"ID\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") + private UUID id; - @Column(name = "\"Label\"") - private String label; + @Column(name = "\"Label\"") + private String label; - - @ManyToOne(fetch = FetchType.LAZY) + @ManyToOne(fetch = FetchType.LAZY) // @Cascade(value=org.hibernate.annotations.CascadeType.ALL) - @JoinColumn(name = "\"DMP\"", nullable = true) - private DMP dmp; + @JoinColumn(name = "\"DMP\"", nullable = false) + private DMP dmp; + @Column(name = "\"Uri\"") + private String uri; - @Column(name = "\"Uri\"") - private String uri; + @Type(type = "eu.eudat.configurations.typedefinition.XMLType") + @Column(name = "\"Properties\"", columnDefinition = "xml", nullable = true) + private String properties; - @Type(type = "eu.eudat.configurations.typedefinition.XMLType") - @Column(name = "\"Properties\"", columnDefinition = "xml", nullable = true) - private String properties; + @ManyToOne(fetch = FetchType.LAZY) + //@Cascade(value=org.hibernate.annotations.CascadeType.ALL) + @JoinColumn(name = "\"Profile\"", nullable = true) + private DatasetProfile profile; + @Type(type = "eu.eudat.configurations.typedefinition.XMLType") + @Column(name = "\"Reference\"", columnDefinition = "xml", nullable = true) + private String reference; - @ManyToOne(fetch = FetchType.LAZY) - //@Cascade(value=org.hibernate.annotations.CascadeType.ALL) - @JoinColumn(name = "\"Profile\"", nullable = true) - private DatasetProfile profile; + @OneToMany(fetch = FetchType.LAZY) + @JoinTable(name = "\"DatasetRegistry\"", + joinColumns = {@JoinColumn(name = "\"Dataset\"", referencedColumnName = "\"ID\"")}, + inverseJoinColumns = {@JoinColumn(name = "\"Registry\"", referencedColumnName = "\"ID\"")} + ) + private Set registries; + + @OneToMany(mappedBy = "dataset", cascade = CascadeType.ALL, orphanRemoval = true) + private Set datasetDataRepositories; - @Type(type = "eu.eudat.configurations.typedefinition.XMLType") - @Column(name = "\"Reference\"", columnDefinition = "xml", nullable = true) - private String reference; + @OneToMany(mappedBy = "dataset", cascade = CascadeType.ALL, orphanRemoval = true) + private Set services; + + @OneToMany(mappedBy = "dataset", cascade = CascadeType.ALL, orphanRemoval = true) + private Set datasetExternalDatasets; - @OneToMany(fetch = FetchType.LAZY) - @JoinTable(name = "\"DatasetRegistry\"", - joinColumns = {@JoinColumn(name = "\"Dataset\"", referencedColumnName = "\"ID\"")}, - inverseJoinColumns = {@JoinColumn(name = "\"Registry\"", referencedColumnName = "\"ID\"")} - ) - private Set registries; + @Column(name = "\"Status\"", nullable = false) + private Short status; - @OneToMany(mappedBy = "dataset", cascade = CascadeType.ALL, orphanRemoval = true) - private Set datasetDataRepositories; + @Column(name = "\"Created\"") + @Convert(converter = DateToUTCConverter.class) + private Date created = null; + @Column(name = "\"Modified\"") + @Convert(converter = DateToUTCConverter.class) + private Date modified = new Date(); - @OneToMany(mappedBy = "dataset", cascade = CascadeType.ALL, orphanRemoval = true) - private Set services; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "\"Creator\"", nullable = true) + private UserInfo creator; - @OneToMany(mappedBy = "dataset", cascade = CascadeType.ALL, orphanRemoval = true) - private Set datasetExternalDatasets; + @Column(name = "\"Description\"") + private String description; + + @Column(name= "\"FinalizedAt\"") + @Convert(converter = DateToUTCConverter.class) + private Date finalizedAt; - @Column(name = "\"Status\"", nullable = false) - private Short status; + public String getDescription() { + return description; + } + public void setDescription(String description) { + this.description = description; + } + - @Column(name = "\"IsPublic\"", nullable = false) - private boolean isPublic; - - @Column(name = "\"Created\"") - private Date created = null; - - @Column(name = "\"Modified\"") - private Date modified = new Date(); - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "\"Creator\"", nullable = true) - private UserInfo creator; - - @Column(name = "\"Description\"") - private String description; - - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - - public UserInfo getCreator() { - return creator; - } - - public void setCreator(UserInfo creator) { - this.creator = creator; - } - - public Short getStatus() { - return status; - } - - - public void setStatus(Short status) { - this.status = status; - } - - - public Date getCreated() { - return created; - } - - - public void setCreated(Date created) { - this.created = created; - } - - - public Date getModified() { - return modified; - } - - - public void setModified(Date modified) { - this.modified = modified; - } - - - public Set getRegistries() { - return registries; - } - - - public void setRegistries(Set registries) { - this.registries = registries; - } - - public Set getServices() { - return services; - } - - public void setServices(Set services) { - this.services = services; - } - - public UUID getId() { - return id; - } - - - public void setId(UUID id) { - this.id = id; - } - - - public String getLabel() { - return label; - } - - - public void setLabel(String label) { - this.label = label; - } - - - public DMP getDmp() { - return dmp; - } - - - public void setDmp(DMP dmp) { - this.dmp = dmp; - } - - - public String getUri() { - return uri; - } - - - public void setUri(String uri) { - this.uri = uri; - } - - - public String getProperties() { - return properties; - } - - - public void setProperties(String properties) { - this.properties = properties; - } - - - public DatasetProfile getProfile() { - return profile; - } - - - public void setProfile(DatasetProfile profile) { - this.profile = profile; - } - - - public Set getDatasetDataRepositories() { - return datasetDataRepositories; - } - - public void setDatasetDataRepositories(Set datasetDataRepositories) { - this.datasetDataRepositories = datasetDataRepositories; - } - - public String getReference() { - return reference; - } - - - public void setReference(String reference) { - this.reference = reference; - } - - public Set getDatasetExternalDatasets() { - return datasetExternalDatasets; - } - - public void setDatasetExternalDatasets(Set datasetExternalDatasets) { - this.datasetExternalDatasets = datasetExternalDatasets; - } - - public boolean isPublic() { - return isPublic; - } - - public void setPublic(boolean aPublic) { - isPublic = aPublic; - } - - @Override - public void update(Dataset entity) { - this.setRegistries(entity.getRegistries()); - if(this.getDatasetDataRepositories()==null) this.setDatasetDataRepositories(new HashSet<>()); - if(!this.getDatasetDataRepositories().containsAll(entity.getDatasetDataRepositories())){ - this.getDatasetDataRepositories().removeAll(this.getDatasetDataRepositories()); - this.getDatasetDataRepositories().addAll(entity.getDatasetDataRepositories().stream().map(item->{ - item.setDataset(this); - return item; - }).collect(Collectors.toList())); - } - this.setDescription(entity.getDescription()); - this.setLabel(entity.getLabel()); - this.setProperties(entity.getProperties()); - if(this.getDatasetExternalDatasets()==null) this.setDatasetExternalDatasets(new HashSet<>()); - if(!this.getDatasetExternalDatasets().containsAll(entity.getDatasetExternalDatasets())) { - this.getDatasetExternalDatasets().removeAll(this.getDatasetExternalDatasets()); - this.getDatasetExternalDatasets().addAll(entity.getDatasetExternalDatasets().stream().map(item -> { - item.setDataset(this); - return item; - }).collect(Collectors.toList())); - } - this.setStatus(entity.getStatus()); - this.setProfile(entity.getProfile()); - this.setModified(new Date()); - if (entity.getCreator() != null) this.creator = entity.getCreator(); - } - - @Override - public UUID getKeys() { - return this.id; - } + public UserInfo getCreator() { + return creator; + } + public void setCreator(UserInfo creator) { + this.creator = creator; + } + + public Short getStatus() { + return status; + } + public void setStatus(Short status) { + this.status = status; + } + + + public Date getCreated() { + return created; + } + public void setCreated(Date created) { + this.created = created; + } + + + public Date getModified() { + return modified; + } + public void setModified(Date modified) { + this.modified = modified; + } + + + public Set getRegistries() { + return registries; + } + public void setRegistries(Set registries) { + this.registries = registries; + } + + public Set getServices() { + return services; + } + public void setServices(Set services) { + this.services = services; + } + + public UUID getId() { + return id; + } + public void setId(UUID id) { + this.id = id; + } + + + public String getLabel() { + return label; + } + public void setLabel(String label) { + this.label = label; + } + + + public DMP getDmp() { + return dmp; + } + public void setDmp(DMP dmp) { + this.dmp = dmp; + } + + + public String getUri() { + return uri; + } + public void setUri(String uri) { + this.uri = uri; + } + + + public String getProperties() { + return properties; + } + public void setProperties(String properties) { + this.properties = properties; + } + + + public DatasetProfile getProfile() { + return profile; + } + public void setProfile(DatasetProfile profile) { + this.profile = profile; + } + + + public Set getDatasetDataRepositories() { + return datasetDataRepositories; + } + public void setDatasetDataRepositories(Set datasetDataRepositories) { + this.datasetDataRepositories = datasetDataRepositories; + } + + public String getReference() { + return reference; + } + public void setReference(String reference) { + this.reference = reference; + } + + public Set getDatasetExternalDatasets() { + return datasetExternalDatasets; + } + public void setDatasetExternalDatasets(Set datasetExternalDatasets) { + this.datasetExternalDatasets = datasetExternalDatasets; + } + + public Date getFinalizedAt() { + return finalizedAt; + } + public void setFinalizedAt(Date finalizedAt) { + this.finalizedAt = finalizedAt; + } + + @Override + public void update(Dataset entity) { + this.setRegistries(entity.getRegistries()); + if (this.getDatasetDataRepositories() == null) this.setDatasetDataRepositories(new HashSet<>()); + if (!this.getDatasetDataRepositories().containsAll(entity.getDatasetDataRepositories())) { + this.getDatasetDataRepositories().removeAll(this.getDatasetDataRepositories()); + this.getDatasetDataRepositories().addAll(entity.getDatasetDataRepositories().stream().map(item -> { + item.setDataset(this); + return item; + }).collect(Collectors.toList())); + } + this.setUri(entity.getUri()); + this.setDescription(entity.getDescription()); + this.setLabel(entity.getLabel()); + this.setProperties(entity.getProperties()); + if (this.getDatasetExternalDatasets() == null) this.setDatasetExternalDatasets(new HashSet<>()); + if (!this.getDatasetExternalDatasets().containsAll(entity.getDatasetExternalDatasets())) { + this.getDatasetExternalDatasets().removeAll(this.getDatasetExternalDatasets()); + this.getDatasetExternalDatasets().addAll(entity.getDatasetExternalDatasets().stream().map(item -> { + item.setDataset(this); + return item; + }).collect(Collectors.toList())); + } + if (this.getServices() == null) this.setServices(new HashSet<>()); + if(!this.getServices().containsAll(entity.getServices())) { + this.getServices().removeAll(this.getServices()); + this.getServices().addAll(entity.getServices()); + } + this.setDmp(entity.getDmp()); + this.setStatus(entity.getStatus()); + this.setProfile(entity.getProfile()); + this.setModified(new Date()); + if (entity.getStatus().equals(Status.FINALISED.getValue())) this.setFinalizedAt(new Date()); + if (entity.getCreator() != null) this.creator = entity.getCreator(); + } + + @Override + public UUID getKeys() { + return this.id; + } + + @Override + public Dataset buildFromTuple(List tuple, List fields, String base) { + String currentBase = base.isEmpty() ? "" : base + "."; + if (fields.contains(currentBase + "id")) this.id = EntityBinder.fromTuple(tuple, currentBase + "id"); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetDataRepository.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetDataRepository.java index 6cc2ddafa..b99483a13 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetDataRepository.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetDataRepository.java @@ -1,10 +1,11 @@ package eu.eudat.data.entities; +import eu.eudat.data.entities.helpers.EntityBinder; import eu.eudat.queryable.queryableentity.DataEntity; import org.hibernate.annotations.GenericGenerator; -import org.hibernate.annotations.Type; import javax.persistence.*; +import java.util.List; import java.util.UUID; /** @@ -13,78 +14,84 @@ import java.util.UUID; @Entity @Table(name = "\"DatasetDataRepository\"") -public class DatasetDataRepository implements DataEntity { +public class DatasetDataRepository implements DataEntity { - @Id - @GeneratedValue - @GenericGenerator(name = "uuid2", strategy = "uuid2") - @Column(name = "\"ID\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") - private UUID id; + @Id + @GeneratedValue + @GenericGenerator(name = "uuid2", strategy = "uuid2") + @Column(name = "\"ID\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") + private UUID id; - @ManyToOne - @JoinColumn(name = "\"Dataset\"", nullable = false) - private Dataset dataset; + @ManyToOne + @JoinColumn(name = "\"Dataset\"", nullable = false) + private Dataset dataset; - @ManyToOne - @JoinColumn(name = "\"DataRepository\"", nullable = false) - private DataRepository dataRepository; + @ManyToOne + @JoinColumn(name = "\"DataRepository\"", nullable = false) + private DataRepository dataRepository; - @Column(name = "\"Role\"") - private Integer role; + @Column(name = "\"Role\"") + private Integer role; + @Column(name = "\"Data\"") + private String data; - @Column(name = "\"Data\"") - private String data; + public UUID getId() { + return id; + } - public UUID getId() { - return id; - } + public void setId(UUID id) { + this.id = id; + } - public void setId(UUID id) { - this.id = id; - } + public Dataset getDataset() { + return dataset; + } - public Dataset getDataset() { - return dataset; - } + public void setDataset(Dataset dataset) { + this.dataset = dataset; + } - public void setDataset(Dataset dataset) { - this.dataset = dataset; - } + public DataRepository getDataRepository() { + return dataRepository; + } - public DataRepository getDataRepository() { - return dataRepository; - } + public void setDataRepository(DataRepository dataRepository) { + this.dataRepository = dataRepository; + } - public void setDataRepository(DataRepository dataRepository) { - this.dataRepository = dataRepository; - } + public Integer getRole() { + return role; + } - public Integer getRole() { - return role; - } + public void setRole(Integer role) { + this.role = role; + } - public void setRole(Integer role) { - this.role = role; - } + public String getData() { + return data; + } - public String getData() { - return data; - } + public void setData(String data) { + this.data = data; + } - public void setData(String data) { - this.data = data; - } + @Override + public void update(DatasetDataRepository entity) { + this.dataset = entity.getDataset(); + this.dataRepository = entity.getDataRepository(); + this.role = entity.getRole(); + } - @Override - public void update(DatasetDataRepository entity) { - this.dataset = entity.getDataset(); - this.dataRepository = entity.getDataRepository(); - this.role = entity.getRole(); - } + @Override + public UUID getKeys() { + return this.id; + } - @Override - public UUID getKeys() { - return this.id; - } + @Override + public DatasetDataRepository buildFromTuple(List tuple, List fields, String base) { + String currentBase = base.isEmpty() ? "" : base + "."; + if (fields.contains(currentBase + "id")) this.id = EntityBinder.fromTuple(tuple, currentBase + "id"); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetExternalDataset.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetExternalDataset.java index c9b27cc83..dbcf75b4c 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetExternalDataset.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetExternalDataset.java @@ -1,88 +1,95 @@ package eu.eudat.data.entities; +import eu.eudat.data.entities.helpers.EntityBinder; import eu.eudat.queryable.queryableentity.DataEntity; import org.hibernate.annotations.GenericGenerator; -import org.hibernate.annotations.Type; import javax.persistence.*; +import java.util.List; import java.util.UUID; @Entity @Table(name = "\"DatasetExternalDataset\"") -public class DatasetExternalDataset implements DataEntity { +public class DatasetExternalDataset implements DataEntity { - @Id - @GeneratedValue - @GenericGenerator(name = "uuid2", strategy = "uuid2") - @Column(name = "\"Id\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") - private UUID id; + @Id + @GeneratedValue + @GenericGenerator(name = "uuid2", strategy = "uuid2") + @Column(name = "\"Id\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") + private UUID id; + + @ManyToOne + @JoinColumn(name = "\"Dataset\"", nullable = false) + private Dataset dataset; + + @ManyToOne + @JoinColumn(name = "\"ExternalDataset\"", nullable = false) + private ExternalDataset externalDataset; + + @Column(name = "\"Role\"") + private Integer role; + + @Column(name = "\"Data\"") + private String data; - @ManyToOne - @JoinColumn(name = "\"Dataset\"", nullable = false) - private Dataset dataset; + public UUID getId() { + return id; + } - @ManyToOne - @JoinColumn(name = "\"ExternalDataset\"", nullable = false) - private ExternalDataset externalDataset; + public void setId(UUID id) { + this.id = id; + } - @Column(name = "\"Role\"") - private Integer role; + public Dataset getDataset() { + return dataset; + } - @Column(name = "\"Data\"") - private String data; + public void setDataset(Dataset dataset) { + this.dataset = dataset; + } + public ExternalDataset getExternalDataset() { + return externalDataset; + } - public UUID getId() { - return id; - } + public void setExternalDataset(ExternalDataset externalDataset) { + this.externalDataset = externalDataset; + } - public void setId(UUID id) { - this.id = id; - } + public Integer getRole() { + return role; + } - public Dataset getDataset() { - return dataset; - } + public void setRole(Integer role) { + this.role = role; + } - public void setDataset(Dataset dataset) { - this.dataset = dataset; - } + public String getData() { + return data; + } - public ExternalDataset getExternalDataset() { - return externalDataset; - } + public void setData(String data) { + this.data = data; + } - public void setExternalDataset(ExternalDataset externalDataset) { - this.externalDataset = externalDataset; - } + @Override + public void update(DatasetExternalDataset entity) { + this.dataset = entity.getDataset(); + this.externalDataset = entity.getExternalDataset(); + this.role = entity.getRole(); + } - public Integer getRole() { - return role; - } + @Override + public UUID getKeys() { + return this.id; + } - public void setRole(Integer role) { - this.role = role; - } - - public String getData() { - return data; - } - - public void setData(String data) { - this.data = data; - } - - @Override - public void update(DatasetExternalDataset entity) { - this.dataset = entity.getDataset(); - this.externalDataset = entity.getExternalDataset(); - this.role = entity.getRole(); - } - - @Override - public UUID getKeys() { - return this.id; - } + @Override + public DatasetExternalDataset buildFromTuple(List tuple, List fields, String base) { + String currentBase = base.isEmpty() ? "" : base + "."; + if (fields.contains(currentBase + "id")) this.id = EntityBinder.fromTuple(tuple, currentBase + "id"); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetProfile.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetProfile.java index 193450615..b12be8be6 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetProfile.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetProfile.java @@ -1,19 +1,47 @@ package eu.eudat.data.entities; +import eu.eudat.data.converters.DateToUTCConverter; import eu.eudat.queryable.queryableentity.DataEntity; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Type; import javax.persistence.*; import java.util.Date; +import java.util.List; import java.util.Set; import java.util.UUID; @Entity @Table(name = "\"DatasetProfile\"") -public class DatasetProfile implements DataEntity { +public class DatasetProfile implements DataEntity{ + + public enum Status { + SAVED((short) 0), FINALIZED((short) 1), DELETED((short) 99); + + private short value; + + private Status(short value) { + this.value = value; + } + public short getValue() { + return value; + } + + public static Status fromInteger(int value) { + switch (value) { + case 0: + return SAVED; + case 1: + return FINALIZED; + case 99: + return DELETED; + default: + throw new RuntimeException("Unsupported Dataset Profile Status"); + } + } + } @Id @GeneratedValue @@ -31,108 +59,111 @@ public class DatasetProfile implements DataEntity { @Column(name = "\"Definition\"", columnDefinition = "xml", nullable = false) private String definition; - @Column(name = "\"Status\"", nullable = false) private Short status; - @Column(name = "\"Created\"") + @Convert(converter = DateToUTCConverter.class) private Date created; @Column(name = "\"Modified\"") + @Convert(converter = DateToUTCConverter.class) private Date modified = new Date(); @Column(name = "\"Description\"") private String description; + @Column(name = "\"GroupId\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") + private UUID groupId; + + @Column(name = "\"Version\"", nullable = false) + private Short version; + + @ManyToMany(fetch = FetchType.LAZY) + @JoinTable(name = "\"DMPDatasetProfile\"", + joinColumns = {@JoinColumn(name = "\"datasetprofile\"", referencedColumnName = "\"ID\"")}, + inverseJoinColumns = {@JoinColumn(name = "\"dmp\"", referencedColumnName = "\"ID\"")} + ) + private List dmps; + public String getDescription() { return description; } - - public void setDescription(String description) { this.description = description; } - public Short getStatus() { return status; } - - public void setStatus(Short status) { this.status = status; } - public Date getCreated() { return created; } - - public void setCreated(Date created) { this.created = created; } - public Date getModified() { return modified; } - - public void setModified(Date modified) { this.modified = modified; } - public UUID getId() { return id; } - - public void setId(UUID id) { - this.id = id; - } + public void setId(UUID id) { this.id = id;} public String getLabel() { return label; } - public void setLabel(String label) { this.label = label; } - public String getDefinition() { return definition; } - public void setDefinition(String definition) { this.definition = definition; } - public Set getDataset() { return dataset; } - public void setDataset(Set dataset) { this.dataset = dataset; } + public UUID getGroupId() { return groupId; } + public void setGroupId(UUID groupId) { this.groupId = groupId;} + + public Short getVersion() { return version; } + public void setVersion(Short version) { this.version = version; } + @Override public String toString() { - return "DatasetProfileListingModel [id=" + id + ", label=" + label + ", dataset=" + dataset + ", definition=" + definition + "]"; + return "DatasetProfileListingModel [id=" + id + ", label=" + label + ", dataset=" + dataset + ", definition=" + definition + ", version=" + version + "]"; } - @Override public void update(DatasetProfile entity) { - } @Override public UUID getKeys() { return this.id; } + + @Override + public DatasetProfile buildFromTuple(List tuple, List fields, String base) { + this.id = UUID.fromString((String) tuple.get(0).get(base.isEmpty() ? base + "." + "id" : "id")); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetService.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetService.java index 25b4ef807..401c13cf4 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetService.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetService.java @@ -3,10 +3,9 @@ package eu.eudat.data.entities; import eu.eudat.queryable.queryableentity.DataEntity; import org.hibernate.annotations.GenericGenerator; -import org.hibernate.annotations.Type; import javax.persistence.*; -import java.io.Serializable; +import java.util.List; import java.util.UUID; @@ -14,77 +13,84 @@ import java.util.UUID; @Table(name = "\"DatasetService\"") public class DatasetService implements DataEntity { - @Id - @GeneratedValue - @GenericGenerator(name = "uuid2", strategy = "uuid2") - @Column(name = "\"ID\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") - private UUID id; + @Id + @GeneratedValue + @GenericGenerator(name = "uuid2", strategy = "uuid2") + @Column(name = "\"ID\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") + private UUID id; - @ManyToOne - @JoinColumn(name = "\"Dataset\"", nullable = false) - private Dataset dataset; + @ManyToOne + @JoinColumn(name = "\"Dataset\"", nullable = false) + private Dataset dataset; - @ManyToOne - @JoinColumn(name = "\"Service\"", nullable = false) - private Service service; + @ManyToOne + @JoinColumn(name = "\"Service\"", nullable = false) + private Service service; - @Column(name = "\"Role\"") - private Integer role; + @Column(name = "\"Role\"") + private Integer role; - @Column(name = "\"Data\"") - private String data; + @Column(name = "\"Data\"") + private String data; - public UUID getId() { - return id; - } + public UUID getId() { + return id; + } - public void setId(UUID id) { - this.id = id; - } + public void setId(UUID id) { + this.id = id; + } - public Dataset getDataset() { - return dataset; - } + public Dataset getDataset() { + return dataset; + } - public void setDataset(Dataset dataset) { - this.dataset = dataset; - } + public void setDataset(Dataset dataset) { + this.dataset = dataset; + } - public Service getService() { - return service; - } + public Service getService() { + return service; + } - public void setService(Service service) { - this.service = service; - } + public void setService(Service service) { + this.service = service; + } - public Integer getRole() { - return role; - } + public Integer getRole() { + return role; + } - public void setRole(Integer role) { - this.role = role; - } + public void setRole(Integer role) { + this.role = role; + } - public String getData() { - return data; - } + public String getData() { + return data; + } - public void setData(String data) { - this.data = data; - } + public void setData(String data) { + this.data = data; + } - @Override - public void update(DatasetService entity) { - this.dataset = entity.getDataset(); - this.service = entity.getService(); - this.role = entity.getRole(); - } + @Override + public void update(DatasetService entity) { + this.dataset = entity.getDataset(); + this.service = entity.getService(); + this.role = entity.getRole(); + } - @Override - public UUID getKeys() { - return this.id; - } + @Override + public UUID getKeys() { + return this.id; + } + + @Override + public DatasetService buildFromTuple(List tuple, List fields, String base) { + String currentBase = base.isEmpty() ? "" : base + "."; + if(fields.contains(currentBase + "id")) this.id = UUID.fromString((String) tuple.get(0).get(currentBase + "id")); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/ExternalDataset.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/ExternalDataset.java index c81253944..51d5e474e 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/ExternalDataset.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/ExternalDataset.java @@ -1,10 +1,13 @@ package eu.eudat.data.entities; +import eu.eudat.data.converters.DateToUTCConverter; +import eu.eudat.data.entities.helpers.EntityBinder; import eu.eudat.queryable.queryableentity.DataEntity; import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; import java.util.Date; +import java.util.List; import java.util.Set; import java.util.UUID; @@ -14,8 +17,6 @@ import java.util.UUID; public class ExternalDataset implements DataEntity { @Id - @GeneratedValue - @GenericGenerator(name = "uuid2", strategy = "uuid2") @Column(name = "\"Id\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") private UUID id; @@ -29,9 +30,11 @@ public class ExternalDataset implements DataEntity { private String reference; @Column(name = "\"Created\"", nullable = false) + @Convert(converter = DateToUTCConverter.class) private Date created; @Column(name = "\"Modified\"", nullable = false) + @Convert(converter = DateToUTCConverter.class) private Date modified; @OneToMany(mappedBy = "externalDataset", cascade = CascadeType.ALL, orphanRemoval = true) @@ -104,4 +107,11 @@ public class ExternalDataset implements DataEntity { public UUID getKeys() { return this.id; } + + @Override + public ExternalDataset buildFromTuple(List tuple, List fields, String base) { + String currentBase = base.isEmpty() ? "" : base + "."; + if (fields.contains(currentBase + "id")) this.id = EntityBinder.fromTuple(tuple, currentBase + "id"); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Funder.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Funder.java new file mode 100644 index 000000000..2b6bce8b1 --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Funder.java @@ -0,0 +1,174 @@ +package eu.eudat.data.entities; + +import eu.eudat.queryable.queryableentity.DataEntity; +import org.hibernate.annotations.GenericGenerator; +import org.hibernate.annotations.Type; + +import javax.persistence.*; +import java.util.Date; +import java.util.List; +import java.util.UUID; + +@Entity +@Table(name = "\"Funder\"") +public class Funder implements DataEntity { + + public enum Status { + ACTIVE((short) 1), INACTIVE((short) 0), DELETED((short) 99); + + private short value; + + Status(short value) { + this.value = value; + } + + public short getValue() { + return value; + } + + public static Status fromInteger(int value) { + switch (value) { + case 0: + return INACTIVE; + case 1: + return ACTIVE; + case 99: + return DELETED; + default: + throw new RuntimeException("Unsupported Funder Status"); + } + } + } + + public enum FunderType { + EXTERNAL(0), INTERNAL(1); + + private Integer value; + + FunderType(Integer value) { + this.value = value; + } + + public Integer getValue() { + return value; + } + + public static FunderType fromInteger(int value) { + switch (value) { + case 0: + return EXTERNAL; + case 1: + return INTERNAL; + default: + throw new RuntimeException("Unsupported Grant Type"); + } + } + } + + @Id + @GeneratedValue + @GenericGenerator(name = "uuid2", strategy = "uuid2") + @Column(name = "\"ID\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") + private UUID id; + + @Column(name = "\"Label\"") + private String label; + + @Type(type = "eu.eudat.configurations.typedefinition.XMLType") + @Column(name = "\"Reference\"", columnDefinition = "xml", nullable = true) + private String reference; + + @Type(type = "eu.eudat.configurations.typedefinition.XMLType") + @Column(name = "\"Definition\"", columnDefinition = "xml", nullable = true) + private String definition; + + @Column(name = "\"Status\"", nullable = false) + private Short status; + + @Column(name = "\"Created\"") + private Date created = null; + + @Column(name = "\"Modified\"") + private Date modified = new Date(); + + @Column(name = "\"Type\"") + private Integer type; + + + public UUID getId() { + return id; + } + public void setId(UUID id) { + this.id = id; + } + + public String getLabel() { + return label; + } + public void setLabel(String label) { + this.label = label; + } + + public String getReference() { + return reference; + } + public void setReference(String reference) { + this.reference = reference; + } + + public String getDefinition() { + return definition; + } + public void setDefinition(String definition) { + this.definition = definition; + } + + public Short getStatus() { + return status; + } + public void setStatus(Short status) { + this.status = status; + } + + public Date getCreated() { + return created; + } + public void setCreated(Date created) { + this.created = created; + } + + public Date getModified() { + return modified; + } + public void setModified(Date modified) { + this.modified = modified; + } + + public Integer getType() { + return type; + } + public void setType(Integer type) { + this.type = type; + } + + @Override + public void update(Funder entity) { + this.label = entity.getLabel(); + this.reference = entity.getReference(); + this.definition = entity.getDefinition(); + this.status = entity.getStatus(); + this.created = entity.getCreated(); + this.modified = new Date(); + this.type = entity.getType(); + } + + @Override + public UUID getKeys() { + return this.id; + } + + @Override + public Funder buildFromTuple(List tuple, List fields, String base) { + return null; + } +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Grant.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Grant.java new file mode 100644 index 000000000..a7dbfc926 --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Grant.java @@ -0,0 +1,301 @@ +package eu.eudat.data.entities; + + +import eu.eudat.data.converters.DateToUTCConverter; +import eu.eudat.data.entities.helpers.EntityBinder; +import eu.eudat.queryable.queryableentity.DataEntity; +import org.hibernate.annotations.GenericGenerator; +import org.hibernate.annotations.Type; + +import javax.persistence.*; +import java.util.*; +import java.util.stream.Collectors; + + +@Entity +@Table(name = "\"Grant\"") +@NamedEntityGraphs({ + @NamedEntityGraph( + name = "grantRecentActivity", + attributeNodes = {@NamedAttributeNode(value = "dmps", subgraph = "dmps")}, + subgraphs = @NamedSubgraph(name = "dmps", attributeNodes = {@NamedAttributeNode("users")}) + ), + @NamedEntityGraph( + name = "grantListingItem", + attributeNodes = {@NamedAttributeNode(value = "dmps", subgraph = "dmps"), @NamedAttributeNode(value = "content")}, + subgraphs = @NamedSubgraph(name = "dmps", attributeNodes = {@NamedAttributeNode("creator"), @NamedAttributeNode("grant"), @NamedAttributeNode("users")}) + ) +}) +public class Grant implements DataEntity { + + public enum Status { + ACTIVE((short) 1), INACTIVE((short) 0), DELETED((short) 99); + + private short value; + + private Status(short value) { + this.value = value; + } + + public short getValue() { + return value; + } + + public static Status fromInteger(int value) { + switch (value) { + case 0: + return INACTIVE; + case 1: + return ACTIVE; + case 99: + return DELETED; + default: + throw new RuntimeException("Unsupported Grant Status"); + } + } + } + + public enum GrantType { + EXTERNAL(0), INTERNAL(1); + + private Integer value; + + private GrantType(Integer value) { + this.value = value; + } + + public Integer getValue() { + return value; + } + + public static GrantType fromInteger(int value) { + switch (value) { + case 0: + return EXTERNAL; + case 1: + return INTERNAL; + default: + throw new RuntimeException("Unsupported Grant Type"); + } + } + } + + @Id + @GeneratedValue + @GenericGenerator(name = "uuid2", strategy = "uuid2") + @Column(name = "\"ID\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") + private UUID id; + + + @OneToMany(mappedBy = "grant") + private Set dmps; + + @Column(name = "\"Label\"") + private String label; + + @Column(name = "\"Abbreviation\"") + private String abbreviation; + + @Column(name = "\"Reference\"", columnDefinition = "xml", nullable = true) + private String reference; + + @Column(name = "\"Uri\"") + private String uri; + + @Type(type = "eu.eudat.configurations.typedefinition.XMLType") + @Column(name = "\"Definition\"", columnDefinition = "xml", nullable = true) + private String definition; + + @Column(name = "\"StartDate\"", nullable = false) + @Convert(converter = DateToUTCConverter.class) + private Date startdate = null; + + @Column(name = "\"EndDate\"", nullable = false) + @Convert(converter = DateToUTCConverter.class) + private Date enddate = null; + + @Column(name = "\"Status\"", nullable = false) + private Short status; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "\"CreationUser\"", nullable = true) + private UserInfo creationUser; + + @Column(name = "\"Created\"") + private Date created = null; + + @Column(name = "\"Modified\"") + private Date modified = new Date(); + + @Column(name = "\"Description\"") + private String description; + + @Column(name = "\"Type\"") + private Integer type; + + @OneToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "\"Content\"") + private Content content; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "\"Funder\"") + private Funder funder; + + public Grant() { + } + + public Grant(Grant grant) { + this.id = grant.getId(); + } + + public String getDescription() { + return description; + } + public void setDescription(String description) { + this.description = description; + } + + public Short getStatus() { + return status; + } + public void setStatus(Short status) { + this.status = status; + } + + public Date getCreated() { + return created; + } + public void setCreated(Date created) { + this.created = created; + } + + public Date getModified() { + return modified; + } + public void setModified(Date modified) { + this.modified = modified; + } + + public Date getStartdate() { + return startdate; + } + public void setStartdate(Date startdate) { + this.startdate = startdate; + } + + public Date getEnddate() { + return enddate; + } + public void setEnddate(Date enddate) { + this.enddate = enddate; + } + + public UUID getId() { + return id; + } + public void setId(UUID id) { + this.id = id; + } + + public String getLabel() { + return label; + } + public void setLabel(String label) { + this.label = label; + } + + public String getAbbreviation() { + return abbreviation; + } + public void setAbbreviation(String abbreviation) { + this.abbreviation = abbreviation; + } + + public String getReference() { + return reference; + } + public void setReference(String reference) { + this.reference = reference; + } + + public String getUri() { + return uri; + } + public void setUri(String uri) { + this.uri = uri; + } + + public String getDefinition() { + return definition; + } + public void setDefinition(String definition) { + this.definition = definition; + } + + public Set getDmps() { + return dmps; + } + public void setDmps(Set dmps) { + this.dmps = dmps; + } + + public UserInfo getCreationUser() { + return creationUser; + } + public void setCreationUser(UserInfo creationUser) { + this.creationUser = creationUser; + } + + public Integer getType() { + return type; + } + public void setType(Integer type) { + this.type = type; + } + + public Content getContent() { + return content; + } + public void setContent(Content content) { + this.content = content; + } + + public Funder getFunder() { + return funder; + } + public void setFunder(Funder funder) { + this.funder = funder; + } + + @Override + public void update(Grant entity) { + this.description = entity.getDescription(); + this.label = entity.getLabel(); + this.abbreviation = entity.getAbbreviation(); + this.created = entity.getCreated(); + this.definition = entity.getDefinition(); + this.dmps = entity.getDmps(); + this.startdate = entity.getStartdate(); + this.enddate = entity.getEnddate(); + this.modified = new Date(); + this.uri = entity.getUri(); + this.funder = entity.getFunder(); + if (entity.getContent() != null) this.content = entity.getContent(); + } + + @Override + public UUID getKeys() { + return this.id; + } + + @Override + public Grant buildFromTuple(List tuple, List fields, String base) { + String currentBase = base.isEmpty() ? "" : base + "."; + if (fields.contains(currentBase + "id")) this.id = EntityBinder.fromTuple(tuple, currentBase + "id"); + if (fields.contains(currentBase + "dmps")) + this.dmps = tuple.stream().map(x -> new DMP().buildFromTuple(Arrays.asList(x), fields, currentBase + "dmps")).collect(Collectors.toSet()); + if (fields.contains(currentBase + "creationUser")) + this.creationUser = tuple.stream().map(x -> new UserInfo().buildFromTuple(Arrays.asList(x), fields, currentBase + "creationUser")).collect(Collectors.toList()).get(0); + return this; + } +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Invitation.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Invitation.java index 852bfd41f..10ffc769b 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Invitation.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Invitation.java @@ -1,107 +1,116 @@ package eu.eudat.data.entities; +import eu.eudat.data.entities.helpers.EntityBinder; import eu.eudat.queryable.queryableentity.DataEntity; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Type; import javax.persistence.*; +import java.util.List; import java.util.UUID; @Entity @Table(name = "\"Invitation\"") -public class Invitation implements DataEntity { +public class Invitation implements DataEntity { - @Id - @GeneratedValue - @GenericGenerator(name = "uuid2", strategy = "uuid2") - @Column(name = "\"Id\"", updatable = false, nullable = false) - private UUID id; + @Id + @GeneratedValue + @GenericGenerator(name = "uuid2", strategy = "uuid2") + @Column(name = "\"Id\"", updatable = false, nullable = false) + private UUID id; - @Column(name = "\"InvitationEmail\"", nullable = false) - private String invitationEmail; + @Column(name = "\"InvitationEmail\"", nullable = false) + private String invitationEmail; - @OneToOne(fetch = FetchType.EAGER) - @JoinColumn(name = "\"CreationUser\"", nullable = false) - private UserInfo user; + @OneToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "\"CreationUser\"", nullable = false) + private UserInfo user; - @OneToOne(fetch = FetchType.EAGER) - @JoinColumn(name = "\"Dmp\"", nullable = false) - private DMP dmp; + @OneToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "\"Dmp\"", nullable = false) + private DMP dmp; - @Column(name = "\"Token\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") - private UUID token; + @Column(name = "\"Token\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") + private UUID token; - @Column(name = "\"AcceptedInvitation\"", nullable = false) - private boolean acceptedInvitation; + @Column(name = "\"AcceptedInvitation\"", nullable = false) + private boolean acceptedInvitation; - @Type(type = "eu.eudat.configurations.typedefinition.XMLType") - @Column(name = "\"Properties\"", columnDefinition = "xml", nullable = true) - private String properties; + @Type(type = "eu.eudat.configurations.typedefinition.XMLType") + @Column(name = "\"Properties\"", columnDefinition = "xml", nullable = true) + private String properties; - public UUID getId() { - return id; - } + public UUID getId() { + return id; + } - public void setId(UUID id) { - this.id = id; - } + public void setId(UUID id) { + this.id = id; + } - public String getInvitationEmail() { - return invitationEmail; - } + public String getInvitationEmail() { + return invitationEmail; + } - public void setInvitationEmail(String invitationEmail) { - this.invitationEmail = invitationEmail; - } + public void setInvitationEmail(String invitationEmail) { + this.invitationEmail = invitationEmail; + } - public UserInfo getUser() { - return user; - } + public UserInfo getUser() { + return user; + } - public void setUser(UserInfo user) { - this.user = user; - } + public void setUser(UserInfo user) { + this.user = user; + } - public DMP getDmp() { - return dmp; - } + public DMP getDmp() { + return dmp; + } - public void setDmp(DMP dmp) { - this.dmp = dmp; - } + public void setDmp(DMP dmp) { + this.dmp = dmp; + } - public UUID getToken() { - return token; - } + public UUID getToken() { + return token; + } - public void setToken(UUID token) { - this.token = token; - } + public void setToken(UUID token) { + this.token = token; + } - public String getProperties() { - return properties; - } + public String getProperties() { + return properties; + } - public void setProperties(String properties) { - this.properties = properties; - } + public void setProperties(String properties) { + this.properties = properties; + } - public boolean getAcceptedInvitation() { - return acceptedInvitation; - } + public boolean getAcceptedInvitation() { + return acceptedInvitation; + } - public void setAcceptedInvitation(boolean acceptedInvitation) { - this.acceptedInvitation = acceptedInvitation; - } + public void setAcceptedInvitation(boolean acceptedInvitation) { + this.acceptedInvitation = acceptedInvitation; + } - @Override - public void update(Invitation entity) { + @Override + public void update(Invitation entity) { - } + } - @Override - public UUID getKeys() { - return this.id; - } + @Override + public UUID getKeys() { + return this.id; + } + + @Override + public Invitation buildFromTuple(List tuple, List fields, String base) { + String currentBase = base.isEmpty() ? "" : base + "."; + if (fields.contains(currentBase + "id")) this.id = EntityBinder.fromTuple(tuple, currentBase + "id"); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/LoginConfirmationEmail.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/LoginConfirmationEmail.java new file mode 100644 index 000000000..2bc9f53c8 --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/LoginConfirmationEmail.java @@ -0,0 +1,94 @@ +package eu.eudat.data.entities; + +import eu.eudat.data.converters.DateToUTCConverter; +import eu.eudat.queryable.queryableentity.DataEntity; +import org.hibernate.annotations.GenericGenerator; + +import javax.persistence.*; +import java.util.Date; +import java.util.List; +import java.util.UUID; + +@Entity +@Table(name = "\"LoginConfirmationEmail\"") +public class LoginConfirmationEmail implements DataEntity { + + @Id + @GeneratedValue + @GenericGenerator(name = "uuid2", strategy = "uuid2") + @Column(name = "\"ID\"", updatable = false, nullable = false) + private UUID id; + + @Column(name = "\"email\"", nullable = false) + private String email; + + @Column(name = "\"isConfirmed\"", nullable = false) + private boolean isConfirmed; + + @Column(name = "\"token\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") + private UUID token; + + @Column(name = "\"userId\"", nullable = false) + private UUID userId; + + @Column(name = "\"expiresAt\"", nullable = false) + @Convert(converter = DateToUTCConverter.class) + private Date expiresAt; + + public UUID getId() { + return id; + } + public void setId(UUID id) { + this.id = id; + } + + public String getEmail() { + return email; + } + public void setEmail(String email) { + this.email = email; + } + + public boolean getIsConfirmed() { + return isConfirmed; + } + public void setIsConfirmed(boolean confirmed) { + isConfirmed = confirmed; + } + + public UUID getToken() { + return token; + } + public void setToken(UUID token) { + this.token = token; + } + + public UUID getUserId() { + return userId; + } + public void setUserId(UUID userId) { + this.userId = userId; + } + + public Date getExpiresAt() { + return expiresAt; + } + public void setExpiresAt(Date expiresAt) { + this.expiresAt = expiresAt; + } + + + @Override + public void update(LoginConfirmationEmail entity) { + } + + @Override + public UUID getKeys() { + return null; + } + + @Override + public LoginConfirmationEmail buildFromTuple(List tuple, List fields, String base) { + return null; + } +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Organisation.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Organisation.java index f74b3bb32..94a8c8f33 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Organisation.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Organisation.java @@ -1,6 +1,7 @@ package eu.eudat.data.entities; - +import eu.eudat.data.converters.DateToUTCConverter; +import eu.eudat.data.entities.helpers.EntityBinder; import eu.eudat.queryable.queryableentity.DataEntity; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Type; @@ -8,12 +9,18 @@ import org.hibernate.annotations.Type; import javax.persistence.*; import java.io.Serializable; import java.util.Date; +import java.util.List; import java.util.Set; import java.util.UUID; - @Entity @Table(name = "\"Organisation\"") +@NamedEntityGraphs({ + @NamedEntityGraph( + name = "organisationRecentActivity", + attributeNodes = {@NamedAttributeNode(value = "dmps")} + ) +}) public class Organisation implements Serializable, DataEntity { @Id @@ -39,60 +46,49 @@ public class Organisation implements Serializable, DataEntity @Column(name = "\"Definition\"", columnDefinition = "xml", nullable = true) private String definition; - @OneToMany(fetch = FetchType.LAZY) @JoinTable(name = "\"DMPOrganisation\"", joinColumns = {@JoinColumn(name = "\"Organisation\"", referencedColumnName = "\"ID\"")}, inverseJoinColumns = {@JoinColumn(name = "\"DMP\"", referencedColumnName = "\"ID\"")} ) - private Set dMPs; - + private Set dmps; @Column(name = "\"Status\"", nullable = false) private Short status; - @Column(name = "\"Created\"") + @Convert(converter = DateToUTCConverter.class) private Date created = null; @Column(name = "\"Modified\"") + @Convert(converter = DateToUTCConverter.class) private Date modified = new Date(); public Short getStatus() { return status; } - - public void setStatus(Short status) { this.status = status; } - public Date getCreated() { return created; } - - public void setCreated(Date created) { this.created = created; } - public Date getModified() { return modified; } - - public void setModified(Date modified) { this.modified = modified; } - public UUID getId() { return id; } - public void setId(UUID id) { this.id = id; } @@ -100,7 +96,6 @@ public class Organisation implements Serializable, DataEntity public String getLabel() { return label; } - public void setLabel(String label) { this.label = label; } @@ -108,7 +103,6 @@ public class Organisation implements Serializable, DataEntity public String getAbbreviation() { return abbreviation; } - public void setAbbreviation(String abbreviation) { this.abbreviation = abbreviation; } @@ -116,7 +110,6 @@ public class Organisation implements Serializable, DataEntity public String getReference() { return reference; } - public void setReference(String reference) { this.reference = reference; } @@ -124,7 +117,6 @@ public class Organisation implements Serializable, DataEntity public String getUri() { return uri; } - public void setUri(String uri) { this.uri = uri; } @@ -132,20 +124,17 @@ public class Organisation implements Serializable, DataEntity public String getDefinition() { return definition; } - public void setDefinition(String definition) { this.definition = definition; } - public Set getdMPs() { - return dMPs; + public Set getDmps() { + return dmps; } - - public void setdMPs(Set dMPs) { - this.dMPs = dMPs; + public void setDmps(Set dmps) { + this.dmps = dmps; } - @Override public void update(Organisation entity) { @@ -155,4 +144,11 @@ public class Organisation implements Serializable, DataEntity public UUID getKeys() { return this.id; } + + @Override + public Organisation buildFromTuple(List tuple,List fields, String base) { + String currentBase = base.isEmpty() ? "" : base + "."; + if (fields.contains(currentBase + "id")) this.id = EntityBinder.fromTuple(tuple, currentBase + "id"); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Project.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Project.java index 5a8e2dc7f..44a5c8804 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Project.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Project.java @@ -1,295 +1,291 @@ package eu.eudat.data.entities; - +import eu.eudat.data.converters.DateToUTCConverter; +import eu.eudat.data.entities.helpers.EntityBinder; import eu.eudat.queryable.queryableentity.DataEntity; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Type; import javax.persistence.*; -import java.util.Date; -import java.util.Set; -import java.util.UUID; - +import java.util.*; +import java.util.stream.Collectors; @Entity @Table(name = "\"Project\"") -@NamedEntityGraphs({ - @NamedEntityGraph( - name = "projectRecentActivity", - attributeNodes = {@NamedAttributeNode(value = "dmps", subgraph = "dmps")}, - subgraphs = @NamedSubgraph(name = "dmps", attributeNodes = {@NamedAttributeNode("users")}) - ), - @NamedEntityGraph( - name = "projectListingItem", - attributeNodes = {@NamedAttributeNode(value = "dmps", subgraph = "dmps"), @NamedAttributeNode(value = "content")}, - subgraphs = @NamedSubgraph(name = "dmps", attributeNodes = {@NamedAttributeNode("creator"), @NamedAttributeNode("users")}) - ) -}) public class Project implements DataEntity { - public enum Status { - ACTIVE((short) 1), INACTIVE((short) 0), DELETED((short) 99); + public enum Status { + ACTIVE((short) 1), INACTIVE((short) 0), DELETED((short) 99); + + private short value; + + Status(short value) { + this.value = value; + } + + public short getValue() { + return value; + } - private short value; - - private Status(short value) { - this.value = value; - } - - public short getValue() { - return value; - } - - public static Status fromInteger(int value) { - switch (value) { - case 0: - return INACTIVE; - case 1: - return ACTIVE; - case 99: - return DELETED; - default: - throw new RuntimeException("Unsupported Project Status"); - } - } - } - - public enum ProjectType { - EXTERNAL(0), INTERNAL(1); - - private Integer value; - - private ProjectType(Integer value) { - this.value = value; - } - - public Integer getValue() { - return value; - } - - public static ProjectType fromInteger(int value) { - switch (value) { - case 0: - return EXTERNAL; - case 1: - return INTERNAL; - default: - throw new RuntimeException("Unsupported Project Type"); - } - } - } - - @Id - @GeneratedValue - @GenericGenerator(name = "uuid2", strategy = "uuid2") - @Column(name = "\"ID\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") - private UUID id; - - - @OneToMany(mappedBy = "project") - private Set dmps; - - - @Column(name = "\"Label\"") - private String label; - - @Column(name = "\"Abbreviation\"") - private String abbreviation; - - @Type(type = "eu.eudat.configurations.typedefinition.XMLType") - @Column(name = "\"Reference\"", columnDefinition = "xml", nullable = true) - private String reference; - - @Column(name = "\"Uri\"") - private String uri; - - @Type(type = "eu.eudat.configurations.typedefinition.XMLType") - @Column(name = "\"Definition\"", columnDefinition = "xml", nullable = true) - private String definition; - - - @Column(name = "\"StartDate\"", nullable = false) - private Date startdate = null; - - @Column(name = "\"EndDate\"", nullable = false) - private Date enddate = null; - - - @Column(name = "\"Status\"", nullable = false) - private Short status; - - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "\"CreationUser\"", nullable = true) - private UserInfo creationUser; - - - @Column(name = "\"Created\"") - private Date created = null; - - @Column(name = "\"Modified\"") - private Date modified = new Date(); - - @Column(name = "\"Description\"") - private String description; - - @Column(name = "\"Type\"") - private Integer type; - - @OneToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "\"Content\"") - private Content content; - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - - public Short getStatus() { - return status; - } - - - public void setStatus(Short status) { - this.status = status; - } - - - public Date getCreated() { - return created; - } - - - public void setCreated(Date created) { - this.created = created; - } - - - public Date getModified() { - return modified; - } - - public void setModified(Date modified) { - this.modified = modified; - } - - public Date getStartdate() { - return startdate; - } - - public void setStartdate(Date startdate) { - this.startdate = startdate; - } - - public Date getEnddate() { - return enddate; - } - - public void setEnddate(Date enddate) { - this.enddate = enddate; - } - - public UUID getId() { - return id; - } - - public void setId(UUID id) { - this.id = id; - } - - public String getLabel() { - return label; - } - - public void setLabel(String label) { - this.label = label; - } - - public String getAbbreviation() { - return abbreviation; - } - - public void setAbbreviation(String abbreviation) { - this.abbreviation = abbreviation; - } - - public String getReference() { - return reference; - } - - public void setReference(String reference) { - this.reference = reference; - } - - public String getUri() { - return uri; - } - - public void setUri(String uri) { - this.uri = uri; - } - - public String getDefinition() { - return definition; - } - - public void setDefinition(String definition) { - this.definition = definition; - } - - - public Set getDmps() { - return dmps; - } - - public void setDmps(Set dmps) { - this.dmps = dmps; - } - - public UserInfo getCreationUser() { - return creationUser; - } - - public void setCreationUser(UserInfo creationUser) { - this.creationUser = creationUser; - } - - public Integer getType() { - return type; - } - - public void setType(Integer type) { - this.type = type; - } - - public Content getContent() { - return content; - } - - public void setContent(Content content) { - this.content = content; - } - - @Override - public void update(Project entity) { - this.description = entity.getDescription(); - this.label = entity.getLabel(); - this.abbreviation = entity.getAbbreviation(); - this.created = entity.getCreated(); - this.definition = entity.getDefinition(); - this.dmps = entity.getDmps(); - this.enddate = entity.getEnddate(); - this.modified = new Date(); - if (entity.getContent() != null) this.content = entity.getContent(); - //this.creationUser = entity.getCreationUser(); //TODO - } - - @Override - public UUID getKeys() { - return this.id; - } + public static Status fromInteger(int value) { + switch (value) { + case 0: + return INACTIVE; + case 1: + return ACTIVE; + case 99: + return DELETED; + default: + throw new RuntimeException("Unsupported Project Status"); + } + } + } + + public enum ProjectType { + EXTERNAL(0), INTERNAL(1); + + private Integer value; + + ProjectType(Integer value) { + this.value = value; + } + + public Integer getValue() { + return value; + } + + public static ProjectType fromInteger(int value) { + switch (value) { + case 0: + return EXTERNAL; + case 1: + return INTERNAL; + default: + throw new RuntimeException("Unsupported Project Type"); + } + } + } + + @Id + @GeneratedValue + @GenericGenerator(name = "uuid2", strategy = "uuid2") + @Column(name = "\"ID\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") + private UUID id; + + @OneToMany(mappedBy = "project") + private Set dmps; + + @Column(name = "\"Label\"") + private String label; + + @Column(name = "\"Abbreviation\"") + private String abbreviation; + + @Column(name = "\"Reference\"", columnDefinition = "xml", nullable = true) + private String reference; + + @Column(name = "\"Uri\"") + private String uri; + + @Type(type = "eu.eudat.configurations.typedefinition.XMLType") + @Column(name = "\"Definition\"", columnDefinition = "xml", nullable = true) + private String definition; + + @Column(name = "\"StartDate\"", nullable = false) + @Convert(converter = DateToUTCConverter.class) + private Date startdate = null; + + @Column(name = "\"EndDate\"", nullable = false) + @Convert(converter = DateToUTCConverter.class) + private Date enddate = null; + + @Column(name = "\"Status\"", nullable = false) + private Short status; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "\"CreationUser\"", nullable = true) + private UserInfo creationUser; + + @Column(name = "\"Created\"") + private Date created = null; + + @Column(name = "\"Modified\"") + private Date modified = new Date(); + + @Column(name = "\"Description\"") + private String description; + + @Column(name = "\"Type\"") + private Integer type; + + @OneToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "\"Content\"") + private Content content; + + public Project() { + } + + public Project(Project project) {this.id = project.getId();} + + public UUID getId() { + return id; + } + public void setId(UUID id) { + this.id = id; + } + + public Set getDmps() { + return dmps; + } + public void setDmps(Set dmps) { + this.dmps = dmps; + } + + public String getLabel() { + return label; + } + public void setLabel(String label) { + this.label = label; + } + + public String getAbbreviation() { + return abbreviation; + } + public void setAbbreviation(String abbreviation) { + this.abbreviation = abbreviation; + } + + public String getReference() { + return reference; + } + public void setReference(String reference) { + this.reference = reference; + } + + public String getUri() { + return uri; + } + public void setUri(String uri) { + this.uri = uri; + } + + public String getDefinition() { + return definition; + } + public void setDefinition(String definition) { + this.definition = definition; + } + + public Date getStartdate() { + return startdate; + } + public void setStartdate(Date startdate) { + this.startdate = startdate; + } + + public Date getEnddate() { + return enddate; + } + public void setEnddate(Date enddate) { + this.enddate = enddate; + } + + public Short getStatus() { + return status; + } + public void setStatus(Short status) { + this.status = status; + } + + public UserInfo getCreationUser() { + return creationUser; + } + public void setCreationUser(UserInfo creationUser) { + this.creationUser = creationUser; + } + + public Date getCreated() { + return created; + } + public void setCreated(Date created) { + this.created = created; + } + + public Date getModified() { + return modified; + } + public void setModified(Date modified) { + this.modified = modified; + } + + public String getDescription() { + return description; + } + public void setDescription(String description) { + this.description = description; + } + + public Integer getType() { + return type; + } + public void setType(Integer type) { + this.type = type; + } + + public Content getContent() { + return content; + } + public void setContent(Content content) { + this.content = content; + } + + @Override + public void update(Project entity) { + this.description = entity.getDescription(); + this.label = entity.getLabel(); + this.abbreviation = entity.getAbbreviation(); + this.created = entity.getCreated(); + this.definition = entity.getDefinition(); + this.dmps = entity.getDmps(); + this.startdate = entity.getStartdate(); + this.enddate = entity.getEnddate(); + this.modified = new Date(); + this.uri = entity.getUri(); + if (entity.getContent() != null) this.content = entity.getContent(); + } + + public Project projectFromGrant(Grant grant) { + Project project = new Project(); + project.setDescription(grant.getDescription()); + project.setLabel(grant.getLabel()); + project.setAbbreviation(grant.getAbbreviation()); + project.setCreated(new Date()); + project.setDefinition(grant.getDefinition()); + project.setDmps(grant.getDmps()); + project.setStartdate(grant.getStartdate()); + project.setEnddate(grant.getEnddate()); + project.setModified(new Date()); + project.setUri(grant.getUri()); + project.setContent(grant.getContent()); + project.setReference(grant.getReference()); + project.setStatus(grant.getStatus()); + + return project; + } + + @Override + public UUID getKeys() { + return this.id; + } + + @Override + public Project buildFromTuple(List tuple, List fields, String base) { + String currentBase = base.isEmpty() ? "" : base + "."; + if (fields.contains(currentBase + "id")) this.id = EntityBinder.fromTuple(tuple, currentBase + "id"); + if (fields.contains(currentBase + "dmps")) + this.dmps = tuple.stream().map(x -> new DMP().buildFromTuple(Arrays.asList(x), fields, currentBase + "dmps")).collect(Collectors.toSet()); + if (fields.contains(currentBase + "creationUser")) + this.creationUser = tuple.stream().map(x -> new UserInfo().buildFromTuple(Arrays.asList(x), fields, currentBase + "creationUser")).collect(Collectors.toList()).get(0); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Registry.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Registry.java index 49d2420b5..dafef8ad0 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Registry.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Registry.java @@ -1,156 +1,165 @@ package eu.eudat.data.entities; +import eu.eudat.data.converters.DateToUTCConverter; +import eu.eudat.data.entities.helpers.EntityBinder; import eu.eudat.queryable.queryableentity.DataEntity; -import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Type; import javax.persistence.*; import java.util.Date; +import java.util.List; import java.util.Set; import java.util.UUID; @Entity @Table(name = "\"Registry\"") -public class Registry implements DataEntity { +public class Registry implements DataEntity { - @Id - @GeneratedValue - @GenericGenerator(name = "uuid2", strategy = "uuid2") - @Column(name = "\"ID\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") - private UUID id; + @Id + @Column(name = "\"ID\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") + private UUID id; - @Column(name = "\"Label\"") - private String label; + @Column(name = "\"Label\"") + private String label; - @Column(name = "\"Abbreviation\"") - private String abbreviation; + @Column(name = "\"Abbreviation\"") + private String abbreviation; - @Column(name = "\"Reference\"", nullable = true) - private String reference; + @Column(name = "\"Reference\"", nullable = true) + private String reference; - @Column(name = "\"Uri\"") - private String uri; + @Column(name = "\"Uri\"") + private String uri; - @Type(type = "eu.eudat.configurations.typedefinition.XMLType") - @Column(name = "\"Definition\"", columnDefinition = "xml", nullable = true) - private String definition; + @Type(type = "eu.eudat.configurations.typedefinition.XMLType") + @Column(name = "\"Definition\"", columnDefinition = "xml", nullable = true) + private String definition; - @OneToMany(fetch = FetchType.LAZY) - @JoinTable(name = "\"DatasetRegistry\"", - joinColumns = {@JoinColumn(name = "\"Registry\"", referencedColumnName = "\"ID\"")}, - inverseJoinColumns = {@JoinColumn(name = "\"Dataset\"", referencedColumnName = "\"ID\"")} - ) - private Set datasets; + @OneToMany(fetch = FetchType.LAZY) + @JoinTable(name = "\"DatasetRegistry\"", + joinColumns = {@JoinColumn(name = "\"Registry\"", referencedColumnName = "\"ID\"")}, + inverseJoinColumns = {@JoinColumn(name = "\"Dataset\"", referencedColumnName = "\"ID\"")} + ) + private Set datasets; - @Column(name = "\"Status\"", nullable = false) - private Short status; + @Column(name = "\"Status\"", nullable = false) + private Short status; - @Column(name = "\"Created\"") - private Date created = null; + @Column(name = "\"Created\"") + @Convert(converter = DateToUTCConverter.class) + private Date created = null; - @Column(name = "\"Modified\"") - private Date modified = new Date(); + @Column(name = "\"Modified\"") + @Convert(converter = DateToUTCConverter.class) + private Date modified = new Date(); - public Short getStatus() { - return status; - } + public Short getStatus() { + return status; + } - public void setStatus(Short status) { - this.status = status; - } + public void setStatus(Short status) { + this.status = status; + } - public Date getCreated() { - return created; - } + public Date getCreated() { + return created; + } - public void setCreated(Date created) { - this.created = created; - } + public void setCreated(Date created) { + this.created = created; + } - public Date getModified() { - return modified; - } + public Date getModified() { + return modified; + } - public void setModified(Date modified) { - this.modified = modified; - } + public void setModified(Date modified) { + this.modified = modified; + } - public UUID getId() { - return id; - } + public UUID getId() { + return id; + } - public void setId(UUID id) { - this.id = id; - } + public void setId(UUID id) { + this.id = id; + } - public String getLabel() { - return label; - } + public String getLabel() { + return label; + } - public void setLabel(String label) { - this.label = label; - } + public void setLabel(String label) { + this.label = label; + } - public String getAbbreviation() { - return abbreviation; - } + public String getAbbreviation() { + return abbreviation; + } - public void setAbbreviation(String abbreviation) { - this.abbreviation = abbreviation; - } + public void setAbbreviation(String abbreviation) { + this.abbreviation = abbreviation; + } - public String getReference() { - return reference; - } + public String getReference() { + return reference; + } - public void setReference(String reference) { - this.reference = reference; - } + public void setReference(String reference) { + this.reference = reference; + } - public String getUri() { - return uri; - } + public String getUri() { + return uri; + } - public void setUri(String uri) { - this.uri = uri; - } + public void setUri(String uri) { + this.uri = uri; + } - public String getDefinition() { - return definition; - } + public String getDefinition() { + return definition; + } - public void setDefinition(String definition) { - this.definition = definition; - } + public void setDefinition(String definition) { + this.definition = definition; + } - public Set getDatasets() { - return datasets; - } + public Set getDatasets() { + return datasets; + } - public void setDatasets(Set datasets) { - this.datasets = datasets; - } + public void setDatasets(Set datasets) { + this.datasets = datasets; + } - @Override - public void update(Registry entity) { + @Override + public void update(Registry entity) { - } + } - @Override - public UUID getKeys() { - return this.id; - } + @Override + public UUID getKeys() { + return this.id; + } + + @Override + public Registry buildFromTuple(List tuple, List fields, String base) { + String currentBase = base.isEmpty() ? "" : base + "."; + if (fields.contains(currentBase + "id")) this.id = EntityBinder.fromTuple(tuple, currentBase + "id"); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Researcher.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Researcher.java index 186467101..3066d914a 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Researcher.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Researcher.java @@ -1,157 +1,169 @@ package eu.eudat.data.entities; +import eu.eudat.data.converters.DateToUTCConverter; +import eu.eudat.data.entities.helpers.EntityBinder; import eu.eudat.queryable.queryableentity.DataEntity; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Type; import javax.persistence.*; import java.util.Date; +import java.util.List; import java.util.Set; import java.util.UUID; @Entity @Table(name = "\"Researcher\"") -public class Researcher implements DataEntity { +public class Researcher implements DataEntity { - @Id - @GeneratedValue - @GenericGenerator(name = "uuid2", strategy = "uuid2") - @Column(name = "\"ID\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") - private UUID id; + @Id + @GeneratedValue + @GenericGenerator(name = "uuid2", strategy = "uuid2") + @Column(name = "\"ID\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") + private UUID id; - @Column(name = "\"Label\"") - private String label; + @Column(name = "\"Label\"") + private String label; - @Column(name = "\"Uri\"") - private String uri; + @Column(name = "\"Uri\"") + private String uri; - @Column(name = "\"PrimaryEmail\"") - private String primaryEmail; + @Column(name = "\"PrimaryEmail\"") + private String primaryEmail; - @Type(type = "eu.eudat.configurations.typedefinition.XMLType") - @Column(name = "\"Definition\"", columnDefinition = "xml", nullable = true) - private String definition; + @Type(type = "eu.eudat.configurations.typedefinition.XMLType") + @Column(name = "\"Definition\"", columnDefinition = "xml", nullable = true) + private String definition; - @Type(type = "eu.eudat.configurations.typedefinition.XMLType") - @Column(name = "\"Reference\"", columnDefinition = "xml", nullable = true) - private String reference; + @Type(type = "eu.eudat.configurations.typedefinition.XMLType") + @Column(name = "\"Reference\"", columnDefinition = "xml", nullable = true) + private String reference; - @OneToMany(fetch = FetchType.LAZY) - @JoinTable(name = "\"DMPResearcher\"", - joinColumns = {@JoinColumn(name = "\"Researcher\"", referencedColumnName = "\"ID\"")}, - inverseJoinColumns = {@JoinColumn(name = "\"DMP\"", referencedColumnName = "\"ID\"")} - ) - private Set dMPs; + @OneToMany(fetch = FetchType.LAZY) + @JoinTable(name = "\"DMPResearcher\"", + joinColumns = {@JoinColumn(name = "\"Researcher\"", referencedColumnName = "\"ID\"")}, + inverseJoinColumns = {@JoinColumn(name = "\"DMP\"", referencedColumnName = "\"ID\"")} + ) + private Set dMPs; - @Column(name = "\"Status\"", nullable = false) - private Short status; + @Column(name = "\"Status\"", nullable = false) + private Short status; - @Column(name = "\"Created\"") - private Date created = null; + @Column(name = "\"Created\"") + @Convert(converter = DateToUTCConverter.class) + private Date created = null; - @Column(name = "\"Modified\"") - private Date modified = new Date(); + @Column(name = "\"Modified\"") + @Convert(converter = DateToUTCConverter.class) + private Date modified = new Date(); - public Short getStatus() { - return status; - } + public Short getStatus() { + return status; + } - public void setStatus(Short status) { - this.status = status; - } + public void setStatus(Short status) { + this.status = status; + } - public Date getCreated() { - return created; - } + public Date getCreated() { + return created; + } - public void setCreated(Date created) { - this.created = created; - } + public void setCreated(Date created) { + this.created = created; + } - public Date getModified() { - return modified; - } + public Date getModified() { + return modified; + } - public void setModified(Date modified) { - this.modified = modified; - } + public void setModified(Date modified) { + this.modified = modified; + } - public UUID getId() { - return id; - } + public UUID getId() { + return id; + } - public void setId(UUID id) { - this.id = id; - } + public void setId(UUID id) { + this.id = id; + } - public String getLabel() { - return label; - } + public String getLabel() { + return label; + } - public void setLabel(String label) { - this.label = label; - } + public void setLabel(String label) { + this.label = label; + } - public String getPrimaryEmail() { - return primaryEmail; - } + public String getPrimaryEmail() { + return primaryEmail; + } - public void setPrimaryEmail(String primaryEmail) { - this.primaryEmail = primaryEmail; - } + public void setPrimaryEmail(String primaryEmail) { + this.primaryEmail = primaryEmail; + } - public String getReference() { - return reference; - } + public String getReference() { + return reference; + } - public void setReference(String reference) { - this.reference = reference; - } + public void setReference(String reference) { + this.reference = reference; + } - public String getUri() { - return uri; - } + public String getUri() { + return uri; + } - public void setUri(String uri) { - this.uri = uri; - } + public void setUri(String uri) { + this.uri = uri; + } - public String getDefinition() { - return definition; - } + public String getDefinition() { + return definition; + } - public void setDefinition(String definition) { - this.definition = definition; - } + public void setDefinition(String definition) { + this.definition = definition; + } - public Set getdMPs() { - return dMPs; - } + public Set getdMPs() { + return dMPs; + } - public void setdMPs(Set dMPs) { - this.dMPs = dMPs; - } + public void setdMPs(Set dMPs) { + this.dMPs = dMPs; + } - @Override - public void update(Researcher entity) { + @Override + public void update(Researcher entity) { - } + } - @Override - public UUID getKeys() { - return this.id; - } + @Override + public UUID getKeys() { + return this.id; + } + + @Override + public Researcher buildFromTuple(List tuple, List fields, String base) { + String currentBase = base.isEmpty() ? "" : base + "."; + if (fields.contains(currentBase + "id")) this.id = EntityBinder.fromTuple(tuple, currentBase + "id"); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Service.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Service.java index c9979bd68..14ca76f60 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Service.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Service.java @@ -1,12 +1,13 @@ package eu.eudat.data.entities; +import eu.eudat.data.converters.DateToUTCConverter; import eu.eudat.queryable.queryableentity.DataEntity; -import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Type; import javax.persistence.*; import java.util.Date; +import java.util.List; import java.util.Set; import java.util.UUID; @@ -15,138 +16,145 @@ import java.util.UUID; @Table(name = "\"Service\"") public class Service implements DataEntity { - @Id - @GeneratedValue - @GenericGenerator(name = "uuid2", strategy = "uuid2") - @Column(name = "\"ID\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") - private UUID id; + @Id + @Column(name = "\"ID\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") + private UUID id; - @Column(name = "\"Label\"") - private String label; + @Column(name = "\"Label\"") + private String label; - @Column(name = "\"Abbreviation\"") - private String abbreviation; + @Column(name = "\"Abbreviation\"") + private String abbreviation; - @Column(name = "\"Reference\"", nullable = true) - private String reference; + @Column(name = "\"Reference\"", nullable = true) + private String reference; - @Column(name = "\"Uri\"") - private String uri; + @Column(name = "\"Uri\"") + private String uri; - @Type(type = "eu.eudat.configurations.typedefinition.XMLType") - @Column(name = "\"Definition\"", columnDefinition = "xml", nullable = false) - private String definition; + @Type(type = "eu.eudat.configurations.typedefinition.XMLType") + @Column(name = "\"Definition\"", columnDefinition = "xml", nullable = false) + private String definition; - @OneToMany(mappedBy = "service", cascade = CascadeType.ALL, orphanRemoval = true) - private Set services; + @OneToMany(mappedBy = "service", cascade = CascadeType.ALL, orphanRemoval = true) + private Set services; - @Column(name = "\"Status\"", nullable = false) - private Short status; + @Column(name = "\"Status\"", nullable = false) + private Short status; - @Column(name = "\"Created\"") - private Date created = null; + @Column(name = "\"Created\"") + @Convert(converter = DateToUTCConverter.class) + private Date created = null; - @Column(name = "\"Modified\"") - private Date modified = new Date(); + @Column(name = "\"Modified\"") + @Convert(converter = DateToUTCConverter.class) + private Date modified = new Date(); - public Short getStatus() { - return status; - } + public Short getStatus() { + return status; + } - public void setStatus(Short status) { - this.status = status; - } + public void setStatus(Short status) { + this.status = status; + } - public Date getCreated() { - return created; - } + public Date getCreated() { + return created; + } - public void setCreated(Date created) { - this.created = created; - } + public void setCreated(Date created) { + this.created = created; + } - public Date getModified() { - return modified; - } + public Date getModified() { + return modified; + } - public void setModified(Date modified) { - this.modified = modified; - } + public void setModified(Date modified) { + this.modified = modified; + } - public UUID getId() { - return id; - } + public UUID getId() { + return id; + } - public void setId(UUID id) { - this.id = id; - } + public void setId(UUID id) { + this.id = id; + } - public String getLabel() { - return label; - } + public String getLabel() { + return label; + } - public void setLabel(String label) { - this.label = label; - } + public void setLabel(String label) { + this.label = label; + } - public String getAbbreviation() { - return abbreviation; - } + public String getAbbreviation() { + return abbreviation; + } - public void setAbbreviation(String abbreviation) { - this.abbreviation = abbreviation; - } + public void setAbbreviation(String abbreviation) { + this.abbreviation = abbreviation; + } - public String getReference() { - return reference; - } + public String getReference() { + return reference; + } - public void setReference(String reference) { - this.reference = reference; - } + public void setReference(String reference) { + this.reference = reference; + } - public String getUri() { - return uri; - } + public String getUri() { + return uri; + } - public void setUri(String uri) { - this.uri = uri; - } + public void setUri(String uri) { + this.uri = uri; + } - public String getDefinition() { - return definition; - } + public String getDefinition() { + return definition; + } - public void setDefinition(String definition) { - this.definition = definition; - } + public void setDefinition(String definition) { + this.definition = definition; + } - public Set getServices() { - return services; - } + public Set getServices() { + return services; + } - public void setServices(Set services) { - this.services = services; - } + public void setServices(Set services) { + this.services = services; + } - @Override - public void update(Service entity) { + @Override + public void update(Service entity) { - } + } - @Override - public UUID getKeys() { - return this.id; - } + @Override + public UUID getKeys() { + return this.id; + } + + @Override + public Service buildFromTuple(List tuple, List fields, String base) { + String currentBase = base.isEmpty() ? "" : base + "."; + if (fields.contains(currentBase + "id")) this.id = UUID.fromString((String) tuple.get(0).get(currentBase + "id")); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserDMP.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserDMP.java index 4b3946384..6e000136d 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserDMP.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserDMP.java @@ -1,97 +1,106 @@ package eu.eudat.data.entities; +import eu.eudat.data.entities.helpers.EntityBinder; import eu.eudat.queryable.queryableentity.DataEntity; import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; +import java.util.List; import java.util.UUID; @Entity @Table(name = "\"UserDMP\"") public class UserDMP implements DataEntity { - public enum UserDMPRoles { - OWNER(0), USER(1); + public enum UserDMPRoles { + OWNER(0), USER(1); - private Integer value; + private Integer value; - private UserDMPRoles(Integer value) { - this.value = value; - } + private UserDMPRoles(Integer value) { + this.value = value; + } - public Integer getValue() { - return value; - } + public Integer getValue() { + return value; + } - public static UserDMPRoles fromInteger(Integer value) { - switch (value) { - case 0: - return OWNER; - case 1: - return USER; - default: - throw new RuntimeException("Unsupported User Dmp Role Message Code"); - } - } - } + public static UserDMPRoles fromInteger(Integer value) { + switch (value) { + case 0: + return OWNER; + case 1: + return USER; + default: + throw new RuntimeException("Unsupported User Dmp Role Message Code"); + } + } + } - @Id - @GeneratedValue - @GenericGenerator(name = "uuid2", strategy = "uuid2") - @Column(name = "id", updatable = false, nullable = false, columnDefinition = "BINARY(16)") - private UUID id; + @Id + @GeneratedValue + @GenericGenerator(name = "uuid2", strategy = "uuid2") + @Column(name = "id", updatable = false, nullable = false, columnDefinition = "BINARY(16)") + private UUID id; - @OneToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "usr") - private UserInfo user; + @OneToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "usr") + private UserInfo user; - @OneToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "dmp") - private DMP dmp; + @OneToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "dmp") + private DMP dmp; - @Column(name = "role") - private Integer role; + @Column(name = "role") + private Integer role; - public UUID getId() { - return id; - } + public UUID getId() { + return id; + } - public void setId(UUID id) { - this.id = id; - } + public void setId(UUID id) { + this.id = id; + } - public UserInfo getUser() { - return user; - } + public UserInfo getUser() { + return user; + } - public void setUser(UserInfo user) { - this.user = user; - } + public void setUser(UserInfo user) { + this.user = user; + } - public DMP getDmp() { - return dmp; - } + public DMP getDmp() { + return dmp; + } - public void setDmp(DMP dmp) { - this.dmp = dmp; - } + public void setDmp(DMP dmp) { + this.dmp = dmp; + } - public Integer getRole() { - return role; - } + public Integer getRole() { + return role; + } - public void setRole(Integer role) { - this.role = role; - } + public void setRole(Integer role) { + this.role = role; + } - @Override - public void update(UserDMP entity) { - this.role = entity.getRole(); - } + @Override + public void update(UserDMP entity) { + this.role = entity.getRole(); + } - @Override - public UUID getKeys() { - return this.id; - } + @Override + public UUID getKeys() { + return this.id; + } + + @Override + public UserDMP buildFromTuple(List tuple, List fields, String base) { + String currentBase = base.isEmpty() ? "" : base + "."; + if (fields.contains(currentBase + "id")) this.id = EntityBinder.fromTuple(tuple, currentBase + "id"); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserInfo.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserInfo.java index 3a9da482c..a2451c3e5 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserInfo.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserInfo.java @@ -1,180 +1,188 @@ package eu.eudat.data.entities; +import eu.eudat.data.converters.DateToUTCConverter; +import eu.eudat.data.entities.helpers.EntityBinder; import eu.eudat.queryable.queryableentity.DataEntity; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Type; import javax.persistence.*; -import java.util.Date; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; +import java.util.*; @Entity @Table(name = "\"UserInfo\"") @NamedEntityGraphs({ - @NamedEntityGraph( - name = "userInfo", - attributeNodes = {@NamedAttributeNode("userRoles"), @NamedAttributeNode("credentials")}) + @NamedEntityGraph( + name = "userInfo", + attributeNodes = {@NamedAttributeNode("userRoles"), @NamedAttributeNode("credentials")}), }) public class UserInfo implements DataEntity { - @Id - @GeneratedValue - @GenericGenerator(name = "uuid2", strategy = "uuid2") - @Column(name = "id", updatable = false, nullable = false, columnDefinition = "BINARY(16)") - private UUID id; + @Id + @GeneratedValue + @GenericGenerator(name = "uuid2", strategy = "uuid2") + @Column(name = "id", updatable = false, nullable = false, columnDefinition = "BINARY(16)") + private UUID id; - @Column(name = "email", nullable = false) - private String email = null; + @Column(name = "email", nullable = false) + private String email = null; - @Column(name = "authorization_level", nullable = false) - private Short authorization_level; //0 admin, 1 user + @Column(name = "authorization_level", nullable = false) + private Short authorization_level; //0 admin, 1 user - @Column(name = "usertype", nullable = false) - private Short usertype; // 0 internal, 1 external + @Column(name = "usertype", nullable = false) + private Short usertype; // 0 internal, 1 external - @Column(name = "verified_email", nullable = true) - private Boolean verified_email = null; + @Column(name = "verified_email", nullable = true) + private Boolean verified_email = null; - @Column(name = "name", nullable = true) - private String name = null; + @Column(name = "name", nullable = true) + private String name = null; - @Column(name = "created", nullable = false) - private Date created = null; + @Column(name = "created", nullable = false) + @Convert(converter = DateToUTCConverter.class) + private Date created = null; - @Column(name = "lastloggedin", nullable = true) - private Date lastloggedin = null; + @Column(name = "lastloggedin", nullable = true) + @Convert(converter = DateToUTCConverter.class) + private Date lastloggedin = null; - @Type(type = "eu.eudat.configurations.typedefinition.XMLType") - @Column(name = "additionalinfo", nullable = true) - private String additionalinfo; + @Type(type = "eu.eudat.configurations.typedefinition.XMLType") + @Column(name = "additionalinfo", nullable = true) + private String additionalinfo; - @OneToMany(fetch = FetchType.LAZY) - @JoinTable(name = "\"UserDMP\"", - joinColumns = {@JoinColumn(name = "usr", referencedColumnName = "id")}, - inverseJoinColumns = {@JoinColumn(name = "dmp", referencedColumnName = "\"ID\"")} - ) - private Set dmps; + @OneToMany(fetch = FetchType.LAZY) + @JoinTable(name = "\"UserDMP\"", + joinColumns = {@JoinColumn(name = "usr", referencedColumnName = "id")}, + inverseJoinColumns = {@JoinColumn(name = "dmp", referencedColumnName = "\"ID\"")} + ) + private Set dmps; - @OneToMany(mappedBy = "userInfo", fetch = FetchType.LAZY) - private Set credentials = new HashSet<>(); + @OneToMany(mappedBy = "userInfo", fetch = FetchType.LAZY) + private Set credentials = new HashSet<>(); - @OneToMany(mappedBy = "userInfo", fetch = FetchType.LAZY) - private Set userRoles = new HashSet<>(); + @OneToMany(mappedBy = "userInfo", fetch = FetchType.LAZY) + private Set userRoles = new HashSet<>(); - public Set getDmps() { - return dmps; - } + public Set getDmps() { + return dmps; + } - public void setDmps(Set dmps) { - this.dmps = dmps; - } + public void setDmps(Set dmps) { + this.dmps = dmps; + } - public UUID getId() { - return id; - } + public UUID getId() { + return id; + } - public void setId(UUID id) { - this.id = id; - } + public void setId(UUID id) { + this.id = id; + } - public Date getCreated() { - return created; - } + public Date getCreated() { + return created; + } - public void setCreated(Date created) { - this.created = created; - } + public void setCreated(Date created) { + this.created = created; + } - public Date getLastloggedin() { - return lastloggedin; - } + public Date getLastloggedin() { + return lastloggedin; + } - public void setLastloggedin(Date lastloggedin) { - this.lastloggedin = lastloggedin; - } + public void setLastloggedin(Date lastloggedin) { + this.lastloggedin = lastloggedin; + } - public String getEmail() { - return email; - } + public String getEmail() { + return email; + } - public void setEmail(String email) { - this.email = email; - } + public void setEmail(String email) { + this.email = email; + } - public Short getAuthorization_level() { - return authorization_level; - } + public Short getAuthorization_level() { + return authorization_level; + } - public void setAuthorization_level(Short authorization_level) { - this.authorization_level = authorization_level; - } + public void setAuthorization_level(Short authorization_level) { + this.authorization_level = authorization_level; + } - public Short getUsertype() { - return usertype; - } + public Short getUsertype() { + return usertype; + } - public void setUsertype(Short usertype) { - this.usertype = usertype; - } + public void setUsertype(Short usertype) { + this.usertype = usertype; + } - public Boolean getVerified_email() { - return verified_email; - } + public Boolean getVerified_email() { + return verified_email; + } - public void setVerified_email(Boolean verified_email) { - this.verified_email = verified_email; - } + public void setVerified_email(Boolean verified_email) { + this.verified_email = verified_email; + } - public String getName() { - return name; - } + public String getName() { + return name; + } - public void setName(String name) { - this.name = name; - } + public void setName(String name) { + this.name = name; + } - public String getAdditionalinfo() { - return additionalinfo; - } + public String getAdditionalinfo() { + return additionalinfo; + } - public void setAdditionalinfo(String additionalinfo) { - this.additionalinfo = additionalinfo; - } + public void setAdditionalinfo(String additionalinfo) { + this.additionalinfo = additionalinfo; + } - public Set getCredentials() { - return credentials; - } + public Set getCredentials() { + return credentials; + } - public void setCredentials(Set credentials) { - this.credentials = credentials; - } + public void setCredentials(Set credentials) { + this.credentials = credentials; + } - public Set getUserRoles() { - return userRoles; - } + public Set getUserRoles() { + return userRoles; + } - public void setUserRoles(Set userRoles) { - this.userRoles = userRoles; - } + public void setUserRoles(Set userRoles) { + this.userRoles = userRoles; + } - @Override - public void update(UserInfo entity) { - this.name = entity.getName(); - this.email = entity.getEmail(); - this.additionalinfo = entity.getAdditionalinfo(); - this.lastloggedin = entity.getLastloggedin(); - this.userRoles = entity.getUserRoles(); - } + @Override + public void update(UserInfo entity) { + this.name = entity.getName(); + this.email = entity.getEmail(); + this.additionalinfo = entity.getAdditionalinfo(); + this.lastloggedin = entity.getLastloggedin(); + this.userRoles = entity.getUserRoles(); + } - @Override - public UUID getKeys() { - return this.id; - } + @Override + public UUID getKeys() { + return this.id; + } + + @Override + public UserInfo buildFromTuple(List tuple, List fields, String base) { + String currentBase = base.isEmpty() ? "" : base + "."; + if (fields.contains(currentBase + "id")) this.id = EntityBinder.fromTuple(tuple, currentBase + "id"); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserRole.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserRole.java index dacea8581..43633c237 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserRole.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserRole.java @@ -1,9 +1,11 @@ package eu.eudat.data.entities; +import eu.eudat.data.entities.helpers.EntityBinder; import eu.eudat.queryable.queryableentity.DataEntity; import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; +import java.util.List; import java.util.UUID; @@ -11,50 +13,57 @@ import java.util.UUID; @Table(name = "\"UserRole\"") public class UserRole implements DataEntity { - @Id - @GeneratedValue - @GenericGenerator(name = "uuid2", strategy = "uuid2") - @Column(name = "\"Id\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") - private UUID id; + @Id + @GeneratedValue + @GenericGenerator(name = "uuid2", strategy = "uuid2") + @Column(name = "\"Id\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") + private UUID id; - @Column(name = "\"Role\"", nullable = false) - private int role; + @Column(name = "\"Role\"", nullable = false) + private int role; - @ManyToOne(fetch = FetchType.EAGER) - @JoinColumn(name = "\"UserId\"", nullable = false) - private UserInfo userInfo; + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "\"UserId\"", nullable = false) + private UserInfo userInfo; - public UUID getId() { - return id; - } + public UUID getId() { + return id; + } - public void setId(UUID id) { - this.id = id; - } + public void setId(UUID id) { + this.id = id; + } - public int getRole() { - return role; - } + public int getRole() { + return role; + } - public void setRole(int role) { - this.role = role; - } + public void setRole(int role) { + this.role = role; + } - public UserInfo getUserInfo() { - return userInfo; - } + public UserInfo getUserInfo() { + return userInfo; + } - public void setUserInfo(UserInfo userInfo) { - this.userInfo = userInfo; - } + public void setUserInfo(UserInfo userInfo) { + this.userInfo = userInfo; + } - @Override - public void update(UserRole entity) { + @Override + public void update(UserRole entity) { - } + } - @Override - public UUID getKeys() { - return this.id; - } + @Override + public UUID getKeys() { + return this.id; + } + + @Override + public UserRole buildFromTuple(List tuple, List fields, String base) { + String currentBase = base.isEmpty() ? "" : base + "."; + if (fields.contains(currentBase + "id")) this.id = EntityBinder.fromTuple(tuple, currentBase + "id"); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserToken.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserToken.java index a74e127cb..ec49d0bbb 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserToken.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserToken.java @@ -1,9 +1,12 @@ package eu.eudat.data.entities; +import eu.eudat.data.converters.DateToUTCConverter; +import eu.eudat.data.entities.helpers.EntityBinder; import eu.eudat.queryable.queryableentity.DataEntity; import javax.persistence.*; import java.util.Date; +import java.util.List; import java.util.UUID; @@ -11,60 +14,69 @@ import java.util.UUID; @Table(name = "\"UserToken\"") public class UserToken implements DataEntity { - @Id - @Column(name = "\"Token\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") - private UUID token; + @Id + @Column(name = "\"Token\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") + private UUID token; - @OneToOne(fetch = FetchType.EAGER) - @JoinColumn(name = "\"UserId\"", nullable = false) - private UserInfo user; + @OneToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "\"UserId\"", nullable = false) + private UserInfo user; - @Column(name = "\"IssuedAt\"", nullable = false) - private Date issuedAt = null; + @Column(name = "\"IssuedAt\"", nullable = false) + @Convert(converter = DateToUTCConverter.class) + private Date issuedAt = null; - @Column(name = "\"ExpiresAt\"", nullable = false) - private Date expiresAt = null; + @Column(name = "\"ExpiresAt\"", nullable = false) + @Convert(converter = DateToUTCConverter.class) + private Date expiresAt = null; - public UUID getToken() { - return token; - } + public UUID getToken() { + return token; + } - public void setToken(UUID token) { - this.token = token; - } + public void setToken(UUID token) { + this.token = token; + } - public UserInfo getUser() { - return user; - } + public UserInfo getUser() { + return user; + } - public void setUser(UserInfo user) { - this.user = user; - } + public void setUser(UserInfo user) { + this.user = user; + } - public Date getIssuedAt() { - return issuedAt; - } + public Date getIssuedAt() { + return issuedAt; + } - public void setIssuedAt(Date issuedAt) { - this.issuedAt = issuedAt; - } + public void setIssuedAt(Date issuedAt) { + this.issuedAt = issuedAt; + } - public Date getExpiresAt() { - return expiresAt; - } + public Date getExpiresAt() { + return expiresAt; + } - public void setExpiresAt(Date expiresAt) { - this.expiresAt = expiresAt; - } + public void setExpiresAt(Date expiresAt) { + this.expiresAt = expiresAt; + } - @Override - public void update(UserToken entity) { + @Override + public void update(UserToken entity) { - } + } - @Override - public UUID getKeys() { - return this.token; - } + @Override + public UUID getKeys() { + return this.token; + } + + @Override + public UserToken buildFromTuple(List tuple, List fields, String base) { + String currentBase = base.isEmpty() ? "" : base + "."; + if (fields.contains(currentBase + "token")) this.token = EntityBinder.fromTuple(tuple, currentBase + "token"); + return this; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/helpers/EntityBinder.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/helpers/EntityBinder.java new file mode 100644 index 000000000..775c17ce2 --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/helpers/EntityBinder.java @@ -0,0 +1,14 @@ +package eu.eudat.data.entities.helpers; + +import javax.persistence.Tuple; +import java.util.List; + +public class EntityBinder { + public static T fromTuple(List tuple, String path) { + try { + return (T) tuple.get(0).get(path); + }catch (IllegalArgumentException illegalArgument){ + return null; + } + } +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/item/dataset/DatasetWizardAutocompleteRequest.java b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/item/dataset/DatasetWizardAutocompleteRequest.java index 5b0316ee7..cd02e9e2e 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/item/dataset/DatasetWizardAutocompleteRequest.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/item/dataset/DatasetWizardAutocompleteRequest.java @@ -13,7 +13,7 @@ public class DatasetWizardAutocompleteRequest extends Query applyCriteria() { QueryableList query = this.getQuery().where((builder, root) -> builder.or(builder.equal(root.get("creator"), this.getCriteria().getUserInfo()), builder.isMember(this.getCriteria().getUserInfo(), root.get("users")))); if (this.getCriteria().getLike() != null && !this.getCriteria().getLike().isEmpty()) { - query.where((builder, root) -> builder.like(root.get("label"), "%" + this.getCriteria().getLike() + "%")); + query.where((builder, root) -> builder.like(builder.upper(root.get("label")), "%" + this.getCriteria().getLike().toUpperCase() + "%")); } return query; } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/item/datasetprofile/DatasetProfileAutocompleteRequest.java b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/item/datasetprofile/DatasetProfileAutocompleteRequest.java index 06999e09f..7418102b6 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/item/datasetprofile/DatasetProfileAutocompleteRequest.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/item/datasetprofile/DatasetProfileAutocompleteRequest.java @@ -12,7 +12,7 @@ public class DatasetProfileAutocompleteRequest extends Query applyCriteria() { QueryableList query = this.getQuery(); if (this.getCriteria().getLike() != null && !this.getCriteria().getLike().isEmpty()) - query.where((builder, root) -> builder.like(root.get("label"), "%" + this.getCriteria().getLike() + "%")); + query.where((builder, root) -> builder.like(builder.upper(root.get("label")), "%" + this.getCriteria().getLike().toUpperCase() + "%")); return query; } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/item/dmp/DataManagementPlanCriteriaRequest.java b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/item/dmp/DataManagementPlanCriteriaRequest.java index 1b88b8872..4ecc13a4c 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/item/dmp/DataManagementPlanCriteriaRequest.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/item/dmp/DataManagementPlanCriteriaRequest.java @@ -16,13 +16,15 @@ public class DataManagementPlanCriteriaRequest extends Query applyCriteria() { QueryableList query = this.getQuery(); if (this.getCriteria().getLike() != null && !this.getCriteria().getLike().isEmpty()) - query.where((builder, root) -> builder.like(root.get("label"), "%" + this.getCriteria().getLike() + "%")); + query.where((builder, root) -> builder.or( + builder.like(builder.upper(root.get("label")), "%" + this.getCriteria().getLike().toUpperCase() + "%"), + builder.like(builder.upper(root.get("description")), "%" + this.getCriteria().getLike().toUpperCase() + "%"))); if (this.getCriteria().getPeriodEnd() != null) query.where((builder, root) -> builder.lessThan(root.get("created"), this.getCriteria().getPeriodEnd())); if (this.getCriteria().getPeriodStart() != null) query.where((builder, root) -> builder.greaterThan(root.get("created"), this.getCriteria().getPeriodStart())); - if (this.getCriteria().getProjects() != null && !this.getCriteria().getProjects().isEmpty()) - query.where(((builder, root) -> root.get("project").in(this.getCriteria().getProjects()))); + if (this.getCriteria().getGrants() != null && !this.getCriteria().getGrants().isEmpty()) + query.where(((builder, root) -> root.get("grant").in(this.getCriteria().getGrants()))); if (!this.getCriteria().getAllVersions()) query.initSubQuery(String.class).where((builder, root) -> builder.equal(root.get("version"), query.subQueryMax((builder1, externalRoot, nestedRoot) -> builder1.equal(externalRoot.get("groupId"), nestedRoot.get("groupId")), Arrays.asList(new SelectionField(FieldSelectionType.FIELD, "version")), String.class))); if (this.getCriteria().getGroupIds() != null && !this.getCriteria().getGroupIds().isEmpty()) diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/item/dmpprofile/DataManagementPlanProfileCriteriaRequest.java b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/item/dmpprofile/DataManagementPlanProfileCriteriaRequest.java index 91ba08b42..a87d09532 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/item/dmpprofile/DataManagementPlanProfileCriteriaRequest.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/item/dmpprofile/DataManagementPlanProfileCriteriaRequest.java @@ -13,7 +13,7 @@ public class DataManagementPlanProfileCriteriaRequest extends Query applyCriteria() { QueryableList query = this.getQuery(); if (this.getCriteria().getLike() != null && !this.getCriteria().getLike().isEmpty()) - query.where((builder, root) -> builder.like(root.get("label"), "%" + this.getCriteria().getLike() + "%")); + query.where((builder, root) -> builder.like(builder.upper(root.get("label")), "%" + this.getCriteria().getLike().toUpperCase() + "%")); return query; } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/item/funder/FunderCriteriaRequest.java b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/item/funder/FunderCriteriaRequest.java new file mode 100644 index 000000000..49e5a4ef5 --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/item/funder/FunderCriteriaRequest.java @@ -0,0 +1,17 @@ +package eu.eudat.data.query.items.item.funder; + +import eu.eudat.data.dao.criteria.FunderCriteria; +import eu.eudat.data.entities.Funder; +import eu.eudat.data.query.definition.Query; +import eu.eudat.queryable.QueryableList; + +public class FunderCriteriaRequest extends Query { + @Override + public QueryableList applyCriteria() { + QueryableList query = this.getQuery(); + if (this.getCriteria().getLike() != null && !this.getCriteria().getLike().isEmpty()) + query.where((builder, root) -> builder.like(builder.upper(root.get("label")), "%" + this.getCriteria().getLike().toUpperCase() + "%")); + query.where((builder, root) -> builder.notEqual(root.get("status"), Funder.Status.DELETED.getValue())); + return query; + } +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/item/grant/GrantCriteriaRequest.java b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/item/grant/GrantCriteriaRequest.java new file mode 100644 index 000000000..b2f0bde72 --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/item/grant/GrantCriteriaRequest.java @@ -0,0 +1,38 @@ +package eu.eudat.data.query.items.item.grant; + +import eu.eudat.data.dao.criteria.GrantCriteria; +import eu.eudat.data.entities.Grant; +import eu.eudat.data.query.definition.Query; +import eu.eudat.queryable.QueryableList; + +public class GrantCriteriaRequest extends Query { + private Integer length; + + public Integer getLength() { + return length; + } + + public void setLength(Integer length) { + this.length = length; + } + + private GrantCriteriaRequest() { + } + + @Override + public QueryableList applyCriteria() { + QueryableList query = this.getQuery(); + if (this.getCriteria().getLike() != null && !this.getCriteria().getLike().isEmpty()) + query.where((builder, root) -> builder.or( + builder.like(builder.upper(root.get("label")), "%" + this.getCriteria().getLike().toUpperCase() + "%"), + builder.like(builder.upper(root.get("description")), "%" + this.getCriteria().getLike().toUpperCase() + "%"))); + if (this.getCriteria().getPeriodEnd() != null) + query.where((builder, root) -> builder.lessThan(root.get("enddate"), this.getCriteria().getPeriodEnd())); + if (this.getCriteria().getPeriodStart() != null) + query.where((builder, root) -> builder.greaterThan(root.get("startdate"), this.getCriteria().getPeriodStart())); + if (this.getCriteria().getReference() != null) + query.where((builder, root) -> builder.equal(root.get("reference"), this.getCriteria().getReference())); + query.where((builder, root) -> builder.notEqual(root.get("status"), Grant.Status.DELETED.getValue())); + return query; + } +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/item/project/ProjectCriteriaRequest.java b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/item/project/ProjectCriteriaRequest.java index 6c53e19f9..5a66ebcd5 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/item/project/ProjectCriteriaRequest.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/item/project/ProjectCriteriaRequest.java @@ -5,24 +5,13 @@ import eu.eudat.data.entities.Project; import eu.eudat.data.query.definition.Query; import eu.eudat.queryable.QueryableList; -import java.util.UUID; - -public class ProjectCriteriaRequest extends Query { - private ProjectCriteriaRequest() { - } - - @Override - public QueryableList applyCriteria() { - QueryableList query = this.getQuery(); - if (this.getCriteria().getLike() != null && !this.getCriteria().getLike().isEmpty()) - query.where((builder, root) -> builder.like(root.get("label"), "%" + this.getCriteria().getLike() + "%")); - if (this.getCriteria().getPeriodEnd() != null) - query.where((builder, root) -> builder.lessThan(root.get("enddate"), this.getCriteria().getPeriodEnd())); - if (this.getCriteria().getPeriodStart() != null) - query.where((builder, root) -> builder.greaterThan(root.get("startdate"), this.getCriteria().getPeriodStart())); - if (this.getCriteria().getReference() != null) - query.where((builder, root) -> builder.equal(root.get("reference"), this.getCriteria().getReference())); - query.where((builder, root) -> builder.notEqual(root.get("status"), Project.Status.DELETED.getValue())); - return query; - } +public class ProjectCriteriaRequest extends Query { + @Override + public QueryableList applyCriteria() { + QueryableList query = this.getQuery(); + if (this.getCriteria().getLike() != null && !this.getCriteria().getLike().isEmpty()) + query.where((builder, root) -> builder.like(builder.upper(root.get("label")), "%" + this.getCriteria().getLike().toUpperCase() + "%")); + query.where((builder, root) -> builder.notEqual(root.get("status"), Project.Status.DELETED.getValue())); + return query; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/item/userinfo/UserInfoRequestItem.java b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/item/userinfo/UserInfoRequestItem.java index de2386979..c7dcbff8d 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/item/userinfo/UserInfoRequestItem.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/item/userinfo/UserInfoRequestItem.java @@ -13,7 +13,7 @@ public class UserInfoRequestItem extends Query { if (this.getCriteria().getAppRoles() != null && !this.getCriteria().getAppRoles().isEmpty()) users.where((builder, root) -> root.join("userRoles").get("role").in(this.getCriteria().getAppRoles())); if (this.getCriteria().getLike() != null) - users.where((builder, root) -> builder.or(builder.like(root.get("name"), "%" + this.getCriteria().getLike() + "%"), builder.like(root.get("email"), "%" + this.getCriteria().getLike() + "%"))); + users.where((builder, root) -> builder.or(builder.like(builder.upper(root.get("name")), "%" + this.getCriteria().getLike().toUpperCase() + "%"), builder.like(root.get("email"), "%" + this.getCriteria().getLike() + "%"))); if (this.getCriteria().getEmail() != null) users.where((builder, root) -> builder.equal(root.get("email"), this.getCriteria().getEmail())); return users; diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/dataset/DatasetPublicTableRequest.java b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/dataset/DatasetPublicTableRequest.java new file mode 100644 index 000000000..ccaef9eaf --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/dataset/DatasetPublicTableRequest.java @@ -0,0 +1,55 @@ +package eu.eudat.data.query.items.table.dataset; + +import eu.eudat.data.dao.criteria.DatasetPublicCriteria; +import eu.eudat.data.entities.Dataset; +import eu.eudat.data.query.definition.TableQuery; +import eu.eudat.queryable.QueryableList; +import eu.eudat.queryable.types.FieldSelectionType; +import eu.eudat.queryable.types.SelectionField; +import eu.eudat.types.grant.GrantStateType; + +import java.util.Arrays; +import java.util.Date; +import java.util.UUID; + +/** + * Created by ikalyvas on 10/2/2018. + */ +public class DatasetPublicTableRequest extends TableQuery { + @Override + public QueryableList applyCriteria() { + QueryableList query = this.getQuery(); + query.where((builder, root) -> builder.equal(root.get("dmp").get("isPublic"), true)); + query.where((builder, root) -> builder.equal(root.get("status"), Dataset.Status.FINALISED.getValue())); + query.initSubQuery(String.class).where((builder, root) -> builder.equal(root.get("dmp").get("version"), + query.subQueryMax((builder1, externalRoot, nestedRoot) -> builder1.equal(externalRoot.get("dmp").get("groupId"), nestedRoot.get("dmp").get("groupId")), + Arrays.asList(new SelectionField(FieldSelectionType.COMPOSITE_FIELD, "dmp:version")), String.class))); + if (this.getCriteria().getLike() != null && !this.getCriteria().getLike().isEmpty()) + query.where((builder, root) -> builder.or( + builder.like(builder.upper(root.get("label")), "%" + this.getCriteria().getLike().toUpperCase() + "%"), + builder.like(builder.upper(root.get("description")), "%" + this.getCriteria().getLike().toUpperCase() + "%"))); + if (this.getCriteria().getGrants() != null && !this.getCriteria().getGrants().isEmpty()) + query.where(((builder, root) -> root.get("dmp").get("grant").get("id").in(this.getCriteria().getGrants()))); + if (this.getCriteria().getGrantStatus() != null) { + if (this.getCriteria().getGrantStatus().getValue().equals(GrantStateType.FINISHED.getValue())) + query.where((builder, root) -> builder.lessThan(root.get("dmp").get("grant").get("enddate"), new Date())); + if (this.getCriteria().getGrantStatus().getValue().equals(GrantStateType.ONGOING.getValue())) + query.where((builder, root) -> + builder.or(builder.greaterThan(root.get("dmp").get("grant").get("enddate"), new Date()) + , builder.isNull(root.get("dmp").get("grant").get("enddate")))); + } + if (this.getCriteria().getDmpIds() != null && !this.getCriteria().getDmpIds().isEmpty()) { + query.where(((builder, root) -> root.get("dmp").get("id").in(this.getCriteria().getDmpIds()))); + } + if (this.getCriteria().getDatasetProfile() != null && !this.getCriteria().getDatasetProfile().isEmpty()) query + .where(((builder, root) -> root.get("profile").get("id").in(this.getCriteria().getDatasetProfile()))); + if (this.getCriteria().getDmpOrganisations() != null && !this.getCriteria().getDmpOrganisations().isEmpty()) query + .where(((builder, root) -> root.join("dmp").join("organisations").get("reference").in(this.getCriteria().getDmpOrganisations()))); + return query; + } + + @Override + public QueryableList applyPaging(QueryableList items) { + return null; + } +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/dataset/DatasetTableRequest.java b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/dataset/DatasetTableRequest.java index 4ea607431..a752014cd 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/dataset/DatasetTableRequest.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/dataset/DatasetTableRequest.java @@ -10,12 +10,14 @@ import eu.eudat.queryable.types.SelectionField; import java.util.Arrays; import java.util.UUID; -public class DatasetTableRequest extends TableQuery { +public class DatasetTableRequest extends TableQuery { @Override public QueryableList applyCriteria() { QueryableList query = this.getQuery(); if (this.getCriteria().getLike() != null && !this.getCriteria().getLike().isEmpty()) - query.where((builder, root) -> builder.like(root.get("label"), "%" + this.getCriteria().getLike() + "%")); + query.where((builder, root) -> builder.or( + builder.like(builder.upper(root.get("label")), "%" + this.getCriteria().getLike().toUpperCase() + "%"), + builder.like(builder.upper(root.get("description")), "%" + this.getCriteria().getLike().toUpperCase() + "%"))); if (this.getCriteria().getStatus() != null) query.where((builder, root) -> builder.equal(root.get("status"), this.getCriteria().getStatus())); if (this.getCriteria().getPeriodEnd() != null) @@ -26,6 +28,7 @@ public class DatasetTableRequest extends TableQuery builder.equal(root.get("dmp").get("version"), query.subQueryMax((builder1, externalRoot, nestedRoot) -> builder1.equal(externalRoot.get("dmp").get("groupId"), nestedRoot.get("dmp").get("groupId")), Arrays.asList(new SelectionField(FieldSelectionType.COMPOSITE_FIELD, "dmp:version")), String.class))); if (this.getCriteria().getDmpIds() != null && !this.getCriteria().getDmpIds().isEmpty()) query.where((builder, root) -> root.get("dmp").get("id").in(this.getCriteria().getDmpIds())); + query.where((builder, root) -> builder.equal(root.get("status"), Dataset.Status.FINALISED)); return query; } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/datasetprofile/DatasetProfileTableRequestItem.java b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/datasetprofile/DatasetProfileTableRequestItem.java index 2d4fb0a94..1ff6faa88 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/datasetprofile/DatasetProfileTableRequestItem.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/datasetprofile/DatasetProfileTableRequestItem.java @@ -12,7 +12,7 @@ public class DatasetProfileTableRequestItem extends TableQuery applyCriteria() { QueryableList query = this.getQuery(); if (this.getCriteria().getLike() != null && !this.getCriteria().getLike().isEmpty()) - query.where((builder, root) -> builder.like(root.get("label"), "%" + this.getCriteria().getLike() + "%")); + query.where((builder, root) -> builder.like(builder.upper(root.get("label")), "%" + this.getCriteria().getLike().toUpperCase() + "%")); return query; } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/dmp/DataManagementPlanTableRequest.java b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/dmp/DataManagementPlanTableRequest.java index c595618c5..ed1849a2d 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/dmp/DataManagementPlanTableRequest.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/dmp/DataManagementPlanTableRequest.java @@ -16,13 +16,15 @@ public class DataManagementPlanTableRequest extends TableQuery applyCriteria() { QueryableList query = this.getQuery(); if (this.getCriteria().getLike() != null && !this.getCriteria().getLike().isEmpty()) - query.where((builder, root) -> builder.like(root.get("label"), "%" + this.getCriteria().getLike() + "%")); + query.where((builder, root) -> builder.or( + builder.like(builder.upper(root.get("label")), "%" + this.getCriteria().getLike().toUpperCase() + "%"), + builder.like(builder.upper(root.get("description")), "%" + this.getCriteria().getLike().toUpperCase() + "%"))); if (this.getCriteria().getPeriodEnd() != null) query.where((builder, root) -> builder.lessThan(root.get("created"), this.getCriteria().getPeriodEnd())); if (this.getCriteria().getPeriodStart() != null) query.where((builder, root) -> builder.greaterThan(root.get("created"), this.getCriteria().getPeriodStart())); - if (this.getCriteria().getProjects() != null && !this.getCriteria().getProjects().isEmpty()) - query.where(((builder, root) -> root.get("project").in(this.getCriteria().getProjects()))); + if (this.getCriteria().getGrants() != null && !this.getCriteria().getGrants().isEmpty()) + query.where(((builder, root) -> root.get("grant").in(this.getCriteria().getGrants()))); if (!this.getCriteria().getAllVersions()) query.initSubQuery(String.class).where((builder, root) -> builder.equal(root.get("version"), query.subQueryMax((builder1, externalRoot, nestedRoot) -> builder1.equal(externalRoot.get("groupId"), nestedRoot.get("groupId")), Arrays.asList(new SelectionField(FieldSelectionType.FIELD, "version")), String.class))); if (this.getCriteria().getGroupIds() != null && !this.getCriteria().getGroupIds().isEmpty()) diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/dmp/DataManagmentPlanPublicTableRequest.java b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/dmp/DataManagmentPlanPublicTableRequest.java new file mode 100644 index 000000000..bb2d08333 --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/dmp/DataManagmentPlanPublicTableRequest.java @@ -0,0 +1,43 @@ +package eu.eudat.data.query.items.table.dmp; + +import eu.eudat.data.dao.criteria.DataManagementPlanPublicCriteria; +import eu.eudat.data.entities.DMP; +import eu.eudat.data.query.PaginationService; +import eu.eudat.data.query.definition.TableQuery; +import eu.eudat.queryable.QueryableList; +import eu.eudat.types.grant.GrantStateType; + +import java.util.Date; +import java.util.UUID; + +public class DataManagmentPlanPublicTableRequest extends TableQuery { + + public QueryableList applyCriteria() { + QueryableList query = this.getQuery(); + query.where((builder, root) -> builder.equal(root.get("isPublic"), true)); + if (this.getCriteria().getLike() != null && !this.getCriteria().getLike().isEmpty()) + query.where((builder, root) -> builder.or( + builder.like(builder.upper(root.get("label")), "%" + this.getCriteria().getLike().toUpperCase() + "%"), + builder.like(builder.upper(root.get("description")), "%" + this.getCriteria().getLike().toUpperCase() + "%"))); + if (this.getCriteria().getGrants() != null && !this.getCriteria().getGrants().isEmpty()) + query.where(((builder, root) -> root.get("grant").get("id").in(this.getCriteria().getGrants()))); + if (this.getCriteria().getGrantStatus() != null) { + if (this.getCriteria().getGrantStatus().getValue().equals(GrantStateType.FINISHED.getValue())) + query.where((builder, root) -> builder.lessThan(root.get("grant").get("enddate"), new Date())); + if (this.getCriteria().getGrantStatus().getValue().equals(GrantStateType.ONGOING.getValue())) + query.where((builder, root) -> + builder.or(builder.greaterThan(root.get("grant").get("enddate"), new Date()) + , builder.isNull(root.get("grant").get("enddate")))); + } + if (this.getCriteria().datasetProfile != null && !this.getCriteria().datasetProfile.isEmpty()) query + .where(((builder, root) -> root.get("profile").get("id").in(this.getCriteria().datasetProfile))); + if (this.getCriteria().getDmpOrganisations() != null && !this.getCriteria().getDmpOrganisations().isEmpty()) query + .where(((builder, root) -> root.join("organisations").get("reference").in(this.getCriteria().getDmpOrganisations()))); + return query; + } + + @Override + public QueryableList applyPaging(QueryableList items) { + return PaginationService.applyPaging(items, this); + } +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/externaldataset/ExternalDatasetTableRequest.java b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/externaldataset/ExternalDatasetTableRequest.java index 5dd302e09..1c0c4199b 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/externaldataset/ExternalDatasetTableRequest.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/externaldataset/ExternalDatasetTableRequest.java @@ -13,7 +13,7 @@ public class ExternalDatasetTableRequest extends TableQuery applyCriteria() { QueryableList query = this.getQuery(); if (this.getCriteria().getLike() != null && !this.getCriteria().getLike().isEmpty()) - query.where((builder, root) -> builder.like(root.get("label"), "%" + this.getCriteria().getLike() + "%")); + query.where((builder, root) -> builder.like(builder.upper(root.get("label")), "%" + this.getCriteria().getLike().toUpperCase() + "%")); return query; } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/grant/GrantTableRequest.java b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/grant/GrantTableRequest.java new file mode 100644 index 000000000..223566e95 --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/grant/GrantTableRequest.java @@ -0,0 +1,32 @@ +package eu.eudat.data.query.items.table.grant; + +import eu.eudat.data.dao.criteria.GrantCriteria; +import eu.eudat.data.entities.Grant; +import eu.eudat.data.query.definition.TableQuery; +import eu.eudat.queryable.QueryableList; + +import java.util.UUID; + +public class GrantTableRequest extends TableQuery { + @Override + public QueryableList applyCriteria() { + QueryableList query = this.getQuery(); + if (this.getCriteria().getLike() != null && !this.getCriteria().getLike().isEmpty()) + query.where((builder, root) -> builder.or( + builder.like(builder.upper(root.get("label")), "%" + this.getCriteria().getLike().toUpperCase() + "%"), + builder.like(builder.upper(root.get("description")), "%" + this.getCriteria().getLike().toUpperCase() + "%"))); + if (this.getCriteria().getPeriodEnd() != null) + query.where((builder, root) -> builder.lessThan(root.get("enddate"), this.getCriteria().getPeriodEnd())); + if (this.getCriteria().getPeriodStart() != null) + query.where((builder, root) -> builder.greaterThan(root.get("startdate"), this.getCriteria().getPeriodStart())); + if (this.getCriteria().getReference() != null) + query.where((builder, root) -> builder.equal(root.get("reference"), this.getCriteria().getReference())); + query.where((builder, root) -> builder.notEqual(root.get("status"), Grant.Status.DELETED.getValue())); + return query; + } + + @Override + public QueryableList applyPaging(QueryableList items) { + return null; + } +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/organisations/OrganisationsTableRequest.java b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/organisations/OrganisationsTableRequest.java new file mode 100644 index 000000000..360d1683b --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/organisations/OrganisationsTableRequest.java @@ -0,0 +1,25 @@ +package eu.eudat.data.query.items.table.organisations; + +import eu.eudat.data.dao.criteria.OrganisationCriteria; +import eu.eudat.data.entities.Organisation; +import eu.eudat.data.query.PaginationService; +import eu.eudat.data.query.definition.TableQuery; +import eu.eudat.queryable.QueryableList; + +import java.util.UUID; + +public class OrganisationsTableRequest extends TableQuery { + @Override + public QueryableList applyCriteria() { + QueryableList query = this.getQuery(); + if (this.getCriteria().getLike() != null && !this.getCriteria().getLike().isEmpty()) { + query.where((builder, root) -> builder.like(builder.upper(root.get("label")), "%" + this.getCriteria().getLike().toUpperCase() + "%")); + } + return query; + } + + @Override + public QueryableList applyPaging(QueryableList items) { + return PaginationService.applyPaging(items, this); + } +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/project/ProjectTableRequest.java b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/project/ProjectTableRequest.java deleted file mode 100644 index 92bcd9daa..000000000 --- a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/project/ProjectTableRequest.java +++ /dev/null @@ -1,31 +0,0 @@ -package eu.eudat.data.query.items.table.project; - -import eu.eudat.data.dao.criteria.ProjectCriteria; -import eu.eudat.data.entities.Project; -import eu.eudat.data.query.definition.Query; -import eu.eudat.data.query.definition.TableQuery; -import eu.eudat.queryable.QueryableList; - -import java.util.UUID; - -public class ProjectTableRequest extends TableQuery { - @Override - public QueryableList applyCriteria() { - QueryableList query = this.getQuery(); - if (this.getCriteria().getLike() != null && !this.getCriteria().getLike().isEmpty()) - query.where((builder, root) -> builder.like(root.get("label"), "%" + this.getCriteria().getLike() + "%")); - if (this.getCriteria().getPeriodEnd() != null) - query.where((builder, root) -> builder.lessThan(root.get("enddate"), this.getCriteria().getPeriodEnd())); - if (this.getCriteria().getPeriodStart() != null) - query.where((builder, root) -> builder.greaterThan(root.get("startdate"), this.getCriteria().getPeriodStart())); - if (this.getCriteria().getReference() != null) - query.where((builder, root) -> builder.equal(root.get("reference"), this.getCriteria().getReference())); - query.where((builder, root) -> builder.notEqual(root.get("status"), Project.Status.DELETED.getValue())); - return query; - } - - @Override - public QueryableList applyPaging(QueryableList items) { - return null; - } -} diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/userinfo/UserInfoTableRequestItem.java b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/userinfo/UserInfoTableRequestItem.java index f1435e366..a4a3fc38f 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/userinfo/UserInfoTableRequestItem.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/userinfo/UserInfoTableRequestItem.java @@ -16,7 +16,7 @@ public class UserInfoTableRequestItem extends TableQuery root.join("userRoles").get("role").in(this.getCriteria().getAppRoles())); if (this.getCriteria().getLike() != null) - users.where((builder, root) -> builder.or(builder.like(root.get("name"), "%" + this.getCriteria().getLike() + "%"), builder.like(root.get("email"), "%" + this.getCriteria().getLike() + "%"))); + users.where((builder, root) -> builder.or(builder.like(builder.upper(root.get("name")), "%" + this.getCriteria().getLike().toUpperCase() + "%"), builder.like(root.get("email"), "%" + this.getCriteria().getLike() + "%"))); if (this.getCriteria().getEmail() != null) users.where((builder, root) -> builder.equal(root.get("email"), this.getCriteria().getEmail())); return users; diff --git a/dmp-backend/data/src/main/java/eu/eudat/query/DMPQuery.java b/dmp-backend/data/src/main/java/eu/eudat/query/DMPQuery.java new file mode 100644 index 000000000..0c96b700b --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/query/DMPQuery.java @@ -0,0 +1,143 @@ +package eu.eudat.query; + +import eu.eudat.data.dao.DatabaseAccessLayer; +import eu.eudat.data.entities.DMP; +import eu.eudat.data.entities.Dataset; +import eu.eudat.data.entities.Grant; +import eu.eudat.data.entities.UserInfo; +import eu.eudat.queryable.QueryableList; +import eu.eudat.queryable.types.FieldSelectionType; +import eu.eudat.queryable.types.SelectionField; + +import javax.persistence.criteria.Subquery; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.UUID; + +public class DMPQuery extends Query { + private UUID id; + private UUID groupId; + private String label; + private int version; + private GrantQuery grantQuery; + private UserQuery userQuery; + private DatasetQuery datasetQuery; + private List statuses; + private Date created; + private Date modified; + + public DMPQuery(DatabaseAccessLayer databaseAccessLayer) { + super(databaseAccessLayer); + } + + public DMPQuery(DatabaseAccessLayer databaseAccessLayer, List selectionFields) { + super(databaseAccessLayer, selectionFields); + } + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public UUID getGroupId() { + return groupId; + } + + public void setGroupId(UUID groupId) { + this.groupId = groupId; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public int getVersion() { + return version; + } + + public void setVersion(int version) { + this.version = version; + } + + public GrantQuery getGrantQuery() { + return grantQuery; + } + + public void setGrantQuery(GrantQuery grantQuery) { + this.grantQuery = grantQuery; + } + + public List getStatuses() { + return statuses; + } + + public void setStatuses(List statuses) { + statuses = statuses; + } + + public Date getCreated() { + return created; + } + + public void setCreated(Date created) { + this.created = created; + } + + public Date getModified() { + return modified; + } + + public void setModified(Date modified) { + this.modified = modified; + } + + public UserQuery getUserQuery() { + return userQuery; + } + + public void setUserQuery(UserQuery userQuery) { + this.userQuery = userQuery; + } + + public DatasetQuery getDatasetQuery() { + return datasetQuery; + } + + public void setDatasetQuery(DatasetQuery datasetQuery) { + this.datasetQuery = datasetQuery; + } + + public QueryableList getQuery() { + QueryableList query = this.databaseAccessLayer.asQueryable(); + if (this.id != null) { + query.where((builder, root) -> builder.equal(root.get("id"), this.id)); + } + if (this.grantQuery != null) { + Subquery grantQuery = this.grantQuery.getQuery().query(Arrays.asList(new SelectionField(FieldSelectionType.FIELD, "id"))); + query.where((builder, root) -> root.get("grant").get("id").in(grantQuery)); + } + if (this.getStatuses() != null && !this.getStatuses().isEmpty()) { + query.where((builder, root) -> root.get("status").in(this.getStatuses())); + } + if (this.userQuery != null) { + Subquery userInfoSubQuery = this.userQuery.getQuery().query(Arrays.asList(new SelectionField(FieldSelectionType.FIELD, "id"))); + query.where((builder, root) -> root.get("creator").get("id").in(userInfoSubQuery)); + } + if(this.datasetQuery != null){ + Subquery datasetSubQuery = this.datasetQuery.getQuery().query(Arrays.asList(new SelectionField(FieldSelectionType.COMPOSITE_FIELD, "dmp:id"))); + query.where((builder, root) -> root.get("id").in(datasetSubQuery )); + } + if (!this.getSelectionFields().isEmpty() && this.getSelectionFields() != null) { + query.withFields(this.getSelectionFields()); + } + return query; + } +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/query/DatasetProfileQuery.java b/dmp-backend/data/src/main/java/eu/eudat/query/DatasetProfileQuery.java new file mode 100644 index 000000000..71a74b750 --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/query/DatasetProfileQuery.java @@ -0,0 +1,7 @@ +package eu.eudat.query; + +import java.util.UUID; + +public class DatasetProfileQuery { + +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/query/DatasetQuery.java b/dmp-backend/data/src/main/java/eu/eudat/query/DatasetQuery.java new file mode 100644 index 000000000..7dce8d313 --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/query/DatasetQuery.java @@ -0,0 +1,65 @@ +package eu.eudat.query; + +import eu.eudat.data.dao.DatabaseAccessLayer; +import eu.eudat.data.entities.DMP; +import eu.eudat.data.entities.Dataset; +import eu.eudat.queryable.QueryableList; +import eu.eudat.queryable.types.FieldSelectionType; +import eu.eudat.queryable.types.SelectionField; + +import javax.persistence.criteria.Subquery; +import java.util.Arrays; +import java.util.List; +import java.util.UUID; + +public class DatasetQuery extends Query { + + private UUID id; + private String label; + private DMPQuery dmpQuery; + + public DatasetQuery(DatabaseAccessLayer databaseAccessLayer) { + super(databaseAccessLayer); + } + + public DatasetQuery(DatabaseAccessLayer databaseAccessLayer, List selectionFields) { + super(databaseAccessLayer, selectionFields); + } + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public DMPQuery getDmpQuery() { + return dmpQuery; + } + + public void setDmpQuery(DMPQuery dmpQuery) { + this.dmpQuery = dmpQuery; + } + + @Override + public QueryableList getQuery() { + QueryableList query = this.databaseAccessLayer.asQueryable(); + if (this.id != null) { + query.where((builder, root) -> builder.equal(root.get("id"), this.id)); + } + if (this.dmpQuery != null) { + Subquery dmpSubQuery = this.dmpQuery.getQuery().query(Arrays.asList(new SelectionField(FieldSelectionType.FIELD, "id"))); + query.where((builder, root) -> root.get("dmp").get("id").in(dmpSubQuery)); + } + return query; + } +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/query/GrantQuery.java b/dmp-backend/data/src/main/java/eu/eudat/query/GrantQuery.java new file mode 100644 index 000000000..9c19dfc4c --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/query/GrantQuery.java @@ -0,0 +1,108 @@ +package eu.eudat.query; + +import eu.eudat.data.dao.DatabaseAccessLayer; +import eu.eudat.data.entities.Grant; +import eu.eudat.data.entities.UserInfo; +import eu.eudat.queryable.QueryableList; +import eu.eudat.queryable.types.FieldSelectionType; +import eu.eudat.queryable.types.SelectionField; + +import javax.persistence.criteria.Subquery; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.UUID; + +public class GrantQuery extends Query { + + private UUID id; + private List ids; + private String label; + private List statuses; + private Date created; + private Date modified; + private UserQuery userQuery; + + public GrantQuery(DatabaseAccessLayer databaseAccessLayer) { + super(databaseAccessLayer); + } + + public GrantQuery(DatabaseAccessLayer databaseAccessLayer, List selectionFields) { + super(databaseAccessLayer, selectionFields); + } + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public List getIds() { + return ids; + } + + public void setIds(List ids) { + this.ids = ids; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public List getStatuses() { + return statuses; + } + + public void setStatuses(List statuses) { + statuses = statuses; + } + + public Date getCreated() { + return created; + } + + public void setCreated(Date created) { + this.created = created; + } + + public Date getModified() { + return modified; + } + + public void setModified(Date modified) { + this.modified = modified; + } + + public UserQuery getUserQuery() { + return userQuery; + } + + public void setUserQuery(UserQuery userQuery) { + this.userQuery = userQuery; + } + + @Override + public QueryableList getQuery() { + QueryableList query = this.databaseAccessLayer.asQueryable(); + if (this.id != null) + query.where((builder, root) -> builder.equal(root.get("id"), this.id)); + if (this.ids != null && !this.ids.isEmpty()) + query.where((builder, root) -> root.get("id").in(this.ids)); + if (this.getStatuses() != null && !this.getStatuses().isEmpty()) + query.where((builder, root) -> root.get("status").in(this.getStatuses())); + if (this.userQuery != null) { + Subquery userInfoSubQuery = this.userQuery.getQuery().query(Arrays.asList(new SelectionField(FieldSelectionType.FIELD, "id"))); + query.where((builder, root) -> root.get("creationUser").get("id").in(userInfoSubQuery)); + } + if (!this.getSelectionFields().isEmpty() && this.getSelectionFields() != null) { + query.withFields(this.getSelectionFields()); + } + return query; + } +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/query/Query.java b/dmp-backend/data/src/main/java/eu/eudat/query/Query.java new file mode 100644 index 000000000..effc6a1be --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/query/Query.java @@ -0,0 +1,29 @@ +package eu.eudat.query; + +import eu.eudat.data.dao.DatabaseAccessLayer; +import eu.eudat.queryable.QueryableList; +import eu.eudat.queryable.queryableentity.DataEntity; + +import java.util.LinkedList; +import java.util.List; + +public abstract class Query { + protected DatabaseAccessLayer databaseAccessLayer; + + private List selectionFields = new LinkedList<>(); + + public Query(DatabaseAccessLayer databaseAccessLayer, List selectionFields) { + this.databaseAccessLayer = databaseAccessLayer; + this.selectionFields = selectionFields; + } + + public Query(DatabaseAccessLayer databaseAccessLayer) { + this.databaseAccessLayer = databaseAccessLayer; + } + + public abstract QueryableList getQuery(); + + protected List getSelectionFields() { + return selectionFields; + } +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/query/UserQuery.java b/dmp-backend/data/src/main/java/eu/eudat/query/UserQuery.java new file mode 100644 index 000000000..f6240b7c3 --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/query/UserQuery.java @@ -0,0 +1,37 @@ +package eu.eudat.query; + +import eu.eudat.data.dao.DatabaseAccessLayer; +import eu.eudat.data.entities.UserInfo; +import eu.eudat.queryable.QueryableList; + +import java.util.List; +import java.util.UUID; + +public class UserQuery extends Query { + + private UUID id; + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public UserQuery(DatabaseAccessLayer databaseAccessLayer) { + super(databaseAccessLayer); + } + + public UserQuery(DatabaseAccessLayer databaseAccessLayer, List selectionFields) { + super(databaseAccessLayer, selectionFields); + } + + @Override + public QueryableList getQuery() { + QueryableList query = this.databaseAccessLayer.asQueryable(); + if (this.id != null) + query.where((builder, root) -> builder.equal(root.get("id"), this.id)); + return query; + } +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/types/grant/GrantStateType.java b/dmp-backend/data/src/main/java/eu/eudat/types/grant/GrantStateType.java new file mode 100644 index 000000000..3522d1a90 --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/types/grant/GrantStateType.java @@ -0,0 +1,29 @@ +package eu.eudat.types.grant; + +/** + * Created by ikalyvas on 8/24/2018. + */ +public enum GrantStateType { + ONGOING(0), FINISHED(1); + + private Integer value; + + private GrantStateType(Integer value) { + this.value = value; + } + + public Integer getValue() { + return value; + } + + public static GrantStateType fromInteger(Integer value) { + switch (value) { + case 0: + return ONGOING; + case 1: + return FINISHED; + default: + throw new RuntimeException("Unsupported Grant State Type"); + } + } +} diff --git a/dmp-backend/elastic/pom.xml b/dmp-backend/elastic/pom.xml new file mode 100644 index 000000000..a78208200 --- /dev/null +++ b/dmp-backend/elastic/pom.xml @@ -0,0 +1,14 @@ + + + + dmp-backend + eu.eudat + 1.0.0-SNAPSHOT + + 4.0.0 + + elastic + + \ No newline at end of file diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/Criteria.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/Criteria.java new file mode 100644 index 000000000..fa1bcd635 --- /dev/null +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/Criteria.java @@ -0,0 +1,7 @@ +package eu.eudat.elastic.criteria; + +/** + * Created by ikalyvas on 7/5/2018. + */ +public abstract class Criteria { +} diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/DatasetCriteria.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/DatasetCriteria.java new file mode 100644 index 000000000..61a6ae3dc --- /dev/null +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/DatasetCriteria.java @@ -0,0 +1,20 @@ +package eu.eudat.elastic.criteria; + +import eu.eudat.elastic.entities.Tag; + +import java.util.List; + +/** + * Created by ikalyvas on 7/5/2018. + */ +public class DatasetCriteria extends Criteria { + public List tags; + + public List getTags() { + return tags; + } + + public void setTags(List tags) { + this.tags = tags; + } +} diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/TagCriteria.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/TagCriteria.java new file mode 100644 index 000000000..37a8f9861 --- /dev/null +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/criteria/TagCriteria.java @@ -0,0 +1,7 @@ +package eu.eudat.elastic.criteria; + +/** + * Created by ikalyvas on 7/5/2018. + */ +public class TagCriteria extends Criteria { +} diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Dataset.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Dataset.java new file mode 100644 index 000000000..2fca86b57 --- /dev/null +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Dataset.java @@ -0,0 +1,60 @@ +package eu.eudat.elastic.entities; + +import org.elasticsearch.common.xcontent.XContentBuilder; + +import java.io.IOException; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +/** + * Created by ikalyvas on 7/5/2018. + */ +public class Dataset implements ElasticEntity { + + private String id; + private List tags = new LinkedList<>(); + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public List getTags() { + return tags; + } + + public void setTags(List tags) { + this.tags = tags; + } + + @Override + public XContentBuilder toElasticEntity(XContentBuilder builder) throws IOException { + builder.startObject(); + builder.field("id", this.id); + builder.startArray("tags"); + this.tags.forEach(x -> { + try { + x.toElasticEntity(builder); + } catch (IOException e) { + e.printStackTrace(); + } + }); + builder.endArray(); + builder.endObject(); + return builder; + } + + @Override + public Dataset fromElasticEntity(Map fields) { + if (fields != null) { + this.id = (String) fields.get("id"); + this.tags = ((List) fields.get("tags")); + } + return this; + } + +} diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/ElasticEntity.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/ElasticEntity.java new file mode 100644 index 000000000..2f6b5f714 --- /dev/null +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/ElasticEntity.java @@ -0,0 +1,15 @@ +package eu.eudat.elastic.entities; + +import org.elasticsearch.common.document.DocumentField; +import org.elasticsearch.common.xcontent.XContentBuilder; + +import java.io.IOException; +import java.util.Map; + +/** + * Created by ikalyvas on 7/5/2018. + */ +public interface ElasticEntity { + XContentBuilder toElasticEntity(XContentBuilder builder) throws IOException; + T fromElasticEntity(Map fields); +} diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Tag.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Tag.java new file mode 100644 index 000000000..27e27a86f --- /dev/null +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/entities/Tag.java @@ -0,0 +1,45 @@ +package eu.eudat.elastic.entities; + +import org.elasticsearch.common.xcontent.XContentBuilder; + +import java.io.IOException; +import java.util.Map; + +/** + * Created by ikalyvas on 7/5/2018. + */ +public class Tag implements ElasticEntity { + + private String id; + private String name; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public XContentBuilder toElasticEntity(XContentBuilder builder) throws IOException { + builder.startObject(); + builder.field("id", this.id); + builder.field("name", this.name); + builder.endObject(); + return builder; + } + + @Override + public Object fromElasticEntity(Map fields) { + return null; + } +} diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DatasetRepository.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DatasetRepository.java new file mode 100644 index 000000000..c5be3055e --- /dev/null +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/DatasetRepository.java @@ -0,0 +1,72 @@ +package eu.eudat.elastic.repository; + +import eu.eudat.elastic.criteria.DatasetCriteria; +import eu.eudat.elastic.entities.Dataset; +import org.elasticsearch.action.admin.indices.get.GetIndexRequest; +import org.elasticsearch.action.get.GetRequest; +import org.elasticsearch.action.get.GetResponse; +import org.elasticsearch.action.index.IndexRequest; +import org.elasticsearch.action.search.SearchRequest; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.action.search.SearchType; +import org.elasticsearch.client.RestHighLevelClient; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentFactory; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.stream.Collectors; + +/** + * Created by ikalyvas on 7/5/2018. + */ +@Service("datasetRepository") +public class DatasetRepository extends ElasticRepository { + + @Autowired + public DatasetRepository(RestHighLevelClient client) { + super(client); + } + + @Override + public Dataset createOrUpdate(Dataset entity) throws IOException { + XContentBuilder builder = XContentFactory.jsonBuilder(); + IndexRequest request = new IndexRequest("datasets", "doc", entity.getId()).source(entity.toElasticEntity(builder)); + this.getClient().index(request); + return entity; + } + + @Override + public Dataset findDocument(String id) throws IOException { + GetRequest request = new GetRequest("datasets","doc",id); + GetResponse response = this.getClient().get(request); + return new Dataset().fromElasticEntity(response.getSourceAsMap()); + } + + @Override + public List query(DatasetCriteria criteria) throws ExecutionException, InterruptedException, IOException { + SearchRequest searchRequest = new SearchRequest(); + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + + BoolQueryBuilder boolQuery = QueryBuilders.boolQuery() + .should(QueryBuilders.termsQuery("tags.name.keyword", criteria.getTags().stream().map(x -> x.getName()).collect(Collectors.toList()))); + searchSourceBuilder.query(boolQuery); + searchRequest.source(searchSourceBuilder); + SearchResponse response = this.getClient().search(searchRequest); + return Arrays.stream(response.getHits().getHits()).map(x -> this.transformFromString(x.getSourceAsString(), Dataset.class)).collect(Collectors.toList()); + } + + @Override + public boolean exists() throws IOException { + GetIndexRequest request = new GetIndexRequest(); + request.indices("datasets"); + return this.getClient().indices().exists(request); + } +} diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/ElasticRepository.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/ElasticRepository.java new file mode 100644 index 000000000..90b9f3d36 --- /dev/null +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/ElasticRepository.java @@ -0,0 +1,36 @@ +package eu.eudat.elastic.repository; + +import com.fasterxml.jackson.databind.ObjectMapper; +import eu.eudat.elastic.criteria.Criteria; +import eu.eudat.elastic.entities.ElasticEntity; +import org.elasticsearch.client.Client; +import org.elasticsearch.client.RestClient; +import org.elasticsearch.client.RestHighLevelClient; + +import java.io.IOException; + +/** + * Created by ikalyvas on 7/5/2018. + */ +public abstract class ElasticRepository implements Repository { + private RestHighLevelClient client; + + public RestHighLevelClient getClient() { + return client; + } + + public ElasticRepository(RestHighLevelClient client) { + this.client = client; + } + + public T transformFromString(String value, Class tClass) { + ObjectMapper mapper = new ObjectMapper(); + T item = null; + try { + item = mapper.readValue(value, tClass); + } catch (IOException e) { + e.printStackTrace(); + } + return item; + } +} diff --git a/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/Repository.java b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/Repository.java new file mode 100644 index 000000000..22b98db46 --- /dev/null +++ b/dmp-backend/elastic/src/main/java/eu/eudat/elastic/repository/Repository.java @@ -0,0 +1,22 @@ +package eu.eudat.elastic.repository; + +import eu.eudat.elastic.criteria.Criteria; +import eu.eudat.elastic.entities.ElasticEntity; + +import java.io.IOException; +import java.util.List; +import java.util.concurrent.ExecutionException; + +/** + * Created by ikalyvas on 7/5/2018. + */ +public interface Repository { + + ET createOrUpdate(ET entity) throws IOException; + + ET findDocument(String id) throws IOException; + + List query(C criteria) throws ExecutionException, InterruptedException, IOException; + + boolean exists() throws IOException; +} diff --git a/dmp-backend/logging/src/main/java/eu/eudat/core/logger/Logger.java b/dmp-backend/logging/src/main/java/eu/eudat/core/logger/Logger.java index a89dc397e..86e5c74e1 100644 --- a/dmp-backend/logging/src/main/java/eu/eudat/core/logger/Logger.java +++ b/dmp-backend/logging/src/main/java/eu/eudat/core/logger/Logger.java @@ -1,5 +1,6 @@ package eu.eudat.core.logger; +import com.fasterxml.jackson.core.JsonProcessingException; import eu.eudat.core.models.exception.ApiExceptionLoggingModel; /** diff --git a/dmp-backend/logging/src/main/java/eu/eudat/core/logger/remote/http/HttpRemoteLogger.java b/dmp-backend/logging/src/main/java/eu/eudat/core/logger/remote/http/HttpRemoteLogger.java index 068606635..774fdff9a 100644 --- a/dmp-backend/logging/src/main/java/eu/eudat/core/logger/remote/http/HttpRemoteLogger.java +++ b/dmp-backend/logging/src/main/java/eu/eudat/core/logger/remote/http/HttpRemoteLogger.java @@ -1,5 +1,8 @@ package eu.eudat.core.logger.remote.http; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectWriter; import eu.eudat.core.logger.Logger; import eu.eudat.core.logger.common.AbstractBatchLogger; import eu.eudat.core.models.LoggingModel; @@ -88,9 +91,15 @@ public class HttpRemoteLogger extends AbstractBatchLogger implements Logger { @Override public void debug(T exception) { - ExceptionLoggingModel exceptionLoggingModel = new ExceptionLoggingModel<>(); - Map map = new HashMap<>(); - map.put("exception", exception); + ExceptionLoggingModel exceptionLoggingModel = new ExceptionLoggingModel(); + Map map = new HashMap<>(); + ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter(); + try { + String json = ow.writeValueAsString(exception); + map.put("exception", json); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } exceptionLoggingModel.setData(map); exceptionLoggingModel.setType(LoggingType.DEBUG); this.put(String.valueOf(exception.hashCode()), exceptionLoggingModel); @@ -98,9 +107,16 @@ public class HttpRemoteLogger extends AbstractBatchLogger implements Logger { @Override public void debug(T exception, String message) { - ExceptionLoggingModel exceptionLoggingModel = new ExceptionLoggingModel<>(); - Map map = new HashMap<>(); - map.put("exception", exception); + ExceptionLoggingModel exceptionLoggingModel = new ExceptionLoggingModel(); + Map map = new HashMap<>(); + ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter(); + try { + String json = ow.writeValueAsString(exception); + map.put("exception", json); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + exceptionLoggingModel.setData(map); exceptionLoggingModel.setMessage(message); exceptionLoggingModel.setType(LoggingType.DEBUG); @@ -134,9 +150,15 @@ public class HttpRemoteLogger extends AbstractBatchLogger implements Logger { @Override public void warn(T exception) { - ExceptionLoggingModel exceptionLoggingModel = new ExceptionLoggingModel<>(); - Map map = new HashMap<>(); - map.put("exception", exception); + ExceptionLoggingModel exceptionLoggingModel = new ExceptionLoggingModel(); + Map map = new HashMap<>(); + ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter(); + try { + String json = ow.writeValueAsString(exception); + map.put("exception", json); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } exceptionLoggingModel.setData(map); exceptionLoggingModel.setType(LoggingType.WARNING); this.put(String.valueOf(exception.hashCode()), exceptionLoggingModel); @@ -144,9 +166,15 @@ public class HttpRemoteLogger extends AbstractBatchLogger implements Logger { @Override public void warn(T exception, String message) { - ExceptionLoggingModel exceptionLoggingModel = new ExceptionLoggingModel<>(); - Map map = new HashMap<>(); - map.put("exception", exception); + ExceptionLoggingModel exceptionLoggingModel = new ExceptionLoggingModel(); + Map map = new HashMap<>(); + ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter(); + try { + String json = ow.writeValueAsString(exception); + map.put("exception", json); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } exceptionLoggingModel.setData(map); exceptionLoggingModel.setMessage(message); exceptionLoggingModel.setType(LoggingType.WARNING); @@ -180,9 +208,15 @@ public class HttpRemoteLogger extends AbstractBatchLogger implements Logger { @Override public void info(T exception) { - ExceptionLoggingModel exceptionLoggingModel = new ExceptionLoggingModel<>(); - Map map = new HashMap<>(); - map.put("exception", exception); + ExceptionLoggingModel exceptionLoggingModel = new ExceptionLoggingModel(); + Map map = new HashMap<>(); + ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter(); + try { + String json = ow.writeValueAsString(exception); + map.put("exception", json); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } exceptionLoggingModel.setData(map); exceptionLoggingModel.setType(LoggingType.INFO); this.put(String.valueOf(exception.hashCode()), exceptionLoggingModel); @@ -190,9 +224,15 @@ public class HttpRemoteLogger extends AbstractBatchLogger implements Logger { @Override public void info(T exception, String message) { - ExceptionLoggingModel exceptionLoggingModel = new ExceptionLoggingModel<>(); - Map map = new HashMap<>(); - map.put("exception", exception); + ExceptionLoggingModel exceptionLoggingModel = new ExceptionLoggingModel(); + Map map = new HashMap<>(); + ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter(); + try { + String json = ow.writeValueAsString(exception); + map.put("exception", json); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } exceptionLoggingModel.setData(map); exceptionLoggingModel.setMessage(message); exceptionLoggingModel.setType(LoggingType.INFO); @@ -214,9 +254,15 @@ public class HttpRemoteLogger extends AbstractBatchLogger implements Logger { @Override public void error(T exception) { - ExceptionLoggingModel exceptionLoggingModel = new ExceptionLoggingModel<>(); - Map map = new HashMap<>(); - map.put("exception", exception); + ExceptionLoggingModel exceptionLoggingModel = new ExceptionLoggingModel(); + Map map = new HashMap<>(); + ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter(); + try { + String json = ow.writeValueAsString(exception); + map.put("exception", json); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } exceptionLoggingModel.setData(map); exceptionLoggingModel.setType(LoggingType.ERROR); this.put(String.valueOf(exception.hashCode()), exceptionLoggingModel); @@ -224,9 +270,15 @@ public class HttpRemoteLogger extends AbstractBatchLogger implements Logger { @Override public void error(T exception, String message) { - ExceptionLoggingModel exceptionLoggingModel = new ExceptionLoggingModel<>(); - Map map = new HashMap<>(); - map.put("exception", exception); + ExceptionLoggingModel exceptionLoggingModel = new ExceptionLoggingModel(); + Map map = new HashMap<>(); + ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter(); + try { + String json = ow.writeValueAsString(exception); + map.put("exception", json); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } exceptionLoggingModel.setData(map); exceptionLoggingModel.setMessage(message); exceptionLoggingModel.setType(LoggingType.ERROR); diff --git a/dmp-backend/logging/src/main/java/eu/eudat/core/models/exception/ApiExceptionLoggingModel.java b/dmp-backend/logging/src/main/java/eu/eudat/core/models/exception/ApiExceptionLoggingModel.java index d1ca09db4..d8991a967 100644 --- a/dmp-backend/logging/src/main/java/eu/eudat/core/models/exception/ApiExceptionLoggingModel.java +++ b/dmp-backend/logging/src/main/java/eu/eudat/core/models/exception/ApiExceptionLoggingModel.java @@ -8,7 +8,7 @@ import java.util.Map; /** * Created by ikalyvas on 6/12/2018. */ -public class ApiExceptionLoggingModel extends LoggingModel> { +public class ApiExceptionLoggingModel extends LoggingModel { private HttpStatus code; private P user; private final String indexType = "api-exception-logging"; diff --git a/dmp-backend/logging/src/main/java/eu/eudat/core/models/exception/ExceptionLoggingModel.java b/dmp-backend/logging/src/main/java/eu/eudat/core/models/exception/ExceptionLoggingModel.java index 79cbf283f..815c8bfed 100644 --- a/dmp-backend/logging/src/main/java/eu/eudat/core/models/exception/ExceptionLoggingModel.java +++ b/dmp-backend/logging/src/main/java/eu/eudat/core/models/exception/ExceptionLoggingModel.java @@ -7,7 +7,7 @@ import java.util.Map; /** * Created by ikalyvas on 5/30/2018. */ -public class ExceptionLoggingModel extends LoggingModel> { +public class ExceptionLoggingModel extends LoggingModel> { private final String indexType = "exception-logging"; public String getIndexType() { @@ -15,7 +15,7 @@ public class ExceptionLoggingModel extends LoggingModel getData() { + public Map getData() { return super.getData(); } } diff --git a/dmp-backend/logging/target/logging-1.0-SNAPSHOT.jar b/dmp-backend/logging/target/logging-1.0-SNAPSHOT.jar deleted file mode 100644 index 202cbdeda..000000000 Binary files a/dmp-backend/logging/target/logging-1.0-SNAPSHOT.jar and /dev/null differ diff --git a/dmp-backend/logging/target/maven-archiver/pom.properties b/dmp-backend/logging/target/maven-archiver/pom.properties index 25cfea2ca..1129bc0a9 100644 --- a/dmp-backend/logging/target/maven-archiver/pom.properties +++ b/dmp-backend/logging/target/maven-archiver/pom.properties @@ -1,5 +1,5 @@ #Generated by Apache Maven -#Thu Jun 21 10:17:25 EEST 2018 +#Mon Jul 15 19:37:19 EEST 2019 version=1.0-SNAPSHOT groupId=dmp-backend artifactId=logging diff --git a/dmp-backend/logging/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/dmp-backend/logging/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index 206173e09..000000000 --- a/dmp-backend/logging/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1,11 +0,0 @@ -C:\Users\ikalyvas\Documents\OpenAIRE-EUDAT-DMP-service-pilot\dmp-backend\logging\src\main\java\eu\eudat\core\models\exception\ApiExceptionLoggingModel.java -C:\Users\ikalyvas\Documents\OpenAIRE-EUDAT-DMP-service-pilot\dmp-backend\logging\src\main\java\types\LoggingOutputType.java -C:\Users\ikalyvas\Documents\OpenAIRE-EUDAT-DMP-service-pilot\dmp-backend\logging\src\main\java\eu\eudat\core\models\AuditModel.java -C:\Users\ikalyvas\Documents\OpenAIRE-EUDAT-DMP-service-pilot\dmp-backend\logging\src\main\java\eu\eudat\core\models\LoggingModel.java -C:\Users\ikalyvas\Documents\OpenAIRE-EUDAT-DMP-service-pilot\dmp-backend\logging\src\main\java\eu\eudat\core\models\simple\SimpleAuditModel.java -C:\Users\ikalyvas\Documents\OpenAIRE-EUDAT-DMP-service-pilot\dmp-backend\logging\src\main\java\eu\eudat\core\logger\common\AbstractBatchLogger.java -C:\Users\ikalyvas\Documents\OpenAIRE-EUDAT-DMP-service-pilot\dmp-backend\logging\src\main\java\eu\eudat\core\models\simple\SimpleLoggingModel.java -C:\Users\ikalyvas\Documents\OpenAIRE-EUDAT-DMP-service-pilot\dmp-backend\logging\src\main\java\eu\eudat\core\logger\remote\http\HttpRemoteLogger.java -C:\Users\ikalyvas\Documents\OpenAIRE-EUDAT-DMP-service-pilot\dmp-backend\logging\src\main\java\eu\eudat\core\logger\Logger.java -C:\Users\ikalyvas\Documents\OpenAIRE-EUDAT-DMP-service-pilot\dmp-backend\logging\src\main\java\eu\eudat\core\models\exception\ExceptionLoggingModel.java -C:\Users\ikalyvas\Documents\OpenAIRE-EUDAT-DMP-service-pilot\dmp-backend\logging\src\main\java\types\LoggingType.java diff --git a/dmp-backend/pom.xml b/dmp-backend/pom.xml index 14d450858..deaaf8885 100644 --- a/dmp-backend/pom.xml +++ b/dmp-backend/pom.xml @@ -18,7 +18,7 @@ web data logging - + elastic @@ -65,6 +65,19 @@ org.springframework.boot spring-boot-starter-data-jpa + + + + org.elasticsearch + elasticsearch + 6.3.1 + + + + org.elasticsearch.client + elasticsearch-rest-high-level-client + 6.3.1 + org.hibernate hibernate-core @@ -127,20 +140,20 @@ org.apache.poi poi-ooxml - 3.15 + 4.0.0 org.apache.poi poi - 3.15 + 4.0.0 org.apache.xmlgraphics fop - 2.2 + 2.3 @@ -172,6 +185,11 @@ hibernate-jpamodelgen + + org.elasticsearch.client + transport + 6.3.0 + @@ -188,7 +206,7 @@ production - war + jar diff --git a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/QueryableList.java b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/QueryableList.java index a3656d7a3..f11c15876 100644 --- a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/QueryableList.java +++ b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/QueryableList.java @@ -4,8 +4,11 @@ import eu.eudat.queryable.jpa.predicates.*; import eu.eudat.queryable.queryableentity.DataEntity; import eu.eudat.queryable.types.SelectionField; +import javax.persistence.TypedQuery; +import javax.persistence.criteria.Expression; import javax.persistence.criteria.Subquery; import java.util.List; +import java.util.Map; import java.util.concurrent.CompletableFuture; public interface QueryableList { @@ -17,8 +20,12 @@ public interface QueryableList { List toList(); + void update(EntitySelectPredicate selectPredicate, V value); + QueryableList withFields(List fields); + List toListWithFields(); + CompletableFuture> toListAsync(); T getSingle(); @@ -45,6 +52,8 @@ public interface QueryableList { CompletableFuture countAsync(); + Subquery query(List fields); + Subquery subQuery(SinglePredicate predicate, List fields); Subquery subQuery(NestedQuerySinglePredicate predicate, List fields); @@ -53,7 +62,7 @@ public interface QueryableList { Subquery subQueryCount(SinglePredicate predicate, List fields); - QueryableList initSubQuery(Class uClass); + QueryableList initSubQuery(Class uClass); Subquery subQueryMax(SinglePredicate predicate, List fields, Class uClass); diff --git a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/collector/Collector.java b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/collector/Collector.java new file mode 100644 index 000000000..5de816bab --- /dev/null +++ b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/collector/Collector.java @@ -0,0 +1,29 @@ +package eu.eudat.queryable.collector; + +import javax.persistence.Tuple; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class Collector { + + public List buildFromTuple(List results, Map> groupedResults, List fields, String key) { + return groupedResults.keySet().stream() + .map(x -> buildOne(groupedResults.get(x), fields, key)) + .collect(Collectors.toList()); + } + + private Map buildOne(List tuples, List fields, String key) { + Map tupleValues = new LinkedHashMap(); + List projectionFields = fields.stream() + .map(x -> x.split("\\.")) + .collect(Collectors.groupingBy(x -> x[0])) + .values() + .stream() + .map(field -> new ProjectionField(field.stream().map(x -> String.join(".", x)).collect(Collectors.toList()), null)) + .collect(Collectors.toList()); + projectionFields.forEach(x -> x.collect(tupleValues, tuples)); + return tupleValues; + } +} diff --git a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/collector/ProjectionField.java b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/collector/ProjectionField.java new file mode 100644 index 000000000..d76e33c0c --- /dev/null +++ b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/collector/ProjectionField.java @@ -0,0 +1,107 @@ +package eu.eudat.queryable.collector; + +import com.google.common.collect.Lists; + +import javax.persistence.Tuple; +import java.util.*; +import java.util.stream.Collectors; + +public class ProjectionField { + private String key; + private List fields; + private ProjectionField parent; + + public ProjectionField(List field, ProjectionField parent) { + this.parse(field); + this.parent = parent; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public List getFields() { + return fields; + } + + public void setFields(List fields) { + this.fields = fields; + } + + private void parse(List fields) { + String[] fieldsArr = fields.get(0).split("\\."); + this.key = fieldsArr[0]; + this.fields = fields.stream() + .map(x -> x.replace(x.contains(".") ? this.key + "." : this.key, "")) + .filter(x -> !x.isEmpty()) + .map(x -> x.split("\\.")) + .collect(Collectors.groupingBy(x -> x[0])) + .values() + .stream() + .map(field -> new ProjectionField(field.stream().map(x -> String.join(".", x)).collect(Collectors.toList()), this)) + .collect(Collectors.toList()); + } + + public Map collect(Map map, List tuples) { + if (fields != null && !fields.isEmpty()) { + this.collect(map, this.fields, tuples); + } else { + map.put(key, this.createObject(tuples, this.generatePath())); + } + return map; + } + + public Map collect(Map map, List projectionGroup, List tuples) { + map.put(key, this.createObject(tuples, projectionGroup)); + return map; + } + + private String generatePath() { + List list = new LinkedList<>(); + ProjectionField current = this; + list.add(current.key); + while (current.parent != null) { + list.add(current.parent.key); + current = current.parent; + } + return String.join(".", Lists.reverse(list)); + } + + private Object createObject(List tuples, String field) { + List values = tuples.stream() + .map(x -> x.get(field)) + .distinct() + .collect(Collectors.toList()); + + if (values.size() > 1) { + return values.stream().map(x -> { + Map map = new LinkedHashMap(); + map.put(field, x); + return map; + }).collect(Collectors.toList()); + } else if (values.size() == 1) { + return values.get(0); + } else return null; + } + + private Object createObject(List tuples, List group) { + Collection values = tuples.stream() + .map(x -> getValuesFrom(tuples, x, group)) + .collect(Collectors.toMap(x -> x.get("id"), x -> x, (x, y) -> x)).values(); + return values; + } + + private Map getValuesFrom(List tuples, Tuple tuple, List group) { + Map map = new LinkedHashMap(); + group.forEach(x -> { + if (x.fields != null && !x.fields.isEmpty()) + map.put(x.key, this.createObject(tuples, x.fields)); + else map.put(x.key, tuple.get(x.generatePath())); + }); + return map; + } +} diff --git a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/hibernatequeryablelist/QueryableHibernateList.java b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/hibernatequeryablelist/QueryableHibernateList.java index 7d11da36d..cb2f44ce8 100644 --- a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/hibernatequeryablelist/QueryableHibernateList.java +++ b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/hibernatequeryablelist/QueryableHibernateList.java @@ -1,326 +1,466 @@ package eu.eudat.queryable.jpa.hibernatequeryablelist; import eu.eudat.queryable.QueryableList; +import eu.eudat.queryable.collector.Collector; import eu.eudat.queryable.exceptions.NotSingleResultException; import eu.eudat.queryable.jpa.predicates.*; import eu.eudat.queryable.queryableentity.DataEntity; import eu.eudat.queryable.types.FieldSelectionType; import eu.eudat.queryable.types.SelectionField; +import org.springframework.scheduling.annotation.Async; import javax.persistence.EntityManager; +import javax.persistence.Tuple; import javax.persistence.TypedQuery; import javax.persistence.criteria.*; -import java.util.Arrays; -import java.util.LinkedList; -import java.util.List; -import java.util.Set; +import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; public class QueryableHibernateList implements QueryableList { - private EntityManager manager; - private CriteriaQuery query; - private Class tClass; - private Root root; - private Root nestedQueryRoot; - private Subquery subquery; - private List> singlePredicates = new LinkedList<>(); - private List> nestedPredicates = new LinkedList<>(); - private boolean distinct = false; - private List> orderings = new LinkedList<>(); - private List fields = new LinkedList<>(); - private Integer length; - private Integer offset; - private Set hints; - private String hint; + private Collector collector = new Collector(); + private EntityManager manager; + private CriteriaQuery query; + private Class tClass; + private Root root; + private Root nestedQueryRoot; + private Subquery subquery; + private List> singlePredicates = new LinkedList<>(); + private List> nestedPredicates = new LinkedList<>(); + private boolean distinct = false; + private List> orderings = new LinkedList<>(); + private List fields = new LinkedList<>(); + private Integer length; + private Integer offset; + private Set hints; + private String hint; + private Map joinsMap = new HashMap<>(); - public QueryableHibernateList(EntityManager manager, Class tClass) { - this.manager = manager; - this.tClass = tClass; - } + public QueryableHibernateList(EntityManager manager, Class tClass) { + this.manager = manager; + this.tClass = tClass; + } - public QueryableHibernateList setManager(EntityManager manager) { - this.manager = manager; - return this; - } + public QueryableHibernateList setManager(EntityManager manager) { + this.manager = manager; + return this; + } - public QueryableList withHint(String hint) { - this.hint = hint; - return this; - } + public QueryableList withHint(String hint) { + this.hint = hint; + return this; + } - @Override - public QueryableList withFields(List fields) { - this.fields = fields; - return this; - } + @Override + public QueryableList withFields(List fields) { + this.fields = fields; + return this; + } - private QueryableList selectFields() { - List rootFields = fields.stream().map(field -> root.get(field)).collect(Collectors.toList()); - this.query.select(this.manager.getCriteriaBuilder().construct(tClass, rootFields.toArray(new Selection[rootFields.size()]))); - return this; - } + private QueryableList selectFields() { + List rootFields = fields.stream().map(field -> this.convertFieldToPath(field)).filter(x -> x != null).collect(Collectors.toList()); + this.query.select(this.manager.getCriteriaBuilder().tuple(rootFields.toArray(new Selection[rootFields.size()]))); + return this; + } - public QueryableHibernateList setEntity(Class type) { - CriteriaBuilder builder = this.manager.getCriteriaBuilder(); - this.query = builder.createQuery(type); - this.root = this.query.from(this.tClass); - return this; - } + private Path convertFieldToPath(String field) { + if (!field.contains(".")) { + Path path = this.root.get(field); + path.alias(field); + return path; + } else { + String[] fields = field.split("\\."); + Path path = this.root.get(fields[0]); + Join join = null; + path.alias(fields[0]); + for (int i = 1; i < fields.length; i++) { + join = join != null ? join.join(fields[i - 1], JoinType.LEFT) : this.getJoin(fields[i - 1], JoinType.LEFT); + path = join.get(fields[i]); + path.alias(String.join(".", Arrays.asList(fields).subList(0, i + 1))); + } + return path; + } + } - public void initiateQueryableList(Class type) { - CriteriaBuilder builder = this.manager.getCriteriaBuilder(); - this.query = builder.createQuery(type); - } + private Join getJoin(String field, String path, Join joined, JoinType type) { + if (this.joinsMap.containsKey(path)) return this.joinsMap.get(path); + Join join = joined.join(path, type); + this.joinsMap.put(path, join); + return join; + } - @Override - public QueryableList skip(Integer offset) { - this.offset = offset; - return this; - } + private Join getJoin(String field, JoinType type) { + if (this.joinsMap.containsKey(field)) return this.joinsMap.get(field); + Join join = this.root.join(field, type); + this.joinsMap.put(field, join); + return join; + } - @Override - public QueryableList take(Integer length) { - this.length = length; - return this; - } + public QueryableHibernateList setEntity(Class type) { - public QueryableList where(SinglePredicate predicate) { - this.singlePredicates.add(predicate); - return this; - } + return this; + } - public QueryableList where(NestedQuerySinglePredicate predicate) { - this.nestedPredicates.add(predicate); - return this; - } + public void initiateQueryableList(Class type) { + CriteriaBuilder builder = this.manager.getCriteriaBuilder(); + this.query = builder.createQuery(type); + } - public List select(SelectPredicate predicate) { - return this.toList().stream().map(item -> predicate.applySelection(item)).collect(Collectors.toList()); - } + @Override + public QueryableList skip(Integer offset) { + this.offset = offset; + return this; + } - public CompletableFuture> selectAsync(SelectPredicate predicate) { - return this.toListAsync().thenApplyAsync(items -> items.stream().map(item -> predicate.applySelection(item)).collect(Collectors.toList())); - } + @Override + public QueryableList take(Integer length) { + this.length = length; + return this; + } - public QueryableList distinct() { - this.distinct = true; - return this; - } + public QueryableList where(SinglePredicate predicate) { + this.singlePredicates.add(predicate); + return this; + } - public QueryableList orderBy(OrderByPredicate predicate) { - this.orderings.add(predicate); - return this; - } + public QueryableList where(NestedQuerySinglePredicate predicate) { + this.nestedPredicates.add(predicate); + return this; + } - public Long count() { - CriteriaBuilder criteriaBuilder = this.manager.getCriteriaBuilder(); - CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class); - this.root = criteriaQuery.from(tClass); - if (distinct) criteriaQuery.select(criteriaBuilder.countDistinct(this.root.get("id"))); - else criteriaQuery.select(criteriaBuilder.count(this.root)); - criteriaQuery.where(this.generateWherePredicates(this.singlePredicates, this.root, this.nestedPredicates, this.nestedQueryRoot)); - //if (distinct) criteriaQuery.distinct(true); - return this.manager.createQuery(criteriaQuery).getSingleResult(); - } + public List select(SelectPredicate predicate) { + return this.toList().stream().map(item -> predicate.applySelection(item)).collect(Collectors.toList()); + } - public CompletableFuture countAsync() { - CriteriaBuilder criteriaBuilder = this.manager.getCriteriaBuilder(); - CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class); - this.root = criteriaQuery.from(tClass); - if (distinct) criteriaQuery.select(criteriaBuilder.countDistinct(this.root.get("id"))); - else criteriaQuery.select(criteriaBuilder.count(this.root)); - criteriaQuery.where(this.generateWherePredicates(this.singlePredicates, this.root, this.nestedPredicates, this.nestedQueryRoot)); - //if (distinct) criteriaQuery.distinct(true); - return CompletableFuture.supplyAsync(() -> this.manager.createQuery(criteriaQuery).getSingleResult()); - } + public CompletableFuture> selectAsync(SelectPredicate predicate) { + return this.toListAsync().thenApplyAsync(items -> items.stream().map(item -> predicate.applySelection(item)).collect(Collectors.toList())); + } + + public QueryableList distinct() { + this.distinct = true; + return this; + } + + public QueryableList orderBy(OrderByPredicate predicate) { + this.orderings.add(predicate); + return this; + } + + public Long count() { + CriteriaBuilder criteriaBuilder = this.manager.getCriteriaBuilder(); + CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class); + this.root = criteriaQuery.from(tClass); + if (distinct) criteriaQuery.select(criteriaBuilder.countDistinct(this.root.get("id"))); + else criteriaQuery.select(criteriaBuilder.count(this.root)); + criteriaQuery.where(this.generateWherePredicates(this.singlePredicates, this.root, this.nestedPredicates, this.nestedQueryRoot)); + //if (distinct) criteriaQuery.distinct(true); + return this.manager.createQuery(criteriaQuery).getSingleResult(); + } + + @Async + public CompletableFuture countAsync() { + CriteriaBuilder criteriaBuilder = this.manager.getCriteriaBuilder(); + CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Long.class); + this.root = criteriaQuery.from(tClass); + if (distinct) criteriaQuery.select(criteriaBuilder.countDistinct(this.root.get("id"))); + else criteriaQuery.select(criteriaBuilder.count(this.root)); + criteriaQuery.where(this.generateWherePredicates(this.singlePredicates, this.root, this.nestedPredicates, this.nestedQueryRoot)); + //if (distinct) criteriaQuery.distinct(true); + return CompletableFuture.supplyAsync(() -> this.manager.createQuery(criteriaQuery).getSingleResult()); + } - private Predicate[] generateWherePredicates(List> singlePredicates, Root root, List> nestedPredicates, Root nestedQueryRoot) { - List predicates = new LinkedList<>(); - predicates.addAll(Arrays.asList(this.generateSingleWherePredicates(singlePredicates, root))); - predicates.addAll(Arrays.asList(this.generateNestedWherePredicates(nestedPredicates, root, nestedQueryRoot))); - return predicates.toArray(new Predicate[predicates.size()]); - } + private Predicate[] generateWherePredicates(List> singlePredicates, Root root, List> nestedPredicates, Root nestedQueryRoot) { + List predicates = new LinkedList<>(); + predicates.addAll(Arrays.asList(this.generateSingleWherePredicates(singlePredicates, root))); + predicates.addAll(Arrays.asList(this.generateNestedWherePredicates(nestedPredicates, root, nestedQueryRoot))); + return predicates.toArray(new Predicate[predicates.size()]); + } - private Predicate[] generateSingleWherePredicates(List> singlePredicates, Root root) { - List predicates = new LinkedList<>(); - for (SinglePredicate singlePredicate : singlePredicates) { - predicates.add(singlePredicate.applyPredicate(this.manager.getCriteriaBuilder(), root)); - } - return predicates.toArray(new Predicate[predicates.size()]); - } + private Predicate[] generateSingleWherePredicates(List> singlePredicates, Root root) { + List predicates = new LinkedList<>(); + for (SinglePredicate singlePredicate : singlePredicates) { + predicates.add(singlePredicate.applyPredicate(this.manager.getCriteriaBuilder(), root)); + } + return predicates.toArray(new Predicate[predicates.size()]); + } - private Predicate[] generateNestedWherePredicates(List> nestedPredicates, Root root, Root nestedQueryRoot) { - List predicates = new LinkedList<>(); - for (NestedQuerySinglePredicate singlePredicate : nestedPredicates) { - predicates.add(singlePredicate.applyPredicate(this.manager.getCriteriaBuilder(), root, nestedQueryRoot)); - } - return predicates.toArray(new Predicate[predicates.size()]); - } + private Predicate[] generateNestedWherePredicates(List> nestedPredicates, Root root, Root nestedQueryRoot) { + List predicates = new LinkedList<>(); + for (NestedQuerySinglePredicate singlePredicate : nestedPredicates) { + predicates.add(singlePredicate.applyPredicate(this.manager.getCriteriaBuilder(), root, nestedQueryRoot)); + } + return predicates.toArray(new Predicate[predicates.size()]); + } - private Order[] generateOrderPredicates(List> orderByPredicates, Root root) { - List predicates = new LinkedList<>(); - for (OrderByPredicate orderPredicate : orderByPredicates) { - predicates.add(orderPredicate.applyPredicate(this.manager.getCriteriaBuilder(), root)); - } - return predicates.toArray(new Order[predicates.size()]); - } + private Order[] generateOrderPredicates(List> orderByPredicates, Root root) { + List predicates = new LinkedList<>(); + for (OrderByPredicate orderPredicate : orderByPredicates) { + predicates.add(orderPredicate.applyPredicate(this.manager.getCriteriaBuilder(), root)); + } + return predicates.toArray(new Order[predicates.size()]); + } - public List toList() { - this.query.where(this.generateWherePredicates(this.singlePredicates, this.root, this.nestedPredicates, this.nestedQueryRoot)); - if (!this.orderings.isEmpty()) this.query.orderBy(this.generateOrderPredicates(this.orderings, this.root)); - if (this.fields != null && !this.fields.isEmpty()) this.selectFields(); - if (distinct) this.query.distinct(true); - TypedQuery typedQuery = this.manager.createQuery(this.query); - if (this.offset != null) typedQuery.setFirstResult(this.offset); - if (this.length != null) typedQuery.setMaxResults(this.length); - if (this.hint != null) { - List ids = typedQuery.getResultList().stream().map(item -> item.getKeys()).collect(Collectors.toList()); - if (ids != null && !ids.isEmpty()) typedQuery = queryWithHint(ids); - } - return typedQuery.getResultList(); - } + public List toList() { + CriteriaBuilder builder = this.manager.getCriteriaBuilder(); + if (!this.fields.isEmpty()) this.query = builder.createTupleQuery(); + else this.query = builder.createQuery(this.tClass); + this.root = this.query.from(this.tClass); + this.query.where(this.generateWherePredicates(this.singlePredicates, this.root, this.nestedPredicates, this.nestedQueryRoot)); + if (!this.orderings.isEmpty()) this.query.orderBy(this.generateOrderPredicates(this.orderings, this.root)); + if (!this.fields.isEmpty()) this.selectFields(); + if (distinct) this.query.distinct(true); + //if (!this.fields.isEmpty()) return this.toListWithFields(); + return this.toListWithOutFields(); + } - public CompletableFuture> toListAsync() { - this.query.where(this.generateWherePredicates(this.singlePredicates, this.root, this.nestedPredicates, this.nestedQueryRoot)); - if (!this.orderings.isEmpty()) this.query.orderBy(this.generateOrderPredicates(this.orderings, this.root)); - if (this.fields != null && !this.fields.isEmpty()) this.selectFields(); - if (distinct) this.query.distinct(true); - TypedQuery typedQuery = this.manager.createQuery(this.query); - if (this.offset != null) typedQuery.setFirstResult(this.offset); - if (this.length != null) typedQuery.setMaxResults(this.length); - return CompletableFuture.supplyAsync(() -> { - if (this.hint != null) { - List ids = typedQuery.getResultList().stream().map(item -> item.getKeys()).collect(Collectors.toList()); - if (ids != null && !ids.isEmpty()) return queryWithHint(ids).getResultList(); - } - return typedQuery.getResultList(); - }); - } + public List toListWithFields() { + CriteriaBuilder builder = this.manager.getCriteriaBuilder(); + if (!this.fields.isEmpty()) this.query = builder.createTupleQuery(); + else this.query = builder.createQuery(this.tClass); + this.root = this.query.from(this.tClass); + this.query.where(this.generateWherePredicates(this.singlePredicates, this.root, this.nestedPredicates, this.nestedQueryRoot)); + if (!this.orderings.isEmpty()) this.query.orderBy(this.generateOrderPredicates(this.orderings, this.root)); + if (!this.fields.isEmpty()) this.selectFields(); + if (distinct) this.query.distinct(true); + List results = this.manager.createQuery(query).getResultList(); + Map> groupedResults = results.stream() + .collect(Collectors.groupingBy(x -> x.get("id"))); + return this.collector.buildFromTuple(results, groupedResults, this.fields, "id"); + } - public T getSingle() { - this.query.where(this.generateWherePredicates(this.singlePredicates, this.root, this.nestedPredicates, this.nestedQueryRoot)); - if (this.fields != null && !this.fields.isEmpty()) this.selectFields(); - TypedQuery typedQuery = this.manager.createQuery(this.query); - if (this.hint != null) - typedQuery.setHint("javax.persistence.fetchgraph", this.manager.getEntityGraph(this.hint)); - return typedQuery.getSingleResult(); - } + private List toListWithOutFields() { + TypedQuery typedQuery = this.manager.createQuery(this.query); + if (this.offset != null) typedQuery.setFirstResult(this.offset); + if (this.length != null) typedQuery.setMaxResults(this.length); + if (this.hint != null) { + List ids = typedQuery.getResultList().stream().map(item -> item.getKeys()).collect(Collectors.toList()); + if (ids != null && !ids.isEmpty()) typedQuery = queryWithHint(ids); + } + return typedQuery.getResultList(); + } - public CompletableFuture getSingleAsync() { - this.query.where(this.generateWherePredicates(this.singlePredicates, this.root, this.nestedPredicates, this.nestedQueryRoot)); - if (this.fields != null && !this.fields.isEmpty()) this.selectFields(); - TypedQuery typedQuery = this.manager.createQuery(this.query); - if (this.hint != null) - typedQuery.setHint("javax.persistence.fetchgraph", this.manager.getEntityGraph(this.hint)); - return CompletableFuture.supplyAsync(() -> typedQuery.getSingleResult()); - } + @Async + public CompletableFuture> toListAsync() { + CriteriaBuilder builder = this.manager.getCriteriaBuilder(); + if (!this.fields.isEmpty()) this.query = builder.createTupleQuery(); + else this.query = builder.createQuery(this.tClass); + this.root = this.query.from(this.tClass); + this.query.where(this.generateWherePredicates(this.singlePredicates, this.root, this.nestedPredicates, this.nestedQueryRoot)); + if (!this.orderings.isEmpty()) this.query.orderBy(this.generateOrderPredicates(this.orderings, this.root)); + if (!this.fields.isEmpty()) this.selectFields(); + if (distinct) this.query.distinct(true); + if (!this.fields.isEmpty()) return this.toListAsyncWithFields(); + else return this.toListAsyncWithOutFields(); + } - public T getSingleOrDefault() { - this.query.where(this.generateWherePredicates(this.singlePredicates, this.root, this.nestedPredicates, this.nestedQueryRoot)); - if (this.fields != null && !this.fields.isEmpty()) this.selectFields(); - TypedQuery typedQuery = this.manager.createQuery(this.query); - if (this.hint != null) - typedQuery.setHint("javax.persistence.fetchgraph", this.manager.getEntityGraph(this.hint)); - List results = typedQuery.getResultList(); - if (results.size() == 0) return null; - if (results.size() == 1) return results.get(0); - else throw new NotSingleResultException("Query returned more than one items"); - } + @Async + private CompletableFuture> toListAsyncWithFields() { + List results = this.manager.createQuery(query).getResultList(); + Map> groupedResults = results.stream() + .collect(Collectors.groupingBy(x -> x.get("id"))); + return CompletableFuture.supplyAsync(() -> results.stream().map(x -> { + try { + return (T) this.tClass.newInstance().buildFromTuple(groupedResults.get(x.get("id")), this.fields, ""); + } catch (InstantiationException | IllegalAccessException e) { + e.printStackTrace(); + } + return null; + }).collect(Collectors.toList())); + } - public CompletableFuture getSingleOrDefaultAsync() { - this.query.where(this.generateWherePredicates(this.singlePredicates, this.root, this.nestedPredicates, this.nestedQueryRoot)); - if (this.fields != null && !this.fields.isEmpty()) this.selectFields(); - TypedQuery typedQuery = this.manager.createQuery(this.query); - if (this.hint != null) - typedQuery.setHint("javax.persistence.fetchgraph", this.manager.getEntityGraph(this.hint)); - return CompletableFuture.supplyAsync(() -> typedQuery.getResultList()).thenApply(list -> { - if (list.size() == 0) return null; - if (list.size() == 1) return list.get(0); - else throw new NotSingleResultException("Query returned more than one items"); - }); - } + @Async + private CompletableFuture> toListAsyncWithOutFields() { + TypedQuery typedQuery = this.manager.createQuery(this.query); + if (this.offset != null) typedQuery.setFirstResult(this.offset); + if (this.length != null) typedQuery.setMaxResults(this.length); + return CompletableFuture.supplyAsync(() -> { + if (this.hint != null) { + List ids = typedQuery.getResultList().stream().map(item -> item.getKeys()).collect(Collectors.toList()); + if (ids != null && !ids.isEmpty()) return queryWithHint(ids).getResultList(); + } + return typedQuery.getResultList(); + }); + } - private TypedQuery queryWithHint(List ids) { - CriteriaBuilder criteriaBuilder = this.manager.getCriteriaBuilder(); - CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(tClass); - Root criteriaRoot = criteriaQuery.from(this.tClass); - criteriaQuery.where(criteriaRoot.get("id").in(ids)); - if (!this.orderings.isEmpty()) - criteriaQuery.orderBy(this.generateOrderPredicates(this.orderings, criteriaRoot)); + public T getSingle() { + CriteriaBuilder builder = this.manager.getCriteriaBuilder(); + if (!this.fields.isEmpty()) this.query = builder.createTupleQuery(); + else this.query = builder.createQuery(this.tClass); + this.root = this.query.from(this.tClass); + this.query.where(this.generateWherePredicates(this.singlePredicates, this.root, this.nestedPredicates, this.nestedQueryRoot)); + if (!this.fields.isEmpty()) this.selectFields(); + TypedQuery typedQuery = this.manager.createQuery(this.query); + if (this.hint != null) + typedQuery.setHint("javax.persistence.fetchgraph", this.manager.getEntityGraph(this.hint)); + return typedQuery.getSingleResult(); + } - TypedQuery typedQuery = this.manager.createQuery(criteriaQuery); - typedQuery.setHint("javax.persistence.fetchgraph", this.manager.getEntityGraph(this.hint)); - return typedQuery; - } + @Async + public CompletableFuture getSingleAsync() { + CriteriaBuilder builder = this.manager.getCriteriaBuilder(); + if (!this.fields.isEmpty()) this.query = builder.createTupleQuery(); + else this.query = builder.createQuery(this.tClass); + this.root = this.query.from(this.tClass); + this.query.where(this.generateWherePredicates(this.singlePredicates, this.root, this.nestedPredicates, this.nestedQueryRoot)); + if (!this.fields.isEmpty()) this.selectFields(); + TypedQuery typedQuery = this.manager.createQuery(this.query); + if (this.hint != null) + typedQuery.setHint("javax.persistence.fetchgraph", this.manager.getEntityGraph(this.hint)); + return CompletableFuture.supplyAsync(() -> typedQuery.getSingleResult()); + } - @Override - public Subquery subQuery(SinglePredicate predicate, List fields) { - Subquery subquery = this.manager.getCriteriaBuilder().createQuery().subquery(this.tClass); - this.nestedQueryRoot = subquery.from(this.tClass); - subquery.where(predicate.applyPredicate(this.manager.getCriteriaBuilder(), this.nestedQueryRoot)); - subquery.select(this.nestedQueryRoot.get(fields.get(0).getField())); - return subquery; - } + public T getSingleOrDefault() { + CriteriaBuilder builder = this.manager.getCriteriaBuilder(); + if (!this.fields.isEmpty()) this.query = builder.createTupleQuery(); + else this.query = builder.createQuery(this.tClass); + this.root = this.query.from(this.tClass); + this.query.where(this.generateWherePredicates(this.singlePredicates, this.root, this.nestedPredicates, this.nestedQueryRoot)); + if (!this.fields.isEmpty()) this.selectFields(); + TypedQuery typedQuery = this.manager.createQuery(this.query); + if (this.hint != null) + typedQuery.setHint("javax.persistence.fetchgraph", this.manager.getEntityGraph(this.hint)); + List results = typedQuery.getResultList(); + if (results.size() == 0) return null; + if (results.size() == 1) return results.get(0); + else throw new NotSingleResultException("Query returned more than one items"); + } - @Override - public Subquery subQuery(NestedQuerySinglePredicate predicate, List fields) { - Subquery subquery = this.manager.getCriteriaBuilder().createQuery().subquery(this.tClass); - this.nestedQueryRoot = subquery.from(this.tClass); - subquery.where(predicate.applyPredicate(this.manager.getCriteriaBuilder(), this.root, this.nestedQueryRoot)); - subquery.select(this.nestedQueryRoot.get(fields.get(0).getField())); - return subquery; - } + @Async + public CompletableFuture getSingleOrDefaultAsync() { + CriteriaBuilder builder = this.manager.getCriteriaBuilder(); + if (!this.fields.isEmpty()) this.query = builder.createTupleQuery(); + else this.query = builder.createQuery(this.tClass); + this.root = this.query.from(this.tClass); + this.query.where(this.generateWherePredicates(this.singlePredicates, this.root, this.nestedPredicates, this.nestedQueryRoot)); + if (!this.fields.isEmpty()) this.selectFields(); + TypedQuery typedQuery = this.manager.createQuery(this.query); + if (this.hint != null) + typedQuery.setHint("javax.persistence.fetchgraph", this.manager.getEntityGraph(this.hint)); + return CompletableFuture.supplyAsync(() -> typedQuery.getResultList()).thenApply(list -> { + if (list.size() == 0) return null; + if (list.size() == 1) return list.get(0); + else throw new NotSingleResultException("Query returned more than one items"); + }); + } - @Override - public Subquery subQueryCount(SinglePredicate predicate, List fields) { - Subquery subquery = this.manager.getCriteriaBuilder().createQuery().subquery(Long.class); - this.nestedQueryRoot = subquery.from(this.tClass); - subquery.where(predicate.applyPredicate(this.manager.getCriteriaBuilder(), this.nestedQueryRoot)); - subquery.select(this.manager.getCriteriaBuilder().count(this.nestedQueryRoot.get(fields.get(0).getField()))); - return subquery; - } + private TypedQuery queryWithHint(List ids) { + CriteriaBuilder criteriaBuilder = this.manager.getCriteriaBuilder(); + CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(tClass); + Root criteriaRoot = criteriaQuery.from(this.tClass); + criteriaQuery.where(criteriaRoot.get("id").in(ids)); + if (!this.orderings.isEmpty()) + criteriaQuery.orderBy(this.generateOrderPredicates(this.orderings, criteriaRoot)); - @Override - public Subquery subQueryCount(NestedQuerySinglePredicate predicate, List fields) { - Subquery subquery = this.manager.getCriteriaBuilder().createQuery().subquery(Long.class); - this.nestedQueryRoot = subquery.from(this.tClass); - subquery.where(predicate.applyPredicate(this.manager.getCriteriaBuilder(), this.root, this.nestedQueryRoot)); - subquery.select(this.manager.getCriteriaBuilder().count(this.nestedQueryRoot.get(fields.get(0).getField()))); - return subquery; - } + TypedQuery typedQuery = this.manager.createQuery(criteriaQuery); + typedQuery.setHint("javax.persistence.fetchgraph", this.manager.getEntityGraph(this.hint)); + return typedQuery; + } - @Override - public Subquery subQueryMax(SinglePredicate predicate, List fields, Class uClass) { - Subquery subquery = this.manager.getCriteriaBuilder().createQuery().subquery(uClass); - this.nestedQueryRoot = subquery.from(this.tClass); - subquery.where(predicate.applyPredicate(this.manager.getCriteriaBuilder(), this.nestedQueryRoot)); - if (fields.get(0).getType() == FieldSelectionType.FIELD) - subquery.select(this.manager.getCriteriaBuilder().greatest(this.nestedQueryRoot.get(fields.get(0).getField()))); - else if (fields.get(0).getType() == FieldSelectionType.COMPOSITE_FIELD) { - subquery.select(this.manager.getCriteriaBuilder().greatest(this.nestedQueryRoot.get(fields.get(0).getField().split(":")[0]).get(fields.get(0).getField().split(":")[1]))); - } - return subquery; - } + @Override + public Subquery subQuery(SinglePredicate predicate, List fields) { + Subquery subquery = this.manager.getCriteriaBuilder().createQuery().subquery(this.tClass); + this.nestedQueryRoot = subquery.from(this.tClass); + subquery.where(predicate.applyPredicate(this.manager.getCriteriaBuilder(), this.nestedQueryRoot)); + if (fields.get(0).getType() == FieldSelectionType.FIELD) + subquery.select(this.nestedQueryRoot.get(fields.get(0).getField())); + else if (fields.get(0).getType() == FieldSelectionType.COMPOSITE_FIELD) { + subquery.select(this.nestedQueryRoot.join(fields.get(0).getField().split(":")[0]).get(fields.get(0).getField().split(":")[1])); + } + return subquery; + } - @Override - public Subquery subQueryMax(NestedQuerySinglePredicate predicate, List fields, Class uClass) { - //Subquery subquery = this.manager.getCriteriaBuilder().createQuery().subquery(uClass); - //this.nestedQueryRoot = subquery.from(this.tClass); - subquery.where(predicate.applyPredicate(this.manager.getCriteriaBuilder(), this.root, this.nestedQueryRoot)); - if (fields.get(0).getType() == FieldSelectionType.FIELD) - subquery.select(this.manager.getCriteriaBuilder().greatest(this.nestedQueryRoot.get(fields.get(0).getField()))); - else if (fields.get(0).getType() == FieldSelectionType.COMPOSITE_FIELD) { - subquery.select(this.manager.getCriteriaBuilder().greatest(this.nestedQueryRoot.get(fields.get(0).getField().split(":")[0]).get(fields.get(0).getField().split(":")[1]))); - } - return subquery; - } + @Override + public Subquery subQuery(NestedQuerySinglePredicate predicate, List fields) { + Subquery subquery = this.manager.getCriteriaBuilder().createQuery().subquery(this.tClass); + this.nestedQueryRoot = subquery.from(this.tClass); + subquery.where(predicate.applyPredicate(this.manager.getCriteriaBuilder(), this.root, this.nestedQueryRoot)); + if (fields.get(0).getType() == FieldSelectionType.FIELD) + subquery.select(this.nestedQueryRoot.get(fields.get(0).getField())); + else if (fields.get(0).getType() == FieldSelectionType.COMPOSITE_FIELD) { + subquery.select(this.nestedQueryRoot.get(fields.get(0).getField().split(":")[0]).get(fields.get(0).getField().split(":")[1])); + } + return subquery; + } - public QueryableList initSubQuery(Class uClass) { - this.subquery = this.manager.getCriteriaBuilder().createQuery().subquery(uClass); - this.nestedQueryRoot = subquery.from(this.tClass); - return this; - } + @Override + public Subquery subQueryCount(SinglePredicate predicate, List fields) { + Subquery subquery = this.manager.getCriteriaBuilder().createQuery().subquery(Long.class); + this.nestedQueryRoot = subquery.from(this.tClass); + subquery.where(predicate.applyPredicate(this.manager.getCriteriaBuilder(), this.nestedQueryRoot)); + subquery.select(this.manager.getCriteriaBuilder().count(this.nestedQueryRoot.get(fields.get(0).getField()))); + return subquery; + } + + @Override + public Subquery subQueryCount(NestedQuerySinglePredicate predicate, List fields) { + Subquery subquery = this.manager.getCriteriaBuilder().createQuery().subquery(Long.class); + this.nestedQueryRoot = subquery.from(this.tClass); + subquery.where(predicate.applyPredicate(this.manager.getCriteriaBuilder(), this.root, this.nestedQueryRoot)); + subquery.select(this.manager.getCriteriaBuilder().count(this.nestedQueryRoot.get(fields.get(0).getField()))); + return subquery; + } + + @Override + public Subquery subQueryMax(SinglePredicate predicate, List fields, Class uClass) { + Subquery subquery = this.manager.getCriteriaBuilder().createQuery().subquery(uClass); + this.nestedQueryRoot = subquery.from(this.tClass); + subquery.where(predicate.applyPredicate(this.manager.getCriteriaBuilder(), this.nestedQueryRoot)); + if (fields.get(0).getType() == FieldSelectionType.FIELD) + subquery.select(this.manager.getCriteriaBuilder().greatest(this.nestedQueryRoot.get(fields.get(0).getField()))); + else if (fields.get(0).getType() == FieldSelectionType.COMPOSITE_FIELD) { + subquery.select(this.manager.getCriteriaBuilder().greatest(this.nestedQueryRoot.get(fields.get(0).getField().split(":")[0]).get(fields.get(0).getField().split(":")[1]))); + } + return subquery; + } + + @Override + public Subquery subQueryMax(NestedQuerySinglePredicate predicate, List fields, Class uClass) { + //Subquery subquery = this.manager.getCriteriaBuilder().createQuery().subquery(uClass); + //this.nestedQueryRoot = subquery.from(this.tClass); + subquery.where(predicate.applyPredicate(this.manager.getCriteriaBuilder(), this.root, this.nestedQueryRoot)); + if (fields.get(0).getType() == FieldSelectionType.FIELD) + subquery.select(this.manager.getCriteriaBuilder().greatest(this.nestedQueryRoot.get(fields.get(0).getField()))); + else if (fields.get(0).getType() == FieldSelectionType.COMPOSITE_FIELD) { + subquery.select(this.manager.getCriteriaBuilder().greatest(this.nestedQueryRoot.get(fields.get(0).getField().split(":")[0]).get(fields.get(0).getField().split(":")[1]))); + } + return subquery; + } + + public QueryableList initSubQuery(Class uClass) { + this.subquery = this.manager.getCriteriaBuilder().createQuery().subquery(uClass); + this.nestedQueryRoot = subquery.from(this.tClass); + return this; + } + + @Override + public Subquery query(List fields) { + CriteriaBuilder builder = this.manager.getCriteriaBuilder(); + Subquery query = builder.createQuery().subquery(this.tClass); + this.root = query.from(this.tClass); + query.where(this.generateWherePredicates(this.singlePredicates, this.root, this.nestedPredicates, this.nestedQueryRoot)); + if (fields.get(0).getType() == FieldSelectionType.FIELD) + query.select(this.root.get(fields.get(0).getField())); + else if (fields.get(0).getType() == FieldSelectionType.COMPOSITE_FIELD) { + query.select(this.root.get(fields.get(0).getField().split(":")[0]).get(fields.get(0).getField().split(":")[1])); + } + if (distinct) query.distinct(true); + return query; + } + + @Override + public void update(EntitySelectPredicate selectPredicate, V value) { + CriteriaBuilder builder = this.manager + .getCriteriaBuilder(); + CriteriaUpdate update = builder + .createCriteriaUpdate(tClass); + this.root = update.from(tClass); + update.set(selectPredicate.applyPredicate(root), value) + .where(this.generateWherePredicates(this.singlePredicates, this.root, this.nestedPredicates, this.nestedQueryRoot)); + this.manager + .createQuery(update) + .executeUpdate(); + } } diff --git a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/predicates/EntitySelectPredicate.java b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/predicates/EntitySelectPredicate.java new file mode 100644 index 000000000..c6c3cb7b7 --- /dev/null +++ b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/predicates/EntitySelectPredicate.java @@ -0,0 +1,13 @@ +package eu.eudat.queryable.jpa.predicates; + +import javax.persistence.criteria.Path; +import javax.persistence.criteria.Root; +import java.util.function.Predicate; + +/** + * Created by ikalyvas on 10/10/2018. + */ +public interface EntitySelectPredicate { + Path applyPredicate(Root root); + +} diff --git a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/queryableentity/DataEntity.java b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/queryableentity/DataEntity.java index 2b99e290b..040d44ca1 100644 --- a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/queryableentity/DataEntity.java +++ b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/queryableentity/DataEntity.java @@ -1,7 +1,12 @@ package eu.eudat.queryable.queryableentity; -public interface DataEntity { - void update(T entity); +import javax.persistence.Tuple; +import java.util.List; - K getKeys(); +public interface DataEntity { + void update(T entity); + + K getKeys(); + + T buildFromTuple(List tuple, List fields, String base); } diff --git a/dmp-backend/web/pom.xml b/dmp-backend/web/pom.xml index d196e05b2..f54b3995c 100644 --- a/dmp-backend/web/pom.xml +++ b/dmp-backend/web/pom.xml @@ -31,6 +31,15 @@ queryable 1.0-SNAPSHOT + + + eu.eudat + elastic + 1.0.0-SNAPSHOT + + + + org.springframework.boot spring-boot-starter-web diff --git a/dmp-backend/web/src/main/java/eu/eudat/EuDatApplication.java b/dmp-backend/web/src/main/java/eu/eudat/EuDatApplication.java index 7a674710f..d9c2b65d6 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/EuDatApplication.java +++ b/dmp-backend/web/src/main/java/eu/eudat/EuDatApplication.java @@ -6,8 +6,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.support.SpringBootServletInitializer; +import org.springframework.scheduling.annotation.EnableAsync; @SpringBootApplication +@EnableAsync public class EuDatApplication extends SpringBootServletInitializer { private static final Logger logger = LoggerFactory.getLogger(EuDatApplication.class); diff --git a/dmp-backend/web/src/main/java/eu/eudat/cache/ResponsesCache.java b/dmp-backend/web/src/main/java/eu/eudat/cache/ResponsesCache.java index 09a73cb87..0e0bcc339 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/cache/ResponsesCache.java +++ b/dmp-backend/web/src/main/java/eu/eudat/cache/ResponsesCache.java @@ -28,10 +28,13 @@ public class ResponsesCache { SimpleCacheManager simpleCacheManager = new SimpleCacheManager(); List caches = new ArrayList(); caches.add(new GuavaCache("repositories", CacheBuilder.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); + caches.add(new GuavaCache("grants", CacheBuilder.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); caches.add(new GuavaCache("projects", CacheBuilder.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); + caches.add(new GuavaCache("funders", CacheBuilder.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); caches.add(new GuavaCache("organisations", CacheBuilder.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); caches.add(new GuavaCache("registries", CacheBuilder.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); caches.add(new GuavaCache("services", CacheBuilder.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); + caches.add(new GuavaCache("tags", CacheBuilder.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); caches.add(new GuavaCache("researchers", CacheBuilder.newBuilder().expireAfterAccess(HOW_MANY, TIME_UNIT).build())); simpleCacheManager.setCaches(caches); System.out.println("OK"); diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/DevelDatabaseConfiguration.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/DevelDatabaseConfiguration.java index a5f334394..1c5c48bed 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/configurations/DevelDatabaseConfiguration.java +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/DevelDatabaseConfiguration.java @@ -2,10 +2,9 @@ package eu.eudat.configurations; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; +import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.*; import org.springframework.core.env.Environment; import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor; import org.springframework.jdbc.datasource.DriverManagerDataSource; @@ -37,25 +36,26 @@ public class DevelDatabaseConfiguration { JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); em.setJpaVendorAdapter(vendorAdapter); em.setJpaProperties(additionalProperties()); - return em; } @Bean + @Primary + @ConfigurationProperties(prefix = "spring.datasource") public DataSource dataSource() { - DriverManagerDataSource dataSource = new DriverManagerDataSource(); - dataSource.setDriverClassName(env.getProperty("database.driver-class-name")); - dataSource.setUrl(env.getProperty("devel.database.url")); - dataSource.setUsername(env.getProperty("devel.database.username")); - dataSource.setPassword(env.getProperty("devel.database.password")); - return dataSource; + return DataSourceBuilder + .create() + .username(env.getProperty("database.username")) + .password(env.getProperty("database.password")) + .url(env.getProperty("database.url")) + .driverClassName(env.getProperty("database.driver-class-name")) + .build(); } @Bean public PlatformTransactionManager transactionManager(EntityManagerFactory emf) { JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(emf); - return transactionManager; } diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/ElasticSearchConfiguration.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/ElasticSearchConfiguration.java new file mode 100644 index 000000000..e9e8f9b1c --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/ElasticSearchConfiguration.java @@ -0,0 +1,39 @@ +package eu.eudat.configurations; + +import org.apache.http.HttpHost; +import org.elasticsearch.client.Client; +import org.elasticsearch.client.RestClient; +import org.elasticsearch.client.RestHighLevelClient; +import org.elasticsearch.client.transport.TransportClient; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.transport.TransportAddress; +import org.elasticsearch.transport.client.PreBuiltTransportClient; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; + +import java.net.InetAddress; + +/** + * Created by ikalyvas on 7/5/2018. + */ +@Configuration +public class ElasticSearchConfiguration { + + private Environment environment; + + @Autowired + public ElasticSearchConfiguration(Environment environment) { + this.environment = environment; + } + + @Bean + public RestHighLevelClient client() throws Exception { + RestHighLevelClient client = new RestHighLevelClient( + RestClient.builder( + new HttpHost(this.environment.getProperty("elasticsearch.host"), + Integer.parseInt(this.environment.getProperty("elasticsearch.port")), "http"))); + return client; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/ExecutorServiceConfig.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/ExecutorServiceConfig.java new file mode 100644 index 000000000..78da24f79 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/ExecutorServiceConfig.java @@ -0,0 +1,28 @@ +package eu.eudat.configurations; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.TaskExecutor; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** + * Created by ikalyvas on 9/26/2018. + */ +@Configuration +public class ExecutorServiceConfig { + + @Bean + public Executor asyncExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(2); + executor.setMaxPoolSize(2); + executor.setQueueCapacity(500); + executor.setThreadNamePrefix("Rules-"); + executor.initialize(); + return executor; + } +} \ No newline at end of file diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/JacksonConfiguration.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/JacksonConfiguration.java new file mode 100644 index 000000000..266c23ede --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/JacksonConfiguration.java @@ -0,0 +1,30 @@ +package eu.eudat.configurations; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.Module; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.module.SimpleModule; +import eu.eudat.criteria.entities.Criteria; +import eu.eudat.criteria.serialzier.CriteriaSerializer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.ArrayList; + +@Configuration +public class JacksonConfiguration { + @Bean + public ObjectMapper buildObjectMapper() { + + ArrayList modules = new ArrayList<>(); + SimpleModule criteriaSerializerModule = new SimpleModule(); + criteriaSerializerModule.addDeserializer(Criteria.class, new CriteriaSerializer()); + modules.add(criteriaSerializerModule); + + return new ObjectMapper() + .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + .registerModules(modules); + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/ProductionDatabaseConfiguration.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/ProductionDatabaseConfiguration.java index 33ad27a08..e26ca6732 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/configurations/ProductionDatabaseConfiguration.java +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/ProductionDatabaseConfiguration.java @@ -24,7 +24,7 @@ import java.util.Properties; */ @Configuration @EnableTransactionManagement -@Profile("production") +@Profile({ "production", "staging" }) @ComponentScan(basePackages = {"eu.eudat.data.entities"}) public class ProductionDatabaseConfiguration { @@ -47,9 +47,9 @@ public class ProductionDatabaseConfiguration { public DataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName(env.getProperty("database.driver-class-name")); - dataSource.setUrl(env.getProperty("production.database.url")); - dataSource.setUsername(env.getProperty("production.database.username")); - dataSource.setPassword(env.getProperty("production.database.password")); + dataSource.setUrl(env.getProperty("database.url")); + dataSource.setUsername(env.getProperty("database.username")); + dataSource.setPassword(env.getProperty("database.password")); return dataSource; } diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/WebMVCConfiguration.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/WebMVCConfiguration.java index 79607ba35..d1136aba9 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/configurations/WebMVCConfiguration.java +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/WebMVCConfiguration.java @@ -3,7 +3,7 @@ package eu.eudat.configurations; import eu.eudat.controllers.interceptors.RequestInterceptor; import eu.eudat.logic.handlers.PrincipalArgumentResolver; import eu.eudat.logic.services.ApiContext; -import eu.eudat.logic.services.operations.AuthenticationService; +import eu.eudat.logic.services.operations.authentication.AuthenticationService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableAsync; @@ -17,25 +17,26 @@ import java.util.List; @Configuration public class WebMVCConfiguration extends WebMvcConfigurerAdapter { - private ApiContext apiContext; + private ApiContext apiContext; - private AuthenticationService authenticationService; + private AuthenticationService verifiedUserAuthenticationService; + private AuthenticationService nonVerifiedUserAuthenticationService; - @Autowired - public WebMVCConfiguration(ApiContext apiContext, AuthenticationService authenticationService) { - this.apiContext = apiContext; - this.authenticationService = authenticationService; - } + @Autowired + public WebMVCConfiguration(ApiContext apiContext, AuthenticationService verifiedUserAuthenticationService, AuthenticationService nonVerifiedUserAuthenticationService) { + this.apiContext = apiContext; + this.verifiedUserAuthenticationService = verifiedUserAuthenticationService; + this.nonVerifiedUserAuthenticationService = nonVerifiedUserAuthenticationService; + } - @Autowired - @Override - public void addArgumentResolvers(List argumentResolvers) { - argumentResolvers.add(new PrincipalArgumentResolver(authenticationService)); - } - - @Override - public void addInterceptors(InterceptorRegistry registry) { - registry.addInterceptor(new RequestInterceptor(this.apiContext.getHelpersService().getLoggerService())); - } + @Autowired + @Override + public void addArgumentResolvers(List argumentResolvers) { + argumentResolvers.add(new PrincipalArgumentResolver(verifiedUserAuthenticationService, nonVerifiedUserAuthenticationService)); + } + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(new RequestInterceptor(this.apiContext.getHelpersService().getLoggerService())); + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicfunder/DynamicFunderConfiguration.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicfunder/DynamicFunderConfiguration.java new file mode 100644 index 000000000..4a7f08672 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicfunder/DynamicFunderConfiguration.java @@ -0,0 +1,12 @@ +package eu.eudat.configurations.dynamicfunder; + +import eu.eudat.configurations.dynamicfunder.entities.Configuration; +import eu.eudat.models.data.dynamicfields.DynamicField; + +import java.util.List; + +public interface DynamicFunderConfiguration { + Configuration getConfiguration(); + + List getFields(); +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicfunder/DynamicFunderConfigurationDevelImpl.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicfunder/DynamicFunderConfigurationDevelImpl.java new file mode 100644 index 000000000..ffe8fbafa --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicfunder/DynamicFunderConfigurationDevelImpl.java @@ -0,0 +1,83 @@ +package eu.eudat.configurations.dynamicfunder; + +import eu.eudat.configurations.dynamicfunder.entities.Configuration; +import eu.eudat.configurations.dynamicfunder.entities.Property; +import eu.eudat.models.data.dynamicfields.Dependency; +import eu.eudat.models.data.dynamicfields.DynamicField; +import org.springframework.context.annotation.Profile; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Service; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.Unmarshaller; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.LinkedList; +import java.util.List; + +@Service("dynamicFunderConfiguration") +@Profile("devel") +public class DynamicFunderConfigurationDevelImpl implements DynamicFunderConfiguration { + + private Configuration configuration; + private List fields; + private Environment environment; + + public DynamicFunderConfigurationDevelImpl(Environment environment) { + this.environment = environment; + } + + @Override + public Configuration getConfiguration() { + if (this.configuration != null) return this.configuration; + String fileUrl = this.environment.getProperty("configuration.dynamicFunderUrl"); + System.out.println("Loaded also config file: " + fileUrl); + String current = null; + InputStream is = null; + try { + current = new java.io.File(".").getCanonicalPath(); + + JAXBContext jaxbContext = JAXBContext.newInstance(Configuration.class); + Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); + is = new URL("file:///"+current + "/web/src/main/resources/FunderConfiguration.xml").openStream(); + this.configuration = (Configuration) jaxbUnmarshaller.unmarshal(is); + } catch (Exception ex) { + ex.printStackTrace(); + System.out.println("Cannot find in folder" + current); + } finally { + try { + if (is != null) is.close(); + } catch (IOException e) { + System.out.println("Warning: Could not close a stream after reading from file: " + fileUrl); + } + } + return this.configuration; + } + + @Override + public List getFields() { + if (this.fields != null) return this.fields; + Configuration configuration = this.getConfiguration(); + List fields = new LinkedList<>(); + List properties = configuration.getConfigurationProperties(); + properties.stream().forEach(item -> { + DynamicField dynamicField = new DynamicField(); + dynamicField.setId(item.getId()); + dynamicField.setName(item.getName()); + dynamicField.setQueryProperty(item.getQueryProperty()); + dynamicField.setRequired(item.getRequired()); + List dependencies = new LinkedList<>(); + item.getDependencies().stream().forEach(dependency -> { + Dependency modelDependency = new Dependency(); + modelDependency.setId(dependency.getId()); + modelDependency.setQueryProperty(dependency.getQueryProperty()); + dependencies.add(modelDependency); + }); + dynamicField.setDependencies(dependencies); + fields.add(dynamicField); + }); + this.fields = fields; + return fields; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicfunder/DynamicFunderConfigurationProdImpl.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicfunder/DynamicFunderConfigurationProdImpl.java new file mode 100644 index 000000000..f5e0686ee --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicfunder/DynamicFunderConfigurationProdImpl.java @@ -0,0 +1,84 @@ +package eu.eudat.configurations.dynamicfunder; + +import eu.eudat.configurations.dynamicfunder.entities.Configuration; +import eu.eudat.configurations.dynamicfunder.entities.Property; +import eu.eudat.models.data.dynamicfields.Dependency; +import eu.eudat.models.data.dynamicfields.DynamicField; +import org.springframework.context.annotation.Profile; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Service; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.Unmarshaller; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.nio.file.Paths; +import java.util.LinkedList; +import java.util.List; + +@Service("dynamicFunderConfiguration") +@Profile({ "production", "staging" }) +public class DynamicFunderConfigurationProdImpl implements DynamicFunderConfiguration { + + private Configuration configuration; + private List fields; + private Environment environment; + + public DynamicFunderConfigurationProdImpl(Environment environment) { + this.environment = environment; + } + + @Override + public Configuration getConfiguration() { + if (this.configuration != null) return this.configuration; + String fileUrl = this.environment.getProperty("configuration.dynamicFunderUrl"); + System.out.println("Loaded also config file: " + fileUrl); + String current = null; + InputStream is = null; + try { + current = new java.io.File(".").getCanonicalPath(); + + JAXBContext jaxbContext = JAXBContext.newInstance(Configuration.class); + Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); + is = new URL("file:///" + this.environment.getProperty("configuration.resources.path") + "FunderConfiguration.xml").openStream(); + this.configuration = (Configuration) jaxbUnmarshaller.unmarshal(is); + } catch (Exception ex) { + ex.printStackTrace(); + System.out.println("Cannot find in folder" + current); + } finally { + try { + if (is != null) is.close(); + } catch (IOException e) { + System.out.println("Warning: Could not close a stream after reading from file: " + fileUrl); + } + } + return this.configuration; + } + + @Override + public List getFields() { + if (this.fields != null) return this.fields; + Configuration configuration = this.getConfiguration(); + List fields = new LinkedList<>(); + List properties = configuration.getConfigurationProperties(); + properties.stream().forEach(item -> { + DynamicField dynamicField = new DynamicField(); + dynamicField.setId(item.getId()); + dynamicField.setName(item.getName()); + dynamicField.setQueryProperty(item.getQueryProperty()); + dynamicField.setRequired(item.getRequired()); + List dependencies = new LinkedList<>(); + item.getDependencies().stream().forEach(dependency -> { + Dependency modelDependency = new Dependency(); + modelDependency.setId(dependency.getId()); + modelDependency.setQueryProperty(dependency.getQueryProperty()); + dependencies.add(modelDependency); + }); + dynamicField.setDependencies(dependencies); + fields.add(dynamicField); + }); + this.fields = fields; + return fields; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicfunder/entities/Configuration.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicfunder/entities/Configuration.java new file mode 100644 index 000000000..c1ac50408 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicfunder/entities/Configuration.java @@ -0,0 +1,31 @@ +package eu.eudat.configurations.dynamicfunder.entities; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.List; + +@XmlRootElement +public class Configuration { + private List configurationProperties; + private MainProperty mainExternalField; + + public MainProperty getMainExternalField() { + return mainExternalField; + } + + @XmlElement(name = "mainExternalField") + public void setMainExternalField(MainProperty mainExternalField) { + this.mainExternalField = mainExternalField; + } + + public List getConfigurationProperties() { + return configurationProperties; + } + + @XmlElementWrapper + @XmlElement(name = "property") + public void setConfigurationProperties(List configurationProperties) { + this.configurationProperties = configurationProperties; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicfunder/entities/Dependency.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicfunder/entities/Dependency.java new file mode 100644 index 000000000..7e99f487d --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicfunder/entities/Dependency.java @@ -0,0 +1,26 @@ +package eu.eudat.configurations.dynamicfunder.entities; + +import javax.xml.bind.annotation.XmlElement; + +public class Dependency { + private String id; + private String queryProperty; + + public String getId() { + return id; + } + + public String getQueryProperty() { + return queryProperty; + } + + @XmlElement(name = "id") + public void setId(String id) { + this.id = id; + } + + @XmlElement(name = "queryProperty") + public void setQueryProperty(String queryProperty) { + this.queryProperty = queryProperty; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicfunder/entities/Language.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicfunder/entities/Language.java new file mode 100644 index 000000000..7ea254152 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicfunder/entities/Language.java @@ -0,0 +1,26 @@ +package eu.eudat.configurations.dynamicfunder.entities; + +import javax.xml.bind.annotation.XmlElement; + +public class Language { + private String key; + private String languageKey; + + public String getKey() { + return key; + } + + @XmlElement(name = "key") + public void setKey(String key) { + this.key = key; + } + + public String getLanguageKey() { + return languageKey; + } + + @XmlElement(name = "languageKey") + public void setLanguageKey(String languageKey) { + this.languageKey = languageKey; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicfunder/entities/MainProperty.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicfunder/entities/MainProperty.java new file mode 100644 index 000000000..997dc4aff --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicfunder/entities/MainProperty.java @@ -0,0 +1,103 @@ +package eu.eudat.configurations.dynamicfunder.entities; + +import eu.eudat.logic.proxy.config.UrlConfiguration; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import java.util.List; + +public class MainProperty { + private String id; + private String name; + private String queryProperty; + private String externalFieldId; + private List urlConfig; + private String externalFieldLabel; + private List dependencies; + private Boolean required; + private List language; + + + public String getId() { + return id; + } + + @XmlElement(name = "id") + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + @XmlElement(name = "name") + public void setName(String name) { + this.name = name; + } + + public String getExternalFieldId() { + return externalFieldId; + } + + @XmlElement(name = "externalFieldId") + public void setExternalFieldId(String externalFieldId) { + this.externalFieldId = externalFieldId; + } + + public String getExternalFieldLabel() { + return externalFieldLabel; + } + + @XmlElement(name = "externalFieldLabel") + public void setExternalFieldLabel(String externalFieldLabel) { + this.externalFieldLabel = externalFieldLabel; + } + + public List getDependencies() { + return dependencies; + } + + @XmlElementWrapper + @XmlElement(name = "dependency") + public void setDependencies(List dependencies) { + this.dependencies = dependencies; + } + + public Boolean getRequired() { + return required; + } + + @XmlElement(name = "required") + public void setRequired(Boolean required) { + this.required = required; + } + + public String getQueryProperty() { + return queryProperty; + } + + @XmlElement(name = "queryProperty") + public void setQueryProperty(String queryProperty) { + this.queryProperty = queryProperty; + } + + public List getUrlConfig() { + return urlConfig; + } + + @XmlElement(name = "urlConfig") + public void setUrlConfig(List urlConfig) { + this.urlConfig = urlConfig; + } + + public List getLanguage() { + return language; + } + + @XmlElementWrapper + @XmlElement(name = "languageProperty") + public void setLanguage(List language) { + this.language = language; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicfunder/entities/Property.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicfunder/entities/Property.java new file mode 100644 index 000000000..ade2c2e27 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicfunder/entities/Property.java @@ -0,0 +1,91 @@ +package eu.eudat.configurations.dynamicfunder.entities; + + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import java.util.List; + +public class Property { + private String id; + private String name; + private String sourceUrl; + private String queryProperty; + private String externalFieldId; + private String externalFieldLabel; + private List dependencies; + private Boolean required; + + + public String getId() { + return id; + } + + @XmlElement(name = "id") + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + @XmlElement(name = "name") + public void setName(String name) { + this.name = name; + } + + public String getSourceUrl() { + return sourceUrl; + } + + @XmlElement(name = "sourceUrl") + public void setSourceUrl(String sourceUrl) { + this.sourceUrl = sourceUrl; + } + + public String getExternalFieldId() { + return externalFieldId; + } + + @XmlElement(name = "externalFieldId") + public void setExternalFieldId(String externalFieldId) { + this.externalFieldId = externalFieldId; + } + + public String getExternalFieldLabel() { + return externalFieldLabel; + } + + @XmlElement(name = "externalFieldLabel") + public void setExternalFieldLabel(String externalFieldLabel) { + this.externalFieldLabel = externalFieldLabel; + } + + public List getDependencies() { + return dependencies; + } + + @XmlElementWrapper + @XmlElement(name = "dependency") + public void setDependencies(List dependencies) { + this.dependencies = dependencies; + } + + public Boolean getRequired() { + return required; + } + + @XmlElement(name = "required") + public void setRequired(Boolean required) { + this.required = required; + } + + public String getQueryProperty() { + return queryProperty; + } + + @XmlElement(name = "queryProperty") + public void setQueryProperty(String queryProperty) { + this.queryProperty = queryProperty; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicgrant/DynamicGrantConfiguration.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicgrant/DynamicGrantConfiguration.java new file mode 100644 index 000000000..efe07f403 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicgrant/DynamicGrantConfiguration.java @@ -0,0 +1,15 @@ +package eu.eudat.configurations.dynamicgrant; + +import eu.eudat.configurations.dynamicgrant.entities.Configuration; +import eu.eudat.models.data.dynamicfields.DynamicField; + +import java.util.List; + +/** + * Created by ikalyvas on 3/23/2018. + */ +public interface DynamicGrantConfiguration { + Configuration getConfiguration(); + + List getFields(); +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicgrant/DynamicGrantConfigurationDevelImpl.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicgrant/DynamicGrantConfigurationDevelImpl.java new file mode 100644 index 000000000..a3b950d70 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicgrant/DynamicGrantConfigurationDevelImpl.java @@ -0,0 +1,91 @@ +package eu.eudat.configurations.dynamicgrant; + +import eu.eudat.configurations.dynamicgrant.entities.Configuration; +import eu.eudat.configurations.dynamicgrant.entities.Property; +import eu.eudat.models.data.dynamicfields.Dependency; +import eu.eudat.models.data.dynamicfields.DynamicField; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Profile; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Service; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.Unmarshaller; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.LinkedList; +import java.util.List; + +/** + * Created by ikalyvas on 5/4/2018. + */ + +@Service("dynamicGrantConfiguration") +@Profile("devel") +public class DynamicGrantConfigurationDevelImpl implements DynamicGrantConfiguration { + + private Configuration configuration; + + private List fields; + + private Environment environment; + + @Autowired + public DynamicGrantConfigurationDevelImpl(Environment environment) { + this.environment = environment; + } + + @Override + public Configuration getConfiguration() { + if (this.configuration != null) return this.configuration; + String fileUrl = this.environment.getProperty("configuration.dynamicGrantUrl"); + System.out.println("Loaded also config file: " + fileUrl); + String current = null; + InputStream is = null; + try { + current = new java.io.File(".").getCanonicalPath(); + + JAXBContext jaxbContext = JAXBContext.newInstance(Configuration.class); + Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); + is = new URL("file:///"+current + "/web/src/main/resources/GrantConfiguration.xml").openStream(); + this.configuration = (Configuration) jaxbUnmarshaller.unmarshal(is); + } catch (Exception ex) { + ex.printStackTrace(); + System.out.println("Cannot find in folder" + current); + } finally { + try { + if (is != null) is.close(); + } catch (IOException e) { + System.out.println("Warning: Could not close a stream after reading from file: " + fileUrl); + } + } + return this.configuration; + } + + @Override + public List getFields() { + if (this.fields != null) return this.fields; + Configuration configuration = this.getConfiguration(); + List fields = new LinkedList<>(); + List properties = configuration.getConfigurationProperties(); + properties.stream().forEach(item -> { + DynamicField dynamicField = new DynamicField(); + dynamicField.setId(item.getId()); + dynamicField.setName(item.getName()); + dynamicField.setQueryProperty(item.getQueryProperty()); + dynamicField.setRequired(item.getRequired()); + List dependencies = new LinkedList<>(); + item.getDependencies().stream().forEach(dependency -> { + Dependency modelDependency = new Dependency(); + modelDependency.setId(dependency.getId()); + modelDependency.setQueryProperty(dependency.getQueryProperty()); + dependencies.add(modelDependency); + }); + dynamicField.setDependencies(dependencies); + fields.add(dynamicField); + }); + this.fields = fields; + return fields; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicgrant/DynamicGrantConfigurationProdImpl.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicgrant/DynamicGrantConfigurationProdImpl.java new file mode 100644 index 000000000..7d7e29348 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicgrant/DynamicGrantConfigurationProdImpl.java @@ -0,0 +1,91 @@ +package eu.eudat.configurations.dynamicgrant; + +import eu.eudat.configurations.dynamicgrant.entities.Configuration; +import eu.eudat.configurations.dynamicgrant.entities.Property; +import eu.eudat.models.data.dynamicfields.Dependency; +import eu.eudat.models.data.dynamicfields.DynamicField; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Profile; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Service; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.Unmarshaller; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.nio.file.Paths; +import java.util.LinkedList; +import java.util.List; + +/** + * Created by ikalyvas on 3/23/2018. + */ +@Service("dynamicGrantConfiguration") +@Profile({ "production", "staging" }) +public class DynamicGrantConfigurationProdImpl implements DynamicGrantConfiguration { + + private Configuration configuration; + + private List fields; + + private Environment environment; + + @Autowired + public DynamicGrantConfigurationProdImpl(Environment environment) { + this.environment = environment; + } + + @Override + public Configuration getConfiguration() { + if (this.configuration != null) return this.configuration; + String fileUrl = this.environment.getProperty("configuration.dynamicGrantUrl"); + System.out.println("Loaded also config file: " + fileUrl); + String current = null; + InputStream is = null; + try { + current = new java.io.File(".").getCanonicalPath(); + + JAXBContext jaxbContext = JAXBContext.newInstance(Configuration.class); + Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); + is = new URL("file:///" + this.environment.getProperty("configuration.resources.path") + "GrantConfiguration.xml").openStream(); + this.configuration = (Configuration) jaxbUnmarshaller.unmarshal(is); + } catch (Exception ex) { + ex.printStackTrace(); + System.out.println("Cannot find in folder" + current); + } finally { + try { + if (is != null) is.close(); + } catch (IOException e) { + System.out.println("Warning: Could not close a stream after reading from file: " + fileUrl); + } + } + return this.configuration; + } + + @Override + public List getFields() { + if (this.fields != null) return this.fields; + Configuration configuration = this.getConfiguration(); + List fields = new LinkedList<>(); + List properties = configuration.getConfigurationProperties(); + properties.stream().forEach(item -> { + DynamicField dynamicField = new DynamicField(); + dynamicField.setId(item.getId()); + dynamicField.setName(item.getName()); + dynamicField.setQueryProperty(item.getQueryProperty()); + dynamicField.setRequired(item.getRequired()); + List dependencies = new LinkedList<>(); + item.getDependencies().stream().forEach(dependency -> { + Dependency modelDependency = new Dependency(); + modelDependency.setId(dependency.getId()); + modelDependency.setQueryProperty(dependency.getQueryProperty()); + dependencies.add(modelDependency); + }); + dynamicField.setDependencies(dependencies); + fields.add(dynamicField); + }); + this.fields = fields; + return fields; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicgrant/entities/Configuration.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicgrant/entities/Configuration.java new file mode 100644 index 000000000..7b4bbe714 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicgrant/entities/Configuration.java @@ -0,0 +1,34 @@ +package eu.eudat.configurations.dynamicgrant.entities; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.List; + +/** + * Created by ikalyvas on 3/23/2018. + */ +@XmlRootElement +public class Configuration { + private List configurationProperties; + private MainProperty mainExternalField; + + public MainProperty getMainExternalField() { + return mainExternalField; + } + + @XmlElement(name = "mainExternalField") + public void setMainExternalField(MainProperty mainExternalField) { + this.mainExternalField = mainExternalField; + } + + public List getConfigurationProperties() { + return configurationProperties; + } + + @XmlElementWrapper + @XmlElement(name = "property") + public void setConfigurationProperties(List configurationProperties) { + this.configurationProperties = configurationProperties; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicgrant/entities/Dependency.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicgrant/entities/Dependency.java new file mode 100644 index 000000000..e256d1ab6 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicgrant/entities/Dependency.java @@ -0,0 +1,29 @@ +package eu.eudat.configurations.dynamicgrant.entities; + +import javax.xml.bind.annotation.XmlElement; + +/** + * Created by ikalyvas on 3/23/2018. + */ +public class Dependency { + private String id; + private String queryProperty; + + public String getId() { + return id; + } + + public String getQueryProperty() { + return queryProperty; + } + + @XmlElement(name = "id") + public void setId(String id) { + this.id = id; + } + + @XmlElement(name = "queryProperty") + public void setQueryProperty(String queryProperty) { + this.queryProperty = queryProperty; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicgrant/entities/Language.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicgrant/entities/Language.java new file mode 100644 index 000000000..0b22bee2d --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicgrant/entities/Language.java @@ -0,0 +1,29 @@ +package eu.eudat.configurations.dynamicgrant.entities; + +import javax.xml.bind.annotation.XmlElement; + +/** + * Created by ikalyvas on 3/28/2018. + */ +public class Language { + private String key; + private String languageKey; + + public String getKey() { + return key; + } + + @XmlElement(name = "key") + public void setKey(String key) { + this.key = key; + } + + public String getLanguageKey() { + return languageKey; + } + + @XmlElement(name = "languageKey") + public void setLanguageKey(String languageKey) { + this.languageKey = languageKey; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicgrant/entities/MainProperty.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicgrant/entities/MainProperty.java new file mode 100644 index 000000000..fd0b8732f --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicgrant/entities/MainProperty.java @@ -0,0 +1,106 @@ +package eu.eudat.configurations.dynamicgrant.entities; + +import eu.eudat.logic.proxy.config.UrlConfiguration; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import java.util.List; + +/** + * Created by ikalyvas on 3/28/2018. + */ +public class MainProperty { + private String id; + private String name; + private String queryProperty; + private String externalFieldId; + private List urlConfig; + private String externalFieldLabel; + private List dependencies; + private Boolean required; + private List language; + + + public String getId() { + return id; + } + + @XmlElement(name = "id") + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + @XmlElement(name = "name") + public void setName(String name) { + this.name = name; + } + + public String getExternalFieldId() { + return externalFieldId; + } + + @XmlElement(name = "externalFieldId") + public void setExternalFieldId(String externalFieldId) { + this.externalFieldId = externalFieldId; + } + + public String getExternalFieldLabel() { + return externalFieldLabel; + } + + @XmlElement(name = "externalFieldLabel") + public void setExternalFieldLabel(String externalFieldLabel) { + this.externalFieldLabel = externalFieldLabel; + } + + public List getDependencies() { + return dependencies; + } + + @XmlElementWrapper + @XmlElement(name = "dependency") + public void setDependencies(List dependencies) { + this.dependencies = dependencies; + } + + public Boolean getRequired() { + return required; + } + + @XmlElement(name = "required") + public void setRequired(Boolean required) { + this.required = required; + } + + public String getQueryProperty() { + return queryProperty; + } + + @XmlElement(name = "queryProperty") + public void setQueryProperty(String queryProperty) { + this.queryProperty = queryProperty; + } + + public List getUrlConfig() { + return urlConfig; + } + + @XmlElement(name = "urlConfig") + public void setUrlConfig(List urlConfig) { + this.urlConfig = urlConfig; + } + + public List getLanguage() { + return language; + } + + @XmlElementWrapper + @XmlElement(name = "languageProperty") + public void setLanguage(List language) { + this.language = language; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicgrant/entities/Property.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicgrant/entities/Property.java new file mode 100644 index 000000000..431ac20ca --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicgrant/entities/Property.java @@ -0,0 +1,93 @@ +package eu.eudat.configurations.dynamicgrant.entities; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import java.util.List; + +/** + * Created by ikalyvas on 3/23/2018. + */ +public class Property { + private String id; + private String name; + private String sourceUrl; + private String queryProperty; + private String externalFieldId; + private String externalFieldLabel; + private List dependencies; + private Boolean required; + + + public String getId() { + return id; + } + + @XmlElement(name = "id") + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + @XmlElement(name = "name") + public void setName(String name) { + this.name = name; + } + + public String getSourceUrl() { + return sourceUrl; + } + + @XmlElement(name = "sourceUrl") + public void setSourceUrl(String sourceUrl) { + this.sourceUrl = sourceUrl; + } + + public String getExternalFieldId() { + return externalFieldId; + } + + @XmlElement(name = "externalFieldId") + public void setExternalFieldId(String externalFieldId) { + this.externalFieldId = externalFieldId; + } + + public String getExternalFieldLabel() { + return externalFieldLabel; + } + + @XmlElement(name = "externalFieldLabel") + public void setExternalFieldLabel(String externalFieldLabel) { + this.externalFieldLabel = externalFieldLabel; + } + + public List getDependencies() { + return dependencies; + } + + @XmlElementWrapper + @XmlElement(name = "dependency") + public void setDependencies(List dependencies) { + this.dependencies = dependencies; + } + + public Boolean getRequired() { + return required; + } + + @XmlElement(name = "required") + public void setRequired(Boolean required) { + this.required = required; + } + + public String getQueryProperty() { + return queryProperty; + } + + @XmlElement(name = "queryProperty") + public void setQueryProperty(String queryProperty) { + this.queryProperty = queryProperty; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/DynamicProjectConfiguration.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/DynamicProjectConfiguration.java index 87cf9002e..825a00c9f 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/DynamicProjectConfiguration.java +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/DynamicProjectConfiguration.java @@ -5,11 +5,8 @@ import eu.eudat.models.data.dynamicfields.DynamicField; import java.util.List; -/** - * Created by ikalyvas on 3/23/2018. - */ public interface DynamicProjectConfiguration { - Configuration getConfiguration(); + Configuration getConfiguration(); - List getFields(); + List getFields(); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/DynamicProjectConfigurationDevelImpl.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/DynamicProjectConfigurationDevelImpl.java index bc20ac8b0..50622a8f2 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/DynamicProjectConfigurationDevelImpl.java +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/DynamicProjectConfigurationDevelImpl.java @@ -17,75 +17,69 @@ import java.net.URL; import java.util.LinkedList; import java.util.List; -/** - * Created by ikalyvas on 5/4/2018. - */ - @Service("dynamicProjectConfiguration") @Profile("devel") -public class DynamicProjectConfigurationDevelImpl implements DynamicProjectConfiguration { +public class DynamicProjectConfigurationDevelImpl implements DynamicProjectConfiguration{ - private Configuration configuration; + private Configuration configuration; + private List fields; + private Environment environment; - private List fields; + @Autowired + public DynamicProjectConfigurationDevelImpl(Environment environment) { + this.environment = environment; + } - private Environment environment; + @Override + public Configuration getConfiguration() { + if (this.configuration != null) return this.configuration; + String fileUrl = this.environment.getProperty("configuration.dynamicProjectUrl"); + System.out.println("Loaded also config file: " + fileUrl); + String current = null; + InputStream is = null; + try { + current = new java.io.File(".").getCanonicalPath(); - @Autowired - public DynamicProjectConfigurationDevelImpl(Environment environment) { - this.environment = environment; - } + JAXBContext jaxbContext = JAXBContext.newInstance(Configuration.class); + Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); + is = new URL("file:///"+current + "/web/src/main/resources/ProjectConfiguration.xml").openStream(); + this.configuration = (Configuration) jaxbUnmarshaller.unmarshal(is); + } catch (Exception ex) { + ex.printStackTrace(); + System.out.println("Cannot find in folder" + current); + } finally { + try { + if (is != null) is.close(); + } catch (IOException e) { + System.out.println("Warning: Could not close a stream after reading from file: " + fileUrl); + } + } + return this.configuration; + } - @Override - public Configuration getConfiguration() { - if (this.configuration != null) return this.configuration; - String fileUrl = this.environment.getProperty("configuration.dynamicProjectUrl"); - System.out.println("Loaded also config file: " + fileUrl); - String current = null; - InputStream is = null; - try { - current = new java.io.File(".").getCanonicalPath(); - - JAXBContext jaxbContext = JAXBContext.newInstance(Configuration.class); - Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); - is = new URL("file:///C:/Users/ikalyvas/Documents/OpenAIRE-EUDAT-DMP-service-pilot/dmp-backend/web/src/main/resources/ProjectConfiguration.xml").openStream(); - this.configuration = (Configuration) jaxbUnmarshaller.unmarshal(is); - } catch (Exception ex) { - ex.printStackTrace(); - System.out.println("Cannot find in folder" + current); - } finally { - try { - if (is != null) is.close(); - } catch (IOException e) { - System.out.println("Warning: Could not close a stream after reading from file: " + fileUrl); - } - } - return this.configuration; - } - - @Override - public List getFields() { - if (this.fields != null) return this.fields; - Configuration configuration = this.getConfiguration(); - List fields = new LinkedList<>(); - List properties = configuration.getConfigurationProperties(); - properties.stream().forEach(item -> { - DynamicField dynamicField = new DynamicField(); - dynamicField.setId(item.getId()); - dynamicField.setName(item.getName()); - dynamicField.setQueryProperty(item.getQueryProperty()); - dynamicField.setRequired(item.getRequired()); - List dependencies = new LinkedList<>(); - item.getDependencies().stream().forEach(dependency -> { - Dependency modelDependency = new Dependency(); - modelDependency.setId(dependency.getId()); - modelDependency.setQueryProperty(dependency.getQueryProperty()); - dependencies.add(modelDependency); - }); - dynamicField.setDependencies(dependencies); - fields.add(dynamicField); - }); - this.fields = fields; - return fields; - } + @Override + public List getFields() { + if (this.fields != null) return this.fields; + Configuration configuration = this.getConfiguration(); + List fields = new LinkedList<>(); + List properties = configuration.getConfigurationProperties(); + properties.stream().forEach(item -> { + DynamicField dynamicField = new DynamicField(); + dynamicField.setId(item.getId()); + dynamicField.setName(item.getName()); + dynamicField.setQueryProperty(item.getQueryProperty()); + dynamicField.setRequired(item.getRequired()); + List dependencies = new LinkedList<>(); + item.getDependencies().stream().forEach(dependency -> { + Dependency modelDependency = new Dependency(); + modelDependency.setId(dependency.getId()); + modelDependency.setQueryProperty(dependency.getQueryProperty()); + dependencies.add(modelDependency); + }); + dynamicField.setDependencies(dependencies); + fields.add(dynamicField); + }); + this.fields = fields; + return fields; + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/DynamicProjectConfigurationProdImpl.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/DynamicProjectConfigurationProdImpl.java index a70fd4ed6..79654de69 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/DynamicProjectConfigurationProdImpl.java +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/DynamicProjectConfigurationProdImpl.java @@ -14,77 +14,75 @@ import javax.xml.bind.Unmarshaller; import java.io.IOException; import java.io.InputStream; import java.net.URL; +import java.nio.file.Paths; import java.util.LinkedList; import java.util.List; -/** - * Created by ikalyvas on 3/23/2018. - */ @Service("dynamicProjectConfiguration") -@Profile("production") -public class DynamicProjectConfigurationProdImpl implements DynamicProjectConfiguration { +@Profile({ "production", "staging" }) +public class DynamicProjectConfigurationProdImpl implements DynamicProjectConfiguration{ - private Configuration configuration; + private Configuration configuration; - private List fields; + private List fields; - private Environment environment; + private Environment environment; - @Autowired - public DynamicProjectConfigurationProdImpl(Environment environment) { - this.environment = environment; - } + @Autowired + public DynamicProjectConfigurationProdImpl(Environment environment) { + this.environment = environment; + } - @Override - public Configuration getConfiguration() { - if (this.configuration != null) return this.configuration; - String fileUrl = this.environment.getProperty("configuration.dynamicProjectUrl"); - System.out.println("Loaded also config file: " + fileUrl); - String current = null; - InputStream is = null; - try { - current = new java.io.File(".").getCanonicalPath(); + @Override + public Configuration getConfiguration() { + if (this.configuration != null) return this.configuration; + String fileUrl = this.environment.getProperty("configuration.dynamicProjectUrl"); + System.out.println("Loaded also config file: " + fileUrl); + String current = null; + InputStream is = null; + try { + current = new java.io.File(".").getCanonicalPath(); - JAXBContext jaxbContext = JAXBContext.newInstance(Configuration.class); - Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); - is = new URL("file:///" + System.getenv("CATALINA_HOME") + fileUrl).openStream(); - this.configuration = (Configuration) jaxbUnmarshaller.unmarshal(is); - } catch (Exception ex) { - ex.printStackTrace(); - System.out.println("Cannot find in folder" + current); - } finally { - try { - if (is != null) is.close(); - } catch (IOException e) { - System.out.println("Warning: Could not close a stream after reading from file: " + fileUrl); - } - } - return this.configuration; - } + JAXBContext jaxbContext = JAXBContext.newInstance(Configuration.class); + Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); + is = new URL("file:///" + this.environment.getProperty("configuration.resources.path") + "ProjectConfiguration.xml").openStream(); + this.configuration = (Configuration) jaxbUnmarshaller.unmarshal(is); + } catch (Exception ex) { + ex.printStackTrace(); + System.out.println("Cannot find in folder" + current); + } finally { + try { + if (is != null) is.close(); + } catch (IOException e) { + System.out.println("Warning: Could not close a stream after reading from file: " + fileUrl); + } + } + return this.configuration; + } - @Override - public List getFields() { - if (this.fields != null) return this.fields; - Configuration configuration = this.getConfiguration(); - List fields = new LinkedList<>(); - List properties = configuration.getConfigurationProperties(); - properties.stream().forEach(item -> { - DynamicField dynamicField = new DynamicField(); - dynamicField.setId(item.getId()); - dynamicField.setName(item.getName()); - dynamicField.setQueryProperty(item.getQueryProperty()); - dynamicField.setRequired(item.getRequired()); - List dependencies = new LinkedList<>(); - item.getDependencies().stream().forEach(dependency -> { - Dependency modelDependency = new Dependency(); - modelDependency.setId(dependency.getId()); - modelDependency.setQueryProperty(dependency.getQueryProperty()); - dependencies.add(modelDependency); - }); - dynamicField.setDependencies(dependencies); - fields.add(dynamicField); - }); - this.fields = fields; - return fields; - } + @Override + public List getFields() { + if (this.fields != null) return this.fields; + Configuration configuration = this.getConfiguration(); + List fields = new LinkedList<>(); + List properties = configuration.getConfigurationProperties(); + properties.stream().forEach(item -> { + DynamicField dynamicField = new DynamicField(); + dynamicField.setId(item.getId()); + dynamicField.setName(item.getName()); + dynamicField.setQueryProperty(item.getQueryProperty()); + dynamicField.setRequired(item.getRequired()); + List dependencies = new LinkedList<>(); + item.getDependencies().stream().forEach(dependency -> { + Dependency modelDependency = new Dependency(); + modelDependency.setId(dependency.getId()); + modelDependency.setQueryProperty(dependency.getQueryProperty()); + dependencies.add(modelDependency); + }); + dynamicField.setDependencies(dependencies); + fields.add(dynamicField); + }); + this.fields = fields; + return fields; + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/entities/Configuration.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/entities/Configuration.java index c1536cfeb..ac09b4ad0 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/entities/Configuration.java +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/entities/Configuration.java @@ -1,13 +1,11 @@ package eu.eudat.configurations.dynamicproject.entities; + import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; import java.util.List; -/** - * Created by ikalyvas on 3/23/2018. - */ @XmlRootElement public class Configuration { private List configurationProperties; diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/entities/Dependency.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/entities/Dependency.java index f2a25dd53..f5a320b3f 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/entities/Dependency.java +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/entities/Dependency.java @@ -2,9 +2,6 @@ package eu.eudat.configurations.dynamicproject.entities; import javax.xml.bind.annotation.XmlElement; -/** - * Created by ikalyvas on 3/23/2018. - */ public class Dependency { private String id; private String queryProperty; diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/entities/Language.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/entities/Language.java index d628635ee..3039a96c9 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/entities/Language.java +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/entities/Language.java @@ -2,9 +2,6 @@ package eu.eudat.configurations.dynamicproject.entities; import javax.xml.bind.annotation.XmlElement; -/** - * Created by ikalyvas on 3/28/2018. - */ public class Language { private String key; private String languageKey; diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/entities/MainProperty.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/entities/MainProperty.java index f7eb05db7..9506b4d71 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/entities/MainProperty.java +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/entities/MainProperty.java @@ -1,20 +1,17 @@ package eu.eudat.configurations.dynamicproject.entities; -import eu.eudat.logic.proxy.config.UrlConfig; +import eu.eudat.logic.proxy.config.UrlConfiguration; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import java.util.List; -/** - * Created by ikalyvas on 3/28/2018. - */ public class MainProperty { private String id; private String name; private String queryProperty; private String externalFieldId; - private UrlConfig urlConfig; + private List urlConfig; private String externalFieldLabel; private List dependencies; private Boolean required; @@ -85,12 +82,12 @@ public class MainProperty { this.queryProperty = queryProperty; } - public UrlConfig getUrlConfig() { + public List getUrlConfig() { return urlConfig; } @XmlElement(name = "urlConfig") - public void setUrlConfig(UrlConfig urlConfig) { + public void setUrlConfig(List urlConfig) { this.urlConfig = urlConfig; } diff --git a/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/entities/Property.java b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/entities/Property.java index a3a0e9359..8dc4f4ae9 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/entities/Property.java +++ b/dmp-backend/web/src/main/java/eu/eudat/configurations/dynamicproject/entities/Property.java @@ -1,12 +1,10 @@ package eu.eudat.configurations.dynamicproject.entities; + import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import java.util.List; -/** - * Created by ikalyvas on 3/23/2018. - */ public class Property { private String id; private String name; diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/Admin.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/Admin.java index 0fac64e6a..12cab1917 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/Admin.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/Admin.java @@ -1,73 +1,152 @@ package eu.eudat.controllers; +import eu.eudat.core.logger.Logger; +import eu.eudat.data.query.items.table.datasetprofile.DatasetProfileTableRequestItem; +import eu.eudat.exceptions.datasetprofile.DatasetProfileNewVersionException; +import eu.eudat.exceptions.datasetprofile.DatasetProfileWithDatasetsExeption; import eu.eudat.logic.managers.AdminManager; -import eu.eudat.models.data.admin.composite.DatasetProfile; -import eu.eudat.models.data.helpers.responses.ResponseItem; -import eu.eudat.models.data.security.Principal; +import eu.eudat.logic.managers.DatasetProfileManager; +import eu.eudat.logic.managers.UserManager; import eu.eudat.logic.security.claims.ClaimedAuthorities; import eu.eudat.logic.services.ApiContext; +import eu.eudat.models.data.admin.composite.DatasetProfile; +import eu.eudat.models.data.datasetprofile.DatasetProfileListingModel; +import eu.eudat.models.data.helpers.common.DataTableData; +import eu.eudat.models.data.helpers.responses.ResponseItem; +import eu.eudat.models.data.security.Principal; +import eu.eudat.models.data.user.composite.PagedDatasetProfile; import eu.eudat.types.ApiMessageCode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.transaction.Transactional; import javax.validation.Valid; +import java.io.IOException; +import java.util.List; import java.util.UUID; import static eu.eudat.types.Authorities.ADMIN; @RestController @CrossOrigin -@RequestMapping(value = {"/api"}) +@RequestMapping(value = {"/api/admin/"}) public class Admin extends BaseController { - @Autowired - public Admin(ApiContext apiContext) { - super(apiContext); - } + private DatasetProfileManager datasetProfileManager; + private UserManager userManager; - @Transactional - @RequestMapping(method = RequestMethod.POST, value = {"/admin/addDmp"}, consumes = "application/json", produces = "application/json") - public ResponseEntity addDmp(@Valid @RequestBody DatasetProfile profile, @ClaimedAuthorities(claims = {ADMIN}) Principal principal) { - try { - eu.eudat.data.entities.DatasetProfile modelDefinition = AdminManager.generateViewStyleDefinition(profile, getApiContext()); - this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetProfileDao().createOrUpdate(modelDefinition); - return ResponseEntity.status(HttpStatus.OK).body(modelDefinition.getId()); - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("{\"reason\":\"" + ex.getMessage() + "\"}"); - } - } + @Autowired + public Admin(ApiContext apiContext, DatasetProfileManager datasetProfileManager, UserManager userManager, Logger logger) { + super(apiContext); + this.datasetProfileManager = datasetProfileManager; + this.userManager = userManager; + } - @Transactional - @RequestMapping(method = RequestMethod.POST, value = {"/admin/addDmp/{id}"}, consumes = "application/json", produces = "application/json") - public ResponseEntity> updateDmp(@PathVariable String id, @RequestBody DatasetProfile profile, @ClaimedAuthorities(claims = {ADMIN}) Principal principal) { - try { - eu.eudat.data.entities.DatasetProfile modelDefinition = AdminManager.generateViewStyleDefinition(profile, getApiContext()); + @Transactional + @RequestMapping(method = RequestMethod.POST, value = {"/addDmp"}, consumes = "application/json", produces = "application/json") + public ResponseEntity addDmp(@Valid @RequestBody DatasetProfile profile, @ClaimedAuthorities(claims = {ADMIN}) Principal principal) { + //this.getLoggerService().info(principal, "Admin Added Dataset Profile"); + DatasetProfile shortenProfile = profile.toShort(); + eu.eudat.data.entities.DatasetProfile modelDefinition = AdminManager.generateViewStyleDefinition(shortenProfile, getApiContext()); + modelDefinition.setGroupId(UUID.randomUUID()); + modelDefinition.setVersion((short) 0); + this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetProfileDao().createOrUpdate(modelDefinition); + return ResponseEntity.status(HttpStatus.OK).body(modelDefinition.getId()); + } - eu.eudat.data.entities.DatasetProfile datasetprofile = this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(UUID.fromString(id)); - datasetprofile.setDefinition(modelDefinition.getDefinition()); - this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetProfileDao().createOrUpdate(datasetprofile); + @Transactional + @RequestMapping(method = RequestMethod.POST, value = {"/addDmp/{id}"}, consumes = "application/json", produces = "application/json") + public ResponseEntity> updateDmp(@PathVariable String id, @RequestBody DatasetProfile profile, @ClaimedAuthorities(claims = {ADMIN}) Principal principal) { + DatasetProfile shortenProfile = profile.toShort(); + eu.eudat.data.entities.DatasetProfile modelDefinition = AdminManager.generateViewStyleDefinition(shortenProfile, getApiContext()); + eu.eudat.data.entities.DatasetProfile datasetprofile = this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(UUID.fromString(id)); + datasetprofile.setDefinition(modelDefinition.getDefinition()); + datasetprofile.setStatus(modelDefinition.getStatus()); + datasetprofile.setLabel(modelDefinition.getLabel()); + datasetprofile.setDescription(modelDefinition.getDescription()); + this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetProfileDao().createOrUpdate(datasetprofile); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE)); + } - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE)); - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); - } - } + @Transactional + @RequestMapping(method = RequestMethod.POST, value = {"/newVersion/{id}"}, produces = "application/json") + public ResponseEntity newVersionDatasetProfile(@PathVariable String id, @RequestBody DatasetProfile profile, @ClaimedAuthorities(claims = {ADMIN}) Principal principal) throws Exception { + try { + eu.eudat.data.entities.DatasetProfile modelDefinition = this.datasetProfileManager.createNewVersionDatasetProfile(id, profile); + return ResponseEntity.status(HttpStatus.OK).body(modelDefinition.getId()); + } catch (DatasetProfileNewVersionException exception) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message(exception.getMessage())); + } + } + + @RequestMapping(method = RequestMethod.GET, value = {"/get/{id}"}, produces = "application/json") + public ResponseEntity> get(@PathVariable String id, @ClaimedAuthorities(claims = {ADMIN}) Principal principal) { + eu.eudat.models.data.admin.composite.DatasetProfile datasetprofile = this.datasetProfileManager.getDatasetProfile(id); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(datasetprofile)); + } + + @RequestMapping(method = RequestMethod.POST, value = {"/datasetprofiles/getPaged"}, produces = "application/json") + public @ResponseBody + ResponseEntity>> getPaged(@RequestBody DatasetProfileTableRequestItem datasetProfileTableRequestItem, Principal principal) throws Exception { + DataTableData datasetProfileTableData = this.datasetProfileManager.getPaged(datasetProfileTableRequestItem); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(datasetProfileTableData)); + } + + @RequestMapping(method = RequestMethod.POST, value = {"/preview"}, consumes = "application/json", produces = "application/json") + public ResponseEntity> getPreview(@RequestBody DatasetProfile profile, @ClaimedAuthorities(claims = {ADMIN}) Principal principal) { + eu.eudat.data.entities.DatasetProfile modelDefinition = AdminManager.generateViewStyleDefinition(profile, getApiContext()); + eu.eudat.models.data.user.composite.DatasetProfile datasetProfile = userManager.generateDatasetProfileModel(modelDefinition); + PagedDatasetProfile pagedDatasetProfile = new PagedDatasetProfile(); + pagedDatasetProfile.buildPagedDatasetProfile(datasetProfile); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(pagedDatasetProfile)); + } + + @Transactional + @RequestMapping(method = RequestMethod.POST, value = {"/datasetprofile/clone/{id}"}, consumes = "application/json", produces = "application/json") + public ResponseEntity> clone(@PathVariable String id, @ClaimedAuthorities(claims = {ADMIN}) Principal principal) { + eu.eudat.data.entities.DatasetProfile profile = this.datasetProfileManager.clone(id); + eu.eudat.models.data.admin.composite.DatasetProfile datasetprofile = AdminManager.generateDatasetProfileModel(profile); + datasetprofile.setLabel(profile.getLabel() + " new "); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(datasetprofile)); + } + + @Transactional + @RequestMapping(method = RequestMethod.DELETE, value = {"{id}"}, consumes = "application/json", produces = "application/json") + public @ResponseBody + ResponseEntity> inactivate(@PathVariable String id, Principal principal) { + try { + eu.eudat.data.entities.DatasetProfile ret = AdminManager.inactivate(this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetProfileDao(), this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetDao(), id); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE)); + } catch (DatasetProfileWithDatasetsExeption exception) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.UNSUCCESS_DELETE).message(exception.getMessage())); + } + } + + @Transactional + @RequestMapping(method = RequestMethod.GET, value = {"/getXml/{id}"}, produces = "application/json") + public ResponseEntity getDatasetProfileXml(@PathVariable String id, @RequestHeader("Content-Type") String contentType, @ClaimedAuthorities(claims = {ADMIN}) Principal principal) throws IllegalAccessException, IOException, InstantiationException { + if (contentType.equals("application/xml")) { + eu.eudat.data.entities.DatasetProfile profile = this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(UUID.fromString(id)); + eu.eudat.models.data.user.composite.DatasetProfile datasetProfile = userManager.generateDatasetProfileModel(profile); + datasetProfile.setStatus(profile.getStatus()); + return this.datasetProfileManager.getDocument(datasetProfile, profile.getLabel()); + } else { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message("NOT AUTHORIZE")); + } + } + + @RequestMapping(method = RequestMethod.POST, value = {"/upload"}) + public ResponseEntity setDatasetProfileXml(@RequestParam("file") MultipartFile file, + @ClaimedAuthorities(claims = {ADMIN}) Principal principal) throws IllegalAccessException, IOException { + eu.eudat.logic.utilities.documents.xml.datasetProfileXml.datasetProfileModel.DatasetProfile datasetProfileModel = this.datasetProfileManager.createDatasetProfileFromXml(file); + eu.eudat.models.data.admin.composite.DatasetProfile datasetProfileEntity = datasetProfileModel.toAdminCompositeModel(file.getOriginalFilename()); + eu.eudat.data.entities.DatasetProfile modelDefinition = AdminManager.generateViewStyleDefinition(datasetProfileEntity, getApiContext()); + this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetProfileDao().createOrUpdate(modelDefinition); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>() + .status(ApiMessageCode.SUCCESS_MESSAGE).message("")); + } - @RequestMapping(method = RequestMethod.GET, value = {"/admin/get/{id}"}, produces = "application/json") - public ResponseEntity> get(@PathVariable String id, @ClaimedAuthorities(claims = {ADMIN}) Principal principal) { - try { - eu.eudat.data.entities.DatasetProfile profile = this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(UUID.fromString(id)); - eu.eudat.models.data.admin.composite.DatasetProfile datasetprofile = AdminManager.generateDatasetProfileModel(profile); - datasetprofile.setLabel(profile.getLabel()); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(datasetprofile)); - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE)); - } - } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/BaseController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/BaseController.java index 54bc1a41d..147f91f22 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/BaseController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/BaseController.java @@ -1,5 +1,6 @@ package eu.eudat.controllers; +import eu.eudat.core.logger.Logger; import eu.eudat.logic.services.ApiContext; import eu.eudat.models.validators.*; import org.springframework.web.bind.WebDataBinder; @@ -8,13 +9,20 @@ import org.springframework.web.bind.annotation.InitBinder; public abstract class BaseController { + private Logger logger; + private ApiContext apiContext; public ApiContext getApiContext() { return apiContext; } + public Logger getLoggerService() { + return logger; + } + public BaseController(ApiContext apiContext) { + this.apiContext = apiContext; } @@ -22,12 +30,12 @@ public abstract class BaseController { protected void initBinder(WebDataBinder binder) { if (binder.getTarget() != null && DataManagementPlanTableRequestValidator.supportsType((binder.getTarget().getClass()))) binder.addValidators(this.apiContext.getOperationsContext().getApplicationContext().getBean("dataManagementPlanTableRequestValidator", DataManagementPlanTableRequestValidator.class)); - if (binder.getTarget() != null && ProjectTableRequestValidator.supportsType((binder.getTarget().getClass()))) - binder.addValidators(this.apiContext.getOperationsContext().getApplicationContext().getBean("projectTableRequestValidator", ProjectTableRequestValidator.class)); + if (binder.getTarget() != null && GrantTableRequestValidator.supportsType((binder.getTarget().getClass()))) + binder.addValidators(this.apiContext.getOperationsContext().getApplicationContext().getBean("grantTableRequestValidator", GrantTableRequestValidator.class)); if (binder.getTarget() != null && DatasetProfileValidator.supportsType((binder.getTarget().getClass()))) binder.addValidators(this.apiContext.getOperationsContext().getApplicationContext().getBean("datasetProfileValidator", DatasetProfileValidator.class)); - if (binder.getTarget() != null && ProjectModelValidator.supportsType((binder.getTarget().getClass()))) - binder.addValidators(this.apiContext.getOperationsContext().getApplicationContext().getBean("projectModelValidator", ProjectModelValidator.class)); + if (binder.getTarget() != null && GrantModelValidator.supportsType((binder.getTarget().getClass()))) + binder.addValidators(this.apiContext.getOperationsContext().getApplicationContext().getBean("grantModelValidator", GrantModelValidator.class)); if (binder.getTarget() != null && DataManagementPlanNewVersionValidator.supportsType((binder.getTarget().getClass()))) binder.addValidators(this.apiContext.getOperationsContext().getApplicationContext().getBean("dataManagementPlanNewVersionValidator", DataManagementPlanNewVersionValidator.class)); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/CommonController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/CommonController.java index 5dcda39cb..7df80c1fa 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/CommonController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/CommonController.java @@ -1,11 +1,11 @@ package eu.eudat.controllers; -import eu.eudat.configurations.dynamicproject.DynamicProjectConfiguration; -import eu.eudat.configurations.dynamicproject.entities.Language; +import eu.eudat.configurations.dynamicgrant.DynamicGrantConfiguration; +import eu.eudat.configurations.dynamicgrant.entities.Language; import eu.eudat.logic.managers.CommonsManager; +import eu.eudat.logic.proxy.config.configloaders.ConfigLoader; import eu.eudat.models.data.externalurl.ExternalSourcesConfiguration; import eu.eudat.models.data.helpers.responses.ResponseItem; -import eu.eudat.logic.proxy.config.configloaders.ConfigLoader; import eu.eudat.types.ApiMessageCode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -22,36 +22,17 @@ import java.util.List; @RequestMapping(value = {"/api/common"}) public class CommonController { - private DynamicProjectConfiguration dynamicProjectConfiguration; private ConfigLoader configLoader; @Autowired - public CommonController(DynamicProjectConfiguration dynamicProjectConfiguration, ConfigLoader configLoader) { - this.dynamicProjectConfiguration = dynamicProjectConfiguration; + public CommonController(ConfigLoader configLoader) { this.configLoader = configLoader; } - @RequestMapping(method = RequestMethod.GET, value = {"/language"}, produces = "application/json") - public @ResponseBody - ResponseEntity>> getPaged() { - try { - List language = this.dynamicProjectConfiguration.getConfiguration().getMainExternalField().getLanguage(); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(language)); - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem>().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); - } - } - @RequestMapping(method = RequestMethod.GET, value = {"/externalSourcesConfiguration"}, produces = "application/json") public @ResponseBody ResponseEntity> getExternalSourcesConfiguration() { - try { - ExternalSourcesConfiguration configuration = CommonsManager.getExternalSourcesConfiguration(configLoader); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(configuration)); - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); - } + ExternalSourcesConfiguration configuration = CommonsManager.getExternalSourcesConfiguration(configLoader); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(configuration)); } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/ContactEmail.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/ContactEmail.java new file mode 100644 index 000000000..5b0054cac --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/ContactEmail.java @@ -0,0 +1,38 @@ +package eu.eudat.controllers; + +import eu.eudat.logic.managers.ContactEmailManager; +import eu.eudat.models.data.ContactEmail.ContactEmailModel; +import eu.eudat.models.data.helpers.responses.ResponseItem; +import eu.eudat.models.data.security.Principal; +import eu.eudat.types.ApiMessageCode; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import javax.transaction.Transactional; + +@RestController +@CrossOrigin +@RequestMapping(value = "api/contactEmail") +public class ContactEmail { + + private ContactEmailManager contactEmailManager; + + public ContactEmail(ContactEmailManager contactEmailManager) { + this.contactEmailManager = contactEmailManager; + } + + @Transactional + @RequestMapping(method = RequestMethod.POST, consumes = "application/json", produces = "application/json") + public @ResponseBody + ResponseEntity sendContactEmail(@RequestBody ContactEmailModel contactEmailModel, Principal principal) { + try { + this.contactEmailManager.emailValidation(contactEmailModel); + this.contactEmailManager.sendContactEmail(contactEmailModel, principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE)); + } catch (Exception ex) { + ex.printStackTrace(); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message(ex.getMessage())); + } + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPProfileController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPProfileController.java index ea9549d8e..a53653305 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPProfileController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPProfileController.java @@ -1,24 +1,32 @@ package eu.eudat.controllers; +import eu.eudat.data.dao.criteria.RequestItem; import eu.eudat.data.entities.DMPProfile; -import eu.eudat.data.query.items.item.dmpprofile.DataManagementPlanProfileCriteriaRequest; import eu.eudat.data.query.items.table.dmpprofile.DataManagementPlanProfileTableRequest; import eu.eudat.logic.managers.DataManagementProfileManager; +import eu.eudat.logic.security.claims.ClaimedAuthorities; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.models.data.helpermodels.Tuple; +import eu.eudat.models.data.helpers.common.AutoCompleteLookupItem; import eu.eudat.models.data.helpers.common.DataTableData; import eu.eudat.models.data.helpers.responses.ResponseItem; import eu.eudat.models.data.listingmodels.DataManagementPlanProfileListingModel; import eu.eudat.models.data.security.Principal; -import eu.eudat.logic.services.ApiContext; import eu.eudat.types.ApiMessageCode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.validation.Valid; +import javax.xml.xpath.XPathExpressionException; +import java.io.IOException; import java.util.List; +import static eu.eudat.types.Authorities.ADMIN; + /** * Created by ikalyvas on 3/21/2018. */ @@ -27,58 +35,60 @@ import java.util.List; @RequestMapping(value = {"/api/dmpprofile"}) public class DMPProfileController extends BaseController { + private DataManagementProfileManager dataManagementProfileManager; + @Autowired - public DMPProfileController(ApiContext apiContext) { + public DMPProfileController(ApiContext apiContext, DataManagementProfileManager dataManagementProfileManager) { super(apiContext); + this.dataManagementProfileManager = dataManagementProfileManager; } @Transactional - @RequestMapping(method = RequestMethod.POST, value = {"/createOrUpdate"}, consumes = "application/json", produces = "application/json") + @RequestMapping(method = RequestMethod.POST, consumes = "application/json", produces = "application/json") public @ResponseBody - ResponseEntity> createOrUpdate(@RequestBody DataManagementPlanProfileListingModel dataManagementPlan, Principal principal) { - try { - DataManagementProfileManager.createOrUpdate(this.getApiContext(), dataManagementPlan, principal); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message("Created")); - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); - } + ResponseEntity> createOrUpdate(@RequestBody DataManagementPlanProfileListingModel dataManagementPlan, Principal principal) throws Exception { + this.dataManagementProfileManager.createOrUpdate(dataManagementPlan, principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message("Created")); } @RequestMapping(method = RequestMethod.GET, value = {"/getSingle/{id}"}, produces = "application/json") public @ResponseBody - ResponseEntity> getSingle(@PathVariable String id, Principal principal) { - try { - DataManagementPlanProfileListingModel dataManagementPlanProfileListingModel = new DataManagementProfileManager().getSingle(this.getApiContext().getOperationsContext().getDatabaseRepository().getDmpProfileDao(), id, principal); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(dataManagementPlanProfileListingModel)); - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); - } + ResponseEntity> getSingle(@PathVariable String id, Principal principal) throws IllegalAccessException, InstantiationException { + DataManagementPlanProfileListingModel dataManagementPlanProfileListingModel = this.dataManagementProfileManager.getSingle(id, principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(dataManagementPlanProfileListingModel)); } @RequestMapping(method = RequestMethod.POST, value = {"/getPaged"}, consumes = "application/json", produces = "application/json") public @ResponseBody - ResponseEntity>> getPaged(@Valid @RequestBody DataManagementPlanProfileTableRequest dataManagementPlanProfileTableRequest, Principal principal) { - try { - DataTableData dataTable = new DataManagementProfileManager().getPaged(this.getApiContext(), dataManagementPlanProfileTableRequest, principal); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(dataTable)); - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem>().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); - } + ResponseEntity>> getPaged(@Valid @RequestBody DataManagementPlanProfileTableRequest dataManagementPlanProfileTableRequest, Principal principal) throws Exception { + DataTableData dataTable = this.dataManagementProfileManager.getPaged(dataManagementPlanProfileTableRequest, principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(dataTable)); } - @RequestMapping(method = RequestMethod.POST, value = {"/get"}, consumes = "application/json", produces = "application/json") + @RequestMapping(method = RequestMethod.GET, value = {"/getXml/{id}"}, produces = "application/json") public @ResponseBody - ResponseEntity>> getWithCriteria(@RequestBody DataManagementPlanProfileCriteriaRequest dataManagementPlanCriteria, Principal principal) { - try { - List dataTable = new DataManagementProfileManager().getWithCriteria(this.getApiContext().getOperationsContext().getDatabaseRepository().getDmpProfileDao(), dataManagementPlanCriteria); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(dataTable)); - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem>().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); + ResponseEntity getXml( @RequestHeader("Content-Type") String contentType, @PathVariable String id, Principal principal) throws IllegalAccessException, InstantiationException, IOException { + if (contentType.equals("application/xml")) { + DataManagementPlanProfileListingModel dataManagementPlanProfileListingModel = this.dataManagementProfileManager.getSingle(id, principal); + return this.dataManagementProfileManager.getDocument(dataManagementPlanProfileListingModel,dataManagementPlanProfileListingModel.getLabel()); + }else { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message("NOT AUTHORIZE")); } } + @RequestMapping(method = RequestMethod.POST, value = {"/upload"}) + public ResponseEntity setDatasetProfileXml(@RequestParam("file") MultipartFile file, + @ClaimedAuthorities(claims = {ADMIN}) Principal principal) throws IllegalAccessException,IOException,Exception{ + eu.eudat.logic.utilities.documents.xml.dmpXml.dmpProfileModel.DmpProfile dmpProfileModel = this.dataManagementProfileManager.createDmpProfileFromXml(file); + DataManagementPlanProfileListingModel dataManagementPlan = dmpProfileModel.toDmpProfileCompositeModel(file.getOriginalFilename()); + this.dataManagementProfileManager.createOrUpdate(dataManagementPlan, principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>() + .status(ApiMessageCode.SUCCESS_MESSAGE).message("")); + } + + @RequestMapping(method = RequestMethod.POST, value = {"/search/autocomplete"}) + public ResponseEntity getExternalAutocomplete(@RequestBody RequestItem lookupItem) throws XPathExpressionException { + List> items = this.dataManagementProfileManager.getExternalAutocomplete(lookupItem); + return ResponseEntity.status(HttpStatus.OK).body(items); + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java index fceb66f96..f7323b650 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java @@ -1,150 +1,272 @@ package eu.eudat.controllers; +import eu.eudat.configurations.dynamicgrant.DynamicGrantConfiguration; +import eu.eudat.criteria.DMPCriteria; import eu.eudat.data.dao.criteria.DynamicFieldsCriteria; import eu.eudat.data.dao.criteria.RequestItem; import eu.eudat.data.entities.DMP; -import eu.eudat.data.query.items.item.dmp.DataManagementPlanCriteriaRequest; +import eu.eudat.data.query.items.table.datasetprofile.DatasetProfileTableRequestItem; import eu.eudat.data.query.items.table.dmp.DataManagementPlanTableRequest; -import eu.eudat.configurations.dynamicproject.DynamicProjectConfiguration; -import eu.eudat.exceptions.datamanagementplan.DMPWithDatasetsException; -import eu.eudat.exceptions.security.UnauthorisedException; +import eu.eudat.data.query.items.table.dmp.DataManagmentPlanPublicTableRequest; +import eu.eudat.exceptions.datamanagementplan.DMPNewVersionException; +import eu.eudat.exceptions.datamanagementplan.DMPWithDatasetsDeleteException; import eu.eudat.logic.managers.DataManagementPlanManager; +import eu.eudat.logic.managers.DatasetManager; +import eu.eudat.logic.security.claims.ClaimedAuthorities; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.logic.services.operations.DatabaseRepository; +import eu.eudat.models.data.datasetprofile.DatasetProfileListingModel; +import eu.eudat.models.data.datasetwizard.DatasetsToBeFinalized; import eu.eudat.models.data.dmp.DataManagementPlan; import eu.eudat.models.data.helpermodels.Tuple; import eu.eudat.models.data.helpers.common.DataTableData; import eu.eudat.models.data.helpers.responses.ResponseItem; import eu.eudat.models.data.listingmodels.DataManagementPlanListingModel; +import eu.eudat.models.data.listingmodels.DataManagementPlanOverviewModel; import eu.eudat.models.data.security.Principal; -import eu.eudat.logic.services.ApiContext; +import eu.eudat.query.DMPQuery; import eu.eudat.types.ApiMessageCode; +import eu.eudat.types.Authorities; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import javax.activation.MimetypesFileTypeMap; import javax.validation.Valid; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; import java.util.List; +import java.util.Map; import java.util.UUID; @RestController @CrossOrigin -@RequestMapping(value = {"/api"}) +@RequestMapping(value = {"/api/dmps/"}) public class DMPs extends BaseController { - private DynamicProjectConfiguration dynamicProjectConfiguration; + private DynamicGrantConfiguration dynamicGrantConfiguration; + private Environment environment; + private DataManagementPlanManager dataManagementPlanManager; + private DatasetManager datasetManager; @Autowired - public DMPs(ApiContext apiContext, DynamicProjectConfiguration dynamicProjectConfiguration) { + public DMPs(ApiContext apiContext, DynamicGrantConfiguration dynamicGrantConfiguration, Environment environment, + DataManagementPlanManager dataManagementPlanManager, DatasetManager datasetManager) { super(apiContext); - this.dynamicProjectConfiguration = dynamicProjectConfiguration; + this.dynamicGrantConfiguration = dynamicGrantConfiguration; + this.environment = environment; + this.dataManagementPlanManager = dataManagementPlanManager; + this.datasetManager = datasetManager; } - @RequestMapping(method = RequestMethod.POST, value = {"/dmps/getPaged"}, consumes = "application/json", produces = "application/json") + @Transactional + @RequestMapping(method = RequestMethod.GET, value = {"{id}/unlock"}, produces = "application/json") public @ResponseBody - ResponseEntity>> getPaged(@Valid @RequestBody DataManagementPlanTableRequest dataManagementPlanTableRequest, Principal principal) { - try { - DataTableData dataTable = new DataManagementPlanManager().getPaged(this.getApiContext(), dataManagementPlanTableRequest, principal); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(dataTable)); - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem>().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); - } + ResponseEntity> unlock(@PathVariable(value = "id") UUID id, Principal principal) throws Exception { + this.dataManagementPlanManager.unlock(id); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message("Unlocked")); } - @RequestMapping(method = RequestMethod.GET, value = {"/dmps/getSingle/{id}"}, produces = "application/json") + @RequestMapping(method = RequestMethod.POST, value = {"/paged"}, consumes = "application/json", produces = "application/json") public @ResponseBody - ResponseEntity> getSingle(@PathVariable String id, Principal principal) { - try { - eu.eudat.models.data.dmp.DataManagementPlan dataManagementPlan = new DataManagementPlanManager().getSingle(this.getApiContext().getOperationsContext().getDatabaseRepository().getDmpDao(), id, principal, this.dynamicProjectConfiguration); + ResponseEntity>> getPaged(@Valid @RequestBody DataManagementPlanTableRequest dataManagementPlanTableRequest, @RequestParam String fieldsGroup, Principal principal) throws Exception { + DataTableData dataTable = this.dataManagementPlanManager.getPaged(dataManagementPlanTableRequest, principal, fieldsGroup); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(dataTable)); + } + + @RequestMapping(method = RequestMethod.GET, value = {"{id}"}) + public @ResponseBody + ResponseEntity getSingle(@PathVariable String id, @RequestHeader("Content-Type") String contentType, Principal principal) throws IllegalAccessException, InstantiationException, IOException { + if (contentType.equals("application/xml") || contentType.equals("application/msword")) { //|| contentType.equals("application/pdf") + ResponseEntity document = this.dataManagementPlanManager.getDocument(id, contentType); + return document; + } else { + eu.eudat.models.data.dmp.DataManagementPlan dataManagementPlan = this.dataManagementPlanManager.getSingle(id, principal, this.dynamicGrantConfiguration); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(dataManagementPlan)); - - }catch (UnauthorisedException ex) { - throw ex; } - catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); + } + + @RequestMapping(method = RequestMethod.POST, value = {"/datasetProfilesUsedByDmps/paged"}, produces = "application/json") + public @ResponseBody + ResponseEntity>> getUsingDatasetProfilesPaged(@RequestBody DatasetProfileTableRequestItem datasetProfileTableRequestItem, Principal principal) { + DataTableData datasetProfileTableData = this.dataManagementPlanManager.getDatasetProfilesUsedByDMP(datasetProfileTableRequestItem, principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(datasetProfileTableData)); + } + + @RequestMapping(method = RequestMethod.GET, value = {"rda/{id}"}) + public @ResponseBody + ResponseEntity getRDAJsonDocument(@PathVariable String id, Principal principal) throws IOException { + return this.dataManagementPlanManager.getRDAJsonDocument(id); + } + + @RequestMapping(method = RequestMethod.GET, value = {"/overview/{id}"}) + public @ResponseBody + ResponseEntity getOverviewSingle(@PathVariable String id, Principal principal) throws IllegalAccessException, InstantiationException { + DataManagementPlanOverviewModel dataManagementPlan = this.dataManagementPlanManager.getOverviewSingle(id, principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(dataManagementPlan)); + } + + @RequestMapping(method = RequestMethod.GET, value = {"/public/{id}"}) + public @ResponseBody + ResponseEntity getSinglePublic(@PathVariable String id) { + try { + eu.eudat.models.data.dmp.DataManagementPlan dataManagementPlan = this.dataManagementPlanManager.getSinglePublic(id, this.dynamicGrantConfiguration); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(dataManagementPlan)); + } catch (Exception ex) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).message(ex.getMessage())); + } + } + + @RequestMapping(method = RequestMethod.GET, value = {"/publicOverview/{id}"}) + public @ResponseBody + ResponseEntity getOverviewSinglePublic(@PathVariable String id) { + try { + DataManagementPlanOverviewModel dataManagementPlan = this.dataManagementPlanManager.getOverviewSinglePublic(id); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(dataManagementPlan)); + } catch (Exception ex) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).message(ex.getMessage())); } } @Transactional - @RequestMapping(method = RequestMethod.POST, value = {"/dmps/createOrUpdate"}, consumes = "application/json", produces = "application/json") + @RequestMapping(method = RequestMethod.POST, consumes = "application/json", produces = "application/json") public @ResponseBody - ResponseEntity> createOrUpdate(@RequestBody eu.eudat.models.data.dmp.DataManagementPlan dataManagementPlan, Principal principal) { - try { - DataManagementPlanManager.createOrUpdate(this.getApiContext(), dataManagementPlan, principal); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message("Created")); - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); - } + ResponseEntity> createOrUpdate(@RequestBody eu.eudat.models.data.dmp.DataManagementPlanEditorModel dataManagementPlanEditorModel, Principal principal) throws Exception { + DMP dmp = this.dataManagementPlanManager.createOrUpdate(this.getApiContext(), dataManagementPlanEditorModel, principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message("Created").payload(dmp.getId())); } - @RequestMapping(method = RequestMethod.POST, value = {"/dmps/new/{id}"}, consumes = "application/json", produces = "application/json") + @RequestMapping(method = RequestMethod.POST, value = {"/new/{id}"}, consumes = "application/json", produces = "application/json") public @ResponseBody - ResponseEntity> newVersion(@PathVariable UUID id, @Valid @RequestBody eu.eudat.models.data.dmp.DataManagementPlanNewVersionModel dataManagementPlan, Principal principal) { + ResponseEntity> newVersion(@PathVariable UUID id, @Valid @RequestBody eu.eudat.models.data.dmp.DataManagementPlanNewVersionModel dataManagementPlan, Principal principal) throws Exception { try { - DataManagementPlanManager.newVersion(this.getApiContext(), id, dataManagementPlan, principal); + this.dataManagementPlanManager.newVersion(id, dataManagementPlan, principal); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE)); - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); + } catch (DMPNewVersionException exception) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message(exception.getMessage())); } } - @RequestMapping(method = RequestMethod.POST, value = {"/dmps/clone/{id}"}, consumes = "application/json", produces = "application/json") + @RequestMapping(method = RequestMethod.POST, value = {"/clone/{id}"}, consumes = "application/json", produces = "application/json") public @ResponseBody - ResponseEntity> clone(@PathVariable UUID id, @RequestBody eu.eudat.models.data.dmp.DataManagementPlanNewVersionModel dataManagementPlan, Principal principal) { - try { - DataManagementPlanManager.clone(this.getApiContext(), id, dataManagementPlan, principal); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE)); - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); - } - } - - @RequestMapping(method = RequestMethod.POST, value = {"/dmps/get"}, consumes = "application/json", produces = "application/json") - public @ResponseBody - ResponseEntity>> getWithCriteria(@RequestBody DataManagementPlanCriteriaRequest dataManagementPlanCriteria, Principal principal) { - try { - List dataTable = new DataManagementPlanManager().getWithCriteria(this.getApiContext().getOperationsContext().getDatabaseRepository().getDmpDao(), dataManagementPlanCriteria); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(dataTable)); - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem>().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); - } + ResponseEntity> clone(@PathVariable UUID id, @RequestBody eu.eudat.models.data.dmp.DataManagementPlanNewVersionModel dataManagementPlan, Principal principal) throws Exception { + this.dataManagementPlanManager.clone(dataManagementPlan, principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE)); } @Transactional - @RequestMapping(method = RequestMethod.DELETE, value = {"/dmps/delete/{id}"}, consumes = "application/json", produces = "application/json") + @RequestMapping(method = RequestMethod.DELETE, value = {"{id}"}, consumes = "application/json", produces = "application/json") public @ResponseBody ResponseEntity> delete(@PathVariable UUID id, Principal principal) { try { - DataManagementPlanManager.delete(this.getApiContext(), id); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message("Successfully Deleted Dataset")); - } catch (DMPWithDatasetsException ex) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message(ex.getMessage())); - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); + this.dataManagementPlanManager.delete(id); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message("Successfully Deleted Datamanagement Plan")); + } catch (DMPWithDatasetsDeleteException exception) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message(exception.getMessage())); } } - @RequestMapping(method = RequestMethod.POST, value = {"/dmps/dynamic"}, consumes = "application/json", produces = "application/json") + @RequestMapping(method = RequestMethod.POST, value = {"/dynamic"}, consumes = "application/json", produces = "application/json") public @ResponseBody - ResponseEntity>>> getWithCriteria(@RequestBody RequestItem criteriaRequestItem, Principal principal) { + ResponseEntity>>> getWithCriteria(@RequestBody RequestItem criteriaRequestItem, Principal principal) throws InstantiationException, IllegalAccessException { + List> dataTable = this.dataManagementPlanManager.getDynamicFields(criteriaRequestItem.getCriteria().getId(), this.dynamicGrantConfiguration, criteriaRequestItem.getCriteria()); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>>().status(ApiMessageCode.NO_MESSAGE).payload(dataTable)); + } + + @RequestMapping(method = RequestMethod.GET, value = {"/getPDF/{id}"}) + public @ResponseBody + ResponseEntity getPDFDocument(@PathVariable String id, @RequestHeader("Content-Type") String contentType) throws IllegalAccessException, IOException, InstantiationException, InterruptedException { + File file = this.dataManagementPlanManager.getWordDocument(id); + String name = file.getName().substring(0, file.getName().length() - 5); + File pdffile = datasetManager.convertToPDF(file, environment, name); + InputStream resource = new FileInputStream(pdffile); + System.out.println("Mime Type of " + file.getName() + " is " + + new MimetypesFileTypeMap().getContentType(file)); + HttpHeaders responseHeaders = new HttpHeaders(); + responseHeaders.setContentLength(pdffile.length()); + responseHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM); + responseHeaders.set("Content-Disposition", "attachment;filename=" + pdffile.getName()); + responseHeaders.set("Access-Control-Expose-Headers", "Content-Disposition"); + responseHeaders.get("Access-Control-Expose-Headers").add("Content-Type"); + + byte[] content = org.apache.poi.util.IOUtils.toByteArray(resource); + resource.close(); + Files.deleteIfExists(file.toPath()); + Files.deleteIfExists(pdffile.toPath()); + return new ResponseEntity<>(content, + responseHeaders, + HttpStatus.OK); + } + + @RequestMapping(method = RequestMethod.POST, value = {"/upload"}) + public ResponseEntity dmpXmlUpload(@RequestParam("file") MultipartFile[] files, Principal principal) throws Exception { + this.dataManagementPlanManager.createDmpFromXml(this.getApiContext(), files, principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem() + .status(ApiMessageCode.SUCCESS_MESSAGE)); + } + + @RequestMapping(method = RequestMethod.POST, value = {"/public/paged"}, consumes = "application/json", produces = "application/json") + public @ResponseBody + ResponseEntity>> getPublicPaged(@RequestBody DataManagmentPlanPublicTableRequest dmpTableRequest, @RequestParam String fieldsGroup) throws Exception { + DataTableData dmp = this.dataManagementPlanManager.getPaged(dmpTableRequest, fieldsGroup); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(dmp)); + } + + @RequestMapping(method = RequestMethod.POST, value = {"/test"}, consumes = "application/json", produces = "application/json") + public @ResponseBody + ResponseEntity>> test(@RequestBody DMPCriteria criteria, @ClaimedAuthorities(claims = {Authorities.ANONYMOUS}) Principal principal) throws Exception { + DatabaseRepository dbRepo = this.getApiContext().getOperationsContext().getDatabaseRepository(); + + DMPQuery query = criteria.buildQuery(dbRepo); + + List models = query.getQuery().toListWithFields(); + DataTableData dmp = new DataTableData<>(); + dmp.setData(models); + dmp.setTotalCount(query.getQuery().count()); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(dmp)); + } + + @RequestMapping(method = RequestMethod.GET, value = {"/makepublic/{id}"}) + public ResponseEntity> makePublic(@PathVariable String id, Principal principal) { try { - List> dataTable = new DataManagementPlanManager().getDynamicFields(criteriaRequestItem.getCriteria().getId(), this.dynamicProjectConfiguration,criteriaRequestItem.getCriteria() ); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>>().status(ApiMessageCode.NO_MESSAGE).payload(dataTable)); - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem>>().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); + this.dataManagementPlanManager.makePublic(UUID.fromString(id), principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message("Successfully Data Datamanagement Plan made public.")); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message(e.getMessage())); } } -} + @Transactional + @RequestMapping(method = RequestMethod.POST, value = {"/finalize/{id}"}) + public ResponseEntity> makeFinalize(@PathVariable String id, Principal principal, @RequestBody DatasetsToBeFinalized datasetsToBeFinalized) { + try { + this.dataManagementPlanManager.makeFinalize(UUID.fromString(id), principal, datasetsToBeFinalized); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message("Successfully Data Datamanagement Plan made finalized.")); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message(e.getMessage())); + } + } + @Transactional + @RequestMapping(method = RequestMethod.POST, value = {"/createZenodoDoi/{id}"}) + public ResponseEntity> createZenodoDoi(@PathVariable String id, Principal principal) { + try { + String zenodoDOI = this.dataManagementPlanManager.createZenodoDoi(UUID.fromString(id), principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message("Successfully created DOI for Data Datamanagement Plan in question.").payload(zenodoDOI)); + } catch (Exception e) { + e.printStackTrace(); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message(e.getMessage())); + } + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/DashBoardController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/DashBoardController.java index 4155b4082..9c2dff6a1 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/DashBoardController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/DashBoardController.java @@ -1,60 +1,53 @@ package eu.eudat.controllers; import eu.eudat.logic.managers.DashBoardManager; +import eu.eudat.logic.services.ApiContext; import eu.eudat.models.data.dashboard.recent.RecentActivity; +import eu.eudat.models.data.dashboard.searchbar.SearchBarItem; import eu.eudat.models.data.dashboard.statistics.DashBoardStatistics; import eu.eudat.models.data.helpers.responses.ResponseItem; import eu.eudat.models.data.security.Principal; -import eu.eudat.logic.services.ApiContext; import eu.eudat.types.ApiMessageCode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.util.List; + @RestController @CrossOrigin @RequestMapping(value = {"/api"}) public class DashBoardController extends BaseController { + private DashBoardManager dashBoardManager; @Autowired - public DashBoardController(ApiContext apiContext) { + public DashBoardController(ApiContext apiContext, DashBoardManager dashBoardManager) { super(apiContext); + this.dashBoardManager = dashBoardManager; } @RequestMapping(method = RequestMethod.GET, value = {"/dashboard/getStatistics"}, produces = "application/json") public ResponseEntity> getStatistics() { - try { - DashBoardStatistics statistics = new DashBoardManager().getStatistics(this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetDao(), this.getApiContext().getOperationsContext().getDatabaseRepository().getDmpDao() - , this.getApiContext().getOperationsContext().getDatabaseRepository().getProjectDao()); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(statistics)); - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); - } + DashBoardStatistics statistics = dashBoardManager.getStatistics(); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(statistics)); } @RequestMapping(method = RequestMethod.GET, value = {"/dashboard/me/getStatistics"}, produces = "application/json") public ResponseEntity> getStatistics(Principal principal) { - try { - DashBoardStatistics statistics = new DashBoardManager().getMeStatistics(this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetDao(), this.getApiContext().getOperationsContext().getDatabaseRepository().getDmpDao() - , this.getApiContext().getOperationsContext().getDatabaseRepository().getProjectDao(), principal); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(statistics)); - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); - } + DashBoardStatistics statistics = dashBoardManager.getMeStatistics(principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(statistics)); } @RequestMapping(method = RequestMethod.GET, value = {"/user/recentActivity"}, produces = "application/json") public ResponseEntity> getRecentActivity(@RequestParam(name = "numOfActivities", required = false, defaultValue = "5") Integer numberOfActivities, Principal principal) { - try { - RecentActivity statistics = new DashBoardManager().getRecentActivity(this.getApiContext(), this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetDao(), this.getApiContext().getOperationsContext().getDatabaseRepository().getDmpDao() - , this.getApiContext().getOperationsContext().getDatabaseRepository().getProjectDao(), principal, numberOfActivities); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(statistics)); - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); - } + RecentActivity statistics = dashBoardManager.getRecentActivity(principal, numberOfActivities); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(statistics)); + } + + @RequestMapping(method = RequestMethod.GET, value = {"/dashboard/search"}, produces = "application/json") + public ResponseEntity>> search(@RequestParam(name = "like") String like, Principal principal) { + List searchBarItemList = dashBoardManager.searchUserData(like, principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(searchBarItemList)); } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/DataRepositories.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/DataRepositories.java index bfbac37e5..68e0d87f6 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/DataRepositories.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/DataRepositories.java @@ -1,13 +1,20 @@ package eu.eudat.controllers; -import eu.eudat.models.data.helpers.responses.ResponseItem; +import eu.eudat.data.entities.DataRepository; +import eu.eudat.logic.managers.DataRepositoryManager; +import eu.eudat.logic.managers.ResearcherManager; import eu.eudat.logic.proxy.config.exceptions.HugeResultSet; import eu.eudat.logic.proxy.config.exceptions.NoURLFound; import eu.eudat.logic.services.ApiContext; +import eu.eudat.models.data.datarepository.DataRepositoryModel; +import eu.eudat.models.data.dmp.Researcher; +import eu.eudat.models.data.helpers.responses.ResponseItem; +import eu.eudat.models.data.security.Principal; import eu.eudat.types.ApiMessageCode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -16,27 +23,32 @@ import java.util.Map; @RestController @CrossOrigin -@RequestMapping(value = {"/api"}) +@RequestMapping(value = {"/api/external/datarepos"}) public class DataRepositories extends BaseController { + private DataRepositoryManager dataRepositoryManager; + @Autowired - public DataRepositories(ApiContext apiContext) { + public DataRepositories(ApiContext apiContext, DataRepositoryManager dataRepositoryManager) { super(apiContext); + this.dataRepositoryManager = dataRepositoryManager; } - @RequestMapping(method = RequestMethod.GET, value = {"/external/datarepos"}, produces = "application/json") + @RequestMapping(method = RequestMethod.GET, produces = "application/json") public @ResponseBody ResponseEntity>>> listExternalDataRepositories( - @RequestParam(value = "query", required = false) String query,@RequestParam(value = "type", required = false) String type - ) { - try { - List> remoteRepos = this.getApiContext().getOperationsContext().getRemoteFetcher().getRepositories(query,type); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>>().status(ApiMessageCode.NO_MESSAGE).payload(remoteRepos)); - } catch (NoURLFound ex) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem>>().status(ApiMessageCode.ERROR_MESSAGE).message(ex.getMessage()).payload(null)); - } catch (HugeResultSet ex) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem>>().status(ApiMessageCode.ERROR_MESSAGE).message(ex.getMessage()).payload(null)); - } + @RequestParam(value = "query", required = false) String query, @RequestParam(value = "type", required = false) String type + ) throws HugeResultSet, NoURLFound { + List> remoteRepos = this.getApiContext().getOperationsContext().getRemoteFetcher().getRepositories(query, type); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>>().status(ApiMessageCode.NO_MESSAGE).payload(remoteRepos)); + } + + @Transactional + @RequestMapping(method = RequestMethod.POST, consumes = "application/json", produces = "application/json") + public @ResponseBody + ResponseEntity> create(@RequestBody eu.eudat.models.data.datarepository.DataRepositoryModel dataRepositoryModel, Principal principal) throws Exception { + DataRepository dataRepository = this.dataRepositoryManager.create(dataRepositoryModel); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(dataRepository).status(ApiMessageCode.SUCCESS_MESSAGE)); } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/DatasetProfileController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/DatasetProfileController.java index 14f0e7cab..1202c31ac 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/DatasetProfileController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/DatasetProfileController.java @@ -1,16 +1,16 @@ package eu.eudat.controllers; import eu.eudat.data.dao.criteria.RequestItem; +import eu.eudat.logic.managers.AdminManager; import eu.eudat.logic.managers.DatasetProfileManager; -import eu.eudat.logic.managers.UserManager; +import eu.eudat.logic.security.claims.ClaimedAuthorities; +import eu.eudat.logic.services.ApiContext; import eu.eudat.models.data.components.commons.datafield.AutoCompleteData; -import eu.eudat.models.data.helpermodels.Tuple; +import eu.eudat.models.data.externaldataset.ExternalAutocompleteFieldModel; import eu.eudat.models.data.helpers.common.AutoCompleteLookupItem; import eu.eudat.models.data.helpers.responses.ResponseItem; import eu.eudat.models.data.properties.PropertiesModel; -import eu.eudat.models.data.user.composite.PagedDatasetProfile; -import eu.eudat.logic.services.ApiContext; -import eu.eudat.types.ApiMessageCode; +import eu.eudat.models.data.security.Principal; import org.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -18,63 +18,56 @@ import org.springframework.http.ResponseEntity; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; +import javax.xml.xpath.XPathExpressionException; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; +import static eu.eudat.types.Authorities.ADMIN; + @RestController @CrossOrigin @RequestMapping(value = {"/api"}) public class DatasetProfileController extends BaseController { - @Autowired - public DatasetProfileController(ApiContext apiContext) { - super(apiContext); - } + private DatasetProfileManager datasetProfileManager; - @RequestMapping(method = RequestMethod.GET, value = {"/datasetwizard/get/{id}"}, produces = "application/json") - public ResponseEntity> getSingle(@PathVariable String id) { - try { - eu.eudat.data.entities.DatasetProfile profile = this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(UUID.fromString(id)); - eu.eudat.models.data.user.composite.DatasetProfile datasetprofile = UserManager.generateDatasetProfileModel(profile); - PagedDatasetProfile pagedDatasetProfile = new PagedDatasetProfile(); - pagedDatasetProfile.buildPagedDatasetProfile(datasetprofile); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(pagedDatasetProfile)); - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); - } + @Autowired + public DatasetProfileController(ApiContext apiContext, DatasetProfileManager datasetProfileManager) { + super(apiContext); + this.datasetProfileManager = datasetProfileManager; } @Transactional @RequestMapping(method = RequestMethod.POST, value = {"/datasetprofile/save/{id}"}, consumes = "application/json", produces = "application/json") public ResponseEntity updateDataset(@PathVariable String id, @RequestBody PropertiesModel properties) { - try { - eu.eudat.data.entities.Dataset dataset = this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetDao().find(UUID.fromString(id)); - Map values = new HashMap(); - properties.toMap(values); - JSONObject jobject = new JSONObject(values); - dataset.setProperties(jobject.toString()); - dataset.setStatus((short) properties.getStatus()); - this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetDao().createOrUpdate(dataset); //TODO - return ResponseEntity.status(HttpStatus.OK).body(properties); - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Serialization issue: " + ex.getMessage()); - } + eu.eudat.data.entities.Dataset dataset = this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetDao().find(UUID.fromString(id)); + Map values = new HashMap(); + properties.toMap(values); + JSONObject jobject = new JSONObject(values); + dataset.setProperties(jobject.toString()); + dataset.setStatus((short) properties.getStatus()); + this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetDao().createOrUpdate(dataset); //TODO + return ResponseEntity.status(HttpStatus.OK).body(properties); + } + + @Transactional + @RequestMapping(method = RequestMethod.POST, value = {"/datasetprofile/clone/{id}"}, consumes = "application/json", produces = "application/json") + public ResponseEntity> clone(@PathVariable String id, @ClaimedAuthorities(claims = {ADMIN})Principal principal) { + eu.eudat.data.entities.DatasetProfile profile = this.datasetProfileManager.clone(id); + eu.eudat.models.data.admin.composite.DatasetProfile datasetprofile = AdminManager.generateDatasetProfileModel(profile); + datasetprofile.setLabel(profile.getLabel() + " new "); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(datasetprofile)); } @RequestMapping(method = RequestMethod.POST, value = {"/search/autocomplete"}, consumes = "application/json", produces = "application/json") - public ResponseEntity getDataForAutocomplete(@RequestBody RequestItem lookupItem) { - try { - eu.eudat.data.entities.Dataset dataset = this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetDao().find(UUID.fromString(lookupItem.getCriteria().getProfileID())); - eu.eudat.models.data.entities.xmlmodels.datasetprofiledefinition.Field modelfield = DatasetProfileManager.queryForField(dataset.getProfile().getDefinition(), lookupItem.getCriteria().getFieldID()); - AutoCompleteData data = (AutoCompleteData) modelfield.getData(); - List> items = DatasetProfileManager.getAutocomplete(data,lookupItem.getCriteria().getLike()); - return ResponseEntity.status(HttpStatus.OK).body(items); - } catch (Exception ex) { - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Serialization issue: " + ex.getMessage()); - } + public ResponseEntity getDataForAutocomplete(@RequestBody RequestItem lookupItem) throws XPathExpressionException { + eu.eudat.data.entities.DatasetProfile datasetProfile = this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(UUID.fromString(lookupItem.getCriteria().getProfileID())); + eu.eudat.models.data.entities.xmlmodels.datasetprofiledefinition.Field modelfield = this.datasetProfileManager.queryForField(datasetProfile.getDefinition(), lookupItem.getCriteria().getFieldID()); + AutoCompleteData data = (AutoCompleteData) modelfield.getData(); + List items = this.datasetProfileManager.getAutocomplete(data, lookupItem.getCriteria().getLike()); + return ResponseEntity.status(HttpStatus.OK).body(items); } + } diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/DatasetProfiles.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/DatasetProfiles.java index 5c1eec2ea..35375e148 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/DatasetProfiles.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/DatasetProfiles.java @@ -1,20 +1,25 @@ package eu.eudat.controllers; -import eu.eudat.logic.managers.DatasetProfileManager; -import eu.eudat.models.data.datasetprofile.DatasetProfileAutocompleteItem; +import eu.eudat.data.entities.DMP; import eu.eudat.data.query.items.item.datasetprofile.DatasetProfileAutocompleteRequest; -import eu.eudat.models.data.datasetprofile.DatasetProfileListingModel; import eu.eudat.data.query.items.table.datasetprofile.DatasetProfileTableRequestItem; +import eu.eudat.exceptions.datamanagementplan.DMPWithDatasetsDeleteException; +import eu.eudat.logic.managers.DatasetProfileManager; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.models.data.datasetprofile.DatasetProfileAutocompleteItem; +import eu.eudat.models.data.datasetprofile.DatasetProfileListingModel; import eu.eudat.models.data.helpers.common.DataTableData; import eu.eudat.models.data.helpers.responses.ResponseItem; -import eu.eudat.logic.services.ApiContext; +import eu.eudat.models.data.security.Principal; import eu.eudat.types.ApiMessageCode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.UUID; @RestController @@ -22,42 +27,26 @@ import java.util.List; @RequestMapping(value = {"/api"}) public class DatasetProfiles extends BaseController { + private DatasetProfileManager datasetProfileManager; + @Autowired - public DatasetProfiles(ApiContext apiContext) { + public DatasetProfiles(ApiContext apiContext, DatasetProfileManager datasetProfileManager) { super(apiContext); + this.datasetProfileManager = datasetProfileManager; } @RequestMapping(method = RequestMethod.POST, value = {"/dmps/datasetprofiles/get"}, produces = "application/json") public @ResponseBody - ResponseEntity>> get(@RequestBody DatasetProfileAutocompleteRequest datasetProfileAutocompleteRequest) { - try { - List datasetProfileAutocompleteItems = DatasetProfileManager.getWithCriteria(this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetProfileDao(), datasetProfileAutocompleteRequest); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(datasetProfileAutocompleteItems)); - } catch (Exception ex) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem>().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE)); - } - } - - @RequestMapping(method = RequestMethod.POST, value = {"/admin/datasetprofiles/getPaged"}, produces = "application/json") - public @ResponseBody - ResponseEntity>> getPaged(@RequestBody DatasetProfileTableRequestItem datasetProfileTableRequestItem) { - try { - DataTableData datasetProfileTableData = DatasetProfileManager.getPaged(this.getApiContext(), datasetProfileTableRequestItem); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(datasetProfileTableData)); - } catch (Exception ex) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem>().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE)); - } + ResponseEntity>> get(@RequestBody DatasetProfileAutocompleteRequest datasetProfileAutocompleteRequest) throws InstantiationException, IllegalAccessException { + List datasetProfileAutocompleteItems = this.datasetProfileManager.getWithCriteria(datasetProfileAutocompleteRequest); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(datasetProfileAutocompleteItems)); } @RequestMapping(method = RequestMethod.GET, value = {"/datasetprofiles/getAll"}, produces = "application/json") public @ResponseBody - ResponseEntity>> getAll() { - try { - List datasetProfileTableData = DatasetProfileManager.getAll(this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetProfileDao()); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(datasetProfileTableData)); - } catch (Exception ex) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem>().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE)); - } + ResponseEntity>> getAll() throws InstantiationException, IllegalAccessException { + List datasetProfileTableData = this.datasetProfileManager.getAll(); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(datasetProfileTableData)); } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/DatasetWizardController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/DatasetWizardController.java index 2e04b02c5..d07bcd1e0 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/DatasetWizardController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/DatasetWizardController.java @@ -1,17 +1,22 @@ package eu.eudat.controllers; -import eu.eudat.logic.utilities.documents.helpers.FileEnvelope; +import eu.eudat.data.dao.entities.DatasetDao; import eu.eudat.data.entities.Dataset; +import eu.eudat.data.query.items.item.dataset.DatasetWizardAutocompleteRequest; +import eu.eudat.data.query.items.item.datasetprofile.DatasetProfileWizardAutocompleteRequest; +import eu.eudat.exceptions.datasetwizard.DatasetWizardCannotUnlockException; import eu.eudat.logic.managers.DatasetManager; import eu.eudat.logic.managers.DatasetWizardManager; +import eu.eudat.logic.managers.UserManager; +import eu.eudat.logic.security.claims.ClaimedAuthorities; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.logic.services.forms.VisibilityRuleService; import eu.eudat.models.data.datasetwizard.DataManagentPlanListingModel; -import eu.eudat.data.query.items.item.datasetprofile.DatasetProfileWizardAutocompleteRequest; -import eu.eudat.data.query.items.item.dataset.DatasetWizardAutocompleteRequest; import eu.eudat.models.data.datasetwizard.DatasetWizardModel; import eu.eudat.models.data.dmp.AssociatedProfile; import eu.eudat.models.data.helpers.responses.ResponseItem; import eu.eudat.models.data.security.Principal; -import eu.eudat.logic.services.ApiContext; +import eu.eudat.models.data.user.composite.PagedDatasetProfile; import eu.eudat.types.ApiMessageCode; import org.apache.poi.util.IOUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -21,14 +26,18 @@ import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; -import javax.activation.MimetypesFileTypeMap; import javax.transaction.Transactional; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.nio.file.Files; import java.util.List; +import java.util.UUID; + +import static eu.eudat.types.Authorities.ANONYMOUS; @RestController @@ -37,112 +46,158 @@ import java.util.List; public class DatasetWizardController extends BaseController { private Environment environment; + private DatasetManager datasetManager; + private UserManager userManager; @Autowired - public DatasetWizardController(ApiContext apiContext, Environment environment) { + public DatasetWizardController(ApiContext apiContext, Environment environment, DatasetManager datasetManager, UserManager userManager) { super(apiContext); this.environment = environment; + this.datasetManager = datasetManager; + this.userManager = userManager; } @RequestMapping(method = RequestMethod.POST, value = {"/userDmps"}, produces = "application/json") public @ResponseBody - ResponseEntity>> getUserDmps(@RequestBody DatasetWizardAutocompleteRequest datasetWizardAutocompleteRequest, Principal principal) { - try { - List dataManagementPlans = DatasetWizardManager.getUserDmps(this.getApiContext().getOperationsContext().getDatabaseRepository().getDmpDao(), datasetWizardAutocompleteRequest, principal); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(dataManagementPlans)); - - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem>().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); - } + ResponseEntity>> getUserDmps(@RequestBody DatasetWizardAutocompleteRequest datasetWizardAutocompleteRequest, Principal principal) throws IllegalAccessException, InstantiationException { + List dataManagementPlans = DatasetWizardManager.getUserDmps(this.getApiContext().getOperationsContext().getDatabaseRepository().getDmpDao(), datasetWizardAutocompleteRequest, principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(dataManagementPlans)); } @RequestMapping(method = RequestMethod.POST, value = {"/getAvailableProfiles"}, produces = "application/json") public @ResponseBody - ResponseEntity>> getAvailableProfiles(@RequestBody DatasetProfileWizardAutocompleteRequest datasetProfileWizardAutocompleteRequest, Principal principal) { - try { - List dataManagementPlans = DatasetWizardManager.getAvailableProfiles(this.getApiContext().getOperationsContext().getDatabaseRepository().getDmpDao(), datasetProfileWizardAutocompleteRequest); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(dataManagementPlans)); + ResponseEntity>> getAvailableProfiles(@RequestBody DatasetProfileWizardAutocompleteRequest datasetProfileWizardAutocompleteRequest, @ClaimedAuthorities(claims = {ANONYMOUS}) Principal principal) throws IllegalAccessException, InstantiationException { + List dataManagementPlans = DatasetWizardManager.getAvailableProfiles(this.getApiContext().getOperationsContext().getDatabaseRepository().getDmpDao(), datasetProfileWizardAutocompleteRequest); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(dataManagementPlans)); + } - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem>().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); + @Transactional + @RequestMapping(method = RequestMethod.GET, value = {"{id}"}, produces = "application/json") + public @ResponseBody + ResponseEntity getSingle(@PathVariable String id, @RequestHeader("Content-Type") String contentType, @ClaimedAuthorities(claims = {ANONYMOUS}) Principal principal) throws IllegalAccessException, IOException, InstantiationException { + if(contentType.equals("application/xml")) { + VisibilityRuleService visibilityRuleService = this.getApiContext().getUtilitiesService().getVisibilityRuleService(); + return this.datasetManager.getDocument(id, visibilityRuleService, contentType); + } + else if (contentType.equals("application/msword")){ + File file = datasetManager.getWordDocument(this.environment, id, this.getApiContext().getUtilitiesService().getVisibilityRuleService()); + InputStream resource = new FileInputStream(file); + HttpHeaders responseHeaders = new HttpHeaders(); + responseHeaders.setContentLength(file.length()); + responseHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM); + responseHeaders.set("Content-Disposition", "attachment;filename=" + file.getName()); + responseHeaders.set("Access-Control-Expose-Headers", "Content-Disposition"); + responseHeaders.get("Access-Control-Expose-Headers").add("Content-Type"); + + byte[] content = IOUtils.toByteArray(resource); + resource.close(); + Files.deleteIfExists(file.toPath()); + return new ResponseEntity<>(content, + responseHeaders, + HttpStatus.OK); + } + else { + DatasetWizardModel dataset = this.datasetManager.getSingle(id); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(dataset)); } } - @RequestMapping(method = RequestMethod.GET, value = {"/getSingle/{id}"}, produces = "application/json") + @RequestMapping(method = RequestMethod.GET, value = {"/public/{id}"}, produces = "application/json") public @ResponseBody - ResponseEntity> getSingle(@PathVariable String id, Principal principal) { + ResponseEntity getSinglePublic(@PathVariable String id) throws Exception { try { - DatasetWizardModel dataset = new DatasetManager().getSingle(this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetDao(), id); + DatasetWizardModel dataset = this.datasetManager.getSinglePublic(id); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(dataset)); - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); + } + catch (Exception ex) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).message(ex.getMessage())); } } @Transactional - @RequestMapping(method = RequestMethod.POST, value = {"/createOrUpdate"}, consumes = "application/json", produces = "application/json") + @RequestMapping(method = RequestMethod.DELETE, value = {"{id}"}, produces = "application/json") public @ResponseBody - ResponseEntity> createOrUpdate(@RequestBody DatasetWizardModel profile, Principal principal) { - try { - eu.eudat.data.entities.Dataset dataset = DatasetManager.createOrUpdate(this.getApiContext(), profile, principal); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message("Created").payload(null)); - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); - } + ResponseEntity> delete(@PathVariable(value = "id") UUID id, Principal principal) throws Exception { + new DatasetWizardManager().delete(this.getApiContext(), id); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message("Deleted")); + } + + @Transactional + @RequestMapping(method = RequestMethod.POST, consumes = "application/json", produces = "application/json") + public @ResponseBody + ResponseEntity> createOrUpdate(@RequestBody DatasetWizardModel profile, Principal principal) throws Exception { + this.datasetManager.createOrUpdate(profile, principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message("Created").payload(null)); } @RequestMapping(method = RequestMethod.GET, value = {"/getPDF/{id}"}) public @ResponseBody - ResponseEntity getWordDocument(@PathVariable String id) throws IllegalAccessException, IOException, InstantiationException { - try { - File file = new DatasetManager().getWordDocument(this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetDao(), id, this.getApiContext().getUtilitiesService().getVisibilityRuleService()); - File pdffile = new DatasetManager().convertToPDF(file, environment, file.getName()); - InputStream resource = new FileInputStream(pdffile); - System.out.println("Mime Type of " + file.getName() + " is " + - new MimetypesFileTypeMap().getContentType(file)); - HttpHeaders responseHeaders = new HttpHeaders(); - responseHeaders.setContentLength(pdffile.length()); - responseHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM); - responseHeaders.set("Content-Disposition", "attachment;filename=" + pdffile.getName()); - responseHeaders.set("Access-Control-Expose-Headers", "Content-Disposition"); - responseHeaders.get("Access-Control-Expose-Headers").add("Content-Type"); + ResponseEntity getPDFDocument(@PathVariable String id) throws IllegalAccessException, IOException, InstantiationException, InterruptedException { + File file = datasetManager.getWordDocument(this.environment, id, this.getApiContext().getUtilitiesService().getVisibilityRuleService()); + String fileName = file.getName(); + if (fileName.endsWith(".docx")){ + fileName = fileName.substring(0, fileName.length() - 5); + } + File pdffile = datasetManager.convertToPDF(file, environment, fileName); + InputStream resource = new FileInputStream(pdffile); - byte[] content = IOUtils.toByteArray(resource); - return new ResponseEntity<>(content, - responseHeaders, - HttpStatus.OK); - } catch (Exception e) { - e.printStackTrace(); - return ResponseEntity.badRequest().body(null); + HttpHeaders responseHeaders = new HttpHeaders(); + responseHeaders.setContentLength(pdffile.length()); + responseHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM); + responseHeaders.set("Content-Disposition", "attachment;filename=" + pdffile.getName()); + responseHeaders.set("Access-Control-Expose-Headers", "Content-Disposition"); + responseHeaders.get("Access-Control-Expose-Headers").add("Content-Type"); + + byte[] content = IOUtils.toByteArray(resource); + resource.close(); + Files.deleteIfExists(file.toPath()); + Files.deleteIfExists(pdffile.toPath()); + return new ResponseEntity<>(content, + responseHeaders, + HttpStatus.OK); + } + + @RequestMapping(method = RequestMethod.GET, value = {"/get/{id}"}, produces = "application/json") + public ResponseEntity> getSingle(@PathVariable String id) { + eu.eudat.data.entities.DatasetProfile profile = this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(UUID.fromString(id)); + eu.eudat.models.data.user.composite.DatasetProfile datasetprofile = userManager.generateDatasetProfileModel(profile); + PagedDatasetProfile pagedDatasetProfile = new PagedDatasetProfile(); + pagedDatasetProfile.buildPagedDatasetProfile(datasetprofile); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(pagedDatasetProfile)); + } + + @Transactional + @RequestMapping(method = RequestMethod.GET, value = {"/{id}/unlock"}, produces = "application/json") + public @ResponseBody + ResponseEntity> unlock(@PathVariable(value = "id") UUID id, Principal principal) throws Exception { + try { + new DatasetWizardManager().unlock(this.getApiContext(), id); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message("Unlocked")); + } catch (DatasetWizardCannotUnlockException datasetWizardCannotUnlockException) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message(datasetWizardCannotUnlockException.getMessage())); } } - @RequestMapping(method = RequestMethod.GET, value = {"/getXml/{id}"}) - public @ResponseBody - ResponseEntity getXml(@PathVariable String id) throws IllegalAccessException, IOException, InstantiationException { + @RequestMapping(method = RequestMethod.POST, value = {"/upload"}) + public ResponseEntity datasetXmlImport(@RequestParam("file") MultipartFile file, @RequestParam("dmpId") String dmpId, @RequestParam("datasetProfileId") String datasetProfileId, Principal principal) { try { - FileEnvelope envelope = new DatasetManager().getXmlDocument(this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetDao(), id, this.getApiContext().getUtilitiesService().getVisibilityRuleService()); - InputStream resource = new FileInputStream(envelope.getFile()); - System.out.println("Mime Type of " + envelope.getFilename() + " is " + - new MimetypesFileTypeMap().getContentType(envelope.getFile())); - HttpHeaders responseHeaders = new HttpHeaders(); - responseHeaders.setContentLength(envelope.getFile().length()); - responseHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM); - responseHeaders.set("Content-Disposition", "attachment;filename=" + envelope.getFilename() + ".xml"); - responseHeaders.set("Access-Control-Expose-Headers", "Content-Disposition"); - responseHeaders.get("Access-Control-Expose-Headers").add("Content-Type"); - - byte[] content = IOUtils.toByteArray(resource); - return new ResponseEntity<>(content, - responseHeaders, - HttpStatus.OK); + Dataset dataset = this.datasetManager.createDatasetFromXml(file, dmpId, datasetProfileId, principal); + if (dataset != null){ + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE)); + } + else { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).message("Import was unsuccessful.")); + } } catch (Exception e) { e.printStackTrace(); - return ResponseEntity.badRequest().body(null); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).message("Import was unsuccessful.")); } } + + @RequestMapping(method = RequestMethod.GET, value = {"profile/{id}"}, produces = "application/json") + public @ResponseBody + ResponseEntity getSingleProfileUpdate(@PathVariable String id, @ClaimedAuthorities(claims = {ANONYMOUS}) Principal principal) throws IllegalAccessException, IOException, InstantiationException { + DatasetWizardModel dataset = this.datasetManager.datasetUpdateProfile(id); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(dataset)); + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/Datasets.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/Datasets.java index 589a488f8..02d56eca6 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/Datasets.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/Datasets.java @@ -1,14 +1,19 @@ package eu.eudat.controllers; import eu.eudat.data.entities.Dataset; -import eu.eudat.logic.managers.DatasetManager; +import eu.eudat.data.query.items.table.dataset.DatasetPublicTableRequest; import eu.eudat.data.query.items.table.dataset.DatasetTableRequest; +import eu.eudat.data.query.items.table.datasetprofile.DatasetProfileTableRequestItem; +import eu.eudat.logic.managers.DatasetManager; +import eu.eudat.logic.security.claims.ClaimedAuthorities; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.models.data.datasetprofile.DatasetProfileListingModel; import eu.eudat.models.data.helpers.common.DataTableData; import eu.eudat.models.data.helpers.responses.ResponseItem; import eu.eudat.models.data.listingmodels.DatasetListingModel; import eu.eudat.models.data.security.Principal; -import eu.eudat.logic.services.ApiContext; import eu.eudat.types.ApiMessageCode; +import eu.eudat.types.Authorities; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -21,40 +26,44 @@ import java.util.UUID; @RestController @CrossOrigin -@RequestMapping(value = {"/api"}) +@RequestMapping(value = {"/api/datasets/"}) public class Datasets extends BaseController { + private DatasetManager datasetManager; + @Autowired - public Datasets(ApiContext apiContext) { + public Datasets(ApiContext apiContext, DatasetManager datasetManager) { super(apiContext); + this.datasetManager = datasetManager; } - @RequestMapping(method = RequestMethod.POST, value = {"/datasets/getPaged"}, consumes = "application/json", produces = "application/json") + @RequestMapping(method = RequestMethod.POST, value = {"paged"}, consumes = "application/json", produces = "application/json") public @ResponseBody - ResponseEntity>> getPaged(@RequestBody DatasetTableRequest datasetTableRequest, Principal principal) { - try { - DataTableData dataTable = new DatasetManager().getPaged(this.getApiContext(), datasetTableRequest, principal); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(dataTable)); + ResponseEntity>> getPaged(@RequestBody DatasetTableRequest datasetTableRequest, Principal principal) throws Exception { + DataTableData dataTable = this.datasetManager.getPaged(datasetTableRequest, principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(dataTable)); + } - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem>().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); - } + @RequestMapping(method = RequestMethod.POST, value = {"/public/paged"}, consumes = "application/json", produces = "application/json") + public @ResponseBody + ResponseEntity>> getPublicPaged(@RequestBody DatasetPublicTableRequest datasetTableRequest, @ClaimedAuthorities(claims = {Authorities.ANONYMOUS}) Principal principal) throws Exception { + DataTableData dataTable = this.datasetManager.getPaged(datasetTableRequest, principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(dataTable)); } @Transactional - @RequestMapping(method = RequestMethod.GET, value = {"/datasets/makepublic/{id}"}, produces = "application/json") + @RequestMapping(method = RequestMethod.GET, value = {"/makepublic/{id}"}, produces = "application/json") public @ResponseBody - ResponseEntity> makePublic(@PathVariable UUID id, Principal principal, Locale locale) { - try { - DatasetManager.makePublic(this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetDao(), id); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message(this.getApiContext().getHelpersService().getMessageSource().getMessage("dataset.public", new Object[]{}, locale))); - - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); - } + ResponseEntity> makePublic(@PathVariable UUID id, Principal principal, Locale locale) throws Exception { + this.datasetManager.makePublic(this.getApiContext().getOperationsContext().getDatabaseRepository().getDatasetDao(), id); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message(this.getApiContext().getHelpersService().getMessageSource().getMessage("dataset.public", new Object[]{}, locale))); } + @RequestMapping(method = RequestMethod.POST, value = {"/datasetProfilesUsedByDatasets/paged"}, produces = "application/json") + public @ResponseBody + ResponseEntity>> getUsingDatasetProfilesPaged(@RequestBody DatasetProfileTableRequestItem datasetProfileTableRequestItem, Principal principal) { + DataTableData datasetProfileTableData = this.datasetManager.getDatasetProfilesUsedByDatasets(datasetProfileTableRequestItem, principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(datasetProfileTableData)); + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/EmailConfirmation.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/EmailConfirmation.java new file mode 100644 index 000000000..7a6f11416 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/EmailConfirmation.java @@ -0,0 +1,54 @@ +package eu.eudat.controllers; + +import eu.eudat.exceptions.emailconfirmation.HasConfirmedEmailException; +import eu.eudat.exceptions.emailconfirmation.TokenExpiredException; +import eu.eudat.logic.managers.EmailConfirmationManager; +import eu.eudat.logic.security.CustomAuthenticationProvider; +import eu.eudat.logic.services.operations.authentication.AuthenticationService; +import eu.eudat.models.data.helpers.responses.ResponseItem; +import eu.eudat.models.data.security.Principal; +import eu.eudat.types.ApiMessageCode; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import javax.transaction.Transactional; + +@RestController +@CrossOrigin +@RequestMapping(value = "api/emailConfirmation") +public class EmailConfirmation { + + private EmailConfirmationManager emailConfirmationManager; + + @Autowired + public EmailConfirmation(EmailConfirmationManager emailConfirmationManager) { + this.emailConfirmationManager = emailConfirmationManager; + } + + @Transactional + @RequestMapping(method = RequestMethod.GET, value = {"/{emailToken}"}) + public @ResponseBody + ResponseEntity emailConfirmation(@PathVariable(value = "emailToken") String token) { + try { + this.emailConfirmationManager.confirmEmail(token); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE)); + } catch + (HasConfirmedEmailException | TokenExpiredException ex) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE)); + } + } + + @Transactional + @RequestMapping(method = RequestMethod.POST, consumes = "application/json", produces = "application/json") + public @ResponseBody + ResponseEntity sendConfirmatioEmail(@RequestBody String email, Principal principal) { + try { + this.emailConfirmationManager.sendConfirmationEmail(email, principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE)); + } catch (Exception ex) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE)); + } + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/ExternalDatasets.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/ExternalDatasets.java index b702534e3..c118de055 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/ExternalDatasets.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/ExternalDatasets.java @@ -1,16 +1,22 @@ package eu.eudat.controllers; +import eu.eudat.data.entities.ExternalDataset; import eu.eudat.data.query.items.table.externaldataset.ExternalDatasetTableRequest; +import eu.eudat.logic.managers.DataRepositoryManager; import eu.eudat.logic.managers.ExternalDatasetManager; +import eu.eudat.logic.proxy.config.exceptions.HugeResultSet; +import eu.eudat.logic.proxy.config.exceptions.NoURLFound; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.models.data.datarepository.DataRepositoryModel; import eu.eudat.models.data.externaldataset.ExternalDatasetListingModel; import eu.eudat.models.data.helpers.common.DataTableData; import eu.eudat.models.data.helpers.responses.ResponseItem; import eu.eudat.models.data.security.Principal; -import eu.eudat.logic.services.ApiContext; import eu.eudat.types.ApiMessageCode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -22,47 +28,42 @@ import java.util.UUID; @RequestMapping(value = {"/api"}) public class ExternalDatasets extends BaseController { + private ExternalDatasetManager externalDatasetManager; + @Autowired - public ExternalDatasets(ApiContext apiContext) { + public ExternalDatasets(ApiContext apiContext, ExternalDatasetManager externalDatasetManager) { super(apiContext); + this.externalDatasetManager = externalDatasetManager; } @RequestMapping(method = RequestMethod.POST, value = {"/externaldatasets/getPaged"}, consumes = "application/json", produces = "application/json") public @ResponseBody - ResponseEntity>> getPaged(@RequestBody ExternalDatasetTableRequest datasetTableRequest, Principal principal) { - try { - DataTableData dataTable = new ExternalDatasetManager().getPaged(this.getApiContext(), datasetTableRequest); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(dataTable)); - - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem>().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); - } + ResponseEntity>> getPaged(@RequestBody ExternalDatasetTableRequest datasetTableRequest, Principal principal) throws Exception { + DataTableData dataTable = externalDatasetManager.getPaged(datasetTableRequest); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(dataTable)); } @RequestMapping(method = RequestMethod.GET, value = {"/external/datasets"}, produces = "application/json") public @ResponseBody ResponseEntity>> getWithExternal( @RequestParam(value = "query", required = false) String query, @RequestParam(value = "type", required = false) String type, Principal principal - ) { - try { - List dataTable = new ExternalDatasetManager().getWithExternal(this.getApiContext(), query, this.getApiContext().getOperationsContext().getRemoteFetcher()); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().payload(dataTable).status(ApiMessageCode.NO_MESSAGE)); - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem>().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); - } + ) throws NoURLFound, InstantiationException, HugeResultSet, IllegalAccessException { + List dataTable = externalDatasetManager.getWithExternal(query); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().payload(dataTable).status(ApiMessageCode.NO_MESSAGE)); } @RequestMapping(method = RequestMethod.POST, value = {"/externaldatasets/getSingle/{id}"}, consumes = "application/json", produces = "application/json") public @ResponseBody - ResponseItem getWithExternal(@PathVariable UUID id, Principal principal) { - try { - ExternalDatasetListingModel externalDatasetModel = new ExternalDatasetManager().getSingle(this.getApiContext().getOperationsContext().getDatabaseRepository().getExternalDatasetDao(), id); - return new ResponseItem().payload(externalDatasetModel).status(ApiMessageCode.NO_MESSAGE); - } catch (Exception ex) { - ex.printStackTrace(); - return new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage()); - } + ResponseItem getWithExternal(@PathVariable UUID id, Principal principal) throws NoURLFound, InstantiationException, HugeResultSet, IllegalAccessException { + ExternalDatasetListingModel externalDatasetModel = externalDatasetManager.getSingle(id); + return new ResponseItem().payload(externalDatasetModel).status(ApiMessageCode.NO_MESSAGE); + } + + @Transactional + @RequestMapping(method = RequestMethod.POST, value = {"/externaldatasets"}, consumes = "application/json", produces = "application/json") + public @ResponseBody + ResponseEntity> create(@RequestBody eu.eudat.models.data.externaldataset.ExternalDatasetModel externalDatasetModel, Principal principal) throws Exception { + ExternalDataset externalDataset = this.externalDatasetManager.create(externalDatasetModel); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(externalDataset).status(ApiMessageCode.SUCCESS_MESSAGE)); } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/FileController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/FileController.java index 0ef2c7a03..b597cb8da 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/FileController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/FileController.java @@ -1,9 +1,9 @@ package eu.eudat.controllers; import eu.eudat.logic.managers.FileManager; +import eu.eudat.logic.services.ApiContext; import eu.eudat.models.data.files.ContentFile; import eu.eudat.models.data.helpers.responses.ResponseItem; -import eu.eudat.logic.services.ApiContext; import eu.eudat.types.ApiMessageCode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.Resource; @@ -25,37 +25,28 @@ import java.util.List; @RequestMapping(value = {"/api/files"}) public class FileController extends BaseController { + private FileManager fileManager; @Autowired - public FileController(ApiContext apiContext) { + public FileController(ApiContext apiContext, FileManager fileManager) { super(apiContext); + this.fileManager = fileManager; } @RequestMapping(method = RequestMethod.POST, value = {"/upload"}) - public ResponseEntity>> handleFileUpload(@RequestParam("file") MultipartFile[] files) { - try { - return ResponseEntity.status(HttpStatus.OK).body( - new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(FileManager.saveTempFile(files, getApiContext().getOperationsContext().getFileStorageService()))); - } catch (IOException e) { - e.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem>().status(ApiMessageCode.ERROR_MESSAGE).message(e.getMessage())); - } + public ResponseEntity>> handleFileUpload(@RequestParam("file") MultipartFile[] files) throws IOException { + return ResponseEntity.status(HttpStatus.OK).body( + new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(fileManager.saveTempFile(files))); } @RequestMapping(method = RequestMethod.GET, value = {"/{id}"}) public ResponseEntity handleFileUpload(@PathVariable(name = "id") String id, @RequestParam(name = "type") String type, - @RequestParam(name = "location", required = false, defaultValue = "final") String location) { - try { - Resource resource = FileManager.getFile(id, type, getApiContext().getOperationsContext().getFileStorageService(), location); - if (!resource.exists()) - resource = new UrlResource(FileController.class.getClassLoader().getResource("images/default.png")); - return ResponseEntity.ok() - .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "." + type + "\"") - .body(resource); - } catch (IOException e) { - e.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null); - } + @RequestParam(name = "location", required = false, defaultValue = "final") String location) throws IOException { + Resource resource = fileManager.getFile(id, type, location); + if (!resource.exists()) + resource = new UrlResource(FileController.class.getClassLoader().getResource("images/default.png")); + return ResponseEntity.ok() + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "." + type + "\"") + .body(resource); } - } diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/Funders.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/Funders.java new file mode 100644 index 000000000..7997dd6bc --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/Funders.java @@ -0,0 +1,35 @@ +package eu.eudat.controllers; + +import eu.eudat.data.query.items.item.funder.FunderCriteriaRequest; +import eu.eudat.logic.managers.FunderManager; +import eu.eudat.logic.proxy.config.exceptions.HugeResultSet; +import eu.eudat.logic.proxy.config.exceptions.NoURLFound; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.models.data.funder.Funder; +import eu.eudat.models.data.helpers.responses.ResponseItem; +import eu.eudat.models.data.security.Principal; +import eu.eudat.types.ApiMessageCode; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@CrossOrigin +@RequestMapping(value = {"/api/funders/"}) +public class Funders extends BaseController { + private FunderManager funderManager; + + public Funders(ApiContext apiContext, FunderManager funderManager) { + super(apiContext); + this.funderManager = funderManager; + } + + @RequestMapping(method = RequestMethod.POST, value = {"/external"}, consumes = "application/json", produces = "application/json") + public @ResponseBody + ResponseEntity>> getWithExternal(@RequestBody FunderCriteriaRequest funderCriteria, Principal principal) throws NoURLFound, InstantiationException, HugeResultSet, IllegalAccessException { + List dataTable = this.funderManager.getCriteriaWithExternal(funderCriteria, principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().payload(dataTable).status(ApiMessageCode.NO_MESSAGE)); + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/Grants.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/Grants.java new file mode 100644 index 000000000..0ba69119f --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/Grants.java @@ -0,0 +1,94 @@ +package eu.eudat.controllers; + +import eu.eudat.data.entities.Grant; +import eu.eudat.data.query.items.item.grant.GrantCriteriaRequest; +import eu.eudat.data.query.items.table.grant.GrantTableRequest; +import eu.eudat.logic.managers.GrantManager; +import eu.eudat.logic.proxy.config.exceptions.HugeResultSet; +import eu.eudat.logic.proxy.config.exceptions.NoURLFound; +import eu.eudat.logic.security.claims.ClaimedAuthorities; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.models.data.helpers.common.DataTableData; +import eu.eudat.models.data.helpers.responses.ResponseItem; +import eu.eudat.models.data.grant.GrantListingModel; +import eu.eudat.models.data.security.Principal; +import eu.eudat.types.ApiMessageCode; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import javax.transaction.Transactional; +import javax.validation.Valid; +import java.io.IOException; +import java.text.ParseException; +import java.util.List; + +import static eu.eudat.types.Authorities.ANONYMOUS; + + +@RestController +@CrossOrigin +@RequestMapping(value = {"/api/grants/"}) +public class Grants extends BaseController { + private GrantManager grantManager; + + @Autowired + public Grants(ApiContext apiContext, GrantManager grantManager) { + super(apiContext); + this.grantManager = grantManager; + } + + @RequestMapping(method = RequestMethod.POST, value = {"/paged"}, consumes = "application/json", produces = "application/json") + public @ResponseBody + ResponseEntity>> getPaged(@Valid @RequestBody GrantTableRequest grantTableRequest, @RequestParam String fieldsGroup, Principal principal) throws Exception { + DataTableData dataTable = this.grantManager.getPaged(grantTableRequest, principal, fieldsGroup); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().payload(dataTable).status(ApiMessageCode.NO_MESSAGE)); + } + + @RequestMapping(method = RequestMethod.POST, value = {"public/paged"}, consumes = "application/json", produces = "application/json") + public @ResponseBody + ResponseEntity>> getPaged(@Valid @RequestBody GrantTableRequest grantTableRequest) throws Exception { + DataTableData dataTable = this.grantManager.getPublicPaged(grantTableRequest); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().payload(dataTable).status(ApiMessageCode.NO_MESSAGE)); + } + + @RequestMapping(method = RequestMethod.GET, value = {"{id}"}, produces = "application/json") + public @ResponseBody + ResponseEntity> getSingle(@PathVariable String id, Principal principal) throws IllegalAccessException, InstantiationException { + eu.eudat.models.data.grant.Grant grant = this.grantManager.getSingle(id); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(grant).status(ApiMessageCode.NO_MESSAGE)); + } + + @Transactional + @RequestMapping(method = RequestMethod.POST, consumes = "application/json", produces = "application/json") + public @ResponseBody + ResponseEntity> addGrant(@Valid @RequestBody eu.eudat.models.data.grant.Grant grant, Principal principal) throws IOException, ParseException { + this.grantManager.createOrUpdate(grant, principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message("Created")); + } + + @Transactional + @RequestMapping(method = RequestMethod.DELETE, value = {"{id}"}, consumes = "application/json", produces = "application/json") + public @ResponseBody + ResponseEntity> inactivate(@PathVariable String id, Principal principal) throws IllegalAccessException, InstantiationException { + this.grantManager.inactivate(id); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE)); + } + + @RequestMapping(method = RequestMethod.POST, value = {"/external"}, consumes = "application/json", produces = "application/json") + public @ResponseBody + ResponseEntity>> getWithExternal(@RequestBody GrantCriteriaRequest grantCriteria, Principal principal) throws NoURLFound, InstantiationException, HugeResultSet, IllegalAccessException { + List dataTable = this.grantManager.getCriteriaWithExternal(grantCriteria, principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().payload(dataTable).status(ApiMessageCode.NO_MESSAGE)); + } + + @RequestMapping(method = RequestMethod.POST, value = {"get"}, consumes = "application/json", produces = "application/json") + public @ResponseBody + ResponseEntity>> get(@RequestBody GrantCriteriaRequest grantCriteria, @ClaimedAuthorities(claims = {ANONYMOUS}) Principal principal) throws NoURLFound, InstantiationException, HugeResultSet, IllegalAccessException { + List dataTable = this.grantManager.getCriteria(grantCriteria); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().payload(dataTable).status(ApiMessageCode.NO_MESSAGE)); + } + +} + diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/Login.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/Login.java index 520c21837..a6315f15a 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/Login.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/Login.java @@ -1,18 +1,21 @@ package eu.eudat.controllers; import eu.eudat.core.logger.Logger; -import eu.eudat.exceptions.security.UnauthorisedException; +import eu.eudat.exceptions.security.NullEmailException; import eu.eudat.logic.managers.UserManager; -import eu.eudat.models.data.helpers.responses.ResponseItem; -import eu.eudat.models.data.login.Credentials; -import eu.eudat.models.data.login.LoginInfo; -import eu.eudat.models.data.security.Principal; import eu.eudat.logic.security.CustomAuthenticationProvider; import eu.eudat.logic.security.validators.b2access.B2AccessTokenValidator; import eu.eudat.logic.security.validators.b2access.helpers.B2AccessRequest; import eu.eudat.logic.security.validators.b2access.helpers.B2AccessResponseToken; +import eu.eudat.logic.security.validators.orcid.ORCIDTokenValidator; +import eu.eudat.logic.security.validators.orcid.helpers.ORCIDRequest; +import eu.eudat.logic.security.validators.orcid.helpers.ORCIDResponseToken; import eu.eudat.logic.security.validators.twitter.TwitterTokenValidator; -import eu.eudat.logic.services.operations.AuthenticationServiceImpl; +import eu.eudat.logic.services.operations.authentication.AuthenticationService; +import eu.eudat.models.data.helpers.responses.ResponseItem; +import eu.eudat.models.data.login.Credentials; +import eu.eudat.models.data.login.LoginInfo; +import eu.eudat.models.data.security.Principal; import eu.eudat.types.ApiMessageCode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -30,107 +33,74 @@ import java.security.GeneralSecurityException; public class Login { private CustomAuthenticationProvider customAuthenticationProvider; - - private AuthenticationServiceImpl authenticationServiceImpl; - + private AuthenticationService nonVerifiedUserAuthenticationService; private TwitterTokenValidator twitterTokenValidator; - private B2AccessTokenValidator b2AccessTokenValidator; + private ORCIDTokenValidator orcidTokenValidator; private Logger logger; + private UserManager userManager; @Autowired - public Login(CustomAuthenticationProvider customAuthenticationProvider, AuthenticationServiceImpl authenticationServiceImpl, - TwitterTokenValidator twitterTokenValidator, B2AccessTokenValidator b2AccessTokenValidator, Logger logger) { + public Login(CustomAuthenticationProvider customAuthenticationProvider, AuthenticationService nonVerifiedUserAuthenticationService, + TwitterTokenValidator twitterTokenValidator, B2AccessTokenValidator b2AccessTokenValidator, ORCIDTokenValidator orcidTokenValidator, + UserManager userManager ,Logger logger) { this.customAuthenticationProvider = customAuthenticationProvider; - this.authenticationServiceImpl = authenticationServiceImpl; + this.nonVerifiedUserAuthenticationService = nonVerifiedUserAuthenticationService; this.twitterTokenValidator = twitterTokenValidator; this.b2AccessTokenValidator = b2AccessTokenValidator; + this.orcidTokenValidator = orcidTokenValidator; this.logger = logger; + this.userManager = userManager; } @Transactional @RequestMapping(method = RequestMethod.POST, value = {"/externallogin"}, consumes = "application/json", produces = "application/json") public @ResponseBody - ResponseEntity> externallogin(@RequestBody LoginInfo credentials) throws GeneralSecurityException { - try { - this.logger.info(credentials, "Trying To Login With " + credentials.getProvider()); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(customAuthenticationProvider.authenticate(credentials)).status(ApiMessageCode.SUCCESS_MESSAGE)); - } catch (UnauthorisedException ex) { - this.logger.info(ex, "Failed To Login"); - throw ex; - }/* catch (Exception ex) { - this.logger.error(ex, ex.getMessage()); - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); - }*/ + ResponseEntity> externallogin(@RequestBody LoginInfo credentials) throws GeneralSecurityException, NullEmailException { + this.logger.info(credentials, "Trying To Login With " + credentials.getProvider()); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(customAuthenticationProvider.authenticate(credentials)).status(ApiMessageCode.SUCCESS_MESSAGE)); } @Transactional @RequestMapping(method = RequestMethod.POST, value = {"/nativelogin"}, consumes = "application/json", produces = "application/json") public @ResponseBody - ResponseEntity> nativelogin(@RequestBody Credentials credentials) { - try { - this.logger.info(credentials.getUsername(), "Trying To Login"); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(UserManager.authenticate(this.authenticationServiceImpl, credentials)).status(ApiMessageCode.SUCCESS_MESSAGE)); - } catch (UnauthorisedException ex) { - this.logger.info(ex, "Failed To Login"); - throw ex; - }/* catch (Exception ex) { - ex.printStackTrace(); - this.logger.error(ex, ex.getMessage()); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); - }*/ + ResponseEntity> nativelogin(@RequestBody Credentials credentials) throws NullEmailException { + this.logger.info(credentials.getUsername(), "Trying To Login"); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(userManager.authenticate(this.nonVerifiedUserAuthenticationService, credentials)).status(ApiMessageCode.SUCCESS_MESSAGE)); } @RequestMapping(method = RequestMethod.GET, value = {"/twitterRequestToken"}, produces = "application/json") public @ResponseBody ResponseEntity> twitterRequestToken() { - //try { - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(this.twitterTokenValidator.getRequestToken()).status(ApiMessageCode.NO_MESSAGE)); - /*} catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); - }*/ + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(this.twitterTokenValidator.getRequestToken()).status(ApiMessageCode.NO_MESSAGE)); } @RequestMapping(method = RequestMethod.POST, value = {"/b2AccessRequestToken"}, produces = "application/json", consumes = "application/json") public @ResponseBody ResponseEntity> b2AccessRequestToken(@RequestBody B2AccessRequest b2AccessRequest) { - //try { - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(this.b2AccessTokenValidator.getAccessToken(b2AccessRequest)).status(ApiMessageCode.NO_MESSAGE)); - /*} catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); - }*/ + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(this.b2AccessTokenValidator.getAccessToken(b2AccessRequest)).status(ApiMessageCode.NO_MESSAGE)); + } + + @RequestMapping(method = RequestMethod.POST, value = {"/orcidRequestToken"}, produces = "application/json", consumes = "application/json") + public @ResponseBody + ResponseEntity> ORCIDRequestToken(@RequestBody ORCIDRequest orcidRequest) { + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(this.orcidTokenValidator.getAccessToken(orcidRequest)).status(ApiMessageCode.NO_MESSAGE)); } @RequestMapping(method = RequestMethod.POST, value = {"/me"}, consumes = "application/json", produces = "application/json") public @ResponseBody - ResponseEntity> authMe(Principal principal) { - //try { - this.logger.info(principal, "Getting Me"); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(this.authenticationServiceImpl.Touch(principal.getToken())).status(ApiMessageCode.NO_MESSAGE)); - /*} catch (Exception ex) { - this.logger.debug(ex, ex.getMessage()); - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); - }*/ + ResponseEntity> authMe(Principal principal) throws NullEmailException { + this.logger.info(principal, "Getting Me"); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(this.nonVerifiedUserAuthenticationService.Touch(principal.getToken())).status(ApiMessageCode.NO_MESSAGE)); } @Transactional @RequestMapping(method = RequestMethod.POST, value = {"/logout"}, consumes = "application/json", produces = "application/json") public @ResponseBody ResponseEntity> logout(Principal principal) { - //try { - this.authenticationServiceImpl.Logout(principal.getToken()); - this.logger.info(principal, "Logged Out"); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE)); - - /*} catch (Exception ex) { - this.logger.debug(ex, ex.getMessage()); - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); - }*/ + this.nonVerifiedUserAuthenticationService.Logout(principal.getToken()); + this.logger.info(principal, "Logged Out"); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE)); } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/Organisations.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/Organisations.java index 25c7dbc38..0cc2bf1b9 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/Organisations.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/Organisations.java @@ -1,16 +1,22 @@ package eu.eudat.controllers; -import eu.eudat.models.data.external.OrganisationsExternalSourcesModel; -import eu.eudat.models.data.helpers.responses.ResponseItem; +import eu.eudat.data.query.items.table.organisations.OrganisationsTableRequest; +import eu.eudat.logic.managers.OrganisationsManager; import eu.eudat.logic.proxy.config.exceptions.HugeResultSet; import eu.eudat.logic.proxy.config.exceptions.NoURLFound; import eu.eudat.logic.services.ApiContext; +import eu.eudat.models.data.dmp.Organisation; +import eu.eudat.models.data.external.OrganisationsExternalSourcesModel; +import eu.eudat.models.data.helpers.common.DataTableData; +import eu.eudat.models.data.helpers.responses.ResponseItem; +import eu.eudat.models.data.security.Principal; import eu.eudat.types.ApiMessageCode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import javax.validation.Valid; import java.util.List; import java.util.Map; @@ -20,28 +26,37 @@ import java.util.Map; @RequestMapping(value = {"/api"}) public class Organisations extends BaseController { + private OrganisationsExternalSourcesModel organisationsExternalSourcesModel; + private OrganisationsManager organisationsManager; @Autowired - public Organisations(ApiContext apiContext) { + public Organisations(ApiContext apiContext, OrganisationsExternalSourcesModel organisationsExternalSourcesModel, OrganisationsManager organisationsManager) { super(apiContext); + this.organisationsExternalSourcesModel = organisationsExternalSourcesModel; + this.organisationsManager = organisationsManager; } @RequestMapping(method = RequestMethod.GET, value = {"/external/organisations"}, produces = "application/json") public @ResponseBody ResponseEntity> listExternalOrganisations( - @RequestParam(value = "query", required = false) String query,@RequestParam(value = "type", required = false) String type - ) { - try { - List> remoteRepos = this.getApiContext().getOperationsContext().getRemoteFetcher().getOrganisations(query,type); - OrganisationsExternalSourcesModel projectsExternalSourcesModel = new OrganisationsExternalSourcesModel().fromExternalItem(remoteRepos); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(projectsExternalSourcesModel).status(ApiMessageCode.SUCCESS_MESSAGE)); - } catch (NoURLFound ex) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message("External Url Not Found")); - } catch (HugeResultSet ex) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message("Huge Result Set")); - } catch (Exception ex) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message(ex.getMessage())); - } + @RequestParam(value = "query", required = false) String query, @RequestParam(value = "type", required = false) String type + ) throws HugeResultSet, NoURLFound { + List> remoteRepos = this.getApiContext().getOperationsContext().getRemoteFetcher().getOrganisations(query, type); + OrganisationsExternalSourcesModel organisationsExternalSourcesModel = this.organisationsExternalSourcesModel.fromExternalItem(remoteRepos); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(organisationsExternalSourcesModel).status(ApiMessageCode.NO_MESSAGE)); } + @RequestMapping(method = RequestMethod.POST, value = {"/internal/organisations"}, produces = "application/json") + public @ResponseBody + ResponseEntity>> getPaged(@Valid @RequestBody OrganisationsTableRequest organisationsTableRequest, Principal principal) throws Exception{ + DataTableData organisationDataTableData = this.organisationsManager.getPagedOrganisations(organisationsTableRequest, principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().payload(organisationDataTableData).status(ApiMessageCode.NO_MESSAGE)); + } + + @RequestMapping(method = RequestMethod.POST, value = {"/public/organisations"}, produces = "application/json") + public @ResponseBody + ResponseEntity>> getPublicPaged(@Valid @RequestBody OrganisationsTableRequest organisationsTableRequest) throws Exception{ + DataTableData organisationDataTableData = this.organisationsManager.getPublicPagedOrganisations(organisationsTableRequest); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().payload(organisationDataTableData).status(ApiMessageCode.NO_MESSAGE)); + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/Projects.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/Projects.java index 1c0a00c76..1cf583a7c 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/Projects.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/Projects.java @@ -1,131 +1,37 @@ package eu.eudat.controllers; -import eu.eudat.data.entities.Project; -import eu.eudat.logic.managers.ProjectManager; -import eu.eudat.models.data.external.ProjectsExternalSourcesModel; -import eu.eudat.models.data.helpers.common.DataTableData; -import eu.eudat.models.data.helpers.responses.ResponseItem; import eu.eudat.data.query.items.item.project.ProjectCriteriaRequest; -import eu.eudat.models.data.project.ProjectListingModel; -import eu.eudat.data.query.items.table.project.ProjectTableRequest; -import eu.eudat.models.data.security.Principal; +import eu.eudat.logic.managers.ProjectManager; import eu.eudat.logic.proxy.config.exceptions.HugeResultSet; import eu.eudat.logic.proxy.config.exceptions.NoURLFound; import eu.eudat.logic.services.ApiContext; +import eu.eudat.models.data.helpers.responses.ResponseItem; +import eu.eudat.models.data.project.Project; +import eu.eudat.models.data.security.Principal; import eu.eudat.types.ApiMessageCode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import javax.transaction.Transactional; -import javax.validation.Valid; import java.util.List; -import java.util.Map; - @RestController @CrossOrigin -@RequestMapping(value = {"/api"}) +@RequestMapping(value = {"/api/projects/"}) public class Projects extends BaseController { + private ProjectManager projectManager; - @Autowired - public Projects(ApiContext apiContext) { - super(apiContext); - } - - @RequestMapping(method = RequestMethod.POST, value = {"/projects/getPaged"}, consumes = "application/json", produces = "application/json") - public @ResponseBody - ResponseEntity>> getPaged(@Valid @RequestBody ProjectTableRequest projectTableRequest, Principal principal) { - try { - DataTableData dataTable = new ProjectManager().getPaged(this.getApiContext().getOperationsContext().getDatabaseRepository().getProjectDao(), projectTableRequest, principal); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().payload(dataTable).status(ApiMessageCode.NO_MESSAGE)); - - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem>().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); - } - } - - @RequestMapping(method = RequestMethod.GET, value = {"/projects/getSingle/{id}"}, produces = "application/json") - public @ResponseBody - ResponseEntity> getSingle(@PathVariable String id, Principal principal) throws IllegalAccessException, InstantiationException { - //try { - eu.eudat.models.data.project.Project project = new ProjectManager().getSingle(this.getApiContext().getOperationsContext().getDatabaseRepository().getProjectDao(), id); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(project).status(ApiMessageCode.NO_MESSAGE)); - /*} catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); - }*/ - } - - - @Transactional - @RequestMapping(method = RequestMethod.POST, value = {"/projects/createOrUpdate"}, consumes = "application/json", produces = "application/json") - public @ResponseBody - ResponseEntity> addProject(@Valid @RequestBody eu.eudat.models.data.project.Project project, Principal principal) { - try { - ProjectManager.createOrUpdate(this.getApiContext().getOperationsContext().getFileStorageService(), this.getApiContext().getOperationsContext().getDatabaseRepository().getProjectDao(), this.getApiContext().getOperationsContext().getDatabaseRepository().getContentDao(), this.getApiContext().getOperationsContext().getDatabaseRepository().getUserInfoDao(), project, principal); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message("Created")); - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); - } - } - - - @Transactional - @RequestMapping(method = RequestMethod.DELETE, value = {"/projects/inactivate/{id}"}, consumes = "application/json", produces = "application/json") - public @ResponseBody - ResponseEntity> inactivate(@PathVariable String id, Principal principal) { - try { - Project project = new ProjectManager().inactivate(this.getApiContext().getOperationsContext().getDatabaseRepository().getProjectDao(), id); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE)); - } catch (Exception ex) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); - } - } - - - @RequestMapping(method = RequestMethod.POST, value = {"/projects/getWithExternal"}, consumes = "application/json", produces = "application/json") - public @ResponseBody - ResponseEntity>> getWithExternal(@RequestBody ProjectCriteriaRequest projectCriteria, Principal principal) { - try { - List dataTable = new ProjectManager().getCriteriaWithExternal(this.getApiContext(), projectCriteria, this.getApiContext().getOperationsContext().getRemoteFetcher()); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().payload(dataTable).status(ApiMessageCode.NO_MESSAGE)); - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem>().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); - } - } - - @RequestMapping(method = RequestMethod.POST, value = {"/projects/get"}, consumes = "application/json", produces = "application/json") - public @ResponseBody - ResponseEntity>> get(@RequestBody ProjectCriteriaRequest projectCriteria, Principal principal) { - try { - List dataTable = new ProjectManager().getCriteria(this.getApiContext().getOperationsContext().getDatabaseRepository().getProjectDao(), projectCriteria, this.getApiContext().getOperationsContext().getRemoteFetcher()); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().payload(dataTable).status(ApiMessageCode.NO_MESSAGE)); - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem>().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); - } - } - - @RequestMapping(method = RequestMethod.GET, value = {"/external/projects"}, produces = "application/json") - public @ResponseBody - ResponseEntity> listExternalProjects(@RequestParam(value = "query", required = false) String query, Principal principal) { - try { - List> remoteRepos = this.getApiContext().getOperationsContext().getRemoteFetcher().getProjects(query); - ProjectsExternalSourcesModel projectsExternalSourcesModel = new ProjectsExternalSourcesModel().fromExternalItem(remoteRepos); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(projectsExternalSourcesModel).status(ApiMessageCode.SUCCESS_MESSAGE)); - } catch (NoURLFound ex) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message("External Url Not Found")); - } catch (HugeResultSet ex) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message("Huge Result Set")); - } catch (Exception ex) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message(ex.getMessage())); - } - } + @Autowired + public Projects(ApiContext apiContext, ProjectManager projectManager) { + super(apiContext); + this.projectManager = projectManager; + } + @RequestMapping(method = RequestMethod.POST, value = {"/external"}, consumes = "application/json", produces = "application/json") + public @ResponseBody + ResponseEntity>> getWithExternal(@RequestBody ProjectCriteriaRequest projectCriteria, Principal principal) throws NoURLFound, InstantiationException, HugeResultSet, IllegalAccessException { + List dataTable = this.projectManager.getCriteriaWithExternal(projectCriteria, principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().payload(dataTable).status(ApiMessageCode.NO_MESSAGE)); + } } - diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/QuickWizardController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/QuickWizardController.java new file mode 100644 index 000000000..044700940 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/QuickWizardController.java @@ -0,0 +1,105 @@ +package eu.eudat.controllers; + + +import eu.eudat.data.entities.Funder; +import eu.eudat.data.entities.Project; +import eu.eudat.logic.managers.*; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.models.data.datasetwizard.DatasetWizardModel; +import eu.eudat.models.data.dmp.DataManagementPlan; +import eu.eudat.models.data.helpers.responses.ResponseItem; +import eu.eudat.models.data.quickwizard.DatasetDescriptionQuickWizardModel; +import eu.eudat.models.data.quickwizard.QuickWizardModel; +import eu.eudat.models.data.security.Principal; +import eu.eudat.types.ApiMessageCode; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import eu.eudat.models.data.quickwizard.DatasetCreateWizardModel; + +import javax.transaction.Transactional; +import javax.validation.Valid; +import java.util.UUID; + +@RestController +@CrossOrigin +@RequestMapping(value = {"/api/quick-wizard/"}) +public class QuickWizardController extends BaseController { + + private QuickWizardManager quickWizardManager; + private DatasetManager datasetManager; + + @Autowired + public QuickWizardController(ApiContext apiContext, QuickWizardManager quickWizardManager, DatasetManager datasetManager) { + super(apiContext); + this.quickWizardManager = quickWizardManager; + this.datasetManager = datasetManager; + } + + @Transactional + @RequestMapping(method = RequestMethod.POST, consumes = "application/json", produces = "application/json") + public @ResponseBody + ResponseEntity> addQuickWizardModel(@Valid @RequestBody QuickWizardModel quickWizard, Principal principal) throws Exception { + + Funder funderEntity; + //Create Funder + if (quickWizard.getFunder().getExistFunder() == null + && quickWizard.getFunder().getLabel() == null) { + funderEntity = null; + } else if (quickWizard.getFunder().getExistFunder() == null && quickWizard.getFunder().getLabel() != null){ + funderEntity = this.quickWizardManager.createOrUpdate(quickWizard.getFunder().toDataFunder(), principal); + } else { + funderEntity = quickWizard.getFunder().getExistFunder().toDataModel(); + } + + eu.eudat.data.entities.Grant grantEntity; + //Create Grant + if (quickWizard.getGrant().getExistGrant() == null) { + grantEntity = this.quickWizardManager.createOrUpdate(quickWizard.getGrant().toDataGrant(), principal); + } else { + grantEntity = quickWizard.getGrant().getExistGrant().toDataModel(); + } + + Project projectEntity; + //Create Project + if (quickWizard.getProject().getExistProject() == null + && quickWizard.getProject().getLabel() == null) { + projectEntity = null; + } else if (quickWizard.getProject().getExistProject() == null && quickWizard.getProject().getLabel() != null){ + projectEntity = this.quickWizardManager.createOrUpdate(quickWizard.getProject().toDataProject(), principal); + } else { + projectEntity = quickWizard.getProject().getExistProject().toDataModel(); + } + + //Create Dmp + eu.eudat.data.entities.DMP dmpEntity = this.quickWizardManager.createOrUpdate( + quickWizard.getDmp().toDataDmp(grantEntity, projectEntity, principal), + funderEntity, + principal); + + //Create Datasets + quickWizard.getDmp().setId(dmpEntity.getId()); + for (DatasetDescriptionQuickWizardModel dataset : quickWizard.getDatasets().getDatasetsList()) { + DataManagementPlan dmp = quickWizard.getDmp().toDataDmp(grantEntity, projectEntity, principal); + UUID uuid = quickWizard.getDmp().getDatasetProfile().getId(); + DatasetWizardModel datasetWizardModel = dataset.toDataModel(dmp, uuid); + this.datasetManager.createOrUpdate(datasetWizardModel, principal); + } + + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message("Created")); + } + + + + @RequestMapping(method = RequestMethod.POST, value = {"/datasetcreate"}, consumes = "application/json", produces = "application/json") + public @ResponseBody + ResponseEntity> addDatasetWizard(@RequestBody DatasetCreateWizardModel datasetCreateWizardModel, Principal principal) throws Exception{ + for(DatasetDescriptionQuickWizardModel dataset : datasetCreateWizardModel.getDatasets().getDatasetsList()){ + this.datasetManager.createOrUpdate(dataset.toDataModel(datasetCreateWizardModel.getDmpMeta().getDmp(), datasetCreateWizardModel.getDmpMeta().getDatasetProfile().getId()), principal); + } + + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message("Dataset added!")); + } + +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/Registries.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/Registries.java index 9a370bf01..1134d4317 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/Registries.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/Registries.java @@ -1,14 +1,19 @@ package eu.eudat.controllers; -import eu.eudat.models.data.external.RegistriesExternalSourcesModel; -import eu.eudat.models.data.helpers.responses.ResponseItem; +import eu.eudat.data.entities.Registry; +import eu.eudat.logic.managers.RegistryManager; import eu.eudat.logic.proxy.config.exceptions.HugeResultSet; import eu.eudat.logic.proxy.config.exceptions.NoURLFound; import eu.eudat.logic.services.ApiContext; +import eu.eudat.models.data.helpers.responses.ResponseItem; +import eu.eudat.models.data.registries.RegistryModel; +import eu.eudat.models.data.security.Principal; import eu.eudat.types.ApiMessageCode; +import org.apache.regexp.RE; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -20,29 +25,28 @@ import java.util.Map; @RequestMapping(value = {"/api"}) public class Registries extends BaseController { + private RegistryManager registryManager; + @Autowired - public Registries(ApiContext apiContext) { + public Registries(ApiContext apiContext, RegistryManager registryManager) { super(apiContext); + this.registryManager = registryManager; } @RequestMapping(method = RequestMethod.GET, value = {"/external/registries"}, produces = "application/json") public @ResponseBody - ResponseEntity> listExternalRegistries(@RequestParam(value = "query", required = false) String query - ,@RequestParam(value = "type", required = false) String type) { - try { - List> remoteRepos = this.getApiContext().getOperationsContext().getRemoteFetcher().getRegistries(query,type); - RegistriesExternalSourcesModel registriesExternalSourcesModel = new RegistriesExternalSourcesModel().fromExternalItem(remoteRepos); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(registriesExternalSourcesModel).status(ApiMessageCode.NO_MESSAGE)); - } catch (NoURLFound ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message("External Url Not Found")); - } catch (HugeResultSet ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message("Huge Result Set")); - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message(ex.getMessage())); - } + ResponseEntity>>> listExternalRegistries(@RequestParam(value = "query", required = false) String query + , @RequestParam(value = "type", required = false) String type) throws HugeResultSet, NoURLFound { + List> remoteRepos = this.getApiContext().getOperationsContext().getRemoteFetcher().getRegistries(query, type); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>>().payload(remoteRepos).status(ApiMessageCode.NO_MESSAGE)); + } + + @Transactional + @RequestMapping(method = RequestMethod.POST, value = {"/registries"}, consumes = "application/json", produces = "application/json") + public @ResponseBody + ResponseEntity> create(@RequestBody RegistryModel registryModel, Principal principal) throws Exception { + Registry registry = this.registryManager.create(registryModel); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(registry).status(ApiMessageCode.SUCCESS_MESSAGE)); } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/Researchers.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/Researchers.java index c0a1d9919..8a73d28f3 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/Researchers.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/Researchers.java @@ -1,15 +1,14 @@ package eu.eudat.controllers; -import eu.eudat.exceptions.security.UnauthorisedException; -import eu.eudat.logic.managers.ResearcherManager; -import eu.eudat.models.data.dmp.Researcher; -import eu.eudat.models.data.external.ResearchersExternalSourcesModel; -import eu.eudat.models.data.helpers.responses.ResponseItem; import eu.eudat.data.query.items.item.researcher.ResearcherCriteriaRequest; -import eu.eudat.models.data.security.Principal; +import eu.eudat.logic.managers.ResearcherManager; import eu.eudat.logic.proxy.config.exceptions.HugeResultSet; import eu.eudat.logic.proxy.config.exceptions.NoURLFound; import eu.eudat.logic.services.ApiContext; +import eu.eudat.models.data.dmp.Researcher; +import eu.eudat.models.data.external.ResearchersExternalSourcesModel; +import eu.eudat.models.data.helpers.responses.ResponseItem; +import eu.eudat.models.data.security.Principal; import eu.eudat.types.ApiMessageCode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -23,58 +22,30 @@ import java.util.Map; @RestController @CrossOrigin -@RequestMapping(value = {"/api"}) +@RequestMapping(value = {"/api/researchers"}) public class Researchers extends BaseController { + private ResearcherManager researcherManager; @Autowired - public Researchers(ApiContext apiContext) { + public Researchers(ApiContext apiContext, ResearcherManager researcherManager) { super(apiContext); + this.researcherManager = researcherManager; } - @RequestMapping(method = RequestMethod.GET, value = {"/external/researchers"}, produces = "application/json") + @RequestMapping(method = RequestMethod.POST, value = {"/getWithExternal"}, consumes = "application/json", produces = "application/json") public @ResponseBody - ResponseEntity> listExternalResearchers( - @RequestParam(value = "query", required = false) String query,@RequestParam(value = "type", required = false) String type) { - try { - List> remoteRepos = this.getApiContext().getOperationsContext().getRemoteFetcher().getResearchers(query,type); - ResearchersExternalSourcesModel researchersExternalSourcesModel = new ResearchersExternalSourcesModel().fromExternalItem(remoteRepos); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(researchersExternalSourcesModel).status(ApiMessageCode.NO_MESSAGE)); - } catch (NoURLFound ex) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message("External Url Not Found")); - } catch (HugeResultSet ex) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message("Huge Result Set")); - } catch (Exception ex) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message(ex.getMessage())); - } - } - - @RequestMapping(method = RequestMethod.POST, value = {"/researchers/getWithExternal"}, consumes = "application/json", produces = "application/json") - public @ResponseBody - ResponseEntity>> getWithExternal(@RequestBody ResearcherCriteriaRequest researcherCriteriaRequest, Principal principal) { - try { - List dataTable = new ResearcherManager().getCriteriaWithExternal(this.getApiContext(),this.getApiContext().getOperationsContext().getRemoteFetcher(), researcherCriteriaRequest); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().payload(dataTable).status(ApiMessageCode.NO_MESSAGE)); - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem>().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); - } + ResponseEntity>> getWithExternal(@RequestBody ResearcherCriteriaRequest researcherCriteriaRequest, Principal principal) throws HugeResultSet, NoURLFound { + List dataTable = this.researcherManager.getCriteriaWithExternal(researcherCriteriaRequest); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().payload(dataTable).status(ApiMessageCode.NO_MESSAGE)); } @Transactional - @RequestMapping(method = RequestMethod.POST, value = {"/researchers/create"}, consumes = "application/json", produces = "application/json") + @RequestMapping(method = RequestMethod.POST, consumes = "application/json", produces = "application/json") public @ResponseBody - ResponseEntity> create(@RequestBody eu.eudat.models.data.researcher.Researcher researcher, Principal principal) { - try { - ResearcherManager.create(this.getApiContext(), researcher); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE)); - } catch (UnauthorisedException e) { - e.printStackTrace(); - throw e; - } catch (Exception e) { - e.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message(e.getMessage())); - } + ResponseEntity> create(@RequestBody eu.eudat.models.data.researcher.Researcher researcher, Principal principal) throws Exception { + this.researcherManager.create(researcher); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE)); } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/Services.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/Services.java index c8aa5bd29..36b2703cb 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/Services.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/Services.java @@ -1,14 +1,18 @@ package eu.eudat.controllers; -import eu.eudat.models.data.external.ServiceExternalSourcesModel; -import eu.eudat.models.data.helpers.responses.ResponseItem; +import eu.eudat.data.entities.Service; +import eu.eudat.logic.managers.ServiceManager; import eu.eudat.logic.proxy.config.exceptions.HugeResultSet; import eu.eudat.logic.proxy.config.exceptions.NoURLFound; import eu.eudat.logic.services.ApiContext; +import eu.eudat.models.data.helpers.responses.ResponseItem; +import eu.eudat.models.data.security.Principal; +import eu.eudat.models.data.services.ServiceModel; import eu.eudat.types.ApiMessageCode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -20,28 +24,29 @@ import java.util.Map; @RequestMapping(value = {"/api"}) public class Services extends BaseController { - @Autowired - public Services(ApiContext apiContext) { - super(apiContext); - } + private ServiceManager serviceManager; - @RequestMapping(method = RequestMethod.GET, value = {"/external/services"}, produces = "application/json") - public @ResponseBody - ResponseEntity> listExternalServices( - @RequestParam(value = "query", required = false) String query,@RequestParam(value = "type", required = false) String type - ) { - try { - List> remoteRepos = this.getApiContext().getOperationsContext().getRemoteFetcher().getServices(query,type); - ServiceExternalSourcesModel serviceExternalSourcesModel = new ServiceExternalSourcesModel().fromExternalItem(remoteRepos); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(serviceExternalSourcesModel).status(ApiMessageCode.NO_MESSAGE)); - } catch (NoURLFound ex) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message("External Url Not Found")); - } catch (HugeResultSet ex) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message("Huge Result Set")); - } catch (Exception ex) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message(ex.getMessage())); - } - } + @Autowired + public Services(ApiContext apiContext, ServiceManager serviceManager) { + super(apiContext); + this.serviceManager = serviceManager; + } + @RequestMapping(method = RequestMethod.GET, value = {"/external/services"}, produces = "application/json") + public @ResponseBody + ResponseEntity>>> listExternalServices( + @RequestParam(value = "query", required = false) String query, @RequestParam(value = "type", required = false) String type + ) throws HugeResultSet, NoURLFound { + List> remoteRepos = this.getApiContext().getOperationsContext().getRemoteFetcher().getServices(query, type); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>>().payload(remoteRepos).status(ApiMessageCode.NO_MESSAGE)); + } + + @Transactional + @RequestMapping(method = RequestMethod.POST, value = {"/services"}, consumes = "application/json", produces = "application/json") + public @ResponseBody + ResponseEntity> create(@RequestBody ServiceModel serviceModel, Principal principal) throws Exception { + Service service = serviceManager.create(serviceModel); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(service).status(ApiMessageCode.SUCCESS_MESSAGE)); + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/TagController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/TagController.java new file mode 100644 index 000000000..02bcb3186 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/TagController.java @@ -0,0 +1,60 @@ +package eu.eudat.controllers; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import eu.eudat.elastic.criteria.TagCriteria; +import eu.eudat.elastic.entities.Dataset; +import eu.eudat.elastic.repository.Repository; +import eu.eudat.logic.proxy.config.exceptions.HugeResultSet; +import eu.eudat.logic.proxy.config.exceptions.NoURLFound; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.models.data.external.TagExternalSourcesModel; +import eu.eudat.models.data.helpers.responses.ResponseItem; +import eu.eudat.types.ApiMessageCode; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Created by ikalyvas on 7/5/2018. + */ +@RestController +@CrossOrigin +@RequestMapping(value = {"/api"}) +public class TagController extends BaseController { + + private Repository datasetRepository; + private Environment environment; + + @Autowired + public TagController(ApiContext apiContext, Repository tagRepository, Environment environment) { + super(apiContext); + this.datasetRepository = tagRepository; + this.environment = environment; + } + + @RequestMapping(method = RequestMethod.GET, value = {"/external/tags"}, produces = "application/json") + public @ResponseBody + ResponseEntity> listExternalTagModel( + @RequestParam(value = "query", required = false) String query, @RequestParam(value = "type", required = false) String type) throws HugeResultSet, NoURLFound, IOException { + List> remoteRepos = this.getApiContext().getOperationsContext().getRemoteFetcher().getTags(query, type); + TagExternalSourcesModel researchersExternalSourcesModel = new TagExternalSourcesModel().fromExternalItem(remoteRepos); + +// ObjectMapper mapper = new ObjectMapper(); +// String fileUrl = this.environment.getProperty("configuration.resources.path") + this.environment.getProperty("dataset.tags.mock"); +// List> data = mapper.readValue(new File(fileUrl), new TypeReference>>(){}); +// TagExternalSourcesModel researchersExternalSourcesModel = new TagExternalSourcesModel().fromExternalItem(data); + + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(researchersExternalSourcesModel).status(ApiMessageCode.NO_MESSAGE)); + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/UserInvitationController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/UserInvitationController.java index 7cc180fd4..3e09dd43b 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/UserInvitationController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/UserInvitationController.java @@ -1,13 +1,12 @@ package eu.eudat.controllers; -import eu.eudat.exceptions.security.UnauthorisedException; +import eu.eudat.data.query.items.item.userinfo.UserInfoRequestItem; import eu.eudat.logic.managers.InvitationsManager; +import eu.eudat.logic.services.ApiContext; import eu.eudat.models.data.helpers.responses.ResponseItem; import eu.eudat.models.data.invitation.Invitation; import eu.eudat.models.data.security.Principal; import eu.eudat.models.data.userinfo.UserInfoInvitationModel; -import eu.eudat.data.query.items.item.userinfo.UserInfoRequestItem; -import eu.eudat.logic.services.ApiContext; import eu.eudat.types.ApiMessageCode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -24,49 +23,33 @@ import java.util.UUID; @CrossOrigin public class UserInvitationController extends BaseController { + private InvitationsManager invitationsManager; @Autowired - public UserInvitationController(ApiContext apiContext) { + public UserInvitationController(ApiContext apiContext, InvitationsManager invitationsManager) { super(apiContext); + this.invitationsManager = invitationsManager; } @Transactional @RequestMapping(method = RequestMethod.POST, value = {"/users"}, consumes = "application/json", produces = "application/json") public @ResponseBody - ResponseEntity> users(@RequestBody Invitation invitation, Principal principal) { - try { - InvitationsManager.inviteUsers(this.getApiContext(), invitation, principal); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message("Users have beeen invited")); - } catch (Exception e) { - e.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message(e.getMessage())); - } + ResponseEntity> users(@RequestBody Invitation invitation, Principal principal) throws Exception { + this.invitationsManager.inviteUsers(invitation, principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message("Users have beeen invited")); } @Transactional @RequestMapping(method = RequestMethod.GET, value = {"/exchange/{invitationID}"}, produces = "application/json") public @ResponseBody ResponseEntity> exchange(@PathVariable UUID invitationID, Principal principal) { - try { - UUID dmpId = InvitationsManager.assignUserAcceptedInvitation(this.getApiContext(), invitationID, principal); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).payload(dmpId)); - } catch (UnauthorisedException e) { - e.printStackTrace(); - throw e; - } catch (Exception e) { - e.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message(e.getMessage())); - } + UUID dmpId = invitationsManager.assignUserAcceptedInvitation(invitationID, principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).payload(dmpId)); } @RequestMapping(method = RequestMethod.POST, value = {"/getUsers"}, consumes = "application/json", produces = "application/json") public @ResponseBody - ResponseEntity>> getUsers(@RequestBody UserInfoRequestItem userInfoRequestItem) { - try { - List users = InvitationsManager.getUsers(this.getApiContext(), userInfoRequestItem); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.SUCCESS_MESSAGE).payload(users)); - } catch (Exception e) { - e.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem>().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(e.getMessage())); - } + ResponseEntity>> getUsers(@RequestBody UserInfoRequestItem userInfoRequestItem) throws IllegalAccessException, InstantiationException { + List users = invitationsManager.getUsers(userInfoRequestItem); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.SUCCESS_MESSAGE).payload(users)); } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/Users.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/Users.java index 3bd2dcc57..5d7f48319 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/Users.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/Users.java @@ -1,13 +1,14 @@ package eu.eudat.controllers; +import eu.eudat.data.query.items.table.userinfo.UserInfoTableRequestItem; import eu.eudat.logic.managers.UserManager; +import eu.eudat.logic.security.claims.ClaimedAuthorities; +import eu.eudat.logic.services.ApiContext; import eu.eudat.models.data.helpers.common.DataTableData; import eu.eudat.models.data.helpers.responses.ResponseItem; import eu.eudat.models.data.security.Principal; -import eu.eudat.data.query.items.table.userinfo.UserInfoTableRequestItem; import eu.eudat.models.data.userinfo.UserListingModel; -import eu.eudat.logic.security.claims.ClaimedAuthorities; -import eu.eudat.logic.services.ApiContext; +import eu.eudat.models.data.userinfo.UserProfile; import eu.eudat.types.ApiMessageCode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -16,6 +17,9 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; +import java.io.IOException; +import java.util.Map; +import java.util.UUID; import static eu.eudat.types.Authorities.ADMIN; @@ -25,34 +29,49 @@ import static eu.eudat.types.Authorities.ADMIN; @RequestMapping(value = "api/user") public class Users extends BaseController { + private UserManager userManager; @Autowired - public Users(ApiContext apiContext) { + public Users(ApiContext apiContext, UserManager userManager) { super(apiContext); + this.userManager = userManager; } @RequestMapping(method = RequestMethod.POST, value = {"/getPaged"}, consumes = "application/json", produces = "application/json") public @ResponseBody - ResponseEntity>> getPaged(@Valid @RequestBody UserInfoTableRequestItem userInfoTableRequestItem, @ClaimedAuthorities(claims = {ADMIN}) Principal principal) { - try { - DataTableData dataTable = UserManager.getPaged(this.getApiContext(), userInfoTableRequestItem); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().payload(dataTable).status(ApiMessageCode.NO_MESSAGE)); - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem>().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); - } + ResponseEntity>> getPaged(@Valid @RequestBody UserInfoTableRequestItem userInfoTableRequestItem, @ClaimedAuthorities(claims = {ADMIN}) Principal principal) throws Exception { + DataTableData dataTable = userManager.getPaged(userInfoTableRequestItem); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().payload(dataTable).status(ApiMessageCode.NO_MESSAGE)); } @Transactional @RequestMapping(method = RequestMethod.POST, value = {"/updateRoles"}, consumes = "application/json", produces = "application/json") public @ResponseBody ResponseEntity> updateRoles(@Valid @RequestBody UserListingModel userListingModel, @ClaimedAuthorities(claims = {ADMIN}) Principal principal) { - try { - UserManager.editRoles(this.getApiContext(), userListingModel); - return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE)); - } catch (Exception ex) { - ex.printStackTrace(); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); - } + userManager.editRoles(userListingModel); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE)); + } + + @RequestMapping(method = RequestMethod.GET, value = {"/{id}"}, produces = "application/json") + public @ResponseBody + ResponseEntity> get(@PathVariable String id, Principal principal) throws Exception { + UUID userId = id.equals("me") ? principal.getId() : UUID.fromString(id); + UserProfile user = userManager.getSingle(userId); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(user).status(ApiMessageCode.NO_MESSAGE)); + } + + @Transactional + @RequestMapping(method = RequestMethod.POST, value = {"/settings"}, produces = "application/json") + public @ResponseBody + ResponseEntity> saveSettings(@RequestBody Map settings, Principal principal) throws IOException { + userManager.updateSettings(settings, principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE)); + } + + @RequestMapping(method = RequestMethod.POST, value = {"/getCollaboratorsPaged"}, consumes = "application/json", produces = "application/json") + public @ResponseBody + ResponseEntity>> getCollaboratorsPaged(@Valid @RequestBody UserInfoTableRequestItem userInfoTableRequestItem, Principal principal) throws Exception { + DataTableData dataTable = userManager.getCollaboratorsPaged(userInfoTableRequestItem, principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().payload(dataTable).status(ApiMessageCode.NO_MESSAGE)); } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/controllerhandler/ControllerErrorHandler.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/controllerhandler/ControllerErrorHandler.java index 8c0cf0479..55ff5e514 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/controllerhandler/ControllerErrorHandler.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/controllerhandler/ControllerErrorHandler.java @@ -1,8 +1,14 @@ package eu.eudat.controllers.controllerhandler; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectWriter; +import com.fasterxml.jackson.databind.SerializationFeature; import eu.eudat.core.logger.Logger; import eu.eudat.core.models.exception.ApiExceptionLoggingModel; +import eu.eudat.models.data.helpers.responses.ResponseItem; import eu.eudat.models.data.security.Principal; +import eu.eudat.types.ApiMessageCode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ControllerAdvice; @@ -11,6 +17,7 @@ import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; import types.LoggingType; +import javax.annotation.Priority; import java.util.HashMap; import java.util.Map; @@ -18,6 +25,7 @@ import java.util.Map; * Created by ikalyvas on 6/12/2018. */ @ControllerAdvice +@Priority(5) public class ControllerErrorHandler { private Logger logger; @@ -30,16 +38,23 @@ public class ControllerErrorHandler { @ExceptionHandler(Exception.class) @ResponseStatus(HttpStatus.BAD_REQUEST) @ResponseBody - public void processValidationError(Principal principal, Exception ex) throws Exception { - ApiExceptionLoggingModel apiExceptionLoggingModel = new ApiExceptionLoggingModel<>(); + public ResponseItem processValidationError(Principal principal, Exception ex) throws Exception { + ApiExceptionLoggingModel apiExceptionLoggingModel = new ApiExceptionLoggingModel<>(); apiExceptionLoggingModel.setCode(HttpStatus.BAD_REQUEST); apiExceptionLoggingModel.setUser(principal); - Map exceptionMap = new HashMap<>(); - exceptionMap.put("exception",ex); - apiExceptionLoggingModel.setData(exceptionMap); + Map exceptionMap = new HashMap<>(); + ObjectWriter ow = new ObjectMapper().configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false).writer().withDefaultPrettyPrinter(); + try { + String json = ow.writeValueAsString(ex); + exceptionMap.put("exception", json); + apiExceptionLoggingModel.setData(ow.writeValueAsString(exceptionMap)); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } apiExceptionLoggingModel.setMessage(ex.getMessage()); apiExceptionLoggingModel.setType(LoggingType.ERROR); + ex.printStackTrace(); this.logger.error(apiExceptionLoggingModel); - return; + return new ResponseItem().message(ex.getMessage()).status(ApiMessageCode.DEFAULT_ERROR_MESSAGE); } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/controllerhandler/ControllerUnauthorisedHandler.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/controllerhandler/ControllerUnauthorisedHandler.java index ba89aa83e..72e02ad89 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/controllerhandler/ControllerUnauthorisedHandler.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/controllerhandler/ControllerUnauthorisedHandler.java @@ -3,16 +3,20 @@ package eu.eudat.controllers.controllerhandler; import eu.eudat.core.logger.Logger; import eu.eudat.exceptions.security.UnauthorisedException; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.annotation.Order; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; +import javax.annotation.Priority; + /** * Created by ikalyvas on 6/12/2018. */ @ControllerAdvice +@Priority(4) public class ControllerUnauthorisedHandler { private Logger logger; diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/controllerhandler/ControllerUserNullEmailHandler.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/controllerhandler/ControllerUserNullEmailHandler.java new file mode 100644 index 000000000..d63e50ffa --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/controllerhandler/ControllerUserNullEmailHandler.java @@ -0,0 +1,19 @@ +package eu.eudat.controllers.controllerhandler; + +import eu.eudat.exceptions.security.NullEmailException; +import eu.eudat.models.data.helpers.responses.ResponseItem; +import eu.eudat.types.ApiMessageCode; +import org.springframework.core.annotation.Order; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +@ControllerAdvice +@Order(2) +public class ControllerUserNullEmailHandler { + + @ExceptionHandler(NullEmailException.class) + public ResponseEntity nullEmailException(Exception ex) throws Exception { + return ResponseEntity.status(ApiMessageCode.NULL_EMAIL.getValue()).body(""); + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/controllerhandler/ControllerValidatorErrorHandler.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/controllerhandler/ControllerValidatorErrorHandler.java index 5edafa4b6..ad433cdd0 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/controllerhandler/ControllerValidatorErrorHandler.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/controllerhandler/ControllerValidatorErrorHandler.java @@ -6,6 +6,7 @@ import eu.eudat.types.ApiMessageCode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.core.annotation.Order; import org.springframework.http.HttpStatus; import org.springframework.validation.BindingResult; import org.springframework.validation.FieldError; @@ -20,6 +21,7 @@ import java.util.Locale; @ControllerAdvice +@Order(3) public class ControllerValidatorErrorHandler { private MessageSource messageSource; diff --git a/dmp-backend/web/src/main/java/eu/eudat/criteria/DMPCriteria.java b/dmp-backend/web/src/main/java/eu/eudat/criteria/DMPCriteria.java new file mode 100644 index 000000000..0db1cc5b5 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/criteria/DMPCriteria.java @@ -0,0 +1,150 @@ +package eu.eudat.criteria; + +import eu.eudat.criteria.entities.Criteria; +import eu.eudat.criteria.entities.DateCriteria; +import eu.eudat.logic.services.operations.DatabaseRepository; +import eu.eudat.query.DMPQuery; + +import java.util.*; + +public class DMPCriteria { + private Criteria id; + private Criteria groupId; + private Criteria label; + private Criteria version; + private GrantCriteria grant; + private DateCriteria created; + private DateCriteria modified; + private UserCriteria creator; + private DatasetCriteria dataset; + + public Criteria getId() { + return id; + } + + public void setId(Criteria id) { + this.id = id; + } + + public void setId(String id) { + Criteria criteria = new Criteria<>(); + criteria.setAs(id); + this.id = criteria; + } + + public Criteria getGroupId() { + return groupId; + } + + public void setGroupId(Criteria groupId) { + this.groupId = groupId; + } + + public void setGroupId(String groupId) { + Criteria criteria = new Criteria<>(); + criteria.setAs(groupId); + this.groupId = criteria; + } + + public Criteria getLabel() { + return label; + } + + public void setLabel(Criteria label) { + this.label = label; + } + + public void setLabel(String label) { + Criteria criteria = new Criteria<>(); + criteria.setAs(label); + this.label = criteria; + } + + public Criteria getVersion() { + return version; + } + + public void setVersion(Criteria version) { + this.version = version; + } + + public void setVersion(String version) { + Criteria criteria = new Criteria<>(); + criteria.setAs(version); + this.version = criteria; + } + + public GrantCriteria getGrant() { + return grant; + } + + public void setGrant(GrantCriteria grant) { + this.grant = grant; + } + + public DateCriteria getCreated() { + return created; + } + + public void setCreated(DateCriteria created) { + this.created = created; + } + + public void setCreated(String created) { + DateCriteria criteria = new DateCriteria(); + criteria.setAs(created); + this.created = criteria; + } + + public DateCriteria getModified() { + return modified; + } + + public void setModified(DateCriteria modified) { + this.modified = modified; + } + + public void setModified(String modified) { + DateCriteria criteria = new DateCriteria(); + criteria.setAs(modified); + this.modified = criteria; + } + + public UserCriteria getCreator() { + return creator; + } + + public void setCreator(UserCriteria creator) { + this.creator = creator; + } + + public DatasetCriteria getDataset() { + return dataset; + } + + public void setDataset(DatasetCriteria dataset) { + this.dataset = dataset; + } + + protected List buildFields(String path) { + Set fields = new LinkedHashSet<>(); + path = path != null && !path.isEmpty() ? path + "." : ""; + if (this.id != null) fields.add(path + this.id.getAs()); + if (this.label != null) fields.add(path + this.label.getAs()); + if (this.grant != null) fields.addAll(this.grant.buildFields(path + "grant")); + if (this.creator != null) fields.addAll(this.creator.buildFields(path + "creator")); + if (this.dataset != null) fields.addAll(this.dataset.buildFields(path + "dataset")); + if (!fields.contains(path + "id")) fields.add(path + "id"); + return new LinkedList<>(fields); + } + + public DMPQuery buildQuery(DatabaseRepository dao) { + List fields = this.buildFields(""); + DMPQuery dmpQuery = new DMPQuery(dao.getDmpDao(), fields); + if (this.id != null) dmpQuery.setId(this.id.getValue()); + if (this.grant != null) dmpQuery.setGrantQuery(this.grant.buildQuery(dao)); + if (this.creator != null) dmpQuery.setUserQuery(this.creator.buildQuery(dao)); + if (this.dataset != null) dmpQuery.setDatasetQuery(this.dataset.buildQuery(dao)); + return dmpQuery; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/criteria/DatasetCriteria.java b/dmp-backend/web/src/main/java/eu/eudat/criteria/DatasetCriteria.java new file mode 100644 index 000000000..f65f69028 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/criteria/DatasetCriteria.java @@ -0,0 +1,77 @@ +package eu.eudat.criteria; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectReader; +import com.fasterxml.jackson.databind.node.JsonNodeType; +import eu.eudat.criteria.entities.Criteria; +import eu.eudat.logic.services.operations.DatabaseRepository; +import eu.eudat.query.DatasetQuery; + +import java.io.IOException; +import java.util.*; + +public class DatasetCriteria { + private Criteria id; + private Criteria label; + private DMPCriteria dmp; + + public Criteria getId() { + return id; + } + + public void setId(JsonNode jsonNode) throws IOException { + if (jsonNode.getNodeType().equals(JsonNodeType.STRING)) { + Criteria criteria = new Criteria<>(); + criteria.setAs(jsonNode.asText()); + this.id = criteria; + } else if (jsonNode.getNodeType().equals(JsonNodeType.OBJECT)) { + ObjectReader reader = new ObjectMapper().readerFor(new TypeReference>() { + }); + this.id = reader.readValue(jsonNode); + } + } + + public Criteria getLabel() { + return label; + } + + public void setLabel(JsonNode jsonNode) throws IOException { + if (jsonNode.getNodeType().equals(JsonNodeType.STRING)) { + Criteria criteria = new Criteria<>(); + criteria.setAs(jsonNode.asText()); + this.label = criteria; + } else if (jsonNode.getNodeType().equals(JsonNodeType.OBJECT)) { + ObjectReader reader = new ObjectMapper().readerFor(new TypeReference>() { + }); + this.label = reader.readValue(jsonNode); + } + } + + public DMPCriteria getDmp() { + return dmp; + } + + public void setDmp(DMPCriteria dmp) { + this.dmp = dmp; + } + + protected List buildFields(String path) { + Set fields = new HashSet<>(); + path = path != null && !path.isEmpty() ? path + "." : ""; + if (this.id != null) fields.add(path + this.id.getAs()); + if (this.label != null) fields.add(path + this.label.getAs()); + if (this.dmp != null) fields.addAll(this.dmp.buildFields(path + "dmp")); + if (!fields.contains(path + "id")) fields.add(path + "id"); + return new LinkedList<>(fields); + } + + public DatasetQuery buildQuery(DatabaseRepository dao) { + List fields = this.buildFields(""); + DatasetQuery datasetQuery = new DatasetQuery(dao.getDatasetDao(), fields); + if (this.id != null) datasetQuery.setId(this.id.getValue()); + if (this.dmp != null) datasetQuery.setDmpQuery(this.dmp.buildQuery(dao)); + return datasetQuery; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/criteria/GrantCriteria.java b/dmp-backend/web/src/main/java/eu/eudat/criteria/GrantCriteria.java new file mode 100644 index 000000000..2c6e0b21d --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/criteria/GrantCriteria.java @@ -0,0 +1,109 @@ +package eu.eudat.criteria; + +import eu.eudat.criteria.entities.Criteria; +import eu.eudat.criteria.entities.DateCriteria; +import eu.eudat.logic.services.operations.DatabaseRepository; +import eu.eudat.query.GrantQuery; +import java.util.*; + +public class GrantCriteria { + private Criteria id; + private List ids; + private Criteria label; + private List statuses; + private DateCriteria created; + private DateCriteria modified; + private UserCriteria creator; + + public Criteria getId() { + return id; + } + + public void setId(Criteria id) { + this.id = id; + } + + public List getIds() { + return ids; + } + + public void setIds(List ids) { + this.ids = ids; + } + + public Criteria getLabel() { + return label; + } + + public void setLabel(Criteria label) { + this.label = label; + } + + public void setLabel(String label) { + Criteria criteria = new Criteria<>(); + criteria.setAs(label); + this.label = criteria; + } + + public List getStatuses() { + return statuses; + } + + public void setStatuses(List statuses) { + this.statuses = statuses; + } + + public DateCriteria getCreated() { + return created; + } + + public void setCreated(DateCriteria created) { + this.created = created; + } + + public void setCreated(String created) { + DateCriteria criteria = new DateCriteria(); + criteria.setAs(created); + this.created = criteria; + } + + public DateCriteria getModified() { + return modified; + } + + public void setModified(DateCriteria modified) { + this.modified = modified; + } + + public void setModified(String modified) { + DateCriteria criteria = new DateCriteria(); + criteria.setAs(modified); + this.modified = criteria; + } + + public UserCriteria getCreator() { + return creator; + } + + public void setCreator(UserCriteria creator) { + this.creator = creator; + } + + protected List buildFields(String path) { + Set fields = new LinkedHashSet<>(); + path = path != null && !path.isEmpty() ? path + "." : ""; + if (this.id != null) fields.add(path + this.id.getAs()); + if (this.label != null) fields.add(path + this.label.getAs()); + if (!fields.contains(path + "id")) fields.add(path + "id"); + if (this.creator != null) fields.addAll(this.creator.buildFields(path + "creationUser")); + return new LinkedList<>(fields); + } + + public GrantQuery buildQuery(DatabaseRepository dao) { + List fields = this.buildFields(""); + GrantQuery query = new GrantQuery(dao.getGrantDao(), fields); + query.setId(this.id.getValue()); + if (this.creator != null) query.setUserQuery(this.creator.buildQuery(dao)); + return query; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/criteria/UserCriteria.java b/dmp-backend/web/src/main/java/eu/eudat/criteria/UserCriteria.java new file mode 100644 index 000000000..b111294d9 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/criteria/UserCriteria.java @@ -0,0 +1,66 @@ +package eu.eudat.criteria; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectReader; +import com.fasterxml.jackson.databind.node.JsonNodeType; +import eu.eudat.criteria.entities.Criteria; +import eu.eudat.logic.services.operations.DatabaseRepository; +import eu.eudat.query.UserQuery; + +import java.io.IOException; +import java.util.*; + +public class UserCriteria { + private Criteria id; + private Criteria email; + + public Criteria getId() { + return id; + } + + public void setId(JsonNode jsonNode) throws IOException { + if (jsonNode.getNodeType().equals(JsonNodeType.STRING)) { + Criteria criteria = new Criteria<>(); + criteria.setAs(jsonNode.asText()); + this.id = criteria; + } else if (jsonNode.getNodeType().equals(JsonNodeType.OBJECT)) { + ObjectReader reader = new ObjectMapper().readerFor(new TypeReference>() { + }); + this.id = reader.readValue(jsonNode); + } + } + + public Criteria getEmail() { + return email; + } + + public void setEmail(JsonNode jsonNode) throws IOException { + if (jsonNode.getNodeType().equals(JsonNodeType.STRING)) { + Criteria criteria = new Criteria<>(); + criteria.setAs(jsonNode.asText()); + this.email = criteria; + } else if (jsonNode.getNodeType().equals(JsonNodeType.OBJECT)) { + ObjectReader reader = new ObjectMapper().readerFor(new TypeReference>() { + }); + this.email = reader.readValue(jsonNode); + } + } + + protected List buildFields(String path) { + Set fields = new LinkedHashSet<>(); + path = path != null && !path.isEmpty() ? path + "." : ""; + if (this.id != null) fields.add(path + this.id.getAs()); + if (this.email != null) fields.add(path + this.email.getAs()); + if (!fields.contains(path + "id")) fields.add(path + "id"); + return new LinkedList<>(fields); + } + + public UserQuery buildQuery(DatabaseRepository dao) { + List fields = this.buildFields(""); + UserQuery query = new UserQuery(dao.getUserInfoDao(), fields); + if (this.id != null) query.setId(this.id.getValue()); + return query; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/criteria/entities/Criteria.java b/dmp-backend/web/src/main/java/eu/eudat/criteria/entities/Criteria.java new file mode 100644 index 000000000..d855e4c61 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/criteria/entities/Criteria.java @@ -0,0 +1,36 @@ +package eu.eudat.criteria.entities; + +enum BaseCriteriaType implements CriteriaType { + EQUALS, + NOT_EQUALS +} + +public class Criteria { + private String as; + private BaseCriteriaType type; + private T value; + + public String getAs() { + return as; + } + + public void setAs(String as) { + this.as = as; + } + + public CriteriaType getType() { + return type; + } + + public void setType(BaseCriteriaType type) { + this.type = type; + } + + public T getValue() { + return value; + } + + public void setValue(T value) { + this.value = value; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/criteria/entities/CriteriaType.java b/dmp-backend/web/src/main/java/eu/eudat/criteria/entities/CriteriaType.java new file mode 100644 index 000000000..734cb4a94 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/criteria/entities/CriteriaType.java @@ -0,0 +1,4 @@ +package eu.eudat.criteria.entities; + +public interface CriteriaType { +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/criteria/entities/DateCriteria.java b/dmp-backend/web/src/main/java/eu/eudat/criteria/entities/DateCriteria.java new file mode 100644 index 000000000..52a78f780 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/criteria/entities/DateCriteria.java @@ -0,0 +1,32 @@ +package eu.eudat.criteria.entities; + +import java.util.Date; + +enum DateCriteriaType implements CriteriaType { + EQUALS, + NOT_EQUALS, + BEFORE, + BETWEEN, + AFTER +} + +public class DateCriteria extends Criteria { + private Date values; + private CriteriaType type; + + public Date getValues() { + return values; + } + + public void setValues(Date values) { + this.values = values; + } + + public CriteriaType getType() { + return type; + } + + public void setType(DateCriteriaType type) { + this.type = type; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/criteria/serialzier/CriteriaSerializer.java b/dmp-backend/web/src/main/java/eu/eudat/criteria/serialzier/CriteriaSerializer.java new file mode 100644 index 000000000..b6614d81c --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/criteria/serialzier/CriteriaSerializer.java @@ -0,0 +1,41 @@ +package eu.eudat.criteria.serialzier; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.ObjectCodec; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.databind.deser.ContextualDeserializer; +import com.fasterxml.jackson.databind.node.JsonNodeType; +import eu.eudat.criteria.entities.Criteria; + +import java.io.IOException; + +public class CriteriaSerializer extends JsonDeserializer> implements ContextualDeserializer { + + private JavaType valueType; + + @Override + public JsonDeserializer createContextual(DeserializationContext ctxt, BeanProperty property) { + JavaType wrapperType = property.getType(); + JavaType valueType = wrapperType.containedType(0); + CriteriaSerializer deserializer = new CriteriaSerializer(); + deserializer.valueType = valueType; + return deserializer; + } + + @Override + public Criteria deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException { + ObjectCodec oc = jp.getCodec(); + JsonNode jsonNode = oc.readTree(jp); + if (jsonNode.getNodeType().equals(JsonNodeType.STRING)) { + Criteria criteria = new Criteria<>(); + criteria.setAs(jsonNode.asText()); + return criteria; + } else if (jsonNode.getNodeType().equals(JsonNodeType.OBJECT)) { + ObjectReader reader = new ObjectMapper().readerFor(new TypeReference>() { + }); + return reader.readValue(jsonNode); + } + return null; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/exceptions/datamanagementplan/DMPNewVersionException.java b/dmp-backend/web/src/main/java/eu/eudat/exceptions/datamanagementplan/DMPNewVersionException.java new file mode 100644 index 000000000..8c789c41d --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/exceptions/datamanagementplan/DMPNewVersionException.java @@ -0,0 +1,8 @@ +package eu.eudat.exceptions.datamanagementplan; + +public class DMPNewVersionException extends RuntimeException { + + public DMPNewVersionException(String message) { + super(message); + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/exceptions/datamanagementplan/DMPWithDatasetsDeleteException.java b/dmp-backend/web/src/main/java/eu/eudat/exceptions/datamanagementplan/DMPWithDatasetsDeleteException.java new file mode 100644 index 000000000..4bf9c7dde --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/exceptions/datamanagementplan/DMPWithDatasetsDeleteException.java @@ -0,0 +1,22 @@ +package eu.eudat.exceptions.datamanagementplan; + +/** + * Created by ikalyvas on 2/5/2018. + */ +public class DMPWithDatasetsDeleteException extends RuntimeException { + public DMPWithDatasetsDeleteException() { + super(); + } + + public DMPWithDatasetsDeleteException(String message, Throwable cause) { + super(message, cause); + } + + public DMPWithDatasetsDeleteException(String message) { + super(message); + } + + public DMPWithDatasetsDeleteException(Throwable cause) { + super(cause); + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/exceptions/datamanagementplan/DMPWithDatasetsException.java b/dmp-backend/web/src/main/java/eu/eudat/exceptions/datamanagementplan/DMPWithDatasetsException.java deleted file mode 100644 index 3fec6c3da..000000000 --- a/dmp-backend/web/src/main/java/eu/eudat/exceptions/datamanagementplan/DMPWithDatasetsException.java +++ /dev/null @@ -1,22 +0,0 @@ -package eu.eudat.exceptions.datamanagementplan; - -/** - * Created by ikalyvas on 2/5/2018. - */ -public class DMPWithDatasetsException extends RuntimeException { - public DMPWithDatasetsException() { - super(); - } - - public DMPWithDatasetsException(String message, Throwable cause) { - super(message, cause); - } - - public DMPWithDatasetsException(String message) { - super(message); - } - - public DMPWithDatasetsException(Throwable cause) { - super(cause); - } -} diff --git a/dmp-backend/web/src/main/java/eu/eudat/exceptions/datasetprofile/DatasetProfileNewVersionException.java b/dmp-backend/web/src/main/java/eu/eudat/exceptions/datasetprofile/DatasetProfileNewVersionException.java new file mode 100644 index 000000000..d55f1a73b --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/exceptions/datasetprofile/DatasetProfileNewVersionException.java @@ -0,0 +1,9 @@ +package eu.eudat.exceptions.datasetprofile; + +public class DatasetProfileNewVersionException extends RuntimeException { + + public DatasetProfileNewVersionException(String message) { + super(message); + } + +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/exceptions/datasetprofile/DatasetProfileWithDatasetsExeption.java b/dmp-backend/web/src/main/java/eu/eudat/exceptions/datasetprofile/DatasetProfileWithDatasetsExeption.java new file mode 100644 index 000000000..1d5654017 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/exceptions/datasetprofile/DatasetProfileWithDatasetsExeption.java @@ -0,0 +1,19 @@ +package eu.eudat.exceptions.datasetprofile; + +public class DatasetProfileWithDatasetsExeption extends RuntimeException { + + public DatasetProfileWithDatasetsExeption() { + } + + public DatasetProfileWithDatasetsExeption(String message) { + super(message); + } + + public DatasetProfileWithDatasetsExeption(String message, Throwable cause) { + super(message, cause); + } + + public DatasetProfileWithDatasetsExeption(Throwable cause) { + super(cause); + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/exceptions/datasetwizard/DatasetWizardCannotUnlockException.java b/dmp-backend/web/src/main/java/eu/eudat/exceptions/datasetwizard/DatasetWizardCannotUnlockException.java new file mode 100644 index 000000000..83434eb27 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/exceptions/datasetwizard/DatasetWizardCannotUnlockException.java @@ -0,0 +1,22 @@ +package eu.eudat.exceptions.datasetwizard; + +/** + * Created by ikalyvas on 10/12/2018. + */ +public class DatasetWizardCannotUnlockException extends RuntimeException { + public DatasetWizardCannotUnlockException() { + super(); + } + + public DatasetWizardCannotUnlockException(String message, Throwable cause) { + super(message, cause); + } + + public DatasetWizardCannotUnlockException(String message) { + super(message); + } + + public DatasetWizardCannotUnlockException(Throwable cause) { + super(cause); + } +} \ No newline at end of file diff --git a/dmp-backend/web/src/main/java/eu/eudat/exceptions/emailconfirmation/HasConfirmedEmailException.java b/dmp-backend/web/src/main/java/eu/eudat/exceptions/emailconfirmation/HasConfirmedEmailException.java new file mode 100644 index 000000000..048460073 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/exceptions/emailconfirmation/HasConfirmedEmailException.java @@ -0,0 +1,8 @@ +package eu.eudat.exceptions.emailconfirmation; + +public class HasConfirmedEmailException extends Exception { + + public HasConfirmedEmailException(String msg) { + super(msg); + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/exceptions/emailconfirmation/TokenExpiredException.java b/dmp-backend/web/src/main/java/eu/eudat/exceptions/emailconfirmation/TokenExpiredException.java new file mode 100644 index 000000000..8a31b183c --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/exceptions/emailconfirmation/TokenExpiredException.java @@ -0,0 +1,8 @@ +package eu.eudat.exceptions.emailconfirmation; + +public class TokenExpiredException extends Exception { + + public TokenExpiredException(String msg) { + super(msg); + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/exceptions/grant/GrantWithDMPsDeleteException.java b/dmp-backend/web/src/main/java/eu/eudat/exceptions/grant/GrantWithDMPsDeleteException.java new file mode 100644 index 000000000..dc6fa8894 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/exceptions/grant/GrantWithDMPsDeleteException.java @@ -0,0 +1,22 @@ +package eu.eudat.exceptions.grant; + +/** + * Created by ikalyvas on 11/30/2018. + */ +public class GrantWithDMPsDeleteException extends RuntimeException { + public GrantWithDMPsDeleteException() { + super(); + } + + public GrantWithDMPsDeleteException(String message, Throwable cause) { + super(message, cause); + } + + public GrantWithDMPsDeleteException(String message) { + super(message); + } + + public GrantWithDMPsDeleteException(Throwable cause) { + super(cause); + } +} \ No newline at end of file diff --git a/dmp-backend/web/src/main/java/eu/eudat/exceptions/security/NullEmailException.java b/dmp-backend/web/src/main/java/eu/eudat/exceptions/security/NullEmailException.java new file mode 100644 index 000000000..2663898ae --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/exceptions/security/NullEmailException.java @@ -0,0 +1,8 @@ +package eu.eudat.exceptions.security; + +public class NullEmailException extends RuntimeException { + + public NullEmailException() { + super(); + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/builders/BuilderFactoryImpl.java b/dmp-backend/web/src/main/java/eu/eudat/logic/builders/BuilderFactoryImpl.java index 59327ceae..4bdaba8f3 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/builders/BuilderFactoryImpl.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/builders/BuilderFactoryImpl.java @@ -19,7 +19,9 @@ public class BuilderFactoryImpl implements BuilderFactory { if (tClass.equals(DatasetProfileBuilder.class)) return (T) new DatasetProfileBuilder(); if (tClass.equals(DataTableDataBuilder.class)) return (T) new DataTableDataBuilder<>(); if (tClass.equals(PrincipalBuilder.class)) return (T) new PrincipalBuilder(); + if (tClass.equals(GrantBuilder.class)) return (T) new GrantBuilder(); if (tClass.equals(ProjectBuilder.class)) return (T) new ProjectBuilder(); + if (tClass.equals(FunderBuilder.class)) return (T) new FunderBuilder(); if (tClass.equals(RegistryCriteriaBuilder.class)) return (T) new RegistryCriteriaBuilder(); if (tClass.equals(UserInfoBuilder.class)) return (T) new UserInfoBuilder(); if (tClass.equals(UserRoleBuilder.class)) return (T) new UserRoleBuilder(); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/builders/model/models/FunderBuilder.java b/dmp-backend/web/src/main/java/eu/eudat/logic/builders/model/models/FunderBuilder.java new file mode 100644 index 000000000..0bbcc235f --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/builders/model/models/FunderBuilder.java @@ -0,0 +1,80 @@ +package eu.eudat.logic.builders.model.models; + +import eu.eudat.logic.builders.Builder; +import eu.eudat.models.data.funder.Funder; + +import java.util.Date; +import java.util.UUID; + +public class FunderBuilder extends Builder { + + private UUID id; + private String label; + private String reference; + private String definition; + private eu.eudat.data.entities.Funder.Status status; + private Date created; + private Date modified; + private Integer type; + private String source; + + public FunderBuilder id(UUID id) { + this.id = id; + return this; + } + + public FunderBuilder label(String label) { + this.label = label; + return this; + } + + public FunderBuilder reference(String reference) { + this.reference = reference; + return this; + } + + public FunderBuilder definition(String definition) { + this.definition = definition; + return this; + } + + public FunderBuilder status(eu.eudat.data.entities.Funder.Status status) { + this.status = status; + return this; + } + + public FunderBuilder created(Date created) { + this.created = created; + return this; + } + + public FunderBuilder modified(Date modified) { + this.modified = modified; + return this; + } + + public FunderBuilder type(int type) { + this.type = type; + return this; + } + + public FunderBuilder source(String source) { + this.source = source; + return this; + } + + @Override + public Funder build() { + Funder funder = new Funder(); + funder.setId(id); + funder.setLabel(label); + funder.setReference(reference); + funder.setDefinition(definition); + if (status != null) funder.setStatus(status.getValue()); + funder.setCreated(created); + funder.setModified(modified); + funder.setType(type); + funder.setSource(source); + return funder; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/builders/model/models/GrantBuilder.java b/dmp-backend/web/src/main/java/eu/eudat/logic/builders/model/models/GrantBuilder.java new file mode 100644 index 000000000..12f87f4d9 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/builders/model/models/GrantBuilder.java @@ -0,0 +1,142 @@ +package eu.eudat.logic.builders.model.models; + +import eu.eudat.logic.builders.Builder; +import eu.eudat.data.entities.UserInfo; +import eu.eudat.models.data.dmp.DataManagementPlan; +import eu.eudat.models.data.grant.Grant; + +import java.util.Date; +import java.util.List; +import java.util.UUID; + +/** + * Created by ikalyvas on 2/15/2018. + */ +public class GrantBuilder extends Builder { + + private UUID id; + + private List dmps; + + private String label; + + private String abbreviation; + + private String reference; + + private String uri; + + private String definition; + + private Date startDate; + + private Date endDate; + + private eu.eudat.data.entities.Grant.Status status; + + private UserInfo creationUser; + + private Date created; + + private Date modified; + + private String description; + + private String source; + + public GrantBuilder id(UUID id) { + this.id = id; + return this; + } + + public GrantBuilder dmps(List dmps) { + this.dmps = dmps; + return this; + } + + public GrantBuilder label(String label) { + this.label = label; + return this; + } + + public GrantBuilder abbreviation(String abbreviation) { + this.abbreviation = abbreviation; + return this; + } + + public GrantBuilder reference(String reference) { + this.reference = reference; + return this; + } + + public GrantBuilder uri(String uri) { + this.uri = uri; + return this; + } + + public GrantBuilder definition(String definition) { + this.definition = definition; + return this; + } + + public GrantBuilder startDate(Date startDate) { + this.startDate = startDate; + return this; + } + + public GrantBuilder endDate(Date endDate) { + this.endDate = endDate; + return this; + } + + public GrantBuilder status(eu.eudat.data.entities.Grant.Status status) { + this.status = status; + return this; + } + + public GrantBuilder creationUser(UserInfo creationUser) { + this.creationUser = creationUser; + return this; + } + + public GrantBuilder created(Date created) { + this.created = created; + return this; + } + + public GrantBuilder modified(Date modified) { + this.modified = modified; + return this; + } + + public GrantBuilder description(String description) { + this.description = description; + return this; + } + + public GrantBuilder source(String source) { + this.source = source; + return this; + } + + @Override + public Grant build() { + Grant grant = new Grant(); + grant.setStatus(status.getValue()); + grant.setAbbreviation(abbreviation); + grant.setCreated(created); + grant.setCreationUser(creationUser); + grant.setDefinition(definition); + grant.setDescription(description); + grant.setDmps(dmps); + grant.setEndDate(endDate); + grant.setId(id); + grant.setLabel(label); + grant.setModified(modified); + grant.setReference(reference); + grant.setCreationUser(creationUser); + grant.setStartDate(startDate); + grant.setSource(source); + return grant; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/builders/model/models/PrincipalBuilder.java b/dmp-backend/web/src/main/java/eu/eudat/logic/builders/model/models/PrincipalBuilder.java index 12bc35b6b..133d5e179 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/builders/model/models/PrincipalBuilder.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/builders/model/models/PrincipalBuilder.java @@ -19,6 +19,9 @@ public class PrincipalBuilder extends Builder { private Date expiresAt; private String avatarUrl; private Set authorities; + private String culture; + private String language; + private String timezone; public PrincipalBuilder id(UUID id) { this.id = id; @@ -50,6 +53,21 @@ public class PrincipalBuilder extends Builder { return this; } + public PrincipalBuilder culture(String culture) { + this.culture = culture; + return this; + } + + public PrincipalBuilder language(String language) { + this.language = language; + return this; + } + + public PrincipalBuilder timezone(String timezone) { + this.timezone = timezone; + return this; + } + @Override public Principal build() { Principal principal = new Principal(); @@ -59,6 +77,9 @@ public class PrincipalBuilder extends Builder { principal.setToken(token); principal.setId(id); principal.setAvatarUrl(avatarUrl); + principal.setCulture(culture); + principal.setLanguage(language); + principal.setTimezone(timezone); return principal; } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/builders/model/models/ProjectBuilder.java b/dmp-backend/web/src/main/java/eu/eudat/logic/builders/model/models/ProjectBuilder.java index 4f429cc55..d0741d631 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/builders/model/models/ProjectBuilder.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/builders/model/models/ProjectBuilder.java @@ -1,7 +1,8 @@ package eu.eudat.logic.builders.model.models; -import eu.eudat.logic.builders.Builder; + import eu.eudat.data.entities.UserInfo; +import eu.eudat.logic.builders.Builder; import eu.eudat.models.data.dmp.DataManagementPlan; import eu.eudat.models.data.project.Project; @@ -9,126 +10,123 @@ import java.util.Date; import java.util.List; import java.util.UUID; -/** - * Created by ikalyvas on 2/15/2018. - */ public class ProjectBuilder extends Builder { - private UUID id; + private UUID id; + private List dmps; + private String label; + private int type; + private String abbreviation; + private String reference; + private String uri; + private String definition; + private Date startDate; + private Date endDate; + private eu.eudat.data.entities.Project.Status status; + private UserInfo creationUser; + private Date created; + private Date modified; + private String description; + private String source; - private List dmps; + public ProjectBuilder id(UUID id) { + this.id = id; + return this; + } - private String label; + public ProjectBuilder dmps(List dmps) { + this.dmps = dmps; + return this; + } - private String abbreviation; + public ProjectBuilder label(String label) { + this.label = label; + return this; + } - private String reference; + public ProjectBuilder type(int type) { + this.type = type; + return this; + } - private String uri; + public ProjectBuilder abbreviation(String abbreviation) { + this.abbreviation = abbreviation; + return this; + } - private String definition; + public ProjectBuilder reference(String reference) { + this.reference = reference; + return this; + } - private Date startDate; + public ProjectBuilder uri(String uri) { + this.uri = uri; + return this; + } - private Date endDate; + public ProjectBuilder definition(String definition) { + this.definition = definition; + return this; + } - private eu.eudat.data.entities.Project.Status status; + public ProjectBuilder startDate(Date startDate) { + this.startDate = startDate; + return this; + } - private UserInfo creationUser; + public ProjectBuilder endDate(Date endDate) { + this.endDate = endDate; + return this; + } - private Date created; + public ProjectBuilder status(eu.eudat.data.entities.Project.Status status) { + this.status = status; + return this; + } - private Date modified; + public ProjectBuilder creationUser(UserInfo creationUser) { + this.creationUser = creationUser; + return this; + } - private String description; + public ProjectBuilder created(Date created) { + this.created = created; + return this; + } - public ProjectBuilder id(UUID id) { - this.id = id; - return this; - } + public ProjectBuilder modified(Date modified) { + this.modified = modified; + return this; + } - public ProjectBuilder dmps(List dmps) { - this.dmps = dmps; - return this; - } + public ProjectBuilder description(String description) { + this.description = description; + return this; + } - public ProjectBuilder label(String label) { - this.label = label; - return this; - } + public ProjectBuilder source(String source) { + this.source = source; + return this; + } - public ProjectBuilder abbreviation(String abbreviation) { - this.abbreviation = abbreviation; - return this; - } - - public ProjectBuilder reference(String reference) { - this.reference = reference; - return this; - } - - public ProjectBuilder uri(String uri) { - this.uri = uri; - return this; - } - - public ProjectBuilder definition(String definition) { - this.definition = definition; - return this; - } - - public ProjectBuilder startDate(Date startDate) { - this.startDate = startDate; - return this; - } - - public ProjectBuilder endDate(Date endDate) { - this.endDate = endDate; - return this; - } - - public ProjectBuilder status(eu.eudat.data.entities.Project.Status status) { - this.status = status; - return this; - } - - public ProjectBuilder creationUser(UserInfo creationUser) { - this.creationUser = creationUser; - return this; - } - - public ProjectBuilder created(Date created) { - this.created = created; - return this; - } - - public ProjectBuilder modified(Date modified) { - this.modified = modified; - return this; - } - - public ProjectBuilder description(String description) { - this.description = description; - return this; - } - - @Override - public Project build() { - Project project = new Project(); - project.setStatus(status.getValue()); - project.setAbbreviation(abbreviation); - project.setCreated(created); - project.setCreationUser(creationUser); - project.setDefinition(definition); - project.setDescription(description); - project.setDmps(dmps); - project.setEndDate(endDate); - project.setId(id); - project.setLabel(label); - project.setModified(modified); - project.setReference(reference); - project.setCreationUser(creationUser); - project.setStartDate(startDate); - return project; - } + @Override + public Project build() { + Project project = new Project(); + project.setStatus(status.getValue()); + project.setAbbreviation(abbreviation); + project.setCreated(created); + project.setCreationUser(creationUser); + project.setDefinition(definition); + project.setDescription(description); + project.setDmps(dmps); + project.setEndDate(endDate); + project.setId(id); + project.setLabel(label); + project.setModified(modified); + project.setReference(reference); + project.setCreationUser(creationUser); + project.setStartDate(startDate); + project.setSource(source); + return project; + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/builders/model/models/ResearcherBuilder.java b/dmp-backend/web/src/main/java/eu/eudat/logic/builders/model/models/ResearcherBuilder.java index b5d924331..ba001431d 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/builders/model/models/ResearcherBuilder.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/builders/model/models/ResearcherBuilder.java @@ -11,6 +11,7 @@ public class ResearcherBuilder extends Builder { private String name; private String id; private int status; + private String tag; public String getLabel() { return label; @@ -48,6 +49,15 @@ public class ResearcherBuilder extends Builder { return this; } + public String getTag() { + return tag; + } + + public ResearcherBuilder tag(String tag) { + this.tag = tag; + return this; + } + @Override public Researcher build() { Researcher researcher = new Researcher(); @@ -55,6 +65,7 @@ public class ResearcherBuilder extends Builder { researcher.setLabel(label); researcher.setName(name); researcher.setStatus(status); + researcher.setTag(tag); return researcher; } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/handlers/PrincipalArgumentResolver.java b/dmp-backend/web/src/main/java/eu/eudat/logic/handlers/PrincipalArgumentResolver.java index 22b7f1c8d..7e304042f 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/handlers/PrincipalArgumentResolver.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/handlers/PrincipalArgumentResolver.java @@ -1,54 +1,70 @@ package eu.eudat.logic.handlers; import eu.eudat.exceptions.security.UnauthorisedException; -import eu.eudat.models.data.security.Principal; import eu.eudat.logic.security.claims.ClaimedAuthorities; -import eu.eudat.logic.services.operations.AuthenticationService; +import eu.eudat.logic.services.operations.authentication.AuthenticationService; +import eu.eudat.models.data.security.Principal; import eu.eudat.types.Authorities; +import org.apache.catalina.connector.RequestFacade; +import org.apache.tomcat.util.buf.MessageBytes; import org.springframework.core.MethodParameter; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.context.request.ServletWebRequest; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.ModelAndViewContainer; import java.lang.annotation.Annotation; -import java.util.Arrays; -import java.util.List; -import java.util.Optional; -import java.util.UUID; +import java.util.*; public final class PrincipalArgumentResolver implements HandlerMethodArgumentResolver { - private AuthenticationService authenticationService; + private AuthenticationService verifiedUserAuthenticationService; + private AuthenticationService nonVerifiedUserAuthenticationService; - @Override - public boolean supportsParameter(MethodParameter methodParameter) { - return methodParameter.getParameterType().equals(Principal.class); - } + public PrincipalArgumentResolver(AuthenticationService verifiedUserAuthenticationService, AuthenticationService nonVerifiedUserAuthenticationService) { + this.verifiedUserAuthenticationService = verifiedUserAuthenticationService; + this.nonVerifiedUserAuthenticationService = nonVerifiedUserAuthenticationService; + } - @Override - public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception { - String token = nativeWebRequest.getHeader("AuthToken"); - Optional claimsAnnotation = Arrays.stream(methodParameter.getParameterAnnotations()).filter(annotation -> annotation.annotationType().equals(ClaimedAuthorities.class)).findAny(); - List claimList = claimsAnnotation.map(annotation -> Arrays.asList(((ClaimedAuthorities) annotation).claims())).orElse(Authorities.all()); - if (token == null) throw new UnauthorisedException("Authentication Information Is Missing"); - UUID authToken; - try { - authToken = UUID.fromString(token); - } catch (IllegalArgumentException ex) { - throw new UnauthorisedException("Authentication Information Is Missing"); - } + @Override + public boolean supportsParameter(MethodParameter methodParameter) { + return methodParameter.getParameterType().equals(Principal.class); + } - Principal principal = this.authenticationService.Touch(authToken); - if (principal == null) throw new UnauthorisedException("Authentication Information Missing"); - if (!principal.isAuthorized(claimList)) - throw new UnauthorisedException("You are not Authorized For this Action"); - return principal; - } + @Override + public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception { + String token = nativeWebRequest.getHeader("AuthToken"); - public PrincipalArgumentResolver(AuthenticationService authenticationService) { - this.authenticationService = authenticationService; - } + Boolean checkMailNull = ((ServletWebRequest) nativeWebRequest).getRequest().getRequestURI().startsWith("/api/emailConfirmation"); + AuthenticationService authenticationService = checkMailNull ? this.nonVerifiedUserAuthenticationService : this.verifiedUserAuthenticationService; + Optional claimsAnnotation = Arrays.stream(methodParameter.getParameterAnnotations()).filter(annotation -> annotation.annotationType().equals(ClaimedAuthorities.class)).findAny(); + List claimList = claimsAnnotation.map(annotation -> Arrays.asList(((ClaimedAuthorities) annotation).claims())).orElse(Authorities.all()); + if (claimList.size() == 1 && claimList.get(0).equals(Authorities.ANONYMOUS)) + return new Principal(); + if (token == null) throw new UnauthorisedException("Authentication Information Is Missing"); + UUID authToken; + try { + authToken = UUID.fromString(token); + } catch (IllegalArgumentException ex) { + throw new UnauthorisedException("Authentication Information Is Missing"); + } + Principal principal = authenticationService.Touch(authToken); + if (principal == null) throw new UnauthorisedException("Authentication Information Missing"); + if (!claimList.contains(Authorities.ANONYMOUS) && !principal.isAuthorized(claimList)) + throw new UnauthorisedException("You are not Authorized For this Action"); + + return principal; + } + + private Date addADay(Date date) { + Date dt = new Date(); + Calendar c = Calendar.getInstance(); + c.setTime(dt); + c.add(Calendar.DATE, 1); + dt = c.getTime(); + return dt; + } } \ No newline at end of file diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/AdminManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/AdminManager.java index 801dd9a96..adff4a1fd 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/AdminManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/AdminManager.java @@ -1,5 +1,8 @@ package eu.eudat.logic.managers; +import eu.eudat.data.dao.entities.DatasetDao; +import eu.eudat.data.dao.entities.DatasetProfileDao; +import eu.eudat.exceptions.datasetprofile.DatasetProfileWithDatasetsExeption; import eu.eudat.logic.builders.entity.DatasetProfileBuilder; import eu.eudat.models.data.entities.xmlmodels.datasetprofiledefinition.ViewStyleModel; import eu.eudat.models.data.admin.composite.DatasetProfile; @@ -10,6 +13,7 @@ import org.w3c.dom.Document; import org.w3c.dom.Element; import java.util.Date; +import java.util.UUID; public class AdminManager { @@ -23,7 +27,7 @@ public class AdminManager { String xml = XmlBuilder.generateXml(viewStyleDoc); eu.eudat.data.entities.DatasetProfile datasetProfile = apiContext.getOperationsContext().getBuilderFactory().getBuilder(DatasetProfileBuilder.class).definition(xml).label(profile.getLabel()) - .status((short) 1).created(new Date()) + .status(profile.getStatus()).created(new Date()).description(profile.getDescription()) .build(); return datasetProfile; @@ -38,4 +42,18 @@ public class AdminManager { datasetprofile.buildProfile(viewstyle); return datasetprofile; } -} + + + public static eu.eudat.data.entities.DatasetProfile inactivate(DatasetProfileDao datasetProfileRepository, DatasetDao datasetDao, String id) { + eu.eudat.data.dao.criteria.DatasetCriteria datasetsForThatDatasetProfile = new eu.eudat.data.dao.criteria.DatasetCriteria(); + datasetsForThatDatasetProfile.setProfileDatasetId(UUID.fromString(id)); + if (datasetDao.getWithCriteria(datasetsForThatDatasetProfile).count() == 0) { + eu.eudat.data.entities.DatasetProfile detasetProfile = datasetProfileRepository.find(UUID.fromString(id)); + detasetProfile.setStatus(eu.eudat.data.entities.DatasetProfile.Status.DELETED.getValue()); + detasetProfile = datasetProfileRepository.createOrUpdate(detasetProfile); + return detasetProfile; + } else { + throw new DatasetProfileWithDatasetsExeption("This profile can not deleted, because Datasets are associated with it"); + } + } +} \ No newline at end of file diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/CommonsManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/CommonsManager.java index 19284f53e..94df54e41 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/CommonsManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/CommonsManager.java @@ -20,6 +20,8 @@ public class CommonsManager { .map(item-> new ExternalSourcesConfiguration.ExternalSourcesUrlModel(item.getKey(),item.getLabel())).collect(Collectors.toList())); externalSourcesConfiguration.setServices(configLoader.getExternalUrls().getServices().getUrls().stream() .map(item-> new ExternalSourcesConfiguration.ExternalSourcesUrlModel(item.getKey(),item.getLabel())).collect(Collectors.toList())); + externalSourcesConfiguration.setTags(configLoader.getExternalUrls().getTags().getUrls().stream() + .map(item-> new ExternalSourcesConfiguration.ExternalSourcesUrlModel(item.getKey(),item.getLabel())).collect(Collectors.toList())); return externalSourcesConfiguration; } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ContactEmailManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ContactEmailManager.java new file mode 100644 index 000000000..6303bf43a --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ContactEmailManager.java @@ -0,0 +1,46 @@ +package eu.eudat.logic.managers; + +import eu.eudat.data.entities.UserInfo; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.models.data.ContactEmail.ContactEmailModel; +import eu.eudat.models.data.mail.SimpleMail; +import eu.eudat.models.data.security.Principal; +import org.springframework.core.env.Environment; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.mail.MessagingException; + +@Component +public class ContactEmailManager { + + private ApiContext apiContext; + private Environment environment; + + @Autowired + public ContactEmailManager(ApiContext apiContext, Environment environment) { + this.apiContext = apiContext; + this.environment = environment; + } + + public void sendContactEmail(ContactEmailModel contactEmailModel, Principal principal) throws MessagingException { + UserInfo user = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(principal.getId()); + SimpleMail mail = new SimpleMail(); + String enrichedMail = contactEmailModel.getDescription() + "\n\n" + "Send by user: " + user.getEmail() ; + mail.setSubject(contactEmailModel.getSubject()); + mail.setTo(environment.getProperty("contact_email.mail")); + mail.setContent(enrichedMail); + mail.setFrom(user.getEmail()); + + apiContext.getUtilitiesService().getMailService().sendSimpleMail(mail); + } + + public void emailValidation(ContactEmailModel contactEmailModel) throws Exception { + if (contactEmailModel.getSubject() == null || contactEmailModel.getSubject().trim().isEmpty()) { + throw new Exception("Subject is empty"); + } + if (contactEmailModel.getDescription() == null || contactEmailModel.getDescription().trim().isEmpty()) { + throw new Exception("Description is empty"); + } + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java index 46432fbff..c1f7ac711 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java @@ -1,90 +1,164 @@ package eu.eudat.logic.managers; -import eu.eudat.logic.builders.model.models.RecentActivityDataBuilder; -import eu.eudat.data.dao.entities.DMPDao; -import eu.eudat.data.dao.entities.DatasetDao; -import eu.eudat.data.dao.entities.ProjectDao; -import eu.eudat.data.entities.UserInfo; import eu.eudat.data.dao.criteria.DataManagementPlanCriteria; import eu.eudat.data.dao.criteria.DatasetCriteria; +import eu.eudat.data.dao.criteria.OrganisationCriteria; +import eu.eudat.data.dao.criteria.GrantCriteria; +import eu.eudat.data.dao.entities.DMPDao; +import eu.eudat.data.dao.entities.DatasetDao; +import eu.eudat.data.dao.entities.OrganisationDao; +import eu.eudat.data.dao.entities.GrantDao; +import eu.eudat.data.entities.UserInfo; +import eu.eudat.logic.builders.model.models.RecentActivityDataBuilder; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.logic.services.operations.DatabaseRepository; import eu.eudat.models.data.dashboard.recent.RecentActivity; import eu.eudat.models.data.dashboard.recent.RecentActivityData; +import eu.eudat.models.data.dashboard.searchbar.SearchBarItem; import eu.eudat.models.data.dashboard.statistics.DashBoardStatistics; import eu.eudat.models.data.security.Principal; -import eu.eudat.logic.services.ApiContext; +import eu.eudat.types.searchbar.SearchBarItemType; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import java.util.LinkedList; import java.util.List; import java.util.concurrent.CompletableFuture; +@Component public class DashBoardManager { - public DashBoardStatistics getStatistics(DatasetDao datasetRepository, DMPDao dataManagementPlanRepository, ProjectDao projectRepository) { + private ApiContext apiContext; + private DatabaseRepository databaseRepository; + + @Autowired + public DashBoardManager(ApiContext apiContext) { + this.apiContext = apiContext; + this.databaseRepository = apiContext.getOperationsContext().getDatabaseRepository(); + } + + public DashBoardStatistics getStatistics() { DashBoardStatistics statistics = new DashBoardStatistics(); + DatasetCriteria datasetCriteria = new DatasetCriteria(); - datasetCriteria.setAllVersions(false); DataManagementPlanCriteria dataManagementPlanCriteria = new DataManagementPlanCriteria(); + OrganisationCriteria organisationCriteria = new OrganisationCriteria(); + datasetCriteria.setAllVersions(false); dataManagementPlanCriteria.setAllVersions(false); + organisationCriteria.setPublic(false); - CompletableFuture dmpFuture = dataManagementPlanRepository.getWithCriteria(dataManagementPlanCriteria).countAsync() + CompletableFuture dmpFuture = databaseRepository.getDmpDao().getWithCriteria(dataManagementPlanCriteria).countAsync() .whenComplete((dmpsStats, throwable) -> statistics.setTotalDataManagementPlanCount(dmpsStats)); - CompletableFuture datasetFuture = datasetRepository.getWithCriteria(datasetCriteria).countAsync() + CompletableFuture datasetFuture = databaseRepository.getDatasetDao().getWithCriteria(datasetCriteria).countAsync() .whenComplete((datasetsStats, throwable) -> statistics.setTotalDataSetCount(datasetsStats)); - CompletableFuture projectFuture = projectRepository.asQueryable().countAsync() - .whenComplete((projectsStats, throwable) -> statistics.setTotalProjectCount(projectsStats)); + CompletableFuture grantFuture = databaseRepository.getGrantDao().asQueryable().countAsync() + .whenComplete((grantsStats, throwable) -> statistics.setTotalGrantCount(grantsStats)); + CompletableFuture organisationFuture = databaseRepository.getOrganisationDao().getWithCriteria(organisationCriteria).countAsync() + .whenComplete((organisationStats, throwable) -> statistics.setTotalOrganisationCount(organisationStats)); - CompletableFuture.allOf(dmpFuture, datasetFuture, projectFuture).join(); + CompletableFuture.allOf(dmpFuture, datasetFuture, grantFuture, organisationFuture).join(); return statistics; } - public DashBoardStatistics getMeStatistics(DatasetDao datasetRepository, DMPDao dataManagementPlanRepository, ProjectDao projectRepository, Principal principal) { + public DashBoardStatistics getMeStatistics(Principal principal) { DashBoardStatistics statistics = new DashBoardStatistics(); + DMPDao dataManagementPlanRepository = databaseRepository.getDmpDao(); + DatasetDao datasetRepository = databaseRepository.getDatasetDao(); + GrantDao grantRepository = databaseRepository.getGrantDao(); + OrganisationDao organisationRepository = databaseRepository.getOrganisationDao(); UserInfo user = new UserInfo(); user.setId(principal.getId()); DatasetCriteria datasetCriteria = new DatasetCriteria(); datasetCriteria.setAllVersions(false); DataManagementPlanCriteria dataManagementPlanCriteria = new DataManagementPlanCriteria(); dataManagementPlanCriteria.setAllVersions(false); - CompletableFuture dmpFuture = dataManagementPlanRepository.getAuthenticated(dataManagementPlanRepository.getWithCriteria(dataManagementPlanCriteria), user).countAsync() + GrantCriteria grantCriteria = new GrantCriteria(); + OrganisationCriteria organisationCriteria = new OrganisationCriteria(); + + CompletableFuture dmpFuture = dataManagementPlanRepository.getAuthenticated(dataManagementPlanRepository.getWithCriteria(dataManagementPlanCriteria), principal.getId()).countAsync() .whenComplete((dmpsStats, throwable) -> statistics.setTotalDataManagementPlanCount(dmpsStats)); CompletableFuture datasetFuture = datasetRepository.getAuthenticated(datasetRepository.getWithCriteria(datasetCriteria), user).countAsync() .whenComplete((datasetsStats, throwable) -> statistics.setTotalDataSetCount(datasetsStats)); - CompletableFuture projectFuture = projectRepository.getAuthenticated(projectRepository.asQueryable(), user).countAsync() - .whenComplete((projectsStats, throwable) -> statistics.setTotalProjectCount(projectsStats)); + CompletableFuture grantFuture = grantRepository.getAuthenticated(grantRepository.getWithCriteria(grantCriteria), user).countAsync() + .whenComplete((grantsStats, throwable) -> statistics.setTotalGrantCount(grantsStats)); + CompletableFuture orgnanisationFuture = organisationRepository.getAuthenticated(organisationRepository.asQueryable().withHint("organisationRecentActivity"), user).countAsync() + .whenComplete((organisationStats, throwable) -> statistics.setTotalOrganisationCount(organisationStats)); - CompletableFuture.allOf(dmpFuture, datasetFuture, projectFuture).join(); + CompletableFuture.allOf(dmpFuture, datasetFuture, grantFuture, orgnanisationFuture).join(); return statistics; } - public RecentActivity getRecentActivity(ApiContext apiContext, DatasetDao datasetRepository, DMPDao dataManagementPlanRepository, ProjectDao projectRepository, Principal principal, Integer numberofactivities) { + public RecentActivity getRecentActivity(Principal principal, Integer numberofactivities) { RecentActivity activity = new RecentActivity(); + DMPDao dataManagementPlanRepository = databaseRepository.getDmpDao(); + DatasetDao datasetRepository = databaseRepository.getDatasetDao(); + GrantDao grantRepository = databaseRepository.getGrantDao(); UserInfo user = new UserInfo(); user.setId(principal.getId()); - + DatasetCriteria datasetCriteria = new DatasetCriteria(); + datasetCriteria.setAllVersions(false); + DataManagementPlanCriteria dataManagementPlanCriteria = new DataManagementPlanCriteria(); + dataManagementPlanCriteria.setAllVersions(false); + GrantCriteria grantCriteria = new GrantCriteria(); RecentActivityDataBuilder recentActivityDataBuilder = apiContext.getOperationsContext().getBuilderFactory().getBuilder(RecentActivityDataBuilder.class); - CompletableFuture> dmps = dataManagementPlanRepository.getAuthenticated(dataManagementPlanRepository.asQueryable(), user) + CompletableFuture> dmps = dataManagementPlanRepository.getAuthenticated(dataManagementPlanRepository.getWithCriteria(dataManagementPlanCriteria), principal.getId()) .withHint("dmpRecentActivity") .orderBy((builder, root) -> builder.desc(root.get("modified"))) .take(numberofactivities) .selectAsync(item -> recentActivityDataBuilder.label(item.getLabel()).timestamp(item.getModified()).id(item.getId().toString()).build()) .whenComplete((dmpActivities, throwable) -> activity.setRecentDmpActivities(dmpActivities)); - CompletableFuture> datasets = datasetRepository.getAuthenticated(datasetRepository.asQueryable(), user) + CompletableFuture> datasets = datasetRepository.getAuthenticated(datasetRepository.getWithCriteria(datasetCriteria), user) .withHint("datasetRecentActivity") .orderBy((builder, root) -> builder.desc(root.get("modified"))) .take(numberofactivities) .selectAsync(item -> recentActivityDataBuilder.label(item.getLabel()).timestamp(item.getModified()).id(item.getId().toString()).build()) .whenComplete((datasetActivities, throwable) -> activity.setRecentDatasetActivities(datasetActivities)); - CompletableFuture> projects = projectRepository.getAuthenticated(projectRepository.asQueryable(), user) - .withHint("projectRecentActivity") + CompletableFuture> grants = grantRepository.getAuthenticated(grantRepository.getWithCriteria(grantCriteria), user) + .withHint("grantRecentActivity") .orderBy((builder, root) -> builder.desc(root.get("modified"))) .take(numberofactivities) .selectAsync(item -> recentActivityDataBuilder.label(item.getLabel()).timestamp(item.getModified()).id(item.getId().toString()).build()) - .whenComplete((projectActivities, throwable) -> activity.setRecentProjectActivities(projectActivities)); + .whenComplete((grantActivities, throwable) -> activity.setRecentGrantActivities(grantActivities)); - CompletableFuture.allOf(projects, dmps, datasets).join(); + CompletableFuture.allOf(grants, dmps, datasets).join(); return activity; } + public List searchUserData(String like, Principal principal) { + RecentActivity activity = new RecentActivity(); + UserInfo user = new UserInfo(); + user.setId(principal.getId()); + DMPDao dataManagementPlanRepository = databaseRepository.getDmpDao(); + DatasetDao datasetRepository = databaseRepository.getDatasetDao(); + GrantDao grantRepository = databaseRepository.getGrantDao(); + + List searchBarItems = new LinkedList<>(); + CompletableFuture> dmps = dataManagementPlanRepository.getAuthenticated(dataManagementPlanRepository.asQueryable(), principal.getId()) + .withHint("dmpRecentActivity") + .where((builder, root) -> builder.like(builder.upper(root.get("label")), "%" + like.toUpperCase() + "%")) + .orderBy((builder, root) -> builder.desc(root.get("modified"))) + .selectAsync(item -> new SearchBarItem(item.getId().toString(), item.getLabel(), SearchBarItemType.DMP.getValue())) + .whenComplete((dmpItems, throwable) -> searchBarItems.addAll(dmpItems)); + + CompletableFuture> datasets = datasetRepository.getAuthenticated(datasetRepository.asQueryable(), user) + .withHint("datasetRecentActivity") + .where((builder, root) -> builder.like(builder.upper(root.get("label")), "%" + like.toUpperCase() + "%")) + .orderBy((builder, root) -> builder.desc(root.get("modified"))) + .selectAsync(item -> new SearchBarItem(item.getId().toString(), item.getLabel(), SearchBarItemType.DATASET.getValue())) + .whenComplete((dataSetItems, throwable) -> searchBarItems.addAll(dataSetItems)); + + CompletableFuture> grants = grantRepository.getAuthenticated(grantRepository.asQueryable(), user) + .withHint("grantRecentActivity") + .where((builder, root) -> builder.like(builder.upper(root.get("label")), "%" + like.toUpperCase() + "%")) + .orderBy((builder, root) -> builder.desc(root.get("modified"))) + .selectAsync(item -> new SearchBarItem(item.getId().toString(), item.getLabel(), SearchBarItemType.GRANT.getValue())) + .whenComplete((grantItems, throwable) -> searchBarItems.addAll(grantItems)); + + CompletableFuture.allOf(grants, dmps, datasets).join(); + return searchBarItems; + } + } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index 8ca498a76..094169e14 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -1,52 +1,123 @@ package eu.eudat.logic.managers; -import eu.eudat.logic.builders.entity.UserInfoBuilder; -import eu.eudat.data.dao.criteria.DynamicFieldsCriteria; -import eu.eudat.data.dao.criteria.OrganisationCriteria; -import eu.eudat.data.dao.criteria.ProjectCriteria; -import eu.eudat.data.dao.criteria.ResearcherCriteria; +import com.fasterxml.jackson.databind.ObjectMapper; +import eu.eudat.configurations.dynamicgrant.DynamicGrantConfiguration; +import eu.eudat.configurations.dynamicgrant.entities.Property; +import eu.eudat.data.dao.criteria.*; import eu.eudat.data.dao.entities.*; +import eu.eudat.data.entities.Organisation; +import eu.eudat.data.entities.Researcher; import eu.eudat.data.entities.*; import eu.eudat.data.query.items.item.dmp.DataManagementPlanCriteriaRequest; +import eu.eudat.data.query.items.table.datasetprofile.DatasetProfileTableRequestItem; import eu.eudat.data.query.items.table.dmp.DataManagementPlanTableRequest; -import eu.eudat.configurations.dynamicproject.DynamicProjectConfiguration; -import eu.eudat.configurations.dynamicproject.entities.Property; -import eu.eudat.exceptions.datamanagementplan.DMPWithDatasetsException; +import eu.eudat.data.query.items.table.dmp.DataManagmentPlanPublicTableRequest; +import eu.eudat.exceptions.datamanagementplan.DMPNewVersionException; +import eu.eudat.exceptions.datamanagementplan.DMPWithDatasetsDeleteException; import eu.eudat.exceptions.security.UnauthorisedException; +import eu.eudat.logic.builders.entity.UserInfoBuilder; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.logic.services.forms.VisibilityRuleService; +import eu.eudat.logic.services.operations.DatabaseRepository; +import eu.eudat.logic.services.utilities.UtilitiesService; +import eu.eudat.logic.utilities.builders.XmlBuilder; +import eu.eudat.logic.utilities.documents.helpers.FileEnvelope; +import eu.eudat.logic.utilities.documents.types.ParagraphStyle; +import eu.eudat.logic.utilities.documents.word.WordBuilder; +import eu.eudat.logic.utilities.documents.xml.ExportXmlBuilder; import eu.eudat.models.HintedModelFactory; -import eu.eudat.models.data.dmp.DataManagementPlan; -import eu.eudat.models.data.dmp.DataManagementPlanNewVersionModel; +import eu.eudat.models.data.datasetprofile.DatasetProfileListingModel; +import eu.eudat.models.data.datasetwizard.DatasetWizardModel; +import eu.eudat.models.data.datasetwizard.DatasetsToBeFinalized; +import eu.eudat.models.data.dmp.*; import eu.eudat.models.data.dynamicfields.DynamicFieldWithValue; +import eu.eudat.models.data.entities.xmlmodels.dmpprofiledefinition.DataManagementPlanProfile; +import eu.eudat.models.data.entities.xmlmodels.dmpprofiledefinition.Field; import eu.eudat.models.data.helpermodels.Tuple; import eu.eudat.models.data.helpers.common.DataTableData; import eu.eudat.models.data.listingmodels.DataManagementPlanListingModel; +import eu.eudat.models.data.listingmodels.DataManagementPlanOverviewModel; import eu.eudat.models.data.listingmodels.DatasetListingModel; +import eu.eudat.models.data.listingmodels.UserInfoListingModel; import eu.eudat.models.data.security.Principal; +import eu.eudat.models.data.user.composite.PagedDatasetProfile; +import eu.eudat.models.data.userinfo.UserListingModel; import eu.eudat.queryable.QueryableList; -import eu.eudat.logic.services.ApiContext; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.apache.poi.xwpf.usermodel.XWPFParagraph; +import org.apache.poi.xwpf.usermodel.XWPFRun; +import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.core.io.FileSystemResource; import org.springframework.http.*; -import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; +import org.springframework.web.multipart.MultipartFile; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Unmarshaller; +import java.io.*; +import java.math.BigInteger; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Paths; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; +@Component public class DataManagementPlanManager { - public DataTableData getPaged(ApiContext apiContext, DataManagementPlanTableRequest dataManagementPlanTableRequest, Principal principal) throws Exception { - UserInfo userInfo = new UserInfo(); - userInfo.setId(principal.getId()); - QueryableList items = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(dataManagementPlanTableRequest.getCriteria()).withHint(HintedModelFactory.getHint(DataManagementPlanListingModel.class)); - QueryableList authItems = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getAuthenticated(items, userInfo); + private ApiContext apiContext; + private DatasetManager datasetManager; + private UtilitiesService utilitiesService; + private DatabaseRepository databaseRepository; + private Environment environment; + + @Autowired + public DataManagementPlanManager(ApiContext apiContext, DatasetManager datasetManager, Environment environment) { + this.apiContext = apiContext; + this.datasetManager = datasetManager; + this.utilitiesService = apiContext.getUtilitiesService(); + this.databaseRepository = apiContext.getOperationsContext().getDatabaseRepository(); + this.environment = environment; + } + + public DataTableData getPaged(DataManagementPlanTableRequest dataManagementPlanTableRequest, Principal principal, String fieldsGroup) throws Exception { + UUID principalID = principal.getId(); + QueryableList items = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(dataManagementPlanTableRequest.getCriteria()); + QueryableList authItems = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getAuthenticated(items, principalID); QueryableList pagedItems = PaginationManager.applyPaging(authItems, dataManagementPlanTableRequest); - DataTableData dataTable = new DataTableData(); + DataTableData dataTable = new DataTableData<>(); - CompletableFuture itemsFuture = pagedItems - .selectAsync(item -> new DataManagementPlanListingModel().fromDataModel(item)).whenComplete((resultList, throwable) -> { - dataTable.setData(resultList); - }); + CompletableFuture itemsFuture; + if (fieldsGroup.equals("listing")) { + + itemsFuture = pagedItems.withHint(HintedModelFactory.getHint(DataManagementPlanListingModel.class)) + .selectAsync(item -> { + item.setDataset( + item.getDataset().stream() + .filter(dataset -> !dataset.getStatus().equals(Dataset.Status.DELETED.getValue()) && !dataset.getStatus().equals(Dataset.Status.CANCELED.getValue())).collect(Collectors.toList()).stream() + .filter(dataset -> dataset.getDmp().getUsers().stream().filter(userDMP -> userDMP.getRole().equals(UserDMP.UserDMPRoles.OWNER.getValue())).findFirst().get().getUser().getId().equals(principalID) + || dataset.getDmp().getUsers().stream() + .filter(x -> x.getUser().getId().equals(principalID)) + .collect(Collectors.toList()).size() > 0) + .collect(Collectors.toSet())); + return new DataManagementPlanListingModel().fromDataModelDatasets(item); + }) + .whenComplete((resultList, throwable) -> dataTable.setData(resultList)); + } else { + itemsFuture = pagedItems + .selectAsync(item -> new DataManagementPlanListingModel().fromDataModel(item)) + .whenComplete((resultList, throwable) -> dataTable.setData(resultList)); + } CompletableFuture countFuture = authItems.countAsync().whenComplete((count, throwable) -> { dataTable.setTotalCount(count); @@ -55,39 +126,246 @@ public class DataManagementPlanManager { return dataTable; } - public eu.eudat.models.data.dmp.DataManagementPlan getSingle(DMPDao dmpsRepository, String id, Principal principal, DynamicProjectConfiguration dynamicProjectConfiguration) throws InstantiationException, IllegalAccessException { - DMP dataManagementPlanEntity = dmpsRepository.find(UUID.fromString(id)); - if (dataManagementPlanEntity.getCreator().getId() != principal.getId() && dataManagementPlanEntity.getUsers().stream().filter(userInfo -> userInfo.getId() == principal.getId()).collect(Collectors.toList()).size() == 0) + public DataTableData getPaged(DataManagmentPlanPublicTableRequest dataManagementPlanPublicTableRequest, String fieldsGroup) throws Exception { + dataManagementPlanPublicTableRequest.setQuery(databaseRepository.getDmpDao().asQueryable().withHint(HintedModelFactory.getHint(DataManagementPlanListingModel.class))); + QueryableList items = dataManagementPlanPublicTableRequest.applyCriteria(); + QueryableList pagedItems = PaginationManager.applyPaging(items, dataManagementPlanPublicTableRequest); + + DataTableData dataTable = new DataTableData<>(); + + CompletableFuture itemsFuture; + if (fieldsGroup.equals("listing")) { + itemsFuture = pagedItems.withHint(HintedModelFactory.getHint(DataManagementPlanListingModel.class)) + .selectAsync(item -> { + item.setDataset( + item.getDataset().stream() + .filter(dataset -> dataset.getStatus().equals(Dataset.Status.FINALISED.getValue())).collect(Collectors.toSet())); + return new DataManagementPlanListingModel().fromDataModelDatasets(item); + }) + .whenComplete((resultList, throwable) -> dataTable.setData(resultList)); + } else { + itemsFuture = pagedItems + .selectAsync(item -> new DataManagementPlanListingModel().fromDataModel(item)) + .whenComplete((resultList, throwable) -> dataTable.setData(resultList)); + } + + CompletableFuture countFuture = items.countAsync().whenComplete((count, throwable) -> { + dataTable.setTotalCount(count); + }); + CompletableFuture.allOf(itemsFuture, countFuture).join(); + return dataTable; + } + + public void unlock(UUID uuid) throws Exception { + apiContext.getOperationsContext().getDatabaseRepository().getDmpDao() + .asQueryable().where((builder, root) -> builder.equal(root.get("id"), uuid)) + .update(root -> root.get("status"), DMP.DMPStatus.ACTIVE.getValue()); + return; + } + + public File getWordDocument(String id) throws InstantiationException, IllegalAccessException, IOException { + WordBuilder wordBuilder = new WordBuilder(); + VisibilityRuleService visibilityRuleService = this.utilitiesService.getVisibilityRuleService(); + DatasetWizardModel dataset = new DatasetWizardModel(); + String fileUrl = environment.getProperty("configuration.h2020template"); + InputStream is = new URL(Paths.get(fileUrl).toUri().toURL().toString()).openStream(); + XWPFDocument document = new XWPFDocument(is); + + eu.eudat.data.entities.DMP dmpEntity = databaseRepository.getDmpDao().find(UUID.fromString(id)); + + // Space above DMP title. + XWPFParagraph parAboveDmpTitle = document.createParagraph(); + XWPFParagraph parAboveDmpTitle1 = document.createParagraph(); + XWPFParagraph parAboveDmpTitle2 = document.createParagraph(); + XWPFParagraph parAboveDmpTitle3 = document.createParagraph(); + + // DMP title custom style. + //wordBuilder.addParagraphContent(dmpEntity.getLabel(), document, ParagraphStyle.TITLE, BigInteger.ZERO); + XWPFParagraph dmpLabelParagraph = document.createParagraph(); + XWPFRun run = dmpLabelParagraph.createRun(); + run.setText(dmpEntity.getLabel()); + run.setBold(true); + run.setFontSize(20); + + // Space below DMP title. + XWPFParagraph parBelowDmpTitle = document.createParagraph(); + + wordBuilder.addParagraphContent(dmpEntity.getDescription(), document, ParagraphStyle.TEXT, BigInteger.ZERO); + + wordBuilder.addParagraphContent("Organisations", document, ParagraphStyle.HEADER2, BigInteger.ZERO); + if (dmpEntity.getOrganisations().size() > 0) { + wordBuilder.addParagraphContent(dmpEntity.getOrganisations().stream().map(x -> x.getLabel()).collect(Collectors.joining(", ")) + , document, ParagraphStyle.TEXT, BigInteger.ZERO); + } + + wordBuilder.addParagraphContent("Researchers", document, ParagraphStyle.HEADER2, BigInteger.ZERO); + if (dmpEntity.getResearchers().size() > 0) { + wordBuilder.addParagraphContent(dmpEntity.getResearchers().stream().map(x -> x.getLabel()).collect(Collectors.joining(", ")) + , document, ParagraphStyle.TEXT, BigInteger.ZERO); + } + + /*wordBuilder.addParagraphContent("DMP Profile", document, ParagraphStyle.HEADER2, BigInteger.ZERO); + if (dmpEntity.getProfile() != null){ + wordBuilder.addParagraphContent(dmpEntity.getProfile().getLabel(), document, ParagraphStyle.TEXT, BigInteger.ZERO); + }*/ + + // Page break at the end of the DMP title. + XWPFParagraph parBreakDMP = document.createParagraph(); + parBreakDMP.setPageBreak(true); + + wordBuilder.addParagraphContent("Datasets", document, ParagraphStyle.TITLE, BigInteger.ZERO); + dmpEntity.getDataset().stream().forEach(datasetEntity -> { + Map properties = new HashMap<>(); + if (datasetEntity.getProperties() != null) { + JSONObject jobject = new JSONObject(datasetEntity.getProperties()); + properties = jobject.toMap(); + } + + // Custom style for the Dataset title. + //wordBuilder.addParagraphContent("Title: " + datasetEntity.getLabel(), document, ParagraphStyle.HEADER1, BigInteger.ZERO); + XWPFParagraph datasetLabelParagraph = document.createParagraph(); + XWPFRun runDatasetTitle1 = datasetLabelParagraph.createRun(); + runDatasetTitle1.setText("Title: "); + runDatasetTitle1.setBold(true); + runDatasetTitle1.setFontSize(12); + XWPFRun runDatasetTitle = datasetLabelParagraph.createRun(); + runDatasetTitle.setText(datasetEntity.getLabel()); + runDatasetTitle.setColor("2E75B6"); + runDatasetTitle.setBold(true); + runDatasetTitle.setFontSize(12); + + XWPFParagraph datasetTemplateParagraph = document.createParagraph(); + XWPFRun runDatasetTemplate1 = datasetTemplateParagraph.createRun(); + runDatasetTemplate1.setText("Template: "); + runDatasetTemplate1.setBold(true); + runDatasetTemplate1.setFontSize(12); + XWPFRun runDatasetTemplate = datasetTemplateParagraph.createRun(); + runDatasetTemplate.setText(datasetEntity.getProfile().getLabel()); + runDatasetTemplate.setColor("2E75B6"); + runDatasetTemplate.setBold(true); + runDatasetTemplate.setFontSize(12); + + wordBuilder.addParagraphContent(datasetEntity.getDescription(), document, ParagraphStyle.TEXT, BigInteger.ZERO); + wordBuilder.addParagraphContent("Dataset Description", document, ParagraphStyle.HEADER1, BigInteger.ZERO); + PagedDatasetProfile pagedDatasetProfile = datasetManager.getPagedProfile(dataset, datasetEntity); + visibilityRuleService.setProperties(properties); + visibilityRuleService.buildVisibilityContext(pagedDatasetProfile.getRules()); + try { + wordBuilder.build(document, pagedDatasetProfile, visibilityRuleService); + } catch (IOException e) { + e.printStackTrace(); + } + // Page break at the end of the Dataset. + XWPFParagraph parBreakDataset = document.createParagraph(); + }); + String fileName = dmpEntity.getLabel(); + fileName = fileName.replaceAll("[^a-zA-Z0-9+ ]", ""); + File exportFile = new File(fileName + ".docx"); + FileOutputStream out = new FileOutputStream(exportFile); + document.write(out); + out.close(); + + return exportFile; + } + + /*public File getPdfDocument(String id) throws InstantiationException, IllegalAccessException, InterruptedException, IOException { + File file = this.getWordDocument(id); + String fileName = file.getName(); + if (fileName.endsWith(".docx")){ + fileName = fileName.substring(0, fileName.length() - 5); + } + return this.datasetManager.convertToPDF(file, environment, fileName); + }*/ + + public eu.eudat.models.data.dmp.DataManagementPlan getSingle(String id, Principal principal, DynamicGrantConfiguration dynamicGrantConfiguration) throws InstantiationException, IllegalAccessException { + DMP dataManagementPlanEntity = databaseRepository.getDmpDao().find(UUID.fromString(id)); + if (dataManagementPlanEntity.getUsers().stream().filter(userInfo -> userInfo.getUser().getId() == principal.getId()).collect(Collectors.toList()).size() == 0) throw new UnauthorisedException(); eu.eudat.models.data.dmp.DataManagementPlan datamanagementPlan = new eu.eudat.models.data.dmp.DataManagementPlan(); datamanagementPlan.fromDataModel(dataManagementPlanEntity); Map dmpProperties = dataManagementPlanEntity.getDmpProperties() != null ? new org.json.JSONObject(dataManagementPlanEntity.getDmpProperties()).toMap() : null; - datamanagementPlan.setDynamicFields(dynamicProjectConfiguration.getFields().stream().map(item -> { - DynamicFieldWithValue fieldWithValue = new DynamicFieldWithValue(); - fieldWithValue.setId(item.getId()); - fieldWithValue.setDependencies(item.getDependencies()); - fieldWithValue.setName(item.getName()); - fieldWithValue.setQueryProperty(item.getQueryProperty()); - fieldWithValue.setRequired(item.getRequired()); - return fieldWithValue; - }).collect(Collectors.toList())); +// datamanagementPlan.setDynamicFields(dynamicGrantConfiguration.getFields().stream().map(item -> { +// DynamicFieldWithValue fieldWithValue = new DynamicFieldWithValue(); +// fieldWithValue.setId(item.getId()); +// fieldWithValue.setDependencies(item.getDependencies()); +// fieldWithValue.setName(item.getName()); +// fieldWithValue.setQueryProperty(item.getQueryProperty()); +// fieldWithValue.setRequired(item.getRequired()); +// return fieldWithValue; +// }).collect(Collectors.toList())); if (dmpProperties != null && datamanagementPlan.getDynamicFields() != null) datamanagementPlan.getDynamicFields().forEach(item -> { Map properties = (Map) dmpProperties.get(item.getId()); if (properties != null) - item.setValue(new Tuple(properties.get("id"), properties.get("label"))); + item.setValue(new Tuple<>(properties.get("id"), properties.get("label"))); }); return datamanagementPlan; } - public List getWithCriteria(DMPDao dmpsRepository, DataManagementPlanCriteriaRequest dataManagementPlanCriteria) throws IllegalAccessException, InstantiationException { - QueryableList items = dmpsRepository.getWithCriteria(dataManagementPlanCriteria.getCriteria()); - List datamanagementPlans = items.select(item -> new DataManagementPlan().fromDataModel(item)); + public DataManagementPlanOverviewModel getOverviewSingle(String id, Principal principal) throws InstantiationException, IllegalAccessException { + DMP dataManagementPlanEntity = databaseRepository.getDmpDao().find(UUID.fromString(id)); + if (dataManagementPlanEntity.getUsers() + .stream().filter(userInfo -> userInfo.getUser().getId() == principal.getId()) + .collect(Collectors.toList()).size() == 0) + throw new UnauthorisedException(); + DataManagementPlanOverviewModel datamanagementPlan = new DataManagementPlanOverviewModel(); + datamanagementPlan.fromDataModelDatasets(dataManagementPlanEntity); + + return datamanagementPlan; + } + + public eu.eudat.models.data.dmp.DataManagementPlan getSinglePublic(String id, DynamicGrantConfiguration dynamicGrantConfiguration) throws Exception { + DMP dataManagementPlanEntity = databaseRepository.getDmpDao().find(UUID.fromString(id)); + + if (dataManagementPlanEntity != null && dataManagementPlanEntity.getStatus() == 1) { + eu.eudat.models.data.dmp.DataManagementPlan datamanagementPlan = new eu.eudat.models.data.dmp.DataManagementPlan(); + datamanagementPlan.fromDataModel(dataManagementPlanEntity); + datamanagementPlan.setDatasets(datamanagementPlan.getDatasets().stream().filter(dataset -> dataset.getStatus() == Dataset.Status.FINALISED.getValue()).collect(Collectors.toList())); + Map dmpProperties = dataManagementPlanEntity.getDmpProperties() != null ? new org.json.JSONObject(dataManagementPlanEntity.getDmpProperties()).toMap() : null; +// datamanagementPlan.setDynamicFields(dynamicGrantConfiguration.getFields().stream().map(item -> { +// DynamicFieldWithValue fieldWithValue = new DynamicFieldWithValue(); +// fieldWithValue.setId(item.getId()); +// fieldWithValue.setDependencies(item.getDependencies()); +// fieldWithValue.setName(item.getName()); +// fieldWithValue.setQueryProperty(item.getQueryProperty()); +// fieldWithValue.setRequired(item.getRequired()); +// return fieldWithValue; +// }).collect(Collectors.toList())); + + if (dmpProperties != null && datamanagementPlan.getDynamicFields() != null) + datamanagementPlan.getDynamicFields().forEach(item -> { + Map properties = (Map) dmpProperties.get(item.getId()); + if (properties != null) + item.setValue(new Tuple<>(properties.get("id"), properties.get("label"))); + }); + return datamanagementPlan; + } else { + throw new Exception("Selected DMP is not public"); + } + } + + public DataManagementPlanOverviewModel getOverviewSinglePublic(String id) throws Exception { + DMP dataManagementPlanEntity = databaseRepository.getDmpDao().find(UUID.fromString(id)); + if (dataManagementPlanEntity != null && dataManagementPlanEntity.getStatus() == 1) { + DataManagementPlanOverviewModel datamanagementPlan = new DataManagementPlanOverviewModel(); + datamanagementPlan.fromDataModelDatasets(dataManagementPlanEntity); + datamanagementPlan.setDatasets(datamanagementPlan.getDatasets().stream().filter(dataset -> dataset.getStatus() == Dataset.Status.FINALISED.getValue()).collect(Collectors.toList())); + return datamanagementPlan; + } else { + throw new Exception("Selected DMP is not public"); + } + } + + public List getWithCriteria(DMPDao dmpsRepository, DataManagementPlanCriteriaRequest dataManagementPlanCriteria, Principal principal) throws IllegalAccessException, InstantiationException { + UUID principalID = principal.getId(); + QueryableList items = dmpsRepository.getWithCriteria(dataManagementPlanCriteria.getCriteria()).withHint(HintedModelFactory.getHint(DataManagementPlan.class)); + QueryableList authenticatedItems = dmpsRepository.getAuthenticated(items, principalID); + List datamanagementPlans = authenticatedItems.select(item -> new DataManagementPlan().fromDataModel(item)); return datamanagementPlans; } - public List> getDynamicFields(String id, DynamicProjectConfiguration dynamicProjectConfiguration, DynamicFieldsCriteria criteria) throws IllegalAccessException, InstantiationException { + public List> getDynamicFields(String id, DynamicGrantConfiguration dynamicGrantConfiguration, DynamicFieldsCriteria criteria) throws IllegalAccessException, InstantiationException { List> result = new LinkedList<>(); RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); @@ -95,7 +373,7 @@ public class DataManagementPlanManager { headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity entity = new HttpEntity<>("parameters", headers); - Property property = dynamicProjectConfiguration.getConfiguration().getConfigurationProperties().stream() + Property property = dynamicGrantConfiguration.getConfiguration().getConfigurationProperties().stream() .filter(item -> item.getId().equals(id)).findFirst().orElse(null); StringBuilder stringBuilder = new StringBuilder(); if (criteria.getLike() != null) stringBuilder.append("?search=" + criteria.getLike()); @@ -130,93 +408,244 @@ public class DataManagementPlanManager { return result; } - public static void createOrUpdate(ApiContext apiContext, DataManagementPlan dataManagementPlan, Principal principal) throws Exception { + public DMP createOrUpdate(ApiContext apiContext, DataManagementPlanEditorModel dataManagementPlan, Principal principal) throws Exception { + + if (dataManagementPlan.getId() != null) { + DMP dmp1 = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().find(dataManagementPlan.getId()); + + List datasetList = new ArrayList<>(dmp1.getDataset()); + for (Dataset dataset : datasetList) { + if (dataManagementPlan.getProfiles().stream().filter(associatedProfile -> dataset.getProfile().getId().equals(associatedProfile.getId())).findAny().orElse(null) == null) + throw new Exception("Dataset Template for Dataest Description is missing from the DMP."); + } + if (dataManagementPlan.getStatus() == (int) DMP.DMPStatus.FINALISED.getValue() && dmp1.getStatus().equals(DMP.DMPStatus.FINALISED.getValue())) + throw new Exception("DMP is finalized, therefore cannot be edited."); + } + DMP newDmp = dataManagementPlan.toDataModel(); + if (newDmp.getStatus() == (int) DMP.DMPStatus.FINALISED.getValue()) { + checkDmpValidationRules(newDmp); + } + UserInfo user = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(principal.getId()); + createOrganisationsIfTheyDontExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getOrganisationDao()); createResearchersIfTheyDontExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getResearcherDao()); - UserInfo user = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(principal.getId()); - createProjectIfItDoesntExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getProjectDao(), user); - newDmp.setCreator(user); + createFunderIfItDoesntExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getFunderDao()); + createGrantIfItDoesntExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getGrantDao()); + if (newDmp.getProject().getLabel() == null || newDmp.getProject().getLabel().trim().isEmpty()) { + newDmp.setProject(newDmp.getProject().projectFromGrant(newDmp.getGrant())); + } + createProjectIfItDoesntExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getProjectDao()); + + DMP dmp; + if (dataManagementPlan.getId() != null) { + dmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().find(dataManagementPlan.getId()); + } else dmp = new DMP(); + + newDmp.setCreated(dmp.getCreated() == null ? new Date() : dmp.getCreated()); + if (newDmp.getUsers()!= null && newDmp.getUsers().stream().filter(userInfo -> userInfo.getUser().getId() == principal.getId()) + .collect(Collectors.toList()).size() == 0) { + List userDMPList = newDmp.getUsers().stream().collect(Collectors.toList()); + for (UserInfoListingModel userInfoListingModel : dataManagementPlan.getUsers()) { + for (UserDMP userDMP : userDMPList) { + if (!(userDMP.getUser().getId().equals(userInfoListingModel.getId()))) { + apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().delete(userDMP); + } + } + } + } + + checkIfUserCanEditGrant(newDmp, user); + checkIfGrandHasCreationUser(newDmp, user); + + apiContext.getOperationsContext().getDatabaseRepository().getGrantDao().createOrUpdate(newDmp.getGrant()); newDmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(newDmp); - if (dataManagementPlan.getAssociatedUsers().stream().filter(item -> item.getId() == principal.getId()).collect(Collectors.toList()).size() == 0) - assignUser(newDmp, user, apiContext); + + // Dataset manipulation for when the DMP is set to be finalized. + if (dataManagementPlan.getStatus() == DMP.DMPStatus.FINALISED.getValue()) { + if (dataManagementPlan.getDatasetsToBeFinalized() != null && !dataManagementPlan.getDatasetsToBeFinalized().isEmpty()) { + apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao() + .asQueryable().where((builder, root) -> root.get("id").in(dataManagementPlan.getDatasetsToBeFinalized())) + .update(root -> root.get("status"), Dataset.Status.FINALISED.getValue()); + + List datasetsToBeCanceled = new LinkedList<>(); + for (DatasetListingModel dataset : dataManagementPlan.getDatasets()) { + if (!(dataset.getStatus() == (int) Dataset.Status.FINALISED.getValue()) && !dataManagementPlan.getDatasetsToBeFinalized().contains(UUID.fromString(dataset.getId()))) { + datasetsToBeCanceled.add(UUID.fromString(dataset.getId())); + } + } + if (!datasetsToBeCanceled.isEmpty()) + apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao() + .asQueryable().where((builder, root) -> root.get("id").in(datasetsToBeCanceled)) + .update(root -> root.get("status"), Dataset.Status.CANCELED.getValue()); + } else { + List datasetsToBeCanceled = new LinkedList<>(); + for (DatasetListingModel dataset : dataManagementPlan.getDatasets()) { + if (!(dataset.getStatus() == (int) Dataset.Status.FINALISED.getValue())) { + datasetsToBeCanceled.add(UUID.fromString(dataset.getId())); + } + } + if (!datasetsToBeCanceled.isEmpty()) + apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao() + .asQueryable().where((builder, root) -> root.get("id").in(datasetsToBeCanceled)) + .update(root -> root.get("status"), Dataset.Status.CANCELED.getValue()); + } + } + + if (dataManagementPlan.getAssociatedUsers().size() == 0) + assignUser(newDmp, user); + + return newDmp; } - public static void assignUser(DMP dmp, UserInfo userInfo, ApiContext apiContext) { + + public void assignUser(DMP dmp, UserInfo userInfo) { UserDMP userDMP = new UserDMP(); userDMP.setDmp(dmp); userDMP.setUser(userInfo); userDMP.setRole(UserDMP.UserDMPRoles.OWNER.getValue()); - apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().createOrUpdate(userDMP); + databaseRepository.getUserDmpDao().createOrUpdate(userDMP); } - public static void newVersion(ApiContext apiContext, UUID uuid, DataManagementPlanNewVersionModel dataManagementPlan, Principal principal) throws Exception { - DMP oldDmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().find(uuid); - DMP newDmp = dataManagementPlan.toDataModel(); - createOrganisationsIfTheyDontExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getOrganisationDao()); - createResearchersIfTheyDontExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getResearcherDao()); - UserInfo user = apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class).id(principal.getId()).build(); - createProjectIfItDoesntExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getProjectDao(), user); - newDmp.setCreator(user); - newDmp.setGroupId(oldDmp.getGroupId()); - newDmp.setVersion(oldDmp.getVersion() + 1); - newDmp.setId(null); - newDmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(newDmp); - copyDatasets(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao()); + public void newVersion(UUID uuid, DataManagementPlanNewVersionModel dataManagementPlan, Principal principal) throws Exception { + DMP oldDmp = databaseRepository.getDmpDao().find(uuid); + + DataManagementPlanCriteria criteria = new DataManagementPlanCriteria(); + LinkedList list = new LinkedList<>(); + list.push(oldDmp.getGroupId()); + criteria.setGroupIds(list); + criteria.setAllVersions(false); + QueryableList dataManagementPlanQueryableList = databaseRepository.getDmpDao().getWithCriteria(criteria); + List latestVersionDMP = dataManagementPlanQueryableList.toList(); + + if (latestVersionDMP.get(0).getVersion().equals(oldDmp.getVersion())) { + DMP newDmp = dataManagementPlan.toDataModel(); + + createOrganisationsIfTheyDontExist(newDmp, databaseRepository.getOrganisationDao()); + createResearchersIfTheyDontExist(newDmp, databaseRepository.getResearcherDao()); + UserInfo user = apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class).id(principal.getId()).build(); + + createFunderIfItDoesntExist(newDmp, databaseRepository.getFunderDao()); + createGrantIfItDoesntExist(newDmp, databaseRepository.getGrantDao()); + if (newDmp.getProject().getLabel() == null || newDmp.getProject().getLabel().trim().isEmpty()) { + newDmp.setProject(newDmp.getProject().projectFromGrant(newDmp.getGrant())); + } + createProjectIfItDoesntExist(newDmp, databaseRepository.getProjectDao()); + + newDmp.setGroupId(oldDmp.getGroupId()); + newDmp.setVersion(oldDmp.getVersion() + 1); + newDmp.setId(null); + + checkIfUserCanEditGrant(newDmp, user); + checkIfGrandHasCreationUser(newDmp, user); + databaseRepository.getGrantDao().createOrUpdate(newDmp.getGrant()); + newDmp = databaseRepository.getDmpDao().createOrUpdate(newDmp); + + // Assign creator. + assignUser(newDmp, user); + + copyDatasets(newDmp, databaseRepository.getDatasetDao()); + } else { + throw new DMPNewVersionException("Version to update not the latest."); + } } - public static void clone(ApiContext apiContext, UUID uuid, DataManagementPlanNewVersionModel dataManagementPlan, Principal principal) throws Exception { + public void clone(DataManagementPlanNewVersionModel dataManagementPlan, Principal principal) throws Exception { DMP newDmp = dataManagementPlan.toDataModel(); - createOrganisationsIfTheyDontExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getOrganisationDao()); - createResearchersIfTheyDontExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getResearcherDao()); + createOrganisationsIfTheyDontExist(newDmp, databaseRepository.getOrganisationDao()); + createResearchersIfTheyDontExist(newDmp, databaseRepository.getResearcherDao()); UserInfo user = apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class).id(principal.getId()).build(); - createProjectIfItDoesntExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getProjectDao(), user); - newDmp.setCreator(user); + + createFunderIfItDoesntExist(newDmp, databaseRepository.getFunderDao()); + createGrantIfItDoesntExist(newDmp, databaseRepository.getGrantDao()); + if (newDmp.getProject().getLabel() == null || newDmp.getProject().getLabel().trim().isEmpty()) { + newDmp.setProject(newDmp.getProject().projectFromGrant(newDmp.getGrant())); + } + createProjectIfItDoesntExist(newDmp, databaseRepository.getProjectDao()); + newDmp.setGroupId(UUID.randomUUID()); newDmp.setVersion(0); newDmp.setId(null); - newDmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(newDmp); - copyDatasets(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao()); + + checkIfUserCanEditGrant(newDmp, user); + checkIfGrandHasCreationUser(newDmp, user); + databaseRepository.getGrantDao().createOrUpdate(newDmp.getGrant()); + newDmp = databaseRepository.getDmpDao().createOrUpdate(newDmp); + + // Assign creator. + assignUser(newDmp, user); + copyDatasets(newDmp, databaseRepository.getDatasetDao()); } - public static void delete(ApiContext apiContext, UUID uuid) throws DMPWithDatasetsException { + public void delete(UUID uuid) throws DMPWithDatasetsDeleteException { + DatasetCriteria criteria = new DatasetCriteria(); + List dmpIds = Collections.singletonList(uuid); + criteria.setDmpIds(dmpIds); + if (apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().getWithCriteria(criteria).toList().size() > 0) + throw new DMPWithDatasetsDeleteException("You cannot Remove Datamanagement Plan with Datasets"); DMP oldDmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().find(uuid); - if (oldDmp.getDataset().size() > 0) - throw new DMPWithDatasetsException("You cannot Remove Datamanagement Plan with Datasets"); oldDmp.setStatus(DMP.DMPStatus.DELETED.getValue()); apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(oldDmp); } - private static void createResearchersIfTheyDontExist(DMP newDmp, ResearcherDao researcherRepository) { + private void createResearchersIfTheyDontExist(DMP newDmp, ResearcherDao researcherRepository) { if (newDmp.getResearchers() != null && !newDmp.getResearchers().isEmpty()) { for (eu.eudat.data.entities.Researcher researcher : newDmp.getResearchers()) { ResearcherCriteria criteria = new ResearcherCriteria(); criteria.setLike(researcher.getReference()); List entries = researcherRepository.getWithCriteria(criteria).toList(); if (entries != null && !entries.isEmpty()) researcher.setId(entries.get(0).getId()); - else researcher = researcherRepository.createOrUpdate(researcher); + else researcherRepository.createOrUpdate(researcher); } } } - private static void createOrganisationsIfTheyDontExist(DMP newDmp, OrganisationDao organisationRepository) { + private void createOrganisationsIfTheyDontExist(DMP newDmp, OrganisationDao organisationRepository) { if (newDmp.getOrganisations() != null && !newDmp.getOrganisations().isEmpty()) { for (eu.eudat.data.entities.Organisation organisation : newDmp.getOrganisations()) { OrganisationCriteria criteria = new OrganisationCriteria(); criteria.setLike(organisation.getReference()); List entries = organisationRepository.getWithCriteria(criteria).toList(); if (entries != null && !entries.isEmpty()) organisation.setId(entries.get(0).getId()); - else organisation = organisationRepository.createOrUpdate(organisation); + else organisationRepository.createOrUpdate(organisation); } } } - private static void createProjectIfItDoesntExist(DMP newDmp, ProjectDao projectDao, UserInfo userInfo) { + private void createGrantIfItDoesntExist(DMP newDmp, GrantDao grantDao) { + if (newDmp.getGrant() != null) { + Grant grant = newDmp.getGrant(); + GrantCriteria criteria = new GrantCriteria(); + criteria.setReference(grant.getReference()); + eu.eudat.data.entities.Grant grantEntity = grantDao.getWithCriteria(criteria).getSingleOrDefault(); + if (grantEntity != null) grant.setId(grantEntity.getId()); + else { + grant.setType(Grant.GrantType.EXTERNAL.getValue()); + grantDao.createOrUpdate(grant); + } + } + } + + private void createFunderIfItDoesntExist(DMP newDmp, FunderDao funderDao) { + if (newDmp.getGrant().getFunder() != null) { + Funder funder = newDmp.getGrant().getFunder(); + FunderCriteria criteria = new FunderCriteria(); + criteria.setReference(funder.getReference()); + eu.eudat.data.entities.Funder funderEntity = funderDao.getWithCritetia(criteria).getSingleOrDefault(); + if (funderEntity != null) funder.setId(funderEntity.getId()); + else { + funder.setType(Funder.FunderType.EXTERNAL.getValue()); + funderDao.createOrUpdate(funder); + } + } + } + + private void createProjectIfItDoesntExist(DMP newDmp, ProjectDao projectDao) { if (newDmp.getProject() != null) { Project project = newDmp.getProject(); ProjectCriteria criteria = new ProjectCriteria(); criteria.setReference(project.getReference()); - eu.eudat.data.entities.Project projectEntity = projectDao.getWithCriteria(criteria).getSingleOrDefault(); + eu.eudat.data.entities.Project projectEntity = projectDao.getWithCritetia(criteria).getSingleOrDefault(); if (projectEntity != null) project.setId(projectEntity.getId()); else { project.setType(Project.ProjectType.EXTERNAL.getValue()); @@ -225,8 +654,40 @@ public class DataManagementPlanManager { } } - @Async - private static void copyDatasets(DMP newDmp, DatasetDao datasetDao) { + private void checkIfUserCanEditGrant(DMP dmp, UserInfo user) throws Exception{ + if (dmp.getGrant().getId() != null) { + Grant grant = apiContext.getOperationsContext().getDatabaseRepository().getGrantDao().find(dmp.getGrant().getId()); + if (grant.getFunder() != null && dmp.getGrant().getFunder() != null + && !grant.getFunder().getId().equals(dmp.getGrant().getFunder().getId())) { + if (grant.getCreationUser() == null) { + throw new Exception("Grant has no user, therefore, cannot be edited."); + } + if (!grant.getCreationUser().getId().equals(user.getId())) { + throw new Exception("User is not the owner of the Grant, therefore, cannot edit it."); + } + } + } + } + + private void checkDmpValidationRules(DMP dmp) throws Exception { + if (dmp.getLabel() == null || dmp.getLabel().trim().isEmpty()) { + throw new Exception("DMP has no label."); + } + if (dmp.getAssociatedDmps().size() == 0) { + throw new Exception("DMP does not contain Dataset Templates."); + } + if (dmp.getGrant() == null) { + throw new Exception("DMP has no Grant assigned."); + } + } + + private void checkIfGrandHasCreationUser(DMP dmp, UserInfo user) { + if (dmp.getGrant().getCreationUser() == null) { + dmp.getGrant().setCreationUser(user); + } + } + + private void copyDatasets(DMP newDmp, DatasetDao datasetDao) { List> futures = new LinkedList<>(); for (Dataset dataset : newDmp.getDataset()) { datasetDao.asQueryable().withHint(HintedModelFactory.getHint(DatasetListingModel.class)).where((builder, root) -> builder.equal(root.get("id"), dataset.getId())).getSingleAsync() @@ -285,4 +746,375 @@ public class DataManagementPlanManager { } } + + public FileEnvelope getXmlDocument(String id) throws InstantiationException, IllegalAccessException, IOException { + ExportXmlBuilder xmlBuilder = new ExportXmlBuilder(); + VisibilityRuleService visibilityRuleService = utilitiesService.getVisibilityRuleService(); + eu.eudat.data.entities.DMP dmp = databaseRepository.getDmpDao().find(UUID.fromString(id)); + List datasets = dmp.getDataset().stream().collect(Collectors.toList()); + String fileName = dmp.getLabel(); + fileName = fileName.replaceAll("[^a-zA-Z0-9+ ]", ""); + File xmlFile = new File(fileName + ".xml"); + BufferedWriter writer = new BufferedWriter(new FileWriter(xmlFile, true)); + Document xmlDoc = XmlBuilder.getDocument(); + Element dmpElement = xmlDoc.createElement("dmp"); + Element dmpDescription = xmlDoc.createElement("description"); + dmpDescription.setTextContent(dmp.getDescription()); + dmpElement.appendChild(dmpDescription); + Element dmpName = xmlDoc.createElement("dmpName"); + dmpName.setTextContent(dmp.getLabel()); + dmpElement.appendChild(dmpName); + + DMPProfile dmpProfile = dmp.getProfile(); + Element dmpProfileElement = xmlDoc.createElement("dmpProfile"); + Element dmpProfileName = xmlDoc.createElement("dmpProfileName"); + if (!(dmpProfile == null)) { + dmpProfileName.setTextContent(dmpProfile.getLabel()); + dmpProfileElement.appendChild(dmpProfileName); + Element dmpProfileId = xmlDoc.createElement("dmpProfileId"); + dmpProfileId.setTextContent(dmpProfile.getId().toString()); + dmpProfileElement.appendChild(dmpProfileId); + Element values = xmlDoc.createElement("values"); + values.setTextContent(dmpProfile.getDefinition()); + dmpProfileElement.appendChild(values); + } + dmpElement.appendChild(dmpProfileElement); + + Element grant = xmlDoc.createElement("grant"); + Element label = xmlDoc.createElement("label"); + label.setTextContent(dmp.getGrant().getLabel()); + grant.appendChild(label); + Element grantId = xmlDoc.createElement("id"); + grantId.setTextContent(dmp.getGrant().getId().toString()); + grant.appendChild(grantId); + dmpElement.appendChild(grant); + Element organisationsElement = xmlDoc.createElement("organisations"); + for (Organisation organisation : dmp.getOrganisations()) { + Element organisationElement = xmlDoc.createElement("organisation"); + Element organisationNameElement = xmlDoc.createElement("name"); + organisationNameElement.setTextContent(organisation.getLabel()); + Element organisationReferenceElement = xmlDoc.createElement("reference"); + organisationReferenceElement.setTextContent(organisation.getReference()); + organisationElement.appendChild(organisationNameElement); + organisationElement.appendChild(organisationReferenceElement); + organisationsElement.appendChild(organisationElement); + } + dmpElement.appendChild(organisationsElement); + + Element researchersElement = xmlDoc.createElement("researchers"); + for (Researcher researcher : dmp.getResearchers()) { + Element researcherElement = xmlDoc.createElement("researcher"); + Element researcherNameElement = xmlDoc.createElement("name"); + researcherNameElement.setTextContent(researcher.getLabel()); + Element researcherReferenceElement = xmlDoc.createElement("reference"); + researcherReferenceElement.setTextContent(researcher.getReference()); + researcherElement.appendChild(researcherNameElement); + researcherElement.appendChild(researcherReferenceElement); + researchersElement.appendChild(researcherElement); + } + dmpElement.appendChild(researchersElement); + Element datasetsElement = xmlDoc.createElement("datasets"); + + for (Dataset dataset : datasets) { + Element datasetElement = xmlDoc.createElement("dataset"); + + DatasetWizardModel datasetWizardModel = new DatasetWizardModel(); + Map properties = new HashMap<>(); + if (dataset.getProperties() != null) { + JSONObject jobject = new JSONObject(dataset.getProperties()); + properties = jobject.toMap(); + } + PagedDatasetProfile pagedDatasetProfile = datasetManager.getPagedProfile(datasetWizardModel, dataset); + visibilityRuleService.setProperties(properties); + visibilityRuleService.buildVisibilityContext(pagedDatasetProfile.getRules()); + datasetElement.appendChild(xmlBuilder.createPages(pagedDatasetProfile.getPages(), visibilityRuleService, xmlDoc)); + datasetsElement.appendChild(datasetElement); + } + Element profiles = xmlDoc.createElement("profiles"); + + // Get DatasetProfiles from DMP to add to XML. + for (DatasetProfile datasetProfile : dmp.getAssociatedDmps()) { + Element profile = xmlDoc.createElement("profile"); + Element profileLabel = xmlDoc.createElement("profilelabel"); + profileLabel.setTextContent(datasetProfile.getLabel()); + profile.appendChild(profileLabel); + Element profileId = xmlDoc.createElement("profileId"); + profileId.setTextContent(datasetProfile.getId().toString()); + profile.appendChild(profileId); + profiles.appendChild(profile); + } + dmpElement.appendChild(profiles); + dmpElement.appendChild(datasetsElement); + xmlDoc.appendChild(dmpElement); + String xml = XmlBuilder.generateXml(xmlDoc); + writer.write(xml); + writer.close(); + FileEnvelope fileEnvelope = new FileEnvelope(); + fileEnvelope.setFile(xmlFile); + fileEnvelope.setFilename(dmp.getLabel()); + + return fileEnvelope; + } + + public ResponseEntity getRDAJsonDocument(String id) throws IOException { + eu.eudat.data.entities.DMP dmp = databaseRepository.getDmpDao().find(UUID.fromString(id)); + DmpRDAExportModel dmpExport = new DmpRDAExportModel().fromDataModel(dmp); + RDAExportModel rdaExportModel = new RDAExportModel(); + rdaExportModel.setDmp(dmpExport); + + ObjectMapper mapper = new ObjectMapper(); + String fileName = dmp.getLabel(); + fileName = fileName.replaceAll("[^a-zA-Z0-9+ ]", ""); + File file = new File(fileName); + try { + mapper.writeValue(file, rdaExportModel); + } catch (IOException e) { + e.printStackTrace(); + } + + InputStream resource = new FileInputStream(file); + HttpHeaders responseHeaders = new HttpHeaders(); + responseHeaders.setContentLength(file.length()); + responseHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM); + responseHeaders.set("Content-Disposition", "attachment;filename=" + file.getName()); + responseHeaders.set("Access-Control-Expose-Headers", "Content-Disposition"); + responseHeaders.get("Access-Control-Expose-Headers").add("Content-Type"); + + byte[] content = org.apache.poi.util.IOUtils.toByteArray(resource); + resource.close(); + Files.deleteIfExists(file.toPath()); + return new ResponseEntity<>(content, responseHeaders, HttpStatus.OK); + } + + public ResponseEntity getDocument(String id, String contentType) throws InstantiationException, IllegalAccessException, IOException { + File file; + switch (contentType) { + case "application/xml": + file = getXmlDocument(id).getFile(); + break; + case "application/msword": + file = getWordDocument(id); + break; + /*case "application/pdf": + file = getPdfDocument(id); + break;*/ + default: + file = getXmlDocument(id).getFile(); + } + InputStream resource = new FileInputStream(file); + HttpHeaders responseHeaders = new HttpHeaders(); + responseHeaders.setContentLength(file.length()); + responseHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM); + responseHeaders.set("Content-Disposition", "attachment;filename=" + file.getName()); + responseHeaders.set("Access-Control-Expose-Headers", "Content-Disposition"); + responseHeaders.get("Access-Control-Expose-Headers").add("Content-Type"); + + byte[] content = org.apache.poi.util.IOUtils.toByteArray(resource); + resource.close(); + Files.deleteIfExists(file.toPath()); + return new ResponseEntity<>(content, + responseHeaders, + HttpStatus.OK); + } + + public List createDmpFromXml(ApiContext apiContext, MultipartFile[] files, Principal principal) throws IOException, JAXBException, Exception { + List dataManagementPlans = new ArrayList<>(); + // Jaxb approach. + JAXBContext jaxbContext; + + for (MultipartFile multipartFile : Arrays.asList(files)) { // Gets one item from the array. + try { + InputStream in = multipartFile.getInputStream(); // Transforms item to InputStream. + jaxbContext = JAXBContext.newInstance(DmpImportModel.class); + Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); + DmpImportModel dmpImportModel = (DmpImportModel) jaxbUnmarshaller.unmarshal(in); + dataManagementPlans.add(dmpImportModel); + } catch (IOException | JAXBException ex) { + ex.printStackTrace(); + } + // TODO Iterate through the list of dataManagmentPlans. + // Creates new dataManagmentPlan to fill it with the data model that was parsed from the xml. + // Creates properties. + DataManagementPlan dm = new DataManagementPlan(); + DataManagementPlanProfile dmpProfile = new DataManagementPlanProfile(); + + List fieldList = new LinkedList<>(); + Field field = new Field(); + field.setLabel(dataManagementPlans.get(0).getDmpProfile().getDmpProfileName()); + field.setId(dataManagementPlans.get(0).getDmpProfile().getDmpProfileId()); + + fieldList.add(field); + dmpProfile.setFields(fieldList); + + /*Tuple tuple = new Tuple(); + tuple.setId(dataManagementPlans.get(0).getDmpProfile().getDmpProfileId()); + tuple.setLabel(dataManagementPlans.get(0).getDmpProfile().getDmpProfileName());*/ + eu.eudat.models.data.grant.Grant grant = new eu.eudat.models.data.grant.Grant(); + GrantImportModels grantImport = dataManagementPlans.get(0).getGrantImport(); + grant.setId(grantImport.getId()); + grant.setLabel(grantImport.getLabel()); + grant.setAbbreviation(grantImport.getAbbreviation()); + grant.setDescription(grantImport.getDescription()); + List associatedProfiles = new LinkedList<>(); + for (AssociatedProfileImportModels a : dataManagementPlans.get(0).getProfilesImportModels()) { + AssociatedProfile associatedProfile = new AssociatedProfile(); + associatedProfile.setId(a.getId()); + associatedProfile.setLabel(a.getLabel()); + associatedProfiles.add(associatedProfile); + } + List organisations = new ArrayList<>(); + for (OrganisationImportModel org : dataManagementPlans.get(0).getOrganisationImportModels()) { + eu.eudat.models.data.dmp.Organisation organisation = new eu.eudat.models.data.dmp.Organisation(); + organisation.setLabel(org.getOrganaisationNameImport()); + organisation.setId(org.getOrganaisationReferenceImport()); + organisations.add(organisation); + } + List researchers = new LinkedList<>(); + for (ResearcherImportModels res : dataManagementPlans.get(0).getResearchersImportModels()) { + eu.eudat.models.data.dmp.Researcher researcher = new eu.eudat.models.data.dmp.Researcher(); + researcher.setLabel(res.getResearcherImportName()); + researcher.setId(res.getResearcherImportReference()); + researchers.add(researcher); + } + + List associatedUsers = new LinkedList<>(); + List dynamicFields = new LinkedList<>(); + + // Sets properties. + dm.setLabel(files[0].getOriginalFilename()); // Sets label. + dm.setGrant(grant); //Sets grant property. + dm.setDescription(dataManagementPlans.get(0).getDescriptionImport()); // Sets description property. + dm.setProfiles(associatedProfiles); + dm.setOrganisations(organisations); // Sets organisations property. + dm.setResearchers(researchers); // Sets researchers property. + dm.setAssociatedUsers(associatedUsers); // Sets associatedUsers property. + dm.setDynamicFields(dynamicFields); // Sets dynamicFields property. + dm.setDefinition(dmpProfile); + + //createOrUpdate(apiContext, dm, principal); + + System.out.println(dm); + } + + return dataManagementPlans; + } + + public DataTableData getDatasetProfilesUsedByDMP(DatasetProfileTableRequestItem datasetProfileTableRequestItem, Principal principal) { + datasetProfileTableRequestItem.getCriteria().setFilter(DatasetProfileCriteria.DatasetProfileFilter.DMPs.getValue()); + datasetProfileTableRequestItem.getCriteria().setUserId(principal.getId()); + + QueryableList items = apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().getWithCriteria(datasetProfileTableRequestItem.getCriteria()); + List listingModels = items.select(item -> new DatasetProfileListingModel().fromDataModel(item)); + + DataTableData data = new DataTableData<>(); + data.setData(listingModels); + data.setTotalCount((long) listingModels.size()); + + return data; + } + + public void makePublic(UUID id, Principal principal) throws Exception { + DMP dmp = this.apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().find(id); + // Check if dmp is finalized and if user is owner. + if (!isUserOwnerOfDmp(dmp, principal)) + throw new Exception("User does not have the privilege to do this action."); + if (!dmp.getStatus().equals(DMP.DMPStatus.FINALISED.getValue())) + throw new Exception("DMP is not finalized"); + dmp.setPublic(true); + apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(dmp); + } + + public void makeFinalize(UUID id, Principal principal, DatasetsToBeFinalized datasetsToBeFinalized) throws Exception { + DMP dmp = this.apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().find(id); + if (!isUserOwnerOfDmp(dmp, principal)) + throw new Exception("User does not have the privilege to do this action."); + if (dmp.getStatus().equals(DMP.DMPStatus.FINALISED.getValue())) + throw new Exception("DMP is already finalized"); + dmp.setStatus(DMP.DMPStatus.FINALISED.getValue()); + apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(dmp); + if (datasetsToBeFinalized != null && datasetsToBeFinalized.getUuids() != null && !datasetsToBeFinalized.getUuids().isEmpty()) { + apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao() + .asQueryable().where((builder, root) -> root.get("id").in(datasetsToBeFinalized.getUuids())) + .update(root -> root.get("status"), Dataset.Status.FINALISED.getValue()); + List datasetsToBeCanceled = new LinkedList<>(); + for (Dataset dataset : dmp.getDataset()) { + if (!dataset.getStatus().equals(Dataset.Status.FINALISED.getValue()) && !datasetsToBeFinalized.getUuids().contains(dataset.getId())) { + datasetsToBeCanceled.add(dataset.getId()); + } + } + if (!datasetsToBeCanceled.isEmpty()) + apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao() + .asQueryable().where((builder, root) -> root.get("id").in(datasetsToBeCanceled)) + .update(root -> root.get("status"), Dataset.Status.CANCELED.getValue()); + } else { + List datasetsToBeCanceled = new LinkedList<>(); + for (Dataset dataset : dmp.getDataset()) { + if (!dataset.getStatus().equals(Dataset.Status.FINALISED.getValue())) { + datasetsToBeCanceled.add(dataset.getId()); + } + } + if (!datasetsToBeCanceled.isEmpty()) + apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao() + .asQueryable().where((builder, root) -> root.get("id").in(datasetsToBeCanceled)) + .update(root -> root.get("status"), Dataset.Status.CANCELED.getValue()); + } + } + + private boolean isUserOwnerOfDmp(DMP dmp, Principal principal) { + return (dmp.getUsers().stream().filter(userDMP -> userDMP.getRole().equals(UserDMP.UserDMPRoles.OWNER.getValue())).findFirst().get().getUser().getId()).equals(principal.getId()); + } + + public String createZenodoDoi(UUID id, Principal principal) throws Exception { + DMP dmp = this.apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().find(id); + if (!isUserOwnerOfDmp(dmp, principal)) + throw new Exception("User is not authorized to invoke this action"); + if (!dmp.getStatus().equals(DMP.DMPStatus.FINALISED.getValue())) + throw new Exception("DMP is not finalized"); + if (dmp.getDoi() != null) + throw new Exception("DMP already has a DOI"); + + // First step, post call to Zenodo, to create the entry. + RestTemplate restTemplate = new RestTemplate(); + HttpHeaders headers = new HttpHeaders(); + headers.set("accept", "application/json"); + headers.setContentType(MediaType.APPLICATION_JSON); + String createData = "{\n" + + " \"metadata\": {\n" + + " \"title\": \"" + dmp.getLabel() + "\",\n" + + " \"upload_type\": \"publication\",\n" + + " \"publication_type\": \"datamanagementplan\",\n" + + " \"description\": \"" + dmp.getDescription() + "\",\n" + + " \"creators\": [{\n" + + " \t\t\"name\": \"" + dmp.getUsers().stream().filter(userDMP -> userDMP.getRole().equals(UserDMP.UserDMPRoles.OWNER.getValue())).findFirst().get().getUser().getName() + "\",\n" + + " \t\t\"affiliation\": \"OpenDMP\"}]\n" + + " }\n" + + "}"; + HttpEntity request = new HttpEntity<>(createData, headers); + String createUrl = this.environment.getProperty("zenodo.url") + "deposit/depositions" + "?access_token=" + this.environment.getProperty("zenodo.access_token"); + Map createResponse = restTemplate.postForObject(createUrl, request, Map.class); + + // Second step, add the file to the entry. + HttpHeaders fileHeaders = new HttpHeaders(); + fileHeaders.setContentType(MediaType.MULTIPART_FORM_DATA); + LinkedMultiValueMap addFileMap = new LinkedMultiValueMap<>(); + + File file = getWordDocument(id.toString()); + addFileMap.add("filename", file.getName()); + FileSystemResource fileSystemResource = new FileSystemResource(file); + addFileMap.add("file", fileSystemResource); + HttpEntity> addFileMapRequest = new HttpEntity<>(addFileMap, fileHeaders); + + LinkedHashMap links = (LinkedHashMap) createResponse.get("links"); + String addFileUrl = links.get("files") + "?access_token=" + this.environment.getProperty("zenodo.access_token"); + ResponseEntity addFileResponse = restTemplate.postForEntity(addFileUrl, addFileMapRequest, String.class); + Files.deleteIfExists(file.toPath()); + + // Third post call to Zenodo to publish the entry and return the DOI. + String publishUrl = links.get("publish") + "?access_token=" + this.environment.getProperty("zenodo.access_token"); + Map publishResponce = restTemplate.postForObject(publishUrl, "", Map.class); + + dmp.setDoi((String) publishResponce.get("conceptdoi")); + apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(dmp); + return (String) publishResponce.get("conceptdoi"); + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementProfileManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementProfileManager.java index 448478f6b..1355b9884 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementProfileManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementProfileManager.java @@ -1,25 +1,59 @@ package eu.eudat.logic.managers; +import com.jayway.jsonpath.DocumentContext; +import com.jayway.jsonpath.JsonPath; +import eu.eudat.data.dao.criteria.RequestItem; import eu.eudat.data.dao.entities.DMPProfileDao; import eu.eudat.data.entities.DMPProfile; import eu.eudat.data.query.items.item.dmpprofile.DataManagementPlanProfileCriteriaRequest; import eu.eudat.data.query.items.table.dmpprofile.DataManagementPlanProfileTableRequest; +import eu.eudat.logic.services.operations.DatabaseRepository; +import eu.eudat.logic.utilities.builders.XmlBuilder; +import eu.eudat.logic.utilities.documents.helpers.FileEnvelope; +import eu.eudat.logic.utilities.documents.xml.dmpXml.ExportXmlBuilderDmpProfile; +import eu.eudat.logic.utilities.documents.xml.dmpXml.ImportXmlBuilderDmpProfile; +import eu.eudat.models.data.entities.xmlmodels.dmpprofiledefinition.DmpProfileExternalAutoComplete; +import eu.eudat.models.data.entities.xmlmodels.dmpprofiledefinition.Field; +import eu.eudat.models.data.helpermodels.Tuple; +import eu.eudat.models.data.helpers.common.AutoCompleteLookupItem; import eu.eudat.models.data.helpers.common.DataTableData; import eu.eudat.models.data.listingmodels.DataManagementPlanProfileListingModel; import eu.eudat.models.data.security.Principal; import eu.eudat.queryable.QueryableList; import eu.eudat.logic.services.ApiContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; -import java.util.List; -import java.util.UUID; +import javax.activation.MimetypesFileTypeMap; +import javax.xml.xpath.*; +import java.io.*; +import java.nio.file.Files; +import java.util.*; import java.util.concurrent.CompletableFuture; +import org.springframework.http.*; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.multipart.MultipartFile; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + /** * Created by ikalyvas on 3/21/2018. */ +@Component public class DataManagementProfileManager { - public DataTableData getPaged(ApiContext apiContext, DataManagementPlanProfileTableRequest dataManagementPlanProfileTableRequest, Principal principal) throws Exception { + private ApiContext apiContext; + private DatabaseRepository databaseRepository; + + @Autowired + public DataManagementProfileManager(ApiContext apiContext) { + this.apiContext = apiContext; + this.databaseRepository = apiContext.getOperationsContext().getDatabaseRepository(); + } + + public DataTableData getPaged(DataManagementPlanProfileTableRequest dataManagementPlanProfileTableRequest, Principal principal) throws Exception { QueryableList items = apiContext.getOperationsContext().getDatabaseRepository().getDmpProfileDao().getWithCriteria(dataManagementPlanProfileTableRequest.getCriteria()); QueryableList pagedItems = PaginationManager.applyPaging(items, dataManagementPlanProfileTableRequest); @@ -38,21 +72,103 @@ public class DataManagementProfileManager { return dataTable; } - public DataManagementPlanProfileListingModel getSingle(DMPProfileDao dmpProfileDao, String id, Principal principal) throws InstantiationException, IllegalAccessException { - DMPProfile dmpProfile = dmpProfileDao.find(UUID.fromString(id)); + public DataManagementPlanProfileListingModel getSingle(String id, Principal principal) throws InstantiationException, IllegalAccessException { + DMPProfile dmpProfile = databaseRepository.getDmpProfileDao().find(UUID.fromString(id)); DataManagementPlanProfileListingModel dataManagementPlanProfileListingModel = new DataManagementPlanProfileListingModel(); dataManagementPlanProfileListingModel.fromDataModel(dmpProfile); return dataManagementPlanProfileListingModel; } - public List getWithCriteria(DMPProfileDao dmpProfileDao, DataManagementPlanProfileCriteriaRequest dataManagementPlanProfileCriteriaRequest) throws IllegalAccessException, InstantiationException { - QueryableList items = dmpProfileDao.getWithCriteria(dataManagementPlanProfileCriteriaRequest.getCriteria()); + public List getWithCriteria(DataManagementPlanProfileCriteriaRequest dataManagementPlanProfileCriteriaRequest) throws IllegalAccessException, InstantiationException { + QueryableList items = databaseRepository.getDmpProfileDao().getWithCriteria(dataManagementPlanProfileCriteriaRequest.getCriteria()); List datamanagementPlans = items.select(item -> new DataManagementPlanProfileListingModel().fromDataModel(item)); return datamanagementPlans; } - public static void createOrUpdate(ApiContext apiContext, DataManagementPlanProfileListingModel dataManagementPlanProfileListingModel, Principal principal) throws Exception { + public void createOrUpdate(DataManagementPlanProfileListingModel dataManagementPlanProfileListingModel, Principal principal) throws Exception { DMPProfile dmpProfile = dataManagementPlanProfileListingModel.toDataModel(); apiContext.getOperationsContext().getDatabaseRepository().getDmpProfileDao().createOrUpdate(dmpProfile); } + + public ResponseEntity getDocument(DataManagementPlanProfileListingModel dmpProfile, String label) throws IllegalAccessException, IOException, InstantiationException { + FileEnvelope envelope = getXmlDocument(dmpProfile, label); + InputStream resource = new FileInputStream(envelope.getFile()); + System.out.println("Mime Type of " + envelope.getFilename() + " is " + + new MimetypesFileTypeMap().getContentType(envelope.getFile())); + HttpHeaders responseHeaders = new HttpHeaders(); + responseHeaders.setContentLength(envelope.getFile().length()); + responseHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM); + responseHeaders.set("Content-Disposition", "attachment;filename=" + envelope.getFilename() + ".xml"); + responseHeaders.set("Access-Control-Expose-Headers", "Content-Disposition"); + responseHeaders.get("Access-Control-Expose-Headers").add("Content-Type"); + byte[] content = org.apache.poi.util.IOUtils.toByteArray(resource); + resource.close(); + Files.deleteIfExists(envelope.getFile().toPath()); + return new ResponseEntity<>(content, + responseHeaders, + HttpStatus.OK); + } + + public FileEnvelope getXmlDocument(DataManagementPlanProfileListingModel dmpProfile, String label) throws InstantiationException, IllegalAccessException, IOException { + ExportXmlBuilderDmpProfile xmlBuilder = new ExportXmlBuilderDmpProfile(); + File file = xmlBuilder.build(dmpProfile); + FileEnvelope fileEnvelope = new FileEnvelope(); + fileEnvelope.setFile(file); + fileEnvelope.setFilename(label); + return fileEnvelope; + } + + + public eu.eudat.logic.utilities.documents.xml.dmpXml.dmpProfileModel.DmpProfile createDmpProfileFromXml(MultipartFile multiPartFile) { + ImportXmlBuilderDmpProfile xmlBuilder = new ImportXmlBuilderDmpProfile(); + try { + return xmlBuilder.build(convert(multiPartFile)); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + private static File convert(MultipartFile file) throws IOException { + File convFile = new File(file.getOriginalFilename()); + convFile.createNewFile(); + FileOutputStream fos = new FileOutputStream(convFile); + fos.write(file.getBytes()); + fos.close(); + return convFile; + } + + public List> getExternalAutocomplete(RequestItem lookupItem) throws XPathExpressionException { + DMPProfile dmpProfile = this.apiContext.getOperationsContext().getDatabaseRepository().getDmpProfileDao().find(UUID.fromString(lookupItem.getCriteria().getProfileID())); + Field field = this.queryForField(dmpProfile.getDefinition(), lookupItem.getCriteria().getFieldID()); + DmpProfileExternalAutoComplete data = field.getExternalAutocomplete(); + return this.externalAutocompleteRequest(data, lookupItem.getCriteria().getLike()); + } + + private Field queryForField(String xml, String fieldId) throws XPathExpressionException { + Field field = new Field(); + Document document = XmlBuilder.fromXml(xml); + XPathFactory xpathFactory = XPathFactory.newInstance(); + XPath xpath = xpathFactory.newXPath(); + XPathExpression expr = xpath.compile("//field[@id='" + fieldId + "']"); + Element name = (Element) expr.evaluate(document, XPathConstants.NODE); + field.fromXml(name); + return field; + } + + private List> externalAutocompleteRequest(DmpProfileExternalAutoComplete data, String like) { + List> result = new LinkedList<>(); + RestTemplate restTemplate = new RestTemplate(); + HttpHeaders headers = new HttpHeaders(); + headers.setAccept(Collections.singletonList(MediaType.valueOf("application/vnd.api+json; charset=utf-8"))); + headers.setContentType(MediaType.APPLICATION_JSON); + HttpEntity entity = new HttpEntity<>("parameters", headers); + + ResponseEntity response = restTemplate.exchange(data.getUrl() + "?search=" + like, HttpMethod.GET, entity, Object.class); + DocumentContext jsonContext = JsonPath.parse(response.getBody()); + + List> jsonItems = jsonContext.read(data.getOptionsRoot() + "['" + data.getLabel() + "','" + data.getValue() + "']"); + jsonItems.forEach(item -> result.add(new Tuple<>(item.get(data.getValue()), item.get(data.getLabel())))); + return result; + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataRepositoryManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataRepositoryManager.java new file mode 100644 index 000000000..53d46bc1a --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataRepositoryManager.java @@ -0,0 +1,26 @@ +package eu.eudat.logic.managers; + +import eu.eudat.data.entities.DataRepository; +import eu.eudat.data.entities.Researcher; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.models.data.datarepository.DataRepositoryModel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * Created by ikalyvas on 9/3/2018. + */ +@Component +public class DataRepositoryManager { + private ApiContext apiContext; + + @Autowired + public DataRepositoryManager(ApiContext apiContext) { + this.apiContext = apiContext; + } + + public DataRepository create(eu.eudat.models.data.datarepository.DataRepositoryModel dataRepositoryModel) throws Exception { + DataRepository dataRepository = dataRepositoryModel.toDataModel(); + return apiContext.getOperationsContext().getDatabaseRepository().getDataRepositoryDao().createOrUpdate(dataRepository); + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java index 0e43a22ca..09845b06a 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java @@ -1,50 +1,110 @@ package eu.eudat.logic.managers; -import eu.eudat.logic.builders.entity.UserInfoBuilder; -import eu.eudat.data.dao.entities.*; +import eu.eudat.data.dao.criteria.*; +import eu.eudat.data.dao.entities.DataRepositoryDao; +import eu.eudat.data.dao.entities.DatasetDao; +import eu.eudat.data.dao.entities.RegistryDao; import eu.eudat.data.entities.*; +import eu.eudat.data.query.items.table.dataset.DatasetPublicTableRequest; +import eu.eudat.data.query.items.table.dataset.DatasetTableRequest; +import eu.eudat.data.query.items.table.datasetprofile.DatasetProfileTableRequestItem; +import eu.eudat.elastic.criteria.DatasetCriteria; +import eu.eudat.elastic.repository.DatasetRepository; +import eu.eudat.logic.builders.BuilderFactory; +import eu.eudat.logic.builders.entity.UserInfoBuilder; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.logic.services.forms.VisibilityRuleService; +import eu.eudat.logic.services.operations.DatabaseRepository; import eu.eudat.logic.utilities.documents.helpers.FileEnvelope; +import eu.eudat.logic.utilities.documents.types.ParagraphStyle; import eu.eudat.logic.utilities.documents.word.WordBuilder; import eu.eudat.logic.utilities.documents.xml.ExportXmlBuilder; import eu.eudat.models.HintedModelFactory; -import eu.eudat.data.dao.criteria.DataRepositoryCriteria; -import eu.eudat.data.dao.criteria.ExternalDatasetCriteria; -import eu.eudat.data.dao.criteria.RegistryCriteria; -import eu.eudat.data.dao.criteria.ServiceCriteria; -import eu.eudat.data.query.items.table.dataset.DatasetTableRequest; +import eu.eudat.models.data.datasetImport.DatasetImportField; +import eu.eudat.models.data.datasetImport.DatasetImportPagedDatasetProfile; +import eu.eudat.models.data.datasetprofile.DatasetProfileListingModel; import eu.eudat.models.data.datasetwizard.DatasetWizardModel; +import eu.eudat.models.data.dmp.AssociatedProfile; import eu.eudat.models.data.helpers.common.DataTableData; import eu.eudat.models.data.listingmodels.DatasetListingModel; import eu.eudat.models.data.security.Principal; import eu.eudat.models.data.user.composite.PagedDatasetProfile; import eu.eudat.queryable.QueryableList; -import eu.eudat.logic.services.ApiContext; -import eu.eudat.logic.services.forms.VisibilityRuleService; import org.apache.commons.io.IOUtils; +import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.core.io.FileSystemResource; import org.springframework.http.*; -import org.springframework.http.converter.ByteArrayHttpMessageConverter; +import org.springframework.stereotype.Component; import org.springframework.util.LinkedMultiValueMap; import org.springframework.web.client.RestTemplate; +import org.springframework.web.multipart.MultipartFile; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; +import javax.activation.MimetypesFileTypeMap; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Unmarshaller; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathFactory; +import java.io.*; +import java.math.BigInteger; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Paths; import java.util.*; import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; +import java.util.stream.Stream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; - +@Component public class DatasetManager { - public DataTableData getPaged(ApiContext apiContext, DatasetTableRequest datasetTableRequest, Principal principal) throws Exception { - UserInfo userInfo = apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class).id(principal.getId()).build(); - QueryableList items = apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().getWithCriteria(datasetTableRequest.getCriteria()).withHint(HintedModelFactory.getHint(DatasetListingModel.class)); - QueryableList authItems = apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().getAuthenticated(items, userInfo); + private ApiContext apiContext; + private DatabaseRepository databaseRepository; + private DatasetRepository datasetRepository; + private BuilderFactory builderFactory; + private UserManager userManager; + + @Autowired + public DatasetManager(ApiContext apiContext, UserManager userManager) { + this.apiContext = apiContext; + this.databaseRepository = apiContext.getOperationsContext().getDatabaseRepository(); + this.datasetRepository = apiContext.getOperationsContext().getDatasetRepository(); + this.builderFactory = apiContext.getOperationsContext().getBuilderFactory(); + this.userManager = userManager; + } + + public DataTableData getPaged(DatasetTableRequest datasetTableRequest, Principal principal) throws Exception { + DatasetCriteria datasetCriteria = new DatasetCriteria(); + datasetCriteria.setTags(datasetTableRequest.getCriteria().getTags()); + List datasets; + try { + datasets = datasetCriteria.getTags() != null && datasetCriteria.getTags().size() > 0 && datasetRepository.exists() ? + datasetRepository.query(datasetCriteria) : new LinkedList<>(); + } catch (Exception ex) { + datasets = null; + } + + UserInfo userInfo = builderFactory.getBuilder(UserInfoBuilder.class).id(principal.getId()).build(); + QueryableList items = databaseRepository.getDatasetDao().getWithCriteria(datasetTableRequest.getCriteria()).withHint(HintedModelFactory.getHint(DatasetListingModel.class)); + if (datasets != null && datasetTableRequest.getCriteria().getTags() != null && !datasetTableRequest.getCriteria().getTags().isEmpty()) { + if (!datasets.isEmpty()) { + List finalDatasets = datasets; + items.where((builder, root) -> root.get("id").in(finalDatasets.stream().map(x -> UUID.fromString(x.getId())).collect(Collectors.toList()))); + } else + items.where((builder, root) -> root.get("id").in(new UUID[]{UUID.randomUUID()})); + } + QueryableList authItems = databaseRepository.getDatasetDao().getAuthenticated(items, userInfo); QueryableList pagedItems = PaginationManager.applyPaging(authItems, datasetTableRequest); DataTableData dataTable = new DataTableData(); @@ -62,20 +122,109 @@ public class DatasetManager { return dataTable; } - public DatasetWizardModel getSingle(DatasetDao datatasetRepository, String id) throws InstantiationException, IllegalAccessException { + public DataTableData getPaged(DatasetPublicTableRequest datasetTableRequest, Principal principal) throws Exception { + DatasetCriteria datasetCriteria = new DatasetCriteria(); + datasetCriteria.setTags(datasetTableRequest.getCriteria().getTags()); + List datasets; + try { + datasets = datasetCriteria.getTags() != null && datasetCriteria.getTags().size() > 0 && datasetRepository.exists() ? + datasetRepository.query(datasetCriteria) : new LinkedList<>(); + } catch (Exception ex) { + datasets = null; + } + datasetTableRequest.setQuery(databaseRepository.getDatasetDao().asQueryable().withHint(HintedModelFactory.getHint(DatasetListingModel.class))); + QueryableList items = datasetTableRequest.applyCriteria(); + if (datasets != null && datasetTableRequest.getCriteria().getTags() != null && !datasetTableRequest.getCriteria().getTags().isEmpty()) { + if (!datasets.isEmpty()) { + List finalDatasets = datasets; + items.where((builder, root) -> root.get("id").in(finalDatasets.stream().map(x -> UUID.fromString(x.getId())).collect(Collectors.toList()))); + } else + items.where((builder, root) -> root.get("id").in(new UUID[]{UUID.randomUUID()})); + } + QueryableList pagedItems = PaginationManager.applyPaging(items, datasetTableRequest); + DataTableData dataTable = new DataTableData<>(); + + CompletableFuture> itemsFuture = pagedItems. + selectAsync(item -> new DatasetListingModel().fromDataModel(item)).whenComplete((resultList, throwable) -> { + dataTable.setData(resultList); + }); + + CompletableFuture countFuture = pagedItems.countAsync().whenComplete((count, throwable) -> { + dataTable.setTotalCount(count); + }); + + CompletableFuture.allOf(itemsFuture, countFuture).join(); + return dataTable; + } + + public DatasetWizardModel getSingle(String id) throws InstantiationException, IllegalAccessException, IOException { DatasetWizardModel dataset = new DatasetWizardModel(); - eu.eudat.data.entities.Dataset datasetEntity = datatasetRepository.find(UUID.fromString(id), HintedModelFactory.getHint(DatasetWizardModel.class)); + eu.eudat.data.entities.Dataset datasetEntity = databaseRepository.getDatasetDao().find(UUID.fromString(id), HintedModelFactory.getHint(DatasetWizardModel.class)); + eu.eudat.elastic.entities.Dataset datasetElastic; + try { + datasetElastic = datasetRepository.exists() ? + datasetRepository.findDocument(id) : new eu.eudat.elastic.entities.Dataset(); + } catch (Exception ex) { + datasetElastic = new eu.eudat.elastic.entities.Dataset(); + } dataset.setDatasetProfileDefinition(getPagedProfile(dataset, datasetEntity)); dataset.fromDataModel(datasetEntity); + + // Creates the Criteria to get all version of DatasetProfile in question. + DatasetProfileCriteria profileCriteria = new DatasetProfileCriteria(); + UUID profileId = datasetEntity.getProfile().getGroupId(); + List uuidList = new LinkedList<>(); + uuidList.add(profileId); + profileCriteria.setGroupIds(uuidList); + profileCriteria.setAllVersions(true); + + List profileVersions = databaseRepository.getDatasetProfileDao().getWithCriteria(profileCriteria) + .orderBy(((builder, root) -> builder.desc(root.get("version")))) + .toList(); + List profileVersionsIncluded = new LinkedList<>(); + + // Iterate through the versions and remove those that are not included in the DMP of the dataset in question. + for (DatasetProfile version : profileVersions) { + for (AssociatedProfile p : dataset.getDmp().getProfiles()) { + if (version.getId().toString().equals(p.getId().toString())) { + profileVersionsIncluded.add(version); + } + } + } + + // Sort the list with the included Versions. + Stream sorted = profileVersionsIncluded.stream().sorted(Comparator.comparing(DatasetProfile::getVersion).reversed()); + + // Make the Stream into List and get the first item. + DatasetProfile profile = sorted.collect(Collectors.toList()).iterator().next(); + + // Check if the dataset is on the latest Version. + boolean latestVersion = profile.getVersion().toString().equals(datasetEntity.getProfile().getVersion().toString()); + dataset.setIsProfileLatestVersion(latestVersion); + + dataset.setTags(datasetElastic.getTags()); return dataset; } - private PagedDatasetProfile getPagedProfile(DatasetWizardModel dataset, eu.eudat.data.entities.Dataset datasetEntity) { - eu.eudat.models.data.user.composite.DatasetProfile datasetprofile = UserManager.generateDatasetProfileModel(datasetEntity.getProfile()); + public DatasetWizardModel getSinglePublic(String id) throws Exception { + DatasetWizardModel dataset = new DatasetWizardModel(); + eu.eudat.data.entities.Dataset datasetEntity = databaseRepository.getDatasetDao().isPublicDataset(UUID.fromString(id)); + + if (datasetEntity != null && datasetEntity.getStatus() == 1 && datasetEntity.getDmp().getStatus() == 1) { + dataset.setDatasetProfileDefinition(getPagedProfile(dataset, datasetEntity)); + dataset.fromDataModel(datasetEntity); + return dataset; + } else { + throw new Exception("Selected dataset is not public"); + } + } + + public PagedDatasetProfile getPagedProfile(DatasetWizardModel dataset, eu.eudat.data.entities.Dataset datasetEntity) { + eu.eudat.models.data.user.composite.DatasetProfile datasetprofile = userManager.generateDatasetProfileModel(datasetEntity.getProfile()); datasetprofile.setStatus(dataset.getStatus()); if (datasetEntity.getProperties() != null) { JSONObject jobject = new JSONObject(datasetEntity.getProperties()); - Map properties = (Map) jobject.toMap(); + Map properties = jobject.toMap(); datasetprofile.fromJsonObject(properties); } PagedDatasetProfile pagedDatasetProfile = new PagedDatasetProfile(); @@ -83,10 +232,14 @@ public class DatasetManager { return pagedDatasetProfile; } - public File getWordDocument(DatasetDao datatasetRepository, String id, VisibilityRuleService visibilityRuleService) throws InstantiationException, IllegalAccessException, IOException { + public File getWordDocument(Environment environment, String id, VisibilityRuleService visibilityRuleService) throws InstantiationException, IllegalAccessException, IOException { WordBuilder wordBuilder = new WordBuilder(); DatasetWizardModel dataset = new DatasetWizardModel(); - eu.eudat.data.entities.Dataset datasetEntity = datatasetRepository.find(UUID.fromString(id), HintedModelFactory.getHint(DatasetWizardModel.class)); + String fileUrl = environment.getProperty("configuration.h2020template"); + InputStream is = new URL(Paths.get(fileUrl).toUri().toURL().toString()).openStream(); + XWPFDocument document = new XWPFDocument(is); + eu.eudat.data.entities.Dataset datasetEntity = databaseRepository.getDatasetDao().find(UUID.fromString(id), HintedModelFactory.getHint(DatasetWizardModel.class)); + wordBuilder.addParagraphContent(datasetEntity.getLabel(), document, ParagraphStyle.TITLE, BigInteger.ZERO); Map properties = new HashMap<>(); if (datasetEntity.getProperties() != null) { JSONObject jobject = new JSONObject(datasetEntity.getProperties()); @@ -95,14 +248,19 @@ public class DatasetManager { PagedDatasetProfile pagedDatasetProfile = getPagedProfile(dataset, datasetEntity); visibilityRuleService.setProperties(properties); visibilityRuleService.buildVisibilityContext(pagedDatasetProfile.getRules()); - File file = wordBuilder.build(pagedDatasetProfile, datasetEntity.getLabel(), visibilityRuleService); - return file; + wordBuilder.build(document, pagedDatasetProfile, visibilityRuleService); + String label = datasetEntity.getLabel().replaceAll("[^a-zA-Z0-9+ ]", ""); + File exportFile = new File(label + ".docx"); + FileOutputStream out = new FileOutputStream(exportFile); + document.write(out); + out.close(); + return exportFile; } - public FileEnvelope getXmlDocument(DatasetDao datatasetRepository, String id, VisibilityRuleService visibilityRuleService) throws InstantiationException, IllegalAccessException, IOException { + public FileEnvelope getXmlDocument(String id, VisibilityRuleService visibilityRuleService) throws InstantiationException, IllegalAccessException, IOException { ExportXmlBuilder xmlBuilder = new ExportXmlBuilder(); DatasetWizardModel dataset = new DatasetWizardModel(); - eu.eudat.data.entities.Dataset datasetEntity = datatasetRepository.find(UUID.fromString(id), HintedModelFactory.getHint(DatasetWizardModel.class)); + eu.eudat.data.entities.Dataset datasetEntity = databaseRepository.getDatasetDao().find(UUID.fromString(id), HintedModelFactory.getHint(DatasetWizardModel.class)); Map properties = new HashMap<>(); if (datasetEntity.getProperties() != null) { JSONObject jobject = new JSONObject(datasetEntity.getProperties()); @@ -111,7 +269,7 @@ public class DatasetManager { PagedDatasetProfile pagedDatasetProfile = getPagedProfile(dataset, datasetEntity); visibilityRuleService.setProperties(properties); visibilityRuleService.buildVisibilityContext(pagedDatasetProfile.getRules()); - File file = xmlBuilder.build(pagedDatasetProfile, visibilityRuleService); + File file = xmlBuilder.build(pagedDatasetProfile, datasetEntity.getProfile().getId(), visibilityRuleService); FileEnvelope fileEnvelope = new FileEnvelope(); fileEnvelope.setFile(file); fileEnvelope.setFilename(datasetEntity.getLabel()); @@ -120,41 +278,26 @@ public class DatasetManager { public File convertToPDF(File file, Environment environment, String label) throws IOException, InterruptedException { LinkedMultiValueMap map = new LinkedMultiValueMap<>(); - map.add("file", new FileSystemResource(file)); + map.add("files", new FileSystemResource(file)); + map.add("filename", label + ".pdf"); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.MULTIPART_FORM_DATA); + headers.add("Content-disposition", "attachment; filename=" + label + ".pdf"); + headers.add("Content-type", "application/pdf"); HttpEntity> requestEntity = new HttpEntity>( map, headers); - Map queueResult = new RestTemplate().postForObject( - environment.getProperty("pdf.converter.url") + - "api/v1/", requestEntity, Map.class); - Map mediaResult = new RestTemplate().getForObject(environment.getProperty("pdf.converter.url") + - "/api/v1/" + queueResult.get("id"), Map.class); - System.out.println("Status: " + mediaResult.get("status")); - while (!mediaResult.get("status").equals("finished")) { - Thread.sleep(500); - mediaResult = new RestTemplate().getForObject(environment.getProperty("pdf.converter.url") + - "api/v1/" + queueResult.get("id"), Map.class); - System.out.println("Polling"); - } - RestTemplate restTemplate = new RestTemplate(); - restTemplate.getMessageConverters().add(new ByteArrayHttpMessageConverter()); - HttpHeaders headers2 = new HttpHeaders(); - headers.setAccept(Arrays.asList(MediaType.APPLICATION_OCTET_STREAM)); - HttpEntity entity = new HttpEntity(headers2); + byte[] queueResult = new RestTemplate().postForObject(environment.getProperty("pdf.converter.url") + "convert/office" + , requestEntity, byte[].class); - ResponseEntity response = restTemplate.exchange(environment.getProperty("pdf.converter.url") + - mediaResult.get("result_url"), HttpMethod.GET, entity, byte[].class, "1"); + File resultPdf = new File(label + ".pdf"); + FileOutputStream output = new FileOutputStream(resultPdf); + IOUtils.write(queueResult, output); + output.close(); + Files.deleteIfExists(file.toPath()); - UUID uuid = UUID.randomUUID(); - File zip = new File(uuid + ".zip"); - if (response.getStatusCode().equals(HttpStatus.OK)) { - FileOutputStream output = new FileOutputStream(zip); - IOUtils.write(response.getBody(), output); - } - return extractFromZip(zip, label + ".pdf"); + return resultPdf; } private File extractFromZip(File file, String filename) throws IOException { @@ -180,19 +323,50 @@ public class DatasetManager { return newFile; } - public static eu.eudat.data.entities.Dataset createOrUpdate(ApiContext apiContext, DatasetWizardModel profile, Principal principal) throws Exception { - eu.eudat.data.entities.Dataset dataset = profile.toDataModel(); - propertiesModelToString(profile, dataset); + public eu.eudat.data.entities.Dataset createOrUpdate(DatasetWizardModel datasetWizardModel, Principal principal) throws Exception { + DMP dmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().find(datasetWizardModel.getDmp().getId()); + if (dmp.getStatus().equals(DMP.DMPStatus.FINALISED.getValue()) && datasetWizardModel.getId() != null) + throw new Exception("DMP is finalized, therefore Dataset cannot be edited."); + eu.eudat.data.entities.Dataset dataset = datasetWizardModel.toDataModel(); + dataset.setDmp(dmp); + propertiesModelToString(datasetWizardModel, dataset); + if (datasetWizardModel.getStatus() == (int) Dataset.Status.FINALISED.getValue()) + checkDatasetValidation(dataset); UserInfo userInfo = apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class).id(principal.getId()).build(); dataset.setCreator(userInfo); + updateTags(apiContext.getOperationsContext().getDatasetRepository(), datasetWizardModel); createRegistriesIfTheyDontExist(apiContext.getOperationsContext().getDatabaseRepository().getRegistryDao(), dataset); createDataRepositoriesIfTheyDontExist(apiContext.getOperationsContext().getDatabaseRepository().getDataRepositoryDao(), dataset); - createServicesIfTheyDontExist(apiContext.getOperationsContext().getDatabaseRepository().getDatasetServiceDao(),apiContext.getOperationsContext().getDatabaseRepository().getServiceDao(), dataset); - createExternalDatasetsIfTheyDontExist(apiContext.getOperationsContext().getDatabaseRepository().getDatasetExternalDatasetDao(),apiContext.getOperationsContext().getDatabaseRepository().getExternalDatasetDao(), dataset); + createServicesIfTheyDontExist(dataset); + createExternalDatasetsIfTheyDontExist(dataset); return apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().createOrUpdate(dataset); } - private static void propertiesModelToString(DatasetWizardModel datasetWizardModel, eu.eudat.data.entities.Dataset dataset) { + private void checkDatasetValidation(Dataset dataset) throws Exception { + List datasetProfileValidators = new LinkedList<>(); + DatasetProfile profile = apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(dataset.getProfile().getId()); + DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = builderFactory.newDocumentBuilder(); + Document xmlDocument = builder.parse(new ByteArrayInputStream(profile.getDefinition().getBytes())); + + XPath xPath = XPathFactory.newInstance().newXPath(); + String expression = "//validation/@type[.=1]/ancestor::field/@id"; + NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(xmlDocument, XPathConstants.NODESET); + + for (int i = 0; i < nodeList.getLength(); i++) { + Node node = nodeList.item(i); + datasetProfileValidators.add(node.getNodeValue()); + } + + JSONObject obj = new JSONObject(dataset.getProperties()); + for (String validator : datasetProfileValidators) { + if (obj.getString(validator) == null || obj.getString(validator).trim().isEmpty()) { + throw new Exception("Field value of " + validator + " must be filled."); + } + } + } + + private void propertiesModelToString(DatasetWizardModel datasetWizardModel, eu.eudat.data.entities.Dataset dataset) { Map values = new HashMap(); PagedDatasetProfile properties = datasetWizardModel.getDatasetProfileDefinition(); properties.toMap(values); @@ -200,20 +374,31 @@ public class DatasetManager { dataset.setProperties(jobject.toString()); } + private void updateTags(DatasetRepository datasetRepository, DatasetWizardModel datasetWizardModel) throws IOException { + if (datasetWizardModel.getTags() != null && !datasetWizardModel.getTags().isEmpty()) { + eu.eudat.elastic.entities.Dataset dataset = new eu.eudat.elastic.entities.Dataset(); + dataset.setId(datasetWizardModel.getId().toString()); + dataset.setTags(datasetWizardModel.getTags()); + datasetRepository.createOrUpdate(dataset); + } + } - private static void createRegistriesIfTheyDontExist(RegistryDao registryDao, eu.eudat.data.entities.Dataset dataset) { + private void createRegistriesIfTheyDontExist(RegistryDao registryDao, eu.eudat.data.entities.Dataset dataset) { if (dataset.getRegistries() != null && !dataset.getRegistries().isEmpty()) { for (eu.eudat.data.entities.Registry registry : dataset.getRegistries()) { RegistryCriteria criteria = new RegistryCriteria(); criteria.setLike(registry.getReference()); List entries = registryDao.getWithCriteria(criteria).toList(); if (entries != null && !entries.isEmpty()) registry.setId(entries.get(0).getId()); - else registry = registryDao.createOrUpdate(registry); + else { + registry.setCreated(new Date()); + registryDao.createOrUpdate(registry); + } } } } - private static void createDataRepositoriesIfTheyDontExist(DataRepositoryDao dataRepositoryDao, eu.eudat.data.entities.Dataset dataset) { + private void createDataRepositoriesIfTheyDontExist(DataRepositoryDao dataRepositoryDao, eu.eudat.data.entities.Dataset dataset) { Set datasetDataRepositories = dataset.getDatasetDataRepositories(); dataset.setDatasetDataRepositories(new HashSet<>()); @@ -226,8 +411,8 @@ public class DatasetManager { datasetDataRepository.getDataRepository().setId(entries.get(0).getId()); datasetDataRepository.setDataset(dataset); dataset.getDatasetDataRepositories().add(datasetDataRepository); - } - else { + } else { + //datasetDataRepository.getDataRepository().setId(UUID.randomUUID()); DataRepository dataRepository = dataRepositoryDao.createOrUpdate(datasetDataRepository.getDataRepository()); datasetDataRepository.setDataRepository(dataRepository); dataset.getDatasetDataRepositories().add(datasetDataRepository); @@ -236,43 +421,43 @@ public class DatasetManager { } } - private static void createServicesIfTheyDontExist(DatasetServiceDao datasetServiceDao,ServiceDao serviceDao, eu.eudat.data.entities.Dataset dataset) { + private void createServicesIfTheyDontExist(eu.eudat.data.entities.Dataset dataset) { Set services = dataset.getServices(); dataset.setServices(new HashSet<>()); if (services != null && !services.isEmpty()) { for (eu.eudat.data.entities.DatasetService datasetService : services) { ServiceCriteria criteria = new ServiceCriteria(); criteria.setLike(datasetService.getService().getLabel()); - List entries = serviceDao.getWithCriteria(criteria).toList(); - if (entries != null && !entries.isEmpty()){ + List entries = databaseRepository.getServiceDao().getWithCriteria(criteria).toList(); + if (entries != null && !entries.isEmpty()) { datasetService.getService().setId(entries.get(0).getId()); datasetService.setDataset(dataset); dataset.getServices().add(datasetService); - } - else { - Service service = serviceDao.createOrUpdate(datasetService.getService()); - datasetService.setService(service ); + } else { + datasetService.getService().setCreated(new Date()); + Service service = databaseRepository.getServiceDao().createOrUpdate(datasetService.getService()); + datasetService.setService(service); + datasetService.setDataset(dataset); dataset.getServices().add(datasetService); } } } } - private static void createExternalDatasetsIfTheyDontExist(DatasetExternalDatasetDao datasetExternalDatasetDao,ExternalDatasetDao externalDatasetDao, eu.eudat.data.entities.Dataset dataset) { + private void createExternalDatasetsIfTheyDontExist(eu.eudat.data.entities.Dataset dataset) { Set externalDatasets = dataset.getDatasetExternalDatasets(); dataset.setDatasetExternalDatasets(new HashSet<>()); if (externalDatasets != null && !externalDatasets.isEmpty()) { for (eu.eudat.data.entities.DatasetExternalDataset datasetExternalDataset : externalDatasets) { ExternalDatasetCriteria criteria = new ExternalDatasetCriteria(); criteria.setLike(datasetExternalDataset.getExternalDataset().getLabel()); - List entries = externalDatasetDao.getWithCriteria(criteria).toList(); + List entries = databaseRepository.getExternalDatasetDao().getWithCriteria(criteria).toList(); if (entries != null && !entries.isEmpty()) { datasetExternalDataset.getExternalDataset().setId(entries.get(0).getId()); datasetExternalDataset.setDataset(dataset); dataset.getDatasetExternalDatasets().add(datasetExternalDataset); - } - else { - ExternalDataset externalDataset = externalDatasetDao.createOrUpdate(datasetExternalDataset.getExternalDataset()); + } else { + ExternalDataset externalDataset = databaseRepository.getExternalDatasetDao().createOrUpdate(datasetExternalDataset.getExternalDataset()); datasetExternalDataset.setExternalDataset(externalDataset); dataset.getDatasetExternalDatasets().add(datasetExternalDataset); } @@ -280,12 +465,164 @@ public class DatasetManager { } } - public static void makePublic(DatasetDao datasetDao, UUID id) throws Exception { + public void makePublic(DatasetDao datasetDao, UUID id) throws Exception { eu.eudat.data.entities.Dataset dataset = datasetDao.find(id); if (dataset.getStatus() != eu.eudat.data.entities.Dataset.Status.FINALISED.getValue()) throw new Exception("You cannot make public a Dataset That Has not Been Finalised"); - dataset.setPublic(true); datasetDao.createOrUpdate(dataset); } + public ResponseEntity getDocument(String id, VisibilityRuleService visibilityRuleService, String contentType) throws IllegalAccessException, IOException, InstantiationException { + FileEnvelope envelope = getXmlDocument(id, visibilityRuleService); + InputStream resource = new FileInputStream(envelope.getFile()); + System.out.println("Mime Type of " + envelope.getFilename() + " is " + + new MimetypesFileTypeMap().getContentType(envelope.getFile())); + HttpHeaders responseHeaders = new HttpHeaders(); + responseHeaders.setContentLength(envelope.getFile().length()); + responseHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM); + responseHeaders.set("Content-Disposition", "attachment;filename=" + envelope.getFilename() + ".xml"); + responseHeaders.set("Access-Control-Expose-Headers", "Content-Disposition"); + responseHeaders.get("Access-Control-Expose-Headers").add("Content-Type"); + + byte[] content = org.apache.poi.util.IOUtils.toByteArray(resource); + resource.close(); + Files.deleteIfExists(envelope.getFile().toPath()); + + return new ResponseEntity<>(content, + responseHeaders, + HttpStatus.OK); + } + + public eu.eudat.data.entities.Dataset createDatasetFromXml(MultipartFile importFile, String dmpId, String datasetProfileId, Principal principal) throws JAXBException, IOException { + DatasetImportPagedDatasetProfile importModel = new DatasetImportPagedDatasetProfile(); + JAXBContext jaxbContext; + + // Parses XML into DatasetImport Model. + try { + InputStream in = importFile.getInputStream(); + jaxbContext = JAXBContext.newInstance(DatasetImportPagedDatasetProfile.class); + Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); + DatasetImportPagedDatasetProfile datasetImport = (DatasetImportPagedDatasetProfile) jaxbUnmarshaller.unmarshal(in); + importModel = datasetImport; + } catch (IOException e) { + e.printStackTrace(); + } + + // Checks if XML datasetProfileId GroupId matches the one selected. + try { + eu.eudat.data.entities.DatasetProfile importDatasetProfile = databaseRepository.getDatasetProfileDao().find(UUID.fromString(importModel.getDatasetProfileId())); + eu.eudat.data.entities.DatasetProfile latestVersionDatasetProfile = databaseRepository.getDatasetProfileDao().find(UUID.fromString(datasetProfileId)); + if (latestVersionDatasetProfile.getGroupId() != importDatasetProfile.getGroupId()) { + throw new Exception(); + } + } catch (Exception e) { + e.printStackTrace(); + return null; + } + + // Creates the Hash Map to place the values of the data set. + Map importMap = importModel.getPages().stream() + .flatMap(s -> s.getSections().getSection().stream() + .flatMap(cFields -> cFields.getCompositeFields().stream() + .flatMap(cField -> cField.getCompositeField().stream() + .filter(Objects::nonNull) + .flatMap(fields -> fields.getFields().stream() + .flatMap(field -> field.getField().stream() + .filter(f -> f.getValue() != null) + ))))) + .collect(Collectors.toMap(DatasetImportField::getId, DatasetImportField::getValue)); + + // Transforms map into json file. + JSONObject jsonDatasetProperties = new JSONObject(importMap); + + // Creates the entity data set to save. + eu.eudat.data.entities.Dataset entity = new Dataset(); + entity.setProperties(jsonDatasetProperties.toString()); + entity.setLabel(importFile.getOriginalFilename()); + DMP dmp = new DMP(); + dmp.setId(UUID.fromString(dmpId)); + entity.setDmp(dmp); + entity.setStatus((short) 0); + entity.setCreated(new Date()); + entity.setModified(new Date()); + DatasetProfile profile = new DatasetProfile(); + profile.setId(UUID.fromString(datasetProfileId)); + entity.setProfile(profile); + + UserInfo userInfo = apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class).id(principal.getId()).build(); + entity.setCreator(userInfo); + + updateTagsXmlImportDataset(apiContext.getOperationsContext().getDatasetRepository(), entity); + createRegistriesIfTheyDontExist(apiContext.getOperationsContext().getDatabaseRepository().getRegistryDao(), entity); + createDataRepositoriesIfTheyDontExist(apiContext.getOperationsContext().getDatabaseRepository().getDataRepositoryDao(), entity); + createServicesIfTheyDontExist(entity); + createExternalDatasetsIfTheyDontExist(entity); + + return apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().createOrUpdate(entity); + } + + public void updateTagsXmlImportDataset(DatasetRepository datasetRepository, Dataset dataset) throws IOException { + // TODO: When tags functionality return. + } + + public DatasetWizardModel datasetUpdateProfile(String id) { + DatasetWizardModel dataset = new DatasetWizardModel(); + eu.eudat.data.entities.Dataset datasetEntity = databaseRepository.getDatasetDao().find(UUID.fromString(id), HintedModelFactory.getHint(DatasetWizardModel.class)); + eu.eudat.elastic.entities.Dataset datasetElastic; + try { + datasetElastic = datasetRepository.exists() ? + datasetRepository.findDocument(id) : new eu.eudat.elastic.entities.Dataset(); + } catch (Exception ex) { + datasetElastic = new eu.eudat.elastic.entities.Dataset(); + } + dataset.setDatasetProfileDefinition(getPagedProfile(dataset, datasetEntity)); + dataset.fromDataModel(datasetEntity); + + // Creates the Criteria to get all version of DatasetProfile in question. + DatasetProfileCriteria profileCriteria = new DatasetProfileCriteria(); + UUID profileId = datasetEntity.getProfile().getGroupId(); + List uuidList = new LinkedList<>(); + uuidList.add(profileId); + profileCriteria.setGroupIds(uuidList); + + // Gets the latest version of the datasetProfile. + eu.eudat.data.entities.DatasetProfile item = databaseRepository.getDatasetProfileDao().getWithCriteria(profileCriteria).getSingle(); + + // Sets the latest version of dataet Profile to the Dataset in question. + dataset.setDatasetProfileDefinition(getLatestDatasetProfile(datasetEntity, item)); + dataset.setProfile(item.getId()); + + // Now at latest version. + dataset.setIsProfileLatestVersion(true); + + dataset.setTags(datasetElastic.getTags()); + return dataset; + } + + public PagedDatasetProfile getLatestDatasetProfile(Dataset datasetEntity, DatasetProfile profile) { + eu.eudat.models.data.user.composite.DatasetProfile datasetprofile = userManager.generateDatasetProfileModel(profile); + datasetprofile.setStatus(datasetEntity.getStatus()); + if (datasetEntity.getProperties() != null) { + JSONObject jobject = new JSONObject(datasetEntity.getProperties()); + Map properties = jobject.toMap(); + datasetprofile.fromJsonObject(properties); + } + PagedDatasetProfile pagedDatasetProfile = new PagedDatasetProfile(); + pagedDatasetProfile.buildPagedDatasetProfile(datasetprofile); + return pagedDatasetProfile; + } + + public DataTableData getDatasetProfilesUsedByDatasets(DatasetProfileTableRequestItem datasetProfileTableRequestItem, Principal principal) { + datasetProfileTableRequestItem.getCriteria().setFilter(DatasetProfileCriteria.DatasetProfileFilter.Datasets.getValue()); + datasetProfileTableRequestItem.getCriteria().setUserId(principal.getId()); + + QueryableList items = apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().getWithCriteria(datasetProfileTableRequestItem.getCriteria()); + List listingModels = items.select(item -> new DatasetProfileListingModel().fromDataModel(item)); + + DataTableData data = new DataTableData<>(); + data.setData(listingModels); + data.setTotalCount((long) listingModels.size()); + + return data; + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java index a46f25c5f..32888ab1e 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetProfileManager.java @@ -2,54 +2,93 @@ package eu.eudat.logic.managers; import com.jayway.jsonpath.DocumentContext; import com.jayway.jsonpath.JsonPath; -import eu.eudat.logic.builders.model.models.DataTableDataBuilder; -import eu.eudat.data.dao.entities.DatasetProfileDao; +import eu.eudat.data.dao.criteria.DatasetProfileCriteria; import eu.eudat.data.entities.DatasetProfile; import eu.eudat.data.query.items.item.datasetprofile.DatasetProfileAutocompleteRequest; import eu.eudat.data.query.items.table.datasetprofile.DatasetProfileTableRequestItem; +import eu.eudat.exceptions.datasetprofile.DatasetProfileNewVersionException; +import eu.eudat.logic.builders.model.models.DataTableDataBuilder; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.logic.services.operations.DatabaseRepository; +import eu.eudat.logic.utilities.builders.XmlBuilder; +import eu.eudat.logic.utilities.documents.helpers.FileEnvelope; +import eu.eudat.logic.utilities.documents.xml.datasetProfileXml.ExportXmlBuilderDatasetProfile; +import eu.eudat.logic.utilities.documents.xml.datasetProfileXml.ImportXmlBuilderDatasetProfile; import eu.eudat.models.data.components.commons.datafield.AutoCompleteData; import eu.eudat.models.data.datasetprofile.DatasetProfileAutocompleteItem; import eu.eudat.models.data.datasetprofile.DatasetProfileListingModel; import eu.eudat.models.data.entities.xmlmodels.datasetprofiledefinition.Field; +import eu.eudat.models.data.externaldataset.ExternalAutocompleteFieldModel; import eu.eudat.models.data.helpermodels.Tuple; import eu.eudat.models.data.helpers.common.DataTableData; +import eu.eudat.models.data.security.Principal; import eu.eudat.queryable.QueryableList; -import eu.eudat.logic.services.ApiContext; -import eu.eudat.logic.utilities.builders.XmlBuilder; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.*; +import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; +import org.springframework.web.multipart.MultipartFile; import org.w3c.dom.Document; import org.w3c.dom.Element; +import javax.activation.MimetypesFileTypeMap; import javax.xml.xpath.*; -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; +import java.io.IOException; +import java.nio.file.Files; +import java.util.*; + +import java.io.*; +@Component public class DatasetProfileManager { - public static List getWithCriteria(DatasetProfileDao datasetProfileRepository, DatasetProfileAutocompleteRequest datasetProfileAutocompleteRequest) throws IllegalAccessException, InstantiationException { - QueryableList items = datasetProfileRepository.getWithCriteria(datasetProfileAutocompleteRequest.getCriteria()); + private ApiContext apiContext; + private DatabaseRepository databaseRepository; + @Autowired + public DatasetProfileManager(ApiContext apiContext) { + this.apiContext = apiContext; + this.databaseRepository = apiContext.getOperationsContext().getDatabaseRepository(); + } + + public eu.eudat.models.data.admin.composite.DatasetProfile getDatasetProfile(String id) { + eu.eudat.data.entities.DatasetProfile profile = apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(UUID.fromString(id)); + eu.eudat.models.data.admin.composite.DatasetProfile datasetprofile = AdminManager.generateDatasetProfileModel(profile); + datasetprofile.setLabel(profile.getLabel()); + datasetprofile.setStatus(profile.getStatus()); + datasetprofile.setDescription(profile.getDescription()); + + return datasetprofile; + } + + public List getWithCriteria(DatasetProfileAutocompleteRequest datasetProfileAutocompleteRequest) throws IllegalAccessException, InstantiationException { + QueryableList items = databaseRepository.getDatasetProfileDao().getWithCriteria(datasetProfileAutocompleteRequest.getCriteria()); List datasetProfiles = items.select(item -> new DatasetProfileAutocompleteItem().fromDataModel(item)); return datasetProfiles; } - public static DataTableData getPaged(ApiContext apiContext, DatasetProfileTableRequestItem datasetProfileTableRequestItem) throws Exception { + public DatasetProfile clone(String id) { + DatasetProfile profile = apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(UUID.fromString(id)); + apiContext.getOperationsContext().getDatabaseRepository().detachEntity(profile); + profile.setId(null); + return profile; + } + + public DataTableData getPaged(DatasetProfileTableRequestItem datasetProfileTableRequestItem) throws Exception { QueryableList items = apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().getWithCriteria(datasetProfileTableRequestItem.getCriteria()); QueryableList pagedItems = PaginationManager.applyPaging(items, datasetProfileTableRequestItem); List datasetProfiles = pagedItems.select(item -> new DatasetProfileListingModel().fromDataModel(item)); return apiContext.getOperationsContext().getBuilderFactory().getBuilder(DataTableDataBuilder.class).data(datasetProfiles).totalCount(items.count()).build(); } - public static List getAll(DatasetProfileDao datasetProfileRepository) throws IllegalAccessException, InstantiationException { - QueryableList items = datasetProfileRepository.getAll(); + public List getAll() throws IllegalAccessException, InstantiationException { + DatasetProfileCriteria criteria = new DatasetProfileCriteria(); + QueryableList items = databaseRepository.getDatasetProfileDao().getWithCriteria(criteria); List datasetProfiles = items.select(item -> new DatasetProfileListingModel().fromDataModel(item)); return datasetProfiles; } - public static eu.eudat.models.data.entities.xmlmodels.datasetprofiledefinition.Field queryForField(String xml, String fieldId) throws XPathExpressionException { + public eu.eudat.models.data.entities.xmlmodels.datasetprofiledefinition.Field queryForField(String xml, String fieldId) throws XPathExpressionException { eu.eudat.models.data.entities.xmlmodels.datasetprofiledefinition.Field field = new Field(); Document document = XmlBuilder.fromXml(xml); XPathFactory xpathFactory = XPathFactory.newInstance(); @@ -61,8 +100,8 @@ public class DatasetProfileManager { return field; } - public static List> getAutocomplete(AutoCompleteData data, String like) { - List> result = new LinkedList<>(); + public List getAutocomplete(AutoCompleteData data, String like) { + List result = new LinkedList<>(); RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setAccept(Collections.singletonList(MediaType.valueOf("application/vnd.api+json; charset=utf-8"))); @@ -72,9 +111,84 @@ public class DatasetProfileManager { ResponseEntity response = restTemplate.exchange(data.getUrl() + "?search=" + like, HttpMethod.GET, entity, Object.class); DocumentContext jsonContext = JsonPath.parse(response.getBody()); - List> jsonItems = jsonContext.read(data.getOptionsRoot() + "['" + data.getAutoCompleteOptions().getLabel() + "','" + data.getAutoCompleteOptions().getValue() + "']"); - jsonItems.forEach(item -> result.add(new Tuple<>(item.get(data.getAutoCompleteOptions().getValue()), item.get(data.getAutoCompleteOptions().getLabel())))); + List> jsonItems = jsonContext.read(data.getOptionsRoot() + "['" + data.getAutoCompleteOptions().getLabel() + "','" + data.getAutoCompleteOptions().getValue() + "','" + data.getAutoCompleteOptions().getSource() + "']"); + jsonItems.forEach(item -> result.add(new ExternalAutocompleteFieldModel(item.get(data.getAutoCompleteOptions().getValue()), item.get(data.getAutoCompleteOptions().getLabel()), item.get(data.getAutoCompleteOptions().getSource())))); + return result; } + public ResponseEntity getDocument(eu.eudat.models.data.user.composite.DatasetProfile datasetProfile, String label) throws IllegalAccessException, IOException, InstantiationException { + FileEnvelope envelope = getXmlDocument(datasetProfile, label); + InputStream resource = new FileInputStream(envelope.getFile()); + System.out.println("Mime Type of " + envelope.getFilename() + " is " + + new MimetypesFileTypeMap().getContentType(envelope.getFile())); + HttpHeaders responseHeaders = new HttpHeaders(); + responseHeaders.setContentLength(envelope.getFile().length()); + responseHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM); + responseHeaders.set("Content-Disposition", "attachment;filename=" + envelope.getFilename() + ".xml"); + responseHeaders.set("Access-Control-Expose-Headers", "Content-Disposition"); + responseHeaders.get("Access-Control-Expose-Headers").add("Content-Type"); + + byte[] content = org.apache.poi.util.IOUtils.toByteArray(resource); + resource.close(); + Files.deleteIfExists(envelope.getFile().toPath()); + + return new ResponseEntity<>(content, + responseHeaders, + HttpStatus.OK); + } + + public FileEnvelope getXmlDocument(eu.eudat.models.data.user.composite.DatasetProfile datatasetProfile, String label) throws InstantiationException, IllegalAccessException, IOException { + ExportXmlBuilderDatasetProfile xmlBuilder = new ExportXmlBuilderDatasetProfile(); + File file = xmlBuilder.build(datatasetProfile); + FileEnvelope fileEnvelope = new FileEnvelope(); + fileEnvelope.setFile(file); + fileEnvelope.setFilename(label); + return fileEnvelope; + } + + public eu.eudat.logic.utilities.documents.xml.datasetProfileXml.datasetProfileModel.DatasetProfile createDatasetProfileFromXml(MultipartFile multiPartFile) { + ImportXmlBuilderDatasetProfile xmlBuilder = new ImportXmlBuilderDatasetProfile(); + try { + return xmlBuilder.build(convert(multiPartFile)); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + private static File convert(MultipartFile file) throws IOException { + File convFile = new File(file.getOriginalFilename()); + convFile.createNewFile(); + FileOutputStream fos = new FileOutputStream(convFile); + fos.write(file.getBytes()); + fos.close(); + return convFile; + } + + public eu.eudat.data.entities.DatasetProfile createNewVersionDatasetProfile(String id, eu.eudat.models.data.admin.composite.DatasetProfile profile) throws Exception { + // Getting the DatasetProfile which we will create its new version. + eu.eudat.data.entities.DatasetProfile oldDatasetProfile = apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(UUID.fromString(id)); + + // Getting the DatasetProfile with the latest Version. + DatasetProfileCriteria criteria = new DatasetProfileCriteria(); + LinkedList list = new LinkedList<>(); + list.push(oldDatasetProfile.getGroupId()); + criteria.setGroupIds(list); + criteria.setAllVersions(false); + QueryableList datasetProfileQueryableList = apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().getWithCriteria(criteria); + eu.eudat.data.entities.DatasetProfile latestVersionDatasetProfile = datasetProfileQueryableList.getSingle(); + + if (latestVersionDatasetProfile.getVersion().equals(oldDatasetProfile.getVersion())){ + eu.eudat.models.data.admin.composite.DatasetProfile sortedProfile = profile.toShort(); + eu.eudat.data.entities.DatasetProfile modelDefinition = AdminManager.generateViewStyleDefinition(sortedProfile, apiContext); + modelDefinition.setLabel(oldDatasetProfile.getLabel()); + modelDefinition.setVersion((short) (oldDatasetProfile.getVersion() + 1)); + modelDefinition.setGroupId(oldDatasetProfile.getGroupId()); + apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().createOrUpdate(modelDefinition); + return modelDefinition; + } else { + throw new DatasetProfileNewVersionException("Version to update not the latest."); + } + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetWizardManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetWizardManager.java index ac61b6f56..ef3a4cc95 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetWizardManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetWizardManager.java @@ -3,7 +3,10 @@ package eu.eudat.logic.managers; import eu.eudat.data.dao.entities.DMPDao; import eu.eudat.data.entities.DMP; +import eu.eudat.data.entities.Dataset; import eu.eudat.data.entities.UserInfo; +import eu.eudat.exceptions.datasetwizard.DatasetWizardCannotUnlockException; +import eu.eudat.logic.services.ApiContext; import eu.eudat.models.data.datasetwizard.DataManagentPlanListingModel; import eu.eudat.data.query.items.item.datasetprofile.DatasetProfileWizardAutocompleteRequest; import eu.eudat.data.query.items.item.dataset.DatasetWizardAutocompleteRequest; @@ -14,6 +17,7 @@ import eu.eudat.queryable.QueryableList; import java.util.LinkedList; import java.util.List; +import java.util.UUID; public class DatasetWizardManager { @@ -34,4 +38,18 @@ public class DatasetWizardManager { List profiles = dataManagementPlan.getProfiles(); return profiles; } + + public void unlock(ApiContext apiContext, UUID uuid) throws DatasetWizardCannotUnlockException { + Dataset dataset = apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().find(uuid); + if(dataset.getDmp().getStatus() == DMP.DMPStatus.FINALISED.getValue()) throw new DatasetWizardCannotUnlockException("To perform this action you will need to revert DMP's finalisation"); + dataset.setStatus(Dataset.Status.SAVED.getValue()); + apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().createOrUpdate(dataset); + return; + } + + public void delete(ApiContext apiContext, UUID uuid) { + Dataset oldDataset = apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().find(uuid); + oldDataset.setStatus(DMP.DMPStatus.DELETED.getValue()); + apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().createOrUpdate(oldDataset); + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DocumentManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DocumentManager.java new file mode 100644 index 000000000..db7fcf3a9 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DocumentManager.java @@ -0,0 +1,153 @@ +package eu.eudat.logic.managers; + +import eu.eudat.data.dao.entities.DatasetDao; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.logic.services.forms.VisibilityRuleService; +import eu.eudat.logic.utilities.documents.helpers.FileEnvelope; +import eu.eudat.logic.utilities.documents.word.WordBuilder; +import eu.eudat.logic.utilities.documents.xml.ExportXmlBuilder; +import eu.eudat.models.HintedModelFactory; +import eu.eudat.models.data.datasetwizard.DatasetWizardModel; +import eu.eudat.models.data.user.composite.PagedDatasetProfile; +import org.apache.commons.io.IOUtils; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.core.io.FileSystemResource; +import org.springframework.http.*; +import org.springframework.http.converter.ByteArrayHttpMessageConverter; +import org.springframework.stereotype.Service; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.web.client.RestTemplate; + +import java.io.*; +import java.net.URL; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +/** + * Created by ikalyvas on 10/16/2018. + */ +@Service +public class DocumentManager { + + private ApiContext context; + private DatasetManager datasetManager; + public DocumentManager(ApiContext context, DatasetManager datasetManager) { + this.context = context; + this.datasetManager = datasetManager; + } + + public File getWordDocument(Environment environment, DatasetDao datatasetRepository, String id, VisibilityRuleService visibilityRuleService) throws InstantiationException, IllegalAccessException, IOException { + WordBuilder wordBuilder = new WordBuilder(); + DatasetWizardModel dataset = new DatasetWizardModel(); + String fileUrl = environment.getProperty("configuration.h2020template"); + InputStream is = new URL(Paths.get(fileUrl).toUri().toURL().toString()).openStream(); + XWPFDocument document = new XWPFDocument(is); + eu.eudat.data.entities.Dataset datasetEntity = datatasetRepository.find(UUID.fromString(id), HintedModelFactory.getHint(DatasetWizardModel.class)); + Map properties = new HashMap<>(); + if (datasetEntity.getProperties() != null) { + JSONObject jobject = new JSONObject(datasetEntity.getProperties()); + properties = jobject.toMap(); + } + PagedDatasetProfile pagedDatasetProfile = datasetManager.getPagedProfile(dataset, datasetEntity); + visibilityRuleService.setProperties(properties); + visibilityRuleService.buildVisibilityContext(pagedDatasetProfile.getRules()); + wordBuilder.build(document, pagedDatasetProfile, visibilityRuleService); + File exportFile = new File(dataset.getLabel() + ".docx"); + FileOutputStream out = new FileOutputStream(exportFile); + document.write(out); + out.close(); + return exportFile; + } + + public FileEnvelope getXmlDocument(eu.eudat.data.entities.Dataset datasetEntity, String id, VisibilityRuleService visibilityRuleService) throws InstantiationException, IllegalAccessException, IOException { + ExportXmlBuilder xmlBuilder = new ExportXmlBuilder(); + DatasetWizardModel dataset = new DatasetWizardModel(); + Map properties = new HashMap<>(); + if (datasetEntity.getProperties() != null) { + JSONObject jobject = new JSONObject(datasetEntity.getProperties()); + properties = jobject.toMap(); + } + PagedDatasetProfile pagedDatasetProfile = datasetManager.getPagedProfile(dataset, datasetEntity); + visibilityRuleService.setProperties(properties); + visibilityRuleService.buildVisibilityContext(pagedDatasetProfile.getRules()); + File file = xmlBuilder.build(pagedDatasetProfile, UUID.fromString(id), visibilityRuleService); + FileEnvelope fileEnvelope = new FileEnvelope(); + fileEnvelope.setFile(file); + fileEnvelope.setFilename(datasetEntity.getLabel()); + return fileEnvelope; + } + + public File convertToPDF(File file, Environment environment, String label) throws IOException, InterruptedException { + LinkedMultiValueMap map = new LinkedMultiValueMap<>(); + map.add("file", new FileSystemResource(file)); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.MULTIPART_FORM_DATA); + headers.add("Content-disposition", "attachment; filename=" + label + ".docx"); + + headers.add("Content-type", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"); + + HttpEntity> requestEntity = new HttpEntity>( + map, headers); + + Map queueResult = new RestTemplate().postForObject( + environment.getProperty("pdf.converter.url") + + "api/v1/", requestEntity, Map.class); + + Map mediaResult = new RestTemplate().getForObject(environment.getProperty("pdf.converter.url") + + "/api/v1/" + queueResult.get("id"), Map.class); + System.out.println("Status: " + mediaResult.get("status")); + while (!mediaResult.get("status").equals("finished")) { + Thread.sleep(500); + mediaResult = new RestTemplate().getForObject(environment.getProperty("pdf.converter.url") + + "api/v1/" + queueResult.get("id"), Map.class); + System.out.println("Polling"); + } + RestTemplate restTemplate = new RestTemplate(); + restTemplate.getMessageConverters().add(new ByteArrayHttpMessageConverter()); + HttpHeaders headers2 = new HttpHeaders(); + headers.setAccept(Arrays.asList(MediaType.APPLICATION_OCTET_STREAM)); + HttpEntity entity = new HttpEntity(headers2); + + ResponseEntity response = restTemplate.exchange(environment.getProperty("pdf.converter.url") + + mediaResult.get("result_url"), HttpMethod.GET, entity, byte[].class, "1"); + + UUID uuid = UUID.randomUUID(); + File zip = new File(uuid + ".zip"); + if (response.getStatusCode().equals(HttpStatus.OK)) { + FileOutputStream output = new FileOutputStream(zip); + IOUtils.write(response.getBody(), output); + } + return extractFromZip(zip, label + ".pdf"); + } + + private File extractFromZip(File file, String filename) throws IOException { + byte[] buffer = new byte[1024]; + File newFile = new File(filename); + ZipInputStream zis = new ZipInputStream(new FileInputStream(file)); + ZipEntry zipEntry = zis.getNextEntry(); + while (zipEntry != null) { + String zippedFileName = zipEntry.getName(); + if (zippedFileName.equals("pdf")) { + + FileOutputStream fos = new FileOutputStream(newFile); + int len; + while ((len = zis.read(buffer)) > 0) { + fos.write(buffer, 0, len); + } + fos.close(); + zipEntry = zis.getNextEntry(); + } + } + zis.closeEntry(); + zis.close(); + return newFile; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/EmailConfirmationManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/EmailConfirmationManager.java new file mode 100644 index 000000000..ed1b8e747 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/EmailConfirmationManager.java @@ -0,0 +1,50 @@ +package eu.eudat.logic.managers; + +import eu.eudat.data.entities.LoginConfirmationEmail; +import eu.eudat.data.entities.UserInfo; +import eu.eudat.exceptions.emailconfirmation.HasConfirmedEmailException; +import eu.eudat.exceptions.emailconfirmation.TokenExpiredException; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.models.data.security.Principal; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.UUID; + +@Component +public class EmailConfirmationManager { + private ApiContext apiContext; + + @Autowired + public EmailConfirmationManager(ApiContext apiContext) { + this.apiContext = apiContext; + } + + public void confirmEmail(String token) throws TokenExpiredException, HasConfirmedEmailException { + LoginConfirmationEmail loginConfirmationEmail = apiContext.getOperationsContext() + .getDatabaseRepository().getLoginConfirmationEmailDao().asQueryable() + .where((builder, root) -> builder.equal(root.get("token"), UUID.fromString(token))).getSingle(); + if (loginConfirmationEmail.getExpiresAt().compareTo(new Date()) < 0) + throw new TokenExpiredException("Token has expired."); + UserInfo user = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().asQueryable() + .where((builder, root) -> builder.equal(root.get("id"), loginConfirmationEmail.getUserId())).getSingle(); + if (user.getEmail() != null) + throw new HasConfirmedEmailException("User already has confirmed his Email."); + loginConfirmationEmail.setIsConfirmed(true); + user.setEmail(loginConfirmationEmail.getEmail()); + apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().createOrUpdate(user); + apiContext.getOperationsContext().getDatabaseRepository().getLoginConfirmationEmailDao().createOrUpdate(loginConfirmationEmail); + } + + public void sendConfirmationEmail(String email, Principal principal) throws HasConfirmedEmailException { + UserInfo user = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(principal.getId()); + if (user.getEmail() != null) + throw new HasConfirmedEmailException("User already has confirmed his Email."); + apiContext.getUtilitiesService().getConfirmationEmailService().createConfirmationEmail( + apiContext.getOperationsContext().getDatabaseRepository().getLoginConfirmationEmailDao(), + apiContext.getUtilitiesService().getMailService(), + email, + principal.getId()); + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ExternalDatasetManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ExternalDatasetManager.java index 7a2fa9d4f..cab3d39b4 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ExternalDatasetManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ExternalDatasetManager.java @@ -5,6 +5,7 @@ import eu.eudat.logic.builders.model.models.DataTableDataBuilder; import eu.eudat.data.dao.entities.ExternalDatasetDao; import eu.eudat.data.entities.ExternalDataset; import eu.eudat.data.dao.criteria.ExternalDatasetCriteria; +import eu.eudat.logic.services.operations.DatabaseRepository; import eu.eudat.models.data.externaldataset.ExternalDatasetListingModel; import eu.eudat.data.query.items.table.externaldataset.ExternalDatasetTableRequest; import eu.eudat.models.data.helpers.common.DataTableData; @@ -13,31 +14,48 @@ import eu.eudat.logic.proxy.config.exceptions.NoURLFound; import eu.eudat.logic.proxy.fetching.RemoteFetcher; import eu.eudat.queryable.QueryableList; import eu.eudat.logic.services.ApiContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; import java.util.List; import java.util.UUID; - +@Component public class ExternalDatasetManager { - public DataTableData getPaged(ApiContext apiContext, ExternalDatasetTableRequest externalDatasetTableRequest) throws Exception { + private ApiContext apiContext; + private DatabaseRepository databaseRepository; + private RemoteFetcher remoteFetcher; + @Autowired + public ExternalDatasetManager(ApiContext apiContext) { + this.apiContext = apiContext; + this.databaseRepository = apiContext.getOperationsContext().getDatabaseRepository(); + this.remoteFetcher = apiContext.getOperationsContext().getRemoteFetcher(); + } + + public DataTableData getPaged(ExternalDatasetTableRequest externalDatasetTableRequest) throws Exception { QueryableList items = apiContext.getOperationsContext().getDatabaseRepository().getExternalDatasetDao().getWithCriteria(externalDatasetTableRequest.getCriteria()); QueryableList pagedItems = PaginationManager.applyPaging(items, externalDatasetTableRequest); List externalDatasetListingmodels = pagedItems.select(item -> new ExternalDatasetListingModel().fromDataModel(item)); return apiContext.getOperationsContext().getBuilderFactory().getBuilder(DataTableDataBuilder.class).data(externalDatasetListingmodels).totalCount(items.count()).build(); } - public List getWithExternal(ApiContext apiContext, String query, RemoteFetcher remoteFetcher) throws HugeResultSet, NoURLFound, InstantiationException, IllegalAccessException { + public List getWithExternal(String query) throws HugeResultSet, NoURLFound, InstantiationException, IllegalAccessException { ExternalDatasetCriteria criteria = apiContext.getOperationsContext().getBuilderFactory().getBuilder(ExternalDatasetCriteriaBuilder.class).like(query).build(); QueryableList items = apiContext.getOperationsContext().getDatabaseRepository().getExternalDatasetDao().getWithCriteria(criteria); List externalDatasets = items.select(item -> new ExternalDatasetListingModel().fromDataModel(item)); return externalDatasets; } - public ExternalDatasetListingModel getSingle(ExternalDatasetDao externalDatasetDao, UUID id) throws HugeResultSet, NoURLFound, InstantiationException, IllegalAccessException { - ExternalDataset externalDataset = externalDatasetDao.find(id); + public ExternalDatasetListingModel getSingle(UUID id) throws HugeResultSet, NoURLFound, InstantiationException, IllegalAccessException { + ExternalDataset externalDataset = databaseRepository.getExternalDatasetDao().find(id); ExternalDatasetListingModel externalDatasetModel = new ExternalDatasetListingModel(); externalDatasetModel.fromDataModel(externalDataset); return externalDatasetModel; } + + public ExternalDataset create(eu.eudat.models.data.externaldataset.ExternalDatasetModel externalDatasetModel) throws Exception { + ExternalDataset externalDataset = externalDatasetModel.toDataModel(); + return apiContext.getOperationsContext().getDatabaseRepository().getExternalDatasetDao().createOrUpdate(externalDataset); + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/FileManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/FileManager.java index 823cffc17..b25c4ce43 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/FileManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/FileManager.java @@ -2,7 +2,9 @@ package eu.eudat.logic.managers; import eu.eudat.models.data.files.ContentFile; import eu.eudat.logic.services.helpers.FileStorageService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.Resource; +import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; @@ -11,13 +13,21 @@ import java.util.List; /** * Created by ikalyvas on 3/15/2018. */ +@Component public class FileManager { - public static List saveTempFile(MultipartFile file[], FileStorageService fileStorageService) throws IOException { + private FileStorageService fileStorageService; + + @Autowired + public FileManager(FileStorageService fileStorageService) { + this.fileStorageService = fileStorageService; + } + + public List saveTempFile(MultipartFile file[]) throws IOException { return fileStorageService.writeToTempFileSystem(file); } - public static Resource getFile(String filename, String type, FileStorageService fileStorageService, String location) throws IOException { + public Resource getFile(String filename, String type, String location) throws IOException { return fileStorageService.readFromFilesystem(filename, type, location); } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/FunderManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/FunderManager.java new file mode 100644 index 000000000..8c882953a --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/FunderManager.java @@ -0,0 +1,52 @@ +package eu.eudat.logic.managers; + +import eu.eudat.data.query.items.item.funder.FunderCriteriaRequest; +import eu.eudat.logic.builders.model.models.FunderBuilder; +import eu.eudat.logic.proxy.config.exceptions.HugeResultSet; +import eu.eudat.logic.proxy.config.exceptions.NoURLFound; +import eu.eudat.logic.proxy.fetching.RemoteFetcher; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.models.data.external.ExternalSourcesItemModel; +import eu.eudat.models.data.external.FundersExternalSourcesModel; +import eu.eudat.models.data.funder.Funder; +import eu.eudat.models.data.security.Principal; +import eu.eudat.queryable.QueryableList; +import org.springframework.stereotype.Component; + +import java.util.Comparator; +import java.util.List; +import java.util.Map; + +@Component +public class FunderManager { + + private ApiContext apiContext; + private RemoteFetcher remoteFetcher; + + public FunderManager(ApiContext apiContext, RemoteFetcher remoteFetcher) { + this.apiContext = apiContext; + this.remoteFetcher = remoteFetcher; + } + + public List getCriteriaWithExternal(FunderCriteriaRequest funderCriteria, Principal principal) throws HugeResultSet, NoURLFound { + eu.eudat.data.entities.UserInfo userInfo = new eu.eudat.data.entities.UserInfo(); + userInfo.setId(principal.getId()); + funderCriteria.getCriteria().setReference("dmp:"); + QueryableList items = apiContext.getOperationsContext().getDatabaseRepository().getFunderDao().getWithCritetia(funderCriteria.getCriteria()); + //QueryableList authItems = apiContext.getOperationsContext().getDatabaseRepository().getFunderDao().getAuthenticated(items, userInfo); + List funders = items.select(item -> new eu.eudat.models.data.funder.Funder().fromDataModel(item)); + List> remoteRepos = remoteFetcher.getFunders(funderCriteria.getCriteria().getLike()); + FundersExternalSourcesModel fundersExternalSourcesModel = new FundersExternalSourcesModel().fromExternalItem(remoteRepos); + for (ExternalSourcesItemModel externalListingItem : fundersExternalSourcesModel) { + eu.eudat.models.data.funder.Funder funder = apiContext.getOperationsContext().getBuilderFactory().getBuilder(FunderBuilder.class) + .reference(externalListingItem.getRemoteId()).label(externalListingItem.getName()) + .status(eu.eudat.data.entities.Funder.Status.fromInteger(0)) + .source(externalListingItem.getTag()) + .build(); + + funders.add(funder); + } + funders.sort(Comparator.comparing(Funder::getLabel)); + return funders; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/GrantManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/GrantManager.java new file mode 100644 index 000000000..6e3e07d1d --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/GrantManager.java @@ -0,0 +1,179 @@ +package eu.eudat.logic.managers; + +import eu.eudat.data.dao.criteria.FunderCriteria; +import eu.eudat.data.entities.Funder; +import eu.eudat.data.query.items.table.grant.GrantTableRequest; +import eu.eudat.exceptions.grant.GrantWithDMPsDeleteException; +import eu.eudat.logic.builders.entity.ContentBuilder; +import eu.eudat.logic.builders.model.models.GrantBuilder; +import eu.eudat.data.dao.entities.GrantDao; +import eu.eudat.data.entities.Content; +import eu.eudat.data.entities.DMP; +import eu.eudat.exceptions.files.TempFileNotFoundException; +import eu.eudat.logic.services.operations.DatabaseRepository; +import eu.eudat.models.data.external.ExternalSourcesItemModel; +import eu.eudat.models.data.external.GrantsExternalSourcesModel; +import eu.eudat.models.data.files.ContentFile; +import eu.eudat.models.data.grant.Grant; +import eu.eudat.models.data.helpers.common.DataTableData; +import eu.eudat.data.query.items.item.grant.GrantCriteriaRequest; +import eu.eudat.models.data.grant.GrantListingModel; +import eu.eudat.models.data.security.Principal; +import eu.eudat.logic.proxy.config.exceptions.HugeResultSet; +import eu.eudat.logic.proxy.config.exceptions.NoURLFound; +import eu.eudat.logic.proxy.fetching.RemoteFetcher; +import eu.eudat.queryable.QueryableList; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.logic.services.helpers.FileStorageService; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.text.ParseException; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; + +@Component +public class GrantManager { + + private ApiContext apiContext; + private DatabaseRepository databaseRepository; + private FileStorageService fileStorageService; + private RemoteFetcher remoteFetcher; + + public GrantManager(ApiContext apiContext) { + this.apiContext = apiContext; + this.databaseRepository = apiContext.getOperationsContext().getDatabaseRepository(); + this.fileStorageService = apiContext.getOperationsContext().getFileStorageService(); + this.remoteFetcher = apiContext.getOperationsContext().getRemoteFetcher(); + } + + public DataTableData getPaged(GrantTableRequest grantTableRequest, Principal principal, String fieldsGroup) throws Exception { + eu.eudat.data.entities.UserInfo userInfo = new eu.eudat.data.entities.UserInfo(); + userInfo.setId(principal.getId()); + GrantDao grantRepository = databaseRepository.getGrantDao(); + QueryableList items = grantRepository.getWithCriteria(grantTableRequest.getCriteria()); + QueryableList authItems = grantRepository.getAuthenticated(items, userInfo); + QueryableList pagedItems = PaginationManager.applyPaging(authItems, grantTableRequest); + DataTableData dataTable = new DataTableData<>(); + CompletableFuture grantsFuture; + if (fieldsGroup.equals("listing")) { + grantsFuture = pagedItems.selectAsync(item -> new GrantListingModel().fromDataModelDetails(item)) + .whenComplete((results, throwable) -> + dataTable.setData(results) + ); + } else { + grantsFuture = pagedItems.selectAsync(item -> new GrantListingModel().fromDataModel(item)) + .whenComplete((results, throwable) -> + dataTable.setData(results) + ); + } + CompletableFuture countFuture = pagedItems.countAsync().whenComplete((count, throwable) -> dataTable.setTotalCount(count)); + + CompletableFuture.allOf(grantsFuture, countFuture).join(); + return dataTable; + } + + public DataTableData getPublicPaged(GrantTableRequest grantTableRequest) throws Exception { + GrantDao grantRepository = databaseRepository.getGrantDao(); + grantTableRequest.getCriteria().setPublic(true); + QueryableList items = grantRepository.getWithCriteria(grantTableRequest.getCriteria()); + QueryableList pagedItems = PaginationManager.applyPaging(items, grantTableRequest); + DataTableData dataTable = new DataTableData<>(); + CompletableFuture grantsFuture; + grantsFuture = pagedItems.selectAsync(item -> new GrantListingModel().fromDataModel(item)) + .whenComplete((results, throwable) -> { + dataTable.setData(results); + }); + CompletableFuture countFuture = pagedItems.countAsync().whenComplete((count, throwable) -> dataTable.setTotalCount(count)); + + CompletableFuture.allOf(grantsFuture, countFuture).join(); + return dataTable; + } + + public eu.eudat.models.data.grant.Grant getSingle(String id) throws InstantiationException, IllegalAccessException { + eu.eudat.models.data.grant.Grant grant = new eu.eudat.models.data.grant.Grant(); + grant.fromDataModel(databaseRepository.getGrantDao().find(UUID.fromString(id))); + return grant; + } + + public eu.eudat.data.entities.Grant inactivate(String id) throws InstantiationException, IllegalAccessException { + GrantDao grantRepository = databaseRepository.getGrantDao(); + eu.eudat.data.entities.Grant grant = grantRepository.find(UUID.fromString(id)); + grant.setStatus(eu.eudat.data.entities.Grant.Status.DELETED.getValue()); + grant = grantRepository.createOrUpdate(grant); + return grant; + } + + public List getCriteriaWithExternal(GrantCriteriaRequest grantCriteria, Principal principal) throws IllegalAccessException, InstantiationException, HugeResultSet, NoURLFound { + eu.eudat.data.entities.UserInfo userInfo = new eu.eudat.data.entities.UserInfo(); + userInfo.setId(principal.getId()); + if (grantCriteria.getCriteria().getFunderReference() != null && !grantCriteria.getCriteria().getFunderReference().trim().isEmpty()) { + FunderCriteria funderCriteria = new FunderCriteria(); + funderCriteria.setReference(grantCriteria.getCriteria().getFunderReference()); + Funder funder = apiContext.getOperationsContext().getDatabaseRepository().getFunderDao().getWithCritetia(funderCriteria).getSingleOrDefault(); + if (funder != null) { + grantCriteria.getCriteria().setFunderId(funder.getId().toString()); + } + } + grantCriteria.getCriteria().setReference("dmp:"); + QueryableList items = apiContext.getOperationsContext().getDatabaseRepository().getGrantDao().getWithCriteria(grantCriteria.getCriteria()); + QueryableList authItems = apiContext.getOperationsContext().getDatabaseRepository().getGrantDao().getAuthenticated(items, userInfo); + List grants = authItems.select(item -> new Grant().fromDataModel(item)); + List> remoteRepos = remoteFetcher.getGrants(grantCriteria.getCriteria().getLike()); + GrantsExternalSourcesModel grantsExternalSourcesModel = new GrantsExternalSourcesModel().fromExternalItem(remoteRepos); + for (ExternalSourcesItemModel externalListingItem : grantsExternalSourcesModel) { + eu.eudat.models.data.grant.Grant grant = apiContext.getOperationsContext().getBuilderFactory().getBuilder(GrantBuilder.class) + .reference(externalListingItem.getRemoteId()).label(externalListingItem.getName()) + .description(externalListingItem.getDescription()).uri(externalListingItem.getUri()) + .abbreviation(externalListingItem.getAbbreviation()).status(eu.eudat.data.entities.Grant.Status.fromInteger(0)) + .source(externalListingItem.getTag()) + .build(); + + grants.add(grant); + } + grants.sort(Comparator.comparing(Grant::getLabel)); + return grants; + } + + public List getCriteria(GrantCriteriaRequest grantCriteria) throws IllegalAccessException, InstantiationException, HugeResultSet, NoURLFound { + GrantDao grantRepository = databaseRepository.getGrantDao(); + QueryableList items = grantRepository.getWithCriteria(grantCriteria.getCriteria()); + if (grantCriteria.getLength() != null) items.take(grantCriteria.getLength()); + List grants = items.select(item -> new Grant().fromDataModel(item)); + return grants; + } + + public void createOrUpdate(eu.eudat.models.data.grant.Grant grant, Principal principal) throws ParseException, IOException { + eu.eudat.data.entities.Grant grantEntity = grant.toDataModel(); + if (grant.getFiles() != null) { + for (ContentFile file : grant.getFiles()) { + try { + ContentFile storedFile = fileStorageService.copyFromTempFileSystem(file); + Content content = new ContentBuilder().extension(file.getType()) + .label(file.getFilename()) + .locationType(Content.LocationType.INTERNAL.getValue()) + .parentType(Content.ParentType.GRANT.getValue()) + .uri("LOCAL:" + storedFile.getId()) + .build(); + grantEntity.setContent(databaseRepository.getContentDao().createOrUpdate(content)); + } catch (TempFileNotFoundException e) { + continue; + } + } + } + grantEntity.setType(eu.eudat.data.entities.Grant.GrantType.INTERNAL.getValue()); + grantEntity.setCreationUser(databaseRepository.getUserInfoDao().find(principal.getId())); + databaseRepository.getGrantDao().createOrUpdate(grantEntity); + } + + public void delete(UUID uuid) { + eu.eudat.data.entities.Grant oldGrant = apiContext.getOperationsContext().getDatabaseRepository().getGrantDao().find(uuid); + if (oldGrant.getDmps().size() > 0) + throw new GrantWithDMPsDeleteException("You cannot Remove Grants with DMPs"); + oldGrant.setStatus(DMP.DMPStatus.DELETED.getValue()); + apiContext.getOperationsContext().getDatabaseRepository().getGrantDao().createOrUpdate(oldGrant); + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/InvitationsManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/InvitationsManager.java index a31b0a220..eea0d1c41 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/InvitationsManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/InvitationsManager.java @@ -1,6 +1,7 @@ package eu.eudat.logic.managers; import eu.eudat.data.entities.DMP; +import eu.eudat.data.entities.UserDMP; import eu.eudat.data.entities.UserInfo; import eu.eudat.exceptions.security.UnauthorisedException; import eu.eudat.models.data.invitation.Invitation; @@ -9,38 +10,59 @@ import eu.eudat.models.data.userinfo.UserInfoInvitationModel; import eu.eudat.data.query.items.item.userinfo.UserInfoRequestItem; import eu.eudat.queryable.QueryableList; import eu.eudat.logic.services.ApiContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import java.util.LinkedList; import java.util.List; import java.util.UUID; import java.util.stream.Collectors; - +@Component public class InvitationsManager { - public static void inviteUsers(ApiContext apiContext, Invitation invitation, Principal principal) throws Exception { + private ApiContext apiContext; + + @Autowired + public InvitationsManager(ApiContext apiContext) { + this.apiContext = apiContext; + } + + public void inviteUsers(Invitation invitation, Principal principal) throws Exception { UserInfo principalUser = new UserInfo(); principalUser.setId(principal.getId()); List alreadySignedInUsers = invitation.getUsers().stream().filter(item -> item.getId() != null).collect(Collectors.toList()); List alreadySignedInUsersEntities = alreadySignedInUsers.stream().map(item -> item.toDataModel()).collect(Collectors.toList()); + List userInfoToUserDmp = new LinkedList<>(); + for (UserInfo userInfo : alreadySignedInUsersEntities) { + UserDMP userDMP = new UserDMP(); + userDMP.setUser(userInfo); + userInfoToUserDmp.add(userDMP); + } DMP dataManagementPlan = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().find(invitation.getDataManagementPlan()); apiContext.getUtilitiesService().getInvitationService().createInvitations(apiContext.getOperationsContext().getDatabaseRepository().getInvitationDao(), apiContext.getUtilitiesService().getMailService(), invitation.getUsers().stream().map(item -> item.toDataModel()).collect(Collectors.toList()), dataManagementPlan, principalUser); - apiContext.getUtilitiesService().getInvitationService().assignToDmp(apiContext.getOperationsContext().getDatabaseRepository().getDmpDao(), alreadySignedInUsersEntities, dataManagementPlan); + apiContext.getUtilitiesService().getInvitationService().assignToDmp(apiContext.getOperationsContext().getDatabaseRepository().getDmpDao(), userInfoToUserDmp, dataManagementPlan); } - public static List getUsers(ApiContext apiContext, UserInfoRequestItem userInfoRequestItem) throws InstantiationException, IllegalAccessException { + public List getUsers(UserInfoRequestItem userInfoRequestItem) throws InstantiationException, IllegalAccessException { QueryableList users = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().getWithCriteria(userInfoRequestItem.getCriteria()); List userModels = users.select(item -> new UserInfoInvitationModel().fromDataModel(item)); return userModels; } - public static UUID assignUserAcceptedInvitation(ApiContext apiContext, UUID invitationID, Principal principal) throws UnauthorisedException { + public UUID assignUserAcceptedInvitation(UUID invitationID, Principal principal) throws UnauthorisedException { eu.eudat.data.entities.Invitation invitation = apiContext.getOperationsContext().getDatabaseRepository().getInvitationDao().find(invitationID); if (invitation == null) throw new UnauthorisedException("There is no Data Management Plan assigned to this Link"); if (invitation.getAcceptedInvitation()) throw new UnauthorisedException("This Url Has Expired"); UserInfo invitedUser = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(principal.getId()); + UserDMP userDMP = new UserDMP(); + userDMP.setUser(invitedUser); + userDMP.setDmp(invitation.getDmp()); + userDMP.setRole(UserDMP.UserDMPRoles.USER.getValue()); DMP datamanagementPlan = invitation.getDmp(); - apiContext.getUtilitiesService().getInvitationService().assignToDmp(apiContext.getOperationsContext().getDatabaseRepository().getDmpDao(), invitedUser, datamanagementPlan); + apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().createOrUpdate(userDMP); + apiContext.getUtilitiesService().getInvitationService().assignToDmp(apiContext.getOperationsContext().getDatabaseRepository().getDmpDao(), userDMP, datamanagementPlan); invitation.setAcceptedInvitation(true); apiContext.getOperationsContext().getDatabaseRepository().getInvitationDao().createOrUpdate(invitation); return datamanagementPlan.getId(); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/OrganisationsManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/OrganisationsManager.java new file mode 100644 index 000000000..0f5d8617d --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/OrganisationsManager.java @@ -0,0 +1,67 @@ +package eu.eudat.logic.managers; + +import eu.eudat.data.dao.criteria.OrganisationCriteria; +import eu.eudat.data.dao.entities.OrganisationDao; +import eu.eudat.data.entities.DMP; +import eu.eudat.data.query.items.table.dmp.DataManagmentPlanPublicTableRequest; +import eu.eudat.data.query.items.table.organisations.OrganisationsTableRequest; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.logic.services.operations.DatabaseRepository; +import eu.eudat.models.HintedModelFactory; +import eu.eudat.models.data.dmp.Organisation; +import eu.eudat.models.data.helpers.common.DataTableData; +import eu.eudat.models.data.listingmodels.DataManagementPlanListingModel; +import eu.eudat.models.data.security.Principal; +import eu.eudat.queryable.QueryableList; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.stream.Collectors; + +@Component +public class OrganisationsManager { + + private ApiContext apiContext; + private DatabaseRepository databaseRepository; + + @Autowired + public OrganisationsManager(ApiContext apiContext) { + this.apiContext = apiContext; + this.databaseRepository = apiContext.getOperationsContext().getDatabaseRepository(); + } + + public DataTableData getPagedOrganisations(OrganisationsTableRequest organisationsTableRequest, Principal principal) throws Exception { + eu.eudat.data.entities.UserInfo userInfo = new eu.eudat.data.entities.UserInfo(); + userInfo.setId(principal.getId()); + OrganisationDao organisationDao = databaseRepository.getOrganisationDao(); + + QueryableList items = organisationDao.getWithCriteria(organisationsTableRequest.getCriteria()); + QueryableList authItems = organisationDao.getAuthenticated(items, userInfo); + QueryableList pagedItems = PaginationManager.applyPaging(authItems, organisationsTableRequest); + + List org = pagedItems.toList().stream().distinct().map(item -> new Organisation().fromDataModel(item)).collect(Collectors.toList()); + DataTableData organisationDataTableData = new DataTableData<>(); + organisationDataTableData.setData(org); + organisationDataTableData.setTotalCount(pagedItems.count()); + + return organisationDataTableData; + } + + public DataTableData getPublicPagedOrganisations(OrganisationsTableRequest organisationsTableRequest) throws Exception { + organisationsTableRequest.getCriteria().setPublic(true); + OrganisationDao organisationDao = databaseRepository.getOrganisationDao(); + + QueryableList items = organisationDao.getWithCriteria(organisationsTableRequest.getCriteria()); + QueryableList pagedItems = PaginationManager.applyPaging(items, organisationsTableRequest); + + List org = pagedItems.toList().stream().distinct().map(item -> new Organisation().fromDataModel(item)).collect(Collectors.toList()); + DataTableData organisationDataTableData = new DataTableData<>(); + organisationDataTableData.setData(org); + organisationDataTableData.setTotalCount(pagedItems.count()); + + return organisationDataTableData; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ProjectManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ProjectManager.java index 310f53160..258e5ef2d 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ProjectManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ProjectManager.java @@ -1,126 +1,53 @@ package eu.eudat.logic.managers; -import eu.eudat.logic.builders.entity.ContentBuilder; -import eu.eudat.logic.builders.model.models.ProjectBuilder; -import eu.eudat.data.dao.entities.ContentDao; -import eu.eudat.data.dao.entities.ProjectDao; -import eu.eudat.data.dao.entities.UserInfoDao; -import eu.eudat.data.entities.Content; -import eu.eudat.data.entities.DMP; -import eu.eudat.exceptions.files.TempFileNotFoundException; -import eu.eudat.models.HintedModelFactory; -import eu.eudat.models.data.external.ExternalSourcesItemModel; import eu.eudat.models.data.external.ProjectsExternalSourcesModel; -import eu.eudat.models.data.files.ContentFile; -import eu.eudat.models.data.helpers.common.DataTableData; import eu.eudat.models.data.project.Project; import eu.eudat.data.query.items.item.project.ProjectCriteriaRequest; -import eu.eudat.models.data.project.ProjectListingModel; -import eu.eudat.data.query.items.table.project.ProjectTableRequest; -import eu.eudat.models.data.security.Principal; +import eu.eudat.logic.builders.model.models.ProjectBuilder; import eu.eudat.logic.proxy.config.exceptions.HugeResultSet; import eu.eudat.logic.proxy.config.exceptions.NoURLFound; import eu.eudat.logic.proxy.fetching.RemoteFetcher; -import eu.eudat.queryable.QueryableList; import eu.eudat.logic.services.ApiContext; -import eu.eudat.logic.services.helpers.FileStorageService; +import eu.eudat.models.data.external.ExternalSourcesItemModel; +import eu.eudat.models.data.security.Principal; +import eu.eudat.queryable.QueryableList; +import org.springframework.stereotype.Component; -import java.io.IOException; -import java.text.ParseException; +import java.util.Comparator; import java.util.List; import java.util.Map; -import java.util.UUID; -import java.util.concurrent.CompletableFuture; -import java.util.stream.Collectors; +@Component public class ProjectManager { - public DataTableData getPaged(ProjectDao projectRepository, ProjectTableRequest projectTableRequest, Principal principal) throws Exception { - eu.eudat.data.entities.UserInfo userInfo = new eu.eudat.data.entities.UserInfo(); - userInfo.setId(principal.getId()); - QueryableList items = projectRepository.getWithCriteria(projectTableRequest.getCriteria()); - QueryableList authItems = projectRepository.getAuthenticated(items, userInfo); + private ApiContext apiContext; + private RemoteFetcher remoteFetcher; - QueryableList pagedItems = PaginationManager.applyPaging(authItems, projectTableRequest); - DataTableData dataTable = new DataTableData<>(); - CompletableFuture projectsFuture = pagedItems.withHint(HintedModelFactory.getHint(ProjectListingModel.class)).selectAsync(item -> { - item.setDmps(item.getDmps().stream().filter( - dmp -> dmp.getCreator().getId().equals(principal.getId()) || dmp.getUsers().stream().filter(user -> user.getId().equals(principal.getId())).collect(Collectors.toList()).size() > 0) - .collect(Collectors.groupingBy(DMP::getGroupId)) - .values().stream() - .map(dmps -> dmps.stream().reduce((first, second) -> { - if (first.getVersion() > second.getVersion()) return first; - else return second; - }).get()) - .collect(Collectors.toSet())); - return new ProjectListingModel().fromDataModel(item); - }).whenComplete((results, throwable) -> { - dataTable.setData(results); - }); + public ProjectManager(ApiContext apiContext) { + this.apiContext = apiContext; + this.remoteFetcher = apiContext.getOperationsContext().getRemoteFetcher(); + } - CompletableFuture countFuture = pagedItems.countAsync().whenComplete((count, throwable) -> dataTable.setTotalCount(count)); + public List getCriteriaWithExternal(ProjectCriteriaRequest projectCriteria, Principal principal) throws HugeResultSet, NoURLFound { + eu.eudat.data.entities.UserInfo userInfo = new eu.eudat.data.entities.UserInfo(); + userInfo.setId(principal.getId()); + projectCriteria.getCriteria().setReference("dmp:"); + QueryableList items = apiContext.getOperationsContext().getDatabaseRepository().getProjectDao().getWithCritetia(projectCriteria.getCriteria()); + QueryableList authItems = apiContext.getOperationsContext().getDatabaseRepository().getProjectDao().getAuthenticated(items, userInfo); + List projects = authItems.select(item -> new Project().fromDataModel(item)); + List> remoteRepos = remoteFetcher.getProjects(projectCriteria.getCriteria().getLike()); + ProjectsExternalSourcesModel projectsExternalSourcesModel = new ProjectsExternalSourcesModel().fromExternalItem(remoteRepos); + for (ExternalSourcesItemModel externalListingItem : projectsExternalSourcesModel) { + eu.eudat.models.data.project.Project project = apiContext.getOperationsContext().getBuilderFactory().getBuilder(ProjectBuilder.class) + .reference(externalListingItem.getRemoteId()).label(externalListingItem.getName()) + .description(externalListingItem.getDescription()).uri(externalListingItem.getUri()) + .abbreviation(externalListingItem.getAbbreviation()).status(eu.eudat.data.entities.Project.Status.fromInteger(0)) + .source(externalListingItem.getTag()) + .build(); - CompletableFuture.allOf(projectsFuture, countFuture).join(); - return dataTable; - } - - public eu.eudat.models.data.project.Project getSingle(ProjectDao projectRepository, String id) throws InstantiationException, IllegalAccessException { - eu.eudat.models.data.project.Project project = new eu.eudat.models.data.project.Project(); - project.fromDataModel(projectRepository.find(UUID.fromString(id))); - return project; - } - - public eu.eudat.data.entities.Project inactivate(ProjectDao projectRepository, String id) throws InstantiationException, IllegalAccessException { - eu.eudat.data.entities.Project project = projectRepository.find(UUID.fromString(id)); - project.setStatus(eu.eudat.data.entities.Project.Status.DELETED.getValue()); - project = projectRepository.createOrUpdate(project); - return project; - } - - public List getCriteriaWithExternal(ApiContext apiContext, ProjectCriteriaRequest projectCriteria, RemoteFetcher remoteFetcher) throws IllegalAccessException, InstantiationException, HugeResultSet, NoURLFound { - QueryableList items = apiContext.getOperationsContext().getDatabaseRepository().getProjectDao().getWithCriteria(projectCriteria.getCriteria()); - List projects = items.select(item -> new Project().fromDataModel(item)); - List> remoteRepos = remoteFetcher.getProjects(projectCriteria.getCriteria().getLike()); - ProjectsExternalSourcesModel projectsExternalSourcesModel = new ProjectsExternalSourcesModel().fromExternalItem(remoteRepos); - for (ExternalSourcesItemModel externalListingItem : projectsExternalSourcesModel) { - eu.eudat.models.data.project.Project project = apiContext.getOperationsContext().getBuilderFactory().getBuilder(ProjectBuilder.class) - .reference(externalListingItem.getRemoteId()).label(externalListingItem.getName()) - .description(externalListingItem.getDescription()).uri(externalListingItem.getUri()) - .abbreviation(externalListingItem.getAbbreviation()).status(eu.eudat.data.entities.Project.Status.fromInteger(0)) - .build(); - - projects.add(project); - } - - return projects; - } - - public List getCriteria(ProjectDao projectRepository, ProjectCriteriaRequest projectCriteria, RemoteFetcher remoteFetcher) throws IllegalAccessException, InstantiationException, HugeResultSet, NoURLFound { - QueryableList items = projectRepository.getWithCriteria(projectCriteria.getCriteria()); - List projects = items.select(item -> new Project().fromDataModel(item)); - return projects; - } - - public static void createOrUpdate(FileStorageService fileStorageService, ProjectDao projectRepository, ContentDao contentRepository, UserInfoDao userInfoRepository, eu.eudat.models.data.project.Project project, Principal principal) throws ParseException, IOException { - eu.eudat.data.entities.Project projectEntity = project.toDataModel(); - if(project.getFiles() != null) { - for (ContentFile file : project.getFiles()) { - try { - ContentFile storedFile = fileStorageService.copyFromTempFileSystem(file); - Content content = new ContentBuilder().extension(file.getType()) - .label(file.getFilename()) - .locationType(Content.LocationType.INTERNAL.getValue()) - .parentType(Content.ParentType.PROJECT.getValue()) - .uri("LOCAL:" + storedFile.getId()) - .build(); - projectEntity.setContent(contentRepository.createOrUpdate(content)); - } catch (TempFileNotFoundException e) { - continue; - } - } - } - projectEntity.setType(eu.eudat.data.entities.Project.ProjectType.INTERNAL.getValue()); - projectEntity.setCreationUser(userInfoRepository.find(principal.getId())); - projectRepository.createOrUpdate(projectEntity); - } + projects.add(project); + } + projects.sort(Comparator.comparing(Project::getLabel)); + return projects; + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/QuickWizardManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/QuickWizardManager.java new file mode 100644 index 000000000..b0a424c3f --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/QuickWizardManager.java @@ -0,0 +1,117 @@ +package eu.eudat.logic.managers; + +import eu.eudat.data.dao.criteria.FunderCriteria; +import eu.eudat.data.dao.criteria.GrantCriteria; +import eu.eudat.data.dao.criteria.ProjectCriteria; +import eu.eudat.data.entities.*; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.logic.services.operations.DatabaseRepository; +import eu.eudat.models.data.dmp.DataManagementPlan; +import eu.eudat.models.data.security.Principal; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.text.ParseException; + +@Component +public class QuickWizardManager { + + private ApiContext apiContext; + private DatabaseRepository databaseRepository; + + @Autowired + public QuickWizardManager(ApiContext apiContext) { + this.apiContext = apiContext; + this.databaseRepository = apiContext.getOperationsContext().getDatabaseRepository(); + } + + public Funder createOrUpdate(eu.eudat.models.data.funder.Funder funder, Principal principal) { + Funder funderEntity = funder.toDataModel(); + return databaseRepository.getFunderDao().createOrUpdate(funderEntity); + } + + public Grant createOrUpdate(eu.eudat.models.data.grant.Grant grant, Principal principal) throws ParseException, IOException { + eu.eudat.data.entities.Grant grantEntity = grant.toDataModel(); + grantEntity.setType(eu.eudat.data.entities.Grant.GrantType.INTERNAL.getValue()); + grantEntity.setCreationUser(databaseRepository.getUserInfoDao().find(principal.getId())); + return databaseRepository.getGrantDao().createOrUpdate(grantEntity); + } + + public Project createOrUpdate(eu.eudat.models.data.project.Project project, Principal principal) { + Project projectEntity = project.toDataModel(); + projectEntity.setCreationUser(databaseRepository.getUserInfoDao().find(principal.getId())); + return databaseRepository.getProjectDao().createOrUpdate(projectEntity); + } + + public DMP createOrUpdate(DataManagementPlan dataManagementPlan, Funder funderEntity, Principal principal) throws Exception { + DMP newDmp = dataManagementPlan.toDataModel(); + if (funderEntity != null) { + newDmp.getGrant().setFunder(funderEntity); + } + UserInfo user = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(principal.getId()); + createFunderIfItDoesntExist(newDmp, user); + createGrantIfItDoesntExist(newDmp, user); + if (newDmp.getProject() == null) { + newDmp.setProject(new Project()); + newDmp.setProject(newDmp.getProject().projectFromGrant(newDmp.getGrant())); + } + createProjectIfItDoesntExist(newDmp, user); + + apiContext.getOperationsContext().getDatabaseRepository().getGrantDao().createOrUpdate(newDmp.getGrant()); + DMP dmpret = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(newDmp); + if (dataManagementPlan.getAssociatedUsers().size() == 0) + assignUser(newDmp, user, apiContext); + return dmpret; + } + + private void assignUser(DMP dmp, UserInfo userInfo, ApiContext apiContext) { + UserDMP userDMP = new UserDMP(); + userDMP.setDmp(dmp); + userDMP.setUser(userInfo); + userDMP.setRole(UserDMP.UserDMPRoles.OWNER.getValue()); + apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().createOrUpdate(userDMP); + } + + private void createGrantIfItDoesntExist(DMP newDmp, UserInfo userInfo) { + if (newDmp.getGrant() != null) { + Grant grant = newDmp.getGrant(); + GrantCriteria criteria = new GrantCriteria(); + criteria.setReference(grant.getReference()); + eu.eudat.data.entities.Grant grantEntity = databaseRepository.getGrantDao().getWithCriteria(criteria).getSingleOrDefault(); + if (grantEntity != null) grant.setId(grantEntity.getId()); + else { + grant.setType(Grant.GrantType.EXTERNAL.getValue()); + databaseRepository.getGrantDao().createOrUpdate(grant); + } + } + } + + private void createFunderIfItDoesntExist(DMP newDmp, UserInfo userInfo) { + if (newDmp.getGrant().getFunder() != null) { + Funder funder = newDmp.getGrant().getFunder(); + FunderCriteria criteria = new FunderCriteria(); + criteria.setReference(funder.getReference()); + eu.eudat.data.entities.Funder funderEntity = databaseRepository.getFunderDao().getWithCritetia(criteria).getSingleOrDefault(); + if (funderEntity != null) funder.setId(funderEntity.getId()); + else { + funder.setType(Funder.FunderType.EXTERNAL.getValue()); + databaseRepository.getFunderDao().createOrUpdate(funder); + } + } + } + + private void createProjectIfItDoesntExist(DMP newDmp, UserInfo userInfo) { + if (newDmp.getProject() != null) { + Project project = newDmp.getProject(); + ProjectCriteria criteria = new ProjectCriteria(); + criteria.setReference(project.getReference()); + eu.eudat.data.entities.Project projectEntity = databaseRepository.getProjectDao().getWithCritetia(criteria).getSingleOrDefault(); + if (projectEntity != null) project.setId(projectEntity.getId()); + else { + project.setType(Project.ProjectType.EXTERNAL.getValue()); + databaseRepository.getProjectDao().createOrUpdate(project); + } + } + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/RegistryManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/RegistryManager.java new file mode 100644 index 000000000..33016f094 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/RegistryManager.java @@ -0,0 +1,25 @@ +package eu.eudat.logic.managers; + +import eu.eudat.data.entities.DataRepository; +import eu.eudat.data.entities.Registry; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.models.data.datarepository.DataRepositoryModel; +import eu.eudat.models.data.registries.RegistryModel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class RegistryManager { + + private ApiContext apiContext; + + @Autowired + public RegistryManager(ApiContext apiContext) { + this.apiContext = apiContext; + } + + public Registry create(RegistryModel registryModel) throws Exception { + Registry registry = registryModel.toDataModel(); + return apiContext.getOperationsContext().getDatabaseRepository().getRegistryDao().createOrUpdate(registry); + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ResearcherManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ResearcherManager.java index c0aabc0fa..4c98de920 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ResearcherManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ResearcherManager.java @@ -10,34 +10,48 @@ import eu.eudat.logic.proxy.config.exceptions.NoURLFound; import eu.eudat.logic.proxy.fetching.RemoteFetcher; import eu.eudat.queryable.QueryableList; import eu.eudat.logic.services.ApiContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * Created by ikalyvas on 2/5/2018. */ +@Component public class ResearcherManager { - public static Researcher create(ApiContext apiContext, eu.eudat.models.data.researcher.Researcher researcher) throws Exception { + private ApiContext apiContext; + private RemoteFetcher remoteFetcher; + + @Autowired + public ResearcherManager(ApiContext apiContext) { + this.apiContext = apiContext; + this.remoteFetcher = apiContext.getOperationsContext().getRemoteFetcher(); + } + + public Researcher create(eu.eudat.models.data.researcher.Researcher researcher) throws Exception { Researcher researcherEntity = researcher.toDataModel(); return apiContext.getOperationsContext().getDatabaseRepository().getResearcherDao().createOrUpdate(researcherEntity); } - public static List getCriteriaWithExternal(ApiContext apiContext, RemoteFetcher remoteFetcher, ResearcherCriteriaRequest researcherCriteriaRequest) throws HugeResultSet, NoURLFound { + public List getCriteriaWithExternal(ResearcherCriteriaRequest researcherCriteriaRequest) throws HugeResultSet, NoURLFound { QueryableList items = apiContext.getOperationsContext().getDatabaseRepository().getResearcherDao().getWithCriteria(researcherCriteriaRequest.getCriteria()); List researchers = items.select(item -> new eu.eudat.models.data.dmp.Researcher().fromDataModel(item)); - List> remoteRepos = remoteFetcher.getResearchers(researcherCriteriaRequest.getCriteria().getLike(),null); + List> remoteRepos = remoteFetcher.getResearchers(researcherCriteriaRequest.getCriteria().getName(),null); ResearchersExternalSourcesModel researchersExternalSourcesModel = new ResearchersExternalSourcesModel().fromExternalItem(remoteRepos); for (ExternalSourcesItemModel externalListingItem : researchersExternalSourcesModel) { eu.eudat.models.data.dmp.Researcher researcher = apiContext.getOperationsContext().getBuilderFactory().getBuilder(ResearcherBuilder.class) - .label(externalListingItem.getAbbreviation()).id(externalListingItem.getId()) + .label(externalListingItem.getAbbreviation()) + .id(externalListingItem.getId()) .name(externalListingItem.getName()) + .tag(externalListingItem.getTag()) .build(); researchers.add(researcher); } - researchers.stream().distinct(); - return researchers; + return researchers.stream().distinct().collect(Collectors.toList()); } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ServiceManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ServiceManager.java new file mode 100644 index 000000000..109c972a8 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ServiceManager.java @@ -0,0 +1,28 @@ +package eu.eudat.logic.managers; + +import eu.eudat.data.entities.Registry; +import eu.eudat.data.entities.Service; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.models.data.registries.RegistryModel; +import eu.eudat.models.data.services.ServiceModel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * Created by ikalyvas on 9/3/2018. + */ +@Component +public class ServiceManager { + + private ApiContext apiContext; + + @Autowired + public ServiceManager(ApiContext apiContext) { + this.apiContext = apiContext; + } + + public Service create(ServiceModel serviceModel) throws Exception { + Service service = serviceModel.toDataModel(); + return apiContext.getOperationsContext().getDatabaseRepository().getServiceDao().createOrUpdate(service); + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/UserManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/UserManager.java index cf9359ac2..364723317 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/UserManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/UserManager.java @@ -1,55 +1,113 @@ package eu.eudat.logic.managers; +import com.fasterxml.jackson.databind.ObjectMapper; +import eu.eudat.data.dao.entities.UserInfoDao; +import eu.eudat.data.entities.DMP; +import eu.eudat.data.entities.UserInfo; +import eu.eudat.data.entities.UserRole; +import eu.eudat.data.query.items.table.userinfo.UserInfoTableRequestItem; +import eu.eudat.exceptions.security.NullEmailException; +import eu.eudat.exceptions.security.UnauthorisedException; import eu.eudat.logic.builders.entity.UserRoleBuilder; import eu.eudat.logic.builders.model.models.DataTableDataBuilder; -import eu.eudat.data.entities.UserRole; -import eu.eudat.exceptions.security.UnauthorisedException; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.logic.services.operations.authentication.AuthenticationService; +import eu.eudat.logic.utilities.builders.XmlBuilder; +import eu.eudat.models.HintedModelFactory; +import eu.eudat.models.data.dmp.DataManagementPlan; import eu.eudat.models.data.helpers.common.DataTableData; import eu.eudat.models.data.login.Credentials; import eu.eudat.models.data.security.Principal; -import eu.eudat.data.query.items.table.userinfo.UserInfoTableRequestItem; import eu.eudat.models.data.userinfo.UserListingModel; +import eu.eudat.models.data.userinfo.UserProfile; import eu.eudat.queryable.QueryableList; -import eu.eudat.logic.services.ApiContext; -import eu.eudat.logic.services.operations.AuthenticationServiceImpl; -import eu.eudat.logic.utilities.builders.XmlBuilder; +import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; import org.w3c.dom.Document; import org.w3c.dom.Element; +import java.io.IOException; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.stream.Collectors; +@Component public class UserManager { - public static eu.eudat.models.data.user.composite.DatasetProfile generateDatasetProfileModel(eu.eudat.data.entities.DatasetProfile profile) { - Document viewStyleDoc = XmlBuilder.fromXml(profile.getDefinition()); - Element root = (Element) viewStyleDoc.getDocumentElement(); - eu.eudat.models.data.entities.xmlmodels.datasetprofiledefinition.ViewStyleModel viewstyle = new eu.eudat.models.data.entities.xmlmodels.datasetprofiledefinition.ViewStyleModel().fromXml(root); - eu.eudat.models.data.user.composite.DatasetProfile datasetprofile = new eu.eudat.models.data.user.composite.DatasetProfile(); - datasetprofile.buildProfile(viewstyle); + private ApiContext apiContext; - return datasetprofile; - } + @Autowired + public UserManager(ApiContext apiContext) { + this.apiContext = apiContext; + } - public static DataTableData getPaged(ApiContext apiContext, UserInfoTableRequestItem userInfoTableRequestItem) throws Exception { - QueryableList users = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().getWithCriteria(userInfoTableRequestItem.getCriteria()); - QueryableList pagedUsers = PaginationManager.applyPaging(users, userInfoTableRequestItem); + public eu.eudat.models.data.user.composite.DatasetProfile generateDatasetProfileModel(eu.eudat.data.entities.DatasetProfile profile) { + Document viewStyleDoc = XmlBuilder.fromXml(profile.getDefinition()); + Element root = (Element) viewStyleDoc.getDocumentElement(); + eu.eudat.models.data.entities.xmlmodels.datasetprofiledefinition.ViewStyleModel viewstyle = new eu.eudat.models.data.entities.xmlmodels.datasetprofiledefinition.ViewStyleModel().fromXml(root); - List modelUsers = pagedUsers.select(item -> new UserListingModel().fromDataModel(item)); - return apiContext.getOperationsContext().getBuilderFactory().getBuilder(DataTableDataBuilder.class).totalCount(users.count()).data(modelUsers).build(); - } + eu.eudat.models.data.user.composite.DatasetProfile datasetprofile = new eu.eudat.models.data.user.composite.DatasetProfile(); + datasetprofile.buildProfile(viewstyle); - public static void editRoles(ApiContext apiContext, UserListingModel user) { - eu.eudat.data.entities.UserInfo userInfo = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(user.getId()); - userInfo.getUserRoles().stream().forEach(item -> apiContext.getOperationsContext().getDatabaseRepository().getUserRoleDao().delete(item)); - for (Integer role : user.getAppRoles()) { - UserRole userRole = apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserRoleBuilder.class).role(role).userInfo(userInfo).build(); - apiContext.getOperationsContext().getDatabaseRepository().getUserRoleDao().createOrUpdate(userRole); - } - } + return datasetprofile; + } - public static Principal authenticate(AuthenticationServiceImpl authenticationServiceImpl, Credentials credentials) { - Principal principal = authenticationServiceImpl.Touch(credentials); - if (principal == null) throw new UnauthorisedException("Could not Sign In User"); - return principal; - } + public DataTableData getPaged(UserInfoTableRequestItem userInfoTableRequestItem) throws Exception { + QueryableList users = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().getWithCriteria(userInfoTableRequestItem.getCriteria()).withHint(HintedModelFactory.getHint(UserListingModel.class)); + QueryableList pagedUsers = PaginationManager.applyPaging(users, userInfoTableRequestItem); + + List modelUsers = pagedUsers.select(item -> new UserListingModel().fromDataModel(item)); + return apiContext.getOperationsContext().getBuilderFactory().getBuilder(DataTableDataBuilder.class).totalCount(users.count()).data(modelUsers).build(); + } + + public UserProfile getSingle(UUID userId) throws Exception { + eu.eudat.data.entities.UserInfo user = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(userId); + UserProfile profile = new UserProfile().fromDataModel(user); + List dmps = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getAuthenticated(apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().asQueryable(), userId).take(5).toList(); + profile.setAssociatedDmps(dmps.stream().map(x -> new DataManagementPlan().fromDataModel(x)).collect(Collectors.toList())); + return profile; + } + + public void editRoles(UserListingModel user) { + eu.eudat.data.entities.UserInfo userInfo = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(user.getId()); + userInfo.getUserRoles().stream().forEach(item -> apiContext.getOperationsContext().getDatabaseRepository().getUserRoleDao().delete(item)); + for (Integer role : user.getAppRoles()) { + UserRole userRole = apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserRoleBuilder.class).role(role).userInfo(userInfo).build(); + apiContext.getOperationsContext().getDatabaseRepository().getUserRoleDao().createOrUpdate(userRole); + } + } + + public void updateSettings(Map settings, Principal principal) throws IOException { + eu.eudat.data.entities.UserInfo userInfo = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(principal.getId()); + apiContext.getOperationsContext().getDatabaseRepository().detachEntity(userInfo); + HashMap result = + new ObjectMapper().readValue(userInfo.getAdditionalinfo(), HashMap.class); + result.putAll(settings); + userInfo.setAdditionalinfo(new JSONObject(result).toString()); + apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao() + .createOrUpdate(userInfo); + } + + public Principal authenticate(AuthenticationService authenticationServiceImpl, Credentials credentials) throws NullEmailException { + Principal principal = authenticationServiceImpl.Touch(credentials); + if (principal == null) throw new UnauthorisedException("Could not Sign In User"); + return principal; + } + + public DataTableData getCollaboratorsPaged(UserInfoTableRequestItem userInfoTableRequestItem, Principal principal) throws Exception { + UserInfoDao userInfoDao = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao(); + QueryableList users = userInfoDao.getWithCriteria(userInfoTableRequestItem.getCriteria()); + + List colaborators = userInfoDao.getAuthenticated(users, principal.getId()) + .withHint(HintedModelFactory.getHint(UserListingModel.class)) + .select(colaborator -> new UserListingModel().fromDataModel(colaborator)); + + DataTableData dataTableData = new DataTableData<>(); + dataTableData.setData(colaborators); + dataTableData.setTotalCount((long) colaborators.size()); + return dataTableData; + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/DataFieldsUrlConfiguration.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/DataFieldsUrlConfiguration.java new file mode 100644 index 000000000..829e75b88 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/DataFieldsUrlConfiguration.java @@ -0,0 +1,60 @@ +package eu.eudat.logic.proxy.config; + +import javax.xml.bind.annotation.XmlElement; + +/** + * Created by ikalyvas on 6/29/2018. + */ +public class DataFieldsUrlConfiguration { + private String id; + private String name; + private String uri; + private String description; + private String source; + + public String getId() { + return id; + } + + @XmlElement(name = "id") + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + @XmlElement(name = "name") + public void setName(String name) { + this.name = name; + } + + + public String getUri() { + return uri; + } + + @XmlElement(name = "uri") + public void setUri(String uri) { + this.uri = uri; + } + + public String getDescription() { + return description; + } + + @XmlElement(name = "description") + public void setDescription(String description) { + this.description = description; + } + + public String getSource() { + return source; + } + + @XmlElement(name = "source") + public void setSource(String source) { + this.source = source; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/DataUrlConfiguration.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/DataUrlConfiguration.java new file mode 100644 index 000000000..d098f62cf --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/DataUrlConfiguration.java @@ -0,0 +1,29 @@ +package eu.eudat.logic.proxy.config; + +import javax.xml.bind.annotation.XmlElement; + +/** + * Created by ikalyvas on 6/29/2018. + */ +public class DataUrlConfiguration { + private String path; + private DataFieldsUrlConfiguration fieldsUrlConfiguration; + + public String getPath() { + return path; + } + + @XmlElement(name = "path") + public void setPath(String path) { + this.path = path; + } + + public DataFieldsUrlConfiguration getFieldsUrlConfiguration() { + return fieldsUrlConfiguration; + } + + @XmlElement(name = "fields") + public void setFieldsUrlConfiguration(DataFieldsUrlConfiguration fieldsUrlConfiguration) { + this.fieldsUrlConfiguration = fieldsUrlConfiguration; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/ExternalUrls.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/ExternalUrls.java index cc5c34260..eb04c9a4a 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/ExternalUrls.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/ExternalUrls.java @@ -10,12 +10,11 @@ import java.io.Serializable; @XmlRootElement public class ExternalUrls implements Serializable { - private static final long serialVersionUID = -5076364662014107275L; - Long maxresults; + GrantUrls grants; ProjectUrls projects; RegistryUrls registries; RepositoryUrls repositories; @@ -23,6 +22,8 @@ public class ExternalUrls implements Serializable { ResearcherUrls researchers; OrganisationUrls organisations; DatasetUrls datasets; + TagUrls tags; + FunderUrls funders; public RegistryUrls getRegistries() { @@ -65,6 +66,16 @@ public class ExternalUrls implements Serializable { } + public TagUrls getTags() { + return tags; + } + + @XmlElement(name = "tags") + public void setTags(TagUrls tags) { + this.tags = tags; + } + + public OrganisationUrls getOrganisations() { return organisations; } @@ -74,6 +85,17 @@ public class ExternalUrls implements Serializable { this.organisations = organisations; } + + public GrantUrls getGrants() { + return grants; + } + + @XmlElement(name = "grants") + public void setGrants(GrantUrls grants) { + this.grants = grants; + } + + public ProjectUrls getProjects() { return projects; } @@ -83,6 +105,16 @@ public class ExternalUrls implements Serializable { this.projects = projects; } + + public FunderUrls getFunders() { + return funders; + } + + public void setFunders(FunderUrls funders) { + this.funders = funders; + } + + public Long getMaxresults() { return maxresults; } @@ -92,6 +124,7 @@ public class ExternalUrls implements Serializable { this.maxresults = maxresults; } + public DatasetUrls getDatasets() { return datasets; } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/UrlConfig.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/UrlConfig.java deleted file mode 100644 index 47f0c0163..000000000 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/UrlConfig.java +++ /dev/null @@ -1,70 +0,0 @@ -package eu.eudat.logic.proxy.config; - - -import javax.xml.bind.annotation.XmlElement; - -public class UrlConfig { - - private String key; - private String label; - private Integer ordinal; - private String url; - private String dataPath; - private String paginationPath; - - public String getKey() { - return key; - } - - @XmlElement(name = "key") - public void setKey(String key) { - this.key = key; - } - - public String getLabel() { - return label; - } - - @XmlElement(name = "label") - public void setLabel(String label) { - this.label = label; - } - - public String getUrl() { - return url; - } - - @XmlElement(name = "url") - public void setUrl(String url) { - this.url = url; - } - - public Integer getOrdinal() { - return ordinal; - } - - @XmlElement(name = "ordinal") - public void setOrdinal(Integer ordinal) { - this.ordinal = ordinal; - } - - public String getDataPath() { - return dataPath; - } - - @XmlElement(name = "datapath") - public void setDataPath(String dataPath) { - this.dataPath = dataPath; - } - - public String getPaginationPath() { - return paginationPath; - } - - @XmlElement(name = "paginationpath") - public void setPaginationPath(String paginationPath) { - this.paginationPath = paginationPath; - } - - -} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/UrlConfiguration.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/UrlConfiguration.java new file mode 100644 index 000000000..9a9912c5a --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/UrlConfiguration.java @@ -0,0 +1,78 @@ +package eu.eudat.logic.proxy.config; + + +import javax.xml.bind.annotation.XmlElement; + +public class UrlConfiguration { + + private String key; + private String label; + private Integer ordinal; + private String url; + private DataUrlConfiguration data; + private String type; + private String paginationPath; + + public String getKey() { + return key; + } + + @XmlElement(name = "key") + public void setKey(String key) { + this.key = key; + } + + public String getLabel() { + return label; + } + + @XmlElement(name = "label") + public void setLabel(String label) { + this.label = label; + } + + public String getUrl() { + return url; + } + + @XmlElement(name = "url") + public void setUrl(String url) { + this.url = url; + } + + public Integer getOrdinal() { + return ordinal; + } + + @XmlElement(name = "ordinal") + public void setOrdinal(Integer ordinal) { + this.ordinal = ordinal; + } + + public DataUrlConfiguration getData() { + return data; + } + + @XmlElement(name = "data") + public void setData(DataUrlConfiguration data) { + this.data = data; + } + + public String getPaginationPath() { + return paginationPath; + } + + @XmlElement(name = "paginationpath") + public void setPaginationPath(String paginationPath) { + this.paginationPath = paginationPath; + } + + public String getType() { + return type; + } + + @XmlElement(name = "type") + public void setType(String type) { + this.type = type; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/DevelConfigLoader.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/DevelConfigLoader.java index 2eb029dd4..4af836fbd 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/DevelConfigLoader.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/DevelConfigLoader.java @@ -31,7 +31,7 @@ public class DevelConfigLoader implements ConfigLoader { JAXBContext jaxbContext = JAXBContext.newInstance(ExternalUrls.class); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); - is = new URL("file:///C:/Users/ikalyvas/Documents/OpenAIRE-EUDAT-DMP-service-pilot/dmp-backend/web/src/main/resources/ExternalUrls.xml").openStream(); + is = new URL("file:///"+current+"/web/src/main/resources/ExternalUrls.xml").openStream(); externalUrls = (ExternalUrls) jaxbUnmarshaller.unmarshal(is); } catch (Exception ex) { diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/ProductionConfigLoader.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/ProductionConfigLoader.java index 82828a0ed..4acb43b97 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/ProductionConfigLoader.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/configloaders/ProductionConfigLoader.java @@ -11,12 +11,13 @@ import javax.xml.bind.Unmarshaller; import java.io.IOException; import java.io.InputStream; import java.net.URL; +import java.nio.file.Paths; /** * Created by ikalyvas on 2/9/2018. */ @Service("configLoader") -@Profile("production") +@Profile({ "production", "staging" }) public class ProductionConfigLoader implements ConfigLoader { private ExternalUrls externalUrls; @@ -34,7 +35,7 @@ public class ProductionConfigLoader implements ConfigLoader { JAXBContext jaxbContext = JAXBContext.newInstance(ExternalUrls.class); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); - is = new URL("file:///" + System.getenv("CATALINA_HOME") + fileUrl).openStream(); + is = new URL(Paths.get(fileUrl).toUri().toURL().toString()).openStream(); externalUrls = (ExternalUrls) jaxbUnmarshaller.unmarshal(is); } catch (Exception ex) { diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/DatasetUrls.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/DatasetUrls.java index 587158d13..2c1f2aca0 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/DatasetUrls.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/DatasetUrls.java @@ -1,7 +1,7 @@ package eu.eudat.logic.proxy.config.entities; import eu.eudat.logic.proxy.config.FetchStrategy; -import eu.eudat.logic.proxy.config.UrlConfig; +import eu.eudat.logic.proxy.config.UrlConfiguration; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; @@ -9,16 +9,16 @@ import java.util.List; public class DatasetUrls { - List urls; + List urls; FetchStrategy fetchMode; - public List getUrls() { + public List getUrls() { return urls; } @XmlElementWrapper @XmlElement(name = "urlConfig") - public void setUrls(List urls) { + public void setUrls(List urls) { this.urls = urls; } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/FunderUrls.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/FunderUrls.java new file mode 100644 index 000000000..385efe039 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/FunderUrls.java @@ -0,0 +1,33 @@ +package eu.eudat.logic.proxy.config.entities; + +import eu.eudat.logic.proxy.config.FetchStrategy; +import eu.eudat.logic.proxy.config.UrlConfiguration; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import java.util.List; + +public class FunderUrls { + + List urls; + FetchStrategy fetchMode; + + public List getUrls() { + return urls; + } + + @XmlElementWrapper + @XmlElement(name = "urlConfig") + public void setUrls(List urls) { + this.urls = urls; + } + + public FetchStrategy getFetchMode() { + return fetchMode; + } + + @XmlElement(name = "fetchMode") + public void setFetchMode(FetchStrategy fetchMode) { + this.fetchMode = fetchMode; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/GrantUrls.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/GrantUrls.java new file mode 100644 index 000000000..f8f0c261e --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/GrantUrls.java @@ -0,0 +1,35 @@ +package eu.eudat.logic.proxy.config.entities; + +import eu.eudat.logic.proxy.config.FetchStrategy; +import eu.eudat.logic.proxy.config.UrlConfiguration; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import java.util.List; + + +public class GrantUrls { + + List urls; + FetchStrategy fetchMode; + + public List getUrls() { + return urls; + } + + @XmlElementWrapper + @XmlElement(name = "urlConfig") + public void setUrls(List urls) { + this.urls = urls; + } + + public FetchStrategy getFetchMode() { + return fetchMode; + } + + @XmlElement(name = "fetchMode") + public void setFetchMode(FetchStrategy fetchMode) { + this.fetchMode = fetchMode; + } + +} \ No newline at end of file diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/OrganisationUrls.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/OrganisationUrls.java index 702436d0f..714907a59 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/OrganisationUrls.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/OrganisationUrls.java @@ -1,7 +1,7 @@ package eu.eudat.logic.proxy.config.entities; import eu.eudat.logic.proxy.config.FetchStrategy; -import eu.eudat.logic.proxy.config.UrlConfig; +import eu.eudat.logic.proxy.config.UrlConfiguration; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; @@ -9,16 +9,16 @@ import java.util.List; public class OrganisationUrls { - List urls; + List urls; FetchStrategy fetchMode; - public List getUrls() { + public List getUrls() { return urls; } @XmlElementWrapper @XmlElement(name = "urlConfig") - public void setUrls(List urls) { + public void setUrls(List urls) { this.urls = urls; } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/ProjectUrls.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/ProjectUrls.java index 6cb7a5b74..d07fb59b4 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/ProjectUrls.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/ProjectUrls.java @@ -1,35 +1,33 @@ package eu.eudat.logic.proxy.config.entities; import eu.eudat.logic.proxy.config.FetchStrategy; -import eu.eudat.logic.proxy.config.UrlConfig; +import eu.eudat.logic.proxy.config.UrlConfiguration; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import java.util.List; - public class ProjectUrls { - List urls; - FetchStrategy fetchMode; + List urls; + FetchStrategy fetchMode; - public List getUrls() { - return urls; - } + public List getUrls() { + return urls; + } - @XmlElementWrapper - @XmlElement(name = "urlConfig") - public void setUrls(List urls) { - this.urls = urls; - } + @XmlElementWrapper + @XmlElement(name = "urlConfig") + public void setUrls(List urls) { + this.urls = urls; + } - public FetchStrategy getFetchMode() { - return fetchMode; - } + public FetchStrategy getFetchMode() { + return fetchMode; + } - @XmlElement(name = "fetchMode") - public void setFetchMode(FetchStrategy fetchMode) { - this.fetchMode = fetchMode; - } - -} \ No newline at end of file + @XmlElement(name = "fetchMode") + public void setFetchMode(FetchStrategy fetchMode) { + this.fetchMode = fetchMode; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/RegistryUrls.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/RegistryUrls.java index eac9aa622..77d8efc6e 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/RegistryUrls.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/RegistryUrls.java @@ -1,7 +1,7 @@ package eu.eudat.logic.proxy.config.entities; import eu.eudat.logic.proxy.config.FetchStrategy; -import eu.eudat.logic.proxy.config.UrlConfig; +import eu.eudat.logic.proxy.config.UrlConfiguration; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; @@ -9,16 +9,16 @@ import java.util.List; public class RegistryUrls { - List urls; + List urls; FetchStrategy fetchMode; - public List getUrls() { + public List getUrls() { return urls; } @XmlElementWrapper @XmlElement(name = "urlConfig") - public void setUrls(List urls) { + public void setUrls(List urls) { this.urls = urls; } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/RepositoryUrls.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/RepositoryUrls.java index e9009fe45..e135f12af 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/RepositoryUrls.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/RepositoryUrls.java @@ -1,7 +1,7 @@ package eu.eudat.logic.proxy.config.entities; import eu.eudat.logic.proxy.config.FetchStrategy; -import eu.eudat.logic.proxy.config.UrlConfig; +import eu.eudat.logic.proxy.config.UrlConfiguration; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; @@ -9,16 +9,16 @@ import java.util.List; public class RepositoryUrls { - List urls; + List urls; FetchStrategy fetchMode; - public List getUrls() { + public List getUrls() { return urls; } @XmlElementWrapper @XmlElement(name = "urlConfig") - public void setUrls(List urls) { + public void setUrls(List urls) { this.urls = urls; } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/ResearcherUrls.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/ResearcherUrls.java index 0baa1127e..98852f54b 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/ResearcherUrls.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/ResearcherUrls.java @@ -1,7 +1,7 @@ package eu.eudat.logic.proxy.config.entities; import eu.eudat.logic.proxy.config.FetchStrategy; -import eu.eudat.logic.proxy.config.UrlConfig; +import eu.eudat.logic.proxy.config.UrlConfiguration; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; @@ -9,16 +9,16 @@ import java.util.List; public class ResearcherUrls { - List urls; + List urls; FetchStrategy fetchMode; - public List getUrls() { + public List getUrls() { return urls; } @XmlElementWrapper @XmlElement(name = "urlConfig") - public void setUrls(List urls) { + public void setUrls(List urls) { this.urls = urls; } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/ServiceUrls.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/ServiceUrls.java index 2e1ecde1c..c915ac52e 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/ServiceUrls.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/ServiceUrls.java @@ -1,7 +1,7 @@ package eu.eudat.logic.proxy.config.entities; import eu.eudat.logic.proxy.config.FetchStrategy; -import eu.eudat.logic.proxy.config.UrlConfig; +import eu.eudat.logic.proxy.config.UrlConfiguration; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; @@ -9,16 +9,16 @@ import java.util.List; public class ServiceUrls { - List urls; + List urls; FetchStrategy fetchMode; - public List getUrls() { + public List getUrls() { return urls; } @XmlElementWrapper @XmlElement(name = "urlConfig") - public void setUrls(List urls) { + public void setUrls(List urls) { this.urls = urls; } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/TagUrls.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/TagUrls.java new file mode 100644 index 000000000..e3040b1a5 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/TagUrls.java @@ -0,0 +1,35 @@ +package eu.eudat.logic.proxy.config.entities; + +import eu.eudat.logic.proxy.config.FetchStrategy; +import eu.eudat.logic.proxy.config.UrlConfiguration; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import java.util.List; + +/** + * Created by ikalyvas on 7/9/2018. + */ +public class TagUrls { + List urls; + FetchStrategy fetchMode; + + public List getUrls() { + return urls; + } + + @XmlElementWrapper + @XmlElement(name = "urlConfig") + public void setUrls(List urls) { + this.urls = urls; + } + + public FetchStrategy getFetchMode() { + return fetchMode; + } + + @XmlElement(name = "fetchMode") + public void setFetchMode(FetchStrategy fetchMode) { + this.fetchMode = fetchMode; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java index 900197b8f..b627f8e74 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java @@ -1,17 +1,21 @@ package eu.eudat.logic.proxy.fetching; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; import com.jayway.jsonpath.DocumentContext; import com.jayway.jsonpath.JsonPath; -import eu.eudat.configurations.dynamicproject.DynamicProjectConfiguration; +import eu.eudat.logic.proxy.config.DataUrlConfiguration; import eu.eudat.logic.proxy.config.FetchStrategy; -import eu.eudat.logic.proxy.config.UrlConfig; +import eu.eudat.logic.proxy.config.UrlConfiguration; import eu.eudat.logic.proxy.config.configloaders.ConfigLoader; import eu.eudat.logic.proxy.config.exceptions.HugeResultSet; import eu.eudat.logic.proxy.config.exceptions.NoURLFound; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; +import java.io.File; import java.io.IOException; import java.net.HttpURLConnection; import java.net.MalformedURLException; @@ -24,34 +28,48 @@ public class RemoteFetcher { private ConfigLoader configLoader; - private DynamicProjectConfiguration dynamicProjectConfiguration; + @Value("${configuration.resources.path}") + private String resourcesPath; @Autowired - public RemoteFetcher(ConfigLoader configLoader, DynamicProjectConfiguration dynamicProjectConfiguration) { + public RemoteFetcher(ConfigLoader configLoader) { this.configLoader = configLoader; - this.dynamicProjectConfiguration = dynamicProjectConfiguration; } @Cacheable("repositories") public List> getRepositories(String query, String key) throws NoURLFound, HugeResultSet { - List urlConfigs = - key != null ? configLoader.getExternalUrls().getRepositories().getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList()) + List urlConfigs = + key != null && !key.isEmpty() ? configLoader.getExternalUrls().getRepositories().getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList()) : configLoader.getExternalUrls().getRepositories().getUrls(); FetchStrategy fetchStrategy = configLoader.getExternalUrls().getRepositories().getFetchMode(); return getAll(urlConfigs, fetchStrategy, query); } + @Cacheable("grants") + public List> getGrants(String query) throws NoURLFound, HugeResultSet { + List urlConfigs = configLoader.getExternalUrls().getGrants().getUrls(); + FetchStrategy fetchStrategy = configLoader.getExternalUrls().getGrants().getFetchMode(); + return getAll(urlConfigs, fetchStrategy, query); + } + @Cacheable("projects") public List> getProjects(String query) throws NoURLFound, HugeResultSet { - List urlConfigs = Arrays.asList(this.dynamicProjectConfiguration.getConfiguration().getMainExternalField().getUrlConfig()); + List urlConfigs = configLoader.getExternalUrls().getProjects().getUrls(); + FetchStrategy fetchStrategy = configLoader.getExternalUrls().getProjects().getFetchMode(); + return getAll(urlConfigs, fetchStrategy, query); + } + + @Cacheable("funders") + public List> getFunders(String query) throws NoURLFound, HugeResultSet { + List urlConfigs = configLoader.getExternalUrls().getFunders().getUrls(); FetchStrategy fetchStrategy = configLoader.getExternalUrls().getProjects().getFetchMode(); return getAll(urlConfigs, fetchStrategy, query); } @Cacheable("organisations") public List> getOrganisations(String query, String key) throws NoURLFound, HugeResultSet { - List urlConfigs = - key != null ? configLoader.getExternalUrls().getOrganisations().getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList()) + List urlConfigs = + key != null && !key.isEmpty() ? configLoader.getExternalUrls().getOrganisations().getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList()) : configLoader.getExternalUrls().getOrganisations().getUrls(); FetchStrategy fetchStrategy = configLoader.getExternalUrls().getOrganisations().getFetchMode(); return getAll(urlConfigs, fetchStrategy, query); @@ -59,64 +77,81 @@ public class RemoteFetcher { @Cacheable("registries") public List> getRegistries(String query, String key) throws NoURLFound, HugeResultSet { - List urlConfigs = - key != null ? configLoader.getExternalUrls().getRegistries().getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList()) + List urlConfigs = + key != null && !key.isEmpty() ? configLoader.getExternalUrls().getRegistries().getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList()) : configLoader.getExternalUrls().getRegistries().getUrls(); FetchStrategy fetchStrategy = configLoader.getExternalUrls().getRegistries().getFetchMode(); return getAll(urlConfigs, fetchStrategy, query); } @Cacheable("services") - public List> getServices(String query,String key) throws NoURLFound, HugeResultSet { - List urlConfigs = - key != null ? configLoader.getExternalUrls().getServices().getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList()) + public List> getServices(String query, String key) throws NoURLFound, HugeResultSet { + List urlConfigs = + key != null && !key.isEmpty() ? configLoader.getExternalUrls().getServices().getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList()) : configLoader.getExternalUrls().getServices().getUrls(); FetchStrategy fetchStrategy = configLoader.getExternalUrls().getServices().getFetchMode(); return getAll(urlConfigs, fetchStrategy, query); } @Cacheable("researchers") - public List> getResearchers(String query,String key) throws NoURLFound, HugeResultSet { - List urlConfigs = - key != null ? configLoader.getExternalUrls().getResearchers().getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList()) + public List> getResearchers(String query, String key) throws NoURLFound, HugeResultSet { + List urlConfigs = + key != null && !key.isEmpty() ? configLoader.getExternalUrls().getResearchers().getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList()) : configLoader.getExternalUrls().getResearchers().getUrls(); FetchStrategy fetchStrategy = configLoader.getExternalUrls().getResearchers().getFetchMode(); return getAll(urlConfigs, fetchStrategy, query); } + @Cacheable("tags") + public List> getTags(String query, String key) throws NoURLFound, HugeResultSet { + List urlConfigs = + key != null && !key.isEmpty() ? configLoader.getExternalUrls().getTags().getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList()) + : configLoader.getExternalUrls().getTags().getUrls(); + FetchStrategy fetchStrategy = configLoader.getExternalUrls().getTags().getFetchMode(); + return getAll(urlConfigs, fetchStrategy, query); + } + @Cacheable("datasets") - public List> getDatasets(String query,String key) throws NoURLFound, HugeResultSet { - List urlConfigs = - key != null ? configLoader.getExternalUrls().getDatasets().getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList()) + public List> getDatasets(String query, String key) throws NoURLFound, HugeResultSet { + List urlConfigs = + key != null && !key.isEmpty() ? configLoader.getExternalUrls().getDatasets().getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList()) : configLoader.getExternalUrls().getDatasets().getUrls(); FetchStrategy fetchStrategy = configLoader.getExternalUrls().getDatasets().getFetchMode(); return getAll(urlConfigs, fetchStrategy, query); } - private List> getAll(List urlConfigs, FetchStrategy fetchStrategy, String query) throws NoURLFound, HugeResultSet { + private List> getAll(List urlConfigs, FetchStrategy fetchStrategy, String query) throws NoURLFound, HugeResultSet { if (urlConfigs == null || urlConfigs.isEmpty()) throw new NoURLFound("No Repository urls found in configuration"); - Collections.sort(urlConfigs, Comparator.comparing(UrlConfig::getOrdinal)); - - return getAllResultsFromUrl(urlConfigs.get(0).getUrl(), fetchStrategy, urlConfigs.get(0).getDataPath(), urlConfigs.get(0).getPaginationPath(), query); - + Collections.sort(urlConfigs, Comparator.comparing(UrlConfiguration::getOrdinal)); + List> results = new LinkedList<>(); + for (UrlConfiguration urlConfig : urlConfigs) { + if (urlConfig.getType() == null || urlConfig.getType().equals("External")) { + results.addAll(getAllResultsFromUrl(urlConfig.getUrl(), fetchStrategy, urlConfig.getData(), urlConfig.getPaginationPath(), query, urlConfig.getLabel())); + } + else if (urlConfig.getType() != null && urlConfig.getType().equals("Internal")) { + results.addAll(getAllResultsFromMockUpJson(urlConfig.getUrl(), query)); + } + } + return results; } - private List> getAllResultsFromUrl(String path, FetchStrategy fetchStrategy, final String jsonDataPath, final String jsonPaginationPath, String query) throws HugeResultSet { + private List> getAllResultsFromUrl(String path, FetchStrategy fetchStrategy, final DataUrlConfiguration jsonDataPath, final String jsonPaginationPath, String query, String key) throws HugeResultSet { Set pages = new HashSet(); final String searchQuery = (query != null) && !query.isEmpty() ? "&search=" + query : ""; - //first call Results results = getResultsFromUrl(path + "?page=1" + searchQuery, jsonDataPath, jsonPaginationPath); - //if fetch strategy is to get only first page, then return that if (fetchStrategy == FetchStrategy.FIRST) - return results == null ? new LinkedList<>() : results.getResults(); + return results == null ? new LinkedList<>() : results.getResults().stream().map(x -> { + x.put("tag", key); + return x; + }).collect(Collectors.toList()); if (results.getPagination() != null && results.getPagination().get("pages") != null) //if has more pages, add them to the pages set for (int i = 2; i <= results.getPagination().get("pages"); i++) @@ -126,7 +161,6 @@ public class RemoteFetcher { if ((maxResults > 0) && (results.getPagination().get("count") > maxResults)) throw new HugeResultSet("The submitted search query " + query + " is about to return " + results.getPagination().get("count") + " results... Please submit a more detailed search query"); - //remaining calls (if pages array has elements) Optional optionalResults = pages.parallelStream() .map(page -> getResultsFromUrl(path + "?page=" + page + searchQuery, jsonDataPath, jsonPaginationPath)) .reduce((result1, result2) -> { @@ -137,11 +171,14 @@ public class RemoteFetcher { remainingResults.getResults().addAll(results.getResults()); - return remainingResults.getResults(); + return remainingResults.getResults().stream().map(x -> { + x.put("tag", key); + return x; + }).collect(Collectors.toList()); } - private Results getResultsFromUrl(String urlString, String jsonDataPath, String jsonPaginationPath) { + private Results getResultsFromUrl(String urlString, DataUrlConfiguration jsonDataPath, String jsonPaginationPath) { try { @@ -155,37 +192,92 @@ public class RemoteFetcher { if (responseCode == HttpURLConnection.HTTP_OK) { // success //do here all the parsing DocumentContext jsonContext = JsonPath.parse(con.getInputStream()); - Results results = new Results(jsonContext.read(jsonDataPath), jsonContext.read(jsonPaginationPath)); + Results results; + if (jsonDataPath.getFieldsUrlConfiguration().getSource() != null) { + results = new Results(jsonContext.read(jsonDataPath.getPath() + + "[" + jsonDataPath.getFieldsUrlConfiguration().getName() + "," + jsonDataPath.getFieldsUrlConfiguration().getDescription() + + "," + jsonDataPath.getFieldsUrlConfiguration().getUri() + "," + jsonDataPath.getFieldsUrlConfiguration().getId() + + "," + jsonDataPath.getFieldsUrlConfiguration().getSource() + "]"), + jsonContext.read(jsonPaginationPath)); + } + else { + results = new Results(jsonContext.read(jsonDataPath.getPath() + + "[" + jsonDataPath.getFieldsUrlConfiguration().getName() + "," + jsonDataPath.getFieldsUrlConfiguration().getDescription() + + "," + jsonDataPath.getFieldsUrlConfiguration().getUri() + "," + jsonDataPath.getFieldsUrlConfiguration().getId() + "]"), + jsonContext.read(jsonPaginationPath)); + } + results.results = results.results.stream().map(e -> e.entrySet().stream().collect(Collectors.toMap(x -> this.transformKey(jsonDataPath,x.getKey()), Map.Entry::getValue))) + .collect(Collectors.toList()); return results; } } catch (MalformedURLException e1) { + e1.printStackTrace(); } //maybe print smth... catch (IOException e2) { + e2.printStackTrace(); + } //maybe print smth... + catch (Exception exception) { + exception.printStackTrace(); } //maybe print smth... finally { } return null; + } + private List> getAllResultsFromMockUpJson(String path, String query) { + String filePath = this.resourcesPath + path; + List> internalResults; + try { + ObjectMapper mapper = new ObjectMapper(); + internalResults = mapper.readValue(new File(filePath), new TypeReference>>(){}); + searchListMap(internalResults, query); + return internalResults; + } catch (Exception e) { + e.printStackTrace(); + return new LinkedList<>(); + } + } + + private List> searchListMap(List> internalResults, String query) { + List> list = new LinkedList<>(); + for (Map map : internalResults) + { + if (map.get("name") != null && map.get("name").toUpperCase().contains(query.toUpperCase())) { + list.add(map); + } + if (map.get("label") != null && map.get("label").toUpperCase().contains(query.toUpperCase())) { + list.add(map); + } + } + return list; + } + + private String transformKey(DataUrlConfiguration dataUrlConfiguration, String key) { + if (key.equals(dataUrlConfiguration.getFieldsUrlConfiguration().getId().replace("'",""))) return "pid"; + if (key.equals(dataUrlConfiguration.getFieldsUrlConfiguration().getDescription().replace("'",""))) return "description"; + if (key.equals(dataUrlConfiguration.getFieldsUrlConfiguration().getUri().replace("'",""))) return "uri"; + if (key.equals(dataUrlConfiguration.getFieldsUrlConfiguration().getName().replace("'",""))) return "name"; + if (key.equals(dataUrlConfiguration.getFieldsUrlConfiguration().getSource().replace("'",""))) return "source"; + return null; } - class Results { - + static class Results { List> results; Map pagination; - public Results() { + Results() { this.results = new ArrayList>(); this.pagination = new HashMap(); } - public Results(List> results, Map pagination) { + Results(List> results, Map pagination) { this.results = results; this.pagination = pagination; } - public List> getResults() { + List> getResults() { return results; } @@ -193,15 +285,12 @@ public class RemoteFetcher { this.results = results; } - public Map getPagination() { + Map getPagination() { return pagination; } public void setPagination(Map pagination) { this.pagination = pagination; } - - } - } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/security/CustomAuthenticationProvider.java b/dmp-backend/web/src/main/java/eu/eudat/logic/security/CustomAuthenticationProvider.java index 9b63ed582..5e8c75dd6 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/security/CustomAuthenticationProvider.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/security/CustomAuthenticationProvider.java @@ -1,6 +1,7 @@ package eu.eudat.logic.security; import eu.eudat.exceptions.security.NonValidTokenException; +import eu.eudat.exceptions.security.NullEmailException; import eu.eudat.exceptions.security.UnauthorisedException; import eu.eudat.models.data.login.LoginInfo; import eu.eudat.models.data.security.Principal; @@ -18,7 +19,7 @@ public class CustomAuthenticationProvider { @Autowired private TokenValidatorFactory tokenValidatorFactory; - public Principal authenticate(LoginInfo credentials) throws GeneralSecurityException { + public Principal authenticate(LoginInfo credentials) throws GeneralSecurityException, NullEmailException { String token = credentials.getTicket(); try { Principal principal = this.tokenValidatorFactory.getProvider(credentials.getProvider()).validateToken(credentials); @@ -30,6 +31,9 @@ public class CustomAuthenticationProvider { } catch (IOException e) { e.printStackTrace(); throw new UnauthorisedException("IO Exeption"); + } catch (NullEmailException e) { + e.printStackTrace(); + throw new NullEmailException(); } } } \ No newline at end of file diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/security/customproviders/B2Access/B2AccessCustomProvider.java b/dmp-backend/web/src/main/java/eu/eudat/logic/security/customproviders/B2Access/B2AccessCustomProvider.java new file mode 100644 index 000000000..27e615c76 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/security/customproviders/B2Access/B2AccessCustomProvider.java @@ -0,0 +1,12 @@ +package eu.eudat.logic.security.customproviders.B2Access; + +import eu.eudat.logic.security.validators.b2access.helpers.B2AccessResponseToken; + +/** + * Created by ikalyvas on 2/22/2018. + */ +public interface B2AccessCustomProvider { + B2AccessUser getUser(String accessToken); + + B2AccessResponseToken getAccessToken(String code, String redirectUri, String clientId, String clientSecret); +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/security/customproviders/B2Access/B2AccessCustomProviderImpl.java b/dmp-backend/web/src/main/java/eu/eudat/logic/security/customproviders/B2Access/B2AccessCustomProviderImpl.java new file mode 100644 index 000000000..4a4066fb4 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/security/customproviders/B2Access/B2AccessCustomProviderImpl.java @@ -0,0 +1,80 @@ +package eu.eudat.logic.security.customproviders.B2Access; + +import com.google.api.client.repackaged.org.apache.commons.codec.binary.Base64; +import eu.eudat.logic.security.validators.b2access.helpers.B2AccessResponseToken; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; + +import java.nio.charset.Charset; +import java.util.Map; + +/** + * Created by ikalyvas on 2/22/2018. + */ +@Component("b2AccessCustomProvider") +public class B2AccessCustomProviderImpl implements B2AccessCustomProvider { + + private Environment environment; + + @Autowired + public B2AccessCustomProviderImpl(Environment environment) { + this.environment = environment; + } + + public B2AccessUser getUser(String accessToken) { + RestTemplate restTemplate = new RestTemplate(); + HttpHeaders headers = this.createBearerAuthHeaders(accessToken); + HttpEntity entity = new HttpEntity<>(headers); + + Map values = restTemplate.exchange(this.environment.getProperty("b2access.externallogin.user_info_url"), HttpMethod.GET, entity, Map.class).getBody(); + B2AccessUser b2AccessUser = new B2AccessUser(); + b2AccessUser.setEmail((String)values.get("email")); + b2AccessUser.setId((String)values.get("urn:oid:2.5.4.49")); + b2AccessUser.setName((String)values.get("name")); + return b2AccessUser; + } + + @Override + public B2AccessResponseToken getAccessToken(String code, String redirectUri, String clientId, String clientSecret) { + RestTemplate template = new RestTemplate(); + HttpHeaders headers = this.createBasicAuthHeaders(clientId, clientSecret); + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + + MultiValueMap map = new LinkedMultiValueMap(); + map.add("code", code); + map.add("grant_type", "authorization_code"); + map.add("redirect_uri", redirectUri); + HttpEntity> request = new HttpEntity>(map, headers); + + + Map values = template.postForObject(this.environment.getProperty("b2access.externallogin.access_token_url"), request, Map.class); + B2AccessResponseToken b2AccessResponseToken = new B2AccessResponseToken(); + b2AccessResponseToken.setAccessToken((String) values.get("access_token")); + return b2AccessResponseToken; + } + + private HttpHeaders createBasicAuthHeaders(String username, String password) { + return new HttpHeaders() {{ + String auth = username + ":" + password; + byte[] encodedAuth = Base64.encodeBase64( + auth.getBytes(Charset.forName("US-ASCII"))); + String authHeader = "Basic " + new String(encodedAuth); + set("Authorization", authHeader); + }}; + } + + private HttpHeaders createBearerAuthHeaders(String accessToken) { + return new HttpHeaders() {{ + String authHeader = "Bearer " + new String(accessToken); + set("Authorization", authHeader); + }}; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/security/customproviders/B2Access/B2AccessUser.java b/dmp-backend/web/src/main/java/eu/eudat/logic/security/customproviders/B2Access/B2AccessUser.java new file mode 100644 index 000000000..a1dfcf95a --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/security/customproviders/B2Access/B2AccessUser.java @@ -0,0 +1,34 @@ +package eu.eudat.logic.security.customproviders.B2Access; + +/** + * Created by ikalyvas on 2/22/2018. + */ +public class B2AccessUser { + private String id; + private String name; + private String email; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/security/customproviders/B2AccessCustomProvider.java b/dmp-backend/web/src/main/java/eu/eudat/logic/security/customproviders/B2AccessCustomProvider.java deleted file mode 100644 index 64aaba361..000000000 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/security/customproviders/B2AccessCustomProvider.java +++ /dev/null @@ -1,12 +0,0 @@ -package eu.eudat.logic.security.customproviders; - -import eu.eudat.logic.security.validators.b2access.helpers.B2AccessResponseToken; - -/** - * Created by ikalyvas on 2/22/2018. - */ -public interface B2AccessCustomProvider { - B2AccessUser getUser(String accessToken); - - B2AccessResponseToken getAccessToken(String code, String redirectUri, String clientId, String clientSecret); -} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/security/customproviders/B2AccessCustomProviderImpl.java b/dmp-backend/web/src/main/java/eu/eudat/logic/security/customproviders/B2AccessCustomProviderImpl.java deleted file mode 100644 index c8f482023..000000000 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/security/customproviders/B2AccessCustomProviderImpl.java +++ /dev/null @@ -1,80 +0,0 @@ -package eu.eudat.logic.security.customproviders; - -import com.google.api.client.repackaged.org.apache.commons.codec.binary.Base64; -import eu.eudat.logic.security.validators.b2access.helpers.B2AccessResponseToken; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.env.Environment; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Component; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; -import org.springframework.web.client.RestTemplate; - -import java.nio.charset.Charset; -import java.util.Map; - -/** - * Created by ikalyvas on 2/22/2018. - */ -@Component("b2AccessCustomProvider") -public class B2AccessCustomProviderImpl implements B2AccessCustomProvider { - - private Environment environment; - - @Autowired - public B2AccessCustomProviderImpl(Environment environment) { - this.environment = environment; - } - - public B2AccessUser getUser(String accessToken) { - RestTemplate restTemplate = new RestTemplate(); - HttpHeaders headers = this.createBearerAuthHeaders(accessToken); - HttpEntity entity = new HttpEntity<>(headers); - - Map values = restTemplate.exchange(this.environment.getProperty("b2access.externallogin.user_info_url"), HttpMethod.GET, entity, Map.class).getBody(); - B2AccessUser b2AccessUser = new B2AccessUser(); - b2AccessUser.setEmail((String)values.get("email")); - b2AccessUser.setId((String)values.get("urn:oid:2.5.4.49")); - b2AccessUser.setName((String)values.get("name")); - return b2AccessUser; - } - - @Override - public B2AccessResponseToken getAccessToken(String code, String redirectUri, String clientId, String clientSecret) { - RestTemplate template = new RestTemplate(); - HttpHeaders headers = this.createBasicAuthHeaders(clientId, clientSecret); - headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); - - MultiValueMap map = new LinkedMultiValueMap(); - map.add("code", code); - map.add("grant_type", "authorization_code"); - map.add("redirect_uri", redirectUri); - HttpEntity> request = new HttpEntity>(map, headers); - - - Map values = template.postForObject(this.environment.getProperty("b2access.externallogin.access_token_url"), request, Map.class); - B2AccessResponseToken b2AccessResponseToken = new B2AccessResponseToken(); - b2AccessResponseToken.setAccessToken((String) values.get("access_token")); - return b2AccessResponseToken; - } - - private HttpHeaders createBasicAuthHeaders(String username, String password) { - return new HttpHeaders() {{ - String auth = username + ":" + password; - byte[] encodedAuth = Base64.encodeBase64( - auth.getBytes(Charset.forName("US-ASCII"))); - String authHeader = "Basic " + new String(encodedAuth); - set("Authorization", authHeader); - }}; - } - - private HttpHeaders createBearerAuthHeaders(String accessToken) { - return new HttpHeaders() {{ - String authHeader = "Bearer " + new String(accessToken); - set("Authorization", authHeader); - }}; - } -} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/security/customproviders/B2AccessUser.java b/dmp-backend/web/src/main/java/eu/eudat/logic/security/customproviders/B2AccessUser.java deleted file mode 100644 index f42ce4da9..000000000 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/security/customproviders/B2AccessUser.java +++ /dev/null @@ -1,34 +0,0 @@ -package eu.eudat.logic.security.customproviders; - -/** - * Created by ikalyvas on 2/22/2018. - */ -public class B2AccessUser { - private String id; - private String name; - private String email; - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } -} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/security/customproviders/ORCID/ORCIDCustomProvider.java b/dmp-backend/web/src/main/java/eu/eudat/logic/security/customproviders/ORCID/ORCIDCustomProvider.java new file mode 100644 index 000000000..ff5d84b76 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/security/customproviders/ORCID/ORCIDCustomProvider.java @@ -0,0 +1,7 @@ +package eu.eudat.logic.security.customproviders.ORCID; + +import eu.eudat.logic.security.validators.orcid.helpers.ORCIDResponseToken; + +public interface ORCIDCustomProvider { + ORCIDResponseToken getAccessToken(String code, String redirectUri, String clientId, String clientSecret); +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/security/customproviders/ORCID/ORCIDCustomProviderImpl.java b/dmp-backend/web/src/main/java/eu/eudat/logic/security/customproviders/ORCID/ORCIDCustomProviderImpl.java new file mode 100644 index 000000000..fa3e14eea --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/security/customproviders/ORCID/ORCIDCustomProviderImpl.java @@ -0,0 +1,54 @@ +package eu.eudat.logic.security.customproviders.ORCID; + +import eu.eudat.logic.security.validators.orcid.helpers.ORCIDResponseToken; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.stereotype.Component; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; + +import java.util.Map; + +@Component("ORCIDCustomProvider") +public class ORCIDCustomProviderImpl implements ORCIDCustomProvider { + + private Environment environment; + + @Autowired + public ORCIDCustomProviderImpl(Environment environment) { + this.environment = environment; + } + + @Override + public ORCIDResponseToken getAccessToken(String code, String redirectUri, String clientId, String clientSecret) { + RestTemplate restTemplate = new RestTemplate(); + HttpHeaders headers = new HttpHeaders(); + headers.set("accept", "application/json"); + + MultiValueMap map = new LinkedMultiValueMap(); + map.add("client_id", this.environment.getProperty("orcid.login.client_id")); + map.add("client_secret", this.environment.getProperty("orcid.login.client_secret")); + map.add("grant_type", "authorization_code"); + map.add("code", code); + map.add("redirect_uri", redirectUri); + HttpEntity> request = new HttpEntity>(map, headers); + + Map values = restTemplate.postForObject(this.environment.getProperty("orcid.login.access_token_url"), request, Map.class); + ORCIDResponseToken orcidResponseToken = new ORCIDResponseToken(); + orcidResponseToken.setOrcidId((String) values.get("orcid")); + orcidResponseToken.setName((String) values.get("name")); + orcidResponseToken.setAccessToken((String) values.get("access_token")); + + return orcidResponseToken; + } + + private HttpHeaders createBearerAuthHeaders(String accessToken) { + return new HttpHeaders() {{ + String authHeader = "Bearer " + accessToken; + set("Authorization", authHeader); + }}; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/security/customproviders/ORCID/ORCIDUser.java b/dmp-backend/web/src/main/java/eu/eudat/logic/security/customproviders/ORCID/ORCIDUser.java new file mode 100644 index 000000000..b0fa89678 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/security/customproviders/ORCID/ORCIDUser.java @@ -0,0 +1,38 @@ +package eu.eudat.logic.security.customproviders.ORCID; + +import java.util.Map; + +public class ORCIDUser { + private String orcidId; + private String name; + private String email; + + public String getOrcidId() { + return orcidId; + } + public void setOrcidId(String orcidId) { + this.orcidId = orcidId; + } + + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + public String getEmail() { + return email; + } + public void setEmail(String email) { + this.email = email; + } + + + public ORCIDUser getOrcidUser(Object data) { + this.orcidId = (String) ((Map) data).get("orcidId"); + this.name = (String) ((Map) data).get("name"); + this.email = (String) ((Map) data).get("email"); + return this; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/TokenValidator.java b/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/TokenValidator.java index eeaf3cc40..f03ca04c8 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/TokenValidator.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/TokenValidator.java @@ -1,6 +1,7 @@ package eu.eudat.logic.security.validators; import eu.eudat.exceptions.security.NonValidTokenException; +import eu.eudat.exceptions.security.NullEmailException; import eu.eudat.models.data.login.LoginInfo; import eu.eudat.models.data.security.Principal; @@ -9,6 +10,6 @@ import java.security.GeneralSecurityException; public interface TokenValidator { - Principal validateToken(LoginInfo credentials) throws NonValidTokenException, IOException, GeneralSecurityException; + Principal validateToken(LoginInfo credentials) throws NonValidTokenException, IOException, GeneralSecurityException, NullEmailException; } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/TokenValidatorFactoryImpl.java b/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/TokenValidatorFactoryImpl.java index 080c27977..404de9b55 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/TokenValidatorFactoryImpl.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/TokenValidatorFactoryImpl.java @@ -1,18 +1,24 @@ package eu.eudat.logic.security.validators; +import eu.eudat.logic.security.customproviders.B2Access.B2AccessCustomProvider; +import eu.eudat.logic.security.customproviders.ORCID.ORCIDCustomProvider; import eu.eudat.logic.security.validators.b2access.B2AccessTokenValidator; import eu.eudat.logic.security.validators.facebook.FacebookTokenValidator; import eu.eudat.logic.security.validators.google.GoogleTokenValidator; import eu.eudat.logic.security.validators.linkedin.LinkedInTokenValidator; +import eu.eudat.logic.security.validators.orcid.ORCIDTokenValidator; import eu.eudat.logic.security.validators.twitter.TwitterTokenValidator; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.logic.services.operations.authentication.AuthenticationService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; import org.springframework.stereotype.Service; @Service("tokenValidatorFactory") public class TokenValidatorFactoryImpl implements TokenValidatorFactory { public enum LoginProvider { - GOOGLE(1), FACEBOOK(2), TWITTER(3), LINKEDIN(4), NATIVELOGIN(5), B2_ACCESS(6); + GOOGLE(1), FACEBOOK(2), TWITTER(3), LINKEDIN(4), NATIVELOGIN(5), B2_ACCESS(6), ORCID(7); private int value; @@ -38,43 +44,45 @@ public class TokenValidatorFactoryImpl implements TokenValidatorFactory { return NATIVELOGIN; case 6: return B2_ACCESS; + case 7: + return ORCID; default: throw new RuntimeException("Unsupported LoginProvider"); } } } - private GoogleTokenValidator googleTokenValidator; - private FacebookTokenValidator facebookTokenValidator; - private LinkedInTokenValidator linkedInTokenValidator; - private TwitterTokenValidator twitterTokenValidator; - private B2AccessTokenValidator b2AccessTokenValidator; + private ApiContext apiContext; + private Environment environment; + private AuthenticationService nonVerifiedUserAuthenticationService; + private B2AccessCustomProvider b2AccessCustomProvider; + private ORCIDCustomProvider orcidCustomProvider; @Autowired - public TokenValidatorFactoryImpl(GoogleTokenValidator googleTokenValidator, FacebookTokenValidator facebookTokenValidator, - LinkedInTokenValidator linkedInTokenValidator, TwitterTokenValidator twitterTokenValidator, B2AccessTokenValidator b2AccessTokenValidator) { - this.googleTokenValidator = googleTokenValidator; - this.facebookTokenValidator = facebookTokenValidator; - this.linkedInTokenValidator = linkedInTokenValidator; - this.twitterTokenValidator = twitterTokenValidator; - this.b2AccessTokenValidator = b2AccessTokenValidator; + public TokenValidatorFactoryImpl(ApiContext apiContext, Environment environment, AuthenticationService nonVerifiedUserAuthenticationService, B2AccessCustomProvider b2AccessCustomProvider, ORCIDCustomProvider orcidCustomProvider) { + this.apiContext = apiContext; + this.environment = environment; + this.nonVerifiedUserAuthenticationService = nonVerifiedUserAuthenticationService; + this.b2AccessCustomProvider = b2AccessCustomProvider; + this.orcidCustomProvider = orcidCustomProvider; } public TokenValidator getProvider(LoginProvider provider) { switch (provider) { case GOOGLE: - return this.googleTokenValidator; + return new GoogleTokenValidator(this.apiContext, this.environment, this.nonVerifiedUserAuthenticationService); case FACEBOOK: - return this.facebookTokenValidator; + return new FacebookTokenValidator(this.apiContext, this.environment, this.nonVerifiedUserAuthenticationService); case LINKEDIN: - return this.linkedInTokenValidator; + return new LinkedInTokenValidator(this.apiContext, this.environment, this.nonVerifiedUserAuthenticationService); case TWITTER: - return this.twitterTokenValidator; + return new TwitterTokenValidator(this.apiContext, this.environment, this.nonVerifiedUserAuthenticationService); case B2_ACCESS: - return this.b2AccessTokenValidator; + return new B2AccessTokenValidator(this.environment, this.nonVerifiedUserAuthenticationService, this.b2AccessCustomProvider); + case ORCID: + return new ORCIDTokenValidator(this.environment, this.nonVerifiedUserAuthenticationService, this.orcidCustomProvider, this.apiContext); default: throw new RuntimeException("Login Provider Not Implemented"); } } - } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/b2access/B2AccessTokenValidator.java b/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/b2access/B2AccessTokenValidator.java index f6b28fd0c..a1057377b 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/b2access/B2AccessTokenValidator.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/b2access/B2AccessTokenValidator.java @@ -1,15 +1,16 @@ package eu.eudat.logic.security.validators.b2access; import eu.eudat.exceptions.security.NonValidTokenException; +import eu.eudat.exceptions.security.NullEmailException; +import eu.eudat.logic.services.operations.authentication.AuthenticationService; import eu.eudat.models.data.login.LoginInfo; import eu.eudat.models.data.loginprovider.LoginProviderUser; import eu.eudat.models.data.security.Principal; -import eu.eudat.logic.security.customproviders.B2AccessCustomProvider; -import eu.eudat.logic.security.customproviders.B2AccessUser; +import eu.eudat.logic.security.customproviders.B2Access.B2AccessCustomProvider; +import eu.eudat.logic.security.customproviders.B2Access.B2AccessUser; import eu.eudat.logic.security.validators.TokenValidator; import eu.eudat.logic.security.validators.b2access.helpers.B2AccessRequest; import eu.eudat.logic.security.validators.b2access.helpers.B2AccessResponseToken; -import eu.eudat.logic.services.operations.AuthenticationServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; @@ -24,18 +25,18 @@ import java.security.GeneralSecurityException; public class B2AccessTokenValidator implements TokenValidator { private B2AccessCustomProvider b2AccessCustomProvider; - private AuthenticationServiceImpl authenticationServiceImpl; + private AuthenticationService nonVerifiedUserAuthenticationService; private Environment environment; @Autowired - public B2AccessTokenValidator(AuthenticationServiceImpl authenticationServiceImpl, Environment environment, B2AccessCustomProvider b2AccessCustomProvider) { - this.authenticationServiceImpl = authenticationServiceImpl; + public B2AccessTokenValidator(Environment environment, AuthenticationService nonVerifiedUserAuthenticationService, B2AccessCustomProvider b2AccessCustomProvider) { + this.nonVerifiedUserAuthenticationService = nonVerifiedUserAuthenticationService; this.environment = environment; this.b2AccessCustomProvider = b2AccessCustomProvider; } @Override - public Principal validateToken(LoginInfo credentials) throws NonValidTokenException, IOException, GeneralSecurityException { + public Principal validateToken(LoginInfo credentials) throws NonValidTokenException, IOException, GeneralSecurityException, NullEmailException { B2AccessUser b2AccessUser = this.b2AccessCustomProvider.getUser(credentials.getTicket()); LoginProviderUser user = new LoginProviderUser(); user.setId(b2AccessUser.getId()); @@ -43,7 +44,7 @@ public class B2AccessTokenValidator implements TokenValidator { user.setName(b2AccessUser.getName()); user.setProvider(credentials.getProvider()); user.setSecret(credentials.getTicket()); - return this.authenticationServiceImpl.Touch(user); + return this.nonVerifiedUserAuthenticationService.Touch(user); } public B2AccessResponseToken getAccessToken(B2AccessRequest b2AccessRequest) { diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/facebook/FacebookTokenValidator.java b/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/facebook/FacebookTokenValidator.java index adc93ef3e..92715c5fb 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/facebook/FacebookTokenValidator.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/facebook/FacebookTokenValidator.java @@ -1,22 +1,19 @@ package eu.eudat.logic.security.validators.facebook; -import eu.eudat.exceptions.security.NonValidTokenException; import eu.eudat.exceptions.security.UnauthorisedException; -import eu.eudat.models.data.login.LoginInfo; -import eu.eudat.models.data.loginprovider.LoginProviderUser; -import eu.eudat.models.data.security.Principal; import eu.eudat.logic.security.validators.TokenValidator; import eu.eudat.logic.security.validators.TokenValidatorFactoryImpl; import eu.eudat.logic.services.ApiContext; -import eu.eudat.logic.services.operations.AuthenticationServiceImpl; +import eu.eudat.logic.services.operations.authentication.AuthenticationService; +import eu.eudat.models.data.login.LoginInfo; +import eu.eudat.models.data.loginprovider.LoginProviderUser; +import eu.eudat.models.data.security.Principal; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.social.facebook.api.User; import org.springframework.social.facebook.connect.FacebookServiceProvider; import org.springframework.stereotype.Component; -import java.io.IOException; -import java.security.GeneralSecurityException; import java.util.Calendar; import java.util.Date; import java.util.Map; @@ -25,50 +22,50 @@ import java.util.Map; @Component("facebookTokenValidator") public class FacebookTokenValidator implements TokenValidator { - private Environment environment; - private ApiContext apiContext; - private AuthenticationServiceImpl authenticationServiceImpl; - private FacebookServiceProvider facebookServiceProvider; + private Environment environment; + private ApiContext apiContext; + private AuthenticationService nonVerifiedUserAuthenticationService; + private FacebookServiceProvider facebookServiceProvider; - @Autowired - public FacebookTokenValidator(Environment environment, ApiContext apiContext, AuthenticationServiceImpl authenticationServiceImpl) { - this.environment = environment; - this.apiContext = apiContext; - this.authenticationServiceImpl = authenticationServiceImpl; - this.facebookServiceProvider = new FacebookServiceProvider(this.environment.getProperty("facebook.login.clientId"), this.environment.getProperty("facebook.login.clientSecret"), this.environment.getProperty("facebook.login.namespace")); - } + @Autowired + public FacebookTokenValidator(ApiContext apiContext, Environment environment, AuthenticationService nonVerifiedUserAuthenticationService) { + this.environment = environment; + this.apiContext = apiContext; + this.nonVerifiedUserAuthenticationService = nonVerifiedUserAuthenticationService; + this.facebookServiceProvider = new FacebookServiceProvider(this.environment.getProperty("facebook.login.clientId"), this.environment.getProperty("facebook.login.clientSecret"), this.environment.getProperty("facebook.login.namespace")); + } - @Override - public Principal validateToken(LoginInfo credentials) throws NonValidTokenException, IOException, GeneralSecurityException { - User profile = getFacebookUser(credentials.getTicket()); - LoginProviderUser user = new LoginProviderUser(); - if (profile.getEmail() == null) - throw new UnauthorisedException("Cannot login user.Facebook account did not provide email"); + @Override + public Principal validateToken(LoginInfo credentials) { + User profile = getFacebookUser(credentials.getTicket()); + LoginProviderUser user = new LoginProviderUser(); + if (profile.getEmail() == null) + throw new UnauthorisedException("Cannot login user.Facebook account did not provide email"); - user.setEmail(profile.getEmail()); - user.setId(profile.getId()); - user.setIsVerified(profile.isVerified()); - user.setName(profile.getName()); - user.setProvider(TokenValidatorFactoryImpl.LoginProvider.FACEBOOK); - String url = (String)((Map )((Map )profile.getExtraData().get("picture")).get("data")).get("url"); - user.setAvatarUrl(url); - user.setSecret(credentials.getTicket()); - return this.authenticationServiceImpl.Touch(user); - } + user.setEmail(profile.getEmail()); + user.setId(profile.getId()); + //user.setIsVerified(profile.isVerified()); + user.setName(profile.getName()); + user.setProvider(TokenValidatorFactoryImpl.LoginProvider.FACEBOOK); + String url = (String) ((Map) ((Map) profile.getExtraData().get("picture")).get("data")).get("url"); + user.setAvatarUrl(url); + user.setSecret(credentials.getTicket()); + return this.nonVerifiedUserAuthenticationService.Touch(user); + } - private User getFacebookUser(String accessToken) { - String[] fields = {"id", "email", "first_name", "last_name", "name", "verified","picture"}; - User profile = this.facebookServiceProvider.getApi(accessToken).fetchObject("me", User.class, fields); - return profile; - } + private User getFacebookUser(String accessToken) { + String[] fields = {"id", "email", "first_name", "last_name", "name", "verified", "picture"}; + User profile = this.facebookServiceProvider.getApi(accessToken).fetchObject("me", User.class, fields); + return profile; + } - private Date addADay(Date date) { - Date dt = new Date(); - Calendar c = Calendar.getInstance(); - c.setTime(dt); - c.add(Calendar.DATE, 1); - dt = c.getTime(); - return dt; - } + private Date addADay(Date date) { + Date dt = new Date(); + Calendar c = Calendar.getInstance(); + c.setTime(dt); + c.add(Calendar.DATE, 1); + dt = c.getTime(); + return dt; + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/google/GoogleTokenValidator.java b/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/google/GoogleTokenValidator.java index 0a137b402..03e5166cb 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/google/GoogleTokenValidator.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/google/GoogleTokenValidator.java @@ -6,13 +6,12 @@ import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier; import com.google.api.client.http.HttpTransport; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.jackson2.JacksonFactory; -import eu.eudat.exceptions.security.NonValidTokenException; -import eu.eudat.models.data.login.LoginInfo; -import eu.eudat.models.data.loginprovider.LoginProviderUser; import eu.eudat.logic.security.validators.TokenValidator; import eu.eudat.logic.security.validators.TokenValidatorFactoryImpl; import eu.eudat.logic.services.ApiContext; -import eu.eudat.logic.services.operations.AuthenticationServiceImpl; +import eu.eudat.logic.services.operations.authentication.AuthenticationService; +import eu.eudat.models.data.login.LoginInfo; +import eu.eudat.models.data.loginprovider.LoginProviderUser; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; @@ -24,40 +23,40 @@ import java.util.Collections; @Component("googleTokenValidator") public class GoogleTokenValidator implements TokenValidator { - private static final HttpTransport transport = new NetHttpTransport(); - private ApiContext apiContext; - private AuthenticationServiceImpl authenticationServiceImpl; - private GoogleIdTokenVerifier verifier; - private Environment environment; + private static final HttpTransport transport = new NetHttpTransport(); + private ApiContext apiContext; + private AuthenticationService nonVerifiedUserAuthenticationService; + private GoogleIdTokenVerifier verifier; + private Environment environment; - @Autowired - public GoogleTokenValidator(ApiContext apiContext, Environment environment, AuthenticationServiceImpl authenticationServiceImpl) { - this.apiContext = apiContext; - this.environment = environment; - this.authenticationServiceImpl = authenticationServiceImpl; - verifier = new GoogleIdTokenVerifier.Builder(transport, JacksonFactory.getDefaultInstance()) - .setAudience(Collections.singletonList(this.environment.getProperty("google.login.clientId"))) - .build(); - } + @Autowired + public GoogleTokenValidator(ApiContext apiContext, Environment environment, AuthenticationService nonVerifiedUserAuthenticationService) { + this.apiContext = apiContext; + this.environment = environment; + this.nonVerifiedUserAuthenticationService = nonVerifiedUserAuthenticationService; + verifier = new GoogleIdTokenVerifier.Builder(transport, JacksonFactory.getDefaultInstance()) + .setAudience(Collections.singletonList(this.environment.getProperty("google.login.clientId"))) + .build(); + } - private GoogleIdToken verifyUserAndGetUser(String idTokenString) throws IOException, GeneralSecurityException { - GoogleIdToken idToken = verifier.verify(idTokenString); - return idToken; - } + private GoogleIdToken verifyUserAndGetUser(String idTokenString) throws IOException, GeneralSecurityException { + GoogleIdToken idToken = verifier.verify(idTokenString); + return idToken; + } - @Override - public eu.eudat.models.data.security.Principal validateToken(LoginInfo credentials) throws NonValidTokenException, IOException, GeneralSecurityException { - GoogleIdToken idToken = this.verifyUserAndGetUser(credentials.getTicket()); - Payload payload = idToken.getPayload(); - LoginProviderUser user = new LoginProviderUser(); - user.setAvatarUrl((String) payload.get("picture")); - user.setSecret(credentials.getTicket()); - user.setId( payload.getSubject()); - user.setProvider(TokenValidatorFactoryImpl.LoginProvider.GOOGLE); - user.setName((String) payload.get("name")); - user.setEmail(payload.getEmail()); - user.setIsVerified(payload.getEmailVerified()); - return this.authenticationServiceImpl.Touch(user); - } + @Override + public eu.eudat.models.data.security.Principal validateToken(LoginInfo credentials) throws IOException, GeneralSecurityException { + GoogleIdToken idToken = this.verifyUserAndGetUser(credentials.getTicket()); + Payload payload = idToken.getPayload(); + LoginProviderUser user = new LoginProviderUser(); + user.setAvatarUrl((String) payload.get("picture")); + user.setSecret(credentials.getTicket()); + user.setId(payload.getSubject()); + user.setProvider(TokenValidatorFactoryImpl.LoginProvider.GOOGLE); + user.setName((String) payload.get("name")); + user.setEmail(payload.getEmail()); + user.setIsVerified(payload.getEmailVerified()); + return this.nonVerifiedUserAuthenticationService.Touch(user); + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/linkedin/LinkedInTokenValidator.java b/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/linkedin/LinkedInTokenValidator.java index 16f4ae071..f89c82317 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/linkedin/LinkedInTokenValidator.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/linkedin/LinkedInTokenValidator.java @@ -1,14 +1,13 @@ package eu.eudat.logic.security.validators.linkedin; -import eu.eudat.exceptions.security.NonValidTokenException; import eu.eudat.exceptions.security.UnauthorisedException; -import eu.eudat.models.data.login.LoginInfo; -import eu.eudat.models.data.loginprovider.LoginProviderUser; -import eu.eudat.models.data.security.Principal; import eu.eudat.logic.security.validators.TokenValidator; import eu.eudat.logic.security.validators.TokenValidatorFactoryImpl; import eu.eudat.logic.services.ApiContext; -import eu.eudat.logic.services.operations.AuthenticationServiceImpl; +import eu.eudat.logic.services.operations.authentication.AuthenticationService; +import eu.eudat.models.data.login.LoginInfo; +import eu.eudat.models.data.loginprovider.LoginProviderUser; +import eu.eudat.models.data.security.Principal; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.social.linkedin.api.LinkedIn; @@ -17,28 +16,25 @@ import org.springframework.social.linkedin.connect.LinkedInServiceProvider; import org.springframework.social.oauth2.AccessGrant; import org.springframework.stereotype.Component; -import java.io.IOException; -import java.security.GeneralSecurityException; - @Component("linkedInTokenValidator") public class LinkedInTokenValidator implements TokenValidator { private Environment environment; private ApiContext apiContext; - private AuthenticationServiceImpl authenticationServiceImpl; + private AuthenticationService nonVerifiedUserAuthenticationService; private LinkedInServiceProvider linkedInServiceProvider; @Autowired - public LinkedInTokenValidator(Environment environment, ApiContext apiContext, AuthenticationServiceImpl authenticationServiceImpl) { + public LinkedInTokenValidator(ApiContext apiContext, Environment environment, AuthenticationService nonVerifiedUserAuthenticationService) { this.environment = environment; this.apiContext = apiContext; - this.authenticationServiceImpl = authenticationServiceImpl; + this.nonVerifiedUserAuthenticationService = nonVerifiedUserAuthenticationService; this.linkedInServiceProvider = new LinkedInServiceProvider(this.environment.getProperty("linkedin.login.clientId"), this.environment.getProperty("linkedin.login.clientSecret")); } @Override - public Principal validateToken(LoginInfo credentials) throws NonValidTokenException, IOException, GeneralSecurityException { + public Principal validateToken(LoginInfo credentials) { AccessGrant accessGrant = this.linkedInServiceProvider.getOAuthOperations().exchangeForAccess(credentials.getTicket(), this.environment.getProperty("linkedin.login.redirect_uri"), null); LinkedIn linkedInService = this.linkedInServiceProvider.getApi(accessGrant.getAccessToken()); LinkedInProfile linkedInProfile = linkedInService.profileOperations().getUserProfile(); @@ -53,6 +49,6 @@ public class LinkedInTokenValidator implements TokenValidator { user.setName(linkedInProfile.getFirstName() + " " + linkedInProfile.getLastName()); user.setProvider(TokenValidatorFactoryImpl.LoginProvider.LINKEDIN); user.setSecret(accessGrant.getAccessToken()); - return this.authenticationServiceImpl.Touch(user); + return this.nonVerifiedUserAuthenticationService.Touch(user); } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/orcid/ORCIDTokenValidator.java b/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/orcid/ORCIDTokenValidator.java new file mode 100644 index 000000000..8d365a052 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/orcid/ORCIDTokenValidator.java @@ -0,0 +1,54 @@ +package eu.eudat.logic.security.validators.orcid; + +import eu.eudat.exceptions.security.NonValidTokenException; +import eu.eudat.exceptions.security.NullEmailException; +import eu.eudat.logic.security.customproviders.ORCID.ORCIDCustomProvider; +import eu.eudat.logic.security.customproviders.ORCID.ORCIDUser; +import eu.eudat.logic.security.validators.TokenValidator; +import eu.eudat.logic.security.validators.orcid.helpers.ORCIDRequest; +import eu.eudat.logic.security.validators.orcid.helpers.ORCIDResponseToken; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.logic.services.operations.authentication.AuthenticationService; +import eu.eudat.models.data.login.LoginInfo; +import eu.eudat.models.data.loginprovider.LoginProviderUser; +import eu.eudat.models.data.security.Principal; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.security.GeneralSecurityException; + +@Component("orcidTokenValidator") +public class ORCIDTokenValidator implements TokenValidator { + + private ORCIDCustomProvider orcidCustomProvider; + private Environment environment; + private AuthenticationService nonVerifiedUserAuthenticationService; + private ApiContext apiContext; + + @Autowired + public ORCIDTokenValidator(Environment environment, AuthenticationService nonVerifiedUserAuthenticationService, ORCIDCustomProvider orcidCustomProvider, ApiContext apiContext) { + this.environment = environment; + this.nonVerifiedUserAuthenticationService = nonVerifiedUserAuthenticationService; + this.orcidCustomProvider = orcidCustomProvider; + this.apiContext = apiContext; + } + + @Override + public Principal validateToken(LoginInfo credentials) throws NonValidTokenException, IOException, GeneralSecurityException, NullEmailException { + ORCIDUser orcidUser = new ORCIDUser().getOrcidUser(credentials.getData()); + LoginProviderUser user = new LoginProviderUser(); + user.setId(orcidUser.getOrcidId()); + user.setName(orcidUser.getName()); + user.setProvider(credentials.getProvider()); + user.setSecret(credentials.getTicket()); + return this.nonVerifiedUserAuthenticationService.Touch(user); + } + + public ORCIDResponseToken getAccessToken(ORCIDRequest orcidRequest) { + return this.orcidCustomProvider.getAccessToken(orcidRequest.getCode(), this.environment.getProperty("orcid.login.redirect_uri") + , this.environment.getProperty("orcid.login.client_id") + , this.environment.getProperty("orcid.login.client_secret")); + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/orcid/helpers/ORCIDRequest.java b/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/orcid/helpers/ORCIDRequest.java new file mode 100644 index 000000000..8fb7dc752 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/orcid/helpers/ORCIDRequest.java @@ -0,0 +1,12 @@ +package eu.eudat.logic.security.validators.orcid.helpers; + +public class ORCIDRequest { + private String code; + + public String getCode() { + return code; + } + public void setCode(String code) { + this.code = code; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/orcid/helpers/ORCIDResponseToken.java b/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/orcid/helpers/ORCIDResponseToken.java new file mode 100644 index 000000000..86d7c9f7d --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/orcid/helpers/ORCIDResponseToken.java @@ -0,0 +1,28 @@ +package eu.eudat.logic.security.validators.orcid.helpers; + +public class ORCIDResponseToken { + private String orcidId; + private String name; + private String accessToken; + + public String getOrcidId() { + return orcidId; + } + public void setOrcidId(String orcidId) { + this.orcidId = orcidId; + } + + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + public String getAccessToken() { + return accessToken; + } + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/twitter/TwitterTokenValidator.java b/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/twitter/TwitterTokenValidator.java index 70849f2ca..edd24cae1 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/twitter/TwitterTokenValidator.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/security/validators/twitter/TwitterTokenValidator.java @@ -1,14 +1,15 @@ package eu.eudat.logic.security.validators.twitter; import eu.eudat.exceptions.security.NonValidTokenException; +import eu.eudat.exceptions.security.NullEmailException; import eu.eudat.exceptions.security.UnauthorisedException; -import eu.eudat.models.data.login.LoginInfo; -import eu.eudat.models.data.loginprovider.LoginProviderUser; -import eu.eudat.models.data.security.Principal; import eu.eudat.logic.security.validators.TokenValidator; import eu.eudat.logic.security.validators.TokenValidatorFactoryImpl; import eu.eudat.logic.services.ApiContext; -import eu.eudat.logic.services.operations.AuthenticationServiceImpl; +import eu.eudat.logic.services.operations.authentication.AuthenticationService; +import eu.eudat.models.data.login.LoginInfo; +import eu.eudat.models.data.loginprovider.LoginProviderUser; +import eu.eudat.models.data.security.Principal; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.social.oauth1.AuthorizedRequestToken; @@ -28,19 +29,19 @@ public class TwitterTokenValidator implements TokenValidator { private Environment environment; private ApiContext apiContext; - private AuthenticationServiceImpl authenticationServiceImpl; + private AuthenticationService nonVerifiedUserAuthenticationService; private TwitterServiceProvider twitterServiceProvider; @Autowired - public TwitterTokenValidator(Environment environment, ApiContext apiContext, AuthenticationServiceImpl authenticationServiceImpl) { + public TwitterTokenValidator(ApiContext apiContext, Environment environment, AuthenticationService nonVerifiedUserAuthenticationService) { this.environment = environment; this.apiContext = apiContext; - this.authenticationServiceImpl = authenticationServiceImpl; + this.nonVerifiedUserAuthenticationService = nonVerifiedUserAuthenticationService; this.twitterServiceProvider = new TwitterServiceProvider(this.environment.getProperty("twitter.login.clientId"), this.environment.getProperty("twitter.login.clientSecret")); } @Override - public Principal validateToken(LoginInfo credentials) throws NonValidTokenException, IOException, GeneralSecurityException { + public Principal validateToken(LoginInfo credentials) throws NonValidTokenException, IOException, GeneralSecurityException, NullEmailException { String verifier = (String) credentials.getData(); OAuthToken oAuthToken = new OAuthToken(credentials.getTicket(), verifier); AuthorizedRequestToken authorizedRequestToken = new AuthorizedRequestToken(oAuthToken, verifier); @@ -55,11 +56,11 @@ public class TwitterTokenValidator implements TokenValidator { user.setEmail((String) values.get("email")); user.setAvatarUrl(profile.getProfileImageUrl()); user.setIsVerified(true); //TODO - user.setId(""+profile.getId()); + user.setId("" + profile.getId()); user.setName(profile.getName()); user.setProvider(TokenValidatorFactoryImpl.LoginProvider.TWITTER); user.setSecret(finalOauthToken.getValue()); - return this.authenticationServiceImpl.Touch(user); + return this.nonVerifiedUserAuthenticationService.Touch(user); } public OAuthToken getRequestToken() { diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/ApiContextImpl.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/ApiContextImpl.java index 4e6b12331..42920db8a 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/services/ApiContextImpl.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/ApiContextImpl.java @@ -3,6 +3,7 @@ package eu.eudat.logic.services; import eu.eudat.logic.services.helpers.HelpersService; import eu.eudat.logic.services.operations.OperationsContext; import eu.eudat.logic.services.utilities.UtilitiesService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -13,6 +14,7 @@ public class ApiContextImpl implements ApiContext { private HelpersService helpersService; private UtilitiesService utilitiesService; + @Autowired public ApiContextImpl(OperationsContext operationsContext, HelpersService helpersService, UtilitiesService utilitiesService) { this.operationsContext = operationsContext; this.helpersService = helpersService; diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/AuthenticationService.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/AuthenticationService.java deleted file mode 100644 index 089cf84ca..000000000 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/AuthenticationService.java +++ /dev/null @@ -1,21 +0,0 @@ -package eu.eudat.logic.services.operations; - -import eu.eudat.models.data.login.Credentials; -import eu.eudat.models.data.loginprovider.LoginProviderUser; -import eu.eudat.models.data.security.Principal; - -import java.util.UUID; - -/** - * Created by ikalyvas on 3/1/2018. - */ -public interface AuthenticationService { - - Principal Touch(LoginProviderUser profile); - - Principal Touch(Credentials credentials); - - void Logout(UUID token); - - Principal Touch(UUID token); -} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/AuthenticationServiceImpl.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/AuthenticationServiceImpl.java deleted file mode 100644 index f591e72ff..000000000 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/AuthenticationServiceImpl.java +++ /dev/null @@ -1,198 +0,0 @@ -package eu.eudat.logic.services.operations; - -import com.fasterxml.jackson.databind.ObjectMapper; -import eu.eudat.logic.builders.entity.CredentialBuilder; -import eu.eudat.logic.builders.entity.UserInfoBuilder; -import eu.eudat.logic.builders.entity.UserTokenBuilder; -import eu.eudat.logic.builders.model.models.PrincipalBuilder; -import eu.eudat.data.dao.criteria.UserInfoCriteria; -import eu.eudat.data.entities.Credential; -import eu.eudat.data.entities.UserInfo; -import eu.eudat.data.entities.UserRole; -import eu.eudat.data.entities.UserToken; -import eu.eudat.models.data.login.Credentials; -import eu.eudat.models.data.loginprovider.LoginProviderUser; -import eu.eudat.models.data.security.Principal; -import eu.eudat.logic.security.validators.TokenValidatorFactoryImpl; -import eu.eudat.logic.services.ApiContext; -import eu.eudat.types.Authorities; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.env.Environment; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.io.IOException; -import java.util.*; - - -@Service("authenticationService") -public class AuthenticationServiceImpl implements AuthenticationService { - private ApiContext apiContext; - private Environment environment; - - @Autowired - public AuthenticationServiceImpl(ApiContext apiContext, Environment environment) { - this.environment = environment; - this.apiContext = apiContext; - } - - public Principal Touch(UUID token) { - UserToken tokenEntry = this.apiContext.getOperationsContext().getDatabaseRepository().getUserTokenDao().find(token); - if (tokenEntry == null || tokenEntry.getExpiresAt().before(new Date())) return null; - - return this.Touch(tokenEntry); - } - - public void Logout(UUID token) { - UserToken tokenEntry = this.apiContext.getOperationsContext().getDatabaseRepository().getUserTokenDao().find(token); - this.apiContext.getOperationsContext().getDatabaseRepository().getUserTokenDao().delete(tokenEntry); - } - - private Principal Touch(UserToken token) { - if (token == null || token.getExpiresAt().before(new Date())) return null; - - UserInfo user = this.apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(token.getUser().getId()); - if (user == null) return null; - String json; - try { - json = user.getAdditionalinfo() != null ? new ObjectMapper().readTree(user.getAdditionalinfo()).get("data").get("avatar").get("url").asText() : ""; - } catch (IOException e) { - json = ""; - } - Principal principal = this.apiContext.getOperationsContext().getBuilderFactory().getBuilder(PrincipalBuilder.class) - .id(user.getId()).token(token.getToken()) - .expiresAt(token.getExpiresAt()).name(user.getName()) - .avatarUrl(json) - .build(); - List userRoles = apiContext.getOperationsContext().getDatabaseRepository().getUserRoleDao().getUserRoles(user); - for (UserRole item : userRoles) { - if (principal.getAuthz() == null) principal.setAuthorities(new HashSet<>()); - principal.getAuthz().add(Authorities.fromInteger(item.getRole())); - } - return principal; - } - - public Principal Touch(Credentials credentials) { - Credential credential = this.apiContext.getOperationsContext().getDatabaseRepository().getCredentialDao().getLoggedInCredentials(credentials.getUsername(), credentials.getSecret(), TokenValidatorFactoryImpl.LoginProvider.NATIVELOGIN.getValue()); - - if (credential == null && credentials.getUsername().equals(environment.getProperty("autouser.root.username"))) { - try { - credential = this.autoCreateUser(credentials.getUsername(), credentials.getSecret()); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - if (credential == null) return null; - - UserToken userToken = this.apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserTokenBuilder.class) - .issuedAt(new Date()).user(credential.getUserInfo()) - .token(UUID.randomUUID()).expiresAt(addADay(new Date())) - .build(); - - userToken = apiContext.getOperationsContext().getDatabaseRepository().getUserTokenDao().createOrUpdate(userToken); - - return this.Touch(userToken); - - } - - public Principal Touch(LoginProviderUser profile) { - UserInfoCriteria criteria = new UserInfoCriteria(); - criteria.setEmail(profile.getEmail()); - - UserInfo userInfo = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().asQueryable().withHint("userInfo").where((builder, root) -> builder.equal(root.get("email"), profile.getEmail())).getSingleOrDefault(); - - if (userInfo == null) { - Optional optionalCredential = Optional.ofNullable(apiContext.getOperationsContext().getDatabaseRepository().getCredentialDao() - .asQueryable().withHint("credentialUserInfo") - .where((builder, root) -> builder.and(builder.equal(root.get("provider"), profile.getProvider().getValue()), builder.equal(root.get("externalId"), profile.getId()))) - .getSingleOrDefault()); - userInfo = optionalCredential.map(Credential::getUserInfo).orElse(null); - } - - final Credential credential = this.apiContext.getOperationsContext().getBuilderFactory().getBuilder(CredentialBuilder.class) - .id(UUID.randomUUID()).creationTime(new Date()).status(1) - .lastUpdateTime(new Date()).provider(profile.getProvider().getValue()) - .secret(profile.getSecret()).externalId(profile.getId()) - .build(); - - if (userInfo == null) { - userInfo = this.apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class) - .name(profile.getName()).verified_email(profile.getIsVerified()) - .email(profile.getEmail()).created(new Date()).lastloggedin(new Date()) - .additionalinfo("{\"data\":{\"avatar\":{\"url\":\""+profile.getAvatarUrl()+"\"}}}") - .authorization_level((short) 1).usertype((short) 1) - .build(); - - userInfo = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().createOrUpdate(userInfo); - credential.setPublicValue(userInfo.getName()); - credential.setUserInfo(userInfo); - apiContext.getOperationsContext().getDatabaseRepository().getCredentialDao().createOrUpdate(credential); - - UserRole role = new UserRole(); - role.setRole(Authorities.USER.getValue()); - role.setUserInfo(userInfo); - apiContext.getOperationsContext().getDatabaseRepository().getUserRoleDao().createOrUpdate(role); - - } else { - userInfo.setLastloggedin(new Date()); - userInfo.setAdditionalinfo("{\"data\":{\"avatar\":{\"url\":\""+profile.getAvatarUrl()+"\"}}}"); - Set credentials = userInfo.getCredentials(); - if (credentials.contains(credential)) { - Credential oldCredential = credentials.stream().filter(item -> credential.getProvider().equals(item.getProvider())).findFirst().get(); - credential.setId(oldCredential.getId()); - } else { - credential.setUserInfo(userInfo); - credential.setId(UUID.randomUUID()); - credential.setPublicValue(userInfo.getName()); - apiContext.getOperationsContext().getDatabaseRepository().getCredentialDao().createOrUpdate(credential); - userInfo.getCredentials().add(credential); - } - userInfo = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().createOrUpdate(userInfo); - } - - UserToken userToken = this.apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserTokenBuilder.class) - .token(UUID.randomUUID()).user(userInfo) - .expiresAt(addADay(new Date())).issuedAt(new Date()) - .build(); - - apiContext.getOperationsContext().getDatabaseRepository().getUserTokenDao().createOrUpdate(userToken); - return Touch(userToken.getToken()); - } - - private Date addADay(Date date) { - Date dt = new Date(); - Calendar c = Calendar.getInstance(); - c.setTime(dt); - c.add(Calendar.DATE, 1); - dt = c.getTime(); - return dt; - } - - - @Transactional - private Credential autoCreateUser(String username, String password) { - if (!environment.getProperty("autouser.root.username").equals(username) || !environment.getProperty("autouser.root.password").equals(password)) - return null; - - UserInfo userInfo = this.apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class) - .name(username).email(environment.getProperty("autouser.root.email")).created(new Date()) - .lastloggedin(new Date()).authorization_level((short) 1).usertype((short) 1) - .build(); - - userInfo = this.apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().createOrUpdate(userInfo); - - UserRole role = new UserRole(); - role.setRole(Authorities.ADMIN.getValue()); - role.setUserInfo(userInfo); - this.apiContext.getOperationsContext().getDatabaseRepository().getUserRoleDao().createOrUpdate(role); - - Credential credential = this.apiContext.getOperationsContext().getBuilderFactory().getBuilder(CredentialBuilder.class) - .id(UUID.randomUUID()).userInfo(userInfo).publicValue(username).secret(password) - .provider((int) TokenValidatorFactoryImpl.LoginProvider.NATIVELOGIN.getValue()) - .creationTime(new Date()).lastUpdateTime(new Date()).status(0) - .build(); - - return this.apiContext.getOperationsContext().getDatabaseRepository().getCredentialDao().createOrUpdate(credential); - } -} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/DatabaseRepository.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/DatabaseRepository.java index 6cd4470ff..db84ccb20 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/DatabaseRepository.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/DatabaseRepository.java @@ -16,7 +16,7 @@ public interface DatabaseRepository { OrganisationDao getOrganisationDao(); - ProjectDao getProjectDao(); + GrantDao getGrantDao(); RegistryDao getRegistryDao(); @@ -45,4 +45,12 @@ public interface DatabaseRepository { DatasetExternalDatasetDao getDatasetExternalDatasetDao(); DatasetServiceDao getDatasetServiceDao(); + + LoginConfirmationEmailDao getLoginConfirmationEmailDao(); + + ProjectDao getProjectDao(); + + FunderDao getFunderDao(); + + void detachEntity(T entity); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/DatabaseRepositoryImpl.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/DatabaseRepositoryImpl.java index 8fe94d43d..73ba95cfb 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/DatabaseRepositoryImpl.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/DatabaseRepositoryImpl.java @@ -17,7 +17,7 @@ public class DatabaseRepositoryImpl implements DatabaseRepository { private DatasetProfileDao datasetProfileDao; private DMPDao dmpDao; private OrganisationDao organisationDao; - private ProjectDao projectDao; + private GrantDao GrantDao; private RegistryDao registryDao; private ResearcherDao researcherDao; private ServiceDao serviceDao; @@ -32,6 +32,9 @@ public class DatabaseRepositoryImpl implements DatabaseRepository { private DMPProfileDao dmpProfileDao; private DatasetExternalDatasetDao datasetExternalDatasetDao; private DatasetServiceDao datasetServiceDao; + private LoginConfirmationEmailDao loginConfirmationEmailDao; + private ProjectDao projectDao; + private FunderDao funderDao; private EntityManager entityManager; @@ -61,8 +64,8 @@ public class DatabaseRepositoryImpl implements DatabaseRepository { } @Autowired - private void setProjectDao(ProjectDao projectDao) { - this.projectDao = projectDao; + private void setGrantDao(GrantDao GrantDao) { + this.GrantDao = GrantDao; } @Autowired @@ -111,8 +114,8 @@ public class DatabaseRepositoryImpl implements DatabaseRepository { } @Override - public ProjectDao getProjectDao() { - return projectDao; + public GrantDao getGrantDao() { + return GrantDao; } @Override @@ -239,4 +242,38 @@ public class DatabaseRepositoryImpl implements DatabaseRepository { public void setDatasetServiceDao(DatasetServiceDao datasetServiceDao) { this.datasetServiceDao = datasetServiceDao; } + + @Override + public LoginConfirmationEmailDao getLoginConfirmationEmailDao() { + return loginConfirmationEmailDao; + } + + @Autowired + public void setLoginConfirmationEmailDao(LoginConfirmationEmailDao loginConfirmationEmailDao) { + this.loginConfirmationEmailDao = loginConfirmationEmailDao; + } + + @Override + public ProjectDao getProjectDao() { + return projectDao; + } + + @Autowired + public void setProjectDao(ProjectDao projectDao) { + this.projectDao = projectDao; + } + + @Override + public FunderDao getFunderDao() { + return funderDao; + } + + @Autowired + public void setFunderDao(FunderDao funderDao) { + this.funderDao = funderDao; + } + + public void detachEntity(T entity) { + this.entityManager.detach(entity); + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/OperationsContext.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/OperationsContext.java index 678b306ad..ccd6d914d 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/OperationsContext.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/OperationsContext.java @@ -1,5 +1,6 @@ package eu.eudat.logic.services.operations; +import eu.eudat.elastic.repository.DatasetRepository; import eu.eudat.logic.builders.BuilderFactory; import eu.eudat.logic.proxy.fetching.RemoteFetcher; import eu.eudat.logic.services.helpers.FileStorageService; @@ -20,4 +21,5 @@ public interface OperationsContext { FileStorageService getFileStorageService(); + DatasetRepository getDatasetRepository(); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/OperationsContextImpl.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/OperationsContextImpl.java index ecc24007e..47894d017 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/OperationsContextImpl.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/OperationsContextImpl.java @@ -1,5 +1,6 @@ package eu.eudat.logic.services.operations; +import eu.eudat.elastic.repository.DatasetRepository; import eu.eudat.logic.builders.BuilderFactory; import eu.eudat.logic.proxy.fetching.RemoteFetcher; import eu.eudat.logic.services.helpers.FileStorageService; @@ -18,15 +19,17 @@ public class OperationsContextImpl implements OperationsContext { private RemoteFetcher remoteFetcher; private BuilderFactory builderFactory; private FileStorageService fileStorageService; + private DatasetRepository datasetRepository; @Autowired public OperationsContextImpl(DatabaseRepository databaseRepository, ApplicationContext applicationContext, RemoteFetcher remoteFetcher - , BuilderFactory builderFactory, FileStorageService fileStorageService) { + , BuilderFactory builderFactory, FileStorageService fileStorageService, DatasetRepository datasetRepository) { this.databaseRepository = databaseRepository; this.applicationContext = applicationContext; this.remoteFetcher = remoteFetcher; this.builderFactory = builderFactory; this.fileStorageService = fileStorageService; + this.datasetRepository = datasetRepository; } @Override @@ -53,4 +56,13 @@ public class OperationsContextImpl implements OperationsContext { public FileStorageService getFileStorageService() { return fileStorageService; } + + @Override + public DatasetRepository getDatasetRepository() { + return datasetRepository; + } + + public void setDatasetRepository(DatasetRepository datasetRepository) { + this.datasetRepository = datasetRepository; + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/authentication/AbstractAuthenticationService.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/authentication/AbstractAuthenticationService.java new file mode 100644 index 000000000..731ea109c --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/authentication/AbstractAuthenticationService.java @@ -0,0 +1,174 @@ +package eu.eudat.logic.services.operations.authentication; + +import eu.eudat.data.entities.Credential; +import eu.eudat.data.entities.UserInfo; +import eu.eudat.data.entities.UserRole; +import eu.eudat.data.entities.UserToken; +import eu.eudat.exceptions.security.NullEmailException; +import eu.eudat.logic.builders.entity.CredentialBuilder; +import eu.eudat.logic.builders.entity.UserInfoBuilder; +import eu.eudat.logic.builders.entity.UserTokenBuilder; +import eu.eudat.logic.security.validators.TokenValidatorFactoryImpl; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.models.data.login.Credentials; +import eu.eudat.models.data.loginprovider.LoginProviderUser; +import eu.eudat.models.data.security.Principal; +import eu.eudat.types.Authorities; +import org.json.JSONObject; +import org.springframework.core.env.Environment; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +public abstract class AbstractAuthenticationService implements AuthenticationService { + + protected ApiContext apiContext; + protected Environment environment; + + public AbstractAuthenticationService(ApiContext apiContext, Environment environment) { + this.apiContext = apiContext; + this.environment = environment; + } + + protected Date addADay(Date date) { + Date dt = new Date(); + Calendar c = Calendar.getInstance(); + c.setTime(dt); + c.add(Calendar.DATE, 1); + dt = c.getTime(); + return dt; + } + + abstract Principal Touch(UserToken token); + + @Transactional + protected Credential autoCreateUser(String username, String password) { + if (!environment.getProperty("autouser.root.username").equals(username) || !environment.getProperty("autouser.root.password").equals(password)) + return null; + + UserInfo userInfo = this.apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class) + .name(username).email(environment.getProperty("autouser.root.email")).created(new Date()) + .lastloggedin(new Date()).authorization_level((short) 1).usertype((short) 1) + .build(); + + userInfo = this.apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().createOrUpdate(userInfo); + + UserRole role = new UserRole(); + role.setRole(Authorities.ADMIN.getValue()); + role.setUserInfo(userInfo); + this.apiContext.getOperationsContext().getDatabaseRepository().getUserRoleDao().createOrUpdate(role); + + Credential credential = this.apiContext.getOperationsContext().getBuilderFactory().getBuilder(CredentialBuilder.class) + .id(UUID.randomUUID()).userInfo(userInfo).publicValue(username).secret(password) + .provider((int) TokenValidatorFactoryImpl.LoginProvider.NATIVELOGIN.getValue()) + .creationTime(new Date()).lastUpdateTime(new Date()).status(0) + .build(); + + return this.apiContext.getOperationsContext().getDatabaseRepository().getCredentialDao().createOrUpdate(credential); + } + + public Principal Touch(UUID token) { + UserToken tokenEntry = this.apiContext.getOperationsContext().getDatabaseRepository().getUserTokenDao().find(token); + if (tokenEntry == null || tokenEntry.getExpiresAt().before(new Date())) return null; + + return this.Touch(tokenEntry); + } + + public void Logout(UUID token) { + UserToken tokenEntry = this.apiContext.getOperationsContext().getDatabaseRepository().getUserTokenDao().find(token); + this.apiContext.getOperationsContext().getDatabaseRepository().getUserTokenDao().delete(tokenEntry); + } + + public Principal Touch(Credentials credentials) throws NullEmailException { + Credential credential = this.apiContext.getOperationsContext().getDatabaseRepository().getCredentialDao().getLoggedInCredentials(credentials.getUsername(), credentials.getSecret(), TokenValidatorFactoryImpl.LoginProvider.NATIVELOGIN.getValue()); + + if (credential == null && credentials.getUsername().equals(environment.getProperty("autouser.root.username"))) { + try { + credential = this.autoCreateUser(credentials.getUsername(), credentials.getSecret()); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + if (credential == null) return null; + + UserToken userToken = this.apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserTokenBuilder.class) + .issuedAt(new Date()).user(credential.getUserInfo()) + .token(UUID.randomUUID()).expiresAt(addADay(new Date())) + .build(); + + userToken = apiContext.getOperationsContext().getDatabaseRepository().getUserTokenDao().createOrUpdate(userToken); + + return this.Touch(userToken); + + } + + public Principal Touch(LoginProviderUser profile) throws NullEmailException { + + UserInfo userInfo = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().asQueryable().withHint("userInfo").where((builder, root) -> builder.equal(root.get("email"), profile.getEmail())).getSingleOrDefault(); + + if (userInfo == null) { + Optional optionalCredential = Optional.ofNullable(apiContext.getOperationsContext().getDatabaseRepository().getCredentialDao() + .asQueryable().withHint("credentialUserInfo") + .where((builder, root) -> builder.and(builder.equal(root.get("provider"), profile.getProvider().getValue()), builder.equal(root.get("externalId"), profile.getId()))) + .getSingleOrDefault()); + userInfo = optionalCredential.map(Credential::getUserInfo).orElse(null); + } + + final Credential credential = this.apiContext.getOperationsContext().getBuilderFactory().getBuilder(CredentialBuilder.class) + .id(UUID.randomUUID()) + .creationTime(new Date()) + .status(1) + .lastUpdateTime(new Date()) + .provider(profile.getProvider().getValue()) + .secret(profile.getSecret()) + .externalId(profile.getId()) + .build(); + + if (userInfo == null) { + userInfo = this.apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class) + .name(profile.getName()).verified_email(profile.getIsVerified()) + .email(profile.getEmail()).created(new Date()).lastloggedin(new Date()) + .additionalinfo("{\"data\":{\"avatar\":{\"url\":\"" + profile.getAvatarUrl() + "\"}}}") + .authorization_level((short) 1).usertype((short) 1) + .build(); + + userInfo = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().createOrUpdate(userInfo); + credential.setPublicValue(userInfo.getName()); + credential.setUserInfo(userInfo); + apiContext.getOperationsContext().getDatabaseRepository().getCredentialDao().createOrUpdate(credential); + + UserRole role = new UserRole(); + role.setRole(Authorities.USER.getValue()); + role.setUserInfo(userInfo); + apiContext.getOperationsContext().getDatabaseRepository().getUserRoleDao().createOrUpdate(role); + + } else { + Map additionalInfo = userInfo.getAdditionalinfo() != null ? + new JSONObject(userInfo.getAdditionalinfo()).toMap() : new HashMap<>(); + additionalInfo.put("avatarUrl", profile.getAvatarUrl()); + userInfo.setLastloggedin(new Date()); + userInfo.setAdditionalinfo(new JSONObject(additionalInfo).toString()); + Set credentials = userInfo.getCredentials(); + if (credentials.contains(credential)) { + Credential oldCredential = credentials.stream().filter(item -> credential.getProvider().equals(item.getProvider())).findFirst().get(); + credential.setId(oldCredential.getId()); + } else { + credential.setUserInfo(userInfo); + credential.setId(UUID.randomUUID()); + credential.setPublicValue(userInfo.getName()); + apiContext.getOperationsContext().getDatabaseRepository().getCredentialDao().createOrUpdate(credential); + userInfo.getCredentials().add(credential); + } + userInfo = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().createOrUpdate(userInfo); + } + + UserToken userToken = this.apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserTokenBuilder.class) + .token(UUID.randomUUID()).user(userInfo) + .expiresAt(addADay(new Date())).issuedAt(new Date()) + .build(); + + apiContext.getOperationsContext().getDatabaseRepository().getUserTokenDao().createOrUpdate(userToken); + return Touch(userToken.getToken()); + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/authentication/AuthenticationService.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/authentication/AuthenticationService.java new file mode 100644 index 000000000..a79faaed1 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/authentication/AuthenticationService.java @@ -0,0 +1,22 @@ +package eu.eudat.logic.services.operations.authentication; + +import eu.eudat.exceptions.security.NullEmailException; +import eu.eudat.models.data.login.Credentials; +import eu.eudat.models.data.loginprovider.LoginProviderUser; +import eu.eudat.models.data.security.Principal; + +import java.util.UUID; + +/** + * Created by ikalyvas on 3/1/2018. + */ +public interface AuthenticationService { + + Principal Touch(LoginProviderUser profile) throws NullEmailException; + + Principal Touch(Credentials credentials) throws NullEmailException; + + void Logout(UUID token); + + Principal Touch(UUID token) throws NullEmailException; +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/authentication/NonVerifiedUserEmailAuthenticationService.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/authentication/NonVerifiedUserEmailAuthenticationService.java new file mode 100644 index 000000000..62c5f60ae --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/authentication/NonVerifiedUserEmailAuthenticationService.java @@ -0,0 +1,70 @@ +package eu.eudat.logic.services.operations.authentication; + +import com.fasterxml.jackson.databind.ObjectMapper; +import eu.eudat.data.entities.UserInfo; +import eu.eudat.data.entities.UserRole; +import eu.eudat.data.entities.UserToken; +import eu.eudat.logic.builders.model.models.PrincipalBuilder; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.models.data.security.Principal; +import eu.eudat.types.Authorities; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.HashSet; +import java.util.List; + +@Service("nonVerifiedUserAuthenticationService") +public class NonVerifiedUserEmailAuthenticationService extends AbstractAuthenticationService { + + public NonVerifiedUserEmailAuthenticationService(ApiContext apiContext, Environment environment) { + super(apiContext, environment); + } + + public Principal Touch(UserToken token) { + if (token == null || token.getExpiresAt().before(new Date())) return null; + + UserInfo user = this.apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(token.getUser().getId()); + if (user == null) return null; + String avatarUrl; + try { + avatarUrl = user.getAdditionalinfo() != null ? new ObjectMapper().readTree(user.getAdditionalinfo()).get("avatarUrl").asText() : ""; + } catch (Exception e) { + avatarUrl = ""; + } + String culture; + try { + culture = user.getAdditionalinfo() != null ? new ObjectMapper().readTree(user.getAdditionalinfo()).get("culture").get("name").asText() : ""; + } catch (Exception e) { + culture = ""; + } + String language; + try { + language = user.getAdditionalinfo() != null ? new ObjectMapper().readTree(user.getAdditionalinfo()).get("language").get("value").asText() : ""; + } catch (Exception e) { + language = ""; + } + String timezone; + try { + timezone = user.getAdditionalinfo() != null ? new ObjectMapper().readTree(user.getAdditionalinfo()).get("timezone").asText() : ""; + } catch (Exception e) { + timezone = ""; + } + Principal principal = this.apiContext.getOperationsContext().getBuilderFactory().getBuilder(PrincipalBuilder.class) + .id(user.getId()).token(token.getToken()) + .expiresAt(token.getExpiresAt()).name(user.getName()) + .avatarUrl(avatarUrl) + .culture(culture) + .language(language) + .timezone(timezone) + .build(); + + List userRoles = apiContext.getOperationsContext().getDatabaseRepository().getUserRoleDao().getUserRoles(user); + for (UserRole item : userRoles) { + if (principal.getAuthz() == null) principal.setAuthorities(new HashSet<>()); + principal.getAuthz().add(Authorities.fromInteger(item.getRole())); + } + return principal; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/authentication/VerifiedUserAuthenticationService.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/authentication/VerifiedUserAuthenticationService.java new file mode 100644 index 000000000..acbb3dc86 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/operations/authentication/VerifiedUserAuthenticationService.java @@ -0,0 +1,79 @@ +package eu.eudat.logic.services.operations.authentication; + +import com.fasterxml.jackson.databind.ObjectMapper; +import eu.eudat.data.entities.Credential; +import eu.eudat.data.entities.UserInfo; +import eu.eudat.data.entities.UserRole; +import eu.eudat.data.entities.UserToken; +import eu.eudat.exceptions.security.NullEmailException; +import eu.eudat.logic.builders.entity.CredentialBuilder; +import eu.eudat.logic.builders.entity.UserInfoBuilder; +import eu.eudat.logic.builders.entity.UserTokenBuilder; +import eu.eudat.logic.builders.model.models.PrincipalBuilder; +import eu.eudat.logic.security.validators.TokenValidatorFactoryImpl; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.models.data.login.Credentials; +import eu.eudat.models.data.loginprovider.LoginProviderUser; +import eu.eudat.models.data.security.Principal; +import eu.eudat.types.Authorities; +import org.json.JSONObject; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Service; + +import java.util.*; + + +@Service("verifiedUserAuthenticationService") +public class VerifiedUserAuthenticationService extends AbstractAuthenticationService { + + public VerifiedUserAuthenticationService(ApiContext apiContext, Environment environment) { + super(apiContext, environment); + } + + public Principal Touch(UserToken token) { + if (token == null || token.getExpiresAt().before(new Date())) return null; + + UserInfo user = this.apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(token.getUser().getId()); + if (user == null) return null; + if (user.getEmail() == null) throw new NullEmailException(); + String avatarUrl; + try { + avatarUrl = user.getAdditionalinfo() != null ? new ObjectMapper().readTree(user.getAdditionalinfo()).get("avatarUrl").asText() : ""; + } catch (Exception e) { + avatarUrl = ""; + } + String culture; + try { + culture = user.getAdditionalinfo() != null ? new ObjectMapper().readTree(user.getAdditionalinfo()).get("culture").get("name").asText() : ""; + } catch (Exception e) { + culture = ""; + } + String language; + try { + language = user.getAdditionalinfo() != null ? new ObjectMapper().readTree(user.getAdditionalinfo()).get("language").get("value").asText() : ""; + } catch (Exception e) { + language = ""; + } + String timezone; + try { + timezone = user.getAdditionalinfo() != null ? new ObjectMapper().readTree(user.getAdditionalinfo()).get("timezone").asText() : ""; + } catch (Exception e) { + timezone = ""; + } + Principal principal = this.apiContext.getOperationsContext().getBuilderFactory().getBuilder(PrincipalBuilder.class) + .id(user.getId()).token(token.getToken()) + .expiresAt(token.getExpiresAt()).name(user.getName()) + .avatarUrl(avatarUrl) + .culture(culture) + .language(language) + .timezone(timezone) + .build(); + + List userRoles = apiContext.getOperationsContext().getDatabaseRepository().getUserRoleDao().getUserRoles(user); + for (UserRole item : userRoles) { + if (principal.getAuthz() == null) principal.setAuthorities(new HashSet<>()); + principal.getAuthz().add(Authorities.fromInteger(item.getRole())); + } + return principal; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/ConfirmationEmailService.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/ConfirmationEmailService.java new file mode 100644 index 000000000..831e48b9d --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/ConfirmationEmailService.java @@ -0,0 +1,13 @@ +package eu.eudat.logic.services.utilities; + +import eu.eudat.data.dao.entities.LoginConfirmationEmailDao; +import eu.eudat.data.entities.LoginConfirmationEmail; + +import java.util.UUID; +import java.util.concurrent.CompletableFuture; + +public interface ConfirmationEmailService { + public void createConfirmationEmail(LoginConfirmationEmailDao loginConfirmationEmailDao, MailService mailService, String email, UUID userId); + + public CompletableFuture sentConfirmationEmail(LoginConfirmationEmail confirmationEmail, MailService mailService); +} \ No newline at end of file diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/ConfirmationEmailServiceImpl.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/ConfirmationEmailServiceImpl.java new file mode 100644 index 000000000..9b7db8421 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/ConfirmationEmailServiceImpl.java @@ -0,0 +1,73 @@ +package eu.eudat.logic.services.utilities; + +import eu.eudat.core.logger.Logger; +import eu.eudat.data.dao.entities.LoginConfirmationEmailDao; +import eu.eudat.data.entities.LoginConfirmationEmail; +import eu.eudat.models.data.mail.SimpleMail; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; + +@Service("ConfirmationEmailService") +public class ConfirmationEmailServiceImpl implements ConfirmationEmailService { + private Logger logger; + private Environment environment; + + public ConfirmationEmailServiceImpl(Logger logger, Environment environment) { + this.logger = logger; + this.environment = environment; + } + + @Override + public void createConfirmationEmail(LoginConfirmationEmailDao loginConfirmationEmailDao, MailService mailService, String email, UUID userId) { + LoginConfirmationEmail confirmationEmail = new LoginConfirmationEmail(); + confirmationEmail.setEmail(email); + confirmationEmail.setExpiresAt(Date + .from(new Date() + .toInstant() + .plusSeconds(Long.parseLong(this.environment.getProperty("conf_email.expiration_time_seconds"))) + ) + ); + confirmationEmail.setUserId(userId); + confirmationEmail.setIsConfirmed(false); + confirmationEmail.setToken(UUID.randomUUID()); + confirmationEmail = loginConfirmationEmailDao.createOrUpdate(confirmationEmail); + sentConfirmationEmail(confirmationEmail, mailService); + } + + @Override + public CompletableFuture sentConfirmationEmail(LoginConfirmationEmail confirmationEmail, MailService mailService) { + return CompletableFuture.runAsync(() -> { + SimpleMail mail = new SimpleMail(); + mail.setSubject(environment.getProperty("conf_email.subject")); + mail.setContent(createContent(confirmationEmail.getToken(), mailService)); + mail.setTo(confirmationEmail.getEmail()); + try { + mailService.sendSimpleMail(mail); + } catch (Exception ex) { + ex.printStackTrace(); + this.logger.error(ex, ex.getMessage()); + } + }); + } + + private String createContent(UUID confirmationToken, MailService mailService) { + String content = mailService.getMailTemplateContent("classpath:emailConfirmation.html"); + content = content.replace("{confirmationToken}", confirmationToken.toString()); + content = content.replace("{expiration_time}", secondsToTime(Integer.parseInt(this.environment.getProperty("conf_email.expiration_time_seconds")))); + content = content.replace("{host}", this.environment.getProperty("dmp.domain")); + + return content; + } + + private String secondsToTime(int seconds) { + int sec = seconds % 60; + int hour = seconds / 60; + int min = hour % 60; + hour = hour / 60; + return (hour + ":" + min + ":" + sec); + } +} \ No newline at end of file diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/InvitationService.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/InvitationService.java index 336987267..a580afc0f 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/InvitationService.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/InvitationService.java @@ -6,15 +6,17 @@ import eu.eudat.data.dao.entities.InvitationDao; import eu.eudat.data.entities.DMP; import eu.eudat.data.entities.Invitation; +import javax.mail.MessagingException; import java.util.List; +import java.util.concurrent.CompletableFuture; public interface InvitationService { - void assignToDmp(DMPDao dmpDao, List users, DMP dmp); + void assignToDmp(DMPDao dmpDao, List users, DMP dmp); - void assignToDmp(DMPDao dmpDao, eu.eudat.data.entities.UserInfo user, DMP dmp); + void assignToDmp(DMPDao dmpDao, eu.eudat.data.entities.UserDMP user, DMP dmp); - void createInvitations(InvitationDao invitationDao, MailService mailService, List users, DMP dmp, eu.eudat.data.entities.UserInfo creator); + void createInvitations(InvitationDao invitationDao, MailService mailService, List users, DMP dmp, eu.eudat.data.entities.UserInfo creator) throws MessagingException; - void sendInvitation(DMP dmp, Invitation invitation, MailService mailService); + CompletableFuture sendInvitationAsync(DMP dmp, Invitation invitation, String recipient, MailService mailService) throws MessagingException; } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/InvitationServiceImpl.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/InvitationServiceImpl.java index 601978a28..4f28028b4 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/InvitationServiceImpl.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/InvitationServiceImpl.java @@ -1,34 +1,58 @@ package eu.eudat.logic.services.utilities; +import eu.eudat.core.logger.Logger; +import eu.eudat.core.models.exception.ApiExceptionLoggingModel; import eu.eudat.data.dao.entities.DMPDao; import eu.eudat.data.dao.entities.InvitationDao; import eu.eudat.data.entities.DMP; import eu.eudat.data.entities.Invitation; +import eu.eudat.data.entities.UserInfo; import eu.eudat.models.data.mail.SimpleMail; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; +import types.LoggingType; +import javax.mail.MessagingException; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.UUID; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; @Service("invitationService") public class InvitationServiceImpl implements InvitationService { + + private Logger logger; + private Environment environment; + + @Autowired + public InvitationServiceImpl(Logger logger, Environment environment) { + this.logger = logger; + this.environment = environment; + } + @Override - public void assignToDmp(DMPDao dmpDao, List users, DMP dmp) { - for (eu.eudat.data.entities.UserInfo user : users) { + public void assignToDmp(DMPDao dmpDao, List users, DMP dmp) { + for (eu.eudat.data.entities.UserDMP user : users) { dmp.getUsers().add(user); } dmpDao.createOrUpdate(dmp); } @Override - public void assignToDmp(DMPDao dmpDao, eu.eudat.data.entities.UserInfo user, DMP dmp) { - dmp.getUsers().add(user); - dmpDao.createOrUpdate(dmp); + public void assignToDmp(DMPDao dmpDao, eu.eudat.data.entities.UserDMP user, DMP dmp) { + if (!dmp.getUsers().stream().map(x -> x.getUser().getId()).collect(Collectors.toList()).contains(user.getId())) { + dmp.getUsers().add(user); + dmpDao.createOrUpdate(dmp); + } } @Override - public void createInvitations(InvitationDao invitationDao, MailService mailService, List users, DMP dmp, eu.eudat.data.entities.UserInfo creator) { + public void createInvitations(InvitationDao invitationDao, MailService mailService, List users, DMP dmp, eu.eudat.data.entities.UserInfo creator) throws MessagingException { for (eu.eudat.data.entities.UserInfo userInfo : users) { Invitation invitation = new Invitation(); invitation.setDmp(dmp); @@ -37,17 +61,24 @@ public class InvitationServiceImpl implements InvitationService { invitation.setToken(UUID.randomUUID()); invitation.setAcceptedInvitation(false); invitationDao.createOrUpdate(invitation); - sendInvitation(dmp, invitation, mailService); + sendInvitationAsync(dmp, invitation, userInfo.getName(), mailService); } } @Override - public void sendInvitation(DMP dmp, Invitation invitation, MailService mailService) { - SimpleMail mail = new SimpleMail(); - mail.setSubject(createSubject(dmp, mailService.getMailTemplateSubject())); - mail.setContent(createContent(invitation.getId(), dmp, mailService.getMailTemplateContent())); - mail.setTo(invitation.getInvitationEmail()); - mailService.sendSimpleMail(mail); + public CompletableFuture sendInvitationAsync(DMP dmp, Invitation invitation, String recipient, MailService mailService) { + return CompletableFuture.runAsync(() -> { + SimpleMail mail = new SimpleMail(); + mail.setSubject(createSubject(dmp, mailService.getMailTemplateSubject())); + mail.setContent(createContent(invitation.getId(), dmp, recipient, mailService.getMailTemplateContent("classpath:email.html"))); + mail.setTo(invitation.getInvitationEmail()); + try { + mailService.sendSimpleMail(mail); + } catch (Exception ex) { + ex.printStackTrace(); + this.logger.error(ex, ex.getMessage()); + } + }); } private String createSubject(DMP dmp, String templateSubject) { @@ -55,9 +86,12 @@ public class InvitationServiceImpl implements InvitationService { return subject; } - private String createContent(UUID invitationID, DMP dmp, String templateContent) { + private String createContent(UUID invitationID, DMP dmp, String recipient, String templateContent) { String content = templateContent.replace("{dmpname}", dmp.getLabel()); content = content.replace("{invitationID}", invitationID.toString()); + content = content.replace("{recipient}", recipient); + content = content.replace("{host}", this.environment.getProperty("dmp.domain")); + return content; } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/MailService.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/MailService.java index c2fd28558..d210f8422 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/MailService.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/MailService.java @@ -2,11 +2,13 @@ package eu.eudat.logic.services.utilities; import eu.eudat.models.data.mail.SimpleMail; +import javax.mail.MessagingException; + public interface MailService { - void sendSimpleMail(SimpleMail mail); + void sendSimpleMail(SimpleMail mail) throws MessagingException; - String getMailTemplateContent(); + String getMailTemplateContent(String resourceTemplate); String getMailTemplateSubject(); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/MailServiceImpl.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/MailServiceImpl.java index 5340ec671..fb1983949 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/MailServiceImpl.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/MailServiceImpl.java @@ -1,27 +1,42 @@ package eu.eudat.logic.services.utilities; import eu.eudat.models.data.mail.SimpleMail; +import org.apache.commons.io.IOUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; import org.springframework.core.env.Environment; -import org.springframework.mail.SimpleMailMessage; +import org.springframework.core.io.Resource; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.stereotype.Service; +import javax.mail.Message; +import javax.mail.MessagingException; +import javax.mail.internet.MimeMessage; +import java.io.*; + @Service("mailService") public class MailServiceImpl implements MailService { - @Autowired + private Environment env; - @Autowired private JavaMailSender emailSender; + private ApplicationContext applicationContext; + + @Autowired + public MailServiceImpl(Environment env, JavaMailSender emailSender, ApplicationContext applicationContext) { + this.env = env; + this.emailSender = emailSender; + this.applicationContext = applicationContext; + } + @Override - public void sendSimpleMail(SimpleMail mail) { - SimpleMailMessage message = new SimpleMailMessage(); + public void sendSimpleMail(SimpleMail mail) throws MessagingException { + MimeMessage message = this.emailSender.createMimeMessage(); message.setSubject(mail.getSubject()); - message.setText(mail.getContent()); - message.setTo(mail.getTo()); + message.setText(mail.getContent(), "utf-8", "html"); + message.addRecipients(Message.RecipientType.TO, mail.getTo()); message.setFrom(env.getProperty("mail.from")); this.emailSender.send(message); } @@ -31,8 +46,17 @@ public class MailServiceImpl implements MailService { } @Override - public String getMailTemplateContent() { - return env.getProperty("mail.content"); + public String getMailTemplateContent(String resourceTemplate) { + Resource resource = applicationContext.getResource(resourceTemplate); + try { + InputStream inputStream = resource.getInputStream(); + StringWriter writer = new StringWriter(); + IOUtils.copy(inputStream, writer, "UTF-8"); + return writer.toString(); + } catch (IOException e) { + e.printStackTrace(); + } + return ""; } @Override diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/UtilitiesService.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/UtilitiesService.java index 88fe41b5e..3a6a25c4f 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/UtilitiesService.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/UtilitiesService.java @@ -12,4 +12,6 @@ public interface UtilitiesService { MailService getMailService(); VisibilityRuleService getVisibilityRuleService(); + + ConfirmationEmailService getConfirmationEmailService(); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/UtilitiesServiceImpl.java b/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/UtilitiesServiceImpl.java index f42a92428..9838a8b99 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/UtilitiesServiceImpl.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/services/utilities/UtilitiesServiceImpl.java @@ -13,12 +13,14 @@ public class UtilitiesServiceImpl implements UtilitiesService { private InvitationService invitationService; private MailService mailService; private VisibilityRuleService visibilityRuleService; + private ConfirmationEmailService confirmationEmailService; @Autowired - public UtilitiesServiceImpl(InvitationService invitationService, MailService mailService, VisibilityRuleService visibilityRuleService) { + public UtilitiesServiceImpl(InvitationService invitationService, MailService mailService, VisibilityRuleService visibilityRuleService, ConfirmationEmailService confirmationEmailService) { this.invitationService = invitationService; this.mailService = mailService; this.visibilityRuleService = visibilityRuleService; + this.confirmationEmailService = confirmationEmailService; } @Override @@ -26,6 +28,11 @@ public class UtilitiesServiceImpl implements UtilitiesService { return visibilityRuleService; } + @Override + public ConfirmationEmailService getConfirmationEmailService() { + return confirmationEmailService; + } + @Override public InvitationService getInvitationService() { return invitationService; diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/builders/ModelBuilder.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/builders/ModelBuilder.java index 6e4385ca9..76d14be74 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/builders/ModelBuilder.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/builders/ModelBuilder.java @@ -65,11 +65,23 @@ public class ModelBuilder { return (FieldData) new WordListData().fromData(data); } } + if (type.equals("internalDmpEntities")) { + if (dataElement != null) { + if (dataElement.getAttribute("type").equals("researchers")) { + return (FieldData) new ResearchersAutoCompleteData().fromData(data); + } + else if (dataElement.getAttribute("type").equals("datasets")) + return (FieldData) new DatasetsAutoCompleteData().fromData(data); + else if (dataElement.getAttribute("type").equals("dmps")) + return (FieldData) new DMPsAutoCompleteData().fromData(data); + } + } if (type.equals("booleanDecision")) return (FieldData) new BooleanDecisionData().fromData(data); if (type.equals("radiobox")) return (FieldData) new RadioBoxData().fromData(data); if (type.equals("checkBox")) return (FieldData) new CheckBoxData().fromData(data); if (type.equals("freetext")) return (FieldData) new FreeTextData().fromData(data); if (type.equals("textarea")) return (FieldData) new TextAreaData().fromData(data); + if (type.equals("datePicker")) return (FieldData) new DatePickerData().fromData(data); return null; } @@ -81,13 +93,24 @@ public class ModelBuilder { } else if (comboboxType.equals("wordlist")) return (FieldData) new WordListData().fromData(data); } + if (type.equals("internalDmpEntities")) { + String internalDmpEntitiesType = (String) ((Map) data).get("type"); + if (internalDmpEntitiesType.equals("researchers")) { + return (FieldData) new ResearchersAutoCompleteData().fromData(data); + } + else if (internalDmpEntitiesType.equals("datasets")) { + return (FieldData) new DatasetsAutoCompleteData().fromData(data); + } + else if (internalDmpEntitiesType.equals("dmps")) { + return (FieldData) new DMPsAutoCompleteData().fromData(data); + } + } if (type.equals("booleanDecision")) return (FieldData) new BooleanDecisionData().fromData(data); if (type.equals("radiobox")) return (FieldData) new RadioBoxData().fromData(data); if (type.equals("checkBox")) return (FieldData) new CheckBoxData().fromData(data); if (type.equals("freetext")) return (FieldData) new FreeTextData().fromData(data); if (type.equals("textarea")) return (FieldData) new TextAreaData().fromData(data); + if (type.equals("datePicker")) return (FieldData) new DatePickerData().fromData(data); return null; } - - } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java index 8b3b50a02..657946e0a 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java @@ -1,23 +1,25 @@ package eu.eudat.logic.utilities.documents.word; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import eu.eudat.logic.services.forms.VisibilityRuleService; import eu.eudat.logic.utilities.documents.types.ParagraphStyle; -import eu.eudat.logic.utilities.documents.types.TextStyle; +import eu.eudat.logic.utilities.interfaces.ApplierWithValue; +import eu.eudat.models.data.components.commons.datafield.CheckBoxData; +import eu.eudat.models.data.components.commons.datafield.ComboBoxData; import eu.eudat.models.data.user.components.datasetprofile.Field; import eu.eudat.models.data.user.components.datasetprofile.FieldSet; import eu.eudat.models.data.user.components.datasetprofile.Section; import eu.eudat.models.data.user.composite.DatasetProfilePage; import eu.eudat.models.data.user.composite.PagedDatasetProfile; -import eu.eudat.logic.services.forms.VisibilityRuleService; -import eu.eudat.logic.utilities.interfaces.ApplierWithValue; import org.apache.poi.xwpf.usermodel.*; +import org.json.JSONArray; +import org.json.JSONObject; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTAbstractNum; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDecimalNumber; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTLvl; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STNumberFormat; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.IOException; import java.math.BigInteger; import java.util.HashMap; @@ -36,18 +38,22 @@ public class WordBuilder { public WordBuilder() { this.cTAbstractNum = CTAbstractNum.Factory.newInstance(); this.cTAbstractNum.setAbstractNumId(BigInteger.valueOf(1)); + this.buildOptions(); } private void buildOptions() { this.options.put(ParagraphStyle.TEXT, (mainDocumentPart, item) -> { XWPFParagraph paragraph = mainDocumentPart.createParagraph(); XWPFRun run = paragraph.createRun(); - run.setText(item); + if (item != null) + run.setText(" " + item); run.setFontSize(11); return paragraph; }); this.options.put(ParagraphStyle.TITLE, (mainDocumentPart, item) -> { XWPFParagraph paragraph = mainDocumentPart.createParagraph(); + paragraph.setStyle("Title"); + paragraph.setAlignment(ParagraphAlignment.CENTER); XWPFRun run = paragraph.createRun(); run.setText(item); run.setBold(true); @@ -56,29 +62,29 @@ public class WordBuilder { }); this.options.put(ParagraphStyle.HEADER1, (mainDocumentPart, item) -> { XWPFParagraph paragraph = mainDocumentPart.createParagraph(); + paragraph.setStyle("Heading1"); XWPFRun run = paragraph.createRun(); run.setText(item); run.setBold(true); run.setFontSize(12); - run.setUnderline(UnderlinePatterns.SINGLE); return paragraph; }); this.options.put(ParagraphStyle.HEADER2, (mainDocumentPart, item) -> { XWPFParagraph paragraph = mainDocumentPart.createParagraph(); + paragraph.setStyle("Heading2"); XWPFRun run = paragraph.createRun(); - run.setText(item); + run.setText(" " + item); run.setBold(true); run.setFontSize(12); - run.setUnderline(UnderlinePatterns.SINGLE); return paragraph; }); this.options.put(ParagraphStyle.HEADER3, (mainDocumentPart, item) -> { XWPFParagraph paragraph = mainDocumentPart.createParagraph(); + paragraph.setStyle("Heading3"); XWPFRun run = paragraph.createRun(); - run.setText(item); + run.setText(" " + item); run.setBold(true); run.setFontSize(11); - run.setUnderline(UnderlinePatterns.SINGLE); return paragraph; }); this.options.put(ParagraphStyle.FOOTER, (mainDocumentPart, item) -> { @@ -87,38 +93,37 @@ public class WordBuilder { run.setText(item); return paragraph; }); + this.options.put(ParagraphStyle.COMMENT, (mainDocumentPart, item) -> { + XWPFParagraph paragraph = mainDocumentPart.createParagraph(); + XWPFRun run = paragraph.createRun(); + run.setText(" " + item); + run.setItalic(true); + return paragraph; + }); } - public File build(PagedDatasetProfile pagedDatasetProfile, String label, VisibilityRuleService visibilityRuleService) throws IOException { - XWPFDocument document = new XWPFDocument(new FileInputStream((WordBuilder.class.getClassLoader().getResource("documents/h2020.docx")).getFile())); - this.buildOptions(); + public XWPFDocument build(XWPFDocument document, PagedDatasetProfile pagedDatasetProfile, VisibilityRuleService visibilityRuleService) throws IOException { createPages(pagedDatasetProfile.getPages(), document, true, visibilityRuleService); XWPFAbstractNum abstractNum = new XWPFAbstractNum(cTAbstractNum); XWPFNumbering numbering = document.createNumbering(); BigInteger abstractNumID = numbering.addAbstractNum(abstractNum); this.numId = numbering.addNum(abstractNumID); createPages(pagedDatasetProfile.getPages(), document, false, visibilityRuleService); - File exportFile = new File(label); - FileOutputStream out = new FileOutputStream(exportFile); - document.write(out); - out.close(); - return exportFile; + return document; } public void createPages(List datasetProfilePages, XWPFDocument mainDocumentPart, Boolean createListing, VisibilityRuleService visibilityRuleService) { - //if (createListing) this.addListing(mainDocumentPart, 0, false, true); datasetProfilePages.forEach(item -> { - createSections(item.getSections(), mainDocumentPart, ParagraphStyle.TITLE, 0, createListing, visibilityRuleService); + createSections(item.getSections(), mainDocumentPart, ParagraphStyle.HEADER1, 0, createListing, visibilityRuleService); }); } public void createSections(List
sections, XWPFDocument mainDocumentPart, ParagraphStyle style, Integer indent, Boolean createListing, VisibilityRuleService visibilityRuleService) { if (createListing) this.addListing(mainDocumentPart, indent, false, true); - BigInteger listing = numId; sections.forEach(section -> { if (visibilityRuleService.isElementVisible(section.getId())) { if (!createListing) { - XWPFParagraph paragraph = addParagraphContent(section.getTitle(), mainDocumentPart, style, listing); + XWPFParagraph paragraph = addParagraphContent(section.getNumbering() + " " + section.getTitle(), mainDocumentPart, style, numId); CTDecimalNumber number = paragraph.getCTP().getPPr().getNumPr().addNewIlvl(); number.setVal(BigInteger.valueOf(indent)); } @@ -131,14 +136,23 @@ public class WordBuilder { public void createCompositeFields(List
compositeFields, XWPFDocument mainDocumentPart, Integer indent, Boolean createListing, VisibilityRuleService visibilityRuleService) { if (createListing) this.addListing(mainDocumentPart, indent, true, true); compositeFields.forEach(compositeField -> { - if (visibilityRuleService.isElementVisible(compositeField.getId())) { - + if (visibilityRuleService.isElementVisible(compositeField.getId()) && hasVisibleFields(compositeField, visibilityRuleService)) { if (compositeField.getTitle() != null && !compositeField.getTitle().isEmpty() && !createListing) { - XWPFParagraph paragraph = addParagraphContent(compositeField.getTitle(), mainDocumentPart, ParagraphStyle.HEADER3, numId); + XWPFParagraph paragraph = addParagraphContent(compositeField.getNumbering() + " " + compositeField.getTitle(), mainDocumentPart, ParagraphStyle.HEADER3, numId); CTDecimalNumber number = paragraph.getCTP().getPPr().getNumPr().addNewIlvl(); number.setVal(BigInteger.valueOf(indent)); } createFields(compositeField.getFields(), mainDocumentPart, 3, createListing, visibilityRuleService); + if (!compositeField.getMultiplicityItems().isEmpty()) { + for (FieldSet multiplicityFieldset : compositeField.getMultiplicityItems()) { + createFields(multiplicityFieldset.getFields(), mainDocumentPart, 3, createListing, visibilityRuleService); + } + } + if (compositeField.getHasCommentField() && compositeField.getCommentFieldValue() != null && !compositeField.getCommentFieldValue().isEmpty() && !createListing) { + XWPFParagraph paragraph = addParagraphContent("Comment: " + compositeField.getCommentFieldValue(), mainDocumentPart, ParagraphStyle.COMMENT, numId); + CTDecimalNumber number = paragraph.getCTP().getPPr().getNumPr().addNewIlvl(); + number.setVal(BigInteger.valueOf(indent)); + } } }); } @@ -148,29 +162,27 @@ public class WordBuilder { fields.forEach(field -> { if (visibilityRuleService.isElementVisible(field.getId())) { if (!createListing) { - XWPFParagraph paragraph = addParagraphContent(field.getValue() == null ? "" : field.getValue(), mainDocumentPart, ParagraphStyle.TEXT, numId); - CTDecimalNumber number = paragraph.getCTP().getPPr().getNumPr().addNewIlvl(); - number.setVal(BigInteger.valueOf(indent)); + try { + XWPFParagraph paragraph = addParagraphContent(this.formatter(field), mainDocumentPart, ParagraphStyle.TEXT, numId); + CTDecimalNumber number = paragraph.getCTP().getPPr().getNumPr().addNewIlvl(); + number.setVal(BigInteger.valueOf(indent)); + } catch (IOException e) { + e.printStackTrace(); + } } } }); } - public XWPFParagraph addParagraphContent(String text, XWPFDocument mainDocumentPart, ParagraphStyle style, BigInteger numId) { XWPFParagraph paragraph = this.options.get(style).apply(mainDocumentPart, text); - if (numId != null) paragraph.setNumID(numId); + if (numId != null) { + paragraph.setNumID(numId); + } return paragraph; } - - public void addStyling(List styles, String color) { - - } - public void addListing(XWPFDocument document, int indent, Boolean question, Boolean hasIndication) { - - //this.cTAbstractNum.setAbstractNumId(BigInteger.valueOf(indent)); CTLvl cTLvl = this.cTAbstractNum.addNewLvl(); String textLevel = ""; @@ -179,28 +191,72 @@ public class WordBuilder { } if (question) { cTLvl.addNewNumFmt().setVal(STNumberFormat.DECIMAL); - cTLvl.addNewLvlText().setVal("Q " + textLevel); - cTLvl.addNewStart().setVal(BigInteger.valueOf(1)); cTLvl.setIlvl(BigInteger.valueOf(indent)); } else if (!question && hasIndication) { cTLvl.addNewNumFmt().setVal(STNumberFormat.DECIMAL); - cTLvl.addNewLvlText().setVal(textLevel); - cTLvl.addNewStart().setVal(BigInteger.valueOf(1)); cTLvl.setIlvl(BigInteger.valueOf(indent)); } if (!question && !hasIndication) { cTLvl.addNewNumFmt().setVal(STNumberFormat.NONE); - cTLvl.addNewLvlText().setVal(""); - cTLvl.addNewStart().setVal(BigInteger.valueOf(1)); cTLvl.setIlvl(BigInteger.valueOf(indent)); } - - /*if (this.numId == null) { - XWPFAbstractNum abstractNum = new XWPFAbstractNum(cTAbstractNum); - XWPFNumbering numbering = document.createNumbering(); - BigInteger abstractNumID = numbering.addAbstractNum(abstractNum); - this.numId = numbering.addNum(abstractNumID); - }*/ } + public String formatter(Field field) throws IOException { + switch (field.getViewStyle().getRenderStyle()) { + case "combobox": { + String comboboxType = ((ComboBoxData) field.getData()).getType(); + if (comboboxType.equals("autocomplete")) { + ObjectMapper mapper = new ObjectMapper(); + if (field.getValue() == null) return null; + Map map = new HashMap<>(); + if (!field.getValue().equals("")) { + try { + JSONArray jsonarray = new JSONArray(field.getValue()); + for (int i = 0; i < jsonarray.length(); i++) { + JSONObject jsonobject = jsonarray.getJSONObject(i); + String id = jsonobject.getString("id"); + String label = jsonobject.getString("label"); + if (id != null && label != null) { + map.put(id, label); + } + } + } catch (Exception e){ + Map exMap = mapper.readValue(field.getValue(), new TypeReference>() { + }); + return exMap.get("label"); + } + } + StringBuilder sb = new StringBuilder(); + for (Map.Entry entry : map.entrySet()) { + sb.append("\n"); + sb.append(entry.getValue()); + } + return sb.toString(); + } else if (comboboxType.equals("wordlist")) { + return field.getValue(); + } + } + case "booleanDecision": + if (field.getValue() != null && field.getValue().equals("true")) return "Yes"; + else return "No"; + case "radiobox": + return field.getValue(); + case "checkBox": + CheckBoxData data = (CheckBoxData) field.getData(); + if (field.getValue() == null || field.getValue().equals("false")) return null; + return data.getLabel(); + case "freetext": + return field.getValue(); + case "textarea": + return field.getValue(); + case "datepicker": + return field.getValue(); + } + return null; + } + + private boolean hasVisibleFields(FieldSet compositeFields, VisibilityRuleService visibilityRuleService) { + return compositeFields.getFields().stream().anyMatch(field -> visibilityRuleService.isElementVisible(field.getId())); + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/ExportXmlBuilder.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/ExportXmlBuilder.java index 0c9e8b72b..3c0f7024f 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/ExportXmlBuilder.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/ExportXmlBuilder.java @@ -1,12 +1,12 @@ package eu.eudat.logic.utilities.documents.xml; +import eu.eudat.logic.services.forms.VisibilityRuleService; +import eu.eudat.logic.utilities.builders.XmlBuilder; import eu.eudat.models.data.user.components.datasetprofile.Field; import eu.eudat.models.data.user.components.datasetprofile.FieldSet; import eu.eudat.models.data.user.components.datasetprofile.Section; import eu.eudat.models.data.user.composite.DatasetProfilePage; import eu.eudat.models.data.user.composite.PagedDatasetProfile; -import eu.eudat.logic.services.forms.VisibilityRuleService; -import eu.eudat.logic.utilities.builders.XmlBuilder; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -22,12 +22,16 @@ import java.util.UUID; */ public class ExportXmlBuilder { - public File build(PagedDatasetProfile pagedDatasetProfile, VisibilityRuleService visibilityRuleService) throws IOException { + public File build(PagedDatasetProfile pagedDatasetProfile, UUID datasetProfileId, VisibilityRuleService visibilityRuleService) throws IOException { File xmlFile = new File(UUID.randomUUID() + ".xml"); BufferedWriter writer = new BufferedWriter(new FileWriter(xmlFile, true)); Document xmlDoc = XmlBuilder.getDocument(); - Element root = createPages(pagedDatasetProfile.getPages(), visibilityRuleService, xmlDoc); + Element root = xmlDoc.createElement("root"); + Element datasetProfile = xmlDoc.createElement("datasetProfileId"); + datasetProfile.setTextContent(datasetProfileId.toString()); + root.appendChild(datasetProfile); + root.appendChild(createPages(pagedDatasetProfile.getPages(), visibilityRuleService, xmlDoc)); xmlDoc.appendChild(root); String xml = XmlBuilder.generateXml(xmlDoc); writer.write(xml); @@ -36,15 +40,13 @@ public class ExportXmlBuilder { } public Element createPages(List datasetProfilePages, VisibilityRuleService visibilityRuleService, Document element) { - Element root = element.createElement("root"); Element pages = element.createElement("pages"); datasetProfilePages.forEach(item -> { Element page = element.createElement("page"); page.appendChild(createSections(item.getSections(), visibilityRuleService, element)); pages.appendChild(page); }); - root.appendChild(pages); - return root; + return pages; } public Element createSections(List
sections, VisibilityRuleService visibilityRuleService, Document element) { @@ -52,13 +54,9 @@ public class ExportXmlBuilder { sections.forEach(section -> { Element elementSection = element.createElement("section"); if (visibilityRuleService.isElementVisible(section.getId())) { - Element elementInnerSections = element.createElement("sections"); - Element compositeFields = element.createElement("composite-field"); - elementInnerSections.appendChild(createSections(section.getSections(), visibilityRuleService, element)); - compositeFields.appendChild(createCompositeFields(section.getCompositeFields(), visibilityRuleService, element)); - elementSection.appendChild(elementInnerSections); + elementSection.appendChild(createSections(section.getSections(), visibilityRuleService, element)); + elementSection.appendChild(createCompositeFields(section.getCompositeFields(), visibilityRuleService, element)); elementSections.appendChild(elementSection); - elementSections.appendChild(compositeFields); } }); return elementSections; @@ -67,7 +65,7 @@ public class ExportXmlBuilder { public Element createCompositeFields(List
compositeFields, VisibilityRuleService visibilityRuleService, Document element) { Element elementComposites = element.createElement("composite-fields"); compositeFields.forEach(compositeField -> { - if (visibilityRuleService.isElementVisible(compositeField.getId())) { + if (visibilityRuleService.isElementVisible(compositeField.getId()) && hasVisibleFields(compositeField, visibilityRuleService)) { Element composite = element.createElement("composite-field"); composite.setAttribute("id", compositeField.getId()); if (compositeField.getTitle() != null && !compositeField.getTitle().isEmpty()) { @@ -95,11 +93,17 @@ public class ExportXmlBuilder { Element elementField = element.createElement("field"); elementField.setAttribute("id", field.getId()); if (field.getValue() != null && !field.getValue().isEmpty()) { - elementField.setTextContent(field.getValue()); + Element valueField = element.createElement("value"); + valueField.setTextContent(field.getValue()); + elementField.appendChild(valueField); } elementFields.appendChild(elementField); } }); return elementFields; } + + private boolean hasVisibleFields(FieldSet compositeFields, VisibilityRuleService visibilityRuleService) { + return compositeFields.getFields().stream().anyMatch(field -> visibilityRuleService.isElementVisible(field.getId())); + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/ExportXmlBuilderDatasetProfile.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/ExportXmlBuilderDatasetProfile.java new file mode 100644 index 000000000..6a53063d5 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/ExportXmlBuilderDatasetProfile.java @@ -0,0 +1,264 @@ +package eu.eudat.logic.utilities.documents.xml.datasetProfileXml; + + +import eu.eudat.models.data.admin.components.datasetprofile.Page; +import eu.eudat.models.data.components.commons.datafield.*; +import eu.eudat.models.data.user.components.datasetprofile.Field; +import eu.eudat.models.data.user.components.datasetprofile.FieldSet; +import eu.eudat.models.data.user.components.datasetprofile.Section; +import eu.eudat.logic.utilities.builders.XmlBuilder; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.List; +import java.util.UUID; + + +public class ExportXmlBuilderDatasetProfile { + + + public File build(eu.eudat.models.data.user.composite.DatasetProfile datasetProfile) throws IOException { + + File xmlFile = new File(UUID.randomUUID() + ".xml"); + BufferedWriter writer = new BufferedWriter(new FileWriter(xmlFile, true)); + Document xmlDoc = XmlBuilder.getDocument(); +// Element root = xmlDoc.createElement("root"); +// root.appendChild(createPages(datasetProfile.getPages(), datasetProfile.getSections(), xmlDoc)); + + xmlDoc.appendChild(createPages(datasetProfile.getPages(), datasetProfile.getSections(), xmlDoc)); + String xml = XmlBuilder.generateXml(xmlDoc); + writer.write(xml); + writer.close(); + return xmlFile; + } + + public Element createPages(List datasetProfilePages, List
sections, Document element) { + Element pages = element.createElement("pages"); + datasetProfilePages.forEach(item -> { + Element page = element.createElement("page"); + page.setAttribute("id", "" + item.getId()); + page.setAttribute("ordinal", "" + item.getOrdinal()); + page.setAttribute("title", "" + item.getTitle()); + sections.forEach(sectionFromLis -> { + if (sectionFromLis.getPage().equals(item.getId())) { + Element elementSections = element.createElement("sections"); + page.appendChild(createSections(sectionFromLis, element, elementSections)); + } + }); + pages.appendChild(page); + }); + return pages; + } + + + public Element createSections(Section sections, Document element, Element elementSections) { +// if (sections.getSections() != null) { + sections.getSections().forEach(sectionFor -> { + Element elementSectionsChild = element.createElement("section"); + elementSections.appendChild(createSections(sectionFor, element, elementSectionsChild)); + }); +// } + + elementSections.setAttribute("defaultVisibility", "" + sections.getDefaultVisibility()); + elementSections.setAttribute("id", "" + sections.getId()); + elementSections.setAttribute("ordinal", "" + sections.getOrdinal()); + elementSections.setAttribute("page", "" + sections.getPage()); + elementSections.setAttribute("page", "" + sections.getPage()); + + if (sections.getCompositeFields() != null) { + elementSections.appendChild(createFieldSet(sections.getCompositeFields(), element)); + } + + if (sections.getNumbering() != null) { + Element numbering = element.createElement("numbering"); + numbering.setTextContent(sections.getNumbering()); + elementSections.appendChild(numbering); + } + if (sections.getDescription() != null) { + Element description = element.createElement("description"); + description.setTextContent(sections.getDescription()); + elementSections.appendChild(description); + } + if (sections.getTitle() != null) { + Element title = element.createElement("title"); + title.setTextContent(sections.getTitle()); + elementSections.appendChild(title); + } + + return elementSections; + } + + public Element createFieldSet(List
fieldSet, Document element) { + Element elementFieldSets = element.createElement("field-Sets"); + fieldSet.forEach(field -> { + Element composite = element.createElement("field-Set"); + composite.setAttribute("id", field.getId()); + composite.setAttribute("ordinal", "" + field.getOrdinal()); + + if (field.getNumbering() != null) { + Element numbering = element.createElement("numbering"); + numbering.setTextContent(field.getNumbering()); + composite.appendChild(numbering); + } + Element commentField = element.createElement("CommentField"); + commentField.setTextContent("" + field.getHasCommentField()); + composite.appendChild(commentField); + + composite.appendChild(createFields(field.getFields(), element)); + + if (field.getMultiplicity() != null) { + Element multiplicity = element.createElement("multiplicity"); + multiplicity.setAttribute("max", "" + field.getMultiplicity().getMax()); + multiplicity.setAttribute("min", "" + field.getMultiplicity().getMin()); + composite.appendChild(multiplicity); + } + if (field.getTitle() != null && !field.getTitle().isEmpty()) { + Element title = element.createElement("title"); + title.setTextContent(field.getTitle()); + composite.appendChild(title); + } + if (field.getDescription() != null && !field.getDescription().isEmpty()) { + Element title = element.createElement("description"); + title.setTextContent(field.getDescription()); + composite.appendChild(title); + } + if (field.getExtendedDescription() != null && !field.getExtendedDescription().isEmpty()) { + Element extendedDescription = element.createElement("extendedDescription"); + extendedDescription.setTextContent(field.getExtendedDescription()); + composite.appendChild(extendedDescription); + } + if (field.getAdditionalInformation() != null && !field.getAdditionalInformation().isEmpty()) { + Element additionalInformation = element.createElement("additionalInformation"); + additionalInformation.setTextContent(field.getAdditionalInformation()); + composite.appendChild(additionalInformation); + } + + + elementFieldSets.appendChild(composite); + }); + return elementFieldSets; + } + + + public Element createFields(List fields, Document element) { + Element elementFields = element.createElement("fields"); + fields.forEach(field -> { + Element elementField = element.createElement("field"); + elementField.setAttribute("id", field.getId()); + elementField.setAttribute("ordinal", "" + field.getOrdinal()); + + if (field.getNumbering() != null) { + Element numbering = element.createElement("numbering"); + numbering.setTextContent(field.getNumbering()); + elementField.appendChild(numbering); + } + if (field.getValidations() != null) { + Element validations = element.createElement("validations"); + field.getValidations().forEach(validation -> { + Element validationChild = element.createElement("validation"); + validationChild.setAttribute("type", "" + validation); + validations.appendChild(validationChild); + }); + elementField.appendChild(validations); + } + if (field.getDefaultValue() != null) { + Element defaultValue = element.createElement("defaultValue"); + defaultValue.setAttribute("type", field.getDefaultValue().getType()); + defaultValue.setAttribute("value", field.getDefaultValue().getValue()); + elementField.appendChild(defaultValue); + } + if (field.getVisible() != null) { + Element visible = element.createElement("visible"); + visible.setAttribute("style", "" + field.getVisible().getStyle()); + field.getVisible().getRules().forEach(rule -> { + Element ruleChild = element.createElement("rule"); + ruleChild.setAttribute("ruleStyle", "" + rule.getRuleStyle()); + ruleChild.setAttribute("target", "" + rule.getTarget()); + ruleChild.setAttribute("type", "" + rule.getRuleType()); + Element ruleChildValue = element.createElement("value"); + ruleChildValue.setAttribute("type", "" + rule.getValueType()); + ruleChildValue.setTextContent(rule.getValue()); + ruleChild.appendChild(ruleChildValue); + visible.appendChild(ruleChild); + + }); + elementField.appendChild(visible); + } + if (field.getViewStyle() != null) { + Element viewStyle = element.createElement("viewStyle"); + viewStyle.setAttribute("cssClass", field.getViewStyle().getCssClass()); + viewStyle.setAttribute("renderStyle", field.getViewStyle().getRenderStyle()); + elementField.appendChild(viewStyle); + } + + if (field.getData() != null) { + Element dataOut = element.createElement("data"); + if (field.getViewStyle().getRenderStyle().equals("combobox")) { + ComboBoxData comboBoxDataObject = (ComboBoxData) field.getData(); + if (comboBoxDataObject.getType().equals("wordlist")) { + WordListData wordListDataObject = (WordListData) field.getData(); + dataOut.setAttribute("label", wordListDataObject.getLabel()); + dataOut.setAttribute("type", wordListDataObject.getType()); + Element options = element.createElement("options"); + wordListDataObject.getOptions().forEach(optionChildFor -> { + Element optionChild = element.createElement("option"); + optionChild.setAttribute("label", optionChildFor.getLabel()); + optionChild.setAttribute("value", optionChildFor.getValue()); + options.appendChild(optionChild); + }); + dataOut.appendChild(options); + } else if (comboBoxDataObject.getType().equals("autocomplete")) { + AutoCompleteData autoCompleteDataObject = (AutoCompleteData) field.getData(); + dataOut.setAttribute("label", autoCompleteDataObject.getLabel()); + dataOut.setAttribute("type", autoCompleteDataObject.getType()); + dataOut.setAttribute("optionsRoot", autoCompleteDataObject.getOptionsRoot()); + dataOut.setAttribute("url", autoCompleteDataObject.getUrl()); + if (autoCompleteDataObject.getAutoCompleteOptions() != null) { + Element optionChild = element.createElement("option"); + optionChild.setAttribute("label", autoCompleteDataObject.getAutoCompleteOptions().getLabel()); + optionChild.setAttribute("value", autoCompleteDataObject.getAutoCompleteOptions().getValue()); + dataOut.appendChild(optionChild); + } + } + } else if (field.getViewStyle().getRenderStyle().equals("booleanDecision")) { + BooleanDecisionData booleanDecisionDataObject = (BooleanDecisionData) field.getData(); + dataOut.setAttribute("label", booleanDecisionDataObject.getLabel()); + } else if (field.getViewStyle().getRenderStyle().equals("radiobox")) { + RadioBoxData radioBoxDataObject = (RadioBoxData) field.getData(); + dataOut.setAttribute("label", radioBoxDataObject.getLabel()); + + Element options = element.createElement("options"); + radioBoxDataObject.getOptions().forEach(optionChildFor -> { + Element optionChild = element.createElement("option"); + optionChild.setAttribute("label", optionChildFor.getLabel()); + optionChild.setAttribute("value", optionChildFor.getValue()); + options.appendChild(optionChild); + }); + dataOut.appendChild(options); + } else if (field.getViewStyle().getRenderStyle().equals("checkBox")) { + CheckBoxData checkBoxDataObject = (CheckBoxData) field.getData(); + dataOut.setAttribute("label", checkBoxDataObject.getLabel()); + } else if (field.getViewStyle().getRenderStyle().equals("freetext")) { + FreeTextData freeTextDataObject = (FreeTextData) field.getData(); + dataOut.setAttribute("label", freeTextDataObject.getLabel()); + } else if (field.getViewStyle().getRenderStyle().equals("textarea")) { + TextAreaData textAreaDataObject = (TextAreaData) field.getData(); + dataOut.setAttribute("label", textAreaDataObject.getLabel()); + } else if (field.getViewStyle().getRenderStyle().equals("datePicker")) { + DatePickerData datePickerDataObject = (DatePickerData) field.getData(); + dataOut.setAttribute("label", datePickerDataObject.getLabel()); + } + elementField.appendChild(dataOut); + } + + elementFields.appendChild(elementField); + }); + return elementFields; + } + +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/ImportXmlBuilderDatasetProfile.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/ImportXmlBuilderDatasetProfile.java new file mode 100644 index 000000000..ffd789d76 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/ImportXmlBuilderDatasetProfile.java @@ -0,0 +1,26 @@ +package eu.eudat.logic.utilities.documents.xml.datasetProfileXml; +import eu.eudat.logic.utilities.documents.xml.datasetProfileXml.datasetProfileModel.DatasetProfile; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Unmarshaller; +import java.io.*; + +public class ImportXmlBuilderDatasetProfile { + + public DatasetProfile build(File xmlFile) throws IOException { + DatasetProfile datasetProfile = new DatasetProfile(); + JAXBContext jaxbContext = null; + try { + jaxbContext = JAXBContext.newInstance(DatasetProfile.class); + Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); + datasetProfile = (DatasetProfile) unmarshaller.unmarshal(xmlFile); + } catch (JAXBException e) { + e.printStackTrace(); + } + + return datasetProfile; + } + + +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/DatasetProfile.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/DatasetProfile.java new file mode 100644 index 000000000..9230cf96a --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/DatasetProfile.java @@ -0,0 +1,39 @@ +package eu.eudat.logic.utilities.documents.xml.datasetProfileXml.datasetProfileModel; + + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.LinkedList; +import java.util.List; + +@XmlRootElement(name = "pages") +public class DatasetProfile { + + private List page; + + @XmlElement(name = "page") + public List getPage() { + return page; + } + + public void setPage(List page) { + this.page = page; + } + + public eu.eudat.models.data.admin.composite.DatasetProfile toAdminCompositeModel(String label){ + eu.eudat.models.data.admin.composite.DatasetProfile newDatasetEntityProfile = new eu.eudat.models.data.admin.composite.DatasetProfile(); + newDatasetEntityProfile.setLabel(label); + newDatasetEntityProfile.setStatus(eu.eudat.data.entities.DatasetProfile.Status.SAVED.getValue()); + + List pagesDatasetEntity = new LinkedList<>(); + List sectionDatasetEntity = new LinkedList<>(); + for (Page xmlPage: page) { + pagesDatasetEntity.add(xmlPage.toAdminCompositeModelPage()); + sectionDatasetEntity.add(xmlPage.toAdminCompositeModelSection()); + } + newDatasetEntityProfile.setPages(pagesDatasetEntity); + newDatasetEntityProfile.setSections(sectionDatasetEntity); + + return newDatasetEntityProfile; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/FieldSet.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/FieldSet.java new file mode 100644 index 000000000..50af153e8 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/FieldSet.java @@ -0,0 +1,127 @@ +package eu.eudat.logic.utilities.documents.xml.datasetProfileXml.datasetProfileModel; + +import eu.eudat.logic.utilities.documents.xml.datasetProfileXml.datasetProfileModel.Fields.Fields; + +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "field-Set") +public class FieldSet { + + private String id; + private int ordinal; + private Fields fields; + private String numbering; + private Boolean commentField; + private Multiplicity multiplicity; + private String description; + private String extendedDescription; + private String additionalInformation; + private String title; + + @XmlAttribute(name = "id") + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + @XmlAttribute(name = "ordinal") + public int getOrdinal() { + return ordinal; + } + + public void setOrdinal(int ordinal) { + this.ordinal = ordinal; + } + + @XmlElement(name = "fields") + public Fields getFields() { + return fields; + } + + public void setFields(Fields fields) { + this.fields = fields; + } + + @XmlElement(name = "numbering") + public String getNumbering() { + return numbering; + } + + public void setNumbering(String numbering) { + this.numbering = numbering; + } + + @XmlElement(name = "CommentField") + public Boolean getCommentField() { + return commentField; + } + + public void setCommentField(Boolean commentField) { + this.commentField = commentField; + } + + @XmlElement(name = "multiplicity") + public Multiplicity getMultiplicity() { + return multiplicity; + } + + public void setMultiplicity(Multiplicity multiplicity) { + this.multiplicity = multiplicity; + } + + @XmlElement(name = "title") + public String getTitle() { + return title; + } + + @XmlElement(name = "description") + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + @XmlElement(name = "extendedDescription") + public String getExtendedDescription() { + return extendedDescription; + } + + public void setExtendedDescription(String extendedDescription) { + this.extendedDescription = extendedDescription; + } + + @XmlElement(name = "additionalInformation") + public String getAdditionalInformation() { + return additionalInformation; + } + + public void setAdditionalInformation(String additionalInformation) { + this.additionalInformation = additionalInformation; + } + + public void setTitle(String title) { + this.title = title; + } + + public eu.eudat.models.data.admin.components.datasetprofile.FieldSet toAdminCompositeModelSection() { + eu.eudat.models.data.admin.components.datasetprofile.FieldSet fieldSet1Entity = new eu.eudat.models.data.admin.components.datasetprofile.FieldSet(); + fieldSet1Entity.setId(this.id); + fieldSet1Entity.setOrdinal(this.ordinal); + fieldSet1Entity.setHasCommentField(this.commentField != null ? this.commentField : false); + fieldSet1Entity.setMultiplicity(this.multiplicity != null ? this.multiplicity.toAdminCompositeModelSection() : null); + fieldSet1Entity.setTitle(this.title); + fieldSet1Entity.setDescription(this.description); + fieldSet1Entity.setExtendedDescription(this.extendedDescription); + fieldSet1Entity.setAdditionalInformation(this.additionalInformation); + + fieldSet1Entity.setFields(this.fields.toAdminCompositeModelSection()); + return fieldSet1Entity; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/FieldSets.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/FieldSets.java new file mode 100644 index 000000000..54b44f448 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/FieldSets.java @@ -0,0 +1,30 @@ +package eu.eudat.logic.utilities.documents.xml.datasetProfileXml.datasetProfileModel; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.LinkedList; +import java.util.List; + +@XmlRootElement(name = "field-Sets") +public class FieldSets { + + List
fieldSet; + + @XmlElement(name = "field-Set") + public List
getFieldSet() { + return fieldSet; + } + + public void setFieldSet(List
fieldSet) { + this.fieldSet = fieldSet; + } + + public List toAdminCompositeModelSection(){ + List fieldSetEntity = new LinkedList<>(); + if(this.fieldSet!=null) + for (FieldSet xmlFieldSet:this.fieldSet){ + fieldSetEntity.add(xmlFieldSet.toAdminCompositeModelSection()); + } + return fieldSetEntity; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Fields/DefaultValue.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Fields/DefaultValue.java new file mode 100644 index 000000000..9d4354fbf --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Fields/DefaultValue.java @@ -0,0 +1,36 @@ +package eu.eudat.logic.utilities.documents.xml.datasetProfileXml.datasetProfileModel.Fields; + +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "defaultValue") +public class DefaultValue { + + private String type; + private String value; + + @XmlAttribute(name = "type") + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + @XmlAttribute(name = "value") + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public eu.eudat.models.data.components.commons.DefaultValue toAdminCompositeModelSection(){ + eu.eudat.models.data.components.commons.DefaultValue defaultValueEntity =new eu.eudat.models.data.components.commons.DefaultValue(); + defaultValueEntity.setValue(value); + defaultValueEntity.setType(type); + return defaultValueEntity; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Fields/Field.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Fields/Field.java new file mode 100644 index 000000000..3e829cb6f --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Fields/Field.java @@ -0,0 +1,123 @@ +package eu.eudat.logic.utilities.documents.xml.datasetProfileXml.datasetProfileModel.Fields; + +import eu.eudat.logic.utilities.builders.ModelBuilder; +import eu.eudat.models.data.components.commons.datafield.FieldData; +import org.w3c.dom.Element; + +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.LinkedList; +import java.util.List; + +@XmlRootElement(name = "field") +public class Field { + + private String id; + + private int ordinal; + + private String numbering; + + private List validations; + + private DefaultValue defaultValue; + + private Visible visible; + + private ViewStyle viewStyle; + + private Object data; + + @XmlAttribute(name = "id") + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + @XmlAttribute(name = "ordinal") + public int getOrdinal() { + return ordinal; + } + + public void setOrdinal(int ordinal) { + this.ordinal = ordinal; + } + + @XmlElement(name = "numbering") + public String getNumbering() { + return numbering; + } + + public void setNumbering(String numbering) { + this.numbering = numbering; + } + + @XmlElement(name = "validations") + public List getValidations() { + return validations; + } + + public void setValidations(List validations) { + this.validations = validations; + } + + @XmlElement(name = "defaultValue") + public DefaultValue getDefaultValue() { + return defaultValue; + } + + public void setDefaultValue(DefaultValue defaultValue) { + this.defaultValue = defaultValue; + } + + @XmlElement(name = "visible") + public Visible getVisible() { + return visible; + } + + public void setVisible(Visible visible) { + this.visible = visible; + } + + @XmlElement(name = "viewStyle") + public ViewStyle getViewStyle() { + return viewStyle; + } + + public void setViewStyle(ViewStyle viewStyle) { + this.viewStyle = viewStyle; + } + + @XmlElement(name = "data") + public Object getData() { + return this.data; + } + + public void setData(Object data) { + this.data = data; + } + + + public eu.eudat.models.data.admin.components.datasetprofile.Field toAdminCompositeModelSection() { + eu.eudat.models.data.admin.components.datasetprofile.Field fieldEntity =new eu.eudat.models.data.admin.components.datasetprofile.Field(); + fieldEntity.setId(this.id); + fieldEntity.setOrdinal(this.ordinal); + List validationList = new LinkedList<>(); + for(validations validation:this.validations){ + if(validation.getValidation()!=null) + validationList.add(validation.toAdminCompositeModelSection()); + } + fieldEntity.setValidations(validationList); + fieldEntity.setDefaultValue(this.defaultValue.toAdminCompositeModelSection()); + fieldEntity.setVisible(this.visible.toAdminCompositeModelSection()); + fieldEntity.setViewStyle(this.viewStyle.toAdminCompositeModelSection()); + FieldData data = new ModelBuilder().toFieldData(null, this.viewStyle.getRenderStyle(), (Element) this.data); +// fieldEntity.setData( data.fromXml((Element) this.data)); + fieldEntity.setData( data.toMap((Element)this.data)); + return fieldEntity; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Fields/Fields.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Fields/Fields.java new file mode 100644 index 000000000..d0fbe4d0c --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Fields/Fields.java @@ -0,0 +1,38 @@ +package eu.eudat.logic.utilities.documents.xml.datasetProfileXml.datasetProfileModel.Fields; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.LinkedList; +import java.util.List; + +@XmlRootElement(name = "fields") +public class Fields { + + private List field; + + @XmlElement(name = "field") + public List getField() { + return field; + } + + public void setField(List field) { + this.field = field; + } + + public List toAdminCompositeModelSection() { + List fieldsEntity = new LinkedList<>(); + if (this.field != null) + for (Field xmlField : this.field) { + fieldsEntity.add(xmlField.toAdminCompositeModelSection()); + } + return fieldsEntity; + } + +} + + + + + + + diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Fields/Rule.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Fields/Rule.java new file mode 100644 index 000000000..e0daeeec2 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Fields/Rule.java @@ -0,0 +1,57 @@ +package eu.eudat.logic.utilities.documents.xml.datasetProfileXml.datasetProfileModel.Fields; + +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "rule") +public class Rule{ + + private String ruleStyle; + private String target; + private String type; + private Value value; + + @XmlAttribute(name = "ruleStyle") + public String getRuleStyle() { + return ruleStyle; + } + + public void setRuleStyle(String ruleStyle) { + this.ruleStyle = ruleStyle; + } + @XmlAttribute(name = "target") + public String getTarget() { + return target; + } + + public void setTarget(String target) { + this.target = target; + } + @XmlAttribute(name = "type") + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + @XmlElement(name = "value") + public Value getValue() { + return value; + } + + public void setValue(Value value) { + this.value = value; + } + + public eu.eudat.models.data.components.commons.Rule toAdminCompositeModelSection(){ + eu.eudat.models.data.components.commons.Rule ruleEntity = new eu.eudat.models.data.components.commons.Rule(); + ruleEntity.setRuleStyle(ruleStyle); + ruleEntity.setTarget(target); + ruleEntity.setRuleType(type); + ruleEntity.setValueType(value.getType()); + ruleEntity.setValue(value.getValue()); + return ruleEntity; + } +} \ No newline at end of file diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Fields/Validation.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Fields/Validation.java new file mode 100644 index 000000000..e999f3aa9 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Fields/Validation.java @@ -0,0 +1,19 @@ +package eu.eudat.logic.utilities.documents.xml.datasetProfileXml.datasetProfileModel.Fields; + +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "validation") +public class Validation { + + private int type; + + @XmlAttribute(name = "type") + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Fields/Value.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Fields/Value.java new file mode 100644 index 000000000..66d5e2686 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Fields/Value.java @@ -0,0 +1,30 @@ +package eu.eudat.logic.utilities.documents.xml.datasetProfileXml.datasetProfileModel.Fields; + +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlValue; + +@XmlRootElement(name = "value") +public class Value { + + private String type; + private String value; + + @XmlAttribute(name = "type") + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + @XmlValue + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} \ No newline at end of file diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Fields/ViewStyle.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Fields/ViewStyle.java new file mode 100644 index 000000000..317ebc65a --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Fields/ViewStyle.java @@ -0,0 +1,36 @@ +package eu.eudat.logic.utilities.documents.xml.datasetProfileXml.datasetProfileModel.Fields; + + +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "viewStyle") +public class ViewStyle { + + private String cssClass; + private String renderStyle; + + @XmlAttribute(name = "cssClass") + public String getCssClass() { + return cssClass; + } + + public void setCssClass(String cssClass) { + this.cssClass = cssClass; + } + @XmlAttribute(name = "renderStyle") + public String getRenderStyle() { + return renderStyle; + } + + public void setRenderStyle(String renderStyle) { + this.renderStyle = renderStyle; + } + + public eu.eudat.models.data.components.commons.ViewStyle toAdminCompositeModelSection(){ + eu.eudat.models.data.components.commons.ViewStyle viewStyleEntity = new eu.eudat.models.data.components.commons.ViewStyle(); + viewStyleEntity.setCssClass(this.cssClass); + viewStyleEntity.setRenderStyle(this.renderStyle); + return viewStyleEntity; + } +} \ No newline at end of file diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Fields/Visible.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Fields/Visible.java new file mode 100644 index 000000000..710e643f1 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Fields/Visible.java @@ -0,0 +1,44 @@ +package eu.eudat.logic.utilities.documents.xml.datasetProfileXml.datasetProfileModel.Fields; + +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.LinkedList; +import java.util.List; + +@XmlRootElement(name = "visible") +public class Visible { + + private String style; + private List rule; + + @XmlAttribute(name = "style") + public String getStyle() { + return style; + } + + public void setStyle(String style) { + this.style = style; + } + @XmlElement(name = "rule") + public List getRule() { + return rule; + } + + public void setRule(List rule) { + this.rule = rule; + } + + public eu.eudat.models.data.components.commons.Visibility toAdminCompositeModelSection(){ + eu.eudat.models.data.components.commons.Visibility visibilityEntity = new eu.eudat.models.data.components.commons.Visibility(); + visibilityEntity.setStyle(this.style); + if(this.rule!=null) { + List ruleListEntity = new LinkedList<>(); + for (Rule xmlRule : this.rule) { + ruleListEntity.add(xmlRule.toAdminCompositeModelSection()); + } + visibilityEntity.setRules(ruleListEntity); + } + return visibilityEntity; + } +} \ No newline at end of file diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Fields/validations.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Fields/validations.java new file mode 100644 index 000000000..e63132622 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Fields/validations.java @@ -0,0 +1,25 @@ +package eu.eudat.logic.utilities.documents.xml.datasetProfileXml.datasetProfileModel.Fields; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "validations") +public class validations { + + Validation validation; + + @XmlElement(name = "validation") + public Validation getValidation() { + return validation; + } + + public void setValidation(Validation validation) { + this.validation = validation; + } + + public int toAdminCompositeModelSection() { + return validation.getType(); + } +} + + diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Multiplicity.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Multiplicity.java new file mode 100644 index 000000000..c0b4a8e9c --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Multiplicity.java @@ -0,0 +1,36 @@ +package eu.eudat.logic.utilities.documents.xml.datasetProfileXml.datasetProfileModel; + +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlRootElement; + + +@XmlRootElement(name = "multiplicity") +public class Multiplicity { + private int max; + private int min; + + @XmlAttribute(name = "max") + public int getMax() { + return max; + } + + public void setMax(int max) { + this.max = max; + } + + @XmlAttribute(name = "min") + public int getMin() { + return min; + } + + public void setMin(int min) { + this.min = min; + } + + public eu.eudat.models.data.components.commons.Multiplicity toAdminCompositeModelSection() { + eu.eudat.models.data.components.commons.Multiplicity multiplicityEntity = new eu.eudat.models.data.components.commons.Multiplicity(); + multiplicityEntity.setMax(max); + multiplicityEntity.setMin(min); + return multiplicityEntity; + } +} \ No newline at end of file diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Page.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Page.java new file mode 100644 index 000000000..b30f82d29 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Page.java @@ -0,0 +1,73 @@ +package eu.eudat.logic.utilities.documents.xml.datasetProfileXml.datasetProfileModel; + +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "page") +public class Page { + private String id; + private int ordinal; + private String title; + private Sections sections; + + @XmlAttribute(name = "id") + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + @XmlAttribute(name = "ordinal") + public int getOrdinal() { + return ordinal; + } + + public void setOrdinal(int ordinal) { + this.ordinal = ordinal; + } + + @XmlAttribute(name = "title") + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + @XmlElement(name = "sections") + public Sections getSections() { + return sections; + } + + public void setSections(Sections sections) { + this.sections = sections; + } + + public eu.eudat.models.data.admin.components.datasetprofile.Page toAdminCompositeModelPage(){ + eu.eudat.models.data.admin.components.datasetprofile.Page pageEntity = new eu.eudat.models.data.admin.components.datasetprofile.Page(); + pageEntity.setId(this.id); + pageEntity.setOrdinal(this.ordinal); + pageEntity.setTitle(this.title); + return pageEntity; + } + + public eu.eudat.models.data.admin.components.datasetprofile.Section toAdminCompositeModelSection(){ + /* eu.eudat.models.data.admin.components.datasetprofile.Section sectionEntity =new eu.eudat.models.data.admin.components.datasetprofile.Section(); +// List sectionsListEntity = new LinkedList<>(); +// for (Section xmlsection:this.sections.section) { +// sectionsListEntity.add(xmlsection.toAdminCompositeModelSection()); +// } + if(this.sections.section!=null) + sectionEntity.setSections(this.sections.toAdminCompositeModelSection()); + if(this.sections.fieldSets.fieldSet!=null) + sectionEntity.setFieldSets(this.sections.toAdminCompositeModelSectionFieldSets()); + sectionEntity.setId(this.id); + sectionEntity.setOrdinal(this.ordinal); + sectionEntity.setTitle(this.title);*/ + return sections.toAdminCompositeModelSection(); + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Section.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Section.java new file mode 100644 index 000000000..3d3457fb4 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Section.java @@ -0,0 +1,116 @@ +package eu.eudat.logic.utilities.documents.xml.datasetProfileXml.datasetProfileModel; + +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "section") +public class Section { + private String id; + private int ordinal; + private String page; + private Boolean defaultVisibility; + private FieldSets fieldSets; + private String numbering; + private String description; + private String extendedDescription; + private String title; + + @XmlAttribute(name = "id") + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + @XmlAttribute(name = "ordinal") + public int getOrdinal() { + return ordinal; + } + + public void setOrdinal(int ordinal) { + this.ordinal = ordinal; + } + + @XmlAttribute(name = "page") + public String getPage() { + return page; + } + + public void setPage(String page) { + this.page = page; + } + + @XmlAttribute(name = "defaultVisibility") + public Boolean getDefaultVisibility() { + return defaultVisibility; + } + + public void setDefaultVisibility(Boolean defaultVisibility) { + this.defaultVisibility = defaultVisibility; + } + + @XmlElement(name = "field-Sets") + public FieldSets getFieldSets() { + return fieldSets; + } + + public void setFieldSets(FieldSets fieldSets) { + this.fieldSets = fieldSets; + } + + @XmlElement(name = "numbering") + public String getNumbering() { + return numbering; + } + + public void setNumbering(String numbering) { + this.numbering = numbering; + } + + @XmlElement(name = "description") + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + @XmlElement(name = "extendedDescription") + public String getExtendedDescription() { + return extendedDescription; + } + + public void setExtendedDescription(String extendedDescription) { + this.extendedDescription = extendedDescription; + } + + @XmlElement(name = "title") + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public eu.eudat.models.data.admin.components.datasetprofile.Section toAdminCompositeModelSection() { + eu.eudat.models.data.admin.components.datasetprofile.Section sectionEntity = new eu.eudat.models.data.admin.components.datasetprofile.Section(); + sectionEntity.setId(this.id); + sectionEntity.setOrdinal(this.ordinal); + sectionEntity.setTitle(this.title); + sectionEntity.setPage(this.page); + sectionEntity.setDescription(this.description); +// List fieldSetsEntity =new LinkedList<>(); +// +// for (FieldSets xmpFieldSets: this.fieldSets) { +// fieldSetsEntity.add(xmpFieldSets.toAdminCompositeModelSection()); +// } + sectionEntity.setFieldSets(this.fieldSets.toAdminCompositeModelSection()); + sectionEntity.setDefaultVisibility(this.defaultVisibility); + return sectionEntity; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Sections.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Sections.java new file mode 100644 index 000000000..c3157c613 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/datasetProfileXml/datasetProfileModel/Sections.java @@ -0,0 +1,131 @@ +package eu.eudat.logic.utilities.documents.xml.datasetProfileXml.datasetProfileModel; + + +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.LinkedList; +import java.util.List; + +@XmlRootElement(name = "sections") +public class Sections { + private String id; + private int ordinal; + private String page; + private Boolean defaultVisibility; + private String numbering; + private String description; + private String title; + private List
section; + private FieldSets fieldSets; + + @XmlAttribute(name = "id") + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + @XmlAttribute(name = "ordinal") + public int getOrdinal() { + return ordinal; + } + + public void setOrdinal(int ordinal) { + this.ordinal = ordinal; + } + + @XmlAttribute(name = "page") + public String getPage() { + return page; + } + + public void setPage(String page) { + this.page = page; + } + + @XmlAttribute(name = "defaultVisibility") + public Boolean getDefaultVisibility() { + return defaultVisibility; + } + + public void setDefaultVisibility(Boolean defaultVisibility) { + this.defaultVisibility = defaultVisibility; + } + + @XmlElement(name = "numbering") + public String getNumbering() { + return numbering; + } + + public void setNumbering(String numbering) { + this.numbering = numbering; + } + + @XmlElement(name = "description") + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + @XmlElement(name = "title") + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + @XmlElement(name = "section") + public List
getSection() { + return section; + } + + public void setSection(List
section) { + this.section = section; + } + + @XmlElement(name = "field-Sets") + public FieldSets getFieldSets() { + return fieldSets; + } + + public void setFieldSets(FieldSets fieldSets) { + this.fieldSets = fieldSets; + } + + public eu.eudat.models.data.admin.components.datasetprofile.Section toAdminCompositeModelSection() { + eu.eudat.models.data.admin.components.datasetprofile.Section sectionEntity = new eu.eudat.models.data.admin.components.datasetprofile.Section(); + List sectionsListEntity = new LinkedList<>(); + + if (this.section != null) { + for (Section xmlsection : this.section) { + sectionsListEntity.add(xmlsection.toAdminCompositeModelSection()); + } + } /*else { + sectionsListEntity.add(new eu.eudat.models.data.admin.components.datasetprofile.Section()); + }*/ + sectionEntity.setId(this.id); + sectionEntity.setOrdinal(this.ordinal); + sectionEntity.setTitle(this.title); + sectionEntity.setDefaultVisibility(this.defaultVisibility); + sectionEntity.setDescription(description); + sectionEntity.setPage(this.page); + sectionEntity.setFieldSets(toAdminCompositeModelSectionFieldSets()); + + + sectionEntity.setSections(sectionsListEntity); + return sectionEntity; + } + + public List toAdminCompositeModelSectionFieldSets() { + return fieldSets.toAdminCompositeModelSection(); + } +} + diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/dmpXml/ExportXmlBuilderDmpProfile.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/dmpXml/ExportXmlBuilderDmpProfile.java new file mode 100644 index 000000000..344d4924a --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/dmpXml/ExportXmlBuilderDmpProfile.java @@ -0,0 +1,55 @@ +package eu.eudat.logic.utilities.documents.xml.dmpXml; + +import eu.eudat.logic.utilities.builders.XmlBuilder; + +import eu.eudat.models.data.entities.xmlmodels.dmpprofiledefinition.DataManagementPlanProfile; +import eu.eudat.models.data.listingmodels.DataManagementPlanProfileListingModel; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.UUID; + +public class ExportXmlBuilderDmpProfile { + + + public File build(DataManagementPlanProfileListingModel dmpProfile) throws IOException { + + File xmlFile = new File(UUID.randomUUID() + ".xml"); + BufferedWriter writer = new BufferedWriter(new FileWriter(xmlFile, true)); + Document xmlDoc = XmlBuilder.getDocument(); + Element root = xmlDoc.createElement("root"); + Element definition = xmlDoc.createElement("definition"); +// Element root = xmlDoc.createElement(dmpProfile.getLabel()); + definition.appendChild(createDefinition(dmpProfile.getDefinition(), xmlDoc)); + root.appendChild(definition); + xmlDoc.appendChild(root); + String xml = XmlBuilder.generateXml(xmlDoc); + writer.write(xml); + writer.close(); + return xmlFile; + } + + public Element createDefinition(DataManagementPlanProfile dmpDefinition, Document element) { + Element fields = element.createElement("fieldSets"); + dmpDefinition.getFields().forEach(item -> { + Element field = element.createElement("field"); + field.setAttribute("id", "" + item.getId()); + field.setAttribute("type", "" + item.getType()); + field.setAttribute("dataType", "" + item.getDataType()); + field.setAttribute("required", "" + item.getRequired()); + field.setAttribute("label", "" + item.getLabel()); + if(item.getValue()!=null) { + Element value = element.createElement("value"); + value.setAttribute("value", ""+item.getValue()); + field.appendChild(value); + } + fields.appendChild(field); + }); + return fields; + } + +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/dmpXml/ImportXmlBuilderDmpProfile.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/dmpXml/ImportXmlBuilderDmpProfile.java new file mode 100644 index 000000000..717b6ac2b --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/dmpXml/ImportXmlBuilderDmpProfile.java @@ -0,0 +1,27 @@ +package eu.eudat.logic.utilities.documents.xml.dmpXml; + +import eu.eudat.logic.utilities.documents.xml.dmpXml.dmpProfileModel.DmpProfile; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Unmarshaller; +import java.io.File; +import java.io.IOException; + +public class ImportXmlBuilderDmpProfile { + + public DmpProfile build(File xmlFile) throws IOException { + DmpProfile dmpProfile = new DmpProfile(); + JAXBContext jaxbContext = null; + try { + jaxbContext = JAXBContext.newInstance(DmpProfile.class); + Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); + dmpProfile = (DmpProfile) unmarshaller.unmarshal(xmlFile); + } catch (JAXBException e) { + e.printStackTrace(); + } + + return dmpProfile; + } + +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/dmpXml/dmpProfileModel/DMPProfileFieldDataType.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/dmpXml/dmpProfileModel/DMPProfileFieldDataType.java new file mode 100644 index 000000000..e5d685162 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/dmpXml/dmpProfileModel/DMPProfileFieldDataType.java @@ -0,0 +1,23 @@ +package eu.eudat.logic.utilities.documents.xml.dmpXml.dmpProfileModel; + +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "datatype") +public class DMPProfileFieldDataType { + + private int datatype; + + @XmlAttribute(name = "datatype") + public int getDatatype() { + return datatype; + } + + public void setDatatype(int datatype) { + this.datatype = datatype; + } + + public eu.eudat.models.data.entities.xmlmodels.dmpprofiledefinition.types.DMPProfileFieldDataType toDmpProfileCompositeModel() { + return eu.eudat.models.data.entities.xmlmodels.dmpprofiledefinition.types.DMPProfileFieldDataType.fromInteger(datatype); + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/dmpXml/dmpProfileModel/DMPProfileType.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/dmpXml/dmpProfileModel/DMPProfileType.java new file mode 100644 index 000000000..a13117dce --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/dmpXml/dmpProfileModel/DMPProfileType.java @@ -0,0 +1,26 @@ +package eu.eudat.logic.utilities.documents.xml.dmpXml.dmpProfileModel; + + +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "type") +public class DMPProfileType { + + private int type; + + @XmlAttribute(name = "type") + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public eu.eudat.models.data.entities.xmlmodels.dmpprofiledefinition.types.DMPProfileType toDmpProfileCompositeModel() { + return eu.eudat.models.data.entities.xmlmodels.dmpprofiledefinition.types.DMPProfileType.fromInteger(type); + } + + +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/dmpXml/dmpProfileModel/DmpProfile.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/dmpXml/dmpProfileModel/DmpProfile.java new file mode 100644 index 000000000..3e9138a46 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/dmpXml/dmpProfileModel/DmpProfile.java @@ -0,0 +1,33 @@ +package eu.eudat.logic.utilities.documents.xml.dmpXml.dmpProfileModel; + +import eu.eudat.data.entities.DMPProfile; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.Date; +import java.util.UUID; + +@XmlRootElement(name = "root") +public class DmpProfile { + + private DmpProfileDefinition dmpProfileDefinition; + + @XmlElement(name = "definition") + public DmpProfileDefinition getDmpProfileDefinition() { + return dmpProfileDefinition; + } + + public void setDmpProfileDefinition(DmpProfileDefinition dmpProfileDefinition) { + this.dmpProfileDefinition = dmpProfileDefinition; + } + + public eu.eudat.models.data.listingmodels.DataManagementPlanProfileListingModel toDmpProfileCompositeModel(String label) { + eu.eudat.models.data.listingmodels.DataManagementPlanProfileListingModel dmpProfileModel = new eu.eudat.models.data.listingmodels.DataManagementPlanProfileListingModel(); + dmpProfileModel.setLabel(label); + dmpProfileModel.setStatus(DMPProfile.Status.SAVED.getValue()); + dmpProfileModel.setCreated(new Date()); + dmpProfileModel.setModified(new Date()); + dmpProfileModel.setDefinition(this.dmpProfileDefinition.toDmpProfileCompositeModel()); + return dmpProfileModel; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/dmpXml/dmpProfileModel/DmpProfileDefinition.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/dmpXml/dmpProfileModel/DmpProfileDefinition.java new file mode 100644 index 000000000..4cc4977e4 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/dmpXml/dmpProfileModel/DmpProfileDefinition.java @@ -0,0 +1,36 @@ +package eu.eudat.logic.utilities.documents.xml.dmpXml.dmpProfileModel; + + +import eu.eudat.logic.utilities.documents.xml.dmpXml.dmpProfileModel.FieldSets; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.LinkedList; +import java.util.List; + +@XmlRootElement(name = "definition") +public class DmpProfileDefinition { + + private FieldSets fieldSets; + + @XmlElement(name = "fieldSets") + public FieldSets getFieldSets() { + return fieldSets; + } + + public void setFieldSets(FieldSets fieldSets) { + this.fieldSets = fieldSets; + } + + public eu.eudat.models.data.entities.xmlmodels.dmpprofiledefinition.DataManagementPlanProfile toDmpProfileCompositeModel() { + eu.eudat.models.data.entities.xmlmodels.dmpprofiledefinition.DataManagementPlanProfile dmpProfileDefinitionModel = new eu.eudat.models.data.entities.xmlmodels.dmpprofiledefinition.DataManagementPlanProfile(); + List dmpProfileDefinitionFields = new LinkedList<>(); + for (Field field:this.fieldSets.fields) { + dmpProfileDefinitionFields.add(field.toDmpProfileCompositeModel()); + } + dmpProfileDefinitionModel.setFields(dmpProfileDefinitionFields); + return dmpProfileDefinitionModel; + } + + +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/dmpXml/dmpProfileModel/Field.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/dmpXml/dmpProfileModel/Field.java new file mode 100644 index 000000000..28ca0a0f6 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/dmpXml/dmpProfileModel/Field.java @@ -0,0 +1,90 @@ +package eu.eudat.logic.utilities.documents.xml.dmpXml.dmpProfileModel; + + + +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlValue; +import java.util.UUID; + +@XmlRootElement(name = "field") +public class Field { + + private String id; + + private String label; + + private int dataType; + + private boolean required; + + private int type; + +// private Object value; + + @XmlAttribute(name = "id") + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + @XmlAttribute(name = "label") + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + @XmlAttribute(name = "dataType") + public int getDataType() { + return dataType; + } + + public void setDataType(int dataType) { + this.dataType = dataType; + } + + @XmlAttribute(name = "required") + public boolean isRequired() { + return required; + } + + public void setRequired(boolean required) { + this.required = required; + } + + @XmlAttribute(name = "type") + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + +// @XmlValue +// public Object getValue() { +// return value; +// } +// +// public void setValue(Object value) { +// this.value = value; +// } + + public eu.eudat.models.data.entities.xmlmodels.dmpprofiledefinition.Field toDmpProfileCompositeModel() { + eu.eudat.models.data.entities.xmlmodels.dmpprofiledefinition.Field field = new eu.eudat.models.data.entities.xmlmodels.dmpprofiledefinition.Field(); + field.setId(UUID.fromString(this.id)); + field.setDataType(eu.eudat.models.data.entities.xmlmodels.dmpprofiledefinition.types.DMPProfileFieldDataType.fromInteger(this.dataType)); + field.setLabel(this.label); + field.setRequired(this.required); + field.setType(eu.eudat.models.data.entities.xmlmodels.dmpprofiledefinition.types.DMPProfileType.fromInteger(this.type)); + // field.setValue(this.value); + return field; + } + +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/dmpXml/dmpProfileModel/FieldSets.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/dmpXml/dmpProfileModel/FieldSets.java new file mode 100644 index 000000000..b8f56fd70 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/xml/dmpXml/dmpProfileModel/FieldSets.java @@ -0,0 +1,22 @@ +package eu.eudat.logic.utilities.documents.xml.dmpXml.dmpProfileModel; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.LinkedList; +import java.util.List; + +@XmlRootElement(name = "fieldSets") +public class FieldSets { + + List fields; + + @XmlElement(name = "field") + public List getField() { + return fields; + } + + public void setField(List fields) { + this.fields = fields; + } + +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/ContactEmail/ContactEmailModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/ContactEmail/ContactEmailModel.java new file mode 100644 index 000000000..92ce9e681 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/ContactEmail/ContactEmailModel.java @@ -0,0 +1,21 @@ +package eu.eudat.models.data.ContactEmail; + +public class ContactEmailModel { + + private String subject; + private String description; + + public String getSubject() { + return subject; + } + public void setSubject(String subject) { + this.subject = subject; + } + + public String getDescription() { + return description; + } + public void setDescription(String description) { + this.description = description; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/admin/components/datasetprofile/Field.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/admin/components/datasetprofile/Field.java index fb7819e83..5e96bf6f6 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/admin/components/datasetprofile/Field.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/admin/components/datasetprofile/Field.java @@ -31,7 +31,8 @@ public class Field implements ViewStyleDefinition { @@ -14,6 +15,7 @@ public class FieldSet implements Comparable, ViewStyleDefinition fields; @@ -33,7 +35,7 @@ public class FieldSet implements Comparable, ViewStyleDefinition viewStylefields = new ModelBuilder().toViewStyleDefinition(this.fields, eu.eudat.models.data.entities.xmlmodels.datasetprofiledefinition.Field.class); item.setFields(viewStylefields); item.setId(this.id); item.setDescription(this.description); item.setTitle(this.title); item.setExtendedDescription(this.extendedDescription); + item.setAdditionalInformation(this.additionalInformation); item.setOrdinal(this.ordinal); item.setMultiplicity(this.multiplicity); item.setHasCommentField(this.hasCommentField); @@ -108,6 +118,7 @@ public class FieldSet implements Comparable, ViewStyleDefinition fieldToShort = this.fields; + Collections.sort(fieldToShort); + shortenFieldSet.setFields(fieldToShort); + return shortenFieldSet; + } + } diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/admin/components/datasetprofile/Section.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/admin/components/datasetprofile/Section.java index 75277b5a8..c3784a0fd 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/admin/components/datasetprofile/Section.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/admin/components/datasetprofile/Section.java @@ -4,6 +4,7 @@ import eu.eudat.logic.utilities.interfaces.ViewStyleDefinition; import eu.eudat.logic.utilities.builders.ModelBuilder; import org.apache.commons.lang3.RandomStringUtils; +import java.util.Collections; import java.util.List; public class Section implements Comparable, ViewStyleDefinition { @@ -114,5 +115,26 @@ public class Section implements Comparable, ViewStyleDefinition toShortsections = this.sections; + List
toShortFieldSets = this.fieldSets; + Collections.sort(toShortsections); + Collections.sort(toShortFieldSets); + for (Section shortsections : toShortsections ) { shortsections.toShort(); } + for (FieldSet shortFieldSets : toShortFieldSets ) { shortFieldSets.toShort(); } + + shortenSection.setSections(toShortsections); + shortenSection.setFieldSets(toShortFieldSets); + + shortenSection.setDefaultVisibility(this.defaultVisibility); + shortenSection.setPage(this.page); + shortenSection.setOrdinal(this.ordinal); + shortenSection.setId(this.id); + shortenSection.setTitle(this.title); + shortenSection.setDescription(this.description); + return shortenSection; + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/admin/composite/DatasetProfile.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/admin/composite/DatasetProfile.java index 8eb7b08e9..8adde4152 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/admin/composite/DatasetProfile.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/admin/composite/DatasetProfile.java @@ -4,39 +4,73 @@ import eu.eudat.models.data.admin.components.datasetprofile.Page; import eu.eudat.models.data.admin.components.datasetprofile.Section; import eu.eudat.logic.utilities.builders.ModelBuilder; +import java.util.Collections; +import java.util.LinkedList; import java.util.List; public class DatasetProfile { private String label; - private List
sections; + private String description; private List pages; + private List
sections; + private Short status; + private Short version; - public List
getSections() { - return sections; - } - - public void setSections(List
sections) { - this.sections = sections; - } public String getLabel() { return label; } - public void setLabel(String label) { this.label = label; } + public String getDescription() { + return description; + } + public void setDescription(String description) { + this.description = description; + } + public List getPages() { return pages; } - public void setPages(List pages) { this.pages = pages; } + public List
getSections() { + return sections; + } + public void setSections(List
sections) { this.sections = sections; } + + public Short getStatus() { + return status; + } + public void setStatus(Short status) { + this.status = status; + } + + public Short getVersion() { return version; } + public void setVersion(Short version) { this.version = version; } + public void buildProfile(eu.eudat.models.data.entities.xmlmodels.datasetprofiledefinition.ViewStyleModel viewStyle) { this.sections = new ModelBuilder().fromViewStyleDefinition(viewStyle.getSections(), Section.class); this.pages = new ModelBuilder().fromViewStyleDefinition(viewStyle.getPages(), Page.class); } + + public DatasetProfile toShort() { + DatasetProfile shortProfile = new DatasetProfile(); + shortProfile.setLabel(this.label); + shortProfile.setDescription(this.description); + List
shortSection = new LinkedList<>(); + for (Section toshortSection : this.getSections()) { + shortSection.add(toshortSection.toShort()); + } + Collections.sort(shortSection); + shortProfile.setSections(shortSection); + shortProfile.setPages(this.pages); + shortProfile.setStatus(this.status); + shortProfile.setVersion(this.version); + return shortProfile; + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/AutoCompleteData.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/AutoCompleteData.java index eb212a394..f5b141662 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/AutoCompleteData.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/AutoCompleteData.java @@ -3,18 +3,18 @@ package eu.eudat.models.data.components.commons.datafield; import org.w3c.dom.Document; import org.w3c.dom.Element; +import java.util.HashMap; import java.util.Map; public class AutoCompleteData extends ComboBoxData { private String url; private Option autoCompleteOptions; private String optionsRoot; - + private Boolean multiAutoComplete; public String getOptionsRoot() { return optionsRoot; } - public void setOptionsRoot(String optionsRoot) { this.optionsRoot = optionsRoot; } @@ -22,7 +22,6 @@ public class AutoCompleteData extends ComboBoxData { public String getUrl() { return url; } - public void setUrl(String url) { this.url = url; } @@ -30,20 +29,24 @@ public class AutoCompleteData extends ComboBoxData { public Option getAutoCompleteOptions() { return autoCompleteOptions; } - public void setAutoCompleteOptions(Option autoCompleteOptions) { this.autoCompleteOptions = autoCompleteOptions; } + public Boolean getMultiAutoComplete() { return multiAutoComplete; } + public void setMultiAutoComplete(Boolean multiAutoComplete) { this.multiAutoComplete = multiAutoComplete; } + @Override public Element toXml(Document doc) { Element root = super.toXml(doc); root.setAttribute("url", this.url); root.setAttribute("optionsRoot", this.optionsRoot); + root.setAttribute("multiAutoComplete", this.multiAutoComplete.toString()); Element element = doc.createElement("option"); element.setAttribute("label", this.autoCompleteOptions.getLabel()); element.setAttribute("value", autoCompleteOptions.getValue()); + element.setAttribute("source", autoCompleteOptions.getSource()); root.appendChild(element); return root; } @@ -53,11 +56,13 @@ public class AutoCompleteData extends ComboBoxData { super.fromXml(item); this.url = item.getAttribute("url"); this.optionsRoot = item.getAttribute("optionsRoot"); + this.multiAutoComplete = Boolean.parseBoolean(item.getAttribute("multiAutoComplete")); Element optionElement = (Element) item.getElementsByTagName("option").item(0); if (optionElement != null) { this.autoCompleteOptions = new Option(); this.autoCompleteOptions.setLabel(optionElement.getAttribute("label")); this.autoCompleteOptions.setValue(optionElement.getAttribute("value")); + this.autoCompleteOptions.setSource(optionElement.getAttribute("source")); } return this; } @@ -69,10 +74,12 @@ public class AutoCompleteData extends ComboBoxData { if (data != null) { this.url = (String) ((Map) data).get("url"); this.optionsRoot = (String) ((Map) data).get("optionsRoot"); + this.multiAutoComplete = (Boolean) ((Map) data).get("multiAutoComplete"); Map options = ((Map>) data).get("autoCompleteOptions"); if (options != null) { this.autoCompleteOptions.setLabel(options.get("label")); this.autoCompleteOptions.setValue(options.get("value")); + this.autoCompleteOptions.setSource(options.get("source")); } } @@ -85,5 +92,28 @@ public class AutoCompleteData extends ComboBoxData { return null; } + @Override + public Map toMap(Element item) { + HashMap dataMap = new HashMap(); + dataMap.put("label", item != null ? item.getAttribute("label") : ""); + dataMap.put("url", item != null ? item.getAttribute("url") : ""); + dataMap.put("type", item != null ? item.getAttribute("type") : "autocomplete"); + dataMap.put("optionsRoot", item != null ? item.getAttribute("optionsRoot") : ""); + Element optionElement = (Element) item.getElementsByTagName("option").item(0); +// if (optionElement != null) { +// this.autoCompleteOptions = new Option(); +// this.autoCompleteOptions.setLabel(optionElement.getAttribute("label")); +// this.autoCompleteOptions.setValue(optionElement.getAttribute("value")); +// } + dataMap.put("autoCompleteOptions", item != null ? optionToMap(optionElement) : null); + return dataMap; + } + private Map optionToMap(Element item){ + HashMap dataMap = new HashMap(); + dataMap.put("label", item != null ? item.getAttribute("label") : ""); + dataMap.put("value", item != null ? item.getAttribute("value") : ""); + dataMap.put("source", item != null ? item.getAttribute("source") : ""); + return dataMap; + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/BooleanDecisionData.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/BooleanDecisionData.java index 2813de1b7..1f0f24cf5 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/BooleanDecisionData.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/BooleanDecisionData.java @@ -3,6 +3,7 @@ package eu.eudat.models.data.components.commons.datafield; import org.w3c.dom.Document; import org.w3c.dom.Element; +import java.util.HashMap; import java.util.Map; public class BooleanDecisionData extends FieldData { @@ -33,4 +34,11 @@ public class BooleanDecisionData extends FieldData { return this; } + @Override + public Map toMap(Element item) { + HashMap dataMap = new HashMap(); + dataMap.put("label", item != null ? item.getAttribute("label") : ""); + return dataMap; + } + } diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/CheckBoxData.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/CheckBoxData.java index 5a854b1fa..ca00ecf5b 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/CheckBoxData.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/CheckBoxData.java @@ -3,6 +3,7 @@ package eu.eudat.models.data.components.commons.datafield; import org.w3c.dom.Document; import org.w3c.dom.Element; +import java.util.HashMap; import java.util.Map; public class CheckBoxData extends FieldData { @@ -34,4 +35,10 @@ public class CheckBoxData extends FieldData { return null; } + @Override + public Map toMap(Element item) { + HashMap dataMap = new HashMap(); + dataMap.put("label", item != null ? item.getAttribute("label") : ""); + return dataMap; + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/ComboBoxData.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/ComboBoxData.java index 94929725e..db67ea301 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/ComboBoxData.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/components/commons/datafield/ComboBoxData.java @@ -4,17 +4,18 @@ import eu.eudat.logic.utilities.interfaces.XmlSerializable; import org.w3c.dom.Document; import org.w3c.dom.Element; +import java.util.HashMap; import java.util.Map; public abstract class ComboBoxData extends FieldData { public class Option implements XmlSerializable