/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.strata.product.deposit.type; import java.util.Locale; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import com.opengamma.strata.basics.index.IborIndex; import com.opengamma.strata.collect.named.NamedLookup; /** * Allows conventions to be created dynamically from an index name. */ final class IborFixingDepositConventionLookup implements NamedLookup<IborFixingDepositConvention> { /** * The singleton instance of the lookup. */ public static final IborFixingDepositConventionLookup INSTANCE = new IborFixingDepositConventionLookup(); /** * The cache by name. */ private static final ConcurrentMap<String, IborFixingDepositConvention> BY_NAME = new ConcurrentHashMap<>(); /** * Restricted constructor. */ private IborFixingDepositConventionLookup() { } //------------------------------------------------------------------------- @Override public IborFixingDepositConvention lookup(String name) { IborFixingDepositConvention value = BY_NAME.get(name); if (value == null) { IborFixingDepositConvention created = createByName(name); if (created != null) { String correctName = created.getName(); value = BY_NAME.computeIfAbsent(correctName, k -> created); BY_NAME.putIfAbsent(correctName.toUpperCase(Locale.ENGLISH), value); } } return value; } @Override public Map<String, IborFixingDepositConvention> lookupAll() { return BY_NAME; } private static IborFixingDepositConvention createByName(String name) { return IborIndex.extendedEnum().find(name) .map(index -> ImmutableIborFixingDepositConvention.of(index)) .orElse(null); } }