From 86c3c5638f42dabbb089b8463fdb3141b8fc23d2 Mon Sep 17 00:00:00 2001 From: Diego Ruiz Date: Tue, 23 Oct 2018 13:56:36 +0200 Subject: [PATCH] IDEMPIERE-3807 --- .../idempiere/process/ImportCSVProcess.java | 1 + .../org/compiere/model/MImportTemplate.java | 69 +++++++++++++++++++ .../webui/panel/action/CSVImportAction.java | 63 +---------------- 3 files changed, 73 insertions(+), 60 deletions(-) diff --git a/org.adempiere.base.process/src/org/idempiere/process/ImportCSVProcess.java b/org.adempiere.base.process/src/org/idempiere/process/ImportCSVProcess.java index 45fca381c8..9ceac6bf8d 100644 --- a/org.adempiere.base.process/src/org/idempiere/process/ImportCSVProcess.java +++ b/org.adempiere.base.process/src/org/idempiere/process/ImportCSVProcess.java @@ -144,6 +144,7 @@ public class ImportCSVProcess extends SvrProcess implements DataStatusListener { protected void importFile(String filePath, IGridTabImporter csvImporter, GridTab activeTab, List childTabs) throws Exception { m_file_istream = new FileInputStream(filePath); + m_file_istream = m_importTemplate.validateFile(m_file_istream); File outFile = csvImporter.fileImport(activeTab, childTabs, m_file_istream, Charset.forName(m_importTemplate.getCharacterSet()), p_ImportMode, processUI); // TODO: Potential improvement - traverse the outFile and call addLog with the results diff --git a/org.adempiere.base/src/org/compiere/model/MImportTemplate.java b/org.adempiere.base/src/org/compiere/model/MImportTemplate.java index 1f3bf507ed..783e8eb007 100644 --- a/org.adempiere.base/src/org/compiere/model/MImportTemplate.java +++ b/org.adempiere.base/src/org/compiere/model/MImportTemplate.java @@ -13,11 +13,20 @@ *****************************************************************************/ package org.compiere.model; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; import java.nio.charset.Charset; import java.sql.ResultSet; import java.util.List; import java.util.Properties; +import org.adempiere.exceptions.AdempiereException; import org.compiere.util.CCache; import org.compiere.util.CLogger; import org.compiere.util.DB; @@ -132,5 +141,65 @@ public class MImportTemplate extends X_AD_ImportTemplate int cnt = DB.getSQLValueEx(get_TrxName(), sql.toString(), getAD_ImportTemplate_ID(), roleID, roleID); return cnt > 0; } + + /** + * Validate that InputStream header is CSVHeader or AliasCSVHeader + * If the header is AliasCSVHeader it replaces it with the CSVHeader so it can be + * processed + * @param in input file + * @return InputStream with the CSVHeader that can be processed by CsvMapReader + */ + public InputStream validateFile(InputStream in) { + // because the input stream cannot be reset we need to copy here the file to a new one (replacing the header if it's the alias) + Charset charset = Charset.forName(getCharacterSet()); + BufferedReader reader = new BufferedReader(new InputStreamReader(in, charset)); + File tmpfile = null; + InputStream is = null; + BufferedWriter bw = null; + try { + tmpfile = File.createTempFile("CSVImportAction", "csv"); + bw = new BufferedWriter(new FileWriter(tmpfile)); + String firstLine = null; + String line = null; + while ((line = reader.readLine()) != null) { + if (firstLine == null) { + firstLine = line; + /* Validate that m_file_istream header is CSVHeader or AliasCSVHeader */ + if ( firstLine.equals(getCSVHeader()) + || firstLine.equals(getCSVAliasHeader())) { + bw.write(getCSVHeader()); + } else { + reader.close(); + throw new AdempiereException(Msg.getMsg(Env.getCtx(), "WrongCSVHeader")); + } + } else { + bw.write(line); + } + bw.write('\n'); + } + is = new FileInputStream(tmpfile); + } catch (IOException e) { + throw new AdempiereException(e); + } finally { + if (in != null) + try { + in.close(); + } catch (IOException e) { + } + + if (bw != null) + try { + bw.close(); + } catch (IOException e) { + } + + if (reader != null) + try { + reader.close(); + } catch (IOException e) { + } + } + return is; + } } // MImportTemplate diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/action/CSVImportAction.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/action/CSVImportAction.java index c2f72d2113..a7e1678a08 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/action/CSVImportAction.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/action/CSVImportAction.java @@ -24,14 +24,8 @@ **********************************************************************/ package org.adempiere.webui.panel.action; -import java.io.BufferedReader; -import java.io.BufferedWriter; import java.io.File; -import java.io.FileInputStream; -import java.io.FileWriter; -import java.io.IOException; import java.io.InputStream; -import java.io.InputStreamReader; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashSet; @@ -63,6 +57,8 @@ import org.adempiere.webui.util.ReaderInputStream; import org.adempiere.webui.util.ZKUpdateUtil; import org.compiere.model.GridTab; import org.compiere.model.MImportTemplate; +import org.compiere.model.MQuery; +import org.compiere.model.MRole; import org.compiere.util.DB; import org.compiere.util.Env; import org.compiere.util.Msg; @@ -330,7 +326,7 @@ public class CSVImportAction implements EventListener return; String iMode = (String)importItem.getValue(); - m_file_istream = validateFile(m_file_istream, theTemplate); + m_file_istream = theTemplate.validateFile(m_file_istream); File outFile = theCSVImporter.fileImport(panel.getActiveGridTab(), childs, m_file_istream, charset,iMode); winImportFile.onClose(); winImportFile = null; @@ -347,57 +343,4 @@ public class CSVImportAction implements EventListener } } - private InputStream validateFile(InputStream in, MImportTemplate template) { - // because the input stream cannot be reset we need to copy here the file to a new one (replacing the header if it's the alias) - Charset charset = Charset.forName(template.getCharacterSet()); - BufferedReader reader = new BufferedReader(new InputStreamReader(in, charset)); - File tmpfile = null; - InputStream is = null; - BufferedWriter bw = null; - try { - tmpfile = File.createTempFile("CSVImportAction", "csv"); - bw = new BufferedWriter(new FileWriter(tmpfile)); - String firstLine = null; - String line = null; - while ((line = reader.readLine()) != null) { - if (firstLine == null) { - firstLine = line; - /* Validate that m_file_istream header is CSVHeader or AliasCSVHeader */ - if ( firstLine.equals(template.getCSVHeader()) - || firstLine.equals(template.getCSVAliasHeader())) { - bw.write(template.getCSVHeader()); - } else { - reader.close(); - throw new AdempiereException(Msg.getMsg(Env.getCtx(), "WrongCSVHeader")); - } - } else { - bw.write(line); - } - bw.write('\n'); - } - is = new FileInputStream(tmpfile); - } catch (IOException e) { - throw new AdempiereException(e); - } finally { - if (in != null) - try { - in.close(); - } catch (IOException e) { - } - - if (bw != null) - try { - bw.close(); - } catch (IOException e) { - } - - if (reader != null) - try { - reader.close(); - } catch (IOException e) { - } - } - return is; - } - }