package com.constellio.app.services.migrations.scripts;
import static com.constellio.model.entities.schemas.MetadataValueType.BOOLEAN;
import static com.constellio.model.entities.schemas.MetadataValueType.CONTENT;
import static com.constellio.model.entities.schemas.MetadataValueType.DATE_TIME;
import static com.constellio.model.entities.schemas.MetadataValueType.REFERENCE;
import static com.constellio.model.entities.schemas.MetadataValueType.STRING;
import org.apache.commons.lang3.StringUtils;
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.services.factories.AppLayerFactory;
import com.constellio.model.entities.Language;
import com.constellio.model.entities.records.wrappers.ApprovalTask;
import com.constellio.model.entities.records.wrappers.Collection;
import com.constellio.model.entities.records.wrappers.Event;
import com.constellio.model.entities.records.wrappers.Group;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.entities.records.wrappers.UserDocument;
import com.constellio.model.entities.records.wrappers.WorkflowTask;
import com.constellio.model.entities.schemas.Schemas;
import com.constellio.model.entities.security.global.UserCredentialStatus;
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;
import com.constellio.model.services.schemas.calculators.AllUserAuthorizationsCalculator;
import com.constellio.model.services.schemas.calculators.RolesCalculator;
import com.constellio.model.services.schemas.calculators.UserTokensCalculator2;
import com.constellio.model.services.schemas.validators.DecisionValidator;
import com.constellio.model.services.schemas.validators.EmailValidator;
public class CoreMigrationTo_5_0_1 implements MigrationScript {
@Override
public String getVersion() {
return "5.0.1";
}
@Override
public void migrate(String collection, MigrationResourcesProvider migrationResourcesProvider,
AppLayerFactory appLayerFactory) {
new CoreSchemaAlterationFor5_0_1(collection, migrationResourcesProvider, appLayerFactory).migrate();
}
}
class CoreSchemaAlterationFor5_0_1 extends MetadataSchemasAlterationHelper {
protected CoreSchemaAlterationFor5_0_1(String collection,
MigrationResourcesProvider migrationResourcesProvider, AppLayerFactory appLayerFactory) {
super(collection, migrationResourcesProvider, appLayerFactory);
}
@Override
protected void migrate(MetadataSchemaTypesBuilder typesBuilder) {
MetadataSchemaTypeBuilder groupSchemaType = createGroupSchemaType(typesBuilder);
MetadataSchemaTypeBuilder userSchemaType = createUserSchemaType(typesBuilder, groupSchemaType);
MetadataSchemaTypeBuilder eventSchemaType = createEventSchemaType(typesBuilder);
MetadataSchemaTypeBuilder userDocument = createUserDocumentType(typesBuilder, userSchemaType);
createCollectionSchemaType(typesBuilder);
createTaskSchemaType(typesBuilder, userSchemaType);
}
private MetadataSchemaTypeBuilder createUserDocumentType(MetadataSchemaTypesBuilder typesBuilder,
MetadataSchemaTypeBuilder userSchemaType) {
MetadataSchemaTypeBuilder type = typesBuilder.createNewSchemaType(UserDocument.SCHEMA_TYPE);
MetadataSchemaBuilder defaultSchema = type.getDefaultSchema();
type.setSecurity(false);
defaultSchema.createUndeletable(UserDocument.USER).defineReferencesTo(userSchemaType);
defaultSchema.createUndeletable(UserDocument.CONTENT).setType(CONTENT).setSearchable(true);
return type;
}
private MetadataSchemaTypeBuilder createEventSchemaType(MetadataSchemaTypesBuilder typesBuilder) {
MetadataSchemaTypeBuilder type = typesBuilder.createNewSchemaType(Event.SCHEMA_TYPE);
MetadataSchemaBuilder defaultSchema = type.getDefaultSchema();
//FIXME labels
MetadataBuilder metadataBuilder = defaultSchema.createUndeletable(Event.RECORD_ID).setType(STRING);
configureLabels(typesBuilder, metadataBuilder);
metadataBuilder = defaultSchema.createUndeletable(Event.TYPE).setType(STRING);
configureLabels(typesBuilder, metadataBuilder);
metadataBuilder = defaultSchema.createUndeletable(Event.USERNAME).setType(STRING);
configureLabels(typesBuilder, metadataBuilder);
metadataBuilder = defaultSchema.createUndeletable(Event.EVENT_PRINCIPAL_PATH).setType(STRING);
configureLabels(typesBuilder, metadataBuilder);
metadataBuilder = defaultSchema.createUndeletable(Event.USER_ROLES).setType(STRING);
configureLabels(typesBuilder, metadataBuilder);
metadataBuilder = defaultSchema.createUndeletable(Event.DELTA).setType(STRING);
configureLabels(typesBuilder, metadataBuilder);
metadataBuilder = defaultSchema.createUndeletable(Event.PERMISSION_DATE_RANGE).setType(STRING);
configureLabels(typesBuilder, metadataBuilder);
metadataBuilder = defaultSchema.createUndeletable(Event.PERMISSION_ROLES).setType(STRING);
configureLabels(typesBuilder, metadataBuilder);
metadataBuilder = defaultSchema.createUndeletable(Event.PERMISSION_USERS).setType(STRING);
configureLabels(typesBuilder, metadataBuilder);
metadataBuilder = defaultSchema.createUndeletable(Event.IP).setType(STRING);
configureLabels(typesBuilder, metadataBuilder);
metadataBuilder = defaultSchema.createUndeletable(Event.REASON).setType(STRING)
.addLabel(Language.French, "Justification");
configureLabels(typesBuilder, metadataBuilder);
return type;
}
private void configureLabels(MetadataSchemaTypesBuilder typesBuilder, MetadataBuilder metadataBuilder) {
for (Language language : typesBuilder.getLanguages()) {
if (StringUtils.isBlank(metadataBuilder.getLabel(language))) {
metadataBuilder.addLabel(language, metadataBuilder.getLocalCode());
}
}
}
private void createCollectionSchemaType(MetadataSchemaTypesBuilder typesBuilder) {
typesBuilder.createNewSchemaType(Collection.SCHEMA_TYPE);
MetadataSchemaBuilder collectionSchema = typesBuilder.getSchemaType("collection").getDefaultSchema();
collectionSchema.createUndeletable(Collection.NAME).setType(STRING);
collectionSchema.createUndeletable(Collection.CODE).setType(STRING).setUniqueValue(true).setUnmodifiable(true);
collectionSchema.createUndeletable(Collection.LANGUAGES).setType(STRING).setMultivalue(true).setUnmodifiable(true);
}
private MetadataSchemaTypeBuilder createUserSchemaType(MetadataSchemaTypesBuilder typesBuilder,
MetadataSchemaTypeBuilder groupSchemaType) {
typesBuilder.createNewSchemaType(User.SCHEMA_TYPE);
MetadataSchemaTypeBuilder userSchemaType = typesBuilder.getSchemaType("user");
MetadataSchemaBuilder userSchema = userSchemaType.getDefaultSchema();
userSchema.createUndeletable(User.USERNAME).setType(STRING).setUniqueValue(true)
.setUnmodifiable(true);
userSchema.createUndeletable(User.FIRSTNAME).setType(STRING);
userSchema.createUndeletable(User.LASTNAME).setType(STRING);
userSchema.createUndeletable(User.LAST_LOGIN).setType(DATE_TIME).setSystemReserved(true);
userSchema.createUndeletable(User.LAST_IP_ADDRESS).setType(STRING).setSystemReserved(true);
userSchema.createUndeletable(User.EMAIL).setType(STRING).setUniqueValue(true).addValidator(EmailValidator.class);
userSchema.createUndeletable(User.ROLES).setType(STRING).setMultivalue(true);
userSchema.createUndeletable(User.COLLECTION_READ_ACCESS).setType(BOOLEAN);
userSchema.createUndeletable(User.COLLECTION_WRITE_ACCESS).setType(BOOLEAN);
userSchema.createUndeletable(User.COLLECTION_DELETE_ACCESS).setType(BOOLEAN);
userSchema.createUndeletable(User.SYSTEM_ADMIN).setType(BOOLEAN);
MetadataBuilder groupsReference = userSchema.createUndeletable(User.GROUPS).setType(REFERENCE).setMultivalue(true)
.defineReferencesTo(groupSchemaType);
userSchema.createUndeletable(User.ALL_ROLES).setType(STRING).setMultivalue(true).defineDataEntry()
.asCalculated(RolesCalculator.class);
userSchema.createUndeletable(User.GROUPS_AUTHORIZATIONS).setType(STRING).setMultivalue(true).defineDataEntry()
.asCopied(groupsReference, groupSchemaType.getMetadata("group_default_allauthorizations"));
userSchema.createUndeletable(User.ALL_USER_AUTHORIZATIONS).setType(STRING).setMultivalue(true).defineDataEntry()
.asCalculated(AllUserAuthorizationsCalculator.class);
userSchema.createUndeletable(User.USER_TOKENS).setType(STRING).setMultivalue(true).defineDataEntry()
.asCalculated(UserTokensCalculator2.class);
userSchema.createUndeletable(User.JOB_TITLE).setType(STRING);
userSchema.createUndeletable(User.PHONE).setType(STRING);
userSchema.createUndeletable(User.START_TAB).setType(STRING);
userSchema.createUndeletable(User.DEFAULT_TAXONOMY).setType(STRING);
// userSchema.createUndeletable(User.STATUS).setType(STRING);
userSchema.createUndeletable(User.STATUS).defineAsEnum(UserCredentialStatus.class);
return userSchemaType;
}
private MetadataSchemaTypeBuilder createGroupSchemaType(MetadataSchemaTypesBuilder typesBuilder) {
MetadataSchemaTypeBuilder groupSchemaType = typesBuilder.createNewSchemaType(Group.SCHEMA_TYPE);
MetadataSchemaBuilder groupSchema = groupSchemaType.getDefaultSchema();
groupSchema.get(Group.TITLE).setSchemaAutocomplete(true);
groupSchema.createUndeletable(Group.CODE).setType(STRING).setUniqueValue(true).setSchemaAutocomplete(true);
groupSchema.createUndeletable(Group.IS_GLOBAL).setType(BOOLEAN);
groupSchema.createUndeletable(Group.ROLES).setType(STRING).setMultivalue(true);
MetadataBuilder parentGroup = groupSchema.createUndeletable(Group.PARENT).setType(REFERENCE)
.defineReferencesTo(groupSchema);
MetadataBuilder allAuthorizations = groupSchema.get(Schemas.ALL_AUTHORIZATIONS.getCode());
groupSchema.get(Schemas.INHERITED_AUTHORIZATIONS.getCode()).defineDataEntry().asCopied(parentGroup, allAuthorizations);
return groupSchemaType;
}
private MetadataSchemaTypeBuilder createTaskSchemaType(MetadataSchemaTypesBuilder typesBuilder,
MetadataSchemaTypeBuilder userSchema) {
MetadataSchemaTypeBuilder taskSchemaType = typesBuilder.createNewSchemaType(WorkflowTask.SCHEMA_TYPE);
MetadataSchemaBuilder taskSchema = taskSchemaType.getDefaultSchema();
taskSchema.createUndeletable(WorkflowTask.ASSIGNED_TO).setType(REFERENCE).defineReferencesTo(userSchema);
taskSchema.createUndeletable(WorkflowTask.ASSIGNED_ON).setType(DATE_TIME);
taskSchema.createUndeletable(WorkflowTask.ASSIGN_CANDIDATES).setType(REFERENCE).defineReferencesTo(userSchema)
.setMultivalue(true);
taskSchema.createUndeletable(WorkflowTask.FINISHED_BY).setType(REFERENCE).defineReferencesTo(userSchema);
taskSchema.createUndeletable(WorkflowTask.FINISHED_ON).setType(DATE_TIME);
taskSchema.createUndeletable(WorkflowTask.WORKFLOW_ID).setType(STRING);
taskSchema.createUndeletable(WorkflowTask.WORKFLOW_RECORD_IDS).setType(STRING).setMultivalue(true);
taskSchema.createUndeletable(WorkflowTask.DUE_DATE).setType(DATE_TIME);
MetadataSchemaBuilder approvalTaskSchema = taskSchemaType.createCustomSchema(ApprovalTask.SCHEMA_LOCAL_CODE);
approvalTaskSchema.createUndeletable(ApprovalTask.DECISION).setType(STRING).addValidator(DecisionValidator.class);
return taskSchemaType;
}
}