/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.generator; import java.util.HashMap; import java.util.Map; import org.joda.beans.JodaBeanUtils; import com.opengamma.id.ExternalId; import com.opengamma.id.ExternalIdBundle; import com.opengamma.id.ExternalScheme; import com.opengamma.master.security.ManageableSecurity; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.GUIDGenerator; /** * Service for storing securities and returning identifiers to reference them from portfolios. */ public abstract class SecurityPersister { private final Map<ManageableSecurity, ExternalIdBundle> _securities = new HashMap<ManageableSecurity, ExternalIdBundle>(); private final ExternalScheme _scheme; public SecurityPersister(final ExternalScheme scheme) { _scheme = scheme; } public SecurityPersister() { this(ExternalScheme.of("RANDOM_SECURITY_GENERATOR")); } protected abstract void storeSecurityImpl(ManageableSecurity security); public ExternalScheme getScheme() { return _scheme; } protected String createGuid() { return GUIDGenerator.generate().toString(); } /** * Produces an {@link ExternalIdBundle} referencing the security. * * @param security the security to store, not null * @return the identifier bundle, not null */ public final ExternalIdBundle storeSecurity(final ManageableSecurity security) { ArgumentChecker.notNull(security, "security"); final ManageableSecurity clone = JodaBeanUtils.clone(security); clone.setUniqueId(null); clone.setExternalIdBundle(clone.getExternalIdBundle().withoutScheme(getScheme())); ExternalIdBundle identifiers = _securities.get(clone); if (identifiers != null) { return identifiers; } final ExternalId guid = ExternalId.of(getScheme(), createGuid()); identifiers = security.getExternalIdBundle().withExternalId(guid); security.setExternalIdBundle(identifiers); _securities.put(clone, identifiers); storeSecurityImpl(security); return identifiers; } }