package com.constellio.app.modules.complementary.esRmRobots.services;
import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from;
import java.util.List;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.apache.log4j.Logger;
import com.constellio.app.entities.modules.ProgressInfo;
import com.constellio.app.modules.rm.services.RMSchemasRecordsServices;
import com.constellio.app.modules.rm.wrappers.Document;
import com.constellio.app.modules.rm.wrappers.Folder;
import com.constellio.model.entities.records.ActionExecutorInBatch;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.records.RecordPhysicalDeleteOptions;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.records.RecordServicesRuntimeException;
import com.constellio.model.services.search.SearchServices;
import com.constellio.model.services.search.query.logical.condition.LogicalSearchCondition;
public class ESRMRobotsServices {
private static final Logger LOGGER = Logger.getLogger(ESRMRobotsServices.class);
ModelLayerFactory modelLayerFactory;
public ESRMRobotsServices(ModelLayerFactory modelLayerFactory) {
this.modelLayerFactory = modelLayerFactory;
}
public void deleteRobotFoldersAndDocuments(final User currentUser, final String robotId, final ProgressInfo progressInfo)
throws Exception {
RMSchemasRecordsServices rm = new RMSchemasRecordsServices(currentUser.getCollection(), modelLayerFactory);
final RecordPhysicalDeleteOptions deleteOptions = new RecordPhysicalDeleteOptions().setMostReferencesToNull(true);
final LogicalSearchCondition documentsCondition = from(rm.documentSchemaType())
.where(rm.document.schema().get(Document.CREATED_BY_ROBOT)).isEqualTo(robotId);
final LogicalSearchCondition foldersCondition = from(rm.folder.schemaType())
.where(rm.folder.schema().get(Folder.CREATED_BY_ROBOT)).isEqualTo(robotId);
final RecordServices recordServices = modelLayerFactory.newRecordServices();
final SearchServices searchServices = modelLayerFactory.newSearchServices();
final long total = searchServices.getResultsCount(documentsCondition)
+ searchServices.getResultsCount(foldersCondition);
progressInfo.setEnd(total);
if (total == 0) {
progressInfo.setDone(true);
} else {
ActionExecutorInBatch batch = new ActionExecutorInBatch(searchServices, "Delete records", 10) {
@Override
public void doActionOnBatch(List<Record> records)
throws Exception {
for (Record record : records) {
try {
recordServices.getDocumentById(record.getId());
recordServices.physicallyDeleteNoMatterTheStatus(record, currentUser, deleteOptions);
} catch (RecordServicesRuntimeException.NoSuchRecordWithId e) {
//Already deleted
} catch (Exception e) {
LOGGER.warn("Error while deleting record", e);
String stackTrace = ExceptionUtils.getStackTrace(e);
progressInfo.getErrorMessages().add(stackTrace);
}
}
progressInfo.setCurrentState(total
- searchServices.getResultsCount(documentsCondition)
- searchServices.getResultsCount(foldersCondition));
}
};
batch.execute(documentsCondition);
batch.execute(foldersCondition);
}
}
}