/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.engine.target.resolver; import java.util.Collection; import java.util.Collections; import java.util.Map; import com.google.common.collect.Maps; import com.opengamma.OpenGammaRuntimeException; import com.opengamma.id.ExternalIdBundle; import com.opengamma.id.ObjectId; import com.opengamma.id.UniqueId; import com.opengamma.id.VersionCorrection; import com.opengamma.util.PoolExecutor; /** * Partial implementation of {@link IdentifierResolver}. */ public abstract class AbstractIdentifierResolver implements IdentifierResolver { public static Map<ExternalIdBundle, UniqueId> resolveExternalIdsMultiThread(final PoolExecutor executor, final IdentifierResolver resolver, final Collection<ExternalIdBundle> identifiers, final VersionCorrection versionCorrection) { final PoolExecutor.Service<Void> jobs = executor.createService(null); final Map<ExternalIdBundle, UniqueId> result = Maps.newHashMapWithExpectedSize(identifiers.size()); for (final ExternalIdBundle identifier : identifiers) { jobs.execute(new Runnable() { @Override public void run() { final UniqueId uid = resolver.resolveExternalId(identifier, versionCorrection); if (uid != null) { synchronized (result) { result.put(identifier, uid); } } } }); } try { jobs.join(); } catch (InterruptedException e) { throw new OpenGammaRuntimeException("Interrupted", e); } return result; } public static Map<ExternalIdBundle, UniqueId> resolveExternalIdsSingleThread(final IdentifierResolver resolver, final Collection<ExternalIdBundle> identifiers, final VersionCorrection versionCorrection) { final Map<ExternalIdBundle, UniqueId> result = Maps.newHashMapWithExpectedSize(identifiers.size()); for (final ExternalIdBundle identifier : identifiers) { final UniqueId uid = resolver.resolveExternalId(identifier, versionCorrection); if (uid != null) { result.put(identifier, uid); } } return result; } public static Map<ExternalIdBundle, UniqueId> resolveExternalIds(final IdentifierResolver resolver, final Collection<ExternalIdBundle> identifiers, final VersionCorrection versionCorrection) { if (identifiers.isEmpty()) { return Collections.emptyMap(); } else if (identifiers.size() == 1) { final ExternalIdBundle identifier = identifiers.iterator().next(); final UniqueId uid = resolver.resolveExternalId(identifier, versionCorrection); if (uid != null) { return Collections.singletonMap(identifier, uid); } else { return Collections.emptyMap(); } } final PoolExecutor executor = PoolExecutor.instance(); if (executor != null) { return resolveExternalIdsMultiThread(executor, resolver, identifiers, versionCorrection); } else { return resolveExternalIdsSingleThread(resolver, identifiers, versionCorrection); } } public static Map<ObjectId, UniqueId> resolveObjectIdsMultiThread(final PoolExecutor executor, final IdentifierResolver resolver, final Collection<ObjectId> identifiers, final VersionCorrection versionCorrection) { final PoolExecutor.Service<Void> jobs = executor.createService(null); final Map<ObjectId, UniqueId> result = Maps.newHashMapWithExpectedSize(identifiers.size()); for (final ObjectId identifier : identifiers) { jobs.execute(new Runnable() { @Override public void run() { final UniqueId uid = resolver.resolveObjectId(identifier, versionCorrection); if (uid != null) { synchronized (result) { result.put(identifier, uid); } } } }); } try { jobs.join(); } catch (InterruptedException e) { throw new OpenGammaRuntimeException("Interrupted", e); } return result; } public static Map<ObjectId, UniqueId> resolveObjectIdsSingleThread(final IdentifierResolver resolver, final Collection<ObjectId> identifiers, final VersionCorrection versionCorrection) { final Map<ObjectId, UniqueId> result = Maps.newHashMapWithExpectedSize(identifiers.size()); for (final ObjectId identifier : identifiers) { final UniqueId uid = resolver.resolveObjectId(identifier, versionCorrection); if (uid != null) { result.put(identifier, uid); } } return result; } public static Map<ObjectId, UniqueId> resolveObjectIds(final IdentifierResolver resolver, final Collection<ObjectId> identifiers, final VersionCorrection versionCorrection) { if (identifiers.isEmpty()) { return Collections.emptyMap(); } else if (identifiers.size() == 1) { final ObjectId identifier = identifiers.iterator().next(); final UniqueId uid = resolver.resolveObjectId(identifier, versionCorrection); if (uid != null) { return Collections.singletonMap(identifier, uid); } else { return Collections.emptyMap(); } } final PoolExecutor executor = PoolExecutor.instance(); if (executor != null) { return resolveObjectIdsMultiThread(executor, resolver, identifiers, versionCorrection); } else { return resolveObjectIdsSingleThread(resolver, identifiers, versionCorrection); } } // IdentifierResolver @Override public Map<ExternalIdBundle, UniqueId> resolveExternalIds(Collection<ExternalIdBundle> identifiers, VersionCorrection versionCorrection) { return resolveExternalIds(this, identifiers, versionCorrection); } @Override public Map<ObjectId, UniqueId> resolveObjectIds(Collection<ObjectId> identifiers, VersionCorrection versionCorrection) { return resolveObjectIds(this, identifiers, versionCorrection); } }