$treeview $search $mathjax $extrastylesheet
otsdaq
v2_03_00
$projectbrief
|
$projectbrief
|
$searchbox |
00001 #ifndef _ots_CoreSupervisorBase_h_ 00002 #define _ots_CoreSupervisorBase_h_ 00003 00004 #include "otsdaq-core/FiniteStateMachine/RunControlStateMachine.h" 00005 #include "otsdaq-core/SOAPUtilities/SOAPMessenger.h" 00006 #include "otsdaq-core/WorkLoopManager/WorkLoopManager.h" 00007 00008 #include "otsdaq-core/CoreSupervisors/CorePropertySupervisorBase.h" 00009 00010 #include "otsdaq-core/CgiDataUtilities/CgiDataUtilities.h" 00011 #include "otsdaq-core/SOAPUtilities/SOAPUtilities.h" 00012 #include "otsdaq-core/XmlUtilities/HttpXmlDocument.h" 00013 00014 #include "otsdaq-core/FiniteStateMachine/VStateMachine.h" 00015 00016 #include "otsdaq-core/WebUsersUtilities/RemoteWebUsers.h" 00017 00018 #pragma GCC diagnostic push 00019 #pragma GCC diagnostic ignored "-Wdeprecated-declarations" 00020 #include <xdaq/Application.h> 00021 #pragma GCC diagnostic pop 00022 #include "otsdaq-core/Macros/XDAQApplicationMacros.h" 00023 #include "xgi/Method.h" 00024 00025 #include <toolbox/fsm/FailedEvent.h> 00026 00027 #include <xdaq/NamespaceURI.h> 00028 #include <xoap/Method.h> 00029 00030 #include <map> 00031 #include <memory> 00032 #include <string> /*string and to_string*/ 00033 #include <vector> 00034 00035 namespace ots 00036 { 00037 // CoreSupervisorBase 00038 // This class should be the base class for all client otsdaq, XDAQ-based, supervisors. 00039 // That is, all supervisors that need web requests through the ots desktop 00040 // with access verified by the Gateway Supervisor, 00041 // or that need a state machines driven by the Gateway Supervisor. 00042 class CoreSupervisorBase : public xdaq::Application, 00043 public SOAPMessenger, 00044 public CorePropertySupervisorBase, 00045 public RunControlStateMachine 00046 { 00047 public: 00048 CoreSupervisorBase(xdaq::ApplicationStub* stub); 00049 virtual ~CoreSupervisorBase(void); 00050 00051 void destroy(void); 00052 00053 00054 const unsigned int getSupervisorLID(void) const { return getApplicationDescriptor()->getLocalId(); } 00055 00056 // Here are the common web request handlers: 00057 // defaultPage returns the public html page 00058 // request checks the login before proceeding to virtual request 00059 // - All Supervisors should implement request for their actions (and they will 00060 // get the security wrapper for free) 00061 // - The security setting defaults can be setup or forced by overriding 00062 // setSupervisorPropertyDefaults and forceSupervisorProperties 00063 virtual void defaultPage(xgi::Input* in, xgi::Output* out); 00064 virtual void request(const std::string& requestType, 00065 cgicc::Cgicc& cgiIn, 00066 HttpXmlDocument& xmlOut, 00067 const WebUsers::RequestUserInfo& userInfo); 00068 virtual void nonXmlRequest(const std::string& requestType, 00069 cgicc::Cgicc& cgiIn, 00070 std::ostream& out, 00071 const WebUsers::RequestUserInfo& userInfo); 00072 00073 private: 00074 xoap::MessageReference workLoopStatusRequestWrapper(xoap::MessageReference message); 00075 void defaultPageWrapper(xgi::Input* in, xgi::Output* out); 00076 void requestWrapper(xgi::Input* in, xgi::Output* out); 00077 00078 public: 00079 // State Machine request handlers 00080 void stateMachineXgiHandler(xgi::Input* in, xgi::Output* out); 00081 void stateMachineResultXgiHandler(xgi::Input* in, xgi::Output* out); 00082 xoap::MessageReference stateMachineXoapHandler(xoap::MessageReference message); 00083 xoap::MessageReference stateMachineResultXoapHandler(xoap::MessageReference message); 00084 00085 xoap::MessageReference stateMachineStateRequest(xoap::MessageReference message); 00086 xoap::MessageReference stateMachineErrorMessageRequest( 00087 xoap::MessageReference message); 00088 00089 virtual xoap::MessageReference workLoopStatusRequest(xoap::MessageReference message); 00090 00091 bool stateMachineThread(toolbox::task::WorkLoop* workLoop); 00092 00093 virtual void stateInitial(toolbox::fsm::FiniteStateMachine& fsm); 00094 virtual void statePaused(toolbox::fsm::FiniteStateMachine& fsm); 00095 virtual void stateRunning(toolbox::fsm::FiniteStateMachine& fsm); 00096 virtual void stateHalted(toolbox::fsm::FiniteStateMachine& fsm); 00097 virtual void stateConfigured(toolbox::fsm::FiniteStateMachine& fsm); 00098 virtual void inError(toolbox::fsm::FiniteStateMachine& fsm); 00099 00100 virtual void transitionConfiguring(toolbox::Event::Reference e); 00101 virtual void transitionHalting(toolbox::Event::Reference e); 00102 virtual void transitionInitializing(toolbox::Event::Reference e); 00103 virtual void transitionPausing(toolbox::Event::Reference e); 00104 virtual void transitionResuming(toolbox::Event::Reference e); 00105 virtual void transitionStarting(toolbox::Event::Reference e); 00106 virtual void transitionStopping(toolbox::Event::Reference e); 00107 virtual void enteringError(toolbox::Event::Reference e); 00108 00109 static const std::string WORK_LOOP_DONE, WORK_LOOP_WORKING; 00110 00111 protected: 00112 WorkLoopManager stateMachineWorkLoopManager_; 00113 toolbox::BSem stateMachineSemaphore_; 00114 std::vector<VStateMachine*> theStateMachineImplementation_; 00115 00116 // for managing transition iterations 00117 std::vector<bool> stateMachinesIterationDone_; 00118 unsigned int stateMachinesIterationWorkCount_; 00119 unsigned int subIterationWorkStateMachineIndex_; 00120 void preStateMachineExecution(unsigned int i); 00121 void postStateMachineExecution(unsigned int i); 00122 void preStateMachineExecutionLoop(void); 00123 void postStateMachineExecutionLoop(void); 00124 00125 RemoteWebUsers theRemoteWebUsers_; 00126 }; 00127 00128 } // namespace ots 00129 00130 #endif