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.search;
020
021import java.io.IOException;
022import java.util.*;
023import java.util.Map.Entry;
024
025import javax.servlet.ServletException;
026import javax.servlet.http.HttpServlet;
027import javax.servlet.http.HttpServletRequest;
028import javax.servlet.http.HttpServletResponse;
029
030import net.sf.json.JSONArray;
031import org.slf4j.Logger;
032import org.slf4j.LoggerFactory;
033import pt.ua.dicoogle.core.QueryExpressionBuilder;
034import pt.ua.dicoogle.core.query.ExportToCSVQueryTask;
035import pt.ua.dicoogle.plugins.PluginController;
036import pt.ua.dicoogle.sdk.utils.DictionaryAccess;
037
038public class ExportServlet extends HttpServlet{
039        private static final Logger logger = LoggerFactory.getLogger(ExportServlet.class);
040
041        public enum ExportType{
042                LIST, EXPORT_CVS;
043        }
044        private ExportType type;
045        
046        public ExportServlet(ExportType type) {
047                this.type = type;
048        }
049        @Override
050        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
051                        throws ServletException, IOException {
052                switch(type){
053                case LIST:
054                        doGetTagList(req, resp);
055                        break;
056                case EXPORT_CVS:
057                        doGetExportCvs(req, resp);
058                        break;
059                }
060        }
061        
062        private void doGetTagList(HttpServletRequest req, HttpServletResponse resp) throws IOException{
063                HashMap< String, Integer> tagList = DictionaryAccess.getInstance().getTagList();
064                Iterator iterator = tagList.entrySet().iterator();
065                
066                JSONArray array = new JSONArray();
067                
068                while(iterator.hasNext())
069                {
070                        Map.Entry<String, Integer> entry = (Entry<String, Integer>) iterator.next();
071                        //JSONObject obj = new JSONObject();
072                        //obj.put("key", entry.getKey());
073                        //obj.put("value", entry.getValue());
074                        
075                        
076                        array.add(entry.getKey());
077                }
078                
079                resp.getWriter().write(array.toString());
080        }
081        
082        private void doGetExportCvs(HttpServletRequest req, HttpServletResponse resp) throws IOException{
083                resp.setHeader("Content-disposition","attachment; filename=QueryResultsExport.csv");
084                String queryString = req.getParameter("query");
085                String[] fields = req.getParameterValues("fields");
086                String[] providers = req.getParameterValues("providers");
087                boolean keyword = Boolean.parseBoolean(req.getParameter("keyword"));
088                
089                logger.debug("queryString: {}", queryString);
090                logger.debug("fields: {}", Arrays.asList(fields));
091                logger.debug("keyword: {}", keyword);
092                
093                if(queryString == null)
094                        resp.sendError(401, "Query Parameters not found");
095                
096                if(fields == null || fields.length==0)
097                        resp.sendError(402, "Fields Parameters not found");
098                
099                if (!keyword) {
100            QueryExpressionBuilder q = new QueryExpressionBuilder(queryString);
101            queryString = q.getQueryString();
102        }
103
104                                                        
105            List<String> fieldList = Arrays.asList(fields);
106            Map<String, String> fieldsMap = new HashMap<>();
107            for(String f : fields){
108                fieldsMap.put(f, f);
109            }
110                            
111        ExportToCSVQueryTask task = new ExportToCSVQueryTask( fieldList,
112                                resp.getOutputStream());
113
114        if(providers == null || providers.length == 0) {
115                        PluginController.getInstance().queryAll(task, queryString, fieldsMap);
116                } else {
117                        List<String> providersList = Arrays.asList(providers);
118                        PluginController.getInstance().query(task, providersList, queryString,
119                                        fieldsMap);
120                }
121
122                task.await();
123        }
124
125        
126}