package com.psddev.cms.tool.page;
import java.io.IOException;
import java.lang.reflect.Modifier;
import java.util.Map;
import javax.servlet.ServletException;
import com.psddev.cms.tool.PageServlet;
import com.psddev.cms.tool.Search;
import com.psddev.cms.tool.SearchResultSuggester;
import com.psddev.cms.tool.ToolPageContext;
import com.psddev.dari.util.ClassFinder;
import com.psddev.dari.util.ObjectUtils;
import com.psddev.dari.util.RoutingFilter;
import com.psddev.dari.util.TypeDefinition;
@RoutingFilter.Path(application = "cms", value = "/content/suggestions")
public class SearchResultSuggestions extends PageServlet {
@Override
protected String getPermissionId() {
return null;
}
/**
* Gets the SearchResultSuggester with the highest priority, and writes
* the results provided by the suggester.
*
* @param page
* @throws IOException
* @throws ServletException
*/
@Override
protected void doService(ToolPageContext page) throws IOException, ServletException {
if (page.requireUser()) {
return;
}
Map<String, Object> searchData = (Map<String, Object>) ObjectUtils.fromJson(page.param(String.class, "search"));
Search search = new Search(page);
search.getState().setValues(searchData);
SearchResultSuggester suggester = null;
for (Class<? extends SearchResultSuggester> c : ClassFinder.Static.findClasses(SearchResultSuggester.class)) {
if (c.isInterface() || Modifier.isAbstract(c.getModifiers())) {
continue;
}
SearchResultSuggester candidateSuggester = TypeDefinition.getInstance(c).newInstance();
if (candidateSuggester.getPriority(search) >= 0) {
if (suggester == null || suggester.getPriority(search) < candidateSuggester.getPriority(search)) {
suggester = candidateSuggester;
}
}
}
if (suggester != null) {
suggester.writeHtml(search, page);
}
}
}