Skip to content

Commit

Permalink
Merge pull request #1514 from AxonFramework/result-message-payload-ac…
Browse files Browse the repository at this point in the history
…cess-alignment

[#1477] ResultMessage illegal payload access alignment
  • Loading branch information
smcvb authored Sep 23, 2020
2 parents e4d7e42 + e3c85a8 commit 8b505c6
Show file tree
Hide file tree
Showing 7 changed files with 67 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import org.axonframework.axonserver.connector.ErrorCode;
import org.axonframework.axonserver.connector.util.GrpcMetaData;
import org.axonframework.axonserver.connector.util.GrpcSerializedObject;
import org.axonframework.messaging.IllegalPayloadAccessException;
import org.axonframework.messaging.MetaData;
import org.axonframework.queryhandling.QueryResponseMessage;
import org.axonframework.serialization.LazyDeserializingObject;
Expand Down Expand Up @@ -88,6 +89,13 @@ public MetaData getMetaData() {

@Override
public R getPayload() {
if (isExceptional()) {
throw new IllegalPayloadAccessException(
"This result completed exceptionally, payload is not available. "
+ "Try calling 'exceptionResult' to see the cause of failure.",
exception
);
}
return serializedPayload == null ? null : serializedPayload.getObject();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import org.axonframework.axonserver.connector.ErrorCode;
import org.axonframework.axonserver.connector.util.GrpcMetaData;
import org.axonframework.axonserver.connector.util.GrpcSerializedObject;
import org.axonframework.messaging.IllegalPayloadAccessException;
import org.axonframework.messaging.MetaData;
import org.axonframework.queryhandling.SubscriptionQueryUpdateMessage;
import org.axonframework.serialization.LazyDeserializingObject;
Expand Down Expand Up @@ -88,6 +89,13 @@ public MetaData getMetaData() {

@Override
public U getPayload() {
if (isExceptional()) {
throw new IllegalPayloadAccessException(
"This result completed exceptionally, payload is not available. "
+ "Try calling 'exceptionResult' to see the cause of failure.",
exception
);
}
return serializedPayload == null ? null : serializedPayload.getObject();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

import io.axoniq.axonserver.grpc.query.QueryResponse;
import org.axonframework.axonserver.connector.AxonServerConfiguration;
import org.axonframework.messaging.IllegalPayloadAccessException;
import org.axonframework.messaging.MetaData;
import org.axonframework.queryhandling.GenericQueryResponseMessage;
import org.axonframework.queryhandling.QueryResponseMessage;
Expand Down Expand Up @@ -79,7 +80,7 @@ void testGetPayloadReturnsAnIdenticalObjectAsInsertedThroughTheQueryResponseMess
}

@Test
void testGetPayloadReturnsNullIfTheQueryResponseMessageDidNotContainAnyPayload() {
void testGetPayloadThrowIllegalPayloadExceptionIfTheQueryResponseMessageDidNotContainAnyPayload() {
QueryResponseMessage<TestQueryResponse> testQueryResponseMessage =
GenericQueryResponseMessage.asResponseMessage(
TestQueryResponse.class, new IllegalArgumentException("some-exception")
Expand All @@ -89,7 +90,7 @@ TestQueryResponse.class, new IllegalArgumentException("some-exception")
GrpcBackedResponseMessage<TestQueryResponse> testSubject =
new GrpcBackedResponseMessage<>(testQueryResponse, serializer);

assertNull(testSubject.getPayload());
assertThrows(IllegalPayloadAccessException.class, testSubject::getPayload);
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

import io.axoniq.axonserver.grpc.query.QueryUpdate;
import org.axonframework.axonserver.connector.AxonServerConfiguration;
import org.axonframework.messaging.IllegalPayloadAccessException;
import org.axonframework.messaging.MetaData;
import org.axonframework.queryhandling.GenericSubscriptionQueryUpdateMessage;
import org.axonframework.queryhandling.SubscriptionQueryUpdateMessage;
Expand All @@ -27,9 +28,7 @@

import java.util.Objects;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.*;

/**
* Test all the functions provided on the {@link GrpcBackedQueryUpdateMessage}. The {@link QueryUpdate} to be passed to
Expand Down Expand Up @@ -96,6 +95,18 @@ void testGetPayloadTypeReturnsTheTypeOfTheInsertedQueryUpdate() {
assertEquals(TestQueryUpdate.class, testSubject.getPayloadType());
}

@Test
void testGetPayloadThrowsIllegalPayloadExceptionWhenUpdateIsExceptional() {
SubscriptionQueryUpdateMessage<TestQueryUpdate> testSubscriptionQueryUpdateMessage =
GenericSubscriptionQueryUpdateMessage.asUpdateMessage(TestQueryUpdate.class, new RuntimeException());
QueryUpdate testQueryUpdate =
subscriptionMessageSerializer.serialize(testSubscriptionQueryUpdateMessage);
GrpcBackedQueryUpdateMessage<TestQueryUpdate> testSubject =
new GrpcBackedQueryUpdateMessage<>(testQueryUpdate, serializer);

assertThrows(IllegalPayloadAccessException.class, testSubject::getPayload);
}

@Test
void testWithMetaDataCompletelyReplacesTheInitialMetaDataMap() {
MetaData testMetaData = MetaData.with("some-key", "some-value");
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.axonframework.messaging.responsetypes;

import org.axonframework.messaging.IllegalPayloadAccessException;
import org.axonframework.messaging.MetaData;
import org.axonframework.queryhandling.QueryResponseMessage;
import org.axonframework.serialization.SerializedObject;
Expand Down Expand Up @@ -74,6 +75,13 @@ public MetaData getMetaData() {

@Override
public R getPayload() {
if (isExceptional()) {
throw new IllegalPayloadAccessException(
"This result completed exceptionally, payload is not available. "
+ "Try calling 'exceptionResult' to see the cause of failure.",
optionalExceptionResult().orElse(null)
);
}
return expectedResponseType.convert(responseMessage.getPayload());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,19 @@ public static <T> SubscriptionQueryUpdateMessage<T> asUpdateMessage(Object paylo
return new GenericSubscriptionQueryUpdateMessage<>((T) payload);
}

/**
* Creates a {@link GenericSubscriptionQueryUpdateMessage} with the given {@code declaredType} and {@code exception}
* result.
*
* @param declaredType The declared type of the Subscription Query Update Message to be created
* @param exception The exception describing the cause of an error
* @param <T> type of the {@link GenericSubscriptionQueryUpdateMessage}
* @return a message containing exception result
*/
public static <T> SubscriptionQueryUpdateMessage<T> asUpdateMessage(Class<T> declaredType, Throwable exception) {
return new GenericSubscriptionQueryUpdateMessage<>(declaredType, exception, MetaData.emptyInstance());
}

/**
* Initializes {@link GenericSubscriptionQueryUpdateMessage} with incremental update.
*
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.axonframework.messaging.responsetypes;

import org.axonframework.messaging.IllegalPayloadAccessException;
import org.axonframework.messaging.MetaData;
import org.axonframework.queryhandling.GenericQueryResponseMessage;
import org.axonframework.queryhandling.QueryResponseMessage;
Expand All @@ -8,7 +9,7 @@
import java.util.List;

import static java.util.Collections.singletonList;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.*;

class ConvertingResponseMessageTest {

Expand All @@ -24,4 +25,15 @@ void testPayloadIsConvertedToExpectedType() {
assertEquals(singletonList("Some string result"), wrapped.getPayload());
assertEquals("value", wrapped.getMetaData().get("test"));
}

@Test
void testIllegalAccessPayloadWhenResultIsExceptional() {
QueryResponseMessage<?> msg = GenericQueryResponseMessage.asResponseMessage(List.class, new RuntimeException());
QueryResponseMessage<List<String>> wrapped = new ConvertingResponseMessage<>(
ResponseTypes.multipleInstancesOf(String.class),
msg);

assertEquals(List.class, wrapped.getPayloadType());
assertThrows(IllegalPayloadAccessException.class, wrapped::getPayload);
}
}

0 comments on commit 8b505c6

Please sign in to comment.