package org.nextprot.api.tasks.solr.indexer.entry; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import org.nextprot.api.commons.exception.NPreconditions; import org.nextprot.api.core.domain.Entry; import org.nextprot.api.core.service.EntryBuilderService; import org.nextprot.api.core.service.EntryService; import org.nextprot.api.core.service.TerminologyService; import org.nextprot.api.solr.index.EntryIndex.Fields; public abstract class FieldBuilder { boolean isGold = false; protected TerminologyService terminologyservice = null; protected EntryBuilderService entryBuilderService = null; public EntryBuilderService getEntryBuilderService() { return entryBuilderService; } public void setEntryBuilderService(EntryBuilderService entryBuilderService) { this.entryBuilderService = entryBuilderService; } public boolean isGold() { return isGold; } public void setGold(boolean isGold) { this.isGold = isGold; } public void setTerminologyService(TerminologyService terminologyservice) { this.terminologyservice = terminologyservice; } boolean initialized = false; private Map<Fields, Object> fields = new HashMap<>(); abstract public Collection<Fields> getSupportedFields(); public final void initializeBuilder(Entry entry) { if(!initialized){ //System.err.println("initializing FieldBuilder: " + this.toString()); init(entry); initialized = true; } } @SuppressWarnings({ "rawtypes", "unchecked" }) protected void addField(Fields field, Object value) { NPreconditions.checkTrue(getSupportedFields().contains(field), "The field " + field.name() + " is not supported in " + getClass().getName()); if (!fields.containsKey(field) && field.getClazz().equals(List.class)) { fields.put(field, new ArrayList()); } if (field.getClazz().equals(List.class)) { ((List) fields.get(field)).add(value); // multiValued = true } else { this.fields.put(field, value); } } protected abstract void init(Entry entry); public final <T> T getFieldValue(Fields field, Class<T> requiredType) { // If it has not been yet initialized NPreconditions.checkTrue(initialized, "The builder has not been yet initialized, invoke 'initializeBuilder' method"); return requiredType.cast(fields.get(field)); } public final void reset() { initialized = false; fields.clear(); } }