001/** 002 * Copyright (C) 2014 Universidade de Aveiro, DETI/IEETA, Bioinformatics Group - http://bioinformatics.ua.pt/ 003 * 004 * This file is part of Dicoogle/dicoogle. 005 * 006 * Dicoogle/dicoogle is free software: you can redistribute it and/or modify 007 * it under the terms of the GNU General Public License as published by 008 * the Free Software Foundation, either version 3 of the License, or 009 * (at your option) any later version. 010 * 011 * Dicoogle/dicoogle is distributed in the hope that it will be useful, 012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 014 * GNU General Public License for more details. 015 * 016 * You should have received a copy of the GNU General Public License 017 * along with Dicoogle. If not, see <http://www.gnu.org/licenses/>. 018 */ 019package pt.ua.dicoogle.server.web.servlets; 020 021import javax.servlet.ServletException; 022import javax.servlet.http.HttpServlet; 023import javax.servlet.http.HttpServletRequest; 024import javax.servlet.http.HttpServletResponse; 025import javax.servlet.http.HttpSession; 026 027import org.apache.commons.collections.KeyValue; 028 029import java.io.IOException; 030import java.io.PrintWriter; 031import java.util.ArrayList; 032import java.util.List; 033 034import net.sf.json.JSONArray; 035import net.sf.json.JSONObject; 036import pt.ua.dicoogle.core.dim.DIMGeneric; 037import pt.ua.dicoogle.sdk.datastructs.SearchResult; 038import pt.ua.dicoogle.server.web.dicom.SearchHolder; 039import pt.ua.dicoogle.server.web.utils.DIM2JSONConverter; 040 041/** 042 * Useful servlet for asynchronous queries. 043 * 044 * @author Tiago Godinho. 045 * 046 */ 047public class SearchHolderServlet extends HttpServlet 048{ 049 private static final long serialVersionUID = 1L; 050 051 @Override 052 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 053 { 054 HttpSession session = request.getSession(true); 055 if(session == null){ 056 response.sendError(401, "ERROR: NO SESSION FOUND"); 057 return; 058 } 059 SearchHolder holder = (SearchHolder) session.getAttribute("dicoogle.web.queryHolder"); 060 if(holder == null){ 061 response.sendError(402, "ERROR: NO SEARCH SESSION FOUND"); 062 return; 063 } 064 int id = Integer.parseInt(request.getParameter("id")); 065 066 response.setHeader("pragma", "no-cache,no-store"); 067 response.setHeader("cache-control", "no-cache,no-store,max-age=0,max-stale=0"); 068 response.setHeader("connection", "keep-alive"); 069 response.setContentType("text/event-stream"); 070 response.setCharacterEncoding("UTF-8"); // set the apropriate encoding type 071 072 PrintWriter wr = response.getWriter(); 073 074 Iterable<KeyValue> it = holder.retrieveQueryOutput(id); 075 076 wr.print("data: \n\n"); 077 wr.flush(); 078 079 int eventID = 0; 080 for(KeyValue resp : it){ 081 List<SearchResult> results = new ArrayList<>(); 082 083 String provider = resp.getKey().toString(); 084 @SuppressWarnings("unchecked") 085 Iterable<SearchResult> result = (Iterable<SearchResult>) resp.getValue(); 086 for(SearchResult r : result ) 087 results.add(r); 088 089 try { 090 DIMGeneric generic = new DIMGeneric(results); 091 092 JSONObject obj = new JSONObject(); 093 obj.put("provider", provider); 094 JSONArray arr = DIM2JSONConverter.convertToJSON(generic); 095 obj.put("rsp", arr); 096 097 wr.print("id: "+ (eventID++)+"\n"); 098 wr.print("event: QueryResponse\n"); 099 wr.print("data: "+obj.toString()+"\n\n"); 100 wr.flush(); 101 } catch (Exception e) { 102 // TODO Auto-generated catch block 103 e.printStackTrace(); 104 } 105 } 106 wr.print("event: close\n"); 107 wr.flush(); 108 wr.close(); 109 } 110}