static Value v8ValueToValue(v8::Handle<v8::Value> v8Value) { v8::HandleScope scope; if (v8Value->IsArray()) { List<Value> value; const v8::Handle<v8::Array> v8Array = v8::Handle<v8::Array>::Cast(v8Value); const uint32_t size = v8Array->Length(); for (uint32_t i = 0; i < size; ++i) { if (v8Array->Has(i)) value.append(v8ValueToValue(v8Array->Get(i))); else value.append(Value()); } return Value(value); } else if (v8Value->IsObject()) { Map<String, Value> value; const v8::Handle<v8::Object> v8Object = v8Value->ToObject(); const v8::Handle<v8::Array> props = v8Object->GetPropertyNames(); const uint32_t size = props->Length(); for (uint32_t i = 0; i < size; ++i) { assert(props->Has(i)); const v8::Handle<v8::Value> name = props->Get(i); value[String(*v8::String::Utf8Value(name))] = v8ValueToValue(v8Object->Get(name)); } return Value(value); } else if (v8Value->IsBoolean()) { return Value(v8Value->BooleanValue()); } else if (v8Value->IsInt32() || v8Value->IsUint32()) { return Value(v8Value->Int32Value()); } else if (v8Value->IsNumber()) { return Value(v8Value->NumberValue()); } else if (v8Value->IsString()) { return Value(String(*v8::String::Utf8Value(v8Value))); } else { error() << "Unexpected v8 value type in JSONParser"; } // undefined or null? return Value(); }
/////////////////////////////// // QMiner-JavaScript-Stream-Aggr TNodeJsStreamAggr::TNodeJsStreamAggr(TWPt<TQm::TBase> _Base, const TStr& _AggrNm, v8::Handle<v8::Object> TriggerVal) : TStreamAggr(_Base, _AggrNm) { v8::Isolate* Isolate = v8::Isolate::GetCurrent(); v8::HandleScope HandleScope(Isolate); // Every stream aggregate should implement these two QmAssertR(TriggerVal->Has(v8::String::NewFromUtf8(Isolate, "onAdd")), "TNodeJsStreamAggr constructor, name: " + _AggrNm + ", type: javaScript. Missing onAdd callback. Possible reason: type of the aggregate was not specified and it defaulted to javaScript."); QmAssertR(TriggerVal->Has(v8::String::NewFromUtf8(Isolate, "saveJson")), "TNodeJsStreamAggr constructor, name: " + _AggrNm + ", type: javaScript. Missing saveJson callback. Possible reason: type of the aggregate was not specified and it defaulted to javaScript."); v8::Handle<v8::Value> _OnAddFun = TriggerVal->Get(v8::String::NewFromUtf8(Isolate, "onAdd")); QmAssert(_OnAddFun->IsFunction()); OnAddFun.Reset(Isolate, v8::Handle<v8::Function>::Cast(_OnAddFun)); if (TriggerVal->Has(v8::String::NewFromUtf8(Isolate, "onUpdate"))) { v8::Handle<v8::Value> _OnUpdateFun = TriggerVal->Get(v8::String::NewFromUtf8(Isolate, "onUpdate")); QmAssert(_OnUpdateFun->IsFunction()); OnUpdateFun.Reset(Isolate, v8::Handle<v8::Function>::Cast(_OnUpdateFun)); } if (TriggerVal->Has(v8::String::NewFromUtf8(Isolate, "onDelete"))) { v8::Handle<v8::Value> _OnDeleteFun = TriggerVal->Get(v8::String::NewFromUtf8(Isolate, "onDelete")); QmAssert(_OnDeleteFun->IsFunction()); OnDeleteFun.Reset(Isolate, v8::Handle<v8::Function>::Cast(_OnDeleteFun)); } v8::Handle<v8::Value> _SaveJsonFun = TriggerVal->Get(v8::String::NewFromUtf8(Isolate, "saveJson")); QmAssert(_SaveJsonFun->IsFunction()); SaveJsonFun.Reset(Isolate, v8::Handle<v8::Function>::Cast(_SaveJsonFun)); // StreamAggr::_Save if (TriggerVal->Has(v8::String::NewFromUtf8(Isolate, "save"))) { v8::Handle<v8::Value> _Save = TriggerVal->Get(v8::String::NewFromUtf8(Isolate, "save")); QmAssert(_Save->IsFunction()); SaveFun.Reset(Isolate, v8::Handle<v8::Function>::Cast(_Save)); } // StreamAggr::_Load if (TriggerVal->Has(v8::String::NewFromUtf8(Isolate, "load"))) { v8::Handle<v8::Value> _Load = TriggerVal->Get(v8::String::NewFromUtf8(Isolate, "load")); QmAssert(_Load->IsFunction()); LoadFun.Reset(Isolate, v8::Handle<v8::Function>::Cast(_Load)); } // IInt if (TriggerVal->Has(v8::String::NewFromUtf8(Isolate, "getInt"))) { v8::Handle<v8::Value> _GetInt = TriggerVal->Get(v8::String::NewFromUtf8(Isolate, "getInt")); QmAssert(_GetInt->IsFunction()); GetIntFun.Reset(Isolate, v8::Handle<v8::Function>::Cast(_GetInt)); } // IFlt if (TriggerVal->Has(v8::String::NewFromUtf8(Isolate, "getFlt"))) { v8::Handle<v8::Value> _GetFlt = TriggerVal->Get(v8::String::NewFromUtf8(Isolate, "getFlt")); QmAssert(_GetFlt->IsFunction()); GetFltFun.Reset(Isolate, v8::Handle<v8::Function>::Cast(_GetFlt)); } // ITm if (TriggerVal->Has(v8::String::NewFromUtf8(Isolate, "getTm"))) { v8::Handle<v8::Value> _GetTm = TriggerVal->Get(v8::String::NewFromUtf8(Isolate, "getTm")); QmAssert(_GetTm->IsFunction()); GetTmMSecsFun.Reset(Isolate, v8::Handle<v8::Function>::Cast(_GetTm)); } // IFltTmIO if (TriggerVal->Has(v8::String::NewFromUtf8(Isolate, "getInFlt"))) { v8::Handle<v8::Value> _GetInFlt = TriggerVal->Get(v8::String::NewFromUtf8(Isolate, "getInFlt")); QmAssert(_GetInFlt->IsFunction()); GetInFltFun.Reset(Isolate, v8::Handle<v8::Function>::Cast(_GetInFlt)); } if (TriggerVal->Has(v8::String::NewFromUtf8(Isolate, "getInTm"))) { v8::Handle<v8::Value> _GetInTm = TriggerVal->Get(v8::String::NewFromUtf8(Isolate, "getInTm")); QmAssert(_GetInTm->IsFunction()); GetInTmMSecsFun.Reset(Isolate, v8::Handle<v8::Function>::Cast(_GetInTm)); } if (TriggerVal->Has(v8::String::NewFromUtf8(Isolate, "getOutFltV"))) { v8::Handle<v8::Value> _GetOutFltV = TriggerVal->Get(v8::String::NewFromUtf8(Isolate, "getOutFltV")); QmAssert(_GetOutFltV->IsFunction()); GetOutFltVFun.Reset(Isolate, v8::Handle<v8::Function>::Cast(_GetOutFltV)); } if (TriggerVal->Has(v8::String::NewFromUtf8(Isolate, "getOutTmV"))) { v8::Handle<v8::Value> _GetOutTmV = TriggerVal->Get(v8::String::NewFromUtf8(Isolate, "getOutTmV")); QmAssert(_GetOutTmV->IsFunction()); GetOutTmMSecsVFun.Reset(Isolate, v8::Handle<v8::Function>::Cast(_GetOutTmV)); } if (TriggerVal->Has(v8::String::NewFromUtf8(Isolate, "getN"))) { v8::Handle<v8::Value> _GetN = TriggerVal->Get(v8::String::NewFromUtf8(Isolate, "getN")); QmAssert(_GetN->IsFunction()); GetNFun.Reset(Isolate, v8::Handle<v8::Function>::Cast(_GetN)); } // IFltVec if (TriggerVal->Has(v8::String::NewFromUtf8(Isolate, "getFltLen"))) { v8::Handle<v8::Value> _GetFltLen = TriggerVal->Get(v8::String::NewFromUtf8(Isolate, "getFltLen")); QmAssert(_GetFltLen->IsFunction()); GetFltLenFun.Reset(Isolate, v8::Handle<v8::Function>::Cast(_GetFltLen)); } if (TriggerVal->Has(v8::String::NewFromUtf8(Isolate, "getFltAt"))) { v8::Handle<v8::Value> _GetFltAt = TriggerVal->Get(v8::String::NewFromUtf8(Isolate, "getFltAt")); QmAssert(_GetFltAt->IsFunction()); GetFltAtFun.Reset(Isolate, v8::Handle<v8::Function>::Cast(_GetFltAt)); } if (TriggerVal->Has(v8::String::NewFromUtf8(Isolate, "getFltV"))) { v8::Handle<v8::Value> _GetFltV = TriggerVal->Get(v8::String::NewFromUtf8(Isolate, "getFltV")); QmAssert(_GetFltV->IsFunction()); GetFltVFun.Reset(Isolate, v8::Handle<v8::Function>::Cast(_GetFltV)); } // INmFlt if (TriggerVal->Has(v8::String::NewFromUtf8(Isolate, "isNmFlt"))) { v8::Handle<v8::Value> _IsNmFlt = TriggerVal->Get(v8::String::NewFromUtf8(Isolate, "isNmFlt")); QmAssert(_IsNmFlt->IsFunction()); IsNmFltFun.Reset(Isolate, v8::Handle<v8::Function>::Cast(_IsNmFlt)); } if (TriggerVal->Has(v8::String::NewFromUtf8(Isolate, "getNmFlt"))) { v8::Handle<v8::Value> _GetNmFlt = TriggerVal->Get(v8::String::NewFromUtf8(Isolate, "getNmFlt")); QmAssert(_GetNmFlt->IsFunction()); GetNmFltFun.Reset(Isolate, v8::Handle<v8::Function>::Cast(_GetNmFlt)); } if (TriggerVal->Has(v8::String::NewFromUtf8(Isolate, "getNmFltV"))) { v8::Handle<v8::Value> _GetNmFltV = TriggerVal->Get(v8::String::NewFromUtf8(Isolate, "getNmFltV")); QmAssert(_GetNmFltV->IsFunction()); GetNmFltVFun.Reset(Isolate, v8::Handle<v8::Function>::Cast(_GetNmFltV)); } // INmInt if (TriggerVal->Has(v8::String::NewFromUtf8(Isolate, "isNm"))) { v8::Handle<v8::Value> _IsNm = TriggerVal->Get(v8::String::NewFromUtf8(Isolate, "isNm")); QmAssert(_IsNm->IsFunction()); IsNmFun.Reset(Isolate, v8::Handle<v8::Function>::Cast(_IsNm)); } if (TriggerVal->Has(v8::String::NewFromUtf8(Isolate, "getNmInt"))) { v8::Handle<v8::Value> _GetNmInt = TriggerVal->Get(v8::String::NewFromUtf8(Isolate, "getNmInt")); QmAssert(_GetNmInt->IsFunction()); GetNmIntFun.Reset(Isolate, v8::Handle<v8::Function>::Cast(_GetNmInt)); } if (TriggerVal->Has(v8::String::NewFromUtf8(Isolate, "getNmIntV"))) { v8::Handle<v8::Value> _GetNmIntV = TriggerVal->Get(v8::String::NewFromUtf8(Isolate, "getNmIntV")); QmAssert(_GetNmIntV->IsFunction()); GetNmIntVFun.Reset(Isolate, v8::Handle<v8::Function>::Cast(_GetNmIntV)); } }