Package com.opengamma.bbg.referencedata.cache

Source Code of com.opengamma.bbg.referencedata.cache.MongoDBReferenceDataCacheRefresher

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

}
TOP

Related Classes of com.opengamma.bbg.referencedata.cache.MongoDBReferenceDataCacheRefresher

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.