otsdaq  v2_03_00
CoreSupervisorBase.h
1 #ifndef _ots_CoreSupervisorBase_h_
2 #define _ots_CoreSupervisorBase_h_
3 
4 #include "otsdaq-core/FiniteStateMachine/RunControlStateMachine.h"
5 #include "otsdaq-core/SOAPUtilities/SOAPMessenger.h"
6 #include "otsdaq-core/WorkLoopManager/WorkLoopManager.h"
7 
8 #include "otsdaq-core/CoreSupervisors/CorePropertySupervisorBase.h"
9 
10 #include "otsdaq-core/CgiDataUtilities/CgiDataUtilities.h"
11 #include "otsdaq-core/SOAPUtilities/SOAPUtilities.h"
12 #include "otsdaq-core/XmlUtilities/HttpXmlDocument.h"
13 
14 #include "otsdaq-core/FiniteStateMachine/VStateMachine.h"
15 
16 #include "otsdaq-core/WebUsersUtilities/RemoteWebUsers.h"
17 
18 #pragma GCC diagnostic push
19 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
20 #include <xdaq/Application.h>
21 #pragma GCC diagnostic pop
22 #include "otsdaq-core/Macros/XDAQApplicationMacros.h"
23 #include "xgi/Method.h"
24 
25 #include <toolbox/fsm/FailedEvent.h>
26 
27 #include <xdaq/NamespaceURI.h>
28 #include <xoap/Method.h>
29 
30 #include <map>
31 #include <memory>
32 #include <string> /*string and to_string*/
33 #include <vector>
34 
35 namespace ots
36 {
37 // CoreSupervisorBase
38 // This class should be the base class for all client otsdaq, XDAQ-based, supervisors.
39 // That is, all supervisors that need web requests through the ots desktop
40 // with access verified by the Gateway Supervisor,
41 // or that need a state machines driven by the Gateway Supervisor.
42 class CoreSupervisorBase : public xdaq::Application,
43  public SOAPMessenger,
46 {
47  public:
48  CoreSupervisorBase(xdaq::ApplicationStub* stub);
49  virtual ~CoreSupervisorBase(void);
50 
51  void destroy(void);
52 
53 
54  const unsigned int getSupervisorLID(void) const { return getApplicationDescriptor()->getLocalId(); }
55 
56  // Here are the common web request handlers:
57  // defaultPage returns the public html page
58  // request checks the login before proceeding to virtual request
59  // - All Supervisors should implement request for their actions (and they will
60  // get the security wrapper for free)
61  // - The security setting defaults can be setup or forced by overriding
62  // setSupervisorPropertyDefaults and forceSupervisorProperties
63  virtual void defaultPage(xgi::Input* in, xgi::Output* out);
64  virtual void request(const std::string& requestType,
65  cgicc::Cgicc& cgiIn,
66  HttpXmlDocument& xmlOut,
67  const WebUsers::RequestUserInfo& userInfo);
68  virtual void nonXmlRequest(const std::string& requestType,
69  cgicc::Cgicc& cgiIn,
70  std::ostream& out,
71  const WebUsers::RequestUserInfo& userInfo);
72 
73  private:
74  xoap::MessageReference workLoopStatusRequestWrapper(xoap::MessageReference message);
75  void defaultPageWrapper(xgi::Input* in, xgi::Output* out);
76  void requestWrapper(xgi::Input* in, xgi::Output* out);
77 
78  public:
79  // State Machine request handlers
80  void stateMachineXgiHandler(xgi::Input* in, xgi::Output* out);
81  void stateMachineResultXgiHandler(xgi::Input* in, xgi::Output* out);
82  xoap::MessageReference stateMachineXoapHandler(xoap::MessageReference message);
83  xoap::MessageReference stateMachineResultXoapHandler(xoap::MessageReference message);
84 
85  xoap::MessageReference stateMachineStateRequest(xoap::MessageReference message);
86  xoap::MessageReference stateMachineErrorMessageRequest(
87  xoap::MessageReference message);
88 
89  virtual xoap::MessageReference workLoopStatusRequest(xoap::MessageReference message);
90 
91  bool stateMachineThread(toolbox::task::WorkLoop* workLoop);
92 
93  virtual void stateInitial(toolbox::fsm::FiniteStateMachine& fsm);
94  virtual void statePaused(toolbox::fsm::FiniteStateMachine& fsm);
95  virtual void stateRunning(toolbox::fsm::FiniteStateMachine& fsm);
96  virtual void stateHalted(toolbox::fsm::FiniteStateMachine& fsm);
97  virtual void stateConfigured(toolbox::fsm::FiniteStateMachine& fsm);
98  virtual void inError(toolbox::fsm::FiniteStateMachine& fsm);
99 
100  virtual void transitionConfiguring(toolbox::Event::Reference e);
101  virtual void transitionHalting(toolbox::Event::Reference e);
102  virtual void transitionInitializing(toolbox::Event::Reference e);
103  virtual void transitionPausing(toolbox::Event::Reference e);
104  virtual void transitionResuming(toolbox::Event::Reference e);
105  virtual void transitionStarting(toolbox::Event::Reference e);
106  virtual void transitionStopping(toolbox::Event::Reference e);
107  virtual void enteringError(toolbox::Event::Reference e);
108 
109  static const std::string WORK_LOOP_DONE, WORK_LOOP_WORKING;
110 
111  protected:
112  WorkLoopManager stateMachineWorkLoopManager_;
113  toolbox::BSem stateMachineSemaphore_;
114  std::vector<VStateMachine*> theStateMachineImplementation_;
115 
116  // for managing transition iterations
117  std::vector<bool> stateMachinesIterationDone_;
118  unsigned int stateMachinesIterationWorkCount_;
119  unsigned int subIterationWorkStateMachineIndex_;
120  void preStateMachineExecution(unsigned int i);
121  void postStateMachineExecution(unsigned int i);
122  void preStateMachineExecutionLoop(void);
123  void postStateMachineExecutionLoop(void);
124 
125  RemoteWebUsers theRemoteWebUsers_;
126 };
127 
128 } // namespace ots
129 
130 #endif