package org.juxtapose.fxtradingsystem.marketdata;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;
public class MarketDataSource
{
static ConcurrentHashMap<String, MarketDataSource> nameToSource = new ConcurrentHashMap<String, MarketDataSource>();
static Object mutex = new Object();
public static void addSubscriber( IMarketDataSubscriber inSubscriber, QPMessage inSubscribeMessage, String inSource )
{
MarketDataSource source;
synchronized( mutex )
{
source = nameToSource.get( inSource );
if( source == null )
{
source = new MarketDataSource( inSource );
nameToSource.put( inSource, source );
}
}
source.addSubscriber( inSubscriber, inSubscribeMessage );
}
public static void removeSubscriber( IMarketDataSubscriber inSubscriber, String inSource )
{
MarketDataSource source;
synchronized( mutex )
{
source = nameToSource.get( inSource );
if( source != null )
{
source.removeSubscriber( inSubscriber );
}
}
}
String name;
ConcurrentHashMap<IMarketDataSubscriber, QPMessage> subscribedInstruments = new ConcurrentHashMap<IMarketDataSubscriber, QPMessage>();
Random rand = new Random();
MarketDataSource( String inSourceName )
{
name = inSourceName;
Thread updateThread = new Thread(new Runnable()
{
@Override
public void run()
{
try
{
for(;;)
{
for(IMarketDataSubscriber sub : subscribedInstruments.keySet().toArray( new IMarketDataSubscriber[]{} ) )
{
QPMessage instDef = subscribedInstruments.get( sub );
double bid = rand.nextDouble();
double ask = rand.nextDouble();
if( instDef == null )
continue;
QPMessage quoteMessage = new QPMessage( QPMessage.QUOTE, instDef.ccy1, instDef.ccy2, instDef.period, bid, ask, System.nanoTime() );
sub.marketDataUpdated( quoteMessage, name.hashCode() );
int sleepTime = rand.nextInt( 10 );
Thread.sleep( sleepTime );
}
int sleepTime = rand.nextInt( 10 );
Thread.sleep( sleepTime );
}
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
});
updateThread.start();
}
private void addSubscriber( IMarketDataSubscriber inSubscriber, QPMessage inSubscribeMessage )
{
subscribedInstruments.put( inSubscriber, inSubscribeMessage );
}
private void removeSubscriber( IMarketDataSubscriber inSubscriber )
{
subscribedInstruments.remove( inSubscriber );
}
}