/*
* Copyright (c) 2005-2010, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you 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.wso2.carbon.reporting.ui.servlet;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.j2ee.servlets.ImageServlet;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.CarbonConstants;
import org.wso2.carbon.reporting.api.ReportDataManager;
import org.wso2.carbon.reporting.api.ReportingException;
import org.wso2.carbon.reporting.ui.client.ReportResourceSupplierClient;
import org.wso2.carbon.reporting.util.JasperPrintProvider;
import org.wso2.carbon.reporting.util.ReportParamMap;
import org.wso2.carbon.reporting.util.ReportStream;
import org.wso2.carbon.ui.CarbonUIUtil;
import org.wso2.carbon.utils.ServerConstants;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
public class GraphGenerateServlet extends HttpServlet {
private static Log log = LogFactory.getLog(GraphGenerateServlet.class);
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws Exception {
String type = request.getParameter("reportType");
String typeSecond = request.getParameter("reportTypeSecond");
String dataSessionVar = request.getParameter("reportDataSession");
String component = request.getParameter("component");
String template = request.getParameter("template");
String generateType;
String downloadFileName = null;
if (type == null) {
type = " ";
} else {
typeSecond = " ";
}
if (type.equals("pdf") || typeSecond.equals("pdf")) {
generateType = "pdf";
response.setContentType("application/pdf");
downloadFileName = template + ".pdf";
} else if (type.equals("excel") || typeSecond.equals("excel")) {
generateType = "excel";
response.setContentType("application/vnd.ms-excel");
downloadFileName = template + ".xsl";
} else if (type.equals("html") || typeSecond.equals("html")) {
generateType = "html";
response.setContentType("text/html");
} else {
throw new ReportingException("requested report type can not be support");
}
if (downloadFileName != null) {
response.setHeader("Content-Disposition", "attachment; filename=\"" + downloadFileName + "\"");
}
Object reportDataObject = request.getSession().getAttribute(dataSessionVar);
if (reportDataObject == null) {
throw new ReportingException("can't generate report , data unavailable in session ");
}
try {
String serverURL = CarbonUIUtil.getServerURL(request.getSession().getServletContext(), request.getSession());
ConfigurationContext configurationContext = (ConfigurationContext) request.getSession().getServletContext().
getAttribute(CarbonConstants.CONFIGURATION_CONTEXT);
String cookie = (String) request.getSession().getAttribute(ServerConstants.ADMIN_SERVICE_COOKIE);
ReportResourceSupplierClient resourceSupplierClient = new ReportResourceSupplierClient(cookie,
serverURL, configurationContext);
List<ReportDataManager> reportDataList = (List<ReportDataManager>) reportDataObject;
String reportResource = resourceSupplierClient.getReportResources(component, template);
JRDataSource jrDataSource = new JRBeanCollectionDataSource(reportDataList);
JasperPrintProvider jasperPrintProvider = new JasperPrintProvider();
JasperPrint jasperPrint = jasperPrintProvider.createJasperPrint(jrDataSource ,reportResource, new ReportParamMap[0]);
request.getSession().setAttribute(ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE,jasperPrint);
ReportStream reportStream = new ReportStream();
ByteArrayOutputStream outputStream = reportStream.getReportStream(jasperPrint,generateType);
ServletOutputStream servletOutputStream = response.getOutputStream();
try{
outputStream.writeTo(servletOutputStream);
outputStream.flush();
}finally {
outputStream.close();
servletOutputStream.close();
}
} catch (Exception e) {
String msg = "Error occurred handling " + template + "report request from " + component;
log(msg);
throw e;
}
}
/**
* Handles the HTTP <code>GET</code> method.
*
* @param request servlet request
* @param response servlet response
* @throws javax.servlet.ServletException if a servlet-specific error occurs
* @throws java.io.IOException if an I/O error occurs
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
processRequest(request, response);
} catch (Exception ex) {
Logger.getLogger(GraphGenerateServlet.class.getName()).log(Level.SEVERE, null, ex);
}
}
/**
* Handles the HTTP <code>POST</code> method.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
processRequest(request, response);
} catch (Exception ex) {
Logger.getLogger(GraphGenerateServlet.class.getName()).log(Level.SEVERE, null, ex);
}
}
/**
* Returns a short description of the servlet.
*
* @return a String containing servlet description
*/
@Override
public String getServletInfo() {
return "Short description";
}// </editor-fold>
}