/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.engine.target; import java.io.Serializable; import org.fudgemsg.FudgeMsg; import org.fudgemsg.MutableFudgeMsg; import org.fudgemsg.mapping.FudgeDeserializer; import org.fudgemsg.mapping.FudgeSerializer; import com.opengamma.id.ExternalBundleIdentifiable; import com.opengamma.id.ExternalId; import com.opengamma.id.ExternalIdBundle; import com.opengamma.id.ExternalIdentifiable; import com.opengamma.id.UniqueId; import com.opengamma.id.UniqueIdentifiable; /** * Wrapper for a "primitive" value. This is to allow the {@link ComputationTargetType#PRIMITIVE} to be defined as something more specific than {@link UniqueIdentifiable} which causes function * resolution issues. */ public class Primitive implements UniqueIdentifiable, Serializable { private static final long serialVersionUID = 1L; /** * Implementation of {@link Primitive} that is based on an external identifier */ public static final class ExternalIdentifiablePrimitive extends Primitive implements ExternalIdentifiable { private static final long serialVersionUID = 1L; private final ExternalId _eid; public ExternalIdentifiablePrimitive(final UniqueId uid, final ExternalId eid) { super(uid); assert eid != null; _eid = eid; } private ExternalIdentifiablePrimitive(final FudgeDeserializer deserializer, final FudgeMsg msg) { super(deserializer, msg); _eid = deserializer.fieldValueToObject(ExternalId.class, msg.getByName("identifier")); } @Override public ExternalId getExternalId() { return _eid; } @Override public void toFudgeMsg(final FudgeSerializer serializer, final MutableFudgeMsg msg) { super.toFudgeMsg(serializer, msg); serializer.addToMessage(msg, "identifier", null, getExternalId()); } public static ExternalIdentifiablePrimitive fromFudgeMsg(final FudgeDeserializer deserializer, final FudgeMsg msg) { return new ExternalIdentifiablePrimitive(deserializer, msg); } @Override public String toString() { return getExternalId().toString(); } @Override public boolean equals(final Object o) { if (o == this) { return true; } if (!o.getClass().equals(ExternalIdentifiablePrimitive.class)) { return false; } final ExternalIdentifiablePrimitive other = (ExternalIdentifiablePrimitive) o; return getUniqueId().equals(other.getUniqueId()) && getExternalId().equals(other.getExternalId()); } @Override public int hashCode() { return getUniqueId().hashCode() * 31 + getExternalId().hashCode(); } } /** * Implementation of {@link Primitive} that is based on an external identifier bundle. */ public static final class ExternalBundleIdentifiablePrimitive extends Primitive implements ExternalBundleIdentifiable { private static final long serialVersionUID = 1L; private final ExternalIdBundle _eids; public ExternalBundleIdentifiablePrimitive(final UniqueId uid, final ExternalIdBundle eids) { super(uid); assert eids != null; _eids = eids; } private ExternalBundleIdentifiablePrimitive(final FudgeDeserializer deserializer, final FudgeMsg msg) { super(deserializer, msg); _eids = deserializer.fieldValueToObject(ExternalIdBundle.class, msg.getByName("identifiers")); } @Override public ExternalIdBundle getExternalIdBundle() { return _eids; } @Override public void toFudgeMsg(final FudgeSerializer serializer, final MutableFudgeMsg msg) { super.toFudgeMsg(serializer, msg); serializer.addToMessage(msg, "identifiers", null, getExternalIdBundle()); } public static ExternalBundleIdentifiablePrimitive fromFudgeMsg(final FudgeDeserializer deserializer, final FudgeMsg msg) { return new ExternalBundleIdentifiablePrimitive(deserializer, msg); } @Override public String toString() { return getExternalIdBundle().toString(); } @Override public boolean equals(final Object o) { if (o == this) { return true; } if (!o.getClass().equals(ExternalBundleIdentifiablePrimitive.class)) { return false; } final ExternalBundleIdentifiablePrimitive other = (ExternalBundleIdentifiablePrimitive) o; return getUniqueId().equals(other.getUniqueId()) && getExternalIdBundle().equals(other.getExternalIdBundle()); } @Override public int hashCode() { return getUniqueId().hashCode() * 31 + getExternalIdBundle().hashCode(); } } private final UniqueId _uid; public Primitive(final UniqueId uid) { assert uid != null; _uid = uid; } protected Primitive(final FudgeDeserializer deserializer, final FudgeMsg msg) { this(deserializer.fieldValueToObject(UniqueId.class, msg.getByName("uniqueId"))); } @Override public UniqueId getUniqueId() { return _uid; } public void toFudgeMsg(final FudgeSerializer serializer, final MutableFudgeMsg msg) { serializer.addToMessage(msg, "uniqueId", null, getUniqueId()); } public static Primitive fromFudgeMsg(final FudgeDeserializer deserializer, final FudgeMsg msg) { return new Primitive(deserializer, msg); } @Override public String toString() { return getUniqueId().toString(); } @Override public boolean equals(final Object o) { if (o == this) { return true; } if (!o.getClass().equals(Primitive.class)) { return false; } final Primitive other = (Primitive) o; return getUniqueId().equals(other.getUniqueId()); } @Override public int hashCode() { return getUniqueId().hashCode(); } }