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 */
019
020package pt.ua.dicoogle.server.web.servlets.search;
021
022import java.io.IOException;
023import java.util.Arrays;
024import java.util.HashMap;
025import java.util.List;
026import java.util.Map;
027import java.util.Set;
028import java.util.concurrent.ExecutionException;
029import org.slf4j.LoggerFactory;
030import javax.servlet.ServletException;
031import javax.servlet.http.HttpServlet;
032import javax.servlet.http.HttpServletRequest;
033import javax.servlet.http.HttpServletResponse;
034import net.sf.json.JSONObject;
035import org.apache.commons.lang3.StringUtils;
036import org.slf4j.Logger;
037
038import pt.ua.dicoogle.core.TagsXML;
039import pt.ua.dicoogle.plugins.PluginController;
040import pt.ua.dicoogle.sdk.datastructs.SearchResult;
041import pt.ua.dicoogle.sdk.task.JointQueryTask;
042import pt.ua.dicoogle.sdk.task.Task;
043import pt.ua.dicoogle.sdk.utils.DictionaryAccess;
044import pt.ua.dicoogle.sdk.utils.TagValue;
045import pt.ua.dicoogle.sdk.utils.TagsStruct;
046
047/**
048 * Dump of DICOM metadata
049 *
050 * @author Frederico Silva <fredericosilva@ua.pt>
051 */
052public class DumpServlet extends HttpServlet {
053    private static final Logger logger = LoggerFactory.getLogger(DumpServlet.class);
054
055    @Override
056    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
057        String uid = req.getParameter("uid");
058        if (StringUtils.isEmpty(uid)) {
059            resp.sendError(400, "No uid supplied");
060        }
061        
062        String[] providerArr = req.getParameterValues("provider");
063        List<String> providers = (providerArr == null)
064                ? PluginController.getInstance().getQueryProvidersName(true)
065                : Arrays.asList(providerArr);
066        
067        String query = "SOPInstanceUID:" + uid;
068        
069        Set<TagValue> tags = TagsStruct.getInstance().getAllFields(); 
070        //TODO: PERHAPS REMOVE DICTIONARY ACCESS SINGLETON
071        
072        HashMap<String, String> extraFields = new HashMap<>();
073        for (TagValue s : tags) {
074                if(!s.getVR().equalsIgnoreCase("SQ"))
075                        extraFields.put(s.getAlias(), s.getAlias());
076        }
077        
078        JointQueryTask queryTaskHolder = new JointQueryTask() {
079            @Override
080            public void onCompletion() {
081            }
082            @Override
083            public void onReceive(Task<Iterable<SearchResult>> e) {
084            }
085        };
086
087        long tick = System.currentTimeMillis();
088        Iterable<SearchResult> results;
089        try {
090            results = PluginController.getInstance().query(queryTaskHolder, providers, query, extraFields).get();
091        } catch (InterruptedException | ExecutionException ex) {
092            logger.warn("Failed to generate results", ex);
093            resp.sendError(500, "Could not generate results!");
094            return;
095        }
096
097        long time = System.currentTimeMillis()-tick;
098        String json = processJSON(results, time);
099
100        resp.setContentType("application/json");
101        resp.getWriter().append(json);
102    }
103
104    private static String processJSON(Iterable<SearchResult> results, long elapsedTime) {
105        JSONObject resp = new JSONObject();
106        JSONObject rj = new JSONObject();
107        JSONObject fields = new JSONObject();
108        for (SearchResult r : results) {
109            rj.put("uri", r.getURI().toString());
110            for (Map.Entry<String,Object> e : r.getExtraData().entrySet()) {
111                fields.put(e.getKey(), e.getValue());
112            }
113        }
114        rj.put("fields", fields);
115        resp.put("results", rj);
116        resp.put("elapsedTime", elapsedTime);
117        return resp.toString();
118    }
119
120}