package com.constellio.app.modules.rm.migrations; import static com.constellio.model.entities.schemas.MetadataValueType.REFERENCE; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from; import static java.util.Arrays.asList; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.chemistry.opencmis.commons.impl.IOUtils; 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.entities.schemasDisplay.enums.MetadataInputType; import com.constellio.app.modules.rm.RMEmailTemplateConstants; import com.constellio.app.modules.rm.constants.RMPermissionsTo; import com.constellio.app.modules.rm.constants.RMRoles; import com.constellio.app.modules.rm.model.calculators.FolderDecommissioningDateCalculator2; import com.constellio.app.modules.rm.services.RMSchemasRecordsServices; import com.constellio.app.modules.rm.wrappers.AdministrativeUnit; import com.constellio.app.modules.rm.wrappers.Category; import com.constellio.app.modules.rm.wrappers.ContainerRecord; import com.constellio.app.modules.rm.wrappers.Document; import com.constellio.app.modules.rm.wrappers.Folder; import com.constellio.app.modules.rm.wrappers.RMObject; import com.constellio.app.modules.rm.wrappers.RMTask; import com.constellio.app.modules.rm.wrappers.RMTaskType; import com.constellio.app.modules.rm.wrappers.StorageSpace; import com.constellio.app.modules.tasks.model.wrappers.Task; import com.constellio.app.modules.tasks.model.wrappers.request.BorrowRequest; import com.constellio.app.modules.tasks.model.wrappers.request.ExtensionRequest; import com.constellio.app.modules.tasks.model.wrappers.request.ReactivationRequest; import com.constellio.app.modules.tasks.model.wrappers.request.ReturnRequest; import com.constellio.app.modules.tasks.services.TasksSchemasRecordsServices; import com.constellio.app.services.factories.AppLayerFactory; import com.constellio.app.services.migrations.CoreRoles; import com.constellio.app.services.schemasDisplay.SchemasDisplayManager; import com.constellio.data.dao.managers.config.ConfigManagerException; import com.constellio.data.utils.BatchBuilderIterator; import com.constellio.model.entities.CorePermissions; import com.constellio.model.entities.Language; import com.constellio.model.entities.records.RecordUpdateOptions; import com.constellio.model.entities.records.Transaction; import com.constellio.model.entities.records.wrappers.Event; import com.constellio.model.entities.records.wrappers.User; import com.constellio.model.entities.schemas.MetadataValueType; import com.constellio.model.entities.security.Role; 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.schemas.builders.MetadataBuilder; import com.constellio.model.services.schemas.builders.MetadataSchemaTypeBuilder; import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilder; import com.constellio.model.services.search.query.logical.LogicalSearchQuery; /** * Created by Charles Blanchette on 2017-03-22. */ public class RMMigrationTo7_2 implements MigrationScript { @Override public String getVersion() { return "7.2"; } @Override public void migrate(String collection, MigrationResourcesProvider migrationResourcesProvider, AppLayerFactory appLayerFactory) { RMSchemasRecordsServices rm = new RMSchemasRecordsServices(collection, appLayerFactory); RecordServices recordServices = appLayerFactory.getModelLayerFactory().newRecordServices(); List<Category> categories = rm.wrapCategorys(appLayerFactory.getModelLayerFactory().newSearchServices().search( new LogicalSearchQuery().setCondition(from(rm.category.schemaType()).returnAll()))); Map<String, String> descriptions = new HashMap<>(); for (Category category : categories) { descriptions.put(category.getId(), category.getDescription()); category.setDescription(null); } BatchBuilderIterator<Category> batchIterator = new BatchBuilderIterator<>(categories.iterator(), 100); while (batchIterator.hasNext()) { Transaction transaction = new Transaction(); transaction.addAll(batchIterator.next()); transaction.setOptions(RecordUpdateOptions.validationExceptionSafeOptions()); try { recordServices.executeWithoutImpactHandling(transaction); } catch (RecordServicesException e) { e.printStackTrace(); throw new RuntimeException("Failed to set categories descriptions to null in RMMigration7_2"); } } new SchemaAlterationFor7_2_step1(collection, migrationResourcesProvider, appLayerFactory).migrate(); new SchemaAlterationFor7_2_step2(collection, migrationResourcesProvider, appLayerFactory).migrate(); SchemasDisplayManager displayManager = appLayerFactory.getMetadataSchemasDisplayManager(); displayManager.saveMetadata(displayManager.getMetadata(collection, Category.DEFAULT_SCHEMA + "_" + Category.DESCRIPTION) .withInputType(MetadataInputType.RICHTEXT)); categories = rm.wrapCategorys(appLayerFactory.getModelLayerFactory().newSearchServices().search( new LogicalSearchQuery().setCondition(from(rm.category.schemaType()).returnAll()))); batchIterator = new BatchBuilderIterator<>(categories.iterator(), 100); for (Category category : categories) { category.setDescription(descriptions.get(category.getId())); } while (batchIterator.hasNext()) { Transaction transaction = new Transaction(); transaction.addAll(batchIterator.next()); transaction.setOptions(RecordUpdateOptions.validationExceptionSafeOptions()); try { recordServices.executeWithoutImpactHandling(transaction); } catch (RecordServicesException e) { e.printStackTrace(); throw new RuntimeException("Failed to migrate categories descriptions in RMMigration7_2"); } } migrateSearchableSchemaTypes(collection, migrationResourcesProvider, appLayerFactory); updateNewPermissions(appLayerFactory, collection); TasksSchemasRecordsServices taskSchemas = new TasksSchemasRecordsServices(collection, appLayerFactory); try { createNewTaskTypes(appLayerFactory, taskSchemas); } catch (RecordServicesException e) { throw new RuntimeException("Failed to create new task types in RMMigration7_2"); } adjustSchemaDisplay(appLayerFactory, migrationResourcesProvider, collection); migrateRoles(collection, appLayerFactory.getModelLayerFactory()); reloadEmailTemplates(appLayerFactory, migrationResourcesProvider, collection); } private void updateNewPermissions(AppLayerFactory appLayerFactory, String collection) { ModelLayerFactory modelLayerFactory = appLayerFactory.getModelLayerFactory(); Role admRole = modelLayerFactory.getRolesManager().getRole(collection, RMRoles.RGD); modelLayerFactory.getRolesManager().updateRole(admRole.withNewPermissions(asList(CorePermissions.MANAGE_SEARCH_BOOST))); } private void migrateSearchableSchemaTypes(String collection, MigrationResourcesProvider migrationResourcesProvider, AppLayerFactory appLayerFactory) { SchemasDisplayManager manager = appLayerFactory.getMetadataSchemasDisplayManager(); manager.saveType(manager.getType(collection, ContainerRecord.SCHEMA_TYPE).withSimpleAndAdvancedSearchStatus(true)); manager.saveType(manager.getType(collection, StorageSpace.SCHEMA_TYPE).withSimpleAndAdvancedSearchStatus(true)); manager.saveMetadata(manager.getMetadata(collection, Document.DEFAULT_SCHEMA + "_" + RMObject.FORM_CREATED_ON) .withVisibleInAdvancedSearchStatus(true)); manager.saveMetadata(manager.getMetadata(collection, Document.DEFAULT_SCHEMA + "_" + RMObject.FORM_MODIFIED_ON) .withVisibleInAdvancedSearchStatus(true)); manager.saveMetadata(manager.getMetadata(collection, Folder.DEFAULT_SCHEMA + "_" + RMObject.FORM_CREATED_ON) .withVisibleInAdvancedSearchStatus(true)); manager.saveMetadata(manager.getMetadata(collection, Folder.DEFAULT_SCHEMA + "_" + RMObject.FORM_MODIFIED_ON) .withVisibleInAdvancedSearchStatus(true)); manager.saveMetadata( manager.getMetadata(collection, StorageSpace.DEFAULT_SCHEMA + "_" + StorageSpace.NUMBER_OF_CONTAINERS) .withVisibleInAdvancedSearchStatus(true)); } private void createNewTaskTypes(AppLayerFactory appLayerFactory, TasksSchemasRecordsServices taskSchemas) throws RecordServicesException { Transaction transaction = new Transaction(); transaction.setOptions(RecordUpdateOptions.validationExceptionSafeOptions()); transaction.add(taskSchemas.newTaskType().setCode(RMTaskType.BORROW_REQUEST).setTitle("Demande d'emprunt") .setLinkedSchema(Task.SCHEMA_TYPE + "_" + BorrowRequest.SCHEMA_NAME)); transaction.add(taskSchemas.newTaskType().setCode(RMTaskType.RETURN_REQUEST).setTitle("Demande de retour") .setLinkedSchema(Task.SCHEMA_TYPE + "_" + ReturnRequest.SCHEMA_NAME)); transaction.add(taskSchemas.newTaskType().setCode(RMTaskType.REACTIVATION_REQUEST).setTitle("Demande de réactivation") .setLinkedSchema(Task.SCHEMA_TYPE + "_" + ReactivationRequest.SCHEMA_NAME)); transaction.add(taskSchemas.newTaskType().setCode(RMTaskType.BORROW_EXTENSION_REQUEST) .setTitle("Demande de prolongation d'emprunt") .setLinkedSchema(Task.SCHEMA_TYPE + "_" + ExtensionRequest.SCHEMA_NAME)); appLayerFactory.getModelLayerFactory().newRecordServices().execute(transaction); } private void adjustSchemaDisplay(AppLayerFactory appLayerFactory, MigrationResourcesProvider migrationResourcesProvider, String collection) { SchemasDisplayManager displayManager = appLayerFactory.getMetadataSchemasDisplayManager(); displayManager.saveSchema(displayManager.getSchema(collection, Folder.DEFAULT_SCHEMA) .withNewDisplayMetadataBefore(Folder.DEFAULT_SCHEMA + "_" + Folder.REACTIVATION_DATES, Folder.DEFAULT_SCHEMA + "_" + Folder.COMMENTS) .withNewDisplayMetadataBefore(Folder.DEFAULT_SCHEMA + "_" + Folder.REACTIVATION_USERS, Folder.DEFAULT_SCHEMA + "_" + Folder.COMMENTS) .withNewDisplayMetadataBefore(Folder.DEFAULT_SCHEMA + "_" + Folder.PREVIOUS_TRANSFER_DATES, Folder.DEFAULT_SCHEMA + "_" + Folder.COMMENTS) .withNewDisplayMetadataBefore(Folder.DEFAULT_SCHEMA + "_" + Folder.PREVIOUS_DEPOSIT_DATES, Folder.DEFAULT_SCHEMA + "_" + Folder.COMMENTS)); displayManager.saveSchema(displayManager.getSchema(collection, Task.DEFAULT_SCHEMA) .withNewFormMetadata(Task.DEFAULT_SCHEMA + "_" + Task.LINKED_CONTAINERS)); displayManager.saveSchema(displayManager.getSchema(collection, Task.DEFAULT_SCHEMA) .withNewFormMetadata(Task.DEFAULT_SCHEMA + "_" + Task.REASON)); displayManager.saveMetadata(displayManager.getMetadata(collection, Task.DEFAULT_SCHEMA + "_" + Task.REASON) .withInputType(MetadataInputType.TEXTAREA)); String detailsTab = migrationResourcesProvider.getDefaultLanguageString("init.userTask.details"); displayManager.saveMetadata(displayManager.getMetadata(collection, RMTask.DEFAULT_SCHEMA, RMTask.LINKED_CONTAINERS) .withMetadataGroup(detailsTab)); displayManager.saveSchema(displayManager.getSchema(collection, Event.DEFAULT_SCHEMA) .withNewTableMetadatas(Event.DEFAULT_SCHEMA + "_" + Event.RECEIVER_NAME, Event.DEFAULT_SCHEMA + "_" + Event.TASK, Event.DEFAULT_SCHEMA + "_" + Event.DESCRIPTION)); displayManager .saveMetadata(displayManager.getMetadata(collection, AdministrativeUnit.DEFAULT_SCHEMA, AdministrativeUnit.ADRESS) .withInputType(MetadataInputType.FIELD)); } private void migrateRoles(String collection, ModelLayerFactory modelLayerFactory) { Role rgd = modelLayerFactory.getRolesManager().getRole(collection, RMRoles.RGD); Role admin = modelLayerFactory.getRolesManager().getRole(collection, CoreRoles.ADMINISTRATOR); Role manager = modelLayerFactory.getRolesManager().getRole(collection, RMRoles.MANAGER); Role user = modelLayerFactory.getRolesManager().getRole(collection, RMRoles.USER); modelLayerFactory.getRolesManager().updateRole(rgd.withNewPermissions(asList( RMPermissionsTo.MANAGE_REQUEST_ON_CONTAINER, RMPermissionsTo.BORROWING_FOLDER_DIRECTLY, RMPermissionsTo.BORROWING_REQUEST_ON_CONTAINER, RMPermissionsTo.MANAGE_REQUEST_ON_FOLDER, RMPermissionsTo.BORROWING_REQUEST_ON_FOLDER, RMPermissionsTo.REACTIVATION_REQUEST_ON_FOLDER, RMPermissionsTo.DISPLAY_CONTAINERS, RMPermissionsTo.BORROW_CONTAINER ))); modelLayerFactory.getRolesManager().updateRole(admin.withNewPermissions(asList( RMPermissionsTo.MANAGE_REQUEST_ON_CONTAINER, RMPermissionsTo.BORROWING_FOLDER_DIRECTLY, RMPermissionsTo.BORROWING_REQUEST_ON_CONTAINER, RMPermissionsTo.MANAGE_REQUEST_ON_FOLDER, RMPermissionsTo.BORROWING_REQUEST_ON_FOLDER, RMPermissionsTo.REACTIVATION_REQUEST_ON_FOLDER, RMPermissionsTo.DISPLAY_CONTAINERS, RMPermissionsTo.BORROW_CONTAINER ))); modelLayerFactory.getRolesManager().updateRole(manager.withNewPermissions(asList( RMPermissionsTo.BORROWING_REQUEST_ON_CONTAINER, RMPermissionsTo.BORROWING_REQUEST_ON_FOLDER, RMPermissionsTo.REACTIVATION_REQUEST_ON_FOLDER, RMPermissionsTo.BORROW_CONTAINER ))); modelLayerFactory.getRolesManager().updateRole(user.withNewPermissions(asList( RMPermissionsTo.BORROWING_REQUEST_ON_CONTAINER, RMPermissionsTo.BORROWING_REQUEST_ON_FOLDER, RMPermissionsTo.REACTIVATION_REQUEST_ON_FOLDER, RMPermissionsTo.BORROW_CONTAINER ))); } private void reloadEmailTemplates(AppLayerFactory appLayerFactory, MigrationResourcesProvider migrationResourcesProvider, String collection) { if (appLayerFactory.getModelLayerFactory().getCollectionsListManager().getCollectionLanguages(collection).get(0) .equals("en")) { reloadEmailTemplate("alertBorrowedTemplate_en.html", RMEmailTemplateConstants.ALERT_BORROWED_ACCEPTED, appLayerFactory, migrationResourcesProvider, collection); reloadEmailTemplate("alertReturnedTemplate_en.html", RMEmailTemplateConstants.ALERT_RETURNED_ACCEPTED, appLayerFactory, migrationResourcesProvider, collection); reloadEmailTemplate("alertReactivatedTemplate_en.html", RMEmailTemplateConstants.ALERT_REACTIVATED_ACCEPTED, appLayerFactory, migrationResourcesProvider, collection); reloadEmailTemplate("alertBorrowingExtendedTemplate_en.html", RMEmailTemplateConstants.ALERT_BORROWING_EXTENTED_ACCEPTED, appLayerFactory, migrationResourcesProvider, collection); reloadEmailTemplate("alertBorrowedTemplateDenied_en.html", RMEmailTemplateConstants.ALERT_BORROWED_DENIED, appLayerFactory, migrationResourcesProvider, collection); reloadEmailTemplate("alertReturnedTemplateDenied_en.html", RMEmailTemplateConstants.ALERT_RETURNED_DENIED, appLayerFactory, migrationResourcesProvider, collection); reloadEmailTemplate("alertReactivatedTemplateDenied_en.html", RMEmailTemplateConstants.ALERT_REACTIVATED_DENIED, appLayerFactory, migrationResourcesProvider, collection); reloadEmailTemplate("alertBorrowingExtendedTemplateDenied_en.html", RMEmailTemplateConstants.ALERT_BORROWING_EXTENTED_DENIED, appLayerFactory, migrationResourcesProvider, collection); } else { reloadEmailTemplate("alertBorrowedTemplate.html", RMEmailTemplateConstants.ALERT_BORROWED_ACCEPTED, appLayerFactory, migrationResourcesProvider, collection); reloadEmailTemplate("alertReturnedTemplate.html", RMEmailTemplateConstants.ALERT_RETURNED_ACCEPTED, appLayerFactory, migrationResourcesProvider, collection); reloadEmailTemplate("alertReactivatedTemplate.html", RMEmailTemplateConstants.ALERT_REACTIVATED_ACCEPTED, appLayerFactory, migrationResourcesProvider, collection); reloadEmailTemplate("alertBorrowingExtendedTemplate.html", RMEmailTemplateConstants.ALERT_BORROWING_EXTENTED_ACCEPTED, appLayerFactory, migrationResourcesProvider, collection); reloadEmailTemplate("alertBorrowedTemplateDenied.html", RMEmailTemplateConstants.ALERT_BORROWED_DENIED, appLayerFactory, migrationResourcesProvider, collection); reloadEmailTemplate("alertReturnedTemplateDenied.html", RMEmailTemplateConstants.ALERT_RETURNED_DENIED, appLayerFactory, migrationResourcesProvider, collection); reloadEmailTemplate("alertReactivatedTemplateDenied.html", RMEmailTemplateConstants.ALERT_REACTIVATED_DENIED, appLayerFactory, migrationResourcesProvider, collection); reloadEmailTemplate("alertBorrowingExtendedTemplateDenied.html", RMEmailTemplateConstants.ALERT_BORROWING_EXTENTED_DENIED, appLayerFactory, migrationResourcesProvider, collection); } } private void reloadEmailTemplate(final String templateFileName, final String templateId, AppLayerFactory appLayerFactory, MigrationResourcesProvider migrationResourcesProvider, String collection) { final InputStream templateInputStream = migrationResourcesProvider.getStream(templateFileName); try { appLayerFactory.getModelLayerFactory().getEmailTemplatesManager() .replaceCollectionTemplate(templateId, collection, templateInputStream); } catch (IOException | ConfigManagerException.OptimisticLockingConfiguration e) { throw new RuntimeException(e); } finally { IOUtils.closeQuietly(templateInputStream); } } class SchemaAlterationFor7_2_step1 extends MetadataSchemasAlterationHelper { protected SchemaAlterationFor7_2_step1(String collection, MigrationResourcesProvider migrationResourcesProvider, AppLayerFactory appLayerFactory) { super(collection, migrationResourcesProvider, appLayerFactory); } public String getVersion() { return "7.2"; } @Override protected void migrate(MetadataSchemaTypesBuilder typesBuilder) { typesBuilder.getDefaultSchema(Category.SCHEMA_TYPE).deleteMetadataWithoutValidation( typesBuilder.getMetadata(Category.DEFAULT_SCHEMA + "_" + Category.DESCRIPTION)); typesBuilder.getSchemaType(ContainerRecord.SCHEMA_TYPE).setSecurity(false); MetadataBuilder containerStorageSpace = typesBuilder.getDefaultSchema(ContainerRecord.SCHEMA_TYPE) .get(ContainerRecord.STORAGE_SPACE); typesBuilder.getDefaultSchema(StorageSpace.SCHEMA_TYPE).createUndeletable(StorageSpace.NUMBER_OF_CONTAINERS) .setType(MetadataValueType.NUMBER).defineDataEntry().asReferenceCount(containerStorageSpace) .setSearchable(true); typesBuilder.getDefaultSchema(ContainerRecord.SCHEMA_TYPE) .createUndeletable(ContainerRecord.FIRST_TRANSFER_REPORT_DATE).setType(MetadataValueType.DATE) .setSystemReserved(true); typesBuilder.getDefaultSchema(ContainerRecord.SCHEMA_TYPE) .createUndeletable(ContainerRecord.FIRST_DEPOSIT_REPORT_DATE).setType(MetadataValueType.DATE) .setSystemReserved(true); // typesBuilder.getDefaultSchema(AdministrativeUnit.SCHEMA_TYPE).createUndeletable(AdministrativeUnit.ADRESS).setType(MetadataValueType.DATE).setSystemReserved(true); } } class SchemaAlterationFor7_2_step2 extends MetadataSchemasAlterationHelper { protected SchemaAlterationFor7_2_step2(String collection, MigrationResourcesProvider migrationResourcesProvider, AppLayerFactory appLayerFactory) { super(collection, migrationResourcesProvider, appLayerFactory); } public String getVersion() { return "7.2"; } @Override protected void migrate(MetadataSchemaTypesBuilder typesBuilder) { migrateLabel(typesBuilder); migrateMetadatasForRequestEvents(typesBuilder); typesBuilder.getSchema(Folder.DEFAULT_SCHEMA).get(Folder.TITLE).setSortable(true); typesBuilder.getDefaultSchema(Category.SCHEMA_TYPE).create(Category.DESCRIPTION).setType(MetadataValueType.TEXT); typesBuilder.getMetadata(Folder.DEFAULT_SCHEMA + "_" + Folder.LINEAR_SIZE).setEssential(false); } private void migrateLabel(MetadataSchemaTypesBuilder typesBuilder) { typesBuilder.getSchema(Folder.DEFAULT_SCHEMA).get(Folder.EXPECTED_TRANSFER_DATE) .addLabel(Language.French, "Date de transfert prévue"); typesBuilder.getSchema(Folder.DEFAULT_SCHEMA).get(Folder.EXPECTED_DEPOSIT_DATE) .addLabel(Language.French, "Date de versement prévue"); typesBuilder.getSchema(Folder.DEFAULT_SCHEMA).get(Folder.EXPECTED_DESTRUCTION_DATE) .addLabel(Language.French, "Date de destruction prévue"); } public void migrateMetadatasForRequestEvents(MetadataSchemaTypesBuilder typesBuilder) { typesBuilder.getDefaultSchema(Folder.SCHEMA_TYPE).createUndeletable(Folder.REACTIVATION_DECOMMISSIONING_DATE) .setType(MetadataValueType.DATE); typesBuilder.getDefaultSchema(Folder.SCHEMA_TYPE).createUndeletable(Folder.REACTIVATION_DATES) .setType(MetadataValueType.DATE).setMultivalue(true); typesBuilder.getDefaultSchema(Folder.SCHEMA_TYPE).createUndeletable(Folder.REACTIVATION_USERS) .setType(REFERENCE).setMultivalue(true).defineReferencesTo( typesBuilder.getSchemaType(User.SCHEMA_TYPE) ); typesBuilder.getDefaultSchema(Folder.SCHEMA_TYPE).createUndeletable(Folder.PREVIOUS_DEPOSIT_DATES) .setType(MetadataValueType.DATE).setMultivalue(true); typesBuilder.getDefaultSchema(Folder.SCHEMA_TYPE).createUndeletable(Folder.PREVIOUS_TRANSFER_DATES) .setType(MetadataValueType.DATE).setMultivalue(true); typesBuilder.getDefaultSchema(Folder.SCHEMA_TYPE).get(Folder.DECOMMISSIONING_DATE) .defineDataEntry().asCalculated(FolderDecommissioningDateCalculator2.class); MetadataSchemaTypeBuilder taskSchemaType = typesBuilder.getSchemaType(Task.SCHEMA_TYPE); taskSchemaType.createCustomSchema(BorrowRequest.SCHEMA_NAME); taskSchemaType.createCustomSchema(ReturnRequest.SCHEMA_NAME); taskSchemaType.createCustomSchema(ReactivationRequest.SCHEMA_NAME); taskSchemaType.createCustomSchema(ExtensionRequest.SCHEMA_NAME); typesBuilder.getDefaultSchema(ContainerRecord.SCHEMA_TYPE).createUndeletable(ContainerRecord.BORROW_RETURN_DATE) .setType(MetadataValueType.DATE_TIME); typesBuilder.getSchema(Task.DEFAULT_SCHEMA).createUndeletable(Task.LINKED_CONTAINERS) .setType(REFERENCE) .defineReferencesTo(typesBuilder.getDefaultSchema(ContainerRecord.SCHEMA_TYPE)).setMultivalue(true); typesBuilder.getSchema(Task.DEFAULT_SCHEMA).createUndeletable(Task.REASON).setType(MetadataValueType.TEXT); typesBuilder.getSchema(ExtensionRequest.FULL_SCHEMA_NAME).createUndeletable(ExtensionRequest.EXTENSION_VALUE) .setType(MetadataValueType.DATE); typesBuilder.getSchema(BorrowRequest.FULL_SCHEMA_NAME).createUndeletable(BorrowRequest.BORROW_DURATION) .setType(MetadataValueType.NUMBER).setDefaultRequirement(true); typesBuilder.getSchema(ReactivationRequest.FULL_SCHEMA_NAME).createUndeletable(ReactivationRequest.REACTIVATION_DATE) .setType(MetadataValueType.DATE).setDefaultRequirement(true); typesBuilder.getSchema(ExtensionRequest.FULL_SCHEMA_NAME).createUndeletable(ExtensionRequest.ACCEPTED) .setType(MetadataValueType.BOOLEAN).setDefaultValue(null); typesBuilder.getSchema(BorrowRequest.FULL_SCHEMA_NAME).createUndeletable(BorrowRequest.ACCEPTED) .setType(MetadataValueType.BOOLEAN).setDefaultValue(null); typesBuilder.getSchema(ReactivationRequest.FULL_SCHEMA_NAME).createUndeletable(ReactivationRequest.ACCEPTED) .setType(MetadataValueType.BOOLEAN).setDefaultValue(null); typesBuilder.getSchema(ReturnRequest.FULL_SCHEMA_NAME).createUndeletable(ReturnRequest.ACCEPTED) .setType(MetadataValueType.BOOLEAN).setDefaultValue(null); typesBuilder.getSchema(ExtensionRequest.FULL_SCHEMA_NAME).createUndeletable(ExtensionRequest.APPLICANT) .setType(REFERENCE).defineReferencesTo(typesBuilder.getDefaultSchema(User.SCHEMA_TYPE)) .setSystemReserved(true); typesBuilder.getSchema(BorrowRequest.FULL_SCHEMA_NAME).createUndeletable(BorrowRequest.APPLICANT) .setType(REFERENCE).defineReferencesTo(typesBuilder.getDefaultSchema(User.SCHEMA_TYPE)) .setSystemReserved(true); typesBuilder.getSchema(ReactivationRequest.FULL_SCHEMA_NAME).createUndeletable(ReactivationRequest.APPLICANT) .setType(REFERENCE).defineReferencesTo(typesBuilder.getDefaultSchema(User.SCHEMA_TYPE)) .setSystemReserved(true); typesBuilder.getSchema(ReturnRequest.FULL_SCHEMA_NAME).createUndeletable(ReturnRequest.APPLICANT) .setType(REFERENCE).defineReferencesTo(typesBuilder.getDefaultSchema(User.SCHEMA_TYPE)) .setSystemReserved(true); typesBuilder.getSchema(ExtensionRequest.FULL_SCHEMA_NAME).createUndeletable(ExtensionRequest.RESPONDANT) .setType(REFERENCE).defineReferencesTo(typesBuilder.getDefaultSchema(User.SCHEMA_TYPE)) .setSystemReserved(true); typesBuilder.getSchema(BorrowRequest.FULL_SCHEMA_NAME).createUndeletable(BorrowRequest.RESPONDANT) .setType(REFERENCE).defineReferencesTo(typesBuilder.getDefaultSchema(User.SCHEMA_TYPE)) .setSystemReserved(true); typesBuilder.getSchema(ReactivationRequest.FULL_SCHEMA_NAME).createUndeletable(ReactivationRequest.RESPONDANT) .setType(REFERENCE).defineReferencesTo(typesBuilder.getDefaultSchema(User.SCHEMA_TYPE)) .setSystemReserved(true); typesBuilder.getSchema(ReturnRequest.FULL_SCHEMA_NAME).createUndeletable(ReturnRequest.RESPONDANT) .setType(REFERENCE).defineReferencesTo(typesBuilder.getDefaultSchema(User.SCHEMA_TYPE)) .setSystemReserved(true); MetadataSchemaTypeBuilder eventSchemaType = typesBuilder.getSchemaType(Event.SCHEMA_TYPE); eventSchemaType.getDefaultSchema().create(Event.RECEIVER_NAME).setType(REFERENCE) .defineReferencesTo(typesBuilder.getSchemaType(User.SCHEMA_TYPE)); eventSchemaType.getDefaultSchema().create(Event.TASK).setType(REFERENCE) .defineReferencesTo(typesBuilder.getSchemaType(Task.SCHEMA_TYPE)); eventSchemaType.getDefaultSchema().create(Event.DESCRIPTION).setType(MetadataValueType.TEXT); eventSchemaType.getDefaultSchema().create(Event.ACCEPTED).setType(MetadataValueType.BOOLEAN); } } }