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 }