package com.constellio.model.services.search;
import java.util.ArrayList;
import java.util.List;
import org.jdom2.Document;
import com.constellio.data.dao.managers.StatefulService;
import com.constellio.data.dao.managers.config.ConfigManager;
import com.constellio.data.dao.managers.config.DocumentAlteration;
import com.constellio.model.services.collections.CollectionsListManager;
import com.constellio.model.services.search.entities.SearchBoost;
import com.constellio.model.utils.OneXMLConfigPerCollectionManager;
import com.constellio.model.utils.OneXMLConfigPerCollectionManagerListener;
import com.constellio.model.utils.XMLConfigReader;
public class SearchBoostManager implements StatefulService, OneXMLConfigPerCollectionManagerListener<List<SearchBoost>> {
private String SEARCH_BOOST_CONFIG = "/searchBoost.xml";
private OneXMLConfigPerCollectionManager<List<SearchBoost>> oneXMLConfigPerCollectionManager;
private ConfigManager configManager;
private CollectionsListManager collectionsListManager;
public SearchBoostManager(ConfigManager configManager, CollectionsListManager collectionsListManager) {
this.configManager = configManager;
this.collectionsListManager = collectionsListManager;
}
@Override
public void initialize() {
DocumentAlteration createConfigAlteration = new DocumentAlteration() {
@Override
public void alter(Document document) {
SearchBoostWriter writer = newSearchBoostWriter(document);
writer.createEmptySearchBoost();
}
};
this.oneXMLConfigPerCollectionManager = new OneXMLConfigPerCollectionManager<>(configManager, collectionsListManager,
SEARCH_BOOST_CONFIG, xmlConfigReader(), this, createConfigAlteration);
}
public void createCollectionSearchBoost(String collection) {
DocumentAlteration createConfigAlteration = new DocumentAlteration() {
@Override
public void alter(Document document) {
SearchBoostWriter writer = newSearchBoostWriter(document);
writer.createEmptySearchBoost();
}
};
oneXMLConfigPerCollectionManager.createCollectionFile(collection, createConfigAlteration);
}
public void add(String collection, final SearchBoost searchBoost) {
DocumentAlteration alteration = new DocumentAlteration() {
@Override
public void alter(Document document) {
SearchBoostWriter writer = newSearchBoostWriter(document);
writer.add(searchBoost);
}
};
oneXMLConfigPerCollectionManager.updateXML(collection, alteration);
}
public void delete(String collection, final SearchBoost searchBoost) {
DocumentAlteration alteration = new DocumentAlteration() {
@Override
public void alter(Document document) {
SearchBoostWriter writer = newSearchBoostWriter(document);
writer.delete(searchBoost.getType(), searchBoost.getKey());
}
};
oneXMLConfigPerCollectionManager.updateXML(collection, alteration);
}
public List<SearchBoost> getAllSearchBoosts(String collection) {
return oneXMLConfigPerCollectionManager.get(collection);
}
public List<SearchBoost> getAllSearchBoostsByMetadataType(String collection) {
return getAllSearchBoostsByType(SearchBoost.METADATA_TYPE, collection);
}
public List<SearchBoost> getAllSearchBoostsByQueryType(String collection) {
return getAllSearchBoostsByType(SearchBoost.QUERY_TYPE, collection);
}
private List<SearchBoost> getAllSearchBoostsByType(String type, String collection) {
List<SearchBoost> searchBoostListByType = new ArrayList<>();
List<SearchBoost> searchBoostList = getAllSearchBoosts(collection);
for (SearchBoost searchBoost : searchBoostList) {
if (searchBoost.getType().equals(type)) {
searchBoostListByType.add(searchBoost);
}
}
return searchBoostListByType;
}
private SearchBoostWriter newSearchBoostWriter(Document document) {
return new SearchBoostWriter(document);
}
private SearchBoostReader newSearchBoostReader(Document document) {
return new SearchBoostReader(document);
}
private XMLConfigReader<List<SearchBoost>> xmlConfigReader() {
return new XMLConfigReader<List<SearchBoost>>() {
@Override
public List<SearchBoost> read(String collection, Document document) {
return newSearchBoostReader(document).getAll();
}
};
}
@Override
public void close() {
}
@Override
public void onValueModified(String collection, List<SearchBoost> newValue) {
}
}