31#include <libdap/D4Group.h>
32#include <libdap/D4Attributes.h>
33#include <libdap/Array.h>
34#include <libdap/Structure.h>
38#include <BESInternalError.h>
42#include "FONcAttributes.h"
43#include "FONcTransmitter.h"
44#include "history_utils.h"
52#define prolog std::string("d4_tools::").append(__func__).append("() - ")
54bool d4_tools::has_dap4_types(D4Attribute *attr)
56 bool has_d4_attr =
false;
63 case attr_container_c:
64 has_d4_attr = has_dap4_types(attr->attributes());
72bool d4_tools::has_dap4_types(
const D4Attributes *attrs)
74 bool has_d4_attr =
false;
75 for (
auto attr: attrs->attributes()) {
76 if(has_dap4_types(attr))
77 has_d4_attr |= has_dap4_types(attr);
82bool d4_tools::is_dap4_projected(libdap::BaseType *var, vector<BaseType *> &inv) {
85 case libdap::dods_int8_c:
86 case libdap::dods_int64_c:
87 case libdap::dods_uint64_c:
90 case libdap::dods_array_c: {
91 auto *a =
dynamic_cast<Array*
>(var);
92 if (d4_tools::is_dap4_projected(a->var(), inv)) {
99 case libdap::dods_structure_c:
100 case libdap::dods_grid_c:
101 case libdap::dods_sequence_c: {
102 auto *svar =
dynamic_cast<Constructor*
>(var);
103 bool is_dap4 =
false;
104 for (
auto bvar = svar->var_begin(), evar = svar->var_end(); bvar != evar; ++bvar){
106 if (d4_tools::is_dap4_projected(*bvar, inv)){
110 if(is_dap4)
return true;
116 if(has_dap4_types(var->attributes())){
125bool d4_tools::is_dap4_projected(DDS *_dds, vector<BaseType *> &projected_dap4_variable_inventory) {
126 bool has_dap4_var =
false;
127 for (
auto btp = _dds->var_begin(), ve = _dds->var_end(); btp != ve; ++btp) {
129 BaseType *var = *btp;
130 if(var->send_p() && is_dap4_projected(var, projected_dap4_variable_inventory)){
139bool d4_tools::is_dap4_projected(DMR *_dmr, vector<BaseType *> &projected_dap4_variable_inventory) {
141 bool has_dap4_var =
false;
143 has_dap4_var = is_dap4_projected( _dmr->root(), projected_dap4_variable_inventory);
150bool d4_tools::is_dap4_projected(D4Group *group, vector<BaseType *> &projected_dap4_variable_inventory){
151 bool has_dap4_var =
false;
155 for (
auto btp = group->var_begin(), ve = group->var_end(); btp != ve; ++btp) {
156 BaseType *var = *btp;
158 if(var->send_p() && var->type() != libdap::dods_group_c){
159 if (is_dap4_projected(var, projected_dap4_variable_inventory)) {
163 else if (var->send_p() && var->type() == libdap::dods_group_c) {
165 D4Group *d4g =
dynamic_cast<D4Group *
>(var);
166 if (is_dap4_projected(d4g, projected_dap4_variable_inventory)) {
170 catch (
const exception &e){
171 throw BESInternalError(
"Exception: " +
string(e.what()), __FILE__, __LINE__);
177 for (
auto gb = group->grp_begin(), ge = group->grp_end(); gb != ge; ++gb){
180 if (is_dap4_projected(d4g, projected_dap4_variable_inventory)) {
184 catch (
const exception &e){
185 throw BESInternalError(
"Exception: " +
string(e.what()), __FILE__, __LINE__);
exception thrown if internal error encountered