package org.gcube.data.spd.manager.search; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.gcube.data.spd.manager.search.workers.CommonNameMapping; import org.gcube.data.spd.manager.search.workers.SynonymsRetriever; import org.gcube.data.spd.manager.search.workers.UnfolderWorker; import org.gcube.data.spd.manager.search.writers.ConsumerEventHandler; import org.gcube.data.spd.manager.search.writers.WorkerWriterPool; import org.gcube.data.spd.model.service.exceptions.UnsupportedPluginException; import org.gcube.data.spd.plugin.fwk.AbstractPlugin; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class SearchFlow { private Logger logger= LoggerFactory.getLogger(SearchFlow.class); private Collection expanders; private Collection resolvers; private List words; private ConsumerEventHandler[] consumers; private AbstractPlugin unfolder = null; public SearchFlow(List words, Collection expanders, Collection resolvers) { super(); this.resolvers = resolvers; this.expanders = expanders; this.words = words; } public void setUnfolder(AbstractPlugin unfolder) { this.unfolder = unfolder; } @SuppressWarnings("unchecked") public List> createWorkers(ConsumerEventHandler ... registeredConsumers) throws UnsupportedPluginException{ ConsumerEventHandler[] actualConsumers = registeredConsumers; List> workersToExecute = new ArrayList>(); if (expanders.size()>0){ logger.trace("preparing "+expanders.size()+" expander"); List> workers = new ArrayList>(); WorkerWriterPool writerPool = new WorkerWriterPool(actualConsumers); for (AbstractPlugin expander : expanders) workers.add(new SynonymsRetriever(writerPool.get(), expander)); actualConsumers = workers.toArray(new Worker[workers.size()]); workersToExecute.addAll(workers); } if (resolvers.size()>0){ logger.trace("preparing "+resolvers.size()+" resolver"); List> workers = new ArrayList>(); WorkerWriterPool writerPool = new WorkerWriterPool(actualConsumers); for (AbstractPlugin resolver : resolvers) workers.add(new CommonNameMapping(writerPool.get(), resolver)); actualConsumers = workers.toArray(new Worker[workers.size()]); workersToExecute.addAll(workers); } if (unfolder!=null){ WorkerWriterPool writerPool = new WorkerWriterPool(actualConsumers); Worker unfolderWorker = new UnfolderWorker(writerPool.get(), unfolder); actualConsumers = new Worker[]{unfolderWorker}; workersToExecute.add(unfolderWorker); } this.consumers = actualConsumers; return workersToExecute; } public void injectWords() { if (consumers == null) new RuntimeException("search flow not started"); for (String word: this.words){ logger.trace("injecting "+word); for (ConsumerEventHandler actualConsumer : this.consumers) actualConsumer.onElementReady(word); } for (ConsumerEventHandler actualConsumer : this.consumers) actualConsumer.onClose(); } }