]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.databoard/cpp/DataBoardTest/DataBoard/DataBoardRepository.cpp
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.databoard / cpp / DataBoardTest / DataBoard / DataBoardRepository.cpp
1 #include "DataBoardRepository.h"\r
2 \r
3 #include "RecordType.h"\r
4 #include "ArrayType.h"\r
5 #include "Constants.h"\r
6 #include "Component.h"\r
7 #include "IntegerType.h"\r
8 #include "DataType.h"\r
9 #include "StringType.h"\r
10 #include "DoubleType.h"\r
11 #include "LongType.h"\r
12 #include "ByteType.h"\r
13 #include "BooleanType.h"\r
14 #include "MapType.h"\r
15 #include "OptionalType.h"\r
16 #include "UnionType.h"\r
17 #include "VariantType.h"\r
18 #include "Range.h"\r
19 #include "Limit.h"\r
20 \r
21 #include <iostream>\r
22 #include <sstream>\r
23 \r
24 namespace Databoard {\r
25         namespace Type {\r
26 \r
27                 std::string strTypeDefinition::writeOut()\r
28                 {\r
29                         std::string r;\r
30                         \r
31                         r += "type " + name + " = ";\r
32 \r
33                         r += dataBoard->writeOut();\r
34 \r
35                         return r;\r
36                 }\r
37 \r
38                 DataBoardRepository::DataBoardRepository()\r
39                 {\r
40                 }\r
41 \r
42                 DataBoardRepository::~DataBoardRepository()\r
43                 {\r
44                         for(int i = 0; i < (int)dataBoards.size(); ++i)\r
45                         {\r
46                                 delete dataBoards.at(i).dataBoard;\r
47                         }\r
48 \r
49                         dataBoards.clear();\r
50                 }\r
51 \r
52                 void DataBoardRepository::addDataBoard(char* name, DataType* dataBoard)\r
53                 {\r
54                         strTypeDefinition dataBoard_;\r
55 \r
56                         dataBoard_.name = std::string(name);\r
57                         dataBoard_.dataBoard = dataBoard;\r
58 \r
59                         dataBoards.push_back(dataBoard_);\r
60                 }\r
61 \r
62                 int DataBoardRepository::count()\r
63                 {\r
64                         return (int)dataBoards.size();\r
65                 }\r
66 \r
67                 strTypeDefinition DataBoardRepository::getDataBoard(int i)\r
68                 {\r
69                         return dataBoards.at(i);\r
70                 }\r
71 \r
72                 DataType* DataBoardRepository::getDataBoard(std::string name)\r
73                 {\r
74                         for(int i = 0; i < (int)dataBoards.size(); ++i)\r
75                         {\r
76                                 if(dataBoards.at(i).name == name)\r
77                                 {\r
78                                         return dataBoards.at(i).dataBoard;\r
79                                 }\r
80                         }\r
81 \r
82                         return NULL;\r
83                 }\r
84 \r
85                 bool DataBoardRepository::open(std::string fileName)\r
86                 {\r
87                         pANTLR3_INPUT_STREAM input = antlr3AsciiFileStreamNew((pANTLR3_UINT8)fileName.c_str());\r
88 \r
89                         if ( input == NULL )\r
90                         {\r
91                                 ANTLR3_FPRINTF(stderr, "string: %s\n", fileName.c_str());\r
92 \r
93                                 return false;\r
94                         }\r
95 \r
96                         pSimanticsDataLexer lexer = SimanticsDataLexerNew(input);\r
97 \r
98                         if ( lexer == NULL )\r
99                         {\r
100                                 ANTLR3_FPRINTF(stderr, "Unable to create the lexer due to malloc() failure1\n");\r
101                                 //exit(ANTLR3_ERR_NOMEM);\r
102 \r
103                                 return false;\r
104                         }\r
105 \r
106                         pANTLR3_COMMON_TOKEN_STREAM tstream = antlr3CommonTokenStreamSourceNew(ANTLR3_SIZE_HINT, TOKENSOURCE(lexer));//->pLexer->tokSource);\r
107 \r
108                         if (tstream == NULL)\r
109                         {\r
110                                 ANTLR3_FPRINTF(stderr, "Out of memory trying to allocate token stream\n");\r
111                                 //exit(ANTLR3_ERR_NOMEM);\r
112 \r
113                                 return false;\r
114                         }\r
115 \r
116                         pSimanticsDataParser parser = SimanticsDataParserNew(tstream); // CParserNew is generated by ANTLR3\r
117 \r
118                         if (parser == NULL)\r
119                         {\r
120                                 ANTLR3_FPRINTF(stderr, "Out of memory trying to allocate parser\n");\r
121                                 //exit(ANTLR3_ERR_NOMEM);\r
122 \r
123                                 return false;\r
124                         }\r
125 \r
126                         SimanticsDataParser_typeDefinitions_return astType = parser->typeDefinitions(parser);\r
127 \r
128                         bool retValue = true;\r
129 \r
130                         if(lexer->pLexer->rec->state->errorCount == 0)\r
131                         {\r
132                                 temporaryname t(this);\r
133 \r
134                                 t.parse(astType.tree);\r
135                         \r
136                                 //print(astType.tree);\r
137                         }\r
138                         else\r
139                         {\r
140                                 retValue = false;\r
141                         }\r
142 \r
143 \r
144                         parser->free(parser);\r
145                         tstream->free(tstream);\r
146                         lexer->free(lexer);\r
147                         input->free(input);\r
148 \r
149                         return retValue;\r
150                 }\r
151 \r
152                 void DataBoardRepository::print(pANTLR3_BASE_TREE tree, int indent)\r
153                 {\r
154                         for(int i=0;i<indent;++i)\r
155                                 std::cout << "  ";\r
156 \r
157                         std::cout << tree->getText(tree)->chars << " " << \r
158                                 tree->getType(tree) << std::endl;\r
159 \r
160                         for(int i=0;i<(int)tree->getChildCount(tree);++i)\r
161                         {\r
162                                 print((pANTLR3_BASE_TREE)tree->getChild(tree, i), indent + 1);\r
163                         }\r
164                 }\r
165 \r
166                 const strTypeDefinition* DataBoardRepository::get(std::string name)\r
167                 {\r
168                         for(int i = 0; i < (int)dataBoards.size(); ++i)\r
169                         {\r
170                                 const strTypeDefinition& dataBoard = dataBoards.at(i); // for debug purposes\r
171 \r
172                                 if(dataBoard.name == name)\r
173                                 {\r
174                                         return &dataBoard;\r
175                                 }\r
176                         }\r
177 \r
178                         return NULL;\r
179                 }\r
180 \r
181                 ///////////////////////////////////////////////\r
182 \r
183                 temporaryname::temporaryname(DataBoardRepository* dataBoardRepository)\r
184                 {\r
185                         this->dataBoardRepository = dataBoardRepository;\r
186                 }\r
187 \r
188                 temporaryname::~temporaryname()\r
189                 {\r
190                 }\r
191 \r
192                 DataType* temporaryname::parse(pANTLR3_BASE_TREE tree, DataType* parent, int indent)\r
193                 //DataType* DataBoardRepository::parse(pANTLR3_BASE_TREE tree, DataType* parent, int indent)\r
194                 //DataType* parse(pANTLR3_BASE_TREE tree, DataType* parent, int indent)\r
195                 {\r
196                         switch(tree->getType(tree)) {\r
197                                 case TYPE_DEFINITIONS:\r
198                                         {\r
199                                                 for(int i=0;i<(int)tree->getChildCount(tree);++i)\r
200                                                 {\r
201                                                         parse((pANTLR3_BASE_TREE)tree->getChild(tree, i), parent, indent + 1);\r
202                                                 }\r
203                                         }\r
204                                         break;\r
205                                 case TYPE_DEFINITION:\r
206                                         {\r
207                                                 if(tree->getChildCount(tree) == 2)\r
208                                                 {\r
209                                                         pANTLR3_BASE_TREE id = (pANTLR3_BASE_TREE)tree->getChild(tree, 0);\r
210                                                         pANTLR3_BASE_TREE type = (pANTLR3_BASE_TREE)tree->getChild(tree, 1);\r
211 \r
212                                                         DataType* dataBoard = parse(type, parent, indent+1);\r
213 \r
214                                                         if(dataBoard != NULL)\r
215                                                         {\r
216                                                                 dataBoard->setNotBuiltIn();\r
217 \r
218                                                                 if(dataBoardRepository != NULL)\r
219                                                                 {\r
220                                                                         dataBoardRepository->addDataBoard((char*)id->getText(id)->chars, dataBoard);\r
221                                                                 }\r
222                                                         }\r
223                                                 }\r
224                                         }\r
225                                         break;\r
226                                 case TUPLE_TYPE:\r
227                                         {\r
228                                                 RecordType* record = new RecordType();\r
229 \r
230                                                 for(int i=0;i<(int)tree->getChildCount(tree);++i)\r
231                                                 {\r
232                                                         DataType* childType = parse((pANTLR3_BASE_TREE)tree->getChild(tree, i), record, indent + 1);\r
233 \r
234                                                         if(childType != NULL)\r
235                                                         {\r
236                                                                 std::stringstream ss;\r
237 \r
238                                                                 ss << i;\r
239 \r
240                                                                 std::string tupleId;\r
241 \r
242                                                                 ss >> tupleId;\r
243 \r
244                                                                 addToChildren(record, (char*)tupleId.c_str(), childType);\r
245                                                         }\r
246                                                 }\r
247 \r
248                                                 return record;\r
249                                         }\r
250 \r
251                                         break;\r
252 \r
253                                 case RECORD_TYPE:\r
254                                         {\r
255                                                 RecordType* record = new RecordType();\r
256 \r
257                                                 for(int i=0;i<(int)tree->getChildCount(tree);++i)\r
258                                                 {\r
259                                                         DataType* childType = parse((pANTLR3_BASE_TREE)tree->getChild(tree, i), record, indent + 1);\r
260                                                 }\r
261 \r
262                                                 return record;\r
263                                         }\r
264 \r
265                                         break;\r
266                                 case ARRAY_TYPE:\r
267                                         {\r
268                                                 ArrayType* arrayType = new ArrayType();\r
269 \r
270                                                 int childCount = tree->getChildCount(tree);\r
271 \r
272                                                 if(childCount >= 1)\r
273                                                 {\r
274                                                         DataType* dataType = parse((pANTLR3_BASE_TREE)tree->getChild(tree, 0), parent);\r
275 \r
276                                                         arrayType->setComponentType(dataType);\r
277                                                         \r
278                                                         if(childCount >= 2)\r
279                                                         {\r
280                                                                 Range* range = parseRange(tree, 1, childCount);\r
281 \r
282                                                                 arrayType->setLength(range);\r
283                                                         }\r
284                                                 }\r
285 \r
286                                                 return arrayType;\r
287                                         }\r
288 \r
289                                         break;\r
290 \r
291                                 case UNION_TYPE:\r
292                                         {\r
293                                                 UnionType* unionType = new UnionType();\r
294 \r
295                                                 int childCount = tree->getChildCount(tree);\r
296 \r
297                                                 for(int i=0;i<(int)tree->getChildCount(tree);++i)\r
298                                                 {\r
299                                                         pANTLR3_BASE_TREE p = (pANTLR3_BASE_TREE)tree->getChild(tree, i);\r
300 \r
301                                                         if(p->getChildCount(p) == 1)\r
302                                                         {\r
303                                                                 pANTLR3_BASE_TREE t = (pANTLR3_BASE_TREE)p->getChild(p, 0);\r
304                                                                 \r
305                                                                 std::string dataTypeName((char*)t->getText(t)->chars);\r
306 \r
307                                                                 DataType* dataType = NULL;\r
308 \r
309                                                                 if(dataBoardRepository != NULL)\r
310                                                                 {\r
311                                                                         dataType = dataBoardRepository->getDataBoard(dataTypeName);\r
312                                                                 }\r
313 \r
314                                                                 unionType->addComponent(dataTypeName, dataType);\r
315                                                         }\r
316                                                 }\r
317 \r
318                                                 return unionType;\r
319                                         }\r
320                                         break;\r
321 \r
322                                 case TYPE_COMPONENT:\r
323                                         {\r
324                                                 pANTLR3_BASE_TREE parameter = NULL;\r
325                                                 pANTLR3_BASE_TREE type = NULL;\r
326                                                 \r
327                                                 if(tree->getChildCount(tree) == 2)\r
328                                                 {\r
329                                                         parameter = (pANTLR3_BASE_TREE)tree->getChild(tree, 0);\r
330                                                         type = (pANTLR3_BASE_TREE)tree->getChild(tree, 1);\r
331                                                 }\r
332 \r
333                                                 DataType* returnType = NULL;\r
334 \r
335                                                 if(type != NULL)\r
336                                                 {\r
337                                                         if(type->getType(type) == TYPE_REFERENCE)\r
338                                                         {\r
339                                                                 returnType = parse(type, parent, indent + 1);\r
340                                                         }\r
341                                                         else if(type->getType(type) == RECORD_TYPE)\r
342                                                         {\r
343                                                                 returnType = parse(type, parent, indent + 1);\r
344                                                         }\r
345                                                         else if(type->getType(type) == TUPLE_TYPE)\r
346                                                         {\r
347                                                                 returnType = parse(type, parent, indent + 1);\r
348                                                         }\r
349                                                         else if(type->getType(type) == ARRAY_TYPE)\r
350                                                         {\r
351                                                                 returnType = parse(type, parent, indent + 1);\r
352                                                         }\r
353                                                         else\r
354                                                         {\r
355                                                                 //std::cout << "!!" << std::endl;\r
356                                                                 //std::cout << parameter->getText(parameter)->chars << std::endl;\r
357                                                                 //std::cout << parameter->getType(parameter) << std::endl;\r
358 \r
359                                                                 //std::cout << type->getText(type)->chars << std::endl;\r
360                                                                 //std::cout << type->getType(type) << std::endl;\r
361                                                         }\r
362                                                 }\r
363 \r
364                                                 if(parameter != NULL && returnType != NULL)\r
365                                                 {\r
366                                                         addToChildren(parent, (char*)parameter->getText(parameter)->chars, returnType);\r
367                                                 }\r
368 \r
369                                                 return returnType;\r
370 \r
371                                                 break;\r
372                                         }\r
373                                 case TYPE_REFERENCE:\r
374                                         if(tree->getChildCount(tree) >= 1)\r
375                                         {\r
376                                                 pANTLR3_BASE_TREE id = (pANTLR3_BASE_TREE)tree->getChild(tree, 0);\r
377 \r
378                                                 const char* typeName = (char*)id->getText(id)->chars;\r
379 \r
380                                                 bool errFound = false;\r
381 \r
382                                                 DataType* returnType = NULL;\r
383 \r
384                                                 if(id->getType(id) == ID)\r
385                                                 {\r
386                                                         if(strEquals(typeName, STR_BOOLEAN) == true)\r
387                                                         {\r
388                                                                 returnType = new BooleanType();\r
389                                                         }\r
390                                                         else if(strEquals(typeName, STR_INTEGER) == true)\r
391                                                         {\r
392                                                                 returnType = new IntegerType();\r
393                                                         }\r
394                                                         else if(strEquals(typeName, STR_DOUBLE) == true)\r
395                                                         {\r
396                                                                 returnType = new DoubleType();\r
397                                                         }\r
398                                                         else if(strEquals(typeName, STR_BYTE) == true)\r
399                                                         {\r
400                                                                 returnType = new ByteType();\r
401                                                         }\r
402                                                         else if(strEquals(typeName, STR_LONG) == true)\r
403                                                         {\r
404                                                                 returnType = new LongType();\r
405                                                         }\r
406                                                         else if(strEquals(typeName, STR_FLOAT) == true)\r
407                                                         {\r
408                                                                 // double=>float contradiction on purpose\r
409                                                                 returnType = new DoubleType();\r
410                                                         }\r
411                                                         else if(strEquals(typeName, STR_STRING) == true)\r
412                                                         {\r
413                                                                 returnType = new StringType();\r
414                                                         }\r
415                                                         else if(strEquals(typeName, STR_MAP) == true)\r
416                                                         {\r
417                                                                 returnType = new MapType();\r
418                                                         }\r
419                                                         else if(strEquals(typeName, STR_OPTIONAL) == true)\r
420                                                         {\r
421                                                                 returnType = new OptionalType();\r
422                                                         }\r
423                                                         else if(strEquals(typeName, STR_VARIANT) == true)\r
424                                                         {\r
425                                                                 returnType = new VariantType();\r
426                                                         }\r
427                                                         else\r
428                                                         {\r
429                                                                 if(dataBoardRepository != NULL)\r
430                                                                 {\r
431                                                                         returnType = dataBoardRepository->getDataBoard(typeName);\r
432                                                                 }\r
433                                                         }\r
434                                                 }\r
435 \r
436                                                 parseParameters(tree, returnType);\r
437 \r
438                                                 //if(errFound == true)\r
439                                                 //{\r
440                                                 //      std::cout << "!-" << std::endl;\r
441                                                 //      std::cout << "unknown: " << typeName << std::endl << std::endl;\r
442 \r
443                                                 //      std::cout << parameter->getText(parameter)->chars << std::endl;\r
444                                                 //      std::cout << parameter->getType(parameter) << std::endl;\r
445 \r
446                                                 //      std::cout << "-!" << std::endl;\r
447                                                 //}\r
448 \r
449                                                 return returnType;\r
450                                         }\r
451                                         break;\r
452                                 case TYPE_ANNOTATION:\r
453                                         if(tree->getChildCount(tree) == 2)\r
454                                         {\r
455                                                 pANTLR3_BASE_TREE id = (pANTLR3_BASE_TREE)tree->getChild(tree, 0);\r
456                                                 pANTLR3_BASE_TREE parameterValue = (pANTLR3_BASE_TREE)tree->getChild(tree, 1);\r
457 \r
458                                                 const char* idName = (char*)id->getText(id)->chars;\r
459 \r
460                                                 if(strEquals(idName, STR_UNIT) == true)\r
461                                                 {\r
462                                                         std::string strValue((char*)parameterValue->getText(parameterValue)->chars);\r
463 \r
464                                                         NumberType* numberType = dynamic_cast<NumberType*>(parent);\r
465 \r
466                                                         if(numberType != NULL)\r
467                                                         {\r
468                                                                 numberType->setUnit(strValue);\r
469                                                         }\r
470                                                 }\r
471                                                 //else if(strEquals(typeName, STR_RANGE) == true)\r
472                                                 //{\r
473                                                 //}\r
474                                                 else if(strEquals(idName, STR_PATTERN) == true)\r
475                                                 {\r
476                                                         std::string strValue((char*)parameterValue->getText(parameterValue)->chars);\r
477 \r
478                                                         StringType* stringType = dynamic_cast<StringType*>(parent);\r
479 \r
480                                                         if(stringType != NULL)\r
481                                                         {\r
482                                                                 stringType->setPattern(strValue);\r
483                                                         }\r
484                                                 }\r
485                                                 else if(strEquals(idName, STR_MIMETYPE) == true)\r
486                                                 {\r
487                                                         std::string strValue((char*)parameterValue->getText(parameterValue)->chars);\r
488 \r
489                                                         StringType* stringType = dynamic_cast<StringType*>(parent);\r
490 \r
491                                                         if(stringType != NULL)\r
492                                                         {\r
493                                                                 stringType->setMimeType(strValue);\r
494                                                         }\r
495                                                 }\r
496                                                 //else if(strEquals(idName, STR_LENGTH) == true) // range\r
497                                                 //{\r
498                                                 //      std::string strValue((char*)parameterValue->getText(parameterValue)->chars);\r
499 \r
500                                                 //      StringType* stringType = dynamic_cast<StringType*>(parent);\r
501 \r
502                                                 //      if(stringType != NULL)\r
503                                                 //      {\r
504                                                 //              stringType->setLength(strValue);\r
505                                                 //      }\r
506                                                 //}\r
507                                         }\r
508 \r
509                                         break;\r
510                                 case ID:\r
511                                         parent = parent;\r
512                                         break;\r
513 \r
514                                 default:\r
515                                         break;\r
516                         }\r
517 \r
518                         return NULL;\r
519                 }\r
520 \r
521                 Range* temporaryname::parseRange(pANTLR3_BASE_TREE tree, int minPos, int maxPos)\r
522                 //Range* DataBoardRepository::parseRange(pANTLR3_BASE_TREE tree, int minPos, int maxPos)\r
523                 //Range* parseRange(pANTLR3_BASE_TREE tree, int minPos, int maxPos)\r
524                 {\r
525                         Range* range = new Range();\r
526 \r
527                         bool rangeLower = true;\r
528 \r
529                         bool inclusiveLower = true;\r
530                         bool inclusiveUpper = true;\r
531 \r
532                         for(int i = minPos;i < maxPos; ++i)\r
533                         {\r
534                                 pANTLR3_BASE_TREE rangechild = (pANTLR3_BASE_TREE)tree->getChild(tree, i);\r
535 \r
536                                 std::string rangeString((char*)rangechild->getText(rangechild)->chars);\r
537 \r
538                                 if(i == minPos && rangeString == STR_BRACEOPEN)\r
539                                 {\r
540                                         inclusiveLower = false;\r
541                                 }\r
542                                 else if(i == minPos && rangeString == STR_BRACKETOPEN)\r
543                                 {\r
544                                         inclusiveLower = true;\r
545                                 }\r
546                                 else if(i == (maxPos-1) && rangeString == STR_BRACECLOSE)\r
547                                 {\r
548                                         inclusiveUpper = false;\r
549                                 }\r
550                                 else if(i == (maxPos-1) && rangeString == STR_BRACKETCLOSE)\r
551                                 {\r
552                                         inclusiveUpper = true;\r
553                                 }\r
554                                 else if(rangeString == STR_RANGESPLIT)\r
555                                 {\r
556                                         rangeLower = false;\r
557                                 }\r
558                                 else\r
559                                 {\r
560                                         if(rangeLower == true)\r
561                                         {\r
562                                                 range->setLower(rangeString);\r
563                                         }\r
564                                         else\r
565                                         {\r
566                                                 range->setUpper(rangeString);\r
567                                         }\r
568                                 }\r
569                         }\r
570 \r
571                         if(inclusiveLower == true)\r
572                         {\r
573                                 range->getLower()->setInclusive();\r
574                         }\r
575                         if(inclusiveUpper == true)\r
576                         {\r
577                                 range->getUpper()->setInclusive();\r
578                         }\r
579 \r
580                         // split not received => upper = lower\r
581                         if(rangeLower == true)\r
582                         {\r
583                                 range->setUpper(range->getLower()->getValue());\r
584                         }\r
585 \r
586                         return range;\r
587                 }\r
588 \r
589                 bool temporaryname::addToChildren(DataType* parent, char* name, DataType* children)\r
590                 //bool DataBoardRepository::addToChildren(DataType* parent, char* name, DataType* children)\r
591                 //bool addToChildren(DataType* parent, char* name, DataType* children)\r
592                 {\r
593                         //TypeRoot* typeRoot = dynamic_cast<TypeRoot*>(parent);\r
594 \r
595                         //if(typeRoot != NULL)\r
596                         //{\r
597                         //      typeRoot->addDataBoard(name, children);\r
598 \r
599                         //      return true;\r
600                         //}\r
601 \r
602                         RecordType* recordType = dynamic_cast<RecordType*>(parent);\r
603 \r
604                         if(recordType != NULL)\r
605                         {\r
606                                 recordType->addComponent(name, children);\r
607 \r
608                                 return true;\r
609                         }\r
610 \r
611                         return false;\r
612                 }\r
613 \r
614                 void temporaryname::parseParameters(pANTLR3_BASE_TREE tree, DataType* type)\r
615                 //void DataBoardRepository::parseParameters(pANTLR3_BASE_TREE tree, DataType* type)\r
616                 //void parseParameters(pANTLR3_BASE_TREE tree, DataType* type)\r
617                 {\r
618                         if((int)tree->getChildCount(tree) >= 2)\r
619                         {\r
620                                 if(dynamic_cast<NumberType*>(type) != NULL)\r
621                                 {\r
622                                         NumberType* numberType = (NumberType*)type;\r
623 \r
624                                         int annotationCount = (int)tree->getChildCount(tree);\r
625 \r
626                                         if(annotationCount >= 1)\r
627                                         {\r
628                                                 for(int i = 1; i < annotationCount; ++i)\r
629                                                 {\r
630                                                         pANTLR3_BASE_TREE annotation = (pANTLR3_BASE_TREE)tree->getChild(tree, i);\r
631 \r
632                                                         pANTLR3_BASE_TREE unit = (pANTLR3_BASE_TREE)annotation->getChild(annotation, 0);\r
633 \r
634                                                         const char* unitName = (char*)unit->getText(unit)->chars;\r
635 \r
636                                                         if(strEquals(unitName, STR_UNIT) == true)\r
637                                                         {\r
638                                                                 if((int)annotation->getChildCount(annotation) == 2)\r
639                                                                 {\r
640                                                                         pANTLR3_BASE_TREE value = (pANTLR3_BASE_TREE)annotation->getChild(annotation, 1);\r
641 \r
642                                                                         std::string strValue((char*)value->getText(value)->chars);\r
643 \r
644                                                                         strValue = removeQuotes(strValue);\r
645 \r
646                                                                         NumberType* numberType = dynamic_cast<NumberType*>(type);\r
647 \r
648                                                                         if(numberType != NULL)\r
649                                                                         {\r
650                                                                                 numberType->setUnit(strValue);\r
651                                                                         }\r
652                                                                 }\r
653                                                         }\r
654                                                         else if(strEquals(unitName, STR_RANGE) == true)\r
655                                                         {\r
656                                                                 int c = (int)annotation->getChildCount(annotation);\r
657                                                                 // possibilities:\r
658                                                                 // 5: range;[;n;..;]\r
659                                                                 // 5: range;[;..;m;]\r
660                                                                 // 6: range;[;n;..;m;]\r
661                                                                 if(c >= 5)\r
662                                                                 {\r
663                                                                         //pANTLR3_BASE_TREE openBracket = (pANTLR3_BASE_TREE)annotation->getChild(annotation, 0);\r
664                                                                         //pANTLR3_BASE_TREE closeBracket = (pANTLR3_BASE_TREE)annotation->getChild(annotation, c-1);\r
665 \r
666                                                                         //if((char)(openBracket->getText(openBracket)->chars) != '[' &&\r
667                                                                         //      (char)(closeBracket->getText(closeBracket)->chars) != ']')\r
668                                                                         //{\r
669                                                                                 Range* range = parseRange(annotation, 1, c);\r
670 \r
671                                                                                 numberType->setRange(range);\r
672                                                                         //}\r
673                                                                 }\r
674                                                         }\r
675                                                 }\r
676                                         }\r
677                                 }\r
678                                 else if(dynamic_cast<StringType*>(type) != NULL)\r
679                                 {\r
680                                         StringType* stringType = (StringType*)type;\r
681 \r
682                                         for(int i = 1; i < (int)tree->getChildCount(tree); ++i)\r
683                                         {\r
684                                                 pANTLR3_BASE_TREE annotation = (pANTLR3_BASE_TREE)tree->getChild(tree, i);\r
685 \r
686                                                 pANTLR3_BASE_TREE unit = (pANTLR3_BASE_TREE)annotation->getChild(annotation, 0);\r
687                                                 pANTLR3_BASE_TREE value = (pANTLR3_BASE_TREE)annotation->getChild(annotation, 1);\r
688 \r
689                                                 const char* unitName = (char*)unit->getText(unit)->chars;\r
690 \r
691                                                 if(strEquals(unitName, STR_PATTERN) == true)\r
692                                                 {\r
693                                                         std::string strValue((char*)value->getText(value)->chars);\r
694 \r
695                                                         strValue = removeQuotes(strValue);\r
696 \r
697                                                         StringType* stringType = dynamic_cast<StringType*>(type);\r
698 \r
699                                                         if(stringType != NULL)\r
700                                                         {\r
701                                                                 stringType->setPattern(strValue);\r
702                                                         }\r
703                                                 }\r
704                                                 else if(strEquals(unitName, STR_MIMETYPE) == true)\r
705                                                 {\r
706                                                         std::string strValue((char*)value->getText(value)->chars);\r
707 \r
708                                                         strValue = removeQuotes(strValue);\r
709 \r
710                                                         StringType* stringType = dynamic_cast<StringType*>(type);\r
711 \r
712                                                         if(stringType != NULL)\r
713                                                         {\r
714                                                                 stringType->setMimeType(strValue);\r
715                                                         }\r
716                                                 }\r
717                                                 //else if(strEquals(idName, STR_LENGTH) == true) // range\r
718                                                 //{\r
719                                                 //      std::string strValue((char*)parameterValue->getText(parameterValue)->chars);\r
720 \r
721                                                 //      StringType* stringType = dynamic_cast<StringType*>(parent);\r
722 \r
723                                                 //      if(stringType != NULL)\r
724                                                 //      {\r
725                                                 //              stringType->setLength(strValue);\r
726                                                 //      }\r
727                                                 //}\r
728                                         }\r
729                                 }\r
730                                 else if(dynamic_cast<MapType*>(type) != NULL)\r
731                                 {\r
732                                         MapType* mapType = (MapType*)type;\r
733 \r
734                                         if((int)tree->getChildCount(tree) == 3)\r
735                                         {\r
736                                                 pANTLR3_BASE_TREE key = (pANTLR3_BASE_TREE)tree->getChild(tree, 1);\r
737                                                 pANTLR3_BASE_TREE value = (pANTLR3_BASE_TREE)tree->getChild(tree, 2);\r
738 \r
739                                                 DataType* typeKey = parse(key, mapType);\r
740                                                 DataType* typeValue = parse(value, mapType);\r
741 \r
742                                                 mapType->setKeyType(typeKey);\r
743                                                 mapType->setValueType(typeValue);\r
744                                         }\r
745                                 }\r
746                                 else if(dynamic_cast<OptionalType*>(type) != NULL)\r
747                                 {\r
748                                         OptionalType* optionalType = (OptionalType*)type;\r
749 \r
750                                         if((int)tree->getChildCount(tree) == 2)\r
751                                         {\r
752                                                 pANTLR3_BASE_TREE typeRef = (pANTLR3_BASE_TREE)tree->getChild(tree, 1);\r
753 \r
754                                                 DataType* dataType = parse(typeRef, optionalType);\r
755 \r
756                                                 if(dataType != NULL)\r
757                                                 {\r
758                                                         optionalType->setComponentType(dataType);\r
759                                                 }\r
760                                         }\r
761                                 }\r
762                         }\r
763 \r
764                         //for(int i = 1; i < (int)tree->getChildCount(tree); ++i)\r
765                         //{\r
766                         //      pANTLR3_BASE_TREE parameter = (pANTLR3_BASE_TREE)tree->getChild(tree, i);\r
767 \r
768                         //      parse(parameter, returnType, indent + 1);\r
769                         //}\r
770                 }\r
771         }\r
772 }\r