/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.bbg.replay; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; import org.apache.commons.cli.CommandLine; import org.apache.commons.io.FileUtils; import org.apache.commons.io.LineIterator; import org.apache.commons.lang.StringUtils; import org.fudgemsg.FudgeContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.Lifecycle; import com.google.common.collect.Sets; import com.opengamma.OpenGammaRuntimeException; import com.opengamma.bbg.BloombergConnector; import com.opengamma.bbg.BloombergConnectorFactoryBean; import com.opengamma.bbg.BloombergConstants; import com.opengamma.bbg.cli.BloombergCliOptions; import com.opengamma.bbg.cli.BloombergCliOptions.Builder; import com.opengamma.bbg.livedata.LoggingReferenceDataProvider; import com.opengamma.bbg.referencedata.ReferenceDataProvider; import com.opengamma.bbg.referencedata.impl.BloombergReferenceDataProvider; import com.opengamma.bbg.util.BloombergDataUtils; import com.opengamma.bbg.util.BloombergDomainIdentifierResolver; import com.opengamma.id.ExternalId; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.fudgemsg.OpenGammaFudgeContext; /** * A collector of Bloomberg data. */ public class BloombergRefDataCollector implements Lifecycle { /** Logger. */ private static final Logger s_logger = LoggerFactory.getLogger(BloombergRefDataCollector.class); /** Fudge context. */ private static final FudgeContext s_fudgeContext = OpenGammaFudgeContext.getInstance(); /** * The watch list file. */ private final File _watchListFile; /** * The fields file. */ private final File _fieldsFile; /** * The reference data provider. */ private final LoggingReferenceDataProvider _loggingRefDataProvider; /** * The Fudge context. */ private final FudgeContext _fudgeContext; /** * Whether the service has started. */ private final AtomicBoolean _started = new AtomicBoolean(); /** * Create an instance. * * @param fudgeContext the fudgeContext, not null * @param watchListFile the watch list file, not null * @param refDataProvider the reference data provider, not null * @param fieldsFile the file containing the fields * @param outputFile the output file, not null */ public BloombergRefDataCollector(FudgeContext fudgeContext, File watchListFile, ReferenceDataProvider refDataProvider, File fieldsFile, File outputFile) { ArgumentChecker.notNull(fudgeContext, "fudgeContext"); ArgumentChecker.notNull(watchListFile, "watch list file"); ArgumentChecker.notNull(refDataProvider, "reference data provider"); ArgumentChecker.notNull(fieldsFile, "fields input file"); ArgumentChecker.notNull(outputFile, "out put file"); _fudgeContext = fudgeContext; _watchListFile = watchListFile; _fieldsFile = fieldsFile; _loggingRefDataProvider = new LoggingReferenceDataProvider(refDataProvider, _fudgeContext, outputFile); } /** * Create an instance. * * @param watchListFile the watch list file, not null * @param refDataProvider the reference data provider, not null * @param fieldsFile the file containing the fields * @param outputFile the output file, not null */ public BloombergRefDataCollector(File watchListFile, ReferenceDataProvider refDataProvider, File fieldsFile, File outputFile) { this(s_fudgeContext, watchListFile, refDataProvider, fieldsFile, outputFile); } //------------------------------------------------------------------------- @Override public synchronized void start() { s_logger.info("starting bloombergRefDataCollector"); if (isRunning()) { s_logger.info("bloombergRefDataCollector is already running"); return; } _started.set(true); _loggingRefDataProvider.getReferenceData(loadSecurities(), loadFields()); _started.set(false); } private Set<String> loadFields() { Set<String> fields = Sets.newHashSet(); LineIterator it; try { it = FileUtils.lineIterator(_fieldsFile); } catch (IOException ex) { throw new OpenGammaRuntimeException("IOException when reading " + _fieldsFile, ex); } try { while (it.hasNext()) { String line = it.nextLine(); if (StringUtils.isBlank(line) || line.charAt(0) == '#') { continue; } fields.add(line); } } finally { LineIterator.closeQuietly(it); } return fields; } private Set<String> loadSecurities() { Set<String> bloombergKeys = Sets.newHashSet(); try { for (ExternalId identifier : BloombergDataUtils.identifierLoader(new FileReader(_watchListFile))) { bloombergKeys.add(BloombergDomainIdentifierResolver.toBloombergKey(identifier)); } } catch (FileNotFoundException ex) { throw new OpenGammaRuntimeException(_watchListFile + " cannot be found", ex); } return bloombergKeys; } @Override public synchronized void stop() { s_logger.info("stopping bloombergRefDataCollector"); _started.set(false); } @Override public synchronized boolean isRunning() { return _started.get() == true; } //------------------------------------------------------------------------- /** * Main entry point from command line * * @param args the args */ public static void main(String[] args) { //CSIGNORE BloombergCliOptions bbgOptions = createOptions(); processCommandLineOptions(args, bbgOptions); } private static void processCommandLineOptions(String[] args, BloombergCliOptions bbgOptions) { CommandLine cmdLine = bbgOptions.parse(args); if (cmdLine == null) { bbgOptions.printUsage(BloombergRefDataCollector.class); return; } if (cmdLine.getOptionValue(BloombergCliOptions.HELP_OPTION) != null) { bbgOptions.printUsage(BloombergRefDataCollector.class); return; } String dataFieldFile = cmdLine.getOptionValue(BloombergCliOptions.FIELDS_FILE_OPTION); String identifiersFile = cmdLine.getOptionValue(BloombergCliOptions.IDENTIFIERS_OPTION); String outputFile = cmdLine.getOptionValue(BloombergCliOptions.OUPUT_OPTION); String host = cmdLine.getOptionValue(BloombergCliOptions.HOST_OPTION); String port = cmdLine.getOptionValue(BloombergCliOptions.PORT_OPTION); if (port == null) { port = BloombergConstants.DEFAULT_PORT; } s_logger.info("loading ref data with host: {} port: {} fields: {} identifies: {} outputfile {}", new Object[]{host, port, dataFieldFile, identifiersFile, outputFile}); BloombergConnectorFactoryBean factory = new BloombergConnectorFactoryBean("BloombergRefDataCollector", host, Integer.valueOf(port)); BloombergConnector bloombergConnector = factory.getObjectCreating(); BloombergReferenceDataProvider refDataProvider = new BloombergReferenceDataProvider(bloombergConnector); refDataProvider.start(); BloombergRefDataCollector refDataCollector = new BloombergRefDataCollector(new File(identifiersFile), refDataProvider, new File(dataFieldFile), new File(outputFile)); refDataCollector.start(); } private static BloombergCliOptions createOptions() { Builder builder = new BloombergCliOptions.Builder() .withDataFieldsFile(true) .withIdentifiers(true) .withOutput(true) .withHost(true) .withPort(false); return builder.build(); } }