Permalink
Browse files

AS7-5966 Add support for creating CDI beans from modules outside the …

…deployment
  • Loading branch information...
stuartwdouglas authored and bstansberry committed Dec 19, 2012
1 parent 98e3ac4 commit d252522bc58a3d30e01828ddf55eb92cb81c99eb
@@ -390,6 +390,7 @@ public Phase next() {
public static final int POST_MODULE_VALIDATOR_FACTORY = 0x0B00;
public static final int POST_MODULE_EAR_DEPENDENCY = 0x0C00;
public static final int POST_MODULE_WELD_BEAN_ARCHIVE = 0x0D00;
+ public static final int POST_MODULE_WELD_EXTERNAL_BEAN_ARCHIVE = 0x0D50;
public static final int POST_MODULE_WELD_PORTABLE_EXTENSIONS = 0x0E00;
// should come before ejb jndi bindings processor
public static final int POST_MODULE_EJB_IMPLICIT_NO_INTERFACE_VIEW = 0x1000;
@@ -108,6 +108,7 @@ public void deploy(final DeploymentPhaseContext phaseContext) throws DeploymentU
final ModuleDependency dependency = new ModuleDependency(dependencyLoader, dependencyId, optional, export, services, true);
if(metaInf) {
dependency.addImportFilter(PathFilters.getMetaInfSubdirectoriesFilter(), true);
+ dependency.addImportFilter(PathFilters.getMetaInfFilter(), true);
}
deploymentUnit.addToAttachmentList(Attachments.MANIFEST_DEPENDENCIES, dependency);
}
@@ -0,0 +1,32 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2012, 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.multideployment;
+
+import javax.inject.Named;
+
+/**
+ * @author Stuart Douglas
+ */
+@Named
+public class SimpleBean {
+}
@@ -0,0 +1,78 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2011, 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.multideployment;
+
+import javax.inject.Inject;
+import javax.persistence.NoResultException;
+
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.container.test.api.OperateOnDeployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.as.test.integration.weld.jpa.CdiJpaInjectingBean;
+import org.jboss.as.test.integration.weld.jpa.Employee;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.jboss.shrinkwrap.api.asset.StringAsset;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Weld cross deployment injection test case. Verifies that weld can read beans.xml and scan classes outside the
+ * deployment.
+ *
+ * @author Stuart Douglas
+ */
+@RunWith(Arquillian.class)
+public class WeldCrossDeploymentTestCase {
+
+
+
+ @Deployment(name = "d1", order = 1, testable = false)
+ public static Archive<?> deploy() {
+ JavaArchive jar = ShrinkWrap.create(JavaArchive.class, "d1.jar");
+ jar.addClasses(SimpleBean.class);
+ jar.addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
+ return jar;
+ }
+
+ @Deployment(name = "d2", order = 2)
+ public static Archive<?> deploy2() {
+ JavaArchive jar = ShrinkWrap.create(JavaArchive.class, "d2.jar");
+ jar.addClass(WeldCrossDeploymentTestCase.class);
+ jar.addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
+ jar.addAsManifestResource(new StringAsset("Dependencies: deployment.d1.jar meta-inf\n"), "MANIFEST.MF");
+ return jar;
+ }
+
+ @Inject
+ private SimpleBean bean;
+
+ @Test
+ @OperateOnDeployment("d2")
+ public void testSimpleBeanInjected() throws Exception {
+ Assert.assertNotNull(bean);
+ }
+}
@@ -0,0 +1,168 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2011, 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.multideployment;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+
+import javax.inject.Inject;
+
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.container.test.api.OperateOnDeployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.as.arquillian.api.ServerSetup;
+import org.jboss.as.arquillian.container.ManagementClient;
+import org.jboss.as.test.integration.management.base.AbstractMgmtServerSetupTask;
+import org.jboss.dmr.ModelNode;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.jboss.shrinkwrap.api.asset.StringAsset;
+import org.jboss.shrinkwrap.api.exporter.ZipExporter;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.xnio.IoUtils;
+
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP;
+import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP_ADDR;
+
+/**
+ * Tests that beans definied in a static can be used by a deployment
+ *
+ * @author Stuart Douglas
+ */
+@RunWith(Arquillian.class)
+public class WeldModuleDeploymentTestCase {
+
+ public static void doSetup() throws Exception {
+ File testModuleRoot = new File(getModulePath(), "org/jboss/test/weldModule");
+ deleteRecursively(testModuleRoot);
+ createTestModule(testModuleRoot);
+ }
+
+ @AfterClass
+ public static void tearDown() throws Exception {
+ File testModuleRoot = new File(getModulePath(), "org/jboss/test/weldModule");
+ deleteRecursively(testModuleRoot);
+ }
+
+ private static void deleteRecursively(File file) {
+ if (file.exists()) {
+ if (file.isDirectory()) {
+ for (String name : file.list()) {
+ deleteRecursively(new File(file, name));
+ }
+ }
+ file.delete();
+ }
+ }
+
+ private static void createTestModule(File testModuleRoot) throws IOException {
+ if (testModuleRoot.exists()) {
+ throw new IllegalArgumentException(testModuleRoot + " already exists");
+ }
+ File file = new File(testModuleRoot, "main");
+ if (!file.mkdirs()) {
+ throw new IllegalArgumentException("Could not create " + file);
+ }
+
+ URL url = WeldModuleDeploymentTestCase.class.getResource("module.xml");
+ if (url == null) {
+ throw new IllegalStateException("Could not find module.xml");
+ }
+ copyFile(new File(file, "module.xml"), url.openStream());
+
+ JavaArchive jar = ShrinkWrap.create(JavaArchive.class, "weldTest.jar");
+ jar.addClasses(SimpleBean.class);
+ jar.addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
+ FileOutputStream jarFile = new FileOutputStream(new File(file, "weldTest.jar"));
+ try {
+ jar.as(ZipExporter.class).exportTo(jarFile);
+ } finally {
+ jarFile.flush();
+ jarFile.close();
+ }
+
+ }
+
+ private static void copyFile(File target, InputStream src) throws IOException {
+ final BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(target));
+ try {
+ int i = src.read();
+ while (i != -1) {
+ out.write(i);
+ i = src.read();
+ }
+ } finally {
+ IoUtils.safeClose(out);
+ }
+ }
+
+ private static File getModulePath() {
+ String modulePath = System.getProperty("module.path", null);
+ if (modulePath == null) {
+ String jbossHome = System.getProperty("jboss.home", null);
+ if (jbossHome == null) {
+ throw new IllegalStateException("Neither -Dmodule.path nor -Djboss.home were set");
+ }
+ modulePath = jbossHome + File.separatorChar + "modules";
+ } else {
+ modulePath = modulePath.split(File.pathSeparator)[0];
+ }
+ File moduleDir = new File(modulePath);
+ if (!moduleDir.exists()) {
+ throw new IllegalStateException("Determined module path does not exist");
+ }
+ if (!moduleDir.isDirectory()) {
+ throw new IllegalStateException("Determined module path is not a dir");
+ }
+ return moduleDir;
+ }
+
+
+ @Deployment
+ public static Archive<?> deploy2() throws Exception {
+ doSetup();
+ JavaArchive jar = ShrinkWrap.create(JavaArchive.class, "d2.jar");
+ jar.addClasses(WeldModuleDeploymentTestCase.class);
+ jar.addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
+ jar.addAsManifestResource(new StringAsset("Dependencies: org.jboss.test.weldModule meta-inf\n"), "MANIFEST.MF");
+ return jar;
+ }
+
+ @Inject
+ private SimpleBean bean;
+
+ @Test
+ public void testSimpleBeanInjected() throws Exception {
+ Assert.assertNotNull(bean);
+ }
+}
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ ~ JBoss, Home of Professional Open Source.
+ ~ Copyright 2010, 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.
+ -->
+
+<module xmlns="urn:jboss:module:1.1" name="org.jboss.test.weldModule">
+
+ <resources>
+ <resource-root path="weldTest.jar"/>
+ <!-- Insert resources here -->
+ </resources>
+
+ <dependencies>
+ <module name="javax.api"/>
+ <module name="javax.resource.api"/>
+ <module name="javax.enterprise.api"/>
+ <module name="javax.inject.api"/>
+
+ <module name="javax.validation.api"/>
+ <module name="org.hibernate.validator"/>
+ <module name="javax.xml.stream.api"/>
+ </dependencies>
+</module>
@@ -22,6 +22,7 @@
package org.jboss.as.weld;
+import java.io.IOException;
import java.lang.reflect.Member;
import java.net.URL;
@@ -110,4 +111,16 @@
@LogMessage(level = Logger.Level.ERROR)
@Message(value = "Exception tearing down thread state", id = 16013)
void exceptionClearingThreadState(@Cause Exception e);
+
+ @LogMessage(level = Logger.Level.ERROR)
+ @Message(value = "Error loading file %s", id = 16014)
+ void errorLoadingFile(String newPath);
+
+ @LogMessage(level = Logger.Level.ERROR)
+ @Message(value = "Could not read entries", id = 16015)
+ void couldNotReadEntries(@Cause IOException ioe);
+
+ @LogMessage(level = Logger.Level.WARN)
+ @Message(value = "URL scanner does not understand the URL protocol %s, CDI beans will not be scanned.", id = 16016)
+ void doNotUnderstandProtocol(URL url);
}
@@ -33,6 +33,7 @@
import org.jboss.as.weld.deployment.CdiAnnotationProcessor;
import org.jboss.as.weld.deployment.processors.BeanArchiveProcessor;
import org.jboss.as.weld.deployment.processors.BeansXmlProcessor;
+import org.jboss.as.weld.deployment.processors.ExternalBeanArchiveProcessor;
import org.jboss.as.weld.deployment.processors.WebIntegrationProcessor;
import org.jboss.as.weld.deployment.processors.WeldBeanManagerServiceProcessor;
import org.jboss.as.weld.deployment.processors.WeldComponentIntegrationProcessor;
@@ -61,11 +62,12 @@ protected void populateModel(ModelNode operation, ModelNode model) {
protected void performBoottime(OperationContext context, ModelNode operation, ModelNode model, ServiceVerificationHandler verificationHandler, List<ServiceController<?>> newControllers) {
context.addStep(new AbstractDeploymentChainStep() {
protected void execute(DeploymentProcessorTarget processorTarget) {
- processorTarget.addDeploymentProcessor(WeldExtension.SUBSYSTEM_NAME, Phase.DEPENDENCIES, Phase.DEPENDENCIES_WELD, new WeldDependencyProcessor());
processorTarget.addDeploymentProcessor(WeldExtension.SUBSYSTEM_NAME, Phase.PARSE, Phase.PARSE_CDI_ANNOTATIONS, new CdiAnnotationProcessor());
processorTarget.addDeploymentProcessor(WeldExtension.SUBSYSTEM_NAME, Phase.PARSE, Phase.PARSE_WELD_DEPLOYMENT, new BeansXmlProcessor());
+ processorTarget.addDeploymentProcessor(WeldExtension.SUBSYSTEM_NAME, Phase.DEPENDENCIES, Phase.DEPENDENCIES_WELD, new WeldDependencyProcessor());
processorTarget.addDeploymentProcessor(WeldExtension.SUBSYSTEM_NAME, Phase.POST_MODULE, Phase.POST_MODULE_WELD_WEB_INTEGRATION, new WebIntegrationProcessor());
processorTarget.addDeploymentProcessor(WeldExtension.SUBSYSTEM_NAME, Phase.POST_MODULE, Phase.POST_MODULE_WELD_BEAN_ARCHIVE, new BeanArchiveProcessor());
+ processorTarget.addDeploymentProcessor(WeldExtension.SUBSYSTEM_NAME, Phase.POST_MODULE, Phase.POST_MODULE_WELD_EXTERNAL_BEAN_ARCHIVE, new ExternalBeanArchiveProcessor());
processorTarget.addDeploymentProcessor(WeldExtension.SUBSYSTEM_NAME, Phase.POST_MODULE, Phase.POST_MODULE_WELD_PORTABLE_EXTENSIONS, new WeldPortableExtensionProcessor());
processorTarget.addDeploymentProcessor(WeldExtension.SUBSYSTEM_NAME, Phase.POST_MODULE, Phase.POST_MODULE_WELD_COMPONENT_INTEGRATION, new WeldComponentIntegrationProcessor());
processorTarget.addDeploymentProcessor(WeldExtension.SUBSYSTEM_NAME, Phase.INSTALL, Phase.INSTALL_WELD_DEPLOYMENT, new WeldDeploymentProcessor());
Oops, something went wrong.

0 comments on commit d252522

Please sign in to comment.