package com.constellio.app.entities.modules; import static com.constellio.app.ui.i18n.i18n.$; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.constellio.app.entities.modules.MigrationResourcesProviderRuntimeException.MigrationResourcesProviderRuntimeException_NoBundle; import com.constellio.app.services.factories.AppLayerFactory; import com.constellio.data.dao.services.factories.DataLayerFactory; import com.constellio.model.entities.Language; import com.constellio.model.services.factories.ModelLayerFactory; import com.constellio.model.services.schemas.MetadataSchemasManager; import com.constellio.model.services.schemas.MetadataSchemasManagerException.OptimisticLocking; import com.constellio.model.services.schemas.builders.MetadataBuilder; import com.constellio.model.services.schemas.builders.MetadataSchemaBuilder; import com.constellio.model.services.schemas.builders.MetadataSchemaTypeBuilder; import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilder; public abstract class MetadataSchemasAlterationHelper { private static Logger LOGGER = LoggerFactory.getLogger(MetadataSchemasAlterationHelper.class); protected MetadataSchemaTypesBuilder typesBuilder; protected String collection; protected ModelLayerFactory modelLayerFactory; protected AppLayerFactory appLayerFactory; protected DataLayerFactory dataLayerFactory; protected MigrationResourcesProvider migrationResourcesProvider; protected MetadataSchemasAlterationHelper(String collection, MigrationResourcesProvider migrationResourcesProvider, AppLayerFactory appLayerFactory) { this.collection = collection; this.modelLayerFactory = appLayerFactory.getModelLayerFactory(); this.appLayerFactory = appLayerFactory; this.dataLayerFactory = modelLayerFactory.getDataLayerFactory(); this.migrationResourcesProvider = migrationResourcesProvider; } public final void migrate() { MetadataSchemasManager metadataSchemasManager = modelLayerFactory.getMetadataSchemasManager(); typesBuilder = metadataSchemasManager.modify(collection); migrate(typesBuilder); try { try { applyI18N(typesBuilder); } catch (MigrationResourcesProviderRuntimeException_NoBundle e) { //LOGGER.warn(e.getMessage()); } metadataSchemasManager.saveUpdateSchemaTypes(typesBuilder); } catch (OptimisticLocking e) { migrate(); } } private void applyI18N(MetadataSchemaTypesBuilder typesBuilder) { for (MetadataSchemaTypeBuilder type : typesBuilder.getTypes()) { applyI18N(type); } } protected MetadataSchemaTypeBuilder schemaType(String schemaTypeCode) { return this.typesBuilder.getSchemaType(schemaTypeCode); } protected MetadataSchemaBuilder schema(String schemaCode) { return this.typesBuilder.getSchema(schemaCode); } private MetadataSchemaTypeBuilder applyI18N(MetadataSchemaTypeBuilder schemaType) { String schemaTypeKey = "init." + schemaType.getCode(); List<String> collectionLanguages = modelLayerFactory.getCollectionsListManager().getCollectionLanguages(collection); for (String languageCode : collectionLanguages) { Language language = Language.withCode(languageCode); String schemaTypeLabel = migrationResourcesProvider.getString(schemaTypeKey, language.getLocale()); addLabel(schemaType, schemaTypeLabel, true, language); for (MetadataSchemaBuilder schemaBuilder : schemaType.getAllSchemas()) { String schemaKey = schemaTypeKey + "." + schemaBuilder.getLocalCode(); String schemaLabel = migrationResourcesProvider.getString(schemaKey, language.getLocale()); addLabel(schemaBuilder, schemaLabel, true, language); for (MetadataBuilder metadataBuilder : schemaBuilder.getMetadatas()) { boolean overwrite = true; String specificKey = "init." + metadataBuilder.getCode().replace("_", "."); String label = migrationResourcesProvider.getString(specificKey, language.getLocale()); if (label.equals(specificKey)) { overwrite = false; String globalKey = "init.allTypes.allSchemas." + metadataBuilder.getLocalCode(); label = migrationResourcesProvider.getString(globalKey, language.getLocale()); if (label.equals(globalKey)) { label = $(globalKey, language.getLocale()); } } if (label.startsWith("init.")) { label = specificKey; } addLabel(metadataBuilder, label, overwrite, language); } } } return schemaType; } private void addLabel(MetadataBuilder metadataBuilder, String label, boolean overwrite, Language language) { String currentLabel = metadataBuilder.getLabel(language); boolean oldLabelIsHumanFriendly = currentLabel != null && !currentLabel.equals(metadataBuilder.getLocalCode()) && !currentLabel.equals(metadataBuilder.getCode()) && !currentLabel.startsWith("init."); boolean labelDefined = metadataBuilder.getInheritance() != null || oldLabelIsHumanFriendly; boolean newLabelIsHumanFriendly = label != null && !label.startsWith("init."); if (!labelDefined || (newLabelIsHumanFriendly && overwrite)) { metadataBuilder.addLabel(language, label); } } private void addLabel(MetadataSchemaTypeBuilder schemaType, String label, boolean overwrite, Language language) { boolean labelDefined = schemaType.getLabel(language) != null && !schemaType.getLabel(language).equals(schemaType.getCode()); boolean newLabelIsHumanFriendly = label != null && !label.startsWith("init."); if (!labelDefined || (newLabelIsHumanFriendly && overwrite)) { schemaType.addLabel(language, label); } addLabel(schemaType.getDefaultSchema(), label, overwrite, language); } private void addLabel(MetadataSchemaBuilder schema, String label, boolean overwrite, Language language) { boolean labelDefined = schema.getLabel(language) != null && !schema.getLabel(language).equals(schema.getLocalCode()); boolean newLabelIsHumanFriendly = label != null && !label.startsWith("init."); if (!labelDefined || (newLabelIsHumanFriendly && overwrite)) { schema.addLabel(language, label); } } protected abstract void migrate(MetadataSchemaTypesBuilder typesBuilder); public MetadataSchemaTypesBuilder types() { return typesBuilder; } public MetadataSchemaTypeBuilder type(String code) { return types().getSchemaType(code); } public MetadataBuilder defaultMetadata(String typeCode, String metadataCode) { return type(typeCode).getMetadata(metadataCode); } }