/* Web Polygraph http://www.web-polygraph.org/ * (C) 2003-2006 The Measurement Factory * Licensed under the Apache License, Version 2.0 */ #include "base/polygraph.h" #include "xml/XmlTag.h" #include "xml/XmlText.h" #include "xml/XmlAttr.h" #include "loganalyzers/ReportBlob.h" #include "loganalyzers/BlobDb.h" #include "loganalyzers/Sample.h" #include "loganalyzers/SomeInfo.h" class MeasBlob: public ReportBlob { public: MeasBlob(const String &key, const String &title); void value(const XmlAttr &val); void unit(const String &unit); void typeId(const String &typeId); public: XmlNode *measurement; }; MeasBlob::MeasBlob(const String &key, const String &title): ReportBlob(key, title), measurement(0) { static const XmlAttr dtype("dtype", "span"); *this << dtype; static const String tagName = "measurement"; measurement = append(XmlTag(tagName)); } void MeasBlob::value(const XmlAttr &val) { *measurement->attrs() << val; } void MeasBlob::unit(const String &unit) { static String attrName = "unit"; *measurement->attrs() << XmlAttr(attrName, unit); } void MeasBlob::typeId(const String &typeId) { static String attrName = "typeId"; *measurement->attrs() << XmlAttr(attrName, typeId); } /* SomeInfo */ const ReportBlob &SomeInfo::addLink(BlobDb &db, const String &newKey, const String &oldKey) { ReportBlob blob(newKey, ReportBlob::NilTitle); blob << db.include(oldKey); return *db.add(blob); } const ReportBlob &SomeInfo::addMeasBlob(BlobDb &db, const String &name, double val, const String &unit, const String &title) { MeasBlob blob(name, title); blob.value(XmlAttr::Double("value", val)); blob.unit(unit); blob.typeId(NumberSample::TheId); const ReportBlob &res = *db.add(blob); return res; } const ReportBlob &SomeInfo::addMeasBlob(BlobDb &db, const String &name, Time val, const String &title) { MeasBlob blob(name, title); blob.value(XmlAttr::Double("value", val.secd())); blob.unit("sec"); blob.typeId(NumberSample::TheId); XmlTag image("image"); XmlText text; text.buf() << val; image << text; blob.measurement->addChild(image.clone()); return *db.add(blob); } const ReportBlob &SomeInfo::addMeasBlob(BlobDb &db, const String &name, const String &val, const String &unit, const String &title) { MeasBlob blob(name, title); blob.value(XmlAttr("value", val)); blob.unit(unit); blob.typeId(TextSample::TheId); return *db.add(blob); } const ReportBlob &SomeInfo::addNaMeasBlob(BlobDb &db, const String &name, const String &title) { static String explKey("na.measurement.reason=not_collected"); static String explTitle("report note"); static XmlText textNa("n/a"); const ReportBlob *explBlob = db.has(explKey); if (!explBlob) { ReportBlob blob(explKey, explTitle); blob << XmlAttr::Int("report_note", true); blob << XmlText("no measurement was collected or stored at run-time"); explBlob = db.add(blob); } ReportBlob measBlob(name, title); measBlob << db.ptr(explKey, textNa); return *db.add(measBlob); }