diff --git a/embedded/deployment/src/main/java/org/infinispan/quarkus/embedded/deployment/InfinispanEmbeddedProcessor.java b/embedded/deployment/src/main/java/org/infinispan/quarkus/embedded/deployment/InfinispanEmbeddedProcessor.java index 00b0f2cc..ec78a9a5 100644 --- a/embedded/deployment/src/main/java/org/infinispan/quarkus/embedded/deployment/InfinispanEmbeddedProcessor.java +++ b/embedded/deployment/src/main/java/org/infinispan/quarkus/embedded/deployment/InfinispanEmbeddedProcessor.java @@ -15,6 +15,8 @@ import org.infinispan.configuration.cache.StoreConfiguration; import org.infinispan.configuration.cache.StoreConfigurationBuilder; import org.infinispan.configuration.parsing.ConfigurationParser; +import org.infinispan.configuration.serializing.ConfigurationSerializer; +import org.infinispan.configuration.serializing.SerializedWith; import org.infinispan.distribution.ch.ConsistentHashFactory; import org.infinispan.distribution.ch.impl.HashFunctionPartitioner; import org.infinispan.factories.impl.ModuleMetadataBuilder; @@ -30,6 +32,7 @@ import org.infinispan.notifications.cachelistener.annotation.CacheEntryRemoved; import org.infinispan.persistence.spi.CacheLoader; import org.infinispan.persistence.spi.CacheWriter; +import org.infinispan.persistence.spi.NonBlockingStore; import org.infinispan.quarkus.embedded.runtime.InfinispanEmbeddedProducer; import org.infinispan.quarkus.embedded.runtime.InfinispanEmbeddedRuntimeConfig; import org.infinispan.quarkus.embedded.runtime.InfinispanRecorder; @@ -102,7 +105,12 @@ void setup(BuildProducer feature, BuildProducer feature, BuildProducer feature, BuildProducer feature, BuildProducer serializeWith = combinedIndex .getAnnotations(DotName.createSimple(SerializeWith.class.getName())); - for (AnnotationInstance instance : serializeWith) { - AnnotationValue withValue = instance.value(); - String withValueString = withValue.asString(); - DotName targetSerializer = DotName.createSimple(withValueString); - if (!excludedClasses.contains(targetSerializer)) { - reflectiveClass.produce(new ReflectiveClassBuildItem(false, false, withValueString)); - } - } + registerSerializeWith(serializeWith, reflectiveClass, excludedClasses); + + // Configuration serializes with classes loaded via serialization + serializeWith = combinedIndex.getAnnotations(DotName.createSimple(SerializedWith.class.getName())); + registerSerializeWith(serializeWith, reflectiveClass, excludedClasses); // This contains parts from the index from the app itself Index appOnlyIndex = applicationIndexBuildItem.getIndex(); @@ -205,6 +215,18 @@ void setup(BuildProducer feature, BuildProducer serializeWith, + BuildProducer reflectiveClass, Set excludedClasses) { + for (AnnotationInstance instance : serializeWith) { + AnnotationValue withValue = instance.value(); + String withValueString = withValue.asString(); + DotName targetSerializer = DotName.createSimple(withValueString); + if (!excludedClasses.contains(targetSerializer)) { + reflectiveClass.produce(new ReflectiveClassBuildItem(false, false, withValueString)); + } + } + } + private void addReflectionForClass(Class classToUse, boolean isInterface, IndexView indexView, BuildProducer reflectiveClass, Set excludedClasses) { addReflectionForName(classToUse.getName(), isInterface, indexView, reflectiveClass, false, false, diff --git a/embedded/runtime/src/main/java/org/infinispan/quarkus/embedded/runtime/graal/SubstituteJGroups.java b/embedded/runtime/src/main/java/org/infinispan/quarkus/embedded/runtime/graal/SubstituteJGroups.java index a1867645..b71bfc5c 100644 --- a/embedded/runtime/src/main/java/org/infinispan/quarkus/embedded/runtime/graal/SubstituteJGroups.java +++ b/embedded/runtime/src/main/java/org/infinispan/quarkus/embedded/runtime/graal/SubstituteJGroups.java @@ -1,8 +1,10 @@ package org.infinispan.quarkus.embedded.runtime.graal; import java.security.SecureRandom; +import java.util.Random; import org.jgroups.JChannel; +import org.jgroups.protocols.DELAY; import org.jgroups.util.UUID; import org.jgroups.util.Util; @@ -22,6 +24,14 @@ final class SubstituteUUID { protected static volatile SecureRandom numberGenerator; } +@TargetClass(DELAY.class) +final class SubstitueDELAY { + @Alias + // Force it to null - so it can be reinitialized + @RecomputeFieldValue(kind = RecomputeFieldValue.Kind.Reset) + protected static volatile Random randomNumberGenerator; +} + // DISCARD protocol uses swing classes @TargetClass(className = "org.jgroups.protocols.DISCARD") final class SubstituteDiscardProtocol { diff --git a/integration-tests/embedded/pom.xml b/integration-tests/embedded/pom.xml index 74e0c564..54c1b2b0 100644 --- a/integration-tests/embedded/pom.xml +++ b/integration-tests/embedded/pom.xml @@ -97,16 +97,18 @@ - native-image + native native + + native + - org.apache.maven.plugins maven-failsafe-plugin @@ -115,31 +117,10 @@ verify - + ${project.build.directory}/${project.build.finalName}-runner - - - - - - - io.quarkus - quarkus-maven-plugin - ${quarkus.version} - - - native-image - - native-image - - - true - true - - - -H:ResourceConfigurationFiles=resources-config.json - - ${graalvmHome} + org.jboss.logmanager.LogManager + diff --git a/pom.xml b/pom.xml index c0d5f7f4..def5ba7d 100644 --- a/pom.xml +++ b/pom.xml @@ -16,7 +16,7 @@ pom - 1.11.0.Final + 2.2.3.Final diff --git a/server-runner/pom.xml b/server-runner/pom.xml index c1790da2..3b43928f 100644 --- a/server-runner/pom.xml +++ b/server-runner/pom.xml @@ -115,7 +115,7 @@ - native-image + build diff --git a/server-runner/src/test/resources/conf/infinispan-local.xml b/server-runner/src/test/resources/conf/infinispan-local.xml index 04c8b044..a740e259 100644 --- a/server-runner/src/test/resources/conf/infinispan-local.xml +++ b/server-runner/src/test/resources/conf/infinispan-local.xml @@ -1,15 +1,15 @@ + xsi:schemaLocation="urn:infinispan:config:13.0 https://infinispan.org/schemas/infinispan-config-13.0.xsd + urn:infinispan:server:13.0 https://infinispan.org/schemas/infinispan-server-13.0.xsd" + xmlns="urn:infinispan:config:13.0" + xmlns:server="urn:infinispan:server:13.0"> - + - + @@ -21,30 +21,17 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + diff --git a/server/deployment/src/main/java/org/infinispan/quarkus/server/deployment/InfinispanServerProcessor.java b/server/deployment/src/main/java/org/infinispan/quarkus/server/deployment/InfinispanServerProcessor.java index c4094d29..fcb041e2 100644 --- a/server/deployment/src/main/java/org/infinispan/quarkus/server/deployment/InfinispanServerProcessor.java +++ b/server/deployment/src/main/java/org/infinispan/quarkus/server/deployment/InfinispanServerProcessor.java @@ -81,7 +81,6 @@ void extensionFeatureStuff(BuildProducer feature, BuildProduce "infinispan-cachestore-jdbc", "infinispan-cachestore-rocksdb", "infinispan-cachestore-remote", - "infinispan-persistence-soft-index", "infinispan-clustered-counter", "infinispan-clustered-lock" )) { diff --git a/server/deployment/src/main/java/org/infinispan/quarkus/server/deployment/XStreamSupportProcessor.java b/server/deployment/src/main/java/org/infinispan/quarkus/server/deployment/XStreamSupportProcessor.java new file mode 100644 index 00000000..8c442f08 --- /dev/null +++ b/server/deployment/src/main/java/org/infinispan/quarkus/server/deployment/XStreamSupportProcessor.java @@ -0,0 +1,247 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.infinispan.quarkus.server.deployment; + +import java.util.Arrays; +import java.util.List; + +import org.jboss.jandex.ClassInfo; +import org.jboss.jandex.DotName; + +import com.thoughtworks.xstream.converters.Converter; +import com.thoughtworks.xstream.mapper.CGLIBMapper; +import com.thoughtworks.xstream.mapper.Mapper; + +import io.quarkus.deployment.annotations.BuildProducer; +import io.quarkus.deployment.annotations.BuildStep; +import io.quarkus.deployment.builditem.AdditionalApplicationArchiveMarkerBuildItem; +import io.quarkus.deployment.builditem.CombinedIndexBuildItem; +import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem; + +// Copied from https://github.com/apache/camel-quarkus commit SHA of fd010b61c85d5057e697f42071b09e7eec918be5 +public class XStreamSupportProcessor { + + private static final List INTERFACES_TO_REGISTER = Arrays.asList( + Converter.class.getName(), + Mapper.class.getName()); + + private static final List EXCLUDED_CLASSES = Arrays.asList( + CGLIBMapper.class.getName()); + + @BuildStep + AdditionalApplicationArchiveMarkerBuildItem additionalApplicationArchives() { + return new AdditionalApplicationArchiveMarkerBuildItem("com/thoughtworks/xstream/XStream.class"); + } + + @BuildStep + void process(CombinedIndexBuildItem indexBuildItem, + BuildProducer reflectiveClassBuildItemBuildProducer) { + + for (String className : INTERFACES_TO_REGISTER) { + for (ClassInfo i : indexBuildItem.getIndex().getAllKnownImplementors(DotName.createSimple(className))) { + String name = i.name().toString(); + + if (!EXCLUDED_CLASSES.contains(name)) { + reflectiveClassBuildItemBuildProducer.produce(new ReflectiveClassBuildItem(false, false, name)); + } + } + } + + reflectiveClassBuildItemBuildProducer.produce(new ReflectiveClassBuildItem(false, false, false, + Class.class, + ClassLoader.class)); + + reflectiveClassBuildItemBuildProducer.produce(new ReflectiveClassBuildItem(false, false, + "[Ljava.lang.String;", + "com.thoughtworks.xstream.converters.ConverterLookup", + "com.thoughtworks.xstream.converters.ConverterRegistry", + "com.thoughtworks.xstream.converters.basic.StringBuilderConverter", + "com.thoughtworks.xstream.converters.basic.UUIDConverter", + "com.thoughtworks.xstream.converters.extended.CharsetConverter", + "com.thoughtworks.xstream.converters.extended.CurrencyConverter", + "com.thoughtworks.xstream.converters.extended.DurationConverter", + "com.thoughtworks.xstream.converters.extended.PathConverter", + "com.thoughtworks.xstream.converters.extended.StackTraceElementConverter", + "com.thoughtworks.xstream.converters.extended.StackTraceElementFactory15", + "com.thoughtworks.xstream.converters.reflection.FieldUtil15", + "com.thoughtworks.xstream.converters.reflection.PureJavaReflectionProvider", + "com.thoughtworks.xstream.converters.reflection.ReflectionProvider", + "com.thoughtworks.xstream.converters.reflection.SunUnsafeReflectionProvider", + "com.thoughtworks.xstream.converters.time.ChronologyConverter", + "com.thoughtworks.xstream.converters.time.DurationConverter", + "com.thoughtworks.xstream.converters.time.HijrahDateConverter", + "com.thoughtworks.xstream.converters.time.InstantConverter", + "com.thoughtworks.xstream.converters.time.JapaneseDateConverter", + "com.thoughtworks.xstream.converters.time.JapaneseEraConverter", + "com.thoughtworks.xstream.converters.time.LocalDateConverter", + "com.thoughtworks.xstream.converters.time.LocalDateTimeConverter", + "com.thoughtworks.xstream.converters.time.LocalTimeConverter", + "com.thoughtworks.xstream.converters.time.MinguoDateConverter", + "com.thoughtworks.xstream.converters.time.MonthDayConverter", + "com.thoughtworks.xstream.converters.time.OffsetDateTimeConverter", + "com.thoughtworks.xstream.converters.time.OffsetTimeConverter", + "com.thoughtworks.xstream.converters.time.PeriodConverter", + "com.thoughtworks.xstream.converters.time.ThaiBuddhistDateConverter", + "com.thoughtworks.xstream.converters.time.YearConverter", + "com.thoughtworks.xstream.converters.time.YearMonthConverter", + "com.thoughtworks.xstream.converters.time.ZoneIdConverter", + "com.thoughtworks.xstream.converters.time.ZonedDateTimeConverter", + "com.thoughtworks.xstream.core.ClassLoaderReference", + "com.thoughtworks.xstream.core.JVM", + "com.thoughtworks.xstream.core.JVM$Test", + "com.thoughtworks.xstream.core.util.Base64JavaUtilCodec", + "com.thoughtworks.xstream.core.util.CustomObjectOutputStream", + "com.thoughtworks.xstream.mapper.AnnotationConfiguration", + "com.thoughtworks.xstream.mapper.Mapper", + "com.thoughtworks.xstream.mapper.Mapper$Null", + "com.thoughtworks.xstream.security.AnyTypePermission", + "com.thoughtworks.xstream.security.ArrayTypePermission", + "com.thoughtworks.xstream.security.ExplicitTypePermission", + "com.thoughtworks.xstream.security.ForbiddenClassException", + "com.thoughtworks.xstream.security.InterfaceTypePermission", + "com.thoughtworks.xstream.security.NoPermission", + "com.thoughtworks.xstream.security.NoTypePermission", + "com.thoughtworks.xstream.security.NullPermission", + "com.thoughtworks.xstream.security.PrimitiveTypePermission", + "com.thoughtworks.xstream.security.ProxyTypePermission", + "com.thoughtworks.xstream.security.RegExpTypePermission", + "com.thoughtworks.xstream.security.TypeHierarchyPermission", + "com.thoughtworks.xstream.security.TypePermission", + "com.thoughtworks.xstream.security.WildcardTypePermission", + "java.awt.Color", + "java.awt.Font", + "java.awt.font.TextAttribute", + "java.io.File", + "java.io.InputStream", + "java.lang.Boolean", + "java.lang.Byte", + "java.lang.Character", + "java.lang.Double", + "java.lang.Exception", + "java.lang.Float", + "java.lang.Integer", + "java.lang.Long", + "java.lang.Number", + "java.lang.Object", + "java.lang.Short", + "java.lang.StackTraceElement", + "java.lang.String", + "java.lang.StringBuffer", + "java.lang.StringBuilder", + "java.lang.Throwable", + "java.lang.Void", + "java.lang.invoke.SerializedLambda", + "java.lang.reflect.Constructor", + "java.lang.reflect.Field", + "java.lang.reflect.InvocationHandler", + "java.lang.reflect.Member", + "java.lang.reflect.Method", + "java.lang.reflect.Proxy", + "java.math.BigDecimal", + "java.math.BigInteger", + "java.net.URI", + "java.net.URL", + "java.nio.charset.Charset", + "java.nio.file.Path", + "java.nio.file.Paths", + "java.sql.Date", + "java.sql.Time", + "java.sql.Timestamp", + "java.text.AttributedCharacterIterator$Attribute", + "java.text.DecimalFormatSymbols", + "java.time.Clock$FixedClock", + "java.time.Clock$OffsetClock", + "java.time.Clock$SystemClock", + "java.time.Clock$TickClock", + "java.time.DayOfWeek", + "java.time.Duration", + "java.time.Instant", + "java.time.LocalDate", + "java.time.LocalDateTime", + "java.time.LocalTime", + "java.time.Month", + "java.time.MonthDay", + "java.time.OffsetDateTime", + "java.time.OffsetTime", + "java.time.Period", + "java.time.Year", + "java.time.YearMonth", + "java.time.ZoneId", + "java.time.ZoneOffset", + "java.time.ZoneRegion", + "java.time.ZonedDateTime", + "java.time.chrono.Chronology", + "java.time.chrono.HijrahChronology", + "java.time.chrono.HijrahDate", + "java.time.chrono.HijrahEra", + "java.time.chrono.IsoChronology", + "java.time.chrono.JapaneseChronology", + "java.time.chrono.JapaneseDate", + "java.time.chrono.JapaneseEra", + "java.time.chrono.MinguoChronology", + "java.time.chrono.MinguoDate", + "java.time.chrono.MinguoEra", + "java.time.chrono.ThaiBuddhistChronology", + "java.time.chrono.ThaiBuddhistDate", + "java.time.chrono.ThaiBuddhistEra", + "java.time.temporal.ChronoField", + "java.time.temporal.ChronoUnit", + "java.time.temporal.IsoFields$Field", + "java.time.temporal.IsoFields$Unit", + "java.time.temporal.JulianFields$Field", + "java.time.temporal.ValueRange", + "java.time.temporal.WeekFields", + "java.util.ArrayList", + "java.util.BitSet", + "java.util.Calendar", + "java.util.Collection", + "java.util.Comparator", + "java.util.Currency", + "java.util.Date", + "java.util.EnumMap", + "java.util.EnumSet", + "java.util.GregorianCalendar", + "java.util.HashMap", + "java.util.HashSet", + "java.util.Hashtable", + "java.util.LinkedHashMap", + "java.util.LinkedHashSet", + "java.util.LinkedList", + "java.util.List", + "java.util.Locale", + "java.util.Map", + "java.util.Map$Entry", + "java.util.Properties", + "java.util.Set", + "java.util.SortedMap", + "java.util.SortedSet", + "java.util.TimeZone", + "java.util.TreeMap", + "java.util.TreeSet", + "java.util.UUID", + "java.util.Vector", + "java.util.concurrent.ConcurrentHashMap", + "java.util.regex.Pattern", + "javax.activation.ActivationDataFlavor", + "javax.security.auth.Subject", + "javax.swing.LookAndFeel", + "javax.xml.datatype.Duration")); + + reflectiveClassBuildItemBuildProducer.produce(new ReflectiveClassBuildItem(true, false, + "com.thoughtworks.xstream.io.xml.XmlFriendlyNameCoder")); + } +} \ No newline at end of file diff --git a/server/runtime/src/main/java/org/infinispan/quarkus/server/runtime/graal/SubstituteDnsLookup.java b/server/runtime/src/main/java/org/infinispan/quarkus/server/runtime/graal/SubstituteDnsLookup.java index 8d27ea3d..7d3bb861 100644 --- a/server/runtime/src/main/java/org/infinispan/quarkus/server/runtime/graal/SubstituteDnsLookup.java +++ b/server/runtime/src/main/java/org/infinispan/quarkus/server/runtime/graal/SubstituteDnsLookup.java @@ -22,13 +22,13 @@ public class SubstituteDnsLookup { @TargetClass(ServerInitialContextFactoryBuilder.class) final class Target_ServerInitialContextFactoryBuilder { @Alias - private ConcurrentMap NAMED_OBJECTS; + private ConcurrentMap namedObjects; @Substitute public InitialContextFactory createInitialContextFactory(Hashtable environment) throws NamingException { String className = environment != null ? (String) environment.get(Context.INITIAL_CONTEXT_FACTORY) : null; if (className == null) { - return new ServerInitialContextFactory(NAMED_OBJECTS); + return new ServerInitialContextFactory(namedObjects); } switch (className) { case "com.sun.jndi.dns.DnsContextFactory": diff --git a/server/runtime/src/main/java/org/infinispan/quarkus/server/runtime/graal/SubstituteElytronClasses.java b/server/runtime/src/main/java/org/infinispan/quarkus/server/runtime/graal/SubstituteElytronClasses.java index c06059da..07fa0c3a 100644 --- a/server/runtime/src/main/java/org/infinispan/quarkus/server/runtime/graal/SubstituteElytronClasses.java +++ b/server/runtime/src/main/java/org/infinispan/quarkus/server/runtime/graal/SubstituteElytronClasses.java @@ -7,14 +7,30 @@ import java.lang.reflect.UndeclaredThrowableException; import java.security.Key; import java.security.PrivilegedAction; +import java.util.Properties; import java.util.function.UnaryOperator; +import org.infinispan.server.configuration.security.LdapRealmConfiguration; +import org.infinispan.server.configuration.security.RealmConfiguration; +import org.infinispan.server.configuration.security.SecurityConfiguration; +import org.wildfly.security.auth.realm.ldap.LdapSecurityRealmBuilder; +import org.wildfly.security.auth.server.SecurityDomain; +import org.wildfly.security.auth.server.SecurityRealm; + import com.oracle.svm.core.annotate.Substitute; import com.oracle.svm.core.annotate.TargetClass; public class SubstituteElytronClasses { } +@TargetClass(LdapRealmConfiguration.class) +final class Target_LdapRealmConfiguration { + @Substitute + public SecurityRealm build(SecurityConfiguration security, RealmConfiguration realm, SecurityDomain.Builder domainBuilder, Properties properties) { + return LdapSecurityRealmBuilder.builder().build(); + } +} + @TargetClass(className = "org.wildfly.security.key.KeyUtil$KeyClonerCreator") final class Target_org_wildfly_security_key_KeyUtil_KeyClonerCreator { @Substitute diff --git a/server/runtime/src/main/java/org/infinispan/quarkus/server/runtime/graal/SubstituteLoggingClasses.java b/server/runtime/src/main/java/org/infinispan/quarkus/server/runtime/graal/SubstituteLoggingClasses.java index 979edce7..dfdc8c81 100644 --- a/server/runtime/src/main/java/org/infinispan/quarkus/server/runtime/graal/SubstituteLoggingClasses.java +++ b/server/runtime/src/main/java/org/infinispan/quarkus/server/runtime/graal/SubstituteLoggingClasses.java @@ -1,9 +1,16 @@ package org.infinispan.quarkus.server.runtime.graal; +import org.infinispan.configuration.parsing.ConfigurationBuilderHolder; import org.infinispan.rest.RestServer; import org.infinispan.rest.framework.ResourceManager; import org.infinispan.rest.resources.LoggingResource; +import org.infinispan.server.Server; +import org.infinispan.server.core.admin.AdminServerTask; +import org.infinispan.server.tasks.admin.LoggingRemoveTask; +import org.infinispan.server.tasks.admin.LoggingSetTask; +import org.infinispan.server.tasks.admin.ServerAdminOperationsHandler; +import com.oracle.svm.core.annotate.Alias; import com.oracle.svm.core.annotate.Delete; import com.oracle.svm.core.annotate.Substitute; import com.oracle.svm.core.annotate.TargetClass; @@ -24,3 +31,32 @@ private void registerLoggingResource(ResourceManager resourceManager, String res final class Target_LoggingResource { } + +@TargetClass(Server.class) +final class Target_Server { + @Substitute + private void shutdownLog4jLogManager() { + // Do nothing + } +} + +@TargetClass(ServerAdminOperationsHandler.class) +final class Target_ServerAdminOperationsHandler { + @Substitute + private static AdminServerTask[] generateTasks(ConfigurationBuilderHolder defaultsHolder) { + return generateTasksWithoutLogging(defaultsHolder); + } + + @Alias + private static AdminServerTask[] generateTasksWithoutLogging(ConfigurationBuilderHolder defaultsHolder) { + return null; + } +} + +@Delete +@TargetClass(LoggingRemoveTask.class) +final class Target_LoggingRemoveTask { } + +@Delete +@TargetClass(LoggingSetTask.class) +final class Target_LoggingSetTask { } diff --git a/server/runtime/src/main/java/org/infinispan/quarkus/server/runtime/graal/SubstituteNettyClasses.java b/server/runtime/src/main/java/org/infinispan/quarkus/server/runtime/graal/SubstituteNettyClasses.java index 07c8300a..3e24274c 100644 --- a/server/runtime/src/main/java/org/infinispan/quarkus/server/runtime/graal/SubstituteNettyClasses.java +++ b/server/runtime/src/main/java/org/infinispan/quarkus/server/runtime/graal/SubstituteNettyClasses.java @@ -1,6 +1,7 @@ package org.infinispan.quarkus.server.runtime.graal; import java.util.concurrent.ExecutorService; +import java.util.concurrent.ThreadFactory; import org.infinispan.server.core.configuration.ProtocolServerConfiguration; import org.infinispan.server.core.logging.Log; @@ -12,6 +13,7 @@ import com.oracle.svm.core.annotate.TargetClass; import io.netty.channel.EventLoopGroup; +import io.netty.channel.MultithreadEventLoopGroup; import io.netty.channel.ServerChannel; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; @@ -41,9 +43,10 @@ private Class getServerSocketChannel() { } @Substitute - private EventLoopGroup buildEventLoop(int nThreads, DefaultThreadFactory threadFactory) { - EventLoopGroup eventLoop = new NioEventLoopGroup(nThreads, threadFactory); - log.createdNettyEventLoop(eventLoop.getClass().getName(), configuration.toString()); + public static MultithreadEventLoopGroup buildEventLoop(int nThreads, ThreadFactory threadFactory, + String configuration) { + MultithreadEventLoopGroup eventLoop = new NioEventLoopGroup(nThreads, threadFactory); + log.createdNettyEventLoop(eventLoop.getClass().getName(), configuration); return eventLoop; } }