From dfb92a64b295b8be7d178dcb8495b914871e8ea2 Mon Sep 17 00:00:00 2001 From: Matej Novotny Date: Wed, 11 Feb 2026 19:28:04 +0100 Subject: [PATCH] WELD-2832 Trimming non-exlicit archive should be treated as a deployment problem --- .../jboss/weld/bootstrap/BeanDeployment.java | 8 ++++- .../jboss/weld/logging/BootstrapLogger.java | 3 ++ .../tests/xml/broken/trimming/DummyBean.java | 7 +++++ .../trimming/ImplicitArchiveTrimmingTest.java | 31 +++++++++++++++++++ .../org/jboss/shrinkwrap/api/BeanArchive.java | 5 +++ .../shrinkwrap/impl/BeanArchiveImpl.java | 6 ++++ .../org/jboss/shrinkwrap/impl/BeansXml.java | 30 ++++++++++++++---- 7 files changed, 83 insertions(+), 7 deletions(-) create mode 100644 tests-arquillian/src/test/java/org/jboss/weld/tests/xml/broken/trimming/DummyBean.java create mode 100644 tests-arquillian/src/test/java/org/jboss/weld/tests/xml/broken/trimming/ImplicitArchiveTrimmingTest.java diff --git a/impl/src/main/java/org/jboss/weld/bootstrap/BeanDeployment.java b/impl/src/main/java/org/jboss/weld/bootstrap/BeanDeployment.java index e0a2b33d987..10e29f5772b 100644 --- a/impl/src/main/java/org/jboss/weld/bootstrap/BeanDeployment.java +++ b/impl/src/main/java/org/jboss/weld/bootstrap/BeanDeployment.java @@ -52,6 +52,8 @@ import org.jboss.weld.bootstrap.enablement.GlobalEnablementBuilder; import org.jboss.weld.bootstrap.enablement.ModuleEnablement; import org.jboss.weld.bootstrap.spi.BeanDeploymentArchive; +import org.jboss.weld.bootstrap.spi.BeanDiscoveryMode; +import org.jboss.weld.bootstrap.spi.BeansXml; import org.jboss.weld.bootstrap.spi.Filter; import org.jboss.weld.bootstrap.spi.Metadata; import org.jboss.weld.config.WeldConfiguration; @@ -263,7 +265,11 @@ public void createBeans(Environment environment) { } beanDeployer.addBuiltInBean(new RequestContextControllerBean(beanManager)); - if (beanDeploymentArchive.getBeansXml() != null && beanDeploymentArchive.getBeansXml().isTrimmed()) { + BeansXml beansXml = beanDeploymentArchive.getBeansXml(); + if (beansXml != null && beansXml.isTrimmed()) { + if (beansXml.getBeanDiscoveryMode() != BeanDiscoveryMode.ALL) { + throw BootstrapLogger.LOG.trimmingNonExplicitBeanArchive(beansXml.getUrl(), beansXml.getBeanDiscoveryMode()); + } beanDeployer.getEnvironment().trim(); } beanDeployer.createClassBeans(); diff --git a/impl/src/main/java/org/jboss/weld/logging/BootstrapLogger.java b/impl/src/main/java/org/jboss/weld/logging/BootstrapLogger.java index 2bbcf06e974..d81fd895a3d 100644 --- a/impl/src/main/java/org/jboss/weld/logging/BootstrapLogger.java +++ b/impl/src/main/java/org/jboss/weld/logging/BootstrapLogger.java @@ -349,4 +349,7 @@ public interface BootstrapLogger extends WeldLogger { @Message(id = 184, value = "BeforeBeanDiscovery.addInvokable() called by {0} for {1}", format = Format.MESSAGE_FORMAT) void addInvokableCalled(Object extensionName, Object type); + @Message(id = 185, value = "Archive trimming is permitted only for explicit bean archives. Found trimmed bean archive with discovery mode {1} and with URL {0}", format = Format.MESSAGE_FORMAT) + DeploymentException trimmingNonExplicitBeanArchive(Object beansXmlUrl, Object beansXmlDiscoveryMode); + } diff --git a/tests-arquillian/src/test/java/org/jboss/weld/tests/xml/broken/trimming/DummyBean.java b/tests-arquillian/src/test/java/org/jboss/weld/tests/xml/broken/trimming/DummyBean.java new file mode 100644 index 00000000000..54add8213af --- /dev/null +++ b/tests-arquillian/src/test/java/org/jboss/weld/tests/xml/broken/trimming/DummyBean.java @@ -0,0 +1,7 @@ +package org.jboss.weld.tests.xml.broken.trimming; + +import jakarta.enterprise.context.Dependent; + +@Dependent +public class DummyBean { +} diff --git a/tests-arquillian/src/test/java/org/jboss/weld/tests/xml/broken/trimming/ImplicitArchiveTrimmingTest.java b/tests-arquillian/src/test/java/org/jboss/weld/tests/xml/broken/trimming/ImplicitArchiveTrimmingTest.java new file mode 100644 index 00000000000..db5f2d2368e --- /dev/null +++ b/tests-arquillian/src/test/java/org/jboss/weld/tests/xml/broken/trimming/ImplicitArchiveTrimmingTest.java @@ -0,0 +1,31 @@ +package org.jboss.weld.tests.xml.broken.trimming; + +import jakarta.enterprise.inject.spi.DeploymentException; + +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.container.test.api.ShouldThrowException; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.shrinkwrap.api.Archive; +import org.jboss.shrinkwrap.api.BeanArchive; +import org.jboss.shrinkwrap.api.BeanDiscoveryMode; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.weld.test.util.Utils; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(Arquillian.class) +public class ImplicitArchiveTrimmingTest { + + @Deployment + @ShouldThrowException(DeploymentException.class) + public static Archive deploy() { + return ShrinkWrap.create(BeanArchive.class, Utils.getDeploymentNameAsHash(ImplicitArchiveTrimmingTest.class)) + .trim() + .beanDiscoveryMode(BeanDiscoveryMode.ANNOTATED) + .addPackage(ImplicitArchiveTrimmingTest.class.getPackage()); + } + + @Test + public void testExceptionThrown() { + } +} diff --git a/tests-common/src/main/java/org/jboss/shrinkwrap/api/BeanArchive.java b/tests-common/src/main/java/org/jboss/shrinkwrap/api/BeanArchive.java index 7fbd28983eb..837c2112ab8 100644 --- a/tests-common/src/main/java/org/jboss/shrinkwrap/api/BeanArchive.java +++ b/tests-common/src/main/java/org/jboss/shrinkwrap/api/BeanArchive.java @@ -54,4 +54,9 @@ public interface BeanArchive extends JavaArchive { * Sets bean-discovery-mode to annotated */ BeanArchive annotated(); + + /** + * Adds the trim element to beans.xml + */ + BeanArchive trim(); } diff --git a/tests-common/src/main/java/org/jboss/shrinkwrap/impl/BeanArchiveImpl.java b/tests-common/src/main/java/org/jboss/shrinkwrap/impl/BeanArchiveImpl.java index bef022c8495..73201cad62c 100644 --- a/tests-common/src/main/java/org/jboss/shrinkwrap/impl/BeanArchiveImpl.java +++ b/tests-common/src/main/java/org/jboss/shrinkwrap/impl/BeanArchiveImpl.java @@ -98,4 +98,10 @@ public BeanArchive beanDiscoveryMode(BeanDiscoveryMode mode) { public BeanArchive annotated() { return beanDiscoveryMode(BeanDiscoveryMode.ANNOTATED); } + + @Override + public BeanArchive trim() { + descriptor.trim(); + return covarientReturn(); + } } diff --git a/tests-common/src/main/java/org/jboss/shrinkwrap/impl/BeansXml.java b/tests-common/src/main/java/org/jboss/shrinkwrap/impl/BeansXml.java index eaf40970e7a..411ed01e1dd 100644 --- a/tests-common/src/main/java/org/jboss/shrinkwrap/impl/BeansXml.java +++ b/tests-common/src/main/java/org/jboss/shrinkwrap/impl/BeansXml.java @@ -22,11 +22,14 @@ public BeanDiscoveryMode getBeanDiscoveryMode() { }; private static final String CLOSING_TAG_PREFIX = ""; private static final String OPENING_TAG_PREFIX = "<"; private static final String TAG_SUFFIX = ">"; private static final String TAG_SUFFIX_NEW_LINE = ">\n"; private static final String TAG_SUFFIX_SELF_CLOSE_NEW_LINE = " />\n"; private static final String ALTERNATIVES_ELEMENT_NAME = "alternatives"; + private static final String DECORATORS_ELEMENT_NAME = "decorators"; + private static final String INTERCEPTORS_ELEMENT_NAME = "interceptors"; private static final String CLASS = "class"; private static final String SCAN_ELEMENT_NAME = "scan"; @@ -37,11 +40,14 @@ public BeanDiscoveryMode getBeanDiscoveryMode() { private static final String NAME_ATTRIBUTE_NAME = "name"; private static final String VALUE_ATTRIBUTE_NAME = "value"; + private static final String TRIM_ELEMENT_NAME = "trim"; + private final List> alternatives; private final List> interceptors; private final List> decorators; private final List> stereotypes; private final List excludeFilters; + private boolean trimArchive; private BeanDiscoveryMode mode = BeanDiscoveryMode.ANNOTATED; @@ -215,6 +221,11 @@ public BeansXml excludeFilters(Exclude... filters) { return this; } + public BeansXml trim() { + this.trimArchive = true; + return this; + } + public BeanDiscoveryMode getBeanDiscoveryMode() { return mode; } @@ -226,20 +237,21 @@ public void setBeanDiscoveryMode(BeanDiscoveryMode mode) { @Override public InputStream openStream() { StringBuilder xml = new StringBuilder(); - xml.append("\n"); appendExcludeFilters(excludeFilters, xml); appendAlternatives(alternatives, stereotypes, xml); - appendSection("interceptors", CLASS, interceptors, xml); - appendSection("decorators", CLASS, decorators, xml); + appendSection(INTERCEPTORS_ELEMENT_NAME, CLASS, interceptors, xml); + appendSection(DECORATORS_ELEMENT_NAME, CLASS, decorators, xml); + appendTrimming(trimArchive, xml); xml.append(""); return new ByteArrayInputStream(xml.toString().getBytes()); } private void appendExcludeFilters(List filters, StringBuilder xml) { - if (filters.size() > 0) { + if (!filters.isEmpty()) { xml.append(OPENING_TAG_PREFIX).append(SCAN_ELEMENT_NAME).append(TAG_SUFFIX_NEW_LINE); for (Exclude ex : filters) { xml.append(OPENING_TAG_PREFIX).append(EXCLUDE_ELEMENT_NAME); @@ -264,7 +276,7 @@ private static void appendAttribute(String name, String value, StringBuilder xml } private static void appendAlternatives(List> alternatives, List> stereotypes, StringBuilder xml) { - if (alternatives.size() > 0 || stereotypes.size() > 0) { + if (!alternatives.isEmpty() || !stereotypes.isEmpty()) { xml.append(OPENING_TAG_PREFIX).append(ALTERNATIVES_ELEMENT_NAME).append(TAG_SUFFIX_NEW_LINE); appendClasses(CLASS, alternatives, xml); appendClasses("stereotype", stereotypes, xml); @@ -273,13 +285,19 @@ private static void appendAlternatives(List> alternatives, List> classes, StringBuilder xml) { - if (classes.size() > 0) { + if (!classes.isEmpty()) { xml.append(OPENING_TAG_PREFIX).append(name).append(TAG_SUFFIX_NEW_LINE); appendClasses(subName, classes, xml); xml.append(CLOSING_TAG_PREFIX).append(name).append(TAG_SUFFIX_NEW_LINE); } } + private static void appendTrimming(boolean trimArchive, StringBuilder xml) { + if (trimArchive) { + xml.append(OPENING_TAG_PREFIX).append(TRIM_ELEMENT_NAME).append(CLOSING_TAG_EMPTY); + } + } + private static void appendClasses(String name, List> classes, StringBuilder xml) { for (Class clazz : classes) { xml.append(OPENING_TAG_PREFIX).append(name).append(TAG_SUFFIX).append(clazz.getName()).append(CLOSING_TAG_PREFIX)