Code development platform for open source projects from the European Union institutions :large_blue_circle: EU Login authentication by SMS will be completely phased out by mid-2025. To see alternatives please check here

Skip to content
Snippets Groups Projects
Commit ae354fa9 authored by Joze RIHTARSIC's avatar Joze RIHTARSIC
Browse files

Pull request #189: [EDELIVERY-14194] Unlink referenced document before deletion

Merge in EDELIVERY/smp from bugfix/EDELIVERY-14194-edit-resources-error-when-trying-to-delete-a-resource-which-is-used-as-a to development

* commit '1a4381ec':
  [EDELIVERY-14194] Unlink referenced document before deletion
parents 121baf69 1a4381ec
No related branches found
No related tags found
No related merge requests found
<h3 mat-dialog-title>{{title}}</h3>
<mat-dialog-content style="min-width:500px;max-width:900px">
<mat-dialog-content style="min-width:500px;max-width:900px;overflow: hidden">
<div class="panel" style="word-break: break-word" innerHTML={{description}}></div>
</mat-dialog-content>
<mat-dialog-actions>
......
<h2 mat-dialog-title>{{formTitle}}</h2>
<mat-dialog-content style="width:700px">
<mat-dialog-content style="width:700px;overflow: hidden">
<div *ngIf="message"
[ngClass]="{ 'alert-message': message, 'alert-message-success': messageType === 'success',
'alert-message-error':messageType === 'error',
......
......@@ -34,6 +34,7 @@ import javax.persistence.NonUniqueResultException;
import javax.persistence.TypedQuery;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;
import static eu.europa.ec.edelivery.smp.data.dao.QueryNames.*;
......@@ -203,6 +204,26 @@ public class DocumentDao extends BaseDao<DBDocument> {
return query.getSingleResult();
}
/**
* Method retrieved all the documents where given document is set as target and un-link the documents
*
* @param document the target document
*/
public void unlinkDocument(DBDocument document){
if (document == null || document.getId() == null) {
LOG.debug("Can not unlink document, because document is not persisted to the database");
return;
}
TypedQuery<DBDocument> query = memEManager.createNamedQuery(QUERY_DOCUMENT_LIST_FOR_TARGET_DOCUMENT, DBDocument.class);
query.setParameter(PARAM_DOCUMENT_ID, document.getId());
// user stream ulink to capture audit record
try (Stream<DBDocument> streamDocument = query.getResultStream()) {
streamDocument.forEach(linkedDoc -> {
linkedDoc.setReferenceDocument(null);
});
}
}
/**
* Method creates query for searching reference document resources
*
......
......@@ -130,12 +130,14 @@ public class QueryNames {
public static final String QUERY_SEARCH_DOCUMENT_REFERENCES = "DBDocument.getDocumentReferences";
public static final String QUERY_SEARCH_DOCUMENT_REFERENCES_COUNT = "DBDocument.getDocumentReferencesCount";
public static final String QUERY_DOCUMENT_FOR_SUBRESOURCE = "DBDocument.getForSubresource";
public static final String QUERY_DOCUMENT_LIST_FOR_TARGET_DOCUMENT = "DBDocument.getAllDocumentsForTargetDocument";
public static final String QUERY_SEARCH_DOCUMENT_REFERENCES_FOR_SUBRESOURCES = "DBDocument.getDocumentReferencesForSubresources";
public static final String QUERY_SEARCH_DOCUMENT_REFERENCES_FOR_SUBRESOURCES_COUNT = "DBDocument.getDocumentReferencesForSubresourcesCount";
public static final String QUERY_DOCUMENT_VERSION_CURRENT_FOR_RESOURCE = "DBDocumentVersion.forCurrentForResource";
public static final String QUERY_DOCUMENT_VERSION_LIST_FOR_RESOURCE = "DBDocumentVersion.getAllForResource";
public static final String QUERY_DOCUMENT_VERSION_CURRENT_FOR_DOCUMENT = "DBDocumentVersion.forCurrentForDocument";
public static final String QUERY_DOCUMENT_VERSION_CURRENT_FOR_SUBRESOURCE = "DBDocumentVersion.forCurrentForSubresource";
......
......@@ -140,6 +140,7 @@ import static eu.europa.ec.edelivery.smp.data.dao.QueryNames.*;
" AND (:subresource_identifier IS NULL OR lower(sr.identifierValue) like (:subresource_identifier))" +
" AND (:subresource_scheme IS NULL OR lower(sr.identifierScheme) like (:subresource_scheme))")
@NamedQuery(name = QUERY_DOCUMENT_LIST_FOR_TARGET_DOCUMENT, query = "SELECT d FROM DBDocument d WHERE d.referenceDocument.id =:document_id")
public class DBDocument extends BaseEntity {
private static final SMPLogger LOG = SMPLoggerFactory.getLogger(DBDocument.class);
@Id
......
......@@ -78,6 +78,7 @@ public class UIResourceService {
private final GroupDao groupDao;
private final ResourceMemberDao resourceMemberDao;
private final UserDao userDao;
private final DocumentDao documentDao;
private final ResourceDefDao resourceDefDao;
private final DomainResourceDefDao domainResourceDefDao;
private final IdentifierService identifierService;
......@@ -87,7 +88,10 @@ public class UIResourceService {
private final DocumentVersionService documentVersionService;
public UIResourceService(ResourceDao resourceDao, ResourceMemberDao resourceMemberDao, ResourceDefDao resourceDefDao,
public UIResourceService(ResourceDao resourceDao,
ResourceMemberDao resourceMemberDao,
ResourceDefDao resourceDefDao,
DocumentDao documentDao,
DomainResourceDefDao domainResourceDefDao, UserDao userDao, GroupDao groupDao,
IdentifierService identifierService,
ConversionService conversionService,
......@@ -96,6 +100,7 @@ public class UIResourceService {
this.resourceDao = resourceDao;
this.resourceMemberDao = resourceMemberDao;
this.resourceDefDao = resourceDefDao;
this.documentDao = documentDao;
this.domainResourceDefDao = domainResourceDefDao;
this.groupDao = groupDao;
this.userDao = userDao;
......@@ -192,6 +197,9 @@ public class UIResourceService {
smlIntegrationService.unregisterParticipant(resource, resourceDomain);
}
// remove all documents where resource is used as reference
documentDao.unlinkDocument(resource.getDocument());
resourceDao.remove(resource);
return conversionService.convert(resource, ResourceRO.class);
}
......@@ -308,7 +316,7 @@ public class UIResourceService {
uiDocumentService.updateToNonReviewStatuses(resource.getDocument());
// update statuses for all subresources
resource.getSubresources().forEach(subResource ->
uiDocumentService.updateToNonReviewStatuses(subResource.getDocument()));
uiDocumentService.updateToNonReviewStatuses(subResource.getDocument()));
}
resource.setReviewEnabled(isTrue(resourceRO.isReviewEnabled()));
}
......
......@@ -8,9 +8,9 @@
* versions of the EUPL (the "Licence");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
*
* [PROJECT_HOME]\license\eupl-1.2\license.txt or https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
*
* Unless required by applicable law or agreed to in writing, software distributed under the Licence is
* distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the Licence for the specific language governing permissions and limitations under the Licence.
......@@ -18,15 +18,15 @@
*/
package eu.europa.ec.edelivery.smp.services.ui;
import eu.europa.ec.edelivery.smp.data.enums.DocumentVersionStatusType;
import eu.europa.ec.edelivery.smp.data.enums.EventSourceType;
import eu.europa.ec.edelivery.smp.data.model.DBDomain;
import eu.europa.ec.edelivery.smp.data.model.doc.DBDocumentVersion;
import eu.europa.ec.edelivery.smp.services.IdentifierService;
import eu.europa.ec.edelivery.smp.data.dao.DocumentDao;
import eu.europa.ec.edelivery.smp.data.dao.ResourceDao;
import eu.europa.ec.edelivery.smp.data.dao.SubresourceDao;
import eu.europa.ec.edelivery.smp.data.dao.SubresourceDefDao;
import eu.europa.ec.edelivery.smp.data.enums.DocumentVersionStatusType;
import eu.europa.ec.edelivery.smp.data.enums.EventSourceType;
import eu.europa.ec.edelivery.smp.data.model.DBDomain;
import eu.europa.ec.edelivery.smp.data.model.doc.DBDocument;
import eu.europa.ec.edelivery.smp.data.model.doc.DBDocumentVersion;
import eu.europa.ec.edelivery.smp.data.model.doc.DBResource;
import eu.europa.ec.edelivery.smp.data.model.doc.DBSubresource;
import eu.europa.ec.edelivery.smp.data.model.ext.DBSubresourceDef;
......@@ -34,8 +34,7 @@ import eu.europa.ec.edelivery.smp.data.ui.SubresourceRO;
import eu.europa.ec.edelivery.smp.exceptions.ErrorCode;
import eu.europa.ec.edelivery.smp.exceptions.SMPRuntimeException;
import eu.europa.ec.edelivery.smp.identifiers.Identifier;
import eu.europa.ec.edelivery.smp.logging.SMPLogger;
import eu.europa.ec.edelivery.smp.logging.SMPLoggerFactory;
import eu.europa.ec.edelivery.smp.services.IdentifierService;
import eu.europa.ec.edelivery.smp.services.resource.DocumentVersionService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.convert.ConversionService;
......@@ -61,19 +60,22 @@ public class UISubresourceService {
private final SubresourceDao subresourceDao;
private final ResourceDao resourceDao;
private final DocumentDao documentDao;
private final SubresourceDefDao subresourceDefDao;
private final IdentifierService identifierService;
private final DocumentVersionService documentVersionService;
private final UIDocumentService uiDocumentService;
private final ConversionService conversionService;
public UISubresourceService(SubresourceDao subresourceDao, ResourceDao resourceDao,SubresourceDefDao subresourceDefDao, IdentifierService identifierService,
public UISubresourceService(SubresourceDao subresourceDao, ResourceDao resourceDao, SubresourceDefDao subresourceDefDao, IdentifierService identifierService,
DocumentDao documentDao,
ConversionService conversionService,
DocumentVersionService documentVersionService,
UIDocumentService uiDocumentService
) {
this.subresourceDao = subresourceDao;
this.resourceDao = resourceDao;
this.documentDao = documentDao;
this.subresourceDefDao = subresourceDefDao;
this.identifierService = identifierService;
this.conversionService = conversionService;
......@@ -85,8 +87,9 @@ public class UISubresourceService {
@Transactional
public List<SubresourceRO> getSubResourcesForResource(Long resourceId) {
List<DBSubresource> list = this.subresourceDao.getSubResourcesForResourceId(resourceId);
return list.stream().map(subresource -> conversionService.convert(subresource, SubresourceRO.class)).collect(Collectors.toList());
return list.stream().map(subresource -> conversionService.convert(subresource, SubresourceRO.class)).collect(Collectors.toList());
}
@Transactional
public SubresourceRO deleteSubresourceFromResource(Long subResourceId, Long resourceId) {
DBResource resource = resourceDao.find(resourceId);
......@@ -101,6 +104,7 @@ public class UISubresourceService {
throw new SMPRuntimeException(ErrorCode.INVALID_REQUEST, ACTION_SUBRESOURCE_DELETE, "Subresource does not belong to the resource!");
}
resource.getSubresources().remove(subresource);
documentDao.unlinkDocument(subresource.getDocument());
subresourceDao.remove(subresource);
return conversionService.convert(subresource, SubresourceRO.class);
}
......@@ -108,7 +112,7 @@ public class UISubresourceService {
@Transactional
public SubresourceRO createSubresourceForResource(SubresourceRO subResourceRO, Long resourceId) {
DBResource resParent= resourceDao.find(resourceId);
DBResource resParent = resourceDao.find(resourceId);
if (resParent == null) {
throw new SMPRuntimeException(ErrorCode.INVALID_REQUEST, ACTION_SUBRESOURCE_CREATE, "Resource does not exist!");
}
......@@ -121,7 +125,7 @@ public class UISubresourceService {
Identifier docId = identifierService.normalizeDocument(domain.getDomainCode(), subResourceRO.getIdentifierScheme(),
subResourceRO.getIdentifierValue());
Optional<DBSubresource> exists= subresourceDao.getSubResourcesForResource(docId, resParent);
Optional<DBSubresource> exists = subresourceDao.getSubResourcesForResource(docId, resParent);
if (exists.isPresent()) {
throw new SMPRuntimeException(ErrorCode.INVALID_REQUEST, ACTION_SUBRESOURCE_CREATE, "Subresource definition [val:" + docId.getValue() + " scheme:" + docId.getScheme() + "] already exists for the resource!");
}
......@@ -154,7 +158,7 @@ public class UISubresourceService {
// generate document content
document.addNewDocumentVersion(version);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
uiDocumentService.generateDocumentForSubresource(resource,subresource, baos);
uiDocumentService.generateDocumentForSubresource(resource, subresource, baos);
version.setContent(baos.toByteArray());
return document;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment