ProcessNode.cc
3.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/*
* ProcessNode.cc
*
* Created on: Oct 31, 2012
* Author: f.casimir
*/
#include <sstream>
#include "ProcessNode.hh"
#include <boost/shared_ptr.hpp>
#include <Parameter.hh>
#include <Process.hh>
#include <Parameter.hh>
#include <FileConfigurator.hh>
#include <ServicesServer.hh>
#include "Config.hh"
using namespace AMDA::Parameters;
using namespace boost;
namespace AMDA {
namespace XMLParameterConfigurator {
ProcessNode::ProcessNode() : NodeCfg() {
}
ProcessNode::~ProcessNode() {
}
std::string injectResamplingIntoProcess(const double& pTimeresolution, const double& pGapThreshold, const char* pExpression) {
std::stringstream lBuffer;
bool isAParam = false;
unsigned int length = strlen(pExpression);
for ( unsigned int i = 0; i < length; ++i) {
switch(pExpression[i]) {
case '$':
isAParam = true;
lBuffer << "#sampling_classic($";
break;
default:
if( isAParam && ! (isalnum(pExpression[i]) || (pExpression[i]=='_'))) {
lBuffer << ";" << pTimeresolution << ";" << pGapThreshold << ")";
isAParam=false;
}
lBuffer << pExpression[i];
break;
}
}
if (isAParam) {
lBuffer << ";" << pTimeresolution << ";" << pGapThreshold << ")";
}
return std::string(lBuffer.str());
}
void ProcessNode::proceed(xmlNodePtr pNode, const AMDA::Parameters::CfgContext& pContext) {
LOG4CXX_DEBUG(gLogger, "ProcessNode::proceed");
Parameter* lParameter = pContext.get<Parameter*>();
double lTimeResolution = lParameter->getTimeResolution();
double lGapThreshold = lParameter->getGapThreshold();
Process *lProcess = ServicesServer::getInstance()->getProcess("standard", *lParameter);
//process description
xmlChar *lProcessDesc = xmlGetProp(pNode, (const xmlChar *) "description");
if (lProcessDesc != NULL)
{
lProcess->setDescription(std::string((const char *)lProcessDesc));
xmlFree(lProcessDesc);
}
DataWriterSPtr lDataWriter( lProcess);
std::string* xmlFileName = pContext.get<std::string*>();
lDataWriter->setSignatureTrigger(*xmlFileName);
lParameter->setDataWriter(lDataWriter);
if (pNode->children && pNode->children->content && pNode->children->content[0] != '0') {
xmlChar* lExpression = pNode->children->content;
if ( lTimeResolution != 0 ) {
// Inject Resampling
lProcess->setExpression(injectResamplingIntoProcess(lTimeResolution, lGapThreshold,(char*)lExpression));
} else {
lProcess->setExpression((char*)lExpression);
}
} else {
if ( lParameter->getParameterList().size() == 1 ) {
// Inject Resampling
if ( lTimeResolution != 0 ) {
lProcess = ServicesServer::getInstance()->getProcess("sampling_classic",*lParameter);
std::stringstream lBuffer;
lBuffer.str(""); lBuffer << lTimeResolution;
lProcess->getAttributList().push_back(lBuffer.str());
lBuffer.str(""); lBuffer << lGapThreshold;
lProcess->getAttributList().push_back(lBuffer.str());
lBuffer.str(""); lBuffer << "$" << (*lParameter->getParameterList().begin())->getId();
lProcess->setExpression(lBuffer.str());
lDataWriter.reset( lProcess);
lParameter->setDataWriter(lDataWriter);
}
else
//only one parameter + no process => use the same info
(*lParameter->getParameterList().begin())->setInfoId(lParameter->getInfoId());
} else {
ERROR_EXCEPTION( "Too many ParamGet with no process");
}
}
}
} /* namespace XMLParameterConfigurator */
} /* namespace AMDA */