package com.constellio.model.services.schemas.builders;
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.STRING;
import java.util.HashMap;
import java.util.Map;
import com.constellio.model.entities.Language;
import com.constellio.model.entities.records.calculators.UserTitleCalculator;
import com.constellio.model.entities.records.wrappers.Collection;
import com.constellio.model.entities.records.wrappers.Group;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.services.schemas.SchemaUtils;
import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilderRuntimeException.NoSuchSchemaType;
import com.constellio.model.services.schemas.calculators.AllAuthorizationsCalculator;
import com.constellio.model.services.schemas.calculators.AllReferencesCalculator;
import com.constellio.model.services.schemas.calculators.AllRemovedAuthsCalculator;
import com.constellio.model.services.schemas.calculators.AttachedAncestorsCalculator;
import com.constellio.model.services.schemas.calculators.AutocompleteFieldCalculator;
import com.constellio.model.services.schemas.calculators.InheritedAuthorizationsCalculator;
import com.constellio.model.services.schemas.calculators.ParentPathCalculator;
import com.constellio.model.services.schemas.calculators.PathCalculator;
import com.constellio.model.services.schemas.calculators.PathPartsCalculator;
import com.constellio.model.services.schemas.calculators.PrincipalPathCalculator;
import com.constellio.model.services.schemas.calculators.TokensCalculator2;
import com.constellio.model.services.schemas.validators.ManualTokenValidator;
public class CommonMetadataBuilder {
public static final String ID = "id";
public static final String SCHEMA = "schema";
public static final String PATH = "path";
public static final String PARENT_PATH = "parentpath";
public static final String AUTHORIZATIONS = "authorizations";
public static final String REMOVED_AUTHORIZATIONS = "removedauthorizations";
public static final String INHERITED_AUTHORIZATIONS = "inheritedauthorizations";
public static final String DETACHED_AUTHORIZATIONS = "detachedauthorizations";
public static final String ALL_AUTHORIZATIONS = "allauthorizations";
public static final String TOKENS = "tokens";
public static final String DENY_TOKENS = "denyTokens";
public static final String SHARE_TOKENS = "shareTokens";
public static final String SHARE_DENY_TOKENS = "shareDenyTokens";
public static final String MANUAL_TOKENS = "manualTokens";
public static final String LOGICALLY_DELETED = "deleted";
public static final String PRINCIPAL_PATH = "principalpath";
public static final String PATH_PARTS = "pathParts";
public static final String CREATED_BY = "createdBy";
public static final String MODIFIED_BY = "modifiedBy";
public static final String CREATED_ON = "createdOn";
public static final String MODIFIED_ON = "modifiedOn";
public static final String TITLE = "title";
public static final String FOLLOWERS = "followers";
public static final String LEGACY_ID = "legacyIdentifier";
public static final String SEARCHABLE = "searchable";
public static final String VISIBLE_IN_TREES = "visibleInTrees";
public static final String MARKED_FOR_PREVIEW_CONVERSION = "markedForPreviewConversion";
public static final String LOGICALLY_DELETED_ON = "logicallyDeletedOn";
public static final String ERROR_ON_PHYSICAL_DELETION = "errorOnPhysicalDeletion";
public static final String ALL_REFERENCES = "allReferences";
public static final String MARKED_FOR_REINDEXING = "markedForReindexing";
public static final String ATTACHED_ANCESTORS = "attachedAncestors";
public static final String ALL_REMOVED_AUTHS = "allRemovedAuths";
public static final String SCHEMA_AUTOCOMPLETE_FIELD = "autocomplete";
private interface MetadataCreator {
void define(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types);
}
private final Map<String, MetadataCreator> metadata = new HashMap<>();
public CommonMetadataBuilder() {
metadata.put(ID, new MetadataCreator() {
@Override
public void define(MetadataSchemaBuilder builder, MetadataSchemaTypesBuilder types) {
MetadataBuilder metadataBuilder = builder.createSystemReserved(ID).setType(STRING)
.setUnmodifiable(true)
.setUniqueValue(true).setDefaultRequirement(true).setSearchable(true).setSortable(true);
for (Language language : types.getLanguages()) {
metadataBuilder.addLabel(language, metadataBuilder.getLocalCode());
}
}
});
metadata.put(LEGACY_ID, new MetadataCreator() {
@Override
public void define(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types) {
MetadataBuilder metadataBuilder = schema.createSystemReserved(LEGACY_ID).setType(STRING)
.setUnmodifiable(true)
.setUniqueValue(true).setDefaultRequirement(true).setSearchable(true);
for (Language language : types.getLanguages()) {
metadataBuilder.addLabel(language, metadataBuilder.getLocalCode());
}
}
});
metadata.put(SCHEMA, new MetadataCreator() {
@Override
public void define(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types) {
MetadataBuilder metadataBuilder = schema.createSystemReserved(SCHEMA).setType(STRING)
.setDefaultRequirement(true);
for (Language language : types.getLanguages()) {
metadataBuilder.addLabel(language, metadataBuilder.getLocalCode());
}
}
});
metadata.put(PATH, new MetadataCreator() {
@Override
public void define(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types) {
MetadataBuilder metadataBuilder = schema.createSystemReserved(PATH).setType(STRING)
.setMultivalue(true)
.defineDataEntry().asCalculated(PathCalculator.class);
for (Language language : types.getLanguages()) {
metadataBuilder.addLabel(language, metadataBuilder.getLocalCode());
}
}
});
metadata.put(PATH_PARTS, new MetadataCreator() {
@Override
public void define(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types) {
MetadataBuilder metadataBuilder = schema.createSystemReserved(PATH_PARTS).setType(STRING)
.setMultivalue(true)
.defineDataEntry().asCalculated(PathPartsCalculator.class);
for (Language language : types.getLanguages()) {
metadataBuilder.addLabel(language, metadataBuilder.getLocalCode());
}
}
});
metadata.put(PRINCIPAL_PATH, new MetadataCreator() {
@Override
public void define(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types) {
MetadataBuilder metadataBuilder = schema.createSystemReserved(PRINCIPAL_PATH).setType(STRING)
.defineDataEntry().asCalculated(PrincipalPathCalculator.class);
for (Language language : types.getLanguages()) {
metadataBuilder.addLabel(language, metadataBuilder.getLocalCode());
}
}
});
metadata.put(PARENT_PATH, new MetadataCreator() {
@Override
public void define(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types) {
MetadataBuilder metadataBuilder = schema.createSystemReserved(PARENT_PATH).setType(STRING)
.setMultivalue(true)
.defineDataEntry().asCalculated(ParentPathCalculator.class);
for (Language language : types.getLanguages()) {
metadataBuilder.addLabel(language, metadataBuilder.getLocalCode());
}
}
});
metadata.put(AUTHORIZATIONS, new MetadataCreator() {
@Override
public void define(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types) {
MetadataBuilder metadataBuilder = schema.createSystemReserved(AUTHORIZATIONS).setType(STRING)
.setMultivalue(true);
for (Language language : types.getLanguages()) {
metadataBuilder.addLabel(language, metadataBuilder.getLocalCode());
}
}
});
metadata.put(REMOVED_AUTHORIZATIONS, new MetadataCreator() {
@Override
public void define(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types) {
MetadataBuilder metadataBuilder = schema.createSystemReserved(REMOVED_AUTHORIZATIONS)
.setType(STRING).setMultivalue(true);
for (Language language : types.getLanguages()) {
metadataBuilder.addLabel(language, metadataBuilder.getLocalCode());
}
}
});
metadata.put(INHERITED_AUTHORIZATIONS, new MetadataCreator() {
@Override
public void define(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types) {
MetadataBuilder metadataBuilder = schema.createSystemReserved(INHERITED_AUTHORIZATIONS)
.setType(STRING)
.setMultivalue(true);
if (!schema.getCode().equals(Group.DEFAULT_SCHEMA)) {
metadataBuilder.defineDataEntry().asCalculated(InheritedAuthorizationsCalculator.class);
}
for (Language language : types.getLanguages()) {
metadataBuilder.addLabel(language, metadataBuilder.getLocalCode());
}
}
});
metadata.put(DETACHED_AUTHORIZATIONS, new MetadataCreator() {
@Override
public void define(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types) {
MetadataBuilder metadataBuilder = schema.createSystemReserved(DETACHED_AUTHORIZATIONS)
.setType(BOOLEAN);
for (Language language : types.getLanguages()) {
metadataBuilder.addLabel(language, metadataBuilder.getLocalCode());
}
}
});
metadata.put(ALL_AUTHORIZATIONS, new MetadataCreator() {
@Override
public void define(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types) {
MetadataBuilder metadataBuilder = schema.createSystemReserved(ALL_AUTHORIZATIONS)
.setType(STRING).setMultivalue(true)
.defineDataEntry().asCalculated(AllAuthorizationsCalculator.class);
for (Language language : types.getLanguages()) {
metadataBuilder.addLabel(language, metadataBuilder.getLocalCode());
}
}
});
metadata.put(TOKENS, new MetadataCreator() {
@Override
public void define(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types) {
MetadataBuilder metadataBuilder = schema.createSystemReserved(TOKENS).setType(STRING)
.setMultivalue(true)
.defineDataEntry().asCalculated(TokensCalculator2.class);
for (Language language : types.getLanguages()) {
metadataBuilder.addLabel(language, metadataBuilder.getLocalCode());
}
}
});
metadata.put(DENY_TOKENS, new MetadataCreator() {
@Override
public void define(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types) {
defineTokenMetadata(schema, DENY_TOKENS);
}
});
metadata.put(SHARE_TOKENS, new MetadataCreator() {
@Override
public void define(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types) {
defineTokenMetadata(schema, SHARE_TOKENS);
}
});
metadata.put(SHARE_DENY_TOKENS, new MetadataCreator() {
@Override
public void define(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types) {
defineTokenMetadata(schema, SHARE_DENY_TOKENS);
}
});
metadata.put(MANUAL_TOKENS, new MetadataCreator() {
@Override
public void define(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types) {
defineTokenMetadata(schema, MANUAL_TOKENS);
}
});
metadata.put(LOGICALLY_DELETED, new MetadataCreator() {
@Override
public void define(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types) {
MetadataBuilder metadataBuilder = schema.createSystemReserved(LOGICALLY_DELETED)
.setType(BOOLEAN);
for (Language language : types.getLanguages()) {
metadataBuilder.addLabel(language, metadataBuilder.getLocalCode());
}
}
});
metadata.put(SEARCHABLE, new MetadataCreator() {
@Override
public void define(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types) {
MetadataBuilder metadataBuilder = schema.createSystemReserved(SEARCHABLE).setType(BOOLEAN);
for (Language language : types.getLanguages()) {
metadataBuilder.addLabel(language, metadataBuilder.getLocalCode());
}
}
});
metadata.put(CREATED_BY, new MetadataCreator() {
@Override
public void define(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types) {
if (isCollectionUserOrGroupSchema(schema)) {
return;
}
try {
MetadataSchemaTypeBuilder user = types.getSchemaType(User.SCHEMA_TYPE);
MetadataBuilder metadataBuilder = schema.createSystemReserved(CREATED_BY).defineReferencesTo(user);
for (Language language : types.getLanguages()) {
metadataBuilder.addLabel(language, metadataBuilder.getLocalCode());
}
} catch (NoSuchSchemaType e) {
// Do nothing
}
}
});
metadata.put(CREATED_ON, new MetadataCreator() {
@Override
public void define(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types) {
MetadataBuilder metadataBuilder = schema.createSystemReserved(CREATED_ON).setType(DATE_TIME)
.setSortable(true);
for (Language language : types.getLanguages()) {
metadataBuilder.addLabel(language, metadataBuilder.getLocalCode());
}
}
});
metadata.put(MODIFIED_BY, new MetadataCreator() {
@Override
public void define(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types) {
if (isCollectionUserOrGroupSchema(schema)) {
return;
}
try {
MetadataSchemaTypeBuilder user = types.getSchemaType(User.SCHEMA_TYPE);
MetadataBuilder metadataBuilder = schema.createSystemReserved(MODIFIED_BY).defineReferencesTo(user);
for (Language language : types.getLanguages()) {
metadataBuilder.addLabel(language, metadataBuilder.getLocalCode());
}
} catch (NoSuchSchemaType e) {
// Do nothing
}
}
});
metadata.put(MODIFIED_ON, new MetadataCreator() {
@Override
public void define(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types) {
MetadataBuilder metadataBuilder = schema.createSystemReserved(MODIFIED_ON).setType(DATE_TIME).setSortable(true);
for (Language language : types.getLanguages()) {
metadataBuilder.addLabel(language, metadataBuilder.getLocalCode());
}
}
});
metadata.put(TITLE, new MetadataCreator() {
@Override
public void define(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types) {
MetadataBuilder title = schema.createUndeletable(TITLE).setType(STRING).setSearchable(true)
.setSchemaAutocomplete(true);
if (schema.getCode().equals(User.DEFAULT_SCHEMA)) {
title.defineDataEntry().asCalculated(UserTitleCalculator.class);
}
for (Language language : types.getLanguages()) {
title.addLabel(language, title.getLocalCode());
}
}
});
metadata.put(FOLLOWERS, new MetadataCreator() {
@Override
public void define(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types) {
MetadataBuilder metadataBuilder = schema.createSystemReserved(FOLLOWERS).setType(STRING).setMultivalue(true)
.setSearchable(true);
for (Language language : types.getLanguages()) {
metadataBuilder.addLabel(language, metadataBuilder.getLocalCode());
}
}
});
metadata.put(VISIBLE_IN_TREES, new MetadataCreator() {
@Override
public void define(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types) {
MetadataBuilder metadataBuilder = schema.createSystemReserved(VISIBLE_IN_TREES).setType(BOOLEAN);
for (Language language : types.getLanguages()) {
metadataBuilder.addLabel(language, metadataBuilder.getLocalCode());
}
}
});
metadata.put(MARKED_FOR_PREVIEW_CONVERSION, new MetadataCreator() {
@Override
public void define(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types) {
MetadataBuilder metadataBuilder = schema.createSystemReserved(MARKED_FOR_PREVIEW_CONVERSION).setType(BOOLEAN);
for (Language language : types.getLanguages()) {
metadataBuilder.addLabel(language, metadataBuilder.getLocalCode());
}
}
});
metadata.put(LOGICALLY_DELETED_ON, new MetadataCreator() {
@Override
public void define(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types) {
MetadataBuilder metadataBuilder = schema.createSystemReserved(LOGICALLY_DELETED_ON).setType(DATE_TIME);
for (Language language : types.getLanguages()) {
metadataBuilder.addLabel(language, metadataBuilder.getLocalCode());
}
}
});
metadata.put(ERROR_ON_PHYSICAL_DELETION, new MetadataCreator() {
@Override
public void define(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types) {
MetadataBuilder metadataBuilder = schema.createSystemReserved(ERROR_ON_PHYSICAL_DELETION).setType(BOOLEAN);
for (Language language : types.getLanguages()) {
metadataBuilder.addLabel(language, metadataBuilder.getLocalCode());
}
}
});
metadata.put(ALL_REFERENCES, new MetadataCreator() {
@Override
public void define(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types) {
MetadataBuilder metadataBuilder = schema.createSystemReserved(ALL_REFERENCES).setType(STRING).setMultivalue(true)
.defineDataEntry().asCalculated(AllReferencesCalculator.class);
for (Language language : types.getLanguages()) {
metadataBuilder.addLabel(language, metadataBuilder.getLocalCode());
}
}
});
metadata.put(MARKED_FOR_REINDEXING, new MetadataCreator() {
@Override
public void define(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types) {
MetadataBuilder metadataBuilder = schema.createSystemReserved(MARKED_FOR_REINDEXING).setType(BOOLEAN);
for (Language language : types.getLanguages()) {
metadataBuilder.addLabel(language, metadataBuilder.getLocalCode());
}
}
});
metadata.put(ATTACHED_ANCESTORS, new MetadataCreator() {
@Override
public void define(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types) {
MetadataBuilder metadataBuilder = schema.createSystemReserved(ATTACHED_ANCESTORS).setType(STRING)
.setMultivalue(true).setEssential(true)
.defineDataEntry().asCalculated(AttachedAncestorsCalculator.class);
for (Language language : types.getLanguages()) {
metadataBuilder.addLabel(language, metadataBuilder.getLocalCode());
}
}
});
metadata.put(ALL_REMOVED_AUTHS, new MetadataCreator() {
@Override
public void define(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types) {
MetadataBuilder metadataBuilder = schema.createSystemReserved(ALL_REMOVED_AUTHS).setType(STRING)
.setMultivalue(true).setEssential(true)
.defineDataEntry().asCalculated(AllRemovedAuthsCalculator.class);
for (Language language : types.getLanguages()) {
metadataBuilder.addLabel(language, metadataBuilder.getLocalCode());
}
}
});
metadata.put(SCHEMA_AUTOCOMPLETE_FIELD, new MetadataCreator() {
@Override
public void define(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types) {
MetadataBuilder metadataBuilder = schema.createSystemReserved(SCHEMA_AUTOCOMPLETE_FIELD).setType(STRING)
.setMultivalue(true).setEssential(true)
.defineDataEntry().asCalculated(AutocompleteFieldCalculator.class);
for (Language language : types.getLanguages()) {
metadataBuilder.addLabel(language, metadataBuilder.getLocalCode());
}
}
});
}
public void addCommonMetadataToAllExistingSchemas(MetadataSchemaTypesBuilder types) {
for (MetadataSchemaTypeBuilder type : types.getTypes()) {
addCommonMetadataToExistingSchema(type.getDefaultSchema(), types);
}
}
public void addCommonMetadataToExistingSchema(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types) {
for (Map.Entry<String, MetadataCreator> each : metadata.entrySet()) {
if (!schema.hasMetadata(each.getKey())) {
each.getValue().define(schema, types);
}
}
}
public void addCommonMetadataToNewSchema(MetadataSchemaBuilder schema, MetadataSchemaTypesBuilder types) {
for (MetadataCreator creator : metadata.values()) {
creator.define(schema, types);
}
}
private void defineTokenMetadata(MetadataSchemaBuilder schema, String code) {
MetadataBuilder metadataBuilder = schema.createSystemReserved(code).setType(STRING).setMultivalue(true);
metadataBuilder = metadataBuilder.setLabels(schema.getLabels());
metadataBuilder.defineValidators().add(ManualTokenValidator.class);
}
private boolean isCollectionUserOrGroupSchema(MetadataSchemaBuilder schema) {
String code = new SchemaUtils().getSchemaTypeCode(schema.getCode());
return code.equals(Collection.SCHEMA_TYPE) || code.equals(User.SCHEMA_TYPE) || code.equals(Group.SCHEMA_TYPE);
}
}