Blame view

src/XMLParameterConfigurator/ProcessNode.cc 6 KB
fbe3c2bb   Benjamin Renard   First commit
1
2
3
4
5
6
7
8
/*
 * ProcessNode.cc
 *
 *  Created on: Oct 31, 2012
 *      Author: f.casimir
 */

#include <sstream>
e85676de   Benjamin Renard   Fix #6325
9
#include <algorithm>
65f64dfe   Benjamin Renard   Fix bugs with cor...
10
#include <regex>
fbe3c2bb   Benjamin Renard   First commit
11
12
13
14
15
16

#include "ProcessNode.hh"


#include <boost/shared_ptr.hpp>

65f64dfe   Benjamin Renard   Fix bugs with cor...
17

fbe3c2bb   Benjamin Renard   First commit
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#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() {
}

deefda79   Benjamin Renard   Addapt resampling...
38
std::string injectResamplingIntoProcess(const std::string& pProcessName, const std::string& pProcessParams, const std::string& pExpression) {
fbe3c2bb   Benjamin Renard   First commit
39
40
41
	std::stringstream lBuffer;
	bool isAParam = false;

e85676de   Benjamin Renard   Fix #6325
42
43
	unsigned int length = pExpression.size();
	std::string part;
65f64dfe   Benjamin Renard   Fix bugs with cor...
44
45
46
47
48
49
50
51

    bool isSpecialCase = false;
    std::string pattern;
    std::string proc;
    std::size_t found;

    for ( unsigned int i = 0; i < length; ++i) {
        
fbe3c2bb   Benjamin Renard   First commit
52
		switch(pExpression[i]) {
e85676de   Benjamin Renard   Fix #6325
53
		case '#':
65f64dfe   Benjamin Renard   Fix bugs with cor...
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
            
            part = pExpression.substr(i);
            found = part.find("(");
            if (found != std::string::npos) {
                // Test if special case
                proc = part.substr(1, found-1);
                isSpecialCase = !ServicesServer::getInstance()->getInjectResamplingBeforeProcess(proc);
                pattern = "#";
                pattern += proc;
                pattern += "(";
            }
            if (isSpecialCase) {
                int patternSize = pattern.size();
                i += patternSize;
                //special case with sum_into_table_range
                lBuffer << "#" << pProcessName << "(" << pattern;
                part = part.substr(patternSize);

                int openBracket = 0;
                int pos = 0;
                for (unsigned int j = 0; j < part.size(); ++j) {
                    if (part[j] == '(') {
                        openBracket++;
                    }
                    else if (part[j] == ')') {
                        if (openBracket == 0) {
                            pos = j;
                            break;
                        }
                        openBracket--;
                    }
                }
                lBuffer << part.substr(0, pos);
                i += pos;
                lBuffer << ");" << pProcessParams << ")";
            }
e85676de   Benjamin Renard   Fix #6325
90
91
92
93
			else {
				lBuffer << pExpression[i];
			}
			break;
fbe3c2bb   Benjamin Renard   First commit
94
95
		case '$':
			isAParam = true;
deefda79   Benjamin Renard   Addapt resampling...
96
			lBuffer << "#" << pProcessName << "($";
fbe3c2bb   Benjamin Renard   First commit
97
98
99
			break;
		default:
			if( isAParam && ! (isalnum(pExpression[i]) || (pExpression[i]=='_'))) {
deefda79   Benjamin Renard   Addapt resampling...
100
				lBuffer << ";" << pProcessParams << ")";
fbe3c2bb   Benjamin Renard   First commit
101
102
103
104
105
106
107
				isAParam=false;
			}
			lBuffer << pExpression[i];
			break;
		}
	}
	if (isAParam) {
deefda79   Benjamin Renard   Addapt resampling...
108
		lBuffer << ";" << pProcessParams << ")";
fbe3c2bb   Benjamin Renard   First commit
109
110
111
112
113
114
115
116
117
118
119
	}

	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();
deefda79   Benjamin Renard   Addapt resampling...
120
	std::string lReferenceParam = lParameter->getReferenceParameter();
fbe3c2bb   Benjamin Renard   First commit
121
122
123
124
125
126
127
128
129
130
	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);
	}

854a7fcf   Benjamin Renard   First implementat...
131
132
133
134
135
136
137
138
	//user process
	xmlChar *lUserProcess = xmlGetProp(pNode, (const xmlChar *) "userProcess");
	if (lUserProcess != NULL)
	{
		lProcess->setIsUserProcess(strcasecmp ((const char*)lUserProcess, "true") == 0);
		xmlFree(lUserProcess);
	}

fbe3c2bb   Benjamin Renard   First commit
139
140
141
142
143
	DataWriterSPtr lDataWriter( lProcess);
	std::string* xmlFileName = pContext.get<std::string*>();
	lDataWriter->setSignatureTrigger(*xmlFileName);

	lParameter->setDataWriter(lDataWriter);
236880a3   Benjamin Renard   Fix expression pa...
144
	if (pNode->children && pNode->children->content && pNode->children->content[0] != '\0') {
e85676de   Benjamin Renard   Fix #6325
145
146
147
		std::string expression = std::string((char*)pNode->children->content);
		// Remove all aspaces
		expression.erase(std::remove(expression.begin(), expression.end(), ' '), expression.end());
deefda79   Benjamin Renard   Addapt resampling...
148
149
150
151
152
		if (!lReferenceParam.empty()) {
			// Inject Resampling with reference param
			expression = injectResamplingIntoProcess("sampling_under_refparam", lReferenceParam, expression.c_str());
		}
		else if ( lTimeResolution != 0 ) {
fbe3c2bb   Benjamin Renard   First commit
153
			// Inject Resampling
deefda79   Benjamin Renard   Addapt resampling...
154
			std::stringstream lProcessParams;
46ee40b3   Benjamin Renard   Fix reference fil...
155
			lProcessParams << lTimeResolution << ";" << lGapThreshold;
deefda79   Benjamin Renard   Addapt resampling...
156
			expression = injectResamplingIntoProcess("sampling_classic", lProcessParams.str(), expression.c_str());
fbe3c2bb   Benjamin Renard   First commit
157
		}
deefda79   Benjamin Renard   Addapt resampling...
158
		lProcess->setExpression(expression);
fbe3c2bb   Benjamin Renard   First commit
159
160
161
	} else {
		if ( lParameter->getParameterList().size() == 1 ) {
			// Inject Resampling
deefda79   Benjamin Renard   Addapt resampling...
162
163
164
165
166
167
168
169
170
171
			if (!lReferenceParam.empty()) {
				lProcess = ServicesServer::getInstance()->getProcess("sampling_under_refparam",*lParameter);
				std::stringstream lBuffer;
				lProcess->getAttributList().push_back(lReferenceParam);
				lBuffer.str(""); lBuffer << "$" << (*lParameter->getParameterList().begin())->getId();
				lProcess->setExpression(lBuffer.str());
				lDataWriter.reset( lProcess);
				lParameter->setDataWriter(lDataWriter);
			}
			else if ( lTimeResolution != 0 ) {
fbe3c2bb   Benjamin Renard   First commit
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
				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 */