/* * Copyright 2005-2010 Ignis Software Tools Ltd. All rights reserved. */ package jsystem.extensions.analyzers.csv; import java.text.DecimalFormat; import jsystem.utils.StringUtils; /** * The class checks what is the ratio between 2 given columns * * @author lior.haklay * */ public class CheckRatioAnalyzer extends BasicCsvAnalyzer { private double expectedRatio; private double actualRatio = -1; private double deviation = 0.0; private double totalColumnA = 0; private double totalColumnB = 0; private int ratioColumnToAnalyzeIndex = 2; /** * @param expectedRatio * @param deviation * @param columnsToAnalyze */ public CheckRatioAnalyzer(double expectedRatio, double deviation, String[] columnsToAnalyze) { super(columnsToAnalyze); this.expectedRatio = expectedRatio; this.deviation = deviation; } /* * (non-Javadoc) * * @see com.aqua.csv.BasicCsvAnalyzer#process(java.lang.String[]) */ public void process(String[] toAnalyze) throws Exception { totalColumnA += Double.parseDouble(toAnalyze[getColumnToAnalyzeIndex()]); totalColumnB += Double.parseDouble(toAnalyze[getRatioColumnToAnalyzeIndex()]); } /* * (non-Javadoc) * * @see jsystem.framework.analyzer.AnalyzerParameter#analyze() */ public void analyze() { fileToAnalyze = (String) testAgainst; String[] colsToAn = getColumnsToAnalyze(); StringBuffer buf = new StringBuffer(); String columnToAnalyzeNameColumnA = colsToAn[getColumnToAnalyzeIndex()]; String columnToAnalyzeNameColumnB = colsToAn[getRatioColumnToAnalyzeIndex()]; try { loadFile(); actualRatio = (totalColumnB / totalColumnA) * 100; // Converting the ratio to 5 digits after the . DecimalFormat df = new DecimalFormat("0.000000"); buf.append("Analyzed Column A : " + columnToAnalyzeNameColumnA); buf.append("\n"); buf.append("Analyzed Column B : " + columnToAnalyzeNameColumnB); buf.append("\n"); buf.append("Expected Ratio: " + expectedRatio); buf.append("\n"); buf.append("Actual Ratio: " + actualRatio); buf.append("\n"); buf.append("Deviation: " + deviation); if (actualRatio - deviation > expectedRatio || actualRatio + deviation < expectedRatio) { title = "\nFail: Ratio value for " + columnToAnalyzeNameColumnB + "\nAND\n" + columnToAnalyzeNameColumnA + ": " + df.format(actualRatio) + "%"; status = false; } else { title = "\nSuccess: Ratio value for " + columnToAnalyzeNameColumnB + "\nAND\n " + columnToAnalyzeNameColumnA + ": " + df.format(actualRatio) + "%"; status = true; } message = buf.toString(); } catch (Exception e) { title = "Fail to process File: " + fileToAnalyze + "...Please check columns to analyze names"; status = false; message = StringUtils.getStackTrace(e); } } /** * @return the actual actual ratio without an analyzer */ public double getActualRatio() { return actualRatio; } // ------- Setters & getters public int getRatioColumnToAnalyzeIndex() { return ratioColumnToAnalyzeIndex; } public void setRatioColumnToAnalyzeIndex(int ratioColumnToAnalyzeIndex) { this.ratioColumnToAnalyzeIndex = ratioColumnToAnalyzeIndex; } }