package com.constellio.model.entities.schemas; 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 static com.constellio.model.entities.schemas.MetadataValueType.TEXT; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.apache.commons.lang.StringUtils; import com.constellio.data.dao.services.solr.SolrDataStoreTypesUtils; import com.constellio.model.services.schemas.SchemaUtils; public class Schemas { private static List<Metadata> allGlobalMetadatas = new ArrayList<>(); public static final String TITLE_CODE = "title"; public static final String GLOBAL_SCHEMA_TYPE = "global"; public static final Metadata CREATED_BY = add(new Metadata("createdById_s", MetadataValueType.REFERENCE, false)); public static final Metadata MODIFIED_BY = add(new Metadata("modifiedById_s", MetadataValueType.REFERENCE, false)); public static final Metadata IDENTIFIER = add(new Metadata("id", STRING, false)); public static final Metadata VERSION = add(new Metadata("_version_", MetadataValueType.NUMBER, false)); public static final Metadata SCHEMA = add(new Metadata("schema_s", STRING, false)); public static final Metadata TITLE = add(new Metadata("title_s", STRING, false)); public static final Metadata PATH = add(new Metadata("path_ss", STRING, true)); // Double-check this, principal path wasn't merged yet public static final Metadata PATH_PARTS = add(new Metadata("pathParts_ss", STRING, true)); public static final Metadata PRINCIPAL_PATH = add(new Metadata("principalpath_s", STRING, false)); public static final Metadata PARENT_PATH = add(new Metadata("parentpath_ss", STRING, true)); public static final Metadata AUTHORIZATIONS = add(new Metadata("authorizations_ss", STRING, true)); public static final Metadata REMOVED_AUTHORIZATIONS = add(new Metadata("removedauthorizations_ss", STRING, true)); public static final Metadata INHERITED_AUTHORIZATIONS = add(new Metadata("inheritedauthorizations_ss", STRING, true)); public static final Metadata ALL_AUTHORIZATIONS = add(new Metadata("allauthorizations_ss", STRING, true)); public static final Metadata ALL_REMOVED_AUTHS = add(new Metadata("allRemovedAuths_ss", STRING, true)); public static final Metadata IS_DETACHED_AUTHORIZATIONS = add(new Metadata("detachedauthorizations_s", STRING, false)); public static final Metadata TOKENS = add(new Metadata("tokens_ss", STRING, true)); public static final Metadata MANUAL_TOKENS = add(new Metadata("manualTokens_ss", STRING, true)); public static final Metadata DENY_TOKENS = add(new Metadata("denyTokens_ss", STRING, true)); public static final Metadata SHARE_TOKENS = add(new Metadata("shareTokens_ss", STRING, true)); public static final Metadata SHARE_DENY_TOKENS = add(new Metadata("shareDenyTokens_ss", STRING, true)); public static final Metadata COLLECTION = add(new Metadata("collection_s", STRING, false)); public static final Metadata LOGICALLY_DELETED_STATUS = add(new Metadata("deleted_s", BOOLEAN, false)); public static final String CREATED_ON_CODE = "createdOn_dt"; public static final Metadata CREATED_ON = add(new Metadata(CREATED_ON_CODE, DATE_TIME, false)); public static final Metadata MODIFIED_ON = add(new Metadata("modifiedOn_dt", DATE_TIME, false)); public static final Metadata LOGICALLY_DELETED_ON = add(new Metadata("logicallyDeletedOn_dt", DATE_TIME, false)); public static final Metadata ERROR_ON_PHYSICAL_DELETION = add(new Metadata("errorOnPhysicalDeletion_s", BOOLEAN, false)); public static final Metadata SEARCH_FIELD = add(new Metadata("search_txt", TEXT, true)); public static final Metadata FRENCH_SEARCH_FIELD = add(new Metadata("search_txt_fr", TEXT, true)); public static final Metadata ENGLISH_SEARCH_FIELD = add(new Metadata("search_txt_en", TEXT, true)); public static final Metadata SPELL_CHECK_FIELD = add(new Metadata("_spell_text", TEXT, true)); //TODO : Remove public static final Metadata FOLLOWERS = add(new Metadata("followers_ss", STRING, true)); public static final Metadata CODE = new Metadata("code_s", STRING, false); public static final Metadata DESCRIPTION_TEXT = new Metadata("description_t", TEXT, false); public static final Metadata DESCRIPTION_STRING = new Metadata("description_s", STRING, false); public static final Metadata LINKABLE = new Metadata("linkable_s", BOOLEAN, false); public static final Metadata LEGACY_ID = add( new Metadata("legacyIdentifier_s", STRING, false)); public static final Metadata MARKED_FOR_PREVIEW_CONVERSION = add( new Metadata("markedForPreviewConversion_s", BOOLEAN, false)); public static final Metadata VISIBLE_IN_TREES = add(new Metadata("visibleInTrees_s", BOOLEAN, false)); public static final Metadata SEARCHABLE = add(new Metadata("searchable_s", BOOLEAN, false)); public static final Metadata URL = add(new Metadata("url_s", STRING, false)); public static final Metadata FETCHED = new Metadata("fetched_s", BOOLEAN, false); public static final Metadata LINKED_SCHEMA = new Metadata("linkedSchema_s", STRING, false); public static final Metadata ALL_REFERENCES = add(new Metadata("allReferences_ss", STRING, true)); public static final Metadata MARKED_FOR_REINDEXING = add(new Metadata("markedForReindexing_s", BOOLEAN, false)); public static final Metadata ATTACHED_ANCESTORS = add(new Metadata("attachedAncestors_ss", STRING, true)); public static final Metadata SCHEMA_AUTOCOMPLETE_FIELD = add(new Metadata("autocomplete_ss", STRING, false)); public static Metadata add(Metadata metadata) { String localCode = metadata.getLocalCode(); if (localCode.startsWith("USR") || localCode.startsWith("MAP")) { throw new RuntimeException("Invalid local code for global metadata : " + localCode); } allGlobalMetadatas.add(metadata); return metadata; } public static Metadata getGlobalMetadata(String code) { //folder_default_createdOn_dt //global_default_createdOn_dt String cratedOnCodeWithoutType = StringUtils.substringBeforeLast(CREATED_ON_CODE, "_"); if (code.contains(cratedOnCodeWithoutType)) { return CREATED_ON; } else { String metadataLocalCode = new SchemaUtils().toLocalMetadataCode(code); for (Metadata globalMetadata : getAllGlobalMetadatas()) { if (globalMetadata.getLocalCode().equals(metadataLocalCode)) { return globalMetadata; } } return null; } } public static List<Metadata> getAllGlobalMetadatas() { return Collections.unmodifiableList(allGlobalMetadatas); } public static Metadata dummyMultiValueMetadata(Metadata metadata) { String dataStoreCode = SolrDataStoreTypesUtils.getMultivalueFieldCode(metadata.getDataStoreCode()); return new Metadata(dataStoreCode, metadata.getType(), true); } public static Metadata dummySingleValueMetadata(Metadata metadata) { String dataStoreCode = SolrDataStoreTypesUtils.getSinglevalueFieldCode(metadata.getDataStoreCode()); return new Metadata(dataStoreCode, metadata.getType(), false); } public static Metadata getSortMetadata(Metadata metadata) { String dataStoreCode = metadata.getDataStoreCode().replace("_s", "_sort_s"); String schemaCode = metadata.getCode().replace("_" + metadata.getLocalCode(), ""); return new Metadata(schemaCode, dataStoreCode, STRING, metadata.isMultivalue(), metadata.isMultiLingual()); } public static Metadata getSearchableMetadata(Metadata metadata, String languageCode) { String dataStoreCode = metadata.getDataStoreCode(); if (metadata.isMultivalue()) { dataStoreCode = dataStoreCode.replace("_txt", "_txt_" + languageCode); dataStoreCode = dataStoreCode.replace("_ss", "_txt_" + languageCode); } else if (metadata.getLocalCode().equals("id")) { dataStoreCode = "id_txt_" + languageCode; } else { dataStoreCode = dataStoreCode.replace("_t", "_t_" + languageCode); if (metadata.getType() == MetadataValueType.CONTENT) { dataStoreCode = dataStoreCode.replace("_s", "_txt_" + languageCode); } else { dataStoreCode = dataStoreCode.replace("_s", "_t_" + languageCode); } } String schemaCode = metadata.getCode().replace("_" + metadata.getLocalCode(), ""); return new Metadata(schemaCode, dataStoreCode, TEXT, metadata.isMultivalue(), metadata.isMultiLingual()); } public static boolean isGlobalMetadata(String metadata) { String metadataLocalCode = new SchemaUtils().toLocalMetadataCode(metadata); for (Metadata globalMetadata : getAllGlobalMetadatas()) { if (globalMetadata.getLocalCode().equals(metadataLocalCode)) { return true; } } return false; } public static boolean isGlobalMetadataExceptTitle(String metadata) { String metadataLocalCode = new SchemaUtils().toLocalMetadataCode(metadata); return !TITLE_CODE.equals(metadataLocalCode) && isGlobalMetadata(metadata); } }