This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new d7fe34c5b55 [Hyperledger-Aries] Add support for service=didexchange 
(#8859)
d7fe34c5b55 is described below

commit d7fe34c5b556b312057c38470bb9df93f39df101
Author: Thomas Diesler <tdies...@redhat.com>
AuthorDate: Fri Dec 9 12:52:40 2022 +0100

    [Hyperledger-Aries] Add support for service=didexchange (#8859)
    
    * [Hyperledger-Aries] Add support for out-of-band/receive-invitation
    
    https://github.com/hyperledger/aries-agent-test-harness/issues/607
    
    * [Hyperledger-Aries] host.docker.internal does not resolve on linux
    
    * CAMEL-18803: [Hyperledger-Aries] Add support for service=didexchange
---
 .../camel-hyperledger-aries/docker-compose.yml     | 47 ++++++++-----
 .../ReceiveInvitationFilterConverterLoader.java    | 56 +++++++++++++++
 .../services/org/apache/camel/TypeConverterLoader  |  1 +
 .../component/aries/HyperledgerAriesComponent.java | 40 ++++++++++-
 .../component/aries/HyperledgerAriesProducer.java  |  8 +++
 .../aries/handler/AbstractServiceHandler.java      |  5 ++
 .../aries/handler/DidExchangeServiceHandler.java   | 79 ++++++++++++++++++++++
 .../aries/handler/OutOfBandServiceHandler.java     | 62 +++++++++++++++++
 .../aries/ReceiveInvitationFilterConverter.java    | 42 ++++++++++++
 .../component/aries/PresentationExchangeTest.java  |  3 +-
 10 files changed, 322 insertions(+), 21 deletions(-)

diff --git a/components/camel-hyperledger-aries/docker-compose.yml 
b/components/camel-hyperledger-aries/docker-compose.yml
index 7e530fdda64..6508be4df3f 100644
--- a/components/camel-hyperledger-aries/docker-compose.yml
+++ b/components/camel-hyperledger-aries/docker-compose.yml
@@ -19,7 +19,6 @@ version: '3'
 
 networks:
   von-network:
-  tails-server:
 
 services:
 
@@ -27,7 +26,7 @@ services:
   # Webserver
   #
   webserver:
-    image: nessusio/von-network:${VON_NETWORK_VERSION:-latest}
+    image: nessusio/von-network:${VON_NETWORK_VERSION:-1.7.2}
     container_name: indy-webserver
     command: bash -c 'sleep 10 && ./scripts/start_webserver.sh'
     environment:
@@ -47,6 +46,8 @@ services:
       - WEB_ANALYTICS_SCRIPT=${WEB_ANALYTICS_SCRIPT}
       - INFO_SITE_TEXT=${INFO_SITE_TEXT}
       - INFO_SITE_URL=${INFO_SITE_URL}
+    extra_hosts:
+      - host.docker.internal:host-gateway
     networks:
       - von-network
     ports:
@@ -59,7 +60,7 @@ services:
   # Nodes
   #
   node1:
-    image: nessusio/von-network:${VON_NETWORK_VERSION:-latest}
+    image: nessusio/von-network:${VON_NETWORK_VERSION:-1.7.2}
     container_name: indy-node1
     command: ./scripts/start_node.sh 1
     networks:
@@ -73,11 +74,13 @@ services:
       - DOCKERHOST=${DOCKERHOST:-host.docker.internal}
       - LOG_LEVEL=${LOG_LEVEL:-info}
       - RUST_LOG=${RUST_LOG:-warn}
+    extra_hosts:
+      - host.docker.internal:host-gateway
     volumes:
       - node1-data:/home/indy/ledger
 
   node2:
-    image: nessusio/von-network:${VON_NETWORK_VERSION:-latest}
+    image: nessusio/von-network:${VON_NETWORK_VERSION:-1.7.2}
     container_name: indy-node2
     command: ./scripts/start_node.sh 2
     networks:
@@ -91,11 +94,13 @@ services:
       - DOCKERHOST=${DOCKERHOST:-host.docker.internal}
       - LOG_LEVEL=${LOG_LEVEL:-info}
       - RUST_LOG=${RUST_LOG:-warn}
+    extra_hosts:
+      - host.docker.internal:host-gateway
     volumes:
       - node2-data:/home/indy/ledger
 
   node3:
-    image: nessusio/von-network:${VON_NETWORK_VERSION:-latest}
+    image: nessusio/von-network:${VON_NETWORK_VERSION:-1.7.2}
     container_name: indy-node3
     command: ./scripts/start_node.sh 3
     networks:
@@ -109,11 +114,13 @@ services:
       - DOCKERHOST=${DOCKERHOST:-host.docker.internal}
       - LOG_LEVEL=${LOG_LEVEL:-info}
       - RUST_LOG=${RUST_LOG:-warn}
+    extra_hosts:
+      - host.docker.internal:host-gateway
     volumes:
       - node3-data:/home/indy/ledger
 
   node4:
-    image: nessusio/von-network:${VON_NETWORK_VERSION:-latest}
+    image: nessusio/von-network:${VON_NETWORK_VERSION:-1.7.2}
     container_name: indy-node4
     command: ./scripts/start_node.sh 4
     networks:
@@ -127,16 +134,20 @@ services:
       - DOCKERHOST=${DOCKERHOST:-host.docker.internal}
       - LOG_LEVEL=${LOG_LEVEL:-info}
       - RUST_LOG=${RUST_LOG:-warn}
+    extra_hosts:
+      - host.docker.internal:host-gateway
     volumes:
       - node4-data:/home/indy/ledger
 
   tails-server:
-    image: nessusio/indy-tails-server:${TAILS_SERVER_VERSION:-latest}
+    image: nessusio/indy-tails-server:${TAILS_SERVER_VERSION:-1.0.0}
     container_name: tails-server
     ports:
       - 6543:6543
     networks:
-      - tails-server
+      - von-network
+    extra_hosts:
+      - host.docker.internal:host-gateway
     command: >
       tails-server
         --host 0.0.0.0
@@ -145,20 +156,15 @@ services:
         --log-level ${LOG_LEVEL:-info}
 
   acapy:
-    image: nessusio/aries-cloudagent-python:${ACAPY_VERSION:-latest}
+    image: nessusio/aries-cloudagent-python:${ACAPY_VERSION:-0.7.5}
     container_name: acapy
     ports:
       - ${ACAPY_USER_PORT:-8030}:${ACAPY_USER_PORT:-8030}
       - ${ACAPY_ADMIN_PORT:-8031}:${ACAPY_ADMIN_PORT:-8031}
     networks:
       - von-network
-    depends_on:
-      - node1
-      - node2
-      - node3
-      - node4
-      - webserver
-      - tails-server
+    extra_hosts:
+      - host.docker.internal:host-gateway
     command: >
       start
         --genesis-url http://${DOCKERHOST:-host.docker.internal}:9000/genesis
@@ -182,7 +188,14 @@ services:
         --auto-ping-connection
         --auto-accept-requests
         --log-level info
-        
+    depends_on:
+      - node1
+      - node2
+      - node3
+      - node4
+      - webserver
+      - tails-server
+
 volumes:
   webserver-cli:
   webserver-ledger:
diff --git 
a/components/camel-hyperledger-aries/src/generated/java/org/apache/camel/converter/aries/ReceiveInvitationFilterConverterLoader.java
 
b/components/camel-hyperledger-aries/src/generated/java/org/apache/camel/converter/aries/ReceiveInvitationFilterConverterLoader.java
new file mode 100644
index 00000000000..9e9687cb0e8
--- /dev/null
+++ 
b/components/camel-hyperledger-aries/src/generated/java/org/apache/camel/converter/aries/ReceiveInvitationFilterConverterLoader.java
@@ -0,0 +1,56 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.converter.aries;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
+import org.apache.camel.DeferredContextBinding;
+import org.apache.camel.Exchange;
+import org.apache.camel.TypeConversionException;
+import org.apache.camel.TypeConverterLoaderException;
+import org.apache.camel.spi.TypeConverterLoader;
+import org.apache.camel.spi.TypeConverterRegistry;
+import org.apache.camel.support.SimpleTypeConverter;
+import org.apache.camel.support.TypeConverterSupport;
+import org.apache.camel.util.DoubleMap;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+@DeferredContextBinding
+public final class ReceiveInvitationFilterConverterLoader implements 
TypeConverterLoader, CamelContextAware {
+
+    private CamelContext camelContext;
+
+    public ReceiveInvitationFilterConverterLoader() {
+    }
+
+    @Override
+    public void setCamelContext(CamelContext camelContext) {
+        this.camelContext = camelContext;
+    }
+
+    @Override
+    public CamelContext getCamelContext() {
+        return camelContext;
+    }
+
+    @Override
+    public void load(TypeConverterRegistry registry) throws 
TypeConverterLoaderException {
+        registerConverters(registry);
+    }
+
+    private void registerConverters(TypeConverterRegistry registry) {
+        addTypeConverter(registry, 
org.hyperledger.aries.api.out_of_band.ReceiveInvitationFilter.class, 
com.google.gson.JsonObject.class, false,
+            (type, exchange, value) -> 
org.apache.camel.converter.aries.ReceiveInvitationFilterConverter.toAries((com.google.gson.JsonObject)
 value));
+        addTypeConverter(registry, 
org.hyperledger.aries.api.out_of_band.ReceiveInvitationFilter.class, 
java.lang.String.class, false,
+            (type, exchange, value) -> 
org.apache.camel.converter.aries.ReceiveInvitationFilterConverter.toAries((java.lang.String)
 value));
+        addTypeConverter(registry, 
org.hyperledger.aries.api.out_of_band.ReceiveInvitationFilter.class, 
java.util.Map.class, false,
+            (type, exchange, value) -> 
org.apache.camel.converter.aries.ReceiveInvitationFilterConverter.toAries((java.util.Map)
 value));
+    }
+
+    private static void addTypeConverter(TypeConverterRegistry registry, 
Class<?> toType, Class<?> fromType, boolean allowNull, 
SimpleTypeConverter.ConversionMethod method) { 
+        registry.addTypeConverter(toType, fromType, new 
SimpleTypeConverter(allowNull, method));
+    }
+
+}
diff --git 
a/components/camel-hyperledger-aries/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader
 
b/components/camel-hyperledger-aries/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader
index bfbe4d1afcb..53f2af79bc6 100644
--- 
a/components/camel-hyperledger-aries/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader
+++ 
b/components/camel-hyperledger-aries/src/generated/resources/META-INF/services/org/apache/camel/TypeConverterLoader
@@ -8,6 +8,7 @@ 
org.apache.camel.converter.aries.CredentialDefinitionRequestConverterLoader
 org.apache.camel.converter.aries.IssueCredentialRecordsFilterConverterLoader
 org.apache.camel.converter.aries.PresentProofRequestConverterLoader
 org.apache.camel.converter.aries.PresentationRequestConverterLoader
+org.apache.camel.converter.aries.ReceiveInvitationFilterConverterLoader
 org.apache.camel.converter.aries.ReceiveInvitationRequestConverterLoader
 org.apache.camel.converter.aries.RevRegCreateRequestConverterLoader
 org.apache.camel.converter.aries.RevokeRequestConverterLoader
diff --git 
a/components/camel-hyperledger-aries/src/main/java/org/apache/camel/component/aries/HyperledgerAriesComponent.java
 
b/components/camel-hyperledger-aries/src/main/java/org/apache/camel/component/aries/HyperledgerAriesComponent.java
index 82f0d16881e..ab24bde9cc0 100644
--- 
a/components/camel-hyperledger-aries/src/main/java/org/apache/camel/component/aries/HyperledgerAriesComponent.java
+++ 
b/components/camel-hyperledger-aries/src/main/java/org/apache/camel/component/aries/HyperledgerAriesComponent.java
@@ -21,6 +21,7 @@ import java.util.Map;
 
 import io.nessus.aries.AgentConfiguration;
 import io.nessus.aries.AriesClientFactory;
+import io.nessus.aries.util.AssertArg;
 import io.nessus.aries.util.AssertState;
 import io.nessus.aries.wallet.NessusWallet;
 import io.nessus.aries.wallet.WalletRegistry;
@@ -44,6 +45,8 @@ public class HyperledgerAriesComponent extends 
DefaultComponent {
     private boolean removeWalletsOnShutdown;
 
     private AriesClient adminClient;
+    private WebSocketClient adminWebSocketClient;
+    private WebSocketListener adminWebSocketListener;
 
     @Override
     protected Endpoint createEndpoint(String uri, String remaining, 
Map<String, Object> parameters) throws Exception {
@@ -66,6 +69,9 @@ public class HyperledgerAriesComponent extends 
DefaultComponent {
 
     @Override
     protected void doShutdown() throws Exception {
+
+        closeAdminWebSocketClient();
+
         if (removeWalletsOnShutdown) {
             for (NessusWallet wallet : walletRegistry.getWallets()) {
                 wallet.closeAndRemove();
@@ -121,11 +127,39 @@ public class HyperledgerAriesComponent extends 
DefaultComponent {
         return AriesClientFactory.createClient(agentConfig, wallet);
     }
 
+    public WebSocketListener createAdminWebSocketListener() {
+        return new WebSocketListener("admin", null, null);
+    }
+
+    public WebSocketClient createAdminWebSocketClient() {
+        WebSocketListener wslistener = createAdminWebSocketListener();
+        return createAdminWebSocketClient(wslistener);
+    }
+
     public WebSocketClient createAdminWebSocketClient(WebSocketListener 
wslistener) {
+        AssertArg.notNull(wslistener, "No wslistener");
+        AssertState.isNull(adminWebSocketClient, "WebSocket client already 
created");
         AgentConfiguration agentConfig = getAgentConfiguration();
-        WebSocketClient wsclient = new WebSocketClient(agentConfig, null);
-        wsclient.openWebSocket(wslistener);
-        return wsclient;
+        adminWebSocketClient = new WebSocketClient(agentConfig, null);
+        adminWebSocketClient.openWebSocket(wslistener);
+        adminWebSocketListener = wslistener;
+        return adminWebSocketClient;
+    }
+
+    public WebSocketClient getAdminWebSocketClient() {
+        return adminWebSocketClient;
+    }
+
+    public WebSocketListener getAdminWebSocketListener() {
+        return adminWebSocketListener;
+    }
+
+    public void closeAdminWebSocketClient() {
+        if (adminWebSocketClient != null) {
+            adminWebSocketClient.close();
+            adminWebSocketListener = null;
+            adminWebSocketClient = null;
+        }
     }
 
     public WebSocketClient createWebSocketClient(String walletName, 
WebSocketListener wslistener) {
diff --git 
a/components/camel-hyperledger-aries/src/main/java/org/apache/camel/component/aries/HyperledgerAriesProducer.java
 
b/components/camel-hyperledger-aries/src/main/java/org/apache/camel/component/aries/HyperledgerAriesProducer.java
index fde9b513ef5..b313cf9dcfd 100644
--- 
a/components/camel-hyperledger-aries/src/main/java/org/apache/camel/component/aries/HyperledgerAriesProducer.java
+++ 
b/components/camel-hyperledger-aries/src/main/java/org/apache/camel/component/aries/HyperledgerAriesProducer.java
@@ -22,8 +22,10 @@ import 
org.apache.camel.component.aries.handler.AbstractServiceHandler;
 import org.apache.camel.component.aries.handler.ConnectionsServiceHandler;
 import 
org.apache.camel.component.aries.handler.CredentialDefinitionsServiceHandler;
 import org.apache.camel.component.aries.handler.CredentialsServiceHandler;
+import org.apache.camel.component.aries.handler.DidExchangeServiceHandler;
 import 
org.apache.camel.component.aries.handler.IssueCredentialV1ServiceHandler;
 import org.apache.camel.component.aries.handler.MultitenancyServiceHandler;
+import org.apache.camel.component.aries.handler.OutOfBandServiceHandler;
 import org.apache.camel.component.aries.handler.PresentProofServiceHandler;
 import org.apache.camel.component.aries.handler.RevocationServiceHandler;
 import org.apache.camel.component.aries.handler.SchemasServiceHandler;
@@ -58,12 +60,18 @@ public class HyperledgerAriesProducer extends 
DefaultProducer {
         } else if (service.startsWith("/credentials")) {
             serviceHandler = new CredentialsServiceHandler(getEndpoint());
 
+        } else if (service.startsWith("/didexchange")) {
+            serviceHandler = new DidExchangeServiceHandler(getEndpoint());
+
         } else if (service.startsWith("/issue-credential")) {
             serviceHandler = new 
IssueCredentialV1ServiceHandler(getEndpoint());
 
         } else if (service.startsWith("/multitenancy")) {
             serviceHandler = new MultitenancyServiceHandler(getEndpoint());
 
+        } else if (service.startsWith("/out-of-band")) {
+            serviceHandler = new OutOfBandServiceHandler(getEndpoint());
+
         } else if (service.startsWith("/present-proof")) {
             serviceHandler = new PresentProofServiceHandler(getEndpoint());
 
diff --git 
a/components/camel-hyperledger-aries/src/main/java/org/apache/camel/component/aries/handler/AbstractServiceHandler.java
 
b/components/camel-hyperledger-aries/src/main/java/org/apache/camel/component/aries/handler/AbstractServiceHandler.java
index d3439b3aedb..7e0f0b2cd55 100644
--- 
a/components/camel-hyperledger-aries/src/main/java/org/apache/camel/component/aries/handler/AbstractServiceHandler.java
+++ 
b/components/camel-hyperledger-aries/src/main/java/org/apache/camel/component/aries/handler/AbstractServiceHandler.java
@@ -19,6 +19,7 @@ package org.apache.camel.component.aries.handler;
 import java.io.IOException;
 
 import io.nessus.aries.util.AssertState;
+import io.nessus.aries.websocket.WebSocketListener;
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
 import org.apache.camel.component.aries.HyperledgerAriesComponent;
@@ -118,4 +119,8 @@ public abstract class AbstractServiceHandler implements 
ServiceHandler {
     public AriesClient createClient() throws IOException {
         return endpoint.createClient();
     }
+
+    public WebSocketListener getAdminWebSocketListener() {
+        return getComponent().getAdminWebSocketListener();
+    }
 }
diff --git 
a/components/camel-hyperledger-aries/src/main/java/org/apache/camel/component/aries/handler/DidExchangeServiceHandler.java
 
b/components/camel-hyperledger-aries/src/main/java/org/apache/camel/component/aries/handler/DidExchangeServiceHandler.java
new file mode 100644
index 00000000000..d69307bcdc6
--- /dev/null
+++ 
b/components/camel-hyperledger-aries/src/main/java/org/apache/camel/component/aries/handler/DidExchangeServiceHandler.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aries.handler;
+
+import java.util.concurrent.TimeUnit;
+
+import io.nessus.aries.util.AssertState;
+import io.nessus.aries.websocket.WebSocketListener;
+import org.apache.camel.Exchange;
+import org.apache.camel.component.aries.HyperledgerAriesEndpoint;
+import org.apache.camel.component.aries.UnsupportedServiceException;
+import org.hyperledger.aries.api.connection.ConnectionRecord;
+import org.hyperledger.aries.api.connection.ConnectionState;
+import 
org.hyperledger.aries.api.did_exchange.DidExchangeAcceptInvitationFilter;
+
+public class DidExchangeServiceHandler extends AbstractServiceHandler {
+
+    public DidExchangeServiceHandler(HyperledgerAriesEndpoint endpoint) {
+        super(endpoint);
+    }
+
+    @Override
+    public void process(Exchange exchange, String service) throws Exception {
+
+        if (service.startsWith("/didexchange")) {
+
+            String connectionId = getServicePathToken(service, 1);
+            AssertState.notNull(connectionId, "Null connectionId");
+
+            if (service.endsWith("/accept-invitation")) {
+                DidExchangeAcceptInvitationFilter filter = 
maybeHeader(exchange, DidExchangeAcceptInvitationFilter.class);
+                ConnectionRecord conrec = 
adminClient().didExchangeAcceptInvitation(connectionId, filter).get();
+                WebSocketListener wsevents = getAdminWebSocketListener();
+                if (conrec == null && wsevents != null) {
+                    conrec = wsevents.awaitConnection(
+                            cr -> cr.getState() == ConnectionState.COMPLETED
+                                    && 
cr.getConnectionId().equals(connectionId),
+                            10, TimeUnit.SECONDS)
+                            .findFirst().orElse(null);
+                }
+                AssertState.notNull(conrec, String.format("No ConnectionRecord 
for %s", connectionId));
+                exchange.getIn().setBody(conrec);
+
+            } else if (service.endsWith(connectionId)) {
+                WebSocketListener wsevents = getAdminWebSocketListener();
+                ConnectionRecord conrec = 
createClient().connectionsGetById(connectionId).orElse(null);
+                if (conrec == null && wsevents != null) {
+                    conrec = wsevents.awaitConnection(
+                            cr -> cr.getState() == ConnectionState.COMPLETED
+                                    && 
cr.getConnectionId().equals(connectionId),
+                            10, TimeUnit.SECONDS)
+                            .findFirst().orElse(null);
+                }
+                AssertState.notNull(conrec, String.format("No ConnectionRecord 
for %s", connectionId));
+                exchange.getIn().setBody(conrec);
+
+            } else {
+                throw new UnsupportedServiceException(service);
+            }
+
+        } else {
+            throw new UnsupportedServiceException(service);
+        }
+    }
+}
diff --git 
a/components/camel-hyperledger-aries/src/main/java/org/apache/camel/component/aries/handler/OutOfBandServiceHandler.java
 
b/components/camel-hyperledger-aries/src/main/java/org/apache/camel/component/aries/handler/OutOfBandServiceHandler.java
new file mode 100644
index 00000000000..b4f5fa34fdf
--- /dev/null
+++ 
b/components/camel-hyperledger-aries/src/main/java/org/apache/camel/component/aries/handler/OutOfBandServiceHandler.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aries.handler;
+
+import io.nessus.aries.util.AssertState;
+import org.apache.camel.Exchange;
+import org.apache.camel.component.aries.HyperledgerAriesEndpoint;
+import org.apache.camel.component.aries.UnsupportedServiceException;
+import org.hyperledger.aries.api.connection.ConnectionRecord;
+import org.hyperledger.aries.api.connection.ConnectionState;
+import org.hyperledger.aries.api.out_of_band.InvitationMessage;
+import 
org.hyperledger.aries.api.out_of_band.InvitationMessage.InvitationMessageService;
+import org.hyperledger.aries.api.out_of_band.ReceiveInvitationFilter;
+
+public class OutOfBandServiceHandler extends AbstractServiceHandler {
+
+    public OutOfBandServiceHandler(HyperledgerAriesEndpoint endpoint) {
+        super(endpoint);
+    }
+
+    @Override
+    public void process(Exchange exchange, String service) throws Exception {
+
+        if (service.equals("/out-of-band/receive-invitation")) {
+            @SuppressWarnings("unchecked")
+            InvitationMessage<InvitationMessageService> reqObj = 
assertBody(exchange, InvitationMessage.class);
+            ReceiveInvitationFilter filter = maybeHeader(exchange, 
ReceiveInvitationFilter.class);
+            if (filter == null) {
+                filter = ReceiveInvitationFilter.builder()
+                        .useExistingConnection(false)
+                        .autoAccept(false)
+                        .build();
+            }
+            ConnectionRecord oobRecord = 
createClient().outOfBandReceiveInvitation(reqObj, filter).get();
+            String connectionId = oobRecord.getConnectionId();
+            AssertState.notNull(connectionId);
+            ConnectionRecord resObj = 
adminClient().connections().get().stream()
+                    .filter(cr -> cr.getState() == ConnectionState.INVITATION)
+                    .filter(cr -> cr.getConnectionId().equals(connectionId))
+                    .findFirst().orElse(null);
+            AssertState.notNull(resObj, String.format("No ConnectionRecord for 
%s", connectionId));
+            exchange.getMessage().setBody(resObj);
+
+        } else {
+            throw new UnsupportedServiceException(service);
+        }
+    }
+}
diff --git 
a/components/camel-hyperledger-aries/src/main/java/org/apache/camel/converter/aries/ReceiveInvitationFilterConverter.java
 
b/components/camel-hyperledger-aries/src/main/java/org/apache/camel/converter/aries/ReceiveInvitationFilterConverter.java
new file mode 100644
index 00000000000..10852994a77
--- /dev/null
+++ 
b/components/camel-hyperledger-aries/src/main/java/org/apache/camel/converter/aries/ReceiveInvitationFilterConverter.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.converter.aries;
+
+import java.util.Map;
+
+import com.google.gson.JsonObject;
+import org.apache.camel.Converter;
+import org.hyperledger.aries.api.out_of_band.ReceiveInvitationFilter;
+
+@Converter(generateLoader = true)
+public final class ReceiveInvitationFilterConverter extends 
AbstractAriesConverter {
+
+    @Converter
+    public static ReceiveInvitationFilter toAries(JsonObject jsonObj) {
+        return toAries(jsonObj, ReceiveInvitationFilter.class);
+    }
+
+    @Converter
+    public static ReceiveInvitationFilter toAries(String json) {
+        return toAries(json, ReceiveInvitationFilter.class);
+    }
+
+    @Converter
+    public static ReceiveInvitationFilter toAries(Map<String, Object> map) {
+        return toAries(map, ReceiveInvitationFilter.class);
+    }
+}
diff --git 
a/components/camel-hyperledger-aries/src/test/java/org/apache/camel/component/aries/PresentationExchangeTest.java
 
b/components/camel-hyperledger-aries/src/test/java/org/apache/camel/component/aries/PresentationExchangeTest.java
index 94d9e1975b5..4f11f5c2429 100644
--- 
a/components/camel-hyperledger-aries/src/test/java/org/apache/camel/component/aries/PresentationExchangeTest.java
+++ 
b/components/camel-hyperledger-aries/src/test/java/org/apache/camel/component/aries/PresentationExchangeTest.java
@@ -38,7 +38,8 @@ public class PresentationExchangeTest extends 
AbstractCamelAriesTest {
     @Test
     public void testWorkflow() throws Exception {
 
-        List<PresentationExchangeState> states = Arrays.asList(PROPOSAL_SENT,
+        List<PresentationExchangeState> states = Arrays.asList(
+                PROPOSAL_SENT,
                 PROPOSAL_RECEIVED,
                 REQUEST_SENT,
                 REQUEST_RECEIVED,

Reply via email to