1 #include "otsdaq-core/CoreSupervisors/CoreSupervisorBase.h"
15 const std::string CoreSupervisorBase::WORK_LOOP_DONE =
"Done";
16 const std::string CoreSupervisorBase::WORK_LOOP_WORKING =
"Working";
19 CoreSupervisorBase::CoreSupervisorBase(xdaq::ApplicationStub * s)
20 : xdaq::Application (s)
26 , stateMachineWorkLoopManager_ (toolbox::task::bind(this, &
CoreSupervisorBase::stateMachineThread,
"StateMachine"))
27 , stateMachineSemaphore_ (toolbox::BSem::FULL)
31 , theRemoteWebUsers_ (this)
34 INIT_MF(
"CoreSupervisorBase");
36 __SUP_COUT__ <<
"Begin!" << std::endl;
38 xgi::bind (
this, &CoreSupervisorBase::defaultPageWrapper,
"Default" );
39 xgi::bind (
this, &CoreSupervisorBase::requestWrapper,
"Request");
41 xgi::bind (
this, &CoreSupervisorBase::stateMachineXgiHandler,
"StateMachineXgiHandler");
43 xoap::bind(
this, &CoreSupervisorBase::stateMachineStateRequest,
"StateMachineStateRequest", XDAQ_NS_URI );
44 xoap::bind(
this, &CoreSupervisorBase::stateMachineErrorMessageRequest,
"StateMachineErrorMessageRequest", XDAQ_NS_URI );
46 xoap::bind(
this, &CoreSupervisorBase::workLoopStatusRequestWrapper,
"WorkLoopStatusRequest", XDAQ_NS_URI );
52 CoreSupervisorBase::~CoreSupervisorBase(
void)
58 void CoreSupervisorBase::destroy(
void)
60 __SUP_COUT__ <<
"Destroying..." << std::endl;
61 for(
auto& it: theStateMachineImplementation_)
63 theStateMachineImplementation_.clear();
68 void CoreSupervisorBase::defaultPageWrapper(xgi::Input * in, xgi::Output * out )
70 return defaultPage(in,out);
74 void CoreSupervisorBase::defaultPage(xgi::Input * in, xgi::Output * out )
76 __SUP_COUT__<<
"Supervisor class " << supervisorClass_ << std::endl;
78 std::stringstream pagess;
79 pagess <<
"/WebPath/html/" <<
80 supervisorClassNoNamespace_ <<
".html?urn=" <<
81 this->getApplicationDescriptor()->getLocalId();
83 __SUP_COUT__<<
"Default page = " << pagess.str() << std::endl;
85 *out <<
"<!DOCTYPE HTML><html lang='en'><frameset col='100%' row='100%'><frame src='" <<
87 "'></frameset></html>";
93 void CoreSupervisorBase::requestWrapper(xgi::Input * in, xgi::Output * out )
98 cgicc::Cgicc cgiIn(in);
99 std::string requestType = CgiDataUtilities::getData(cgiIn,
"RequestType");
105 CgiDataUtilities::getOrPostData(cgiIn,
"CookieCode"));
107 CorePropertySupervisorBase::getRequestUserInfo(userInfo);
109 if(!theRemoteWebUsers_.xmlRequestToGateway(
113 CorePropertySupervisorBase::allSupervisorInfo_,
121 if(!userInfo.automatedCommand_)
122 __SUP_COUT__ <<
"requestType: " << requestType << __E__;
124 if(userInfo.NonXMLRequestType_)
126 nonXmlRequest(requestType,cgiIn,*out,userInfo);
131 request(requestType,cgiIn,xmlOut,userInfo);
135 unsigned int occurance = 0;
136 std::string err = xmlOut.getMatchingValue(
"Error",occurance++);
139 __SUP_COUT_ERR__ <<
"'" << requestType <<
"' ERROR encountered: " << err << std::endl;
140 __MOUT_ERR__ <<
"'" << requestType <<
"' ERROR encountered: " << err << std::endl;
141 err = xmlOut.getMatchingValue(
"Error",occurance++);
147 xmlOut.outputXmlDocument((std::ostringstream*) out,
false ,
148 !userInfo.NoXmlWhiteSpace_);
157 void CoreSupervisorBase::request(
const std::string& requestType, cgicc::Cgicc& cgiIn,
HttpXmlDocument& xmlOut,
160 __SUP_COUT__ <<
"This is the empty Core Supervisor request. Supervisors should override this function." << __E__;
192 void CoreSupervisorBase::nonXmlRequest(
const std::string& requestType, cgicc::Cgicc& cgiIn, std::ostream& out,
195 __SUP_COUT__ <<
"This is the empty Core Supervisor non-xml request. Supervisors should override this function." << __E__;
196 out <<
"This is the empty Core Supervisor non-xml request. Supervisors should override this function." << __E__;
200 void CoreSupervisorBase::stateMachineXgiHandler(xgi::Input * in, xgi::Output * out )
205 void CoreSupervisorBase::stateMachineResultXgiHandler(xgi::Input* in, xgi::Output* out )
210 xoap::MessageReference CoreSupervisorBase::stateMachineXoapHandler(xoap::MessageReference message )
213 __SUP_COUT__<<
"Soap Handler!" << std::endl;
214 stateMachineWorkLoopManager_.removeProcessedRequests();
215 stateMachineWorkLoopManager_.processRequest(message);
216 __SUP_COUT__<<
"Done - Soap Handler!" << std::endl;
221 xoap::MessageReference CoreSupervisorBase::stateMachineResultXoapHandler(xoap::MessageReference message )
224 __SUP_COUT__<<
"Soap Handler!" << std::endl;
227 __SUP_COUT__<<
"Done - Soap Handler!" << std::endl;
233 xoap::MessageReference CoreSupervisorBase::workLoopStatusRequestWrapper(xoap::MessageReference message)
237 return workLoopStatusRequest(message);
241 xoap::MessageReference CoreSupervisorBase::workLoopStatusRequest(xoap::MessageReference message)
245 return SOAPUtilities::makeSOAPMessageReference(CoreSupervisorBase::WORK_LOOP_DONE);
249 bool CoreSupervisorBase::stateMachineThread(toolbox::task::WorkLoop* workLoop)
251 stateMachineSemaphore_.take();
252 __SUP_COUT__<<
"Re-sending message..." << SOAPUtilities::translate(stateMachineWorkLoopManager_.getMessage(workLoop)).getCommand() << std::endl;
253 std::string reply = send(this->getApplicationDescriptor(),stateMachineWorkLoopManager_.getMessage(workLoop));
254 stateMachineWorkLoopManager_.report(workLoop, reply, 100,
true);
255 __SUP_COUT__<<
"Done with message" << std::endl;
256 stateMachineSemaphore_.give();
262 xoap::MessageReference CoreSupervisorBase::stateMachineStateRequest(xoap::MessageReference message)
265 __SUP_COUT__<<
"theStateMachine_.getCurrentStateName() = " << theStateMachine_.getCurrentStateName() << std::endl;
266 return SOAPUtilities::makeSOAPMessageReference(theStateMachine_.getCurrentStateName());
270 xoap::MessageReference CoreSupervisorBase::stateMachineErrorMessageRequest(xoap::MessageReference message)
273 __SUP_COUT__<<
"theStateMachine_.getErrorMessage() = " << theStateMachine_.getErrorMessage() << std::endl;
276 retParameters.addParameter(
"ErrorMessage",theStateMachine_.getErrorMessage());
277 return SOAPUtilities::makeSOAPMessageReference(
"stateMachineErrorMessageRequestReply",retParameters);
281 void CoreSupervisorBase::stateInitial(toolbox::fsm::FiniteStateMachine& fsm)
284 __SUP_COUT__ <<
"CoreSupervisorBase::stateInitial" << std::endl;
288 void CoreSupervisorBase::stateHalted(toolbox::fsm::FiniteStateMachine& fsm)
291 __SUP_COUT__ <<
"CoreSupervisorBase::stateHalted" << std::endl;
295 void CoreSupervisorBase::stateRunning(toolbox::fsm::FiniteStateMachine& fsm)
298 __SUP_COUT__ <<
"CoreSupervisorBase::stateRunning" << std::endl;
302 void CoreSupervisorBase::stateConfigured(toolbox::fsm::FiniteStateMachine& fsm)
305 __SUP_COUT__ <<
"CoreSupervisorBase::stateConfigured" << std::endl;
309 void CoreSupervisorBase::statePaused(toolbox::fsm::FiniteStateMachine& fsm)
312 __SUP_COUT__ <<
"CoreSupervisorBase::statePaused" << std::endl;
316 void CoreSupervisorBase::inError (toolbox::fsm::FiniteStateMachine & fsm)
319 __SUP_COUT__<<
"Fsm current state: " << theStateMachine_.getCurrentStateName()<< std::endl;
324 void CoreSupervisorBase::enteringError (toolbox::Event::Reference e)
327 __SUP_COUT__<<
"Fsm current state: " << theStateMachine_.getCurrentStateName()
328 <<
"\n\nError Message: " <<
329 theStateMachine_.getErrorMessage() << std::endl;
330 toolbox::fsm::FailedEvent& failedEvent =
dynamic_cast<toolbox::fsm::FailedEvent&
>(*e);
331 std::ostringstream error;
332 error <<
"Failure performing transition from "
333 << failedEvent.getFromState()
335 << failedEvent.getToState()
336 <<
" exception: " << failedEvent.getException().what();
337 __SUP_COUT_ERR__<< error.str() << std::endl;
343 void CoreSupervisorBase::transitionConfiguring(toolbox::Event::Reference e)
346 __SUP_COUT__ <<
"transitionConfiguring" << std::endl;
349 SOAPUtilities::translate(theStateMachine_.getCurrentMessage()).
350 getParameters().getValue(
"ConfigurationGroupName"),
352 getParameters().getValue(
"ConfigurationGroupKey")));
354 __SUP_COUT__ <<
"Configuration group name: " << theGroup.first <<
" key: " <<
355 theGroup.second << std::endl;
357 theConfigurationManager_->loadConfigurationGroup(
359 theGroup.second,
true);
365 for(
auto& it: theStateMachineImplementation_)
368 catch(
const std::runtime_error& e)
370 __SUP_SS__ <<
"Error was caught while configuring: " << e.what() << std::endl;
371 __SUP_COUT_ERR__ <<
"\n" << ss.str();
372 theStateMachine_.setErrorMessage(ss.str());
373 throw toolbox::fsm::exception::Exception(
376 "CoreSupervisorBase::transitionConfiguring" ,
387 void CoreSupervisorBase::transitionHalting(toolbox::Event::Reference e)
390 __SUP_COUT__ <<
"transitionHalting" << std::endl;
392 for(
auto& it: theStateMachineImplementation_)
398 catch(
const std::runtime_error& e)
401 if(theStateMachine_.getProvenanceStateName() ==
402 RunControlStateMachine::FAILED_STATE_NAME)
404 __SUP_COUT_INFO__ <<
"Error was caught while halting (but ignoring because previous state was '" <<
405 RunControlStateMachine::FAILED_STATE_NAME <<
"'): " << e.what() << std::endl;
409 __SUP_SS__ <<
"Error was caught while halting: " << e.what() << std::endl;
410 __SUP_COUT_ERR__ <<
"\n" << ss.str();
411 theStateMachine_.setErrorMessage(ss.str());
412 throw toolbox::fsm::exception::Exception(
415 "CoreSupervisorBase::transitionHalting" ,
427 void CoreSupervisorBase::transitionInitializing(toolbox::Event::Reference e)
430 __SUP_COUT__ <<
"transitionInitializing" << std::endl;
432 CorePropertySupervisorBase::resetPropertiesAreSetup();
442 void CoreSupervisorBase::transitionPausing(toolbox::Event::Reference e)
445 __SUP_COUT__ <<
"transitionPausing" << std::endl;
449 for(
auto& it: theStateMachineImplementation_)
452 catch(
const std::runtime_error& e)
454 __SUP_SS__ <<
"Error was caught while pausing: " << e.what() << std::endl;
455 __SUP_COUT_ERR__ <<
"\n" << ss.str();
456 theStateMachine_.setErrorMessage(ss.str());
457 throw toolbox::fsm::exception::Exception(
460 "CoreSupervisorBase::transitionPausing" ,
468 void CoreSupervisorBase::transitionResuming(toolbox::Event::Reference e)
474 __SUP_COUT__ <<
"transitionResuming" << std::endl;
478 for(
auto& it: theStateMachineImplementation_)
481 catch(
const std::runtime_error& e)
483 __SUP_SS__ <<
"Error was caught while resuming: " << e.what() << std::endl;
484 __SUP_COUT_ERR__ <<
"\n" << ss.str();
485 theStateMachine_.setErrorMessage(ss.str());
486 throw toolbox::fsm::exception::Exception(
489 "CoreSupervisorBase::transitionResuming" ,
497 void CoreSupervisorBase::transitionStarting(toolbox::Event::Reference e)
503 __SUP_COUT__ <<
"transitionStarting" << std::endl;
507 for(
auto& it: theStateMachineImplementation_)
508 it->start(SOAPUtilities::translate(theStateMachine_.getCurrentMessage()).getParameters().getValue(
"RunNumber"));
510 catch(
const std::runtime_error& e)
512 __SUP_SS__ <<
"Error was caught while starting: " << e.what() << std::endl;
513 __SUP_COUT_ERR__ <<
"\n" << ss.str();
514 theStateMachine_.setErrorMessage(ss.str());
515 throw toolbox::fsm::exception::Exception(
518 "CoreSupervisorBase::transitionStarting" ,
526 void CoreSupervisorBase::transitionStopping(toolbox::Event::Reference e)
529 __SUP_COUT__ <<
"transitionStopping" << std::endl;
533 for(
auto& it: theStateMachineImplementation_)
536 catch(
const std::runtime_error& e)
538 __SUP_SS__ <<
"Error was caught while pausing: " << e.what() << std::endl;
539 __SUP_COUT_ERR__ <<
"\n" << ss.str();
540 theStateMachine_.setErrorMessage(ss.str());
541 throw toolbox::fsm::exception::Exception(
544 "CoreSupervisorBase::transitionStopping" ,