Чтобы ответить на ваш второй вопрос, а именно: «Каков рекомендуемый способ сопоставить весь объект событию Apama?»:
Я определил несколько событий, которые будут отображаться в JSON, который вы указали:
event Reference {
string self;
any managedObject;
}
event Object {
string self;
sequence<Reference> references;
}
event ActiveAlarmsStatus {
integer minor;
integer critical;
}
event IsDevice {}
event ManagedObject {
string owner;
string self;
string id;
string name;
string creationTime;
string lastUpdated;
Object additionParents;
Object childDevices;
Object childAssets;
Object childAdditions;
Object deviceParents;
Object assetParents;
ActiveAlarmsStatus c8y_ActiveAlarmsStatus;
IsDevice c8y_IsDevice;
string ax_Customer;
sequence<string> c8y_SupportedMeasurements;
}
Поскольку ManagedObject содержит объект, который содержит ссылку, которая сама содержит ManagedObject, EPL не будет компилироваться из-за рекурсивных типов. Поэтому в Reference мы используем любой тип для маскировки ManagedObject. это позволяет EPL компилировать.
Однако, поскольку any скрывает тип, мы не знаем, к какому типу его преобразовать, и поэтому вместо этого у нас есть any, содержащий словарь. Это нормально, потому что мы можем использовать некоторые вспомогательные функции для извлечения необходимой нам информации:
action GetSequenceReference(sequence<any> s) returns sequence<Reference> {
sequence<Reference> ret := new sequence<Reference>;
any r := new any;
for r in s {
ret.append(<Reference>r);
}
return ret;
}
action GetSequenceString(sequence<any> s) returns sequence<string> {
sequence<string> ret := new sequence<string>;
any r := new any;
for r in s {
ret.append(<string>r);
}
return ret;
}
action GetObject(any a) returns Object {
log "Getting object from: " + a.toString() at INFO;
dictionary<any,any> dict := <dictionary<any,any> >a;
Object ret := new Object;
ret.self := <string>dict.getDefault( "self", "" );
ret.references := GetSequenceReference( <sequence<any> >dict.getDefault( "references", new sequence<any> ) );
return ret;
}
action GetActiveAlarmsStatus(any a) returns ActiveAlarmsStatus {
log "Getting active alarms status from: " + a.toString() at INFO;
dictionary<any,any> dict := <dictionary<any,any> >a;
ActiveAlarmsStatus ret := new ActiveAlarmsStatus;
ret.minor := <integer>dict.getDefault( "minor", 0 );
ret.critical := <integer>dict.getDefault( "critical", 0 );
return ret;
}
action GetIsDevice(any a) returns IsDevice {
log "Getting is device from: " + a.toString() at INFO;
dictionary<any,any> dict := <dictionary<any,any> >a;
IsDevice ret := new IsDevice;
return ret;
}
action GetManagedObject(any a) returns ManagedObject {
log "Getting managed object from: " + a.toString() at INFO;
dictionary<any,any> dict := <dictionary<any,any> >a;
ManagedObject ret := new ManagedObject;
ret.owner := <string>dict.getDefault( "owner", "" );
ret.self := <string>dict.getDefault( "self", "" );
ret.id := <string>dict.getDefault( "id", "" );
ret.name := <string>dict.getDefault( "name", "" );
ret.creationTime := <string>dict.getDefault( "creationTime", "" );
ret.lastUpdated := <string>dict.getDefault( "lastUpdated", "" );
ret.additionParents := GetObject( dict.getDefault( "additionParents", new dictionary<any,any> ) );
ret.childDevices := GetObject( dict.getDefault( "childDevices", new dictionary<any,any> ) );
ret.childAssets := GetObject( dict.getDefault( "childAssets", new dictionary<any,any> ) );
ret.childAdditions := GetObject( dict.getDefault( "childAdditions", new dictionary<any,any> ) );
ret.deviceParents := GetObject( dict.getDefault( "deviceParents", new dictionary<any,any> ) );
ret.assetParents := GetObject( dict.getDefault( "assetParents", new dictionary<any,any> ) );
ret.c8y_ActiveAlarmsStatus := GetActiveAlarmsStatus( dict.getDefault( "c8y_ActiveAlarmsStatus", new dictionary<any,any> ) );
ret.c8y_IsDevice := GetIsDevice( dict.getDefault( "c8y_IsDevice", new dictionary<any,any> ) );
ret.ax_Customer := <string>dict.getDefault( "ax_Customer", "" );
ret.c8y_SupportedMeasurements := GetSequenceString( <sequence<any> >dict.getDefault( "c8y_SupportedMeasurements", new sequence<any> ) );
return ret;
}
Используя эти вспомогательные функции, мы можем извлечь информацию из нашего исходного события:
action handleResponse(Response response){
if response.isSuccess(){
ManagedObject mo := GetManagedObject( response.payload.toDictionary() );
log "###The response payload is :" + mo.toString() at INFO;
}
else {
log "###Request failed. Response status is: " + response.statusCode.toString() + " | " + response.statusMessage at INFO;
}
}
И вот оно у вас! Полностью сопоставленное событие.