package org.nextprot.api.tasks.solr.indexer;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.apache.solr.common.SolrInputDocument;
import org.nextprot.api.commons.exception.NPreconditions;
import org.nextprot.api.core.domain.Entry;
import org.nextprot.api.core.service.DbXrefService;
import org.nextprot.api.core.service.EntryBuilderService;
import org.nextprot.api.core.service.TerminologyService;
import org.nextprot.api.solr.index.EntryIndex.Fields;
import org.nextprot.api.tasks.solr.indexer.entry.EntryFieldBuilder;
import org.nextprot.api.tasks.solr.indexer.entry.FieldBuilder;
import org.reflections.Reflections;
public class EntryBaseSolrIndexer extends SolrIndexer<Entry> {
private Map<Fields, FieldBuilder> fieldsBuilderMap = null;
private TerminologyService terminologyservice;
private EntryBuilderService entryBuilderService;
public EntryBuilderService getEntryBuilderService() {
return entryBuilderService;
}
public void setEntryBuilderService(EntryBuilderService entryBuilderService) {
this.entryBuilderService = entryBuilderService;
}
private DbXrefService dbxrefservice;
private boolean isGold;
// protected => only sub classes can use c'tor (was abstract class before)
protected EntryBaseSolrIndexer(String url, boolean isGold) {
super(url);
this.isGold = isGold;
}
@Override
public SolrInputDocument convertToSolrDocument(Entry entry) {
fieldsBuilderMap = new HashMap<Fields, FieldBuilder>();
initializeFieldBuilders(fieldsBuilderMap);
SolrInputDocument doc = new SolrInputDocument();
for (Fields f : Fields.values()) {
//System.err.println("field: " + f.toString());
if(f.toString() == "TEXT" || f.toString() == "SCORE") continue; // Directly computed by SOLR
FieldBuilder fb = fieldsBuilderMap.get(f);
fb.setGold(isGold);
fb.setTerminologyService(terminologyservice);
fb.setEntryBuilderService(entryBuilderService);
fb.initializeBuilder(entry);
Object o = fb.getFieldValue(f, f.getClazz());
doc.addField(f.getName(), o);
}
//Reset all fields builders
for (Fields f : Fields.values()) {
if(f.toString() == "TEXT" || f.toString() == "SCORE") continue; // Directly computed by SOLR
fieldsBuilderMap.get(f).reset();
}
return doc;
}
public TerminologyService getTerminologysAnnotationSolrIndexerervice() {
return terminologyservice;
}
public void setTerminologyservice(TerminologyService terminologyservice) {
this.terminologyservice = terminologyservice;
}
public DbXrefService getDbxrefSolrIndexerervice() {
return dbxrefservice;
}
public void setDbxrefservice(DbXrefService dbxrefservice) {
this.dbxrefservice = dbxrefservice;
}
static void initializeFieldBuilders(Map<Fields, FieldBuilder> fieldsBuilderMap) {
Reflections reflections = new Reflections("org.nextprot.api.tasks.solr.indexer.entry.impl");
Set<Class<?>> entryFieldBuilderClasses = reflections.getTypesAnnotatedWith(EntryFieldBuilder.class);
for (Class<?> c : entryFieldBuilderClasses) {
try {
FieldBuilder fb = (FieldBuilder) c.newInstance();
/*try {
Method method = c.getMethod("setTerminologyService", TerminologyService.class);
method.invoke(c, this.terminologyservice);
}catch(NoSuchMethodException m){
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}*/
if(fb.getSupportedFields() != null){
for (Fields f : fb.getSupportedFields()) {
NPreconditions.checkTrue(!(fieldsBuilderMap.containsKey(f)), "The field " + f.getName() + " is supported by several builders: " + fb.getClass() + ", " + fieldsBuilderMap.get(f));
fieldsBuilderMap.put(f, fb);
}
}
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
}
}
}