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 <[email protected]>
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,