|
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) 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 |
#include "config.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
//#define DODS_DEBUG
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "D4Attributes.h"
|
|
Packit |
a4aae4 |
#include "D4AttributeType.h"
|
|
Packit |
a4aae4 |
#include "InternalErr.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "AttrTable.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
#include "util.h"
|
|
Packit |
a4aae4 |
#include "debug.h"
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
namespace libdap {
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/** Convert an AttrType to it's string representation.
|
|
Packit |
a4aae4 |
@param at The Attribute Type.
|
|
Packit |
a4aae4 |
@return The type's string representation */
|
|
Packit |
a4aae4 |
string D4AttributeTypeToString(D4AttributeType at)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
switch(at) {
|
|
Packit |
a4aae4 |
case attr_null_c:
|
|
Packit |
a4aae4 |
return "null";
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case attr_byte_c:
|
|
Packit |
a4aae4 |
return "Byte";
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case attr_int16_c:
|
|
Packit |
a4aae4 |
return "Int16";
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case attr_uint16_c:
|
|
Packit |
a4aae4 |
return "UInt16";
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case attr_int32_c:
|
|
Packit |
a4aae4 |
return "Int32";
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case attr_uint32_c:
|
|
Packit |
a4aae4 |
return "UInt32";
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case attr_float32_c:
|
|
Packit |
a4aae4 |
return "Float32";
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case attr_float64_c:
|
|
Packit |
a4aae4 |
return "Float64";
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case attr_str_c:
|
|
Packit |
a4aae4 |
return "String";
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case attr_url_c:
|
|
Packit |
a4aae4 |
return "Url";
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// Added for DAP4
|
|
Packit |
a4aae4 |
case attr_int8_c:
|
|
Packit |
a4aae4 |
return "Int8";
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case attr_uint8_c:
|
|
Packit |
a4aae4 |
return "UInt8";
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case attr_int64_c:
|
|
Packit |
a4aae4 |
return "Int64";
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case attr_uint64_c:
|
|
Packit |
a4aae4 |
return "UInt64";
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case attr_enum_c:
|
|
Packit |
a4aae4 |
return "Enum";
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case attr_opaque_c:
|
|
Packit |
a4aae4 |
return "Opaque";
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// These are specific to attributes while the other types are
|
|
Packit |
a4aae4 |
// also supported by the variables. jhrg 4/17/13
|
|
Packit |
a4aae4 |
case attr_container_c:
|
|
Packit |
a4aae4 |
return "Container";
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case attr_otherxml_c:
|
|
Packit |
a4aae4 |
return "OtherXML";
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
default:
|
|
Packit |
a4aae4 |
throw InternalErr(__FILE__, __LINE__, "Unsupported attribute type");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4AttributeType StringToD4AttributeType(string s)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
downcase(s);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (s == "container")
|
|
Packit |
a4aae4 |
return attr_container_c;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
else if (s == "byte")
|
|
Packit |
a4aae4 |
return attr_byte_c;
|
|
Packit |
a4aae4 |
else if (s == "int8")
|
|
Packit |
a4aae4 |
return attr_int8_c;
|
|
Packit |
a4aae4 |
else if (s == "uint8")
|
|
Packit |
a4aae4 |
return attr_uint8_c;
|
|
Packit |
a4aae4 |
else if (s == "int16")
|
|
Packit |
a4aae4 |
return attr_int16_c;
|
|
Packit |
a4aae4 |
else if (s == "uint16")
|
|
Packit |
a4aae4 |
return attr_uint16_c;
|
|
Packit |
a4aae4 |
else if (s == "int32")
|
|
Packit |
a4aae4 |
return attr_int32_c;
|
|
Packit |
a4aae4 |
else if (s == "uint32")
|
|
Packit |
a4aae4 |
return attr_uint32_c;
|
|
Packit |
a4aae4 |
else if (s == "int64")
|
|
Packit |
a4aae4 |
return attr_int64_c;
|
|
Packit |
a4aae4 |
else if (s == "uint64")
|
|
Packit |
a4aae4 |
return attr_uint64_c;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
else if (s == "float32")
|
|
Packit |
a4aae4 |
return attr_float32_c;
|
|
Packit |
a4aae4 |
else if (s == "float64")
|
|
Packit |
a4aae4 |
return attr_float64_c;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
else if (s == "string")
|
|
Packit |
a4aae4 |
return attr_str_c;
|
|
Packit |
a4aae4 |
else if (s == "url")
|
|
Packit |
a4aae4 |
return attr_url_c;
|
|
Packit |
a4aae4 |
else if (s == "otherxml")
|
|
Packit |
a4aae4 |
return attr_otherxml_c;
|
|
Packit |
a4aae4 |
else
|
|
Packit |
a4aae4 |
return attr_null_c;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
D4Attribute::m_duplicate(const D4Attribute &src)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
d_name = src.d_name;
|
|
Packit |
a4aae4 |
d_type = src.d_type;
|
|
Packit |
a4aae4 |
d_values = src.d_values;
|
|
Packit |
a4aae4 |
if (src.d_attributes)
|
|
Packit |
a4aae4 |
d_attributes = new D4Attributes(*src.d_attributes);
|
|
Packit |
a4aae4 |
else
|
|
Packit |
a4aae4 |
d_attributes = 0;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4Attribute::D4Attribute(const D4Attribute &src)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
m_duplicate(src);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4Attribute::~D4Attribute()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
delete d_attributes;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4Attribute &
|
|
Packit |
a4aae4 |
D4Attribute::operator=(const D4Attribute &rhs)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
if (this == &rhs) return *this;
|
|
Packit |
a4aae4 |
m_duplicate(rhs);
|
|
Packit |
a4aae4 |
return *this;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4Attributes *
|
|
Packit |
a4aae4 |
D4Attribute::attributes()
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
if (!d_attributes) d_attributes = new D4Attributes();
|
|
Packit |
a4aae4 |
return d_attributes;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/** @brief copy attributes from DAP2 to DAP4
|
|
Packit |
a4aae4 |
*
|
|
Packit |
a4aae4 |
* Given a DAP2 AttrTable, copy all of its attributes into
|
|
Packit |
a4aae4 |
* this DAP4 D4Attributes object as D4Attribute object instances.
|
|
Packit |
a4aae4 |
*
|
|
Packit |
a4aae4 |
*
|
|
Packit |
a4aae4 |
* @param at Read the DAP2 attributes from here.
|
|
Packit |
a4aae4 |
*/
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
D4Attributes::transform_to_dap4(AttrTable &at)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
// for every attribute in at, copy it to this.
|
|
Packit |
a4aae4 |
for (AttrTable::Attr_iter i = at.attr_begin(), e = at.attr_end(); i != e; ++i) {
|
|
Packit |
a4aae4 |
string name = at.get_name(i);
|
|
Packit |
a4aae4 |
AttrType type = at.get_attr_type(i);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
switch (type) {
|
|
Packit |
a4aae4 |
case Attr_container: {
|
|
Packit |
a4aae4 |
D4Attribute *a = new D4Attribute(name, attr_container_c);
|
|
Packit |
a4aae4 |
D4Attributes *attributes = a->attributes(); // allocates a new object
|
|
Packit |
a4aae4 |
attributes->transform_to_dap4(*at.get_attr_table(i));
|
|
Packit |
a4aae4 |
add_attribute_nocopy(a);
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
case Attr_byte: {
|
|
Packit |
a4aae4 |
D4Attribute *a = new D4Attribute(name, attr_byte_c);
|
|
Packit |
a4aae4 |
a->add_value_vector(*at.get_attr_vector(i));
|
|
Packit |
a4aae4 |
add_attribute_nocopy(a);
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
case Attr_int16: {
|
|
Packit |
a4aae4 |
D4Attribute *a = new D4Attribute(name, attr_int16_c);
|
|
Packit |
a4aae4 |
a->add_value_vector(*at.get_attr_vector(i));
|
|
Packit |
a4aae4 |
add_attribute_nocopy(a);
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
case Attr_uint16: {
|
|
Packit |
a4aae4 |
D4Attribute *a = new D4Attribute(name, attr_uint16_c);
|
|
Packit |
a4aae4 |
a->add_value_vector(*at.get_attr_vector(i));
|
|
Packit |
a4aae4 |
add_attribute_nocopy(a);
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
case Attr_int32: {
|
|
Packit |
a4aae4 |
D4Attribute *a = new D4Attribute(name, attr_int32_c);
|
|
Packit |
a4aae4 |
a->add_value_vector(*at.get_attr_vector(i));
|
|
Packit |
a4aae4 |
add_attribute_nocopy(a);
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
case Attr_uint32: {
|
|
Packit |
a4aae4 |
D4Attribute *a = new D4Attribute(name, attr_uint32_c);
|
|
Packit |
a4aae4 |
a->add_value_vector(*at.get_attr_vector(i));
|
|
Packit |
a4aae4 |
add_attribute_nocopy(a);
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
case Attr_float32: {
|
|
Packit |
a4aae4 |
D4Attribute *a = new D4Attribute(name, attr_float32_c);
|
|
Packit |
a4aae4 |
a->add_value_vector(*at.get_attr_vector(i));
|
|
Packit |
a4aae4 |
add_attribute_nocopy(a);
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
case Attr_float64: {
|
|
Packit |
a4aae4 |
D4Attribute *a = new D4Attribute(name, attr_float64_c);
|
|
Packit |
a4aae4 |
a->add_value_vector(*at.get_attr_vector(i));
|
|
Packit |
a4aae4 |
add_attribute_nocopy(a);
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
case Attr_string: {
|
|
Packit |
a4aae4 |
D4Attribute *a = new D4Attribute(name, attr_str_c);
|
|
Packit |
a4aae4 |
a->add_value_vector(*at.get_attr_vector(i));
|
|
Packit |
a4aae4 |
add_attribute_nocopy(a);
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
case Attr_url: {
|
|
Packit |
a4aae4 |
D4Attribute *a = new D4Attribute(name, attr_url_c);
|
|
Packit |
a4aae4 |
a->add_value_vector(*at.get_attr_vector(i));
|
|
Packit |
a4aae4 |
add_attribute_nocopy(a);
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
case Attr_other_xml: {
|
|
Packit |
a4aae4 |
D4Attribute *a = new D4Attribute(name, attr_otherxml_c);
|
|
Packit |
a4aae4 |
a->add_value_vector(*at.get_attr_vector(i));
|
|
Packit |
a4aae4 |
add_attribute_nocopy(a);
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
default:
|
|
Packit |
a4aae4 |
throw InternalErr(__FILE__, __LINE__, "Unknown DAP2 attribute type in D4Attributes::copy_from_dap2()");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
AttrType get_dap2_AttrType(D4AttributeType d4_type){
|
|
Packit |
a4aae4 |
switch (d4_type) {
|
|
Packit |
a4aae4 |
case attr_container_c: { return Attr_container; }
|
|
Packit |
a4aae4 |
case attr_byte_c: { return Attr_byte; }
|
|
Packit |
a4aae4 |
case attr_int16_c: { return Attr_int16; }
|
|
Packit |
a4aae4 |
case attr_uint16_c: { return Attr_uint16; }
|
|
Packit |
a4aae4 |
case attr_int32_c: { return Attr_int32; }
|
|
Packit |
a4aae4 |
case attr_uint32_c: { return Attr_uint32; }
|
|
Packit |
a4aae4 |
case attr_float32_c: { return Attr_float32; }
|
|
Packit |
a4aae4 |
case attr_float64_c: { return Attr_float64; }
|
|
Packit |
a4aae4 |
case attr_str_c: { return Attr_string; }
|
|
Packit |
a4aae4 |
case attr_url_c: { return Attr_url; }
|
|
Packit |
a4aae4 |
case attr_otherxml_c: { return Attr_other_xml; }
|
|
Packit |
a4aae4 |
default:
|
|
Packit |
a4aae4 |
throw InternalErr(__FILE__, __LINE__, "Unknown DAP4 attribute");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
D4Attributes::load_AttrTable(AttrTable *d2_attr_table, D4Attributes *d4_attrs)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
// cerr << __func__ << "() - Loading attribute table: '" << d2_attr_table->get_name() << "' addr: " << (void *)d2_attr_table << endl;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
// for every attribute in at, copy it to this.
|
|
Packit |
a4aae4 |
for ( D4Attributes::D4AttributesIter i = d4_attrs->attribute_begin(), e = d4_attrs->attribute_end(); i != e; ++i) {
|
|
Packit |
a4aae4 |
string name = (*i)->name();
|
|
Packit |
a4aae4 |
D4AttributeType d4_attr_type = (*i)->type();
|
|
Packit |
a4aae4 |
AttrType d2_attr_type = get_dap2_AttrType(d4_attr_type);
|
|
Packit |
a4aae4 |
string d2_attr_type_name = AttrType_to_String(d2_attr_type);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4Attribute::D4AttributeIter vitr =(*i)->value_begin();
|
|
Packit |
a4aae4 |
D4Attribute::D4AttributeIter end =(*i)->value_end();
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
vector<string> values;
|
|
Packit |
a4aae4 |
for(;vitr!=end; vitr++){
|
|
Packit |
a4aae4 |
values.push_back((*vitr));
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
switch (d4_attr_type) {
|
|
Packit |
a4aae4 |
case attr_container_c: {
|
|
Packit |
a4aae4 |
// Attr_container
|
|
Packit |
a4aae4 |
AttrTable *child_attr_table = new AttrTable();
|
|
Packit |
a4aae4 |
child_attr_table->set_name(name);
|
|
Packit |
a4aae4 |
// cerr << __func__ << "() - Created child attribute table: " << name << " addr: " << (void *)child_attr_table << endl;
|
|
Packit |
a4aae4 |
load_AttrTable(child_attr_table,(*i)->attributes());
|
|
Packit |
a4aae4 |
d2_attr_table->append_container(child_attr_table,name);
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
default:{
|
|
Packit |
a4aae4 |
// cerr << __func__ << "() - "<< name << " has " << values.size() << " value(s). d2_attr_type_name: " << d2_attr_type_name << endl;
|
|
Packit |
a4aae4 |
d2_attr_table->append_attr(name,d2_attr_type_name, &values);
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/** @brief copy attributes from DAP4 to DAP2
|
|
Packit |
a4aae4 |
*
|
|
Packit |
a4aae4 |
* Given a DAP4 AttrTable, copy all of its attributes into a DAP4 D4Attributes
|
|
Packit |
a4aae4 |
* object.
|
|
Packit |
a4aae4 |
*
|
|
Packit |
a4aae4 |
* @param at Read the DAP2 attributes from here.
|
|
Packit |
a4aae4 |
*/
|
|
Packit |
a4aae4 |
AttrTable *D4Attributes::get_AttrTable(const string name)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
AttrTable *my_pretty_pony = new AttrTable();
|
|
Packit |
a4aae4 |
load_AttrTable(my_pretty_pony, this);
|
|
Packit |
a4aae4 |
my_pretty_pony->set_name(name);
|
|
Packit |
a4aae4 |
return my_pretty_pony;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4Attribute *
|
|
Packit |
a4aae4 |
D4Attributes::find_depth_first(const string &name, D4AttributesIter i)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
if (i == attribute_end())
|
|
Packit |
a4aae4 |
return 0;
|
|
Packit |
a4aae4 |
else if ((*i)->name() == name)
|
|
Packit |
a4aae4 |
return *i;
|
|
Packit |
a4aae4 |
else if ((*i)->type() == attr_container_c)
|
|
Packit |
a4aae4 |
return find_depth_first(name, (*i)->attributes()->attribute_begin());
|
|
Packit |
a4aae4 |
else
|
|
Packit |
a4aae4 |
return find_depth_first(name, ++i);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4Attribute *
|
|
Packit |
a4aae4 |
D4Attributes::find(const string &name)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
return find_depth_first(name, attribute_begin());
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/** Return a pointer to the D4Attribute object that has the given FQN.
|
|
Packit |
a4aae4 |
* @note A FQN for an attribute is a series of names separated by dots.
|
|
Packit |
a4aae4 |
*/
|
|
Packit |
a4aae4 |
D4Attribute *
|
|
Packit |
a4aae4 |
D4Attributes::get(const string &fqn)
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
// name1.name2.name3
|
|
Packit |
a4aae4 |
// name1
|
|
Packit |
a4aae4 |
// name1.name2
|
|
Packit |
a4aae4 |
size_t pos = fqn.find('.');
|
|
Packit |
a4aae4 |
string part = fqn.substr(0, pos);
|
|
Packit |
a4aae4 |
string rest= "";
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (pos != string::npos)
|
|
Packit |
a4aae4 |
rest = fqn.substr(pos + 1);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
DBG(cerr << "part: '" << part << "'; rest: '" << rest << "'" << endl);
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (!part.empty()) {
|
|
Packit |
a4aae4 |
if (!rest.empty()) {
|
|
Packit |
a4aae4 |
D4AttributesIter i = attribute_begin();
|
|
Packit |
a4aae4 |
while (i != attribute_end()) {
|
|
Packit |
a4aae4 |
if ((*i)->name() == part && (*i)->type() == attr_container_c)
|
|
Packit |
a4aae4 |
return (*i)->attributes()->get(rest);
|
|
Packit |
a4aae4 |
++i;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
else {
|
|
Packit |
a4aae4 |
D4AttributesIter i = attribute_begin();
|
|
Packit |
a4aae4 |
while (i != attribute_end()) {
|
|
Packit |
a4aae4 |
if ((*i)->name() == part)
|
|
Packit |
a4aae4 |
return (*i);
|
|
Packit |
a4aae4 |
++i;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
return 0;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
D4Attribute::print_dap4(XMLWriter &xml) const
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
if (xmlTextWriterStartElement(xml.get_writer(), (const xmlChar*) "Attribute") < 0)
|
|
Packit |
a4aae4 |
throw InternalErr(__FILE__, __LINE__, "Could not write Attribute element");
|
|
Packit |
a4aae4 |
if (xmlTextWriterWriteAttribute(xml.get_writer(), (const xmlChar*) "name", (const xmlChar*)name().c_str()) < 0)
|
|
Packit |
a4aae4 |
throw InternalErr(__FILE__, __LINE__, "Could not write attribute for name");
|
|
Packit |
a4aae4 |
if (xmlTextWriterWriteAttribute(xml.get_writer(), (const xmlChar*) "type", (const xmlChar*) D4AttributeTypeToString(type()).c_str()) < 0)
|
|
Packit |
a4aae4 |
throw InternalErr(__FILE__, __LINE__, "Could not write attribute for type");
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
switch (type()) {
|
|
Packit |
a4aae4 |
case attr_container_c:
|
|
Packit |
a4aae4 |
if (!d_attributes)
|
|
Packit |
a4aae4 |
throw InternalErr(__FILE__, __LINE__, "Null Attribute container");
|
|
Packit |
a4aae4 |
d_attributes->print_dap4(xml);
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
case attr_otherxml_c:
|
|
Packit |
a4aae4 |
if (num_values() != 1)
|
|
Packit |
a4aae4 |
throw Error("OtherXML attributes cannot be vector-valued.");
|
|
Packit |
a4aae4 |
if (xmlTextWriterWriteRaw(xml.get_writer(), (const xmlChar*) value(0).c_str()) < 0)
|
|
Packit |
a4aae4 |
throw InternalErr(__FILE__, __LINE__, "Could not write OtherXML value");
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
default: {
|
|
Packit |
a4aae4 |
// Assume only valid types make it into instances
|
|
Packit |
a4aae4 |
D4AttributeCIter i = d_values.begin();//value_begin();
|
|
Packit |
a4aae4 |
while (i != d_values.end()) {
|
|
Packit |
a4aae4 |
if (xmlTextWriterStartElement(xml.get_writer(), (const xmlChar*) "Value") < 0)
|
|
Packit |
a4aae4 |
throw InternalErr(__FILE__, __LINE__, "Could not write value element");
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (xmlTextWriterWriteString(xml.get_writer(), (const xmlChar*) (*i++).c_str()) < 0)
|
|
Packit |
a4aae4 |
throw InternalErr(__FILE__, __LINE__, "Could not write attribute value");
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (xmlTextWriterEndElement(xml.get_writer()) < 0)
|
|
Packit |
a4aae4 |
throw InternalErr(__FILE__, __LINE__, "Could not end value element");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
break;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
if (xmlTextWriterEndElement(xml.get_writer()) < 0)
|
|
Packit |
a4aae4 |
throw InternalErr(__FILE__, __LINE__, "Could not end Attribute element");
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/** @brief dumps information about this object
|
|
Packit |
a4aae4 |
*
|
|
Packit |
a4aae4 |
* Displays the pointer value of this instance and then displays information
|
|
Packit |
a4aae4 |
* about this base type.
|
|
Packit |
a4aae4 |
*
|
|
Packit |
a4aae4 |
* @param strm C++ i/o stream to dump the information to
|
|
Packit |
a4aae4 |
* @return void
|
|
Packit |
a4aae4 |
*/
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
D4Attribute::dump(ostream &strm) const
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
strm << DapIndent::LMarg << "D4Attribute::dump - (" << (void *)this << ")" << endl;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
DapIndent::Indent() ;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
XMLWriter xml;
|
|
Packit |
a4aae4 |
print_dap4(xml);
|
|
Packit |
a4aae4 |
strm << DapIndent::LMarg << xml.get_doc() << flush;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
DapIndent::UnIndent() ;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
D4Attributes::print_dap4(XMLWriter &xml) const
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
if (empty())
|
|
Packit |
a4aae4 |
return;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
D4AttributesCIter i = d_attrs.begin();
|
|
Packit |
a4aae4 |
while (i != d_attrs.end()) {
|
|
Packit |
a4aae4 |
(*i++)->print_dap4(xml);
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
/** @brief dumps information about this object
|
|
Packit |
a4aae4 |
*
|
|
Packit |
a4aae4 |
* Displays the pointer value of this instance and then displays information
|
|
Packit |
a4aae4 |
* about this base type.
|
|
Packit |
a4aae4 |
*
|
|
Packit |
a4aae4 |
* @param strm C++ i/o stream to dump the information to
|
|
Packit |
a4aae4 |
* @return void
|
|
Packit |
a4aae4 |
*/
|
|
Packit |
a4aae4 |
void
|
|
Packit |
a4aae4 |
D4Attributes::dump(ostream &strm) const
|
|
Packit |
a4aae4 |
{
|
|
Packit |
a4aae4 |
strm << DapIndent::LMarg << "D4Attributes::dump - (" << (void *)this << ")" << endl;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
DapIndent::Indent() ;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
XMLWriter xml;
|
|
Packit |
a4aae4 |
print_dap4(xml);
|
|
Packit |
a4aae4 |
strm << DapIndent::LMarg << xml.get_doc() << flush;
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
DapIndent::UnIndent() ;
|
|
Packit |
a4aae4 |
}
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
|
|
Packit |
a4aae4 |
} // namespace libdap
|
|
Packit |
a4aae4 |
|