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.Arrays;
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.logging.LogUtil;
import com.intuit.tank.harness.test.data.Variables;
import com.intuit.tank.vm.common.util.ValidationUtil;
/**
*
* FunctionHandler handles functions in strings. Functions start with #function and use dot notation to pass parameters.
* The first parameter is the class of function. Valid values are:
* <ul>
* <li>date - @see DateFunctions</li>
* <li>monetary - @see MonetaryFunctions</li>
* <li>numeric - @see NumericFunctions</li>
* <li>generic - @see GenericFunctions</li>
* <li>string - @see StringFunctions</li>
* <li>datatype - @see DataTypeFunctions</li>
* <li>tax - @see TaxFunctions</li>
* </ul>
*
* e.g. #function.date...
*
* @author dangleton
*
*/
public class FunctionHandler {
/**
*
*/
private static final String ESCAPE_DELIM = "-dot-";
static final String delimeters = "[.]";
static private Logger logger = LogManager.getLogger(FunctionHandler.class);
/**
* Is the string a valid function
*
* @param function
* The function string to evaluate
* @return TRUE if that is an actual function; FALSE otherwise
*/
static public boolean validFunction(String function) {
try {
String[] values = getValues(function);
if (values[0].equalsIgnoreCase(ValidationUtil.functionIdentifier)) {
if (values[1].equalsIgnoreCase("date"))
return DateFunctions.isValid(values);
else if (values[1].equalsIgnoreCase("monetary"))
return MonetaryFunctions.isValid(values);
else if (values[1].equalsIgnoreCase("numeric"))
return NumericFunctions.isValid(values);
else if (values[1].equalsIgnoreCase("generic"))
return GenericFunctions.isValid(values);
else if (values[1].equalsIgnoreCase("string"))
return StringFunctions.isValid(values);
else if (values[1].equalsIgnoreCase("datatype"))
return DataTypeFunctions.isValid(values);
else if (values[1].equalsIgnoreCase("tax"))
return TaxFunctions.isValid(values);
else
return false;
} else
return false;
} catch (Exception ex) {
logger.error(LogUtil.getLogMessage(ex.toString()), ex);
return false;
}
}
/**
* @param function
* @return
*/
private static String[] getValues(String function) {
String[] split = function.split(delimeters);
for (int i = 0; i < split.length; i++) {
split[i] = cleanArg(split[i]);
}
if (split.length < 10) {
split = Arrays.<String> copyOf(split, 10);
}
return split;
}
/**
* Execute a function
*
* @param function
* The function string to execute
* @return The response value from the function
*/
static public String executeFunction(String function, Variables variables) {
return executeFunction(function, variables, "");
}
/**
* Execute a function
*
* @param function
* The function string to execute
* @return The response value from the function
*/
static public String executeFunction(String function, Variables variables, String addtlString) {
try {
if (!FunctionHandler.validFunction(function))
return null;
String[] values = getValues(function);
substituteVariables(values, variables);
if (values[1].equalsIgnoreCase("date"))
return DateFunctions.executeFunction(values);
else if (values[1].equalsIgnoreCase("monetary"))
return MonetaryFunctions.executeFunction(values);
else if (values[1].equalsIgnoreCase("numeric"))
return NumericFunctions.executeFunction(values, variables);
else if (values[1].equalsIgnoreCase("string"))
return StringFunctions.executeFunction(values, variables, addtlString);
else if (values[1].equalsIgnoreCase("generic"))
return GenericFunctions.executeFunction(values, variables);
else if (values[1].equalsIgnoreCase("datatype"))
return DataTypeFunctions.executeFunction(values);
else if (values[1].equalsIgnoreCase("tax"))
return TaxFunctions.executeFunction(values, variables);
return null;
} catch (Exception ex) {
logger.error(LogUtil.getLogMessage(ex.toString()), ex);
return null;
}
}
private static final String cleanArg(String arg) {
if (!StringUtils.isEmpty(arg)) {
arg = arg.replaceAll(FunctionHandler.ESCAPE_DELIM, ".");
}
return arg;
}
/**
* @param values
* @param variables
*/
private static void substituteVariables(String[] values, Variables variables) {
for (int i = 0; i < values.length; i++) {
if (ValidationUtil.isVariable(values[i])) {
values[i] = variables.getVariable(values[i]);
}
}
}
/**
*
* @param o
* @return
*/
public static final int getInt(Object o) {
return getNumber(o).intValue();
}
public static final double getDouble(Object o) {
return getNumber(o).doubleValue();
}
public static final long getLong(Object o) {
return getNumber(o).longValue();
}
public static final Number getNumber(Object o) {
Number ret = null;
if (o instanceof Number) {
ret = ((Number) o);
} else {
ret = NumberUtils.createNumber(o.toString());
}
return ret;
}
}