ROOT logo
/*
 * AliJSONReader.cxx
 *
 *  Created on: 06.11.2014
 *      Author: markusfasel
 */

#include <TList.h>
#include <TString.h>

#include "AliJSONData.h"
#include "AliJSONReader.h"

AliJSONSyntaxTreeNode::AliJSONSyntaxTreeNode(const char *name, AliJSONSyntaxTreeNode *mother):
    fName(name),
    fMotherNode(mother),
    fEntries(),
    fDaughters(),
    fOwner(false)
{
}

AliJSONSyntaxTreeNode:: ~AliJSONSyntaxTreeNode() {
  if(fOwner){
    for(std::vector<AliJSONData *>::iterator it = fEntries.begin(); it != fEntries.end(); it++){
      delete *it;
    }
  }
  for(std::vector<AliJSONSyntaxTreeNode *>::iterator it = fDaughters.begin(); it != fDaughters.end(); it++){
    delete *it;
  }
}

void AliJSONSyntaxTreeNode::AddEntry(AliJSONData *entry) {
  fEntries.push_back(entry);
}

AliJSONSyntaxTreeNode *AliJSONSyntaxTreeNode::CreateDaughter(const char *name){
  AliJSONSyntaxTreeNode *daughter = new AliJSONSyntaxTreeNode(name, this);
  fDaughters.push_back(daughter);
  return daughter;
}

void AliJSONSyntaxTreeNode::SetOwner(bool owner) {
  fOwner = owner;
  for(std::vector<AliJSONSyntaxTreeNode *>::iterator it = fDaughters.begin(); it != fDaughters.end(); it++)
    (*it)->SetOwner(owner);
}

AliJSONReader::AliJSONReader() {

}

AliJSONReader::~AliJSONReader() {
}

TList* AliJSONReader::Decode(const char* jsonstring) const {
  /*
   * Decode JSON String
   * 1st create the abstract syntax tree
   * 2nd serialise the abstract syntax tree it into a TList
   */
  AliJSONSyntaxTreeNode * ast = new AliJSONSyntaxTreeNode("", NULL),
      *current = ast;

  TString jsontstring(jsonstring);
  jsontstring.ReplaceAll(" ","");

  // First strip away the left and right brackets
  int first(jsontstring.First('{')+1), last(jsontstring.Last('}'));
  jsontstring = jsontstring(first, last-first+1);
  bool hasNext = jsontstring.Length() > 0;
  while(hasNext){ // Create the abstract syntax tree
    if(jsontstring[0] == '}'){
      current = current->GetMotherNode();
      jsontstring = jsontstring(1, jsontstring.Length()-1);
      if(!(jsontstring.Length() || current)) hasNext = false;
      continue;
    }
    // Find the next separator
    int separator = jsontstring.First(':');
    if(separator == kNPOS){
      hasNext = false;
      break;
    } else{
      TString key = jsontstring(0,separator-1);
      key.ReplaceAll("\"", "");
      jsontstring = jsontstring(separator + 1, jsontstring.Length() - (separator + 1));
      if(jsontstring[0] == '{'){
        // Handle complicated object
        current = current->CreateDaughter(key.Data());
        jsontstring = jsontstring(1,jsontstring.Length()-1);
      } else{
        // Handle simple value
        separator = jsontstring.First(',');
    	if(separator == kNPOS){
          separator = jsontstring.First('}');
	}
        TString value = jsontstring(0, separator -1);
        jsontstring = jsontstring(separator+1, jsontstring.Length() - (separator + 1));
        value.ReplaceAll("\"", "");
        current->AddEntry(new AliJSONData(key.Data(), value.Data()));
      }
    }
  }

  ast->SetOwner(false);

  // Serialise it into a TList
  TList *entries = new TList;
  std::vector<AliJSONData *> &rootnodeentries = ast->GetEntries();
  for(std::vector<AliJSONData *>::iterator it = rootnodeentries.begin(); it != rootnodeentries.end(); it++)
    entries->Add(*it);
  std::vector<AliJSONSyntaxTreeNode *> &daughters = ast->GetDaughters();
  for(std::vector<AliJSONSyntaxTreeNode *>::iterator it = daughters.begin(); it != daughters.end(); it++)
    AddNodeToList(*it, entries);
  return entries;
}

void AliJSONReader::AddNodeToList(AliJSONSyntaxTreeNode* node, TList* consumer) const {
  TList *entries = new TList;
  entries->SetName(node->GetName());
  std::vector<AliJSONData *> &nodeentries = node->GetEntries();
  std::vector<AliJSONSyntaxTreeNode *> &daughters = node->GetDaughters();
  for(std::vector<AliJSONData *>::iterator it = nodeentries.begin(); it != nodeentries.end(); it++)
    entries->Add(*it);
  for(std::vector<AliJSONSyntaxTreeNode *>::iterator it = daughters.begin(); it != daughters.end(); it++)
    AddNodeToList(*it, entries);
  consumer->Add(entries);
}
 AliJSONReader.cxx:1
 AliJSONReader.cxx:2
 AliJSONReader.cxx:3
 AliJSONReader.cxx:4
 AliJSONReader.cxx:5
 AliJSONReader.cxx:6
 AliJSONReader.cxx:7
 AliJSONReader.cxx:8
 AliJSONReader.cxx:9
 AliJSONReader.cxx:10
 AliJSONReader.cxx:11
 AliJSONReader.cxx:12
 AliJSONReader.cxx:13
 AliJSONReader.cxx:14
 AliJSONReader.cxx:15
 AliJSONReader.cxx:16
 AliJSONReader.cxx:17
 AliJSONReader.cxx:18
 AliJSONReader.cxx:19
 AliJSONReader.cxx:20
 AliJSONReader.cxx:21
 AliJSONReader.cxx:22
 AliJSONReader.cxx:23
 AliJSONReader.cxx:24
 AliJSONReader.cxx:25
 AliJSONReader.cxx:26
 AliJSONReader.cxx:27
 AliJSONReader.cxx:28
 AliJSONReader.cxx:29
 AliJSONReader.cxx:30
 AliJSONReader.cxx:31
 AliJSONReader.cxx:32
 AliJSONReader.cxx:33
 AliJSONReader.cxx:34
 AliJSONReader.cxx:35
 AliJSONReader.cxx:36
 AliJSONReader.cxx:37
 AliJSONReader.cxx:38
 AliJSONReader.cxx:39
 AliJSONReader.cxx:40
 AliJSONReader.cxx:41
 AliJSONReader.cxx:42
 AliJSONReader.cxx:43
 AliJSONReader.cxx:44
 AliJSONReader.cxx:45
 AliJSONReader.cxx:46
 AliJSONReader.cxx:47
 AliJSONReader.cxx:48
 AliJSONReader.cxx:49
 AliJSONReader.cxx:50
 AliJSONReader.cxx:51
 AliJSONReader.cxx:52
 AliJSONReader.cxx:53
 AliJSONReader.cxx:54
 AliJSONReader.cxx:55
 AliJSONReader.cxx:56
 AliJSONReader.cxx:57
 AliJSONReader.cxx:58
 AliJSONReader.cxx:59
 AliJSONReader.cxx:60
 AliJSONReader.cxx:61
 AliJSONReader.cxx:62
 AliJSONReader.cxx:63
 AliJSONReader.cxx:64
 AliJSONReader.cxx:65
 AliJSONReader.cxx:66
 AliJSONReader.cxx:67
 AliJSONReader.cxx:68
 AliJSONReader.cxx:69
 AliJSONReader.cxx:70
 AliJSONReader.cxx:71
 AliJSONReader.cxx:72
 AliJSONReader.cxx:73
 AliJSONReader.cxx:74
 AliJSONReader.cxx:75
 AliJSONReader.cxx:76
 AliJSONReader.cxx:77
 AliJSONReader.cxx:78
 AliJSONReader.cxx:79
 AliJSONReader.cxx:80
 AliJSONReader.cxx:81
 AliJSONReader.cxx:82
 AliJSONReader.cxx:83
 AliJSONReader.cxx:84
 AliJSONReader.cxx:85
 AliJSONReader.cxx:86
 AliJSONReader.cxx:87
 AliJSONReader.cxx:88
 AliJSONReader.cxx:89
 AliJSONReader.cxx:90
 AliJSONReader.cxx:91
 AliJSONReader.cxx:92
 AliJSONReader.cxx:93
 AliJSONReader.cxx:94
 AliJSONReader.cxx:95
 AliJSONReader.cxx:96
 AliJSONReader.cxx:97
 AliJSONReader.cxx:98
 AliJSONReader.cxx:99
 AliJSONReader.cxx:100
 AliJSONReader.cxx:101
 AliJSONReader.cxx:102
 AliJSONReader.cxx:103
 AliJSONReader.cxx:104
 AliJSONReader.cxx:105
 AliJSONReader.cxx:106
 AliJSONReader.cxx:107
 AliJSONReader.cxx:108
 AliJSONReader.cxx:109
 AliJSONReader.cxx:110
 AliJSONReader.cxx:111
 AliJSONReader.cxx:112
 AliJSONReader.cxx:113
 AliJSONReader.cxx:114
 AliJSONReader.cxx:115
 AliJSONReader.cxx:116
 AliJSONReader.cxx:117
 AliJSONReader.cxx:118
 AliJSONReader.cxx:119
 AliJSONReader.cxx:120
 AliJSONReader.cxx:121
 AliJSONReader.cxx:122
 AliJSONReader.cxx:123
 AliJSONReader.cxx:124
 AliJSONReader.cxx:125
 AliJSONReader.cxx:126
 AliJSONReader.cxx:127
 AliJSONReader.cxx:128
 AliJSONReader.cxx:129
 AliJSONReader.cxx:130