package com.constellio.dev;
import static com.constellio.app.utils.ScriptsUtils.startLayerFactoriesWithoutBackgroundThreads;
import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.constellio.app.modules.rm.services.RMSchemasRecordsServices;
import com.constellio.app.modules.rm.wrappers.RMObject;
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.records.wrappers.User;
import com.constellio.model.entities.schemas.Metadata;
import com.constellio.model.entities.schemas.MetadataSchema;
import com.constellio.model.services.collections.CollectionsListManager;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.records.RecordServices;
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;
public class CustomScriptMain {
static String currentCollection;
static AppLayerFactory appLayerFactory;
static ModelLayerFactory modelLayerFactory;
static SearchServices searchServices;
static RecordServices recordServices;
static RMSchemasRecordsServices rm;
public static void main(String argv[])
throws Exception {
RecordPopulateServices.LOG_CONTENT_MISSING = false;
appLayerFactory = startLayerFactoriesWithoutBackgroundThreads();
modelLayerFactory = appLayerFactory.getModelLayerFactory();
searchServices = modelLayerFactory.newSearchServices();
recordServices = modelLayerFactory.newRecordServices();
CollectionsListManager collectionsListManager = modelLayerFactory.getCollectionsListManager();
for (String collection : collectionsListManager.getCollections()) {
currentCollection = collection;
rm = new RMSchemasRecordsServices(collection, appLayerFactory);
runScriptForCurrentCollection();
}
}
private static void runScriptForCurrentCollection()
throws Exception {
final Map<String, String> usernamesIdsMap = buildUsernamesIdsMap();
for (MetadataSchema folderSchema : rm.folderSchemaType().getAllSchemas()) {
runScriptForRMObject(usernamesIdsMap, folderSchema);
}
for (MetadataSchema documentSchema : rm.documentSchemaType().getAllSchemas()) {
runScriptForRMObject(usernamesIdsMap, documentSchema);
}
}
private static void runScriptForRMObject(final Map<String, String> usernamesIdsMap, final MetadataSchema schema)
throws Exception {
final Metadata formCreatedBy = schema.get(RMObject.FORM_CREATED_BY);
final Metadata formModifiedBy = schema.get(RMObject.FORM_MODIFIED_BY);
if (!schema.hasMetadataWithCode("USRancienUtilisateurCreation") || !schema
.hasMetadataWithCode("USRancienUtilisateurModification")) {
return;
}
final Metadata ancienUtilisateurCreation = schema.get("USRancienUtilisateurCreation");
final Metadata ancienUtilisateurModification = schema.get("USRancienUtilisateurModification");
LogicalSearchCondition condition = LogicalSearchQueryOperators.from(schema).whereAnyCondition(
LogicalSearchQueryOperators.allConditions(
LogicalSearchQueryOperators.where(ancienUtilisateurCreation).isNotNull(),
LogicalSearchQueryOperators.where(ancienUtilisateurCreation).isNotEqual("__NULL__")
),
LogicalSearchQueryOperators.allConditions(
LogicalSearchQueryOperators.where(ancienUtilisateurModification).isNotNull(),
LogicalSearchQueryOperators.where(ancienUtilisateurModification).isNotEqual("__NULL__")
)
);
new ActionExecutorInBatch(searchServices, "Update '" + schema.getCode() + "'", 5000) {
@Override
public void doActionOnBatch(List<Record> records)
throws Exception {
Transaction transaction = new Transaction();
transaction.setSkippingRequiredValuesValidation(true);
transaction.setSkippingReferenceToLogicallyDeletedValidation(true);
transaction.setOptimisticLockingResolution(OptimisticLockingResolution.EXCEPTION);
for (Record record : records) {
boolean add = false;
String ancienUtilisateurCreationValue = record.get(ancienUtilisateurCreation);
if (ancienUtilisateurCreationValue != null) {
String userId = usernamesIdsMap.get(ancienUtilisateurCreationValue);
if (ancienUtilisateurCreationValue.equals("__NULL__") || userId != null) {
record.set(ancienUtilisateurCreation, null);
record.set(formCreatedBy, userId);
add = true;
}
}
String ancienUtilisateurModificationValue = record.get(ancienUtilisateurModification);
if (ancienUtilisateurModificationValue != null) {
String userId = usernamesIdsMap.get(ancienUtilisateurModificationValue);
if (ancienUtilisateurModificationValue.equals("__NULL__") || userId != null) {
record.set(ancienUtilisateurModification, null);
record.set(formModifiedBy, userId);
add = true;
}
}
if (add) {
transaction.add(record);
}
}
recordServices.execute(transaction);
modelLayerFactory.getDataLayerFactory().newRecordDao().flush();
}
}.execute(condition);
}
private static Map<String, String> buildUsernamesIdsMap() {
List<User> users = rm.wrapUsers(searchServices.search(new LogicalSearchQuery(from(rm.userSchemaType()).returnAll())));
Map<String, String> usernamesIdsMap = new HashMap<>();
for (User user : users) {
usernamesIdsMap.put(user.getUsername(), user.getId());
}
return usernamesIdsMap;
}
}