/* * Copyright 2009 NCHOVY * * 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 org.krakenapps.servlet.csv; import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class CsvHttpServlet extends HttpServlet { final Logger logger = LoggerFactory.getLogger(CsvHttpServlet.class.getName()); private static final long serialVersionUID = 1L; private CsvHttpServiceApi api; public CsvHttpServlet(CsvHttpServiceApi api) { this.api = api; } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { logger.debug("csv servlet pathinfo: " + req.getPathInfo()); String[] tokens = req.getPathInfo().split("/"); if (tokens.length != 3) return; String filterId = tokens[1]; String methodName = tokens[2]; List<CsvRow> csvRows = getCsvRows(filterId, methodName, req); if (csvRows == null) { resp.sendError(404); return; } resp.setCharacterEncoding("euc-kr"); resp.setHeader("Content-Disposition", "inline; filename=\"" + methodName + ".csv\""); resp.setHeader("Cache-Control", "no-cache, must-revalidate"); resp.setHeader("Pragma", "no-cache"); resp.setContentType("text/csv;charset=euc-kr"); printCsv(resp.getWriter(), csvRows); resp.getWriter().close(); } @SuppressWarnings("unchecked") private List<CsvRow> getCsvRows(String filterId, String methodName, HttpServletRequest req) { try { List<CsvRow> csvRows = (List<CsvRow>) api.invokeCsvMethod(filterId, methodName, req); if (csvRows == null) { logger.warn("csv servlet null returned."); } return csvRows; } catch (NoSuchMethodException e) { try { Map<String, Object> params = buildParameterMap(req); List<CsvRow> csvRows = (List<CsvRow>) api.invokeCsvMethod(filterId, methodName, params); if (csvRows == null) { logger.warn("csv servlet null returned."); } return csvRows; } catch (Exception e1) { e1.printStackTrace(); } } catch (Exception e) { logger.error("csv get error", e); } return null; } private void printCsv(PrintWriter out, List<CsvRow> csvRows) { for (CsvRow row : csvRows) { for (int i = 0; i < row.size(); i++) { if (i == 0) { out.print(escape(row.get(i))); } else { out.print(","); out.print(escape(row.get(i))); } } out.println(); } } private String escape(String v) { if (v == null) return ""; if (v.indexOf(",") >= 0) return "\"" + v + "\""; return v; } private Map<String, Object> buildParameterMap(HttpServletRequest req) { Map<String, Object> paramMap = new HashMap<String, Object>(); @SuppressWarnings("rawtypes") Enumeration it = req.getParameterNames(); while (it.hasMoreElements()) { String name = (String) it.nextElement(); Object value = req.getParameter(name); paramMap.put(name, value); } return paramMap; } }