34#define PUGIXML_NO_XPATH
35#define PUGIXML_HEADER_ONLY
38#include <libdap/Type.h>
55using shape = std::vector<unsigned long long>;
75 pugi::xml_document d_xml_doc;
76 std::shared_ptr<http::url> d_dataset_elem_href;
79 static const std::set<std::string> variable_elements;
81 void process_dataset(libdap::DMR *dmr,
const pugi::xml_node &xml_root);
82 static pugi::xml_node get_variable_xml_node(libdap::BaseType *btp);
86 static void process_fill_value_chunks(
dmrpp::DmrppCommon *dc,
const std::set<shape> &chunk_map,
const shape &chunk_shape,
87 const shape &array_shape,
unsigned long long chunk_size);
89 static std::vector<unsigned long long int> get_array_dims(libdap::Array *array);
90 static size_t logical_chunks(
const std::vector<unsigned long long> &array_dim_sizes,
const dmrpp::DmrppCommon *dc);
91 static std::set< std::vector<unsigned long long> > get_chunk_map(
const std::vector<std::shared_ptr<Chunk>> &chunks);
93 static void process_compact(libdap::BaseType *btp,
const pugi::xml_node &compact);
95 static pugi::xml_node get_variable_xml_node_helper(
const pugi::xml_node &var_node, std::stack<libdap::BaseType*> &bt);
96 static void build_basetype_chain(libdap::BaseType *btp, std::stack<libdap::BaseType*> &bt);
98 static void process_group(libdap::DMR *dmr, libdap::D4Group *parent,
const pugi::xml_node &var_node);
99 static void process_dimension(libdap::D4Group *grp,
const pugi::xml_node &dimension_node);
100 static void process_variable(libdap::DMR *dmr, libdap::D4Group *grp, libdap::Constructor *parent,
const pugi::xml_node &var_node);
101 static void process_dim(libdap::DMR *dmr, libdap::D4Group *grp, libdap::Array *array,
const pugi::xml_node &dim_node);
102 static void process_map(libdap::DMR *dmr, libdap::D4Group *grp, libdap::Array *array,
const pugi::xml_node &map_node);
103 static libdap::BaseType *build_variable(libdap::DMR *dmr, libdap::D4Group *group, libdap::Type t,
const pugi::xml_node &var_node);
104 static libdap::BaseType *add_scalar_variable(libdap::DMR *dmr, libdap::D4Group *group, libdap::Constructor *parent, libdap::Type t,
const pugi::xml_node &var_node);
105 static libdap::BaseType *add_array_variable(libdap::DMR *dmr, libdap::D4Group *grp, libdap::Constructor *parent, libdap::Type t,
const pugi::xml_node &var_node);
106 static void process_attribute(libdap::D4Attributes *attributes,
const pugi::xml_node &dap_attr_node);
110 void load_attributes(libdap::BaseType *btp, pugi::xml_node var_node)
const;
112 friend class DMZTest;
119 explicit DMZ(
const std::string &file_name);
121 virtual ~DMZ() =
default;
128 virtual void load_attributes(libdap::BaseType *btp);
129 virtual void load_attributes(libdap::Constructor *constructor);
130 virtual void load_attributes(libdap::D4Group *group);
134 virtual void load_all_attributes(libdap::DMR *dmr);
Interface to hide the DMR++ information storage format.
DMZ()=default
Build a DMZ without simultaneously parsing an XML document.
virtual void load_chunks(libdap::BaseType *btp)
Load the chunk information into a variable.
void parse_xml_doc(const std::string &filename)
Build the DOM tree for a DMR++ XML document.
virtual void build_thin_dmr(libdap::DMR *dmr)
populate the DMR instance as a 'thin DMR'
Size and offset information of data included in DMR++ files.
utility class for the HTTP catalog module