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}