001/*
002 * The contents of this file are subject to the license and copyright
003 * detailed in the LICENSE and NOTICE files at the root of the source
004 * tree.
005 */
006package org.fcrepo.kernel.impl.services;
007
008import java.util.stream.Stream;
009
010import javax.inject.Inject;
011
012import org.fcrepo.kernel.api.Transaction;
013import org.fcrepo.kernel.api.identifiers.FedoraId;
014import org.fcrepo.kernel.api.models.FedoraResource;
015import org.fcrepo.kernel.api.operations.DeleteResourceOperationFactory;
016import org.fcrepo.kernel.api.operations.ResourceOperation;
017import org.fcrepo.kernel.api.services.PurgeResourceService;
018import org.fcrepo.persistence.api.PersistentStorageSession;
019import org.fcrepo.persistence.api.exceptions.PersistentStorageException;
020
021import org.slf4j.Logger;
022import org.slf4j.LoggerFactory;
023import org.springframework.stereotype.Component;
024
025/**
026 * Implementation of purge resource service.
027 * @author whikloj
028 * @since 6.0.0
029 */
030@Component
031public class PurgeResourceServiceImpl extends AbstractDeleteResourceService implements PurgeResourceService {
032
033    private final static Logger log = LoggerFactory.getLogger(PurgeResourceServiceImpl.class);
034
035    @Inject
036    private DeleteResourceOperationFactory deleteResourceFactory;
037
038    @Override
039    protected Stream<String> getContained(final Transaction tx, final FedoraResource resource) {
040        return containmentIndex.getContainsDeleted(tx, resource.getFedoraId());
041    }
042
043    @Override
044    protected void doAction(final Transaction tx, final PersistentStorageSession pSession, final FedoraId resourceId,
045                  final String userPrincipal) throws PersistentStorageException {
046        log.debug("starting purge of {}", resourceId.getFullId());
047        final ResourceOperation purgeOp = deleteResourceFactory.purgeBuilder(tx, resourceId)
048                .userPrincipal(userPrincipal)
049                .build();
050
051        lockArchivalGroupResource(tx, pSession, resourceId);
052        tx.lockResource(resourceId);
053
054        pSession.persist(purgeOp);
055        containmentIndex.purgeResource(tx, resourceId);
056        recordEvent(tx, resourceId, purgeOp);
057        log.debug("purged {}", resourceId.getFullId());
058    }
059
060}