package com.constellio.model.services.search;
import org.apache.commons.lang3.StringUtils;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.params.ModifiableSolrParams;
import org.apache.solr.common.params.SolrParams;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.constellio.data.dao.services.records.RecordDao;
import com.constellio.model.entities.schemas.MetadataSchemaTypes;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.schemas.MetadataSchemasManager;
import com.constellio.model.services.search.query.FilterUtils;
import com.constellio.model.services.search.query.logical.FreeTextQuery;
import com.constellio.model.services.security.SecurityTokenManager;
import com.constellio.model.services.users.UserServices;
public class FreeTextSearchServices {
Logger LOGGER = LoggerFactory.getLogger(FreeTextSearchServices.class);
RecordDao recordDao;
RecordDao eventsDao;
RecordServices recordServices;
UserServices userServices;
SecurityTokenManager securityTokenManager;
MetadataSchemasManager metadataSchemasManager;
public FreeTextSearchServices(ModelLayerFactory modelLayerFactory) {
super();
this.recordDao = modelLayerFactory.getDataLayerFactory().newRecordDao();
this.eventsDao = modelLayerFactory.getDataLayerFactory().newEventsDao();
this.metadataSchemasManager = modelLayerFactory.getMetadataSchemasManager();
this.userServices = modelLayerFactory.newUserServices();
this.securityTokenManager = modelLayerFactory.getSecurityTokenManager();
}
public QueryResponse search(FreeTextQuery query) {
ModifiableSolrParams modifiableSolrParams = new ModifiableSolrParams(query.getSolrParams());
if (query.getUserFilter() != null && isSecurityEnabled(modifiableSolrParams)) {
String filter = FilterUtils.multiCollectionUserReadFilter(query.getUserFilter(), userServices, securityTokenManager);
modifiableSolrParams.add("fq", filter);
}
if (query.isSearchingEvents()) {
modifiableSolrParams.add("fq", "schema_s:event*");
} else {
modifiableSolrParams.add("fq", "-schema_s:event*");
}
//LOGGER.info(LoggerUtils.toParamsString(modifiableSolrParams));
return recordDao.nativeQuery(modifiableSolrParams);
}
public boolean isSecurityEnabled(SolrParams params) {
String collection = null;
String schemaType = null;
if (params.getParams("fq") != null) {
for (String filterQuery : params.getParams("fq")) {
if (filterQuery.startsWith("schema_s:")) {
schemaType = StringUtils.substringBefore(filterQuery.substring("schema_s:".length()), "_");
}
if (filterQuery.startsWith("collection_s:")) {
collection = StringUtils.substringBefore(filterQuery.substring("collection_s:".length()), "_");
}
}
}
String q = params.get("q");
if (q != null && q.startsWith("schema_s:")) {
schemaType = q.substring("schema_s:".length());
schemaType = StringUtils.substringBefore(schemaType, "_");
schemaType = StringUtils.substringBefore(schemaType, "*");
}
if (q != null && q.startsWith("collection_s:")) {
collection = StringUtils.substringBefore(q.substring("collection_s:".length()), "_");
}
boolean security = true;
if (collection != null && schemaType != null && security) {
try {
MetadataSchemaTypes types = metadataSchemasManager.getSchemaTypes(collection);
security = types.getSchemaType(schemaType).hasSecurity();
} catch (Exception e) {
//OK
}
}
return security;
}
}