diff --git a/subsystem/src/main/java/org/wildfly/extension/vertx/VertxConstants.java b/subsystem/src/main/java/org/wildfly/extension/vertx/VertxConstants.java index fb6a242..83f69b3 100644 --- a/subsystem/src/main/java/org/wildfly/extension/vertx/VertxConstants.java +++ b/subsystem/src/main/java/org/wildfly/extension/vertx/VertxConstants.java @@ -27,6 +27,7 @@ public interface VertxConstants { String[] TIME_UNITS = Arrays.stream(TimeUnit.values()).map(Enum::toString).collect(Collectors.toList()).toArray(new String[0]); + String CDI_NAMED_QUALIFIER = "vertx"; String VERTX_SERVICE = "vertx"; String ELEMENT_VERTX = "vertx"; diff --git a/subsystem/src/main/java/org/wildfly/extension/vertx/logging/VertxLogger.java b/subsystem/src/main/java/org/wildfly/extension/vertx/logging/VertxLogger.java index 2601113..43bf93a 100644 --- a/subsystem/src/main/java/org/wildfly/extension/vertx/logging/VertxLogger.java +++ b/subsystem/src/main/java/org/wildfly/extension/vertx/logging/VertxLogger.java @@ -58,4 +58,8 @@ public interface VertxLogger extends BasicLogger { @LogMessage(level = INFO) @Message(id = 8, value = "Use Vertx instance from vertx subsystem") void useVertxFromSubsystem(); + + @Message(id = 9, value = "There is no vertx defined from vertx subsystem") + IllegalStateException noVertxDefined(); + } diff --git a/subsystem/src/main/java/org/wildfly/extension/vertx/processors/CDIExtension.java b/subsystem/src/main/java/org/wildfly/extension/vertx/processors/CDIExtension.java index 3cbb27b..c10d102 100644 --- a/subsystem/src/main/java/org/wildfly/extension/vertx/processors/CDIExtension.java +++ b/subsystem/src/main/java/org/wildfly/extension/vertx/processors/CDIExtension.java @@ -18,6 +18,7 @@ import jakarta.enterprise.context.spi.CreationalContext; import jakarta.enterprise.event.Observes; +import jakarta.enterprise.inject.literal.NamedLiteral; import jakarta.enterprise.inject.spi.AfterBeanDiscovery; import jakarta.enterprise.inject.spi.AnnotatedType; import jakarta.enterprise.inject.spi.Bean; @@ -27,11 +28,17 @@ import jakarta.enterprise.inject.spi.InjectionPoint; import jakarta.enterprise.inject.spi.InjectionTarget; import jakarta.enterprise.inject.spi.InjectionTargetFactory; +import org.wildfly.extension.vertx.VertxProxy; import org.wildfly.extension.vertx.VertxProxyHolder; import org.wildfly.extension.vertx.logging.VertxLogger; +import java.lang.annotation.Annotation; +import java.lang.reflect.Type; +import java.util.HashSet; import java.util.Set; +import static org.wildfly.extension.vertx.VertxConstants.CDI_NAMED_QUALIFIER; + /** * CDI Extension which adds the ability to inject the Vertx instances by the member name. * @@ -44,87 +51,123 @@ public CDIExtension() { public void registerVertxBean(@Observes AfterBeanDiscovery afterBeanDiscovery, BeanManager beanManager) { if (VertxProxyHolder.instance().getVertxProxy() != null) { - VertxLogger.VERTX_LOGGER.useVertxFromSubsystem(); + final String vpName = CDI_NAMED_QUALIFIER; AnnotatedType rawVertxAnnotatedType = beanManager.createAnnotatedType(io.vertx.core.Vertx.class); - BeanAttributes rawVertxBeanAttributes = beanManager.createBeanAttributes(rawVertxAnnotatedType); + BeanAttributes rawVertxBeanAttributes = + new BeanAttributesWrapper<>(beanManager.createBeanAttributes(rawVertxAnnotatedType), Set.of(NamedLiteral.of(vpName))); afterBeanDiscovery.addBean(beanManager.createBean(rawVertxBeanAttributes, io.vertx.core.Vertx.class, new RawVertxProducer())); AnnotatedType annotatedType = beanManager.createAnnotatedType(io.vertx.mutiny.core.Vertx.class); - BeanAttributes beanAttributes = beanManager.createBeanAttributes(annotatedType); + BeanAttributes beanAttributes = + new BeanAttributesWrapper<>(beanManager.createBeanAttributes(annotatedType), Set.of(NamedLiteral.of(vpName))); afterBeanDiscovery.addBean(beanManager.createBean(beanAttributes, io.vertx.mutiny.core.Vertx.class, new MunityVertxProducer())); } } - private class MunityVertxProducer implements InjectionTargetFactory { + private static class BeanAttributesWrapper implements BeanAttributes { + private final BeanAttributes delegate; + private final Set qualifiers; + + BeanAttributesWrapper(BeanAttributes delegate, Set additionalQualifiers) { + this.delegate = delegate; + this.qualifiers = new HashSet<>(delegate.getQualifiers()); + this.qualifiers.addAll(additionalQualifiers); + } + @Override - public InjectionTarget createInjectionTarget(Bean bean) { - return new InjectionTarget<>() { - @Override - public void inject(io.vertx.mutiny.core.Vertx instance, CreationalContext ctx) { - } + public Set getTypes() { + return delegate.getTypes(); + } - @Override - public void postConstruct(io.vertx.mutiny.core.Vertx instance) { - } + @Override + public Set getQualifiers() { + return qualifiers; + } - @Override - public void preDestroy(io.vertx.mutiny.core.Vertx instance) { - } + @Override + public Class getScope() { + return delegate.getScope(); + } - @Override - public io.vertx.mutiny.core.Vertx produce(CreationalContext ctx) { - return mutinyVertx(); - } + @Override + public String getName() { + return delegate.getName(); + } - @Override - public void dispose(io.vertx.mutiny.core.Vertx instance) { - } + @Override + public Set> getStereotypes() { + return delegate.getStereotypes(); + } - @Override - public Set getInjectionPoints() { - return Set.of(); - } - }; + @Override + public boolean isAlternative() { + return delegate.isAlternative(); } + } - private class RawVertxProducer implements InjectionTargetFactory { + + private abstract static class AbstractVertxInjectionTarget implements InjectionTarget { @Override - public InjectionTarget createInjectionTarget(Bean bean) { - return new InjectionTarget<>() { - @Override - public void inject(io.vertx.core.Vertx instance, CreationalContext ctx) { - } + public void inject(T instance, CreationalContext ctx) { + } - @Override - public void postConstruct(io.vertx.core.Vertx instance) { - } + @Override + public void postConstruct(T instance) { + } - @Override - public void preDestroy(io.vertx.core.Vertx instance) { - } + @Override + public void preDestroy(T instance) { + } - @Override - public io.vertx.core.Vertx produce(CreationalContext ctx) { - return rawVertx(); - } + @Override + public void dispose(T instance) { + } + + @Override + public Set getInjectionPoints() { + return Set.of(); + } + } + + private static class MunityVertxProducer implements InjectionTargetFactory { + @Override + public InjectionTarget createInjectionTarget(Bean bean) { + return new AbstractVertxInjectionTarget<>() { @Override - public void dispose(io.vertx.core.Vertx instance) { + public io.vertx.mutiny.core.Vertx produce(CreationalContext ctx) { + return mutinyVertx(); } - + }; + } + } + private static class RawVertxProducer implements InjectionTargetFactory { + @Override + public InjectionTarget createInjectionTarget(Bean bean) { + return new AbstractVertxInjectionTarget<>() { @Override - public Set getInjectionPoints() { - return Set.of(); + public io.vertx.core.Vertx produce(CreationalContext ctx) { + return rawVertx(); } }; } } - private io.vertx.mutiny.core.Vertx mutinyVertx() { - return VertxProxyHolder.instance().getVertxProxy().getMutiyVertx(); + private static io.vertx.mutiny.core.Vertx mutinyVertx() { + VertxProxy vertxProxy = VertxProxyHolder.instance().getVertxProxy(); + if (vertxProxy == null) { + throw VertxLogger.VERTX_LOGGER.noVertxDefined(); + } + VertxLogger.VERTX_LOGGER.useVertxFromSubsystem(); + return vertxProxy.getMutiyVertx(); } - private io.vertx.core.Vertx rawVertx() { - return VertxProxyHolder.instance().getVertxProxy().getVertx(); + private static io.vertx.core.Vertx rawVertx() { + VertxProxy vertxProxy = VertxProxyHolder.instance().getVertxProxy(); + if (vertxProxy == null) { + throw VertxLogger.VERTX_LOGGER.noVertxDefined(); + } + VertxLogger.VERTX_LOGGER.useVertxFromSubsystem(); + return vertxProxy.getVertx(); } }