com.opengamma.bbg.replay.BloombergRefDataCollector.java Source code

Java tutorial

Introduction

Here is the source code for com.opengamma.bbg.replay.BloombergRefDataCollector.java

Source

/**
 * 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();
    }

}