diff --git a/clustering/infinispan/extension/pom.xml b/clustering/infinispan/extension/pom.xml
index 35b333d7bb53..38979fb612cb 100644
--- a/clustering/infinispan/extension/pom.xml
+++ b/clustering/infinispan/extension/pom.xml
@@ -54,6 +54,10 @@
org.wildfly
wildfly-clustering-marshalling-infinispan
+
+ org.wildfly
+ wildfly-clustering-marshalling-spi
+
org.wildfly
wildfly-clustering-spi
diff --git a/clustering/infinispan/extension/src/main/java/org/jboss/as/clustering/infinispan/subsystem/GlobalConfigurationBuilder.java b/clustering/infinispan/extension/src/main/java/org/jboss/as/clustering/infinispan/subsystem/GlobalConfigurationBuilder.java
index 219bfd2c1eb8..29593894a63f 100644
--- a/clustering/infinispan/extension/src/main/java/org/jboss/as/clustering/infinispan/subsystem/GlobalConfigurationBuilder.java
+++ b/clustering/infinispan/extension/src/main/java/org/jboss/as/clustering/infinispan/subsystem/GlobalConfigurationBuilder.java
@@ -30,6 +30,7 @@
import java.util.Map;
import java.util.Objects;
import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
import javax.management.MBeanServer;
@@ -59,6 +60,7 @@
import org.jboss.msc.value.Value;
import org.wildfly.clustering.marshalling.Externalizer;
import org.wildfly.clustering.marshalling.infinispan.AdvancedExternalizerAdapter;
+import org.wildfly.clustering.marshalling.spi.DefaultExternalizer;
import org.wildfly.clustering.service.Builder;
import org.wildfly.clustering.service.InjectedValueDependency;
import org.wildfly.clustering.service.ValueDependency;
@@ -115,7 +117,11 @@ public GlobalConfiguration getValue() {
builder.serialization().classResolver(ModularClassResolver.getInstance(this.loader.getValue()));
builder.classLoader(module.getClassLoader());
int id = Ids.MAX_ID;
- for (Externalizer> externalizer : module.loadService(Externalizer.class)) {
+ Stream extends Externalizer>> commonExternalizers = EnumSet.allOf(DefaultExternalizer.class).stream();
+ @SuppressWarnings("unchecked")
+ Stream> moduleExternalizers = (Stream>) (Stream>) StreamSupport.stream(module.loadService(Externalizer.class).spliterator(), false);
+ Iterable> externalizers = Stream.concat(commonExternalizers, moduleExternalizers)::iterator;
+ for (Externalizer> externalizer : externalizers) {
InfinispanLogger.ROOT_LOGGER.debugf("Cache container %s will use an externalizer for %s", this.name, externalizer.getTargetClass().getName());
builder.serialization().addAdvancedExternalizer(id++, new AdvancedExternalizerAdapter<>(externalizer));
}
diff --git a/clustering/marshalling/jboss/src/main/java/org/wildfly/clustering/marshalling/jboss/ExternalizerObjectTable.java b/clustering/marshalling/jboss/src/main/java/org/wildfly/clustering/marshalling/jboss/ExternalizerObjectTable.java
index 444d129b9a0b..88ccb8a7793c 100644
--- a/clustering/marshalling/jboss/src/main/java/org/wildfly/clustering/marshalling/jboss/ExternalizerObjectTable.java
+++ b/clustering/marshalling/jboss/src/main/java/org/wildfly/clustering/marshalling/jboss/ExternalizerObjectTable.java
@@ -24,6 +24,7 @@
import java.io.IOException;
import java.lang.reflect.Modifier;
+import java.util.EnumSet;
import java.util.IdentityHashMap;
import java.util.Map;
import java.util.ServiceLoader;
@@ -35,6 +36,7 @@
import org.jboss.marshalling.Unmarshaller;
import org.wildfly.clustering.marshalling.Externalizer;
import org.wildfly.clustering.marshalling.spi.IndexExternalizer;
+import org.wildfly.clustering.marshalling.spi.DefaultExternalizer;
/**
* {@link ObjectTable} implementation that dynamically loads {@link Externalizer} instances available from a given {@link ClassLoader}.
@@ -47,12 +49,8 @@ public class ExternalizerObjectTable implements ObjectTable {
private final IndexExternalizer indexExternalizer;
public ExternalizerObjectTable(ClassLoader loader) {
- this(Stream.concat(loadExternalizers(ExternalizerObjectTable.class.getClassLoader()), loadExternalizers(loader)).toArray(Externalizer[]::new));
- }
-
- @SuppressWarnings("rawtypes")
- private static Stream loadExternalizers(ClassLoader loader) {
- return StreamSupport.stream(ServiceLoader.load(Externalizer.class, loader).spliterator(), false);
+ this(Stream.concat(EnumSet.allOf(DefaultExternalizer.class).stream(), StreamSupport.stream(ServiceLoader.load(Externalizer.class, loader).spliterator(), false))
+ .toArray(Externalizer[]::new));
}
public ExternalizerObjectTable(Externalizer>... externalizers) {
diff --git a/clustering/marshalling/spi/pom.xml b/clustering/marshalling/spi/pom.xml
index c90f491b0f0d..c4b6266dcb4b 100644
--- a/clustering/marshalling/spi/pom.xml
+++ b/clustering/marshalling/spi/pom.xml
@@ -46,11 +46,6 @@
org.wildfly.security
wildfly-elytron
-
- org.kohsuke.metainf-services
- metainf-services
- provided
-
diff --git a/clustering/marshalling/spi/src/main/java/org/wildfly/clustering/marshalling/spi/util/OptionalExternalizer.java b/clustering/marshalling/spi/src/main/java/org/wildfly/clustering/marshalling/spi/BooleanExternalizer.java
similarity index 57%
rename from clustering/marshalling/spi/src/main/java/org/wildfly/clustering/marshalling/spi/util/OptionalExternalizer.java
rename to clustering/marshalling/spi/src/main/java/org/wildfly/clustering/marshalling/spi/BooleanExternalizer.java
index 84690eac2e4d..3ff510193d57 100644
--- a/clustering/marshalling/spi/src/main/java/org/wildfly/clustering/marshalling/spi/util/OptionalExternalizer.java
+++ b/clustering/marshalling/spi/src/main/java/org/wildfly/clustering/marshalling/spi/BooleanExternalizer.java
@@ -20,36 +20,43 @@
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
-package org.wildfly.clustering.marshalling.spi.util;
+package org.wildfly.clustering.marshalling.spi;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
-import java.util.Optional;
+import java.util.function.Function;
-import org.kohsuke.MetaInfServices;
import org.wildfly.clustering.marshalling.Externalizer;
/**
- * {@link Externalizer} for {@link Optional} values.
+ * Base {@link Externalizer} for boolean-based externalization.
* @author Paul Ferraro
*/
-@MetaInfServices(Externalizer.class)
-public class OptionalExternalizer implements Externalizer> {
+public class BooleanExternalizer implements Externalizer {
+
+ private final Class targetClass;
+ private final Function reader;
+ private final Function writer;
+
+ public BooleanExternalizer(Class targetClass, Function reader, Function writer) {
+ this.targetClass = targetClass;
+ this.reader = reader;
+ this.writer = writer;
+ }
@Override
- public void writeObject(ObjectOutput output, Optional