/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.core; import java.util.List; import org.apache.commons.lang.ObjectUtils; import org.fudgemsg.FudgeContext; import org.fudgemsg.FudgeField; import org.fudgemsg.MutableFudgeMsg; import org.threeten.bp.Instant; import com.google.common.collect.Lists; import com.opengamma.OpenGammaRuntimeException; import com.opengamma.id.UniqueId; import com.opengamma.util.ArgumentChecker; /** * Given a Fudge message of a particular form, determine the set of Unique IDs * that correspond to a particular version correction. */ public final class FudgeUniqueIdResolutionTools { private FudgeUniqueIdResolutionTools() { } public static void appendNewVersion( MutableFudgeMsg message, FudgeContext fudgeContext, UniqueId newVersion, Instant effectiveInstantFrom, Instant effectiveInstantTo, Instant correctionInstantFrom, Instant correctionInstantTo) { // First, modify the previous version if required. // Can be changed to be index based for performance if necessary. List<FudgeField> fields = message.getAllFields(); fields = Lists.reverse(fields); boolean foundMatchingOid = false; boolean mutatedOlderOid = false; for (FudgeField field : fields) { MutableFudgeMsg record = (MutableFudgeMsg) field.getValue(); UniqueId recordId = UniqueId.parse(record.getString("uid")); if (!recordId.getObjectId().equals(newVersion.getObjectId())) { // No need to modify. continue; } foundMatchingOid = true; Instant recordEffectiveFrom = record.getFieldValue(Instant.class, record.getByName("eff-from")); Instant recordEffectiveTo = record.getFieldValue(Instant.class, record.getByName("eff-to")); //Instant recordCorrectionFrom = record.getFieldValue(Instant.class, record.getByName("cor-from")); Instant recordCorrectionTo = record.getFieldValue(Instant.class, record.getByName("cor-to")); if (ObjectUtils.equals(recordEffectiveFrom, effectiveInstantFrom)) { // The two EffectiveTo better match as well. ArgumentChecker.isTrue(ObjectUtils.equals(recordEffectiveTo, effectiveInstantTo), "Record matches effectiveFrom but not effectiveTo."); // Must be a new version on the correction. if (recordCorrectionTo != null) { continue; } record.remove("cor-to"); record.add("cor-to", correctionInstantFrom); mutatedOlderOid = true; } else if (recordEffectiveFrom.isBefore(effectiveInstantFrom) && (recordEffectiveTo == null)) { record.add("eff-to", effectiveInstantFrom); mutatedOlderOid = true; } } if (foundMatchingOid && !mutatedOlderOid) { throw new OpenGammaRuntimeException("Algorithm failure: found existing OID but did not mutate any."); } MutableFudgeMsg record = fudgeContext.newMessage(); record.add("uid", newVersion.toString()); record.add("eff-from", effectiveInstantFrom); if (effectiveInstantTo != null) { record.add("eff-to", effectiveInstantTo); } record.add("corr-from", correctionInstantFrom); if (effectiveInstantTo != null) { record.add("corr-to", correctionInstantTo); } message.add(0, record); } }