com.seer.datacruncher.spring.DownloadStreamController.java Source code

Java tutorial

Introduction

Here is the source code for com.seer.datacruncher.spring.DownloadStreamController.java

Source

/*
 * Copyright (c) 2015  www.see-r.com
 * All rights reserved
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package com.seer.datacruncher.spring;

import com.seer.datacruncher.constants.StreamType;
import com.seer.datacruncher.jpa.ReadList;
import com.seer.datacruncher.jpa.dao.DaoSet;
import com.seer.datacruncher.jpa.entity.DatastreamEntity;
import com.seer.datacruncher.jpa.entity.SchemaEntity;
import com.seer.datacruncher.jpa.entity.SchemaFieldEntity;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;

public class DownloadStreamController implements Controller, DaoSet {

    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        ServletOutputStream out = response.getOutputStream();
        long idDataStream = Long.parseLong(request.getParameter("id_datastream"));
        ReadList readList = datastreamsDao.read(idDataStream);

        if (readList.getResults() != null && readList.getResults().size() > 0) {

            DatastreamEntity datastreamInstance = (DatastreamEntity) readList.getResults().get(0);

            SchemaEntity schemaEntity = schemasDao.find(datastreamInstance.getIdSchema());
            String fileExt = StreamType.getFileExtension(schemaEntity.getIdStreamType());

            response.setContentType(StreamType.getContentType(schemaEntity.getIdStreamType()));
            response.setHeader("content-disposition", (new StringBuilder("attachment;filename="))
                    .append(idDataStream).append(".").append(fileExt).toString());

            byte data[] = null;

            try {

                if (schemaEntity.getIdStreamType() == StreamType.XML
                        || schemaEntity.getIdStreamType() == StreamType.XMLEXI
                        || schemaEntity.getIdStreamType() == StreamType.JSON
                        || schemaEntity.getIdStreamType() == StreamType.flatFileDelimited
                        || schemaEntity.getIdStreamType() == StreamType.flatFileFixedPosition) {
                    String dataStreamReceived = datastreamInstance.getDatastream();
                    if (schemaEntity.getIdStreamType() == StreamType.XML
                            || schemaEntity.getIdStreamType() == StreamType.XMLEXI) {
                        TransformerFactory transformerFactory = TransformerFactory.newInstance();
                        Transformer transformer = transformerFactory.newTransformer();
                        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
                        transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
                        transformer.setOutputProperty(OutputKeys.INDENT, "yes");

                        StringReader xmlReader = new StringReader(dataStreamReceived);
                        StringWriter xmlWriter = new StringWriter();
                        transformer.transform(new StreamSource(xmlReader), new StreamResult(xmlWriter));
                        dataStreamReceived = xmlWriter.toString();
                    }
                    data = dataStreamReceived.getBytes();
                } else if (schemaEntity.getIdStreamType() == StreamType.EXCEL) {
                    data = getDataForXMLFile(schemaEntity.getIdSchema(), datastreamInstance.getDatastream());
                }

                out.write(data);
                out.flush();
                out.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        } else {
            response.setContentType("text/plain");
            response.setHeader("content-disposition",
                    (new StringBuilder("attachment;filename=")).append(idDataStream).append(".txt").toString());
            out.flush();
            out.close();
        }
        return null;
    }

    private byte[] getDataForXMLFile(long idSchema, String datastream) {

        Document document = null;

        try {
            DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
            document = docBuilder.parse(new InputSource(new StringReader(datastream)));

        } catch (Exception ex) {
            ex.printStackTrace();
        }

        HSSFWorkbook wb = new HSSFWorkbook();
        HSSFSheet sheet = wb.createSheet("Data");
        HSSFRow headerRow = sheet.createRow(0);

        List<SchemaFieldEntity> listFields = schemaFieldsDao.listSchemaFields(idSchema);

        int colCounter = 0;

        HSSFRow row = sheet.createRow(1);
        String tagValue;

        for (SchemaFieldEntity instance : listFields) {
            tagValue = document.getElementsByTagName(instance.getName()).item(0).getTextContent();
            headerRow.createCell(colCounter).setCellValue(instance.getName());
            row.createCell(colCounter++).setCellValue(tagValue);
        }

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try {
            wb.write(bos);
            bos.close();
        } catch (Exception ioexception2) {

        }

        return bos.toByteArray();
    }
}