/** * 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.vtype.VNumber; import org.diirt.vtype.ValueFactory; /** * Abstract class for formula functions that take one {@link VNumber} as argument * and return a {@code VNumber}. * <p> * This class takes care of: * <ul> * <li>extracting double value from {@code VNumber}</li> * <li>null handling - returns null if the argument is null</li> * <li>alarm handling - returns the argument alarm</li> * <li>time handling - returns the argument time</li> * <li>display handling - returns display none</li> * </ul> * * @author shroffk */ public abstract class AbstractVNumberToVNumberFormulaFunction 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 argName the argument name; can't be null */ public AbstractVNumberToVNumberFormulaFunction(String name, String description, String argName) { // 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 (argName == null) { throw new NullPointerException("Argument name can't be null"); } this.name = name; this.description = description; this.argumentTypes = Arrays.<Class<?>>asList(VNumber.class); this.argumentNames = Arrays.asList(argName); } @Override public final String getName() { return name; } @Override public final String getDescription() { return description; } @Override public final boolean isPure() { return true; } @Override public final boolean isVarArgs() { return false; } @Override public final List<Class<?>> getArgumentTypes() { return argumentTypes; } @Override public final List<String> getArgumentNames() { return argumentNames; } @Override public final Class<?> getReturnType() { return VNumber.class; } @Override public final Object calculate(List<Object> args) { VNumber arg = (VNumber) args.get(0); if (arg == null) { return null; } return ValueFactory.newVDouble(calculate(arg.getValue().doubleValue()), arg, arg, ValueFactory.displayNone()); } /** * Calculates the result based on the arguments. This is the only * method one has to implement. * * @param arg the argument * @return the result */ public abstract double calculate(double arg); }