/** * The contents of this file are subject to the license and copyright * detailed in the LICENSE and NOTICE files at the root of the source * tree and available online at * * http://www.dspace.org/license/ */ package org.dspace.app.webui.discovery; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Set; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.dspace.app.webui.json.JSONRequest; import org.dspace.authorize.AuthorizeException; import org.dspace.content.DSpaceObject; import org.dspace.core.Context; import org.dspace.discovery.DiscoverQuery; import org.dspace.discovery.DiscoverResult; import org.dspace.discovery.DiscoverResult.FacetResult; import org.dspace.discovery.SearchUtils; import com.google.gson.ExclusionStrategy; import com.google.gson.FieldAttributes; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; import com.google.gson.JsonObject; public class DiscoveryJSONRequest extends JSONRequest { public void doJSONRequest(Context context, HttpServletRequest request, HttpServletResponse resp) throws AuthorizeException, IOException { String reqPath = request.getPathInfo(); // remove the first slash if present if (reqPath.startsWith("/")) { reqPath = reqPath.substring(1); } if (reqPath.equalsIgnoreCase(getSubPath() + "/autocomplete")) { doAutocomplete(context, request, resp); return; } // unkwon action (in future we can implement ajax for pagination, etc.) resp.sendError(HttpServletResponse.SC_NOT_FOUND); return; } private void doAutocomplete(Context context, HttpServletRequest request, HttpServletResponse resp) { try { DSpaceObject scope = DiscoverUtility.getSearchScope(context, request); DiscoverQuery autocompleteQuery = DiscoverUtility .getDiscoverAutocomplete(context, request, scope); DiscoverResult qResults = SearchUtils.getSearchService().search( context, autocompleteQuery); // extract the only facet present in the result response Set<String> facets = qResults.getFacetResults().keySet(); List<FacetResult> fResults = new ArrayList<DiscoverResult.FacetResult>(); if (facets != null && facets.size() > 0) { String autocompleteField = (String) facets.toArray()[0]; fResults = qResults .getFacetResult(autocompleteField); } Gson gson = new GsonBuilder().addSerializationExclusionStrategy(new ExclusionStrategy() { @Override public boolean shouldSkipField(FieldAttributes f) { if(f.getName().equals("asFilterQuery"))return true; return false; } @Override public boolean shouldSkipClass(Class<?> clazz) { return false; } }).create(); JsonElement tree = gson.toJsonTree(fResults); JsonObject jo = new JsonObject(); jo.add("autocomplete", tree); resp.getWriter().write(jo.toString()); } catch (Exception e) { throw new RuntimeException(e.getMessage(), e); } } }