/* * JBoss, Home of Professional Open Source. * Copyright 2013, Red Hat, Inc., and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.as.test.integration.weld.modules; import java.io.File; import java.net.URL; import javax.ejb.EJB; import javax.enterprise.inject.spi.BeanManager; import javax.inject.Inject; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; import org.jboss.as.test.module.util.TestModule; import org.jboss.as.test.shared.ModuleUtils; import org.jboss.logging.Logger; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.asset.Asset; import org.jboss.shrinkwrap.api.asset.EmptyAsset; import org.jboss.shrinkwrap.api.asset.StringAsset; import org.jboss.shrinkwrap.api.spec.EnterpriseArchive; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.jboss.shrinkwrap.api.spec.WebArchive; import org.junit.AfterClass; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; /** * Tests the deployment of simple enterprise application depending on some external WFLY module. The external WFLY module * defines beans and contains an extension (application scoped by default) which can be injected into * <ul> * <li>module itself</li> * <li>utility library in application</li> * <li>EJB sub-deployment in application</li> * <li>WAR sub-deployment in application</li> * </ul> * * @see WFLY-1746 * * @author Petr Andreev * */ @RunWith(Arquillian.class) public class PortableExtensionInExternalModuleTestCase { private static final Logger log = Logger.getLogger(PortableExtensionInExternalModuleTestCase.class.getName()); private static final String MANIFEST = "MANIFEST.MF"; private static final String MODULE_NAME = "portable-extension"; private static TestModule testModule; @Inject private PortableExtension extension; /** * The CDI-style EJB injection into the the test-case does not work! */ @EJB(mappedName = "java:global/test/ejb-subdeployment/PortableExtensionSubdeploymentLookup") private PortableExtensionLookup ejbInjectionTarget; public static void doSetup() throws Exception { URL url = PortableExtension.class.getResource(MODULE_NAME + "-module.xml"); File moduleXmlFile = new File(url.toURI()); testModule = new TestModule("test." + MODULE_NAME, moduleXmlFile); testModule.addResource("portable-extension.jar") .addClasses(PortableExtension.class, PortableExtensionLookup.class, PortableExtensionModuleLookup.class) .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml"); testModule.addClassCallback(ModuleUtils.ENTERPRISE_INJECT); testModule.create(); } @AfterClass public static void tearDown() throws Exception { testModule.remove(); } @Deployment public static EnterpriseArchive getDeployment() throws Exception { doSetup(); JavaArchive library = ShrinkWrap.create(JavaArchive.class, "library.jar") .addClasses(PortableExtensionLibraryLookup.class) .addAsManifestResource(newBeans11Descriptor("annotated"), "beans.xml"); JavaArchive ejbSubdeployment = ShrinkWrap.create(JavaArchive.class, "ejb-subdeployment.jar") .addClass(PortableExtensionSubdeploymentLookup.class) // the CDI injection does not work neither with empty nor with 'all'! .addAsManifestResource(newBeans11Descriptor("all"), "beans.xml"); WebArchive webSubdeployment = ShrinkWrap.create(WebArchive.class, "web-subdeployment.war") .addClass(PortableExtensionInExternalModuleTestCase.class) .addClass(TestModule.class) .addAsWebInfResource(newBeans11Descriptor("annotated"), "beans.xml"); return ShrinkWrap.create(EnterpriseArchive.class, "test.ear").addAsLibrary(library).addAsModule(ejbSubdeployment) .addAsModule(webSubdeployment) // add EAR-wide dependency on external module .addAsManifestResource(getModuleDependencies(), MANIFEST); // Adding the deployment structure does not work: the interface PortableExtensionLookup is not on application class-path // .addAsApplicationResource(getDeploymentStructure(), "jboss-deployment-structure.xml"); } @Test public void testInModule(PortableExtensionModuleLookup injectionTarget) { assertPortableExtensionInjection(injectionTarget); } @Test public void testInLibrary(PortableExtensionLibraryLookup injectionTarget) { assertPortableExtensionInjection(injectionTarget); } /** * The injectionTarget argument is not injected for EJB! * * @param injectionTarget */ @Test public void testInEjbSubdeployment(PortableExtensionSubdeploymentLookup injectionTarget) { assertPortableExtensionInjection(this.ejbInjectionTarget); } @Test public void testInWarSubdeployment() { Assert.assertNotNull(extension); BeanManager beanManager = extension.getBeanManager(); Assert.assertNotNull(beanManager); } private void assertPortableExtensionInjection(PortableExtensionLookup injectionTarget) { Assert.assertNotNull(injectionTarget); PortableExtension extension = injectionTarget.getPortableExtension(); Assert.assertNotNull(extension); BeanManager beanManager = extension.getBeanManager(); Assert.assertNotNull(beanManager); } private static StringAsset newBeans11Descriptor(String mode) { return new StringAsset("<beans bean-discovery-mode=\"" + mode + "\" version=\"1.1\"/>"); } private static Asset getModuleDependencies() { return new StringAsset("Dependencies: test." + MODULE_NAME + " meta-inf\n"); } @SuppressWarnings("unused") private static Asset jbossDeploymentStructure() { return new StringAsset("<jboss-deployment-structure xmlns=\"urn:jboss:deployment-structure:1.2\">\n" + "<deployment>\n<dependencies>\n<module name=\"test." + MODULE_NAME + "\" meta-inf=\"import\"/>\n</dependencies>\n</deployment>\n</jboss-deployment-structure>"); } @SuppressWarnings("unused") private static StringAsset emptyEjbJar() { return new StringAsset( "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<ejb-jar xmlns=\"http://xmlns.jcp.org/xml/ns/javaee\" \n" + " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" \n" + " xsi:schemaLocation=\"http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/ejb-jar_3_2.xsd\"\n" + " version=\"3.2\">\n\n</ejb-jar>"); } }