/*******************************************************************************
* Copyright (c) 2014 Open Door Logistics (www.opendoorlogistics.com)
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at http://www.gnu.org/licenses/lgpl.txt
******************************************************************************/
package com.opendoorlogistics.core.formulae.definitions;
import java.util.TreeSet;
import com.opendoorlogistics.api.ExecutionReport;
import com.opendoorlogistics.core.formulae.Function;
import com.opendoorlogistics.core.formulae.FunctionUtils;
public final class ValidatedArguments{
final private FunctionDefinition dfn;
final private Function []args;
public ValidatedArguments(FunctionDefinition dfn, Function[] args) {
this.dfn = dfn;
this.args = args;
}
public Function get(String argumentName){
int indx = dfn.indexOf(argumentName);
if(indx!=-1){
return args[indx];
}
return null;
}
public String getConstantString(String argumentName){
return FunctionUtils.getConstantString(args[dfn.indexOf(argumentName)]);
}
public boolean hasArgument(String argumentName){
return dfn.indexOf(argumentName)!=-1;
}
public static ValidatedArguments validateArguments(FunctionDefinition dfn,ExecutionReport result, Function...providedArgs){
if(providedArgs.length!=dfn.nbArgs()){
if(result!=null){
result.setFailed("Incorrect number of parameters into function " + dfn.getName());
}
return null;
}
for(int i =0 ; i< dfn.nbArgs(); i++){
if(providedArgs[i]==null){
if(result!=null){
result.setFailed("Null argument passed into formula " + dfn.getName()+"." );
}
return null;
}
if(dfn.getArg(i).isConstantString() && FunctionUtils.getConstantString(providedArgs[i])==null){
if(result!=null){
result.setFailed("Formula " + dfn.getName() + " expected a constant string for argument " + (i+1) + ", instead found " + providedArgs[i].toString());
}
return null;
}
}
return new ValidatedArguments(dfn,providedArgs);
}
public static ValidatedArguments matchAndValidate(Iterable<FunctionDefinition> dfns,ExecutionReport result, Function...providedArgs){
// find the first with correct number of args
TreeSet<String> names = new TreeSet<>();
for(FunctionDefinition dfn : dfns){
names.add(dfn.getName());
if(dfn.nbArgs() == providedArgs.length){
return validateArguments(dfn, result, providedArgs);
}
}
if(result!=null){
result.setFailed("Incorrect number of arguments into function " + names.first() + ".");
}
return null;
}
}