Commit 2c0ab179 authored by Thomas Markwalder's avatar Thomas Markwalder
Browse files

[3401] Addressed reveiw comments

Static handlers were removed from DControllerBase.
Developer's guide has been updated to with --with-kea-config
discussion and updated diagrams.
Other minor corrections.

(Note ingore diffs in the diagram .svg files, they aren't particularly
meaningful to the human eye).
parent 8daa5237
......@@ -52,39 +52,45 @@ base are shown in the following class diagram:
- isc::d2::DControllerBase - provides all of the services necessary to manage
an application process class derived from isc::d2::DProcess. These services include:
- Command line argument handling
- Process instantiation and initialization
- Process instantiation and initialization0
- Support for stand-alone execution
- Support for integrated operation as a BIND10 module (session management
- Support for integrated operation as a BUNDY module (session management
and event handling)
- Process event loop invocation and shutdown
.
It creates and manages an instance of isc::d2::DProcessBase. The CPL is designed
for asynchronous event processing applications. It is constructed to use ASIO
library for IO processing. DControllerBase own an isc::asiolink::io_service instance and it pas ses this into the @c DProcessBase constructor and it is this
service that is used drivel the process's event loop.
@c DControllerBase also provides the ability to operate one of two modes:
"stand-alone" mode or "managed" mode. In stand-alone mode, the controller has
no IO of it's own, thus there is two-way control communication between the application and the outside world.
In "managed mode" the controller creates a BIND10 Session, allowing it to
participate as a BIND10 module and therefore receive control commands such as
configuration updates, status requests, and shutdown. BIND10 modules are
required to supply two callbacks: one for configuration events and one for
command events. @c DControllerBase supplies these callbacks which largely
pass the information through to its @c DProcessBase instance. The key aspect
to take from this is that the controller handles the interface for receiving
asynchronous commands and the invokes the appropriate services in the process's
interface.
@todo DControllerBase does yet support reading the configuration from a
command line argument. It's command line argument processing can be very easily
extended to do so.
@todo At the time of this writing Kea is being separated from the BIND10
framework. As such, use of the BIND10 Session will be removed but could
readily be replaced with an authenticated socket connection for receiving and
responding to directives asynchronously.
It creates and manages an instance of isc::d2::DProcessBase. The CPL is
designed for asynchronous event processing applications. It is constructed
to use ASIO library for IO processing. DControllerBase owns an
isc::asiolink::io_service instance and it passes this into the @c
DProcessBase constructor. It is this io_service that is used drive the
process's event loop. The controller is designed to provide any interfaces
between the process it controls and the outside world.
@c DControllerBase provides configuration for its process via a JSON file
specified as a mandatory command line argument. The file structure is
expected be as follows:
{ "<module-name>": {<module-config>} }
where:
module-name : is a label which uniquely identifies the
configuration data for the (i.e. the controlled process.)
It is the value returned by @ref
isc::d2::DControllerBase::getAppName()
module-config: a set of zero or more JSON elements which comprise
application's configuration values. Element syntax is governed
by those elements supported in isc::cc.
The file may contain an arbitrary number of other modules.
@todo DControllerBase will soon support dynamic reloading of the
configuration file upon receipt of the SIGHUP signal, and graceful
shutdown upon receipt of either SIGTERM or SIGINT.
@todo Eventually, some sort of secure socket interface which supports remote
control operations such as configuration changes or status reporting will
likely be implemented.
- isc::d2::DProcessBase - defines an asynchronous-event processor (i.e.
application) which provides a uniform interface to:
......@@ -105,10 +111,10 @@ information or "context". It provides a single enclosure for the storage of
configuration parameters or any other information that needs to accessible
within a given context.
The following sequence diagram shows how a configuration update, received
asynchronously through the session command channel, moves through the CPL:
The following sequence diagram shows how a configuration from file moves
through the CPL layer:
@image html config_sequence.svg "CPL Configuration Update Sequence"
@image html config_from_file_sequence.svg "CPL Configuration From File Sequence"
The CPL classes will likely move into a common library.
......@@ -122,6 +128,30 @@ in the diagram below:
- isc::d2::D2Controller - entry point for running D2, it processes command line
options, starts and controls the application process, @c D2Process.
Currently there are two implementations of D2Controller selected through the
configuration script switch, "--with-kea-config":
1. --with-kea-config=JSON - The implementation is contained in isc/d2/d2_controller.*. This form allows D2 to run as a stand-alone process configured via JSON
text file specified as a command line argument. The file content is described
in isc/d2/dhcp-ddns.spec, unit tests are in
isc/d2/tests/bundy_d2_controller_unittests.cc. As of Kea 0.9, this form will
be the default form.
2. --with-kea-config=BUNDY - The implementation is containd in
isc/d2/bundy_d2_controller.*, unit tests are in isc/d2/tests/d2_controller_unittests.cc and d_controller_unittests.cc This form allows D2 to run as a a Bundy
module. It creates a BUNDY Session, allowing it to receive control commands
such as configuration updates, status requests, and shutdown. BUNDY modules
are required to supply two callbacks: one for configuration events and one for
command events. This form of D2Controller supplies these callbacks which
largely pass the information through to its @c D2Process instance. If the
controller cannot establish a BUNDY session it will exit with a fatal error.
The configuration switch deteremines which of two forms and tests are compiled
and they are mutually exclusive.
@note The inclusion of the BUNDY form should be considered temporary. Long range
planning should be based on the JSON form.
- isc::d2::D2Process - creates and manages D2's primary resources and implements
the main event loop described in @ref d2EventLoop.
......
......@@ -31,9 +31,7 @@ const char* D2Controller::d2_bin_name_ = "b10-dhcp-ddns";
DControllerBasePtr&
D2Controller::instance() {
// If the instance hasn't been created yet, create it. Note this method
// must use the base class singleton instance methods. The base class
// must have access to the singleton in order to use it within BIND10
// static function callbacks.
// must use the base class singleton instance methods.
if (!getController()) {
DControllerBasePtr controller_ptr(new D2Controller());
setController(controller_ptr);
......
......@@ -156,28 +156,6 @@ DControllerBase::parseArgs(int argc, char* argv[])
}
}
isc::data::ConstElementPtr
DControllerBase::configHandler(isc::data::ConstElementPtr new_config) {
LOG_DEBUG(dctl_logger, DBGLVL_COMMAND, DCTL_CONFIG_UPDATE)
.arg(controller_->getAppName()).arg(new_config->str());
// Invoke the instance method on the controller singleton.
return (controller_->updateConfig(new_config));
}
// Static callback which invokes non-static handler on singleton
isc::data::ConstElementPtr
DControllerBase::commandHandler(const std::string& command,
isc::data::ConstElementPtr args) {
LOG_DEBUG(dctl_logger, DBGLVL_COMMAND, DCTL_COMMAND_RECEIVED)
.arg(controller_->getAppName()).arg(command)
.arg(args ? args->str() : "(no args)");
// Invoke the instance method on the controller singleton.
return (controller_->executeCommand(command, args));
}
bool
DControllerBase::customOption(int /* option */, char* /*optarg*/)
{
......@@ -212,7 +190,7 @@ DControllerBase::configFromFile() {
isc::data::ConstElementPtr module_config;
try {
std::string config_file = getConfigFileName();
std::string config_file = getConfigFile();
if (config_file.empty()) {
// Basic sanity check: file name must not be empty.
isc_throw(BadValue, "JSON configuration file not specified. Please "
......@@ -328,11 +306,6 @@ DControllerBase::usage(const std::string & text)
DControllerBase::~DControllerBase() {
}
std::string
DControllerBase::getConfigFileName() {
return (Daemon::getConfigFile());
}
}; // namespace isc::d2
// Provide an implementation until we figure out a better way to do this.
......
......@@ -30,10 +30,6 @@
namespace isc {
namespace d2 {
/// @brief DControllerBase launch exit status values. Upon service shutdown
/// normal or otherwise, the Controller's launch method will return one of
/// these values.
/// @brief Exception thrown when the command line is invalid.
class InvalidUsage : public isc::Exception {
public:
......@@ -206,44 +202,17 @@ public:
isc::data::
ConstElementPtr args);
/// @brief A callback for handling all incoming configuration updates.
///
/// Provides a static callback that can be used to handle asynchronsouly
/// received configurations. It acts as a wrapper around the singleton's
/// virtual instance method, updateConfig.
///
/// @param new_config textual representation of the new configuration
///
/// @return status of the config update
static isc::data::ConstElementPtr configHandler(isc::data::ConstElementPtr
new_config);
/// @brief A callback for handling all incoming commands.
///
/// Provides a static callback that can be used to handle asynchronsouly
/// received commands. It acts as a wrapper around the singleton's virtual
/// instance method, executeCommand.
///
/// @param command textual representation of the command
/// @param args parameters of the command. It can be NULL pointer if no
/// arguments exist for a particular command.
///
/// @return status of the processed command
static isc::data::ConstElementPtr commandHandler(const std::string& command,
isc::data::ConstElementPtr
args);
/// @brief Fetches the name of the application under control.
///
/// @return returns the controller service name string
const std::string getAppName() const {
std::string getAppName() const {
return (app_name_);
}
/// @brief Fetches the name of the application executable.
///
/// @return returns the controller logger name string
const std::string getBinName() const {
std::string getBinName() const {
return (bin_name_);
}
......@@ -414,11 +383,6 @@ protected:
/// non-zero means failure), and a string explanation of the outcome.
isc::data::ConstElementPtr shutdownProcess(isc::data::ConstElementPtr args);
/// @brief Fetches the name of the configuration file
///
/// @return the configuration file name as a string
virtual std::string getConfigFileName();
/// @brief Fetches the current process
///
/// @return the a pointer to the current process instance.
......
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Bouml (http://bouml.free.fr/) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="749" height="595" version="1.1" xmlns="http://www.w3.org/2000/svg">
<g>
<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="733" y="357" width="3" height="225" />
<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="627" y="579" width="109" height="3" />
<rect fill="#ffffc0" stroke="black" stroke-width="1" stroke-opacity="1" x="623" y="353" width="110" height="226" />
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" font-weight="bold" font-style="italic" text-anchor="middle" x="678" y="366">DCfgContextBase</text>
<line stroke="black" stroke-opacity="1" x1="623" y1="368" x2="733" y2="368" />
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" text-decoration="underline" x="627" y="381">OPTIONAL</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" text-decoration="underline" x="627" y="394">REQUIRED</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="627" y="407">boolean_values_</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="627" y="420">uint32_values_</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="627" y="433">string_values_</text>
<line stroke="black" stroke-opacity="1" x1="623" y1="435" x2="733" y2="435" />
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="627" y="448">DCfgContextBase()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="627" y="461">~DCfgContextBase()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="627" y="474">getParam()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="627" y="487">getParam()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="627" y="500">getParam()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="627" y="513">getBooleanStorage()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="627" y="526">getUint32Storage()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="627" y="539">getStringStorage()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" font-style="italic" x="627" y="552">clone()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="627" y="565">DCfgContextBase()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="627" y="578">operator =()</text>
</g>
<g>
<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="179" y="15" width="3" height="511" />
<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="35" y="523" width="147" height="3" />
<rect fill="#ffffc0" stroke="black" stroke-width="1" stroke-opacity="1" x="31" y="11" width="148" height="512" />
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" font-weight="bold" font-style="italic" text-anchor="middle" x="105" y="24">DControllerBase</text>
<line stroke="black" stroke-opacity="1" x1="31" y1="26" x2="179" y2="26" />
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="35" y="39">app_name_</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="35" y="52">bin_name_</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="35" y="65">stand_alone_</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="35" y="78">verbose_</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="35" y="91">spec_file_name_</text>
<line stroke="black" stroke-opacity="1" x1="31" y1="93" x2="179" y2="93" />
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="35" y="106">DControllerBase()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="35" y="119">~DControllerBase()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="35" y="132">launch()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" text-decoration="underline" x="35" y="145">dummyConfigHandler()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" text-decoration="underline" x="35" y="158">configHandler()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" text-decoration="underline" x="35" y="171">commandHandler()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="35" y="184">updateConfig()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="35" y="197">executeCommand()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="35" y="210">customOption()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" font-style="italic" x="35" y="223">createProcess()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="35" y="236">customControllerCommand()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="35" y="249">onSessionConnect()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="35" y="262">onSessionDisconnect()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="35" y="275">getUsageText()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="35" y="288">getCustomOpts()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="35" y="301">getAppName()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="35" y="314">getBinName()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="35" y="327">isStandAlone()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="35" y="340">setStandAlone()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="35" y="353">isVerbose()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="35" y="366">setVerbose()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="35" y="379">getIOService()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="35" y="392">getSpecFileName()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="35" y="405">setSpecFileName()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" text-decoration="underline" x="35" y="418">getController()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" text-decoration="underline" x="35" y="431">setController()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="35" y="444">parseArgs()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="35" y="457">initProcess()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="35" y="470">establishSession()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="35" y="483">runProcess()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="35" y="496">disconnectSession()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="35" y="509">shutdown()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="35" y="522">usage()</text>
</g>
<g>
<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="420" y="119" width="3" height="213" />
<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="324" y="329" width="99" height="3" />
<rect fill="#ffffc0" stroke="black" stroke-width="1" stroke-opacity="1" x="320" y="115" width="100" height="214" />
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" font-weight="bold" font-style="italic" text-anchor="middle" x="370" y="128">DProcessBase</text>
<line stroke="black" stroke-opacity="1" x1="320" y1="130" x2="420" y2="130" />
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="324" y="143">app_name_</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="324" y="156">shut_down_flag_</text>
<line stroke="black" stroke-opacity="1" x1="320" y1="158" x2="420" y2="158" />
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="324" y="171">DProcessBase()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" font-style="italic" x="324" y="184">init()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" font-style="italic" x="324" y="197">run()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" font-style="italic" x="324" y="210">shutdown()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" font-style="italic" x="324" y="223">configure()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" font-style="italic" x="324" y="236">command()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="324" y="249">~DProcessBase()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="324" y="262">shouldShutdown()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="324" y="275">setShutdownFlag()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="324" y="288">getAppName()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="324" y="301">getIoService()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="324" y="314">stopIOService()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="324" y="327">getCfgMgr()</text>
</g>
<g>
<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="585" y="240" width="3" height="127" />
<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="479" y="364" width="109" height="3" />
<rect fill="#ffffc0" stroke="black" stroke-width="1" stroke-opacity="1" x="475" y="236" width="110" height="128" />
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" font-weight="bold" font-style="italic" text-anchor="middle" x="530" y="249">DCfgMgrBase</text>
<line stroke="black" stroke-opacity="1" x1="475" y1="251" x2="585" y2="251" />
<line stroke="black" stroke-opacity="1" x1="475" y1="259" x2="585" y2="259" />
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="479" y="272">DCfgMgrBase()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="479" y="285">~DCfgMgrBase()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="479" y="298">parseConfig()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="479" y="311">addToParseOrder()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="479" y="324">getParseOrder()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="479" y="337">getContext()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" font-style="italic" x="479" y="350">createConfigParser()</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="479" y="363">buildAndCommit()</text>
</g>
<g>
<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="419" y="56" width="3" height="45" />
<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="323" y="98" width="99" height="3" />
<rect fill="#ffffc0" stroke="black" stroke-width="1" stroke-opacity="1" x="319" y="52" width="100" height="46" />
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" text-anchor="middle" x="369" y="65">&lt;&lt;typedef&gt;&gt;</text>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" font-weight="bold" text-anchor="middle" x="369" y="80">DProcessBasePtr</text>
<line stroke="black" stroke-opacity="1" x1="319" y1="82" x2="419" y2="82" />
<line stroke="black" stroke-opacity="1" x1="319" y1="90" x2="419" y2="90" />
<svg width="770" height="641" version="1.1" xmlns="http://www.w3.org/2000/svg">
<g>
<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="588" y="279" width="3" height="193" />
<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="474" y="469" width="117" height="3" />
<rect fill="#ffffc0" stroke="black" stroke-width="1" stroke-opacity="1" x="470" y="275" width="118" height="194" />
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" font-weight="bold" font-style="italic" text-anchor="middle" x="529" y="289">DCfgMgrBase</text>
<line stroke="black" stroke-opacity="1" x1="470" y1="291" x2="588" y2="291" />
<line stroke="black" stroke-opacity="1" x1="470" y1="299" x2="588" y2="299" />
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="474" y="313">DCfgMgrBase()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="474" y="327">~DCfgMgrBase()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="474" y="341">parseConfig()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="474" y="355">addToParseOrder()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="474" y="369">getParseOrder()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="474" y="383">getContext()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="474" y="397">buildParams()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" font-style="italic" x="474" y="411">createConfigParser()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" font-style="italic" x="474" y="425">createNewContext()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="474" y="439">resetContext()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="474" y="453">setContext()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="474" y="467">buildAndCommit()</text>
</g>
<g>
<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="754" y="385" width="3" height="243" />
<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="640" y="625" width="117" height="3" />
<rect fill="#ffffc0" stroke="black" stroke-width="1" stroke-opacity="1" x="636" y="381" width="118" height="244" />
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" font-weight="bold" font-style="italic" text-anchor="middle" x="695" y="395">DCfgContextBase</text>
<line stroke="black" stroke-opacity="1" x1="636" y1="397" x2="754" y2="397" />
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" text-decoration="underline" x="640" y="411">OPTIONAL</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" text-decoration="underline" x="640" y="425">REQUIRED</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="640" y="439">boolean_values_</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="640" y="453">uint32_values_</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="640" y="467">string_values_</text>
<line stroke="black" stroke-opacity="1" x1="636" y1="469" x2="754" y2="469" />
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="640" y="483">DCfgContextBase()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="640" y="497">~DCfgContextBase()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="640" y="511">getParam()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="640" y="525">getParam()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="640" y="539">getParam()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="640" y="553">getBooleanStorage()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="640" y="567">getUint32Storage()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="640" y="581">getStringStorage()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" font-style="italic" x="640" y="595">clone()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="640" y="609">DCfgContextBase()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="640" y="623">operator =()</text>
</g>
<g>
<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="175" y="14" width="3" height="453" />
<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="17" y="464" width="161" height="3" />
<rect fill="#ffffc0" stroke="black" stroke-width="1" stroke-opacity="1" x="13" y="10" width="162" height="454" />
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" font-weight="bold" font-style="italic" text-anchor="middle" x="94" y="24">DControllerBase</text>
<line stroke="black" stroke-opacity="1" x1="13" y1="26" x2="175" y2="26" />
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="17" y="40">app_name_</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="17" y="54">bin_name_</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="17" y="68">verbose_</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="17" y="82">spec_file_name_</text>
<line stroke="black" stroke-opacity="1" x1="13" y1="84" x2="175" y2="84" />
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="17" y="98">DControllerBase()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="17" y="112">~DControllerBase()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="17" y="126">launch()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="17" y="140">updateConfig()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="17" y="154">configFromFile()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="17" y="168">executeCommand()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="17" y="182">getAppName()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="17" y="196">getBinName()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="17" y="210">customOption()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" font-style="italic" x="17" y="224">createProcess()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="17" y="238">customControllerCommand()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="17" y="252">getUsageText()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="17" y="266">getCustomOpts()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="17" y="280">isVerbose()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="17" y="294">setVerbose()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="17" y="308">getIOService()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="17" y="322">getSpecFileName()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="17" y="336">setSpecFileName()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" text-decoration="underline" x="17" y="350">getController()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" text-decoration="underline" x="17" y="364">setController()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="17" y="378">parseArgs()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="17" y="392">initProcess()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="17" y="406">runProcess()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="17" y="420">shutdownProcess()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="17" y="434">getConfigFileName()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="17" y="448">getProcess()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="17" y="462">usage()</text>
</g>
<g>
<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="274" y="165" width="3" height="47" />
<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="198" y="209" width="79" height="3" />
<rect fill="#ffffc0" stroke="black" stroke-width="1" stroke-opacity="1" x="194" y="161" width="80" height="48" />
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" text-anchor="middle" x="234" y="175">&lt;&lt;typedef&gt;&gt;</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" font-weight="bold" text-anchor="middle" x="234" y="191">IOServicePtr</text>
<line stroke="black" stroke-opacity="1" x1="194" y1="193" x2="274" y2="193" />
<line stroke="black" stroke-opacity="1" x1="194" y1="201" x2="274" y2="201" />
</g>
<g>
<line stroke="black" stroke-opacity="1" x1="179" y1="118" x2="236" y2="118" />
<polygon fill="#000000" stroke="black" stroke-opacity="1" points="179,118 185,112 191,118 185,124" />
</g>
<g>
<line stroke="black" stroke-opacity="1" x1="236" y1="160" x2="242" y2="154" />
<line stroke="black" stroke-opacity="1" x1="236" y1="160" x2="230" y2="154" />
<line stroke="black" stroke-opacity="1" x1="236" y1="118" x2="236" y2="160" />
</g>
<g>
<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="426" y="148" width="3" height="229" />
<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="322" y="374" width="107" height="3" />
<rect fill="#ffffc0" stroke="black" stroke-width="1" stroke-opacity="1" x="318" y="144" width="108" height="230" />
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" font-weight="bold" font-style="italic" text-anchor="middle" x="372" y="158">DProcessBase</text>
<line stroke="black" stroke-opacity="1" x1="318" y1="160" x2="426" y2="160" />
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="322" y="174">app_name_</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="322" y="188">shut_down_flag_</text>
<line stroke="black" stroke-opacity="1" x1="318" y1="190" x2="426" y2="190" />
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="322" y="204">DProcessBase()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" font-style="italic" x="322" y="218">init()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" font-style="italic" x="322" y="232">run()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" font-style="italic" x="322" y="246">shutdown()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" font-style="italic" x="322" y="260">configure()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" font-style="italic" x="322" y="274">command()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="322" y="288">~DProcessBase()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="322" y="302">shouldShutdown()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="322" y="316">setShutdownFlag()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="322" y="330">getAppName()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="322" y="344">getIoService()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="322" y="358">stopIOService()</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="322" y="372">getCfgMgr()</text>
</g>
<g>
<line stroke="black" stroke-opacity="1" x1="371" y1="114" x2="377" y2="108" />
<line stroke="black" stroke-opacity="1" x1="371" y1="114" x2="365" y2="108" />
<line stroke-dasharray="4,4" stroke="black" stroke-opacity="1" x1="371" y1="102" x2="371" y2="114" />
<line stroke="black" stroke-opacity="1" x1="317" y1="260" x2="236" y2="260" />
<polygon fill="#000000" stroke="black" stroke-opacity="1" points="317,260 311,266 305,260 311,254" />
</g>
<g>
<line stroke="black" stroke-opacity="1" x1="183" y1="34" x2="371" y2="34" />
<polygon fill="#000000" stroke="black" stroke-opacity="1" points="183,34 189,28 195,34 189,40" />
<line stroke="black" stroke-opacity="1" x1="236" y1="213" x2="230" y2="219" />
<line stroke="black" stroke-opacity="1" x1="236" y1="213" x2="242" y2="219" />
<line stroke="black" stroke-opacity="1" x1="236" y1="260" x2="236" y2="213" />
</g>
<g>
<line stroke="black" stroke-opacity="1" x1="371" y1="51" x2="377" y2="45" />
<line stroke="black" stroke-opacity="1" x1="371" y1="51" x2="365" y2="45" />
<line stroke="black" stroke-opacity="1" x1="371" y1="34" x2="371" y2="51" />
<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="424" y="72" width="3" height="47" />
<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="320" y="116" width="107" height="3" />
<rect fill="#ffffc0" stroke="black" stroke-width="1" stroke-opacity="1" x="316" y="68" width="108" height="48" />
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" text-anchor="middle" x="370" y="82">&lt;&lt;typedef&gt;&gt;</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" font-weight="bold" text-anchor="middle" x="370" y="98">DProcessBasePtr</text>
<line stroke="black" stroke-opacity="1" x1="316" y1="100" x2="424" y2="100" />
<line stroke="black" stroke-opacity="1" x1="316" y1="108" x2="424" y2="108" />
</g>
<g>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="685" y="273">context_</text>
<line stroke="black" stroke-opacity="1" x1="372" y1="143" x2="378" y2="137" />
<line stroke="black" stroke-opacity="1" x1="372" y1="143" x2="366" y2="137" />
<line stroke-dasharray="4,4" stroke="black" stroke-opacity="1" x1="372" y1="120" x2="372" y2="143" />
</g>
<g>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="381" y="48">process_</text>
<line stroke="black" stroke-opacity="1" x1="372" y1="67" x2="378" y2="61" />
<line stroke="black" stroke-opacity="1" x1="372" y1="67" x2="366" y2="61" />
<line stroke="black" stroke-opacity="1" x1="372" y1="39" x2="372" y2="67" />
</g>
<g>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="251" y="174">io_service_</text>
<line stroke="black" stroke-opacity="1" x1="179" y1="39" x2="372" y2="39" />
<polygon fill="#000000" stroke="black" stroke-opacity="1" points="179,39 185,33 191,39 185,45" />
</g>
<g>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="535" y="155">cfg_mgr_</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="382" y="63">process_</text>
</g>
<g>
<text font-family="Helvetica" font-size="11" fill="#000000" xml:space="preserve" x="250" y="244">io_service_</text>
<text font-family="Helvetica" font-size="12" fill="#000000" xml:space="preserve" x="534" y="196">cfg_mgr_</text>
</g>
<g>
<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="275" y="182" width="3" height="45" />
<rect fill="#cbcbcb" stroke="none" stroke-opacity="1" x="205" y="224" width="73" height="3" />
<rect fill="#ffffc0" stroke="black" stroke-width="1" stroke-opacity="1" x="201" y="178" width="74" height="46" />