package com.intuit.tank.harness.functions;
/*
* #%L
* Intuit Tank Agent (apiharness)
* %%
* Copyright (C) 2011 - 2015 Intuit Inc.
* %%
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
* #L%
*/
import java.util.Map;
import java.util.Random;
import java.util.Stack;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.intuit.tank.harness.test.data.Variables;
import com.intuit.tank.vm.common.TankConstants;
class GenericFunctions {
static Random rnd = new Random();
static Logger logger = LogManager.getLogger(GenericFunctions.class);
private static Map<Long, String[]> csvLineMap = new ConcurrentHashMap<Long, String[]>();
private static Map<String, String[]> fileLineMap = new ConcurrentHashMap<String, String[]>();
private static int lastSSN = -1;
/**
* Is this a valid Generic function request
*
* @param values
* The command
* @return TRUE if valid format; FALSE otherwise
*/
public static boolean isValid(String[] values) {
try {
if (values[2].equalsIgnoreCase("getcsv")) {
if (values[3] != "")
return true;
} else if (values[2].equalsIgnoreCase("getfiledata")) {
if (values[3] != "")
return true;
} else if (values[2].equalsIgnoreCase("getssn")) {
return true;
}
return false;
} catch (Exception ex) {
return false;
}
}
/**
* Process the date request
*
* @param values
* The command line
* @return The requested value; "" if there was an error
*/
public static String executeFunction(String[] values, Variables variables) {
try {
if (values[2].equalsIgnoreCase("getcsv")) {
return GenericFunctions.getCSVData(Integer.parseInt(values[3]));
} else if (values[2].equalsIgnoreCase("getfiledata")) {
return GenericFunctions.getCSVData(values, variables);
} else if (values[2].equalsIgnoreCase("getssn")) {
return GenericFunctions.getSsn(values[3]);
}
return "";
} catch (Exception ex) {
return "";
}
}
public static String getCSVData(int index) {
String ret = null;
String[] currentLine = csvLineMap.get(Thread.currentThread().getId());
if (currentLine == null || index >= currentLine.length || currentLine[index] == null) {
currentLine = CSVReader.getInstance(TankConstants.DEFAULT_CSV_FILE_NAME).getNextLine(false);
csvLineMap.put(Thread.currentThread().getId(), currentLine);
}
if (null == currentLine) {
logger.debug("Next line in CSV file is null; returning empty string...");
} else if (index < currentLine.length) {
logger.debug("Next item retrieved from csv file: " + currentLine[index]);
ret = currentLine[index];
currentLine[index] = null;
} else {
logger.debug("Next line in index file has " + currentLine.length + " elements; tried to retrieve index "
+ index);
}
return ret != null ? ret : "";
}
public static String getCSVData(String[] values, Variables variables) {
String ret = null;
int index = Integer.parseInt(values[values.length - 1]);
String file = values[3];
for (int i = 4; i < values.length - 1; i++) {
file += "." + values[i];
}
String[] currentLine = fileLineMap.get(Thread.currentThread().getId() + "-" + file);
if (currentLine == null || index >= currentLine.length || currentLine[index] == null) {
currentLine = CSVReader.getInstance(file).getNextLine(false);
fileLineMap.put(Thread.currentThread().getId() + "-" + file, currentLine);
}
if (null == currentLine) {
logger.debug("Next line in CSV file is null; returning empty string...");
} else if (index < currentLine.length) {
logger.debug("Next item retrieved from csv file: " + currentLine[index]);
ret = currentLine[index];
currentLine[index] = null;
} else {
logger.debug("Next line in index file has " + currentLine.length + " elements; tried to retrieve index "
+ index);
}
return ret != null ? ret : "";
}
/**
*
* @param startSsn
* @return
*/
public static String getSsn(String val) {
int ret = 0;
if (lastSSN < 0) {
int startSsn = 100000000;
if (NumberUtils.isDigits(val)) {
startSsn = Integer.parseInt(val);
}
lastSSN = startSsn;
}
Stack<Integer> stack = StringFunctions.getStack(lastSSN, 899999999, null, false);
do {
ret = stack.pop();
} while (!isValidSsn(ret));
String ssnString = Integer.toString(ret);
StringUtils.leftPad(ssnString, 9, '0');
ssnString = ssnString.substring(0, 3) + "-" + ssnString.substring(3, 5) + "-" + ssnString.substring(5, 9);
return ssnString;
}
private static boolean isValidSsn(int ssn) {
if (((ssn >= 1010001) && (ssn <= 699999999)) ||
((ssn >= 700010001) && (ssn <= 733999999)) ||
((ssn >= 750010001) && (ssn <= 763999999)) ||
((ssn >= 764010001) && (ssn <= 899999999))) {
return true;
}
return false;
}
}