Skip to content
Merged
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 @@ private NullSigner() {}
* @return the request as-is.
*/
@Override
public Object sign(Object request, Identity identity, Context properties) {
return request;
public SignResult<Object> sign(Object request, Identity identity, Context properties) {
return new SignResult<>(request);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/*
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/

package software.amazon.smithy.java.auth.api;

/**
* Holds the result of signing a request of type {@link RequestT}.
*
* @param signedRequest the signed request
* @param signature the signature
* @param <RequestT> the type of the request
*/
public record SignResult<RequestT>(
RequestT signedRequest,
String signature) {

/**
* Creates a sign result with an empty string
*
* @param signedRequest the signed request
*/
public SignResult(RequestT signedRequest) {
this(signedRequest, "");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public interface Signer<RequestT, IdentityT extends Identity> extends AutoClosea
* @param properties Signing properties.
* @return the signed request.
*/
RequestT sign(RequestT request, IdentityT identity, Context properties);
SignResult<RequestT> sign(RequestT request, IdentityT identity, Context properties);

@SuppressWarnings("unchecked")
static <RequestT, IdentityT extends Identity> Signer<RequestT, IdentityT> nullSigner() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,15 @@

import java.util.Objects;
import java.util.function.Supplier;
import software.amazon.smithy.java.core.schema.InputEventStreamingApiOperation;
import software.amazon.smithy.java.core.schema.OutputEventStreamingApiOperation;
import software.amazon.smithy.java.core.schema.ApiOperation;
import software.amazon.smithy.java.core.schema.Schema;
import software.amazon.smithy.java.core.schema.SerializableStruct;
import software.amazon.smithy.java.core.schema.ShapeBuilder;
import software.amazon.smithy.java.core.serde.Codec;
import software.amazon.smithy.java.core.serde.event.EventDecoder;
import software.amazon.smithy.java.core.serde.event.EventDecoderFactory;
import software.amazon.smithy.java.core.serde.event.FrameDecoder;
import software.amazon.smithy.java.core.serde.event.FrameTransformer;
import software.amazon.smithy.java.core.serde.event.FrameProcessor;

/**
* A {@link EventDecoderFactory} for AWS events.
Expand All @@ -32,69 +31,69 @@ public final class AwsEventDecoderFactory<E extends SerializableStruct, IR exten
private final Schema eventSchema;
private final Codec codec;
private final Supplier<ShapeBuilder<E>> eventBuilder;
private final FrameTransformer<AwsEventFrame> transformer;
private final FrameProcessor<AwsEventFrame> frameProcessor;

private AwsEventDecoderFactory(
InitialEventType initialEventType,
Supplier<ShapeBuilder<IR>> initialEventBuilder,
Schema eventSchema,
Codec codec,
Supplier<ShapeBuilder<E>> eventBuilder,
FrameTransformer<AwsEventFrame> transformer
FrameProcessor<AwsEventFrame> frameProcessor
) {
this.initialEventType = Objects.requireNonNull(initialEventType, "initialEventType");
this.initialEventBuilder = Objects.requireNonNull(initialEventBuilder, "initialEventBuilder");
this.eventSchema = Objects.requireNonNull(eventSchema, "eventSchema").isMember() ? eventSchema.memberTarget()
: eventSchema;
this.codec = Objects.requireNonNull(codec, "codec");
this.eventBuilder = Objects.requireNonNull(eventBuilder, "eventBuilder");
this.transformer = Objects.requireNonNull(transformer, "transformer");
this.frameProcessor = Objects.requireNonNull(frameProcessor, "transformer");
}

/**
* Creates a new input stream decoder factory.
*
* @param operation The input operation for the factory
* @param codec The protocol codec to decode the payload
* @param transformer The frame transformer
* @param frameProcessor The frame transformer
* @param <IE> The output event type
* @return A new event decoder factory
*/
public static <IE extends SerializableStruct> AwsEventDecoderFactory<IE, ?> forInputStream(
InputEventStreamingApiOperation<?, ?, IE> operation,
ApiOperation<?, ?> operation,
Codec codec,
FrameTransformer<AwsEventFrame> transformer
FrameProcessor<AwsEventFrame> frameProcessor
) {
return new AwsEventDecoderFactory<>(
InitialEventType.INITIAL_REQUEST,
operation::inputBuilder,
operation.inputStreamMember(),
codec,
operation.inputEventBuilderSupplier(),
transformer);
(Supplier<ShapeBuilder<IE>>) (Supplier<?>) operation.inputEventBuilderSupplier(),
frameProcessor);
}

/**
* Creates a new output stream decoder factory.
*
* @param operation The output operation for the factory
* @param codec The protocol codec to decode the payload
* @param transformer The frame transformer
* @param frameProcessor The frame transformer
* @param <OE> The output event type
* @return A new event decoder factory
*/
public static <OE extends SerializableStruct> AwsEventDecoderFactory<OE, ?> forOutputStream(
OutputEventStreamingApiOperation<?, ?, OE> operation,
ApiOperation<?, ?> operation,
Codec codec,
FrameTransformer<AwsEventFrame> transformer
FrameProcessor<AwsEventFrame> frameProcessor
) {
return new AwsEventDecoderFactory<>(
InitialEventType.INITIAL_RESPONSE,
operation::outputBuilder,
operation.outputStreamMember(),
codec,
operation.outputEventBuilderSupplier(),
transformer);
(Supplier<ShapeBuilder<OE>>) (Supplier<?>) operation.outputEventBuilderSupplier(),
frameProcessor);
}

@Override
Expand All @@ -104,6 +103,6 @@ public EventDecoder<AwsEventFrame> newEventDecoder() {

@Override
public FrameDecoder<AwsEventFrame> newFrameDecoder() {
return new AwsFrameDecoder(transformer);
return new AwsFrameDecoder(frameProcessor);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,13 @@

import java.util.Objects;
import java.util.function.Function;
import software.amazon.smithy.java.core.schema.InputEventStreamingApiOperation;
import software.amazon.smithy.java.core.schema.OutputEventStreamingApiOperation;
import software.amazon.smithy.java.core.schema.ApiOperation;
import software.amazon.smithy.java.core.schema.Schema;
import software.amazon.smithy.java.core.serde.Codec;
import software.amazon.smithy.java.core.serde.event.EventEncoder;
import software.amazon.smithy.java.core.serde.event.EventEncoderFactory;
import software.amazon.smithy.java.core.serde.event.EventStreamingException;
import software.amazon.smithy.java.core.serde.event.FrameEncoder;
import software.amazon.smithy.java.core.serde.event.FrameTransformer;

/**
* A {@link EventEncoderFactory} for AWS events.
Expand All @@ -25,22 +23,19 @@ public final class AwsEventEncoderFactory implements EventEncoderFactory<AwsEven
private final Schema schema;
private final Codec codec;
private final String payloadMediaType;
private final FrameTransformer<AwsEventFrame> transformer;
private final Function<Throwable, EventStreamingException> exceptionHandler;

private AwsEventEncoderFactory(
InitialEventType initialEventType,
Schema schema,
Codec codec,
String payloadMediaType,
FrameTransformer<AwsEventFrame> transformer,
Function<Throwable, EventStreamingException> exceptionHandler
) {
this.initialEventType = Objects.requireNonNull(initialEventType, "initialEventType");
this.schema = Objects.requireNonNull(schema, "schema").isMember() ? schema.memberTarget() : schema;
this.codec = Objects.requireNonNull(codec, "codec");
this.payloadMediaType = Objects.requireNonNull(payloadMediaType, "payloadMediaType");
this.transformer = Objects.requireNonNull(transformer, "transformer");
this.exceptionHandler = Objects.requireNonNull(exceptionHandler, "exceptionHandler");
}

Expand All @@ -54,17 +49,15 @@ private AwsEventEncoderFactory(
* @return A new event encoder factory
*/
public static AwsEventEncoderFactory forInputStream(
InputEventStreamingApiOperation<?, ?, ?> operation,
ApiOperation<?, ?> operation,
Codec codec,
String payloadMediaType,
FrameTransformer<AwsEventFrame> transformer,
Function<Throwable, EventStreamingException> exceptionHandler
) {
return new AwsEventEncoderFactory(InitialEventType.INITIAL_REQUEST,
operation.inputStreamMember(),
codec,
payloadMediaType,
transformer,
exceptionHandler);
}

Expand All @@ -78,17 +71,15 @@ public static AwsEventEncoderFactory forInputStream(
* @return A new event encoder factory
*/
public static AwsEventEncoderFactory forOutputStream(
OutputEventStreamingApiOperation<?, ?, ?> operation,
ApiOperation<?, ?> operation,
Codec codec,
String payloadMediaType,
FrameTransformer<AwsEventFrame> transformer,
Function<Throwable, EventStreamingException> exceptionHandler
) {
return new AwsEventEncoderFactory(InitialEventType.INITIAL_RESPONSE,
operation.outputStreamMember(),
codec,
payloadMediaType,
transformer,
exceptionHandler);
}

Expand All @@ -98,7 +89,6 @@ public EventEncoder<AwsEventFrame> newEventEncoder() {
schema,
codec,
payloadMediaType,
transformer,
exceptionHandler);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public final class AwsEventFrame implements Frame<Message> {

private final Message message;

AwsEventFrame(Message message) {
public AwsEventFrame(Message message) {
this.message = message;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ public SerializableStruct decode(AwsEventFrame frame) {

private E decodeEvent(AwsEventFrame frame) {
var message = frame.unwrap();
// TODO Add support for :message-type other than "event".
var eventType = getEventType(message);
var memberSchema = eventSchema.member(eventType);
if (memberSchema == null) {
Expand Down Expand Up @@ -99,6 +100,10 @@ private Schema getEventStreamMember(Schema schema) {
throw new IllegalArgumentException("cannot find streaming member");
}

private String getMessageType(Message message) {
return message.getHeaders().get(":message-type").getString();
}

private String getEventType(Message message) {
return message.getHeaders().get(":event-type").getString();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
import software.amazon.smithy.java.core.serde.SpecificShapeSerializer;
import software.amazon.smithy.java.core.serde.event.EventEncoder;
import software.amazon.smithy.java.core.serde.event.EventStreamingException;
import software.amazon.smithy.java.core.serde.event.FrameTransformer;
import software.amazon.smithy.model.shapes.ShapeId;

public final class AwsEventShapeEncoder implements EventEncoder<AwsEventFrame> {
Expand All @@ -36,15 +35,13 @@ public final class AwsEventShapeEncoder implements EventEncoder<AwsEventFrame> {
private final String payloadMediaType;
private final Map<String, BiFunction<OutputStream, Map<String, HeaderValue>, ShapeSerializer>> possibleTypes;
private final Map<ShapeId, Schema> possibleExceptions;
private final FrameTransformer<AwsEventFrame> frameTransformer;
private final Function<Throwable, EventStreamingException> exceptionHandler;

public AwsEventShapeEncoder(
InitialEventType initialEventType,
Schema eventSchema,
Codec codec,
String payloadMediaType,
FrameTransformer<AwsEventFrame> frameTransformer,
Function<Throwable, EventStreamingException> exceptionHandler
) {
this.initialEventType = Objects.requireNonNull(initialEventType, "initialEventType");
Expand All @@ -54,7 +51,6 @@ public AwsEventShapeEncoder(
codec,
initialEventType.value());
this.possibleExceptions = possibleExceptions(Objects.requireNonNull(eventSchema, "eventSchema"));
this.frameTransformer = Objects.requireNonNull(frameTransformer, "frameTransformer");
this.exceptionHandler = Objects.requireNonNull(exceptionHandler, "exceptionHandler");
}

Expand All @@ -66,8 +62,7 @@ public AwsEventFrame encode(SerializableStruct item) {
headers.put(":message-type", HeaderValue.fromString("event"));
headers.put(":event-type", HeaderValue.fromString(typeHolder.get()));
headers.put(":content-type", HeaderValue.fromString(payloadMediaType));
var frame = new AwsEventFrame(new Message(headers, payload));
return frameTransformer.apply(frame);
return new AwsEventFrame(new Message(headers, payload));
}

private byte[] encodeInput(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,14 @@
import java.util.List;
import software.amazon.eventstream.MessageDecoder;
import software.amazon.smithy.java.core.serde.event.FrameDecoder;
import software.amazon.smithy.java.core.serde.event.FrameTransformer;
import software.amazon.smithy.java.core.serde.event.FrameProcessor;

public final class AwsFrameDecoder implements FrameDecoder<AwsEventFrame> {
private final MessageDecoder decoder = new MessageDecoder();
private final FrameTransformer<AwsEventFrame> transformer;
private final FrameProcessor<AwsEventFrame> frameProcessor;

public AwsFrameDecoder(FrameTransformer<AwsEventFrame> transformer) {
this.transformer = transformer;
public AwsFrameDecoder(FrameProcessor<AwsEventFrame> frameProcessor) {
this.frameProcessor = frameProcessor;
}

@Override
Expand All @@ -27,7 +27,7 @@ public List<AwsEventFrame> decode(ByteBuffer buffer) {
var result = new ArrayList<AwsEventFrame>(messages.size());
for (var message : messages) {
var event = new AwsEventFrame(message);
var transformed = transformer.apply(event);
var transformed = frameProcessor.transformFrame(event);
if (transformed != null) {
result.add(transformed);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import static org.junit.jupiter.api.Assertions.assertInstanceOf;

import java.nio.charset.StandardCharsets;
import java.util.function.Supplier;
import org.junit.jupiter.api.Test;
import software.amazon.eventstream.Message;
import software.amazon.smithy.java.aws.events.model.BodyAndHeaderEvent;
Expand Down Expand Up @@ -143,10 +144,11 @@ public void testDecodeStringMember() {
assertEquals(expected, actual);
}

@SuppressWarnings("unchecked")
static AwsEventShapeDecoder<?, ?> createDecoder() {
return new AwsEventShapeDecoder<>(InitialEventType.INITIAL_RESPONSE,
() -> TestOperation.instance().outputBuilder(), // output builder
TestOperation.instance().outputEventBuilderSupplier(),
(Supplier) TestOperation.instance().outputEventBuilderSupplier(),
TestOperation.instance().outputStreamMember(),
createJsonCodec());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
import software.amazon.smithy.java.aws.events.model.TestOperationInput;
import software.amazon.smithy.java.core.serde.Codec;
import software.amazon.smithy.java.core.serde.event.EventStreamingException;
import software.amazon.smithy.java.core.serde.event.FrameTransformer;
import software.amazon.smithy.java.json.JsonCodec;

class AwsEventShapeEncoderTest {
Expand Down Expand Up @@ -136,7 +135,6 @@ static AwsEventShapeEncoder createEncoder() {
TestOperation.instance().inputStreamMember(), // event schema
createJsonCodec(), // codec
"text/json",
FrameTransformer.identity(),
(e) -> new EventStreamingException("InternalServerException", "Internal Server Error"));
}

Expand Down
Loading