001 package org.findata.blpwrapper;
002
003 import com.bloomberglp.blpapi.*;
004
005 import java.util.logging.Logger;
006
007 public class HistoricalDataResult extends DataResult {
008 private String[] submitted_fields;
009 private String[] returned_fields;
010 private String[] submitted_securities;
011 private String[] data_types;
012 private String[] returned_dates;
013 private String[][] result_data;
014
015 public HistoricalDataResult(String[] securities, String[] fields) {
016 submitted_fields = fields;
017 submitted_securities = securities;
018
019 returned_fields = new String[fields.length + 1];
020 returned_fields[0] = "date";
021 for (int i = 0; i < fields.length; i++) {
022 returned_fields[i+1] = fields[i];
023 }
024
025 data_types = new String[returned_fields.length];
026 for (int i = 0; i < data_types.length; i++) {
027 data_types[i] = "NOT_APPLICABLE";
028 }
029 }
030
031 public String[][] getData() {
032 return(result_data);
033 }
034
035 public String[] getColumnNames() {
036 return(returned_fields);
037 }
038
039 public String[] getRowNames() {
040 return(returned_dates);
041 }
042
043 public String[] getDataTypes() {
044 return(data_types);
045 }
046
047 public void processResponse(Element response, Logger logger, boolean throwInvalidTickerError) throws WrapperException {
048 Element securityData = response.getElement("securityData");
049 Element fieldData = securityData.getElement("fieldData");
050 int seq = securityData.getElementAsInt32("sequenceNumber");
051 if (seq > 0) {
052 throw new WrapperException("do not expect seq " + seq + " to be greater than 0.");
053 }
054
055 processSecurityError(securityData, logger, throwInvalidTickerError);
056 processFieldExceptions(securityData, logger);
057
058 // Iterate over historical data points
059 for (int j = 0; j < fieldData.numValues(); j++) {
060 Element x = fieldData.getValueAsElement(j);
061
062 if (j==0) {
063 result_data = new String[fieldData.numValues()][returned_fields.length];
064 returned_dates = new String[fieldData.numValues()];
065 }
066
067 int field_data_counter = 0;
068 for (int k = 0; k < returned_fields.length; k++) {
069 String field_name = returned_fields[k];
070 String field_value = null;
071
072 if (field_data_counter < x.numElements()) {
073 Element field = x.getElement(field_data_counter);
074
075 if (field.name().toString().equals(field_name)) {
076 // Store data type for later.
077 if (data_types[k].equals("NOT_APPLICABLE")) {
078 String data_type = field.datatype().toString();
079 if (!data_type.equals("NA")) {
080 data_types[k] = data_type;
081 }
082 }
083
084 field_value = field.getValueAsString();
085 field_data_counter++;
086 }
087 }
088
089 result_data[j][k] = field_value;
090 }
091 returned_dates[j] = result_data[j][0];
092 }
093 }
094 }
095