/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.engine.function; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import org.threeten.bp.Instant; import com.opengamma.util.PoolExecutor; /** * Defers the compilation of any functions until the definitions are requested. This may be useful for remote calculation nodes to only compile functions that a node needs. It should not be used by a * view processor for dependency graph compilation as not all function definitions may be available. */ public class LazyFunctionRepositoryCompiler extends CachingFunctionRepositoryCompiler { private static class Repository extends InMemoryCompiledFunctionRepository { private final ConcurrentMap<String, FunctionDefinition> _uncompiled = new ConcurrentHashMap<String, FunctionDefinition>(); private final Instant _atInstant; public Repository(final FunctionCompilationContext functionCompilationContext, final Instant atInstant) { super(functionCompilationContext); _atInstant = atInstant; } @Override public CompiledFunctionDefinition getDefinition(final String uniqueId) { FunctionDefinition function = _uncompiled.get(uniqueId); if (function != null) { synchronized (this) { function = _uncompiled.get(uniqueId); if (function != null) { final CompiledFunctionDefinition compiled = function.compile(getCompilationContext(), _atInstant); addFunction(compiled); _uncompiled.remove(uniqueId); } } } return super.getDefinition(uniqueId); } public void addUncompiledFunction(final FunctionDefinition function) { _uncompiled.put(function.getUniqueId(), function); } @Override public Instant getEarliestInvocationTime() { return _uncompiled.isEmpty() ? super.getEarliestInvocationTime() : _atInstant; } @Override public Instant getLatestInvocationTime() { return _uncompiled.isEmpty() ? super.getLatestInvocationTime() : _atInstant; } } @Override protected InMemoryCompiledFunctionRepository compile(final FunctionCompilationContext context, final FunctionRepository functions, final Instant atInstant, final InMemoryCompiledFunctionRepository before, final InMemoryCompiledFunctionRepository after, final PoolExecutor executorService) { final Repository compiled = new Repository(context, atInstant); for (final FunctionDefinition function : functions.getAllFunctions()) { if (addFunctionFromCachedRepository(before, after, compiled, function, atInstant)) { continue; } compiled.addUncompiledFunction(function); } return compiled; } }