29 #include "RemoveElement.h"
30 #include "NCMLDebug.h"
31 #include "NCMLParser.h"
34 #include "NetcdfElement.h"
40 const string RemoveElement::_sTypeName =
"remove";
41 const vector<string> RemoveElement::_sValidAttributes = getValidAttributes();
43 RemoveElement::RemoveElement() :
44 RCObjectInterface(), NCMLElement(0), _name(
""), _type(
"")
48 RemoveElement::RemoveElement(
const RemoveElement& proto) :
49 RCObjectInterface(), NCMLElement(proto)
55 RemoveElement::~RemoveElement()
60 RemoveElement::getTypeName()
const
66 RemoveElement::clone()
const
75 validateAttributes(attrs, _sValidAttributes);
83 void RemoveElement::handleBegin()
86 processRemove(*_parser);
89 void RemoveElement::handleContent(
const string& content)
91 if (!NCMLUtil::isAllWhitespace(content)) {
92 THROW_NCML_PARSE_ERROR(_parser->getParseLineNumber(),
93 "Got non-whitespace for element content and didn't expect it. "
94 "Element=" + toString() +
" content=\"" + content +
"\"");
98 void RemoveElement::handleEnd()
102 string RemoveElement::toString()
const
104 return "<" + _sTypeName +
" " +
"name=\"" + _name +
"\" type=\"" + _type +
"\" >";
110 void RemoveElement::processRemove(
NCMLParser& p)
112 if (!(_type.empty() || _type ==
"attribute" || _type ==
"variable" || _type ==
"dimension")) {
113 THROW_NCML_PARSE_ERROR(_parser->getParseLineNumber(),
114 "Illegal type in remove element: type=" + _type
115 +
" This version of the parser can only remove type=\"attribute\", type=\"variable\" or type=\"dimension\".");
118 if (_type ==
"attribute") {
119 processRemoveAttribute(p);
121 else if (_type ==
"variable") {
122 processRemoveVariable(p);
124 else if (_type ==
"dimension") {
125 processRemoveDimension(p);
128 THROW_NCML_INTERNAL_ERROR(
129 toString() +
" had type that wasn't attribute, variable or dimension. We shouldn't be calling this if so.");
133 void RemoveElement::processRemoveAttribute(NCMLParser& p)
135 AttrTable::Attr_iter it;
136 bool gotIt = p.findAttribute(_name, it);
138 THROW_NCML_PARSE_ERROR(_parser->getParseLineNumber(),
139 "In remove element, could not find attribute to remove name=" + _name +
" at the current scope="
140 + p.getScopeString());
144 BESDEBUG(
"ncml",
"Removing attribute name=" << _name <<
" at scope=" << p.getScopeString() << endl);
145 AttrTable* pTab = p.getCurrentAttrTable();
147 pTab->del_attr(_name);
150 void RemoveElement::processRemoveVariable(NCMLParser& p)
152 BESDEBUG(
"ncml",
"Removing variable name=" + _name +
" at scope=" + p.getScopeString());
155 p.deleteVariableAtCurrentScope(_name);
158 void RemoveElement::processRemoveDimension(NCMLParser& p)
160 BESDEBUG(
"ncml",
"Removing dimension name=" + _name +
" at scope=" + p.getScopeString() << endl);
162 BaseType* pOrgVar = p.getCurrentVariable();
165 pOrgVar->set_send_p(
true);
166 pOrgVar->set_send_p(
true);
168 Array* varArray =
dynamic_cast<Array *
>(pOrgVar);
169 RemoveElement::removeDimension(varArray, _name);
175 p.deleteVariableAtCurrentScope(_name);
176 DDS* cDDS = p.getDDSForCurrentDataset();
177 for (DDS::Vars_iter varit = cDDS->var_begin(); varit != cDDS->var_end(); varit++) {
179 if ((*varit)->type() == dods_array_c){
180 varArray =
dynamic_cast<Array *
>(*varit);
181 RemoveElement::removeDimension(varArray, _name);
187 void RemoveElement::removeDimension(Array* arr,
string name)
191 for (ait = arr->dim_begin(); ait != arr->dim_end(); ++ait) {
192 if((*ait).name == name){
193 arr->rename_dim(name,
"");
198 vector<string> RemoveElement::getValidAttributes()
200 vector<string> validAttrs;
201 validAttrs.reserve(2);
202 validAttrs.push_back(
"name");
203 validAttrs.push_back(
"type");