/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.web.spring; import com.opengamma.engine.function.CompiledFunctionDefinition; import com.opengamma.engine.function.CompiledFunctionService; import com.opengamma.engine.function.resolver.DefaultFunctionResolver; import com.opengamma.engine.function.resolver.FunctionPriority; import com.opengamma.engine.function.resolver.FunctionResolver; import com.opengamma.financial.analytics.FilteringSummingFunction; import com.opengamma.financial.currency.CurrencyConversionFunction; import com.opengamma.financial.currency.CurrencyMatrixLookupFunction; import com.opengamma.financial.currency.CurrencySeriesConversionFunction; import com.opengamma.financial.property.DefaultPropertyFunction; import com.opengamma.util.SingletonFactoryBean; /** * Creates a FunctionResolver for the demo, prioritizing the functions */ @SuppressWarnings("deprecation") public class DemoFunctionResolverFactoryBean extends SingletonFactoryBean<FunctionResolver> { private CompiledFunctionService _functionCompilationService; public void setFunctionCompilationService(final CompiledFunctionService functionCompilationService) { _functionCompilationService = functionCompilationService; } public CompiledFunctionService getFunctionCompilationService() { return _functionCompilationService; } /** * A default set of function priorities. */ public static class Priority implements FunctionPriority { @Override public int getPriority(final CompiledFunctionDefinition function) { if (function instanceof CurrencyConversionFunction || function instanceof CurrencySeriesConversionFunction) { return Integer.MIN_VALUE; } if (function instanceof DefaultPropertyFunction) { final DefaultPropertyFunction defaultPropertyFunction = (DefaultPropertyFunction) function; if (defaultPropertyFunction.isPermitWithout()) { // Place below the filtering summing function priority, or the filter may never be applied. return -2 + defaultPropertyFunction.getPriority().getPriorityAdjust() - DefaultPropertyFunction.PriorityClass.MAX_ADJUST; } else { // All other currency injections are important; e.g. the currency constraint can't be omitted for some functions return Integer.MAX_VALUE + defaultPropertyFunction.getPriority().getPriorityAdjust() - DefaultPropertyFunction.PriorityClass.MAX_ADJUST; } } if (function instanceof FilteringSummingFunction) { // Anything that filters should be lower priority than a conventional summing operation that can apply // to all of its inputs return -1; } if (function instanceof CurrencyMatrixLookupFunction) { final CurrencyMatrixLookupFunction currencyMatrixLookupFunction = (CurrencyMatrixLookupFunction) function; return currencyMatrixLookupFunction.getPriority(); } return 0; } } public static FunctionResolver createFunctionResolver(final CompiledFunctionService functionCompilationSerice) { return new DefaultFunctionResolver(functionCompilationSerice, new Priority()); } @Override protected FunctionResolver createObject() { return createFunctionResolver(getFunctionCompilationService()); } }