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