package com.constellio.app.services.migrations.scripts; import com.constellio.app.entities.modules.MetadataSchemasAlterationHelper; import com.constellio.app.entities.modules.MigrationResourcesProvider; import com.constellio.app.entities.modules.MigrationScript; import com.constellio.app.modules.rm.services.RMSchemasRecordsServices; import com.constellio.app.services.factories.AppLayerFactory; 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.SavedSearch; import com.constellio.model.entities.records.wrappers.User; import com.constellio.model.entities.schemas.MetadataValueType; import com.constellio.model.services.records.RecordServices; import com.constellio.model.services.records.UnhandledRecordModificationImpactHandler; import com.constellio.model.services.schemas.builders.MetadataSchemaBuilder; import com.constellio.model.services.schemas.builders.MetadataSchemaTypeBuilder; import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilder; import com.constellio.model.services.search.SearchServices; import java.util.List; import static com.constellio.model.entities.schemas.MetadataValueType.BOOLEAN; import static com.constellio.model.entities.schemas.MetadataValueType.NUMBER; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from; public class CoreMigrationTo_6_3 implements MigrationScript { @Override public String getVersion() { return "6.3"; } @Override public void migrate(String collection, MigrationResourcesProvider provider, AppLayerFactory appLayerFactory) throws Exception { //FIXME is called several times for the different installed modules!! new CoreSchemaAlterationFor6_3(collection, provider, appLayerFactory).migrate(); appLayerFactory.getSystemGlobalConfigsManager().setReindexingRequired(true); //initializeUsersLanguages(collection, appLayerFactory); } private void initializeUsersLanguages(final String collection, AppLayerFactory appLayerFactory) throws Exception { //FIXME not possible since collection not created yet! final String collectionLanguageCode = appLayerFactory.getCollectionsManager().getCollection(collection).getLanguages().get(0); SearchServices searchServices = appLayerFactory.getModelLayerFactory().newSearchServices(); final RecordServices recordServices = appLayerFactory.getModelLayerFactory().newRecordServices(); final RMSchemasRecordsServices rm = new RMSchemasRecordsServices(collection, appLayerFactory); new ActionExecutorInBatch(searchServices, "Create users login languages.", 1000) { @Override public void doActionOnBatch(List<Record> records) throws Exception { Transaction transaction = new Transaction(); for (User user : rm.wrapUsers(records)) { user.setLoginLanguageCode(collectionLanguageCode); transaction.add(user); } transaction.setSkippingRequiredValuesValidation(true); recordServices.executeWithImpactHandler(transaction, new UnhandledRecordModificationImpactHandler()); } }.execute(from(rm.userSchema()).returnAll()); } private class CoreSchemaAlterationFor6_3 extends MetadataSchemasAlterationHelper { public CoreSchemaAlterationFor6_3(String collection, MigrationResourcesProvider migrationResourcesProvider, AppLayerFactory appLayerFactory) { super(collection, migrationResourcesProvider, appLayerFactory); } @Override protected void migrate(MetadataSchemaTypesBuilder typesBuilder) { MetadataSchemaBuilder user = typesBuilder.getSchemaType(User.SCHEMA_TYPE).getDefaultSchema(); user.createUndeletable(User.LOGIN_LANGUAGE_CODE).setType(MetadataValueType.STRING); MetadataSchemaTypeBuilder type = typesBuilder.getSchemaType(SavedSearch.SCHEMA_TYPE); MetadataSchemaBuilder defaultSchema = type.getDefaultSchema(); defaultSchema.createUndeletable(SavedSearch.TEMPORARY).setType(BOOLEAN); defaultSchema.createUndeletable(SavedSearch.PAGE_NUMBER).setType(NUMBER); } } }