-
Notifications
You must be signed in to change notification settings - Fork 0
/
plugin.cpp
238 lines (214 loc) · 5.76 KB
/
plugin.cpp
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
/*
* Fledge "asset" filter plugin.
*
* Copyright (c) 2021 Dianomic Systems Inc.
*
* Released under the Apache 2.0 Licence
*
* Author: Mark Riddoch
*/
#include <string>
#include <iostream>
#include <plugin_api.h>
#include <config_category.h>
#include <filter.h>
#include <reading_set.h>
#include <version.h>
#define FILTER_NAME "replace"
static const char *default_config = QUOTE({
"plugin" : {
"description" : "Replace reservered charecters in asset name and data point names",
"type" : "string",
"default" : FILTER_NAME,
"readonly" : "true"
},
"enable": {
"description": "A switch that can be used to enable or disable execution of the filter.",
"displayName": "Enabled",
"type": "boolean",
"default": "false"
},
"replace" : {
"description" : "Characters to replace. Simply a string of the characters to be replaced",
"type" : "string",
"default" : "*{}|[];?",
"order" : "1",
"displayName" : "Replace"
},
"replacement" : {
"description" : "Character to use as a replacement.",
"type" : "string",
"default" : "_",
"order" : "2",
"displayName" : "With"
}
});
using namespace std;
/**
* The Filter plugin interface
*/
extern "C" {
/**
* The plugin information structure
*/
static PLUGIN_INFORMATION info = {
FILTER_NAME, // Name
VERSION, // Version
0, // Flags
PLUGIN_TYPE_FILTER, // Type
"1.0.0", // Interface version
default_config // Default plugin configuration
};
typedef struct
{
FledgeFilter *handle;
std::string replace;
char replacement;
std::string configCatName;
} FILTER_INFO;
/**
* Return the information about this plugin
*/
PLUGIN_INFORMATION *plugin_info()
{
return &info;
}
/**
* Initialise the plugin, called to get the plugin handle and setup the
* output handle that will be passed to the output stream. The output stream
* is merely a function pointer that is called with the output handle and
* the new set of readings generated by the plugin.
* (*output)(outHandle, readings);
*
* @param config The configuration category for the filter
* @param outHandle A handle that will be passed to the output stream
* @param output The output stream (function pointer) to which data is passed
* @return An opaque handle that is used in all subsequent calls to the plugin
*/
PLUGIN_HANDLE plugin_init(ConfigCategory* config,
OUTPUT_HANDLE *outHandle,
OUTPUT_STREAM output)
{
FILTER_INFO *info = new FILTER_INFO;
info->handle = new FledgeFilter(FILTER_NAME, *config, outHandle, output);
FledgeFilter *filter = info->handle;
info->configCatName = config->getName();
// Handle filter configuration
if (filter->getConfig().itemExists("replace"))
{
info->replace = filter->getConfig().getValue("replace");
}
else
{
Logger::getLogger()->error("No config provided for replace characters, cannot proceed");
return NULL;
}
if (filter->getConfig().itemExists("replacement"))
{
string str = filter->getConfig().getValue("replacement");
info->replacement = str[0];
}
else
{
Logger::getLogger()->error("No config provided for replacement character, cannot proceed");
return NULL;
}
return (PLUGIN_HANDLE)info;
}
/**
* Ingest a set of readings into the plugin for processing
*
* @param handle The plugin handle returned from plugin_init
* @param readingSet The readings to process
*/
void plugin_ingest(PLUGIN_HANDLE *handle,
READINGSET *readingSet)
{
FILTER_INFO *info = (FILTER_INFO *) handle;
FledgeFilter* filter = info->handle;
if (!filter->isEnabled())
{
// Current filter is not active: just pass the readings set
filter->m_func(filter->m_data, readingSet);
return;
}
// Just get all the readings in the readingset
const vector<Reading *>& readings = readingSet->getAllReadings();
// Iterate the readings
for (vector<Reading *>::const_iterator elem = readings.begin();
elem != readings.end();
++elem)
{
// Perform repalce in asset name
string str = (*elem)->getAssetName();
for (int i = 0; i < info->replace.length(); i++)
{
char c = info->replace[i];
size_t pos;
while ((pos = str.find_first_of(c)) != string::npos)
{
str[pos] = info->replacement;
}
}
(*elem)->setAssetName(str);
// Now do the data point names
vector<Datapoint *> datapoints = (*elem)->getReadingData();
for (auto dp = datapoints.begin(); dp != datapoints.end(); ++dp)
{
string str = (*dp)->getName();
for (int i = 0; i < info->replace.length(); i++)
{
char c = info->replace[i];
size_t pos;
while ((pos = str.find_first_of(c)) != string::npos)
{
str[pos] = info->replacement;
}
}
(*dp)->setName(str);
}
}
filter->m_func(filter->m_data, readingSet);
}
/**
* Plugin reconfiguration entry point
*
* @param handle The plugin handle
* @param newConfig The new configuration data
*/
void plugin_reconfigure(PLUGIN_HANDLE *handle, const string& newConfig)
{
FILTER_INFO *info = (FILTER_INFO *) handle;
FledgeFilter* filter = info->handle;
filter->setConfig(newConfig);
if (filter->getConfig().itemExists("replace"))
{
info->replace = filter->getConfig().getValue("replace");
}
else
{
Logger::getLogger()->error("No config provided for replace characters, cannot proceed");
return;
}
if (filter->getConfig().itemExists("replacement"))
{
string str = filter->getConfig().getValue("replacement");
info->replacement = str[0];
}
else
{
Logger::getLogger()->error("No config provided for replacement character, cannot proceed");
return;
}
}
/**
* Call the shutdown method in the plugin
*/
void plugin_shutdown(PLUGIN_HANDLE *handle)
{
FILTER_INFO *info = (FILTER_INFO *) handle;
delete info->handle;
delete info;
}
// End of extern "C"
};