Author: rmannibucau
Date: Thu Jan 10 02:43:35 2013
New Revision: 1431182
URL: http://svn.apache.org/viewvc?rev=1431182&view=rev
Log:
OPENEJB-1987 openejb.arquillian.predeploy-archives = list of classes comma
separated, each static method with a @Deployment will be called and the archive
will be deployed
Added:
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/EmptyArchive.java
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/StartDeploymentTest.java
Modified:
openejb/trunk/openejb/arquillian/arquillian-common/src/main/java/org/apache/openejb/arquillian/common/ArquillianUtil.java
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBArchiveProcessor.java
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBDeployableContainer.java
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/resources/arquillian.xml
openejb/trunk/openejb/arquillian/arquillian-tomee-remote/src/main/java/org/apache/tomee/arquillian/remote/RemoteTomEEContainer.java
Modified:
openejb/trunk/openejb/arquillian/arquillian-common/src/main/java/org/apache/openejb/arquillian/common/ArquillianUtil.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-common/src/main/java/org/apache/openejb/arquillian/common/ArquillianUtil.java?rev=1431182&r1=1431181&r2=1431182&view=diff
==============================================================================
---
openejb/trunk/openejb/arquillian/arquillian-common/src/main/java/org/apache/openejb/arquillian/common/ArquillianUtil.java
(original)
+++
openejb/trunk/openejb/arquillian/arquillian-common/src/main/java/org/apache/openejb/arquillian/common/ArquillianUtil.java
Thu Jan 10 02:43:35 2013
@@ -16,10 +16,26 @@
*/
package org.apache.openejb.arquillian.common;
+import org.apache.openejb.OpenEJBRuntimeException;
+import org.jboss.arquillian.container.spi.client.container.DeployableContainer;
+import org.jboss.arquillian.container.spi.client.container.DeploymentException;
+import org.jboss.shrinkwrap.api.Archive;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Properties;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
public final class ArquillianUtil {
private static final String OPENEJB_ADAPTER_SYSTEM_PROP =
"openejb.arquillian.adapter";
private static final String TOMEE_ADAPTER_SYSTEM_PROP =
"tomee.arquillian.adapter";
+ public static final String PREDEPLOYING_KEY =
"openejb.arquillian.predeploy-archives";
+
private ArquillianUtil() {
// no-op
}
@@ -31,4 +47,47 @@ public final class ArquillianUtil {
}
return adapter == null || name.equals(adapter);
}
+
+ public static Collection<Archive<?>> toDeploy(final Properties properties)
{
+ final Collection<Archive<?>> list = new ArrayList<Archive<?>>();
+ if (properties.containsKey(ArquillianUtil.PREDEPLOYING_KEY)) {
+ final String toSplit =
properties.getProperty(PREDEPLOYING_KEY).trim();
+ final ClassLoader loader =
Thread.currentThread().getContextClassLoader();
+ for (String name : toSplit.split(",")) {
+ try {
+ final Class<?> clazz = loader.loadClass(name);
+ for (Method m : clazz.getMethods()) {
+ final int modifiers = m.getModifiers();
+ if (Object.class.equals(m.getDeclaringClass()) ||
!Archive.class.isAssignableFrom(m.getReturnType())
+ || !Modifier.isStatic(modifiers) ||
!Modifier.isPublic(modifiers)) {
+ continue;
+ }
+
+ for (Annotation a : m.getAnnotations()) {
+ if
("org.jboss.arquillian.container.test.api.Deployment".equals(a.annotationType().getName()))
{
+ final Archive<?> archive = (Archive<?>)
m.invoke(null);
+ list.add(archive);
+ break;
+ }
+ }
+ }
+ } catch (Exception e) {
+ throw new OpenEJBRuntimeException(e);
+ }
+ }
+ }
+ return list;
+ }
+
+ public static void undeploy(DeployableContainer<?> container, final
Collection<Archive<?>> containerArchives) {
+ if (containerArchives != null) {
+ for (Archive<?> a : containerArchives) {
+ try {
+ container.undeploy(a);
+ } catch (DeploymentException e) {
+
Logger.getLogger(container.getClass().getName()).log(Level.SEVERE,
e.getMessage(), e);
+ }
+ }
+ }
+ }
}
Added:
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/EmptyArchive.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/EmptyArchive.java?rev=1431182&view=auto
==============================================================================
---
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/EmptyArchive.java
(added)
+++
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/EmptyArchive.java
Thu Jan 10 02:43:35 2013
@@ -0,0 +1,50 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.openejb.arquillian.openejb;
+
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.jboss.shrinkwrap.api.spec.WebArchive;
+
+import javax.annotation.PostConstruct;
+import javax.ejb.Singleton;
+import javax.ejb.Startup;
+
+public final class EmptyArchive {
+ private EmptyArchive() {
+ // no-op
+ }
+
+ @Deployment(testable = false)
+ public static WebArchive war() {
+ return ShrinkWrap.create(WebArchive.class, "start.war")
+ .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml")
+ .addClass(OkFilter.class);
+ }
+
+ @Startup
+ @Singleton
+ public static class OkFilter {
+ public static boolean ok = false;
+
+ @PostConstruct
+ public void init() {
+ ok = true;
+ }
+ }
+}
Modified:
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBArchiveProcessor.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBArchiveProcessor.java?rev=1431182&r1=1431181&r2=1431182&view=diff
==============================================================================
---
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBArchiveProcessor.java
(original)
+++
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBArchiveProcessor.java
Thu Jan 10 02:43:35 2013
@@ -88,7 +88,12 @@ public class OpenEJBArchiveProcessor {
public static final String WEB_INF_CLASSES = "/WEB-INF/classes/";
public static AppModule createModule(final Archive<?> archive, final
TestClass testClass) {
- final Class<?> javaClass = testClass.getJavaClass();
+ final Class<?> javaClass;
+ if (testClass != null) {
+ javaClass = testClass.getJavaClass();
+ } else {
+ javaClass = null;
+ }
final List<URL> additionalPaths = new ArrayList<URL>();
@@ -115,7 +120,13 @@ public class OpenEJBArchiveProcessor {
prefix = META_INF;
}
- final ClassLoader parent = javaClass.getClassLoader();
+ final ClassLoader parent;
+ if (javaClass == null) {
+ parent = Thread.currentThread().getContextClassLoader();
+ } else {
+ parent = javaClass.getClassLoader();
+ }
+
final URL[] urls = additionalPaths.toArray(new
URL[additionalPaths.size()]);
final ClassLoader loader;
@@ -137,7 +148,7 @@ public class OpenEJBArchiveProcessor {
}
// add the test as a managed bean to be able to inject into it easily
- {
+ if (javaClass != null) {
final EjbJar ejbJar = new EjbJar();
final OpenejbJar openejbJar = new OpenejbJar();
final ManagedBean bean = ejbJar.addEnterpriseBean(new
ManagedBean(javaClass.getSimpleName(), javaClass.getName(), true));
Modified:
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBDeployableContainer.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBDeployableContainer.java?rev=1431182&r1=1431181&r2=1431182&view=diff
==============================================================================
---
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBDeployableContainer.java
(original)
+++
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/main/java/org/apache/openejb/arquillian/openejb/OpenEJBDeployableContainer.java
Thu Jan 10 02:43:35 2013
@@ -20,6 +20,7 @@ import org.apache.openejb.AppContext;
import org.apache.openejb.OpenEJB;
import org.apache.openejb.OpenEJBRuntimeException;
import org.apache.openejb.OpenEjbContainer;
+import org.apache.openejb.arquillian.common.ArquillianUtil;
import org.apache.openejb.assembler.classic.AppInfo;
import org.apache.openejb.assembler.classic.Assembler;
import org.apache.openejb.assembler.classic.OpenEjbConfigurationFactory;
@@ -57,8 +58,11 @@ import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import java.io.ByteArrayInputStream;
import java.io.IOException;
+import java.util.Collection;
import java.util.Map;
import java.util.Properties;
+import java.util.logging.Level;
+import java.util.logging.Logger;
import static org.apache.openejb.cdi.ScopeHelper.startContexts;
import static org.apache.openejb.cdi.ScopeHelper.stopContexts;
@@ -86,6 +90,7 @@ public class OpenEJBDeployableContainer
private Assembler assembler;
private InitialContext initialContext;
private ConfigurationFactory configurationFactory;
+ private Collection<Archive<?>> containerArchives;
// suite
@Inject
@@ -174,12 +179,37 @@ public class OpenEJBDeployableContainer
}
contextProducer.set(initialContext);
+
+ containerArchives = ArquillianUtil.toDeploy(properties);
+ for (Archive<?> archive : containerArchives) {
+ try {
+ quickDeploy(archive, testClass.get());
+ } catch (DeploymentException e) {
+
Logger.getLogger(OpenEJBDeployableContainer.class.getName()).log(Level.SEVERE,
e.getMessage(), e);
+ }
+ }
}
@Override
public ProtocolMetaData deploy(final Archive<?> archive) throws
DeploymentException {
try {
- final AppModule module =
OpenEJBArchiveProcessor.createModule(archive, testClass.get());
+ final DeploymentInfo info = quickDeploy(archive, testClass.get());
+
+ servletContextProducer.set(info.appServletContext);
+ sessionProducer.set(info.appSession);
+ appInfoProducer.set(info.appInfo);
+ appContextProducer.set(info.appCtx);
+ classLoader.set(info.appCtx.getClassLoader());
+ } catch (Exception e) {
+ throw new DeploymentException("can't deploy " + archive.getName(),
e);
+ }
+
+ return new ProtocolMetaData();
+ }
+
+ private DeploymentInfo quickDeploy(final Archive<?> archive, final
TestClass testClass) throws DeploymentException {
+ try {
+ final AppModule module =
OpenEJBArchiveProcessor.createModule(archive, testClass);
final AppInfo appInfo =
configurationFactory.configureApplication(module);
final AppContext appCtx = assembler.createApplication(appInfo,
module.getClassLoader());
@@ -188,17 +218,10 @@ public class OpenEJBDeployableContainer
startContexts(appCtx.getWebBeansContext().getContextsService(),
appServletContext, appSession);
- servletContextProducer.set(appServletContext);
- sessionProducer.set(appSession);
-
- appInfoProducer.set(appInfo);
- appContextProducer.set(appCtx);
- classLoader.set(appCtx.getClassLoader());
+ return new DeploymentInfo(appServletContext, appSession, appInfo,
appCtx);
} catch (Exception e) {
throw new DeploymentException("can't deploy " + archive.getName(),
e);
}
-
- return new ProtocolMetaData();
}
@Override
@@ -226,6 +249,8 @@ public class OpenEJBDeployableContainer
@Override
public void stop() throws LifecycleException {
+ ArquillianUtil.undeploy(this, containerArchives);
+
try {
if (initialContext != null) {
initialContext.close();
@@ -251,4 +276,18 @@ public class OpenEJBDeployableContainer
public void undeploy(Descriptor descriptor) throws DeploymentException {
throw new UnsupportedOperationException();
}
+
+ private static class DeploymentInfo {
+ public final ServletContext appServletContext;
+ public final HttpSession appSession;
+ public final AppInfo appInfo;
+ public final AppContext appCtx;
+
+ private DeploymentInfo(ServletContext appServletContext, HttpSession
appSession, AppInfo appInfo, AppContext appCtx) {
+ this.appServletContext = appServletContext;
+ this.appSession = appSession;
+ this.appInfo = appInfo;
+ this.appCtx = appCtx;
+ }
+ }
}
Added:
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/StartDeploymentTest.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/StartDeploymentTest.java?rev=1431182&view=auto
==============================================================================
---
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/StartDeploymentTest.java
(added)
+++
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/java/org/apache/openejb/arquillian/openejb/StartDeploymentTest.java
Thu Jan 10 02:43:35 2013
@@ -0,0 +1,31 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.openejb.arquillian.openejb;
+
+import org.jboss.arquillian.junit.Arquillian;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.assertTrue;
+
+@RunWith(Arquillian.class)
+public class StartDeploymentTest {
+ @Test
+ public void checkItIsStarted() {
+ assertTrue(EmptyArchive.OkFilter.ok);
+ }
+}
Modified:
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/resources/arquillian.xml
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/resources/arquillian.xml?rev=1431182&r1=1431181&r2=1431182&view=diff
==============================================================================
---
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/resources/arquillian.xml
(original)
+++
openejb/trunk/openejb/arquillian/arquillian-openejb-embedded-4/src/test/resources/arquillian.xml
Thu Jan 10 02:43:35 2013
@@ -28,6 +28,9 @@
java\:global/db = new://Resource?type=DataSource
java\:global/db.JdbcUrl = jdbc:hsqldb:mem:global
+
+ # to check startup deployment
+ openejb.arquillian.predeploy-archives =
org.apache.openejb.arquillian.openejb.EmptyArchive
</property>
</configuration>
</container>
Modified:
openejb/trunk/openejb/arquillian/arquillian-tomee-remote/src/main/java/org/apache/tomee/arquillian/remote/RemoteTomEEContainer.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/arquillian/arquillian-tomee-remote/src/main/java/org/apache/tomee/arquillian/remote/RemoteTomEEContainer.java?rev=1431182&r1=1431181&r2=1431182&view=diff
==============================================================================
---
openejb/trunk/openejb/arquillian/arquillian-tomee-remote/src/main/java/org/apache/tomee/arquillian/remote/RemoteTomEEContainer.java
(original)
+++
openejb/trunk/openejb/arquillian/arquillian-tomee-remote/src/main/java/org/apache/tomee/arquillian/remote/RemoteTomEEContainer.java
Thu Jan 10 02:43:35 2013
@@ -16,19 +16,23 @@
*/
package org.apache.tomee.arquillian.remote;
+import org.apache.openejb.arquillian.common.ArquillianUtil;
import org.apache.openejb.arquillian.common.Files;
import org.apache.openejb.arquillian.common.IO;
import org.apache.openejb.arquillian.common.Setup;
import org.apache.openejb.arquillian.common.TomEEContainer;
import org.apache.openejb.assembler.Deployer;
import org.apache.openejb.config.RemoteServer;
+import org.jboss.arquillian.container.spi.client.container.DeploymentException;
import org.jboss.arquillian.container.spi.client.container.LifecycleException;
+import org.jboss.shrinkwrap.api.Archive;
import javax.naming.NamingException;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
@@ -48,6 +52,7 @@ public class RemoteTomEEContainer extend
private RemoteServer container;
private boolean shutdown = false;
private File tomeeHome;
+ private Collection<Archive<?>> containerArchives;
@Override
public void start() throws LifecycleException {
@@ -83,6 +88,16 @@ public class RemoteTomEEContainer extend
container.setAdditionalClasspath(addOneLineFormatter(tomeeHome));
container.start(args(), "start", true);
container.killOnExit();
+
+ if (configuration.getProperties() != null) {
+ final Properties props = new Properties();
+
IO.readProperties(IO.read(configuration.getProperties().getBytes()), new
Properties());
+
+ containerArchives = ArquillianUtil.toDeploy(props);
+ for (Archive<?> archive : containerArchives) {
+ deploy(archive);
+ }
+ }
} catch (Exception e) {
logger.log(Level.SEVERE, "Unable to start remote container", e);
throw new LifecycleException("Unable to start remote container:" +
e.getMessage(), e);
@@ -221,6 +236,8 @@ public class RemoteTomEEContainer extend
@Override
public void stop() throws LifecycleException {
+ ArquillianUtil.undeploy(this, containerArchives);
+
// only stop the container if we started it
if (shutdown) {
Setup.removeArquillianBeanDiscoverer(tomeeHome);