package com.constellio.app.modules.rm; import com.constellio.app.entities.modules.ComboMigrationScript; import com.constellio.app.entities.modules.InstallableSystemModule; import com.constellio.app.entities.modules.MigrationScript; import com.constellio.app.entities.modules.ModuleWithComboMigration; import com.constellio.app.entities.navigation.NavigationConfig; import com.constellio.app.extensions.AppLayerCollectionExtensions; import com.constellio.app.modules.rm.constants.RMPermissionsTo; import com.constellio.app.modules.rm.constants.RMRoles; import com.constellio.app.modules.rm.extensions.*; import com.constellio.app.modules.rm.extensions.api.RMModuleExtensions; import com.constellio.app.modules.rm.extensions.app.BatchProcessingRecordFactoryExtension; import com.constellio.app.modules.rm.extensions.app.RMBatchProcessingExtension; import com.constellio.app.modules.rm.extensions.app.RMCmisExtension; import com.constellio.app.modules.rm.extensions.app.RMRecordExportExtension; import com.constellio.app.modules.rm.extensions.imports.*; import com.constellio.app.modules.rm.extensions.schema.RMAvailableCapacityExtension; import com.constellio.app.modules.rm.extensions.schema.RMMediumTypeRecordExtension; import com.constellio.app.modules.rm.extensions.schema.RMTrashSchemaExtension; import com.constellio.app.modules.rm.migrations.*; import com.constellio.app.modules.rm.model.CopyRetentionRule; import com.constellio.app.modules.rm.model.CopyRetentionRuleBuilder; import com.constellio.app.modules.rm.navigation.RMNavigationConfiguration; import com.constellio.app.modules.rm.services.RMSchemasRecordsServices; import com.constellio.app.modules.rm.wrappers.*; import com.constellio.app.modules.tasks.TaskModule; import com.constellio.app.modules.tasks.model.wrappers.types.TaskStatus; import com.constellio.app.services.factories.AppLayerFactory; import com.constellio.data.utils.dev.Toggle; import com.constellio.model.entities.configs.SystemConfiguration; 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.MetadataSchemaType; import com.constellio.model.entities.security.Role; import com.constellio.model.extensions.ModelLayerCollectionExtensions; import com.constellio.model.services.factories.ModelLayerFactory; import com.constellio.model.services.records.RecordServicesException; import com.constellio.model.services.records.cache.CacheConfig; import com.constellio.model.services.records.cache.RecordsCache; import com.constellio.model.services.search.query.logical.LogicalSearchQuery; import com.constellio.model.services.security.GlobalSecurizedTypeCondition; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Map; import static com.constellio.app.ui.i18n.i18n.$; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from; import static java.util.Arrays.asList; public class ConstellioRMModule implements InstallableSystemModule, ModuleWithComboMigration { public static final String ID = "rm"; public static final String NAME = "Constellio RM"; public static final int DEFAULT_VOLATILE_EVENTS_CACHE_SIZE = 10000; public static final int DEFAULT_VOLATILE_FOLDERS_CACHE_SIZE = 10000; public static final int DEFAULT_VOLATILE_DOCUMENTS_CACHE_SIZE = 100; @Override public String getName() { return NAME; } @Override public String getId() { return ID; } @Override public String getPublisher() { return "Constellio"; } @Override public List<MigrationScript> getMigrationScripts() { return asList( new RMMigrationTo5_0_1(), new RMMigrationTo5_0_2(), new RMMigrationTo5_0_3(), new RMMigrationTo5_0_4(), new RMMigrationTo5_0_4_1(), new RMMigrationTo5_0_5(), new RMMigrationTo5_0_6(), new RMMigrationTo5_0_7(), new RMMigrationTo5_1_0_3(), new RMMigrationTo5_1_0_4(), new RMMigrationTo5_1_0_6(), new RMMigrationTo5_1_2(), new RMMigrationTo5_1_2_2(), new RMMigrationTo5_1_3(), new RMMigrationTo5_1_3(), new RMMigrationTo5_1_4_1(), new RMMigrationTo5_1_5(), new RMMigrationTo5_1_7(), new RMMigrationTo5_1_9(), new RMMigrationTo6_1(), new RMMigrationTo6_1_4(), new RMMigrationTo6_2(), new RMMigrationTo6_2_0_7(), new RMMigrationTo6_3(), new RMMigrationTo6_4(), new RMMigrationTo6_5(), new RMMigrationTo6_5_1(), new RMMigrationTo6_5_7(), new RMMigrationTo6_5_20(), new RMMigrationTo6_5_21(), new RMMigrationTo6_5_33(), new RMMigrationTo6_5_34(), new RMMigrationTo6_5_36(), new RMMigrationTo6_5_37(), new RMMigrationTo6_5_50(), new RMMigrationTo6_5_54(), new RMMigrationTo6_6(), new RMMigrationTo6_7(), new RMMigrationTo7_0_5(), new RMMigrationTo7_0_10_5(), new RMMigrationTo7_1(), new RMMigrationTo7_1_1(), new RMMigrationTo7_1_2(), new RMMigrationTo7_2(), new RMMigrationTo7_2_0_1(), new RMMigrationTo7_2_0_2(), new RMMigrationTo7_3() ); } @Override public ComboMigrationScript getComboMigrationScript() { return new RMMigrationCombo(); } @Override public List<SystemConfiguration> getConfigurations() { return Collections.unmodifiableList(RMConfigs.configurations); } @Override public Map<String, List<String>> getPermissions() { return RMPermissionsTo.PERMISSIONS.getGrouped(); } @Override public List<String> getRolesForCreator() { return asList(RMRoles.RGD); } @Override public boolean isComplementary() { return false; } @Override public List<String> getDependencies() { return asList(TaskModule.ID); } @Override public void configureNavigation(NavigationConfig config) { RMNavigationConfiguration.configureNavigation(config); } @Override public void start(String collection, AppLayerFactory appLayerFactory) { setupModelLayerExtensions(collection, appLayerFactory); setupAppLayerExtensions(collection, appLayerFactory); } @Override public void stop(String collection, AppLayerFactory appLayerFactory) { } @Override public void addDemoData(String collection, AppLayerFactory appLayerFactory) { RMSchemasRecordsServices rm = new RMSchemasRecordsServices(collection, appLayerFactory); Transaction transaction = new Transaction(); AdministrativeUnit adminUnit = rm.newAdministrativeUnit().setCode("1").setTitle($("RMDemoData.adminUnit")); transaction.add(adminUnit); CopyRetentionRuleBuilder copyBuilder = CopyRetentionRuleBuilder.sequential(appLayerFactory); CopyRetentionRule principal888_5_C = copyBuilder.newPrincipal(asList(rm.PA(), rm.DM()), "888-5-C"); CopyRetentionRule secondary888_0_D = copyBuilder.newSecondary(asList(rm.PA(), rm.DM()), "888-0-D"); RetentionRule retentionRule = rm.newRetentionRule().setCode("R1").setTitle($("RMDemoData.retentionRule")) .setAdministrativeUnits(asList(adminUnit.getId())).setApproved(true) .setCopyRetentionRules(asList(principal888_5_C, secondary888_0_D)); transaction.add(retentionRule); Category category10 = rm.newCategory().setCode("10").setTitle($("RMDemoData.category10")).setRetentionRules( asList(retentionRule.getId())); transaction.add(category10); transaction.add(rm.newCategory().setCode("11").setTitle($("RMDemoData.category11")) .setParent(category10.getId()).setRetentionRules(asList(retentionRule.getId()))); transaction.add(rm.newCategory().setCode("12").setTitle($("RMDemoData.category12")) .setParent(category10.getId()).setRetentionRules(asList(retentionRule.getId()))); transaction.add(rm.newCategory().setCode("13").setTitle($("RMDemoData.category13")) .setParent(category10.getId()).setRetentionRules(asList(retentionRule.getId()))); try { appLayerFactory.getModelLayerFactory().newRecordServices().execute(transaction); } catch (RecordServicesException e) { throw new RuntimeException(e); } } private void setupAppLayerExtensions(String collection, AppLayerFactory appLayerFactory) { AppLayerCollectionExtensions extensions = appLayerFactory.getExtensions().forCollection(collection); extensions.schemaTypeAccessExtensions.add(new RMGenericRecordPageExtension()); extensions.schemaTypeAccessExtensions.add(new LabelSchemaRestrictionPageExtension()); extensions.taxonomyAccessExtensions.add(new RMTaxonomyPageExtension(collection)); extensions.pageAccessExtensions.add(new RMModulePageExtension()); extensions.downloadContentVersionLinkExtensions.add(new RMDownloadContentVersionLinkExtension()); extensions.cmisExtensions.add(new RMCmisExtension(collection, appLayerFactory)); extensions.recordAppExtensions.add(new RMRecordAppExtension(collection, appLayerFactory)); extensions.recordNavigationExtensions.add(new RMRecordNavigationExtension()); extensions.searchPageExtensions.add(new RMSearchPageExtension(appLayerFactory)); extensions.batchProcessingExtensions.add(new RMBatchProcessingExtension(collection, appLayerFactory)); extensions.recordFieldFactoryExtensions.add(new BatchProcessingRecordFactoryExtension()); extensions.moduleExtensionsMap.put(ID, new RMModuleExtensions(appLayerFactory)); extensions.systemCheckExtensions.add(new RMSystemCheckExtension(collection, appLayerFactory)); extensions.recordExportExtensions.add(new RMRecordExportExtension(collection, appLayerFactory)); extensions.pagesComponentsExtensions.add(new RMCleanAdministrativeUnitButtonExtension(collection, appLayerFactory)); extensions.pagesComponentsExtensions.add(new RMRequestTaskButtonExtension(collection, appLayerFactory)); extensions.selectionPanelExtensions.add(new RMSelectionPanelExtension(appLayerFactory, collection)); extensions.lockedRecords.add(RMTaskType.SCHEMA_TYPE, RMTaskType.BORROW_REQUEST); extensions.lockedRecords.add(RMTaskType.SCHEMA_TYPE, RMTaskType.BORROW_EXTENSION_REQUEST); extensions.lockedRecords.add(RMTaskType.SCHEMA_TYPE, RMTaskType.RETURN_REQUEST); extensions.lockedRecords.add(RMTaskType.SCHEMA_TYPE, RMTaskType.REACTIVATION_REQUEST); extensions.lockedRecords.add(TaskStatus.SCHEMA_TYPE, TaskStatus.CLOSED_CODE); extensions.lockedRecords.add(TaskStatus.SCHEMA_TYPE, TaskStatus.STANDBY_CODE); } private void setupModelLayerExtensions(String collection, AppLayerFactory appLayerFactory) { ModelLayerFactory modelLayerFactory = appLayerFactory.getModelLayerFactory(); ModelLayerCollectionExtensions extensions = modelLayerFactory.getExtensions().forCollection(collection); extensions.recordExtensions.add(new RMSchemasLogicalDeleteExtension(collection, modelLayerFactory)); extensions.recordExtensions.add(new RMUserRecordExtension(collection, modelLayerFactory)); extensions.recordExtensions.add(new RMEmailDocumentRecordExtension(collection, modelLayerFactory)); extensions.recordExtensions.add(new RMOldSchemasBlockageRecordExtension()); extensions.recordExtensions.add(new RMCheckInAlertsRecordExtension(collection, modelLayerFactory)); extensions.recordExtensions.add(new RMFolderExtension(collection, modelLayerFactory)); extensions.recordExtensions.add(new RMCreateDecommissioningListExtension(collection, modelLayerFactory)); extensions.recordExtensions.add(new RMDocumentExtension(collection, appLayerFactory)); extensions.recordExtensions.add(new SessionContextRecordExtension()); extensions.recordImportExtensions.add(new RetentionRuleImportExtension(collection, modelLayerFactory)); extensions.recordImportExtensions.add(new FolderRuleImportExtension(collection, modelLayerFactory)); extensions.recordImportExtensions.add(new EventImportExtension(collection, modelLayerFactory)); extensions.recordImportExtensions.add(new DocumentRuleImportExtension(collection, modelLayerFactory)); extensions.recordImportExtensions.add(new DecommissioningListImportExtension(collection, modelLayerFactory)); extensions.schemaExtensions.add(new RMTrashSchemaExtension()); extensions.recordExtensions.add(new RMAvailableCapacityExtension(collection, appLayerFactory)); extensions.recordExtensions.add(new RMRequestTaskApprovedExtension(collection, appLayerFactory)); extensions.recordExtensions.add(new RMMediumTypeRecordExtension(collection, modelLayerFactory)); extensions.recordExtensions.add(new RMEventRecordExtension(collection, modelLayerFactory)); RMSchemasRecordsServices rm = new RMSchemasRecordsServices(collection, modelLayerFactory); RecordsCache cache = modelLayerFactory.getRecordsCaches().getCache(collection); for (MetadataSchemaType type : rm.valueListSchemaTypes()) { if (cache.isConfigured(type)) { cache.removeCache(type.getCode()); } cache.configureCache(CacheConfig.permanentCache(type)); } if (cache.isConfigured(AdministrativeUnit.SCHEMA_TYPE)) { cache.removeCache(AdministrativeUnit.SCHEMA_TYPE); } cache.configureCache(CacheConfig.permanentCache(rm.administrativeUnit.schemaType())); if (cache.isConfigured(Category.SCHEMA_TYPE)) { cache.removeCache(Category.SCHEMA_TYPE); } cache.configureCache(CacheConfig.permanentCache(rm.category.schemaType())); cache.configureCache(CacheConfig.permanentCache(rm.retentionRule.schemaType())); cache.configureCache(CacheConfig.permanentCache(rm.uniformSubdivision.schemaType())); cache.configureCache(CacheConfig.permanentCache(rm.containerRecord.schemaType())); if (!cache.isConfigured(rm.authorizationDetails.schemaType())) { cache.configureCache(CacheConfig.permanentCache(rm.authorizationDetails.schemaType())); Iterator<Record> authsIterator = modelLayerFactory.newSearchServices().recordsIterator(new LogicalSearchQuery( from(rm.authorizationDetails.schemaType()).returnAll()), 10000); while (authsIterator.hasNext()) { authsIterator.next(); } } if (Toggle.CACHES_ENABLED.isEnabled()) { cache.configureCache(CacheConfig.volatileCache(rm.event.schemaType(), DEFAULT_VOLATILE_EVENTS_CACHE_SIZE)); cache.configureCache(CacheConfig.volatileCache(rm.folder.schemaType(), DEFAULT_VOLATILE_FOLDERS_CACHE_SIZE)); cache.configureCache(CacheConfig.volatileCache(rm.documentSchemaType(), DEFAULT_VOLATILE_DOCUMENTS_CACHE_SIZE)); cache.configureCache(CacheConfig.volatileCache( rm.getModelLayerFactory().getMetadataSchemasManager().getSchemaTypes(collection) .getSchemaType(SavedSearch.SCHEMA_TYPE), 10000)); } } @Override public void start(AppLayerFactory appLayerFactory) { RMNavigationConfiguration.configureNavigation(appLayerFactory.getNavigatorConfigurationService()); appLayerFactory.getModelLayerFactory().getSecurityTokenManager().registerPublicTypeWithCondition( ContainerRecord.SCHEMA_TYPE, new GlobalSecurizedTypeCondition() { @Override public boolean hasGlobalAccess(User user, String access) { if (Role.READ.equals(access)) { return user.hasAny(RMPermissionsTo.DISPLAY_CONTAINERS, RMPermissionsTo.MANAGE_CONTAINERS).globally(); } else if (Role.WRITE.equals(access) || Role.DELETE.equals(access)) { return user.hasAny(RMPermissionsTo.MANAGE_CONTAINERS).globally(); } return false; } }); appLayerFactory.getModelLayerFactory().getSecurityTokenManager().registerPublicTypeWithCondition( StorageSpace.SCHEMA_TYPE, new GlobalSecurizedTypeCondition() { @Override public boolean hasGlobalAccess(User user, String access) { if (Role.READ.equals(access) || Role.WRITE.equals(access) || Role.DELETE.equals(access)) { return user.hasAny(RMPermissionsTo.MANAGE_STORAGE_SPACES).globally(); } return false; } }); } @Override public void stop(AppLayerFactory appLayerFactory) { } }