37 #include <ConstraintEvaluator.h>
40 #include <D4ConstraintEvaluator.h>
41 #include <D4BaseTypeFactory.h>
42 #include <ServerFunctionsList.h>
43 #include <D4FunctionEvaluator.h>
45 #include <InternalErr.h>
48 #include <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 "BESAsciiTransmit.h"
68 #include "get_ascii.h"
69 #include "get_ascii_dap4.h"
71 using namespace dap_asciival;
74 BESAsciiTransmit::BESAsciiTransmit() :
77 add_method(DATA_SERVICE, BESAsciiTransmit::send_basic_ascii);
83 BESDEBUG(
"ascii",
"BESAsciiTransmit::send_basic_ascii() - BEGIN" << endl);
99 auto_ptr<DDS> ascii_dds(datadds_to_ascii_datadds(loaded_dds));
101 get_data_values_as_ascii(ascii_dds.get(), dhi.get_output_stream());
102 dhi.get_output_stream() << flush;
105 throw BESDapError(
"Failed to get values as ascii: " + e.get_error_message(),
false, e.get_error_code(), __FILE__, __LINE__);
110 catch (std::exception &e) {
111 throw BESInternalError(
"Failed to read data: STL Error: " +
string(e.what()), __FILE__, __LINE__);
114 throw BESInternalError(
"Failed to get values as ascii: Unknown exception caught", __FILE__, __LINE__);
117 BESDEBUG(
"ascii",
"Done BESAsciiTransmit::send_basic_ascii()" << endl);
126 if (!dap4Constraint.empty()) {
127 D4ConstraintEvaluator d4ce(dmr);
128 bool parse_ok = d4ce.parse(dap4Constraint);
129 if (!parse_ok)
throw Error(malformed_expr,
"Constraint Expression (" + dap4Constraint +
") failed to parse.");
132 dmr->root()->set_send_p(
true);
135 if (dmr->response_limit() != 0 && (dmr->request_size(
true) > dmr->response_limit())) {
136 string msg =
"The Request for " + long_to_string(dmr->request_size(
true))
137 +
"KB is too large; requests for this server are limited to " +
138 long_to_string(dmr->response_limit())
147 print_values_as_ascii(dmr, out);
156 BESDEBUG(
"ascii",
"BESAsciiTransmit::send_dap4_csv" << endl);
161 DMR *dmr = bdmr->get_dmr();
163 string dap4Constraint = www2id(dhi.
data[DAP4_CONSTRAINT],
"%",
"%20%26");
164 string dap4Function = www2id(dhi.
data[DAP4_FUNCTION],
"%",
"%20%26");
176 if (!dap4Function.empty()) {
177 D4BaseTypeFactory d4_factory;
178 DMR function_result(&d4_factory,
"function_results");
182 if (!ServerFunctionsList::TheList())
184 "The function expression could not be evaluated because there are no server functions defined on this server");
186 D4FunctionEvaluator parser(dmr, ServerFunctionsList::TheList());
187 bool parse_ok = parser.parse(dap4Function);
188 if (!parse_ok)
throw Error(
"Function Expression (" + dap4Function +
") failed to parse.");
190 parser.eval(&function_result);
203 if (!dap4Constraint.empty()) {
204 D4ConstraintEvaluator d4ce(dmr);
205 bool parse_ok = d4ce.parse(dap4Constraint);
206 if (!parse_ok)
throw Error(malformed_expr,
"Constraint Expression (" + dap4Constraint +
") failed to parse.");
209 dmr->root()->set_send_p(
true);
212 if (dmr->response_limit() != 0 && (dmr->request_size(
true) > dmr->response_limit())) {
213 string msg =
"The Request for " + long_to_string(dmr->request_size(
true))
214 +
"KB is too large; requests for this server are limited to " + long_to_string(dmr->response_limit())
223 print_values_as_ascii(dmr, dhi.get_output_stream());
224 dhi.get_output_stream() << flush;
228 throw BESDapError(
"Failed to return values as ascii: " + e.get_error_message(),
false, e.get_error_code(),__FILE__, __LINE__);
234 throw BESInternalError(
"Failed to return values as ascii: Unknown exception caught", __FILE__, __LINE__);
237 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
Abstract 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()