package com.constellio.sdk.tests.schemas; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import com.constellio.app.services.collections.CollectionsManager; import com.constellio.model.entities.Language; import com.constellio.model.entities.schemas.Metadata; import com.constellio.model.entities.schemas.MetadataNetwork; import com.constellio.model.entities.schemas.MetadataSchema; import com.constellio.model.entities.schemas.MetadataSchemaType; import com.constellio.model.entities.schemas.MetadataSchemaTypes; import com.constellio.model.services.schemas.MetadataSchemaTypesAlteration; import com.constellio.model.services.schemas.MetadataSchemasManager; 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.utils.DefaultClassProvider; public abstract class SchemasSetup { private static MetadataSchemasManager manager; private static List<SchemasSetup> setups = new ArrayList<>(); protected final String collection; protected final List<String> languages; protected MetadataSchemaTypesBuilder typesBuilder; MetadataSchemaTypes types; private boolean wasSetUp; protected SchemasSetup(String collection) { this(collection, Arrays.asList("fr")); } protected SchemasSetup(String collection, List<String> languages) { this.collection = collection; this.languages = languages; setups.add(this); } public static void clearSetupList() { setups.clear(); } public static void prepareSetups(MetadataSchemasManager manager, CollectionsManager collectionsManager) { SchemasSetup.manager = manager; for (SchemasSetup setup : setups) { if (collectionsManager != null && !collectionsManager.getCollectionCodes().contains(setup.collection)) { collectionsManager.createCollectionInCurrentVersion(setup.collection, setup.languages); } if (!setup.wasSetUp) { MetadataSchemaTypes types = manager.getSchemaTypes(setup.collection); if (collectionsManager == null && types == null) { types = new MetadataSchemaTypes(setup.collection, 0, new ArrayList<MetadataSchemaType>(), new ArrayList<String>(), new ArrayList<String>(), Arrays.asList(Language.French), MetadataNetwork.EMPTY()); } setup.typesBuilder = MetadataSchemaTypesBuilder.modify(types, new DefaultClassProvider()); setup.setUp(); setup.wasSetUp = true; } } } public abstract void setUp(); public final MetadataSchemaTypesBuilder getTypesBuilder() { return typesBuilder; } public final void onSchemaBuilt(MetadataSchemaTypes types) { this.types = types; } public Metadata get(String type, String schema, String metadata) { return get(type, schema).getMetadata(metadata); } public MetadataSchema get(String type, String schema) { return get(type).getSchema(schema); } public MetadataSchemaType get(String type) { return types.getSchemaType(type); } public MetadataSchema getSchema(String code) { return types.getSchema(code); } public Metadata getMetadata(String code) { return types.getMetadata(code); } protected void configureMetadataBuilder(MetadataBuilder metadataBuilder, MetadataSchemaTypesBuilder typesBuilder, com.constellio.sdk.tests.schemas.MetadataBuilderConfigurator... builderConfigurators) { for (com.constellio.sdk.tests.schemas.MetadataBuilderConfigurator builderConfigurator : builderConfigurators) { builderConfigurator.configure(metadataBuilder, typesBuilder); } } protected void configureMetadataBuilder(MetadataSchemaTypeBuilder metadataSchemaTypeBuilder, MetadataSchemaTypesBuilder typesBuilder, com.constellio.sdk.tests.schemas.MetadataSchemaTypeConfigurator... builderConfigurators) { for (com.constellio.sdk.tests.schemas.MetadataSchemaTypeConfigurator builderConfigurator : builderConfigurators) { builderConfigurator.configure(metadataSchemaTypeBuilder, typesBuilder); } } public MetadataSchemaTypes getTypes() { return types; } public SchemasSetup with(MetadataSchemaTypesConfigurator metadataSchemaTypesConfigurator) { metadataSchemaTypesConfigurator.configure(typesBuilder); return this; } public void modify(MetadataSchemaTypesAlteration alteration) { manager.modify(collection, alteration); types = manager.getSchemaTypes(collection); } public void refresh(MetadataSchemasManager manager) { SchemasSetup.manager = manager; types = manager.getSchemaTypes(collection); } public void refresh() { types = manager.getSchemaTypes(collection); } }