PageRenderTime 57ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/core/Modules/SiSPS/Parsers/FrontlineSMSParser.php

https://github.com/rkabir/Swiftriver
PHP | 306 lines | 200 code | 57 blank | 49 comment | 15 complexity | fed87af9c39e46969e7475c079682cc6 MD5 | raw file
  1. <?php
  2. namespace Swiftriver\Core\Modules\SiSPS\Parsers;
  3. class FrontlineSMSParser implements IParser {
  4. /**
  5. * Implementation of IParser::GetAndParse
  6. * @param \Swiftriver\Core\ObjectModel\Channel $channel
  7. * @return Swiftriver\Core\ObjectModel\Content[] contentItems
  8. */
  9. public function GetAndParse($channel) {
  10. $logger = \Swiftriver\Core\Setup::GetLogger();
  11. $logger->log("Core::Modules::SiSPS::Parsers::FrontlineSMSParser::GetAndParse [Method invoked]", \PEAR_LOG_DEBUG);
  12. $logger->log("Core::Modules::SiSPS::Parsers::FrontlineSMSParser::GetAndParse [END: Extracting required parameters]", \PEAR_LOG_DEBUG);
  13. //Create the Content array
  14. $contentItems = array();
  15. switch($channel->subType) {
  16. case "Remote":
  17. $logger->log("Core::Modules::SiSPS::Parsers::FrontlineSMSParser::GetAndParse [START: Parsing SMS items from Remote API]", \PEAR_LOG_DEBUG);
  18. $logger->log("Core::Modules::SiSPS::Parsers::FrontlineSMSParser::GetAndParse [START: Extracting required parameters]", \PEAR_LOG_DEBUG);
  19. //Extract the Server URL
  20. $serverURL = $channel->parameters["ServerURL"];
  21. if(!isset($serverURL)) {
  22. $logger->log("Core::Modules::SiSPS::Parsers::FrontlineSMSParser::GetAndParse [the parameter 'ServerURL' was not supplied. Returning null]", \PEAR_LOG_DEBUG);
  23. $logger->log("Core::Modules::SiSPS::Parsers::FrontlineSMSParser::GetAndParse [Method finished]", \PEAR_LOG_DEBUG);
  24. return null;
  25. }
  26. $contentItems = $this->getRemoteContentItems($channel, $logger, $serverURL);
  27. $logger->log("Core::Modules::SiSPS::Parsers::FrontlineSMSParser::GetAndParse [END: Parsing SMS items from Remote API]", \PEAR_LOG_DEBUG);
  28. break;
  29. case "Local":
  30. $logger->log("Core::Modules::SiSPS::Parsers::FrontlineSMSParser::GetAndParse [START: Parsing SMS items from Local DB]", \PEAR_LOG_DEBUG);
  31. $contentItems = $this->getLocalContentItems($channel, $logger);
  32. $logger->log("Core::Modules::SiSPS::Parsers::FrontlineSMSParser::GetAndParse [END: Parsing SMS items from Local DB]", \PEAR_LOG_DEBUG);
  33. break;
  34. }
  35. //return the content array
  36. return $contentItems;
  37. }
  38. /**
  39. * Gets content items from the server
  40. * @param \Swiftriver\Core\ObjectModel\Channel $channel
  41. * @param string $serverURL
  42. *
  43. * @return array()
  44. */
  45. private function getRemoteContentItems($channel, $logger, $serverURL) {
  46. $contentItems = array();
  47. $logger->log("Core::Modules::SiSPS::Parsers::FrontlineSMSParser::getRemoteContentItems [Preparing URL]", \PEAR_LOG_DEBUG);
  48. $endServerURL = "index.php";
  49. if(isset($channel->lastSucess)) {
  50. $endServerURL.="?lastmessagedate=".date('U', $channel->lastSucess)."000";
  51. }
  52. $logger->log("Core::Modules::SiSPS::Parsers::FrontlineSMSParser::getRemoteContentItems [Connecting to server: ".$serverURL.$endServerURL."]", \PEAR_LOG_DEBUG);
  53. $json_response = file_get_contents($serverURL.$endServerURL);
  54. $json_decoded = json_decode($json_response, true);
  55. $logger->log("Core::Modules::SiSPS::Parsers::FrontlineSMSParser::getRemoteContentItems [Extracting message]", \PEAR_LOG_DEBUG);
  56. if(is_array($json_decoded)) {
  57. $num_messages = count($json_decoded["messages"]);
  58. $json_decoded = $json_decoded["messages"];
  59. $logger->log("Core::Modules::SiSPS::Parsers::FrontlineSMSParser::getRemoteContentItems [Processing $num_messages messages]", \PEAR_LOG_DEBUG);
  60. for($message_index = 0; $message_index < $num_messages; $message_index ++) {
  61. $source_name = "";
  62. // Embed source name and source number
  63. $source_name = $json_decoded[$message_index]['senderMsisdn'];
  64. $source = \Swiftriver\Core\ObjectModel\ObjectFactories\SourceFactory::CreateSourceFromIdentifier($source_name, $channel->trusted);
  65. $source->name = $source_name;
  66. $source->parent = $channel->id;
  67. $source->type = $channel->type;
  68. $source->subType = $channel->subType;
  69. //Create a new Content item
  70. $item = \Swiftriver\Core\ObjectModel\ObjectFactories\ContentFactory::CreateContent($source);
  71. $item->text[] = new \Swiftriver\Core\ObjectModel\LanguageSpecificText(
  72. "", //here we set null as we dont know the language yet
  73. "", //the keyword can be used as a subject
  74. array($json_decoded[$message_index]['textContent'], $json_decoded[$message_index]['binaryMessageContent'])); //the message
  75. $item->link = null;
  76. $item->date = time();
  77. $contentItems[] = $item;
  78. }
  79. return $contentItems;
  80. }
  81. else {
  82. return null;
  83. }
  84. }
  85. /**
  86. * Gets content items from the server
  87. * @param \Swiftriver\Core\ObjectModel\Channel $channel
  88. * @param string $serverURL
  89. *
  90. * @return array()
  91. */
  92. private function getLocalContentItems($channel, $logger) {
  93. $contentItems = array();
  94. $logger->log("Core::Modules::SiSPS::Parsers::FrontlineSMSParser::getLocalContentItems [Preparing to read from DB]", \PEAR_LOG_DEBUG);
  95. $lastSuccess = "0";
  96. if(isset($channel->lastSucess)) {
  97. $lastSuccess = date('U', $channel->lastSucess)."000";
  98. }
  99. if($channel->parameters["Database"] == "" && $channel->parameters[""] == "UserName") {
  100. $logger->log("Core::Modules::SiSPS::Parsers::FrontlineSMSParser::getLocalContentItems [Database and UserName parameters not set, exiting]", \PEAR_LOG_DEBUG);
  101. return null;
  102. }
  103. $my_connection = $this->localDBOpen("localhost", $channel->parameters["UserName"], $channel->parameters["Password"], $channel->parameters["Database"]);
  104. $my_messages = $this->localDBReturnMessages($my_connection, "message", $lastSuccess);
  105. $this->localDBClose($my_connection);
  106. if(is_array($my_messages)) {
  107. $num_messages = count($my_messages);
  108. $logger->log("Core::Modules::SiSPS::Parsers::FrontlineSMSParser::getContentItems [Processing $num_messages messages]", \PEAR_LOG_DEBUG);
  109. for($message_index = 0; $message_index < $num_messages; $message_index ++) {
  110. $source_name = "";
  111. // Embed source name and source number
  112. $source_name = $my_messages[$message_index]['senderMsisdn'];
  113. $source = \Swiftriver\Core\ObjectModel\ObjectFactories\SourceFactory::CreateSourceFromIdentifier($source_name, $channel->trusted);
  114. $source->name = $source_name;
  115. $source->parent = $channel->id;
  116. $source->type = $channel->type;
  117. $source->subType = $channel->subType;
  118. //Create a new Content item
  119. $item = \Swiftriver\Core\ObjectModel\ObjectFactories\ContentFactory::CreateContent($source);
  120. $item->text[] = new \Swiftriver\Core\ObjectModel\LanguageSpecificText(
  121. "", //here we set null as we dont know the language yet
  122. "", //the keyword can be used as a subject
  123. array($my_messages[$message_index]['textContent'], $my_messages[$message_index]['binaryMessageContent'])); //the message
  124. $item->link = null;
  125. $item->date = time();
  126. $contentItems[] = $item;
  127. }
  128. return $contentItems;
  129. }
  130. else {
  131. return null;
  132. }
  133. }
  134. /**
  135. * This method returns a string array with the names of all
  136. * the source types this parser is designed to parse. For example
  137. * the FrontlineParser may return array("SMS");
  138. *
  139. * @return string[]
  140. */
  141. public function ListSubTypes() {
  142. return array(
  143. "Remote",
  144. "Local"
  145. );
  146. }
  147. /**
  148. * This method returns a string describing the type of sources
  149. * it can parse. For example, the FeedsParser returns "Feeds".
  150. *
  151. * @return string type of sources parsed
  152. */
  153. public function ReturnType() {
  154. return "FrontlineSMS";
  155. }
  156. /**
  157. * This method returns an array of the required parameters that
  158. * are necessary to run this parser. The Array should be in the
  159. * following format:
  160. * array(
  161. * "SubType" => array ( ConfigurationElements )
  162. * )
  163. *
  164. * @return array()
  165. */
  166. public function ReturnRequiredParameters(){
  167. $return = array();
  168. foreach($this->ListSubTypes() as $subType){
  169. if($subType == "Remote") {
  170. $return[$subType] = array(
  171. new \Swiftriver\Core\ObjectModel\ConfigurationElement(
  172. "ServerURL",
  173. "string",
  174. "The Server's URL - This will contain the API"
  175. )
  176. );
  177. }
  178. else {
  179. $return[$subType] = array(
  180. new \Swiftriver\Core\ObjectModel\ConfigurationElement(
  181. "Database",
  182. "string",
  183. "FrontlineSMS database name"
  184. ),
  185. new \Swiftriver\Core\ObjectModel\ConfigurationElement(
  186. "UserName",
  187. "string",
  188. "User name for database"
  189. ),
  190. new \Swiftriver\Core\ObjectModel\ConfigurationElement(
  191. "Password",
  192. "string",
  193. "Password for database"
  194. )
  195. );
  196. }
  197. }
  198. return $return;
  199. }
  200. function localDBOpen($host, $user, $password, $database) {
  201. // Open database connection and return resource to the connection
  202. $mysqlConnection = mysql_connect($host, $user, $password, $database);
  203. mysql_select_db($database, $mysqlConnection);
  204. return $mysqlConnection;
  205. }
  206. function localDBClose($myConnection) {
  207. // Close an open resource
  208. if($myConnection) {
  209. mysql_close($myConnection);
  210. }
  211. }
  212. function localDBReturnMessages($myConnection, $messageTable = 'message', $lastMessageDate = 0) {
  213. // Return an array of messages
  214. if(!$myConnection) {
  215. return null;
  216. }
  217. $whereQuery = "";
  218. if($lastMessageDate > 0) {
  219. $whereQuery = " WHERE `$messageTable`.`date` > $lastMessageDate";
  220. }
  221. $sqlQuery = "SELECT * FROM $messageTable".$whereQuery;
  222. $myResult = mysql_query($sqlQuery, $myConnection);
  223. $myArray = array();
  224. if($myResult) {
  225. $currentArrayIndex = 0;
  226. while($myItemArray = mysql_fetch_array($myResult)) {
  227. $myArray[$currentArrayIndex] = $myItemArray;
  228. $currentArrayIndex ++;
  229. }
  230. return $myArray;
  231. }
  232. else {
  233. return null;
  234. }
  235. }
  236. }
  237. ?>