com.opengamma.bbg.referencedata.cache.MongoDBReferenceDataCacheRefresher.java Source code

Java tutorial

Introduction

Here is the source code for com.opengamma.bbg.referencedata.cache.MongoDBReferenceDataCacheRefresher.java

Source

/**
 * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
 *
 * Please see distribution for license.
 */
package com.opengamma.bbg.referencedata.cache;

import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.opengamma.bbg.referencedata.ReferenceData;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.PlatformConfigUtils;

/**
 * A utility to refresh some portion of a mongodb cache by requerying fields from the underlying 
 * [BBG-88] 
 */
public class MongoDBReferenceDataCacheRefresher {

    private static final String HELP_OPTION = "help";

    private final MongoDBReferenceDataCache _cache;
    private final MongoDBValueCachingReferenceDataProvider _cachedProvider;

    public MongoDBReferenceDataCacheRefresher(MongoDBValueCachingReferenceDataProvider cachedProvider) {
        super();
        _cachedProvider = cachedProvider;
        _cache = cachedProvider.getCache();
    }

    public void refreshCaches() {
        Set<String> securities = _cache.getAllCachedSecurities();
        refreshCaches(securities);
    }

    /**
     * 
     * @param numberOfSecurities Approximately how many securities to refresh each time
     * @param id some id number, should increment for each call.  Will result in all securities being refreshed after #securities in cache/numberOfSecurities ids.
     */
    public void refreshCaches(final int numberOfSecurities, final long id) {
        ArgumentChecker.isTrue(numberOfSecurities > 0, "Positive number of securities must be specified");

        Set<String> securities = _cache.getAllCachedSecurities();
        final int hashBasis = Math.max(securities.size() / numberOfSecurities, 1);

        Set<String> chosen = new HashSet<String>(numberOfSecurities);
        for (String candidate : securities) {
            if (Math.abs(candidate.hashCode() % hashBasis) == id % hashBasis) {
                chosen.add(candidate);
            }
        }
        refreshCaches(chosen);
    }

    /**
     * NOTE: only refreshes securities where this field was _succesfully_ looked up
     * @param field The field which a security must have for it to be updated
     */
    public void refreshCachesHaving(final String field) {
        Set<String> securities = _cache.getAllCachedSecurities();
        Map<String, ReferenceData> loadCachedResults = _cache.load(securities);

        Set<String> chosen = new HashSet<String>();
        for (String candidate : securities) {
            ReferenceData cachedResult = loadCachedResults.get(candidate);
            if (cachedResult.getFieldValues().getByName(field) != null) {
                chosen.add(candidate);
            }
        }
        refreshCaches(chosen);
    }

    public void refreshCaches(Set<String> securities) {
        _cachedProvider.refresh(securities);
    }

    /**
     * Runs the tool.
     * 
     * @param args  empty arguments
     * @throws Exception 
     */
    public static void main(final String[] args) throws Exception { // CSIGNORE
        PlatformConfigUtils.configureSystemProperties();
        System.out.println("Starting connections");
        String configLocation = "com/opengamma/bbg/bbg-reference-data-context.xml";

        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(configLocation);
        try {
            context.start();
            MongoDBValueCachingReferenceDataProvider mongoProvider = context
                    .getBean("bloombergReferenceDataProvider", MongoDBValueCachingReferenceDataProvider.class);
            MongoDBReferenceDataCacheRefresher refresher = new MongoDBReferenceDataCacheRefresher(mongoProvider);

            Options options = createOptions();
            CommandLineParser parser = new PosixParser();
            CommandLine line = null;
            try {
                line = parser.parse(options, args);
            } catch (ParseException e) {
                usage(options);
                return;
            }
            if (line.hasOption(HELP_OPTION)) {
                usage(options);
                return;
            }

            //TODO other options, e.g. explicitly specify security 
            int numberOfSecurities = Integer.parseInt(line.getArgs()[0]);
            int id = Integer.parseInt(line.getArgs()[1]);
            System.out.println("Refreshing " + numberOfSecurities + " securities, id " + id);
            refresher.refreshCaches(numberOfSecurities, id);
            System.out.println("Done refreshing");
        } catch (Exception ex) {
            context.close();
            throw ex;
        }
    }

    private static void usage(Options options) {
        HelpFormatter formatter = new HelpFormatter();
        formatter.setWidth(120);
        formatter.printHelp("java " + MongoDBReferenceDataCache.class.getName() + " numberOfSecurities id",
                options);
    }

    private static Options createOptions() {
        Options options = new Options();
        options.addOption(new Option("h", HELP_OPTION, false, "Print this message"));
        return options;
    }

}