public Request<PublishRequest> marshall(PublishRequest publishRequest) {

    if (publishRequest == null) {
      throw new AmazonClientException("Invalid argument passed to marshall(...)");
    }

    Request<PublishRequest> request =
        new DefaultRequest<PublishRequest>(publishRequest, "AWSIotData");

    request.setHttpMethod(HttpMethodName.POST);

    String uriResourcePath = "/topics/{topic}";

    uriResourcePath =
        uriResourcePath.replace(
            "{topic}",
            (publishRequest.getTopic() == null)
                ? ""
                : StringUtils.fromString(publishRequest.getTopic()));
    request.setResourcePath(uriResourcePath);

    String qos =
        (publishRequest.getQos() == null) ? null : StringUtils.fromInteger(publishRequest.getQos());
    if (qos != null) {
      request.addParameter("qos", qos);
    }

    request.setContent(BinaryUtils.toStream(publishRequest.getPayload()));
    if (!request.getHeaders().containsKey("Content-Type")) {
      request.addHeader("Content-Type", DEFAULT_CONTENT_TYPE);
    }

    return request;
  }
Ejemplo n.º 2
0
  /**
   * Handles a publish request.
   *
   * @param request The publish request to handle.
   * @return A completable future to be completed with the publish response.
   */
  @SuppressWarnings("unchecked")
  private CompletableFuture<PublishResponse> handlePublish(PublishRequest request) {
    if (request.session() != id)
      return Futures.exceptionalFuture(new UnknownSessionException("incorrect session ID"));

    if (request.previousVersion() != eventVersion) {
      return CompletableFuture.completedFuture(
          PublishResponse.builder()
              .withStatus(Response.Status.ERROR)
              .withError(RaftError.Type.INTERNAL_ERROR)
              .withVersion(eventVersion)
              .build());
    }

    eventVersion = request.eventVersion();

    List<CompletableFuture<Void>> futures = new ArrayList<>(request.events().size());
    for (Event<?> event : request.events()) {
      Listeners<Object> listeners = eventListeners.get(event.name());
      if (listeners != null) {
        futures.add(listeners.accept(event.message()));
      }
    }

    return CompletableFuture.allOf(futures.toArray(new CompletableFuture<?>[futures.size()]))
        .handleAsync(
            (result, error) -> {
              completeVersion = Math.max(completeVersion, request.eventVersion());
              return PublishResponse.builder()
                  .withStatus(Response.Status.OK)
                  .withVersion(eventVersion)
                  .build();
            },
            context.executor());
  }