package com.constellio.app.api.cmis.requests.object; import java.util.ArrayList; import org.apache.chemistry.opencmis.commons.data.FailedToDeleteData; import org.apache.chemistry.opencmis.commons.enums.Action; import org.apache.chemistry.opencmis.commons.impl.dataobjects.FailedToDeleteDataImpl; import org.apache.chemistry.opencmis.commons.server.CallContext; import org.apache.commons.lang3.builder.ToStringBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.constellio.app.api.cmis.binding.collection.ConstellioCollectionRepository; import com.constellio.app.api.cmis.binding.global.ConstellioCmisContextParameters; import com.constellio.app.api.cmis.requests.CmisCollectionRequest; import com.constellio.app.extensions.api.cmis.params.DeleteContentParams; import com.constellio.app.extensions.api.cmis.params.DeleteTreeParams; import com.constellio.app.services.factories.AppLayerFactory; import com.constellio.model.entities.records.Record; import com.constellio.model.entities.records.wrappers.User; import com.constellio.model.services.records.RecordServices; import com.constellio.model.services.records.RecordServicesRuntimeException.RecordServicesRuntimeException_CannotPhysicallyDeleteRecord; public class DeleteTreeRequest extends CmisCollectionRequest<FailedToDeleteData> { private static final Logger LOGGER = LoggerFactory.getLogger(CmisCollectionRequest.class); private final String folderId; private final Boolean continueOnFailure; public DeleteTreeRequest(ConstellioCollectionRepository repository, AppLayerFactory appLayerFactory, CallContext context, String folderId, Boolean continueOnFailure) { super(context, repository, appLayerFactory); this.folderId = folderId; this.continueOnFailure = continueOnFailure; } @Override public FailedToDeleteData process() { Record record = recordServices.getDocumentById(folderId, user); ensureUserHasAllowableActionsOnRecord(record, Action.CAN_DELETE_TREE); DeleteTreeParams params = new DeleteTreeParams(user, record); appLayerFactory.getExtensions().forCollection(collection).onDeleteTree(params); recordServices.logicallyDelete(record, user); try { recordServices.physicallyDelete(record, user); } catch (RecordServicesRuntimeException_CannotPhysicallyDeleteRecord e) { recordServices.restore(record, user); throw new RuntimeException(e); } FailedToDeleteDataImpl result = new FailedToDeleteDataImpl(); result.setIds(new ArrayList<String>()); return result; } @Override protected Logger getLogger() { return LOGGER; } @Override public String toString() { return ToStringBuilder.reflectionToString(this); } }