/*******************************************************************************
* Copyright (c) 2015 hangum.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v2.1
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
* Contributors:
* hangum - initial API and implementation
******************************************************************************/
package com.hangum.tadpole.engine.sql.util.export;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.commons.io.FileUtils;
import com.hangum.tadpole.commons.util.CSVFileUtils;
import com.hangum.tadpole.engine.sql.util.SQLUtil;
import com.hangum.tadpole.engine.sql.util.resultset.QueryExecuteResultDTO;
/**
* CSV 유틸
*
* @author hangum
*
*/
public class CSVExpoter extends AbstractTDBExporter {
public static String makeContent(boolean isAddHead, String targetName, QueryExecuteResultDTO queryExecuteResultDTO, char seprator, String strDefaultNullValue) throws Exception {
return makeContent(isAddHead, targetName, queryExecuteResultDTO, seprator, -1, strDefaultNullValue);
}
/**
* make file header
*
* @param strFullPath
* @param isAddHead
* @param rsDAO
* @param seprator
* @param encoding
* @throws Exception
*/
public static void makeHeaderFile(String strFullPath, boolean isAddHead, QueryExecuteResultDTO rsDAO, char seprator, String encoding) throws Exception {
// make language tag
FileUtils.writeByteArrayToFile(new File(strFullPath),
(new byte[] {(byte) 0xEF,
(byte) 0xBB, (byte) 0xBF}), true);
// make header
FileUtils.writeStringToFile(new File(strFullPath), makeHeader(isAddHead, rsDAO, seprator), encoding, true);
}
/**
* make csv header
*
* @param isAddHead
* @param rsDAO
* @param seprator
* @return
* @throws Exception
*/
public static String makeHeader(boolean isAddHead, QueryExecuteResultDTO rsDAO, char seprator) throws Exception {
List<String[]> listCsvData = new ArrayList<String[]>();
if(isAddHead) {
// column .
Map<Integer, String> mapLabelName = rsDAO.getColumnLabelName();
List<String> listLabel = new ArrayList<String>();
for(int i=0; i<mapLabelName.size(); i++) {
String strLabelName = mapLabelName.get(i);
if(!SQLUtil.isTDBSpecialColumn(strLabelName)) {
listLabel.add(strLabelName);
}
}
listCsvData.add(listLabel.toArray(new String[listLabel.size()]));
}
return CSVFileUtils.makeData(listCsvData, seprator);
}
/**
* make content
*
* @param tableName
* @param rsDAO
* @param intLimitCnt
* @return
*/
public static String makeContent(boolean isAddHead, String tableName, QueryExecuteResultDTO rsDAO, char seprator, int intLimitCnt, String strDefaultNullValue) throws Exception {
// make header
StringBuffer sbReturn = new StringBuffer();
sbReturn.append(makeHeader(isAddHead, rsDAO, seprator));
// data
List<Map<Integer, Object>> dataList = rsDAO.getDataList().getData();
List<String[]> listCsvData = new ArrayList<String[]>();
List<String> listLabel = new ArrayList<String>();
// column name
Map<Integer, String> mapLabelName = rsDAO.getColumnLabelName();
for(int i=0; i<dataList.size(); i++) {
Map<Integer, Object> mapColumns = dataList.get(i);
listLabel.clear();
for(int j=1; j<mapColumns.size(); j++) {
// tdb 내부적으로 사용하는 컬럼을 보이지 않도록 합니다.
if(!SQLUtil.isTDBSpecialColumn(mapLabelName.get(j))) {
listLabel.add(mapColumns.get(j) == null?strDefaultNullValue:""+mapColumns.get(j));
}
}
listCsvData.add(listLabel.toArray(new String[listLabel.size()]));
sbReturn.append(CSVFileUtils.makeData(listCsvData, seprator));
listCsvData.clear();
if (intLimitCnt == i) break;
}
return sbReturn.toString();
}
/**
* csv 파일을 생성하여 파일 위치를 넘겨줍니다.
*
* @param tableName
* @param rsDAO
* @param seprator
* @param encoding
* @return 파일 위치
* @return strDefaultNullValue
*
* @throws Exception
*/
public static void makeContentFile(String strFullPath, boolean isAddHead, QueryExecuteResultDTO rsDAO, char seprator, String encoding, String strDefaultNullValue) throws Exception {
// data
List<Map<Integer, Object>> dataList = rsDAO.getDataList().getData();
List<String[]> listCsvData = new ArrayList<String[]>();
List<String> listValues = new ArrayList<String>();
// column name
Map<Integer, String> mapLabelName = rsDAO.getColumnLabelName();
for(int i=0; i<dataList.size(); i++) {
Map<Integer, Object> mapColumns = dataList.get(i);
listValues.clear();
for(int j=0; j<mapColumns.size(); j++) {
// tdb 내부적으로 사용하는 컬럼을 보이지 않도록 합니다.
if(!SQLUtil.isTDBSpecialColumn(mapLabelName.get(j))) {
listValues.add(mapColumns.get(j) == null?strDefaultNullValue:""+mapColumns.get(j));
}
}
listCsvData.add(listValues.toArray(new String[listValues.size()]));
}
FileUtils.writeStringToFile(new File(strFullPath), CSVFileUtils.makeData(listCsvData, seprator), encoding, true);
}
}