infinispan/CVE-2016-0750.patch

2317 lines
130 KiB
Diff
Raw Normal View History

From 2cd79d71282095dbca86878ef23e3a75a733fa67 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Galder=20Zamarren=CC=83o?= <galder@zamarreno.com>
Date: Wed, 3 May 2017 15:41:18 +0200
Subject: [PATCH] ISPN-7781 Add java deserial white list for client
* Added new option to Hot Rod client that enables a list of regular
expressions to be plugged that define classes that can be deserialized
using standard Java serialization.
---
.../client/hotrod/RemoteCacheManager.java | 4 +-
.../AbstractConfigurationChildBuilder.java | 5 ++
.../hotrod/configuration/Configuration.java | 13 ++-
.../configuration/ConfigurationBuilder.java | 22 ++++-
.../ConfigurationChildBuilder.java | 7 ++
.../hotrod/event/ClientListenerNotifier.java | 11 ++-
.../hotrod/impl/ConfigurationProperties.java | 1 +
.../hotrod/impl/iteration/KeyTracker.java | 3 +-
.../impl/iteration/NoOpSegmentKeyTracker.java | 3 +-
.../hotrod/impl/iteration/ReplKeyTracker.java | 3 +-
.../impl/iteration/SegmentKeyTracker.java | 5 +-
.../impl/operations/AbstractKeyOperation.java | 7 +-
.../operations/AbstractKeyValueOperation.java | 6 +-
.../AddClientListenerOperation.java | 7 +-
.../operations/AuthMechListOperation.java | 5 +-
.../hotrod/impl/operations/AuthOperation.java | 6 +-
.../impl/operations/BulkGetKeysOperation.java | 8 +-
.../impl/operations/BulkGetOperation.java | 10 ++-
.../impl/operations/ClearOperation.java | 5 +-
.../impl/operations/ContainsKeyOperation.java | 7 +-
.../impl/operations/ExecuteOperation.java | 60 +++++++-------
.../FaultTolerantPingOperation.java | 8 +-
.../impl/operations/GetAllOperation.java | 9 ++-
.../operations/GetAllParallelOperation.java | 7 +-
.../hotrod/impl/operations/GetOperation.java | 8 +-
.../operations/GetWithMetadataOperation.java | 10 ++-
.../operations/GetWithVersionOperation.java | 10 ++-
.../impl/operations/HotRodOperation.java | 6 +-
.../operations/IterationEndOperation.java | 8 +-
.../operations/IterationNextOperation.java | 14 ++--
.../operations/IterationStartOperation.java | 5 +-
.../impl/operations/OperationsFactory.java | 80 +++++++++++--------
.../operations/ParallelHotRodOperation.java | 5 +-
.../hotrod/impl/operations/PingOperation.java | 9 ++-
.../impl/operations/PutAllOperation.java | 6 +-
.../operations/PutAllParallelOperation.java | 8 +-
.../impl/operations/PutIfAbsentOperation.java | 7 +-
.../hotrod/impl/operations/PutOperation.java | 6 +-
.../impl/operations/QueryOperation.java | 5 +-
.../RemoveClientListenerOperation.java | 4 +-
.../RemoveIfUnmodifiedOperation.java | 7 +-
.../impl/operations/RemoveOperation.java | 5 +-
.../ReplaceIfUnmodifiedOperation.java | 5 +-
.../impl/operations/ReplaceOperation.java | 9 ++-
.../operations/RetryOnFailureOperation.java | 5 +-
.../hotrod/impl/operations/SizeOperation.java | 5 +-
.../impl/operations/StatsOperation.java | 6 +-
.../client/hotrod/impl/protocol/Codec.java | 9 ++-
.../client/hotrod/impl/protocol/Codec10.java | 13 +--
.../client/hotrod/impl/protocol/Codec20.java | 26 +++---
.../client/hotrod/impl/protocol/Codec21.java | 13 +--
.../hotrod/impl/protocol/CodecUtils.java | 5 +-
.../tcp/SaslTransportObjectFactory.java | 40 +++++-----
.../transport/tcp/TcpTransportFactory.java | 4 +-
.../transport/tcp/TransportObjectFactory.java | 7 +-
.../infinispan/client/hotrod/logging/Log.java | 4 +
.../hotrod/marshall/MarshallerUtil.java | 62 ++++++++++++--
.../hotrod/TransportObjectFactoryTest.java | 5 +-
.../configuration/ConfigurationTest.java | 12 ++-
.../MultiServerDistRemoteIteratorTest.java | 2 +-
.../hotrod/retry/RetryOnFailureUnitTest.java | 3 +-
.../CompatibilityCacheFactory.java | 1 +
62 files changed, 423 insertions(+), 238 deletions(-)
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/RemoteCacheManager.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/RemoteCacheManager.java
index 4f354c1..f266c7e 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/RemoteCacheManager.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/RemoteCacheManager.java
@@ -576,7 +576,7 @@ public void start() {
asyncExecutorService = executorFactory.getExecutor(configuration.asyncExecutorFactory().properties());
}
- listenerNotifier = ClientListenerNotifier.create(codec, marshaller);
+ listenerNotifier = ClientListenerNotifier.create(codec, marshaller, configuration.serialWhitelist());
transportFactory.start(codec, configuration, defaultCacheTopologyId, listenerNotifier);
synchronized (cacheName2RemoteCache) {
@@ -704,7 +704,7 @@ private void startRemoteCache(RemoteCacheHolder remoteCacheHolder) {
RemoteCacheImpl<?, ?> remoteCache = remoteCacheHolder.remoteCache;
OperationsFactory operationsFactory = new OperationsFactory(
transportFactory, remoteCache.getName(), remoteCacheHolder.forceReturnValue, codec, listenerNotifier,
- asyncExecutorService);
+ asyncExecutorService, configuration);
remoteCache.init(marshaller, asyncExecutorService, operationsFactory, configuration.keySizeEstimate(), configuration.valueSizeEstimate());
}
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/configuration/AbstractConfigurationChildBuilder.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/configuration/AbstractConfigurationChildBuilder.java
index c2628c6..7df00ac 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/configuration/AbstractConfigurationChildBuilder.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/configuration/AbstractConfigurationChildBuilder.java
@@ -156,6 +156,11 @@ public ConfigurationBuilder maxRetries(int retriesPerServer) {
return builder.maxRetries(retriesPerServer);
}
+ @Override
+ public ConfigurationBuilder addJavaSerialWhiteList(String... regExs) {
+ return builder.addJavaSerialWhiteList(regExs);
+ }
+
@Override
public ConfigurationBuilder withProperties(Properties properties) {
return builder.withProperties(properties);
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/configuration/Configuration.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/configuration/Configuration.java
index 5f76362..28a5ed1 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/configuration/Configuration.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/configuration/Configuration.java
@@ -45,12 +45,13 @@
private final int maxRetries;
private final NearCacheConfiguration nearCache;
private final List<ClusterConfiguration> clusters;
+ private final List<String> serialWhitelist;
Configuration(ExecutorFactoryConfiguration asyncExecutorFactory, Class<? extends RequestBalancingStrategy> balancingStrategyClass, FailoverRequestBalancingStrategy balancingStrategy, ClassLoader classLoader,
ConnectionPoolConfiguration connectionPool, int connectionTimeout, Class<? extends ConsistentHash>[] consistentHashImpl, boolean forceReturnValues, int keySizeEstimate, Class<? extends Marshaller> marshallerClass,
boolean pingOnStartup, String protocolVersion, List<ServerConfiguration> servers, int socketTimeout, SecurityConfiguration security, boolean tcpNoDelay, boolean tcpKeepAlive,
Class<? extends TransportFactory> transportFactory, int valueSizeEstimate, int maxRetries, NearCacheConfiguration nearCache,
- List<ClusterConfiguration> clusters) {
+ List<ClusterConfiguration> clusters, List<String> serialWhitelist) {
this.asyncExecutorFactory = asyncExecutorFactory;
this.balancingStrategyClass = balancingStrategyClass;
this.balancingStrategy = balancingStrategy;
@@ -74,13 +75,14 @@
this.valueSizeEstimate = valueSizeEstimate;
this.nearCache = nearCache;
this.clusters = clusters;
+ this.serialWhitelist = serialWhitelist;
}
Configuration(ExecutorFactoryConfiguration asyncExecutorFactory, Class<? extends RequestBalancingStrategy> balancingStrategyClass, FailoverRequestBalancingStrategy balancingStrategy, ClassLoader classLoader,
ConnectionPoolConfiguration connectionPool, int connectionTimeout, Class<? extends ConsistentHash>[] consistentHashImpl, boolean forceReturnValues, int keySizeEstimate, Marshaller marshaller,
boolean pingOnStartup, String protocolVersion, List<ServerConfiguration> servers, int socketTimeout, SecurityConfiguration security, boolean tcpNoDelay, boolean tcpKeepAlive,
Class<? extends TransportFactory> transportFactory, int valueSizeEstimate, int maxRetries, NearCacheConfiguration nearCache,
- List<ClusterConfiguration> clusters) {
+ List<ClusterConfiguration> clusters, List<String> serialWhitelist) {
this.asyncExecutorFactory = asyncExecutorFactory;
this.balancingStrategyClass = balancingStrategyClass;
this.balancingStrategy = balancingStrategy;
@@ -104,6 +106,7 @@
this.valueSizeEstimate = valueSizeEstimate;
this.nearCache = nearCache;
this.clusters = clusters;
+ this.serialWhitelist = serialWhitelist;
}
public ExecutorFactoryConfiguration asyncExecutorFactory() {
@@ -206,6 +209,10 @@ public int maxRetries() {
return maxRetries;
}
+ public List<String> serialWhitelist() {
+ return serialWhitelist;
+ }
+
@Override
public String toString() {
return "Configuration [asyncExecutorFactory=" + asyncExecutorFactory + ", balancingStrategyClass=" + balancingStrategyClass + ", balancingStrategy=" + balancingStrategy + ",classLoader=" + classLoader + ", connectionPool="
@@ -213,6 +220,8 @@ public String toString() {
+ forceReturnValues + ", keySizeEstimate=" + keySizeEstimate + ", marshallerClass=" + marshallerClass + ", marshaller=" + marshaller + ", pingOnStartup="
+ pingOnStartup + ", protocolVersion=" + protocolVersion + ", servers=" + servers + ", socketTimeout=" + socketTimeout + ", security=" + security + ", tcpNoDelay=" + tcpNoDelay + ", tcpKeepAlive=" + tcpKeepAlive
+ ", transportFactory=" + transportFactory + ", valueSizeEstimate=" + valueSizeEstimate + ", maxRetries=" + maxRetries
+ + ", serialWhiteList=" + serialWhitelist
+ "nearCache=" + nearCache + "]";
}
+
}
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/configuration/ConfigurationBuilder.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/configuration/ConfigurationBuilder.java
index 05f25c7..59fdd48 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/configuration/ConfigurationBuilder.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/configuration/ConfigurationBuilder.java
@@ -2,6 +2,8 @@
import java.lang.ref.WeakReference;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Properties;
@@ -70,6 +72,7 @@
private int valueSizeEstimate = ConfigurationProperties.DEFAULT_VALUE_SIZE;
private int maxRetries = ConfigurationProperties.DEFAULT_MAX_RETRIES;
private final NearCacheConfigurationBuilder nearCache;
+ private final List<String> whiteListRegExs = new ArrayList<>();
private final List<ClusterConfigurationBuilder> clusters = new ArrayList<ClusterConfigurationBuilder>();
@@ -276,6 +279,12 @@ public ConfigurationBuilder maxRetries(int maxRetries) {
return this;
}
+ @Override
+ public ConfigurationBuilder addJavaSerialWhiteList(String... regEx) {
+ this.whiteListRegExs.addAll(Arrays.asList(regEx));
+ return this;
+ }
+
@Override
public ConfigurationBuilder withProperties(Properties properties) {
TypedProperties typed = TypedProperties.toTypedProperties(properties);
@@ -306,6 +315,13 @@ public ConfigurationBuilder withProperties(Properties properties) {
}
this.valueSizeEstimate(typed.getIntProperty(ConfigurationProperties.VALUE_SIZE_ESTIMATE, valueSizeEstimate));
this.maxRetries(typed.getIntProperty(ConfigurationProperties.MAX_RETRIES, maxRetries));
+
+ String serialWhitelist = typed.getProperty(ConfigurationProperties.JAVA_SERIAL_WHITELIST);
+ if (serialWhitelist != null) {
+ String[] classes = serialWhitelist.split(",");
+ Collections.addAll(this.whiteListRegExs, classes);
+ }
+
return this;
}
@@ -343,11 +359,11 @@ public Configuration create() {
if (marshaller == null) {
return new Configuration(asyncExecutorFactory.create(), balancingStrategyClass, balancingStrategy, classLoader == null ? null : classLoader.get(), connectionPool.create(), connectionTimeout,
consistentHashImpl, forceReturnValues, keySizeEstimate, marshallerClass, pingOnStartup, protocolVersion, servers, socketTimeout, security.create(), tcpNoDelay, tcpKeepAlive, transportFactory,
- valueSizeEstimate, maxRetries, nearCache.create(), serverClusterConfigs);
+ valueSizeEstimate, maxRetries, nearCache.create(), serverClusterConfigs, whiteListRegExs);
} else {
return new Configuration(asyncExecutorFactory.create(), balancingStrategyClass, balancingStrategy, classLoader == null ? null : classLoader.get(), connectionPool.create(), connectionTimeout,
consistentHashImpl, forceReturnValues, keySizeEstimate, marshaller, pingOnStartup, protocolVersion, servers, socketTimeout, security.create(), tcpNoDelay, tcpKeepAlive, transportFactory,
- valueSizeEstimate, maxRetries, nearCache.create(), serverClusterConfigs);
+ valueSizeEstimate, maxRetries, nearCache.create(), serverClusterConfigs, whiteListRegExs);
}
}
@@ -391,6 +407,8 @@ public ConfigurationBuilder read(Configuration template) {
this.valueSizeEstimate = template.valueSizeEstimate();
this.maxRetries = template.maxRetries();
this.nearCache.read(template.nearCache());
+ this.whiteListRegExs.addAll(template.serialWhitelist());
+
return this;
}
}
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/configuration/ConfigurationChildBuilder.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/configuration/ConfigurationChildBuilder.java
index eae60d9..13a21ca 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/configuration/ConfigurationChildBuilder.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/configuration/ConfigurationChildBuilder.java
@@ -1,5 +1,6 @@
package org.infinispan.client.hotrod.configuration;
+import java.util.List;
import java.util.Properties;
import org.infinispan.client.hotrod.impl.consistenthash.ConsistentHash;
@@ -168,6 +169,12 @@
*/
ConfigurationBuilder maxRetries(int maxRetries);
+ /**
+ * List of regular expressions for classes that can be deserialized using standard Java deserialization
+ * when reading data that might have been stored with a different endpoint, e.g. REST.
+ */
+ ConfigurationBuilder addJavaSerialWhiteList(String... regEx);
+
/**
* Configures this builder using the specified properties
*/
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/event/ClientListenerNotifier.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/event/ClientListenerNotifier.java
index 7f24878..00a1e2e 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/event/ClientListenerNotifier.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/event/ClientListenerNotifier.java
@@ -60,16 +60,19 @@
private final ExecutorService executor;
private final Codec codec;
private final Marshaller marshaller;
+ private final List<String> whitelist;
- protected ClientListenerNotifier(ExecutorService executor, Codec codec, Marshaller marshaller) {
+ protected ClientListenerNotifier(ExecutorService executor, Codec codec, Marshaller marshaller,
+ List<String> whitelist) {
this.executor = executor;
this.codec = codec;
this.marshaller = marshaller;
+ this.whitelist = whitelist;
}
- public static ClientListenerNotifier create(Codec codec, Marshaller marshaller) {
+ public static ClientListenerNotifier create(Codec codec, Marshaller marshaller, List<String> whitelist) {
ExecutorService executor = Executors.newCachedThreadPool(getRestoreThreadNameThreadFactory());
- return new ClientListenerNotifier(executor, codec, marshaller);
+ return new ClientListenerNotifier(executor, codec, marshaller, whitelist);
}
private static ThreadFactory getRestoreThreadNameThreadFactory() {
@@ -261,7 +264,7 @@ public void run() {
while (!Thread.currentThread().isInterrupted()) {
ClientEvent clientEvent = null;
try {
- clientEvent = codec.readEvent(transport, op.listenerId, marshaller);
+ clientEvent = codec.readEvent(transport, op.listenerId, marshaller, whitelist);
invokeClientEvent(clientEvent);
// Nullify event, makes it easier to identify network vs invocation error messages
clientEvent = null;
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/ConfigurationProperties.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/ConfigurationProperties.java
index 291ea40..8399d74 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/ConfigurationProperties.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/ConfigurationProperties.java
@@ -43,6 +43,7 @@
public static final String TRUST_STORE_FILE_NAME = "infinispan.client.hotrod.trust_store_file_name";
public static final String TRUST_STORE_PASSWORD = "infinispan.client.hotrod.trust_store_password";
public static final String MAX_RETRIES = "infinispan.client.hotrod.max_retries";
+ public static final String JAVA_SERIAL_WHITELIST = "infinispan.client.hotrod.java_serial_whitelist";
// defaults
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/iteration/KeyTracker.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/iteration/KeyTracker.java
index 0e869c3..455a62d 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/iteration/KeyTracker.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/iteration/KeyTracker.java
@@ -1,5 +1,6 @@
package org.infinispan.client.hotrod.impl.iteration;
+import java.util.List;
import java.util.Set;
/**
@@ -8,7 +9,7 @@
*/
public interface KeyTracker {
- boolean track(byte[] key, short status);
+ boolean track(byte[] key, short status, List<String> whitelist);
void segmentsFinished(byte[] finishedSegments);
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/iteration/NoOpSegmentKeyTracker.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/iteration/NoOpSegmentKeyTracker.java
index 1d6bd73..3dc4f5b 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/iteration/NoOpSegmentKeyTracker.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/iteration/NoOpSegmentKeyTracker.java
@@ -1,5 +1,6 @@
package org.infinispan.client.hotrod.impl.iteration;
+import java.util.List;
import java.util.Set;
/**
@@ -9,7 +10,7 @@
class NoOpSegmentKeyTracker implements KeyTracker {
@Override
- public boolean track(byte[] key, short status) {
+ public boolean track(byte[] key, short status, List<String> whitelist) {
return true;
}
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/iteration/ReplKeyTracker.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/iteration/ReplKeyTracker.java
index ec0449d..5e2d2a2 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/iteration/ReplKeyTracker.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/iteration/ReplKeyTracker.java
@@ -3,6 +3,7 @@
import org.infinispan.commons.equivalence.ByteArrayEquivalence;
import org.infinispan.commons.util.CollectionFactory;
+import java.util.List;
import java.util.Set;
/**
@@ -17,7 +18,7 @@
private Set<byte[]> keys = CollectionFactory.makeSet(ByteArrayEquivalence.INSTANCE);
@Override
- public boolean track(byte[] key, short status) {
+ public boolean track(byte[] key, short status, List<String> whitelist) {
return keys.add(key);
}
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/iteration/SegmentKeyTracker.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/iteration/SegmentKeyTracker.java
index 21d4f56..775e475 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/iteration/SegmentKeyTracker.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/iteration/SegmentKeyTracker.java
@@ -12,6 +12,7 @@
import java.util.BitSet;
import java.util.HashSet;
+import java.util.List;
import java.util.Set;
import java.util.concurrent.atomic.AtomicReferenceArray;
import java.util.stream.IntStream;
@@ -39,9 +40,9 @@ public SegmentKeyTracker(Marshaller marshaller, SegmentConsistentHash segmentCon
segmentStream.forEach(i -> keysPerSegment.set(i, CollectionFactory.makeSet(ByteArrayEquivalence.INSTANCE)));
}
- public boolean track(byte[] key, short status) {
+ public boolean track(byte[] key, short status, List<String> whitelist) {
int segment = HotRodConstants.hasCompatibility(status) ?
- segmentConsistentHash.getSegment(MarshallerUtil.bytes2obj(marshaller, key, status)) :
+ segmentConsistentHash.getSegment(MarshallerUtil.bytes2obj(marshaller, key, status, whitelist)) :
segmentConsistentHash.getSegment(key);
boolean result = keysPerSegment.get(segment).add(key);
if (log.isTraceEnabled())
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/AbstractKeyOperation.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/AbstractKeyOperation.java
index 82cd30f..a9127fa 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/AbstractKeyOperation.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/AbstractKeyOperation.java
@@ -5,6 +5,7 @@
import java.util.concurrent.atomic.AtomicInteger;
import net.jcip.annotations.Immutable;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.impl.VersionedOperationResponse;
import org.infinispan.client.hotrod.impl.protocol.Codec;
import org.infinispan.client.hotrod.impl.protocol.HeaderParams;
@@ -29,8 +30,8 @@
protected final byte[] keyBytes;
protected AbstractKeyOperation(Codec codec, TransportFactory transportFactory,
- Object key, byte[] keyBytes, byte[] cacheName, AtomicInteger topologyId, int flags) {
- super(codec, transportFactory, cacheName, topologyId, flags);
+ Object key, byte[] keyBytes, byte[] cacheName, AtomicInteger topologyId, int flags, Configuration cfg) {
+ super(codec, transportFactory, cacheName, topologyId, flags, cfg);
this.key = key;
this.keyBytes = keyBytes;
}
@@ -55,7 +56,7 @@ protected short sendKeyOperation(byte[] key, Transport transport, byte opCode, b
}
protected T returnPossiblePrevValue(Transport transport, short status) {
- return (T) codec.returnPossiblePrevValue(transport, status, flags);
+ return (T) codec.returnPossiblePrevValue(transport, status, flags, cfg.serialWhitelist());
}
protected VersionedOperationResponse returnVersionedOperationResponse(Transport transport, HeaderParams params) {
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/AbstractKeyValueOperation.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/AbstractKeyValueOperation.java
index 039b7a4..597b990 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/AbstractKeyValueOperation.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/AbstractKeyValueOperation.java
@@ -1,6 +1,8 @@
package org.infinispan.client.hotrod.impl.operations;
import net.jcip.annotations.Immutable;
+
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.impl.protocol.Codec;
import org.infinispan.client.hotrod.impl.protocol.HeaderParams;
import org.infinispan.client.hotrod.impl.transport.Transport;
@@ -29,9 +31,9 @@
protected final TimeUnit maxIdleTimeUnit;
protected AbstractKeyValueOperation(Codec codec, TransportFactory transportFactory, Object key, byte[] keyBytes, byte[] cacheName,
- AtomicInteger topologyId, int flags, byte[] value,
+ AtomicInteger topologyId, int flags, Configuration cfg, byte[] value,
long lifespan, TimeUnit lifespanTimeUnit, long maxIdle, TimeUnit maxIdleTimeUnit) {
- super(codec, transportFactory, key, keyBytes, cacheName, topologyId, flags);
+ super(codec, transportFactory, key, keyBytes, cacheName, topologyId, flags, cfg);
this.value = value;
this.lifespan = lifespan;
this.maxIdle = maxIdle;
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/AddClientListenerOperation.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/AddClientListenerOperation.java
index 2872a9c..c401224 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/AddClientListenerOperation.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/AddClientListenerOperation.java
@@ -2,6 +2,7 @@
import org.infinispan.client.hotrod.RemoteCacheManager;
import org.infinispan.client.hotrod.annotation.ClientListener;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.event.ClientEvent;
import org.infinispan.client.hotrod.event.ClientListenerNotifier;
import org.infinispan.client.hotrod.impl.protocol.Codec;
@@ -43,10 +44,10 @@
public final byte[][] converterFactoryParams;
protected AddClientListenerOperation(Codec codec, TransportFactory transportFactory,
- String cacheName, AtomicInteger topologyId, int flags,
+ String cacheName, AtomicInteger topologyId, int flags, Configuration cfg,
ClientListenerNotifier listenerNotifier, Object listener,
byte[][] filterFactoryParams, byte[][] converterFactoryParams) {
- super(codec, transportFactory, RemoteCacheManager.cacheNameBytes(cacheName), topologyId, flags);
+ super(codec, transportFactory, RemoteCacheManager.cacheNameBytes(cacheName), topologyId, flags, cfg);
this.listenerId = generateListenerId();
this.listenerNotifier = listenerNotifier;
this.listener = listener;
@@ -92,7 +93,7 @@ protected Short executeOperation(Transport transport) {
Either<Short, ClientEvent> either;
do {
// Process state transfer related events or add listener response
- either = codec.readHeaderOrEvent(dedicatedTransport, params, listenerId, listenerNotifier.getMarshaller());
+ either = codec.readHeaderOrEvent(dedicatedTransport, params, listenerId, listenerNotifier.getMarshaller(), cfg.serialWhitelist());
switch(either.type()) {
case LEFT:
if (HotRodConstants.isSuccess(either.left()))
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/AuthMechListOperation.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/AuthMechListOperation.java
index 76c14c1..ab143ef 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/AuthMechListOperation.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/AuthMechListOperation.java
@@ -6,6 +6,7 @@
import net.jcip.annotations.Immutable;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.impl.protocol.Codec;
import org.infinispan.client.hotrod.impl.protocol.HeaderParams;
import org.infinispan.client.hotrod.impl.transport.Transport;
@@ -21,8 +22,8 @@
private final Transport transport;
- public AuthMechListOperation(Codec codec, AtomicInteger topologyId, Transport transport) {
- super(codec, 0, DEFAULT_CACHE_NAME_BYTES, topologyId);
+ public AuthMechListOperation(Codec codec, AtomicInteger topologyId, Configuration cfg, Transport transport) {
+ super(codec, 0, cfg, DEFAULT_CACHE_NAME_BYTES, topologyId);
this.transport = transport;
}
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/AuthOperation.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/AuthOperation.java
index 24c8a3e..4e2a78f 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/AuthOperation.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/AuthOperation.java
@@ -4,6 +4,7 @@
import net.jcip.annotations.Immutable;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.impl.protocol.Codec;
import org.infinispan.client.hotrod.impl.protocol.HeaderParams;
import org.infinispan.client.hotrod.impl.transport.Transport;
@@ -21,8 +22,9 @@
private final String saslMechanism;
private final byte[] response;
- public AuthOperation(Codec codec, AtomicInteger topologyId, Transport transport, String saslMechanism, byte response[]) {
- super(codec, 0, DEFAULT_CACHE_NAME_BYTES, topologyId);
+ public AuthOperation(Codec codec, AtomicInteger topologyId, Configuration cfg, Transport transport,
+ String saslMechanism, byte response[]) {
+ super(codec, 0, cfg, DEFAULT_CACHE_NAME_BYTES, topologyId);
this.transport = transport;
this.saslMechanism = saslMechanism;
this.response = response;
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/BulkGetKeysOperation.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/BulkGetKeysOperation.java
index 93bc08a..14b810f 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/BulkGetKeysOperation.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/BulkGetKeysOperation.java
@@ -5,6 +5,7 @@
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.impl.protocol.Codec;
import org.infinispan.client.hotrod.impl.protocol.HeaderParams;
import org.infinispan.client.hotrod.impl.transport.Transport;
@@ -19,8 +20,9 @@
public class BulkGetKeysOperation<K> extends RetryOnFailureOperation<Set<K>> {
private final int scope;
- public BulkGetKeysOperation(Codec codec, TransportFactory transportFactory, byte[] cacheName, AtomicInteger topologyId, int flags, int scope) {
- super(codec, transportFactory, cacheName, topologyId, flags);
+ public BulkGetKeysOperation(Codec codec, TransportFactory transportFactory, byte[] cacheName,
+ AtomicInteger topologyId, int flags, Configuration cfg, int scope) {
+ super(codec, transportFactory, cacheName, topologyId, flags, cfg);
this.scope = scope;
}
@@ -37,7 +39,7 @@ protected Transport getTransport(int retryCount, Set<SocketAddress> failedServer
short status = readHeaderAndValidate(transport, params);
Set<K> result = new HashSet<K>();
while ( transport.readByte() == 1) { //there's more!
- result.add(codec.readUnmarshallByteArray(transport, status));
+ result.add(codec.readUnmarshallByteArray(transport, status, cfg.serialWhitelist()));
}
return result;
}
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/BulkGetOperation.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/BulkGetOperation.java
index ee361fd..5908091 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/BulkGetOperation.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/BulkGetOperation.java
@@ -1,5 +1,6 @@
package org.infinispan.client.hotrod.impl.operations;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.impl.protocol.Codec;
import org.infinispan.client.hotrod.impl.protocol.HeaderParams;
import org.infinispan.client.hotrod.impl.transport.Transport;
@@ -21,8 +22,9 @@
private final int entryCount;
- public BulkGetOperation(Codec codec, TransportFactory transportFactory, byte[] cacheName, AtomicInteger topologyId, int flags, int entryCount) {
- super(codec, transportFactory, cacheName, topologyId, flags);
+ public BulkGetOperation(Codec codec, TransportFactory transportFactory, byte[] cacheName, AtomicInteger topologyId,
+ int flags, Configuration cfg, int entryCount) {
+ super(codec, transportFactory, cacheName, topologyId, flags, cfg);
this.entryCount = entryCount;
}
@@ -39,8 +41,8 @@ protected Transport getTransport(int retryCount, Set<SocketAddress> failedServer
short status = readHeaderAndValidate(transport, params);
Map<K, V> result = new HashMap<K, V>();
while ( transport.readByte() == 1) { //there's more!
- K key = codec.readUnmarshallByteArray(transport, status);
- V value = codec.readUnmarshallByteArray(transport, status);
+ K key = codec.readUnmarshallByteArray(transport, status, cfg.serialWhitelist());
+ V value = codec.readUnmarshallByteArray(transport, status, cfg.serialWhitelist());
result.put(key, value);
}
return result;
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/ClearOperation.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/ClearOperation.java
index 01b4c6c..0523897 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/ClearOperation.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/ClearOperation.java
@@ -1,6 +1,7 @@
package org.infinispan.client.hotrod.impl.operations;
import net.jcip.annotations.Immutable;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.impl.protocol.Codec;
import org.infinispan.client.hotrod.impl.protocol.HeaderParams;
import org.infinispan.client.hotrod.impl.transport.Transport;
@@ -20,8 +21,8 @@
public class ClearOperation extends RetryOnFailureOperation<Void> {
public ClearOperation(Codec codec, TransportFactory transportFactory,
- byte[] cacheName, AtomicInteger topologyId, int flags) {
- super(codec, transportFactory, cacheName, topologyId, flags);
+ byte[] cacheName, AtomicInteger topologyId, int flags, Configuration cfg) {
+ super(codec, transportFactory, cacheName, topologyId, flags, cfg);
}
@Override
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/ContainsKeyOperation.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/ContainsKeyOperation.java
index 32c1c72..221863d 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/ContainsKeyOperation.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/ContainsKeyOperation.java
@@ -1,6 +1,7 @@
package org.infinispan.client.hotrod.impl.operations;
import net.jcip.annotations.Immutable;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.impl.protocol.Codec;
import org.infinispan.client.hotrod.impl.protocol.HotRodConstants;
import org.infinispan.client.hotrod.impl.transport.Transport;
@@ -17,9 +18,9 @@
@Immutable
public class ContainsKeyOperation extends AbstractKeyOperation<Boolean> {
- public ContainsKeyOperation(Codec codec, TransportFactory transportFactory,
- Object key, byte[] keyBytes, byte[] cacheName, AtomicInteger topologyId, int flags) {
- super(codec, transportFactory, key, keyBytes,cacheName, topologyId, flags);
+ public ContainsKeyOperation(Codec codec, TransportFactory transportFactory, Object key, byte[] keyBytes,
+ byte[] cacheName, AtomicInteger topologyId, int flags, Configuration cfg) {
+ super(codec, transportFactory, key, keyBytes,cacheName, topologyId, flags, cfg);
}
@Override
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/ExecuteOperation.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/ExecuteOperation.java
index 995ed0e..8136ad1 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/ExecuteOperation.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/ExecuteOperation.java
@@ -6,6 +6,7 @@
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.impl.protocol.Codec;
import org.infinispan.client.hotrod.impl.protocol.HeaderParams;
import org.infinispan.client.hotrod.impl.transport.Transport;
@@ -19,34 +20,35 @@
*/
public class ExecuteOperation<T> extends RetryOnFailureOperation<T> {
- private final String taskName;
- private final Map<String, byte[]> marshalledParams;
-
- protected ExecuteOperation(Codec codec, TransportFactory transportFactory,
- byte[] cacheName, AtomicInteger topologyId, int flags, String taskName, Map<String, byte[]> marshalledParams) {
- super(codec, transportFactory, cacheName, topologyId, flags);
- this.taskName = taskName;
- this.marshalledParams = marshalledParams;
- }
-
- @Override
- protected Transport getTransport(int retryCount,
- Set<SocketAddress> failedServers) {
- return transportFactory.getTransport(failedServers, cacheName);
- }
-
- @Override
- protected T executeOperation(Transport transport) {
- HeaderParams params = writeHeader(transport, EXEC_REQUEST);
- transport.writeString(taskName);
- transport.writeVInt(marshalledParams.size());
- for(Entry<String, byte[]> entry : marshalledParams.entrySet()) {
- transport.writeString(entry.getKey());
- transport.writeArray(entry.getValue());
- }
- transport.flush();
- short status = readHeaderAndValidate(transport, params);
- return codec.readUnmarshallByteArray(transport, status);
- }
+ private final String taskName;
+ private final Map<String, byte[]> marshalledParams;
+
+ protected ExecuteOperation(Codec codec, TransportFactory transportFactory, byte[] cacheName,
+ AtomicInteger topologyId, int flags, Configuration cfg,
+ String taskName, Map<String, byte[]> marshalledParams) {
+ super(codec, transportFactory, cacheName == null ? DEFAULT_CACHE_NAME_BYTES : cacheName, topologyId, flags, cfg);
+ this.taskName = taskName;
+ this.marshalledParams = marshalledParams;
+ }
+
+ @Override
+ protected Transport getTransport(int retryCount,
+ Set<SocketAddress> failedServers) {
+ return transportFactory.getTransport(failedServers, cacheName);
+ }
+
+ @Override
+ protected T executeOperation(Transport transport) {
+ HeaderParams params = writeHeader(transport, EXEC_REQUEST);
+ transport.writeString(taskName);
+ transport.writeVInt(marshalledParams.size());
+ for(Entry<String, byte[]> entry : marshalledParams.entrySet()) {
+ transport.writeString(entry.getKey());
+ transport.writeArray(entry.getValue());
+ }
+ transport.flush();
+ short status = readHeaderAndValidate(transport, params);
+ return codec.readUnmarshallByteArray(transport, status, cfg.serialWhitelist());
+ }
}
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/FaultTolerantPingOperation.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/FaultTolerantPingOperation.java
index 4200eaa..ae59bbe 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/FaultTolerantPingOperation.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/FaultTolerantPingOperation.java
@@ -1,5 +1,6 @@
package org.infinispan.client.hotrod.impl.operations;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.impl.protocol.Codec;
import org.infinispan.client.hotrod.impl.transport.Transport;
import org.infinispan.client.hotrod.impl.transport.TransportFactory;
@@ -17,8 +18,9 @@
public class FaultTolerantPingOperation extends RetryOnFailureOperation<PingOperation.PingResult> {
protected FaultTolerantPingOperation(Codec codec, TransportFactory transportFactory,
- byte[] cacheName, AtomicInteger topologyId, int flags) {
- super(codec, transportFactory, cacheName, topologyId, flags);
+ byte[] cacheName, AtomicInteger topologyId, int flags,
+ Configuration cfg) {
+ super(codec, transportFactory, cacheName, topologyId, flags, cfg);
}
@Override
@@ -28,7 +30,7 @@ protected Transport getTransport(int retryCount, Set<SocketAddress> failedServer
@Override
protected PingOperation.PingResult executeOperation(Transport transport) {
- return new PingOperation(codec, topologyId, transport, cacheName).execute();
+ return new PingOperation(codec, topologyId, cfg, transport, cacheName).execute();
}
}
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/GetAllOperation.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/GetAllOperation.java
index 2227f05..4172296 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/GetAllOperation.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/GetAllOperation.java
@@ -8,6 +8,7 @@
import net.jcip.annotations.Immutable;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.impl.protocol.Codec;
import org.infinispan.client.hotrod.impl.protocol.HeaderParams;
import org.infinispan.client.hotrod.impl.transport.Transport;
@@ -24,8 +25,8 @@
public GetAllOperation(Codec codec, TransportFactory transportFactory,
Set<byte[]> keys, byte[] cacheName, AtomicInteger topologyId,
- int flags) {
- super(codec, transportFactory, cacheName, topologyId, flags);
+ int flags, Configuration cfg) {
+ super(codec, transportFactory, cacheName, topologyId, flags, cfg);
this.keys = keys;
}
@@ -44,8 +45,8 @@ public GetAllOperation(Codec codec, TransportFactory transportFactory,
int size = transport.readVInt();
Map<K, V> result = new HashMap<K, V>(size);
for (int i = 0; i < size; ++i) {
- K key = codec.readUnmarshallByteArray(transport, status);
- V value = codec.readUnmarshallByteArray(transport, status);
+ K key = codec.readUnmarshallByteArray(transport, status, cfg.serialWhitelist());
+ V value = codec.readUnmarshallByteArray(transport, status, cfg.serialWhitelist());
result.put(key, value);
}
return result;
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/GetAllParallelOperation.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/GetAllParallelOperation.java
index 52fe940..12d6a5e 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/GetAllParallelOperation.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/GetAllParallelOperation.java
@@ -10,6 +10,7 @@
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.impl.protocol.Codec;
import org.infinispan.client.hotrod.impl.transport.TransportFactory;
@@ -21,8 +22,8 @@
private final Set<byte[]> keys;
protected GetAllParallelOperation(Codec codec, TransportFactory transportFactory, Set<byte[]> keys, byte[]
- cacheName, AtomicInteger topologyId, int flags, ExecutorService executorService) {
- super(codec, transportFactory, cacheName, topologyId, flags, executorService);
+ cacheName, AtomicInteger topologyId, int flags, Configuration cfg, ExecutorService executorService) {
+ super(codec, transportFactory, cacheName, topologyId, flags, cfg, executorService);
this.keys = keys;
}
@@ -42,7 +43,7 @@ protected GetAllParallelOperation(Codec codec, TransportFactory transportFactory
return splittedKeys.values().stream().map(
keysSubset -> new GetAllOperation<K, V>(codec, transportFactory, keysSubset, cacheName, topologyId,
- flags)).collect(Collectors.toList());
+ flags, cfg)).collect(Collectors.toList());
}
@Override
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/GetOperation.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/GetOperation.java
index d4048a6..9b63a1c 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/GetOperation.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/GetOperation.java
@@ -1,6 +1,7 @@
package org.infinispan.client.hotrod.impl.operations;
import net.jcip.annotations.Immutable;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.impl.protocol.Codec;
import org.infinispan.client.hotrod.impl.protocol.HotRodConstants;
import org.infinispan.client.hotrod.impl.transport.Transport;
@@ -18,8 +19,9 @@
public class GetOperation<V> extends AbstractKeyOperation<V> {
public GetOperation(Codec codec, TransportFactory transportFactory,
- Object key, byte[] keyBytes, byte[] cacheName, AtomicInteger topologyId, int flags) {
- super(codec, transportFactory, key, keyBytes, cacheName, topologyId, flags);
+ Object key, byte[] keyBytes, byte[] cacheName, AtomicInteger topologyId, int flags,
+ Configuration cfg) {
+ super(codec, transportFactory, key, keyBytes, cacheName, topologyId, flags, cfg);
}
@Override
@@ -30,7 +32,7 @@ public V executeOperation(Transport transport) {
result = null;
} else {
if (HotRodConstants.isSuccess(status)) {
- result = codec.readUnmarshallByteArray(transport, status);
+ result = codec.readUnmarshallByteArray(transport, status, cfg.serialWhitelist());
}
}
return result;
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/GetWithMetadataOperation.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/GetWithMetadataOperation.java
index fb86207..51c0b63 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/GetWithMetadataOperation.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/GetWithMetadataOperation.java
@@ -5,6 +5,7 @@
import net.jcip.annotations.Immutable;
import org.infinispan.client.hotrod.MetadataValue;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.impl.MetadataValueImpl;
import org.infinispan.client.hotrod.impl.protocol.Codec;
import org.infinispan.client.hotrod.impl.protocol.HotRodConstants;
@@ -26,9 +27,10 @@
private static final Log log = LogFactory.getLog(GetWithMetadataOperation.class);
private static final boolean trace = log.isTraceEnabled();
- public GetWithMetadataOperation(Codec codec, TransportFactory transportFactory,
- Object key, byte[] keyBytes, byte[] cacheName, AtomicInteger topologyId, int flags) {
- super(codec, transportFactory, key, keyBytes, cacheName, topologyId, flags);
+ public GetWithMetadataOperation(Codec codec, TransportFactory transportFactory, Object key, byte[] keyBytes,
+ byte[] cacheName, AtomicInteger topologyId, int flags,
+ Configuration cfg) {
+ super(codec, transportFactory, key, keyBytes, cacheName, topologyId, flags, cfg);
}
@Override
@@ -55,7 +57,7 @@ public GetWithMetadataOperation(Codec codec, TransportFactory transportFactory,
if (trace) {
log.tracef("Received version: %d", version);
}
- V value = codec.readUnmarshallByteArray(transport, status);
+ V value = codec.readUnmarshallByteArray(transport, status, cfg.serialWhitelist());
result = new MetadataValueImpl<V>(creation, lifespan, lastUsed, maxIdle, version, value);
}
return result;
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/GetWithVersionOperation.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/GetWithVersionOperation.java
index 57f3d29..6b51b84 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/GetWithVersionOperation.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/GetWithVersionOperation.java
@@ -5,6 +5,7 @@
import net.jcip.annotations.Immutable;
import org.infinispan.client.hotrod.VersionedValue;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.impl.VersionedValueImpl;
import org.infinispan.client.hotrod.impl.protocol.Codec;
import org.infinispan.client.hotrod.impl.protocol.HotRodConstants;
@@ -27,9 +28,10 @@
private static final Log log = LogFactory.getLog(GetWithVersionOperation.class);
private static final boolean trace = log.isTraceEnabled();
- public GetWithVersionOperation(Codec codec, TransportFactory transportFactory,
- Object key, byte[] keyBytes, byte[] cacheName, AtomicInteger topologyId, int flags) {
- super(codec, transportFactory, key, keyBytes, cacheName, topologyId, flags);
+ public GetWithVersionOperation(Codec codec, TransportFactory transportFactory, Object key, byte[] keyBytes,
+ byte[] cacheName, AtomicInteger topologyId, int flags,
+ Configuration cfg) {
+ super(codec, transportFactory, key, keyBytes, cacheName, topologyId, flags, cfg);
}
@Override
@@ -43,7 +45,7 @@ public GetWithVersionOperation(Codec codec, TransportFactory transportFactory,
if (trace) {
log.tracef("Received version: %d", version);
}
- V value = codec.readUnmarshallByteArray(transport, status);
+ V value = codec.readUnmarshallByteArray(transport, status, cfg.serialWhitelist());
result = new VersionedValueImpl<V>(version, value);
}
return result;
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/HotRodOperation.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/HotRodOperation.java
index 4183ec4..474d073 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/HotRodOperation.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/HotRodOperation.java
@@ -4,6 +4,7 @@
import net.jcip.annotations.Immutable;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.impl.protocol.Codec;
import org.infinispan.client.hotrod.impl.protocol.HeaderParams;
import org.infinispan.client.hotrod.impl.protocol.HotRodConstants;
@@ -28,14 +29,17 @@
protected final Codec codec;
+ protected final Configuration cfg;
+
private static final byte NO_TX = 0;
private static final byte XA_TX = 1;
- protected HotRodOperation(Codec codec, int flags, byte[] cacheName, AtomicInteger topologyId) {
+ protected HotRodOperation(Codec codec, int flags, Configuration cfg, byte[] cacheName, AtomicInteger topologyId) {
this.flags = flags;
this.cacheName = cacheName;
this.topologyId = topologyId;
this.codec = codec;
+ this.cfg = cfg;
}
public abstract Object execute();
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/IterationEndOperation.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/IterationEndOperation.java
index f94e7cd..764ddcf 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/IterationEndOperation.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/IterationEndOperation.java
@@ -2,6 +2,7 @@
import java.util.concurrent.atomic.AtomicInteger;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.impl.protocol.Codec;
import org.infinispan.client.hotrod.impl.protocol.HeaderParams;
import org.infinispan.client.hotrod.impl.transport.Transport;
@@ -17,9 +18,10 @@
private final TransportFactory transportFactory;
private final Transport transport;
- protected IterationEndOperation(Codec codec, int flags, byte[] cacheName, AtomicInteger topologyId,
- String iterationId, TransportFactory transportFactory, Transport transport) {
- super(codec, flags, cacheName, topologyId);
+ protected IterationEndOperation(Codec codec, int flags, Configuration cfg, byte[] cacheName,
+ AtomicInteger topologyId, String iterationId, TransportFactory transportFactory,
+ Transport transport) {
+ super(codec, flags, cfg, cacheName, topologyId);
this.iterationId = iterationId;
this.transportFactory = transportFactory;
this.transport = transport;
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/IterationNextOperation.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/IterationNextOperation.java
index 2b33c12..b185519 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/IterationNextOperation.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/IterationNextOperation.java
@@ -1,5 +1,6 @@
package org.infinispan.client.hotrod.impl.operations;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.impl.MetadataValueImpl;
import org.infinispan.client.hotrod.impl.iteration.KeyTracker;
import org.infinispan.client.hotrod.impl.protocol.Codec;
@@ -27,14 +28,15 @@
private final String iterationId;
private final Transport transport;
+ private final List<String> whitelist;
private final KeyTracker segmentKeyTracker;
- protected IterationNextOperation(Codec codec, int flags, byte[] cacheName, AtomicInteger topologyId,
- String iterationId, Transport transport, KeyTracker segmentKeyTracker) {
- super(codec, flags, cacheName, topologyId);
+ protected IterationNextOperation(Codec codec, int flags, Configuration cfg, byte[] cacheName, AtomicInteger topologyId,
+ String iterationId, Transport transport, KeyTracker segmentKeyTracker, List<String> whitelist) {
+ super(codec, flags, cfg, cacheName, topologyId);
this.iterationId = iterationId;
this.transport = transport;
-
+ this.whitelist = whitelist;
this.segmentKeyTracker = segmentKeyTracker;
}
@@ -86,7 +88,7 @@ protected IterationNextOperation(Codec codec, int flags, byte[] cacheName, Atomi
value = new MetadataValueImpl<>(creation, lifespan, lastUsed, maxIdle, version, value);
}
- if (segmentKeyTracker.track(key, status)) {
+ if (segmentKeyTracker.track(key, status, whitelist)) {
entries.add(new SimpleEntry<>(unmarshall(key, status), (E) value));
}
}
@@ -100,7 +102,7 @@ protected IterationNextOperation(Codec codec, int flags, byte[] cacheName, Atomi
private Object unmarshall(byte[] bytes, short status) {
Marshaller marshaller = transport.getTransportFactory().getMarshaller();
- return MarshallerUtil.bytes2obj(marshaller, bytes, status);
+ return MarshallerUtil.bytes2obj(marshaller, bytes, status, whitelist);
}
}
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/IterationStartOperation.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/IterationStartOperation.java
index c8e4f8e..703b39a 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/IterationStartOperation.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/IterationStartOperation.java
@@ -5,6 +5,7 @@
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.impl.consistenthash.SegmentConsistentHash;
import org.infinispan.client.hotrod.impl.protocol.Codec;
import org.infinispan.client.hotrod.impl.protocol.HeaderParams;
@@ -32,10 +33,10 @@
private final TransportFactory transportFactory;
private final boolean metadata;
- IterationStartOperation(Codec codec, int flags, byte[] cacheName, AtomicInteger topologyId,
+ IterationStartOperation(Codec codec, int flags, Configuration cfg, byte[] cacheName, AtomicInteger topologyId,
String filterConverterFactory, byte[][] filterParameters, Set<Integer> segments,
int batchSize, TransportFactory transportFactory, boolean metadata) {
- super(codec, transportFactory, cacheName, topologyId, flags);
+ super(codec, transportFactory, cacheName, topologyId, flags, cfg);
this.filterConverterFactory = filterConverterFactory;
this.filterParameters = filterParameters;
this.segments = segments;
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/OperationsFactory.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/OperationsFactory.java
index 7b6fa11..6e36c02 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/OperationsFactory.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/OperationsFactory.java
@@ -5,6 +5,7 @@
import org.infinispan.client.hotrod.CacheTopologyInfo;
import org.infinispan.client.hotrod.Flag;
import org.infinispan.client.hotrod.RemoteCacheManager;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.event.ClientListenerNotifier;
import org.infinispan.client.hotrod.impl.iteration.KeyTracker;
import org.infinispan.client.hotrod.impl.protocol.Codec;
@@ -46,8 +47,10 @@
private final ExecutorService executorService;
+ private final Configuration cfg;
+
public OperationsFactory(TransportFactory transportFactory, String cacheName, boolean forceReturnValue, Codec
- codec, ClientListenerNotifier listenerNotifier, ExecutorService executorService) {
+ codec, ClientListenerNotifier listenerNotifier, ExecutorService executorService, Configuration cfg) {
this.transportFactory = transportFactory;
this.executorService = executorService;
this.cacheNameBytes = RemoteCacheManager.cacheNameBytes(cacheName);
@@ -58,6 +61,11 @@ public OperationsFactory(TransportFactory transportFactory, String cacheName, bo
this.forceReturnValue = forceReturnValue;
this.codec = codec;
this.listenerNotifier = listenerNotifier;
+ this.cfg = cfg;
+ }
+
+ public OperationsFactory(TransportFactory transportFactory, Codec codec, ExecutorService executorService, Configuration cfg) {
+ this(transportFactory, null, false, codec, null, executorService, cfg);
}
public ClientListenerNotifier getListenerNotifier() {
@@ -69,58 +77,58 @@ public ClientListenerNotifier getListenerNotifier() {
}
public <V> GetOperation<V> newGetKeyOperation(Object key, byte[] keyBytes) {
- return new GetOperation<V>(
- codec, transportFactory, key, keyBytes, cacheNameBytes, topologyId, flags());
+ return new GetOperation<>(
+ codec, transportFactory, key, keyBytes, cacheNameBytes, topologyId, flags(), cfg);
}
public <K, V> GetAllParallelOperation<K, V> newGetAllOperation(Set<byte[]> keys) {
return new GetAllParallelOperation<>(codec, transportFactory, keys, cacheNameBytes, topologyId, flags(),
- executorService);
+ cfg, executorService);
}
public <V> RemoveOperation<V> newRemoveOperation(Object key, byte[] keyBytes) {
- return new RemoveOperation<V>(
- codec, transportFactory, key, keyBytes, cacheNameBytes, topologyId, flags());
+ return new RemoveOperation<>(
+ codec, transportFactory, key, keyBytes, cacheNameBytes, topologyId, flags(), cfg);
}
public <V> RemoveIfUnmodifiedOperation<V> newRemoveIfUnmodifiedOperation(Object key, byte[] keyBytes, long version) {
- return new RemoveIfUnmodifiedOperation<V>(
- codec, transportFactory, key, keyBytes, cacheNameBytes, topologyId, flags(), version);
+ return new RemoveIfUnmodifiedOperation<>(
+ codec, transportFactory, key, keyBytes, cacheNameBytes, topologyId, flags(), cfg, version);
}
public ReplaceIfUnmodifiedOperation newReplaceIfUnmodifiedOperation(Object key, byte[] keyBytes,
byte[] value, long lifespan, TimeUnit lifespanTimeUnit, long maxIdle, TimeUnit maxIdleTimeUnit, long version) {
return new ReplaceIfUnmodifiedOperation(
codec, transportFactory, key, keyBytes, cacheNameBytes, topologyId, flags(lifespan, maxIdle),
- value, lifespan, lifespanTimeUnit, maxIdle, maxIdleTimeUnit, version);
+ cfg, value, lifespan, lifespanTimeUnit, maxIdle, maxIdleTimeUnit, version);
}
public <V> GetWithVersionOperation<V> newGetWithVersionOperation(Object key, byte[] keyBytes) {
- return new GetWithVersionOperation<V>(
- codec, transportFactory, key, keyBytes, cacheNameBytes, topologyId, flags());
+ return new GetWithVersionOperation<>(
+ codec, transportFactory, key, keyBytes, cacheNameBytes, topologyId, flags(), cfg);
}
public <V> GetWithMetadataOperation<V> newGetWithMetadataOperation(Object key, byte[] keyBytes) {
- return new GetWithMetadataOperation<V>(
- codec, transportFactory, key, keyBytes, cacheNameBytes, topologyId, flags());
+ return new GetWithMetadataOperation<>(
+ codec, transportFactory, key, keyBytes, cacheNameBytes, topologyId, flags(), cfg);
}
public StatsOperation newStatsOperation() {
return new StatsOperation(
- codec, transportFactory, cacheNameBytes, topologyId, flags());
+ codec, transportFactory, cacheNameBytes, topologyId, flags(), cfg);
}
public <V> PutOperation<V> newPutKeyValueOperation(Object key, byte[] keyBytes, byte[] value,
long lifespan, TimeUnit lifespanTimeUnit, long maxIdle, TimeUnit maxIdleTimeUnit) {
return new PutOperation<V>(
codec, transportFactory, key, keyBytes, cacheNameBytes, topologyId, flags(lifespan, maxIdle),
- value, lifespan, lifespanTimeUnit, maxIdle, maxIdleTimeUnit);
+ cfg, value, lifespan, lifespanTimeUnit, maxIdle, maxIdleTimeUnit);
}
public PutAllParallelOperation newPutAllOperation(Map<byte[], byte[]> map,
long lifespan, TimeUnit lifespanTimeUnit, long maxIdle, TimeUnit maxIdleTimeUnit) {
return new PutAllParallelOperation(
- codec, transportFactory, map, cacheNameBytes, topologyId, flags(lifespan, maxIdle),
+ codec, transportFactory, map, cacheNameBytes, topologyId, flags(lifespan, maxIdle), cfg,
lifespan, lifespanTimeUnit, maxIdle, maxIdleTimeUnit, executorService);
}
@@ -128,52 +136,52 @@ public PutAllParallelOperation newPutAllOperation(Map<byte[], byte[]> map,
long lifespan, TimeUnit lifespanUnit, long maxIdleTime, TimeUnit maxIdleTimeUnit) {
return new PutIfAbsentOperation<V>(
codec, transportFactory, key, keyBytes, cacheNameBytes, topologyId, flags(lifespan, maxIdleTime),
- value, lifespan, lifespanUnit, maxIdleTime, maxIdleTimeUnit);
+ cfg, value, lifespan, lifespanUnit, maxIdleTime, maxIdleTimeUnit);
}
public <V> ReplaceOperation<V> newReplaceOperation(Object key, byte[] keyBytes, byte[] values,
long lifespan, TimeUnit lifespanTimeUnit, long maxIdle, TimeUnit maxIdleTimeUnit) {
return new ReplaceOperation<V>(
codec, transportFactory, key, keyBytes, cacheNameBytes, topologyId, flags(lifespan, maxIdle),
- values, lifespan, lifespanTimeUnit, maxIdle, maxIdleTimeUnit);
+ cfg, values, lifespan, lifespanTimeUnit, maxIdle, maxIdleTimeUnit);
}
public ContainsKeyOperation newContainsKeyOperation(Object key, byte[] keyBytes) {
return new ContainsKeyOperation(
- codec, transportFactory, key, keyBytes, cacheNameBytes, topologyId, flags());
+ codec, transportFactory, key, keyBytes, cacheNameBytes, topologyId, flags(), cfg);
}
public ClearOperation newClearOperation() {
return new ClearOperation(
- codec, transportFactory, cacheNameBytes, topologyId, flags());
+ codec, transportFactory, cacheNameBytes, topologyId, flags(), cfg);
}
public <K, V> BulkGetOperation<K, V> newBulkGetOperation(int size) {
return new BulkGetOperation(
- codec, transportFactory, cacheNameBytes, topologyId, flags(), size);
+ codec, transportFactory, cacheNameBytes, topologyId, flags(), cfg, size);
}
public <K> BulkGetKeysOperation<K> newBulkGetKeysOperation(int scope) {
- return new BulkGetKeysOperation<K>(
- codec, transportFactory, cacheNameBytes, topologyId, flags(), scope);
+ return new BulkGetKeysOperation<>(
+ codec, transportFactory, cacheNameBytes, topologyId, flags(), cfg, scope);
}
public AddClientListenerOperation newAddClientListenerOperation(Object listener) {
return new AddClientListenerOperation(codec, transportFactory,
- cacheName, topologyId, flags(), listenerNotifier,
+ cacheName, topologyId, flags(), cfg, listenerNotifier,
listener, null, null);
}
public AddClientListenerOperation newAddClientListenerOperation(
Object listener, byte[][] filterFactoryParams, byte[][] converterFactoryParams) {
return new AddClientListenerOperation(codec, transportFactory,
- cacheName, topologyId, flags(), listenerNotifier,
+ cacheName, topologyId, flags(), cfg, listenerNotifier,
listener, filterFactoryParams, converterFactoryParams);
}
public RemoveClientListenerOperation newRemoveClientListenerOperation(Object listener) {
return new RemoveClientListenerOperation(codec, transportFactory,
- cacheNameBytes, topologyId, flags(), listenerNotifier, listener);
+ cacheNameBytes, topologyId, flags(), cfg, listenerNotifier, listener);
}
/**
@@ -183,7 +191,7 @@ public RemoveClientListenerOperation newRemoveClientListenerOperation(Object lis
* @return a ping operation for a particular node
*/
public PingOperation newPingOperation(Transport transport) {
- return new PingOperation(codec, topologyId, transport, cacheNameBytes);
+ return new PingOperation(codec, topologyId, cfg, transport, cacheNameBytes);
}
/**
@@ -195,21 +203,22 @@ public PingOperation newPingOperation(Transport transport) {
*/
public FaultTolerantPingOperation newFaultTolerantPingOperation() {
return new FaultTolerantPingOperation(
- codec, transportFactory, cacheNameBytes, topologyId, flags());
+ codec, transportFactory, cacheNameBytes, topologyId, flags(), cfg);
}
public QueryOperation newQueryOperation(RemoteQuery remoteQuery) {
return new QueryOperation(
- codec, transportFactory, cacheNameBytes, topologyId, flags(), remoteQuery);
+ codec, transportFactory, cacheNameBytes, topologyId, flags(), cfg, remoteQuery);
}
public SizeOperation newSizeOperation() {
- return new SizeOperation(codec, transportFactory, cacheNameBytes, topologyId, flags());
+ return new SizeOperation(codec, transportFactory, cacheNameBytes, topologyId, flags(), cfg);
}
public <T> ExecuteOperation<T> newExecuteOperation(String taskName, Map<String, byte[]> marshalledParams) {
- return new ExecuteOperation<T>(codec, transportFactory, cacheNameBytes, topologyId, flags(), taskName, marshalledParams);
- }
+ return new ExecuteOperation<>(codec, transportFactory, cacheNameBytes,
+ topologyId, flags(), cfg, taskName, marshalledParams);
+ }
private int flags(long lifespan, long maxIdle) {
int intFlags = flags();
@@ -265,14 +274,15 @@ public CacheTopologyInfo getCacheTopologyInfo() {
}
public IterationStartOperation newIterationStartOperation(String filterConverterFactory, byte[][] filterParameters, Set<Integer> segments, int batchSize, boolean metadata) {
- return new IterationStartOperation(codec, flags(), cacheNameBytes, topologyId, filterConverterFactory, filterParameters, segments, batchSize, transportFactory, metadata);
+ return new IterationStartOperation(codec, flags(), cfg, cacheNameBytes, topologyId, filterConverterFactory, filterParameters, segments, batchSize, transportFactory, metadata);
}
public IterationEndOperation newIterationEndOperation(String iterationId, Transport transport) {
- return new IterationEndOperation(codec, flags(), cacheNameBytes, topologyId, iterationId, transportFactory, transport);
+ return new IterationEndOperation(codec, flags(), cfg, cacheNameBytes, topologyId, iterationId, transportFactory, transport);
}
public <K, V> IterationNextOperation newIterationNextOperation(String iterationId, Transport transport, KeyTracker segmentKeyTracker) {
- return new IterationNextOperation(codec, flags(), cacheNameBytes, topologyId, iterationId, transport, segmentKeyTracker);
+ return new IterationNextOperation(codec, flags(), cfg, cacheNameBytes, topologyId, iterationId, transport, segmentKeyTracker, cfg.serialWhitelist());
}
+
}
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/ParallelHotRodOperation.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/ParallelHotRodOperation.java
index 8805f84..bdbac82 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/ParallelHotRodOperation.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/ParallelHotRodOperation.java
@@ -10,6 +10,7 @@
import java.util.concurrent.Future;
import java.util.concurrent.atomic.AtomicInteger;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.exceptions.ParallelOperationException;
import org.infinispan.client.hotrod.impl.protocol.Codec;
import org.infinispan.client.hotrod.impl.transport.TransportFactory;
@@ -30,8 +31,8 @@
protected final CompletionService<T> completionService;
protected ParallelHotRodOperation(Codec codec, TransportFactory transportFactory, byte[] cacheName, AtomicInteger
- topologyId, int flags, ExecutorService executorService) {
- super(codec, flags, cacheName, topologyId);
+ topologyId, int flags, Configuration cfg, ExecutorService executorService) {
+ super(codec, flags, cfg, cacheName, topologyId);
this.transportFactory = transportFactory;
this.completionService = new ExecutorCompletionService<>(executorService);
}
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/PingOperation.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/PingOperation.java
index 7376407..8670cec 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/PingOperation.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/PingOperation.java
@@ -4,6 +4,7 @@
import net.jcip.annotations.Immutable;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.exceptions.HotRodClientException;
import org.infinispan.client.hotrod.exceptions.InvalidResponseException;
import org.infinispan.client.hotrod.impl.protocol.Codec;
@@ -27,12 +28,12 @@
private final Transport transport;
- public PingOperation(Codec codec, AtomicInteger topologyId, Transport transport) {
- this(codec, topologyId, transport, DEFAULT_CACHE_NAME_BYTES);
+ public PingOperation(Codec codec, AtomicInteger topologyId, Configuration cfg, Transport transport) {
+ this(codec, topologyId, cfg, transport, DEFAULT_CACHE_NAME_BYTES);
}
- public PingOperation(Codec codec, AtomicInteger topologyId, Transport transport, byte[] cacheName) {
- super(codec, 0, cacheName, topologyId);
+ public PingOperation(Codec codec, AtomicInteger topologyId, Configuration cfg, Transport transport, byte[] cacheName) {
+ super(codec, 0, cfg, cacheName, topologyId);
this.transport = transport;
}
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/PutAllOperation.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/PutAllOperation.java
index 4dfec2a..5debc01 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/PutAllOperation.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/PutAllOperation.java
@@ -9,6 +9,7 @@
import net.jcip.annotations.Immutable;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.exceptions.InvalidResponseException;
import org.infinispan.client.hotrod.impl.protocol.Codec;
import org.infinispan.client.hotrod.impl.protocol.HeaderParams;
@@ -27,8 +28,9 @@
public PutAllOperation(Codec codec, TransportFactory transportFactory,
Map<byte[], byte[]> map, byte[] cacheName, AtomicInteger topologyId,
- int flags, long lifespan, TimeUnit lifespanTimeUnit, long maxIdle, TimeUnit maxIdleTimeUnit) {
- super(codec, transportFactory, cacheName, topologyId, flags);
+ int flags, Configuration cfg,
+ long lifespan, TimeUnit lifespanTimeUnit, long maxIdle, TimeUnit maxIdleTimeUnit) {
+ super(codec, transportFactory, cacheName, topologyId, flags, cfg);
this.map = map;
this.lifespan = lifespan;
this.lifespanTimeUnit = lifespanTimeUnit;
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/PutAllParallelOperation.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/PutAllParallelOperation.java
index 4c866d1..48f6fe6 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/PutAllParallelOperation.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/PutAllParallelOperation.java
@@ -9,6 +9,7 @@
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.impl.protocol.Codec;
import org.infinispan.client.hotrod.impl.transport.TransportFactory;
@@ -24,9 +25,10 @@
private final TimeUnit maxIdleTimeUnit;
public PutAllParallelOperation(Codec codec, TransportFactory transportFactory, Map<byte[], byte[]> map, byte[]
- cacheName, AtomicInteger topologyId, int flags, long lifespan, TimeUnit lifespanTimeUnit, long maxIdle,
+ cacheName, AtomicInteger topologyId, int flags, Configuration cfg, long lifespan,
+ TimeUnit lifespanTimeUnit, long maxIdle,
TimeUnit maxIdleTimeUnit, ExecutorService executorService) {
- super(codec, transportFactory, cacheName, topologyId, flags, executorService);
+ super(codec, transportFactory, cacheName, topologyId, flags, cfg, executorService);
this.map = map;
this.lifespan = lifespan;
this.lifespanTimeUnit = lifespanTimeUnit;
@@ -50,7 +52,7 @@ public PutAllParallelOperation(Codec codec, TransportFactory transportFactory, M
return splittedMaps.values().stream().map(
mapSubset -> new PutAllOperation(codec, transportFactory, mapSubset, cacheName, topologyId, flags,
- lifespan, lifespanTimeUnit, maxIdle, maxIdleTimeUnit)).collect(Collectors.toList());
+ cfg, lifespan, lifespanTimeUnit, maxIdle, maxIdleTimeUnit)).collect(Collectors.toList());
}
@Override
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/PutIfAbsentOperation.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/PutIfAbsentOperation.java
index 11b3186..ef5d589 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/PutIfAbsentOperation.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/PutIfAbsentOperation.java
@@ -5,6 +5,7 @@
import net.jcip.annotations.Immutable;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.impl.protocol.Codec;
import org.infinispan.client.hotrod.impl.protocol.HotRodConstants;
import org.infinispan.client.hotrod.impl.transport.Transport;
@@ -27,8 +28,10 @@
public PutIfAbsentOperation(Codec codec, TransportFactory transportFactory,
Object key, byte[] keyBytes, byte[] cacheName, AtomicInteger topologyId,
- int flags, byte[] value, long lifespan,TimeUnit lifespanTimeUnit, long maxIdleTime, TimeUnit maxIdleTimeUnit) {
- super(codec, transportFactory, key, keyBytes, cacheName, topologyId, flags, value, lifespan, lifespanTimeUnit, maxIdleTime, maxIdleTimeUnit);
+ int flags, Configuration cfg, byte[] value, long lifespan,
+ TimeUnit lifespanTimeUnit, long maxIdleTime, TimeUnit maxIdleTimeUnit) {
+ super(codec, transportFactory, key, keyBytes, cacheName, topologyId, flags, cfg, value,
+ lifespan, lifespanTimeUnit, maxIdleTime, maxIdleTimeUnit);
}
@Override
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/PutOperation.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/PutOperation.java
index 4723795..25c6ef1 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/PutOperation.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/PutOperation.java
@@ -5,6 +5,7 @@
import net.jcip.annotations.Immutable;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.exceptions.InvalidResponseException;
import org.infinispan.client.hotrod.impl.protocol.Codec;
import org.infinispan.client.hotrod.impl.protocol.HotRodConstants;
@@ -22,9 +23,10 @@
public PutOperation(Codec codec, TransportFactory transportFactory,
Object key, byte[] keyBytes, byte[] cacheName, AtomicInteger topologyId,
- int flags, byte[] value, long lifespan, TimeUnit lifespanTimeUnit, long maxIdle, TimeUnit maxIdleTimeUnit) {
+ int flags, Configuration cfg, byte[] value, long lifespan, TimeUnit lifespanTimeUnit,
+ long maxIdle, TimeUnit maxIdleTimeUnit) {
super(codec, transportFactory, key, keyBytes, cacheName, topologyId,
- flags, value, lifespan, lifespanTimeUnit, maxIdle, maxIdleTimeUnit);
+ flags, cfg, value, lifespan, lifespanTimeUnit, maxIdle, maxIdleTimeUnit);
}
@Override
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/QueryOperation.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/QueryOperation.java
index 1c556cd..b829d31 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/QueryOperation.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/QueryOperation.java
@@ -1,5 +1,6 @@
package org.infinispan.client.hotrod.impl.operations;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.impl.protocol.Codec;
import org.infinispan.client.hotrod.impl.protocol.HeaderParams;
import org.infinispan.client.hotrod.impl.query.RemoteQuery;
@@ -30,8 +31,8 @@
private final RemoteQuery remoteQuery;
public QueryOperation(Codec codec, TransportFactory transportFactory, byte[] cacheName, AtomicInteger topologyId,
- int flags, RemoteQuery remoteQuery) {
- super(codec, transportFactory, cacheName, topologyId, flags);
+ int flags, Configuration cfg, RemoteQuery remoteQuery) {
+ super(codec, transportFactory, cacheName, topologyId, flags, cfg);
this.remoteQuery = remoteQuery;
}
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/RemoveClientListenerOperation.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/RemoveClientListenerOperation.java
index c3c9ee9..33f5828 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/RemoveClientListenerOperation.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/RemoveClientListenerOperation.java
@@ -1,5 +1,6 @@
package org.infinispan.client.hotrod.impl.operations;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.event.ClientListenerNotifier;
import org.infinispan.client.hotrod.impl.protocol.Codec;
import org.infinispan.client.hotrod.impl.protocol.HeaderParams;
@@ -28,8 +29,9 @@
protected RemoveClientListenerOperation(Codec codec, TransportFactory transportFactory,
byte[] cacheName, AtomicInteger topologyId, int flags,
+ Configuration cfg,
ClientListenerNotifier listenerNotifier, Object listener) {
- super(codec, flags, cacheName, topologyId);
+ super(codec, flags, cfg, cacheName, topologyId);
this.transportFactory = transportFactory;
this.listenerNotifier = listenerNotifier;
this.listener = listener;
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/RemoveIfUnmodifiedOperation.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/RemoveIfUnmodifiedOperation.java
index b052d61..8f86c1b 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/RemoveIfUnmodifiedOperation.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/RemoveIfUnmodifiedOperation.java
@@ -1,6 +1,7 @@
package org.infinispan.client.hotrod.impl.operations;
import net.jcip.annotations.Immutable;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.impl.VersionedOperationResponse;
import org.infinispan.client.hotrod.impl.protocol.Codec;
import org.infinispan.client.hotrod.impl.protocol.HeaderParams;
@@ -22,8 +23,10 @@
private final long version;
public RemoveIfUnmodifiedOperation(Codec codec, TransportFactory transportFactory,
- Object key, byte[] keyBytes, byte[] cacheName, AtomicInteger topologyId, int flags, long version) {
- super(codec, transportFactory, key, keyBytes, cacheName, topologyId, flags);
+ Object key, byte[] keyBytes, byte[] cacheName, AtomicInteger topologyId,
+ int flags, Configuration cfg,
+ long version) {
+ super(codec, transportFactory, key, keyBytes, cacheName, topologyId, flags, cfg);
this.version = version;
}
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/RemoveOperation.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/RemoveOperation.java
index 8f48e61..715c253 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/RemoveOperation.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/RemoveOperation.java
@@ -1,6 +1,7 @@
package org.infinispan.client.hotrod.impl.operations;
import net.jcip.annotations.Immutable;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.impl.protocol.Codec;
import org.infinispan.client.hotrod.impl.protocol.HotRodConstants;
import org.infinispan.client.hotrod.impl.transport.Transport;
@@ -19,8 +20,8 @@
public class RemoveOperation<V> extends AbstractKeyOperation<V> {
public RemoveOperation(Codec codec, TransportFactory transportFactory,
- Object key, byte[] keyBytes, byte[] cacheName, AtomicInteger topologyId, int flags) {
- super(codec, transportFactory, key, keyBytes, cacheName, topologyId, flags);
+ Object key, byte[] keyBytes, byte[] cacheName, AtomicInteger topologyId, int flags, Configuration cfg) {
+ super(codec, transportFactory, key, keyBytes, cacheName, topologyId, flags, cfg);
}
@Override
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/ReplaceIfUnmodifiedOperation.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/ReplaceIfUnmodifiedOperation.java
index 96f675e..be3a31a 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/ReplaceIfUnmodifiedOperation.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/ReplaceIfUnmodifiedOperation.java
@@ -1,5 +1,6 @@
package org.infinispan.client.hotrod.impl.operations;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.impl.VersionedOperationResponse;
import org.infinispan.client.hotrod.impl.protocol.Codec;
import org.infinispan.client.hotrod.impl.protocol.HeaderParams;
@@ -20,9 +21,9 @@
private final long version;
public ReplaceIfUnmodifiedOperation(Codec codec, TransportFactory transportFactory, Object key, byte[] keyBytes, byte[] cacheName,
- AtomicInteger topologyId, int flags, byte[] value,
+ AtomicInteger topologyId, int flags, Configuration cfg, byte[] value,
long lifespan, TimeUnit lifespanTimeUnit, long maxIdle, TimeUnit maxIdleTimeUnit, long version) {
- super(codec, transportFactory, key, keyBytes, cacheName, topologyId, flags, value, lifespan, lifespanTimeUnit, maxIdle, maxIdleTimeUnit);
+ super(codec, transportFactory, key, keyBytes, cacheName, topologyId, flags, cfg, value, lifespan, lifespanTimeUnit, maxIdle, maxIdleTimeUnit);
this.version = version;
}
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/ReplaceOperation.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/ReplaceOperation.java
index 20d30dc..e88460d 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/ReplaceOperation.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/ReplaceOperation.java
@@ -2,6 +2,7 @@
import net.jcip.annotations.Immutable;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.impl.protocol.Codec;
import org.infinispan.client.hotrod.impl.transport.Transport;
import org.infinispan.client.hotrod.impl.transport.TransportFactory;
@@ -20,9 +21,11 @@
public class ReplaceOperation<V> extends AbstractKeyValueOperation<V> {
public ReplaceOperation(Codec codec, TransportFactory transportFactory,
- Object key, byte[] keyBytes, byte[] cacheName, AtomicInteger topologyId,
- int flags, byte[] value, long lifespan, TimeUnit lifespanTimeUnit, long maxIdle, TimeUnit maxIdleTimeUnit) {
- super(codec, transportFactory, key, keyBytes, cacheName, topologyId, flags, value, lifespan, lifespanTimeUnit, maxIdle, maxIdleTimeUnit);
+ Object key, byte[] keyBytes, byte[] cacheName, AtomicInteger topologyId,
+ int flags, Configuration cfg, byte[] value,
+ long lifespan, TimeUnit lifespanTimeUnit, long maxIdle, TimeUnit maxIdleTimeUnit) {
+ super(codec, transportFactory, key, keyBytes, cacheName, topologyId, flags, cfg, value,
+ lifespan, lifespanTimeUnit, maxIdle, maxIdleTimeUnit);
}
@Override
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/RetryOnFailureOperation.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/RetryOnFailureOperation.java
index 6740aef..8fa7922 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/RetryOnFailureOperation.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/RetryOnFailureOperation.java
@@ -1,6 +1,7 @@
package org.infinispan.client.hotrod.impl.operations;
import net.jcip.annotations.Immutable;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.exceptions.HotRodClientException;
import org.infinispan.client.hotrod.exceptions.RemoteIllegalLifecycleStateException;
import org.infinispan.client.hotrod.exceptions.RemoteNodeSuspectException;
@@ -36,8 +37,8 @@
private boolean triedCompleteRestart = false;
protected RetryOnFailureOperation(Codec codec, TransportFactory transportFactory,
- byte[] cacheName, AtomicInteger topologyId, int flags) {
- super(codec, flags, cacheName, topologyId);
+ byte[] cacheName, AtomicInteger topologyId, int flags, Configuration cfg) {
+ super(codec, flags, cfg, cacheName, topologyId);
this.transportFactory = transportFactory;
}
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/SizeOperation.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/SizeOperation.java
index 262f6ce..e944748 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/SizeOperation.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/SizeOperation.java
@@ -1,5 +1,6 @@
package org.infinispan.client.hotrod.impl.operations;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.impl.protocol.Codec;
import org.infinispan.client.hotrod.impl.protocol.HeaderParams;
import org.infinispan.client.hotrod.impl.transport.Transport;
@@ -12,8 +13,8 @@
public class SizeOperation extends RetryOnFailureOperation<Integer> {
protected SizeOperation(Codec codec, TransportFactory transportFactory,
- byte[] cacheName, AtomicInteger topologyId, int flags) {
- super(codec, transportFactory, cacheName, topologyId, flags);
+ byte[] cacheName, AtomicInteger topologyId, int flags, Configuration cfg) {
+ super(codec, transportFactory, cacheName, topologyId, flags, cfg);
}
@Override
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/StatsOperation.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/StatsOperation.java
index 0fd940e..a503f25 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/StatsOperation.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/operations/StatsOperation.java
@@ -1,6 +1,8 @@
package org.infinispan.client.hotrod.impl.operations;
import net.jcip.annotations.Immutable;
+
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.impl.protocol.Codec;
import org.infinispan.client.hotrod.impl.protocol.HeaderParams;
import org.infinispan.client.hotrod.impl.transport.Transport;
@@ -22,8 +24,8 @@
public class StatsOperation extends RetryOnFailureOperation<Map<String, String>> {
public StatsOperation(Codec codec, TransportFactory transportFactory,
- byte[] cacheName, AtomicInteger topologyId, int flags) {
- super(codec, transportFactory, cacheName, topologyId, flags);
+ byte[] cacheName, AtomicInteger topologyId, int flags, Configuration cfg) {
+ super(codec, transportFactory, cacheName, topologyId, flags, cfg);
}
@Override
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/protocol/Codec.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/protocol/Codec.java
index 5793516..73f5cc8 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/protocol/Codec.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/protocol/Codec.java
@@ -1,5 +1,6 @@
package org.infinispan.client.hotrod.impl.protocol;
+import java.util.List;
import java.util.concurrent.TimeUnit;
import org.infinispan.client.hotrod.annotation.ClientListener;
@@ -40,11 +41,11 @@ void writeClientListenerParams(Transport transport, ClientListener clientListene
*/
short readHeader(Transport transport, HeaderParams params);
- ClientEvent readEvent(Transport transport, byte[] expectedListenerId, Marshaller marshaller);
+ ClientEvent readEvent(Transport transport, byte[] expectedListenerId, Marshaller marshaller, List<String> whitelist);
- Either<Short, ClientEvent> readHeaderOrEvent(Transport transport, HeaderParams params, byte[] expectedListenerId, Marshaller marshaller);
+ Either<Short, ClientEvent> readHeaderOrEvent(Transport transport, HeaderParams params, byte[] expectedListenerId, Marshaller marshaller, List<String> whitelist);
- Object returnPossiblePrevValue(Transport transport, short status, int flags);
+ Object returnPossiblePrevValue(Transport transport, short status, int flags, List<String> whitelist);
/**
* Logger for Hot Rod client codec
@@ -54,5 +55,5 @@ void writeClientListenerParams(Transport transport, ClientListener clientListene
/**
* Read and unmarshall byte array.
*/
- <T> T readUnmarshallByteArray(Transport transport, short status);
+ <T> T readUnmarshallByteArray(Transport transport, short status, List<String> whitelist);
}
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/protocol/Codec10.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/protocol/Codec10.java
index c89aa27..e0119a6 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/protocol/Codec10.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/protocol/Codec10.java
@@ -6,6 +6,7 @@
import java.net.SocketAddress;
import java.util.HashSet;
import java.util.LinkedHashMap;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
@@ -130,23 +131,23 @@ public short readHeader(Transport transport, HeaderParams params) {
}
@Override
- public ClientEvent readEvent(Transport transport, byte[] expectedListenerId, Marshaller marshaller) {
+ public ClientEvent readEvent(Transport transport, byte[] expectedListenerId, Marshaller marshaller, List<String> whitelist) {
return null; // No events sent in Hot Rod 1.x protocol
}
@Override
- public Either<Short, ClientEvent> readHeaderOrEvent(Transport transport, HeaderParams params, byte[] expectedListenerId, Marshaller marshaller) {
+ public Either<Short, ClientEvent> readHeaderOrEvent(Transport transport, HeaderParams params, byte[] expectedListenerId, Marshaller marshaller, List<String> whitelist) {
return null; // No events sent in Hot Rod 1.x protocol
}
@Override
- public Object returnPossiblePrevValue(Transport transport, short status, int flags) {
+ public Object returnPossiblePrevValue(Transport transport, short status, int flags, List<String> whitelist) {
Marshaller marshaller = transport.getTransportFactory().getMarshaller();
if (hasForceReturn(flags)) {
byte[] bytes = transport.readArray();
if (trace) getLog().tracef("Previous value bytes is: %s", Util.printArray(bytes, false));
//0-length response means null
- return bytes.length == 0 ? null : MarshallerUtil.bytes2obj(marshaller, bytes, status);
+ return bytes.length == 0 ? null : MarshallerUtil.bytes2obj(marshaller, bytes, status, whitelist);
} else {
return null;
}
@@ -162,8 +163,8 @@ public Log getLog() {
}
@Override
- public <T> T readUnmarshallByteArray(Transport transport, short status) {
- return CodecUtils.readUnmarshallByteArray(transport, status);
+ public <T> T readUnmarshallByteArray(Transport transport, short status, List<String> whitelist) {
+ return CodecUtils.readUnmarshallByteArray(transport, status, whitelist);
}
protected void checkForErrorsInResponseStatus(Transport transport, HeaderParams params, short status) {
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/protocol/Codec20.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/protocol/Codec20.java
index 97ee675..c502742 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/protocol/Codec20.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/protocol/Codec20.java
@@ -44,8 +44,8 @@
final boolean trace = getLog().isTraceEnabled();
@Override
- public <T> T readUnmarshallByteArray(Transport transport, short status) {
- return CodecUtils.readUnmarshallByteArray(transport, status);
+ public <T> T readUnmarshallByteArray(Transport transport, short status, List<String> whitelist) {
+ return CodecUtils.readUnmarshallByteArray(transport, status, whitelist);
}
@Override
@@ -143,14 +143,14 @@ private short readPartialHeader(Transport transport, HeaderParams params, short
}
@Override
- public ClientEvent readEvent(Transport transport, byte[] expectedListenerId, Marshaller marshaller) {
+ public ClientEvent readEvent(Transport transport, byte[] expectedListenerId, Marshaller marshaller, List<String> whitelist) {
readMagic(transport);
readMessageId(transport, null);
short eventTypeId = transport.readByte();
- return readPartialEvent(transport, expectedListenerId, marshaller, eventTypeId);
+ return readPartialEvent(transport, expectedListenerId, marshaller, eventTypeId, whitelist);
}
- protected ClientEvent readPartialEvent(Transport transport, byte[] expectedListenerId, Marshaller marshaller, short eventTypeId) {
+ protected ClientEvent readPartialEvent(Transport transport, byte[] expectedListenerId, Marshaller marshaller, short eventTypeId, List<String> whitelist) {
short status = transport.readByte();
transport.readByte(); // ignore, no topology expected
ClientEvent.Type eventType;
@@ -179,20 +179,20 @@ protected ClientEvent readPartialEvent(Transport transport, byte[] expectedListe
boolean isRetried = transport.readByte() == 1 ? true : false;
if (isCustom == 1) {
- final Object eventData = MarshallerUtil.bytes2obj(marshaller, transport.readArray(), status);
+ final Object eventData = MarshallerUtil.bytes2obj(marshaller, transport.readArray(), status, whitelist);
return createCustomEvent(eventData, eventType, isRetried);
} else {
switch (eventType) {
case CLIENT_CACHE_ENTRY_CREATED:
- Object createdKey = MarshallerUtil.bytes2obj(marshaller, transport.readArray(), status);
+ Object createdKey = MarshallerUtil.bytes2obj(marshaller, transport.readArray(), status, whitelist);
long createdDataVersion = transport.readLong();
return createCreatedEvent(createdKey, createdDataVersion, isRetried);
case CLIENT_CACHE_ENTRY_MODIFIED:
- Object modifiedKey = MarshallerUtil.bytes2obj(marshaller, transport.readArray(), status);
+ Object modifiedKey = MarshallerUtil.bytes2obj(marshaller, transport.readArray(), status, whitelist);
long modifiedDataVersion = transport.readLong();
return createModifiedEvent(modifiedKey, modifiedDataVersion, isRetried);
case CLIENT_CACHE_ENTRY_REMOVED:
- Object removedKey = MarshallerUtil.bytes2obj(marshaller, transport.readArray(), status);
+ Object removedKey = MarshallerUtil.bytes2obj(marshaller, transport.readArray(), status, whitelist);
return createRemovedEvent(removedKey, isRetried);
default:
throw log.unknownEvent(eventTypeId);
@@ -201,7 +201,7 @@ protected ClientEvent readPartialEvent(Transport transport, byte[] expectedListe
}
@Override
- public Either<Short, ClientEvent> readHeaderOrEvent(Transport transport, HeaderParams params, byte[] expectedListenerId, Marshaller marshaller) {
+ public Either<Short, ClientEvent> readHeaderOrEvent(Transport transport, HeaderParams params, byte[] expectedListenerId, Marshaller marshaller, List<String> whitelist) {
readMagic(transport);
readMessageId(transport, null);
short opCode = transport.readByte();
@@ -209,7 +209,7 @@ protected ClientEvent readPartialEvent(Transport transport, byte[] expectedListe
case CACHE_ENTRY_CREATED_EVENT_RESPONSE:
case CACHE_ENTRY_MODIFIED_EVENT_RESPONSE:
case CACHE_ENTRY_REMOVED_EVENT_RESPONSE:
- ClientEvent clientEvent = readPartialEvent(transport, expectedListenerId, marshaller, opCode);
+ ClientEvent clientEvent = readPartialEvent(transport, expectedListenerId, marshaller, opCode, whitelist);
return Either.newRight(clientEvent);
default:
return Either.newLeft(readPartialHeader(transport, params, opCode));
@@ -217,13 +217,13 @@ protected ClientEvent readPartialEvent(Transport transport, byte[] expectedListe
}
@Override
- public Object returnPossiblePrevValue(Transport transport, short status, int flags) {
+ public Object returnPossiblePrevValue(Transport transport, short status, int flags, List<String> whitelist) {
Marshaller marshaller = transport.getTransportFactory().getMarshaller();
if (HotRodConstants.hasPrevious(status)) {
byte[] bytes = transport.readArray();
if (trace) getLog().tracef("Previous value bytes is: %s", printArray(bytes, false));
//0-length response means null
- return bytes.length == 0 ? null : MarshallerUtil.bytes2obj(marshaller, bytes, status);
+ return bytes.length == 0 ? null : MarshallerUtil.bytes2obj(marshaller, bytes, status, whitelist);
} else {
return null;
}
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/protocol/Codec21.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/protocol/Codec21.java
index 62bb2df..80a15aa 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/protocol/Codec21.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/protocol/Codec21.java
@@ -10,6 +10,7 @@
import org.infinispan.commons.marshall.Marshaller;
import java.util.Arrays;
+import java.util.List;
import static org.infinispan.commons.util.Util.printArray;
@@ -34,7 +35,7 @@ public void writeClientListenerParams(Transport transport, ClientListener client
}
@Override
- protected ClientEvent readPartialEvent(Transport transport, byte[] expectedListenerId, Marshaller marshaller, short eventTypeId) {
+ protected ClientEvent readPartialEvent(Transport transport, byte[] expectedListenerId, Marshaller marshaller, short eventTypeId, List<String> whitelist) {
short status = transport.readByte();
transport.readByte(); // ignore, no topology expected
ClientEvent.Type eventType;
@@ -65,25 +66,25 @@ protected ClientEvent readPartialEvent(Transport transport, byte[] expectedListe
boolean isRetried = transport.readByte() == 1 ? true : false;
if (isCustom == 1) {
- final Object eventData = MarshallerUtil.bytes2obj(marshaller, transport.readArray(), status);
+ final Object eventData = MarshallerUtil.bytes2obj(marshaller, transport.readArray(), status, whitelist);
return createCustomEvent(eventData, eventType, isRetried);
} else if (isCustom == 2) { // New in 2.1, dealing with raw custom events
return createCustomEvent(transport.readArray(), eventType, isRetried); // Raw data
} else {
switch (eventType) {
case CLIENT_CACHE_ENTRY_CREATED:
- Object createdKey = MarshallerUtil.bytes2obj(marshaller, transport.readArray(), status);
+ Object createdKey = MarshallerUtil.bytes2obj(marshaller, transport.readArray(), status, whitelist);
long createdDataVersion = transport.readLong();
return createCreatedEvent(createdKey, createdDataVersion, isRetried);
case CLIENT_CACHE_ENTRY_MODIFIED:
- Object modifiedKey = MarshallerUtil.bytes2obj(marshaller, transport.readArray(), status);
+ Object modifiedKey = MarshallerUtil.bytes2obj(marshaller, transport.readArray(), status, whitelist);
long modifiedDataVersion = transport.readLong();
return createModifiedEvent(modifiedKey, modifiedDataVersion, isRetried);
case CLIENT_CACHE_ENTRY_REMOVED:
- Object removedKey = MarshallerUtil.bytes2obj(marshaller, transport.readArray(), status);
+ Object removedKey = MarshallerUtil.bytes2obj(marshaller, transport.readArray(), status, whitelist);
return createRemovedEvent(removedKey, isRetried);
case CLIENT_CACHE_ENTRY_EXPIRED:
- Object expiredKey = MarshallerUtil.bytes2obj(marshaller, transport.readArray(), status);
+ Object expiredKey = MarshallerUtil.bytes2obj(marshaller, transport.readArray(), status, whitelist);
return createExpiredEvent(expiredKey);
default:
throw getLog().unknownEvent(eventTypeId);
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/protocol/CodecUtils.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/protocol/CodecUtils.java
index 8315490..d8cd36a 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/protocol/CodecUtils.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/protocol/CodecUtils.java
@@ -4,6 +4,7 @@
import org.infinispan.client.hotrod.marshall.MarshallerUtil;
import org.infinispan.commons.marshall.Marshaller;
+import java.util.List;
import java.util.concurrent.TimeUnit;
/**
@@ -31,10 +32,10 @@ public static int toSeconds(long duration, TimeUnit timeUnit) {
return seconds;
}
- static <T> T readUnmarshallByteArray(Transport transport, short status) {
+ static <T> T readUnmarshallByteArray(Transport transport, short status, List<String> whitelist) {
byte[] bytes = transport.readArray();
Marshaller marshaller = transport.getTransportFactory().getMarshaller();
- return MarshallerUtil.bytes2obj(marshaller, bytes, status);
+ return MarshallerUtil.bytes2obj(marshaller, bytes, status, whitelist);
}
}
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/transport/tcp/SaslTransportObjectFactory.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/transport/tcp/SaslTransportObjectFactory.java
index 0fe2cec..b022d1e 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/transport/tcp/SaslTransportObjectFactory.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/transport/tcp/SaslTransportObjectFactory.java
@@ -16,6 +16,7 @@
import javax.security.sasl.SaslException;
import org.infinispan.client.hotrod.configuration.AuthenticationConfiguration;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.impl.operations.AuthMechListOperation;
import org.infinispan.client.hotrod.impl.operations.AuthOperation;
import org.infinispan.client.hotrod.impl.protocol.Codec;
@@ -34,12 +35,13 @@
private static final byte[] EMPTY_BYTES = new byte[0];
private static final String AUTH_INT = "auth-int";
private static final String AUTH_CONF = "auth-conf";
- private final AuthenticationConfiguration configuration;
+ private final AuthenticationConfiguration authConfiguration;
public SaslTransportObjectFactory(Codec codec, TcpTransportFactory tcpTransportFactory,
- AtomicInteger defaultCacheTopologyId, boolean pingOnStartup, AuthenticationConfiguration configuration) {
- super(codec, tcpTransportFactory, defaultCacheTopologyId, pingOnStartup);
- this.configuration = configuration;
+ AtomicInteger defaultCacheTopologyId, boolean pingOnStartup,
+ AuthenticationConfiguration authConfiguration, Configuration configuration) {
+ super(codec, tcpTransportFactory, defaultCacheTopologyId, pingOnStartup, configuration);
+ this.authConfiguration = authConfiguration;
}
@Override
@@ -50,34 +52,34 @@ public TcpTransport makeObject(SocketAddress address) throws Exception {
}
List<String> serverMechs = mechList(tcpTransport, defaultCacheTopologyId);
- if (!serverMechs.contains(configuration.saslMechanism())) {
- throw log.unsupportedMech(configuration.saslMechanism(), serverMechs);
+ if (!serverMechs.contains(authConfiguration.saslMechanism())) {
+ throw log.unsupportedMech(authConfiguration.saslMechanism(), serverMechs);
}
SaslClient saslClient;
- if (configuration.clientSubject() != null) {
- saslClient = Subject.doAs(configuration.clientSubject(), new PrivilegedExceptionAction<SaslClient>() {
+ if (authConfiguration.clientSubject() != null) {
+ saslClient = Subject.doAs(authConfiguration.clientSubject(), new PrivilegedExceptionAction<SaslClient>() {
@Override
public SaslClient run() throws Exception {
- CallbackHandler callbackHandler = configuration.callbackHandler();
+ CallbackHandler callbackHandler = authConfiguration.callbackHandler();
if (callbackHandler == null) {
callbackHandler = NoOpCallbackHandler.INSTANCE;
}
- return Sasl.createSaslClient(new String[] { configuration.saslMechanism() }, null, "hotrod",
- configuration.serverName(), configuration.saslProperties(), callbackHandler);
+ return Sasl.createSaslClient(new String[] { authConfiguration.saslMechanism() }, null, "hotrod",
+ authConfiguration.serverName(), authConfiguration.saslProperties(), callbackHandler);
}
});
} else {
- saslClient = Sasl.createSaslClient(new String[] { configuration.saslMechanism() }, null, "hotrod",
- configuration.serverName(), configuration.saslProperties(), configuration.callbackHandler());
+ saslClient = Sasl.createSaslClient(new String[] { authConfiguration.saslMechanism() }, null, "hotrod",
+ authConfiguration.serverName(), authConfiguration.saslProperties(), authConfiguration.callbackHandler());
}
if (trace) {
- log.tracef("Authenticating using mech: %s", configuration.saslMechanism());
+ log.tracef("Authenticating using mech: %s", authConfiguration.saslMechanism());
}
byte response[] = saslClient.hasInitialResponse() ? evaluateChallenge(saslClient, EMPTY_BYTES) : EMPTY_BYTES;
- byte challenge[] = auth(tcpTransport, defaultCacheTopologyId, configuration.saslMechanism(), response);
+ byte challenge[] = auth(tcpTransport, defaultCacheTopologyId, authConfiguration.saslMechanism(), response);
while (!saslClient.isComplete() && challenge != null) {
response = evaluateChallenge(saslClient, challenge);
if (response == null) {
@@ -105,9 +107,9 @@ public SaslClient run() throws Exception {
}
private byte[] evaluateChallenge(final SaslClient saslClient, final byte[] challenge) throws SaslException {
- if(configuration.clientSubject()!= null) {
+ if(authConfiguration.clientSubject()!= null) {
try {
- return Subject.doAs(configuration.clientSubject(), new PrivilegedExceptionAction<byte[]>() {
+ return Subject.doAs(authConfiguration.clientSubject(), new PrivilegedExceptionAction<byte[]>() {
@Override
public byte[] run() throws Exception {
return saslClient.evaluateChallenge(challenge);
@@ -127,12 +129,12 @@ public SaslClient run() throws Exception {
}
private List<String> mechList(TcpTransport tcpTransport, AtomicInteger topologyId) {
- AuthMechListOperation op = new AuthMechListOperation(codec, topologyId, tcpTransport);
+ AuthMechListOperation op = new AuthMechListOperation(codec, topologyId, configuration, tcpTransport);
return op.execute();
}
private byte[] auth(TcpTransport tcpTransport, AtomicInteger topologyId, String mech, byte[] response) {
- AuthOperation op = new AuthOperation(codec, topologyId, tcpTransport, mech, response);
+ AuthOperation op = new AuthOperation(codec, topologyId, configuration, tcpTransport, mech, response);
return op.execute();
}
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/transport/tcp/TcpTransportFactory.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/transport/tcp/TcpTransportFactory.java
index 1591e79..21cce28 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/transport/tcp/TcpTransportFactory.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/transport/tcp/TcpTransportFactory.java
@@ -136,9 +136,9 @@ public void start(Codec codec, Configuration configuration, AtomicInteger defaul
}
TransportObjectFactory connectionFactory;
if (configuration.security().authentication().enabled()) {
- connectionFactory = new SaslTransportObjectFactory(codec, this, defaultCacheTopologyId, pingOnStartup, configuration.security().authentication());
+ connectionFactory = new SaslTransportObjectFactory(codec, this, defaultCacheTopologyId, pingOnStartup, configuration.security().authentication(), configuration);
} else {
- connectionFactory = new TransportObjectFactory(codec, this, defaultCacheTopologyId, pingOnStartup);
+ connectionFactory = new TransportObjectFactory(codec, this, defaultCacheTopologyId, pingOnStartup, configuration);
}
PropsKeyedObjectPoolFactory<SocketAddress, TcpTransport> poolFactory =
new PropsKeyedObjectPoolFactory<SocketAddress, TcpTransport>(
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/transport/tcp/TransportObjectFactory.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/transport/tcp/TransportObjectFactory.java
index 8b7309c..fe16598 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/transport/tcp/TransportObjectFactory.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/impl/transport/tcp/TransportObjectFactory.java
@@ -4,6 +4,7 @@
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.commons.pool.BaseKeyedPoolableObjectFactory;
+import org.infinispan.client.hotrod.configuration.Configuration;
import org.infinispan.client.hotrod.impl.operations.PingOperation;
import org.infinispan.client.hotrod.impl.protocol.Codec;
import org.infinispan.client.hotrod.logging.Log;
@@ -23,13 +24,15 @@
protected final boolean pingOnStartup;
protected volatile boolean firstPingExecuted = false;
protected final Codec codec;
+ protected final Configuration configuration;
public TransportObjectFactory(Codec codec, TcpTransportFactory tcpTransportFactory,
- AtomicInteger defaultCacheTopologyId, boolean pingOnStartup) {
+ AtomicInteger defaultCacheTopologyId, boolean pingOnStartup, Configuration configuration) {
this.tcpTransportFactory = tcpTransportFactory;
this.defaultCacheTopologyId = defaultCacheTopologyId;
this.pingOnStartup = pingOnStartup;
this.codec = codec;
+ this.configuration = configuration;
}
@Override
@@ -48,7 +51,7 @@ public TcpTransport makeObject(SocketAddress address) throws Exception {
}
protected PingOperation.PingResult ping(TcpTransport tcpTransport, AtomicInteger topologyId) {
- PingOperation po = new PingOperation(codec, topologyId, tcpTransport);
+ PingOperation po = new PingOperation(codec, topologyId, configuration, tcpTransport);
return po.execute();
}
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/logging/Log.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/logging/Log.java
index 9571d5c..22514fe 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/logging/Log.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/logging/Log.java
@@ -6,6 +6,7 @@
import org.infinispan.client.hotrod.impl.transport.Transport;
import org.infinispan.client.hotrod.impl.transport.tcp.TcpTransport;
import org.infinispan.commons.CacheConfigurationException;
+import org.infinispan.commons.CacheException;
import org.infinispan.commons.CacheListenerException;
import org.jboss.logging.BasicLogger;
import org.jboss.logging.annotations.Cause;
@@ -260,4 +261,7 @@
@Message(value = "Classpath does not look correct. Make sure you are not mixing uber and jars", id = 4065)
void warnAboutUberJarDuplicates();
+ @Message(value = "Class '%s' blocked by Java standard deserialization white list. Adjust the client configuration java serialization white list regular expression to include this class.", id = 4068)
+ CacheException classNotInWhitelist(String className);
+
}
diff --git a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/marshall/MarshallerUtil.java b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/marshall/MarshallerUtil.java
index 56e4947..876fa6d 100644
--- a/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/marshall/MarshallerUtil.java
+++ b/client/hotrod-client/src/main/java/org/infinispan/client/hotrod/marshall/MarshallerUtil.java
@@ -4,13 +4,19 @@
import org.infinispan.client.hotrod.impl.protocol.HotRodConstants;
import org.infinispan.client.hotrod.logging.Log;
import org.infinispan.client.hotrod.logging.LogFactory;
+import org.infinispan.commons.CacheException;
import org.infinispan.commons.marshall.Marshaller;
import org.infinispan.commons.util.Util;
import java.io.ByteArrayInputStream;
import java.io.IOException;
+import java.io.InputStream;
import java.io.ObjectInputStream;
+import java.io.ObjectStreamClass;
import java.io.ObjectStreamConstants;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
/**
* @author Galder Zamarreño
@@ -22,8 +28,8 @@
private MarshallerUtil() {}
@SuppressWarnings("unchecked")
- public static <T> T bytes2obj(Marshaller marshaller, byte[] bytes, short status) {
- if (bytes == null) return null;
+ public static <T> T bytes2obj(Marshaller marshaller, byte[] bytes, short status, List<String> whitelist) {
+ if (bytes == null) return null;
try {
Object ret = marshaller.objectFromByteBuffer(bytes);
if (HotRodConstants.hasCompatibility(status)) {
@@ -33,12 +39,9 @@ private MarshallerUtil() {}
// So, if the unmarshalled object is still a byte[], it could be a standard
// serialized object, so check for stream magic
if (ret instanceof byte[] && isJavaSerialized((byte[]) ret)) {
- try (ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream((byte[]) ret))) {
- return (T) ois.readObject();
- } catch (Exception ee) {
- if (log.isDebugEnabled())
- log.debugf("Standard deserialization not in use for %s", Util.printArray(bytes));
- }
+ T ois = tryJavaDeserialize(bytes, (byte[]) ret, whitelist);
+ if (ois != null)
+ return ois;
}
}
@@ -48,6 +51,18 @@ private MarshallerUtil() {}
}
}
+ public static <T> T tryJavaDeserialize(byte[] bytes, byte[] ret, List<String> whitelist) {
+ try (ObjectInputStream ois = new CheckedInputStream(new ByteArrayInputStream(ret), whitelist)) {
+ return (T) ois.readObject();
+ } catch (CacheException ce) {
+ throw ce;
+ } catch (Exception ee) {
+ if (log.isDebugEnabled())
+ log.debugf("Standard deserialization not in use for %s", Util.printArray(bytes));
+ }
+ return null;
+ }
+
private static boolean isJavaSerialized(byte[] bytes) {
if (bytes.length > 2) {
short magic = (short) ((bytes[1] & 0xFF) + (bytes[0] << 8));
@@ -73,4 +88,35 @@ static short getShort(byte[] b, int off) {
}
}
+ private final static class CheckedInputStream extends ObjectInputStream {
+
+ private final List<String> whitelist;
+
+ public CheckedInputStream(InputStream in, List<String> whitelist) throws IOException {
+ super(in);
+ this.whitelist = whitelist;
+ }
+
+ @Override
+ protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException {
+ //Enforce SerialKiller's whitelist
+ boolean safeClass = false;
+ for (String whiteRegExp : whitelist) {
+ Pattern whitePattern = Pattern.compile(whiteRegExp);
+ Matcher whiteMatcher = whitePattern.matcher(desc.getName());
+ if (whiteMatcher.find()) {
+ safeClass = true;
+
+ if (log.isTraceEnabled())
+ log.tracef("Whitelist match: '%s'", desc.getName());
+ }
+ }
+
+ if (!safeClass)
+ throw log.classNotInWhitelist(desc.getName());
+
+ return super.resolveClass(desc);
+ }
+ }
+
}
diff --git a/client/hotrod-client/src/test/java/org/infinispan/client/hotrod/TransportObjectFactoryTest.java b/client/hotrod-client/src/test/java/org/infinispan/client/hotrod/TransportObjectFactoryTest.java
index 689db9b..cc0aa69 100644
--- a/client/hotrod-client/src/test/java/org/infinispan/client/hotrod/TransportObjectFactoryTest.java
+++ b/client/hotrod-client/src/test/java/org/infinispan/client/hotrod/TransportObjectFactoryTest.java
@@ -1,5 +1,7 @@
package org.infinispan.client.hotrod;
+import org.infinispan.client.hotrod.configuration.Configuration;
+import org.infinispan.client.hotrod.configuration.ConfigurationBuilder;
import org.infinispan.client.hotrod.exceptions.TransportException;
import org.infinispan.client.hotrod.impl.protocol.Codec;
import org.infinispan.client.hotrod.impl.protocol.HeaderParams;
@@ -24,8 +26,9 @@
public void testValidate() {
Codec codec = mock(Codec.class);
+ Configuration configuration = new ConfigurationBuilder().build();
TransportObjectFactory objectFactory = new TransportObjectFactory(codec, null,
- new AtomicInteger(), false);
+ new AtomicInteger(), false, configuration);
doThrow(new TransportException("induced!", null))
.when(codec).writeHeader(any(Transport.class), any(HeaderParams.class));
diff --git a/client/hotrod-client/src/test/java/org/infinispan/client/hotrod/configuration/ConfigurationTest.java b/client/hotrod-client/src/test/java/org/infinispan/client/hotrod/configuration/ConfigurationTest.java
index 5be5447..bb562bd 100644
--- a/client/hotrod-client/src/test/java/org/infinispan/client/hotrod/configuration/ConfigurationTest.java
+++ b/client/hotrod-client/src/test/java/org/infinispan/client/hotrod/configuration/ConfigurationTest.java
@@ -15,6 +15,8 @@
import org.infinispan.commons.CacheConfigurationException;
import org.testng.annotations.Test;
+import java.util.Arrays;
+
@Test(testName = "client.hotrod.configuration.ConfigurationTest", groups = "functional" )
public class ConfigurationTest {
@@ -52,7 +54,8 @@ public void testConfiguration() {
.valueSizeEstimate(1024)
.maxRetries(0)
.tcpKeepAlive(true)
- .transportFactory(SomeTransportfactory.class);
+ .transportFactory(SomeTransportfactory.class)
+ .addJavaSerialWhiteList(".*Person.*", ".*Employee.*");
Configuration configuration = builder.build();
validateConfiguration(configuration);
@@ -81,8 +84,8 @@ public void testParseServerAddresses() {
}
@Test(expectedExceptions = CacheConfigurationException.class,
- expectedExceptionsMessageRegExp = "ISPN(\\d)*: Invalid max_retries \\(value=-1\\). " +
- "Value should be greater or equal than zero.")
+ expectedExceptionsMessageRegExp = "ISPN(\\d)*: Invalid max_retries \\(value=-1\\). " +
+ "Value should be greater or equal than zero.")
public void testNegativeRetriesPerServer() {
ConfigurationBuilder builder = new ConfigurationBuilder();
builder.maxRetries(-1);
@@ -180,6 +183,7 @@ private void validateConfiguration(Configuration configuration) {
assertEquals(128, configuration.keySizeEstimate());
assertEquals(1024, configuration.valueSizeEstimate());
assertEquals(0, configuration.maxRetries());
+ assertEquals(Arrays.asList(".*Person.*", ".*Employee.*"), configuration.serialWhitelist());
}
-}
+}
\ No newline at end of file
diff --git a/client/hotrod-client/src/test/java/org/infinispan/client/hotrod/impl/iteration/MultiServerDistRemoteIteratorTest.java b/client/hotrod-client/src/test/java/org/infinispan/client/hotrod/impl/iteration/MultiServerDistRemoteIteratorTest.java
index c0233e0..1d76fca 100644
--- a/client/hotrod-client/src/test/java/org/infinispan/client/hotrod/impl/iteration/MultiServerDistRemoteIteratorTest.java
+++ b/client/hotrod-client/src/test/java/org/infinispan/client/hotrod/impl/iteration/MultiServerDistRemoteIteratorTest.java
@@ -45,7 +45,7 @@ private ConfigurationBuilder getCacheConfiguration() {
List<Integer> finished = new ArrayList<>();
@Override
- public boolean track(byte[] key, short status) {
+ public boolean track(byte[] key, short status, List<String> whitelist) {
return true;
}
diff --git a/client/hotrod-client/src/test/java/org/infinispan/client/hotrod/retry/RetryOnFailureUnitTest.java b/client/hotrod-client/src/test/java/org/infinispan/client/hotrod/retry/RetryOnFailureUnitTest.java
index 8c82f26..82d2c1b 100644
--- a/client/hotrod-client/src/test/java/org/infinispan/client/hotrod/retry/RetryOnFailureUnitTest.java
+++ b/client/hotrod-client/src/test/java/org/infinispan/client/hotrod/retry/RetryOnFailureUnitTest.java
@@ -1,5 +1,6 @@
package org.infinispan.client.hotrod.retry;
+import org.infinispan.client.hotrod.configuration.ConfigurationBuilder;
import org.infinispan.client.hotrod.exceptions.HotRodClientException;
import org.infinispan.client.hotrod.exceptions.RemoteNodeSuspectException;
import org.infinispan.client.hotrod.exceptions.TransportException;
@@ -79,7 +80,7 @@ private void doRetryTest(int maxRetry, boolean failOnTransport) {
private final boolean failOnTransport;
public MockOperation(TransportFactory transportFactory, boolean failOnTransport) {
- super(null, transportFactory, null, null, 0);
+ super(null, transportFactory, null, null, 0, new ConfigurationBuilder().build());
this.failOnTransport = failOnTransport;
transportInvocationCount = new AtomicInteger(0);
executeInvocationCount = new AtomicInteger(0);
diff --git a/integrationtests/compatibility-mode-it/src/test/java/org/infinispan/it/compatibility/CompatibilityCacheFactory.java b/integrationtests/compatibility-mode-it/src/test/java/org/infinispan/it/compatibility/CompatibilityCacheFactory.java
index ee86291..a648816 100644
--- a/integrationtests/compatibility-mode-it/src/test/java/org/infinispan/it/compatibility/CompatibilityCacheFactory.java
+++ b/integrationtests/compatibility-mode-it/src/test/java/org/infinispan/it/compatibility/CompatibilityCacheFactory.java
@@ -163,6 +163,7 @@ private void createHotRodCache(HotRodServer server) {
hotrod = server;
hotrodClient = new RemoteCacheManager(new ConfigurationBuilder()
.addServers("localhost:" + hotrod.getPort())
+ .addJavaSerialWhiteList(".*Person.*")
.marshaller(marshaller)
.build());
hotrodCache = cacheName.isEmpty()
--
2.23.0