-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMainApplication.cpp
More file actions
121 lines (102 loc) · 3.86 KB
/
MainApplication.cpp
File metadata and controls
121 lines (102 loc) · 3.86 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
117
118
119
120
121
//
// Created by fquinn on 22/07/2018.
//
#include "MainApplication.h"
#include "subsystems/SubsystemServletRouter.h"
#include "subsystems/SubsystemOpenMama.h"
#include "OptionNames.h"
#include <Poco/Util/OptionCallback.h>
#include <iostream>
#include <Poco/Process.h>
#include <Poco/SignalHandler.h>
#include <Poco/Util/HelpFormatter.h>
#include <Poco/Util/OptionException.h>
#include <signal.h>
#include <sstream>
using namespace cascadium;
using namespace std;
using namespace Poco;
using namespace Poco::Util;
void MainApplication::initialize(Poco::Util::Application &self) {
logger().debug("Initializing the main application container");
Application::initialize(self);
}
void MainApplication::uninitialize() {
logger().debug("Initializing the main application container");
Application::uninitialize();
}
void MainApplication::reinitialize(Poco::Util::Application &self) {
Application::reinitialize(self);
}
void MainApplication::handleOption(const std::string &name, const std::string &value) {
if (value.length()) {
logger().fatal("Handling option with argument in %s: '%s' = [%s]", std::string(this->name()), name, value);
} else {
logger().fatal("Handling boolean option in %s: '%s'", std::string(this->name()), name);
}
if (name == OPTION_NAME_HELP) {
this->displayUsage(2);
}
try {
// Call option handler in subsystems
auto subsystems = this->subsystems();
for (auto &subsystem : subsystems) {
Subsystem *pocoSubsystem = subsystem.get();
if (string(pocoSubsystem->name()).substr(0, 9) == "Cascadium") {
auto *subsystemCommon = (SubsystemCommon *) pocoSubsystem;
subsystemCommon->handleOption(name, value);
}
}
} catch (...) {
this->displayUsage(2);
}
Application::handleOption(name, value);
}
void MainApplication::signalHandler(int signum) {
MainApplication::terminate();
}
void MainApplication::displayUsage(int exitCode) {
HelpFormatter helpFormatter(this->options());
helpFormatter.setCommand(commandName());
helpFormatter.setUsage("OPTIONS");
helpFormatter.setUnixStyle(true);
helpFormatter.setHeader("OpenMAMA caching REST API bridge application.");
helpFormatter.setWidth(80);
helpFormatter.format(cout);
exit(exitCode);
}
int MainApplication::main(const std::vector<std::string> &args) {
logger().debug("Initializing subsystems...");
waitForTerminationRequest();
logger().information("Initializing subsystems...");
return Application::EXIT_OK;
}
const char *MainApplication::name() const {
return MAIN_APPLICATION_NAME;
}
MainApplication::MainApplication() : ServerApplication::ServerApplication() {
signal(1, signalHandler);
signal(2, signalHandler);
signal(3, signalHandler);
signal(15, signalHandler);
signal(30, signalHandler);
signal(31, signalHandler);
logger().debug("Initializing subsystems...");
this->addSubsystem(new SubsystemServletRouter());
this->addSubsystem(new SubsystemOpenMama());
logger().information("All subsystems initialized ready to receive requests");
}
void MainApplication::defineOptions(Poco::Util::OptionSet &options) {
Option help(OPTION_NAME_HELP, "h", "Show usage information.");
help.required(false).repeatable(true);
options.addOption(help);
// Only add option if not already specified elsewhere
Option verbose(OPTION_NAME_INCREASE_VERBOSITY, "v", "Increase verbosity (may be passed up to 4 times.");
verbose.required(false).repeatable(true);
options.addOption(verbose);
// Only add option if not already specified elsewhere
Option quiet(OPTION_NAME_DECREASE_VERBOSITY, "q", "Decrease verbosity (may be passed up to 4 times.");
quiet.required(false).repeatable(true);
options.addOption(quiet);
Poco::Util::ServerApplication::defineOptions(options);
}