package com.constellio.dev; import com.constellio.app.modules.rm.services.RMSchemasRecordsServices; import com.constellio.app.modules.rm.wrappers.Document; import com.constellio.app.services.factories.AppLayerFactory; import com.constellio.data.dao.dto.records.OptimisticLockingResolution; import com.constellio.model.entities.records.ActionExecutorInBatch; import com.constellio.model.entities.records.Record; import com.constellio.model.entities.records.Transaction; import com.constellio.model.entities.schemas.Metadata; import com.constellio.model.entities.schemas.MetadataSchema; import com.constellio.model.services.factories.ModelLayerFactory; import com.constellio.model.services.records.RecordServices; import com.constellio.model.services.records.RecordServicesException; import com.constellio.model.services.records.extractions.RecordPopulateServices; import com.constellio.model.services.search.SearchServices; import com.constellio.model.services.search.query.logical.LogicalSearchQuery; import com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators; import com.constellio.model.services.search.query.logical.condition.LogicalSearchCondition; import com.constellio.sdk.SDKScriptUtils; import org.apache.log4j.Logger; import java.util.List; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from; public class ModifyUSRaspectNumFormulairenumFormulaireToDoubleDataType { private static Logger LOG = Logger.getLogger(ModifyUSRaspectNumFormulairenumFormulaireToDoubleDataType.class); static int BATCH_SIZE = 5000; static String currentCollection; static AppLayerFactory appLayerFactory; static ModelLayerFactory modelLayerFactory; static SearchServices searchServices; static RecordServices recordServices; static RMSchemasRecordsServices rm; private static void startBackend() { //TODO //Only enable this line to run in production //appLayerFactory = startLayerFactoriesWithoutBackgroundThreads(); //Only enable this line to run on developer workstation appLayerFactory = SDKScriptUtils.startApplicationWithoutBackgroundProcessesAndAuthentication(); } private static LogicalSearchQuery getQuery(MetadataSchema folderSchema) { //TODO Build a query to find records to modify or to return all records //return new LogicalSearchQuery(from(rm.folderSchemaType()) // .where(rm.containerAdministrativeUnit()).isEqualTo("42")); final Metadata aspectNumFormulairenumFormulaire = folderSchema.getMetadata("USRaspectNumFormulairenumFormulaire"); LogicalSearchCondition condition = LogicalSearchQueryOperators.from(folderSchema).whereAllConditions( LogicalSearchQueryOperators.where(aspectNumFormulairenumFormulaire).isNotNull(), LogicalSearchQueryOperators.where(aspectNumFormulairenumFormulaire).isNotEqual("__NULL__")); return new LogicalSearchQuery(from(rm.documentSchemaType()).where(condition)); } private static void runScriptForCurrentCollection() throws Exception { int counter = 0; for (MetadataSchema folderSchema : rm.documentSchemaType().getAllSchemas()) { if(folderSchema.hasMetadataWithCode("USRaspectNumFormulairenumFormulaire") && folderSchema.getMetadata("USRaspectNumFormulairenumFormulaire").isEnabled()) { System.out.println(counter + ": " + folderSchema.getCode()); new ActionExecutorInBatch(searchServices, "The name of the task", BATCH_SIZE) { @Override public void doActionOnBatch(List<Record> records) { //TODO Wrap the records List<Document> documents = rm.wrapDocuments(records); Transaction transaction = new Transaction(); transaction.setSkippingRequiredValuesValidation(true); transaction.setOptimisticLockingResolution(OptimisticLockingResolution.EXCEPTION); for (Document document : documents) { System.out.println(document.getId() + ":" + document.getTitle()); //TODO Do the modification on a record Boolean isBorrowed = document.getBorrowed(); //document.setBorrowed(false); String metadataStringValue = document.get("USRaspectNumFormulairenumFormulaire"); try { System.out.println("value: " + metadataStringValue); double doubleValue = Double.valueOf(metadataStringValue); document.set("USRaspectNumFormulairenumFormulaireCopie", doubleValue); } catch (Exception e) { LOG.error("Identififiant document: " + document.getId() + "; valeur: " + metadataStringValue, e); e.printStackTrace(); } transaction.add(document); } try { recordServices.execute(transaction); } catch (RecordServicesException e) { throw new RuntimeException(e); } } }.execute(getQuery(folderSchema)); counter++; } } } public static void main(String argv[]) throws Exception { RecordPopulateServices.LOG_CONTENT_MISSING = false; startBackend(); modelLayerFactory = appLayerFactory.getModelLayerFactory(); searchServices = modelLayerFactory.newSearchServices(); recordServices = modelLayerFactory.newRecordServices(); for (String collection : modelLayerFactory.getCollectionsListManager().getCollections()) { currentCollection = collection; rm = new RMSchemasRecordsServices(collection, appLayerFactory); runScriptForCurrentCollection(); } } }