package jnpf.dmsService.expiry; import jnpf.dmsEntity.storage.expiry.DmsFileExpiryItem; import jnpf.dmsEntity.storage.form.DmsFileLifecycleUpdateForm; import jnpf.dmsMapper.DmsFileExpiryMapper; import jnpf.dmsService.DmsFileLifecycleService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor public class DmsFileExpiryExecutor { private final DmsFileExpiryMapper mapper; private final DmsFileLifecycleService lifecycle; private final jnpf.dmsService.DmsBusinessLifecycleGuard businessOccupancy; @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class) public boolean process(DmsFileExpiryItem candidate) { if (!businessOccupancy.tryEnterExpiry(candidate.getTenantId(), candidate.getFileVersionId())) return false; if (mapper.tryLockDocument(candidate.getTenantId(), candidate.getDocumentId()) == null) return false; DmsFileExpiryItem current = mapper.dueState(candidate.getTenantId(), candidate.getFileVersionId()); if (current == null) return false; // Extended or superseded since discovery. DmsFileLifecycleUpdateForm form = new DmsFileLifecycleUpdateForm(); form.setTenantId(current.getTenantId()); form.setFileVersionId(current.getFileVersionId()); form.setLifecycleStatus("EXPIRED"); form.setEffectiveFrom(current.getEffectiveFrom()); form.setEffectiveTo(current.getEffectiveTo()); lifecycle.updateExpired(form, "dms-expiry-job"); return true; } }