示例#1
0
void Dispatcher::receive(const JoynrMessage& message)
{
    LOG_DEBUG(logger,
              QString("receive(message). Message payload: %1").arg(QString(message.getPayload())));
    ReceivedMessageRunnable* receivedMessageRunnable = new ReceivedMessageRunnable(message, *this);
    handleReceivedMessageThreadPool.start(receivedMessageRunnable);
}
 void checkSubscriptionPublication(const JoynrMessage& joynrMessage){
     QString expectedPayload = QString(
                 "{\"_typeName\":\"joynr.SubscriptionPublication\","
                 "\"response\":\"publication\","
                 "\"subscriptionId\":\"%1\"}"
     );
     expectedPayload = expectedPayload.arg(subscriptionPublication.getSubscriptionId());
     EXPECT_EQ(expectedPayload, QString(joynrMessage.getPayload()));
 }
 void checkReply(const JoynrMessage& joynrMessage){
     QString expectedPayload = QString(
                 "{\"_typeName\":\"joynr.Reply\","
                 "\"requestReplyId\":\"%1\","
                 "\"response\":\"response\"}"
     );
     expectedPayload = expectedPayload.arg(reply.getRequestReplyId());
     EXPECT_EQ(expectedPayload, QString(joynrMessage.getPayload()));
 }
 void checkRequest(const JoynrMessage& joynrMessage){
     //TODO create expected string from params and methodName
     QString expectedPayload = QString(
                 "{\"_typeName\":\"joynr.Request\","
                 "\"methodName\":\"methodName\","
                 "\"paramDatatypes\":[\"java.lang.Integer\",\"java.lang.String\"],"
                 "\"params\":[42,\"value\"],"
                 "\"requestReplyId\":\"%1\"}"
     );
     expectedPayload = expectedPayload.arg(request.getRequestReplyId());
     EXPECT_EQ(expectedPayload, QString(joynrMessage.getPayload()));
 }
void DbusMessagingStubAdapter::transmit(JoynrMessage& message)
{
    logMethodCall(QString("transmit message with ID: %1 and payload: %2")
                  .arg(message.getHeaderMessageId())
                  .arg(QString(message.getPayload())));
    // copy joynr message
    joynr::messaging::IMessaging::JoynrMessage dbusMsg;
    DbusMessagingUtil::copyJoynrMsgToDbusMsg(message, dbusMsg);
    // call
    CommonAPI::CallStatus status;
    proxy->transmit(dbusMsg, status);
    // print the status
    printCallStatus(status, "transmit");
}
示例#6
0
void Dispatcher::handleSubscriptionStopReceived(const JoynrMessage& message)
{
    LOG_DEBUG(logger, "handleSubscriptionStopReceived");
    QByteArray jsonSubscriptionStop = message.getPayload();

    SubscriptionStop* subscriptionStop =
            JsonSerializer::deserialize<SubscriptionStop>(jsonSubscriptionStop);
    if (subscriptionStop == Q_NULLPTR) {
        LOG_ERROR(logger,
                  QString("Unable to deserialize subscription stop object from: %1")
                          .arg(QString::fromUtf8(jsonSubscriptionStop)));
        return;
    }
    QString subscriptionId = subscriptionStop->getSubscriptionId();
    assert(publicationManager != NULL);
    publicationManager->stopPublication(subscriptionId);
}
示例#7
0
void Dispatcher::handleReplyReceived(const JoynrMessage& message)
{
    // json request
    // lookup necessary data
    std::string jsonReply = message.getPayload();

    // deserialize the jsonReply
    try {
        Reply reply = JsonSerializer::deserialize<Reply>(jsonReply);
        std::string requestReplyId = reply.getRequestReplyId();

        std::shared_ptr<IReplyCaller> caller = replyCallerDirectory.lookup(requestReplyId);
        if (caller == nullptr) {
            // This used to be a fatal error, but it is possible that the replyCallerDirectory
            // removed
            // the caller
            // because its lifetime exceeded TTL
            JOYNR_LOG_INFO(
                    logger,
                    "caller not found in the ReplyCallerDirectory for requestid {}, ignoring",
                    requestReplyId);
            return;
        }

        // Get the reply interpreter - this has to be a reference to support ReplyInterpreter
        // polymorphism
        int typeId = caller->getTypeId();
        IReplyInterpreter& interpreter = MetaTypeRegistrar::instance().getReplyInterpreter(typeId);

        // pass reply
        interpreter.execute(caller, reply);

        // Clean up
        removeReplyCaller(requestReplyId);
    } catch (const std::invalid_argument& e) {
        JOYNR_LOG_ERROR(logger,
                        "Unable to deserialize reply object from: {} - error {}",
                        jsonReply,
                        e.what());
    }
}
示例#8
0
void Dispatcher::handleSubscriptionStopReceived(const JoynrMessage& message)
{
    JOYNR_LOG_DEBUG(logger, "handleSubscriptionStopReceived");
    std::string jsonSubscriptionStop = message.getPayload();

    std::string subscriptionId;
    try {
        SubscriptionStop subscriptionStop =
                JsonSerializer::deserialize<SubscriptionStop>(jsonSubscriptionStop);

        subscriptionId = subscriptionStop.getSubscriptionId();
    } catch (const std::invalid_argument& e) {
        JOYNR_LOG_ERROR(logger,
                        "Unable to deserialize subscription stop object from: {} - error: {}",
                        jsonSubscriptionStop,
                        e.what());
        return;
    }
    assert(publicationManager != nullptr);
    publicationManager->stopPublication(subscriptionId);
}
示例#9
0
void Dispatcher::handleBroadcastSubscriptionRequestReceived(const JoynrMessage& message)
{
    JOYNR_LOG_TRACE(logger, "Starting handleBroadcastSubscriptionRequestReceived");
    // Make sure that noone is registering a Caller at the moment, because a racing condition could
    // occour.
    std::lock_guard<std::mutex> lock(subscriptionHandlingMutex);
    assert(publicationManager != nullptr);

    std::string receiverId = message.getHeaderTo();
    std::shared_ptr<RequestCaller> caller = requestCallerDirectory.lookup(receiverId);

    std::string jsonSubscriptionRequest = message.getPayload();

    // PublicationManager is responsible for deleting SubscriptionRequests
    try {
        BroadcastSubscriptionRequest subscriptionRequest =
                JsonSerializer::deserialize<BroadcastSubscriptionRequest>(jsonSubscriptionRequest);

        if (!caller) {
            // Provider not registered yet
            // Dispatcher will call publicationManger->restore when a new provider is added to
            // activate
            // subscriptions for that provider
            publicationManager->add(
                    message.getHeaderFrom(), message.getHeaderTo(), subscriptionRequest);
        } else {
            publicationManager->add(message.getHeaderFrom(),
                                    message.getHeaderTo(),
                                    caller,
                                    subscriptionRequest,
                                    messageSender);
        }
    } catch (const std::invalid_argument& e) {
        JOYNR_LOG_ERROR(
                logger,
                "Unable to deserialize broadcast subscription request object from: {} - error: {}",
                jsonSubscriptionRequest,
                e.what());
    }
}
示例#10
0
void Dispatcher::handleReplyReceived(const JoynrMessage& message)
{
    // json request
    // lookup necessary data
    QByteArray jsonReply = message.getPayload();

    // deserialize the jsonReply
    Reply* reply = JsonSerializer::deserialize<Reply>(jsonReply);
    if (reply == Q_NULLPTR) {
        LOG_ERROR(logger,
                  QString("Unable to deserialize reply object from: %1")
                          .arg(QString::fromUtf8(jsonReply)));
        return;
    }
    QString requestReplyId = reply->getRequestReplyId();

    QSharedPointer<IReplyCaller> caller = replyCallerDirectory.lookup(requestReplyId.toStdString());
    if (caller == NULL) {
        // This used to be a fatal error, but it is possible that the replyCallerDirectory removed
        // the caller
        // because its lifetime exceeded TTL
        LOG_INFO(logger,
                 "caller not found in the ReplyCallerDirectory for requestid " + requestReplyId +
                         ", ignoring");
        return;
    }

    // Get the reply interpreter - this has to be a reference to support ReplyInterpreter
    // polymorphism
    int typeId = caller->getTypeId();
    IReplyInterpreter& interpreter = MetaTypeRegistrar::instance().getReplyInterpreter(typeId);

    // pass reply
    interpreter.execute(caller, *reply);

    // Clean up
    delete reply;
    removeReplyCaller(requestReplyId.toStdString());
}
示例#11
0
void Dispatcher::handlePublicationReceived(const JoynrMessage& message)
{
    std::string jsonSubscriptionPublication = message.getPayload();

    try {
        SubscriptionPublication subscriptionPublication =
                JsonSerializer::deserialize<SubscriptionPublication>(jsonSubscriptionPublication);

        std::string subscriptionId = subscriptionPublication.getSubscriptionId();

        assert(subscriptionManager != nullptr);

        std::shared_ptr<ISubscriptionCallback> callback =
                subscriptionManager->getSubscriptionCallback(subscriptionId);
        if (!callback) {
            JOYNR_LOG_ERROR(logger,
                            "Dropping reply for non/no more existing subscription with id = {}",
                            subscriptionId);
            return;
        }

        subscriptionManager->touchSubscriptionState(subscriptionId);

        int typeId = callback->getTypeId();

        // Get the publication interpreter - this has to be a reference to support
        // PublicationInterpreter polymorphism
        IPublicationInterpreter& interpreter =
                MetaTypeRegistrar::instance().getPublicationInterpreter(typeId);
        interpreter.execute(callback, subscriptionPublication);
    } catch (const std::invalid_argument& e) {
        JOYNR_LOG_ERROR(
                logger,
                "Unable to deserialize subscription publication object from: {} - error: {}",
                jsonSubscriptionPublication,
                e.what());
    }
}
示例#12
0
void Dispatcher::handleBroadcastSubscriptionRequestReceived(const JoynrMessage& message)
{
    LOG_TRACE(logger, "Starting handleBroadcastSubscriptionRequestReceived");
    // Make sure that noone is registering a Caller at the moment, because a racing condition could
    // occour.
    QMutexLocker locker(&subscriptionHandlingMutex);
    assert(publicationManager != NULL);

    QString receiverId = message.getHeaderTo();
    QSharedPointer<RequestCaller> caller = requestCallerDirectory.lookup(receiverId.toStdString());

    QByteArray jsonSubscriptionRequest = message.getPayload();

    // PublicationManager is responsible for deleting SubscriptionRequests
    BroadcastSubscriptionRequest* subscriptionRequest =
            JsonSerializer::deserialize<BroadcastSubscriptionRequest>(jsonSubscriptionRequest);
    if (subscriptionRequest == Q_NULLPTR) {
        LOG_ERROR(logger,
                  QString("Unable to deserialize broadcast subscription request object from: %1")
                          .arg(QString::fromUtf8(jsonSubscriptionRequest)));
        return;
    }

    if (caller.isNull()) {
        // Provider not registered yet
        // Dispatcher will call publicationManger->restore when a new provider is added to activate
        // subscriptions for that provider
        publicationManager->add(
                message.getHeaderFrom(), message.getHeaderTo(), *subscriptionRequest);
    } else {
        publicationManager->add(message.getHeaderFrom(),
                                message.getHeaderTo(),
                                caller,
                                *subscriptionRequest,
                                messageSender);
    }
    delete subscriptionRequest;
}
示例#13
0
void Dispatcher::handlePublicationReceived(const JoynrMessage& message)
{
    QByteArray jsonSubscriptionPublication = message.getPayload();

    SubscriptionPublication* subscriptionPublication =
            JsonSerializer::deserialize<SubscriptionPublication>(jsonSubscriptionPublication);
    if (subscriptionPublication == Q_NULLPTR) {
        LOG_ERROR(logger,
                  QString("Unable to deserialize subscription publication object from: %1")
                          .arg(QString::fromUtf8(jsonSubscriptionPublication)));
        return;
    }
    QString subscriptionId = subscriptionPublication->getSubscriptionId();

    assert(subscriptionManager != NULL);

    QSharedPointer<ISubscriptionCallback> callback =
            subscriptionManager->getSubscriptionCallback(subscriptionId);
    if (callback.isNull()) {
        LOG_ERROR(logger,
                  "Dropping reply for non/no more existing subscription with id=" + subscriptionId);
        delete subscriptionPublication;
        return;
    }

    subscriptionManager->touchSubscriptionState(subscriptionId);

    int typeId = callback->getTypeId();

    // Get the publication interpreter - this has to be a reference to support
    // PublicationInterpreter polymorphism
    IPublicationInterpreter& interpreter =
            MetaTypeRegistrar::instance().getPublicationInterpreter(typeId);
    interpreter.execute(callback, *subscriptionPublication);

    delete subscriptionPublication;
}
示例#14
0
void Dispatcher::handleRequestReceived(const JoynrMessage& message)
{
    std::string senderId = message.getHeaderFrom();
    std::string receiverId = message.getHeaderTo();

    // json request
    // lookup necessary data
    std::string jsonRequest = message.getPayload();
    std::shared_ptr<RequestCaller> caller = requestCallerDirectory.lookup(receiverId);
    if (caller == nullptr) {
        JOYNR_LOG_ERROR(
                logger,
                "caller not found in the RequestCallerDirectory for receiverId {}, ignoring",
                receiverId);
        return;
    }
    std::string interfaceName = caller->getInterfaceName();

    // Get the request interpreter that has been registered with this interface name
    std::shared_ptr<IRequestInterpreter> requestInterpreter =
            InterfaceRegistrar::instance().getRequestInterpreter(interfaceName);

    // deserialize json
    try {
        Request request = JsonSerializer::deserialize<Request>(jsonRequest);

        std::string requestReplyId = request.getRequestReplyId();
        JoynrTimePoint requestExpiryDate = message.getHeaderExpiryDate();

        std::function<void(std::vector<Variant>)> onSuccess =
                [requestReplyId, requestExpiryDate, this, senderId, receiverId](
                        std::vector<Variant> returnValueVar) {
            Reply reply;
            reply.setRequestReplyId(requestReplyId);
            reply.setResponse(std::move(returnValueVar));
            // send reply back to the original sender (ie. sender and receiver ids are reversed
            // on
            // purpose)
            JOYNR_LOG_DEBUG(logger,
                            "Got reply from RequestInterpreter for requestReplyId {}",
                            requestReplyId);
            JoynrTimePoint now = std::chrono::time_point_cast<std::chrono::milliseconds>(
                    std::chrono::system_clock::now());
            std::int64_t ttl = std::chrono::duration_cast<std::chrono::milliseconds>(
                                       requestExpiryDate - now).count();
            messageSender->sendReply(receiverId, // receiver of the request is sender of reply
                                     senderId,   // sender of request is receiver of reply
                                     MessagingQos(ttl),
                                     reply);
        };

        std::function<void(const exceptions::JoynrException&)> onError =
                [requestReplyId, requestExpiryDate, this, senderId, receiverId](
                        const exceptions::JoynrException& exception) {
            Reply reply;
            reply.setRequestReplyId(requestReplyId);
            reply.setError(joynr::exceptions::JoynrExceptionUtil::createVariant(exception));
            JOYNR_LOG_DEBUG(logger,
                            "Got error reply from RequestInterpreter for requestReplyId {}",
                            requestReplyId);
            JoynrTimePoint now = std::chrono::time_point_cast<std::chrono::milliseconds>(
                    std::chrono::system_clock::now());
            std::int64_t ttl = std::chrono::duration_cast<std::chrono::milliseconds>(
                                       requestExpiryDate - now).count();
            messageSender->sendReply(receiverId, // receiver of the request is sender of reply
                                     senderId,   // sender of request is receiver of reply
                                     MessagingQos(ttl),
                                     reply);
        };
        // execute request
        requestInterpreter->execute(caller,
                                    request.getMethodName(),
                                    request.getParams(),
                                    request.getParamDatatypes(),
                                    onSuccess,
                                    onError);
    } catch (const std::invalid_argument& e) {
        JOYNR_LOG_ERROR(logger,
                        "Unable to deserialize request object from: {} - error: {}",
                        jsonRequest,
                        e.what());
        return;
    }
}
示例#15
0
void Dispatcher::receive(const JoynrMessage& message)
{
    JOYNR_LOG_DEBUG(logger, "receive(message). Message payload: {}", message.getPayload());
    ReceivedMessageRunnable* receivedMessageRunnable = new ReceivedMessageRunnable(message, *this);
    handleReceivedMessageThreadPool.execute(receivedMessageRunnable);
}
示例#16
0
void Dispatcher::handleRequestReceived(const JoynrMessage& message)
{

    std::string senderId = message.getHeaderFrom().toStdString();
    std::string receiverId = message.getHeaderTo().toStdString();

    // json request
    // lookup necessary data
    QByteArray jsonRequest = message.getPayload();
    QSharedPointer<RequestCaller> caller = requestCallerDirectory.lookup(receiverId);
    if (caller == NULL) {
        LOG_ERROR(logger,
                  "caller not found in the RequestCallerDirectory for receiverId " +
                          QString::fromStdString(receiverId) + ", ignoring");
        return;
    }
    std::string interfaceName = caller->getInterfaceName();

    // Get the request interpreter that has been registered with this interface name
    QSharedPointer<IRequestInterpreter> requestInterpreter =
            InterfaceRegistrar::instance().getRequestInterpreter(interfaceName);

    // deserialize json
    Request* request = JsonSerializer::deserialize<Request>(jsonRequest);
    if (request == Q_NULLPTR) {
        LOG_ERROR(logger,
                  QString("Unable to deserialize request object from: %1")
                          .arg(QString::fromUtf8(jsonRequest)));
        return;
    }

    QString requestReplyId = request->getRequestReplyId();
    qint64 requestExpiryDate = message.getHeaderExpiryDate().toMSecsSinceEpoch();

    std::function<void(const QList<QVariant>&)> callbackFct =
            [requestReplyId, requestExpiryDate, this, senderId, receiverId](
                    const QList<QVariant>& returnValueQVar) {
        Reply reply;
        reply.setRequestReplyId(requestReplyId);
        reply.setResponse(returnValueQVar);
        // send reply back to the original sender (ie. sender and receiver ids are reversed
        // on
        // purpose)
        LOG_DEBUG(logger,
                  QString("Got reply from RequestInterpreter for requestReplyId %1")
                          .arg(requestReplyId));
        qint64 ttl = requestExpiryDate - QDateTime::currentMSecsSinceEpoch();
        messageSender->sendReply(receiverId, // receiver of the request is sender of reply
                                 senderId,   // sender of request is receiver of reply
                                 MessagingQos(ttl),
                                 reply);
    };
    // execute request
    requestInterpreter->execute(caller,
                                request->getMethodName(),
                                request->getParams(),
                                request->getParamDatatypes(),
                                callbackFct);

    delete request;
}