/*
 * Created on 30-Apr-2008
 *
 * TODO 
 */
package uk.ac.roe.wfau.results;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.zip.GZIPOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import net.mar.FormatRS;
import net.mar.ParseVOT;

import uk.ac.roe.wfau.QueryRetrieverThread;

/**
 * @author mar
 *
 */
public class ResultsVOTWriter extends ResultsFileWriter {
    
    
    ParseVOT pVOT=null;
    String[] votArray;
    PrintWriter CSVWriter = null;
    OutputStream CSVOutputStream = null;
    int noCols;
   
  
    
    /**
     * @param filename
     * @param compressionType
     * @param query
     */
    public ResultsVOTWriter(String baseDir, String subDir, String fileStem, int compressionType, String query, String database,ResultSetMetaData rsmd) {
    super(baseDir,subDir, fileStem, compressionType, query,database,rsmd);
       
        // TODO Auto-generated constructor stub
    }

  
    public String init() throws Exception, SQLException{
       
       
       pVOT=new ParseVOT(query,database);
       pVOT.setRSMD(rsmd);

       switch (compressionType) {
       case QueryRetrieverThread.COMPRESS_NONE:
           savedFilename = fileStem + ".xml";
           fileDescr="VOTable ASCIII";
           try {

               CSVOutputStream = new BufferedOutputStream(new FileOutputStream(baseDir+
                       subDir + savedFilename), QueryRetrieverThread.OUTPUT_BUFFERSIZE);
           } catch (Exception e) {
               CSVOutputStream = null;
           }
           break; // case COMPRESS_NONE
       case QueryRetrieverThread.COMPRESS_ZIP:
           savedFilename = fileStem+ ".zip";
           fileDescr="zipped VOTable ASCII";
           try {
               CSVOutputStream = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(
                       baseDir + subDir + savedFilename), QueryRetrieverThread.OUTPUT_BUFFERSIZE));

               // Prepare the zip
               ((ZipOutputStream) CSVOutputStream).setLevel(9);
               ((ZipOutputStream) CSVOutputStream).putNextEntry(new ZipEntry(fileStem + ".xml"));
           } catch (Exception e) {
               CSVOutputStream = null;
           }
           break; // case COMPRESS_ZIP
       case QueryRetrieverThread.COMPRESS_GZIP:
           savedFilename = fileStem + ".xml.gz";
           fileDescr="gzipped VOTable ASCII";
           try {
               CSVOutputStream = new GZIPOutputStream(new BufferedOutputStream(new FileOutputStream(
                       baseDir + subDir + savedFilename), QueryRetrieverThread.OUTPUT_BUFFERSIZE));
           } catch (Exception e) {
               CSVOutputStream = null;
           }
           break; // case COMPRESS_GZIP
       } // switch

       if (CSVOutputStream != null) {
           try {
               CSVWriter = new PrintWriter(CSVOutputStream, true);
           } catch (Exception e) {
               CSVWriter = null;
           }
           ;
       }
 
       CSVWriter.println(pVOT.getVOTHeader());
       CSVWriter.println(pVOT.setRSMD(rsmd));  
       noCols=rsmd.getColumnCount();
       votArray = new String[noCols]; 
       return savedFilename;
       
    }
    public void writeRow(ResultSet rs){
        votArray=pVOT.setRS(rs);  
        for (int column = 1; column <= noCols; column++) {
        if (CSVWriter != null) {
            //columnData = strArray[column-1];
            if (column == 1) {
                CSVWriter.print("<TR>");
            }
            CSVWriter.print("<TD>" + votArray[column - 1] + "</TD>");
                
                
            if (column == noCols) {
                    CSVWriter.println("</TR>");
                }
            
        }
        ; // if (GenerateCSV == true)
    }
    }
    public void finishUp() throws IOException {
        if (CSVWriter != null) {
            CSVWriter.print(pVOT.getFooter());
            CSVWriter.flush(); // Ensure all data is finished

            if (compressionType == QueryRetrieverThread.COMPRESS_ZIP) {
                ((ZipOutputStream) CSVOutputStream).closeEntry();
            }
            ;

            CSVWriter.close();
        }
        CSVWriter = null;
        CSVOutputStream = null;
    }
 
     
}

