Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
* @param <E> The type of the event
* @param <IR> The type of the initial event
*/
public final class AwsEventShapeDecoder<E extends SerializableStruct, IR extends SerializableStruct>
final class AwsEventShapeDecoder<E extends SerializableStruct, IR extends SerializableStruct>
implements EventDecoder<AwsEventFrame> {

private final InitialEventType initialEventType;
Expand Down

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -7,57 +7,55 @@

import java.nio.ByteBuffer;
import java.time.Instant;
import java.util.Map;
import software.amazon.eventstream.HeaderValue;
import software.amazon.smithy.java.core.schema.Schema;
import software.amazon.smithy.java.core.schema.SerializableStruct;
import software.amazon.smithy.java.core.serde.SpecificShapeSerializer;

public class EventHeaderSerializer extends SpecificShapeSerializer {
private final Map<String, HeaderValue> headers;
class EventHeaderSerializer extends SpecificShapeSerializer {
private final HeadersBuilder headers;

public EventHeaderSerializer(Map<String, HeaderValue> headers) {
public EventHeaderSerializer(HeadersBuilder headers) {
this.headers = headers;
}

@Override
public void writeBoolean(Schema schema, boolean value) {
headers.put(schema.memberName(), HeaderValue.fromBoolean(value));
headers.put(schema.memberName(), value);
}

@Override
public void writeShort(Schema schema, short value) {
headers.put(schema.memberName(), HeaderValue.fromShort(value));
headers.put(schema.memberName(), value);
}

@Override
public void writeByte(Schema schema, byte value) {
headers.put(schema.memberName(), HeaderValue.fromByte(value));
headers.put(schema.memberName(), value);
}

@Override
public void writeInteger(Schema schema, int value) {
headers.put(schema.memberName(), HeaderValue.fromInteger(value));
headers.put(schema.memberName(), value);
}

@Override
public void writeLong(Schema schema, long value) {
headers.put(schema.memberName(), HeaderValue.fromLong(value));
headers.put(schema.memberName(), value);
}

@Override
public void writeString(Schema schema, String value) {
headers.put(schema.memberName(), HeaderValue.fromString(value));
headers.put(schema.memberName(), value);
}

@Override
public void writeBlob(Schema schema, ByteBuffer value) {
headers.put(schema.memberName(), HeaderValue.fromByteBuffer(value));
headers.put(schema.memberName(), value);
}

@Override
public void writeTimestamp(Schema schema, Instant value) {
headers.put(schema.memberName(), HeaderValue.fromTimestamp(value));
headers.put(schema.memberName(), value);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@
/*
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/

package software.amazon.smithy.java.aws.events;

import java.nio.ByteBuffer;
import java.time.Instant;
import java.util.HashMap;
import java.util.Map;
import software.amazon.eventstream.HeaderValue;

/**
* Util class to build headers for AWS events.
*/
final class HeadersBuilder {

private final Map<String, HeaderValue> headers = new HashMap<>();

HeadersBuilder() {}

/**
* Returns a headers builder for messages of type event.
*/
static HeadersBuilder forEvent() {
return new HeadersBuilder()
.messageType(MessageType.EVENT);
}

/**
* Returns a headers builder for messages of type error.
*/
static HeadersBuilder forError() {
return new HeadersBuilder()
.messageType(MessageType.ERROR);
}

/**
* Returns a headers builder for messages of type exception.
*/
static HeadersBuilder forException() {
return new HeadersBuilder()
.messageType(MessageType.EXCEPTION);
}

public HeadersBuilder messageType(MessageType messageType) {
headers.put(":message-type", HeaderValue.fromString(messageType.toString()));
return this;
}

/**
* Sets the `:content-type` header.
*/
public HeadersBuilder contentType(String contentType) {
headers.put(":content-type", HeaderValue.fromString(contentType));
return this;
}

/**
* Sets the `:event-type` header.
*/
public HeadersBuilder eventType(String eventType) {
headers.put(":event-type", HeaderValue.fromString(eventType));
return this;
}

/**
* Sets the `:exception-type` header.
*/
public HeadersBuilder exceptionType(String eventType) {
headers.put(":exception-type", HeaderValue.fromString(eventType));
return this;
}

/**
* Sets the `:error-code` header.
*/
public HeadersBuilder errorCode(String errorCode) {
headers.put(":error-code", HeaderValue.fromString(errorCode));
return this;
}

/**
* Sets the `:error-message` header.
*/
public HeadersBuilder errorMessage(String errorMessage) {
headers.put(":error-message", HeaderValue.fromString(errorMessage));
return this;
}

/**
* Adds the header with the given name and value.
*/
public HeadersBuilder put(String name, String value) {
headers.put(name, HeaderValue.fromString(value));
return this;
}

/**
* Adds the header with the given name and value.
*/
public HeadersBuilder put(String name, int value) {
headers.put(name, HeaderValue.fromInteger(value));
return this;
}

/**
* Adds the header with the given name and value.
*/
public HeadersBuilder put(String name, long value) {
headers.put(name, HeaderValue.fromLong(value));
return this;
}

/**
* Adds the header with the given name and value.
*/
public HeadersBuilder put(String name, boolean value) {
headers.put(name, HeaderValue.fromBoolean(value));
return this;
}

/**
* Adds the header with the given name and value.
*/
public HeadersBuilder put(String name, short value) {
headers.put(name, HeaderValue.fromShort(value));
return this;
}

/**
* Adds the header with the given name and value.
*/
public HeadersBuilder put(String name, byte value) {
headers.put(name, HeaderValue.fromByte(value));
return this;
}

/**
* Adds the header with the given name and value.
*/
public HeadersBuilder put(String name, ByteBuffer value) {
headers.put(name, HeaderValue.fromByteBuffer(value));
return this;
}

/**
* Adds the header with the given name and value.
*/
public HeadersBuilder put(String name, Instant value) {
headers.put(name, HeaderValue.fromTimestamp(value));
return this;
}

/**
* Returns the map with the header values.
*/
public Map<String, HeaderValue> build() {
return headers;
}

enum MessageType {
EVENT("event"),
ERROR("error"),
EXCEPTION("exception");

private final String value;

MessageType(String value) {
this.value = value;
}

@Override
public String toString() {
return value;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ class AwsEventShapeDecoderTest {
@Test
public void testDecodeInitialResponse() {
// Arrange
var headers = new AwsEventShapeEncoderTest.HeadersBuilder()
var headers = HeadersBuilder.forEvent()
.eventType("initial-response")
.contentType("text/json")
.put("intMemberHeader", 123)
Expand All @@ -57,7 +57,7 @@ public void testDecodeInitialResponse() {
@Test
public void testDecodeHeadersOnlyMember() {
// Arrange
var headers = new AwsEventShapeEncoderTest.HeadersBuilder()
var headers = HeadersBuilder.forEvent()
.contentType("text/json")
.eventType("headersOnlyMember")
.put("sequenceNum", 123)
Expand All @@ -81,7 +81,7 @@ public void testDecodeHeadersOnlyMember() {
@Test
public void testDecodeStructureMember() {
// Arrange
var headers = new AwsEventShapeEncoderTest.HeadersBuilder()
var headers = HeadersBuilder.forEvent()
.contentType("text/json")
.eventType("structureMember")
.build();
Expand All @@ -104,7 +104,7 @@ public void testDecodeStructureMember() {
@Test
public void testDecodeBodyAndHeaderMember() {
// Arrange
var headers = new AwsEventShapeEncoderTest.HeadersBuilder()
var headers = HeadersBuilder.forEvent()
.contentType("text/json")
.eventType("bodyAndHeaderMember")
.put("intMember", 123)
Expand All @@ -131,7 +131,7 @@ public void testDecodeBodyAndHeaderMember() {
@Test
public void testDecodeStringMember() {
// Arrange
var headers = new AwsEventShapeEncoderTest.HeadersBuilder()
var headers = HeadersBuilder.forEvent()
.contentType("text/json")
.eventType("stringMember")
.build();
Expand All @@ -154,9 +154,8 @@ public void testDecodeStringMember() {
@Test
public void testDecodeExceptionMember() {
// Arrange
var headers = new AwsEventShapeEncoderTest.HeadersBuilder()
var headers = HeadersBuilder.forException()
.contentType("text/json")
.messageType("exception")
.exceptionType("modeledErrorMember")
.build();
var message = new Message(headers, "{\"message\":\"Client exception\"}".getBytes(StandardCharsets.UTF_8));
Expand All @@ -179,8 +178,7 @@ public void testDecodeExceptionMember() {
@Test
public void testDecodeError() {
// Arrange
var headers = new AwsEventShapeEncoderTest.HeadersBuilder()
.messageType("error")
var headers = HeadersBuilder.forError()
.put(":error-code", "InternalFailure")
.put(":error-message", "An internal server error occurred")
.build();
Expand Down
Loading