From 39f124cd63528bcd091640b3bfde0d9396a84686 Mon Sep 17 00:00:00 2001 From: Ioannis Kalyvas Date: Tue, 20 Feb 2018 09:50:17 +0200 Subject: [PATCH 1/3] no message --- .../src/main/java/eu/eudat/dao/DatabaseAccess.java | 2 +- .../main/java/eu/eudat/dao/DatabaseAccessLayer.java | 2 +- .../dao/databaselayer/context/DatabaseContext.java | 6 +++--- .../dao/databaselayer/service/DatabaseService.java | 2 +- .../src/main/java/eu/eudat/dao/entities/DMPDao.java | 1 - .../main/java/eu/eudat/dao/entities/DMPDaoImpl.java | 4 ---- .../main/java/eu/eudat/dao/entities/DatasetDao.java | 1 - .../java/eu/eudat/dao/entities/DatasetDaoImpl.java | 5 ----- .../main/java/eu/eudat/dao/entities/ProjectDao.java | 1 - .../java/eu/eudat/dao/entities/ProjectDaoImpl.java | 5 ----- .../src/main/java/eu/eudat/entities/Credential.java | 6 +++--- .../src/main/java/eu/eudat/entities/DMP.java | 6 +++--- .../java/eu/eudat/entities/DMPOrganisation.java | 2 +- .../src/main/java/eu/eudat/entities/DataEntity.java | 4 ++-- .../main/java/eu/eudat/entities/DataRepository.java | 6 +++--- .../src/main/java/eu/eudat/entities/Dataset.java | 6 +++--- .../main/java/eu/eudat/entities/DatasetProfile.java | 6 +++--- .../eu/eudat/entities/DatasetProfileRuleset.java | 2 +- .../java/eu/eudat/entities/DatasetRegistry.java | 2 +- .../main/java/eu/eudat/entities/DatasetService.java | 2 +- .../java/eu/eudat/entities/ExternalDataset.java | 6 +++--- .../src/main/java/eu/eudat/entities/Invitation.java | 6 +++--- .../main/java/eu/eudat/entities/Organisation.java | 6 +++--- .../src/main/java/eu/eudat/entities/Project.java | 6 +++--- .../src/main/java/eu/eudat/entities/Registry.java | 6 +++--- .../src/main/java/eu/eudat/entities/Researcher.java | 6 +++--- .../src/main/java/eu/eudat/entities/Service.java | 6 +++--- .../src/main/java/eu/eudat/entities/UserDMP.java | 6 +++--- .../src/main/java/eu/eudat/entities/UserInfo.java | 6 +++--- .../src/main/java/eu/eudat/entities/UserRole.java | 6 +++--- .../src/main/java/eu/eudat/entities/UserToken.java | 6 +++--- .../java/eu/eudat/managers/DashBoardManager.java | 6 +++--- .../java/eu/eudat/managers/PaginationManager.java | 8 ++++---- .../main/java/eu/eudat/queryable/QueryableList.java | 2 +- .../QueryableHibernateList.java | 13 ++++++------- 35 files changed, 74 insertions(+), 92 deletions(-) diff --git a/dmp-backend/src/main/java/eu/eudat/dao/DatabaseAccess.java b/dmp-backend/src/main/java/eu/eudat/dao/DatabaseAccess.java index e5f7aaa32..94d45316c 100644 --- a/dmp-backend/src/main/java/eu/eudat/dao/DatabaseAccess.java +++ b/dmp-backend/src/main/java/eu/eudat/dao/DatabaseAccess.java @@ -4,7 +4,7 @@ import eu.eudat.dao.databaselayer.service.DatabaseService; import eu.eudat.entities.DataEntity; -public class DatabaseAccess> { +public class DatabaseAccess { private DatabaseService databaseService; public DatabaseService getDatabaseService() { diff --git a/dmp-backend/src/main/java/eu/eudat/dao/DatabaseAccessLayer.java b/dmp-backend/src/main/java/eu/eudat/dao/DatabaseAccessLayer.java index 44f179f0e..f094ea6dc 100644 --- a/dmp-backend/src/main/java/eu/eudat/dao/DatabaseAccessLayer.java +++ b/dmp-backend/src/main/java/eu/eudat/dao/DatabaseAccessLayer.java @@ -4,7 +4,7 @@ package eu.eudat.dao; import eu.eudat.entities.DataEntity; import eu.eudat.queryable.QueryableList; -public interface DatabaseAccessLayer, I> { +public interface DatabaseAccessLayer { T createOrUpdate(T item); T find(I id); diff --git a/dmp-backend/src/main/java/eu/eudat/dao/databaselayer/context/DatabaseContext.java b/dmp-backend/src/main/java/eu/eudat/dao/databaselayer/context/DatabaseContext.java index a72ed4c77..6d1d4c820 100644 --- a/dmp-backend/src/main/java/eu/eudat/dao/databaselayer/context/DatabaseContext.java +++ b/dmp-backend/src/main/java/eu/eudat/dao/databaselayer/context/DatabaseContext.java @@ -13,7 +13,7 @@ import javax.persistence.PersistenceContext; @Repository("databaseCtx") -public class DatabaseContext> { +public class DatabaseContext { @PersistenceContext private EntityManager entityManager; @@ -30,8 +30,8 @@ public class DatabaseContext> { @Transactional public T createOrUpdate(T item, Class type) { EntityManager entityManager = this.entityManager; - if (item.getKeys()[0] != null) { - T oldItem = entityManager.find(type, item.getKeys()[0]); + if (item.getKeys() != null) { + T oldItem = entityManager.find(type, item.getKeys()); if (oldItem != null) { oldItem.update(item); entityManager.merge(oldItem); diff --git a/dmp-backend/src/main/java/eu/eudat/dao/databaselayer/service/DatabaseService.java b/dmp-backend/src/main/java/eu/eudat/dao/databaselayer/service/DatabaseService.java index b452284c8..ac997dfaf 100644 --- a/dmp-backend/src/main/java/eu/eudat/dao/databaselayer/service/DatabaseService.java +++ b/dmp-backend/src/main/java/eu/eudat/dao/databaselayer/service/DatabaseService.java @@ -11,7 +11,7 @@ import java.util.Set; @Service("databaseService") -public class DatabaseService> { +public class DatabaseService { private DatabaseContext databaseCtx; diff --git a/dmp-backend/src/main/java/eu/eudat/dao/entities/DMPDao.java b/dmp-backend/src/main/java/eu/eudat/dao/entities/DMPDao.java index a8077a286..cfb6c1025 100644 --- a/dmp-backend/src/main/java/eu/eudat/dao/entities/DMPDao.java +++ b/dmp-backend/src/main/java/eu/eudat/dao/entities/DMPDao.java @@ -17,5 +17,4 @@ public interface DMPDao extends DatabaseAccessLayer { QueryableList getAuthenticated(QueryableList query, UserInfo principal); - Long count(); } \ No newline at end of file diff --git a/dmp-backend/src/main/java/eu/eudat/dao/entities/DMPDaoImpl.java b/dmp-backend/src/main/java/eu/eudat/dao/entities/DMPDaoImpl.java index 959ed94ba..8f208abf1 100644 --- a/dmp-backend/src/main/java/eu/eudat/dao/entities/DMPDaoImpl.java +++ b/dmp-backend/src/main/java/eu/eudat/dao/entities/DMPDaoImpl.java @@ -77,8 +77,4 @@ public class DMPDaoImpl extends DatabaseAccess implements DMPDao { return this.getDatabaseService().getQueryable(DMP.class); } - @Override - public Long count() { - return this.getDatabaseService().count(DMP.class); - } } diff --git a/dmp-backend/src/main/java/eu/eudat/dao/entities/DatasetDao.java b/dmp-backend/src/main/java/eu/eudat/dao/entities/DatasetDao.java index f6ff6cb24..5cb766447 100644 --- a/dmp-backend/src/main/java/eu/eudat/dao/entities/DatasetDao.java +++ b/dmp-backend/src/main/java/eu/eudat/dao/entities/DatasetDao.java @@ -19,5 +19,4 @@ public interface DatasetDao extends DatabaseAccessLayer { Dataset find(UUID id, String hint); - Long count(); } \ No newline at end of file diff --git a/dmp-backend/src/main/java/eu/eudat/dao/entities/DatasetDaoImpl.java b/dmp-backend/src/main/java/eu/eudat/dao/entities/DatasetDaoImpl.java index ca1c87710..a15177d98 100644 --- a/dmp-backend/src/main/java/eu/eudat/dao/entities/DatasetDaoImpl.java +++ b/dmp-backend/src/main/java/eu/eudat/dao/entities/DatasetDaoImpl.java @@ -61,11 +61,6 @@ public class DatasetDaoImpl extends DatabaseAccess implements DatasetDa return query; } - @Override - public Long count() { - return this.getDatabaseService().count(Dataset.class); - } - @Override public void delete(Dataset item) { this.getDatabaseService().delete(item); diff --git a/dmp-backend/src/main/java/eu/eudat/dao/entities/ProjectDao.java b/dmp-backend/src/main/java/eu/eudat/dao/entities/ProjectDao.java index 6683ce2f0..0a2f9b6ac 100644 --- a/dmp-backend/src/main/java/eu/eudat/dao/entities/ProjectDao.java +++ b/dmp-backend/src/main/java/eu/eudat/dao/entities/ProjectDao.java @@ -14,5 +14,4 @@ public interface ProjectDao extends DatabaseAccessLayer { QueryableList getAuthenticated(QueryableList query, UserInfo principal); - Long count(); } \ No newline at end of file diff --git a/dmp-backend/src/main/java/eu/eudat/dao/entities/ProjectDaoImpl.java b/dmp-backend/src/main/java/eu/eudat/dao/entities/ProjectDaoImpl.java index 6c208ef10..74e64f236 100644 --- a/dmp-backend/src/main/java/eu/eudat/dao/entities/ProjectDaoImpl.java +++ b/dmp-backend/src/main/java/eu/eudat/dao/entities/ProjectDaoImpl.java @@ -44,11 +44,6 @@ public class ProjectDaoImpl extends DatabaseAccess implements ProjectDa return getDatabaseService().getQueryable(Project.class).where((builder, root) -> builder.equal((root.get("id")), id)).getSingle(); } - @Override - public Long count() { - return this.getDatabaseService().count(Project.class); - } - @Override public void delete(Project item) { this.getDatabaseService().delete(item); diff --git a/dmp-backend/src/main/java/eu/eudat/entities/Credential.java b/dmp-backend/src/main/java/eu/eudat/entities/Credential.java index ef22f8dba..254ce8188 100644 --- a/dmp-backend/src/main/java/eu/eudat/entities/Credential.java +++ b/dmp-backend/src/main/java/eu/eudat/entities/Credential.java @@ -7,7 +7,7 @@ import java.util.UUID; @Entity @Table(name = "\"Credential\"") -public class Credential implements DataEntity { +public class Credential implements DataEntity { @Id @Column(name = "\"Id\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") @@ -119,7 +119,7 @@ public class Credential implements DataEntity { } @Override - public Object[] getKeys() { - return new UUID[]{this.id == null ? null : this.id}; + public UUID getKeys() { + return this.id; } } diff --git a/dmp-backend/src/main/java/eu/eudat/entities/DMP.java b/dmp-backend/src/main/java/eu/eudat/entities/DMP.java index 29e8da2c3..146031b16 100644 --- a/dmp-backend/src/main/java/eu/eudat/entities/DMP.java +++ b/dmp-backend/src/main/java/eu/eudat/entities/DMP.java @@ -23,7 +23,7 @@ import java.util.*; @NamedAttributeNode("project"), @NamedAttributeNode("profile"), @NamedAttributeNode("users"), @NamedAttributeNode("organisations"), @NamedAttributeNode("researchers")}) }) -public class DMP implements Serializable, DataEntity { +public class DMP implements DataEntity { public enum DMPStatus { ACTIVE((short) 0), DELETED((short) 1); @@ -286,8 +286,8 @@ public class DMP implements Serializable, DataEntity { } @Override - public Object[] getKeys() { - return new UUID[]{this.id == null ? null : this.id}; + public UUID getKeys() { + return this.id; } } diff --git a/dmp-backend/src/main/java/eu/eudat/entities/DMPOrganisation.java b/dmp-backend/src/main/java/eu/eudat/entities/DMPOrganisation.java index 2ee1288c9..e3fee9f24 100644 --- a/dmp-backend/src/main/java/eu/eudat/entities/DMPOrganisation.java +++ b/dmp-backend/src/main/java/eu/eudat/entities/DMPOrganisation.java @@ -10,7 +10,7 @@ import java.util.UUID; @Entity @Table(name = "\"DMPOrganisation\"") -public class DMPOrganisation implements Serializable { +public class DMPOrganisation { @Id @GeneratedValue diff --git a/dmp-backend/src/main/java/eu/eudat/entities/DataEntity.java b/dmp-backend/src/main/java/eu/eudat/entities/DataEntity.java index 1be39124a..6ebe0080e 100644 --- a/dmp-backend/src/main/java/eu/eudat/entities/DataEntity.java +++ b/dmp-backend/src/main/java/eu/eudat/entities/DataEntity.java @@ -1,7 +1,7 @@ package eu.eudat.entities; -public interface DataEntity { +public interface DataEntity { void update(T entity); - Object[] getKeys(); + K getKeys(); } diff --git a/dmp-backend/src/main/java/eu/eudat/entities/DataRepository.java b/dmp-backend/src/main/java/eu/eudat/entities/DataRepository.java index 52c5247c8..6407186b6 100644 --- a/dmp-backend/src/main/java/eu/eudat/entities/DataRepository.java +++ b/dmp-backend/src/main/java/eu/eudat/entities/DataRepository.java @@ -12,7 +12,7 @@ import java.util.UUID; @Entity @Table(name = "\"DataRepository\"") -public class DataRepository implements Serializable, DataEntity { +public class DataRepository implements Serializable, DataEntity { @Id @GeneratedValue @@ -147,7 +147,7 @@ public class DataRepository implements Serializable, DataEntity } @Override - public Object[] getKeys() { - return new UUID[]{this.id == null ? null : this.id}; + public UUID getKeys() { + return this.id; } } diff --git a/dmp-backend/src/main/java/eu/eudat/entities/Dataset.java b/dmp-backend/src/main/java/eu/eudat/entities/Dataset.java index d8cae40c0..00648db49 100644 --- a/dmp-backend/src/main/java/eu/eudat/entities/Dataset.java +++ b/dmp-backend/src/main/java/eu/eudat/entities/Dataset.java @@ -20,7 +20,7 @@ import java.util.*; attributeNodes = {@NamedAttributeNode("services"), @NamedAttributeNode("dataRepositories"), @NamedAttributeNode("externalDatasets"), @NamedAttributeNode("registries"), @NamedAttributeNode("dmp"), @NamedAttributeNode("profile"), @NamedAttributeNode("creator")}) }) -public class Dataset implements DataEntity { +public class Dataset implements DataEntity { public static Set getHints() { return hints; @@ -313,7 +313,7 @@ public class Dataset implements DataEntity { } @Override - public Object[] getKeys() { - return new UUID[]{this.id == null ? null : this.id}; + public UUID getKeys() { + return this.id; } } diff --git a/dmp-backend/src/main/java/eu/eudat/entities/DatasetProfile.java b/dmp-backend/src/main/java/eu/eudat/entities/DatasetProfile.java index bdb5c79d4..4ecafda14 100644 --- a/dmp-backend/src/main/java/eu/eudat/entities/DatasetProfile.java +++ b/dmp-backend/src/main/java/eu/eudat/entities/DatasetProfile.java @@ -13,7 +13,7 @@ import java.util.UUID; @Entity @Table(name = "\"DatasetProfile\"") -public class DatasetProfile implements Serializable, DataEntity { +public class DatasetProfile implements DataEntity { @Id @GeneratedValue @@ -132,7 +132,7 @@ public class DatasetProfile implements Serializable, DataEntity } @Override - public Object[] getKeys() { - return new UUID[]{this.id == null ? null : this.id}; + public UUID getKeys() { + return this.id; } } diff --git a/dmp-backend/src/main/java/eu/eudat/entities/DatasetProfileRuleset.java b/dmp-backend/src/main/java/eu/eudat/entities/DatasetProfileRuleset.java index 42fd02b92..223c86411 100644 --- a/dmp-backend/src/main/java/eu/eudat/entities/DatasetProfileRuleset.java +++ b/dmp-backend/src/main/java/eu/eudat/entities/DatasetProfileRuleset.java @@ -11,7 +11,7 @@ import java.util.UUID; @Entity @Table(name = "\"DatasetProfileRuleset\"") -public class DatasetProfileRuleset implements Serializable { +public class DatasetProfileRuleset { @Id @GeneratedValue diff --git a/dmp-backend/src/main/java/eu/eudat/entities/DatasetRegistry.java b/dmp-backend/src/main/java/eu/eudat/entities/DatasetRegistry.java index 9628ac2d0..a223c8a2f 100644 --- a/dmp-backend/src/main/java/eu/eudat/entities/DatasetRegistry.java +++ b/dmp-backend/src/main/java/eu/eudat/entities/DatasetRegistry.java @@ -11,7 +11,7 @@ import java.util.UUID; @Entity @Table(name = "\"DatasetRegistry\"") -public class DatasetRegistry implements Serializable { +public class DatasetRegistry { @Id @GeneratedValue diff --git a/dmp-backend/src/main/java/eu/eudat/entities/DatasetService.java b/dmp-backend/src/main/java/eu/eudat/entities/DatasetService.java index 872abb822..259589db2 100644 --- a/dmp-backend/src/main/java/eu/eudat/entities/DatasetService.java +++ b/dmp-backend/src/main/java/eu/eudat/entities/DatasetService.java @@ -11,7 +11,7 @@ import java.util.UUID; @Entity @Table(name = "\"DatasetService\"") -public class DatasetService implements Serializable { +public class DatasetService { @Id @GeneratedValue diff --git a/dmp-backend/src/main/java/eu/eudat/entities/ExternalDataset.java b/dmp-backend/src/main/java/eu/eudat/entities/ExternalDataset.java index 334c07c22..ebe7e438e 100644 --- a/dmp-backend/src/main/java/eu/eudat/entities/ExternalDataset.java +++ b/dmp-backend/src/main/java/eu/eudat/entities/ExternalDataset.java @@ -10,7 +10,7 @@ import java.util.UUID; @Entity @Table(name = "\"ExternalDataset\"") -public class ExternalDataset implements DataEntity { +public class ExternalDataset implements DataEntity { @Id @GeneratedValue @@ -104,7 +104,7 @@ public class ExternalDataset implements DataEntity { } @Override - public Object[] getKeys() { - return new UUID[]{this.id == null ? null : this.id}; + public UUID getKeys() { + return this.id; } } diff --git a/dmp-backend/src/main/java/eu/eudat/entities/Invitation.java b/dmp-backend/src/main/java/eu/eudat/entities/Invitation.java index 57764e202..04503cca6 100644 --- a/dmp-backend/src/main/java/eu/eudat/entities/Invitation.java +++ b/dmp-backend/src/main/java/eu/eudat/entities/Invitation.java @@ -9,7 +9,7 @@ import java.util.UUID; @Entity @Table(name = "\"Invitation\"") -public class Invitation implements DataEntity { +public class Invitation implements DataEntity { @Id @GeneratedValue @@ -100,7 +100,7 @@ public class Invitation implements DataEntity { } @Override - public Object[] getKeys() { - return new UUID[]{this.id == null ? null : this.id}; + public UUID getKeys() { + return this.id; } } diff --git a/dmp-backend/src/main/java/eu/eudat/entities/Organisation.java b/dmp-backend/src/main/java/eu/eudat/entities/Organisation.java index 910005dc5..7916166f8 100644 --- a/dmp-backend/src/main/java/eu/eudat/entities/Organisation.java +++ b/dmp-backend/src/main/java/eu/eudat/entities/Organisation.java @@ -13,7 +13,7 @@ import java.util.UUID; @Entity @Table(name = "\"Organisation\"") -public class Organisation implements Serializable, DataEntity { +public class Organisation implements Serializable, DataEntity { @Id @GeneratedValue @@ -151,7 +151,7 @@ public class Organisation implements Serializable, DataEntity { } @Override - public Object[] getKeys() { - return new UUID[]{this.id == null ? null : this.id}; + public UUID getKeys() { + return this.id; } } diff --git a/dmp-backend/src/main/java/eu/eudat/entities/Project.java b/dmp-backend/src/main/java/eu/eudat/entities/Project.java index 1d9c0fd18..de8bd0a42 100644 --- a/dmp-backend/src/main/java/eu/eudat/entities/Project.java +++ b/dmp-backend/src/main/java/eu/eudat/entities/Project.java @@ -15,7 +15,7 @@ import java.util.UUID; @Entity @Table(name = "\"Project\"") -public class Project implements DataEntity { +public class Project implements DataEntity { public enum Status { ACTIVE((short) 1), INACTIVE((short) 0), DELETED((short) 99); @@ -248,7 +248,7 @@ public class Project implements DataEntity { } @Override - public Object[] getKeys() { - return new UUID[]{this.id == null ? null : this.id}; + public UUID getKeys() { + return this.id; } } diff --git a/dmp-backend/src/main/java/eu/eudat/entities/Registry.java b/dmp-backend/src/main/java/eu/eudat/entities/Registry.java index 57a1a882b..80e601592 100644 --- a/dmp-backend/src/main/java/eu/eudat/entities/Registry.java +++ b/dmp-backend/src/main/java/eu/eudat/entities/Registry.java @@ -12,7 +12,7 @@ import java.util.UUID; @Entity @Table(name = "\"Registry\"") -public class Registry implements DataEntity { +public class Registry implements DataEntity { @Id @@ -149,7 +149,7 @@ public class Registry implements DataEntity { } @Override - public Object[] getKeys() { - return new UUID[]{this.id == null ? null : this.id}; + public UUID getKeys() { + return this.id; } } diff --git a/dmp-backend/src/main/java/eu/eudat/entities/Researcher.java b/dmp-backend/src/main/java/eu/eudat/entities/Researcher.java index de296f2f9..f37a4a5b8 100644 --- a/dmp-backend/src/main/java/eu/eudat/entities/Researcher.java +++ b/dmp-backend/src/main/java/eu/eudat/entities/Researcher.java @@ -12,7 +12,7 @@ import java.util.UUID; @Entity @Table(name = "\"Researcher\"") -public class Researcher implements DataEntity { +public class Researcher implements DataEntity { @Id @GeneratedValue @@ -150,7 +150,7 @@ public class Researcher implements DataEntity { } @Override - public Object[] getKeys() { - return new UUID[]{this.id == null ? null : this.id}; + public UUID getKeys() { + return this.id; } } diff --git a/dmp-backend/src/main/java/eu/eudat/entities/Service.java b/dmp-backend/src/main/java/eu/eudat/entities/Service.java index 3a8f16ff1..0c03a245e 100644 --- a/dmp-backend/src/main/java/eu/eudat/entities/Service.java +++ b/dmp-backend/src/main/java/eu/eudat/entities/Service.java @@ -12,7 +12,7 @@ import java.util.UUID; @Entity @Table(name = "\"Service\"") -public class Service implements DataEntity { +public class Service implements DataEntity { @Id @GeneratedValue @@ -150,7 +150,7 @@ public class Service implements DataEntity { } @Override - public Object[] getKeys() { - return new UUID[]{this.id == null ? null : this.id}; + public UUID getKeys() { + return this.id; } } diff --git a/dmp-backend/src/main/java/eu/eudat/entities/UserDMP.java b/dmp-backend/src/main/java/eu/eudat/entities/UserDMP.java index ab145e910..a2235a940 100644 --- a/dmp-backend/src/main/java/eu/eudat/entities/UserDMP.java +++ b/dmp-backend/src/main/java/eu/eudat/entities/UserDMP.java @@ -7,7 +7,7 @@ import java.util.UUID; @Entity @Table(name = "\"UserDMP\"") -public class UserDMP implements DataEntity { +public class UserDMP implements DataEntity { public enum UserDMPRoles { OWNER(0), USER(1); @@ -90,7 +90,7 @@ public class UserDMP implements DataEntity { } @Override - public Object[] getKeys() { - return new UUID[]{this.id == null ? null : this.id}; + public UUID getKeys() { + return this.id; } } diff --git a/dmp-backend/src/main/java/eu/eudat/entities/UserInfo.java b/dmp-backend/src/main/java/eu/eudat/entities/UserInfo.java index 58e2ddfbc..07d98095f 100644 --- a/dmp-backend/src/main/java/eu/eudat/entities/UserInfo.java +++ b/dmp-backend/src/main/java/eu/eudat/entities/UserInfo.java @@ -17,7 +17,7 @@ import java.util.UUID; name = "userInfo", attributeNodes = {@NamedAttributeNode("userRoles"), @NamedAttributeNode("credentials")}) }) -public class UserInfo implements DataEntity { +public class UserInfo implements DataEntity { @Id @GeneratedValue @@ -173,7 +173,7 @@ public class UserInfo implements DataEntity { } @Override - public Object[] getKeys() { - return new UUID[]{this.id == null ? null : this.id}; + public UUID getKeys() { + return this.id; } } diff --git a/dmp-backend/src/main/java/eu/eudat/entities/UserRole.java b/dmp-backend/src/main/java/eu/eudat/entities/UserRole.java index f63e8d4e6..0f0f76668 100644 --- a/dmp-backend/src/main/java/eu/eudat/entities/UserRole.java +++ b/dmp-backend/src/main/java/eu/eudat/entities/UserRole.java @@ -8,7 +8,7 @@ import java.util.UUID; @Entity @Table(name = "\"UserRole\"") -public class UserRole implements DataEntity { +public class UserRole implements DataEntity { @Id @GeneratedValue @@ -53,7 +53,7 @@ public class UserRole implements DataEntity { } @Override - public Object[] getKeys() { - return new UUID[]{this.id == null ? null : this.id}; + public UUID getKeys() { + return this.id; } } diff --git a/dmp-backend/src/main/java/eu/eudat/entities/UserToken.java b/dmp-backend/src/main/java/eu/eudat/entities/UserToken.java index d53b68d3a..940812b84 100644 --- a/dmp-backend/src/main/java/eu/eudat/entities/UserToken.java +++ b/dmp-backend/src/main/java/eu/eudat/entities/UserToken.java @@ -7,7 +7,7 @@ import java.util.UUID; @Entity @Table(name = "\"UserToken\"") -public class UserToken implements DataEntity { +public class UserToken implements DataEntity { @Id @Column(name = "\"Token\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") @@ -62,7 +62,7 @@ public class UserToken implements DataEntity { } @Override - public Object[] getKeys() { - return new UUID[]{this.token == null ? null : this.token}; + public UUID getKeys() { + return this.token; } } diff --git a/dmp-backend/src/main/java/eu/eudat/managers/DashBoardManager.java b/dmp-backend/src/main/java/eu/eudat/managers/DashBoardManager.java index 12f9b865c..a109c12b4 100644 --- a/dmp-backend/src/main/java/eu/eudat/managers/DashBoardManager.java +++ b/dmp-backend/src/main/java/eu/eudat/managers/DashBoardManager.java @@ -11,9 +11,9 @@ public class DashBoardManager { public DashBoardStatistics getStatistics(DatasetDao datasetRepository, DMPDao dataManagementPlanRepository, ProjectDao projectRepository) { DashBoardStatistics statistics = new DashBoardStatistics(); - statistics.setTotalDataManagementPlanCount(dataManagementPlanRepository.count()); - statistics.setTotalDataSetCount(datasetRepository.count()); - statistics.setTotalProjectCount(projectRepository.count()); + statistics.setTotalDataManagementPlanCount(dataManagementPlanRepository.asQueryable().count()); + statistics.setTotalDataSetCount(datasetRepository.asQueryable().count()); + statistics.setTotalProjectCount(projectRepository.asQueryable().count()); return statistics; } diff --git a/dmp-backend/src/main/java/eu/eudat/managers/PaginationManager.java b/dmp-backend/src/main/java/eu/eudat/managers/PaginationManager.java index d4dad79f7..6473fc8b9 100644 --- a/dmp-backend/src/main/java/eu/eudat/managers/PaginationManager.java +++ b/dmp-backend/src/main/java/eu/eudat/managers/PaginationManager.java @@ -10,14 +10,14 @@ import java.util.Collection; public class PaginationManager { - public static > QueryableList applyPaging(QueryableList items, TableRequest tableRequest) throws Exception { + public static QueryableList applyPaging(QueryableList items, TableRequest tableRequest) throws Exception { if (tableRequest.getOrderings() != null) applyOrder(items, tableRequest); if (tableRequest.getLength() != null) items.take(tableRequest.getLength()); if (tableRequest.getOffset() != null) items.skip(tableRequest.getOffset()); return items; } - public static > void applyOrder(QueryableList items, TableRequest tableRequest) throws Exception { + public static void applyOrder(QueryableList items, TableRequest tableRequest) throws Exception { ColumnOrderings columnOrderings = tableRequest.getOrderings(); for (Ordering ordering : columnOrderings.getFieldOrderings()) { if (ordering.getOrderByType() == Ordering.OrderByType.ASC) @@ -29,7 +29,7 @@ public class PaginationManager { return; } - private static > void applyAscOrder(QueryableList items, Ordering ordering) { + private static void applyAscOrder(QueryableList items, Ordering ordering) { if (ordering.getColumnType() == Ordering.ColumnType.COUNT) { items.orderBy((builder, root) -> builder.asc(builder.size(root.get(ordering.getFieldName())))); } else if (ordering.getColumnType() == Ordering.ColumnType.JOIN_COLUMN) { @@ -40,7 +40,7 @@ public class PaginationManager { } } - private static > void applyDescOrder(QueryableList items, Ordering ordering) { + private static void applyDescOrder(QueryableList items, Ordering ordering) { if (ordering.getColumnType() == Ordering.ColumnType.COUNT) { items.orderBy((builder, root) -> builder.desc(builder.size(root.get(ordering.getFieldName())))); } else if (ordering.getColumnType() == Ordering.ColumnType.JOIN_COLUMN) { diff --git a/dmp-backend/src/main/java/eu/eudat/queryable/QueryableList.java b/dmp-backend/src/main/java/eu/eudat/queryable/QueryableList.java index e208cccf6..054c6ad6b 100644 --- a/dmp-backend/src/main/java/eu/eudat/queryable/QueryableList.java +++ b/dmp-backend/src/main/java/eu/eudat/queryable/QueryableList.java @@ -13,7 +13,7 @@ import java.util.List; import java.util.Set; import java.util.concurrent.CompletableFuture; -public interface QueryableList> { +public interface QueryableList { QueryableList where(SinglePredicate predicate); List select(SelectPredicate predicate); diff --git a/dmp-backend/src/main/java/eu/eudat/queryable/hibernatequeryablelist/QueryableHibernateList.java b/dmp-backend/src/main/java/eu/eudat/queryable/hibernatequeryablelist/QueryableHibernateList.java index f68a60f2e..c09a986a8 100644 --- a/dmp-backend/src/main/java/eu/eudat/queryable/hibernatequeryablelist/QueryableHibernateList.java +++ b/dmp-backend/src/main/java/eu/eudat/queryable/hibernatequeryablelist/QueryableHibernateList.java @@ -21,12 +21,12 @@ import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; -public class QueryableHibernateList> implements QueryableList { +public class QueryableHibernateList implements QueryableList { private EntityManager manager; - private CriteriaQuery query; + private CriteriaQuery query; private Class tClass; - private Root root; + private Root root; private Root nestedQueryRoot; private Subquery subquery; private List> singlePredicates = new LinkedList<>(); @@ -61,7 +61,7 @@ public class QueryableHibernateList> implements Queryabl public QueryableHibernateList setEntity(Class type) { CriteriaBuilder builder = this.manager.getCriteriaBuilder(); - this.query = builder.createQuery(type); + this.query = builder.createTupleQuery(); this.root = this.query.from(this.tClass); return this; } @@ -170,7 +170,7 @@ public class QueryableHibernateList> implements Queryabl if (this.offset != null) typedQuery.setFirstResult(this.offset); if (this.length != null) typedQuery.setMaxResults(this.length); if (this.hint != null && this.hints.contains(hint)) { - List ids = typedQuery.getResultList().stream().map(item -> item.getKeys()[0]).collect(Collectors.toList()); + List ids = typedQuery.getResultList().stream().map(item -> item.getKeys()).collect(Collectors.toList()); if (ids != null && !ids.isEmpty()) typedQuery = queryWithHint(ids); } return typedQuery.getResultList(); @@ -184,7 +184,7 @@ public class QueryableHibernateList> implements Queryabl if (this.length != null) typedQuery.setMaxResults(this.length); return CompletableFuture.supplyAsync(() -> { if (this.hint != null && this.hints.contains(hint)) { - List ids = typedQuery.getResultList().stream().map(item -> item.getKeys()[0]).collect(Collectors.toList()); + List ids = typedQuery.getResultList().stream().map(item -> item.getKeys()).collect(Collectors.toList()); if (ids != null && !ids.isEmpty()) return queryWithHint(ids).getResultList(); } return typedQuery.getResultList(); @@ -236,7 +236,6 @@ public class QueryableHibernateList> implements Queryabl 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)); From 70db1b2894d47735c6a7d04604fcc1be68dbea9c Mon Sep 17 00:00:00 2001 From: Ioannis Kalyvas Date: Wed, 21 Feb 2018 12:07:31 +0200 Subject: [PATCH 2/3] no message --- .../java/eu/eudat/dao/DatabaseAccessLayer.java | 7 +++++++ .../databaselayer/context/DatabaseContext.java | 5 ----- .../databaselayer/service/DatabaseService.java | 4 ---- .../java/eu/eudat/dao/entities/DMPDaoImpl.java | 10 ++++++++++ .../dao/entities/DataRepositoryDaoImpl.java | 11 +++++++++++ .../java/eu/eudat/dao/entities/DatasetDao.java | 4 ---- .../dao/entities/DatasetProfileDaoImpl.java | 11 +++++++++++ .../dao/entities/ExternalDatasetDaoImpl.java | 11 +++++++++++ .../eudat/dao/entities/InvitationDaoImpl.java | 11 +++++++++++ .../eudat/dao/entities/OrganisationDaoImpl.java | 11 +++++++++++ .../eu/eudat/dao/entities/ProjectDaoImpl.java | 11 +++++++++++ .../eu/eudat/dao/entities/RegistryDaoImpl.java | 11 +++++++++++ .../eudat/dao/entities/ResearcherDaoImpl.java | 11 +++++++++++ .../eu/eudat/dao/entities/ServiceDaoImpl.java | 11 +++++++++++ .../eu/eudat/dao/entities/UserDmpDaoImpl.java | 11 +++++++++++ .../eu/eudat/dao/entities/UserInfoDaoImpl.java | 11 +++++++++++ .../eu/eudat/dao/entities/UserRoleDaoImpl.java | 11 +++++++++++ .../entities/security/CredentialDaoImpl.java | 11 +++++++++++ .../dao/entities/security/UserTokenDaoImpl.java | 11 +++++++++++ .../managers/DataManagementPlanManager.java | 10 +++++----- .../java/eu/eudat/managers/DatasetManager.java | 8 +++----- .../eudat/managers/DatasetProfileManager.java | 6 +++--- .../eu/eudat/managers/DatasetWizardManager.java | 2 +- .../eudat/managers/ExternalDatasetManager.java | 4 ++-- .../eu/eudat/managers/InvitationsManager.java | 2 +- .../java/eu/eudat/managers/ProjectManager.java | 9 ++++----- .../java/eu/eudat/managers/UserManager.java | 2 +- .../java/eu/eudat/queryable/QueryableList.java | 2 ++ .../QueryableHibernateList.java | 17 ++++++++--------- dmp-frontend/src/environments/environment.ts | 2 +- 30 files changed, 202 insertions(+), 46 deletions(-) diff --git a/dmp-backend/src/main/java/eu/eudat/dao/DatabaseAccessLayer.java b/dmp-backend/src/main/java/eu/eudat/dao/DatabaseAccessLayer.java index f094ea6dc..0a5c4cd0a 100644 --- a/dmp-backend/src/main/java/eu/eudat/dao/DatabaseAccessLayer.java +++ b/dmp-backend/src/main/java/eu/eudat/dao/DatabaseAccessLayer.java @@ -2,13 +2,20 @@ package eu.eudat.dao; import eu.eudat.entities.DataEntity; +import eu.eudat.entities.Dataset; import eu.eudat.queryable.QueryableList; +import java.util.concurrent.CompletableFuture; + public interface DatabaseAccessLayer { T createOrUpdate(T item); + CompletableFuture createOrUpdateAsync(T item); + T find(I id); + T find(I id, String hint); + void delete(T item); QueryableList asQueryable(); diff --git a/dmp-backend/src/main/java/eu/eudat/dao/databaselayer/context/DatabaseContext.java b/dmp-backend/src/main/java/eu/eudat/dao/databaselayer/context/DatabaseContext.java index 6d1d4c820..d9defe1ae 100644 --- a/dmp-backend/src/main/java/eu/eudat/dao/databaselayer/context/DatabaseContext.java +++ b/dmp-backend/src/main/java/eu/eudat/dao/databaselayer/context/DatabaseContext.java @@ -43,11 +43,6 @@ public class DatabaseContext { return item; } - public long count(Class entityClass) { - EntityManager entityManager = this.entityManager; - return ((Number) entityManager.createQuery("select count(e) from " + entityClass.getSimpleName() + " e").getSingleResult()).longValue(); - } - public void delete(T item) { this.entityManager.remove(item); } diff --git a/dmp-backend/src/main/java/eu/eudat/dao/databaselayer/service/DatabaseService.java b/dmp-backend/src/main/java/eu/eudat/dao/databaselayer/service/DatabaseService.java index ac997dfaf..3146c49b8 100644 --- a/dmp-backend/src/main/java/eu/eudat/dao/databaselayer/service/DatabaseService.java +++ b/dmp-backend/src/main/java/eu/eudat/dao/databaselayer/service/DatabaseService.java @@ -32,10 +32,6 @@ public class DatabaseService { return this.databaseCtx.createOrUpdate(item, tClass); } - public Long count(Class tClass) { - return this.databaseCtx.count(tClass); - } - public void delete(T item) { this.databaseCtx.delete(item); } diff --git a/dmp-backend/src/main/java/eu/eudat/dao/entities/DMPDaoImpl.java b/dmp-backend/src/main/java/eu/eudat/dao/entities/DMPDaoImpl.java index 8f208abf1..531d61456 100644 --- a/dmp-backend/src/main/java/eu/eudat/dao/entities/DMPDaoImpl.java +++ b/dmp-backend/src/main/java/eu/eudat/dao/entities/DMPDaoImpl.java @@ -14,6 +14,7 @@ import org.springframework.stereotype.Component; import java.util.Arrays; import java.util.UUID; +import java.util.concurrent.CompletableFuture; @Component("dMPDao") public class DMPDaoImpl extends DatabaseAccess implements DMPDao { @@ -77,4 +78,13 @@ public class DMPDaoImpl extends DatabaseAccess implements DMPDao { return this.getDatabaseService().getQueryable(DMP.class); } + @Override + public CompletableFuture createOrUpdateAsync(DMP item) { + return CompletableFuture.supplyAsync(()->this.createOrUpdate(item)); + } + + @Override + public DMP find(UUID id, String hint) { + throw new UnsupportedOperationException(); + } } diff --git a/dmp-backend/src/main/java/eu/eudat/dao/entities/DataRepositoryDaoImpl.java b/dmp-backend/src/main/java/eu/eudat/dao/entities/DataRepositoryDaoImpl.java index 75599f3fa..2d20e6a77 100644 --- a/dmp-backend/src/main/java/eu/eudat/dao/entities/DataRepositoryDaoImpl.java +++ b/dmp-backend/src/main/java/eu/eudat/dao/entities/DataRepositoryDaoImpl.java @@ -9,6 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.UUID; +import java.util.concurrent.CompletableFuture; @Component("dataRepositoryDao") public class DataRepositoryDaoImpl extends DatabaseAccess implements DataRepositoryDao { @@ -36,6 +37,16 @@ public class DataRepositoryDaoImpl extends DatabaseAccess implem return getDatabaseService().createOrUpdate(item, DataRepository.class); } + @Override + public CompletableFuture createOrUpdateAsync(DataRepository item) { + return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); + } + + @Override + public DataRepository find(UUID id, String hint) { + throw new UnsupportedOperationException(); + } + @Override public void delete(DataRepository item) { this.getDatabaseService().delete(item); diff --git a/dmp-backend/src/main/java/eu/eudat/dao/entities/DatasetDao.java b/dmp-backend/src/main/java/eu/eudat/dao/entities/DatasetDao.java index 5cb766447..eb560faec 100644 --- a/dmp-backend/src/main/java/eu/eudat/dao/entities/DatasetDao.java +++ b/dmp-backend/src/main/java/eu/eudat/dao/entities/DatasetDao.java @@ -15,8 +15,4 @@ public interface DatasetDao extends DatabaseAccessLayer { QueryableList getAuthenticated(QueryableList query, UserInfo principal); - CompletableFuture createOrUpdateAsync(Dataset item); - - Dataset find(UUID id, String hint); - } \ No newline at end of file diff --git a/dmp-backend/src/main/java/eu/eudat/dao/entities/DatasetProfileDaoImpl.java b/dmp-backend/src/main/java/eu/eudat/dao/entities/DatasetProfileDaoImpl.java index fd986e635..9b2cc3920 100644 --- a/dmp-backend/src/main/java/eu/eudat/dao/entities/DatasetProfileDaoImpl.java +++ b/dmp-backend/src/main/java/eu/eudat/dao/entities/DatasetProfileDaoImpl.java @@ -9,6 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.UUID; +import java.util.concurrent.CompletableFuture; @Component("datasetProfileDao") public class DatasetProfileDaoImpl extends DatabaseAccess implements DatasetProfileDao { @@ -50,4 +51,14 @@ public class DatasetProfileDaoImpl extends DatabaseAccess implem public QueryableList asQueryable() { return this.getDatabaseService().getQueryable(DatasetProfile.class); } + + @Override + public CompletableFuture createOrUpdateAsync(DatasetProfile item) { + return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); + } + + @Override + public DatasetProfile find(UUID id, String hint) { + throw new UnsupportedOperationException(); + } } diff --git a/dmp-backend/src/main/java/eu/eudat/dao/entities/ExternalDatasetDaoImpl.java b/dmp-backend/src/main/java/eu/eudat/dao/entities/ExternalDatasetDaoImpl.java index 3c12cf5df..6924ea09b 100644 --- a/dmp-backend/src/main/java/eu/eudat/dao/entities/ExternalDatasetDaoImpl.java +++ b/dmp-backend/src/main/java/eu/eudat/dao/entities/ExternalDatasetDaoImpl.java @@ -9,6 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.UUID; +import java.util.concurrent.CompletableFuture; @Component("externalDatasetDao") @@ -46,4 +47,14 @@ public class ExternalDatasetDaoImpl extends DatabaseAccess impl public QueryableList asQueryable() { return this.getDatabaseService().getQueryable(ExternalDataset.class); } + + @Override + public CompletableFuture createOrUpdateAsync(ExternalDataset item) { + return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); + } + + @Override + public ExternalDataset find(UUID id, String hint) { + throw new UnsupportedOperationException(); + } } diff --git a/dmp-backend/src/main/java/eu/eudat/dao/entities/InvitationDaoImpl.java b/dmp-backend/src/main/java/eu/eudat/dao/entities/InvitationDaoImpl.java index 6191d615d..0a58a016f 100644 --- a/dmp-backend/src/main/java/eu/eudat/dao/entities/InvitationDaoImpl.java +++ b/dmp-backend/src/main/java/eu/eudat/dao/entities/InvitationDaoImpl.java @@ -9,6 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.UUID; +import java.util.concurrent.CompletableFuture; @Service("invitationDao") @@ -43,4 +44,14 @@ public class InvitationDaoImpl extends DatabaseAccess implements Inv public QueryableList asQueryable() { return this.getDatabaseService().getQueryable(Invitation.class); } + + @Override + public CompletableFuture createOrUpdateAsync(Invitation item) { + return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); + } + + @Override + public Invitation find(UUID id, String hint) { + throw new UnsupportedOperationException(); + } } diff --git a/dmp-backend/src/main/java/eu/eudat/dao/entities/OrganisationDaoImpl.java b/dmp-backend/src/main/java/eu/eudat/dao/entities/OrganisationDaoImpl.java index e68de353d..4ef72dbaa 100644 --- a/dmp-backend/src/main/java/eu/eudat/dao/entities/OrganisationDaoImpl.java +++ b/dmp-backend/src/main/java/eu/eudat/dao/entities/OrganisationDaoImpl.java @@ -9,6 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.UUID; +import java.util.concurrent.CompletableFuture; @Component("organisationDao") public class OrganisationDaoImpl extends DatabaseAccess implements OrganisationDao { @@ -45,4 +46,14 @@ public class OrganisationDaoImpl extends DatabaseAccess implements public QueryableList asQueryable() { return this.getDatabaseService().getQueryable(Organisation.class); } + + @Override + public CompletableFuture createOrUpdateAsync(Organisation item) { + return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); + } + + @Override + public Organisation find(UUID id, String hint) { + throw new UnsupportedOperationException(); + } } diff --git a/dmp-backend/src/main/java/eu/eudat/dao/entities/ProjectDaoImpl.java b/dmp-backend/src/main/java/eu/eudat/dao/entities/ProjectDaoImpl.java index 74e64f236..5d66389b9 100644 --- a/dmp-backend/src/main/java/eu/eudat/dao/entities/ProjectDaoImpl.java +++ b/dmp-backend/src/main/java/eu/eudat/dao/entities/ProjectDaoImpl.java @@ -10,6 +10,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.UUID; +import java.util.concurrent.CompletableFuture; @Component("projectDao") public class ProjectDaoImpl extends DatabaseAccess implements ProjectDao { @@ -58,4 +59,14 @@ public class ProjectDaoImpl extends DatabaseAccess implements ProjectDa query.where((builder, root) -> builder.equal(root.get("creator"), principal)); return query; } + + @Override + public CompletableFuture createOrUpdateAsync(Project item) { + return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); + } + + @Override + public Project find(UUID id, String hint) { + throw new UnsupportedOperationException(); + } } diff --git a/dmp-backend/src/main/java/eu/eudat/dao/entities/RegistryDaoImpl.java b/dmp-backend/src/main/java/eu/eudat/dao/entities/RegistryDaoImpl.java index 263e78161..65fe26a5c 100644 --- a/dmp-backend/src/main/java/eu/eudat/dao/entities/RegistryDaoImpl.java +++ b/dmp-backend/src/main/java/eu/eudat/dao/entities/RegistryDaoImpl.java @@ -9,6 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.UUID; +import java.util.concurrent.CompletableFuture; @Component("registryDao") public class RegistryDaoImpl extends DatabaseAccess implements RegistryDao { @@ -45,4 +46,14 @@ public class RegistryDaoImpl extends DatabaseAccess implements Registr public QueryableList asQueryable() { return this.getDatabaseService().getQueryable(Registry.class); } + + @Override + public CompletableFuture createOrUpdateAsync(Registry item) { + return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); + } + + @Override + public Registry find(UUID id, String hint) { + throw new UnsupportedOperationException(); + } } diff --git a/dmp-backend/src/main/java/eu/eudat/dao/entities/ResearcherDaoImpl.java b/dmp-backend/src/main/java/eu/eudat/dao/entities/ResearcherDaoImpl.java index cfbaba4ac..a2e48cfac 100644 --- a/dmp-backend/src/main/java/eu/eudat/dao/entities/ResearcherDaoImpl.java +++ b/dmp-backend/src/main/java/eu/eudat/dao/entities/ResearcherDaoImpl.java @@ -9,6 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.UUID; +import java.util.concurrent.CompletableFuture; @Component("researcherDao") public class ResearcherDaoImpl extends DatabaseAccess implements ResearcherDao { @@ -45,4 +46,14 @@ public class ResearcherDaoImpl extends DatabaseAccess implements Res public QueryableList asQueryable() { return this.getDatabaseService().getQueryable(Researcher.class); } + + @Override + public CompletableFuture createOrUpdateAsync(Researcher item) { + return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); + } + + @Override + public Researcher find(UUID id, String hint) { + throw new UnsupportedOperationException(); + } } diff --git a/dmp-backend/src/main/java/eu/eudat/dao/entities/ServiceDaoImpl.java b/dmp-backend/src/main/java/eu/eudat/dao/entities/ServiceDaoImpl.java index d56cdbddf..421f44cf1 100644 --- a/dmp-backend/src/main/java/eu/eudat/dao/entities/ServiceDaoImpl.java +++ b/dmp-backend/src/main/java/eu/eudat/dao/entities/ServiceDaoImpl.java @@ -9,6 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.UUID; +import java.util.concurrent.CompletableFuture; @Component("serviceDao") public class ServiceDaoImpl extends DatabaseAccess implements ServiceDao { @@ -45,4 +46,14 @@ public class ServiceDaoImpl extends DatabaseAccess implements ServiceDa public QueryableList asQueryable() { return this.getDatabaseService().getQueryable(Service.class); } + + @Override + public CompletableFuture createOrUpdateAsync(Service item) { + return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); + } + + @Override + public Service find(UUID id, String hint) { + throw new UnsupportedOperationException(); + } } diff --git a/dmp-backend/src/main/java/eu/eudat/dao/entities/UserDmpDaoImpl.java b/dmp-backend/src/main/java/eu/eudat/dao/entities/UserDmpDaoImpl.java index 9213ffc45..1604223cf 100644 --- a/dmp-backend/src/main/java/eu/eudat/dao/entities/UserDmpDaoImpl.java +++ b/dmp-backend/src/main/java/eu/eudat/dao/entities/UserDmpDaoImpl.java @@ -8,6 +8,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.UUID; +import java.util.concurrent.CompletableFuture; /** * Created by ikalyvas on 2/8/2018. @@ -39,4 +40,14 @@ public class UserDmpDaoImpl extends DatabaseAccess implements UserDmpDa public QueryableList asQueryable() { return this.getDatabaseService().getQueryable(UserDMP.class); } + + @Override + public CompletableFuture createOrUpdateAsync(UserDMP item) { + return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); + } + + @Override + public UserDMP find(UUID id, String hint) { + throw new UnsupportedOperationException(); + } } diff --git a/dmp-backend/src/main/java/eu/eudat/dao/entities/UserInfoDaoImpl.java b/dmp-backend/src/main/java/eu/eudat/dao/entities/UserInfoDaoImpl.java index 20b2ff259..341c7cd8c 100644 --- a/dmp-backend/src/main/java/eu/eudat/dao/entities/UserInfoDaoImpl.java +++ b/dmp-backend/src/main/java/eu/eudat/dao/entities/UserInfoDaoImpl.java @@ -9,6 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.UUID; +import java.util.concurrent.CompletableFuture; @Component("userInfoDao") public class UserInfoDaoImpl extends DatabaseAccess implements UserInfoDao { @@ -49,4 +50,14 @@ public class UserInfoDaoImpl extends DatabaseAccess implements UserInf public QueryableList asQueryable() { return this.getDatabaseService().getQueryable(UserInfo.class); } + + @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/src/main/java/eu/eudat/dao/entities/UserRoleDaoImpl.java b/dmp-backend/src/main/java/eu/eudat/dao/entities/UserRoleDaoImpl.java index 5d42da3f4..c48a9c581 100644 --- a/dmp-backend/src/main/java/eu/eudat/dao/entities/UserRoleDaoImpl.java +++ b/dmp-backend/src/main/java/eu/eudat/dao/entities/UserRoleDaoImpl.java @@ -11,6 +11,7 @@ import org.springframework.stereotype.Component; import java.util.List; import java.util.UUID; +import java.util.concurrent.CompletableFuture; @Component("userRoleDao") @@ -55,4 +56,14 @@ public class UserRoleDaoImpl extends DatabaseAccess implements UserRol public QueryableList asQueryable() { return this.getDatabaseService().getQueryable(UserRole.class); } + + @Override + public CompletableFuture createOrUpdateAsync(UserRole item) { + return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); + } + + @Override + public UserRole find(UUID id, String hint) { + throw new UnsupportedOperationException(); + } } diff --git a/dmp-backend/src/main/java/eu/eudat/dao/entities/security/CredentialDaoImpl.java b/dmp-backend/src/main/java/eu/eudat/dao/entities/security/CredentialDaoImpl.java index 8add130f0..efe1487e0 100644 --- a/dmp-backend/src/main/java/eu/eudat/dao/entities/security/CredentialDaoImpl.java +++ b/dmp-backend/src/main/java/eu/eudat/dao/entities/security/CredentialDaoImpl.java @@ -10,6 +10,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.UUID; +import java.util.concurrent.CompletableFuture; @Component("credentialDao") @@ -49,4 +50,14 @@ public class CredentialDaoImpl extends DatabaseAccess implements Cre public QueryableList asQueryable() { return this.getDatabaseService().getQueryable(Credential.class); } + + @Override + public CompletableFuture createOrUpdateAsync(Credential item) { + return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); + } + + @Override + public Credential find(UUID id, String hint) { + throw new UnsupportedOperationException(); + } } diff --git a/dmp-backend/src/main/java/eu/eudat/dao/entities/security/UserTokenDaoImpl.java b/dmp-backend/src/main/java/eu/eudat/dao/entities/security/UserTokenDaoImpl.java index 95717e47c..a2e4f5dcf 100644 --- a/dmp-backend/src/main/java/eu/eudat/dao/entities/security/UserTokenDaoImpl.java +++ b/dmp-backend/src/main/java/eu/eudat/dao/entities/security/UserTokenDaoImpl.java @@ -8,6 +8,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.UUID; +import java.util.concurrent.CompletableFuture; @Component("userTokenDao") @@ -37,4 +38,14 @@ public class UserTokenDaoImpl extends DatabaseAccess implements UserT public QueryableList asQueryable() { return this.getDatabaseService().getQueryable(UserToken.class); } + + @Override + public CompletableFuture createOrUpdateAsync(UserToken item) { + return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); + } + + @Override + public UserToken find(UUID id, String hint) { + throw new UnsupportedOperationException(); + } } diff --git a/dmp-backend/src/main/java/eu/eudat/managers/DataManagementPlanManager.java b/dmp-backend/src/main/java/eu/eudat/managers/DataManagementPlanManager.java index 62877d8c0..9e9d45c05 100644 --- a/dmp-backend/src/main/java/eu/eudat/managers/DataManagementPlanManager.java +++ b/dmp-backend/src/main/java/eu/eudat/managers/DataManagementPlanManager.java @@ -39,10 +39,10 @@ public class DataManagementPlanManager { DataTableData dataTable = new DataTableData(); - CompletableFuture itemsFuture = pagedItems.withHint(HintedModelFactory.getHint(DataManagementPlanListingModel.class)).toListAsync().whenComplete((resultList, throwable) -> { - List datamanagementPlans = resultList.stream().map(item -> new DataManagementPlanListingModel().fromDataModel(item)).collect(Collectors.toList()); - dataTable.setData(datamanagementPlans); - }); + CompletableFuture itemsFuture = pagedItems.withHint(HintedModelFactory.getHint(DataManagementPlanListingModel.class)) + .selectAsync(item -> new DataManagementPlanListingModel().fromDataModel(item)).whenComplete((resultList, throwable) -> { + dataTable.setData(resultList); + }); CompletableFuture countFuture = items.countAsync().whenComplete((count, throwable) -> { dataTable.setTotalCount(count); @@ -62,7 +62,7 @@ public class DataManagementPlanManager { public List getWithCriteria(DMPDao dmpsRepository, DataManagementPlanCriteriaRequest dataManagementPlanCriteria) throws IllegalAccessException, InstantiationException { QueryableList items = dmpsRepository.getWithCriteria(dataManagementPlanCriteria.getCriteria()); - List datamanagementPlans = items.toList().stream().map(item -> new DataManagementPlan().fromDataModel(item)).collect(Collectors.toList()); + List datamanagementPlans = items.select(item -> new DataManagementPlan().fromDataModel(item)); return datamanagementPlans; } diff --git a/dmp-backend/src/main/java/eu/eudat/managers/DatasetManager.java b/dmp-backend/src/main/java/eu/eudat/managers/DatasetManager.java index f72a11fbf..d4c19a400 100644 --- a/dmp-backend/src/main/java/eu/eudat/managers/DatasetManager.java +++ b/dmp-backend/src/main/java/eu/eudat/managers/DatasetManager.java @@ -2,7 +2,6 @@ package eu.eudat.managers; import eu.eudat.builders.entity.UserInfoBuilder; import eu.eudat.dao.entities.*; -import eu.eudat.entities.Dataset; import eu.eudat.entities.UserInfo; import eu.eudat.models.HintedModelFactory; import eu.eudat.models.criteria.DataRepositoryCriteria; @@ -24,7 +23,6 @@ import java.util.List; import java.util.Map; import java.util.UUID; import java.util.concurrent.CompletableFuture; -import java.util.stream.Collectors; public class DatasetManager { @@ -36,9 +34,9 @@ public class DatasetManager { QueryableList pagedItems = PaginationManager.applyPaging(authItems, datasetTableRequest); DataTableData dataTable = new DataTableData(); - CompletableFuture> itemsFuture = pagedItems.withHint(HintedModelFactory.getHint(DatasetListingModel.class)).toListAsync().whenComplete((resultList, throwable) -> { - List datasets = resultList.stream().map(item -> new DatasetListingModel().fromDataModel(item)).collect(Collectors.toList()); - dataTable.setData(datasets); + CompletableFuture> itemsFuture = pagedItems.withHint(HintedModelFactory.getHint(DatasetListingModel.class)). + selectAsync(item -> new DatasetListingModel().fromDataModel(item)).whenComplete((resultList, throwable) -> { + dataTable.setData(resultList); }); CompletableFuture countFuture = items.countAsync().whenComplete((count, throwable) -> { diff --git a/dmp-backend/src/main/java/eu/eudat/managers/DatasetProfileManager.java b/dmp-backend/src/main/java/eu/eudat/managers/DatasetProfileManager.java index ae30b4078..5580dc8fb 100644 --- a/dmp-backend/src/main/java/eu/eudat/managers/DatasetProfileManager.java +++ b/dmp-backend/src/main/java/eu/eudat/managers/DatasetProfileManager.java @@ -19,20 +19,20 @@ public class DatasetProfileManager { public static List getWithCriteria(DatasetProfileDao datasetProfileRepository, DatasetProfileAutocompleteRequest datasetProfileAutocompleteRequest) throws IllegalAccessException, InstantiationException { QueryableList items = datasetProfileRepository.getWithCriteria(datasetProfileAutocompleteRequest.getCriteria()); - List datasetProfiles = items.toList().stream().map(item -> new DatasetProfileAutocompleteItem().fromDataModel(item)).collect(Collectors.toList()); + List datasetProfiles = items.select(item -> new DatasetProfileAutocompleteItem().fromDataModel(item)); return datasetProfiles; } public static DataTableData getPaged(ApiContext apiContext, DatasetProfileTableRequestItem datasetProfileTableRequestItem) throws Exception { QueryableList items = apiContext.getDatabaseRepository().getDatasetProfileDao().getWithCriteria(datasetProfileTableRequestItem.getCriteria()); QueryableList pagedItems = PaginationManager.applyPaging(items, datasetProfileTableRequestItem); - List datasetProfiles = pagedItems.toList().stream().map(item -> new DatasetProfileListingModel().fromDataModel(item)).collect(Collectors.toList()); + List datasetProfiles = pagedItems.select(item -> new DatasetProfileListingModel().fromDataModel(item)); return apiContext.getBuilderFactory().getBuilder(DataTableDataBuilder.class).data(datasetProfiles).totalCount(items.count()).build(); } public static List getAll(DatasetProfileDao datasetProfileRepository) throws IllegalAccessException, InstantiationException { QueryableList items = datasetProfileRepository.getAll(); - List datasetProfiles = items.toList().stream().map(item -> new DatasetProfileListingModel().fromDataModel(item)).collect(Collectors.toList()); + List datasetProfiles = items.select(item -> new DatasetProfileListingModel().fromDataModel(item)); return datasetProfiles; } } diff --git a/dmp-backend/src/main/java/eu/eudat/managers/DatasetWizardManager.java b/dmp-backend/src/main/java/eu/eudat/managers/DatasetWizardManager.java index 864e12869..40cb2cb7e 100644 --- a/dmp-backend/src/main/java/eu/eudat/managers/DatasetWizardManager.java +++ b/dmp-backend/src/main/java/eu/eudat/managers/DatasetWizardManager.java @@ -22,7 +22,7 @@ public class DatasetWizardManager { UserInfo userInfo = new UserInfo(); userInfo.setId(principal.getId()); QueryableList items = dmpRepository.getUserDmps(datasetWizardAutocompleteRequest, userInfo); - List dataManagementPlans = items.toList().stream().map(item -> new DataManagentPlanListingModel().fromDataModel(item)).collect(Collectors.toList()); + List dataManagementPlans = items.select(item -> new DataManagentPlanListingModel().fromDataModel(item)); return dataManagementPlans; } diff --git a/dmp-backend/src/main/java/eu/eudat/managers/ExternalDatasetManager.java b/dmp-backend/src/main/java/eu/eudat/managers/ExternalDatasetManager.java index d9b62ed1c..c146680af 100644 --- a/dmp-backend/src/main/java/eu/eudat/managers/ExternalDatasetManager.java +++ b/dmp-backend/src/main/java/eu/eudat/managers/ExternalDatasetManager.java @@ -24,14 +24,14 @@ public class ExternalDatasetManager { public DataTableData getPaged(ApiContext apiContext, ExternalDatasetTableRequest externalDatasetTableRequest) throws Exception { QueryableList items = apiContext.getDatabaseRepository().getExternalDatasetDao().getWithCriteria(externalDatasetTableRequest.getCriteria()); QueryableList pagedItems = PaginationManager.applyPaging(items, externalDatasetTableRequest); - List externalDatasetListingmodels = pagedItems.toList().stream().map(item -> new ExternalDatasetListingModel().fromDataModel(item)).collect(Collectors.toList()); + List externalDatasetListingmodels = pagedItems.select(item -> new ExternalDatasetListingModel().fromDataModel(item)); return apiContext.getBuilderFactory().getBuilder(DataTableDataBuilder.class).data(externalDatasetListingmodels).totalCount(items.count()).build(); } public List getWithExternal(ApiContext apiContext, String query, RemoteFetcher remoteFetcher) throws HugeResultSet, NoURLFound, InstantiationException, IllegalAccessException { ExternalDatasetCriteria criteria = apiContext.getBuilderFactory().getBuilder(ExternalDatasetCriteriaBuilder.class).like(query).build(); QueryableList items = apiContext.getDatabaseRepository().getExternalDatasetDao().getWithCriteria(criteria); - List externalDatasets = items.toList().stream().map(item -> new ExternalDatasetListingModel().fromDataModel(item)).collect(Collectors.toList()); + List externalDatasets = items.select(item -> new ExternalDatasetListingModel().fromDataModel(item)); return externalDatasets; } diff --git a/dmp-backend/src/main/java/eu/eudat/managers/InvitationsManager.java b/dmp-backend/src/main/java/eu/eudat/managers/InvitationsManager.java index e628ceaeb..351da67ba 100644 --- a/dmp-backend/src/main/java/eu/eudat/managers/InvitationsManager.java +++ b/dmp-backend/src/main/java/eu/eudat/managers/InvitationsManager.java @@ -29,7 +29,7 @@ public class InvitationsManager { public static List getUsers(ApiContext apiContext, UserInfoRequestItem userInfoRequestItem) throws InstantiationException, IllegalAccessException { QueryableList users = apiContext.getDatabaseRepository().getUserInfoDao().getWithCriteria(userInfoRequestItem.getCriteria()); - List userModels = users.toList().stream().map(item -> new UserInfoInvitationModel().fromDataModel(item)).collect(Collectors.toList()); + List userModels = users.select(item -> new UserInfoInvitationModel().fromDataModel(item)); return userModels; } diff --git a/dmp-backend/src/main/java/eu/eudat/managers/ProjectManager.java b/dmp-backend/src/main/java/eu/eudat/managers/ProjectManager.java index 15e11c098..ef2b3d508 100644 --- a/dmp-backend/src/main/java/eu/eudat/managers/ProjectManager.java +++ b/dmp-backend/src/main/java/eu/eudat/managers/ProjectManager.java @@ -32,9 +32,8 @@ public class ProjectManager { QueryableList pagedItems = PaginationManager.applyPaging(items, projectTableRequest); DataTableData dataTable = new DataTableData(); - CompletableFuture projectsFuture = pagedItems.withHint(HintedModelFactory.getHint(ProjectListingModel.class)).toListAsync().whenComplete((results, throwable) -> { - List projects = results.stream().map(item -> new ProjectListingModel().fromDataModel(item)).collect(Collectors.toList()); - dataTable.setData(projects); + CompletableFuture projectsFuture = pagedItems.withHint(HintedModelFactory.getHint(ProjectListingModel.class)).selectAsync(item -> new ProjectListingModel().fromDataModel(item)).whenComplete((results, throwable) -> { + dataTable.setData(results); }); CompletableFuture countFuture = pagedItems.countAsync().whenComplete((count, throwable) -> dataTable.setTotalCount(count)); @@ -58,7 +57,7 @@ public class ProjectManager { public List getCriteriaWithExternal(ApiContext apiContext, ProjectCriteriaRequest projectCriteria, RemoteFetcher remoteFetcher) throws IllegalAccessException, InstantiationException, HugeResultSet, NoURLFound { QueryableList items = apiContext.getDatabaseRepository().getProjectDao().getWithCriteria(projectCriteria.getCriteria()); - List projects = items.toList().stream().map(item -> new Project().fromDataModel(item)).collect(Collectors.toList()); + 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) { @@ -76,7 +75,7 @@ public class ProjectManager { public List getCriteria(ProjectDao projectRepository, ProjectCriteriaRequest projectCriteria, RemoteFetcher remoteFetcher) throws IllegalAccessException, InstantiationException, HugeResultSet, NoURLFound { QueryableList items = projectRepository.getWithCriteria(projectCriteria.getCriteria()); - List projects = items.toList().stream().map(item -> new Project().fromDataModel(item)).collect(Collectors.toList()); + List projects = items.select(item -> new Project().fromDataModel(item)); return projects; } diff --git a/dmp-backend/src/main/java/eu/eudat/managers/UserManager.java b/dmp-backend/src/main/java/eu/eudat/managers/UserManager.java index b84c9dba4..c4eb0aaab 100644 --- a/dmp-backend/src/main/java/eu/eudat/managers/UserManager.java +++ b/dmp-backend/src/main/java/eu/eudat/managers/UserManager.java @@ -35,7 +35,7 @@ public class UserManager { QueryableList users = apiContext.getDatabaseRepository().getUserInfoDao().getWithCriteria(userInfoTableRequestItem.getCriteria()); QueryableList pagedUsers = PaginationManager.applyPaging(users, userInfoTableRequestItem); - List modelUsers = pagedUsers.toList().stream().map(item -> new UserListingModel().fromDataModel(item)).collect(Collectors.toList()); + List modelUsers = pagedUsers.select(item -> new UserListingModel().fromDataModel(item)); return apiContext.getBuilderFactory().getBuilder(DataTableDataBuilder.class).totalCount(users.count()).data(modelUsers).build(); } diff --git a/dmp-backend/src/main/java/eu/eudat/queryable/QueryableList.java b/dmp-backend/src/main/java/eu/eudat/queryable/QueryableList.java index 054c6ad6b..60e633d2e 100644 --- a/dmp-backend/src/main/java/eu/eudat/queryable/QueryableList.java +++ b/dmp-backend/src/main/java/eu/eudat/queryable/QueryableList.java @@ -18,6 +18,8 @@ public interface QueryableList { List select(SelectPredicate predicate); + CompletableFuture> selectAsync(SelectPredicate predicate); + List toList(); CompletableFuture> toListAsync(); diff --git a/dmp-backend/src/main/java/eu/eudat/queryable/hibernatequeryablelist/QueryableHibernateList.java b/dmp-backend/src/main/java/eu/eudat/queryable/hibernatequeryablelist/QueryableHibernateList.java index c09a986a8..34608de0b 100644 --- a/dmp-backend/src/main/java/eu/eudat/queryable/hibernatequeryablelist/QueryableHibernateList.java +++ b/dmp-backend/src/main/java/eu/eudat/queryable/hibernatequeryablelist/QueryableHibernateList.java @@ -24,9 +24,9 @@ import java.util.stream.Collectors; public class QueryableHibernateList implements QueryableList { private EntityManager manager; - private CriteriaQuery query; + private CriteriaQuery query; private Class tClass; - private Root root; + private Root root; private Root nestedQueryRoot; private Subquery subquery; private List> singlePredicates = new LinkedList<>(); @@ -61,7 +61,7 @@ public class QueryableHibernateList implements QueryableLi public QueryableHibernateList setEntity(Class type) { CriteriaBuilder builder = this.manager.getCriteriaBuilder(); - this.query = builder.createTupleQuery(); + this.query = builder.createQuery(type); this.root = this.query.from(this.tClass); return this; } @@ -94,12 +94,11 @@ public class QueryableHibernateList implements QueryableLi } public List select(SelectPredicate predicate) { - List list = this.toList(); - List newlist = new LinkedList(); - for (T item : list) { - newlist.add(predicate.applySelection(item)); - } - return newlist; + return this.toList().stream().map(item -> predicate.applySelection(item)).collect(Collectors.toList()); + } + + public CompletableFuture> selectAsync(SelectPredicate predicate) { + return this.toListAsync().thenApplyAsync(items-> items.stream().map(item -> predicate.applySelection(item)).collect(Collectors.toList())); } public QueryableList distinct() { diff --git a/dmp-frontend/src/environments/environment.ts b/dmp-frontend/src/environments/environment.ts index d8975f998..3751110b8 100644 --- a/dmp-frontend/src/environments/environment.ts +++ b/dmp-frontend/src/environments/environment.ts @@ -5,6 +5,6 @@ export const environment = { production: false, - Server: 'http://192.168.32.64:8080/api/', + Server: 'http://devel-21.local.cite.gr:8080/api/', App: 'localhost:4200/' }; From 49487371426c3d5cbe50fdc08e53c8ff7f3890d2 Mon Sep 17 00:00:00 2001 From: Ioannis Kalyvas Date: Fri, 23 Feb 2018 12:36:51 +0200 Subject: [PATCH 3/3] no message --- .../builders/entity/CredentialBuilder.java | 8 ++ .../main/java/eu/eudat/controllers/Login.java | 19 ++++- .../java/eu/eudat/entities/Credential.java | 16 ++++ .../eu/eudat/managers/PaginationManager.java | 3 + .../loginprovider/LoginProviderUser.java | 9 +++ .../eu/eudat/queryable/QueryableList.java | 2 + .../QueryableHibernateList.java | 25 ++++-- .../B2AccessCustomProvider.java | 12 +++ .../B2AccessCustomProviderImpl.java | 80 +++++++++++++++++++ .../customproviders/B2AccessUser.java | 34 ++++++++ .../validators/TokenValidatorFactoryImpl.java | 12 ++- .../b2access/B2AccessTokenValidator.java | 54 +++++++++++++ .../b2access/helpers/B2AccessRequest.java | 16 ++++ .../helpers/B2AccessResponseToken.java | 16 ++++ .../facebook/FacebookTokenValidator.java | 1 + .../google/GoogleTokenValidator.java | 2 +- .../linkedin/LinkedInTokenValidator.java | 1 + .../twitter/TwitterTokenValidator.java | 1 + .../eudat/services/AuthenticationService.java | 11 ++- .../src/main/resources/application.properties | 8 +- dmp-frontend/src/app/app-routing.module.ts | 4 +- dmp-frontend/src/app/app.module.ts | 16 +++- .../src/app/models/login/LoginInfo.ts | 6 +- .../navigation/navigation.component.html | 41 +++++----- .../b2access/b2access-login.component.html | 0 .../b2access/b2access-login.component.ts | 26 ++++++ .../login/login.component.html | 10 ++- .../user-management/login/login.component.ts | 9 +++ .../user-management/utilties/LoginOptions.ts | 3 +- .../utilties/LoginProviderConfiguration.ts | 7 ++ .../utilties/LoginServiceConfiguration.ts | 2 + .../user-management/utilties/login-service.ts | 26 ++++++ dmp-frontend/src/index.html | 6 +- 33 files changed, 444 insertions(+), 42 deletions(-) create mode 100644 dmp-backend/src/main/java/eu/eudat/security/customproviders/B2AccessCustomProvider.java create mode 100644 dmp-backend/src/main/java/eu/eudat/security/customproviders/B2AccessCustomProviderImpl.java create mode 100644 dmp-backend/src/main/java/eu/eudat/security/customproviders/B2AccessUser.java create mode 100644 dmp-backend/src/main/java/eu/eudat/security/validators/b2access/B2AccessTokenValidator.java create mode 100644 dmp-backend/src/main/java/eu/eudat/security/validators/b2access/helpers/B2AccessRequest.java create mode 100644 dmp-backend/src/main/java/eu/eudat/security/validators/b2access/helpers/B2AccessResponseToken.java create mode 100644 dmp-frontend/src/app/user-management/login/b2access/b2access-login.component.html create mode 100644 dmp-frontend/src/app/user-management/login/b2access/b2access-login.component.ts diff --git a/dmp-backend/src/main/java/eu/eudat/builders/entity/CredentialBuilder.java b/dmp-backend/src/main/java/eu/eudat/builders/entity/CredentialBuilder.java index 28f83d454..b15c8d56e 100644 --- a/dmp-backend/src/main/java/eu/eudat/builders/entity/CredentialBuilder.java +++ b/dmp-backend/src/main/java/eu/eudat/builders/entity/CredentialBuilder.java @@ -28,6 +28,8 @@ public class CredentialBuilder extends Builder { private Date lastUpdateTime; + private String externalId; + public CredentialBuilder id(UUID id) { this.id = id; return this; @@ -68,6 +70,11 @@ public class CredentialBuilder extends Builder { return this; } + public CredentialBuilder externalId(String externalId) { + this.externalId = externalId; + return this; + } + public Credential build() { Credential credential = new Credential(); credential.setStatus(status); @@ -78,6 +85,7 @@ public class CredentialBuilder extends Builder { credential.setPublicValue(publicValue); credential.setUserInfo(userInfo); credential.setId(id); + credential.setExternalId(externalId); return credential; } } diff --git a/dmp-backend/src/main/java/eu/eudat/controllers/Login.java b/dmp-backend/src/main/java/eu/eudat/controllers/Login.java index fa8596799..e40c65a11 100644 --- a/dmp-backend/src/main/java/eu/eudat/controllers/Login.java +++ b/dmp-backend/src/main/java/eu/eudat/controllers/Login.java @@ -7,6 +7,9 @@ import eu.eudat.models.login.Credentials; import eu.eudat.models.login.LoginInfo; import eu.eudat.models.security.Principal; import eu.eudat.security.CustomAuthenticationProvider; +import eu.eudat.security.validators.b2access.B2AccessTokenValidator; +import eu.eudat.security.validators.b2access.helpers.B2AccessRequest; +import eu.eudat.security.validators.b2access.helpers.B2AccessResponseToken; import eu.eudat.security.validators.twitter.TwitterTokenValidator; import eu.eudat.services.AuthenticationService; import eu.eudat.types.ApiMessageCode; @@ -30,11 +33,14 @@ public class Login { private TwitterTokenValidator twitterTokenValidator; + private B2AccessTokenValidator b2AccessTokenValidator; + @Autowired - public Login(CustomAuthenticationProvider customAuthenticationProvider, AuthenticationService authenticationService, TwitterTokenValidator twitterTokenValidator) { + public Login(CustomAuthenticationProvider customAuthenticationProvider, AuthenticationService authenticationService, TwitterTokenValidator twitterTokenValidator, B2AccessTokenValidator b2AccessTokenValidator) { this.customAuthenticationProvider = customAuthenticationProvider; this.authenticationService = authenticationService; this.twitterTokenValidator = twitterTokenValidator; + this.b2AccessTokenValidator = b2AccessTokenValidator; } @Transactional @@ -76,6 +82,17 @@ public class Login { } } + @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())); + } + } + @RequestMapping(method = RequestMethod.POST, value = {"/me"}, consumes = "application/json", produces = "application/json") public @ResponseBody ResponseEntity> authMe(Principal principal) { diff --git a/dmp-backend/src/main/java/eu/eudat/entities/Credential.java b/dmp-backend/src/main/java/eu/eudat/entities/Credential.java index 254ce8188..070d39cb0 100644 --- a/dmp-backend/src/main/java/eu/eudat/entities/Credential.java +++ b/dmp-backend/src/main/java/eu/eudat/entities/Credential.java @@ -7,6 +7,11 @@ import java.util.UUID; @Entity @Table(name = "\"Credential\"") +@NamedEntityGraphs({ + @NamedEntityGraph( + name = "credentialUserInfo", + attributeNodes = {@NamedAttributeNode("userInfo")}) +}) public class Credential implements DataEntity { @Id @@ -31,6 +36,9 @@ public class Credential implements DataEntity { @Column(name = "\"LastUpdateTime\"", nullable = false) private Date lastUpdateTime; + @Column(name = "\"ExternalId\"", nullable = false) + private String externalId; + public UUID getId() { return id; } @@ -95,6 +103,14 @@ public class Credential implements DataEntity { this.lastUpdateTime = lastUpdateTime; } + public String getExternalId() { + return externalId; + } + + public void setExternalId(String externalId) { + this.externalId = externalId; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/dmp-backend/src/main/java/eu/eudat/managers/PaginationManager.java b/dmp-backend/src/main/java/eu/eudat/managers/PaginationManager.java index 6473fc8b9..d7bce76ac 100644 --- a/dmp-backend/src/main/java/eu/eudat/managers/PaginationManager.java +++ b/dmp-backend/src/main/java/eu/eudat/managers/PaginationManager.java @@ -6,6 +6,7 @@ import eu.eudat.models.helpers.common.Ordering; import eu.eudat.models.helpers.requests.TableRequest; import eu.eudat.queryable.QueryableList; +import java.util.Arrays; import java.util.Collection; public class PaginationManager { @@ -14,6 +15,8 @@ public class PaginationManager { if (tableRequest.getOrderings() != null) applyOrder(items, tableRequest); if (tableRequest.getLength() != null) items.take(tableRequest.getLength()); if (tableRequest.getOffset() != null) items.skip(tableRequest.getOffset()); + if (tableRequest.getSelection() != null && tableRequest.getSelection().getFields() != null && tableRequest.getSelection().getFields().length > 0) + items.withFields(Arrays.asList(tableRequest.getSelection().getFields())); return items; } diff --git a/dmp-backend/src/main/java/eu/eudat/models/loginprovider/LoginProviderUser.java b/dmp-backend/src/main/java/eu/eudat/models/loginprovider/LoginProviderUser.java index ded6cebf7..61434530a 100644 --- a/dmp-backend/src/main/java/eu/eudat/models/loginprovider/LoginProviderUser.java +++ b/dmp-backend/src/main/java/eu/eudat/models/loginprovider/LoginProviderUser.java @@ -5,11 +5,20 @@ import eu.eudat.security.validators.TokenValidatorFactoryImpl; public class LoginProviderUser { private String name; + private String id; private String email; private String secret; private boolean isVerified; private TokenValidatorFactoryImpl.LoginProvider provider; + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + public String getName() { return name; } diff --git a/dmp-backend/src/main/java/eu/eudat/queryable/QueryableList.java b/dmp-backend/src/main/java/eu/eudat/queryable/QueryableList.java index 60e633d2e..416e1d0ba 100644 --- a/dmp-backend/src/main/java/eu/eudat/queryable/QueryableList.java +++ b/dmp-backend/src/main/java/eu/eudat/queryable/QueryableList.java @@ -22,6 +22,8 @@ public interface QueryableList { List toList(); + QueryableList withFields(List fields); + CompletableFuture> toListAsync(); T getSingle(); diff --git a/dmp-backend/src/main/java/eu/eudat/queryable/hibernatequeryablelist/QueryableHibernateList.java b/dmp-backend/src/main/java/eu/eudat/queryable/hibernatequeryablelist/QueryableHibernateList.java index 34608de0b..d0b56eb64 100644 --- a/dmp-backend/src/main/java/eu/eudat/queryable/hibernatequeryablelist/QueryableHibernateList.java +++ b/dmp-backend/src/main/java/eu/eudat/queryable/hibernatequeryablelist/QueryableHibernateList.java @@ -33,7 +33,7 @@ public class QueryableHibernateList implements QueryableLi private List> nestedPredicates = new LinkedList<>(); private List> orderings = new LinkedList<>(); - private List fields = new LinkedList<>(); + private List fields = new LinkedList<>(); private Integer length; private Integer offset; private Set hints; @@ -59,6 +59,18 @@ public class QueryableHibernateList implements QueryableLi 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; + } + public QueryableHibernateList setEntity(Class type) { CriteriaBuilder builder = this.manager.getCriteriaBuilder(); this.query = builder.createQuery(type); @@ -98,7 +110,7 @@ public class QueryableHibernateList implements QueryableLi } public CompletableFuture> selectAsync(SelectPredicate predicate) { - return this.toListAsync().thenApplyAsync(items-> items.stream().map(item -> predicate.applySelection(item)).collect(Collectors.toList())); + return this.toListAsync().thenApplyAsync(items -> items.stream().map(item -> predicate.applySelection(item)).collect(Collectors.toList())); } public QueryableList distinct() { @@ -162,9 +174,9 @@ public class QueryableHibernateList implements QueryableLi } 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(); TypedQuery typedQuery = this.manager.createQuery(this.query); if (this.offset != null) typedQuery.setFirstResult(this.offset); if (this.length != null) typedQuery.setMaxResults(this.length); @@ -178,6 +190,7 @@ public class QueryableHibernateList implements QueryableLi 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(); TypedQuery typedQuery = this.manager.createQuery(this.query); if (this.offset != null) typedQuery.setFirstResult(this.offset); if (this.length != null) typedQuery.setMaxResults(this.length); @@ -192,6 +205,7 @@ public class QueryableHibernateList implements QueryableLi 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)); @@ -200,6 +214,7 @@ public class QueryableHibernateList implements QueryableLi 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)); @@ -208,7 +223,7 @@ public class QueryableHibernateList implements QueryableLi 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)); @@ -220,7 +235,7 @@ public class QueryableHibernateList implements QueryableLi 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)); diff --git a/dmp-backend/src/main/java/eu/eudat/security/customproviders/B2AccessCustomProvider.java b/dmp-backend/src/main/java/eu/eudat/security/customproviders/B2AccessCustomProvider.java new file mode 100644 index 000000000..2d35b1336 --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/security/customproviders/B2AccessCustomProvider.java @@ -0,0 +1,12 @@ +package eu.eudat.security.customproviders; + +import eu.eudat.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/src/main/java/eu/eudat/security/customproviders/B2AccessCustomProviderImpl.java b/dmp-backend/src/main/java/eu/eudat/security/customproviders/B2AccessCustomProviderImpl.java new file mode 100644 index 000000000..4c3880d13 --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/security/customproviders/B2AccessCustomProviderImpl.java @@ -0,0 +1,80 @@ +package eu.eudat.security.customproviders; + +import com.google.api.client.repackaged.org.apache.commons.codec.binary.Base64; +import eu.eudat.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/src/main/java/eu/eudat/security/customproviders/B2AccessUser.java b/dmp-backend/src/main/java/eu/eudat/security/customproviders/B2AccessUser.java new file mode 100644 index 000000000..4b8d23ece --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/security/customproviders/B2AccessUser.java @@ -0,0 +1,34 @@ +package eu.eudat.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/src/main/java/eu/eudat/security/validators/TokenValidatorFactoryImpl.java b/dmp-backend/src/main/java/eu/eudat/security/validators/TokenValidatorFactoryImpl.java index e147957ff..0904f5e82 100644 --- a/dmp-backend/src/main/java/eu/eudat/security/validators/TokenValidatorFactoryImpl.java +++ b/dmp-backend/src/main/java/eu/eudat/security/validators/TokenValidatorFactoryImpl.java @@ -1,5 +1,6 @@ package eu.eudat.security.validators; +import eu.eudat.security.validators.b2access.B2AccessTokenValidator; import eu.eudat.security.validators.facebook.FacebookTokenValidator; import eu.eudat.security.validators.google.GoogleTokenValidator; import eu.eudat.security.validators.linkedin.LinkedInTokenValidator; @@ -11,7 +12,7 @@ import org.springframework.stereotype.Service; @Service("tokenValidatorFactory") public class TokenValidatorFactoryImpl implements TokenValidatorFactory { public enum LoginProvider { - GOOGLE((short) 1), FACEBOOK((short) 2), TWITTER((short) 3), LINKEDIN((short) 4), NATIVELOGIN((short) 5); + GOOGLE((short) 1), FACEBOOK((short) 2), TWITTER((short) 3), LINKEDIN((short) 4), NATIVELOGIN((short) 5), B2_ACCESS((short) 6); private short value; @@ -35,6 +36,8 @@ public class TokenValidatorFactoryImpl implements TokenValidatorFactory { return LINKEDIN; case 5: return NATIVELOGIN; + case 6: + return B2_ACCESS; default: throw new RuntimeException("Unsupported LoginProvider"); } @@ -45,13 +48,16 @@ public class TokenValidatorFactoryImpl implements TokenValidatorFactory { private FacebookTokenValidator facebookTokenValidator; private LinkedInTokenValidator linkedInTokenValidator; private TwitterTokenValidator twitterTokenValidator; + private B2AccessTokenValidator b2AccessTokenValidator; @Autowired - public TokenValidatorFactoryImpl(GoogleTokenValidator googleTokenValidator, FacebookTokenValidator facebookTokenValidator, LinkedInTokenValidator linkedInTokenValidator, TwitterTokenValidator twitterTokenValidator) { + 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 TokenValidator getProvider(LoginProvider provider) { @@ -64,6 +70,8 @@ public class TokenValidatorFactoryImpl implements TokenValidatorFactory { return this.linkedInTokenValidator; case TWITTER: return this.twitterTokenValidator; + case B2_ACCESS: + return this.b2AccessTokenValidator; default: throw new RuntimeException("Login Provider Not Implemented"); } diff --git a/dmp-backend/src/main/java/eu/eudat/security/validators/b2access/B2AccessTokenValidator.java b/dmp-backend/src/main/java/eu/eudat/security/validators/b2access/B2AccessTokenValidator.java new file mode 100644 index 000000000..04660739b --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/security/validators/b2access/B2AccessTokenValidator.java @@ -0,0 +1,54 @@ +package eu.eudat.security.validators.b2access; + +import eu.eudat.exceptions.security.NonValidTokenException; +import eu.eudat.models.login.LoginInfo; +import eu.eudat.models.loginprovider.LoginProviderUser; +import eu.eudat.models.security.Principal; +import eu.eudat.security.customproviders.B2AccessCustomProvider; +import eu.eudat.security.customproviders.B2AccessUser; +import eu.eudat.security.validators.TokenValidator; +import eu.eudat.security.validators.b2access.helpers.B2AccessRequest; +import eu.eudat.security.validators.b2access.helpers.B2AccessResponseToken; +import eu.eudat.services.AuthenticationService; +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; + +/** + * Created by ikalyvas on 2/22/2018. + */ +@Component("b2AccessTokenValidator ") +public class B2AccessTokenValidator implements TokenValidator { + + private B2AccessCustomProvider b2AccessCustomProvider; + private AuthenticationService authenticationService; + private Environment environment; + + @Autowired + public B2AccessTokenValidator(AuthenticationService authenticationService, Environment environment, B2AccessCustomProvider b2AccessCustomProvider) { + this.authenticationService = authenticationService; + this.environment = environment; + this.b2AccessCustomProvider = b2AccessCustomProvider; + } + + @Override + public Principal validateToken(LoginInfo credentials) throws NonValidTokenException, IOException, GeneralSecurityException { + B2AccessUser b2AccessUser = this.b2AccessCustomProvider.getUser(credentials.getTicket()); + LoginProviderUser user = new LoginProviderUser(); + user.setId(b2AccessUser.getId()); + user.setEmail(b2AccessUser.getEmail()); + user.setName(b2AccessUser.getName()); + user.setProvider(credentials.getProvider()); + user.setSecret(credentials.getTicket()); + return this.authenticationService.Touch(user); + } + + public B2AccessResponseToken getAccessToken(B2AccessRequest b2AccessRequest) { + return this.b2AccessCustomProvider.getAccessToken(b2AccessRequest.getCode(), this.environment.getProperty("b2access.externallogin.redirect_uri") + , this.environment.getProperty("b2access.externallogin.clientid") + , this.environment.getProperty("b2access.externallogin.clientSecret")); + } +} diff --git a/dmp-backend/src/main/java/eu/eudat/security/validators/b2access/helpers/B2AccessRequest.java b/dmp-backend/src/main/java/eu/eudat/security/validators/b2access/helpers/B2AccessRequest.java new file mode 100644 index 000000000..85a5947d3 --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/security/validators/b2access/helpers/B2AccessRequest.java @@ -0,0 +1,16 @@ +package eu.eudat.security.validators.b2access.helpers; + +/** + * Created by ikalyvas on 2/22/2018. + */ +public class B2AccessRequest { + private String code; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } +} diff --git a/dmp-backend/src/main/java/eu/eudat/security/validators/b2access/helpers/B2AccessResponseToken.java b/dmp-backend/src/main/java/eu/eudat/security/validators/b2access/helpers/B2AccessResponseToken.java new file mode 100644 index 000000000..16d042f15 --- /dev/null +++ b/dmp-backend/src/main/java/eu/eudat/security/validators/b2access/helpers/B2AccessResponseToken.java @@ -0,0 +1,16 @@ +package eu.eudat.security.validators.b2access.helpers; + +/** + * Created by ikalyvas on 2/22/2018. + */ +public class B2AccessResponseToken { + private String accessToken; + + public String getAccessToken() { + return accessToken; + } + + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } +} diff --git a/dmp-backend/src/main/java/eu/eudat/security/validators/facebook/FacebookTokenValidator.java b/dmp-backend/src/main/java/eu/eudat/security/validators/facebook/FacebookTokenValidator.java index a72e5be01..50679406f 100644 --- a/dmp-backend/src/main/java/eu/eudat/security/validators/facebook/FacebookTokenValidator.java +++ b/dmp-backend/src/main/java/eu/eudat/security/validators/facebook/FacebookTokenValidator.java @@ -44,6 +44,7 @@ public class FacebookTokenValidator implements TokenValidator { 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); diff --git a/dmp-backend/src/main/java/eu/eudat/security/validators/google/GoogleTokenValidator.java b/dmp-backend/src/main/java/eu/eudat/security/validators/google/GoogleTokenValidator.java index 0cacc37bc..66c62f99c 100644 --- a/dmp-backend/src/main/java/eu/eudat/security/validators/google/GoogleTokenValidator.java +++ b/dmp-backend/src/main/java/eu/eudat/security/validators/google/GoogleTokenValidator.java @@ -47,11 +47,11 @@ public class GoogleTokenValidator implements TokenValidator { @Override public eu.eudat.models.security.Principal validateToken(LoginInfo credentials) throws NonValidTokenException, IOException, GeneralSecurityException { - GoogleIdToken idToken = this.verifyUserAndGetUser(credentials.getTicket()); Payload payload = idToken.getPayload(); LoginProviderUser user = new LoginProviderUser(); user.setSecret(credentials.getTicket()); + user.setId( payload.getSubject()); user.setProvider(TokenValidatorFactoryImpl.LoginProvider.GOOGLE); user.setName((String) payload.get("name")); user.setEmail(payload.getEmail()); diff --git a/dmp-backend/src/main/java/eu/eudat/security/validators/linkedin/LinkedInTokenValidator.java b/dmp-backend/src/main/java/eu/eudat/security/validators/linkedin/LinkedInTokenValidator.java index 25ff2f00a..7dbd38c76 100644 --- a/dmp-backend/src/main/java/eu/eudat/security/validators/linkedin/LinkedInTokenValidator.java +++ b/dmp-backend/src/main/java/eu/eudat/security/validators/linkedin/LinkedInTokenValidator.java @@ -47,6 +47,7 @@ public class LinkedInTokenValidator implements TokenValidator { if (linkedInProfile.getEmailAddress() == null) throw new UnauthorisedException("Cannot login user.LinkedIn account did not provide email"); user.setEmail(linkedInProfile.getEmailAddress()); + user.setId(linkedInProfile.getId()); user.setIsVerified(true); //TODO user.setName(linkedInProfile.getFirstName() + " " + linkedInProfile.getLastName()); user.setProvider(TokenValidatorFactoryImpl.LoginProvider.LINKEDIN); diff --git a/dmp-backend/src/main/java/eu/eudat/security/validators/twitter/TwitterTokenValidator.java b/dmp-backend/src/main/java/eu/eudat/security/validators/twitter/TwitterTokenValidator.java index b7cd51d0d..c643aa205 100644 --- a/dmp-backend/src/main/java/eu/eudat/security/validators/twitter/TwitterTokenValidator.java +++ b/dmp-backend/src/main/java/eu/eudat/security/validators/twitter/TwitterTokenValidator.java @@ -54,6 +54,7 @@ public class TwitterTokenValidator implements TokenValidator { throw new UnauthorisedException("Cannot login user.Twitter account did not provide email"); user.setEmail((String) values.get("email")); user.setIsVerified(true); //TODO + user.setId(""+profile.getId()); user.setName(profile.getName()); user.setProvider(TokenValidatorFactoryImpl.LoginProvider.TWITTER); user.setSecret(finalOauthToken.getValue()); diff --git a/dmp-backend/src/main/java/eu/eudat/services/AuthenticationService.java b/dmp-backend/src/main/java/eu/eudat/services/AuthenticationService.java index c31aa16ff..06f8598ea 100644 --- a/dmp-backend/src/main/java/eu/eudat/services/AuthenticationService.java +++ b/dmp-backend/src/main/java/eu/eudat/services/AuthenticationService.java @@ -91,12 +91,21 @@ public class AuthenticationService { public Principal Touch(LoginProviderUser profile) { UserInfoCriteria criteria = new UserInfoCriteria(); criteria.setEmail(profile.getEmail()); + UserInfo userInfo = apiContext.getDatabaseRepository().getUserInfoDao().asQueryable().withHint("userInfo").where((builder, root) -> builder.equal(root.get("email"), profile.getEmail())).getSingleOrDefault(); + if(userInfo == null){ + Optional optionalCredential = Optional.ofNullable(apiContext.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.getBuilderFactory().getBuilder(CredentialBuilder.class) .id(UUID.randomUUID()).creationTime(new Date()).status(1) .lastUpdateTime(new Date()).provider((int) profile.getProvider().getValue()) - .secret(profile.getSecret()) + .secret(profile.getSecret()).externalId(profile.getId()) .build(); if (userInfo == null) { diff --git a/dmp-backend/src/main/resources/application.properties b/dmp-backend/src/main/resources/application.properties index 61bbe6dd2..df8f7db46 100644 --- a/dmp-backend/src/main/resources/application.properties +++ b/dmp-backend/src/main/resources/application.properties @@ -49,4 +49,10 @@ spring.profiles.active=devel ########################Persistence/Hibernate/Connection pool#################### autouser.root.email=root@dmp.com autouser.root.password=root -autouser.root.username=root \ No newline at end of file +autouser.root.username=root +################################################################################# +b2access.externallogin.user_info_url = https://unity.eudat-aai.fz-juelich.de:443/oauth2/userinfo +b2access.externallogin.access_token_url = https://unity.eudat-aai.fz-juelich.de:443/oauth2/token +b2access.externallogin.redirect_uri = http://dmp.eudat.org:4200/api/oauth/authorized/b2access +b2access.externallogin.clientid = eudatdmptool +b2access.externallogin.clientSecret = A3b*1*92 \ No newline at end of file diff --git a/dmp-frontend/src/app/app-routing.module.ts b/dmp-frontend/src/app/app-routing.module.ts index 1cfc342eb..2c15fc190 100644 --- a/dmp-frontend/src/app/app-routing.module.ts +++ b/dmp-frontend/src/app/app-routing.module.ts @@ -6,6 +6,7 @@ import { HomepageComponent } from './homepage/homepage.component'; import { AuthGuard } from './guards/auth.guard'; import { LoginComponent } from './user-management/login/login.component'; import { WelcomepageComponent } from '@app/welcomepage/welcomepage.component'; +import { B2AccessLoginComponent } from './user-management/login/b2access/b2access-login.component'; const appRoutes: Routes = [ { path: 'datasets', loadChildren: './datasets/dataset.module#DatasetModule', canActivate: [AuthGuard] }, @@ -17,7 +18,8 @@ const appRoutes: Routes = [ { path: "unauthorized", loadChildren: './unauthorized/unauthorized.module#UnauthorizedModule' }, { path: "users", loadChildren: './users/users.module#UsersModule' }, { path: "datasetsProfiles", loadChildren: './datasets-admin-listing/dataset-admin.module#DatasetAdminModule' }, - { path: "welcome", component: WelcomepageComponent } + { path: "welcome", component: WelcomepageComponent }, + { path: "api/oauth/authorized/b2access", component: B2AccessLoginComponent } ]; @NgModule({ diff --git a/dmp-frontend/src/app/app.module.ts b/dmp-frontend/src/app/app.module.ts index 1855acec3..1cb7fc964 100644 --- a/dmp-frontend/src/app/app.module.ts +++ b/dmp-frontend/src/app/app.module.ts @@ -33,6 +33,7 @@ import { DatasetProfileModule } from './dataset-profile-form/dataset-profile.mod import { WelcomepageComponent } from '@app/welcomepage/welcomepage.component'; import { HelpContentService } from './services/help-content/help-content.service'; import { HelpContentComponent } from './help-content/help-content.component'; +import { B2AccessLoginComponent } from './user-management/login/b2access/b2access-login.component'; @NgModule({ declarations: [ @@ -40,7 +41,8 @@ import { HelpContentComponent } from './help-content/help-content.component'; PageNotFoundComponent, HomepageComponent, WelcomepageComponent, - HelpContentComponent + HelpContentComponent, + B2AccessLoginComponent ], imports: [ BrowserModule, @@ -53,7 +55,8 @@ import { HelpContentComponent } from './help-content/help-content.component'; LoginOptions.googleOauth, LoginOptions.nativeLogin, LoginOptions.linkedInOauth, - LoginOptions.twitterOauth + LoginOptions.twitterOauth, + LoginOptions.b2Access ], facebookConfiguration: { clientId: "110586756143149" }, googleConfiguration: { clientId: '524432312250-sc9qsmtmbvlv05r44onl6l93ia3k9deo.apps.googleusercontent.com' }, @@ -64,7 +67,14 @@ import { HelpContentComponent } from './help-content/help-content.component'; accessTokenUri: "https://www.linkedin.com/oauth/v2/accessToken", clientSecret: "2OCO9e3wKylW05Tt" }, - twitterConfiguration: { clientId: "HiR4hQH9HNubKC5iKQy0l4mAZ", oauthUrl: "https://api.twitter.com/oauth/authenticate" } + twitterConfiguration: { clientId: "HiR4hQH9HNubKC5iKQy0l4mAZ", oauthUrl: "https://api.twitter.com/oauth/authenticate" }, + b2accessConfiguration: { + clientId: "eudatdmptool", + clientSecret: "A3b*1*92", + oauthUrl: "https://unity.eudat-aai.fz-juelich.de/oauth2-as/oauth2-authz", + redirectUri: "http://dmp.eudat.org:4200/api/oauth/authorized/b2access", + accessTokenUri: "https://unity.eudat-aai.fz-juelich.de:443/oauth2/token" + } }), HttpModule, HttpClientModule, diff --git a/dmp-frontend/src/app/models/login/LoginInfo.ts b/dmp-frontend/src/app/models/login/LoginInfo.ts index 6e18cdf70..8fc2a4114 100644 --- a/dmp-frontend/src/app/models/login/LoginInfo.ts +++ b/dmp-frontend/src/app/models/login/LoginInfo.ts @@ -2,8 +2,10 @@ export enum LoginProviders { Google = 1, Facebook = 2, Twitter = 3, - LinkedIn = 4 -} + LinkedIn = 4, + NativeLogin = 5, + B2Accesss = 6 +} export class LoginInfo { public ticket: string; diff --git a/dmp-frontend/src/app/shared/components/navigation/navigation.component.html b/dmp-frontend/src/app/shared/components/navigation/navigation.component.html index 61cbcb5fd..36bd8c1ce 100644 --- a/dmp-frontend/src/app/shared/components/navigation/navigation.component.html +++ b/dmp-frontend/src/app/shared/components/navigation/navigation.component.html @@ -1,23 +1,22 @@ - {{'NAV-BAR.TITLE' | translate}} -
- - - - - -
- -
- {{this.getPrincipalName()}} - -
- + {{'NAV-BAR.TITLE' | translate}} +
+ + + + + +
+ +
+ {{this.getPrincipalName()}} + +
+ + - -
\ No newline at end of file + + + \ No newline at end of file diff --git a/dmp-frontend/src/app/user-management/login/b2access/b2access-login.component.html b/dmp-frontend/src/app/user-management/login/b2access/b2access-login.component.html new file mode 100644 index 000000000..e69de29bb diff --git a/dmp-frontend/src/app/user-management/login/b2access/b2access-login.component.ts b/dmp-frontend/src/app/user-management/login/b2access/b2access-login.component.ts new file mode 100644 index 000000000..71dc64b9f --- /dev/null +++ b/dmp-frontend/src/app/user-management/login/b2access/b2access-login.component.ts @@ -0,0 +1,26 @@ +import { LoginService } from '../../utilties/login-service'; +import { Component, OnInit } from '@angular/core' +import { Router, ActivatedRoute, Params } from '@angular/router'; + +@Component({ + selector: 'b2access-login', + templateUrl: './b2access-login.component.html', +}) +export class B2AccessLoginComponent implements OnInit { + + constructor( + private router: Router, + private route: ActivatedRoute, + private loginService: LoginService + ) { + + } + + ngOnInit(): void { + this.route.queryParams.subscribe((data: any) => { + if (!data["code"]) this.loginService.b2AccessGetAuthCode() + else this.loginService.b2AccessLogin(data["code"]) + }) + } + +} \ No newline at end of file diff --git a/dmp-frontend/src/app/user-management/login/login.component.html b/dmp-frontend/src/app/user-management/login/login.component.html index 9c7770711..879ec05b8 100644 --- a/dmp-frontend/src/app/user-management/login/login.component.html +++ b/dmp-frontend/src/app/user-management/login/login.component.html @@ -19,6 +19,14 @@ + + +
+
@@ -37,7 +45,7 @@
diff --git a/dmp-frontend/src/app/user-management/login/login.component.ts b/dmp-frontend/src/app/user-management/login/login.component.ts index dcaf945d6..816f4a342 100644 --- a/dmp-frontend/src/app/user-management/login/login.component.ts +++ b/dmp-frontend/src/app/user-management/login/login.component.ts @@ -45,6 +45,11 @@ export class LoginComponent implements OnInit { public nativeLogin() { this.loginService.nativeLogin(this.credential); } + + public b2AccessLogin() { + return this.loginService.b2AccessInitialiseLogin(); + } + public hasFacebookOauth(): boolean { return this.loginService.hasProvider(LoginOptions.facebookOauth); } @@ -65,4 +70,8 @@ export class LoginComponent implements OnInit { return this.loginService.hasProvider(LoginOptions.nativeLogin); } + public hasB2AccessOauth(): boolean { + return this.loginService.hasProvider(LoginOptions.b2Access); + } + } \ No newline at end of file diff --git a/dmp-frontend/src/app/user-management/utilties/LoginOptions.ts b/dmp-frontend/src/app/user-management/utilties/LoginOptions.ts index 51187d8ba..b2a328fc0 100644 --- a/dmp-frontend/src/app/user-management/utilties/LoginOptions.ts +++ b/dmp-frontend/src/app/user-management/utilties/LoginOptions.ts @@ -4,5 +4,6 @@ export enum LoginOptions{ twitterOauth = 3, googleOauth = 4, nativeLogin = 5, - all = 6 + b2Access = 6, + all = 7, } \ No newline at end of file diff --git a/dmp-frontend/src/app/user-management/utilties/LoginProviderConfiguration.ts b/dmp-frontend/src/app/user-management/utilties/LoginProviderConfiguration.ts index 52b67eeb0..38a9f4745 100644 --- a/dmp-frontend/src/app/user-management/utilties/LoginProviderConfiguration.ts +++ b/dmp-frontend/src/app/user-management/utilties/LoginProviderConfiguration.ts @@ -17,4 +17,11 @@ export class LinkedInConfiguration extends LoginProviderConfiguration { public redirectUri: string public accessTokenUri: string public clientSecret: string +} + +export class B2AccessConfiguration extends LoginProviderConfiguration { + public oauthUrl: string + public redirectUri: string + public accessTokenUri: string + public clientSecret: string } \ No newline at end of file diff --git a/dmp-frontend/src/app/user-management/utilties/LoginServiceConfiguration.ts b/dmp-frontend/src/app/user-management/utilties/LoginServiceConfiguration.ts index bb251a8b3..05aaa5e1d 100644 --- a/dmp-frontend/src/app/user-management/utilties/LoginServiceConfiguration.ts +++ b/dmp-frontend/src/app/user-management/utilties/LoginServiceConfiguration.ts @@ -3,6 +3,7 @@ import { GoogleLoginConfiguration, LinkedInConfiguration, TwitterLoginConfiguration, + B2AccessConfiguration, } from './LoginProviderConfiguration'; import { LoginOptions } from './LoginOptions'; export class LoginServiceConfiguration { @@ -11,4 +12,5 @@ export class LoginServiceConfiguration { public googleConfiguration?: GoogleLoginConfiguration; public twitterConfiguration?: TwitterLoginConfiguration; public linkedInConfiguration?: LinkedInConfiguration; + public b2accessConfiguration?: B2AccessConfiguration; } \ No newline at end of file diff --git a/dmp-frontend/src/app/user-management/utilties/login-service.ts b/dmp-frontend/src/app/user-management/utilties/login-service.ts index 9aa4930c2..d1d0cd646 100644 --- a/dmp-frontend/src/app/user-management/utilties/login-service.ts +++ b/dmp-frontend/src/app/user-management/utilties/login-service.ts @@ -56,6 +56,7 @@ export class LoginService { case LoginOptions.googleOauth: return this.hasAllRequiredFieldsConfigured(this.config.googleConfiguration) case LoginOptions.linkedInOauth: return this.hasAllRequiredFieldsConfigured(this.config.linkedInConfiguration); case LoginOptions.twitterOauth: return this.hasAllRequiredFieldsConfigured(this.config.twitterConfiguration); + case LoginOptions.b2Access: return this.hasAllRequiredFieldsConfigured(this.config.b2accessConfiguration); case LoginOptions.nativeLogin: return true; default: throw new Error("Unsupported Provider Type") } @@ -169,6 +170,31 @@ export class LoginService { ) } + /* + * B2ACCESS LOG IN + */ + + public b2AccessInitialiseLogin() { + this.router.navigate(["/api/oauth/authorized/b2access"]) + } + + public b2AccessGetAuthCode() { + window.location.href = this.config.b2accessConfiguration.oauthUrl + "?response_type=code&client_id=" + this.config.b2accessConfiguration.clientId + "&redirect_uri=" + this.config.b2accessConfiguration.redirectUri + "&state=987654321&scope=USER_PROFILE" + } + + public b2AccessLogin(code: String) { + let headers = new HttpHeaders(); + headers = headers.set('Content-Type', 'application/json'); + headers = headers.set('Accept', 'application/json'); + this.httpClient.post(HostConfiguration.Server + "auth/b2AccessRequestToken", { code: code }, { headers: headers }) + .subscribe((data: any) => { + this.authService.login({ ticket: data.payload.accessToken, provider: LoginProviders.B2Accesss, data: null }).subscribe( + res => this.onLogInSuccess(res), + error => this.onLogInError(error) + ) + }) + } + /* * NATIVE LOGIN diff --git a/dmp-frontend/src/index.html b/dmp-frontend/src/index.html index eb9b05831..59c74d02a 100644 --- a/dmp-frontend/src/index.html +++ b/dmp-frontend/src/index.html @@ -2,6 +2,8 @@ + + @@ -12,14 +14,14 @@ - - +