35#include <libdap/BaseType.h>
36#include <libdap/Sequence.h>
37#include <libdap/ConstraintEvaluator.h>
38#include <libdap/D4Group.h>
39#include <libdap/DMR.h>
40#include <D4ConstraintEvaluator.h>
41#include <libdap/D4BaseTypeFactory.h>
42#include <libdap/ServerFunctionsList.h>
43#include <D4FunctionEvaluator.h>
44#include <libdap/crc.h>
45#include <libdap/InternalErr.h>
46#include <libdap/util.h>
47#include <libdap/escaping.h>
48#include <libdap/mime_util.h>
51#include <BESDapNames.h>
52#include <BESDataNames.h>
53#include <BESDapTransmit.h>
54#include <BESContainer.h>
55#include <BESDataDDSResponse.h>
56#include <BESDMRResponse.h>
57#include <BESDapResponseBuilder.h>
60#include <BESDapError.h>
61#include <BESForbiddenError.h>
62#include <BESInternalFatalError.h>
63#include <DapFunctionUtils.h>
67#include "RequestServiceTimer.h"
69#include "BESAsciiTransmit.h"
71#include "get_ascii_dap4.h"
73using namespace dap_asciival;
77#define prolog string("BESAsciiTransmit::").append(__func__).append("() - ")
79BESAsciiTransmit::BESAsciiTransmit() :
82 add_method(DATA_SERVICE, BESAsciiTransmit::send_basic_ascii);
88 BESDEBUG(
"ascii",
"BESAsciiTransmit::send_basic_ascii() - BEGIN" << endl);
100 unique_ptr<DDS> ascii_dds(datadds_to_ascii_datadds(loaded_dds));
106 get_data_values_as_ascii(ascii_dds.get(), dhi.get_output_stream());
107 dhi.get_output_stream() << flush;
110 throw BESDapError(
"Failed to get values as ascii: " + e.get_error_message(),
false, e.get_error_code(), __FILE__, __LINE__);
115 catch (std::exception &e) {
116 throw BESInternalError(
"Failed to read data: STL Error: " +
string(e.what()), __FILE__, __LINE__);
119 throw BESInternalError(
"Failed to get values as ascii: Unknown exception caught", __FILE__, __LINE__);
122 BESDEBUG(
"ascii",
"Done BESAsciiTransmit::send_basic_ascii()" << endl);
131 if (!dap4Constraint.empty()) {
132 D4ConstraintEvaluator d4ce(dmr);
133 bool parse_ok = d4ce.parse(dap4Constraint);
134 if (!parse_ok)
throw Error(malformed_expr,
"Constraint Expression (" + dap4Constraint +
") failed to parse.");
137 dmr->root()->set_send_p(
true);
140 if (dmr->response_limit() != 0 && (dmr->request_size(
true) > dmr->response_limit())) {
141 string msg =
"The Request for " + long_to_string(dmr->request_size(
true))
142 +
"KB is too large; requests for this server are limited to " +
143 long_to_string(dmr->response_limit())
151 print_values_as_ascii(dmr, out);
160 BESDEBUG(
"ascii",
"BESAsciiTransmit::send_dap4_csv" << endl);
165 DMR *dmr = bdmr->get_dmr();
167 string dap4Constraint = www2id(dhi.
data[DAP4_CONSTRAINT],
"%",
"%20%26");
168 string dap4Function = www2id(dhi.
data[DAP4_FUNCTION],
"%",
"%20%26");
180 if (!dap4Function.empty()) {
181 D4BaseTypeFactory d4_factory;
182 DMR function_result(&d4_factory,
"function_results");
186 if (!ServerFunctionsList::TheList())
188 "The function expression could not be evaluated because there are no server functions defined on this server");
190 D4FunctionEvaluator parser(dmr, ServerFunctionsList::TheList());
191 bool parse_ok = parser.parse(dap4Function);
192 if (!parse_ok)
throw Error(
"Function Expression (" + dap4Function +
") failed to parse.");
194 parser.eval(&function_result);
207 if (!dap4Constraint.empty()) {
208 D4ConstraintEvaluator d4ce(dmr);
209 bool parse_ok = d4ce.parse(dap4Constraint);
210 if (!parse_ok)
throw Error(malformed_expr,
"Constraint Expression (" + dap4Constraint +
") failed to parse.");
213 dmr->root()->set_send_p(
true);
216 if (dmr->response_limit() != 0 && (dmr->request_size(
true) > dmr->response_limit())) {
217 string msg =
"The Request for " + long_to_string(dmr->request_size(
true))
218 +
"KB is too large; requests for this server are limited to " + long_to_string(dmr->response_limit())
227 print_values_as_ascii(dmr, dhi.get_output_stream());
228 dhi.get_output_stream() << flush;
232 throw BESDapError(
"Failed to return values as ascii: " + e.get_error_message(),
false, e.get_error_code(),__FILE__, __LINE__);
238 throw BESInternalError(
"Failed to return values as ascii: Unknown exception caught", __FILE__, __LINE__);
241 BESDEBUG(
"ascii",
"Done BESAsciiTransmit::send_dap4_csv" << endl);
static void send_dap4_csv(BESResponseObject *obj, BESDataHandlerInterface &dhi)
static void send_dap4_csv_helper(std::ostream &out, libdap::DMR *dmr, const std::string &dap4Constraint)
Represents an OPeNDAP DMR DAP4 data object within the BES.
error object created from libdap error objects and can handle those errors
virtual libdap::DDS * intern_dap2_data(BESResponseObject *obj, BESDataHandlerInterface &dhi)
Structure storing information used by the BES to handle the request.
std::map< std::string, std::string > data
the map of string data that will be required for the current request.
void first_container()
set the container pointer to the first container in the containers list
Base exception class for the BES with basic string message.
exception thrown if internal error encountered
exception thrown if an internal error is found and is fatal to the BES
Abstract base class representing a specific set of information in response to a request to the BES.
static void conditional_timeout_cancel()
Checks if the timeout alarm should be canceled based on the value of the BES key BES....
static RequestServiceTimer * TheTimer()
Return a pointer to a singleton timer instance. If an instance does not exist it will create and init...
void throw_if_timeout_expired(const std::string &message, const std::string &file, const int line)
Checks the RequestServiceTimer to determine if the time spent servicing the request at this point has...