49 #include "XMLWriter.h"
50 #include "D4BaseTypeFactory.h"
51 #include "D4Attributes.h"
62 const string c_xml_xsi =
"http://www.w3.org/2001/XMLSchema-instance";
63 const string c_xml_namespace =
"http://www.w3.org/XML/1998/namespace";
65 const string c_default_dap40_schema_location =
"http://xml.opendap.org/dap/dap4.0.xsd";
67 const string c_dap40_namespace =
"http://xml.opendap.org/ns/DAP/4.0#";
69 const string c_dap_40_n_sl = c_dap40_namespace +
" " + c_default_dap40_schema_location;
76 DMR::m_duplicate(
const DMR &dmr)
81 d_factory = dmr.d_factory;
84 d_filename = dmr.d_filename;
86 d_dap_major = dmr.d_dap_major;
87 d_dap_minor = dmr.d_dap_minor;
88 d_dap_version = dmr.d_dap_version;
90 d_dmr_version = dmr.d_dmr_version;
92 d_request_xml_base = dmr.d_request_xml_base;
94 d_namespace = dmr.d_namespace;
96 d_max_response_size = dmr.d_max_response_size;
100 d_root =
static_cast<D4Group*
>(dmr.d_root->ptr_duplicate());
101 DBG(cerr <<
"dmr.d_root: " << dmr.d_root << endl);
102 DBG(cerr <<
"d_root (from ptr_dup(): " << d_root << endl);
120 : d_factory(factory), d_name(name), d_filename(
""),
121 d_dap_major(4), d_dap_minor(0),
122 d_dmr_version(
"1.0"), d_request_xml_base(
""),
123 d_namespace(c_dap40_namespace), d_max_response_size(0), d_root(0)
150 : d_factory(factory), d_name(dds.get_dataset_name()),
151 d_filename(dds.filename()), d_dap_major(4), d_dap_minor(0),
152 d_dmr_version(
"1.0"), d_request_xml_base(
""),
153 d_namespace(c_dap40_namespace), d_max_response_size(0), d_root(0)
182 : d_factory(0), d_name(
""), d_filename(
""), d_dap_major(4), d_dap_minor(0),
183 d_dap_version(
"4.0"), d_dmr_version(
"1.0"), d_request_xml_base(
""),
184 d_namespace(c_dap40_namespace), d_max_response_size(0), d_root(0)
207 DMR::operator=(
const DMR &rhs)
239 DBG(cerr << __func__ <<
"() - Transforming top level variable: " <<
240 " (" << (*i)->type_name() <<
":'" << (*i)->name() <<
"':"<<(
void *)(*i) <<
241 ") (root:"<< root_grp <<
")"<< endl; );
242 (*i)->transform_to_dap4(root_grp, root_grp);
243 DBG(cerr << __func__ <<
"() - top level variable: '" <<
244 (*i)->name() <<
"' (type:" << (*i)->type_name() <<
") Transformed"<< endl; );
247 DBG(cerr << __func__ <<
"() - Skipping variable: " <<
248 d4_var->
type_name() <<
" " << d4_var->
name() <<
" because a variable with" <<
249 " this name already exists in the root group." << endl; );
267 DBG( cerr << __func__ <<
"() - BEGIN" << endl;);
280 vector<BaseType *>::iterator vIter = top_vars->begin();
281 vector<BaseType *>::iterator vEnd = top_vars->end();
282 for( ; vIter!=vEnd ; vIter++){
287 set<string> shared_dim_candidates;
289 vector<BaseType *> dropped_vars;
292 DBG( cerr << __func__ <<
"() - Processing top level variable '"<< (*i)->type_name() <<
" " << (*i)->name() <<
"' to DDS." << endl; );
293 vector<BaseType *> *new_vars = (*i)->transform_to_dap2(&(dds->
get_attr_table()));
295 vector<BaseType*>::iterator vIter = new_vars->begin();
296 vector<BaseType*>::iterator end = new_vars->end();
297 for( ; vIter!=end ; vIter++ ){
299 DBG( cerr << __func__ <<
"() - Adding variable name: '"<< new_var->
name() <<
"' " <<
300 "type: " << new_var->
type() <<
" " <<
301 "type_name: " << new_var->
type_name() <<
" to DDS." << endl; );
303 Grid *grid =
dynamic_cast <Grid *
>(new_var);
306 for( ; m != grid->
map_end() ; m++){
307 shared_dim_candidates.insert((*m)->name());
315 DBG( cerr << __func__ <<
"Adding variable '"<< (*i)->type_name() <<
" " << (*i)->name() <<
"' to drop list." << endl; );
316 dropped_vars.push_back((*i));
319 AttrTable *dv_table = Constructor::make_dropped_vars_attr_table(&dropped_vars);
321 DBG( cerr << __func__ <<
"() - Adding dropped variable AttrTable." << endl;);
328 for( ; gIter!=gEnd ; gIter++){
330 DBG( cerr << __func__ <<
"() - Processing D4Group " << grp->
name() << endl;);
333 DBG( cerr << __func__ <<
"() - Processing " << grp->
name() <<
" Member Variables." << endl;);
334 vector<BaseType *>::iterator vIter = d2_vars->begin();
335 vector<BaseType *>::iterator vEnd = d2_vars->end();
336 for( ; vIter!=vEnd; vIter++){
337 DBG( cerr << __func__ <<
"() - Processing " << grp->
name() <<
" Member Variable: " << (*vIter)->name() << endl;);
345 DBG( cerr << __func__ <<
"() - END" << endl;);
352 return DMR::getDDS(*
this);
362 if (!d_root) d_root =
static_cast<D4Group*
>(d_factory->
NewVariable(dods_group_c,
"/"));
374 istringstream iss(v);
376 int major = -1, minor = -1;
378 if (!iss.eof() && !iss.fail())
380 if (!iss.eof() && !iss.fail())
382 if (!iss.eof() && !iss.fail())
385 if (major == -1 || minor == -1 or dot !=
'.')
386 throw InternalErr(__FILE__, __LINE__,
"Could not parse dap version. Value given: " + v);
397 switch (d_dap_major) {
399 d_namespace = c_dap40_namespace;
433 if (xmlTextWriterStartElement(xml.get_writer(), (
const xmlChar*)
"Dataset") < 0)
434 throw InternalErr(__FILE__, __LINE__,
"Could not write Dataset element");
438 if (xmlTextWriterWriteAttribute(xml.get_writer(), (
const xmlChar*)
"xmlns:xml",
439 (
const xmlChar*) c_xml_namespace.c_str()) < 0)
440 throw InternalErr(__FILE__, __LINE__,
"Could not write attribute for xmlns:xml");
442 if (xmlTextWriterWriteAttribute(xml.get_writer(), (
const xmlChar*)
"xmlns:xsi", (
const xmlChar*) c_xml_xsi.c_str())
444 throw InternalErr(__FILE__, __LINE__,
"Could not write attribute for xmlns:xsi");
446 if (xmlTextWriterWriteAttribute(xml.get_writer(), (
const xmlChar*)
"xsi:schemaLocation",
447 (
const xmlChar*) c_dap_40_n_sl.c_str()) < 0)
448 throw InternalErr(__FILE__, __LINE__,
"Could not write attribute for xmlns:schemaLocation");
451 if (xmlTextWriterWriteAttribute(xml.get_writer(), (
const xmlChar*)
"xmlns", (
const xmlChar*)
get_namespace().c_str()) < 0)
452 throw InternalErr(__FILE__, __LINE__,
"Could not write attribute for xmlns");
455 if (xmlTextWriterWriteAttribute(xml.get_writer(), (
const xmlChar*)
"xml:base",
457 throw InternalErr(__FILE__, __LINE__,
"Could not write attribute for xml:base");
460 if (xmlTextWriterWriteAttribute(xml.get_writer(), (
const xmlChar*)
"dapVersion", (
const xmlChar*)dap_version().c_str()) < 0)
461 throw InternalErr(__FILE__, __LINE__,
"Could not write attribute for dapVersion");
463 if (xmlTextWriterWriteAttribute(xml.get_writer(), (
const xmlChar*)
"dmrVersion", (
const xmlChar*)dmr_version().c_str()) < 0)
464 throw InternalErr(__FILE__, __LINE__,
"Could not write attribute for dapVersion");
466 if (xmlTextWriterWriteAttribute(xml.get_writer(), (
const xmlChar*)
"name", (
const xmlChar*)
name().c_str()) < 0)
467 throw InternalErr(__FILE__, __LINE__,
"Could not write attribute for name");
471 if (xmlTextWriterEndElement(xml.get_writer()) < 0)
472 throw InternalErr(__FILE__, __LINE__,
"Could not end the top-level Group element");
486 strm << DapIndent::LMarg <<
"DMR::dump - ("
487 << (
void *)
this <<
")" << endl ;
488 DapIndent::Indent() ;
489 strm << DapIndent::LMarg <<
"factory: " << (
void *)d_factory << endl ;
490 strm << DapIndent::LMarg <<
"name: " << d_name << endl ;
491 strm << DapIndent::LMarg <<
"filename: " << d_filename << endl ;
492 strm << DapIndent::LMarg <<
"protocol major: " << d_dap_major << endl;
493 strm << DapIndent::LMarg <<
"protocol minor: " << d_dap_minor << endl;
495 DapIndent::UnIndent() ;