From 03c5c7b8c2b1879c2f97417c5b8c8f071f13ea68 Mon Sep 17 00:00:00 2001 From: sgiannopoulos Date: Wed, 8 May 2024 11:26:50 +0300 Subject: [PATCH] add disable tracking to services --- .../TenantRemovalConsistencyHandler.java | 6 +- .../UserRemovalConsistencyHandler.java | 6 +- .../description/DescriptionServiceImpl.java | 55 ++-- .../DescriptionTemplateServiceImpl.java | 26 +- .../opencdmp/service/dmp/DmpServiceImpl.java | 82 +++--- .../dmpblueprint/DmpBlueprintServiceImpl.java | 11 +- .../ElasticQueryHelperServiceImpl.java | 4 +- .../service/elastic/ElasticServiceImpl.java | 8 +- .../FileTransformerServiceImpl.java | 26 +- .../service/lock/LockServiceImpl.java | 36 +-- .../maintenance/MaintenanceServiceImpl.java | 12 +- .../service/metrics/MetricsServiceImpl.java | 240 +++++++++--------- .../PrefillingSourceServiceImpl.java | 4 +- .../reference/ReferenceServiceImpl.java | 2 +- .../SupportiveMaterialServiceImpl.java | 30 +-- .../service/tenant/TenantServiceImpl.java | 4 +- .../TenantConfigurationServiceImpl.java | 36 +-- .../service/user/UserServiceImpl.java | 146 +++++------ 18 files changed, 371 insertions(+), 363 deletions(-) diff --git a/backend/core/src/main/java/org/opencdmp/integrationevent/outbox/tenantremoval/TenantRemovalConsistencyHandler.java b/backend/core/src/main/java/org/opencdmp/integrationevent/outbox/tenantremoval/TenantRemovalConsistencyHandler.java index a8935d71c..f0befc9d2 100644 --- a/backend/core/src/main/java/org/opencdmp/integrationevent/outbox/tenantremoval/TenantRemovalConsistencyHandler.java +++ b/backend/core/src/main/java/org/opencdmp/integrationevent/outbox/tenantremoval/TenantRemovalConsistencyHandler.java @@ -1,14 +1,14 @@ package org.opencdmp.integrationevent.outbox.tenantremoval; +import gr.cite.tools.data.query.QueryFactory; import org.opencdmp.integrationevent.inbox.ConsistencyHandler; import org.opencdmp.query.TenantQuery; -import gr.cite.tools.data.query.QueryFactory; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component -@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class TenantRemovalConsistencyHandler implements ConsistencyHandler { private final QueryFactory queryFactory; @@ -19,7 +19,7 @@ public class TenantRemovalConsistencyHandler implements ConsistencyHandler 0; } diff --git a/backend/core/src/main/java/org/opencdmp/integrationevent/outbox/userremoval/UserRemovalConsistencyHandler.java b/backend/core/src/main/java/org/opencdmp/integrationevent/outbox/userremoval/UserRemovalConsistencyHandler.java index 01677d555..b1e586e5c 100644 --- a/backend/core/src/main/java/org/opencdmp/integrationevent/outbox/userremoval/UserRemovalConsistencyHandler.java +++ b/backend/core/src/main/java/org/opencdmp/integrationevent/outbox/userremoval/UserRemovalConsistencyHandler.java @@ -1,14 +1,14 @@ package org.opencdmp.integrationevent.outbox.userremoval; +import gr.cite.tools.data.query.QueryFactory; import org.opencdmp.integrationevent.inbox.ConsistencyHandler; import org.opencdmp.query.UserQuery; -import gr.cite.tools.data.query.QueryFactory; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("outboxuserremovalconsistencyhandler") -@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public class UserRemovalConsistencyHandler implements ConsistencyHandler { private final QueryFactory queryFactory; @@ -19,7 +19,7 @@ public class UserRemovalConsistencyHandler implements ConsistencyHandler latestVersionDescriptionTemplates = this.queryFactory.query(DescriptionTemplateQuery.class) + List latestVersionDescriptionTemplates = this.queryFactory.query(DescriptionTemplateQuery.class).disableTracking() .versionStatuses(DescriptionTemplateVersionStatus.Current) .isActive(IsActive.Active) .groupIds(oldDescriptionTemplateEntity.getGroupId()) @@ -309,7 +312,7 @@ public class DescriptionServiceImpl implements DescriptionService { } private void sendNotification(DescriptionEntity description) throws InvalidApplicationException { - List existingUsers = this.queryFactory.query(DmpUserQuery.class) + List existingUsers = this.queryFactory.query(DmpUserQuery.class).disableTracking() .dmpIds(description.getDmpId()) .isActives(IsActive.Active) .collect(); @@ -319,7 +322,7 @@ public class DescriptionServiceImpl implements DescriptionService { } for (DmpUserEntity dmpUser : existingUsers) { if (!dmpUser.getUserId().equals(this.userScope.getUserIdSafe())){ - UserEntity user = this.queryFactory.query(UserQuery.class).ids(dmpUser.getUserId()).first(); + UserEntity user = this.queryFactory.query(UserQuery.class).disableTracking().ids(dmpUser.getUserId()).first(); if (user != null){ this.createDescriptionNotificationEvent(description, user); } @@ -375,7 +378,7 @@ public class DescriptionServiceImpl implements DescriptionService { NotifyIntegrationEvent event = new NotifyIntegrationEvent(); event.setUserId(user.getId()); - UserContactInfoQuery query = this.queryFactory.query(UserContactInfoQuery.class).userIds(user.getId()); + UserContactInfoQuery query = this.queryFactory.query(UserContactInfoQuery.class).disableTracking().userIds(user.getId()); query.setOrder(new Ordering().addAscending(UserContactInfo._ordinal)); List contactPairs = new ArrayList<>(); @@ -387,7 +390,7 @@ public class DescriptionServiceImpl implements DescriptionService { NotificationFieldData data = new NotificationFieldData(); List fieldInfoList = new ArrayList<>(); fieldInfoList.add(new FieldInfo("{recipient}", DataType.String, user.getName())); - fieldInfoList.add(new FieldInfo("{reasonName}", DataType.String, this.queryFactory.query(UserQuery.class).ids(this.userScope.getUserId()).first().getName())); + fieldInfoList.add(new FieldInfo("{reasonName}", DataType.String, this.queryFactory.query(UserQuery.class).disableTracking().ids(this.userScope.getUserId()).first().getName())); fieldInfoList.add(new FieldInfo("{name}", DataType.String, description.getLabel())); fieldInfoList.add(new FieldInfo("{id}", DataType.String, description.getId().toString())); data.setFields(fieldInfoList); @@ -446,7 +449,7 @@ public class DescriptionServiceImpl implements DescriptionService { public List validate(List descriptionIds) throws InvalidApplicationException { List descriptionValidationResults = new ArrayList<>(); - List descriptions = this.queryFactory.query(DescriptionQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(descriptionIds).isActive(IsActive.Active).collect(); + List descriptions = this.queryFactory.query(DescriptionQuery.class).disableTracking().authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(descriptionIds).isActive(IsActive.Active).collect(); if (descriptions == null){ return null; } @@ -512,7 +515,7 @@ public class DescriptionServiceImpl implements DescriptionService { if (FieldType.UPLOAD.equals(fieldType)){ UUID newFileId = this.conventionService.isValidUUID(persist.getTextValue()) ? UUID.fromString(persist.getTextValue()) : null; if (newFileId != null){ - StorageFileEntity storageFileEntity = this.queryFactory.query(StorageFileQuery.class).ids(newFileId).firstAs(new BaseFieldSet().ensure(StorageFile._id).ensure(StorageFile._storageType)); + StorageFileEntity storageFileEntity = this.queryFactory.query(StorageFileQuery.class).disableTracking().ids(newFileId).firstAs(new BaseFieldSet().ensure(StorageFile._id).ensure(StorageFile._storageType)); if (storageFileEntity == null || storageFileEntity.getStorageType().equals(StorageType.Temp)){ StorageFile storageFile = this.storageFileService.copyToStorage(newFileId, StorageType.Main, true, new BaseFieldSet().ensure(StorageFile._id)); this.storageFileService.updatePurgeAt(storageFile.getId(), null); @@ -538,7 +541,7 @@ public class DescriptionServiceImpl implements DescriptionService { else if (!this.conventionService.isNullOrEmpty(persist.getTextValue())) ids.add(UUID.fromString(persist.getTextValue())); if (!ids.isEmpty()){ - Set existingIds = this.queryFactory.query(DmpQuery.class).ids(ids).collectAs(new BaseFieldSet().ensure(Dmp._id)).stream().map(DmpEntity::getId).collect(Collectors.toSet()); + Set existingIds = this.queryFactory.query(DmpQuery.class).disableTracking().ids(ids).collectAs(new BaseFieldSet().ensure(Dmp._id)).stream().map(DmpEntity::getId).collect(Collectors.toSet()); for (UUID id : ids){ if (!existingIds.contains(id)) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); } @@ -549,7 +552,7 @@ public class DescriptionServiceImpl implements DescriptionService { else if (!this.conventionService.isNullOrEmpty(persist.getTextValue())) ids.add(UUID.fromString(persist.getTextValue())); if (!ids.isEmpty()) { - Set existingIds = this.queryFactory.query(DescriptionQuery.class).ids(ids).collectAs(new BaseFieldSet().ensure(Description._id)).stream().map(DescriptionEntity::getId).collect(Collectors.toSet()); + Set existingIds = this.queryFactory.query(DescriptionQuery.class).disableTracking().ids(ids).collectAs(new BaseFieldSet().ensure(Description._id)).stream().map(DescriptionEntity::getId).collect(Collectors.toSet()); for (UUID id : ids){ if (!existingIds.contains(id)) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, Description.class.getSimpleName()}, LocaleContextHolder.getLocale())); } @@ -820,7 +823,7 @@ public class DescriptionServiceImpl implements DescriptionService { this.authorizationService.authorizeAtLeastOneForce(List.of(this.authorizationContentResolver.descriptionAffiliation(descriptionId)), Permission.CloneDescription); - DescriptionEntity existing = this.queryFactory.query(DescriptionQuery.class).ids(descriptionId).isActive(IsActive.Active).first(); + DescriptionEntity existing = this.queryFactory.query(DescriptionQuery.class).disableTracking().ids(descriptionId).isActive(IsActive.Active).first(); DescriptionEntity newDescription = new DescriptionEntity(); newDescription.setId(UUID.randomUUID()); @@ -838,12 +841,12 @@ public class DescriptionServiceImpl implements DescriptionService { this.entityManager.persist(newDescription); - List descriptionReferences = this.queryFactory.query(DescriptionReferenceQuery.class) + List descriptionReferences = this.queryFactory.query(DescriptionReferenceQuery.class).disableTracking() .descriptionIds(existing.getId()) .isActive(IsActive.Active) .collect(); - List descriptionTags = this.queryFactory.query(DescriptionTagQuery.class) + List descriptionTags = this.queryFactory.query(DescriptionTagQuery.class).disableTracking() .descriptionIds(existing.getId()) .isActive(IsActive.Active) .collect(); @@ -904,7 +907,7 @@ public class DescriptionServiceImpl implements DescriptionService { //this.authorizationService.authorizeAtLeastOneForce(List.of(this.authorizationContentResolver.descriptionAffiliation(descriptionId)), Permission.CloneDescription); this.authorizationService.authorizeForce(Permission.EditDescription);//TODO: Missing Description or dmp for authz - DescriptionTemplateEntity descriptionTemplate = this.queryFactory.query(DescriptionTemplateQuery.class).ids(model.getDescriptionTemplateId()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).first(); + DescriptionTemplateEntity descriptionTemplate = this.queryFactory.query(DescriptionTemplateQuery.class).disableTracking().ids(model.getDescriptionTemplateId()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).first(); if (descriptionTemplate == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getDescriptionTemplateId(), DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); org.opencdmp.commons.types.descriptiontemplate.DefinitionEntity definition = this.xmlHandlingService.fromXmlSafe(org.opencdmp.commons.types.descriptiontemplate.DefinitionEntity.class, descriptionTemplate.getDefinition()); @@ -944,22 +947,22 @@ public class DescriptionServiceImpl implements DescriptionService { public StorageFileEntity getFieldFile(UUID descriptionId, UUID storageFileId) { this.authorizationService.authorizeAtLeastOneForce(List.of(this.authorizationContentResolver.descriptionAffiliation(descriptionId)), Permission.BrowseDescription); - DescriptionEntity descriptionEntity = this.queryFactory.query(DescriptionQuery.class).isActive(IsActive.Active).ids(descriptionId).first(); + DescriptionEntity descriptionEntity = this.queryFactory.query(DescriptionQuery.class).disableTracking().isActive(IsActive.Active).ids(descriptionId).first(); if (descriptionEntity == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{descriptionId, Description.class.getSimpleName()}, LocaleContextHolder.getLocale())); - DmpDescriptionTemplateEntity dmpDescriptionTemplateEntity = this.queryFactory.query(DmpDescriptionTemplateQuery.class).ids(descriptionEntity.getDmpDescriptionTemplateId()).isActive(IsActive.Active).first(); + DmpDescriptionTemplateEntity dmpDescriptionTemplateEntity = this.queryFactory.query(DmpDescriptionTemplateQuery.class).disableTracking().ids(descriptionEntity.getDmpDescriptionTemplateId()).isActive(IsActive.Active).first(); if (dmpDescriptionTemplateEntity == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{descriptionEntity.getDmpDescriptionTemplateId(), DmpDescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); - DmpEntity dmpEntity = this.queryFactory.query(DmpQuery.class).ids(dmpDescriptionTemplateEntity.getDmpId()).isActive(IsActive.Active).first(); + DmpEntity dmpEntity = this.queryFactory.query(DmpQuery.class).ids(dmpDescriptionTemplateEntity.getDmpId()).disableTracking().isActive(IsActive.Active).first(); if (dmpEntity == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{dmpDescriptionTemplateEntity.getDmpId(), Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); if (!dmpEntity.getAccessType().equals(DmpAccessType.Public)) { - boolean isDmpUser = this.queryFactory.query(DmpUserQuery.class).dmpIds(dmpEntity.getId()).userIds(this.userScope.getUserIdSafe()).isActives(IsActive.Active).count() > 0; + boolean isDmpUser = this.queryFactory.query(DmpUserQuery.class).dmpIds(dmpEntity.getId()).disableTracking().userIds(this.userScope.getUserIdSafe()).isActives(IsActive.Active).count() > 0; if (!isDmpUser) throw new MyUnauthorizedException(); } - StorageFileEntity storageFile = this.queryFactory.query(StorageFileQuery.class).ids(storageFileId).first(); + StorageFileEntity storageFile = this.queryFactory.query(StorageFileQuery.class).disableTracking().ids(storageFileId).first(); if (storageFile == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{storageFileId, StorageFile.class.getSimpleName()}, LocaleContextHolder.getLocale())); return storageFile; @@ -996,7 +999,7 @@ public class DescriptionServiceImpl implements DescriptionService { List referenceIds = this.calculateAllReferenceIdsFromData(data, definition); List references = null; if (!this.conventionService.isListNullOrEmpty(referenceIds)){ - references = this.queryFactory.query(ReferenceQuery.class).ids(referenceIds).collect(); + references = this.queryFactory.query(ReferenceQuery.class).disableTracking().ids(referenceIds).collect(); } if (data.getFieldSets() != null && !data.getFieldSets().isEmpty()){ persist.setFieldSets(new HashMap<>()); @@ -1128,7 +1131,7 @@ public class DescriptionServiceImpl implements DescriptionService { logger.debug(new MapLogEntry("export xml").And("id", id)); if (!ignoreAuthorize) this.authorizationService.authorizeForce(Permission.ExportDescription); - DescriptionEntity data = this.queryFactory.query(DescriptionQuery.class).ids(id).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).isActive(IsActive.Active).first(); + DescriptionEntity data = this.queryFactory.query(DescriptionQuery.class).disableTracking().ids(id).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).isActive(IsActive.Active).first(); if (data == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, Description.class.getSimpleName()}, LocaleContextHolder.getLocale())); PropertyDefinitionEntity definition = this.jsonHandlingService.fromJson(PropertyDefinitionEntity.class, data.getProperties()); @@ -1140,7 +1143,7 @@ public class DescriptionServiceImpl implements DescriptionService { logger.debug(new MapLogEntry("export xml").And("id", id)); this.authorizationService.authorizeForce(Permission.ExportDescription); - DescriptionEntity data = this.queryFactory.query(DescriptionQuery.class).ids(id).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).isActive(IsActive.Active).first(); + DescriptionEntity data = this.queryFactory.query(DescriptionQuery.class).disableTracking().ids(id).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).isActive(IsActive.Active).first(); if (data == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, Description.class.getSimpleName()}, LocaleContextHolder.getLocale())); String xml = this.xmlHandlingService.toXml(this.exportXmlEntity(data.getId(), false)); @@ -1154,7 +1157,7 @@ public class DescriptionServiceImpl implements DescriptionService { xml.setLabel(data.getLabel()); xml.setFinalizedAt(data.getFinalizedAt()); - DescriptionTemplateEntity blueprintEntity = this.queryFactory.query(DescriptionTemplateQuery.class).ids(data.getDescriptionTemplateId()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).isActive(IsActive.Active).first(); + DescriptionTemplateEntity blueprintEntity = this.queryFactory.query(DescriptionTemplateQuery.class).disableTracking().ids(data.getDescriptionTemplateId()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).isActive(IsActive.Active).first(); if (blueprintEntity != null) { xml.setDescriptionTemplate(this.descriptionTemplateService.exportXmlEntity(blueprintEntity.getId(), true)); } @@ -1163,11 +1166,11 @@ public class DescriptionServiceImpl implements DescriptionService { xml.setProperties(this.descriptionPropertyDefinitionToExport(propertiesEntity)); } - List dmpReferences = this.queryFactory.query(DescriptionReferenceQuery.class).descriptionIds(data.getId()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).isActive(IsActive.Active).collect(); + List dmpReferences = this.queryFactory.query(DescriptionReferenceQuery.class).disableTracking().descriptionIds(data.getId()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).isActive(IsActive.Active).collect(); if (!this.conventionService.isListNullOrEmpty(dmpReferences)) { - List references = this.queryFactory.query(ReferenceQuery.class).ids(dmpReferences.stream().map(DescriptionReferenceEntity::getReferenceId).distinct().toList()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).isActive(IsActive.Active).collect(); + List references = this.queryFactory.query(ReferenceQuery.class).disableTracking().ids(dmpReferences.stream().map(DescriptionReferenceEntity::getReferenceId).distinct().toList()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).isActive(IsActive.Active).collect(); Map referenceEntityMap = references == null ? new HashMap<>() : references.stream().collect(Collectors.toMap(ReferenceEntity::getId, x-> x)); - List referenceTypes = references == null ? new ArrayList<>() : this.queryFactory.query(ReferenceTypeQuery.class).ids(references.stream().map(ReferenceEntity::getTypeId).distinct().toList()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).isActive(IsActive.Active).collect(); + List referenceTypes = references == null ? new ArrayList<>() : this.queryFactory.query(ReferenceTypeQuery.class).disableTracking().ids(references.stream().map(ReferenceEntity::getTypeId).distinct().toList()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).isActive(IsActive.Active).collect(); Map referenceTypeEntityMap = referenceTypes == null ? new HashMap<>() : referenceTypes.stream().collect(Collectors.toMap(ReferenceTypeEntity::getId, x-> x)); List dmpReferenceImportExports = new LinkedList<>(); for (DescriptionReferenceEntity descriptionTemplateEntity : dmpReferences) { diff --git a/backend/core/src/main/java/org/opencdmp/service/descriptiontemplate/DescriptionTemplateServiceImpl.java b/backend/core/src/main/java/org/opencdmp/service/descriptiontemplate/DescriptionTemplateServiceImpl.java index a4254f031..deaf175e2 100644 --- a/backend/core/src/main/java/org/opencdmp/service/descriptiontemplate/DescriptionTemplateServiceImpl.java +++ b/backend/core/src/main/java/org/opencdmp/service/descriptiontemplate/DescriptionTemplateServiceImpl.java @@ -36,7 +36,7 @@ import org.opencdmp.data.*; import org.opencdmp.errorcode.ErrorThesaurusProperties; import org.opencdmp.integrationevent.outbox.notification.NotifyIntegrationEvent; import org.opencdmp.integrationevent.outbox.notification.NotifyIntegrationEventHandler; -import org.opencdmp.model.*; +import org.opencdmp.model.UserContactInfo; import org.opencdmp.model.builder.descriptiontemplate.DescriptionTemplateBuilder; import org.opencdmp.model.deleter.DescriptionTemplateDeleter; import org.opencdmp.model.deleter.UserDescriptionTemplateDeleter; @@ -208,7 +208,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic throw new MyForbiddenException("Can not update finalized template"); if (newStatus.equals(DescriptionTemplateStatus.Finalized)) { - List latestVersionDescriptionTemplates = this.queryFactory.query(DescriptionTemplateQuery.class).versionStatuses(DescriptionTemplateVersionStatus.Current).isActive(IsActive.Active).groupIds(data.getGroupId()).collect(); + List latestVersionDescriptionTemplates = this.queryFactory.query(DescriptionTemplateQuery.class).disableTracking().versionStatuses(DescriptionTemplateVersionStatus.Current).isActive(IsActive.Active).groupIds(data.getGroupId()).collect(); if (latestVersionDescriptionTemplates.size() > 1) throw new MyValidationException("Multiple previous template found"); DescriptionTemplateEntity oldDescriptionTemplateEntity = latestVersionDescriptionTemplates.stream().findFirst().orElse(null); @@ -230,7 +230,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic private void persistUsers(UUID id, List users) throws InvalidApplicationException { if (users == null) users = new ArrayList<>(); - List items = this.queryFactory.query(UserDescriptionTemplateQuery.class).isActive(IsActive.Active).descriptionTemplateIds(id).collect(); + List items = this.queryFactory.query(UserDescriptionTemplateQuery.class).disableTracking().isActive(IsActive.Active).descriptionTemplateIds(id).collect(); List updatedCreatedIds = new ArrayList<>(); for (UserDescriptionTemplatePersist user : users) { UserDescriptionTemplateEntity data = items.stream().filter(x -> x.getUserId().equals(user.getUserId()) && x.getRole().equals(user.getRole())).findFirst().orElse(null); @@ -262,12 +262,12 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic if (user == null){ throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{userDescriptionTemplate.getUserId(), User.class.getSimpleName()}, LocaleContextHolder.getLocale())); } - DescriptionTemplateEntity descriptionTemplate = this.queryFactory.query(DescriptionTemplateQuery.class).isActive(IsActive.Active).ids(userDescriptionTemplate.getDescriptionTemplateId()).first(); + DescriptionTemplateEntity descriptionTemplate = this.queryFactory.query(DescriptionTemplateQuery.class).disableTracking().isActive(IsActive.Active).ids(userDescriptionTemplate.getDescriptionTemplateId()).first(); if (descriptionTemplate == null){ throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{userDescriptionTemplate.getDescriptionTemplateId(), DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); } event.setUserId(user.getId()); - UserContactInfoQuery query = this.queryFactory.query(UserContactInfoQuery.class).userIds(user.getId()); + UserContactInfoQuery query = this.queryFactory.query(UserContactInfoQuery.class).disableTracking().userIds(user.getId()); query.setOrder(new Ordering().addAscending(UserContactInfo._ordinal)); List contactPairs = new ArrayList<>(); @@ -447,7 +447,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic if (data == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), Reference.class.getSimpleName()}, LocaleContextHolder.getLocale())); } else { ReferenceTypeDataEntity referenceTypeDataEntity = ((ReferenceTypeDataEntity)fieldEntity.getData()); - data = this.queryFactory.query(ReferenceQuery.class).sourceTypes(model.getSourceType()).typeIds(referenceTypeDataEntity.getReferenceTypeId()).sources(model.getSource()).isActive(IsActive.Active).references(model.getReference()).first(); + data = this.queryFactory.query(ReferenceQuery.class).disableTracking().sourceTypes(model.getSourceType()).typeIds(referenceTypeDataEntity.getReferenceTypeId()).sources(model.getSource()).isActive(IsActive.Active).references(model.getReference()).first(); if (data == null){ data = new ReferenceEntity(); data.setId(UUID.randomUUID()); @@ -463,7 +463,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic data.setSourceType(model.getSourceType()); try { - ReferenceTypeEntity referenceType = this.queryFactory.query(ReferenceTypeQuery.class).ids(referenceTypeDataEntity.getReferenceTypeId()).firstAs(new BaseFieldSet().ensure(ReferenceType._id).ensure(ReferenceTypeEntity._tenantId)); + ReferenceTypeEntity referenceType = this.queryFactory.query(ReferenceTypeQuery.class).disableTracking().ids(referenceTypeDataEntity.getReferenceTypeId()).firstAs(new BaseFieldSet().ensure(ReferenceType._id).ensure(ReferenceTypeEntity._tenantId)); if (referenceType == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{referenceTypeDataEntity.getReferenceTypeId(), ReferenceType.class.getSimpleName()}, LocaleContextHolder.getLocale())); if (data.getSourceType().equals(ReferenceSourceType.External) && !this.tenantScope.isDefaultTenant() && referenceType.getTenantId() == null){ @@ -553,7 +553,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic if (data == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); if (data.getVersionStatus().equals(DescriptionTemplateVersionStatus.Current)){ - DescriptionTemplateQuery descriptionTemplateQuery = this.queryFactory.query(DescriptionTemplateQuery.class) + DescriptionTemplateQuery descriptionTemplateQuery = this.queryFactory.query(DescriptionTemplateQuery.class).disableTracking() .statuses(DescriptionTemplateStatus.Finalized) .excludedIds(data.getId()) .isActive(IsActive.Active) @@ -582,7 +582,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic this.authorizationService.authorizeForce(Permission.CloneDescriptionTemplate); - DescriptionTemplateQuery query = this.queryFactory.query(DescriptionTemplateQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(id); + DescriptionTemplateQuery query = this.queryFactory.query(DescriptionTemplateQuery.class).disableTracking().authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(id); DescriptionTemplate model = this.builderFactory.builder(DescriptionTemplateBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(fields, query.firstAs(fields)); if (model == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); @@ -672,7 +672,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic if (!this.tenantScope.isSet() || !Objects.equals(oldDescriptionTemplateEntity.getTenantId(), this.tenantScope.getTenant())) throw new MyForbiddenException(this.errors.getTenantTampering().getCode(), this.errors.getTenantTampering().getMessage()); - List latestVersionDescriptionTemplates = this.queryFactory.query(DescriptionTemplateQuery.class) + List latestVersionDescriptionTemplates = this.queryFactory.query(DescriptionTemplateQuery.class).disableTracking() .versionStatuses(DescriptionTemplateVersionStatus.Current) .isActive(IsActive.Active) .groupIds(oldDescriptionTemplateEntity.getGroupId()) @@ -683,7 +683,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic throw new MyValidationException("Multiple previous template found"); if (!latestVersionDescriptionTemplates.getFirst().getVersion().equals(oldDescriptionTemplateEntity.getVersion())) throw new MyValidationException(this.errors.getDescriptionTemplateNewVersionConflict().getCode(), this.errors.getDescriptionTemplateNewVersionConflict().getMessage()); - Long notFinalizedCount = this.queryFactory.query(DescriptionTemplateQuery.class) + Long notFinalizedCount = this.queryFactory.query(DescriptionTemplateQuery.class).disableTracking() .versionStatuses(DescriptionTemplateVersionStatus.NotFinalized) .groupIds(oldDescriptionTemplateEntity.getGroupId()) .isActive(IsActive.Active) @@ -899,7 +899,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic logger.debug(new MapLogEntry("exportXml").And("id", id)); if (!ignoreAuthorize) this.authorizationService.authorizeForce(Permission.ExportDescriptionTemplate); - DescriptionTemplateEntity data = this.queryFactory.query(DescriptionTemplateQuery.class).ids(id).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).isActive(IsActive.Active).first(); + DescriptionTemplateEntity data = this.queryFactory.query(DescriptionTemplateQuery.class).disableTracking().ids(id).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).isActive(IsActive.Active).first(); if (data == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); DefinitionEntity definition = this.xmlHandlingService.fromXml(DefinitionEntity.class, data.getDefinition()); @@ -912,7 +912,7 @@ public class DescriptionTemplateServiceImpl implements DescriptionTemplateServic logger.debug(new MapLogEntry("exportXml").And("id", id)); this.authorizationService.authorizeForce(Permission.ExportDescriptionTemplate); - DescriptionTemplateEntity data = this.queryFactory.query(DescriptionTemplateQuery.class).ids(id).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).isActive(IsActive.Active).first(); + DescriptionTemplateEntity data = this.queryFactory.query(DescriptionTemplateQuery.class).disableTracking().ids(id).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).isActive(IsActive.Active).first(); if (data == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, DescriptionTemplate.class.getSimpleName()}, LocaleContextHolder.getLocale())); String xml = this.xmlHandlingService.toXml(this.exportXmlEntity(id, false)); diff --git a/backend/core/src/main/java/org/opencdmp/service/dmp/DmpServiceImpl.java b/backend/core/src/main/java/org/opencdmp/service/dmp/DmpServiceImpl.java index d82bec93b..c7f992f1f 100644 --- a/backend/core/src/main/java/org/opencdmp/service/dmp/DmpServiceImpl.java +++ b/backend/core/src/main/java/org/opencdmp/service/dmp/DmpServiceImpl.java @@ -237,11 +237,11 @@ public class DmpServiceImpl implements DmpService { } private void checkIfDescriptionTemplateIsUse (List descriptionTemplates, UUID id){ - List existingDmpDescriptionTemplates = this.queryFactory.query(DmpDescriptionTemplateQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).dmpIds(id).isActive(IsActive.Active).collect(); + List existingDmpDescriptionTemplates = this.queryFactory.query(DmpDescriptionTemplateQuery.class).disableTracking().authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).dmpIds(id).isActive(IsActive.Active).collect(); List removedDescriptionTemplates = existingDmpDescriptionTemplates.stream().filter(x -> descriptionTemplates.stream().noneMatch(y -> y.getDescriptionTemplateGroupId().equals(x.getDescriptionTemplateGroupId()))).toList(); - DmpDescriptionTemplateQuery dmpDescriptionTemplateQuery = this.queryFactory.query(DmpDescriptionTemplateQuery.class).isActive(IsActive.Active).dmpIds(id).descriptionTemplateGroupIds(removedDescriptionTemplates.stream().map(DmpDescriptionTemplateEntity::getDescriptionTemplateGroupId).collect(Collectors.toList())); - DescriptionQuery query = this.queryFactory.query(DescriptionQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).dmpDescriptionTemplateSubQuery(dmpDescriptionTemplateQuery).isActive(IsActive.Active); + DmpDescriptionTemplateQuery dmpDescriptionTemplateQuery = this.queryFactory.query(DmpDescriptionTemplateQuery.class).disableTracking().isActive(IsActive.Active).dmpIds(id).descriptionTemplateGroupIds(removedDescriptionTemplates.stream().map(DmpDescriptionTemplateEntity::getDescriptionTemplateGroupId).collect(Collectors.toList())); + DescriptionQuery query = this.queryFactory.query(DescriptionQuery.class).disableTracking().authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).dmpDescriptionTemplateSubQuery(dmpDescriptionTemplateQuery).isActive(IsActive.Active); if (query != null && query.count() > 0) throw new MyValidationException(this.errors.getDmpDescriptionTemplateCanNotRemove().getCode(), this.errors.getDmpDescriptionTemplateCanNotRemove().getMessage()); @@ -268,7 +268,7 @@ public class DmpServiceImpl implements DmpService { } private void sendNotification(DmpEntity dmp) throws InvalidApplicationException { - List existingUsers = this.queryFactory.query(DmpUserQuery.class) + List existingUsers = this.queryFactory.query(DmpUserQuery.class).disableTracking() .dmpIds(dmp.getId()) .isActives(IsActive.Active) .collect(); @@ -279,7 +279,7 @@ public class DmpServiceImpl implements DmpService { for (DmpUserEntity dmpUser : existingUsers) { if (!dmpUser.getUserId().equals(this.userScope.getUserIdSafe())){ - UserEntity user = this.queryFactory.query(UserQuery.class).ids(dmpUser.getUserId()).first(); + UserEntity user = this.queryFactory.query(UserQuery.class).disableTracking().ids(dmpUser.getUserId()).first(); if (user != null){ this.createDmpNotificationEvent(dmp, user); } @@ -290,7 +290,7 @@ public class DmpServiceImpl implements DmpService { private void createDmpNotificationEvent(DmpEntity dmp, UserEntity user) throws InvalidApplicationException { NotifyIntegrationEvent event = new NotifyIntegrationEvent(); event.setUserId(user.getId()); - UserContactInfoQuery query = this.queryFactory.query(UserContactInfoQuery.class).userIds(user.getId()); + UserContactInfoQuery query = this.queryFactory.query(UserContactInfoQuery.class).disableTracking().userIds(user.getId()); query.setOrder(new Ordering().addAscending(UserContactInfo._ordinal)); List contactPairs = new ArrayList<>(); @@ -302,7 +302,7 @@ public class DmpServiceImpl implements DmpService { NotificationFieldData data = new NotificationFieldData(); List fieldInfoList = new ArrayList<>(); fieldInfoList.add(new FieldInfo("{recipient}", DataType.String, user.getName())); - fieldInfoList.add(new FieldInfo("{reasonName}", DataType.String, this.queryFactory.query(UserQuery.class).ids(this.userScope.getUserId()).first().getName())); + fieldInfoList.add(new FieldInfo("{reasonName}", DataType.String, this.queryFactory.query(UserQuery.class).disableTracking().ids(this.userScope.getUserId()).first().getName())); fieldInfoList.add(new FieldInfo("{name}", DataType.String, dmp.getLabel())); fieldInfoList.add(new FieldInfo("{id}", DataType.String, dmp.getId().toString())); data.setFields(fieldInfoList); @@ -332,7 +332,7 @@ public class DmpServiceImpl implements DmpService { DmpEntity data = this.entityManager.find(DmpEntity.class, id); if (data == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); - EntityDoiQuery entityDoiQuery = this.queryFactory.query(EntityDoiQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).types(EntityType.DMP).entityIds(data.getId()); + EntityDoiQuery entityDoiQuery = this.queryFactory.query(EntityDoiQuery.class).disableTracking().authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).types(EntityType.DMP).entityIds(data.getId()); if (entityDoiQuery.count() > 0) throw new MyApplicationException("DMP is deposited can not deleted"); DmpEntity previousFinalized = null; @@ -369,7 +369,7 @@ public class DmpServiceImpl implements DmpService { if (oldDmpEntity == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); if (!this.conventionService.hashValue(oldDmpEntity.getUpdatedAt()).equals(model.getHash())) throw new MyValidationException(this.errors.getHashConflict().getCode(), this.errors.getHashConflict().getMessage()); - List latestVersionDmps = this.queryFactory.query(DmpQuery.class) + List latestVersionDmps = this.queryFactory.query(DmpQuery.class).disableTracking() .groupIds(oldDmpEntity.getGroupId()) .isActive(IsActive.Active) .versionStatuses(DmpVersionStatus.Current) @@ -379,7 +379,7 @@ public class DmpServiceImpl implements DmpService { if (!latestVersionDmps.getFirst().getVersion().equals(oldDmpEntity.getVersion())){ throw new MyValidationException(this.errors.getDmpNewVersionConflict().getCode(), this.errors.getDmpNewVersionConflict().getMessage()); } - Long notFinalizedCount = this.queryFactory.query(DmpQuery.class) + Long notFinalizedCount = this.queryFactory.query(DmpQuery.class).disableTracking() .versionStatuses(DmpVersionStatus.NotFinalized) .groupIds(oldDmpEntity.getGroupId()) .isActive(IsActive.Active) @@ -405,15 +405,15 @@ public class DmpServiceImpl implements DmpService { this.entityManager.persist(newDmp); - List dmpUsers = this.queryFactory.query(DmpUserQuery.class) + List dmpUsers = this.queryFactory.query(DmpUserQuery.class).disableTracking() .dmpIds(model.getId()) .isActives(IsActive.Active) .collect(); - List dmpReferences = this.queryFactory.query(DmpReferenceQuery.class) + List dmpReferences = this.queryFactory.query(DmpReferenceQuery.class).disableTracking() .dmpIds(model.getId()) .isActives(IsActive.Active) .collect(); - List dmpDescriptionTemplates = this.queryFactory.query(DmpDescriptionTemplateQuery.class) + List dmpDescriptionTemplates = this.queryFactory.query(DmpDescriptionTemplateQuery.class).disableTracking() .dmpIds(model.getId()) .isActive(IsActive.Active) .collect(); @@ -480,7 +480,7 @@ public class DmpServiceImpl implements DmpService { if (previousStatus.equals(newStatus)) return; if (previousStatus.equals(DmpStatus.Finalized) && newStatus.equals(DmpStatus.Draft)){ - boolean alreadyCreatedNewVersion = this.queryFactory.query(DmpQuery.class) + boolean alreadyCreatedNewVersion = this.queryFactory.query(DmpQuery.class).disableTracking() .versionStatuses(DmpVersionStatus.NotFinalized, DmpVersionStatus.Current) .excludedIds(data.getId()) .isActive(IsActive.Active) @@ -516,7 +516,7 @@ public class DmpServiceImpl implements DmpService { public Dmp buildClone(CloneDmpPersist model, FieldSet fields) throws MyForbiddenException, MyValidationException, MyApplicationException, MyNotFoundException, IOException, InvalidApplicationException { this.authorizationService.authorizeAtLeastOneForce(List.of(this.authorizationContentResolver.dmpAffiliation( model.getId())), Permission.CloneDmp); - DmpEntity existingDmpEntity = this.queryFactory.query(DmpQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(model.getId()).firstAs(fields); + DmpEntity existingDmpEntity = this.queryFactory.query(DmpQuery.class).disableTracking().authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(model.getId()).firstAs(fields); if (!this.conventionService.isValidGuid(model.getId()) || existingDmpEntity == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); @@ -539,15 +539,15 @@ public class DmpServiceImpl implements DmpService { this.entityManager.persist(newDmp); - List dmpUsers = this.queryFactory.query(DmpUserQuery.class) + List dmpUsers = this.queryFactory.query(DmpUserQuery.class).disableTracking() .dmpIds(model.getId()) .isActives(IsActive.Active) .collect(); - List dmpReferences = this.queryFactory.query(DmpReferenceQuery.class) + List dmpReferences = this.queryFactory.query(DmpReferenceQuery.class).disableTracking() .dmpIds(model.getId()) .isActives(IsActive.Active) .collect(); - List dmpDescriptionTemplates = this.queryFactory.query(DmpDescriptionTemplateQuery.class) + List dmpDescriptionTemplates = this.queryFactory.query(DmpDescriptionTemplateQuery.class).disableTracking() .dmpIds(model.getId()) .isActive(IsActive.Active) .collect(); @@ -597,7 +597,7 @@ public class DmpServiceImpl implements DmpService { this.annotationEntityTouchedIntegrationEventHandler.handleDmp(newDmp.getId()); - DmpEntity resultingDmpEntity = this.queryFactory.query(DmpQuery.class).ids(newDmp.getId()).firstAs(fields); + DmpEntity resultingDmpEntity = this.queryFactory.query(DmpQuery.class).disableTracking().ids(newDmp.getId()).firstAs(fields); if (!this.conventionService.isListNullOrEmpty(model.getDescriptions())){ for (UUID description: model.getDescriptions()) { this.descriptionService.clone(newDmp.getId(), description); @@ -1025,7 +1025,7 @@ public class DmpServiceImpl implements DmpService { public DmpValidationResult validate(UUID id) throws InvalidApplicationException { - DmpEntity dmp = this.queryFactory.query(DmpQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(id).isActive(IsActive.Active).first(); + DmpEntity dmp = this.queryFactory.query(DmpQuery.class).disableTracking().authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(id).isActive(IsActive.Active).first(); if (dmp == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); @@ -1057,7 +1057,7 @@ public class DmpServiceImpl implements DmpService { persist.setAccessType(data.getAccessType()); persist.setLanguage(data.getLanguage()); - List dmpUserEntities = this.queryFactory.query(DmpUserQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).dmpIds(data.getId()).isActives(IsActive.Active).collect(); + List dmpUserEntities = this.queryFactory.query(DmpUserQuery.class).disableTracking().authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).dmpIds(data.getId()).isActives(IsActive.Active).collect(); if (!this.conventionService.isListNullOrEmpty(dmpUserEntities)){ persist.setUsers(new ArrayList<>()); @@ -1066,11 +1066,11 @@ public class DmpServiceImpl implements DmpService { } } - List dmpReferenceEntities = this.queryFactory.query(DmpReferenceQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).dmpIds(data.getId()).isActives(IsActive.Active).collect(); + List dmpReferenceEntities = this.queryFactory.query(DmpReferenceQuery.class).disableTracking().authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).dmpIds(data.getId()).isActives(IsActive.Active).collect(); org.opencdmp.commons.types.dmpblueprint.DefinitionEntity definition = this.xmlHandlingService.fromXmlSafe(org.opencdmp.commons.types.dmpblueprint.DefinitionEntity.class, dmpBlueprintEntity.getDefinition()); - List dmpDescriptionTemplateEntities = this.queryFactory.query(DmpDescriptionTemplateQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).dmpIds(data.getId()).isActive(IsActive.Active).collect(); + List dmpDescriptionTemplateEntities = this.queryFactory.query(DmpDescriptionTemplateQuery.class).disableTracking().authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).dmpIds(data.getId()).isActive(IsActive.Active).collect(); if (!this.conventionService.isListNullOrEmpty(dmpDescriptionTemplateEntities)){ persist.setDescriptionTemplates(new ArrayList<>()); for (DmpDescriptionTemplateEntity descriptionTemplateEntity: dmpDescriptionTemplateEntities) { @@ -1094,7 +1094,7 @@ public class DmpServiceImpl implements DmpService { List referencesFromAllFields = new ArrayList<>(); if (!this.conventionService.isListNullOrEmpty(dmpReferenceEntities)) { - referencesFromAllFields = this.queryFactory.query(ReferenceQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(dmpReferenceEntities.stream().map(DmpReferenceEntity::getReferenceId).collect(Collectors.toList())).isActive(IsActive.Active).collect(); + referencesFromAllFields = this.queryFactory.query(ReferenceQuery.class).disableTracking().authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(dmpReferenceEntities.stream().map(DmpReferenceEntity::getReferenceId).collect(Collectors.toList())).isActive(IsActive.Active).collect(); } Map dmpBlueprintValues = new HashMap<>(); @@ -1214,12 +1214,12 @@ public class DmpServiceImpl implements DmpService { private List inviteUserOrAssignUsers(UUID id, List users, boolean persistUsers) throws InvalidApplicationException, JAXBException, IOException { this.authorizationService.authorizeAtLeastOneForce(List.of(this.authorizationContentResolver.dmpAffiliation(id)), Permission.InviteDmpUsers); - DmpEntity dmp = this.queryFactory.query(DmpQuery.class).ids(id).first(); + DmpEntity dmp = this.queryFactory.query(DmpQuery.class).disableTracking().ids(id).first(); if (dmp == null){ throw new InvalidApplicationException("Dmp does not exist!"); } - List existingUsers = this.queryFactory.query(DmpUserQuery.class) + List existingUsers = this.queryFactory.query(DmpUserQuery.class).disableTracking() .dmpIds(dmp.getId()) .isActives(IsActive.Active) .collect(); @@ -1234,7 +1234,7 @@ public class DmpServiceImpl implements DmpService { if (user.getUser() != null){ userId = user.getUser(); } else if (user.getEmail() != null) { - UserContactInfoEntity contactInfoEntity = this.queryFactory.query(UserContactInfoQuery.class).values(user.getEmail()).types(ContactInfoType.Email).first(); + UserContactInfoEntity contactInfoEntity = this.queryFactory.query(UserContactInfoQuery.class).disableTracking().values(user.getEmail()).types(ContactInfoType.Email).first(); if (contactInfoEntity != null){ userId = contactInfoEntity.getUserId(); } @@ -1255,8 +1255,8 @@ public class DmpServiceImpl implements DmpService { } private void sendDmpInvitationExistingUser(UUID userId, DmpEntity dmp, DmpUserRole role) throws InvalidApplicationException { - UserEntity recipient = this.queryFactory.query(UserQuery.class).ids(userId).isActive(IsActive.Active).first(); - String email = this.queryFactory.query(UserContactInfoQuery.class).userIds(recipient.getId()).first().getValue(); + UserEntity recipient = this.queryFactory.query(UserQuery.class).disableTracking().ids(userId).isActive(IsActive.Active).first(); + String email = this.queryFactory.query(UserContactInfoQuery.class).disableTracking().userIds(recipient.getId()).first().getValue(); this.createDmpInvitationExistingUserEvent(recipient, dmp, role, email); } @@ -1273,7 +1273,7 @@ public class DmpServiceImpl implements DmpService { NotificationFieldData data = new NotificationFieldData(); List fieldInfoList = new ArrayList<>(); fieldInfoList.add(new FieldInfo("{recipient}", DataType.String, recipient.getName())); - fieldInfoList.add(new FieldInfo("{reasonName}", DataType.String, this.queryFactory.query(UserQuery.class).ids(this.userScope.getUserIdSafe()).first().getName())); + fieldInfoList.add(new FieldInfo("{reasonName}", DataType.String, this.queryFactory.query(UserQuery.class).disableTracking().ids(this.userScope.getUserIdSafe()).first().getName())); fieldInfoList.add(new FieldInfo("{dmpname}", DataType.String, dmp.getLabel())); fieldInfoList.add(new FieldInfo("{dmprole}", DataType.String, role.toString())); fieldInfoList.add(new FieldInfo("{id}", DataType.String, dmp.getId().toString())); @@ -1355,7 +1355,7 @@ public class DmpServiceImpl implements DmpService { logger.debug(new MapLogEntry("export xml").And("id", id)); if (!ignoreAuthorize) this.authorizationService.authorizeForce(Permission.ExportDmp); - DmpEntity data = this.queryFactory.query(DmpQuery.class).ids(id).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).isActive(IsActive.Active).first(); + DmpEntity data = this.queryFactory.query(DmpQuery.class).disableTracking().ids(id).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).isActive(IsActive.Active).first(); if (data == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); DmpPropertiesEntity definition = this.jsonHandlingService.fromJson(DmpPropertiesEntity.class, data.getProperties()); @@ -1367,7 +1367,7 @@ public class DmpServiceImpl implements DmpService { logger.debug(new MapLogEntry("export xml").And("id", id)); this.authorizationService.authorizeForce(Permission.ExportDmp); - DmpEntity data = this.queryFactory.query(DmpQuery.class).ids(id).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).isActive(IsActive.Active).first(); + DmpEntity data = this.queryFactory.query(DmpQuery.class).disableTracking().ids(id).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).isActive(IsActive.Active).first(); if (data == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); String xml = this.xmlHandlingService.toXml(this.exportXmlEntity(data.getId(), false)); @@ -1386,7 +1386,7 @@ public class DmpServiceImpl implements DmpService { if (propertiesEntity != null && !this.conventionService.isListNullOrEmpty(propertiesEntity.getContacts())) { List dmpContactImportExports = new LinkedList<>(); - List users = this.queryFactory.query(UserQuery.class).ids(propertiesEntity.getContacts().stream().map(DmpContactEntity::getUserId).filter(Objects::nonNull).distinct().toList()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).isActive(IsActive.Active).collect(); + List users = this.queryFactory.query(UserQuery.class).disableTracking().ids(propertiesEntity.getContacts().stream().map(DmpContactEntity::getUserId).filter(Objects::nonNull).distinct().toList()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).isActive(IsActive.Active).collect(); Map usersMap = users == null ? new HashMap<>() : users.stream().collect(Collectors.toMap(UserEntity::getId, x-> x)); for (DmpContactEntity contactEntity : propertiesEntity.getContacts()) { dmpContactImportExports.add(this.dmpContactToExport(contactEntity, usersMap)); @@ -1394,9 +1394,9 @@ public class DmpServiceImpl implements DmpService { xml.setContacts(dmpContactImportExports); } - List dmpUsers = this.queryFactory.query(DmpUserQuery.class).dmpIds(data.getId()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).isActives(IsActive.Active).collect(); + List dmpUsers = this.queryFactory.query(DmpUserQuery.class).disableTracking().dmpIds(data.getId()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).isActives(IsActive.Active).collect(); if (!this.conventionService.isListNullOrEmpty(dmpUsers)) { - List users = this.queryFactory.query(UserQuery.class).ids(dmpUsers.stream().map(DmpUserEntity::getUserId).distinct().toList()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).isActive(IsActive.Active).collect(); + List users = this.queryFactory.query(UserQuery.class).disableTracking().ids(dmpUsers.stream().map(DmpUserEntity::getUserId).distinct().toList()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).isActive(IsActive.Active).collect(); Map usersMap = users == null ? new HashMap<>() : users.stream().collect(Collectors.toMap(UserEntity::getId, x-> x)); List dmpUserImportExports = new LinkedList<>(); for (DmpUserEntity dmpUserEntity : dmpUsers) { @@ -1404,12 +1404,12 @@ public class DmpServiceImpl implements DmpService { } xml.setUsers(dmpUserImportExports); } - DmpBlueprintEntity blueprintEntity = this.queryFactory.query(DmpBlueprintQuery.class).ids(data.getBlueprintId()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).isActive(IsActive.Active).first(); + DmpBlueprintEntity blueprintEntity = this.queryFactory.query(DmpBlueprintQuery.class).disableTracking().ids(data.getBlueprintId()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).isActive(IsActive.Active).first(); if (blueprintEntity != null) { xml.setBlueprint(this.dmpBlueprintService.getExportXmlEntity(blueprintEntity.getId(), true)); } - List dmpDescriptionTemplateEntities = this.queryFactory.query(DmpDescriptionTemplateQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).dmpIds(data.getId()).isActive(IsActive.Active).collect(); + List dmpDescriptionTemplateEntities = this.queryFactory.query(DmpDescriptionTemplateQuery.class).disableTracking().authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).dmpIds(data.getId()).isActive(IsActive.Active).collect(); if (!this.conventionService.isListNullOrEmpty(dmpDescriptionTemplateEntities)) { List dmpDescriptionTemplateImportExports = new LinkedList<>(); for (DmpDescriptionTemplateEntity descriptionTemplateEntity : dmpDescriptionTemplateEntities) { @@ -1426,11 +1426,11 @@ public class DmpServiceImpl implements DmpService { xml.setBlueprintValues(dmpDescriptionTemplateImportExports); } - List dmpReferences = this.queryFactory.query(DmpReferenceQuery.class).dmpIds(data.getId()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).isActives(IsActive.Active).collect(); + List dmpReferences = this.queryFactory.query(DmpReferenceQuery.class).disableTracking().dmpIds(data.getId()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).isActives(IsActive.Active).collect(); if (!this.conventionService.isListNullOrEmpty(dmpReferences)) { - List references = this.queryFactory.query(ReferenceQuery.class).ids(dmpReferences.stream().map(DmpReferenceEntity::getReferenceId).distinct().toList()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).isActive(IsActive.Active).collect(); + List references = this.queryFactory.query(ReferenceQuery.class).disableTracking().ids(dmpReferences.stream().map(DmpReferenceEntity::getReferenceId).distinct().toList()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).isActive(IsActive.Active).collect(); Map referenceEntityMap = references == null ? new HashMap<>() : references.stream().collect(Collectors.toMap(ReferenceEntity::getId, x-> x)); - List referenceTypes = references == null ? new ArrayList<>() : this.queryFactory.query(ReferenceTypeQuery.class).ids(references.stream().map(ReferenceEntity::getTypeId).distinct().toList()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).isActive(IsActive.Active).collect(); + List referenceTypes = references == null ? new ArrayList<>() : this.queryFactory.query(ReferenceTypeQuery.class).disableTracking().ids(references.stream().map(ReferenceEntity::getTypeId).distinct().toList()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).isActive(IsActive.Active).collect(); Map referenceTypeEntityMap = referenceTypes == null ? new HashMap<>() : referenceTypes.stream().collect(Collectors.toMap(ReferenceTypeEntity::getId, x-> x)); List dmpReferenceImportExports = new LinkedList<>(); for (DmpReferenceEntity descriptionTemplateEntity : dmpReferences) { @@ -1438,7 +1438,7 @@ public class DmpServiceImpl implements DmpService { } xml.setReferences(dmpReferenceImportExports); } - List descriptions = this.queryFactory.query(DescriptionQuery.class).dmpIds(data.getId()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).dmpIds(data.getId()).isActive(IsActive.Active).collect(); + List descriptions = this.queryFactory.query(DescriptionQuery.class).disableTracking().dmpIds(data.getId()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermissionOrPublic).dmpIds(data.getId()).isActive(IsActive.Active).collect(); if (!this.conventionService.isListNullOrEmpty(descriptions)) { List descriptionImportExports = new LinkedList<>(); for (DescriptionEntity description : descriptions) { diff --git a/backend/core/src/main/java/org/opencdmp/service/dmpblueprint/DmpBlueprintServiceImpl.java b/backend/core/src/main/java/org/opencdmp/service/dmpblueprint/DmpBlueprintServiceImpl.java index dfdcc913a..bfa777b77 100644 --- a/backend/core/src/main/java/org/opencdmp/service/dmpblueprint/DmpBlueprintServiceImpl.java +++ b/backend/core/src/main/java/org/opencdmp/service/dmpblueprint/DmpBlueprintServiceImpl.java @@ -27,10 +27,10 @@ import org.opencdmp.convention.ConventionService; import org.opencdmp.data.DmpBlueprintEntity; import org.opencdmp.data.TenantEntityManager; import org.opencdmp.errorcode.ErrorThesaurusProperties; -import org.opencdmp.model.dmpblueprint.DmpBlueprint; import org.opencdmp.model.builder.dmpblueprint.DmpBlueprintBuilder; import org.opencdmp.model.deleter.DmpBlueprintDeleter; import org.opencdmp.model.dmpblueprint.Definition; +import org.opencdmp.model.dmpblueprint.DmpBlueprint; import org.opencdmp.model.dmpblueprint.Field; import org.opencdmp.model.dmpblueprint.Section; import org.opencdmp.model.persist.DmpBlueprintPersist; @@ -169,6 +169,7 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { if (newStatus.equals(DmpBlueprintStatus.Finalized)) { List latestVersionDmpBlueprints = this.queryFactory.query(DmpBlueprintQuery.class) + .disableTracking() .versionStatuses(DmpBlueprintVersionStatus.Current) .isActive(IsActive.Active) .groupIds(data.getGroupId()) @@ -336,7 +337,7 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { this.authorizationService.authorizeForce(Permission.CloneDmpBlueprint); - DmpBlueprintQuery query = this.queryFactory.query(DmpBlueprintQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(id); + DmpBlueprintQuery query = this.queryFactory.query(DmpBlueprintQuery.class).disableTracking().authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(id); DmpBlueprint model = this.builderFactory.builder(DmpBlueprintBuilder.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(fields, query.firstAs(fields)); if (model == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, DmpBlueprint.class.getSimpleName()}, LocaleContextHolder.getLocale())); @@ -397,6 +398,7 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { if (!this.tenantScope.isSet() || !Objects.equals(oldDmpBlueprintEntity.getTenantId(), this.tenantScope.getTenant())) throw new MyForbiddenException(this.errors.getTenantTampering().getCode(), this.errors.getTenantTampering().getMessage()); List latestVersionDmpBlueprints = this.queryFactory.query(DmpBlueprintQuery.class) + .disableTracking() .versionStatuses(DmpBlueprintVersionStatus.Current) .isActive(IsActive.Active) .statuses(DmpBlueprintStatus.Finalized) @@ -409,6 +411,7 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { if (!latestVersionDmpBlueprints.getFirst().getVersion().equals(oldDmpBlueprintEntity.getVersion())) throw new MyValidationException(this.errors.getDmpBlueprintNewVersionConflict().getCode(), this.errors.getDmpBlueprintNewVersionConflict().getMessage()); Long notFinalizedCount = this.queryFactory.query(DmpBlueprintQuery.class) + .disableTracking() .versionStatuses(DmpBlueprintVersionStatus.NotFinalized) .groupIds(oldDmpBlueprintEntity.getGroupId()) .isActive(IsActive.Active) @@ -449,7 +452,7 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { logger.debug(new MapLogEntry("export xml").And("id", id)); if (!ignoreAuthorize) this.authorizationService.authorizeForce(Permission.ExportDmpBlueprint); - DmpBlueprintEntity data = this.queryFactory.query(DmpBlueprintQuery.class).ids(id).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).isActive(IsActive.Active).first(); + DmpBlueprintEntity data = this.queryFactory.query(DmpBlueprintQuery.class).disableTracking().ids(id).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).isActive(IsActive.Active).first(); if (data == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, DmpBlueprint.class.getSimpleName()}, LocaleContextHolder.getLocale())); return this.definitionXmlToExport(data); @@ -459,7 +462,7 @@ public class DmpBlueprintServiceImpl implements DmpBlueprintService { @Override public ResponseEntity exportXml(UUID id) throws MyForbiddenException, MyNotFoundException, JAXBException, ParserConfigurationException, IOException, InstantiationException, IllegalAccessException, SAXException, TransformerException, InvalidApplicationException { logger.debug(new MapLogEntry("export xml").And("id", id)); - DmpBlueprintEntity data = this.queryFactory.query(DmpBlueprintQuery.class).ids(id).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).isActive(IsActive.Active).first(); + DmpBlueprintEntity data = this.queryFactory.query(DmpBlueprintQuery.class).disableTracking().ids(id).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).isActive(IsActive.Active).first(); if (data == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, DmpBlueprint.class.getSimpleName()}, LocaleContextHolder.getLocale())); String xml = this.xmlHandlingService.toXml(this.getExportXmlEntity(id, false)); diff --git a/backend/core/src/main/java/org/opencdmp/service/elastic/ElasticQueryHelperServiceImpl.java b/backend/core/src/main/java/org/opencdmp/service/elastic/ElasticQueryHelperServiceImpl.java index dfab0972b..fc7d2bac1 100644 --- a/backend/core/src/main/java/org/opencdmp/service/elastic/ElasticQueryHelperServiceImpl.java +++ b/backend/core/src/main/java/org/opencdmp/service/elastic/ElasticQueryHelperServiceImpl.java @@ -61,7 +61,7 @@ public class ElasticQueryHelperServiceImpl implements ElasticQueryHelperService query.setOrder(lookup.enrich(this.queryFactory).getOrder()); if (lookup.getMetadata() != null && lookup.getMetadata().countAll) result.setCount(lookup.enrichElastic(this.queryFactory).authorize(flags).count()); } else { - query = lookup.enrich(this.queryFactory).authorize(flags); + query = lookup.enrich(this.queryFactory).disableTracking().authorize(flags); if (lookup.getMetadata() != null && lookup.getMetadata().countAll) result.setCount(query.count()); } result.setItems(buildFunc.apply(query.collect())); @@ -102,7 +102,7 @@ public class ElasticQueryHelperServiceImpl implements ElasticQueryHelperService query.setOrder(lookup.enrich(this.queryFactory).getOrder()); if (lookup.getMetadata() != null && lookup.getMetadata().countAll) result.setCount(lookup.enrichElastic(this.queryFactory).authorize(flags).count()); } else { - query = lookup.enrich(this.queryFactory).authorize(flags); + query = lookup.enrich(this.queryFactory).disableTracking().authorize(flags); if (lookup.getMetadata() != null && lookup.getMetadata().countAll) result.setCount(query.count()); } result.setItems(buildFunc.apply(query.collect())); diff --git a/backend/core/src/main/java/org/opencdmp/service/elastic/ElasticServiceImpl.java b/backend/core/src/main/java/org/opencdmp/service/elastic/ElasticServiceImpl.java index 01735c9ed..8d70e18cc 100644 --- a/backend/core/src/main/java/org/opencdmp/service/elastic/ElasticServiceImpl.java +++ b/backend/core/src/main/java/org/opencdmp/service/elastic/ElasticServiceImpl.java @@ -280,7 +280,7 @@ public class ElasticServiceImpl implements ElasticService { DmpElasticEntity dmpElasticEntity = this.builderFactory.builder(DmpElasticBuilder.class).build(dmp); this.elasticsearchTemplate.save(dmpElasticEntity, IndexCoordinates.of(this.appElasticProperties.getDmpIndexName())); - List descriptions = this.builderFactory.builder(DescriptionElasticBuilder.class).build(this.queryFactory.query(DescriptionQuery.class).isActive(IsActive.Active).dmpSubQuery(this.queryFactory.query(DmpQuery.class).ids(dmp.getId())).collect()); + List descriptions = this.builderFactory.builder(DescriptionElasticBuilder.class).build(this.queryFactory.query(DescriptionQuery.class).disableTracking().isActive(IsActive.Active).dmpSubQuery(this.queryFactory.query(DmpQuery.class).ids(dmp.getId())).collect()); this.elasticsearchTemplate.save(descriptions, IndexCoordinates.of(this.appElasticProperties.getDescriptionIndexName())); } @@ -291,7 +291,7 @@ public class ElasticServiceImpl implements ElasticService { DmpElasticEntity dmpElasticEntity = this.elasticsearchTemplate.get(dmp.getId().toString(),DmpElasticEntity.class, IndexCoordinates.of(this.appElasticProperties.getDmpIndexName())); if (dmpElasticEntity == null) return; this.elasticsearchTemplate.delete(dmpElasticEntity, IndexCoordinates.of(this.appElasticProperties.getDmpIndexName())); - List descriptions = this.queryFactory.query(DescriptionQuery.class).dmpSubQuery(this.queryFactory.query(DmpQuery.class).ids(dmp.getId())).collectAs(new BaseFieldSet().ensure(Description._id)); + List descriptions = this.queryFactory.query(DescriptionQuery.class).dmpSubQuery(this.queryFactory.query(DmpQuery.class).disableTracking().ids(dmp.getId())).collectAs(new BaseFieldSet().ensure(Description._id)); for (DescriptionEntity description: descriptions) { DescriptionElasticEntity descriptionElasticEntity = this.elasticsearchTemplate.get(description.getId().toString(), DescriptionElasticEntity.class, IndexCoordinates.of(this.appElasticProperties.getDescriptionIndexName())); if (descriptionElasticEntity == null) continue; @@ -373,7 +373,7 @@ public class ElasticServiceImpl implements ElasticService { int pageSize = this.appElasticProperties.getResetBatchSize(); List items; do { - DmpQuery query = this.queryFactory.query(DmpQuery.class); + DmpQuery query = this.queryFactory.query(DmpQuery.class).disableTracking(); query.setOrder(new Ordering().addAscending(Dmp._createdAt)); query.setPage(new Paging(page * pageSize, pageSize)); @@ -405,7 +405,7 @@ public class ElasticServiceImpl implements ElasticService { int pageSize = this.appElasticProperties.getResetBatchSize(); List items; do { - DescriptionQuery query = this.queryFactory.query(DescriptionQuery.class); + DescriptionQuery query = this.queryFactory.query(DescriptionQuery.class).disableTracking(); query.setOrder(new Ordering().addAscending(Description._createdAt)); query.setPage(new Paging(page * pageSize, pageSize)); diff --git a/backend/core/src/main/java/org/opencdmp/service/filetransformer/FileTransformerServiceImpl.java b/backend/core/src/main/java/org/opencdmp/service/filetransformer/FileTransformerServiceImpl.java index bea4f264d..548e7b739 100644 --- a/backend/core/src/main/java/org/opencdmp/service/filetransformer/FileTransformerServiceImpl.java +++ b/backend/core/src/main/java/org/opencdmp/service/filetransformer/FileTransformerServiceImpl.java @@ -1,5 +1,13 @@ package org.opencdmp.service.filetransformer; +import gr.cite.commons.web.authz.service.AuthorizationService; +import gr.cite.commons.web.oidc.filter.webflux.TokenExchangeCacheService; +import gr.cite.commons.web.oidc.filter.webflux.TokenExchangeFilterFunction; +import gr.cite.commons.web.oidc.filter.webflux.TokenExchangeModel; +import gr.cite.tools.data.builder.BuilderFactory; +import gr.cite.tools.data.query.QueryFactory; +import gr.cite.tools.exception.MyNotFoundException; +import gr.cite.tools.fieldset.BaseFieldSet; import org.opencdmp.authorization.AuthorizationFlags; import org.opencdmp.authorization.Permission; import org.opencdmp.commonmodels.models.FileEnvelopeModel; @@ -16,10 +24,10 @@ import org.opencdmp.convention.ConventionService; import org.opencdmp.data.TenantConfigurationEntity; import org.opencdmp.event.TenantConfigurationTouchedEvent; import org.opencdmp.filetransformerbase.interfaces.FileTransformerConfiguration; -import org.opencdmp.model.description.Description; -import org.opencdmp.model.dmp.Dmp; import org.opencdmp.model.builder.commonmodels.description.DescriptionCommonModelBuilder; import org.opencdmp.model.builder.commonmodels.dmp.DmpCommonModelBuilder; +import org.opencdmp.model.description.Description; +import org.opencdmp.model.dmp.Dmp; import org.opencdmp.model.file.RepositoryFileFormat; import org.opencdmp.model.tenantconfiguration.TenantConfiguration; import org.opencdmp.query.DescriptionQuery; @@ -28,14 +36,6 @@ import org.opencdmp.query.TenantConfigurationQuery; import org.opencdmp.service.encryption.EncryptionService; import org.opencdmp.service.storage.StorageFileService; import org.opencdmp.service.tenant.TenantProperties; -import gr.cite.commons.web.authz.service.AuthorizationService; -import gr.cite.commons.web.oidc.filter.webflux.TokenExchangeCacheService; -import gr.cite.commons.web.oidc.filter.webflux.TokenExchangeFilterFunction; -import gr.cite.commons.web.oidc.filter.webflux.TokenExchangeModel; -import gr.cite.tools.data.builder.BuilderFactory; -import gr.cite.tools.data.query.QueryFactory; -import gr.cite.tools.exception.MyNotFoundException; -import gr.cite.tools.fieldset.BaseFieldSet; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -123,7 +123,7 @@ public class FileTransformerServiceImpl implements FileTransformerService { if (cacheValue == null) { List fileTransformerSourceEntities = new ArrayList<>(this.fileTransformerProperties.getSources()); if (this.tenantScope.isSet() && this.tenantScope.isMultitenant()) { - TenantConfigurationQuery tenantConfigurationQuery = this.queryFactory.query(TenantConfigurationQuery.class).isActive(IsActive.Active).types(TenantConfigurationType.FileTransformerPlugins); + TenantConfigurationQuery tenantConfigurationQuery = this.queryFactory.query(TenantConfigurationQuery.class).disableTracking().isActive(IsActive.Active).types(TenantConfigurationType.FileTransformerPlugins); if (this.tenantScope.isDefaultTenant()) tenantConfigurationQuery.tenantIsSet(false); else tenantConfigurationQuery.tenantIsSet(true).tenantIds(this.tenantScope.getTenant()); TenantConfigurationEntity tenantConfiguration = tenantConfigurationQuery.firstAs(new BaseFieldSet().ensure(TenantConfiguration._fileTransformerPlugins)); @@ -226,7 +226,7 @@ public class FileTransformerServiceImpl implements FileTransformerService { FileTransformerRepository repository = this.getRepository(repositoryId); if (repository == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{format, FileTransformerRepository.class.getSimpleName()}, LocaleContextHolder.getLocale())); //GK: Second get the Target Data Management Plan - DmpQuery query = this.queryFactory.query(DmpQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(dmpId); + DmpQuery query = this.queryFactory.query(DmpQuery.class).disableTracking().authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(dmpId); DmpModel dmpFileTransformerModel = this.builderFactory.builder(DmpCommonModelBuilder.class).useSharedStorage(repository.getConfiguration().isUseSharedStorage()).setRepositoryId(repository.getConfiguration().getFileTransformerId()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(query.first()); if (dmpFileTransformerModel == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{dmpId, Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); @@ -247,7 +247,7 @@ public class FileTransformerServiceImpl implements FileTransformerService { if (repository == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{format, FileTransformerRepository.class.getSimpleName()}, LocaleContextHolder.getLocale())); //GK: Second get the Target Data Management Plan - DescriptionQuery query = this.queryFactory.query(DescriptionQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(descriptionId); + DescriptionQuery query = this.queryFactory.query(DescriptionQuery.class).disableTracking().authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).ids(descriptionId); DescriptionModel descriptionFileTransformerModel = this.builderFactory.builder(DescriptionCommonModelBuilder.class).setRepositoryId(repository.getConfiguration().getFileTransformerId()).useSharedStorage(repository.getConfiguration().isUseSharedStorage()).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).build(query.first()); if (descriptionFileTransformerModel == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{descriptionId, Description.class.getSimpleName()}, LocaleContextHolder.getLocale())); diff --git a/backend/core/src/main/java/org/opencdmp/service/lock/LockServiceImpl.java b/backend/core/src/main/java/org/opencdmp/service/lock/LockServiceImpl.java index 40cd3a490..2d12dc55b 100644 --- a/backend/core/src/main/java/org/opencdmp/service/lock/LockServiceImpl.java +++ b/backend/core/src/main/java/org/opencdmp/service/lock/LockServiceImpl.java @@ -1,5 +1,17 @@ package org.opencdmp.service.lock; +import gr.cite.commons.web.authz.service.AuthorizationService; +import gr.cite.tools.data.builder.BuilderFactory; +import gr.cite.tools.data.deleter.DeleterFactory; +import gr.cite.tools.data.query.QueryFactory; +import gr.cite.tools.exception.MyApplicationException; +import gr.cite.tools.exception.MyForbiddenException; +import gr.cite.tools.exception.MyNotFoundException; +import gr.cite.tools.exception.MyValidationException; +import gr.cite.tools.fieldset.BaseFieldSet; +import gr.cite.tools.fieldset.FieldSet; +import gr.cite.tools.logging.LoggerService; +import gr.cite.tools.logging.MapLogEntry; import org.opencdmp.authorization.AffiliatedResource; import org.opencdmp.authorization.AuthorizationFlags; import org.opencdmp.authorization.Permission; @@ -16,18 +28,6 @@ import org.opencdmp.model.builder.LockBuilder; import org.opencdmp.model.deleter.LockDeleter; import org.opencdmp.model.persist.LockPersist; import org.opencdmp.query.LockQuery; -import gr.cite.commons.web.authz.service.AuthorizationService; -import gr.cite.tools.data.builder.BuilderFactory; -import gr.cite.tools.data.deleter.DeleterFactory; -import gr.cite.tools.data.query.QueryFactory; -import gr.cite.tools.exception.MyApplicationException; -import gr.cite.tools.exception.MyForbiddenException; -import gr.cite.tools.exception.MyNotFoundException; -import gr.cite.tools.exception.MyValidationException; -import gr.cite.tools.fieldset.BaseFieldSet; -import gr.cite.tools.fieldset.FieldSet; -import gr.cite.tools.logging.LoggerService; -import gr.cite.tools.logging.MapLogEntry; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; @@ -94,7 +94,7 @@ public class LockServiceImpl implements LockService { LockEntity data; if (isUpdate) { data = this.entityManager.find(LockEntity.class, model.getId()); - if (data == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), Lock.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (data == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), Lock.class.getSimpleName()}, LocaleContextHolder.getLocale())); if (!data.getLockedBy().equals(this.userScope.getUserId())) throw new MyApplicationException("Is not locked by that user"); if (!this.conventionService.hashValue(data.getTouchedAt()).equals(model.getHash())) throw new MyValidationException(this.errors.getHashConflict().getCode(), this.errors.getHashConflict().getMessage()); } else { @@ -118,7 +118,7 @@ public class LockServiceImpl implements LockService { public LockStatus isLocked(UUID target, FieldSet fields) throws InvalidApplicationException { LockStatus lockStatus = new LockStatus(); - LockEntity lock = this.queryFactory.query(LockQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).targetIds(target).first(); + LockEntity lock = this.queryFactory.query(LockQuery.class).disableTracking().authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).targetIds(target).first(); if (lock == null) { lockStatus.setStatus(false); @@ -127,7 +127,7 @@ public class LockServiceImpl implements LockService { if (lock.getLockedBy().equals(this.userScope.getUserId())) lockStatus.setStatus(false); else { - if (new Date().getTime() - Date.from(lock.getTouchedAt()).getTime() > lockProperties.getLockInterval()) { + if (new Date().getTime() - Date.from(lock.getTouchedAt()).getTime() > this.lockProperties.getLockInterval()) { lockStatus.setStatus(false); this.deleteAndSave(lock.getId(), lock.getTarget()); } else lockStatus.setStatus(true); @@ -138,7 +138,7 @@ public class LockServiceImpl implements LockService { } public void lock(UUID target, LockTargetType targetType) throws InvalidApplicationException { - LockEntity lock = this.queryFactory.query(LockQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).targetIds(target).first(); + LockEntity lock = this.queryFactory.query(LockQuery.class).disableTracking().authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).targetIds(target).first(); if (lock == null) { this.persist(new LockPersist(target, targetType), null); }else{ @@ -151,7 +151,7 @@ public class LockServiceImpl implements LockService { public void touch(UUID target) throws InvalidApplicationException { LockEntity lock = this.queryFactory.query(LockQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).targetIds(target).first(); - if (lock == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{target, Lock.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (lock == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{target, Lock.class.getSimpleName()}, LocaleContextHolder.getLocale())); if (!lock.getLockedBy().equals(this.userScope.getUserId())) throw new MyApplicationException("Only the user who created that lock can touch it"); lock.setTouchedAt(Instant.now()); @@ -162,7 +162,7 @@ public class LockServiceImpl implements LockService { public void unlock(UUID target) throws InvalidApplicationException { LockEntity lock = this.queryFactory.query(LockQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).targetIds(target).first(); - if (lock == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{target, Lock.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (lock == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{target, Lock.class.getSimpleName()}, LocaleContextHolder.getLocale())); if (!lock.getLockedBy().equals(this.userScope.getUserId())) { throw new InvalidApplicationException("Only the user who created that lock can delete it"); } diff --git a/backend/core/src/main/java/org/opencdmp/service/maintenance/MaintenanceServiceImpl.java b/backend/core/src/main/java/org/opencdmp/service/maintenance/MaintenanceServiceImpl.java index fadce5d69..78632863f 100644 --- a/backend/core/src/main/java/org/opencdmp/service/maintenance/MaintenanceServiceImpl.java +++ b/backend/core/src/main/java/org/opencdmp/service/maintenance/MaintenanceServiceImpl.java @@ -1,5 +1,9 @@ package org.opencdmp.service.maintenance; +import gr.cite.commons.web.authz.service.AuthorizationService; +import gr.cite.tools.data.query.QueryFactory; +import gr.cite.tools.fieldset.BaseFieldSet; +import gr.cite.tools.logging.LoggerService; import org.opencdmp.authorization.Permission; import org.opencdmp.commons.enums.IsActive; import org.opencdmp.data.TenantEntity; @@ -14,10 +18,6 @@ import org.opencdmp.model.Tenant; import org.opencdmp.model.user.User; import org.opencdmp.query.TenantQuery; import org.opencdmp.query.UserQuery; -import gr.cite.commons.web.authz.service.AuthorizationService; -import gr.cite.tools.data.query.QueryFactory; -import gr.cite.tools.fieldset.BaseFieldSet; -import gr.cite.tools.logging.LoggerService; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; @@ -63,7 +63,7 @@ public class MaintenanceServiceImpl implements MaintenanceService { List inactiveUsers; try { this.entityManager.disableTenantFilters(); - UserQuery userQuery = queryFactory.query(UserQuery.class); + UserQuery userQuery = this.queryFactory.query(UserQuery.class).disableTracking(); userQuery.isActive(IsActive.Active); activeUsers = userQuery.collectAs(new BaseFieldSet().ensure(User._id)); userQuery.isActive(IsActive.Inactive); @@ -89,7 +89,7 @@ public class MaintenanceServiceImpl implements MaintenanceService { List inactiveTenants; try { this.entityManager.disableTenantFilters(); - TenantQuery tenantQuery = queryFactory.query(TenantQuery.class); + TenantQuery tenantQuery = this.queryFactory.query(TenantQuery.class).disableTracking(); tenantQuery.isActive(IsActive.Active); activeTenants = tenantQuery.collectAs(new BaseFieldSet().ensure(Tenant._id).ensure(Tenant._code)); tenantQuery.isActive(IsActive.Inactive); diff --git a/backend/core/src/main/java/org/opencdmp/service/metrics/MetricsServiceImpl.java b/backend/core/src/main/java/org/opencdmp/service/metrics/MetricsServiceImpl.java index 6dfc0da5d..602b95fbd 100644 --- a/backend/core/src/main/java/org/opencdmp/service/metrics/MetricsServiceImpl.java +++ b/backend/core/src/main/java/org/opencdmp/service/metrics/MetricsServiceImpl.java @@ -1,5 +1,11 @@ package org.opencdmp.service.metrics; +import gr.cite.commons.web.keycloak.api.configuration.KeycloakClientProperties; +import gr.cite.tools.data.query.QueryFactory; +import gr.cite.tools.fieldset.BaseFieldSet; +import gr.cite.tools.logging.LoggerService; +import io.micrometer.prometheus.PrometheusMeterRegistry; +import io.prometheus.client.Gauge; import org.opencdmp.commons.enums.*; import org.opencdmp.commons.metrics.MetricLabels; import org.opencdmp.commons.metrics.MetricNames; @@ -7,12 +13,6 @@ import org.opencdmp.data.DmpDescriptionTemplateEntity; import org.opencdmp.data.TenantEntityManager; import org.opencdmp.query.*; import org.opencdmp.service.keycloak.MyKeycloakAdminRestApi; -import gr.cite.commons.web.keycloak.api.configuration.KeycloakClientProperties; -import gr.cite.tools.data.query.QueryFactory; -import gr.cite.tools.fieldset.BaseFieldSet; -import gr.cite.tools.logging.LoggerService; -import io.micrometer.prometheus.PrometheusMeterRegistry; -import io.prometheus.client.Gauge; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; @@ -58,61 +58,61 @@ public class MetricsServiceImpl implements MetricsService { try { this.entityManager.disableTenantFilters(); - this.setGaugeValue(gauges, MetricNames.DMP, calculateDraftDmps(false), MetricLabels.DRAFT); - this.setGaugeValue(gauges, MetricNames.DMP, calculateFinalizedDmps(false), MetricLabels.FINALIZED); - this.setGaugeValue(gauges, MetricNames.DMP, calculatePublishedDmps(false), MetricLabels.PUBLISHED); - this.setGaugeValue(gauges, MetricNames.DMP, calculateDoiedDmps(false), MetricLabels.DOIED); + this.setGaugeValue(gauges, MetricNames.DMP, this.calculateDraftDmps(false), MetricLabels.DRAFT); + this.setGaugeValue(gauges, MetricNames.DMP, this.calculateFinalizedDmps(false), MetricLabels.FINALIZED); + this.setGaugeValue(gauges, MetricNames.DMP, this.calculatePublishedDmps(false), MetricLabels.PUBLISHED); + this.setGaugeValue(gauges, MetricNames.DMP, this.calculateDoiedDmps(false), MetricLabels.DOIED); - this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DMP, calculateDraftDmps(true), MetricLabels.DRAFT); - this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DMP, calculateFinalizedDmps(true), MetricLabels.FINALIZED); - this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DMP, calculatePublishedDmps(true), MetricLabels.PUBLISHED); - this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DMP, calculateDoiedDmps(true), MetricLabels.DOIED); + this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DMP, this.calculateDraftDmps(true), MetricLabels.DRAFT); + this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DMP, this.calculateFinalizedDmps(true), MetricLabels.FINALIZED); + this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DMP, this.calculatePublishedDmps(true), MetricLabels.PUBLISHED); + this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DMP, this.calculateDoiedDmps(true), MetricLabels.DOIED); - this.setGaugeValue(gauges, MetricNames.DMP_WITH_GRANT, calculateDraftDmpsWithGrant(false), MetricLabels.DRAFT); - this.setGaugeValue(gauges, MetricNames.DMP_WITH_GRANT, calculateFinalizedDmpsWithGrant(false), MetricLabels.FINALIZED); - this.setGaugeValue(gauges, MetricNames.DMP_WITH_GRANT, calculatePublishedDmpsWithGrant(false), MetricLabels.PUBLISHED); - this.setGaugeValue(gauges, MetricNames.DMP_WITH_GRANT, calculateDoiedDmpsWithGrant(false), MetricLabels.DOIED); + this.setGaugeValue(gauges, MetricNames.DMP_WITH_GRANT, this.calculateDraftDmpsWithGrant(false), MetricLabels.DRAFT); + this.setGaugeValue(gauges, MetricNames.DMP_WITH_GRANT, this.calculateFinalizedDmpsWithGrant(false), MetricLabels.FINALIZED); + this.setGaugeValue(gauges, MetricNames.DMP_WITH_GRANT, this.calculatePublishedDmpsWithGrant(false), MetricLabels.PUBLISHED); + this.setGaugeValue(gauges, MetricNames.DMP_WITH_GRANT, this.calculateDoiedDmpsWithGrant(false), MetricLabels.DOIED); - this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DMP_WITH_GRANT, calculateDraftDmpsWithGrant(true), MetricLabels.DRAFT); - this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DMP_WITH_GRANT, calculateFinalizedDmpsWithGrant(true), MetricLabels.FINALIZED); - this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DMP_WITH_GRANT, calculatePublishedDmpsWithGrant(true), MetricLabels.PUBLISHED); - this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DMP_WITH_GRANT, calculateDoiedDmpsWithGrant(true), MetricLabels.DOIED); + this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DMP_WITH_GRANT, this.calculateDraftDmpsWithGrant(true), MetricLabels.DRAFT); + this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DMP_WITH_GRANT, this.calculateFinalizedDmpsWithGrant(true), MetricLabels.FINALIZED); + this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DMP_WITH_GRANT, this.calculatePublishedDmpsWithGrant(true), MetricLabels.PUBLISHED); + this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DMP_WITH_GRANT, this.calculateDoiedDmpsWithGrant(true), MetricLabels.DOIED); - this.setGaugeValue(gauges, MetricNames.FUNDERS, calculateAllFunders(false), null); - this.setGaugeValue(gauges, MetricNames.GRANTS, calculateAllGrants(false), null); - this.setGaugeValue(gauges, MetricNames.PROJECTS, calculateAllProjects(false), null); - this.setGaugeValue(gauges, MetricNames.RESEARCHERS, calculateAllResearchers(false), null); + this.setGaugeValue(gauges, MetricNames.FUNDERS, this.calculateAllFunders(false), null); + this.setGaugeValue(gauges, MetricNames.GRANTS, this.calculateAllGrants(false), null); + this.setGaugeValue(gauges, MetricNames.PROJECTS, this.calculateAllProjects(false), null); + this.setGaugeValue(gauges, MetricNames.RESEARCHERS, this.calculateAllResearchers(false), null); - this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.FUNDERS, calculateAllFunders(true), null); - this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.GRANTS, calculateAllGrants(true), null); - this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.PROJECTS, calculateAllProjects(true), null); - this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.RESEARCHERS, calculateAllResearchers(true), null); + this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.FUNDERS, this.calculateAllFunders(true), null); + this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.GRANTS, this.calculateAllGrants(true), null); + this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.PROJECTS, this.calculateAllProjects(true), null); + this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.RESEARCHERS, this.calculateAllResearchers(true), null); - this.setGaugeValue(gauges, MetricNames.DATASET, calculateDraftDatasets(false), MetricLabels.DRAFT); - this.setGaugeValue(gauges, MetricNames.DATASET, calculateFinalizedDatasets(false), MetricLabels.FINALIZED); - this.setGaugeValue(gauges, MetricNames.DATASET, calculatePublishedDatasets(false), MetricLabels.PUBLISHED); - this.setGaugeValue(gauges, MetricNames.DATASET, calculateDoiedDatasets(false), MetricLabels.DOIED); + this.setGaugeValue(gauges, MetricNames.DATASET, this.calculateDraftDatasets(false), MetricLabels.DRAFT); + this.setGaugeValue(gauges, MetricNames.DATASET, this.calculateFinalizedDatasets(false), MetricLabels.FINALIZED); + this.setGaugeValue(gauges, MetricNames.DATASET, this.calculatePublishedDatasets(false), MetricLabels.PUBLISHED); + this.setGaugeValue(gauges, MetricNames.DATASET, this.calculateDoiedDatasets(false), MetricLabels.DOIED); - this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DATASET, calculateDraftDatasets(true), MetricLabels.DRAFT); - this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DATASET, calculateFinalizedDatasets(true), MetricLabels.FINALIZED); - this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DATASET, calculatePublishedDatasets(true), MetricLabels.PUBLISHED); - this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DATASET, calculateDoiedDatasets(true), MetricLabels.DOIED); + this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DATASET, this.calculateDraftDatasets(true), MetricLabels.DRAFT); + this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DATASET, this.calculateFinalizedDatasets(true), MetricLabels.FINALIZED); + this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DATASET, this.calculatePublishedDatasets(true), MetricLabels.PUBLISHED); + this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DATASET, this.calculateDoiedDatasets(true), MetricLabels.DOIED); - this.setGaugeValue(gauges, MetricNames.DATASET_TEMPLATE, calculateDraftTemplates(false), MetricLabels.DRAFT); - this.setGaugeValue(gauges, MetricNames.DATASET_TEMPLATE, calculateFinalizedTemplates(false), MetricLabels.ACTIVE); - this.setGaugeValue(gauges, MetricNames.DATASET_TEMPLATE, calculateUsedTemplates(false), MetricLabels.USED); + this.setGaugeValue(gauges, MetricNames.DATASET_TEMPLATE, this.calculateDraftTemplates(false), MetricLabels.DRAFT); + this.setGaugeValue(gauges, MetricNames.DATASET_TEMPLATE, this.calculateFinalizedTemplates(false), MetricLabels.ACTIVE); + this.setGaugeValue(gauges, MetricNames.DATASET_TEMPLATE, this.calculateUsedTemplates(false), MetricLabels.USED); - this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DATASET_TEMPLATE, calculateDraftTemplates(true), MetricLabels.DRAFT); - this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DATASET_TEMPLATE, calculateFinalizedTemplates(true), MetricLabels.ACTIVE); - this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DATASET_TEMPLATE, calculateUsedTemplates(true), MetricLabels.USED); + this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DATASET_TEMPLATE, this.calculateDraftTemplates(true), MetricLabels.DRAFT); + this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DATASET_TEMPLATE, this.calculateFinalizedTemplates(true), MetricLabels.ACTIVE); + this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DATASET_TEMPLATE, this.calculateUsedTemplates(true), MetricLabels.USED); - this.setGaugeValue(gauges, MetricNames.LANGUAGES, calculateLanguages(), null); + this.setGaugeValue(gauges, MetricNames.LANGUAGES, this.calculateLanguages(), null); this.setGaugeValue(gauges, MetricNames.INSTALLATIONS, 1d, null); this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.INSTALLATIONS, 1d, null); - this.setGaugeValue(gauges, MetricNames.USERS, calculateActiveUsers(), MetricLabels.LOGGEDIN); - this.setGaugeValue(gauges, MetricNames.USERS, calculateAllUsers(), MetricLabels.TOTAL); + this.setGaugeValue(gauges, MetricNames.USERS, this.calculateActiveUsers(), MetricLabels.LOGGEDIN); + this.setGaugeValue(gauges, MetricNames.USERS, this.calculateAllUsers(), MetricLabels.TOTAL); } catch (Exception e) { logger.error(e.getMessage(), e); } finally { @@ -122,168 +122,168 @@ public class MetricsServiceImpl implements MetricsService { @Override public Map gaugesBuild() { - registry.clear(); + this.registry.clear(); return Stream.of(new Object[][]{ - {MetricNames.DMP, Gauge.build().name(MetricNames.DMP).help("Number of managed DMPs").labelNames("status").register(registry.getPrometheusRegistry())}, - {MetricNames.NEXUS_PREFIX + MetricNames.DMP, Gauge.build().name(MetricNames.NEXUS_PREFIX + MetricNames.DMP).help("Number of managed DMPs during Nexus").labelNames("status").register(registry.getPrometheusRegistry())}, + {MetricNames.DMP, Gauge.build().name(MetricNames.DMP).help("Number of managed DMPs").labelNames("status").register(this.registry.getPrometheusRegistry())}, + {MetricNames.NEXUS_PREFIX + MetricNames.DMP, Gauge.build().name(MetricNames.NEXUS_PREFIX + MetricNames.DMP).help("Number of managed DMPs during Nexus").labelNames("status").register(this.registry.getPrometheusRegistry())}, - {MetricNames.FUNDERS, Gauge.build().name(MetricNames.FUNDERS).help("Number of registered Funders").register(registry.getPrometheusRegistry())}, - {MetricNames.GRANTS, Gauge.build().name(MetricNames.GRANTS).help("Number of registered Grants").register(registry.getPrometheusRegistry())}, - {MetricNames.PROJECTS, Gauge.build().name(MetricNames.PROJECTS).help("Number of registered Projects").register(registry.getPrometheusRegistry())}, - {MetricNames.RESEARCHERS, Gauge.build().name(MetricNames.RESEARCHERS).help("Number of Collaborators/Researchers").register(registry.getPrometheusRegistry())}, + {MetricNames.FUNDERS, Gauge.build().name(MetricNames.FUNDERS).help("Number of registered Funders").register(this.registry.getPrometheusRegistry())}, + {MetricNames.GRANTS, Gauge.build().name(MetricNames.GRANTS).help("Number of registered Grants").register(this.registry.getPrometheusRegistry())}, + {MetricNames.PROJECTS, Gauge.build().name(MetricNames.PROJECTS).help("Number of registered Projects").register(this.registry.getPrometheusRegistry())}, + {MetricNames.RESEARCHERS, Gauge.build().name(MetricNames.RESEARCHERS).help("Number of Collaborators/Researchers").register(this.registry.getPrometheusRegistry())}, - {MetricNames.NEXUS_PREFIX + MetricNames.FUNDERS, Gauge.build().name(MetricNames.NEXUS_PREFIX + MetricNames.FUNDERS).help("Number of registered Funders during Nexus").register(registry.getPrometheusRegistry())}, - {MetricNames.NEXUS_PREFIX + MetricNames.GRANTS, Gauge.build().name(MetricNames.NEXUS_PREFIX + MetricNames.GRANTS).help("Number of registered Grants during Nexus").register(registry.getPrometheusRegistry())}, - {MetricNames.NEXUS_PREFIX + MetricNames.PROJECTS, Gauge.build().name(MetricNames.NEXUS_PREFIX + MetricNames.PROJECTS).help("Number of registered Projects during Nexus").register(registry.getPrometheusRegistry())}, - {MetricNames.NEXUS_PREFIX + MetricNames.RESEARCHERS, Gauge.build().name(MetricNames.NEXUS_PREFIX + MetricNames.RESEARCHERS).help("Number of Collaborators/Researchers during Nexus").register(registry.getPrometheusRegistry())}, + {MetricNames.NEXUS_PREFIX + MetricNames.FUNDERS, Gauge.build().name(MetricNames.NEXUS_PREFIX + MetricNames.FUNDERS).help("Number of registered Funders during Nexus").register(this.registry.getPrometheusRegistry())}, + {MetricNames.NEXUS_PREFIX + MetricNames.GRANTS, Gauge.build().name(MetricNames.NEXUS_PREFIX + MetricNames.GRANTS).help("Number of registered Grants during Nexus").register(this.registry.getPrometheusRegistry())}, + {MetricNames.NEXUS_PREFIX + MetricNames.PROJECTS, Gauge.build().name(MetricNames.NEXUS_PREFIX + MetricNames.PROJECTS).help("Number of registered Projects during Nexus").register(this.registry.getPrometheusRegistry())}, + {MetricNames.NEXUS_PREFIX + MetricNames.RESEARCHERS, Gauge.build().name(MetricNames.NEXUS_PREFIX + MetricNames.RESEARCHERS).help("Number of Collaborators/Researchers during Nexus").register(this.registry.getPrometheusRegistry())}, - {MetricNames.DATASET, Gauge.build().name(MetricNames.DATASET).help("Number of managed Dataset Descriptions").labelNames("status").register(registry.getPrometheusRegistry())}, - {MetricNames.NEXUS_PREFIX + MetricNames.DATASET, Gauge.build().name(MetricNames.NEXUS_PREFIX + MetricNames.DATASET).help("Number of managed Dataset Descriptions during Nexus").labelNames("status").register(registry.getPrometheusRegistry())}, + {MetricNames.DATASET, Gauge.build().name(MetricNames.DATASET).help("Number of managed Dataset Descriptions").labelNames("status").register(this.registry.getPrometheusRegistry())}, + {MetricNames.NEXUS_PREFIX + MetricNames.DATASET, Gauge.build().name(MetricNames.NEXUS_PREFIX + MetricNames.DATASET).help("Number of managed Dataset Descriptions during Nexus").labelNames("status").register(this.registry.getPrometheusRegistry())}, - {MetricNames.DATASET_TEMPLATE, Gauge.build().name(MetricNames.DATASET_TEMPLATE).help("Number of dataset Templates").labelNames("status").register(registry.getPrometheusRegistry())}, - {MetricNames.NEXUS_PREFIX + MetricNames.DATASET_TEMPLATE, Gauge.build().name(MetricNames.NEXUS_PREFIX + MetricNames.DATASET_TEMPLATE).help("Number of dataset Templates during Nexus").labelNames("status").register(registry.getPrometheusRegistry())}, + {MetricNames.DATASET_TEMPLATE, Gauge.build().name(MetricNames.DATASET_TEMPLATE).help("Number of dataset Templates").labelNames("status").register(this.registry.getPrometheusRegistry())}, + {MetricNames.NEXUS_PREFIX + MetricNames.DATASET_TEMPLATE, Gauge.build().name(MetricNames.NEXUS_PREFIX + MetricNames.DATASET_TEMPLATE).help("Number of dataset Templates during Nexus").labelNames("status").register(this.registry.getPrometheusRegistry())}, - {MetricNames.USERS, Gauge.build().name(MetricNames.USERS).help("Number of users").labelNames("type").register(registry.getPrometheusRegistry())}, + {MetricNames.USERS, Gauge.build().name(MetricNames.USERS).help("Number of users").labelNames("type").register(this.registry.getPrometheusRegistry())}, - {MetricNames.LANGUAGES, Gauge.build().name(MetricNames.LANGUAGES).help("Number of Languages").register(registry.getPrometheusRegistry())}, + {MetricNames.LANGUAGES, Gauge.build().name(MetricNames.LANGUAGES).help("Number of Languages").register(this.registry.getPrometheusRegistry())}, - {MetricNames.DMP_WITH_GRANT, Gauge.build().name(MetricNames.DMP_WITH_GRANT).help("Number of Grants based on the status of the DMP that is using them").labelNames("status").register(registry.getPrometheusRegistry())}, - {MetricNames.NEXUS_PREFIX + MetricNames.DMP_WITH_GRANT, Gauge.build().name(MetricNames.NEXUS_PREFIX + MetricNames.DMP_WITH_GRANT).help("Number of Grants based on the status of the DMP that is using them during Nexus").labelNames("status").register(registry.getPrometheusRegistry())}, + {MetricNames.DMP_WITH_GRANT, Gauge.build().name(MetricNames.DMP_WITH_GRANT).help("Number of Grants based on the status of the DMP that is using them").labelNames("status").register(this.registry.getPrometheusRegistry())}, + {MetricNames.NEXUS_PREFIX + MetricNames.DMP_WITH_GRANT, Gauge.build().name(MetricNames.NEXUS_PREFIX + MetricNames.DMP_WITH_GRANT).help("Number of Grants based on the status of the DMP that is using them during Nexus").labelNames("status").register(this.registry.getPrometheusRegistry())}, - {MetricNames.INSTALLATIONS, Gauge.build().name(MetricNames.INSTALLATIONS).help("Number of Installations").register(registry.getPrometheusRegistry())}, - {MetricNames.NEXUS_PREFIX + MetricNames.INSTALLATIONS, Gauge.build().name(MetricNames.NEXUS_PREFIX + MetricNames.INSTALLATIONS).help("Number of Installations").register(registry.getPrometheusRegistry())}, + {MetricNames.INSTALLATIONS, Gauge.build().name(MetricNames.INSTALLATIONS).help("Number of Installations").register(this.registry.getPrometheusRegistry())}, + {MetricNames.NEXUS_PREFIX + MetricNames.INSTALLATIONS, Gauge.build().name(MetricNames.NEXUS_PREFIX + MetricNames.INSTALLATIONS).help("Number of Installations").register(this.registry.getPrometheusRegistry())}, }).collect(Collectors.toMap(data -> (String) data[0], data -> (Gauge) data[1])); } private double calculateDraftDmps(boolean forNexus) { - DmpQuery dmpQuery = this.queryFactory.query(DmpQuery.class).statuses(DmpStatus.Draft).isActive(IsActive.Active); + DmpQuery dmpQuery = this.queryFactory.query(DmpQuery.class).disableTracking().statuses(DmpStatus.Draft).isActive(IsActive.Active); if (forNexus) - dmpQuery.after(_config.getNexusDate()); + dmpQuery.after(this._config.getNexusDate()); return dmpQuery.count(); } private double calculateFinalizedDmps(boolean forNexus) { - DmpQuery dmpQuery = this.queryFactory.query(DmpQuery.class).statuses(DmpStatus.Finalized).isActive(IsActive.Active); + DmpQuery dmpQuery = this.queryFactory.query(DmpQuery.class).disableTracking().statuses(DmpStatus.Finalized).isActive(IsActive.Active); if (forNexus) - dmpQuery.after(_config.getNexusDate()); + dmpQuery.after(this._config.getNexusDate()); return dmpQuery.count(); } private double calculatePublishedDmps(boolean forNexus) { - DmpQuery dmpQuery = this.queryFactory.query(DmpQuery.class).statuses(DmpStatus.Finalized).accessTypes(DmpAccessType.Public).isActive(IsActive.Active); + DmpQuery dmpQuery = this.queryFactory.query(DmpQuery.class).disableTracking().statuses(DmpStatus.Finalized).accessTypes(DmpAccessType.Public).isActive(IsActive.Active); if (forNexus) - dmpQuery.after(_config.getNexusDate()); + dmpQuery.after(this._config.getNexusDate()); return dmpQuery.count(); } private double calculateDoiedDmps(boolean forNexus) { - DmpQuery dmpQuery = this.queryFactory.query(DmpQuery.class).isActive(IsActive.Active); + DmpQuery dmpQuery = this.queryFactory.query(DmpQuery.class).disableTracking().isActive(IsActive.Active); if (forNexus) - dmpQuery.after(_config.getNexusDate()); - EntityDoiQuery entityDoiQuery = this.queryFactory.query(EntityDoiQuery.class).types(EntityType.DMP).isActive(IsActive.Active); + dmpQuery.after(this._config.getNexusDate()); + EntityDoiQuery entityDoiQuery = this.queryFactory.query(EntityDoiQuery.class).disableTracking().types(EntityType.DMP).isActive(IsActive.Active); dmpQuery.entityDoiSubQuery(entityDoiQuery); dmpQuery.setDistinct(true); return dmpQuery.count(); } private double calculateDraftDmpsWithGrant(boolean forNexus) { - DmpQuery dmpQuery = this.queryFactory.query(DmpQuery.class).statuses(DmpStatus.Draft).isActive(IsActive.Active); + DmpQuery dmpQuery = this.queryFactory.query(DmpQuery.class).statuses(DmpStatus.Draft).disableTracking().isActive(IsActive.Active); if (forNexus) - dmpQuery.after(_config.getNexusDate()); - ReferenceQuery referenceQuery = this.queryFactory.query(ReferenceQuery.class).typeIds(_config.getReferenceTypes().getGrantIds()).isActive(IsActive.Active); - DmpReferenceQuery dmpReferenceQuery = this.queryFactory.query(DmpReferenceQuery.class).referenceSubQuery(referenceQuery).isActives(IsActive.Active); + dmpQuery.after(this._config.getNexusDate()); + ReferenceQuery referenceQuery = this.queryFactory.query(ReferenceQuery.class).disableTracking().typeIds(this._config.getReferenceTypes().getGrantIds()).isActive(IsActive.Active); + DmpReferenceQuery dmpReferenceQuery = this.queryFactory.query(DmpReferenceQuery.class).disableTracking().referenceSubQuery(referenceQuery).isActives(IsActive.Active); dmpQuery.dmpReferenceSubQuery(dmpReferenceQuery); return dmpQuery.count(); } private double calculateFinalizedDmpsWithGrant(boolean forNexus) { - DmpQuery dmpQuery = this.queryFactory.query(DmpQuery.class).statuses(DmpStatus.Finalized).isActive(IsActive.Active); + DmpQuery dmpQuery = this.queryFactory.query(DmpQuery.class).disableTracking().statuses(DmpStatus.Finalized).isActive(IsActive.Active); if (forNexus) - dmpQuery.after(_config.getNexusDate()); - ReferenceQuery referenceQuery = this.queryFactory.query(ReferenceQuery.class).typeIds(_config.getReferenceTypes().getGrantIds()).isActive(IsActive.Active); - DmpReferenceQuery dmpReferenceQuery = this.queryFactory.query(DmpReferenceQuery.class).referenceSubQuery(referenceQuery).isActives(IsActive.Active); + dmpQuery.after(this._config.getNexusDate()); + ReferenceQuery referenceQuery = this.queryFactory.query(ReferenceQuery.class).disableTracking().typeIds(this._config.getReferenceTypes().getGrantIds()).isActive(IsActive.Active); + DmpReferenceQuery dmpReferenceQuery = this.queryFactory.query(DmpReferenceQuery.class).disableTracking().referenceSubQuery(referenceQuery).isActives(IsActive.Active); dmpQuery.dmpReferenceSubQuery(dmpReferenceQuery); return dmpQuery.count(); } private double calculatePublishedDmpsWithGrant(boolean forNexus) { - DmpQuery dmpQuery = this.queryFactory.query(DmpQuery.class).statuses(DmpStatus.Finalized).accessTypes(DmpAccessType.Public).isActive(IsActive.Active); + DmpQuery dmpQuery = this.queryFactory.query(DmpQuery.class).statuses(DmpStatus.Finalized).disableTracking().accessTypes(DmpAccessType.Public).isActive(IsActive.Active); if (forNexus) - dmpQuery.after(_config.getNexusDate()); - ReferenceQuery referenceQuery = this.queryFactory.query(ReferenceQuery.class).typeIds(_config.getReferenceTypes().getGrantIds()).isActive(IsActive.Active); - DmpReferenceQuery dmpReferenceQuery = this.queryFactory.query(DmpReferenceQuery.class).referenceSubQuery(referenceQuery).isActives(IsActive.Active); + dmpQuery.after(this._config.getNexusDate()); + ReferenceQuery referenceQuery = this.queryFactory.query(ReferenceQuery.class).disableTracking().typeIds(this._config.getReferenceTypes().getGrantIds()).isActive(IsActive.Active); + DmpReferenceQuery dmpReferenceQuery = this.queryFactory.query(DmpReferenceQuery.class).disableTracking().referenceSubQuery(referenceQuery).isActives(IsActive.Active); dmpQuery.dmpReferenceSubQuery(dmpReferenceQuery); return dmpQuery.count(); } private double calculateDoiedDmpsWithGrant(boolean forNexus) { - DmpQuery dmpQuery = this.queryFactory.query(DmpQuery.class).isActive(IsActive.Active); + DmpQuery dmpQuery = this.queryFactory.query(DmpQuery.class).disableTracking().isActive(IsActive.Active); if (forNexus) - dmpQuery.after(_config.getNexusDate()); - ReferenceQuery referenceQuery = this.queryFactory.query(ReferenceQuery.class).typeIds(_config.getReferenceTypes().getGrantIds()).isActive(IsActive.Active); - DmpReferenceQuery dmpReferenceQuery = this.queryFactory.query(DmpReferenceQuery.class).referenceSubQuery(referenceQuery).isActives(IsActive.Active); + dmpQuery.after(this._config.getNexusDate()); + ReferenceQuery referenceQuery = this.queryFactory.query(ReferenceQuery.class).disableTracking().typeIds(this._config.getReferenceTypes().getGrantIds()).isActive(IsActive.Active); + DmpReferenceQuery dmpReferenceQuery = this.queryFactory.query(DmpReferenceQuery.class).disableTracking().referenceSubQuery(referenceQuery).isActives(IsActive.Active); dmpQuery.dmpReferenceSubQuery(dmpReferenceQuery); - EntityDoiQuery entityDoiQuery = this.queryFactory.query(EntityDoiQuery.class).isActive(IsActive.Active); + EntityDoiQuery entityDoiQuery = this.queryFactory.query(EntityDoiQuery.class).disableTracking().isActive(IsActive.Active); dmpQuery.entityDoiSubQuery(entityDoiQuery); return dmpQuery.count(); } private double calculateAllFunders(boolean forNexus) { - ReferenceQuery referenceQuery = this.queryFactory.query(ReferenceQuery.class).typeIds(_config.getReferenceTypes().getFunderIds()).isActive(IsActive.Active); + ReferenceQuery referenceQuery = this.queryFactory.query(ReferenceQuery.class).disableTracking().typeIds(this._config.getReferenceTypes().getFunderIds()).isActive(IsActive.Active); if (forNexus) - referenceQuery.after(_config.getNexusDate()); + referenceQuery.after(this._config.getNexusDate()); return referenceQuery.count(); } private double calculateAllGrants(boolean forNexus) { - ReferenceQuery referenceQuery = this.queryFactory.query(ReferenceQuery.class).typeIds(_config.getReferenceTypes().getGrantIds()).isActive(IsActive.Active); + ReferenceQuery referenceQuery = this.queryFactory.query(ReferenceQuery.class).disableTracking().typeIds(this._config.getReferenceTypes().getGrantIds()).isActive(IsActive.Active); if (forNexus) - referenceQuery.after(_config.getNexusDate()); + referenceQuery.after(this._config.getNexusDate()); return referenceQuery.count(); } private double calculateAllProjects(boolean forNexus) { - ReferenceQuery referenceQuery = this.queryFactory.query(ReferenceQuery.class).typeIds(_config.getReferenceTypes().getProjectIds()).isActive(IsActive.Active); + ReferenceQuery referenceQuery = this.queryFactory.query(ReferenceQuery.class).disableTracking().typeIds(this._config.getReferenceTypes().getProjectIds()).isActive(IsActive.Active); if (forNexus) - referenceQuery.after(_config.getNexusDate()); + referenceQuery.after(this._config.getNexusDate()); return referenceQuery.count(); } private double calculateAllResearchers(boolean forNexus) { - ReferenceQuery referenceQuery = this.queryFactory.query(ReferenceQuery.class).typeIds(_config.getReferenceTypes().getResearcherIds()).isActive(IsActive.Active); + ReferenceQuery referenceQuery = this.queryFactory.query(ReferenceQuery.class).disableTracking().typeIds(this._config.getReferenceTypes().getResearcherIds()).isActive(IsActive.Active); if (forNexus) - referenceQuery.after(_config.getNexusDate()); + referenceQuery.after(this._config.getNexusDate()); return referenceQuery.count(); } private double calculateDraftDatasets(boolean forNexus) { - DescriptionQuery descriptionQuery = this.queryFactory.query(DescriptionQuery.class).statuses(DescriptionStatus.Draft).isActive(IsActive.Active); + DescriptionQuery descriptionQuery = this.queryFactory.query(DescriptionQuery.class).disableTracking().statuses(DescriptionStatus.Draft).isActive(IsActive.Active); if (forNexus) - descriptionQuery.createdAfter(_config.getNexusDate()); + descriptionQuery.createdAfter(this._config.getNexusDate()); return descriptionQuery.count(); } private double calculateFinalizedDatasets(boolean forNexus) { - DescriptionQuery descriptionQuery = this.queryFactory.query(DescriptionQuery.class).statuses(DescriptionStatus.Finalized).isActive(IsActive.Active); + DescriptionQuery descriptionQuery = this.queryFactory.query(DescriptionQuery.class).disableTracking().statuses(DescriptionStatus.Finalized).isActive(IsActive.Active); if (forNexus) - descriptionQuery.createdAfter(_config.getNexusDate()); + descriptionQuery.createdAfter(this._config.getNexusDate()); return descriptionQuery.count(); } private double calculatePublishedDatasets(boolean forNexus) { - DescriptionQuery descriptionQuery = this.queryFactory.query(DescriptionQuery.class).statuses(DescriptionStatus.Finalized).isActive(IsActive.Active); + DescriptionQuery descriptionQuery = this.queryFactory.query(DescriptionQuery.class).disableTracking().statuses(DescriptionStatus.Finalized).isActive(IsActive.Active); if (forNexus) - descriptionQuery.createdAfter(_config.getNexusDate()); - DmpQuery dmpQuery = this.queryFactory.query(DmpQuery.class).isActive(IsActive.Active).statuses(DmpStatus.Finalized).accessTypes(DmpAccessType.Public); + descriptionQuery.createdAfter(this._config.getNexusDate()); + DmpQuery dmpQuery = this.queryFactory.query(DmpQuery.class).isActive(IsActive.Active).disableTracking().statuses(DmpStatus.Finalized).accessTypes(DmpAccessType.Public); descriptionQuery.dmpSubQuery(dmpQuery); return descriptionQuery.count(); } private double calculateDoiedDatasets(boolean forNexus) { - DescriptionQuery descriptionQuery = this.queryFactory.query(DescriptionQuery.class).statuses(DescriptionStatus.Finalized).isActive(IsActive.Active); + DescriptionQuery descriptionQuery = this.queryFactory.query(DescriptionQuery.class).disableTracking().statuses(DescriptionStatus.Finalized).isActive(IsActive.Active); if (forNexus) - descriptionQuery.createdAfter(_config.getNexusDate()); + descriptionQuery.createdAfter(this._config.getNexusDate()); DmpQuery dmpQuery = this.queryFactory.query(DmpQuery.class).isActive(IsActive.Active); EntityDoiQuery entityDoiQuery = this.queryFactory.query(EntityDoiQuery.class).types(EntityType.DMP).isActive(IsActive.Active); dmpQuery.entityDoiSubQuery(entityDoiQuery); @@ -293,24 +293,24 @@ public class MetricsServiceImpl implements MetricsService { } private double calculateDraftTemplates(boolean forNexus) { - DescriptionTemplateQuery descriptionTemplateQuery = this.queryFactory.query(DescriptionTemplateQuery.class).statuses(DescriptionTemplateStatus.Draft).isActive(IsActive.Active); + DescriptionTemplateQuery descriptionTemplateQuery = this.queryFactory.query(DescriptionTemplateQuery.class).disableTracking().statuses(DescriptionTemplateStatus.Draft).isActive(IsActive.Active); if (forNexus) - descriptionTemplateQuery.after(_config.getNexusDate()); + descriptionTemplateQuery.after(this._config.getNexusDate()); return descriptionTemplateQuery.count(); } private double calculateFinalizedTemplates(boolean forNexus) { - DescriptionTemplateQuery descriptionTemplateQuery = this.queryFactory.query(DescriptionTemplateQuery.class).statuses(DescriptionTemplateStatus.Finalized).versionStatuses(DescriptionTemplateVersionStatus.Current).isActive(IsActive.Active); + DescriptionTemplateQuery descriptionTemplateQuery = this.queryFactory.query(DescriptionTemplateQuery.class).disableTracking().statuses(DescriptionTemplateStatus.Finalized).versionStatuses(DescriptionTemplateVersionStatus.Current).isActive(IsActive.Active); if (forNexus) - descriptionTemplateQuery.after(_config.getNexusDate()); + descriptionTemplateQuery.after(this._config.getNexusDate()); return descriptionTemplateQuery.count(); } private double calculateUsedTemplates(boolean forNexus) { - DmpDescriptionTemplateQuery dmpDescriptionTemplateQuery = this.queryFactory.query(DmpDescriptionTemplateQuery.class).isActive(IsActive.Active); + DmpDescriptionTemplateQuery dmpDescriptionTemplateQuery = this.queryFactory.query(DmpDescriptionTemplateQuery.class).disableTracking().isActive(IsActive.Active); dmpDescriptionTemplateQuery.setDistinct(true); if (forNexus) { - DescriptionTemplateQuery descriptionTemplateQuery = this.queryFactory.query(DescriptionTemplateQuery.class).isActive(IsActive.Active).after(_config.getNexusDate()); + DescriptionTemplateQuery descriptionTemplateQuery = this.queryFactory.query(DescriptionTemplateQuery.class).disableTracking().isActive(IsActive.Active).after(this._config.getNexusDate()); dmpDescriptionTemplateQuery.descriptionTemplateSubQuery(descriptionTemplateQuery); } return dmpDescriptionTemplateQuery.collectAs(new BaseFieldSet().ensure(DmpDescriptionTemplateEntity._descriptionTemplateGroupId)).size(); @@ -319,7 +319,7 @@ public class MetricsServiceImpl implements MetricsService { private double calculateActiveUsers() { double result = -1; try { - result = this.keycloakAdminRestApi.users().getUserSessionsCountByClientId(_config.getUsersLoginClient()); + result = this.keycloakAdminRestApi.users().getUserSessionsCountByClientId(this._config.getUsersLoginClient()); } catch (Exception e) { logger.error(e.getMessage(), e); } @@ -327,12 +327,12 @@ public class MetricsServiceImpl implements MetricsService { } private double calculateAllUsers() { - UserQuery userQuery = this.queryFactory.query(UserQuery.class).isActive(IsActive.Active); + UserQuery userQuery = this.queryFactory.query(UserQuery.class).disableTracking().isActive(IsActive.Active); return userQuery.count(); } private double calculateLanguages() { - LanguageQuery languageQuery = this.queryFactory.query(LanguageQuery.class).isActive(IsActive.Active); + LanguageQuery languageQuery = this.queryFactory.query(LanguageQuery.class).disableTracking().isActive(IsActive.Active); return languageQuery.count(); } diff --git a/backend/core/src/main/java/org/opencdmp/service/prefillingsource/PrefillingSourceServiceImpl.java b/backend/core/src/main/java/org/opencdmp/service/prefillingsource/PrefillingSourceServiceImpl.java index c2a71bafd..f2290ba78 100644 --- a/backend/core/src/main/java/org/opencdmp/service/prefillingsource/PrefillingSourceServiceImpl.java +++ b/backend/core/src/main/java/org/opencdmp/service/prefillingsource/PrefillingSourceServiceImpl.java @@ -315,7 +315,7 @@ public class PrefillingSourceServiceImpl implements PrefillingSourceService { } public List searchPrefillings(PrefillingSearchRequest model) { - PrefillingSourceEntity prefillingSourceEntity = this.queryFactory.query(PrefillingSourceQuery.class).ids(model.getPrefillingSourceId()).isActive(IsActive.Active).first(); + PrefillingSourceEntity prefillingSourceEntity = this.queryFactory.query(PrefillingSourceQuery.class).disableTracking().ids(model.getPrefillingSourceId()).isActive(IsActive.Active).first(); if (prefillingSourceEntity == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getPrefillingSourceId(), PrefillingSource.class.getSimpleName()}, LocaleContextHolder.getLocale())); @@ -350,7 +350,7 @@ public class PrefillingSourceServiceImpl implements PrefillingSourceService { public Description getPrefilledDescription(DescriptionPrefillingRequest model, FieldSet fieldSet) throws JAXBException, ParserConfigurationException, IOException, InstantiationException, IllegalAccessException, SAXException, InvalidApplicationException { - PrefillingSourceEntity prefillingSourceEntity = this.queryFactory.query(PrefillingSourceQuery.class).ids(model.getPrefillingSourceId()).first(); + PrefillingSourceEntity prefillingSourceEntity = this.queryFactory.query(PrefillingSourceQuery.class).disableTracking().ids(model.getPrefillingSourceId()).first(); if (prefillingSourceEntity == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getPrefillingSourceId(), PrefillingSource.class.getSimpleName()}, LocaleContextHolder.getLocale())); PrefillingSourceDefinitionEntity prefillingSourceDefinition = this.xmlHandlingService.fromXmlSafe(PrefillingSourceDefinitionEntity.class, prefillingSourceEntity.getDefinition()); diff --git a/backend/core/src/main/java/org/opencdmp/service/reference/ReferenceServiceImpl.java b/backend/core/src/main/java/org/opencdmp/service/reference/ReferenceServiceImpl.java index 42fc18a9c..20e521b77 100644 --- a/backend/core/src/main/java/org/opencdmp/service/reference/ReferenceServiceImpl.java +++ b/backend/core/src/main/java/org/opencdmp/service/reference/ReferenceServiceImpl.java @@ -160,7 +160,7 @@ public class ReferenceServiceImpl implements ReferenceService { public Boolean findReference(String reference, UUID referenceTypeId){ if (this.conventionService.isNullOrEmpty(reference) || !this.conventionService.isValidGuid(referenceTypeId)) return false; - ReferenceQuery query = this.queryFactory.query(ReferenceQuery.class).references(reference).typeIds(referenceTypeId).isActive(IsActive.Active); + ReferenceQuery query = this.queryFactory.query(ReferenceQuery.class).disableTracking().references(reference).typeIds(referenceTypeId).isActive(IsActive.Active); if (query != null && query.count() > 0) return true; return false; diff --git a/backend/core/src/main/java/org/opencdmp/service/supportivematerial/SupportiveMaterialServiceImpl.java b/backend/core/src/main/java/org/opencdmp/service/supportivematerial/SupportiveMaterialServiceImpl.java index ed43bde2d..556f73785 100644 --- a/backend/core/src/main/java/org/opencdmp/service/supportivematerial/SupportiveMaterialServiceImpl.java +++ b/backend/core/src/main/java/org/opencdmp/service/supportivematerial/SupportiveMaterialServiceImpl.java @@ -1,5 +1,18 @@ package org.opencdmp.service.supportivematerial; +import gr.cite.commons.web.authz.service.AuthorizationService; +import gr.cite.tools.data.builder.BuilderFactory; +import gr.cite.tools.data.deleter.DeleterFactory; +import gr.cite.tools.data.query.QueryFactory; +import gr.cite.tools.exception.MyApplicationException; +import gr.cite.tools.exception.MyForbiddenException; +import gr.cite.tools.exception.MyNotFoundException; +import gr.cite.tools.exception.MyValidationException; +import gr.cite.tools.fieldset.BaseFieldSet; +import gr.cite.tools.fieldset.FieldSet; +import gr.cite.tools.logging.LoggerService; +import gr.cite.tools.logging.MapLogEntry; +import jakarta.xml.bind.JAXBException; import org.opencdmp.authorization.AuthorizationFlags; import org.opencdmp.authorization.Permission; import org.opencdmp.commons.enums.IsActive; @@ -14,19 +27,6 @@ import org.opencdmp.model.persist.SupportiveMaterialPersist; import org.opencdmp.query.SupportiveMaterialQuery; import org.opencdmp.service.dmpblueprint.DmpBlueprintServiceImpl; import org.opencdmp.service.storage.StorageFileService; -import gr.cite.commons.web.authz.service.AuthorizationService; -import gr.cite.tools.data.builder.BuilderFactory; -import gr.cite.tools.data.deleter.DeleterFactory; -import gr.cite.tools.data.query.QueryFactory; -import gr.cite.tools.exception.MyApplicationException; -import gr.cite.tools.exception.MyForbiddenException; -import gr.cite.tools.exception.MyNotFoundException; -import gr.cite.tools.exception.MyValidationException; -import gr.cite.tools.fieldset.BaseFieldSet; -import gr.cite.tools.fieldset.FieldSet; -import gr.cite.tools.logging.LoggerService; -import gr.cite.tools.logging.MapLogEntry; -import jakarta.xml.bind.JAXBException; import org.slf4j.LoggerFactory; import org.springframework.context.MessageSource; import org.springframework.context.i18n.LocaleContextHolder; @@ -93,9 +93,9 @@ public class SupportiveMaterialServiceImpl implements SupportiveMaterialService{ if (isUpdate) { d = this.entityManager.find(SupportiveMaterialEntity.class, model.getId()); if (d == null) - throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), SupportiveMaterial.class.getSimpleName()}, LocaleContextHolder.getLocale())); + throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), SupportiveMaterial.class.getSimpleName()}, LocaleContextHolder.getLocale())); } else { - List data = this.queryFactory.query(SupportiveMaterialQuery.class).authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).languageCodes(model.getLanguageCode()).types(model.getType()).collect(); + List data = this.queryFactory.query(SupportiveMaterialQuery.class).disableTracking().authorize(AuthorizationFlags.OwnerOrDmpAssociatedOrPermission).languageCodes(model.getLanguageCode()).types(model.getType()).collect(); if(data != null && !data.isEmpty()){ throw new MyApplicationException("Could not create a new Data with same type and lang code !"); diff --git a/backend/core/src/main/java/org/opencdmp/service/tenant/TenantServiceImpl.java b/backend/core/src/main/java/org/opencdmp/service/tenant/TenantServiceImpl.java index 26fb42d1e..311f67f5f 100644 --- a/backend/core/src/main/java/org/opencdmp/service/tenant/TenantServiceImpl.java +++ b/backend/core/src/main/java/org/opencdmp/service/tenant/TenantServiceImpl.java @@ -151,8 +151,8 @@ public class TenantServiceImpl implements TenantService { try { this.tenantScope.setTempTenant(this.entityManager.getEntityManager(), null, this.tenantScope.getDefaultTenantCode()); - existingItems = this.queryFactory.query(UserRoleQuery.class).tenantIsSet(false).roles(this.authorizationProperties.getGlobalAdminRole()).collect(); - userCredentialEntities = this.queryFactory.query(UserCredentialQuery.class).userIds(existingItems.stream().map(UserRoleEntity::getUserId).distinct().toList()).collect(); + existingItems = this.queryFactory.query(UserRoleQuery.class).disableTracking().tenantIsSet(false).roles(this.authorizationProperties.getGlobalAdminRole()).collect(); + userCredentialEntities = this.queryFactory.query(UserCredentialQuery.class).disableTracking().userIds(existingItems.stream().map(UserRoleEntity::getUserId).distinct().toList()).collect(); } finally { this.tenantScope.removeTempTenant(this.entityManager.getEntityManager()); } diff --git a/backend/core/src/main/java/org/opencdmp/service/tenantconfiguration/TenantConfigurationServiceImpl.java b/backend/core/src/main/java/org/opencdmp/service/tenantconfiguration/TenantConfigurationServiceImpl.java index 7b969335d..8cdaf9713 100644 --- a/backend/core/src/main/java/org/opencdmp/service/tenantconfiguration/TenantConfigurationServiceImpl.java +++ b/backend/core/src/main/java/org/opencdmp/service/tenantconfiguration/TenantConfigurationServiceImpl.java @@ -1,6 +1,19 @@ package org.opencdmp.service.tenantconfiguration; import com.fasterxml.jackson.core.JsonProcessingException; +import gr.cite.commons.web.authz.service.AuthorizationService; +import gr.cite.tools.data.builder.BuilderFactory; +import gr.cite.tools.data.deleter.DeleterFactory; +import gr.cite.tools.data.query.QueryFactory; +import gr.cite.tools.exception.MyApplicationException; +import gr.cite.tools.exception.MyForbiddenException; +import gr.cite.tools.exception.MyNotFoundException; +import gr.cite.tools.exception.MyValidationException; +import gr.cite.tools.fieldset.BaseFieldSet; +import gr.cite.tools.fieldset.FieldSet; +import gr.cite.tools.logging.LoggerService; +import gr.cite.tools.logging.MapLogEntry; +import org.jetbrains.annotations.NotNull; import org.opencdmp.authorization.AuthorizationFlags; import org.opencdmp.authorization.Permission; import org.opencdmp.commons.JsonHandlingService; @@ -33,19 +46,6 @@ import org.opencdmp.query.TenantConfigurationQuery; import org.opencdmp.service.encryption.EncryptionService; import org.opencdmp.service.storage.StorageFileService; import org.opencdmp.service.tenant.TenantProperties; -import gr.cite.commons.web.authz.service.AuthorizationService; -import gr.cite.tools.data.builder.BuilderFactory; -import gr.cite.tools.data.deleter.DeleterFactory; -import gr.cite.tools.data.query.QueryFactory; -import gr.cite.tools.exception.MyApplicationException; -import gr.cite.tools.exception.MyForbiddenException; -import gr.cite.tools.exception.MyNotFoundException; -import gr.cite.tools.exception.MyValidationException; -import gr.cite.tools.fieldset.BaseFieldSet; -import gr.cite.tools.fieldset.FieldSet; -import gr.cite.tools.logging.LoggerService; -import gr.cite.tools.logging.MapLogEntry; -import org.jetbrains.annotations.NotNull; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; @@ -132,7 +132,7 @@ public class TenantConfigurationServiceImpl implements TenantConfigurationServic TenantConfigurationEntity data; if (isUpdate) { data = this.entityManager.find(TenantConfigurationEntity.class, model.getId()); - if (data == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), TenantConfiguration.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (data == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), TenantConfiguration.class.getSimpleName()}, LocaleContextHolder.getLocale())); if (!this.conventionService.hashValue(data.getUpdatedAt()).equals(model.getHash())) throw new MyValidationException(this.errors.getHashConflict().getCode(), this.errors.getHashConflict().getMessage()); if (!data.getType().equals(model.getType())) throw new MyValidationException(this.errors.getTenantConfigurationTypeCanNotChange().getCode(), this.errors.getTenantConfigurationTypeCanNotChange().getMessage()); } else { @@ -143,7 +143,7 @@ public class TenantConfigurationServiceImpl implements TenantConfigurationServic data.setType(model.getType()); } - TenantConfigurationQuery tenantConfigurationQuery = this.queryFactory.query(TenantConfigurationQuery.class).excludedIds(data.getId()).isActive(IsActive.Active).types(data.getType()); + TenantConfigurationQuery tenantConfigurationQuery = this.queryFactory.query(TenantConfigurationQuery.class).disableTracking().excludedIds(data.getId()).isActive(IsActive.Active).types(data.getType()); if (data.getTenantId() == null) tenantConfigurationQuery.tenantIsSet(false); else tenantConfigurationQuery.tenantIsSet(true).tenantIds(data.getTenantId()); if (tenantConfigurationQuery.count() > 0)throw new MyValidationException(this.errors.getMultipleTenantConfigurationTypeNotAllowed().getCode(), this.errors.getMultipleTenantConfigurationTypeNotAllowed().getMessage()); @@ -169,7 +169,7 @@ public class TenantConfigurationServiceImpl implements TenantConfigurationServic if (data.getTenantId() != null) { TenantEntity tenant = this.entityManager.find(TenantEntity.class, data.getTenantId()); - if (tenant == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{data.getTenantId(), TenantEntity.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (tenant == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{data.getTenantId(), TenantEntity.class.getSimpleName()}, LocaleContextHolder.getLocale())); this.eventBroker.emit(new TenantConfigurationTouchedEvent(tenant.getId(), tenant.getCode(), data.getType())); } else { this.eventBroker.emit(new TenantConfigurationTouchedEvent(data.getId(), this.tenantScope.getDefaultTenantCode(), data.getType())); @@ -281,7 +281,7 @@ public class TenantConfigurationServiceImpl implements TenantConfigurationServic this.authorizationService.authorizeForce(Permission.DeleteTenantConfiguration); TenantConfigurationEntity data = this.entityManager.find(TenantConfigurationEntity.class, id); - if (data == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, TenantConfiguration.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (data == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{id, TenantConfiguration.class.getSimpleName()}, LocaleContextHolder.getLocale())); if (data.getType().equals(TenantConfigurationType.Logo)){ LogoTenantConfigurationEntity oldValue = this.conventionService.isNullOrEmpty(data.getValue()) ? null : this.jsonHandlingService.fromJsonSafe(LogoTenantConfigurationEntity.class, data.getValue()); @@ -291,7 +291,7 @@ public class TenantConfigurationServiceImpl implements TenantConfigurationServic if (data.getTenantId() != null) { TenantEntity tenant = this.entityManager.find(TenantEntity.class, data.getTenantId()); - if (tenant == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{data.getTenantId(), TenantEntity.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (tenant == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{data.getTenantId(), TenantEntity.class.getSimpleName()}, LocaleContextHolder.getLocale())); this.eventBroker.emit(new TenantConfigurationTouchedEvent(tenant.getId(), tenant.getCode(), data.getType())); } else { this.eventBroker.emit(new TenantConfigurationTouchedEvent(data.getId(), this.tenantScope.getDefaultTenantCode(), data.getType())); diff --git a/backend/core/src/main/java/org/opencdmp/service/user/UserServiceImpl.java b/backend/core/src/main/java/org/opencdmp/service/user/UserServiceImpl.java index b532fc80c..62e5bed17 100644 --- a/backend/core/src/main/java/org/opencdmp/service/user/UserServiceImpl.java +++ b/backend/core/src/main/java/org/opencdmp/service/user/UserServiceImpl.java @@ -1,46 +1,6 @@ package org.opencdmp.service.user; import com.fasterxml.jackson.core.JsonProcessingException; -import org.opencdmp.authorization.AuthorizationFlags; -import org.opencdmp.authorization.AuthorizationProperties; -import org.opencdmp.authorization.OwnedResource; -import org.opencdmp.authorization.Permission; -import org.opencdmp.commons.JsonHandlingService; -import org.opencdmp.commons.XmlHandlingService; -import org.opencdmp.commons.enums.ActionConfirmationStatus; -import org.opencdmp.commons.enums.ActionConfirmationType; -import org.opencdmp.commons.enums.ContactInfoType; -import org.opencdmp.commons.enums.IsActive; -import org.opencdmp.commons.enums.notification.NotificationContactType; -import org.opencdmp.commons.scope.tenant.TenantScope; -import org.opencdmp.commons.scope.user.UserScope; -import org.opencdmp.commons.types.actionconfirmation.MergeAccountConfirmationEntity; -import org.opencdmp.commons.types.actionconfirmation.RemoveCredentialRequestEntity; -import org.opencdmp.commons.types.notification.*; -import org.opencdmp.commons.types.user.AdditionalInfoEntity; -import org.opencdmp.commons.types.usercredential.UserCredentialDataEntity; -import org.opencdmp.commons.notification.NotificationProperties; -import org.opencdmp.convention.ConventionService; -import org.opencdmp.data.*; -import org.opencdmp.errorcode.ErrorThesaurusProperties; -import org.opencdmp.event.UserTouchedEvent; -import org.opencdmp.event.EventBroker; -import org.opencdmp.integrationevent.outbox.notification.NotifyIntegrationEvent; -import org.opencdmp.integrationevent.outbox.notification.NotifyIntegrationEventHandler; -import org.opencdmp.integrationevent.outbox.userremoval.UserRemovalIntegrationEventHandler; -import org.opencdmp.integrationevent.outbox.usertouched.UserTouchedIntegrationEventHandler; -import org.opencdmp.model.user.User; -import org.opencdmp.model.UserContactInfo; -import org.opencdmp.model.usercredential.UserCredential; -import org.opencdmp.model.builder.UserBuilder; -import org.opencdmp.model.deleter.*; -import org.opencdmp.model.persist.*; -import org.opencdmp.model.persist.actionconfirmation.MergeAccountConfirmationPersist; -import org.opencdmp.model.persist.actionconfirmation.RemoveCredentialRequestPersist; -import org.opencdmp.query.*; -import org.opencdmp.service.actionconfirmation.ActionConfirmationService; -import org.opencdmp.service.elastic.ElasticService; -import org.opencdmp.service.keycloak.KeycloakService; import gr.cite.commons.web.authz.service.AuthorizationService; import gr.cite.tools.data.builder.BuilderFactory; import gr.cite.tools.data.deleter.DeleterFactory; @@ -60,6 +20,46 @@ import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVPrinter; import org.apache.commons.csv.QuoteMode; import org.jetbrains.annotations.NotNull; +import org.opencdmp.authorization.AuthorizationFlags; +import org.opencdmp.authorization.AuthorizationProperties; +import org.opencdmp.authorization.OwnedResource; +import org.opencdmp.authorization.Permission; +import org.opencdmp.commons.JsonHandlingService; +import org.opencdmp.commons.XmlHandlingService; +import org.opencdmp.commons.enums.ActionConfirmationStatus; +import org.opencdmp.commons.enums.ActionConfirmationType; +import org.opencdmp.commons.enums.ContactInfoType; +import org.opencdmp.commons.enums.IsActive; +import org.opencdmp.commons.enums.notification.NotificationContactType; +import org.opencdmp.commons.notification.NotificationProperties; +import org.opencdmp.commons.scope.tenant.TenantScope; +import org.opencdmp.commons.scope.user.UserScope; +import org.opencdmp.commons.types.actionconfirmation.MergeAccountConfirmationEntity; +import org.opencdmp.commons.types.actionconfirmation.RemoveCredentialRequestEntity; +import org.opencdmp.commons.types.notification.*; +import org.opencdmp.commons.types.user.AdditionalInfoEntity; +import org.opencdmp.commons.types.usercredential.UserCredentialDataEntity; +import org.opencdmp.convention.ConventionService; +import org.opencdmp.data.*; +import org.opencdmp.errorcode.ErrorThesaurusProperties; +import org.opencdmp.event.EventBroker; +import org.opencdmp.event.UserTouchedEvent; +import org.opencdmp.integrationevent.outbox.notification.NotifyIntegrationEvent; +import org.opencdmp.integrationevent.outbox.notification.NotifyIntegrationEventHandler; +import org.opencdmp.integrationevent.outbox.userremoval.UserRemovalIntegrationEventHandler; +import org.opencdmp.integrationevent.outbox.usertouched.UserTouchedIntegrationEventHandler; +import org.opencdmp.model.UserContactInfo; +import org.opencdmp.model.builder.UserBuilder; +import org.opencdmp.model.deleter.*; +import org.opencdmp.model.persist.*; +import org.opencdmp.model.persist.actionconfirmation.MergeAccountConfirmationPersist; +import org.opencdmp.model.persist.actionconfirmation.RemoveCredentialRequestPersist; +import org.opencdmp.model.user.User; +import org.opencdmp.model.usercredential.UserCredential; +import org.opencdmp.query.*; +import org.opencdmp.service.actionconfirmation.ActionConfirmationService; +import org.opencdmp.service.elastic.ElasticService; +import org.opencdmp.service.keycloak.KeycloakService; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; @@ -71,7 +71,9 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.time.Instant; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; import java.util.stream.Collectors; @Service @@ -161,7 +163,7 @@ public class UserServiceImpl implements UserService { UserEntity data; if (isUpdate) { data = this.entityManager.find(UserEntity.class, model.getId()); - if (data == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), User.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (data == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), User.class.getSimpleName()}, LocaleContextHolder.getLocale())); if (!this.conventionService.hashValue(data.getUpdatedAt()).equals(model.getHash())) throw new MyValidationException(this.errors.getHashConflict().getCode(), this.errors.getHashConflict().getMessage()); } else { data = new UserEntity(); @@ -220,7 +222,7 @@ public class UserServiceImpl implements UserService { this.authorizationService.authorizeForce(Permission.ExportUsers); FieldSet fieldSet = new BaseFieldSet().ensure(User._id).ensure(User._name).ensure(User._contacts + "." + UserContactInfo._value).ensure(User._contacts + "." + UserContactInfo._type); - List users = this.builderFactory.builder(UserBuilder.class).build(fieldSet, this.queryFactory.query(UserQuery.class).collectAs(fieldSet)); + List users = this.builderFactory.builder(UserBuilder.class).build(fieldSet, this.queryFactory.query(UserQuery.class).disableTracking().collectAs(fieldSet)); final ByteArrayOutputStream out = new ByteArrayOutputStream(); final CSVFormat format = CSVFormat.DEFAULT.withHeader("User Id", "User Name", "User Email").withQuoteMode(QuoteMode.NON_NUMERIC); final CSVPrinter csvPrinter = new CSVPrinter(new PrintWriter(out), format); @@ -242,10 +244,10 @@ public class UserServiceImpl implements UserService { this.authorizationService.authorizeForce(Permission.EditUser); UserEntity data = this.entityManager.find(UserEntity.class, model.getId()); - if (data == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), User.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (data == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getId(), User.class.getSimpleName()}, LocaleContextHolder.getLocale())); if (!this.conventionService.hashValue(data.getUpdatedAt()).equals(model.getHash())) throw new MyValidationException(this.errors.getHashConflict().getCode(), this.errors.getHashConflict().getMessage()); - List userCredentials = this.queryFactory.query(UserCredentialQuery.class).userIds(data.getId()).collect(); + List userCredentials = this.queryFactory.query(UserCredentialQuery.class).disableTracking().userIds(data.getId()).collect(); if (userCredentials.isEmpty()) throw new MyApplicationException("Currently cannot update roles for this user"); if (userCredentials.getFirst().getExternalId() == null) @@ -297,10 +299,10 @@ public class UserServiceImpl implements UserService { } private void applyTenantRoles(UUID userId, String subjectId, UserRolePatchPersist model) throws InvalidApplicationException { - if (!tenantScope.isSet()) throw new MyForbiddenException("tenant scope required"); + if (!this.tenantScope.isSet()) throw new MyForbiddenException("tenant scope required"); UserRoleQuery userRoleQuery = this.queryFactory.query(UserRoleQuery.class).userIds(userId).roles(this.authorizationProperties.getAllowedTenantRoles()); - if (tenantScope.isDefaultTenant()) userRoleQuery.tenantIsSet(false); + if (this.tenantScope.isDefaultTenant()) userRoleQuery.tenantIsSet(false); else userRoleQuery.tenantIsSet(true).tenantIds(this.tenantScope.getTenant()); List existingItems = userRoleQuery.collect(); @@ -348,7 +350,7 @@ public class UserServiceImpl implements UserService { UserEntity data = this.entityManager.find(UserEntity.class, userId); - if (data == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{userId, User.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (data == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{userId, User.class.getSimpleName()}, LocaleContextHolder.getLocale())); AdditionalInfoEntity additionalInfoEntity = this.jsonHandlingService.fromJsonSafe(AdditionalInfoEntity.class, data.getAdditionalInfo()); if (additionalInfoEntity == null) additionalInfoEntity = new AdditionalInfoEntity(); @@ -376,7 +378,7 @@ public class UserServiceImpl implements UserService { UserEntity data = this.entityManager.find(UserEntity.class, userId); - if (data == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{userId, User.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (data == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{userId, User.class.getSimpleName()}, LocaleContextHolder.getLocale())); AdditionalInfoEntity additionalInfoEntity = this.jsonHandlingService.fromJsonSafe(AdditionalInfoEntity.class, data.getAdditionalInfo()); if (additionalInfoEntity == null) additionalInfoEntity = new AdditionalInfoEntity(); @@ -403,7 +405,7 @@ public class UserServiceImpl implements UserService { if (userId == null) throw new MyForbiddenException(this.errors.getForbidden().getCode(), this.errors.getForbidden().getMessage()); UserEntity data = this.entityManager.find(UserEntity.class, userId); - if (data == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{userId, User.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (data == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{userId, User.class.getSimpleName()}, LocaleContextHolder.getLocale())); AdditionalInfoEntity additionalInfoEntity = this.jsonHandlingService.fromJsonSafe(AdditionalInfoEntity.class, data.getAdditionalInfo()); if (additionalInfoEntity == null) additionalInfoEntity = new AdditionalInfoEntity(); @@ -425,14 +427,14 @@ public class UserServiceImpl implements UserService { //notifications public void sendMergeAccountConfirmation(UserMergeRequestPersist model) throws InvalidApplicationException, JAXBException { - UserContactInfoEntity userContactInfoEntity = this.queryFactory.query(UserContactInfoQuery.class).values(model.getEmail()).types(ContactInfoType.Email).first(); - if (userContactInfoEntity == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getEmail(), User.class.getSimpleName()}, LocaleContextHolder.getLocale())); + UserContactInfoEntity userContactInfoEntity = this.queryFactory.query(UserContactInfoQuery.class).disableTracking().values(model.getEmail()).types(ContactInfoType.Email).first(); + if (userContactInfoEntity == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getEmail(), User.class.getSimpleName()}, LocaleContextHolder.getLocale())); UserEntity user = this.queryFactory.query(UserQuery.class).ids(userContactInfoEntity.getUserId()).isActive(IsActive.Active).first(); - if (user == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{userContactInfoEntity.getUserId(), User.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (user == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{userContactInfoEntity.getUserId(), User.class.getSimpleName()}, LocaleContextHolder.getLocale())); String token = this.createMergeAccountConfirmation(model.getEmail()); - createMergeNotificationEvent(token, user, model.getEmail(), NotificationContactType.EMAIL); + this.createMergeNotificationEvent(token, user, model.getEmail(), NotificationContactType.EMAIL); } private void createMergeNotificationEvent(String token, UserEntity user, String email, NotificationContactType type) throws InvalidApplicationException { @@ -441,22 +443,22 @@ public class UserServiceImpl implements UserService { List contactPairs = new ArrayList<>(); contactPairs.add(new ContactPair(ContactInfoType.Email, email)); NotificationContactData contactData = new NotificationContactData(contactPairs, null, null); - event.setContactHint(jsonHandlingService.toJsonSafe(contactData)); + event.setContactHint(this.jsonHandlingService.toJsonSafe(contactData)); event.setContactTypeHint(type); - event.setNotificationType(notificationProperties.getMergeAccountConfirmationType()); + event.setNotificationType(this.notificationProperties.getMergeAccountConfirmationType()); NotificationFieldData data = new NotificationFieldData(); List fieldInfoList = new ArrayList<>(); fieldInfoList.add(new FieldInfo("{userName}", DataType.String, user.getName())); fieldInfoList.add(new FieldInfo("{confirmationToken}", DataType.String, token)); fieldInfoList.add(new FieldInfo("{expiration_time}", DataType.String, this.secondsToTime(this.notificationProperties.getEmailExpirationTimeSeconds()))); data.setFields(fieldInfoList); - event.setData(jsonHandlingService.toJsonSafe(data)); - eventHandler.handle(event); + event.setData(this.jsonHandlingService.toJsonSafe(data)); + this.eventHandler.handle(event); } public void sendRemoveCredentialConfirmation(RemoveCredentialRequestPersist model) throws InvalidApplicationException, JAXBException { UserCredentialEntity data = this.entityManager.find(UserCredentialEntity.class, model.getCredentialId()); - if (data == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{model.getCredentialId(), UserCredentialEntity.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (data == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{model.getCredentialId(), UserCredentialEntity.class.getSimpleName()}, LocaleContextHolder.getLocale())); if (!data.getUserId().equals(this.userScope.getUserId())) throw new MyForbiddenException(this.errors.getForbidden().getCode(), this.errors.getForbidden().getMessage()); @@ -468,14 +470,14 @@ public class UserServiceImpl implements UserService { NotifyIntegrationEvent event = new NotifyIntegrationEvent(); event.setUserId(userId); event.setContactTypeHint(type); - event.setNotificationType(notificationProperties.getRemoveCredentialConfirmationType()); + event.setNotificationType(this.notificationProperties.getRemoveCredentialConfirmationType()); NotificationFieldData data = new NotificationFieldData(); List fieldInfoList = new ArrayList<>(); fieldInfoList.add(new FieldInfo("{confirmationToken}", DataType.String, token)); fieldInfoList.add(new FieldInfo("{expiration_time}", DataType.String, this.secondsToTime(this.notificationProperties.getEmailExpirationTimeSeconds()))); data.setFields(fieldInfoList); - event.setData(jsonHandlingService.toJsonSafe(data)); - eventHandler.handle(event); + event.setData(this.jsonHandlingService.toJsonSafe(data)); + this.eventHandler.handle(event); } private String createMergeAccountConfirmation(String email) throws JAXBException, InvalidApplicationException { @@ -486,7 +488,7 @@ public class UserServiceImpl implements UserService { persist.setMergeAccountConfirmation(new MergeAccountConfirmationPersist()); persist.getMergeAccountConfirmation().setEmail(email); persist.setExpiresAt(Instant.now().plusSeconds(this.notificationProperties.getEmailExpirationTimeSeconds())); - validatorFactory.validator(ActionConfirmationPersist.ActionConfirmationPersistValidator.class).validateForce(persist); + this.validatorFactory.validator(ActionConfirmationPersist.ActionConfirmationPersistValidator.class).validateForce(persist); this.actionConfirmationService.persist(persist, null); return persist.getToken(); @@ -502,7 +504,7 @@ public class UserServiceImpl implements UserService { persist.setRemoveCredentialRequest(new RemoveCredentialRequestPersist()); persist.getRemoveCredentialRequest().setCredentialId(credentialId); persist.setExpiresAt(Instant.now().plusSeconds(this.notificationProperties.getEmailExpirationTimeSeconds())); - validatorFactory.validator(ActionConfirmationPersist.ActionConfirmationPersistValidator.class).validateForce(persist); + this.validatorFactory.validator(ActionConfirmationPersist.ActionConfirmationPersistValidator.class).validateForce(persist); this.actionConfirmationService.persist(persist, null); return persist.getToken(); @@ -518,23 +520,23 @@ public class UserServiceImpl implements UserService { public void confirmMergeAccount(String token) throws IOException, InvalidApplicationException { ActionConfirmationEntity action = this.queryFactory.query(ActionConfirmationQuery.class).tokens(token).types(ActionConfirmationType.MergeAccount).isActive(IsActive.Active).first(); - if (action == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{token, ActionConfirmationEntity.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (action == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{token, ActionConfirmationEntity.class.getSimpleName()}, LocaleContextHolder.getLocale())); this.checkActionState(action); MergeAccountConfirmationEntity mergeAccountConfirmationEntity = this.xmlHandlingService.fromXmlSafe(MergeAccountConfirmationEntity.class, action.getData()); - if (mergeAccountConfirmationEntity == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{mergeAccountConfirmationEntity, MergeAccountConfirmationEntity.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (mergeAccountConfirmationEntity == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{mergeAccountConfirmationEntity, MergeAccountConfirmationEntity.class.getSimpleName()}, LocaleContextHolder.getLocale())); UserContactInfoEntity userContactInfoEntity = this.queryFactory.query(UserContactInfoQuery.class).values(mergeAccountConfirmationEntity.getEmail()).types(ContactInfoType.Email).first(); - if (userContactInfoEntity == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{mergeAccountConfirmationEntity.getEmail(), User.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (userContactInfoEntity == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{mergeAccountConfirmationEntity.getEmail(), User.class.getSimpleName()}, LocaleContextHolder.getLocale())); UserEntity userToBeMerge = this.queryFactory.query(UserQuery.class).ids(userContactInfoEntity.getUserId()).isActive(IsActive.Active).first(); - if (userToBeMerge == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{userContactInfoEntity.getUserId(), User.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (userToBeMerge == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{userContactInfoEntity.getUserId(), User.class.getSimpleName()}, LocaleContextHolder.getLocale())); if (!this.userScope.getUserIdSafe().equals(userToBeMerge.getId())) throw new MyForbiddenException("Only requested user can approve"); UserEntity newUser = this.queryFactory.query(UserQuery.class).ids(action.getCreatedById()).isActive(IsActive.Active).first(); - if (newUser == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{action.getCreatedById(), User.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (newUser == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{action.getCreatedById(), User.class.getSimpleName()}, LocaleContextHolder.getLocale())); if (!newUser.getId().equals(userToBeMerge.getId())){ this.mergeNewUserToOld(newUser, userToBeMerge); @@ -656,15 +658,15 @@ public class UserServiceImpl implements UserService { public void confirmRemoveCredential(String token) throws InvalidApplicationException { ActionConfirmationEntity action = this.queryFactory.query(ActionConfirmationQuery.class).tokens(token).types(ActionConfirmationType.RemoveCredential).isActive(IsActive.Active).first(); - if (action == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{token, ActionConfirmationEntity.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (action == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{token, ActionConfirmationEntity.class.getSimpleName()}, LocaleContextHolder.getLocale())); this.checkActionState(action); RemoveCredentialRequestEntity removeCredentialRequestEntity = this.xmlHandlingService.fromXmlSafe(RemoveCredentialRequestEntity.class, action.getData()); - if (removeCredentialRequestEntity == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{removeCredentialRequestEntity, RemoveCredentialRequestEntity.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (removeCredentialRequestEntity == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{removeCredentialRequestEntity, RemoveCredentialRequestEntity.class.getSimpleName()}, LocaleContextHolder.getLocale())); UserCredentialEntity userCredentialEntity = this.queryFactory.query(UserCredentialQuery.class).ids(removeCredentialRequestEntity.getCredentialId()).first(); - if (userCredentialEntity == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{removeCredentialRequestEntity.getCredentialId(), UserCredential.class.getSimpleName()}, LocaleContextHolder.getLocale())); + if (userCredentialEntity == null) throw new MyNotFoundException(this.messageSource.getMessage("General_ItemNotFound", new Object[]{removeCredentialRequestEntity.getCredentialId(), UserCredential.class.getSimpleName()}, LocaleContextHolder.getLocale())); if (!this.userScope.getUserIdSafe().equals(userCredentialEntity.getId())) throw new MyForbiddenException("Only requested user can approve");