This is an automated email from the ASF dual-hosted git repository. jamesnetherton pushed a commit to branch camel-3.14.x in repository https://gitbox.apache.org/repos/asf/camel.git
commit a9398ec2760c12a8203a904eba6e07c82a99453b Author: James Netherton <[email protected]> AuthorDate: Fri Apr 8 14:12:32 2022 +0100 CAMEL-17935: Use ClassLoadingAwareObjectInputStream in CassandraCamelCodec --- .../aggregate/cassandra/CassandraCamelCodec.java | 8 ++-- .../processor/aggregate/jdbc/JdbcCamelCodec.java | 3 +- .../ClassLoadingAwareObjectInputStreamTest.java | 4 +- .../util}/ClassLoadingAwareObjectInputStream.java | 13 +++--- .../ClassLoadingAwareObjectInputStreamTest.java | 53 +++++----------------- 5 files changed, 28 insertions(+), 53 deletions(-) diff --git a/components/camel-cassandraql/src/main/java/org/apache/camel/processor/aggregate/cassandra/CassandraCamelCodec.java b/components/camel-cassandraql/src/main/java/org/apache/camel/processor/aggregate/cassandra/CassandraCamelCodec.java index 464a2de1b2a..ecf05e36d54 100644 --- a/components/camel-cassandraql/src/main/java/org/apache/camel/processor/aggregate/cassandra/CassandraCamelCodec.java +++ b/components/camel-cassandraql/src/main/java/org/apache/camel/processor/aggregate/cassandra/CassandraCamelCodec.java @@ -30,6 +30,7 @@ import org.apache.camel.ExchangePropertyKey; import org.apache.camel.ExtendedExchange; import org.apache.camel.support.DefaultExchange; import org.apache.camel.support.DefaultExchangeHolder; +import org.apache.camel.util.ClassLoadingAwareObjectInputStream; /** * Marshall/unmarshall Exchange to/from a ByteBuffer. Inspired from JdbcCamelCodec. @@ -64,7 +65,7 @@ public class CassandraCamelCodec { public Exchange unmarshallExchange(CamelContext camelContext, ByteBuffer buffer) throws IOException, ClassNotFoundException { - DefaultExchangeHolder pe = (DefaultExchangeHolder) deserialize(new ByteBufferInputStream(buffer)); + DefaultExchangeHolder pe = (DefaultExchangeHolder) deserialize(camelContext, new ByteBufferInputStream(buffer)); Exchange answer = new DefaultExchange(camelContext); DefaultExchangeHolder.unmarshal(answer, pe); // restore the from endpoint @@ -86,8 +87,9 @@ public class CassandraCamelCodec { return bytesOut.toByteArray(); } - private Object deserialize(InputStream bytes) throws IOException, ClassNotFoundException { - ObjectInputStream objectIn = new ObjectInputStream(bytes); + private Object deserialize(CamelContext camelContext, InputStream bytes) throws IOException, ClassNotFoundException { + ClassLoader classLoader = camelContext.getApplicationContextClassLoader(); + ObjectInputStream objectIn = new ClassLoadingAwareObjectInputStream(classLoader, bytes); Object object = objectIn.readObject(); objectIn.close(); return object; diff --git a/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/JdbcCamelCodec.java b/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/JdbcCamelCodec.java index 3af195b614c..a247591d516 100644 --- a/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/JdbcCamelCodec.java +++ b/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/JdbcCamelCodec.java @@ -31,6 +31,7 @@ import org.apache.camel.ExchangePropertyKey; import org.apache.camel.ExtendedExchange; import org.apache.camel.support.DefaultExchange; import org.apache.camel.support.DefaultExchangeHolder; +import org.apache.camel.util.ClassLoadingAwareObjectInputStream; import org.apache.camel.util.IOHelper; /** @@ -104,7 +105,7 @@ public class JdbcCamelCodec { ObjectInputStream objectIn = null; Object obj = null; try { - objectIn = new ClassLoadingAwareObjectInputStream(camelContext, bytesIn); + objectIn = new ClassLoadingAwareObjectInputStream(camelContext.getApplicationContextClassLoader(), bytesIn); obj = objectIn.readObject(); } finally { IOHelper.close(objectIn); diff --git a/components/camel-sql/src/test/java/org/apache/camel/processor/aggregate/jdbc/ClassLoadingAwareObjectInputStreamTest.java b/components/camel-sql/src/test/java/org/apache/camel/processor/aggregate/jdbc/ClassLoadingAwareObjectInputStreamTest.java index 289785a19b5..9e24dc1728a 100644 --- a/components/camel-sql/src/test/java/org/apache/camel/processor/aggregate/jdbc/ClassLoadingAwareObjectInputStreamTest.java +++ b/components/camel-sql/src/test/java/org/apache/camel/processor/aggregate/jdbc/ClassLoadingAwareObjectInputStreamTest.java @@ -30,6 +30,7 @@ import org.apache.camel.CamelContext; import org.apache.camel.impl.DefaultCamelContext; import org.apache.camel.support.DefaultExchange; import org.apache.camel.support.DefaultExchangeHolder; +import org.apache.camel.util.ClassLoadingAwareObjectInputStream; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -55,7 +56,8 @@ public class ClassLoadingAwareObjectInputStreamTest { oos.flush(); final byte[] serialized = baos.toByteArray(); - final ObjectInputStream bis = new ClassLoadingAwareObjectInputStream(context, new ByteArrayInputStream(serialized)); + final ObjectInputStream bis = new ClassLoadingAwareObjectInputStream( + context.getApplicationContextClassLoader(), new ByteArrayInputStream(serialized)); final DefaultExchangeHolder deserialized = (DefaultExchangeHolder) bis.readObject(); final DefaultExchange exchange2 = new DefaultExchange(context); diff --git a/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/ClassLoadingAwareObjectInputStream.java b/core/camel-util/src/main/java/org/apache/camel/util/ClassLoadingAwareObjectInputStream.java similarity index 92% rename from components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/ClassLoadingAwareObjectInputStream.java rename to core/camel-util/src/main/java/org/apache/camel/util/ClassLoadingAwareObjectInputStream.java index c429fe0a3ba..a9ef057993e 100644 --- a/components/camel-sql/src/main/java/org/apache/camel/processor/aggregate/jdbc/ClassLoadingAwareObjectInputStream.java +++ b/core/camel-util/src/main/java/org/apache/camel/util/ClassLoadingAwareObjectInputStream.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.processor.aggregate.jdbc; +package org.apache.camel.util; import java.io.IOException; import java.io.InputStream; @@ -23,8 +23,6 @@ import java.io.ObjectStreamClass; import java.lang.reflect.Proxy; import java.util.HashMap; -import org.apache.camel.CamelContext; - /** * This class is copied from the Apache ActiveMQ project. */ @@ -38,7 +36,6 @@ public class ClassLoadingAwareObjectInputStream extends ObjectInputStream { */ private static final HashMap<String, Class> PRIM_CLASSES = new HashMap<>(8, 1.0F); - private CamelContext camelContext; private final ClassLoader inLoader; public ClassLoadingAwareObjectInputStream(InputStream in) throws IOException { @@ -46,9 +43,13 @@ public class ClassLoadingAwareObjectInputStream extends ObjectInputStream { inLoader = in.getClass().getClassLoader(); } - public ClassLoadingAwareObjectInputStream(CamelContext camelContext, InputStream in) throws IOException { + public ClassLoadingAwareObjectInputStream(ClassLoader classLoader, InputStream in) throws IOException { super(in); - inLoader = camelContext.getApplicationContextClassLoader(); + if (classLoader != null) { + inLoader = classLoader; + } else { + inLoader = in.getClass().getClassLoader(); + } } @Override diff --git a/components/camel-sql/src/test/java/org/apache/camel/processor/aggregate/jdbc/ClassLoadingAwareObjectInputStreamTest.java b/core/camel-util/src/test/java/org/apache/camel/util/ClassLoadingAwareObjectInputStreamTest.java similarity index 53% copy from components/camel-sql/src/test/java/org/apache/camel/processor/aggregate/jdbc/ClassLoadingAwareObjectInputStreamTest.java copy to core/camel-util/src/test/java/org/apache/camel/util/ClassLoadingAwareObjectInputStreamTest.java index 289785a19b5..536397f445f 100644 --- a/components/camel-sql/src/test/java/org/apache/camel/processor/aggregate/jdbc/ClassLoadingAwareObjectInputStreamTest.java +++ b/core/camel-util/src/test/java/org/apache/camel/util/ClassLoadingAwareObjectInputStreamTest.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.processor.aggregate.jdbc; +package org.apache.camel.util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -22,14 +22,8 @@ import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.util.Objects; -import org.apache.camel.CamelContext; -import org.apache.camel.impl.DefaultCamelContext; -import org.apache.camel.support.DefaultExchange; -import org.apache.camel.support.DefaultExchangeHolder; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -38,42 +32,24 @@ public class ClassLoadingAwareObjectInputStreamTest { @Test public void deserialize() throws IOException, ClassNotFoundException { - CamelContext context = new DefaultCamelContext(); - - final DefaultExchange exchange = new DefaultExchange(context); - - final List<MyObject> objects = new ArrayList<>(); - final MyObject o = new MyObject("leb", "hello".getBytes()); - objects.add(o); - - exchange.getIn().setBody(objects); - final DefaultExchangeHolder deh = DefaultExchangeHolder.marshal(exchange); - + final MyObject myObject = new MyObject("Test content"); final ByteArrayOutputStream baos = new ByteArrayOutputStream(); final ObjectOutputStream oos = new ObjectOutputStream(baos); - oos.writeObject(deh); + oos.writeObject(myObject); oos.flush(); final byte[] serialized = baos.toByteArray(); - final ObjectInputStream bis = new ClassLoadingAwareObjectInputStream(context, new ByteArrayInputStream(serialized)); - final DefaultExchangeHolder deserialized = (DefaultExchangeHolder) bis.readObject(); - - final DefaultExchange exchange2 = new DefaultExchange(context); - DefaultExchangeHolder.unmarshal(exchange2, deserialized); + final ObjectInputStream bis = new ClassLoadingAwareObjectInputStream(new ByteArrayInputStream(serialized)); + final MyObject deserialized = (MyObject) bis.readObject(); - List<MyObject> receivedObjects = exchange2.getIn().getBody(List.class); - assertEquals(1, receivedObjects.size()); - assertEquals(o, receivedObjects.get(0)); + assertEquals(myObject, deserialized); } - } class MyObject implements Serializable { - final String name; - final byte[] content; + final String content; - MyObject(String name, byte[] content) { - this.name = name; + MyObject(String content) { this.content = content; } @@ -85,19 +61,12 @@ class MyObject implements Serializable { if (o == null || getClass() != o.getClass()) { return false; } - MyObject myObject = (MyObject) o; - - if (name != null ? !name.equals(myObject.name) : myObject.name != null) { - return false; - } - return Arrays.equals(content, myObject.content); + return Objects.equals(content, myObject.content); } @Override public int hashCode() { - int result = name != null ? name.hashCode() : 0; - result = 31 * result + Arrays.hashCode(content); - return result; + return Objects.hash(content); } }
