001 package org.findata.blpwrapper; 002 003 import com.bloomberglp.blpapi.*; 004 005 import java.util.logging.Logger; 006 007 public class ReferenceDataResult extends DataResult { 008 private String[] fields; 009 private String[] securities; 010 private String[] data_types; 011 private String[][] result_data; 012 013 public ReferenceDataResult(String[] argSecurities, String[] argFields) { 014 securities = argSecurities; 015 fields = argFields; 016 017 data_types = new String[fields.length]; 018 // Because we may get data type info out of order, need to 019 // initialize array at start with a default value. 020 for (int i = 0; i < fields.length; i++) { 021 // Call this "NOT_APPLICABLE" since "NA" causes problems in R. 022 data_types[i] = "NOT_APPLICABLE"; 023 } 024 result_data = new String[securities.length][fields.length]; 025 } 026 027 public String[][] getData() { 028 return(result_data); 029 } 030 031 public String[] getColumnNames() { 032 return(fields); 033 } 034 035 public String[] getRowNames() { 036 return(securities); 037 } 038 039 public String[] getDataTypes() { 040 return(data_types); 041 } 042 043 public void processResponse(Element response, Logger logger, boolean throwInvalidTickerError) throws WrapperException { 044 Element securityDataArray = response.getElement("securityData"); 045 int numItems = securityDataArray.numValues(); 046 047 for (int i = 0; i < numItems; i++) { 048 Element securityData = securityDataArray.getValueAsElement(i); 049 Element fieldData = securityData.getElement("fieldData"); 050 int seq = securityData.getElementAsInt32("sequenceNumber"); 051 052 processSecurityError(securityData, logger, throwInvalidTickerError); 053 processFieldExceptions(securityData, logger); 054 055 int field_data_counter = 0; 056 for (int j = 0; j < fields.length; j++) { 057 String field_name = fields[j]; 058 059 if (field_data_counter < fieldData.numElements()) { 060 logger.finest("i = " + i + "\n" + "seq = " + seq + "\n" + "j = " + j + "\n" + "field_data_counter = " + field_data_counter); 061 Element field = fieldData.getElement(field_data_counter); 062 if (field.name().toString().equals(field_name)) { 063 // Raise an error if we're trying to read SEQUENCE data. 064 // Store the data type for later (if it hasn't already been stored). 065 if (data_types[j].equals("NOT_APPLICABLE")) { 066 if (field.datatype().intValue() == Schema.Datatype.Constants.SEQUENCE) { 067 throw new WrapperException("reference data request cannot handle SEQUENCE data in field " + field.name().toString()); 068 } 069 String data_type = field.datatype().toString(); 070 if (!data_type.equals("NA")) { 071 logger.finest("Setting field data type to " + data_type); 072 data_types[j] = data_type; 073 } 074 } else { 075 logger.finest("Field data type is " + data_types[j]); 076 } 077 078 String value = field.getValueAsString(); 079 080 logger.finest("Setting field value to " + value); 081 field_data_counter++; 082 083 if (value.equals("-2.4245362661989844E-14")) { 084 logger.info("Numeric of -2.4245362661989844E-14 encountered. Not a real value. Will be left NULL."); 085 } else { 086 result_data[seq][j] = value; 087 } 088 } else { 089 logger.finest("Skipping field."); 090 } 091 } 092 093 } 094 } 095 } 096 }