package com.constellio.app.modules.robots.extensions; import static com.constellio.model.services.search.query.logical.LogicalSearchQuery.query; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import com.constellio.app.api.extensions.SystemCheckExtension; import com.constellio.app.api.extensions.params.CollectionSystemCheckParams; import com.constellio.app.modules.robots.model.wrappers.ActionParameters; import com.constellio.app.modules.robots.model.wrappers.Robot; import com.constellio.app.modules.robots.services.RobotSchemaRecordServices; 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.RecordPhysicalDeleteOptions; import com.constellio.model.services.records.RecordServices; import com.constellio.model.services.search.SearchServices; public class RobotSystemCheckExtension extends SystemCheckExtension { public static final String UNUSED_ROBOT_ACTIONS = "robots.unusedRobotActions"; AppLayerFactory appLayerFactory; RecordServices recordServices; SearchServices searchServices; RobotSchemaRecordServices robotSchemas; public RobotSystemCheckExtension(String collection, AppLayerFactory appLayerFactory) { this.appLayerFactory = appLayerFactory; this.searchServices = appLayerFactory.getModelLayerFactory().newSearchServices(); this.recordServices = appLayerFactory.getModelLayerFactory().newRecordServices(); this.robotSchemas = new RobotSchemaRecordServices(collection, appLayerFactory); } @Override public void checkCollection(CollectionSystemCheckParams collectionCheckParams) { Set<String> currentlyUsedParameterIds = new HashSet<>(); Iterator<Record> robotsIterator = searchServices.recordsIterator(query(from( robotSchemas.robot.schemaType()).returnAll()), 1000); while (robotsIterator.hasNext()) { Robot robot = robotSchemas.wrapRobot(robotsIterator.next()); currentlyUsedParameterIds.add(robot.getActionParameters()); } List<String> actionParametersIds = searchServices.searchRecordIds(query(from( robotSchemas.actionParameters.schemaType()).returnAll())); for (String actionParameterId : actionParametersIds) { if (!currentlyUsedParameterIds.contains(actionParameterId)) { collectionCheckParams.getResultsBuilder().incrementMetric(UNUSED_ROBOT_ACTIONS); if (collectionCheckParams.isRepair()) { ActionParameters actionParameters = robotSchemas.getActionParameters(actionParameterId); recordServices.physicallyDeleteNoMatterTheStatus(actionParameters.getWrappedRecord(), User.GOD, new RecordPhysicalDeleteOptions()); } } } } }