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);


Reply via email to