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    }