blob: dd0633b0b59c38c19ca64d90edad5c740366dd1d (
plain)
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
|
#include "uscxml/config.h"
#include "uscxml/Interpreter.h"
#include "uscxml/InterpreterOptions.h"
#include "uscxml/debug/InterpreterIssue.h"
#include "uscxml/debug/DebuggerServlet.h"
#include "uscxml/interpreter/InterpreterMonitor.h"
#include "uscxml/util/DOM.h"
#include "uscxml/interpreter/Logging.h"
#include "uscxml/plugins/Factory.h"
#include "uscxml/server/HTTPServer.h"
int main(int argc, char** argv) {
using namespace uscxml;
#if defined(HAS_SIGNAL_H) && !defined(WIN32)
signal(SIGPIPE, SIG_IGN);
#endif
InterpreterOptions options = InterpreterOptions::fromCmdLine(argc, argv);
if (!options) {
InterpreterOptions::printUsageAndExit(argv[0]);
}
if (!options.validate) {
// setup HTTP server
HTTPServer::SSLConfig* sslConf = NULL;
if (options.certificate.length() > 0) {
sslConf = new HTTPServer::SSLConfig();
sslConf->privateKey = options.certificate;
sslConf->publicKey = options.certificate;
sslConf->port = options.httpsPort;
} else if (options.privateKey.length() > 0 && options.publicKey.length() > 0) {
sslConf = new HTTPServer::SSLConfig();
sslConf->privateKey = options.privateKey;
sslConf->publicKey = options.publicKey;
sslConf->port = options.httpsPort;
}
HTTPServer::getInstance(options.httpPort, options.wsPort, sslConf);
}
if (options.pluginPath.length() > 0) {
Factory::setDefaultPluginPath(options.pluginPath);
}
if (options.verbose) {
Factory::getInstance()->listComponents();
}
// instantiate and configure interpreters
std::list<Interpreter> interpreters;
for(size_t i = 0; i < options.interpreters.size(); i++) {
// InterpreterOptions* currOptions = options.interpreters[0].second;
std::string documentURL = options.interpreters[i].first;
LOGD(USCXML_INFO) << "Processing " << documentURL << std::endl;
try {
Interpreter interpreter = Interpreter::fromURL(documentURL);
if (interpreter) {
if (options.validate) {
std::list<InterpreterIssue> issues = interpreter.validate();
for (std::list<InterpreterIssue>::iterator issueIter = issues.begin(); issueIter != issues.end(); issueIter++) {
LOGD(USCXML_DEBUG) << "" << *issueIter << std::endl;
}
if (issues.size() == 0) {
LOGD(USCXML_DEBUG) << "No issues found" << std::endl;
}
}
if (options.verbose) {
StateTransitionMonitor* vm = new StateTransitionMonitor();
vm->copyToInvokers(true);
interpreter.addMonitor(vm);
}
interpreters.push_back(interpreter);
} else {
LOGD(USCXML_ERROR) << "Cannot create interpreter from " << documentURL << std::endl;
}
} catch (Event e) {
LOGD(USCXML_ERROR) << e << std::endl;
}
}
if (options.validate) {
return EXIT_SUCCESS;
}
if (options.withDebugger) {
DebuggerServlet* debugger;
debugger = new DebuggerServlet();
debugger->copyToInvokers(true);
HTTPServer::getInstance()->registerServlet("/debug", debugger);
for (auto interpreter : interpreters) {
interpreter.addMonitor(debugger);
}
}
// run interpreters
if (interpreters.size() > 0) {
try {
std::list<Interpreter>::iterator interpreterIter = interpreters.begin();
while (interpreters.size() > 0) {
while(interpreterIter != interpreters.end()) {
InterpreterState state = interpreterIter->step();
if (state == USCXML_FINISHED) {
interpreterIter = interpreters.erase(interpreterIter);
} else {
interpreterIter++;
}
}
interpreterIter = interpreters.begin();
}
} catch (Event e) {
LOGD(USCXML_ERROR) << e << std::endl;
}
} else if (options.withDebugger) {
while(true)
std::this_thread::sleep_for(std::chrono::seconds(1));
}
return EXIT_SUCCESS;
}
|