ROOT logo
/*
 * AliEMCALConfiguration.cxx
 *
 *  Created on: 06.11.2014
 *      Author: markusfasel
 */
#include <cstring>
#include <sstream>
#include <iostream>
#include <TList.h>

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


AliEMCALConfiguration::AliEMCALConfiguration(const char* name) :
  TNamed(name, ""),
  fParams(NULL)
{
  fParams = new TList;
  fParams->SetOwner();
}

AliEMCALConfiguration::~AliEMCALConfiguration() {
  if(!fParams) delete fParams;
}

void AliEMCALConfiguration::AddParam(const char* name,
    AliJSONValue* value) {
  AliJSONData *entry = dynamic_cast<AliJSONData *>(fParams->FindObject(name));
  if(entry) entry->SetValue(value);
  else fParams->Add(new AliJSONData(name, value));
}

void AliEMCALConfiguration::Build(const char *jsonstring) {
  AliJSONReader parser;
  Build(parser.Decode(jsonstring));
}

void AliEMCALConfiguration::Build(TList *entries){
  TIter objects(entries);
  for(TIter entry = objects.Begin(); entry != objects.End(); ++entry){
    AliJSONData *val = dynamic_cast<AliJSONData *>(*entry);
    if(val)
      fParams->Add(val);
    else{
      TList *conf = dynamic_cast<TList *>(*entry);
      if(conf){
        AliEMCALConfiguration *daughter = new AliEMCALConfiguration(conf->GetName());
        daughter->Build(conf);
        fParams->Add(daughter);
      }
    }
  }
}

void AliEMCALConfiguration::Print(Option_t * /*value*/) const {
  std::cout << "Configuration " << GetName() << ":" << std::endl;
  std::cout << "=================================================" << std::endl;
  TIter parIter(fParams);
  AliJSONData *conf(NULL);
  while((conf = dynamic_cast<AliJSONData *>(parIter()))){
    std::cout << "Key " << conf->GetName() << ", value " << conf->GetValue()->ToString() << std::endl;
  }
  std::cout << "=================================================" << std::endl;
}
void AliEMCALConfiguration::AddConfiguration(AliEMCALConfiguration* conf) {
  fParams->Add(conf);
}

AliJSONValue* AliEMCALConfiguration::GetValue(const char *key) const {
  AliJSONData *val = dynamic_cast<AliJSONData *>(fParams->FindObject(key));
  if(!val) return NULL;
  return val->GetValue();
}

const char* AliEMCALConfiguration::CreateJSONString() const {
  std::stringstream jsonbuilder;
  jsonbuilder << "{";
  TIter confentries(fParams);
  bool isFirst = true;
  for(TIter it = confentries.Begin(); it != confentries.End(); ++it){
    AliEMCALConfiguration *conf = dynamic_cast<AliEMCALConfiguration *>(*it);
    if(conf){
      if(!isFirst) jsonbuilder << ",";
      jsonbuilder << "\"" << conf->GetName() << "\":" << conf->CreateJSONString();
    } else {
      AliJSONData *obj = dynamic_cast<AliJSONData *>(*it);
      if(obj){
        if(!isFirst) jsonbuilder << ",";
        jsonbuilder << obj->ToString();
      }
    }
    if(isFirst) isFirst = false;
  }
  jsonbuilder << "}";

  char * result = new char[jsonbuilder.str().length()];
  strcpy(result, jsonbuilder.str().c_str());  
  return result;
}

std::ostream &operator<<(std::ostream & os, const AliEMCALConfiguration &conf){
  os << conf.CreateJSONString();
  return os;
}
 AliEMCALConfiguration.cxx:1
 AliEMCALConfiguration.cxx:2
 AliEMCALConfiguration.cxx:3
 AliEMCALConfiguration.cxx:4
 AliEMCALConfiguration.cxx:5
 AliEMCALConfiguration.cxx:6
 AliEMCALConfiguration.cxx:7
 AliEMCALConfiguration.cxx:8
 AliEMCALConfiguration.cxx:9
 AliEMCALConfiguration.cxx:10
 AliEMCALConfiguration.cxx:11
 AliEMCALConfiguration.cxx:12
 AliEMCALConfiguration.cxx:13
 AliEMCALConfiguration.cxx:14
 AliEMCALConfiguration.cxx:15
 AliEMCALConfiguration.cxx:16
 AliEMCALConfiguration.cxx:17
 AliEMCALConfiguration.cxx:18
 AliEMCALConfiguration.cxx:19
 AliEMCALConfiguration.cxx:20
 AliEMCALConfiguration.cxx:21
 AliEMCALConfiguration.cxx:22
 AliEMCALConfiguration.cxx:23
 AliEMCALConfiguration.cxx:24
 AliEMCALConfiguration.cxx:25
 AliEMCALConfiguration.cxx:26
 AliEMCALConfiguration.cxx:27
 AliEMCALConfiguration.cxx:28
 AliEMCALConfiguration.cxx:29
 AliEMCALConfiguration.cxx:30
 AliEMCALConfiguration.cxx:31
 AliEMCALConfiguration.cxx:32
 AliEMCALConfiguration.cxx:33
 AliEMCALConfiguration.cxx:34
 AliEMCALConfiguration.cxx:35
 AliEMCALConfiguration.cxx:36
 AliEMCALConfiguration.cxx:37
 AliEMCALConfiguration.cxx:38
 AliEMCALConfiguration.cxx:39
 AliEMCALConfiguration.cxx:40
 AliEMCALConfiguration.cxx:41
 AliEMCALConfiguration.cxx:42
 AliEMCALConfiguration.cxx:43
 AliEMCALConfiguration.cxx:44
 AliEMCALConfiguration.cxx:45
 AliEMCALConfiguration.cxx:46
 AliEMCALConfiguration.cxx:47
 AliEMCALConfiguration.cxx:48
 AliEMCALConfiguration.cxx:49
 AliEMCALConfiguration.cxx:50
 AliEMCALConfiguration.cxx:51
 AliEMCALConfiguration.cxx:52
 AliEMCALConfiguration.cxx:53
 AliEMCALConfiguration.cxx:54
 AliEMCALConfiguration.cxx:55
 AliEMCALConfiguration.cxx:56
 AliEMCALConfiguration.cxx:57
 AliEMCALConfiguration.cxx:58
 AliEMCALConfiguration.cxx:59
 AliEMCALConfiguration.cxx:60
 AliEMCALConfiguration.cxx:61
 AliEMCALConfiguration.cxx:62
 AliEMCALConfiguration.cxx:63
 AliEMCALConfiguration.cxx:64
 AliEMCALConfiguration.cxx:65
 AliEMCALConfiguration.cxx:66
 AliEMCALConfiguration.cxx:67
 AliEMCALConfiguration.cxx:68
 AliEMCALConfiguration.cxx:69
 AliEMCALConfiguration.cxx:70
 AliEMCALConfiguration.cxx:71
 AliEMCALConfiguration.cxx:72
 AliEMCALConfiguration.cxx:73
 AliEMCALConfiguration.cxx:74
 AliEMCALConfiguration.cxx:75
 AliEMCALConfiguration.cxx:76
 AliEMCALConfiguration.cxx:77
 AliEMCALConfiguration.cxx:78
 AliEMCALConfiguration.cxx:79
 AliEMCALConfiguration.cxx:80
 AliEMCALConfiguration.cxx:81
 AliEMCALConfiguration.cxx:82
 AliEMCALConfiguration.cxx:83
 AliEMCALConfiguration.cxx:84
 AliEMCALConfiguration.cxx:85
 AliEMCALConfiguration.cxx:86
 AliEMCALConfiguration.cxx:87
 AliEMCALConfiguration.cxx:88
 AliEMCALConfiguration.cxx:89
 AliEMCALConfiguration.cxx:90
 AliEMCALConfiguration.cxx:91
 AliEMCALConfiguration.cxx:92
 AliEMCALConfiguration.cxx:93
 AliEMCALConfiguration.cxx:94
 AliEMCALConfiguration.cxx:95
 AliEMCALConfiguration.cxx:96
 AliEMCALConfiguration.cxx:97
 AliEMCALConfiguration.cxx:98
 AliEMCALConfiguration.cxx:99
 AliEMCALConfiguration.cxx:100
 AliEMCALConfiguration.cxx:101
 AliEMCALConfiguration.cxx:102
 AliEMCALConfiguration.cxx:103
 AliEMCALConfiguration.cxx:104
 AliEMCALConfiguration.cxx:105
 AliEMCALConfiguration.cxx:106
 AliEMCALConfiguration.cxx:107