10 #include "NCLStructure.h"
15 INIT_SINGLETON(NCLStructure)
17 NCLStructure::NCLStructure()
19 attributes =
new map <QString, map <QString, bool > * > ();
20 attributes_ordered =
new map<QString, deque <QString> * > ();
21 nesting =
new map <QString, map <QString, char > * > ();
22 dataTypes =
new map <QString, QString> ();
23 dataTypeDefaultSuggestions =
new map <QString, QStringList>();
24 attributesDatatype =
new map <QString, map<QString, QString> *> ();
25 references =
new QMultiMap <QString, AttributeReferences*> ();
30 NCLStructure::~NCLStructure()
33 map <QString, map <QString, bool> *>::iterator it;
34 for(it = attributes->begin(); it != attributes->end(); ++it)
36 map <QString, bool> *content = it->second;
43 map <QString, map <QString, char> *>::iterator it2;
44 for(it2 = nesting->begin(); it2 != nesting->end(); ++it2)
46 map <QString, char> *content = it2->second;
56 dataTypeDefaultSuggestions->clear();
57 delete dataTypeDefaultSuggestions;
59 map <QString, map<QString, QString> *>::iterator it3;
60 for(it3 = attributesDatatype->begin(); it3 != attributesDatatype->end();
63 map<QString, QString> *content = it3->second;
67 attributesDatatype->clear();
68 delete attributesDatatype;
76 void NCLStructure::loadStructure(){
77 QFile fInput ( NCLSTRUCTURE_FILE );
78 if(!fInput.open(QIODevice::ReadOnly)){
79 qErrnoWarning(
"Should not open the NCL_STRUCTURE file.");
83 QTextStream in (&fInput);
85 QString line = in.readLine();
86 vector <QString> tokens = parseLine(line);
89 if(tokens.size() == 0)
92 if(tokens[0].toLower() ==
"datatype")
95 if(tokens.size() >= 3)
97 qDebug() <<
"I'm reading a new DATATYPE element " << tokens[0]
98 << tokens[1] <<
" " << tokens[2];
99 addDatatype(tokens[1], tokens[2]);
100 if (tokens.size() >= 4)
102 addDatatypeDefaultSuggestions(tokens[1], tokens[3]);
108 qErrnoWarning(
"element primitive must have exactly 2 or 3 \
109 arguments (NAME, REGEX, DEFAULT_SUGGESTIONS)");
112 else if(tokens[0].toLower() ==
"element")
117 if(tokens.size() == 5)
119 bool define_scope =
false;
120 if(tokens[4].toLower() ==
"true")
122 addElement(tokens[1], tokens[2], 0, define_scope);
126 qErrnoWarning(
"element primitive must have exactly 3 arguments \
127 (ELEMENT NAME, ELEMENT FATHER, CARDINALITY)");
131 else if(tokens[0].toLower() ==
"attribute")
135 if(tokens.size() == 5)
137 bool required =
false;
138 if(tokens[3].toLower() ==
"true")
141 addAttribute(tokens[1], tokens[2], tokens[4], required);
145 qErrnoWarning(
"attribute primitive must be exactly 4 arguments \
146 (ELEMENT NAME, ATTR NAME, ATTR TYPE, REQUIRED)");
150 else if(tokens[0].toLower() ==
"scope")
152 qDebug() <<
"I'm reading a new SCOPE element - This is not supported yet"
155 else if(tokens[0].toLower() ==
"reference")
158 addReference(tokens[1], tokens[2], tokens[3], tokens[4], tokens[5]);
168 vector <QString> NCLStructure::parseLine(QString line)
170 vector <QString> ret;
172 int size = line.size(), i = 0;
174 bool reading_attributes =
false, readingstring =
false;
176 while (i < line.size()) {
180 if (i+1 < size && line[i+1] ==
'/') {
189 readingstring =
true;
193 ret.push_back(token);
195 reading_attributes =
true;
198 if(reading_attributes && token !=
"")
199 ret.push_back(token);
202 else if (ch ==
')') {
203 if(reading_attributes && token !=
"")
204 ret.push_back(token);
205 reading_attributes =
false;
210 token.append(line.at(i));
215 readingstring =
false;
217 token.append(line.at(i));
228 if(!nesting->count(father))
229 (*nesting)[father] =
new map <QString, char>();
231 if(!attributes->count(name))
232 (*attributes)[name] =
new map <QString, bool>();
234 if(!attributesDatatype->count(name))
235 (*attributesDatatype)[name] =
new map <QString, QString>();
237 if(!attributes_ordered->count(name))
238 (*attributes_ordered)[name] =
new deque <QString>();
240 (*(*nesting)[father])[name] = cardinality;
241 this->define_scope[name] = define_scope;
247 if(!attributes->count(element))
248 (*attributes)[element] =
new map <QString, bool>();
250 if(!attributesDatatype->count(element))
251 (*attributesDatatype)[element] =
new map <QString, QString>();
253 if(!attributes_ordered->count(element))
254 (*attributes_ordered)[element] =
new deque <QString>();
257 (*(*attributes)[element])[attr] = required;
258 (*(*attributes_ordered)[element]).push_back(attr);
259 (*(*attributesDatatype)[element])[attr] = type;
263 QString ref_element, QString ref_attr,
267 ref_element, ref_attr,
269 references->insert(element, ref);
272 void NCLStructure::addDatatype (QString name, QString regex)
274 qDebug() <<
"NCLStructure::addDatatype (" << name <<
", " << regex <<
")";
275 (*dataTypes)[name] = regex;
278 void NCLStructure::addDatatypeDefaultSuggestions( QString datatype,
284 (*dataTypeDefaultSuggestions)[datatype] = values.split(
',');
286 (*dataTypeDefaultSuggestions)[datatype] = QStringList();
289 QString NCLStructure::getAttributeDatatype(QString element, QString name)
291 if( attributesDatatype->count(element) &&
292 (*attributesDatatype)[element]->count(name))
294 return (*(*attributesDatatype)[element])[name];
296 return QString(
"Unknown");
299 QStringList NCLStructure::getDatatypeDefaultSuggestions(QString datatype)
301 if( dataTypeDefaultSuggestions->count(datatype))
303 return (*dataTypeDefaultSuggestions)[datatype];
305 return QStringList();
310 if(attributes->count(element))
311 return (*attributes)[element];
317 if(attributes_ordered->count(element))
318 return (*attributes_ordered)[element];
324 return this->nesting;
329 if(nesting->count(tagname))
330 return (*nesting)[tagname];
337 vector <AttributeReferences *> ref;
341 ref.push_back(value);
346 bool NCLStructure::defineScope(QString tagname)
348 if(define_scope.count(tagname))
349 return define_scope[tagname];