Code development platform for open source projects from the European Union institutions

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