// Path: core/src/main/java/com/jimmoores/quandl/processing/RequestProcessor.java
// public interface RequestProcessor<T> {
//   /**
//    * Process a MetaDataRequest object and return data about it.
//    * @param request  the meta data request
//    * @return the processed result
//    */
//   T processMetaDataRequest(MetaDataRequest request);
//   /**
//    * Process a MultiMetaDataRequest object and return data about it.
//    * @param request  the multi meta data request
//    * @return the processed result
//    */
//   T processMultiMetaDataRequest(MultiMetaDataRequest request);
//   /**
//    * Process a DataSetRequest object and return data about it.
//    * @param request  the meta data request
//    * @return the processed result
//    */
//   T processDataSetRequest(DataSetRequest request);
//   /**
//    * Process a MultiDataSetRequest object and return data about it.
//    * @param request  the multi data set request
//    * @return the processed result
//    */
//   T processMultiDataSetRequest(MultiDataSetRequest request);
//   /**
//    * Process a SerachRequest object and return data about it.
//    * @param request  the search request
//    * @return the processed result
//    */
//   T processSearchRequest(SearchRequest request);
// }
// 
// Path: core/src/main/java/com/jimmoores/quandl/processing/Request.java
// public interface Request {
//   /**
//    * Process this request using the provided processor.
//    * @param <T>  the type returned by the request processor
//    * @param processor  the request processor
//    * @return the result from the request processor
//    */
//   <T> T accept(RequestProcessor<T> processor);
// }
// 
// Path: core/src/main/java/com/jimmoores/quandl/util/ArgumentChecker.java
// public final class ArgumentChecker {
//   private static Logger s_logger = LoggerFactory.getLogger(ArgumentChecker.class);
// 
//   private ArgumentChecker() {
//   }
// 
//   /**
//    * Throws an exception if the argument is not null.
//    * 
//    * @param argument the object to check
//    * @param name the name of the parameter
//    */
//   public static void notNull(final Object argument, final String name) {
//     if (argument == null) {
//       s_logger.error("Argument {} was null", name);
//       throw new QuandlRuntimeException("Value " + name + " was null");
//     }
//   }
// 
//   /**
//    * Throws an exception if the array argument is not null or empty.
//    * 
//    * @param <E> type of array
//    * @param argument the object to check
//    * @param name the name of the parameter
//    */
//   public static <E> void notNullOrEmpty(final E[] argument, final String name) {
//     if (argument == null) {
//       s_logger.error("Argument {} was null", name);
//       throw new QuandlRuntimeException("Value " + name + " was null");
//     } else if (argument.length == 0) {
//       s_logger.error("Argument {} was empty array", name);
//       throw new QuandlRuntimeException("Value " + name + " was empty array");
//     }
//   }
// 
//   /**
//    * Throws an exception if the collection argument is not null or empty.
//    * 
//    * @param <E> type of array
//    * @param argument the object to check
//    * @param name the name of the parameter
//    */
//   public static <E> void notNullOrEmpty(final Collection<E> argument, final String name) {
//     if (argument == null) {
//       s_logger.error("Argument {} was null", name);
//       throw new QuandlRuntimeException("Value " + name + " was null");
//     } else if (argument.size() == 0) {
//       s_logger.error("Argument {} was empty collection", name);
//       throw new QuandlRuntimeException("Value " + name + " was empty collection");
//     }
//   }
// 
//   /**
//    * Throws an exception if the string argument is not null or empty.
//    * 
//    * @param argument the String to check
//    * @param name the name of the parameter
//    */
//   public static void notNullOrEmpty(final String argument, final String name) {
//     if (argument == null) {
//       s_logger.error("Argument {} was null", name);
//       throw new QuandlRuntimeException("Value " + name + " was null");
//     } else if (argument.length() == 0) {
//       s_logger.error("Argument {} was empty string", name);
//       throw new QuandlRuntimeException("Value " + name + " was empty string");
//     }
//   }
// }


import javax.ws.rs.client.WebTarget;
import java.time.LocalDate;
import com.jimmoores.quandl.processing.RequestProcessor;
import com.jimmoores.quandl.processing.Request;
import com.jimmoores.quandl.util.ArgumentChecker;
    }

    /**
     * Build the request object.
     * 
     * @return the immutable build object
     */
    public DataSetRequest build() {
      return new DataSetRequest(this);
    }
  }

  /**
   * Append any specified parameters to the provided WebTarget.
   * 
   * @param webTarget a web target used by the Jersey Client API
   * @return the WebTarget with any path and query parameters appended
   */
  public WebTarget appendPathAndQueryParameters(final WebTarget webTarget) {
    ArgumentChecker.notNull(webTarget, "webTarget");
    WebTarget resultTarget = webTarget;
    resultTarget = resultTarget.path(DATASETS_RELATIVE_URL);
    resultTarget = resultTarget.path(_quandlCode + EXTENSION);
    if (_startDate != null) {
      resultTarget = resultTarget.queryParam(START_DATE_PARAM, _startDate.toString());
    }
    if (_endDate != null) {
      resultTarget = resultTarget.queryParam(END_DATE_PARAM, _endDate.toString());
    }
    if (_columnIndex != null) {
// Path: core/src/main/java/com/jimmoores/quandl/processing/RequestProcessor.java
// public interface RequestProcessor<T> {
//   /**
//    * Process a MetaDataRequest object and return data about it.
//    * @param request  the meta data request
//    * @return the processed result
//    */
//   T processMetaDataRequest(MetaDataRequest request);
//   /**
//    * Process a MultiMetaDataRequest object and return data about it.
//    * @param request  the multi meta data request
//    * @return the processed result
//    */
//   T processMultiMetaDataRequest(MultiMetaDataRequest request);
//   /**
//    * Process a DataSetRequest object and return data about it.
//    * @param request  the meta data request
//    * @return the processed result
//    */
//   T processDataSetRequest(DataSetRequest request);
//   /**
//    * Process a MultiDataSetRequest object and return data about it.
//    * @param request  the multi data set request
//    * @return the processed result
//    */
//   T processMultiDataSetRequest(MultiDataSetRequest request);
//   /**
//    * Process a SerachRequest object and return data about it.
//    * @param request  the search request
//    * @return the processed result
//    */
//   T processSearchRequest(SearchRequest request);
// }
// 
// Path: core/src/main/java/com/jimmoores/quandl/processing/Request.java
// public interface Request {
//   /**
//    * Process this request using the provided processor.
//    * @param <T>  the type returned by the request processor
//    * @param processor  the request processor
//    * @return the result from the request processor
//    */
//   <T> T accept(RequestProcessor<T> processor);
// }
// 
// Path: core/src/main/java/com/jimmoores/quandl/util/ArgumentChecker.java
// public final class ArgumentChecker {
//   private static Logger s_logger = LoggerFactory.getLogger(ArgumentChecker.class);
// 
//   private ArgumentChecker() {
//   }
// 
//   /**
//    * Throws an exception if the argument is not null.
//    * 
//    * @param argument the object to check
//    * @param name the name of the parameter
//    */
//   public static void notNull(final Object argument, final String name) {
//     if (argument == null) {
//       s_logger.error("Argument {} was null", name);
//       throw new QuandlRuntimeException("Value " + name + " was null");
//     }
//   }
// 
//   /**
//    * Throws an exception if the array argument is not null or empty.
//    * 
//    * @param <E> type of array
//    * @param argument the object to check
//    * @param name the name of the parameter
//    */
//   public static <E> void notNullOrEmpty(final E[] argument, final String name) {
//     if (argument == null) {
//       s_logger.error("Argument {} was null", name);
//       throw new QuandlRuntimeException("Value " + name + " was null");
//     } else if (argument.length == 0) {
//       s_logger.error("Argument {} was empty array", name);
//       throw new QuandlRuntimeException("Value " + name + " was empty array");
//     }
//   }
// 
//   /**
//    * Throws an exception if the collection argument is not null or empty.
//    * 
//    * @param <E> type of array
//    * @param argument the object to check
//    * @param name the name of the parameter
//    */
//   public static <E> void notNullOrEmpty(final Collection<E> argument, final String name) {
//     if (argument == null) {
//       s_logger.error("Argument {} was null", name);
//       throw new QuandlRuntimeException("Value " + name + " was null");
//     } else if (argument.size() == 0) {
//       s_logger.error("Argument {} was empty collection", name);
//       throw new QuandlRuntimeException("Value " + name + " was empty collection");
//     }
//   }
// 
//   /**
//    * Throws an exception if the string argument is not null or empty.
//    * 
//    * @param argument the String to check
//    * @param name the name of the parameter
//    */
//   public static void notNullOrEmpty(final String argument, final String name) {
//     if (argument == null) {
//       s_logger.error("Argument {} was null", name);
//       throw new QuandlRuntimeException("Value " + name + " was null");
//     } else if (argument.length() == 0) {
//       s_logger.error("Argument {} was empty string", name);
//       throw new QuandlRuntimeException("Value " + name + " was empty string");
//     }
//   }
// }


// Path: core/src/main/java/com/jimmoores/quandl/DataSetRequest.java
import javax.ws.rs.client.WebTarget;
import java.time.LocalDate;
import com.jimmoores.quandl.processing.RequestProcessor;
import com.jimmoores.quandl.processing.Request;
import com.jimmoores.quandl.util.ArgumentChecker;

    }

    /**
     * Build the request object.
     * 
     * @return the immutable build object
     */
    public DataSetRequest build() {
      return new DataSetRequest(this);
    }
  }

  /**
   * Append any specified parameters to the provided WebTarget.
   * 
   * @param webTarget a web target used by the Jersey Client API
   * @return the WebTarget with any path and query parameters appended
   */
  public WebTarget appendPathAndQueryParameters(final WebTarget webTarget) {
    ArgumentChecker.notNull(webTarget, "webTarget");
    WebTarget resultTarget = webTarget;
    resultTarget = resultTarget.path(DATASETS_RELATIVE_URL);
    resultTarget = resultTarget.path(_quandlCode + EXTENSION);
    if (_startDate != null) {
      resultTarget = resultTarget.queryParam(START_DATE_PARAM, _startDate.toString());
    }
    if (_endDate != null) {
      resultTarget = resultTarget.queryParam(END_DATE_PARAM, _endDate.toString());
    }
    if (_columnIndex != null) {
      resultTarget = resultTarget.queryParam(COLUMN_INDEX_PARAM, _columnIndex);