package com.constellio.app.modules.es.migrations;
import static com.constellio.model.entities.schemas.MetadataValueType.BOOLEAN;
import static com.constellio.model.entities.schemas.MetadataValueType.DATE_TIME;
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.TEXT;
import com.constellio.app.entities.modules.MigrationResourcesProvider;
import com.constellio.app.modules.es.model.connectors.ConnectorDocument;
import com.constellio.app.modules.es.model.connectors.ConnectorDocumentStatus;
import com.constellio.app.modules.es.model.connectors.ConnectorInstance;
import com.constellio.app.modules.es.model.connectors.ConnectorType;
import com.constellio.app.modules.es.model.connectors.NextFetchCalculator;
import com.constellio.app.modules.es.model.connectors.http.enums.FetchFrequency;
import com.constellio.app.modules.es.services.ESSchemasRecordsServices;
import com.constellio.app.services.factories.AppLayerFactory;
import com.constellio.data.dao.services.factories.DataLayerFactory;
import com.constellio.model.entities.schemas.MetadataSchema;
import com.constellio.model.services.factories.ModelLayerFactory;
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 class EnterpriseSearchMigrationHelper {
public final AppLayerFactory appLayerFactory;
public final ModelLayerFactory modelLayerFactory;
public final DataLayerFactory dataLayerFactory;
public final ESSchemasRecordsServices es;
public final MigrationResourcesProvider resourcesProvider;
public EnterpriseSearchMigrationHelper(AppLayerFactory appLayerFactory, String collection,
MigrationResourcesProvider migrationResourcesProvider) {
this.es = new ESSchemasRecordsServices(collection, appLayerFactory);
this.resourcesProvider = migrationResourcesProvider;
this.appLayerFactory = appLayerFactory;
this.modelLayerFactory = appLayerFactory.getModelLayerFactory();
this.dataLayerFactory = modelLayerFactory.getDataLayerFactory();
}
public ConnectorType newConnectorType(MetadataSchema schema, Class<?> connectorClass, String connectorTypeCode) {
String title = resourcesProvider.getDefaultLanguageString("init." + schema.getCode().replace("-", ".").replace("_", "."));
return es.newConnectorType().setCode(connectorTypeCode).setTitle(title).setLinkedSchema(schema.getCode())
.setConnectorClassName(connectorClass.getName());
}
public static class ESSchemaTypesMigrationHelper {
private MetadataSchemaTypesBuilder types;
public ESSchemaTypesMigrationHelper(MetadataSchemaTypesBuilder types) {
this.types = types;
}
public MetadataSchemaTypeBuilder newConnectorDocumentSchemaType(String schemaType,
String connectorInstanceSchemaCode) {
MetadataSchemaBuilder connectorInstanceSchema = types.getSchema(connectorInstanceSchemaCode);
MetadataSchemaBuilder connectorTypeSchemaType = types.getDefaultSchema(ConnectorType.SCHEMA_TYPE);
MetadataBuilder connectorInstanceConnectorType = connectorInstanceSchema
.getMetadata(ConnectorInstance.CONNECTOR_TYPE).getInheritance();
MetadataSchemaTypeBuilder typeBuilder = types.createNewSchemaType(schemaType);
MetadataSchemaBuilder schemaBuilder = typeBuilder.getDefaultSchema();
typeBuilder.setInTransactionLog(false);
MetadataBuilder connectorDocConnector = schemaBuilder.createUndeletable(ConnectorDocument.CONNECTOR)
.setType(REFERENCE).setDefaultRequirement(true).defineReferencesTo(connectorInstanceSchema);
schemaBuilder.createUndeletable(ConnectorDocument.TRAVERSAL_CODE).setType(STRING).setDefaultRequirement(true);
schemaBuilder.createUndeletable(ConnectorDocument.CONNECTOR_TYPE).setType(REFERENCE)
.defineReferencesTo(connectorTypeSchemaType).setDefaultRequirement(true);
schemaBuilder.createUndeletable(ConnectorDocument.URL).setType(STRING).setDefaultRequirement(true);
schemaBuilder.createUndeletable(ConnectorDocument.MIMETYPE).setType(STRING);
schemaBuilder.createUndeletable(ConnectorDocument.FETCHED).setType(BOOLEAN).setDefaultValue(Boolean.TRUE);
//schemaBuilder.createUndeletable(ConnectorDocument.SEARCHABLE).setType(BOOLEAN).setDefaultValue(Boolean.TRUE);
schemaBuilder.createUndeletable(ConnectorDocument.FETCHED_DATETIME).setType(DATE_TIME);
schemaBuilder.createUndeletable(ConnectorDocument.STATUS).defineAsEnum(ConnectorDocumentStatus.class);
schemaBuilder.createUndeletable(ConnectorDocument.FETCH_FREQUENCY).defineAsEnum(FetchFrequency.class);
schemaBuilder.createUndeletable(ConnectorDocument.FETCH_DELAY).setType(NUMBER).setDefaultValue(10);
schemaBuilder.createUndeletable(ConnectorDocument.NEXT_FETCH).setType(DATE_TIME)
.defineDataEntry().asCalculated(NextFetchCalculator.class);
schemaBuilder.createUndeletable(ConnectorDocument.NEVER_FETCH).setType(BOOLEAN);
schemaBuilder.createUndeletable(ConnectorDocument.ERROR_CODE).setType(STRING);
schemaBuilder.createUndeletable(ConnectorDocument.ERROR_MESSAGE).setType(STRING);
schemaBuilder.createUndeletable(ConnectorDocument.ERROR_STACK_TRACE).setType(TEXT);
schemaBuilder.createUndeletable(ConnectorDocument.ERRORS_COUNT).setType(NUMBER).setDefaultValue(0);
schemaBuilder.createUndeletable(ConnectorDocument.LAST_MODIFIED).setType(DATE_TIME).setSearchable(true);
return typeBuilder;
}
public MetadataSchemaBuilder newConnectorInstanceSchema(String schemaLocalCode) {
MetadataSchemaTypeBuilder connectorInstanceSchemaType = types.getSchemaType(ConnectorInstance.SCHEMA_TYPE);
return connectorInstanceSchemaType.createCustomSchema(schemaLocalCode);
}
}
}