/* * JBoss, Home of Professional Open Source * Copyright 2010, Red Hat, Inc., and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * Licensed 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.jboss.weld.tests.unit.deployment.structure.nonTransitiveResolution; import java.util.Collections; import javax.enterprise.inject.spi.BeanManager; import javax.enterprise.util.AnnotationLiteral; import org.jboss.arquillian.container.weld.embedded.mock.BeanDeploymentArchiveImpl; import org.jboss.arquillian.container.weld.embedded.mock.FlatDeployment; import org.jboss.arquillian.container.weld.embedded.mock.TestContainer; import org.jboss.weld.bootstrap.spi.BeanDeploymentArchive; import org.jboss.weld.bootstrap.spi.BeansXml; import org.jboss.weld.bootstrap.spi.Deployment; import org.jboss.weld.manager.BeanManagerImpl; import org.jboss.weld.test.util.Utils; import org.testng.Assert; import org.testng.annotations.Test; import static org.jboss.weld.test.util.Utils.getReference; import static org.testng.Assert.assertEquals; public class TransitiveResolutionTest { /* * description = "WELD-319" */ @Test public void testBeansXmlIsolation() { BeanDeploymentArchiveImpl jar1 = new BeanDeploymentArchiveImpl("first-jar", new BeansXmlImpl(Collections.singletonList(Alt.class.getName()), null, null, null), Alt.class); BeanDeploymentArchiveImpl jar2 = new BeanDeploymentArchiveImpl("second-jar", Alt2.class); BeanDeploymentArchiveImpl war = new BeanDeploymentArchiveImpl("war"); war.getBeanDeploymentArchives().add(jar1); war.getBeanDeploymentArchives().add(jar2); Deployment deployment = new FlatDeployment(war); TestContainer container = null; try { container = new TestContainer(deployment).startContainer().ensureRequestActive(); BeanManagerImpl warBeanManager = (BeanManagerImpl) container.getBeanManager(war); BeanManagerImpl jar1BeanManager = (BeanManagerImpl) container.getBeanManager(jar1); BeanManagerImpl jar2BeanManager = (BeanManagerImpl) container.getBeanManager(jar2); Assert.assertTrue(warBeanManager.getEnabled().getAlternativeClasses().isEmpty()); Assert.assertFalse(jar1BeanManager.getEnabled().getAlternativeClasses().isEmpty()); Assert.assertTrue(jar2BeanManager.getEnabled().getAlternativeClasses().isEmpty()); } finally { if (container != null) { container.stopContainer(); } } } /* * description = "WELD-319" */ @Test public void testBeansXmlMultipleEnabling() { BeanDeploymentArchiveImpl jar1 = new BeanDeploymentArchiveImpl("first-jar", new BeansXmlImpl(Collections.singletonList(Alt.class.getName()), null, null, null), Alt.class); BeanDeploymentArchiveImpl jar2 = new BeanDeploymentArchiveImpl("second-jar", new BeansXmlImpl(Collections.singletonList(Alt2.class.getName()), Collections.<String>emptyList(), null, null), Alt2.class); BeanDeploymentArchiveImpl war = new BeanDeploymentArchiveImpl("war"); war.getBeanDeploymentArchives().add(jar1); war.getBeanDeploymentArchives().add(jar2); Deployment deployment = new FlatDeployment(war); TestContainer container = null; try { container = new TestContainer(deployment).startContainer().ensureRequestActive(); BeanManagerImpl warBeanManager = (BeanManagerImpl) container.getBeanManager(war); BeanManagerImpl jar1BeanManager = (BeanManagerImpl) container.getBeanManager(jar1); BeanManagerImpl jar2BeanManager = (BeanManagerImpl) container.getBeanManager(jar2); Assert.assertTrue(warBeanManager.getEnabled().getAlternativeClasses().isEmpty()); Assert.assertFalse(jar1BeanManager.getEnabled().getAlternativeClasses().isEmpty()); Assert.assertFalse(jar2BeanManager.getEnabled().getAlternativeClasses().isEmpty()); } finally { if (container != null) { container.stopContainer(); } } } /* * description = "WELD-236" */ @Test public void testTypicalEarStructure() { // Create the BDA in which we will deploy Foo. This is equivalent to a ejb // jar final BeanDeploymentArchiveImpl ejbJar = new BeanDeploymentArchiveImpl("ejb-jar", Foo.class); // Create the BDA in which we will deploy Bar. This is equivalent to a war final BeanDeploymentArchiveImpl war = new BeanDeploymentArchiveImpl("war", Bar.class); // The war can access the ejb jar war.getBeanDeploymentArchives().add(ejbJar); // Create a deployment, any other classes are put into the ejb-jar (not // relevant to test) Deployment deployment = new FlatDeployment(new BeanDeploymentArchive[] { war, ejbJar }) { public BeanDeploymentArchive loadBeanDeploymentArchive(Class<?> beanClass) { return ejbJar; } }; TestContainer container = new TestContainer(deployment); container.startContainer(); container.ensureRequestActive(); // Get the bean manager for war and ejb jar BeanManager warBeanManager = container.getBeanManager(war); BeanManager ejbJarBeanManager = container.getBeanManager(ejbJar); Assert.assertEquals(1, warBeanManager.getBeans(Bar.class).size()); Assert.assertEquals(1, warBeanManager.getBeans(Foo.class).size()); Assert.assertEquals(1, ejbJarBeanManager.getBeans(Foo.class).size()); Assert.assertEquals(0, ejbJarBeanManager.getBeans(Bar.class).size()); Bar bar = Utils.getReference(warBeanManager, Bar.class); Assert.assertNotNull(bar.getFoo()); Assert.assertNotNull(bar.getBeanManager()); Assert.assertEquals(warBeanManager, bar.getBeanManager()); Assert.assertEquals(ejbJarBeanManager, bar.getFoo().getBeanManager()); container.stopContainer(); } /* * WELD-507 */ @Test public void testInterceptorEnabledInWarButPackagedInEjbJar() { // Create the BDA in which we will deploy Foo. This is equivalent to a ejb // jar final BeanDeploymentArchiveImpl ejbJar = new BeanDeploymentArchiveImpl("ejb-jar", Basic.class, BasicInterceptor.class, Simple.class); // Create the BDA in which we will deploy Bar. This is equivalent to a war BeansXml beansXml = new BeansXmlImpl(null, null, null, Collections.singletonList(BasicInterceptor.class.getName())); final BeanDeploymentArchiveImpl war = new BeanDeploymentArchiveImpl("war", beansXml, Complex.class); // The war can access the ejb jar war.getBeanDeploymentArchives().add(ejbJar); // Create a deployment, any other classes are put into the ejb-jar (not // relevant to test) Deployment deployment = new FlatDeployment(new BeanDeploymentArchive[] { ejbJar, war }) { public BeanDeploymentArchive loadBeanDeploymentArchive(Class<?> beanClass) { return ejbJar; } }; TestContainer container = new TestContainer(deployment); container.startContainer(); container.ensureRequestActive(); // Get the bean manager for war and ejb jar BeanManager warBeanManager = container.getBeanManager(war); BeanManager ejbJarBeanManager = container.getBeanManager(ejbJar); BasicInterceptor.reset(); Simple simple = getReference(ejbJarBeanManager, Simple.class); simple.ping("14"); Assert.assertNull(BasicInterceptor.getTarget()); BasicInterceptor.reset(); Complex complex = getReference(warBeanManager, Complex.class); complex.ping("14"); Assert.assertNotNull(BasicInterceptor.getTarget()); Assert.assertTrue(BasicInterceptor.getTarget() instanceof Complex); assertEquals("14", ((Complex) BasicInterceptor.getTarget()).getId()); container.stopContainer(); } /* * WELD-507 */ @Test public void testDecoratorEnabledInWarButPackagedInEjbJar() { // Create the BDA in which we will deploy Foo. This is equivalent to a ejb // jar final BeanDeploymentArchiveImpl ejbJar = new BeanDeploymentArchiveImpl("ejb-jar", Blah.class, BlahDecorator.class, BlahImpl.class); // Create the BDA in which we will deploy Bar. This is equivalent to a war BeansXml beansXml = new BeansXmlImpl(null, null, Collections.singletonList(BlahDecorator.class.getName()), null); final BeanDeploymentArchiveImpl war = new BeanDeploymentArchiveImpl("war", beansXml, BlahImpl2.class); // The war can access the ejb jar war.getBeanDeploymentArchives().add(ejbJar); // Create a deployment, any other classes are put into the ejb-jar (not // relevant to test) Deployment deployment = new FlatDeployment(new BeanDeploymentArchive[] { war, ejbJar }) { public BeanDeploymentArchive loadBeanDeploymentArchive(Class<?> beanClass) { return ejbJar; } }; TestContainer container = new TestContainer(deployment); container.startContainer(); container.ensureRequestActive(); // Get the bean manager for war and ejb jar BeanManager warBeanManager = container.getBeanManager(war); BeanManager ejbJarBeanManager = container.getBeanManager(ejbJar); BasicInterceptor.reset(); Blah blah = getReference(ejbJarBeanManager, Blah.class); blah.ping(10); assertEquals(10, blah.getI()); BasicInterceptor.reset(); blah = getReference(warBeanManager, Blah.class, new AnnotationLiteral<Baz>() { }); blah.ping(10); assertEquals(11, blah.getI()); container.stopContainer(); } }