/**
* Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies
* <p/>
* Please see distribution for license.
*/
package com.opengamma.bbg.util;
import java.io.IOException;
import java.util.Iterator;
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.jdeferred.Deferred;
import org.jdeferred.DeferredManager;
import org.jdeferred.DoneCallback;
import org.jdeferred.Promise;
import org.jdeferred.impl.DefaultDeferredManager;
import org.jdeferred.impl.DeferredObject;
import com.bloomberglp.blpapi.CorrelationID;
import com.bloomberglp.blpapi.Element;
import com.bloomberglp.blpapi.Event;
import com.bloomberglp.blpapi.EventHandler;
import com.bloomberglp.blpapi.Message;
import com.bloomberglp.blpapi.MessageIterator;
import com.bloomberglp.blpapi.Request;
import com.bloomberglp.blpapi.Service;
import com.bloomberglp.blpapi.Session;
import com.bloomberglp.blpapi.SessionOptions;
import com.bloomberglp.blpapi.Subscription;
import com.bloomberglp.blpapi.SubscriptionList;
import com.opengamma.scripts.Scriptable;
/** Diagnostic tool for bloomberg API server */
@Scriptable
public class Diagnose {
private static final String USAGE = "java com.opengamma.bbg.util.Diagnose";
private static CommandLine s_line;
private static String s_host = "localhost";
private static String s_port = "8194";
private static final String TICKER = "BBHBEAT Index";
private static final String LIVE_FIELD = "LAST_PRICE";
private static final String REF_FIELD = "API_MACHINE";
private static String s_timeout = "5000";
private static boolean s_verbose;
private static final Deferred<String, Void, Void> REF_OK = new DeferredObject<>();
private static final Deferred<String, Void, Void> MKT_OK = new DeferredObject<>();
public static void main(String[] args) throws Exception {
final Options options = createOptions();
final CommandLineParser parser = new PosixParser();
try {
s_line = parser.parse(options, args);
} catch (final ParseException e) {
usage(options);
System.exit(1);
}
s_host = s_line.getOptionValue("h", s_host);
s_port = s_line.getOptionValue("p", s_port);
s_timeout = s_line.getOptionValue("t", s_timeout);
s_verbose = s_line.hasOption("v");
try {
Integer.parseInt(s_port);
} catch (NumberFormatException e) {
System.err.println("port should be intiger value");
usage(options);
}
try {
Integer.parseInt(s_timeout);
} catch (NumberFormatException e) {
System.err.println("timeout should be intiger value");
usage(options);
}
SessionOptions sessionOptions = new SessionOptions();
sessionOptions.setServerHost(s_host);
sessionOptions.setServerPort(Integer.parseInt(s_port));
Session session = new Session(sessionOptions, new MyEventHandler());
session.startAsync();
DeferredManager dm = new DefaultDeferredManager();
Promise completed = dm.when(MKT_OK.promise(), REF_OK.promise());
completed.done(new DoneCallback() {
@Override
public void onDone(Object o) {
// all good
System.exit(0);
}
});
completed.waitSafely(Integer.parseInt(s_timeout));
if (!MKT_OK.isResolved()) {
System.err.printf("Received no market data within timeout of %s ms\n", s_timeout);
}
if (!REF_OK.isResolved()) {
System.err.printf("Received no market data within timeout of %s ms\n", s_timeout);
}
System.exit(1);
}
private static Options createOptions() {
final Options options = new Options();
Option option = new Option("h", "host", true, "bloomberg host address (default " + s_host + ")");
options.addOption(option);
option = new Option("p", "port", true, "bloomberg host port (default " + s_port + ")");
options.addOption(option);
option = new Option("t", "timeout", true, "timeout in milliseconds (default " + s_timeout + ")");
options.addOption(option);
option = new Option("v", "verbose", false, "use verbose output");
options.addOption(option);
return options;
}
private static void usage(final Options options) {
final HelpFormatter formatter = new HelpFormatter();
formatter.setWidth(120);
formatter.printHelp(USAGE, options, true);
}
static class MyEventHandler implements EventHandler {
public void handleEventVerbose(Event event) {
Iterator<Message> messages = event.iterator();
while (messages.hasNext()) {
Message message = messages.next();
System.out.println("\n");
try {
message.print(System.out);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("\n");
}
}
public void handleEvent(Event event) {
Iterator<Message> messages = event.iterator();
while (messages.hasNext()) {
Message message = messages.next();
System.out.println(message.messageType());
}
}
public void processEvent(Event event, Session session) {
MessageIterator iter = event.messageIterator();
while (iter.hasNext()) {
Message message = iter.next();
if (s_verbose) {
handleEventVerbose(event);
}
if (message.messageType().equals("SessionStartupFailure")) {
System.err.printf("Session startup failed.");
System.exit(1);
}
if (message.messageType().equals("SubscriptionFailure")) {
System.err.printf("Subsription failed. Ticker:%s, Field:%s", TICKER, LIVE_FIELD);
System.exit(1);
}
if (message.messageType().equals("SessionStarted")) {
try {
SubscriptionList subscriptions = new SubscriptionList();
subscriptions.add(new Subscription(TICKER, LIVE_FIELD));
session.subscribe(subscriptions);
if (!session.openService("//blp/refdata")) {
System.out.println("Could not open service //blp/refdata");
System.exit(1);
}
Service refDataSvc = session.getService("//blp/refdata");
Request request = refDataSvc.createRequest("ReferenceDataRequest");
request.append("securities", TICKER);
request.append("fields", REF_FIELD);
session.sendRequest(request, new CorrelationID(20));
} catch (Exception e) {
System.err.println("Could not open //blp/mktdata for async. " + e.getMessage());
e.printStackTrace();
System.exit(1);
}
} else if (message.messageType().equals("ReferenceDataResponse")) {
Element securityDataArray = message.getElement("securityData");
int numItems = securityDataArray.numValues();
if (numItems > 0) {
Element securityData = securityDataArray.getValueAsElement(0);
if (securityData.hasElement("securityError")) {
Element securityError = securityData.getElement("securityError");
System.err.println("Error retrieving reference data: " + securityError);
System.exit(1);
} else {
REF_OK.resolve("ok");
Element fieldData = securityData.getElement("fieldData");
// Element ref = fieldData.getElement(REF_FIELD);
System.out.printf("Successfully received reference value for Ticker:%s, Field:%s",
TICKER,
fieldData.getElement(REF_FIELD));
}
}
} else if (message.messageType().equals("MarketDataEvents") && message.getElement(LIVE_FIELD) != null) {
MKT_OK.resolve("ok");
System.out.printf("Successfully received live value for Ticker:%s, Field:%s",
TICKER, message.getElement(LIVE_FIELD));
} else {
handleEvent(event);
}
}
}
}
}