This is an automated email from the ASF dual-hosted git repository. lahirujayathilake pushed a commit to branch amie-decoder in repository https://gitbox.apache.org/repos/asf/airavata-custos.git
commit 1215b8f1729746784c1cb86780dce2825f5e04e1 Author: lahiruj <[email protected]> AuthorDate: Tue Sep 23 00:40:45 2025 -0400 AmieClient replying to a packet method support --- .../org/apache/custos/amie/client/AmieClient.java | 56 +++++++++++++++++----- 1 file changed, 44 insertions(+), 12 deletions(-) diff --git a/amie-decoder/src/main/java/org/apache/custos/amie/client/AmieClient.java b/amie-decoder/src/main/java/org/apache/custos/amie/client/AmieClient.java index 1b787a14d..679b74bc6 100644 --- a/amie-decoder/src/main/java/org/apache/custos/amie/client/AmieClient.java +++ b/amie-decoder/src/main/java/org/apache/custos/amie/client/AmieClient.java @@ -30,14 +30,15 @@ import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; +import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.UriComponentsBuilder; import java.net.URI; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Map; /** * A client for Access CI AMIE REST API @@ -65,20 +66,14 @@ public class AmieClient { * @return A list of packets. Returns an empty list if the call fails or no packets are found. */ public List<JsonNode> fetchInProgressPackets() { - URI uri = UriComponentsBuilder.fromHttpUrl(properties.getBaseUrl()) - .path(PACKETS_PATH) - .build(properties.getSiteCode()); - - HttpHeaders headers = new HttpHeaders(); - headers.set(HEADER_XA_SITE, properties.getSiteCode()); - headers.set(HEADER_XA_API_KEY, properties.getApiKey()); - headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + String url = String.format("%s/packets/%s/", properties.getBaseUrl(), properties.getSiteCode()); + LOGGER.info("Polling for AMIE packets at URL: {}", url); + HttpHeaders headers = createAmieHeaders(); HttpEntity<String> entity = new HttpEntity<>(headers); try { - LOGGER.debug("Fetching in-progress packets from {}", uri); - ResponseEntity<String> response = restTemplate.exchange(uri, HttpMethod.GET, entity, String.class); + ResponseEntity<String> response = restTemplate.exchange(URI.create(url), HttpMethod.GET, entity, String.class); if (!response.getStatusCode().is2xxSuccessful() || response.getBody() == null) { LOGGER.warn("Received a non-successful response from AMIE API: {} {}", response.getStatusCode(), response.getBody()); @@ -88,11 +83,48 @@ public class AmieClient { return parsePacketsFromResponse(response.getBody()); } catch (RestClientException e) { - LOGGER.error("Failed to fetch packets from AMIE API at {}", uri, e); + LOGGER.error("An unexpected error occurred while fetching packets.", e); return Collections.emptyList(); } } + /** + * Sends a reply packet to the AMIE API to continue a transaction. + * For example, sending a 'notify_project_create' in response to a 'request_project_create'. + * + * @param packetRecId The ID of the packet this reply is for. + * @param replyBody A Map representing the JSON body of the reply packet. + */ + public void replyToPacket(long packetRecId, Map<String, Object> replyBody) { + String url = String.format("%s/packets/%s/%d/reply", properties.getBaseUrl(), properties.getSiteCode(), packetRecId); + LOGGER.info("Sending reply to URL: {}", url); + + HttpHeaders headers = createAmieHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(replyBody, headers); + + try { + ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class); + if (response.getStatusCode().is2xxSuccessful()) { + LOGGER.info("Successfully sent reply for packet_rec_id [{}].", packetRecId); + } else { + LOGGER.error("Failed to send reply for packet_rec_id [{}]. Status: {}, Body: {}", packetRecId, response.getStatusCode(), response.getBody()); + } + } catch (HttpClientErrorException e) { + LOGGER.error("HTTP error sending reply for packet_rec_id [{}]: {} {}", packetRecId, e.getStatusCode(), e.getResponseBodyAsString(), e); + throw e; + } + } + + private HttpHeaders createAmieHeaders() { + HttpHeaders headers = new HttpHeaders(); + headers.set(HEADER_XA_SITE, properties.getSiteCode()); + headers.set(HEADER_XA_API_KEY, properties.getApiKey()); + headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + return headers; + } + private List<JsonNode> parsePacketsFromResponse(String responseBody) { List<JsonNode> packets = new ArrayList<>(); try {
