package com.constellio.app.services.migrations.scripts; import static com.constellio.model.entities.schemas.MetadataValueType.BOOLEAN; import static com.constellio.model.entities.schemas.MetadataValueType.NUMBER; import static com.constellio.model.entities.schemas.MetadataValueType.REFERENCE; import static com.constellio.model.entities.schemas.MetadataValueType.STRING; import static com.constellio.model.entities.schemas.MetadataValueType.STRUCTURE; 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.app.ui.pages.search.criteria.CriterionFactory; import com.constellio.app.ui.pages.search.criteria.FacetSelectionsFactory; import com.constellio.model.entities.records.wrappers.EmailToSend; import com.constellio.model.entities.records.wrappers.Facet; import com.constellio.model.entities.records.wrappers.Report; import com.constellio.model.entities.records.wrappers.SavedSearch; import com.constellio.model.entities.records.wrappers.SavedSearch.SortOrder; import com.constellio.model.entities.records.wrappers.User; import com.constellio.model.entities.records.wrappers.structure.FacetOrderType; import com.constellio.model.entities.records.wrappers.structure.FacetType; import com.constellio.model.entities.records.wrappers.structure.ReportedMetadataFactory; import com.constellio.model.entities.schemas.MetadataValueType; import com.constellio.model.entities.schemas.Schemas; import com.constellio.model.entities.structures.EmailAddressFactory; import com.constellio.model.entities.structures.MapStringStringStructureFactory; import com.constellio.model.services.records.RecordServices; import com.constellio.model.services.records.RecordServicesException; 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.schemas.calculators.TokensCalculator2; import com.constellio.model.services.schemas.calculators.UserTokensCalculator2; public class CoreMigrationTo_5_0_7 implements MigrationScript { @Override public String getVersion() { return "5.0.7"; } @Override public void migrate(String collection, MigrationResourcesProvider migrationResourcesProvider, AppLayerFactory appLayerFactory) throws Exception { new CoreSchemaAlterationFor5_0_7(collection, migrationResourcesProvider, appLayerFactory).migrate(); createDefaultCoreFacets(collection, migrationResourcesProvider, appLayerFactory); } private void createDefaultCoreFacets(String collection, MigrationResourcesProvider migrationResourcesProvider, AppLayerFactory appLayerFactory) throws RecordServicesException { RMSchemasRecordsServices rm = new RMSchemasRecordsServices(collection, appLayerFactory); RecordServices recordServices = rm.getModelLayerFactory().newRecordServices(); recordServices.add(rm.newFacetField().setOrder(0).setTitle(migrationResourcesProvider.get("init.facet.type")) .setFieldDataStoreCode(Schemas.SCHEMA.getDataStoreCode())); recordServices.add(rm.newFacetQuery().setOrder(1) .setTitle(migrationResourcesProvider.get("init.facet.createModification")) .withQuery("modifiedOn_dt:[NOW-1MONTH TO NOW]", "Modifiés les 30 derniers jours") .withQuery("modifiedOn_dt:[NOW-7DAY TO NOW]", "Modifiés les 7 derniers jours") .withQuery("createdOn_dt:[NOW-1MONTH TO NOW]", "Créés les 30 derniers jours") .withQuery("createdOn_dt:[NOW-7DAY TO NOW]", "Créés les 7 derniers jours")); } private class CoreSchemaAlterationFor5_0_7 extends MetadataSchemasAlterationHelper { public CoreSchemaAlterationFor5_0_7(String collection, MigrationResourcesProvider migrationResourcesProvider, AppLayerFactory appLayerFactory) { super(collection, migrationResourcesProvider, appLayerFactory); } @Override protected void migrate(MetadataSchemaTypesBuilder typesBuilder) { createReportSchemaType(typesBuilder); createSendEmail(typesBuilder); createSavedSearchSchemaType(typesBuilder); changeTokensCalculators(typesBuilder); createFacetSchema(typesBuilder); } private void createFacetSchema(MetadataSchemaTypesBuilder typesBuilder) { MetadataSchemaTypeBuilder facetTypes = typesBuilder.createNewSchemaType(Facet.SCHEMA_TYPE).setSecurity(false); MetadataSchemaBuilder facetSchema = facetTypes.getDefaultSchema(); facetSchema.createUndeletable(Facet.FIELD_DATA_STORE_CODE).setType(MetadataValueType.STRING) .setEssential(true); facetSchema.createUndeletable(Facet.FACET_TYPE).setType(MetadataValueType.ENUM) .defineAsEnum(FacetType.class) .setDefaultRequirement(true); facetSchema.createUndeletable(Facet.PAGES).setType(MetadataValueType.NUMBER) .setDefaultValue(1); facetSchema.createUndeletable(Facet.ELEMENT_PER_PAGE).setType(MetadataValueType.NUMBER) .setDefaultValue(5) .setDefaultRequirement(true); facetSchema.createUndeletable(Facet.ORDER_RESULT).setType(MetadataValueType.ENUM) .defineAsEnum(FacetOrderType.class) .setDefaultValue(FacetOrderType.RELEVANCE) .setDefaultRequirement(true); facetSchema.createUndeletable(Facet.ORDER).setType(MetadataValueType.NUMBER); MetadataSchemaBuilder facetFieldSchema = facetTypes.createCustomSchema(Facet.FIELD_LOCAL_CODE); facetFieldSchema.createUndeletable(Facet.FIELD_VALUES_LABEL).setType(MetadataValueType.STRUCTURE) .defineStructureFactory(MapStringStringStructureFactory.class); MetadataSchemaBuilder facetQuerySchema = facetTypes.createCustomSchema(Facet.QUERY_LOCAL_CODE); facetQuerySchema.createUndeletable(Facet.LIST_QUERIES).setType(MetadataValueType.STRUCTURE) .defineStructureFactory(MapStringStringStructureFactory.class); } private void changeTokensCalculators(MetadataSchemaTypesBuilder typesBuilder) { typesBuilder.getSchemaType(User.SCHEMA_TYPE).getDefaultSchema().getMetadata(User.USER_TOKENS) .defineDataEntry().asCalculated(UserTokensCalculator2.class); for (MetadataSchemaTypeBuilder type : typesBuilder.getTypes()) { type.getDefaultSchema().getMetadata(Schemas.TOKENS.getLocalCode()) .defineDataEntry().asCalculated(TokensCalculator2.class); } } private void createSendEmail(MetadataSchemaTypesBuilder typesBuilder) { MetadataSchemaTypeBuilder schemaType = typesBuilder.createNewSchemaType(EmailToSend.SCHEMA_TYPE).setSecurity(false); MetadataSchemaBuilder defaultSchema = schemaType.getDefaultSchema(); defaultSchema.createUndeletable(EmailToSend.FROM).setType(MetadataValueType.STRUCTURE).defineStructureFactory( EmailAddressFactory.class); defaultSchema.createUndeletable(EmailToSend.TO).setType(MetadataValueType.STRUCTURE).defineStructureFactory( EmailAddressFactory.class).setMultivalue(true); defaultSchema.createUndeletable(EmailToSend.BCC).setType(MetadataValueType.STRUCTURE).defineStructureFactory( EmailAddressFactory.class).setMultivalue(true); defaultSchema.createUndeletable(EmailToSend.CC).setType(MetadataValueType.STRUCTURE).defineStructureFactory( EmailAddressFactory.class).setMultivalue(true); defaultSchema.createUndeletable(EmailToSend.SUBJECT).setType(MetadataValueType.STRING); defaultSchema.createUndeletable(EmailToSend.PARAMETERS).setType(MetadataValueType.STRING).setMultivalue(true); defaultSchema.createUndeletable(EmailToSend.TEMPLATE).setType(MetadataValueType.STRING); defaultSchema.createUndeletable(EmailToSend.SEND_ON).setType(MetadataValueType.DATE_TIME); defaultSchema.createUndeletable(EmailToSend.TRYING_COUNT).setType(MetadataValueType.NUMBER).setDefaultValue(0d).setDefaultRequirement(true); defaultSchema.createUndeletable(EmailToSend.ERROR).setType(MetadataValueType.STRING); } private MetadataSchemaTypeBuilder createReportSchemaType(MetadataSchemaTypesBuilder typesBuilder) { MetadataSchemaTypeBuilder type = typesBuilder.createNewSchemaType(Report.SCHEMA_TYPE).setSecurity(false); MetadataSchemaBuilder defaultSchema = type.getDefaultSchema(); defaultSchema.createUndeletable(Report.USERNAME).setType(STRING); defaultSchema.createUndeletable(Report.SCHEMA_TYPE_CODE).setType(STRING).setDefaultRequirement(true); defaultSchema.createUndeletable(Report.COLUMNS_COUNT).setType(NUMBER); defaultSchema.createUndeletable(Report.LINES_COUNT).setType(NUMBER).setDefaultRequirement(true); defaultSchema.createUndeletable(Report.SEPARATOR).setType(STRING); defaultSchema.createUndeletable(Report.REPORTED_METADATA).setType(STRUCTURE).setMultivalue(true) .defineStructureFactory(ReportedMetadataFactory.class); return type; } private MetadataSchemaTypeBuilder createSavedSearchSchemaType(MetadataSchemaTypesBuilder typesBuilder) { MetadataSchemaTypeBuilder type = typesBuilder.createNewSchemaType(SavedSearch.SCHEMA_TYPE).setSecurity(false); MetadataSchemaBuilder defaultSchema = type.getDefaultSchema(); defaultSchema.createUndeletable(SavedSearch.USER).setType(REFERENCE) .defineReferencesTo(typesBuilder.getSchemaType(User.SCHEMA_TYPE)); defaultSchema.createUndeletable(SavedSearch.PUBLIC).setType(BOOLEAN); defaultSchema.createUndeletable(SavedSearch.SORT_FIELD).setType(STRING); defaultSchema.createUndeletable(SavedSearch.FACET_SELECTIONS).setType(STRUCTURE) .defineStructureFactory(FacetSelectionsFactory.class).setMultivalue(true); defaultSchema.createUndeletable(SavedSearch.FREE_TEXT_SEARCH).setType(STRING); defaultSchema.createUndeletable(SavedSearch.ADVANCED_SEARCH).setType(STRUCTURE) .defineStructureFactory(CriterionFactory.class).setMultivalue(true); defaultSchema.createUndeletable(SavedSearch.SCHEMA_FILTER).setType(STRING); defaultSchema.createUndeletable(SavedSearch.SEARCH_TYPE).setType(STRING); defaultSchema.createUndeletable(SavedSearch.SORT_ORDER).defineAsEnum(SortOrder.class); return type; } } }