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

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

commit 7fe73207fbbeb2f0674d648325523ad751196b8a
Author: James Netherton <[email protected]>
AuthorDate: Thu Jun 9 08:05:22 2022 +0100

    CAMEL-18044: Switch from deprecated JBossUserMarshaller to 
JavaSerializationMarshaller
---
 camel-dependencies/pom.xml                         |  2 +-
 .../camel-infinispan/camel-infinispan/pom.xml      |  7 +--
 .../InfinispanRemoteAggregationRepository.java     | 15 ++----
 .../DefaultExchangeHolderInitializer.java          | 27 +++++++++++
 .../DefaultExchangeHolderProtoAdapter.java         | 38 +++++++++++++++
 .../protostream/DefaultExchangeHolderUtils.java    | 54 ++++++++++++++++++++++
 parent/pom.xml                                     |  2 +-
 7 files changed, 128 insertions(+), 17 deletions(-)

diff --git a/camel-dependencies/pom.xml b/camel-dependencies/pom.xml
index 9c9027c1e43..77d4bf0893b 100644
--- a/camel-dependencies/pom.xml
+++ b/camel-dependencies/pom.xml
@@ -451,7 +451,7 @@
     <protobuf-maven-plugin-version>0.6.1</protobuf-maven-plugin-version>
     <protobuf-version>3.19.4</protobuf-version>
     <protonpack-version>1.8</protonpack-version>
-    <protostream-version>4.4.1.Final</protostream-version>
+    <protostream-version>4.4.3.Final</protostream-version>
     <pubnub-version>4.25.0</pubnub-version>
     <pulsar-version>2.10.0</pulsar-version>
     <qpid-broker-version>8.0.6</qpid-broker-version>
diff --git a/components/camel-infinispan/camel-infinispan/pom.xml 
b/components/camel-infinispan/camel-infinispan/pom.xml
index 3cf482b074c..01f9754d017 100644
--- a/components/camel-infinispan/camel-infinispan/pom.xml
+++ b/components/camel-infinispan/camel-infinispan/pom.xml
@@ -48,9 +48,10 @@
             <version>${infinispan-version}</version>
         </dependency>
         <dependency>
-            <groupId>org.infinispan</groupId>
-            <artifactId>infinispan-jboss-marshalling</artifactId>
-            <version>${infinispan-version}</version>
+            <groupId>org.infinispan.protostream</groupId>
+            <artifactId>protostream-processor</artifactId>
+            <version>${protostream-version}</version>
+            <scope>provided</scope>
         </dependency>
 
         <!-- testing - camel -->
diff --git 
a/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteAggregationRepository.java
 
b/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteAggregationRepository.java
index 760703bb448..7642c2e31ea 100644
--- 
a/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteAggregationRepository.java
+++ 
b/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteAggregationRepository.java
@@ -19,13 +19,13 @@ package org.apache.camel.component.infinispan.remote;
 import java.util.function.Supplier;
 
 import org.apache.camel.component.infinispan.InfinispanAggregationRepository;
+import 
org.apache.camel.component.infinispan.remote.protostream.DefaultExchangeHolderContextInitializer;
 import org.apache.camel.support.DefaultExchangeHolder;
 import org.apache.camel.support.service.ServiceHelper;
 import org.apache.camel.util.function.Suppliers;
 import org.infinispan.client.hotrod.Flag;
 import org.infinispan.client.hotrod.configuration.ConfigurationBuilder;
 import org.infinispan.commons.api.BasicCache;
-import org.infinispan.jboss.marshalling.core.JBossUserMarshaller;
 
 public class InfinispanRemoteAggregationRepository extends 
InfinispanAggregationRepository {
     private final Supplier<BasicCache<String, DefaultExchangeHolder>> cache;
@@ -54,25 +54,16 @@ public class InfinispanRemoteAggregationRepository extends 
InfinispanAggregation
 
         InfinispanRemoteConfiguration conf = configuration != null ? 
configuration : new InfinispanRemoteConfiguration();
 
-        //
-        // the Aggregation repository uses 
org.apache.camel.support.DefaultExchangeHolder as
-        // "wire format" which is based on java.io.Serializable. Starting from 
Infinispan 11
-        // the Jboss Marshaller has been removed for internal operation and 
deprecated thus
-        // to make DefaultExchangeHolder working, we need to explicit register 
JBoss Marshaller
-        //
-        // TODO: we should re-work DefaultExchangeHolder and make it possible 
to plug a custom
-        //       serialization strategy (i.e. json, protobuf, avro)
-        //
         if (conf.getCacheContainerConfiguration() == null) {
             conf.setCacheContainerConfiguration(
                     new ConfigurationBuilder()
-                            .marshaller(JBossUserMarshaller.class)
+                            .addContextInitializer(new 
DefaultExchangeHolderContextInitializer())
                             .build());
         } else {
             conf.setCacheContainerConfiguration(
                     new ConfigurationBuilder()
                             .read(conf.getCacheContainerConfiguration())
-                            .marshaller(JBossUserMarshaller.class)
+                            .addContextInitializer(new 
DefaultExchangeHolderContextInitializer())
                             .build());
         }
 
diff --git 
a/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/protostream/DefaultExchangeHolderInitializer.java
 
b/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/protostream/DefaultExchangeHolderInitializer.java
new file mode 100644
index 00000000000..92beded0a30
--- /dev/null
+++ 
b/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/protostream/DefaultExchangeHolderInitializer.java
@@ -0,0 +1,27 @@
+/*
+ * 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.infinispan.remote.protostream;
+
+import org.infinispan.protostream.SerializationContextInitializer;
+import org.infinispan.protostream.annotations.AutoProtoSchemaBuilder;
+
+@AutoProtoSchemaBuilder(
+                        includeClasses = { 
DefaultExchangeHolderProtoAdapter.class },
+                        className = "DefaultExchangeHolderContextInitializer",
+                        schemaPackageName = "org.apache.camel.support")
+interface DefaultExchangeHolderInitializer extends 
SerializationContextInitializer {
+}
diff --git 
a/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/protostream/DefaultExchangeHolderProtoAdapter.java
 
b/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/protostream/DefaultExchangeHolderProtoAdapter.java
new file mode 100644
index 00000000000..623af277553
--- /dev/null
+++ 
b/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/protostream/DefaultExchangeHolderProtoAdapter.java
@@ -0,0 +1,38 @@
+/*
+ * 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.infinispan.remote.protostream;
+
+import org.apache.camel.support.DefaultExchangeHolder;
+import org.infinispan.protostream.annotations.ProtoAdapter;
+import org.infinispan.protostream.annotations.ProtoFactory;
+import org.infinispan.protostream.annotations.ProtoField;
+
+/**
+ * Custom {@link ProtoAdapter} to serialize / deserialize {@link 
DefaultExchangeHolder} to / from byte[].
+ */
+@ProtoAdapter(DefaultExchangeHolder.class)
+final class DefaultExchangeHolderProtoAdapter {
+    @ProtoFactory
+    public DefaultExchangeHolder create(byte[] serializedExchangeHolderBytes) {
+        return 
DefaultExchangeHolderUtils.deserialize(serializedExchangeHolderBytes);
+    }
+
+    @ProtoField(number = 1, required = true)
+    public byte[] serializedExchangeHolderBytes(DefaultExchangeHolder 
defaultExchangeHolder) {
+        return DefaultExchangeHolderUtils.serialize(defaultExchangeHolder);
+    }
+}
diff --git 
a/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/protostream/DefaultExchangeHolderUtils.java
 
b/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/protostream/DefaultExchangeHolderUtils.java
new file mode 100644
index 00000000000..b439ed62301
--- /dev/null
+++ 
b/components/camel-infinispan/camel-infinispan/src/main/java/org/apache/camel/component/infinispan/remote/protostream/DefaultExchangeHolderUtils.java
@@ -0,0 +1,54 @@
+/*
+ * 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.infinispan.remote.protostream;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+import org.apache.camel.support.DefaultExchangeHolder;
+import org.apache.camel.util.ClassLoadingAwareObjectInputStream;
+
+/**
+ * Utilities for {@link DefaultExchangeHolder} and the Infinispan Protostream 
marshaller.
+ */
+final class DefaultExchangeHolderUtils {
+
+    private DefaultExchangeHolderUtils() {
+        // Utility class
+    }
+
+    static byte[] serialize(DefaultExchangeHolder holder) {
+        try (ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
ObjectOutputStream oos = new ObjectOutputStream(baos)) {
+            oos.writeObject(holder);
+            return baos.toByteArray();
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    static DefaultExchangeHolder deserialize(byte[] bytes) {
+        try (ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
+             ObjectInputStream ois = new 
ClassLoadingAwareObjectInputStream(bais)) {
+            return (DefaultExchangeHolder) ois.readObject();
+        } catch (IOException | ClassNotFoundException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}
diff --git a/parent/pom.xml b/parent/pom.xml
index 3c79bbfd664..8263f5c0c3b 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -438,7 +438,7 @@
         <protobuf-version>3.19.4</protobuf-version>
         <protobuf-maven-plugin-version>0.6.1</protobuf-maven-plugin-version>
         <protonpack-version>1.8</protonpack-version>
-        <protostream-version>4.4.1.Final</protostream-version>
+        <protostream-version>4.4.3.Final</protostream-version>
         <pubnub-version>4.25.0</pubnub-version>
         <pulsar-version>2.10.0</pulsar-version>
         <qpid-broker-version>8.0.6</qpid-broker-version>

Reply via email to