/* * Copyright 2011 Stefan Partusch * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package de.spartusch.nasfvi.server; import java.io.IOException; import java.io.PrintWriter; import java.util.Map; import java.util.Set; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.lucene.queryParser.core.QueryNodeException; import org.apache.lucene.search.TopDocs; /** * Analyzes and answers questions. The response format to HTTP GET requests is * JSON. The parameter "q" is required for the question. A parameter "offset" * is optional. * @author Stefan Partusch * */ public class Parselet extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected final void doGet(final HttpServletRequest req, final HttpServletResponse res) throws ServletException, IOException { String q = req.getParameter("q"); int offset = 0; try { String offsetStr = req.getParameter("offset"); if (offsetStr != null) { offset = Integer.parseInt(offsetStr); } } catch (NumberFormatException e) { res.sendError(HttpServletResponse.SC_BAD_REQUEST); return; } if (q != null) { GrammarManager manager = Init.getGrammarManager(getServletContext()); NSearcher searcher = Init.getSearcher(getServletContext()); NQuery nquery; try { nquery = manager.parse(q); if (nquery == null) { res.sendError(HttpServletResponse.SC_BAD_REQUEST); return; } } catch (QueryNodeException e) { res.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); return; } TopDocs result = searcher.search(nquery, offset); res.setCharacterEncoding("UTF-8"); res.setContentType("application/json"); res.setStatus(HttpServletResponse.SC_OK); PrintWriter out = res.getWriter(); Map<String, Set<String>> vals = searcher.getAnswerValues(nquery, result, offset); String response = manager.generate(q, vals); out.print("[\n"); out.print(searcher.toJson(nquery, result, offset)); out.print(",\n"); out.print(response); out.print("]"); } } }