package com.constellio.app.modules.rm.ui.components.document.fields; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from; import static com.constellio.model.services.search.query.logical.valueCondition.ConditionTemplateFactory.autocompleteFieldMatching; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.StringUtils; import com.constellio.app.modules.rm.RMConfigs; import com.constellio.app.modules.rm.model.enums.DocumentsTypeChoice; import com.constellio.app.modules.rm.services.RMSchemasRecordsServices; import com.constellio.app.modules.rm.wrappers.RetentionRule; import com.constellio.app.modules.rm.wrappers.type.DocumentType; import com.constellio.app.services.factories.ConstellioFactories; import com.constellio.app.ui.framework.data.RecordTextInputDataProvider; import com.constellio.app.ui.pages.base.SessionContext; import com.constellio.model.entities.records.wrappers.User; import com.constellio.model.entities.schemas.MetadataSchemaType; import com.constellio.model.entities.schemas.Schemas; import com.constellio.model.services.search.SPEQueryResponse; import com.constellio.model.services.search.StatusFilter; import com.constellio.model.services.search.query.logical.LogicalSearchQuery; import com.constellio.model.services.search.query.logical.condition.LogicalSearchCondition; public class DocumentTypeTextInputDataProvider extends RecordTextInputDataProvider { private String folderId; private String currentType; private transient RMConfigs rmConfigs; private transient RMSchemasRecordsServices rm; public DocumentTypeTextInputDataProvider(ConstellioFactories constellioFactories, SessionContext sessionContext, String folderId, String currentType) { super(constellioFactories, sessionContext, DocumentType.SCHEMA_TYPE, false); this.folderId = folderId; this.currentType = currentType; init(); } private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException { stream.defaultReadObject(); init(); } private void init() { this.rmConfigs = new RMConfigs(getModelLayerFactory().getSystemConfigurationsManager()); this.rm = new RMSchemasRecordsServices(sessionContext.getCurrentCollection(), getModelLayerFactory()); } @Override public SPEQueryResponse searchAutocompleteField(User user, String text, int startIndex, int count) { MetadataSchemaType type = getModelLayerFactory().getMetadataSchemasManager() .getSchemaTypes(getCurrentCollection()).getSchemaType(DocumentType.SCHEMA_TYPE); LogicalSearchCondition condition; if (StringUtils.isNotBlank(text)) { condition = from(type).where(autocompleteFieldMatching(text)); } else { condition = from(type).returnAll(); } List<String> newDocumentTypes = new ArrayList<>(); if (folderId != null) { RetentionRule retentionRule = rm.getRetentionRule(rm.getFolder(folderId).getRetentionRule()); List<String> documentTypes = retentionRule.getDocumentTypes(); if (currentType != null && !documentTypes.contains(currentType)) { newDocumentTypes.add(currentType); } newDocumentTypes.addAll(documentTypes); if (rmConfigs.getDocumentsTypesChoice() == DocumentsTypeChoice.FORCE_LIMIT_TO_SAME_DOCUMENTS_TYPES_OF_RETENTION_RULES || (rmConfigs.getDocumentsTypesChoice() == DocumentsTypeChoice.LIMIT_TO_SAME_DOCUMENTS_TYPES_OF_RETENTION_RULES && !newDocumentTypes.isEmpty())) { condition = condition.andWhere(Schemas.IDENTIFIER).isIn(newDocumentTypes); } } if (onlyLinkables) { condition = condition.andWhere(Schemas.LINKABLE).isTrueOrNull(); } LogicalSearchQuery query = new LogicalSearchQuery(condition) .filteredByStatus(StatusFilter.ACTIVES) .setStartRow(startIndex) .setNumberOfRows(count); if (security) { if (writeAccess) { query.filteredWithUserWrite(user); } else { query.filteredWithUser(user); } } return getModelLayerFactory().newSearchServices().query(query); } }