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