use of jp.ossc.nimbus.io.CSVReader in project nimbus by nimbus-org.
the class CSVCompareEvaluateActionService method execute.
/**
* 2つのCSVファイルを比較して、内容が等価かどうか評価する。<p>
* リソースのフォーマットは、以下。<br>
* <pre>
* srcFilePath
* dstFilePath
* ignoreCSVElements
* </pre>
* srcFilePathは、比較元のCSVファイルのパスを指定する。<br>
* dstFilePathは、比較先のCSVファイルのパスを指定する。ここで指定したファイルが存在しない場合は、比較を行わずにtrueを返す。<br>
* ignoreCSVElementsは、比較時に無視するCSV要素を要素名または要素インデックスで指定する。要素名を指定する場合は、CSVファイルの一行目にCSV要素名ヘッダ行が必要である。要素インデックスは、0から開始する。複数指定する場合は、カンマ区切りで指定する。<br>
*
* @param context コンテキスト
* @param actionId アクションID
* @param resource リソース
* @return 比較結果が等しい場合は、true
*/
public boolean execute(TestContext context, String actionId, Reader resource) throws Exception {
BufferedReader br = new BufferedReader(resource);
File srcFile = null;
File dstFile = null;
int[] ignoreIndexes = null;
String[] ignoreNames = null;
try {
final String srcFilePath = br.readLine();
if (srcFilePath == null) {
throw new Exception("Unexpected EOF on srcFilePath");
}
final String dstFilePath = br.readLine();
if (dstFilePath == null) {
throw new Exception("Unexpected EOF on dstFilePath");
}
srcFile = new File(srcFilePath);
if (!srcFile.exists()) {
srcFile = new File(context.getCurrentDirectory(), srcFilePath);
}
if (!srcFile.exists()) {
throw new Exception("File not found. srcFilePath=" + srcFilePath);
}
dstFile = new File(dstFilePath);
if (!dstFile.exists()) {
dstFile = new File(context.getCurrentDirectory(), dstFilePath);
}
if (!dstFile.exists()) {
return !isResultNGOnNotFoundDestFile;
}
String ignoreCSVElementsStr = br.readLine();
if (ignoreCSVElementsStr != null) {
final String[] ignoreCSVElements = CSVReader.toArray(ignoreCSVElementsStr, ',', '\\', '"', "null", "#", false, false, true, false);
if (ignoreCSVElements != null && ignoreCSVElements.length != 0) {
try {
ignoreIndexes = new int[ignoreCSVElements.length];
for (int i = 0; i < ignoreCSVElements.length; i++) {
ignoreIndexes[i] = Integer.parseInt(ignoreCSVElements[i]);
}
} catch (NumberFormatException e) {
ignoreNames = ignoreCSVElements;
ignoreIndexes = null;
}
}
}
} finally {
br.close();
br = null;
}
InputStreamReader srcisr = null;
InputStreamReader dstisr = null;
CSVReader srccsvr = null;
CSVReader dstcsvr = null;
OutputStreamWriter srcosw = null;
OutputStreamWriter dstosw = null;
CSVWriter srccsvw = null;
CSVWriter dstcsvw = null;
boolean result = true;
try {
srcisr = fileEncoding == null ? new InputStreamReader(new FileInputStream(srcFile)) : new InputStreamReader(new FileInputStream(srcFile), fileEncoding);
dstisr = fileEncoding == null ? new InputStreamReader(new FileInputStream(dstFile)) : new InputStreamReader(new FileInputStream(dstFile), fileEncoding);
srccsvr = csvReader == null ? new CSVReader() : csvReader.cloneReader();
dstcsvr = csvReader == null ? new CSVReader() : csvReader.cloneReader();
srccsvr.setReader(srcisr);
dstcsvr.setReader(dstisr);
if (isOutputFileAfterEdit) {
File editSrcFile = new File(srcFile.getPath() + fileAfterEditExtention);
File editDstFile = new File(dstFile.getPath() + fileAfterEditExtention);
srcosw = fileEncoding == null ? new OutputStreamWriter(new FileOutputStream(editSrcFile)) : new OutputStreamWriter(new FileOutputStream(editSrcFile), fileEncoding);
dstosw = fileEncoding == null ? new OutputStreamWriter(new FileOutputStream(editDstFile)) : new OutputStreamWriter(new FileOutputStream(editDstFile), fileEncoding);
srccsvw = csvWriter == null ? new CSVWriter() : csvWriter.cloneWriter();
dstcsvw = csvWriter == null ? new CSVWriter() : csvWriter.cloneWriter();
srccsvw.setWriter(srcosw);
dstcsvw.setWriter(dstosw);
}
List srccsv = new ArrayList();
List dstcsv = new ArrayList();
boolean[] ignores = null;
if (ignoreNames != null && ignoreNames.length != 0) {
Set ignoreNameSet = new HashSet();
for (int i = 0; i < ignoreNames.length; i++) {
ignoreNameSet.add(ignoreNames[i]);
}
srccsv = srccsvr.readCSVLineList(srccsv);
if (srccsv != null && srccsv.size() != 0) {
ignores = new boolean[srccsv.size()];
for (int i = 0; i < srccsv.size(); i++) {
ignores[i] = ignoreNameSet.contains(srccsv.get(i));
}
}
if (isOutputFileAfterEdit) {
writeCSV(srccsvw, srccsv, ignores);
}
dstcsv = dstcsvr.readCSVLineList(dstcsv);
if (isOutputFileAfterEdit) {
writeCSV(dstcsvw, dstcsv, ignores);
}
if (!compareCSVList(srccsv, dstcsv, ignores)) {
return false;
}
} else if (ignoreIndexes != null && ignoreIndexes.length != 0) {
srccsv = srccsvr.readCSVLineList(srccsv);
if (srccsv != null && srccsv.size() != 0) {
ignores = new boolean[srccsv.size()];
for (int i = 0, imax = ignoreIndexes.length; i < imax; i++) {
if (ignores.length > ignoreIndexes[i]) {
ignores[ignoreIndexes[i]] = true;
}
}
}
if (isOutputFileAfterEdit) {
writeCSV(srccsvw, srccsv, ignores);
}
dstcsv = dstcsvr.readCSVLineList(dstcsv);
if (isOutputFileAfterEdit) {
writeCSV(dstcsvw, dstcsv, ignores);
}
if (!compareCSVList(srccsv, dstcsv, ignores)) {
return false;
}
}
do {
if (srccsv != null) {
srccsv = srccsvr.readCSVLineList(srccsv);
}
if (dstcsv != null) {
dstcsv = dstcsvr.readCSVLineList(dstcsv);
}
if (isOutputFileAfterEdit) {
writeCSV(srccsvw, srccsv, ignores);
writeCSV(dstcsvw, dstcsv, ignores);
}
result &= compareCSVList(srccsv, dstcsv, ignores);
} while (isOutputFileAfterEdit ? (srccsv != null || dstcsv != null) : result);
} finally {
if (srcisr != null) {
try {
srcisr.close();
} catch (IOException e) {
}
}
if (dstisr != null) {
try {
dstisr.close();
} catch (IOException e) {
}
}
if (srccsvr != null) {
try {
srccsvr.close();
} catch (IOException e) {
}
}
if (dstcsvr != null) {
try {
dstcsvr.close();
} catch (IOException e) {
}
}
if (isOutputFileAfterEdit) {
srccsvw.flush();
dstcsvw.flush();
}
if (srcosw != null) {
try {
srcosw.close();
} catch (IOException e) {
}
}
if (dstosw != null) {
try {
dstosw.close();
} catch (IOException e) {
}
}
if (srccsvw != null) {
try {
srccsvw.close();
} catch (IOException e) {
}
}
if (dstcsvw != null) {
try {
dstcsvw.close();
} catch (IOException e) {
}
}
}
return result;
}
use of jp.ossc.nimbus.io.CSVReader in project nimbus by nimbus-org.
the class VelocityTemplateEngineService method transform.
/**
* テンプレートファイルとデータファイルを読み込んで、変換を行い出力ファイルに書き出す。<p>
* テンプレートファイルは、Apache VelocityのVTL(Velocity Template Language)で記述する。<br>
* データファイルは、VTLで参照するオブジェクトを、2種類の記述方法を混在させて、複数記述できる。<br>
* 1つは、プロパティ形式で、"変数名=値"で指定する。複数指定する場合は、改行して記述する。<br>
* もう1つは、CSV形式で、1行目に変数名、2行目にプロパティ名、3行目以降に値を記述する。プロパティ名は、CSV形式で1行のみ記述する。値は、CSV形式で複数行記述できる。値の行の終端を示すには、空行を挿入する。この変数を参照すると、指定した値の行数分のListで、その要素には、プロパティ名と値が格納されたMapが格納されている。<br>
*
* @param tmplateFile テンプレートファイル
* @param dataFile データファイル
* @param outputFile 出力ファイル
* @param encoding 文字エンコーディング。テンプレートファイル、データファイルは、同じ文字エンコーディングである必要があり、出力ファイルも、この文字エンコーディングとなる。
* @exception Exception 変換に失敗した場合
*/
public void transform(File tmplateFile, File dataFile, File outputFile, String encoding) throws Exception {
if (dataFile == null) {
final FileInputStream fis = new FileInputStream(templateResourceDirectory == null ? tmplateFile : new File(templateResourceDirectory, tmplateFile.getPath()));
final FileOutputStream fos = new FileOutputStream(outputFile);
try {
byte[] buf = new byte[1024];
int len = 0;
while ((len = fis.read(buf)) != -1) {
fos.write(buf, 0, len);
}
} finally {
fis.close();
fos.close();
}
} else {
Template template = encoding == null ? engine.getTemplate(tmplateFile.getPath()) : engine.getTemplate(tmplateFile.getPath(), encoding);
Context context = new VelocityContext();
CSVReader reader = csvReader == null ? new CSVReader() : csvReader.cloneReader();
reader.setReader(encoding == null ? new FileReader(dataFile) : new InputStreamReader(new FileInputStream(dataFile), encoding));
try {
String line = null;
while ((line = reader.readLine()) != null) {
if (line.length() == 0) {
continue;
}
final int index = line.indexOf("=");
if (index == -1) {
String name = line;
String[] propNames = reader.readCSVLine();
List propValues = null;
List records = new ArrayList();
while ((propValues = reader.readCSVLineList(propValues)) != null && propValues.size() != 0) {
Map record = new HashMap();
for (int i = 0; i < propNames.length; i++) {
String value = replaceProperty((String) propValues.get(i));
record.put(propNames[i], value);
}
records.add(record);
}
context.put(name, records);
} else {
String value = replaceProperty(line.substring(index + 1));
context.put(line.substring(0, index), value);
}
}
} finally {
reader.close();
reader = null;
}
Writer writer = encoding == null ? new FileWriter(outputFile) : new OutputStreamWriter(new FileOutputStream(outputFile), encoding);
try {
template.merge(context, writer);
} finally {
writer.close();
writer = null;
}
}
}
Aggregations