diff --git a/arc/deployment/pom.xml b/arc/deployment/pom.xml new file mode 100644 index 0000000000000..06703166e2233 --- /dev/null +++ b/arc/deployment/pom.xml @@ -0,0 +1,30 @@ + + + + shamrock-weld + org.jboss.shamrock + 1.0.0.Alpha1-SNAPSHOT + ../ + + 4.0.0 + + shamrock-arc-deployment + + + + org.jboss.shamrock + shamrock-core-deployment + + + org.jboss.shamrock + shamrock-arc-runtime + + + org.jboss.protean.arc + arc-processor + + + + diff --git a/arc/deployment/src/main/java/org/jboss/shamrock/arc/deployment/ArcAnnotationProcessor.java b/arc/deployment/src/main/java/org/jboss/shamrock/arc/deployment/ArcAnnotationProcessor.java new file mode 100644 index 0000000000000..b1792576b7017 --- /dev/null +++ b/arc/deployment/src/main/java/org/jboss/shamrock/arc/deployment/ArcAnnotationProcessor.java @@ -0,0 +1,138 @@ +package org.jboss.shamrock.arc.deployment; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import javax.inject.Inject; + +import org.jboss.jandex.ClassInfo; +import org.jboss.jandex.CompositeIndex; +import org.jboss.jandex.DotName; +import org.jboss.jandex.IndexView; +import org.jboss.jandex.Indexer; +import org.jboss.protean.arc.ArcContainer; +import org.jboss.protean.arc.processor.BeanProcessor; +import org.jboss.protean.arc.processor.BeanProcessor.Builder; +import org.jboss.protean.arc.processor.ResourceOutput; +import org.jboss.shamrock.arc.runtime.ArcDeploymentTemplate; +import org.jboss.shamrock.deployment.ArchiveContext; +import org.jboss.shamrock.deployment.BeanArchiveIndex; +import org.jboss.shamrock.deployment.BeanDeployment; +import org.jboss.shamrock.deployment.ProcessorContext; +import org.jboss.shamrock.deployment.ResourceProcessor; +import org.jboss.shamrock.deployment.RuntimePriority; +import org.jboss.shamrock.deployment.codegen.BytecodeRecorder; + +import io.smallrye.config.inject.ConfigProducer; + +public class ArcAnnotationProcessor implements ResourceProcessor { + + @Inject + BeanDeployment beanDeployment; + + @Inject + BeanArchiveIndex beanArchiveIndex; + + @Override + public void process(ArchiveContext archiveContext, ProcessorContext processorContext) throws Exception { + try (BytecodeRecorder recorder = processorContext.addStaticInitTask(RuntimePriority.ARC_DEPLOYMENT)) { + + ArcDeploymentTemplate template = recorder.getRecordingProxy(ArcDeploymentTemplate.class); + + List additionalBeanDefiningAnnotations = new ArrayList<>(); + additionalBeanDefiningAnnotations.add(DotName.createSimple("javax.servlet.annotation.WebServlet")); + additionalBeanDefiningAnnotations.add(DotName.createSimple("javax.ws.rs.Path")); + + // TODO MP config + beanDeployment.addAdditionalBean(ConfigProducer.class); + + // Index bean classes registered by shamrock + Indexer indexer = new Indexer(); + Set additionalIndex = new HashSet<>(); + for (Class beanClass : beanDeployment.getAdditionalBeans()) { + indexBeanClass(beanClass, indexer, beanArchiveIndex.getIndex(), additionalIndex); + } + CompositeIndex index = CompositeIndex.create(indexer.complete(), beanArchiveIndex.getIndex()); + Set frameworkPackages = additionalIndex.stream().map(dotName -> { + String name = dotName.toString(); + return name.toString().substring(0, name.lastIndexOf(".")); + }).collect(Collectors.toSet()); + + Builder builder = BeanProcessor.builder(); + builder.setIndex(index); + builder.setAdditionalBeanDefiningAnnotations(additionalBeanDefiningAnnotations); + builder.setSharedAnnotationLiterals(false); + builder.setOutput(new ResourceOutput() { + @Override + public void writeResource(Resource resource) throws IOException { + switch (resource.getType()) { + case JAVA_CLASS: + // TODO a better way to identify app classes + boolean isAppClass = true; + for (String frameworkPackage : frameworkPackages) { + if (resource.getFullyQualifiedName().startsWith(frameworkPackage)) { + isAppClass = false; + } + } + System.out.println("Add " + (isAppClass ? "APP" : "FWK") + " class: " + resource.getFullyQualifiedName()); + processorContext.addGeneratedClass(isAppClass, resource.getName(), resource.getData()); + break; + case SERVICE_PROVIDER: + processorContext.addResource("META-INF/services/" + resource.getName(), resource.getData()); + default: + break; + } + } + }); + BeanProcessor beanProcessor = builder.build(); + beanProcessor.process(); + + ArcContainer container = template.getContainer(); + template.initBeanContainer(container); + template.setupInjection(container); + } + } + + @Override + public int getPriority() { + return RuntimePriority.ARC_DEPLOYMENT; + } + + private void indexBeanClass(Class beanClass, Indexer indexer, IndexView shamrockIndex, Set additionalIndex) { + DotName beanClassName = DotName.createSimple(beanClass.getName()); + if (additionalIndex.contains(beanClassName)) { + return; + } + ClassInfo beanInfo = shamrockIndex.getClassByName(beanClassName); + if (beanInfo == null) { + System.out.println("Index bean class: " + beanClass); + try (InputStream stream = ArcAnnotationProcessor.class.getClassLoader().getResourceAsStream(beanClass.getName().replace('.', '/') + ".class")) { + beanInfo = indexer.index(stream); + additionalIndex.add(beanInfo.name()); + } catch (IOException e) { + throw new IllegalStateException("Failed to index: " + beanClass); + } + } else { + // The class could be indexed by shamrock - we still need to distinguish framework classes + additionalIndex.add(beanClassName); + } + for (DotName annotationName : beanInfo.annotations().keySet()) { + if (!additionalIndex.contains(annotationName) && shamrockIndex.getClassByName(annotationName) == null) { + try (InputStream annotationStream = ArcAnnotationProcessor.class.getClassLoader() + .getResourceAsStream(annotationName.toString().replace('.', '/') + ".class")) { + System.out.println("Index annotation: " + annotationName); + indexer.index(annotationStream); + additionalIndex.add(annotationName); + } catch (IOException e) { + throw new IllegalStateException("Failed to index: " + beanClass); + } + } + } + } + +} diff --git a/arc/deployment/src/main/java/org/jboss/shamrock/arc/deployment/ArcSetup.java b/arc/deployment/src/main/java/org/jboss/shamrock/arc/deployment/ArcSetup.java new file mode 100644 index 0000000000000..3bfa7bfeb81b7 --- /dev/null +++ b/arc/deployment/src/main/java/org/jboss/shamrock/arc/deployment/ArcSetup.java @@ -0,0 +1,12 @@ +package org.jboss.shamrock.arc.deployment; + +import org.jboss.shamrock.deployment.SetupContext; +import org.jboss.shamrock.deployment.ShamrockSetup; + +public class ArcSetup implements ShamrockSetup { + + @Override + public void setup(SetupContext context) { + context.addResourceProcessor(new ArcAnnotationProcessor()); + } +} diff --git a/arc/deployment/src/main/resources/META-INF/services/org.jboss.shamrock.deployment.ShamrockSetup b/arc/deployment/src/main/resources/META-INF/services/org.jboss.shamrock.deployment.ShamrockSetup new file mode 100644 index 0000000000000..89629606d26c8 --- /dev/null +++ b/arc/deployment/src/main/resources/META-INF/services/org.jboss.shamrock.deployment.ShamrockSetup @@ -0,0 +1 @@ +org.jboss.shamrock.arc.deployment.ArcSetup \ No newline at end of file diff --git a/arc/pom.xml b/arc/pom.xml new file mode 100644 index 0000000000000..42653e6450919 --- /dev/null +++ b/arc/pom.xml @@ -0,0 +1,19 @@ + + + + shamrock-parent + org.jboss.shamrock + 1.0.0.Alpha1-SNAPSHOT + + 4.0.0 + + shamrock-arc + pom + + deployment + runtime + + + diff --git a/arc/runtime/pom.xml b/arc/runtime/pom.xml new file mode 100644 index 0000000000000..4e403e40f3401 --- /dev/null +++ b/arc/runtime/pom.xml @@ -0,0 +1,34 @@ + + + + shamrock-weld + org.jboss.shamrock + 1.0.0.Alpha1-SNAPSHOT + ../ + + 4.0.0 + + shamrock-arc-runtime + + + + org.jboss.protean.arc + arc-runtime + + + + org.jboss.shamrock + shamrock-core-runtime + + + + + + + maven-dependency-plugin + + + + diff --git a/arc/runtime/src/main/java/org/jboss/shamrock/arc/runtime/ArcDeploymentTemplate.java b/arc/runtime/src/main/java/org/jboss/shamrock/arc/runtime/ArcDeploymentTemplate.java new file mode 100644 index 0000000000000..7056c4f755e5d --- /dev/null +++ b/arc/runtime/src/main/java/org/jboss/shamrock/arc/runtime/ArcDeploymentTemplate.java @@ -0,0 +1,69 @@ +package org.jboss.shamrock.arc.runtime; + +import java.lang.annotation.Annotation; + +import org.jboss.protean.arc.Arc; +import org.jboss.protean.arc.ArcContainer; +import org.jboss.protean.arc.InstanceHandle; +import org.jboss.shamrock.runtime.BeanContainer; +import org.jboss.shamrock.runtime.ContextObject; +import org.jboss.shamrock.runtime.InjectionFactory; +import org.jboss.shamrock.runtime.InjectionInstance; +import org.jboss.shamrock.runtime.RuntimeInjector; + +/** + * + * @author Martin Kouba + */ +public class ArcDeploymentTemplate { + + @ContextObject("arc.container") + public ArcContainer getContainer() throws Exception { + ArcContainer container = Arc.container(); + return container; + } + + @ContextObject("bean.container") + public BeanContainer initBeanContainer(ArcContainer container) throws Exception { + return new BeanContainer() { + + @Override + public T instance(Class type, Annotation... qualifiers) { + InstanceHandle handle = container.instance(type, qualifiers); + if (!handle.isAvailable()) { + throw new IllegalStateException(type + " instance not available in container: " + container); + } + return handle.get(); + } + }; + } + + public void setupInjection(ArcContainer container) { + RuntimeInjector.setFactory(new InjectionFactory() { + @Override + public InjectionInstance create(Class type) { + InstanceHandle instance = container.instance(type); + if (instance.isAvailable()) { + return new InjectionInstance() { + @Override + public T newInstance() { + return instance.get(); + } + }; + } else { + return new InjectionInstance() { + @Override + public T newInstance() { + try { + return type.newInstance(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + }; + } + } + }); + } + +} diff --git a/weld/deployment/src/main/java/org/jboss/shamrock/weld/deployment/BeanArchiveIndex.java b/core/deployment/src/main/java/org/jboss/shamrock/deployment/BeanArchiveIndex.java similarity index 84% rename from weld/deployment/src/main/java/org/jboss/shamrock/weld/deployment/BeanArchiveIndex.java rename to core/deployment/src/main/java/org/jboss/shamrock/deployment/BeanArchiveIndex.java index 6bb92c0429dbd..4aba997d6223c 100644 --- a/weld/deployment/src/main/java/org/jboss/shamrock/weld/deployment/BeanArchiveIndex.java +++ b/core/deployment/src/main/java/org/jboss/shamrock/deployment/BeanArchiveIndex.java @@ -1,4 +1,4 @@ -package org.jboss.shamrock.weld.deployment; +package org.jboss.shamrock.deployment; import org.jboss.jandex.IndexView; diff --git a/weld/deployment/src/main/java/org/jboss/shamrock/weld/deployment/BeanArchiveProcessor.java b/core/deployment/src/main/java/org/jboss/shamrock/deployment/BeanArchiveProcessor.java similarity index 76% rename from weld/deployment/src/main/java/org/jboss/shamrock/weld/deployment/BeanArchiveProcessor.java rename to core/deployment/src/main/java/org/jboss/shamrock/deployment/BeanArchiveProcessor.java index 0ce1ab89bb63f..3414d212778b6 100644 --- a/weld/deployment/src/main/java/org/jboss/shamrock/weld/deployment/BeanArchiveProcessor.java +++ b/core/deployment/src/main/java/org/jboss/shamrock/deployment/BeanArchiveProcessor.java @@ -1,4 +1,4 @@ -package org.jboss.shamrock.weld.deployment; +package org.jboss.shamrock.deployment; import java.util.ArrayList; import java.util.List; @@ -7,10 +7,6 @@ import org.jboss.jandex.CompositeIndex; import org.jboss.jandex.IndexView; -import org.jboss.shamrock.deployment.ApplicationArchive; -import org.jboss.shamrock.deployment.ArchiveContext; -import org.jboss.shamrock.deployment.ProcessorContext; -import org.jboss.shamrock.deployment.ResourceProcessor; public class BeanArchiveProcessor implements ResourceProcessor { diff --git a/core/deployment/src/main/java/org/jboss/shamrock/deployment/BeanDeployment.java b/core/deployment/src/main/java/org/jboss/shamrock/deployment/BeanDeployment.java new file mode 100644 index 0000000000000..c6ddd8e0dd9c6 --- /dev/null +++ b/core/deployment/src/main/java/org/jboss/shamrock/deployment/BeanDeployment.java @@ -0,0 +1,19 @@ +package org.jboss.shamrock.deployment; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class BeanDeployment { + + private final List> additionalBeans = new ArrayList<>(); + + public void addAdditionalBean(Class ... beanClass) { + additionalBeans.addAll(Arrays.asList(beanClass)); + } + + public List> getAdditionalBeans() { + return additionalBeans; + } + +} diff --git a/weld/deployment/src/main/java/org/jboss/shamrock/weld/deployment/WeldInjectionProvider.java b/core/deployment/src/main/java/org/jboss/shamrock/deployment/BeanDeploymentInjectionProvider.java similarity index 60% rename from weld/deployment/src/main/java/org/jboss/shamrock/weld/deployment/WeldInjectionProvider.java rename to core/deployment/src/main/java/org/jboss/shamrock/deployment/BeanDeploymentInjectionProvider.java index 3f2d2b302ab1f..3a39d82434988 100644 --- a/weld/deployment/src/main/java/org/jboss/shamrock/weld/deployment/WeldInjectionProvider.java +++ b/core/deployment/src/main/java/org/jboss/shamrock/deployment/BeanDeploymentInjectionProvider.java @@ -1,25 +1,23 @@ -package org.jboss.shamrock.weld.deployment; +package org.jboss.shamrock.deployment; import java.util.Arrays; import java.util.HashSet; import java.util.Set; -import org.jboss.shamrock.deployment.InjectionProvider; +public class BeanDeploymentInjectionProvider implements InjectionProvider { -public class WeldInjectionProvider implements InjectionProvider { + private final BeanDeployment deployment = new BeanDeployment(); - private final WeldDeployment deployment = new WeldDeployment(); private final BeanArchiveIndex beanArchiveIndex = new BeanArchiveIndex(); @Override public Set> getProvidedTypes() { - - return new HashSet<>(Arrays.asList(WeldDeployment.class, BeanArchiveIndex.class)); + return new HashSet<>(Arrays.asList(BeanDeployment.class, BeanArchiveIndex.class)); } @Override public T getInstance(Class type) { - if (type == WeldDeployment.class) { + if(type == BeanDeployment.class) { return (T) deployment; } if (type == BeanArchiveIndex.class) { diff --git a/core/deployment/src/main/java/org/jboss/shamrock/deployment/BuildTimeGenerator.java b/core/deployment/src/main/java/org/jboss/shamrock/deployment/BuildTimeGenerator.java index 56a7b078dfafa..ed214b0771f15 100644 --- a/core/deployment/src/main/java/org/jboss/shamrock/deployment/BuildTimeGenerator.java +++ b/core/deployment/src/main/java/org/jboss/shamrock/deployment/BuildTimeGenerator.java @@ -201,6 +201,11 @@ public void addGeneratedClass(boolean applicationClass, String name, byte[] clas output.writeClass(applicationClass, name, classData); } + @Override + public void addResource(String name, byte[] data) throws IOException { + output.writeResource(name, data); + } + @Override public void addByteCodeTransformer(Function> visitorFunction) { bytecodeTransformers.add(visitorFunction); diff --git a/core/deployment/src/main/java/org/jboss/shamrock/deployment/ClassOutput.java b/core/deployment/src/main/java/org/jboss/shamrock/deployment/ClassOutput.java index fc025799dce5b..e827bead9964d 100644 --- a/core/deployment/src/main/java/org/jboss/shamrock/deployment/ClassOutput.java +++ b/core/deployment/src/main/java/org/jboss/shamrock/deployment/ClassOutput.java @@ -16,4 +16,6 @@ public interface ClassOutput { */ void writeClass(boolean applicationClass, String className, byte[] data) throws IOException; + void writeResource(String name, byte[] data) throws IOException; + } diff --git a/core/deployment/src/main/java/org/jboss/shamrock/deployment/CoreSetup.java b/core/deployment/src/main/java/org/jboss/shamrock/deployment/CoreSetup.java index 4d88dfee50ecc..f4fa41262bedf 100644 --- a/core/deployment/src/main/java/org/jboss/shamrock/deployment/CoreSetup.java +++ b/core/deployment/src/main/java/org/jboss/shamrock/deployment/CoreSetup.java @@ -4,5 +4,7 @@ public class CoreSetup implements ShamrockSetup { @Override public void setup(SetupContext context) { context.addInjectionProvider(new ConfigInjectionProvider()); + context.addInjectionProvider(new BeanDeploymentInjectionProvider()); + context.addResourceProcessor(new BeanArchiveProcessor()); } } diff --git a/core/deployment/src/main/java/org/jboss/shamrock/deployment/ProcessorContext.java b/core/deployment/src/main/java/org/jboss/shamrock/deployment/ProcessorContext.java index d27bcd41558b7..5215d5e2ff8fb 100644 --- a/core/deployment/src/main/java/org/jboss/shamrock/deployment/ProcessorContext.java +++ b/core/deployment/src/main/java/org/jboss/shamrock/deployment/ProcessorContext.java @@ -50,6 +50,8 @@ public interface ProcessorContext { */ void addGeneratedClass(boolean applicationClass, String name, byte[] classData) throws IOException; + void addResource(String name, byte[] data) throws IOException; + /** * Adds a bytecode transformer that can transform application classes. *

diff --git a/core/deployment/src/main/java/org/jboss/shamrock/deployment/RuntimePriority.java b/core/deployment/src/main/java/org/jboss/shamrock/deployment/RuntimePriority.java index e8276c7efe700..146bab928106c 100644 --- a/core/deployment/src/main/java/org/jboss/shamrock/deployment/RuntimePriority.java +++ b/core/deployment/src/main/java/org/jboss/shamrock/deployment/RuntimePriority.java @@ -12,6 +12,7 @@ public class RuntimePriority { public static final int HEALTH_DEPLOYMENT = 260; public static final int WELD_DEPLOYMENT = 300; public static final int JAXRS_DEPLOYMENT = 350; + public static final int ARC_DEPLOYMENT = 300; public static final int UNDERTOW_DEPLOY = 400; public static final int UNDERTOW_START = 500; diff --git a/core/deployment/src/main/java/org/jboss/shamrock/runner/RuntimeClassLoader.java b/core/deployment/src/main/java/org/jboss/shamrock/runner/RuntimeClassLoader.java index 432ba1cd5d235..d17feae3c9ab8 100644 --- a/core/deployment/src/main/java/org/jboss/shamrock/runner/RuntimeClassLoader.java +++ b/core/deployment/src/main/java/org/jboss/shamrock/runner/RuntimeClassLoader.java @@ -1,19 +1,19 @@ package org.jboss.shamrock.runner; +import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; -import java.lang.reflect.AccessibleObject; -import java.lang.reflect.Field; -import java.lang.reflect.Method; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.net.URLStreamHandler; import java.nio.file.Files; import java.nio.file.Path; -import java.security.AccessController; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; -import java.security.ProtectionDomain; import java.util.ArrayList; +import java.util.Collections; +import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -27,13 +27,13 @@ import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassWriter; -import sun.misc.Unsafe; - public class RuntimeClassLoader extends ClassLoader implements ClassOutput, Consumer>>> { private final Map appClasses = new HashMap<>(); private final Set frameworkClasses = new HashSet<>(); + private final Map resources = new HashMap<>(); + private volatile List>> functions = null; private final Path applicationClasses; @@ -46,6 +46,31 @@ public RuntimeClassLoader(ClassLoader parent, Path applicationClasses) { this.applicationClasses = applicationClasses; } + @Override + public Enumeration getResources(String name) throws IOException { + // TODO some superugly hack for bean provider + byte[] data = resources.get(name); + if (data != null) { + URL url = new URL(null, "shamrock:" + name + "/", new URLStreamHandler() { + @Override + protected URLConnection openConnection(final URL u) throws IOException { + return new URLConnection(u) { + @Override + public void connect() throws IOException { + } + + @Override + public InputStream getInputStream() throws IOException { + return new ByteArrayInputStream(resources.get(name)); + } + }; + } + }); + return Collections.enumeration(Collections.singleton(url)); + } + return super.getResources(name); + } + @Override protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException { Class ex = findLoadedClass(name); @@ -137,8 +162,12 @@ public void writeClass(boolean applicationClass, String className, byte[] data) } } - @Override public void accept(List>> functions) { this.functions = functions; } + + public void writeResource(String name, byte[] data) throws IOException { + resources.put(name, data); + } + } diff --git a/core/deployment/src/test/java/org/jboss/shamrock/deployment/codegen/BytecodeRecorderTestCase.java b/core/deployment/src/test/java/org/jboss/shamrock/deployment/codegen/BytecodeRecorderTestCase.java index 615856342f165..bdfa62f7afb93 100644 --- a/core/deployment/src/test/java/org/jboss/shamrock/deployment/codegen/BytecodeRecorderTestCase.java +++ b/core/deployment/src/test/java/org/jboss/shamrock/deployment/codegen/BytecodeRecorderTestCase.java @@ -106,5 +106,10 @@ public TestClassOutput(TestClassLoader tcl) { public void writeClass(boolean applicationClass, String className, byte[] data) throws IOException { tcl.write(className, data); } + + @Override + public void writeResource(String name, byte[] data) throws IOException { + throw new UnsupportedOperationException(); + } } } diff --git a/core/runtime/src/main/java/org/jboss/shamrock/runtime/BeanContainer.java b/core/runtime/src/main/java/org/jboss/shamrock/runtime/BeanContainer.java new file mode 100644 index 0000000000000..ddfb3f47e6445 --- /dev/null +++ b/core/runtime/src/main/java/org/jboss/shamrock/runtime/BeanContainer.java @@ -0,0 +1,9 @@ +package org.jboss.shamrock.runtime; + +import java.lang.annotation.Annotation; + +public interface BeanContainer { + + T instance(Class type, Annotation... qualifiers); + +} diff --git a/examples/permissive/pom.xml b/examples/permissive/pom.xml index 6e727ab510bfc..86d646c007421 100644 --- a/examples/permissive/pom.xml +++ b/examples/permissive/pom.xml @@ -17,11 +17,6 @@ shamrock-undertow-deployment provided - - org.jboss.shamrock - shamrock-weld-deployment - provided - org.jboss.shamrock shamrock-jaxrs-deployment @@ -126,6 +121,39 @@ + + + weld + + + !arc + + + + + org.jboss.shamrock + shamrock-weld-deployment + provided + + + + + + arc + + + arc + true + + + + + org.jboss.shamrock + shamrock-arc-deployment + provided + + + diff --git a/examples/permissive/src/main/java/org/jboss/shamrock/example/InjectionServlet.java b/examples/permissive/src/main/java/org/jboss/shamrock/example/InjectionServlet.java index c8372faca86c5..cc945ac295363 100644 --- a/examples/permissive/src/main/java/org/jboss/shamrock/example/InjectionServlet.java +++ b/examples/permissive/src/main/java/org/jboss/shamrock/example/InjectionServlet.java @@ -13,7 +13,7 @@ public class InjectionServlet extends HttpServlet { @Inject - private MessageBean messageBean; + MessageBean messageBean; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { diff --git a/examples/permissive/src/main/java/org/jboss/shamrock/example/MessageBean.java b/examples/permissive/src/main/java/org/jboss/shamrock/example/MessageBean.java index 70f945622122b..7723f71bcee03 100644 --- a/examples/permissive/src/main/java/org/jboss/shamrock/example/MessageBean.java +++ b/examples/permissive/src/main/java/org/jboss/shamrock/example/MessageBean.java @@ -1,9 +1,8 @@ package org.jboss.shamrock.example; -import javax.enterprise.context.ApplicationScoped; - import java.util.Optional; +import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; import org.eclipse.microprofile.config.Config; @@ -12,7 +11,7 @@ public class MessageBean { @Inject - private Config config; + Config config; public String getMessage() { Optional message = config.getOptionalValue("message", String.class); diff --git a/examples/permissive/src/main/java/org/jboss/shamrock/example/SimpleHealthCheck.java b/examples/permissive/src/main/java/org/jboss/shamrock/example/SimpleHealthCheck.java index 6212ca57cb65e..c2e459db51230 100644 --- a/examples/permissive/src/main/java/org/jboss/shamrock/example/SimpleHealthCheck.java +++ b/examples/permissive/src/main/java/org/jboss/shamrock/example/SimpleHealthCheck.java @@ -3,13 +3,17 @@ import java.util.Map; import java.util.Optional; +import javax.enterprise.context.Dependent; + import org.eclipse.microprofile.health.Health; import org.eclipse.microprofile.health.HealthCheck; import org.eclipse.microprofile.health.HealthCheckResponse; +@Dependent @Health public class SimpleHealthCheck implements HealthCheck { - @Override + + @Override public HealthCheckResponse call() { return new HealthCheckResponse() { @Override diff --git a/examples/permissive/src/main/java/org/jboss/shamrock/example/rest/InjectionResource.java b/examples/permissive/src/main/java/org/jboss/shamrock/example/rest/InjectionResource.java index c3adaa8087d91..cc82bd5595b63 100644 --- a/examples/permissive/src/main/java/org/jboss/shamrock/example/rest/InjectionResource.java +++ b/examples/permissive/src/main/java/org/jboss/shamrock/example/rest/InjectionResource.java @@ -10,19 +10,19 @@ @Path("/test") public class InjectionResource { - @Inject - private MessageBean messageBean; + @Inject + MessageBean messageBean; - @GET - @Counted(monotonic = true) - public String getTest() { - return "TEST"; - } + @GET + @Counted(monotonic = true) + public String getTest() { + return "TEST"; + } - @GET - @Path("/injection") - public String get() { - return messageBean.getMessage(); - } + @GET + @Path("/injection") + public String get() { + return messageBean.getMessage(); + } } diff --git a/health/deployment/pom.xml b/health/deployment/pom.xml index 0107640cda5b6..f48cdd040a1b8 100644 --- a/health/deployment/pom.xml +++ b/health/deployment/pom.xml @@ -17,10 +17,6 @@ org.jboss.shamrock shamrock-core-deployment - - org.jboss.shamrock - shamrock-weld-deployment - org.jboss.shamrock shamrock-undertow-deployment diff --git a/health/deployment/src/main/java/org/jboss/shamrock/health/HealthProcessor.java b/health/deployment/src/main/java/org/jboss/shamrock/health/HealthProcessor.java index 77ef689479158..34ad4da9f644c 100644 --- a/health/deployment/src/main/java/org/jboss/shamrock/health/HealthProcessor.java +++ b/health/deployment/src/main/java/org/jboss/shamrock/health/HealthProcessor.java @@ -3,18 +3,20 @@ import javax.inject.Inject; import org.jboss.shamrock.deployment.ArchiveContext; +import org.jboss.shamrock.deployment.BeanDeployment; import org.jboss.shamrock.deployment.ProcessorContext; import org.jboss.shamrock.deployment.ResourceProcessor; import org.jboss.shamrock.deployment.ShamrockConfig; import org.jboss.shamrock.health.runtime.HealthServlet; import org.jboss.shamrock.undertow.ServletData; import org.jboss.shamrock.undertow.ServletDeployment; -import org.jboss.shamrock.weld.deployment.WeldDeployment; + +import io.smallrye.health.SmallRyeHealthReporter; class HealthProcessor implements ResourceProcessor { @Inject - private WeldDeployment weldDeployment; + private BeanDeployment beanDeployment; @Inject private ShamrockConfig config; @@ -27,7 +29,8 @@ public void process(ArchiveContext archiveContext, ProcessorContext processorCon ServletData servletData = new ServletData("health", HealthServlet.class.getName()); servletData.getMapings().add(config.getConfig("health.path", "/health")); servletDeployment.addServlet(servletData); - weldDeployment.addAdditionalBean(HealthServlet.class); + beanDeployment.addAdditionalBean(SmallRyeHealthReporter.class); + beanDeployment.addAdditionalBean(HealthServlet.class); } @Override diff --git a/health/runtime/src/main/java/org/jboss/shamrock/health/runtime/HealthServlet.java b/health/runtime/src/main/java/org/jboss/shamrock/health/runtime/HealthServlet.java index d47c2a87d83c3..958455ac8f4ff 100644 --- a/health/runtime/src/main/java/org/jboss/shamrock/health/runtime/HealthServlet.java +++ b/health/runtime/src/main/java/org/jboss/shamrock/health/runtime/HealthServlet.java @@ -18,7 +18,7 @@ public class HealthServlet extends HttpServlet { @Inject - private SmallRyeHealthReporter reporter; + SmallRyeHealthReporter reporter; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { diff --git a/jaxrs/runtime/src/main/java/org/jboss/shamrock/jaxrs/runtime/graal/JaxrsTemplate.java b/jaxrs/runtime/src/main/java/org/jboss/shamrock/jaxrs/runtime/graal/JaxrsTemplate.java index 85677afe8a6be..8b98e6e4db362 100644 --- a/jaxrs/runtime/src/main/java/org/jboss/shamrock/jaxrs/runtime/graal/JaxrsTemplate.java +++ b/jaxrs/runtime/src/main/java/org/jboss/shamrock/jaxrs/runtime/graal/JaxrsTemplate.java @@ -1,7 +1,6 @@ package org.jboss.shamrock.jaxrs.runtime.graal; -import javax.enterprise.inject.se.SeContainer; - +import org.jboss.shamrock.runtime.BeanContainer; import org.jboss.shamrock.runtime.ContextObject; /** @@ -9,7 +8,7 @@ */ public class JaxrsTemplate { - public void setupIntegration(@ContextObject("weld.container")SeContainer container) { + public void setupIntegration(@ContextObject("bean.container") BeanContainer container) { ShamrockInjectorFactory.CONTAINER = container; } diff --git a/jaxrs/runtime/src/main/java/org/jboss/shamrock/jaxrs/runtime/graal/ShamrockConstructorInjector.java b/jaxrs/runtime/src/main/java/org/jboss/shamrock/jaxrs/runtime/graal/ShamrockConstructorInjector.java index c88408bf6dc7f..3fe7d551ddeb9 100644 --- a/jaxrs/runtime/src/main/java/org/jboss/shamrock/jaxrs/runtime/graal/ShamrockConstructorInjector.java +++ b/jaxrs/runtime/src/main/java/org/jboss/shamrock/jaxrs/runtime/graal/ShamrockConstructorInjector.java @@ -2,7 +2,6 @@ import java.lang.reflect.Constructor; -import javax.enterprise.inject.Instance; import javax.ws.rs.WebApplicationException; import org.jboss.resteasy.spi.ApplicationException; @@ -33,8 +32,7 @@ public Object construct(HttpRequest request, HttpResponse response) throws Failu if (ShamrockInjectorFactory.CONTAINER == null) { return delegate.construct(request, response); } - Instance object = ShamrockInjectorFactory.CONTAINER.select(this.ctor.getDeclaringClass()); - return object.get(); + return ShamrockInjectorFactory.CONTAINER.instance(this.ctor.getDeclaringClass()); } @Override diff --git a/jaxrs/runtime/src/main/java/org/jboss/shamrock/jaxrs/runtime/graal/ShamrockInjectorFactory.java b/jaxrs/runtime/src/main/java/org/jboss/shamrock/jaxrs/runtime/graal/ShamrockInjectorFactory.java index 5cdb7bda6cc40..fce37d1c7d980 100644 --- a/jaxrs/runtime/src/main/java/org/jboss/shamrock/jaxrs/runtime/graal/ShamrockInjectorFactory.java +++ b/jaxrs/runtime/src/main/java/org/jboss/shamrock/jaxrs/runtime/graal/ShamrockInjectorFactory.java @@ -2,19 +2,18 @@ import java.lang.reflect.Constructor; -import javax.enterprise.inject.se.SeContainer; - import org.jboss.resteasy.core.InjectorFactoryImpl; import org.jboss.resteasy.spi.ConstructorInjector; import org.jboss.resteasy.spi.ResteasyProviderFactory; import org.jboss.resteasy.spi.metadata.ResourceConstructor; +import org.jboss.shamrock.runtime.BeanContainer; /** * Created by bob on 7/31/18. */ public class ShamrockInjectorFactory extends InjectorFactoryImpl { - public static volatile SeContainer CONTAINER = null; + public static volatile BeanContainer CONTAINER = null; @Override public ConstructorInjector createConstructor(Constructor constructor, ResteasyProviderFactory providerFactory) { diff --git a/maven/src/main/java/org/jboss/shamrock/maven/BuildMojo.java b/maven/src/main/java/org/jboss/shamrock/maven/BuildMojo.java index 85d899b93cfd5..ecc83b1dd560f 100644 --- a/maven/src/main/java/org/jboss/shamrock/maven/BuildMojo.java +++ b/maven/src/main/java/org/jboss/shamrock/maven/BuildMojo.java @@ -36,7 +36,6 @@ import org.apache.maven.project.MavenProject; import org.jboss.shamrock.deployment.BuildTimeGenerator; import org.jboss.shamrock.deployment.ClassOutput; -import org.jboss.shamrock.deployment.index.MapArtifactResolver; import org.jboss.shamrock.deployment.index.ResolvedArtifact; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; @@ -169,6 +168,16 @@ public void writeClass(boolean applicationClass, String className, byte[] data) out.write(data); } } + + @Override + public void writeResource(String name, byte[] data) throws IOException { + File file = new File(wiringClassesDirectory, name); + file.getParentFile().mkdirs(); + try (FileOutputStream out = new FileOutputStream(file)) { + out.write(data); + } + } + }, runnerClassLoader, useStaticInit); ClassLoader old = Thread.currentThread().getContextClassLoader(); try { diff --git a/metrics/deployment/pom.xml b/metrics/deployment/pom.xml index fb4b822decc72..3f972e3519694 100644 --- a/metrics/deployment/pom.xml +++ b/metrics/deployment/pom.xml @@ -17,10 +17,6 @@ org.jboss.shamrock shamrock-core-deployment - - org.jboss.shamrock - shamrock-weld-deployment - org.jboss.shamrock shamrock-undertow-deployment diff --git a/metrics/deployment/src/main/java/org/jboss/shamrock/metrics/MetricsProcessor.java b/metrics/deployment/src/main/java/org/jboss/shamrock/metrics/MetricsProcessor.java index 7848d758953f4..6eec7280d23f8 100644 --- a/metrics/deployment/src/main/java/org/jboss/shamrock/metrics/MetricsProcessor.java +++ b/metrics/deployment/src/main/java/org/jboss/shamrock/metrics/MetricsProcessor.java @@ -3,15 +3,19 @@ import java.util.Collection; import javax.inject.Inject; +import javax.interceptor.Interceptor; import org.eclipse.microprofile.metrics.annotation.Counted; import org.jboss.jandex.AnnotationInstance; import org.jboss.jandex.AnnotationTarget; +import org.jboss.jandex.AnnotationTarget.Kind; import org.jboss.jandex.ClassInfo; import org.jboss.jandex.DotName; import org.jboss.jandex.IndexView; import org.jboss.jandex.MethodInfo; import org.jboss.shamrock.deployment.ArchiveContext; +import org.jboss.shamrock.deployment.BeanArchiveIndex; +import org.jboss.shamrock.deployment.BeanDeployment; import org.jboss.shamrock.deployment.ProcessorContext; import org.jboss.shamrock.deployment.ResourceProcessor; import org.jboss.shamrock.deployment.RuntimePriority; @@ -21,8 +25,6 @@ import org.jboss.shamrock.metrics.runtime.MetricsServlet; import org.jboss.shamrock.undertow.ServletData; import org.jboss.shamrock.undertow.ServletDeployment; -import org.jboss.shamrock.weld.deployment.BeanArchiveIndex; -import org.jboss.shamrock.weld.deployment.WeldDeployment; import io.smallrye.metrics.MetricProducer; import io.smallrye.metrics.MetricRegistries; @@ -40,7 +42,7 @@ public class MetricsProcessor implements ResourceProcessor { @Inject - private WeldDeployment weldDeployment; + private BeanDeployment beanDeployment; @Inject private ShamrockConfig config; @@ -57,16 +59,16 @@ public void process(ArchiveContext archiveContext, ProcessorContext processorCon servletData.getMapings().add(config.getConfig("metrics.path", "/metrics")); servletDeployment.addServlet(servletData); - weldDeployment.addAdditionalBean(MetricProducer.class, + beanDeployment.addAdditionalBean(MetricProducer.class, MetricNameFactory.class, MetricRegistries.class); - weldDeployment.addAdditionalBean(MetricsInterceptor.class, + beanDeployment.addAdditionalBean(MetricsInterceptor.class, MeteredInterceptor.class, CountedInterceptor.class, TimedInterceptor.class); - weldDeployment.addAdditionalBean(MetricsRequestHandler.class, MetricsServlet.class); + beanDeployment.addAdditionalBean(MetricsRequestHandler.class, MetricsServlet.class); //weldDeployment.addInterceptor(MetricsInterceptor.class); //weldDeployment.addInterceptor(MeteredInterceptor.class); //weldDeployment.addInterceptor(CountedInterceptor.class); @@ -86,6 +88,12 @@ public void process(ArchiveContext archiveContext, ProcessorContext processorCon for (AnnotationInstance anno : annos) { AnnotationTarget target = anno.target(); + // TODO ugly hack to exclude metrics interceptors + if (Kind.CLASS.equals(target.kind()) + && target.asClass().classAnnotations().stream().anyMatch(a -> a.name().equals(DotName.createSimple(Interceptor.class.getName())))) { + continue; + } + MethodInfo methodInfo = target.asMethod(); ClassInfo classInfo = methodInfo.declaringClass(); diff --git a/metrics/runtime/src/main/java/org/jboss/shamrock/metrics/runtime/MetricsDeploymentTemplate.java b/metrics/runtime/src/main/java/org/jboss/shamrock/metrics/runtime/MetricsDeploymentTemplate.java index da20ed118be3a..4d2d3cdbd469d 100644 --- a/metrics/runtime/src/main/java/org/jboss/shamrock/metrics/runtime/MetricsDeploymentTemplate.java +++ b/metrics/runtime/src/main/java/org/jboss/shamrock/metrics/runtime/MetricsDeploymentTemplate.java @@ -3,26 +3,19 @@ import java.lang.management.GarbageCollectorMXBean; import java.lang.management.ManagementFactory; import java.lang.management.MemoryMXBean; -import java.lang.management.MemoryPoolMXBean; import java.lang.management.ThreadMXBean; -import java.lang.reflect.AnnotatedElement; -import java.lang.reflect.Member; -import java.lang.reflect.Method; -import java.util.Arrays; import java.util.List; -import javax.enterprise.inject.se.SeContainer; - -import io.smallrye.metrics.MetricRegistries; -import io.smallrye.metrics.app.CounterImpl; -import io.smallrye.metrics.interceptors.MetricResolver; import org.eclipse.microprofile.metrics.Metadata; import org.eclipse.microprofile.metrics.MetricRegistry; import org.eclipse.microprofile.metrics.MetricType; -import org.eclipse.microprofile.metrics.annotation.Counted; -import org.eclipse.microprofile.metrics.annotation.Metric; +import org.jboss.shamrock.runtime.BeanContainer; import org.jboss.shamrock.runtime.ContextObject; +import io.smallrye.metrics.MetricRegistries; +import io.smallrye.metrics.app.CounterImpl; +import io.smallrye.metrics.interceptors.MetricResolver; + /** * Created by bob on 7/30/18. */ @@ -108,7 +101,7 @@ public void registerVendorMetrics() { } - public void createRegistries(@ContextObject("weld.container") SeContainer container) { + public void createRegistries(@ContextObject("bean.container") BeanContainer container) { System.err.println("creating registries"); MetricRegistries.get(MetricRegistry.Type.APPLICATION); MetricRegistries.get(MetricRegistry.Type.BASE); @@ -117,6 +110,6 @@ public void createRegistries(@ContextObject("weld.container") SeContainer contai //HACK: registration is does via statics, but cleanup is done via pre destroy //however if the bean is not used it will not be created, so no cleanup will be done //we force bean creation here to make sure the container can restart correctly - container.select(MetricRegistries.class).iterator().next().getApplicationRegistry(); + container.instance(MetricRegistries.class).getApplicationRegistry(); } } diff --git a/metrics/runtime/src/main/java/org/jboss/shamrock/metrics/runtime/MetricsServlet.java b/metrics/runtime/src/main/java/org/jboss/shamrock/metrics/runtime/MetricsServlet.java index e8bcd83caf9d9..261a3fdd7614c 100644 --- a/metrics/runtime/src/main/java/org/jboss/shamrock/metrics/runtime/MetricsServlet.java +++ b/metrics/runtime/src/main/java/org/jboss/shamrock/metrics/runtime/MetricsServlet.java @@ -19,7 +19,7 @@ public class MetricsServlet extends HttpServlet { @Inject - private MetricsRequestHandler metricsHandler; + MetricsRequestHandler metricsHandler; @Override protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws IOException { diff --git a/pom.xml b/pom.xml index 194dc4f4f531f..f000c47dd8baf 100644 --- a/pom.xml +++ b/pom.xml @@ -15,7 +15,7 @@ pom - 2.0.5.Final + 2.0.6.Final-SNAPSHOT 3.5.1.Final 3.0.4.Final 2.0.12.Final @@ -45,6 +45,7 @@ 2.9.5 1.8.3 1.2 + 1.0.0-SNAPSHOT @@ -59,6 +60,7 @@ examples jpa gizmo + arc @@ -199,6 +201,16 @@ shamrock-jpa-runtime ${project.version} + + org.jboss.shamrock + shamrock-arc-deployment + ${project.version} + + + org.jboss.shamrock + shamrock-arc-runtime + ${project.version} + org.jboss.protean.gizmo @@ -416,6 +428,16 @@ weld-se-core ${weld-se-core.version} + + org.jboss.protean.arc + arc-processor + ${arc.version} + + + org.jboss.protean.arc + arc-runtime + ${arc.version} + org.jboss.xnio xnio-api diff --git a/weld/deployment/src/main/java/org/jboss/shamrock/weld/deployment/WeldAnnotationProcessor.java b/weld/deployment/src/main/java/org/jboss/shamrock/weld/deployment/WeldAnnotationProcessor.java index 92aa8a509a34a..df65fe21d20dc 100644 --- a/weld/deployment/src/main/java/org/jboss/shamrock/weld/deployment/WeldAnnotationProcessor.java +++ b/weld/deployment/src/main/java/org/jboss/shamrock/weld/deployment/WeldAnnotationProcessor.java @@ -7,6 +7,8 @@ import org.jboss.jandex.ClassInfo; import org.jboss.jandex.IndexView; import org.jboss.shamrock.deployment.ArchiveContext; +import org.jboss.shamrock.deployment.BeanArchiveIndex; +import org.jboss.shamrock.deployment.BeanDeployment; import org.jboss.shamrock.deployment.ProcessorContext; import org.jboss.shamrock.deployment.ResourceProcessor; import org.jboss.shamrock.deployment.RuntimePriority; @@ -18,15 +20,16 @@ public class WeldAnnotationProcessor implements ResourceProcessor { @Inject - private WeldDeployment weldDeployment; + private BeanDeployment beanDeployment; @Inject private BeanArchiveIndex beanArchiveIndex; @Override public void process(ArchiveContext archiveContext, ProcessorContext processorContext) throws Exception { - weldDeployment.addAdditionalBean(ConfigProducer.class); IndexView index = beanArchiveIndex.getIndex(); + //make config injectable + beanDeployment.addAdditionalBean(ConfigProducer.class); try (BytecodeRecorder recorder = processorContext.addStaticInitTask(RuntimePriority.WELD_DEPLOYMENT)) { WeldDeploymentTemplate template = recorder.getRecordingProxy(WeldDeploymentTemplate.class); SeContainerInitializer init = template.createWeld(); @@ -35,13 +38,11 @@ public void process(ArchiveContext archiveContext, ProcessorContext processorCon template.addClass(init, recorder.classProxy(name)); processorContext.addReflectiveClass(true, true, name); } - for (Class clazz : weldDeployment.getAdditionalBeans()) { + for (Class clazz : beanDeployment.getAdditionalBeans()) { template.addClass(init, clazz); } - for (Class clazz : weldDeployment.getInterceptors()) { - template.addInterceptor(init, clazz); - } SeContainer weld = template.doBoot(null, init); + template.initBeanContainer(weld); template.setupInjection(null, weld); } diff --git a/weld/deployment/src/main/java/org/jboss/shamrock/weld/deployment/WeldDeployment.java b/weld/deployment/src/main/java/org/jboss/shamrock/weld/deployment/WeldDeployment.java deleted file mode 100644 index 4705f3dc2dde0..0000000000000 --- a/weld/deployment/src/main/java/org/jboss/shamrock/weld/deployment/WeldDeployment.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.jboss.shamrock.weld.deployment; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -public class WeldDeployment { - - private final List> additionalBeans = new ArrayList<>(); - private final List> interceptors = new ArrayList<>(); - - public void addAdditionalBean(Class ... beanClass) { - additionalBeans.addAll(Arrays.asList(beanClass)); - } - - List> getAdditionalBeans() { - return additionalBeans; - } - - public void addInterceptor(Class interceptorClass) { - this.interceptors.add( interceptorClass); - } - - List> getInterceptors() { - return this.interceptors; - } - -} diff --git a/weld/deployment/src/main/java/org/jboss/shamrock/weld/deployment/WeldSetup.java b/weld/deployment/src/main/java/org/jboss/shamrock/weld/deployment/WeldSetup.java index add9c61ee3951..3b151ddf5eaa5 100644 --- a/weld/deployment/src/main/java/org/jboss/shamrock/weld/deployment/WeldSetup.java +++ b/weld/deployment/src/main/java/org/jboss/shamrock/weld/deployment/WeldSetup.java @@ -6,9 +6,7 @@ public class WeldSetup implements ShamrockSetup { @Override public void setup(SetupContext context) { - context.addInjectionProvider(new WeldInjectionProvider()); context.addResourceProcessor(new WeldAnnotationProcessor()); - context.addResourceProcessor(new BeanArchiveProcessor()); context.addApplicationArchiveMarker("META-INF/beans.xml"); context.addApplicationArchiveMarker("META-INF/services/javax.enterprise.inject.spi.Extension"); } diff --git a/weld/runtime/src/main/java/org/jboss/shamrock/weld/runtime/WeldDeploymentTemplate.java b/weld/runtime/src/main/java/org/jboss/shamrock/weld/runtime/WeldDeploymentTemplate.java index b6162cdba606c..fe2062bd66e54 100644 --- a/weld/runtime/src/main/java/org/jboss/shamrock/weld/runtime/WeldDeploymentTemplate.java +++ b/weld/runtime/src/main/java/org/jboss/shamrock/weld/runtime/WeldDeploymentTemplate.java @@ -2,6 +2,7 @@ import java.io.Closeable; import java.io.IOException; +import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.net.URL; import java.net.URLConnection; @@ -15,6 +16,7 @@ import javax.enterprise.inject.se.SeContainerInitializer; import javax.enterprise.inject.spi.Bean; +import org.jboss.shamrock.runtime.BeanContainer; import org.jboss.shamrock.runtime.ContextObject; import org.jboss.shamrock.runtime.InjectionFactory; import org.jboss.shamrock.runtime.InjectionInstance; @@ -122,4 +124,15 @@ public void close() throws IOException { }); } + @ContextObject("bean.container") + public BeanContainer initBeanContainer(SeContainer container) throws Exception { + return new BeanContainer() { + + @Override + public T instance(Class type, Annotation... qualifiers) { + return container.select(type, qualifiers).get(); + } + }; + } + }