From aced8ccecc91836b3b5af11499d3022004f5ba52 Mon Sep 17 00:00:00 2001
From: Marco De Marco <demarco@oats.inaf.it>
Date: Mon, 25 Nov 2013 12:03:35 +0100
Subject: [PATCH] State machine added

---
 src/MetadataExporter.cpp             | 18 ++++++++++--------
 src/MetadataExporter.h               |  2 +-
 src/MetadataExporter.xmi             | 13 +++++++++++++
 src/MetadataExporterClass.cpp        | 28 ++++++++++++++--------------
 src/MetadataExporterStateMachine.cpp | 17 +++++++++++++++--
 src/Server.h                         |  2 +-
 6 files changed, 54 insertions(+), 26 deletions(-)

diff --git a/src/MetadataExporter.cpp b/src/MetadataExporter.cpp
index b643715..c646bf8 100644
--- a/src/MetadataExporter.cpp
+++ b/src/MetadataExporter.cpp
@@ -44,7 +44,6 @@
 #include <Configuration.h>
 #include <PlainServer.h>
 #include <SSLServer.h>
-#include <bits/c++config.h> //@todo: controllare
 
 #include <boost/filesystem.hpp>
 
@@ -211,7 +210,7 @@ void MetadataExporter::get_device_property()
 	dev_prop.push_back(Tango::DbDatum("DatabasePort"));
 	dev_prop.push_back(Tango::DbDatum("DatabaseUsername"));
 	dev_prop.push_back(Tango::DbDatum("DatabasePassword"));
-    dev_prop.push_back(Tango::DbDatum("DatabaseConnectionNumber"));
+	dev_prop.push_back(Tango::DbDatum("DatabaseConnectionNumber"));
 	dev_prop.push_back(Tango::DbDatum("ExportedTables"));
 	dev_prop.push_back(Tango::DbDatum("AuthorisedUsers"));
 
@@ -593,7 +592,7 @@ void MetadataExporter::importExportedTables(std::vector<std::string>& exportedTa
     {
         std::size_t found;
 
-        if((found=exportedTables.at(i).find(' '))==std::string::npos)
+        if((found=exportedTables.at(i).find(' ')) == std::string::npos)
         {
             std::stringstream errorStream;
             errorStream << "ExportedTables property has invalid key at "
@@ -604,7 +603,8 @@ void MetadataExporter::importExportedTables(std::vector<std::string>& exportedTa
         std::string schema = exportedTables.at(i).substr(0, found);
         std::string table = exportedTables.at(i).substr(found+1, std::string::npos);
 
-        INFO_STREAM << "SCHEMA: " << schema << " TABLE: " << table << endl;
+        INFO_STREAM << "MetadataExporter::importExportedTables() schema "
+            << schema << " table " << table << endl;
 
         exportedTablesMap.insert(std::pair<const std::string, const std::string> (schema, table));
     }
@@ -623,7 +623,7 @@ void MetadataExporter::importAuthorisedUsers(std::vector<std::string>& authorise
     {
         std::size_t found;
 
-        if((found=authorisedUsers.at(i).find(' '))==std::string::npos)
+        if((found=authorisedUsers.at(i).find(' ')) == std::string::npos)
         {
             std::stringstream errorStream;
             errorStream << "AuthorisedUsers property has invalid key at "
@@ -635,10 +635,12 @@ void MetadataExporter::importAuthorisedUsers(std::vector<std::string>& authorise
         std::string password = authorisedUsers.at(i).substr(found+1, std::string::npos);
 
         #ifdef VERBOSE_DEBUG
-            INFO_STREAM << "USER: " << user << " PASSWORD: " << password << endl;
+            INFO_STREAM << "MetadataExporter::importAuthorisedUsers() user "
+                << user << " password " << password << endl;
         #endif
 
-        authorisedUsersMap.insert(std::pair<const std::string, const std::string>(user, password));
+        authorisedUsersMap.insert(std::pair<const std::string,
+            const std::string>(user, password));
     }
 }
 
@@ -659,7 +661,7 @@ void MetadataExporter::checkIfFileExists(std::string fileName)
         throw std::invalid_argument(errorStream.str());
     }
 
-    DEBUG_STREAM << "FILE: " << fileName << " -> OK" << endl;
+    INFO_STREAM << "MetadataExporter::checkIfFileExists() " << fileName << endl;
 }
 
 /*----- PROTECTED REGION END -----*/	//	MetadataExporter::namespace_ending
diff --git a/src/MetadataExporter.h b/src/MetadataExporter.h
index dc8261b..fca15b0 100644
--- a/src/MetadataExporter.h
+++ b/src/MetadataExporter.h
@@ -148,7 +148,7 @@ public:
 	MetadataExporter(Tango::DeviceClass *cl,const char *s,const char *d);
 	/**
 	 * The device object destructor.
-	 */
+	 */	
 	~MetadataExporter() {delete_device();};
 
 
diff --git a/src/MetadataExporter.xmi b/src/MetadataExporter.xmi
index 3d0350d..41c3c6b 100644
--- a/src/MetadataExporter.xmi
+++ b/src/MetadataExporter.xmi
@@ -110,6 +110,8 @@
         <type xsi:type="pogoDsl:VoidType"/>
       </argout>
       <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+      <excludedStates>ON</excludedStates>
+      <excludedStates>FAULT</excludedStates>
     </commands>
     <commands name="Off" description="Deactivate fits importer" execMethod="off" displayLevel="OPERATOR" polledPeriod="0">
       <argin description="">
@@ -119,7 +121,18 @@
         <type xsi:type="pogoDsl:VoidType"/>
       </argout>
       <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+      <excludedStates>OFF</excludedStates>
+      <excludedStates>FAULT</excludedStates>
     </commands>
+    <states name="ON" description="Metadata exporter is in ON state (ready to incoming connections)">
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </states>
+    <states name="OFF" description="Metadata exporter is in OFF state (not ready for incoming connections)">
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </states>
+    <states name="FAULT" description="Metadata exporter is in FAULT state (an error occurred)">
+      <status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+    </states>
     <preferences docHome="./doc_html" makefileHome="/usr/local/tango-8.1.2/share/pogo/preferences"/>
   </classes>
 </pogoDsl:PogoSystem>
diff --git a/src/MetadataExporterClass.cpp b/src/MetadataExporterClass.cpp
index 928a418..f633b58 100644
--- a/src/MetadataExporterClass.cpp
+++ b/src/MetadataExporterClass.cpp
@@ -131,8 +131,8 @@ MetadataExporterClass *MetadataExporterClass::init(const char *name)
 		catch (bad_alloc &)
 		{
 			throw;
-		}
-	}
+		}		
+	}		
 	return _instance;
 }
 
@@ -262,7 +262,7 @@ void MetadataExporterClass::get_class_property()
 	cl_prop.push_back(Tango::DbDatum("DHTempFile"));
 	cl_prop.push_back(Tango::DbDatum("ExportedTables"));
 	cl_prop.push_back(Tango::DbDatum("AuthorisedUsers"));
-
+	
 	//	Call database and extract values
 	if (Tango::Util::instance()->_UseDb==true)
 		get_db_class()->get_property(cl_prop);
@@ -678,7 +678,7 @@ void MetadataExporterClass::write_class_property()
 				header = "$HeadURL: ";
 				start = header.length();
 				string	strloc = src_path.substr(start, (end-start));
-
+				
 				Tango::DbDatum	svn_loc("svn_location");
 				svn_loc << strloc;
 				data.push_back(svn_loc);
@@ -687,13 +687,13 @@ void MetadataExporterClass::write_class_property()
 	}
 
 	//	Get CVS or SVN revision tag
-
+	
 	// CVS tag
 	string	tagname(TagName);
 	header = "$Name: ";
 	start = header.length();
 	string	endstr(" $");
-
+	
 	end   = tagname.find(endstr);
 	if (end!=string::npos && end>start)
 	{
@@ -702,17 +702,17 @@ void MetadataExporterClass::write_class_property()
 		cvs_tag << strtag;
 		data.push_back(cvs_tag);
 	}
-
+	
 	// SVN tag
 	string	svnpath(SvnPath);
 	header = "$HeadURL: ";
 	start = header.length();
-
+	
 	end   = svnpath.find(endstr);
 	if (end!=string::npos && end>start)
 	{
 		string	strloc = svnpath.substr(start, end-start);
-
+		
 		string tagstr ("/tags/");
 		start = strloc.find(tagstr);
 		if ( start!=string::npos )
@@ -720,7 +720,7 @@ void MetadataExporterClass::write_class_property()
 			start = start + tagstr.length();
 			end   = strloc.find(filename);
 			string	strtag = strloc.substr(start, end-start-1);
-
+			
 			Tango::DbDatum	svn_tag("svn_tag");
 			svn_tag << strtag;
 			data.push_back(svn_tag);
@@ -770,7 +770,7 @@ void MetadataExporterClass::device_factory(const Tango::DevVarStringArray *devli
 	for (unsigned long i=0 ; i<devlist_ptr->length() ; i++)
 	{
 		cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl;
-		device_list.push_back(new MetadataExporter(this, (*devlist_ptr)[i]));
+		device_list.push_back(new MetadataExporter(this, (*devlist_ptr)[i]));							 
 	}
 
 	//	Manage dynamic attributes if any
@@ -868,7 +868,7 @@ void MetadataExporterClass::command_factory()
  * method : 		MetadataExporterClass::create_static_attribute_list
  * description : 	Create the a list of static attributes
  *
- * @param	att_list	the ceated attribute list
+ * @param	att_list	the ceated attribute list 
  */
 //--------------------------------------------------------
 void MetadataExporterClass::create_static_attribute_list(vector<Tango::Attr *> &att_list)
@@ -902,10 +902,10 @@ void MetadataExporterClass::erase_dynamic_attributes(const Tango::DevVarStringAr
 	Tango::Util *tg = Tango::Util::instance();
 
 	for (unsigned long i=0 ; i<devlist_ptr->length() ; i++)
-	{
+	{	
 		Tango::DeviceImpl *dev_impl = tg->get_device_by_name(((string)(*devlist_ptr)[i]).c_str());
 		MetadataExporter *dev = static_cast<MetadataExporter *> (dev_impl);
-
+		
 		vector<Tango::Attribute *> &dev_att_list = dev->get_device_attr()->get_attribute_list();
 		vector<Tango::Attribute *>::iterator ite_att;
 		for (ite_att=dev_att_list.begin() ; ite_att != dev_att_list.end() ; ++ite_att)
diff --git a/src/MetadataExporterStateMachine.cpp b/src/MetadataExporterStateMachine.cpp
index 382f943..e611b63 100644
--- a/src/MetadataExporterStateMachine.cpp
+++ b/src/MetadataExporterStateMachine.cpp
@@ -41,6 +41,9 @@
 //================================================================
 //  States  |  Description
 //================================================================
+//  ON      |  Metadata exporter is in ON state (ready to incoming connections)
+//  OFF     |  Metadata exporter is in OFF state (not ready for incoming connections)
+//  FAULT   |  Metadata exporter is in FAULT state (an error occurred)
 
 
 namespace MetadataExporter_ns
@@ -61,10 +64,15 @@ namespace MetadataExporter_ns
 //--------------------------------------------------------
 bool MetadataExporter::is_On_allowed(TANGO_UNUSED(const CORBA::Any &any))
 {
-	//	Not any excluded states for On command.
+	//	Compare device state with not allowed states.
+	if (get_state()==Tango::ON ||
+		get_state()==Tango::FAULT)
+	{
 	/*----- PROTECTED REGION ID(MetadataExporter::OnStateAllowed) ENABLED START -----*/
 	
 	/*----- PROTECTED REGION END -----*/	//	MetadataExporter::OnStateAllowed
+		return false;
+	}
 	return true;
 }
 
@@ -76,10 +84,15 @@ bool MetadataExporter::is_On_allowed(TANGO_UNUSED(const CORBA::Any &any))
 //--------------------------------------------------------
 bool MetadataExporter::is_Off_allowed(TANGO_UNUSED(const CORBA::Any &any))
 {
-	//	Not any excluded states for Off command.
+	//	Compare device state with not allowed states.
+	if (get_state()==Tango::OFF ||
+		get_state()==Tango::FAULT)
+	{
 	/*----- PROTECTED REGION ID(MetadataExporter::OffStateAllowed) ENABLED START -----*/
 	
 	/*----- PROTECTED REGION END -----*/	//	MetadataExporter::OffStateAllowed
+		return false;
+	}
 	return true;
 }
 
diff --git a/src/Server.h b/src/Server.h
index adad47c..0c98dc4 100644
--- a/src/Server.h
+++ b/src/Server.h
@@ -81,7 +81,7 @@ protected:
     //Acceptor for incoming connection
     boost::shared_ptr<boost::asio::ip::tcp::acceptor> m_acceptor_sp;
 
-    //Handler for all threads
+    //Thread group container shared pointer
     boost::shared_ptr<boost::thread_group> m_threadGroup_sp;
 
     //Tango state property mutex
-- 
GitLab