package net.iponweb.disthene.reader.graphite.functions.registry; import net.iponweb.disthene.reader.exceptions.InvalidFunctionException; import net.iponweb.disthene.reader.graphite.evaluation.EvaluationContext; import net.iponweb.disthene.reader.graphite.functions.HoltWintersConfidenceAreaFunction; import net.iponweb.disthene.reader.graphite.functions.TimeShiftFunction; import net.iponweb.disthene.reader.graphite.functions.*; import java.lang.reflect.Constructor; import java.util.HashMap; import java.util.Map; /** * @author Andrei Ivanov */ public class FunctionRegistry { private static final Map<String, Class<? extends DistheneFunction>> registry = new HashMap<>(); static { registry.put("absolute", AbsoluteFunction.class); registry.put("aggregateLine", AggregateLineFunction.class); registry.put("alias", AliasFunction.class); registry.put("aliasByNode", AliasByNodeFunction.class); registry.put("aliasByMetric", AliasByMetricFunction.class); registry.put("aliasSub", AliasSubFunction.class); registry.put("alpha", AlphaFunction.class); registry.put("areaBetween", AreaBetweenFunction.class); registry.put("asPercent", AsPercentFunction.class); registry.put("averageOutsidePercentile", AverageOutsidePercentileFunction.class); registry.put("pct", AsPercentFunction.class); registry.put("averageAbove", AverageAboveFunction.class); registry.put("averageBelow", AverageBelowFunction.class); registry.put("averageSeries", AverageSeriesFunction.class); registry.put("averageSeriesWithWildcards", AverageSeriesWithWildcardsFunction.class); registry.put("avg", AverageSeriesFunction.class); registry.put("cactiStyle", CactiStyleFunction.class); registry.put("color", ColorFunction.class); registry.put("constantLine", ConstantLineFunction.class); registry.put("countSeries", CountSeriesFunction.class); registry.put("currentAbove", CurrentAboveFunction.class); registry.put("currentBelow", CurrentBelowFunction.class); registry.put("dashed", DashedFunction.class); registry.put("derivative", DerivativeFunction.class); registry.put("diffSeries", DiffSeriesFunction.class); registry.put("divideSeries", DivideSeriesFunction.class); registry.put("drawAsInfinite", DrawAsInfiniteFunction.class); registry.put("grep", GrepFunction.class); registry.put("group", GroupFunction.class); registry.put("exclude", ExcludeFunction.class); registry.put("highestAverage", HighestAverageFunction.class); registry.put("highestCurrent", HighestCurrentFunction.class); registry.put("highestMax", HighestMaxFunction.class); registry.put("hitcount", HitcountFunction.class); registry.put("holtWintersAberration", HoltWintersAberrationFunction.class); registry.put("holtWintersConfidenceArea", HoltWintersConfidenceAreaFunction.class); registry.put("holtWintersConfidenceBands", HoltWintersConfidenceBandsFunction.class); registry.put("holtWintersForecast", HoltWintersForecastFunction.class); registry.put("integral", IntegralFunction.class); registry.put("invert", InvertFunction.class); registry.put("isNonNull", IsNonNullFunction.class); registry.put("keepLastValue", KeepLastValueFunction.class); registry.put("legendValue", LegendValueFunction.class); registry.put("limit", LimitFunction.class); registry.put("lineWidth", LineWidthFunction.class); registry.put("logarithm", LogarithmFunction.class); registry.put("log", LogarithmFunction.class); registry.put("lowestAverage", LowestAverageFunction.class); registry.put("lowestCurrent", LowestCurrentFunction.class); registry.put("maximumAbove", MaximumAboveFunction.class); registry.put("maximumBelow", MaximumBelowFunction.class); registry.put("minimumAbove", MinimumAboveFunction.class); registry.put("minimumBelow", MinimumBelowFunction.class); registry.put("maxSeries", MaxSeriesFunction.class); registry.put("minSeries", MinSeriesFunction.class); registry.put("mostDeviant", MostDeviantFunction.class); registry.put("movingAverage", MovingAverageFunction.class); registry.put("movingMedian", MovingMedianFunction.class); registry.put("multiplySeries", MultiplySeriesFunction.class); registry.put("multiplySeriesWithWildcards", MultiplySeriesWithWildcardsFunction.class); registry.put("nonNegativeDerivative", NonNegativeDerivativeFunction.class); registry.put("nPercentile", NPercentileFunction.class); registry.put("offset", OffsetFunction.class); registry.put("offsetToZero", OffsetToZeroFunction.class); registry.put("percentileOfSeries", PercentileOfSeriesFunction.class); registry.put("perSecond", PerSecondFunction.class); registry.put("pow", PowFunction.class); registry.put("rangeOfSeries", RangeOfSeriesFunction.class); registry.put("removeAbovePercentile", RemoveAbovePercentileFunction.class); registry.put("removeAboveValue", RemoveAboveValueFunction.class); registry.put("removeBelowPercentile", RemoveBelowPercentileFunction.class); registry.put("removeBelowValue", RemoveBelowValueFunction.class); registry.put("scale", ScaleFunction.class); registry.put("scaleToSeconds", ScaleToSecondsFunction.class); registry.put("secondYAxis", SecondYAxisFunction.class); registry.put("sortByMaxima", SortByMaximaFunction.class); registry.put("sortByMinima", SortByMinimaFunction.class); registry.put("sortByName", SortByNameFunction.class); registry.put("sortByTotal", SortByTotalFunction.class); registry.put("squareRoot", SquareRootFunction.class); registry.put("stacked", StackedFunction.class); registry.put("stdev", StdevFunction.class); registry.put("stddevSeries", StddevSeriesFunction.class); registry.put("sumSeries", SumSeriesFunction.class); registry.put("sumSeriesWithWildcards", SumSeriesWithWildcardsFunction.class); registry.put("sum", SumSeriesFunction.class); registry.put("summarize", SummarizeFunction.class); registry.put("threshold", ThresholdFunction.class); registry.put("timeShift", TimeShiftFunction.class); registry.put("timeStack", TimeStackFunction.class); registry.put("transformNull", TransformNullFunction.class); registry.put("useSeriesAbove", UseSeriesAboveFunction.class); } //todo: from & to parameters are only because of constantLine function. sort this out? public static DistheneFunction getFunction(EvaluationContext context, String name, long from, long to) throws InvalidFunctionException { if (registry.get(name) == null) { throw new InvalidFunctionException("Unknown function: " + name); } try { Constructor<DistheneFunction> constructor = (Constructor<DistheneFunction>) registry.get(name).getConstructor(String.class); DistheneFunction function = constructor.newInstance(name); function.setFrom(from); function.setTo(to); function.setContext(context); return function; } catch (Exception e) { throw new InvalidFunctionException("Something went wrong constructing " + name + " function: " + e.getMessage()); } } }