/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.communication.testutils;
import java.io.Serializable;
import de.rcenvironment.core.communication.common.InstanceNodeSessionId;
import de.rcenvironment.core.communication.common.SerializationException;
import de.rcenvironment.core.communication.messaging.NetworkRequestHandler;
import de.rcenvironment.core.communication.messaging.internal.InternalMessagingException;
import de.rcenvironment.core.communication.messaging.internal.NetworkRequestUtils;
import de.rcenvironment.core.communication.model.NetworkRequest;
import de.rcenvironment.core.communication.model.NetworkResponse;
import de.rcenvironment.core.communication.protocol.NetworkResponseFactory;
/**
* A {@link NetworkRequestHandler} for integration tests. It expects String payloads and responds to them with Strings of a certain,
* predictable pattern.
*
* @author Robert Mischke
*/
public class TestNetworkRequestHandler implements NetworkRequestHandler {
private InstanceNodeSessionId ownNodeId;
public TestNetworkRequestHandler(InstanceNodeSessionId ownNodeId) {
this.ownNodeId = ownNodeId;
}
@Override
public NetworkResponse handleRequest(NetworkRequest request, InstanceNodeSessionId lastHopNodeId) throws InternalMessagingException {
Serializable content = NetworkRequestUtils.deserializeWithExceptionHandling(request);
if (!(content instanceof String)) {
throw new RuntimeException("Test request handler received a non-string request: " + content);
}
try {
return NetworkResponseFactory.generateSuccessResponse(request, getTestResponse((String) content, ownNodeId));
} catch (SerializationException e) {
throw new InternalMessagingException("Failed to serialize the result of test call " + content, e);
}
}
/**
* The generation method for response strings. Tests should call this method to determine the expected response, instead of using
* hard-coded strings.
*
* @param content the received request content
* @param respondingNodeId the id of the node generating the response
* @return the response string
*/
public static String getTestResponse(String content, InstanceNodeSessionId respondingNodeId) {
return content + ".response.from=" + respondingNodeId.getInstanceNodeSessionIdString();
}
}