Search in sources :

Example 1 with Buffer

use of io.vertx.mutiny.core.buffer.Buffer in project kogito-runtimes by kiegroup.

the class RestWorkItemHandler method executeWorkItem.

@Override
public void executeWorkItem(KogitoWorkItem workItem, KogitoWorkItemManager manager) {
    Class<?> targetInfo = getTargetInfo(workItem);
    logger.debug("Using target {}", targetInfo);
    // retrieving parameters
    Map<String, Object> parameters = new HashMap<>(workItem.getParameters());
    // removing unnecessary parameter
    parameters.remove("TaskName");
    String endPoint = getParam(parameters, URL, String.class, null);
    if (endPoint == null) {
        throw new IllegalArgumentException("Missing required parameter " + URL);
    }
    HttpMethod method = HttpMethod.valueOf(getParam(parameters, METHOD, String.class, "GET").toUpperCase());
    Object inputModel = getParam(parameters, CONTENT_DATA, Object.class, null);
    String user = getParam(parameters, USER, String.class, null);
    String password = getParam(parameters, PASSWORD, String.class, null);
    String hostProp = getParam(parameters, HOST, String.class, "localhost");
    int portProp = getParam(parameters, PORT, Integer.class, 8080);
    RestWorkItemHandlerResult resultHandler = getParam(parameters, RESULT_HANDLER, RestWorkItemHandlerResult.class, DEFAULT_RESULT_HANDLER);
    RestWorkItemHandlerBodyBuilder bodyBuilder = getBodyBuilder(parameters);
    logger.debug("Filtered parameters are {}", parameters);
    // create request
    endPoint = resolvePathParams(endPoint, parameters);
    Optional<URL> url = getUrl(endPoint);
    String host = url.map(java.net.URL::getHost).orElse(hostProp);
    int port = url.map(java.net.URL::getPort).orElse(portProp);
    // fix issue with spaces in the path
    String path = url.map(java.net.URL::getPath).orElse(endPoint).replace(" ", "%20");
    HttpRequest<Buffer> request = client.request(method, port, host, path);
    if (user != null && !user.trim().isEmpty() && password != null && !password.trim().isEmpty()) {
        request.basicAuthentication(user, password);
    }
    HttpResponse<Buffer> response = method == HttpMethod.POST || method == HttpMethod.PUT ? request.sendJsonAndAwait(bodyBuilder.apply(inputModel, parameters)) : request.sendAndAwait();
    manager.completeWorkItem(workItem.getStringId(), Collections.singletonMap(RESULT, resultHandler.apply(response, targetInfo)));
}
Also used : Buffer(io.vertx.mutiny.core.buffer.Buffer) RestWorkItemHandlerResult(org.kogito.workitem.rest.resulthandlers.RestWorkItemHandlerResult) DefaultRestWorkItemHandlerResult(org.kogito.workitem.rest.resulthandlers.DefaultRestWorkItemHandlerResult) HashMap(java.util.HashMap) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) RestWorkItemHandlerBodyBuilder(org.kogito.workitem.rest.bodybuilders.RestWorkItemHandlerBodyBuilder) URL(java.net.URL) HttpMethod(io.vertx.core.http.HttpMethod)

Example 2 with Buffer

use of io.vertx.mutiny.core.buffer.Buffer in project smallrye-reactive-messaging by smallrye.

the class AmqpMessageConverter method convertToAmqpMessage.

static io.vertx.mutiny.amqp.AmqpMessage convertToAmqpMessage(Message<?> message, boolean durable, long ttl) {
    Object payload = message.getPayload();
    OutgoingAmqpMetadata metadata = message.getMetadata(OutgoingAmqpMetadata.class).orElse(new OutgoingAmqpMetadata());
    org.apache.qpid.proton.message.Message output = org.apache.qpid.proton.message.Message.Factory.create();
    // Header
    if (metadata.isDurable()) {
        output.setDurable(true);
    } else {
        output.setDurable(durable);
    }
    output.setPriority(metadata.getPriority());
    if (metadata.getTtl() > 0) {
        output.setTtl(metadata.getTtl());
    } else if (ttl > 0) {
        output.setTtl(ttl);
    }
    // Annotations
    DeliveryAnnotations deliveryAnnotations = metadata.getDeliveryAnnotations();
    MessageAnnotations messageAnnotations = metadata.getMessageAnnotations();
    if (!deliveryAnnotations.getValue().isEmpty()) {
        output.setDeliveryAnnotations(deliveryAnnotations);
    }
    if (!messageAnnotations.getValue().isEmpty()) {
        output.setMessageAnnotations(messageAnnotations);
    }
    // Properties
    output.setMessageId(metadata.getMessageId());
    output.setUserId(metadata.getUserId() != null ? metadata.getUserId().getBytes() : null);
    output.setAddress(metadata.getAddress());
    output.setSubject(metadata.getSubject());
    output.setReplyTo(metadata.getReplyTo());
    output.setCorrelationId(metadata.getCorrelationId());
    output.setContentType(metadata.getContentType());
    output.setContentEncoding(metadata.getContentEncoding());
    output.setExpiryTime(metadata.getExpiryTime());
    output.setCreationTime(metadata.getCreationTime());
    output.setGroupId(metadata.getGroupId());
    output.setGroupSequence(metadata.getGroupSequence());
    output.setReplyToGroupId(metadata.getReplyToGroupId());
    if (!metadata.getProperties().isEmpty()) {
        output.setApplicationProperties(new ApplicationProperties(metadata.getProperties().getMap()));
    }
    // Application data section:
    if (payload instanceof String || isPrimitive(payload.getClass()) || payload instanceof UUID) {
        output.setBody(new AmqpValue(payload));
    } else if (payload instanceof Buffer) {
        output.setBody(new Data(new Binary(((Buffer) payload).getBytes())));
        if (output.getContentType() == null) {
            output.setContentType(BINARY_CONTENT_TYPE);
        }
    } else if (payload instanceof io.vertx.core.buffer.Buffer) {
        output.setBody(new Data(new Binary(((io.vertx.core.buffer.Buffer) payload).getBytes())));
        if (output.getContentType() == null) {
            output.setContentType(BINARY_CONTENT_TYPE);
        }
    } else if (payload instanceof Instant) {
        output.setBody(new AmqpValue(Date.from((Instant) payload)));
    } else if (payload instanceof JsonArray) {
        byte[] bytes = ((JsonArray) payload).toBuffer().getBytes();
        output.setBody(new Data(new Binary(bytes)));
        if (output.getContentType() == null) {
            output.setContentType(JSON_CONTENT_TYPE);
        }
    } else if (payload instanceof JsonObject) {
        byte[] bytes = ((JsonObject) payload).toBuffer().getBytes();
        output.setBody(new Data(new Binary(bytes)));
        if (output.getContentType() == null) {
            output.setContentType(JSON_CONTENT_TYPE);
        }
    } else if (payload instanceof byte[]) {
        output.setBody(new Data(new Binary(((byte[]) payload))));
        if (output.getContentType() == null) {
            output.setContentType(BINARY_CONTENT_TYPE);
        }
    } else if (payload instanceof Map || payload instanceof List) {
        // This branch must be after the JSON Object and JSON Array checks
        output.setBody(new AmqpValue(payload));
    } else {
        byte[] bytes = Json.encodeToBuffer(payload).getBytes();
        output.setBody(new Data(new Binary(bytes)));
        if (output.getContentType() == null) {
            output.setContentType(JSON_CONTENT_TYPE);
        }
    }
    // Footer
    Footer footer = metadata.getFooter();
    if (!footer.getValue().isEmpty()) {
        output.setFooter(footer);
    }
    return new AmqpMessage(new AmqpMessageImpl(output));
}
Also used : JsonObject(io.vertx.core.json.JsonObject) AmqpMessageImpl(io.vertx.amqp.impl.AmqpMessageImpl) MessageAnnotations(org.apache.qpid.proton.amqp.messaging.MessageAnnotations) ApplicationProperties(org.apache.qpid.proton.amqp.messaging.ApplicationProperties) List(java.util.List) UUID(java.util.UUID) Buffer(io.vertx.mutiny.core.buffer.Buffer) Instant(java.time.Instant) DeliveryAnnotations(org.apache.qpid.proton.amqp.messaging.DeliveryAnnotations) Data(org.apache.qpid.proton.amqp.messaging.Data) AmqpValue(org.apache.qpid.proton.amqp.messaging.AmqpValue) AmqpMessage(io.vertx.mutiny.amqp.AmqpMessage) JsonArray(io.vertx.core.json.JsonArray) Footer(org.apache.qpid.proton.amqp.messaging.Footer) JsonObject(io.vertx.core.json.JsonObject) Binary(org.apache.qpid.proton.amqp.Binary) Map(java.util.Map)

Example 3 with Buffer

use of io.vertx.mutiny.core.buffer.Buffer in project smallrye-reactive-messaging by smallrye.

the class KafkaCloudEventHelper method createFromStructuredCloudEvent.

public static <T, K> IncomingKafkaCloudEventMetadata<K, T> createFromStructuredCloudEvent(ConsumerRecord<K, T> record) {
    DefaultCloudEventMetadataBuilder<T> builder = new DefaultCloudEventMetadataBuilder<>();
    JsonObject content;
    if (record.value() instanceof JsonObject) {
        content = (JsonObject) record.value();
    } else if (record.value() instanceof String) {
        content = new JsonObject((String) record.value());
    } else if (record.value() instanceof byte[]) {
        byte[] bytes = (byte[]) record.value();
        Buffer buffer = Buffer.buffer(bytes);
        content = buffer.toJsonObject();
    } else {
        throw new IllegalArgumentException("Invalid value type. Structured Cloud Event can only be created from String, JsonObject and byte[], found: " + record.value().getClass());
    }
    // Required
    builder.withSpecVersion(content.getString(CloudEventMetadata.CE_ATTRIBUTE_SPEC_VERSION));
    builder.withId(content.getString(CloudEventMetadata.CE_ATTRIBUTE_ID));
    String source = content.getString(CloudEventMetadata.CE_ATTRIBUTE_SOURCE);
    if (source == null) {
        throw new IllegalArgumentException("The JSON value must contain the " + CloudEventMetadata.CE_ATTRIBUTE_SOURCE + " attribute");
    }
    builder.withSource(URI.create(source));
    builder.withType(content.getString(CloudEventMetadata.CE_ATTRIBUTE_TYPE));
    // Optional
    String ct = content.getString(CloudEventMetadata.CE_ATTRIBUTE_DATA_CONTENT_TYPE);
    if (ct != null) {
        builder.withDataContentType(ct);
    }
    String schema = content.getString(CloudEventMetadata.CE_ATTRIBUTE_DATA_SCHEMA);
    if (schema != null) {
        builder.withDataSchema(URI.create(schema));
    }
    String subject = content.getString(CloudEventMetadata.CE_ATTRIBUTE_SUBJECT);
    if (subject != null) {
        builder.withSubject(subject);
    }
    String time = content.getString(CloudEventMetadata.CE_ATTRIBUTE_TIME);
    if (time != null) {
        builder.withTimestamp(ZonedDateTime.parse(time, RFC3339_DATE_FORMAT));
    }
    // Extensions
    if (record.key() != null) {
        builder.withExtension(CE_KAFKA_KEY, record.key());
    }
    builder.withExtension(CE_KAFKA_TOPIC, record.topic());
    // Data
    Object data = content.getValue("data");
    // noinspection unchecked
    builder.withData((T) data);
    BaseCloudEventMetadata<T> cloudEventMetadata = builder.build();
    cloudEventMetadata.validate();
    return new DefaultIncomingKafkaCloudEventMetadata<>(new DefaultIncomingCloudEventMetadata<>(cloudEventMetadata));
}
Also used : Buffer(io.vertx.mutiny.core.buffer.Buffer) DefaultCloudEventMetadataBuilder(io.smallrye.reactive.messaging.ce.DefaultCloudEventMetadataBuilder) JsonObject(io.vertx.core.json.JsonObject) JsonObject(io.vertx.core.json.JsonObject)

Example 4 with Buffer

use of io.vertx.mutiny.core.buffer.Buffer in project kogito-runtimes by kiegroup.

the class RestWorkItemHandlerTest method testEmptyInputModel.

@Test
public void testEmptyInputModel() {
    ObjectMapper objectMapper = new ObjectMapper();
    ObjectNode objectNode = objectMapper.createObjectNode().put("id", 26).put("name", "pepe");
    RestWorkItemHandlerResult resultHandler = new DefaultRestWorkItemHandlerResult();
    HttpResponse<Buffer> response = mock(HttpResponse.class);
    when(response.bodyAsJson(ObjectNode.class)).thenReturn(objectNode);
    assertSame(objectNode, resultHandler.apply(response, ObjectNode.class));
}
Also used : Buffer(io.vertx.mutiny.core.buffer.Buffer) RestWorkItemHandlerResult(org.kogito.workitem.rest.resulthandlers.RestWorkItemHandlerResult) DefaultRestWorkItemHandlerResult(org.kogito.workitem.rest.resulthandlers.DefaultRestWorkItemHandlerResult) ObjectNode(com.fasterxml.jackson.databind.node.ObjectNode) DefaultRestWorkItemHandlerResult(org.kogito.workitem.rest.resulthandlers.DefaultRestWorkItemHandlerResult) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) Test(org.junit.jupiter.api.Test)

Example 5 with Buffer

use of io.vertx.mutiny.core.buffer.Buffer in project sandbox by 5733d9e2be6485d52ffa08870cabdee0.

the class WebhookInvoker method onEvent.

@Override
public void onEvent(String event) {
    HttpRequest<Buffer> request = client.postAbs(endpoint);
    if (token != null && !"".equals(token)) {
        request = request.bearerTokenAuthentication(token);
    }
    request.sendJsonObjectAndForget(new JsonObject(event));
}
Also used : Buffer(io.vertx.mutiny.core.buffer.Buffer) JsonObject(io.vertx.core.json.JsonObject)

Aggregations

Buffer (io.vertx.mutiny.core.buffer.Buffer)9 JsonObject (io.vertx.core.json.JsonObject)7 BasicProperties (com.rabbitmq.client.BasicProperties)2 JsonArray (io.vertx.core.json.JsonArray)2 HashMap (java.util.HashMap)2 CountDownLatch (java.util.concurrent.CountDownLatch)2 Data (org.apache.qpid.proton.amqp.messaging.Data)2 Test (org.junit.jupiter.api.Test)2 DefaultRestWorkItemHandlerResult (org.kogito.workitem.rest.resulthandlers.DefaultRestWorkItemHandlerResult)2 RestWorkItemHandlerResult (org.kogito.workitem.rest.resulthandlers.RestWorkItemHandlerResult)2 ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper)1 ObjectNode (com.fasterxml.jackson.databind.node.ObjectNode)1 AMQP (com.rabbitmq.client.AMQP)1 DefaultCloudEventMetadataBuilder (io.smallrye.reactive.messaging.ce.DefaultCloudEventMetadataBuilder)1 AmqpMessageImpl (io.vertx.amqp.impl.AmqpMessageImpl)1 HttpMethod (io.vertx.core.http.HttpMethod)1 AmqpMessage (io.vertx.mutiny.amqp.AmqpMessage)1 RabbitMQMessage (io.vertx.mutiny.rabbitmq.RabbitMQMessage)1 IOException (java.io.IOException)1 URL (java.net.URL)1