예제 #1
0
 /**
  * Process message receiving
  * @return Xcom_Xfabric_Model_Endpoint
  */
 public function receive()
 {
     $messageDataOptions = $this->_messageData->getOptions();
     $messageOptions = array('body' => $messageDataOptions['body'], 'headers' => $messageDataOptions['headers'], 'topic' => $messageDataOptions['topic'], 'message_data' => $this->_encoder->decodeText($messageDataOptions['body'], $this->_schema->getRawSchema()), 'db_adapter' => Mage::getModel('xcom_xfabric/message_response'), 'direction' => Xcom_Xfabric_Model_Message::DIRECTION_INBOUND, 'status' => Xcom_Xfabric_Model_Message::MESSAGE_STATUS_RECEIVED);
     $this->_message = Mage::getModel('xcom_xfabric/message', $messageOptions);
     $this->validateAuthorizationHeader($this->getMessage()->getAuthorization());
     $this->_message->save();
     /* Notify callback logic that message is received, decoded and saved to database */
     $this->getCallbackHandler()->invokeInboundReceived($this->getMessage());
     /* Invoke callback logic which will validate the message */
     $this->getCallbackHandler()->invokeInboundValidate($this->getMessage());
     /* Invoke callback logic which will validate the message */
     $this->getCallbackHandler()->invokeMessageValidated($this->getMessage());
     /* Generic event common for all messages */
     $this->getCallbackHandler()->invokeInboundProcessGeneric($this->getMessage());
     if ($this->_message->getHeader(Xcom_Xfabric_Model_Message::PUBLISHER_PSEUDONYM_HEADER) == $this->_authorization->getBearerData(Xcom_Xfabric_Model_Authorization::PSEUDONYM)) {
         /* If the sender of the message is the same as receiver. Message is "looped back"
            Nobody will receive this message unless subscribed on it on purpose */
         $this->getCallbackHandler()->invokeInboundLoopedProcess($this->getMessage());
     } else {
         /* Notify callback logic that it's a time to process message with specified topic */
         $this->getCallbackHandler()->invokeInboundProcessByTopic($this->getMessage());
     }
     return $this;
 }
예제 #2
0
 public function sendMessage(Xcom_Xfabric_Model_Message $message, array $options = array())
 {
     $requestTopic = $message->getTopic();
     $requestHeaders = serialize($message->getHeaders());
     Mage::getSingleton('xcom_xfabric/debug')->start('Send Request [STUB] ' . $requestTopic, $requestTopic, $requestHeaders, json_encode($message->getMessageData()));
     if (isset($options['synchronous'])) {
         try {
             $response = Mage::getModel('xcom_stub/message')->receive($message);
             if ($response && !is_null($response->getMessageId())) {
                 Mage::dispatchEvent('response_message_received', array('message' => $response));
                 Mage::getSingleton('xcom_xfabric/debug')->stop('Receive Response [STUB] ' . $requestTopic, $response->getTopic(), $requestHeaders, serialize($response->getBody()));
             } else {
                 //$response = Mage::helper('xcom_xfabric')->getMessage($requestTopic);
                 Mage::getSingleton('xcom_xfabric/debug')->stop('No Response was received [STUB] ' . $requestTopic, $requestTopic, $requestHeaders, '');
             }
             return $response;
         } catch (Exception $e) {
             Mage::getSingleton('xcom_xfabric/debug')->stop('No Response was received [STUB] ' . $requestTopic, $requestTopic, $requestHeaders, $e->getMessage());
         }
     } else {
         Mage::getSingleton('xcom_xfabric/debug')->stop('No Response is been waiting [STUB] ' . $requestTopic, '', '', json_encode($message->getMessageData()));
     }
 }
예제 #3
0
 public function sendMessage(Xcom_Xfabric_Model_Message $message, array $options = array())
 {
     $url = $this->prepareUri($message->getTopic());
     Mage::getSingleton('xcom_xfabric/debug')->start('Send Request to ' . $url->getUri(), $message->getTopic(), serialize($message->getHeaders()), isset($options['message_data']) ? $options['message_data'] : '');
     $adapter = $this->_getAdapter();
     $adapter->setConfig($this->_config);
     $adapter->write(Zend_Http_Client::POST, $url, '1.1', $this->_prepareHeaders($message->getHeaders()), $message->getBody());
     $result = $adapter->read();
     $error = '';
     $httpCode = $adapter->getInfo(CURLINFO_HTTP_CODE);
     if ($adapter->getErrno()) {
         $error = $adapter->getError();
     }
     if (!$result || $error) {
         Mage::getSingleton('xcom_xfabric/debug')->stop('Unable to complete the request.', $message->getTopic(), $result, 'Unable to complete the request. ' . $error);
         switch ($httpCode) {
             case '400':
                 $errorText = 'Bad request. ';
                 break;
             case '401':
                 $errorText = 'Request is unauthorized. ';
                 break;
             case '403':
                 $errorText = 'Request is forbidden. ';
                 break;
             case '404':
                 $errorText = 'Not Found. ';
                 break;
             case '413':
                 $errorText = 'Message is too large';
                 break;
             default:
                 $errorText = '';
                 break;
         }
         throw Mage::exception('Xcom_Xfabric', Mage::helper('xcom_xfabric')->__('Unable to complete the request. ') . $errorText . $error);
     }
     $zendHttpCode = Zend_Http_Response::extractCode($result);
     $zendHttpMessage = Zend_Http_Response::extractMessage($result);
     $zendHttpBody = Zend_Http_Response::extractBody($result);
     if ($zendHttpCode != '200') {
         Mage::getSingleton('xcom_xfabric/debug')->stop('Unable to complete the request.', $message->getTopic(), $result, $zendHttpMessage . ' ' . $zendHttpBody);
         throw Mage::exception('Xcom_Xfabric', $zendHttpMessage . ' ' . $zendHttpBody, $zendHttpCode);
     }
     if (!empty($options['synchronous']) && !$error) {
         $response = $this->_getResponseMessage($message->getCorrelationId());
         if (!$response) {
             Mage::getSingleton('xcom_xfabric/debug')->stop('Response is not received', $message->getTopic(), $result, 'No Errors');
             throw Mage::exception('Xcom_Xfabric', Mage::helper('xcom_xfabric')->__('Unable to complete the request. Please refer to the User Guide ' . 'to verify your settings and try again. If the error persists, contact your administrator.'));
         }
         return $response;
     }
     Mage::getSingleton('xcom_xfabric/debug')->stop('No Response is been waiting', $message->getTopic(), $result, $error);
     return true;
 }
예제 #4
0
 /**
  * Called when sent message is received by the system
  *
  * @param $topic
  * @param $id
  * @param Xcom_Xfabric_Model_Message $message
  * @return Xcom_Xfabric_Model_Callback_Dispatcher
  */
 public function invokeInboundLoopedProcess(Xcom_Xfabric_Model_Message $message)
 {
     $eventSuffix = Mage::helper('xcom_xfabric')->getEventSuffix($message->getTopic());
     Mage::dispatchEvent('response_message_looped_process_' . $eventSuffix, array('message' => $message));
     return $this;
 }