|
Packit |
a4aae4 |
// -*- mode: c++; c-basic-offset:4 -*-
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// This file is part of libdap, A C++ implementation of the OPeNDAP Data
|
|
Packit |
a4aae4 |
// Access Protocol.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// Copyright (c) 2002,2003,2013 OPeNDAP, Inc.
|
|
Packit |
a4aae4 |
// Author: James Gallagher <jgallagher@opendap.org>
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// This library is free software; you can redistribute it and/or
|
|
Packit |
a4aae4 |
// modify it under the terms of the GNU Lesser General Public
|
|
Packit |
a4aae4 |
// License as published by the Free Software Foundation; either
|
|
Packit |
a4aae4 |
// version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// This library is distributed in the hope that it will be useful,
|
|
Packit |
a4aae4 |
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
a4aae4 |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
a4aae4 |
// Lesser General Public License for more details.
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// You should have received a copy of the GNU Lesser General Public
|
|
Packit |
a4aae4 |
// License along with this library; if not, write to the Free Software
|
|
Packit |
a4aae4 |
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
Packit |
a4aae4 |
//
|
|
Packit |
a4aae4 |
// You can contact OPeNDAP, Inc. at PO Box 112, Saunderstown, RI. 02874-0112.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// Test the DMR parser
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "config.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include <stdint.h>
|
|
Packit |
a4aae4 |
#include <cstring>
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include <fstream>
|
|
Packit |
a4aae4 |
#include <memory>
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "crc.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include <GetOpt.h>
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "BaseType.h"
|
|
Packit |
a4aae4 |
#include "Array.h"
|
|
Packit |
a4aae4 |
#include "D4Enum.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "DMR.h"
|
|
Packit |
a4aae4 |
#include "D4Group.h"
|
|
Packit |
a4aae4 |
#include "D4StreamUnMarshaller.h"
|
|
Packit |
a4aae4 |
#include "chunked_ostream.h"
|
|
Packit |
a4aae4 |
#include "chunked_istream.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "util.h"
|
|
Packit |
a4aae4 |
#include "InternalErr.h"
|
|
Packit |
a4aae4 |
#include "Error.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "D4ResponseBuilder.h"
|
|
Packit |
a4aae4 |
#include "ConstraintEvaluator.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "D4ParserSax2.h"
|
|
Packit |
a4aae4 |
#include "D4TestTypeFactory.h"
|
|
Packit |
a4aae4 |
#include "TestCommon.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "D4ConstraintEvaluator.h"
|
|
Packit |
a4aae4 |
#include "D4FunctionEvaluator.h"
|
|
Packit |
a4aae4 |
#include "ServerFunctionsList.h"
|
|
Packit |
a4aae4 |
#include "D4TestFunction.h"
|
|
Packit |
a4aae4 |
#include "D4RValue.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "util.h"
|
|
Packit |
a4aae4 |
#include "mime_util.h"
|
|
Packit |
a4aae4 |
#include "debug.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
int test_variable_sleep_interval = 0; // Used in Test* classes for testing timeouts.
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
using namespace libdap;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/**
|
|
Packit |
a4aae4 |
* Open the named XML file and parse it, assuming that it contains a DMR.
|
|
Packit |
a4aae4 |
* @param name The name of the DMR XML file (or '-' for stdin)
|
|
Packit |
a4aae4 |
* @param debug True if the debug mode of the parse should be used
|
|
Packit |
a4aae4 |
* @param print Once parsed, should the DMR object be printed?
|
|
Packit |
a4aae4 |
* @return true if the parse worked, false otherwise
|
|
Packit |
a4aae4 |
*/
|
|
Packit |
a4aae4 |
DMR *
|
|
Packit |
a4aae4 |
test_dap4_parser(const string &name, bool debug, bool print)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
D4TestTypeFactory *factory = new D4TestTypeFactory;
|
|
Packit |
a4aae4 |
DMR *dataset = new DMR(factory, path_to_filename(name));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
try {
|
|
Packit |
a4aae4 |
D4ParserSax2 parser;
|
|
Packit |
a4aae4 |
if (name == "-") {
|
|
Packit |
a4aae4 |
parser.intern(cin, dataset, debug);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
else {
|
|
Packit |
a4aae4 |
fstream in(name.c_str(), ios_base::in);
|
|
Packit |
a4aae4 |
parser.intern(in, dataset, debug);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
catch(...) {
|
|
Packit |
a4aae4 |
delete factory;
|
|
Packit |
a4aae4 |
delete dataset;
|
|
Packit |
a4aae4 |
throw;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
cout << "Parse successful" << endl;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (print) {
|
|
Packit |
a4aae4 |
XMLWriter xml(" ");
|
|
Packit |
a4aae4 |
dataset->print_dap4(xml, false);
|
|
Packit |
a4aae4 |
cout << xml.get_doc() << endl;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
delete factory;
|
|
Packit |
a4aae4 |
dataset->set_factory(0);
|
|
Packit |
a4aae4 |
return dataset;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/**
|
|
Packit |
a4aae4 |
* Should the changing values - meant to mimic the DTS - be used?
|
|
Packit |
a4aae4 |
* @param dmr Set for this DMR
|
|
Packit |
a4aae4 |
* @param state True to use the DTS-like values, false otherwise
|
|
Packit |
a4aae4 |
*/
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
set_series_values(DMR *dmr, bool state)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
if (state == true)
|
|
Packit |
a4aae4 |
dmr->root()->set_read_p(false);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
TestCommon *tc = dynamic_cast<TestCommon*>(dmr->root());
|
|
Packit |
a4aae4 |
if (tc)
|
|
Packit |
a4aae4 |
tc->set_series_values(state);
|
|
Packit |
a4aae4 |
else
|
|
Packit |
a4aae4 |
cerr << "Could not cast root group to TestCommon (" << dmr->root()->type_name() << ", " << dmr->root()->name() << ")" << endl;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/**
|
|
Packit |
a4aae4 |
* Call the parser and then serialize the resulting DMR after applying the
|
|
Packit |
a4aae4 |
* constraint. The persistent representation is written to a file. The file
|
|
Packit |
a4aae4 |
* is name '<name>_data.bin'.
|
|
Packit |
a4aae4 |
*
|
|
Packit |
a4aae4 |
* @param dataset
|
|
Packit |
a4aae4 |
* @param constraint
|
|
Packit |
a4aae4 |
* @param series_values
|
|
Packit |
a4aae4 |
* @return The name of the file that hods the response.
|
|
Packit |
a4aae4 |
*/
|
|
Packit |
a4aae4 |
string
|
|
Packit |
a4aae4 |
send_data(DMR *dataset, const string &constraint, const string &function, bool series_values, bool ce_parser_debug)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
set_series_values(dataset, series_values);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// This will be used by the DMR that holds the results of running the functions.
|
|
Packit |
a4aae4 |
// It's declared at this scope because we (may) need it for the code beyond the
|
|
Packit |
a4aae4 |
// function parse/eval code that immediately follows. jhrg 3/12/14
|
|
Packit |
a4aae4 |
D4TestTypeFactory d4_factory;
|
|
Packit |
a4aae4 |
auto_ptr<DMR> function_result(new DMR(&d4_factory, "function_results"));
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// The Function Parser
|
|
Packit |
a4aae4 |
if (!function.empty()) {
|
|
Packit |
a4aae4 |
ServerFunctionsList *sf_list = ServerFunctionsList::TheList();
|
|
Packit |
a4aae4 |
ServerFunction *scale = new D4TestFunction;
|
|
Packit |
a4aae4 |
sf_list->add_function(scale);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4FunctionEvaluator parser(dataset, sf_list);
|
|
Packit |
a4aae4 |
if (ce_parser_debug) parser.set_trace_parsing(true);
|
|
Packit |
a4aae4 |
bool parse_ok = parser.parse(function);
|
|
Packit |
a4aae4 |
if (!parse_ok)
|
|
Packit |
a4aae4 |
Error("Function Expression failed to parse.");
|
|
Packit |
a4aae4 |
else {
|
|
Packit |
a4aae4 |
if (ce_parser_debug) cerr << "Function Parse OK" << endl;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
parser.eval(function_result.get());
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// Now use the results of running the functions for the remainder of the
|
|
Packit |
a4aae4 |
// send_data operation.
|
|
Packit |
a4aae4 |
dataset = function_result.release();
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4ResponseBuilder rb;
|
|
Packit |
a4aae4 |
rb.set_dataset_name(dataset->name());
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
string file_name = dataset->name() + "_data.bin";
|
|
Packit |
a4aae4 |
ofstream out(file_name.c_str(), ios::out|ios::trunc|ios::binary);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (!constraint.empty()) {
|
|
Packit |
a4aae4 |
D4ConstraintEvaluator parser(dataset);
|
|
Packit |
a4aae4 |
if (ce_parser_debug)
|
|
Packit |
a4aae4 |
parser.set_trace_parsing(true);
|
|
Packit |
a4aae4 |
bool parse_ok = parser.parse(constraint);
|
|
Packit |
a4aae4 |
if (!parse_ok)
|
|
Packit |
a4aae4 |
throw Error("Constraint Expression failed to parse.");
|
|
Packit |
a4aae4 |
else if (ce_parser_debug)
|
|
Packit |
a4aae4 |
cerr << "CE Parse OK" << endl;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
else {
|
|
Packit |
a4aae4 |
dataset->root()->set_send_p(true);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
rb.send_dap(out, *dataset, /*with mime headers*/ true, !constraint.empty());
|
|
Packit |
a4aae4 |
out.close();
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
return file_name;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
intern_data(DMR *dataset, /*const string &constraint,*/ bool series_values)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
set_series_values(dataset, series_values);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// Mark all variables to be sent in their entirety. No CEs are used
|
|
Packit |
a4aae4 |
// when 'interning' variables' data.
|
|
Packit |
a4aae4 |
dataset->root()->set_send_p(true);
|
|
Packit |
a4aae4 |
#if 0
|
|
Packit |
a4aae4 |
Crc32 checksum;
|
|
Packit |
a4aae4 |
#endif
|
|
Packit |
a4aae4 |
dataset->root()->intern_data(/*checksum, *dataset, eval*/);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
DMR *
|
|
Packit |
a4aae4 |
read_data_plain(const string &file_name, bool debug)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
D4BaseTypeFactory *factory = new D4BaseTypeFactory;
|
|
Packit |
a4aae4 |
DMR *dmr = new DMR(factory, "Test_data");
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
fstream in(file_name.c_str(), ios::in|ios::binary);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// Gobble up the response's initial set of MIME headers. Normally
|
|
Packit |
a4aae4 |
// a client would extract information from these headers.
|
|
Packit |
a4aae4 |
remove_mime_header(in);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
chunked_istream cis(in, CHUNK_SIZE);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// parse the DMR, stopping when the boundary is found.
|
|
Packit |
a4aae4 |
try {
|
|
Packit |
a4aae4 |
// force chunk read
|
|
Packit |
a4aae4 |
// get chunk size
|
|
Packit |
a4aae4 |
int chunk_size = cis.read_next_chunk();
|
|
Packit |
a4aae4 |
// get chunk
|
|
Packit |
a4aae4 |
char chunk[chunk_size];
|
|
Packit |
a4aae4 |
cis.read(chunk, chunk_size);
|
|
Packit |
a4aae4 |
// parse char * with given size
|
|
Packit |
a4aae4 |
D4ParserSax2 parser;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// Mirror the behavior in D4Connect where we are permissive with DAP4
|
|
Packit |
a4aae4 |
// data responses' parsing, as per Hyrax-98 in Jira. jhrg 4/13/16
|
|
Packit |
a4aae4 |
parser.set_strict(false);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// '-2' to discard the CRLF pair
|
|
Packit |
a4aae4 |
parser.intern(chunk, chunk_size-2, dmr, debug);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
catch(Error &e) {
|
|
Packit |
a4aae4 |
delete factory;
|
|
Packit |
a4aae4 |
delete dmr;
|
|
Packit |
a4aae4 |
cerr << "Exception: " << e.get_error_message() << endl;
|
|
Packit |
a4aae4 |
return 0;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
catch(std::exception &e) {
|
|
Packit |
a4aae4 |
delete factory;
|
|
Packit |
a4aae4 |
delete dmr;
|
|
Packit |
a4aae4 |
cerr << "Exception: " << e.what() << endl;
|
|
Packit |
a4aae4 |
return 0;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
catch(...) {
|
|
Packit |
a4aae4 |
delete factory;
|
|
Packit |
a4aae4 |
delete dmr;
|
|
Packit |
a4aae4 |
cerr << "Exception: unknown error" << endl;
|
|
Packit |
a4aae4 |
return 0;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4StreamUnMarshaller um(cis, cis.twiddle_bytes());
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
dmr->root()->deserialize(um, *dmr);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
delete factory;
|
|
Packit |
a4aae4 |
dmr->set_factory(0);
|
|
Packit |
a4aae4 |
return dmr;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
static void usage()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
cerr << "Usage: dmr-test -p|s|t|i <file> [-c <expr>] [-f <function expression>] [-d -x -e]" << endl
|
|
Packit |
a4aae4 |
<< "p: Parse a file (use \"-\" for stdin; if a ce or a function is passed those are parsed too)" << endl
|
|
Packit |
a4aae4 |
<< "s: Send: parse and then 'send' a response to a file" << endl
|
|
Packit |
a4aae4 |
<< "t: Transmit: parse, send and then read the response file" << endl
|
|
Packit |
a4aae4 |
<< "i: Intern values (ce and function will be ignored by this)" << endl
|
|
Packit |
a4aae4 |
<< "c: Constraint expression " << endl
|
|
Packit |
a4aae4 |
<< "f: Function expression" << endl
|
|
Packit |
a4aae4 |
<< "d: turn on detailed xml parser debugging" << endl
|
|
Packit |
a4aae4 |
<< "D: turn on detailed ce parser debugging" << endl
|
|
Packit |
a4aae4 |
<< "x: print the binary object(s) built by the parse, send, trans or intern operations." << endl
|
|
Packit |
a4aae4 |
<< "e: use sEries values." << endl;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
int
|
|
Packit |
a4aae4 |
main(int argc, char *argv[])
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
GetOpt getopt(argc, argv, "p:s:t:i:c:f:xdDeh?");
|
|
Packit |
a4aae4 |
int option_char;
|
|
Packit |
a4aae4 |
bool parse = false;
|
|
Packit |
a4aae4 |
bool debug = false;
|
|
Packit |
a4aae4 |
bool print = false;
|
|
Packit |
a4aae4 |
bool send = false;
|
|
Packit |
a4aae4 |
bool trans = false;
|
|
Packit |
a4aae4 |
bool intern = false;
|
|
Packit |
a4aae4 |
bool series_values = false;
|
|
Packit |
a4aae4 |
bool constrained = false;
|
|
Packit |
a4aae4 |
bool functional = false;
|
|
Packit |
a4aae4 |
bool ce_parser_debug = false;
|
|
Packit |
a4aae4 |
string name = "";
|
|
Packit |
a4aae4 |
string ce = "";
|
|
Packit |
a4aae4 |
string function = "";
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// process options
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
while ((option_char = getopt()) != -1)
|
|
Packit |
a4aae4 |
switch (option_char) {
|
|
Packit |
a4aae4 |
case 'p':
|
|
Packit |
a4aae4 |
parse = true;
|
|
Packit |
a4aae4 |
name = getopt.optarg;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case 's':
|
|
Packit |
a4aae4 |
send = true;
|
|
Packit |
a4aae4 |
name = getopt.optarg;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case 't':
|
|
Packit |
a4aae4 |
trans = true;
|
|
Packit |
a4aae4 |
name = getopt.optarg;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case 'i':
|
|
Packit |
a4aae4 |
intern = true;
|
|
Packit |
a4aae4 |
name = getopt.optarg;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case 'c':
|
|
Packit |
a4aae4 |
constrained = true;
|
|
Packit |
a4aae4 |
ce = getopt.optarg;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case 'f':
|
|
Packit |
a4aae4 |
functional = true;
|
|
Packit |
a4aae4 |
function = getopt.optarg;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case 'd':
|
|
Packit |
a4aae4 |
debug = true;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case 'D':
|
|
Packit |
a4aae4 |
ce_parser_debug = true;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case 'x':
|
|
Packit |
a4aae4 |
print = true;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case 'e':
|
|
Packit |
a4aae4 |
series_values = true;
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case '?':
|
|
Packit |
a4aae4 |
case 'h':
|
|
Packit |
a4aae4 |
usage();
|
|
Packit |
a4aae4 |
return 0;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
default:
|
|
Packit |
a4aae4 |
cerr << "Error: ";
|
|
Packit |
a4aae4 |
usage();
|
|
Packit |
a4aae4 |
return 1;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (! (parse || send || trans || intern)) {
|
|
Packit |
a4aae4 |
cerr << "Error: ";
|
|
Packit |
a4aae4 |
usage();
|
|
Packit |
a4aae4 |
return 1;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
try {
|
|
Packit |
a4aae4 |
if (parse) {
|
|
Packit |
a4aae4 |
DMR *dmr = test_dap4_parser(name, debug, print);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// The CE Parser
|
|
Packit |
a4aae4 |
if (!ce.empty()) {
|
|
Packit |
a4aae4 |
try {
|
|
Packit |
a4aae4 |
D4ConstraintEvaluator parser(dmr);
|
|
Packit |
a4aae4 |
if (ce_parser_debug) parser.set_trace_parsing(true);
|
|
Packit |
a4aae4 |
bool parse_ok = parser.parse(ce);
|
|
Packit |
a4aae4 |
if (!parse_ok)
|
|
Packit |
a4aae4 |
cout << "CE Parse Failed" << endl;
|
|
Packit |
a4aae4 |
else
|
|
Packit |
a4aae4 |
cout << "CE Parse OK" << endl;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
catch (Error &e) {
|
|
Packit |
a4aae4 |
cerr << "CE Parse error: " << e.get_error_message() << endl;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
catch (...) {
|
|
Packit |
a4aae4 |
cerr << "Ce Parse error: Unknown exception thrown by parser" << endl;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// The Function Parser
|
|
Packit |
a4aae4 |
if (!function.empty()) {
|
|
Packit |
a4aae4 |
try {
|
|
Packit |
a4aae4 |
ServerFunctionsList *sf_list = ServerFunctionsList::TheList();
|
|
Packit |
a4aae4 |
ServerFunction *scale = new D4TestFunction;
|
|
Packit |
a4aae4 |
sf_list->add_function(scale);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4FunctionEvaluator parser(dmr, sf_list);
|
|
Packit |
a4aae4 |
if (ce_parser_debug) parser.set_trace_parsing(true);
|
|
Packit |
a4aae4 |
bool parse_ok = parser.parse(function);
|
|
Packit |
a4aae4 |
if (!parse_ok)
|
|
Packit |
a4aae4 |
cout << "Function Parse Failed" << endl;
|
|
Packit |
a4aae4 |
else
|
|
Packit |
a4aae4 |
cout << "Function Parse OK" << endl;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
catch (Error &e) {
|
|
Packit |
a4aae4 |
cerr << "Function Parse error: " << e.get_error_message() << endl;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
catch (...) {
|
|
Packit |
a4aae4 |
cerr << "Function Parse error: Unknown exception thrown by parser" << endl;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
delete dmr;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (send) {
|
|
Packit |
a4aae4 |
DMR *dmr = test_dap4_parser(name, debug, print);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
string file_name = send_data(dmr, ce, function, series_values, ce_parser_debug);
|
|
Packit |
a4aae4 |
if (print)
|
|
Packit |
a4aae4 |
cout << "Response file: " << file_name << endl;
|
|
Packit |
a4aae4 |
delete dmr;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (trans) {
|
|
Packit |
a4aae4 |
DMR *dmr = test_dap4_parser(name, debug, print);
|
|
Packit |
a4aae4 |
string file_name = send_data(dmr, ce, function, series_values, ce_parser_debug);
|
|
Packit |
a4aae4 |
delete dmr;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
DMR *client = read_data_plain(file_name, debug);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (print) {
|
|
Packit |
a4aae4 |
XMLWriter xml;
|
|
Packit |
a4aae4 |
// received data never have send_p set; don't set 'constrained'
|
|
Packit |
a4aae4 |
client->print_dap4(xml, false /* constrained */);
|
|
Packit |
a4aae4 |
cout << xml.get_doc() << endl;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
cout << "The data:" << endl;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// if trans is used, the data are printed regardless of print's value
|
|
Packit |
a4aae4 |
client->root()->print_val(cout, "", false);
|
|
Packit |
a4aae4 |
cout << endl;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
delete client;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (intern) {
|
|
Packit |
a4aae4 |
DMR *dmr = test_dap4_parser(name, debug, print);
|
|
Packit |
a4aae4 |
intern_data(dmr, /*ce,*/ series_values);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (print) {
|
|
Packit |
a4aae4 |
XMLWriter xml;
|
|
Packit |
a4aae4 |
dmr->print_dap4(xml, false /*constrained*/);
|
|
Packit |
a4aae4 |
cout << xml.get_doc() << endl;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
cout << "The data:" << endl;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// if trans is used, the data are printed regardless of print's value
|
|
Packit |
a4aae4 |
dmr->root()->print_val(cout, /*space*/"", false);
|
|
Packit |
a4aae4 |
cout << endl;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
delete dmr;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
catch (Error &e) {
|
|
Packit |
a4aae4 |
cerr << "Error: " << e.get_error_message() << endl;
|
|
Packit |
a4aae4 |
return 1;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
return 0;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|