/********************************************************************************* * The contents of this file are subject to the Common Public Attribution * License Version 1.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.openemm.org/cpal1.html. The License is based on the Mozilla * Public License Version 1.1 but Sections 14 and 15 have been added to cover * use of software over a computer network and provide for limited attribution * for the Original Developer. In addition, Exhibit A has been modified to be * consistent with Exhibit B. * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for * the specific language governing rights and limitations under the License. * * The Original Code is OpenEMM. * The Original Developer is the Initial Developer. * The Initial Developer of the Original Code is AGNITAS AG. All portions of * the code written by AGNITAS AG are Copyright (c) 2009 AGNITAS AG. All Rights * Reserved. * * Contributor(s): AGNITAS AG. ********************************************************************************/ package org.agnitas.util; import org.agnitas.beans.ColumnMapping; import org.agnitas.beans.ImportProfile; import org.agnitas.beans.ProfileRecipientFields; import org.agnitas.service.csv.Toolkit; import org.agnitas.service.impl.CSVColumnState; import org.agnitas.service.NewImportWizardService; import org.agnitas.util.importvalues.Charset; import org.agnitas.util.importvalues.Separator; import org.agnitas.util.importvalues.TextRecognitionChar; import java.io.*; import java.util.Collection; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; /** * Class generates recipients result files from recipients beans * * @author Vyacheslav Stepanov */ public class ImportCsvGenerator { private File csvFile = null; private PrintWriter outWriter = null; /** * Creates recipients csv-file * * @param profile import profile * @param columnsInFile file columns * @param fileName name of file to generate */ public void createCsv(ImportProfile profile, CSVColumnState[] columnsInFile, String fileName) { List<ColumnMapping> columnMapping = profile.getColumnMapping(); // create file for download initOutput(profile, fileName); if (outWriter == null) { return; } // write first line - column headers String delimiter = TextRecognitionChar.getValue(profile.getTextRecognitionChar()); String separator = Separator.getValue(profile.getSeparator()); for (CSVColumnState columnInFile : columnsInFile) { String columnName = getFileColumn(columnMapping, columnInFile.getColName()); if (columnName == null) { columnName = columnInFile.getColName(); } outWriter.print(delimiter + columnName + delimiter); if (columnInFile != columnsInFile[columnsInFile.length - 1]) { outWriter.print(separator); } } outWriter.print("\n"); } /** * Writes recipients to csv-file * * @param recipients list of recipients * @param columnsInFile file columns * @param profile import profile */ public void writeDataToFile(Collection<ProfileRecipientFields> recipients, CSVColumnState[] columnsInFile, ImportProfile profile) { String delimiter = TextRecognitionChar.getValue(profile.getTextRecognitionChar()); String separator = Separator.getValue(profile.getSeparator()); for (ProfileRecipientFields fieldsBean : recipients) { for (CSVColumnState columnInFile : columnsInFile) { String columnValue = ""; try { columnValue = Toolkit.getValueFromBean(fieldsBean, columnInFile.getColName()); } catch (Exception e) { AgnUtils.logger().error("Field value not found while creating csv " + "file from recipients beans" + AgnUtils.getStackTrace(e)); } outWriter.print(delimiter + columnValue + delimiter); if (columnInFile != columnsInFile[columnsInFile.length - 1]) { outWriter.print(separator); } } outWriter.print("\n"); } } /** * Writes recipients to csv-file * * @param recipients list of recipients * @param columnsInFile file columns * @param profile import profile */ public void writeDataToFileForDuplication(Collection<ProfileRecipientFields> recipients, CSVColumnState[] columnsInFile, ImportProfile profile, Integer type) { String delimiter = TextRecognitionChar.getValue(profile.getTextRecognitionChar()); String separator = Separator.getValue(profile.getSeparator()); for (ProfileRecipientFields fieldsBean : recipients) { for (CSVColumnState columnInFile : columnsInFile) { String columnValue = ""; if (columnInFile.getColName().equalsIgnoreCase("SourceOfDuplicate")) { if (type == NewImportWizardService.RECIPIENT_TYPE_DUPLICATE_IN_NEW_DATA_RECIPIENT) { columnValue = "file"; } else if (type == NewImportWizardService.RECIPIENT_TYPE_DUPLICATE_RECIPIENT) { columnValue = "db"; } } else { try { columnValue = Toolkit.getValueFromBean(fieldsBean, columnInFile.getColName()); } catch (Exception e) { AgnUtils.logger().error("Field value not found while creating csv " + "file from recipients beans" + AgnUtils.getStackTrace(e)); } } outWriter.print(delimiter + columnValue + delimiter); if (columnInFile != columnsInFile[columnsInFile.length - 1]) { outWriter.print(separator); } } outWriter.print("\n"); } } /** * Finishes writing of recipients file * * @return created file */ public File finishFileGeneration() { outWriter.close(); return csvFile; } /** * Method creates zip-file, puts it to temporary directory, adds one * entry to zip-file and sets print writer to it * * @param importProfile import profile * @param fileName file name start */ private void initOutput(ImportProfile importProfile, String fileName) { try { File systemUploadDirectory = AgnUtils.createDirectory(AgnUtils.getDefaultValue("system.upload")); csvFile = File.createTempFile(fileName + "_", ".zip", systemUploadDirectory); ZipOutputStream zipStream = new ZipOutputStream(new FileOutputStream(csvFile)); zipStream.putNextEntry(new ZipEntry(fileName + ".csv")); String charset = Charset.getValue(importProfile.getCharset()); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(zipStream, charset); BufferedWriter writer = new BufferedWriter(outputStreamWriter); outWriter = new PrintWriter(writer); } catch (IOException e) { AgnUtils.logger().error("Error during creating temporary recipient-file" + AgnUtils.getStackTrace(e)); outWriter = null; csvFile = null; } } /** * Method looks for dbColumn in mappings and returns corresponding * fileColumn * * @param mappings list of column mappings * @param dbColumn database column * @return corresponding file column in found (null otherwise) */ private String getFileColumn(List<ColumnMapping> mappings, String dbColumn) { for (ColumnMapping columnMapping : mappings) { if (dbColumn.equals(columnMapping.getDatabaseColumn())) { return columnMapping.getFileColumn(); } } return null; } }