package fi.otavanopisto.muikku.plugins.seeker;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;
import java.util.TreeMap;
import javax.ejb.Stateful;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Any;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Response;
import fi.otavanopisto.muikku.plugin.PluginRESTService;
import fi.otavanopisto.muikku.rest.RESTPermitUnimplemented;
@Path("/seeker")
@RequestScoped
@Stateful
@Produces("application/json")
public class SeekerRESTService extends PluginRESTService {
private static final long serialVersionUID = 1L;
@Inject
@Any
private Instance<SeekerResultProvider> seekerResultProviders;
@GET
@Path("/search")
@RESTPermitUnimplemented
public Response search(@QueryParam("searchString") String searchString) {
TreeMap<Integer, List<SeekerResult>> sortedResults = new TreeMap<Integer, List<SeekerResult>>();
Iterator<SeekerResultProvider> i = seekerResultProviders.iterator();
while (i.hasNext()) {
SeekerResultProvider provider = i.next();
List<SeekerResult> result = provider.search(searchString);
if (result != null) {
for(SeekerResult item : result){
item.setCategory(provider.getName()); //TODO: add localization
}
if(sortedResults.containsKey(provider.getWeight())){
sortedResults.get(provider.getWeight()).addAll(result);
}else{
sortedResults.put(provider.getWeight(), result);
}
}
}
return Response.ok(toResultArray(sortedResults)).build();
}
private List<SeekerResult> toResultArray(TreeMap<Integer, List<SeekerResult>> resultMap){
List<SeekerResult> results = new ArrayList<SeekerResult>();
for(Entry<Integer, List<SeekerResult>> result : resultMap.entrySet()){
results.addAll(result.getValue());
}
return results;
}
}