/**
* Copyright (C) 2010-14 diirt developers. See COPYRIGHT.TXT
* All rights reserved. Use is subject to license terms. See LICENSE.TXT
*/
package org.diirt.datasource.formula;
import java.util.Arrays;
import java.util.List;
import org.diirt.datasource.util.NullUtils;
import org.diirt.vtype.VBoolean;
import org.diirt.vtype.ValueFactory;
import org.diirt.vtype.ValueUtil;
/**
* Abstract class for formula functions that take two {@link VBoolean}s as arguments
* and return a {@link VBoolean}.
* <p>
* This class takes care of:
* <ul>
* <li>extracting boolean value from {@code VBoolean}</li>
* <li>null handling - returns null if one argument is null</li>
* <li>alarm handling - returns highest alarm</li>
* <li>time handling - returns latest time, or now if no time is available</li>
* <li>display handling - returns display none</li>
* </ul>
*
* @author carcassi
*/
public abstract class AbstractVBooleanVBooleanToVBooleanFormulaFunction implements FormulaFunction {
private final String name;
private final String description;
private final List<Class<?>> argumentTypes;
private final List<String> argumentNames;
/**
* Creates a new function.
*
* @param name function name; can't be null
* @param description function description; can't be null
* @param arg1Name first argument name; can't be null
* @param arg2Name second argument name; can't be null
*/
public AbstractVBooleanVBooleanToVBooleanFormulaFunction(String name, String description, String arg1Name, String arg2Name) {
// Validate parameters
if (name == null) {
throw new NullPointerException("Function name can't be null");
}
if (description == null) {
throw new NullPointerException("Function description can't be null");
}
if (arg1Name == null) {
throw new NullPointerException("First argument name can't be null");
}
if (arg2Name == null) {
throw new NullPointerException("Second argument name can't be null");
}
this.name = name;
this.description = description;
this.argumentTypes = Arrays.<Class<?>>asList(VBoolean.class, VBoolean.class);
this.argumentNames = Arrays.asList(arg1Name, arg2Name);
}
@Override
public String getName() {
return name;
}
@Override
public String getDescription() {
return description;
}
@Override
public boolean isPure() {
return true;
}
@Override
public boolean isVarArgs() {
return false;
}
@Override
public List<Class<?>> getArgumentTypes() {
return argumentTypes;
}
@Override
public List<String> getArgumentNames() {
return argumentNames;
}
@Override
public Class<?> getReturnType() {
return VBoolean.class;
}
@Override
public Object calculate(List<Object> args) {
if (NullUtils.containsNull(args)) {
return null;
}
VBoolean arg1 = (VBoolean) args.get(0);
VBoolean arg2 = (VBoolean) args.get(1);
return ValueFactory.newVBoolean(
calculate(arg1.getValue(), arg2.getValue()),
ValueUtil.highestSeverityOf(args, false),
ValueUtil.latestValidTimeOrNowOf(args));
}
/**
* Calculates the result based on the two arguments. This is the only
* method one has to implement.
*
* @param arg1 the first argument
* @param arg2 the second argument
* @return the result
*/
public abstract boolean calculate(boolean arg1, boolean arg2);
}