package org.juxtapose.fxtradingsystem.ordermanager; import java.math.BigDecimal; import java.util.HashMap; import org.juxtapose.fxtradingsystem.constants.FXDataConstants; import org.juxtapose.fxtradingsystem.constants.FXProducerServiceConstants; import org.juxtapose.fxtradingsystem.priceengine.PriceEngineUtil; import org.juxtapose.streamline.producer.STMEntryProducer; import org.juxtapose.streamline.producer.ISTMEntryKey; import org.juxtapose.streamline.stm.ISTM; import org.juxtapose.streamline.stm.ReferenceLink; import org.juxtapose.streamline.stm.STMTransaction; import org.juxtapose.streamline.util.ISTMEntryRequestSubscriber; import org.juxtapose.streamline.util.ISTMEntry; import org.juxtapose.streamline.util.Status; import org.juxtapose.streamline.util.data.DataTypeBoolean; import org.juxtapose.streamline.util.data.DataTypeRef; import org.juxtapose.streamline.util.data.DataTypeString; public class RFQProducer extends STMEntryProducer implements ISTMEntryRequestSubscriber { final static long priceTag = 0; final String ccy1; final String ccy2; final String nearPeriod; final String farPeriod; final BigDecimal amt; public RFQProducer( ISTMEntryKey inKey, ISTM inSTM, String inCcy1, String inCcy2, String inNearPeriod, String inFarPeriod, BigDecimal inAmt ) { super( inKey, inSTM ); ccy1 = inCcy1; ccy2 = inCcy2; nearPeriod = inNearPeriod; farPeriod = inFarPeriod; amt = inAmt; } @Override protected void start() { stm.commit( new STMTransaction( entryKey, RFQProducer.this, 1, 0, true ) { @Override public void execute() { putValue( FXDataConstants.FIELD_CCY1, new DataTypeString( ccy1 ) ); putValue( FXDataConstants.FIELD_CCY2, new DataTypeString( ccy2 ) ); if( nearPeriod != null ) putValue( FXDataConstants.FIELD_NEAR_SWAP, new DataTypeString( nearPeriod )); if( farPeriod != null ) putValue( FXDataConstants.FIELD_FAR_SWAP, new DataTypeString( farPeriod )); } }); HashMap<String, String> query; if( nearPeriod == null && farPeriod == null ) query = PriceEngineUtil.getSpotPriceQuery( ccy1, ccy2 ); else if( farPeriod == null ) query = PriceEngineUtil.getFwdPriceQuery( ccy1, ccy2, nearPeriod ); else query = PriceEngineUtil.getSwapPriceQuery( ccy1, ccy2, nearPeriod, farPeriod ); stm.getDataKey( FXProducerServiceConstants.PRICE_ENGINE, RFQProducer.this, priceTag, query ); } @Override public void deliverKey( final ISTMEntryKey inDataKey, Object inTag) { if( inTag.equals( priceTag )) { stm.commit( new STMTransaction( entryKey, RFQProducer.this, 1, 0, false ) { @Override public void execute() { addReference( FXDataConstants.FIELD_PRICE, new DataTypeRef( inDataKey ) ); } }); } } @Override public void queryNotAvailible(Object inTag) { setStatus( Status.NA ); stm.logError( "could not retrieve datakey from price engine" ); return; } protected void referenceDataCall( final String inFieldKey, final ReferenceLink inLink, final ISTMEntry inData, STMTransaction inTransaction ) { if( inFieldKey == FXDataConstants.FIELD_PRICE ) { DataTypeBoolean priced = (DataTypeBoolean)inTransaction.get( FXDataConstants.FIELD_FIRST_UPDATE ); if( priced == null ) { inTransaction.putValue( FXDataConstants.FIELD_FIRST_UPDATE, new DataTypeBoolean(true) ); } else if( priced.get() ) { inTransaction.putValue( FXDataConstants.FIELD_FIRST_UPDATE, new DataTypeBoolean(false) ); } } if( inTransaction.getStatus() != Status.OK ) { if( inData.getStatus() == Status.OK ) { inTransaction.setStatus( Status.OK ); } } } }