Hi,

Why beanmanager stuff is not enough?

- Romain

---------- Message transféré ----------
De : <[email protected]>
Date : 27 oct. 2011 01:08
Objet : svn commit: r1189526 - in /openejb/trunk/arquillian-tomee: ./
arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/
arquillian-tomee-remote/
arquillian-tomee-remote/src/main/java/org/apache/openejb/arquillian/remote/
arquillian-to...
À : <[email protected]>

Author: jgallimore
Date: Wed Oct 26 23:08:05 2011
New Revision: 1189526

URL: http://svn.apache.org/viewvc?rev=1189526&view=rev
Log:
Progress on supporting enriching tests with @EJB fields

Added:

 
openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/main/java/org/apache/openejb/arquillian/remote/RemoteTomEEEJBEnricherArchiveAppender.java

 
openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/main/java/org/apache/openejb/arquillian/remote/RemoteTomEEEJBEnricherExtension.java

 
openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/main/java/org/apache/openejb/arquillian/remote/SecurityActions.java
Removed:

 
openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/main/resources/META-INF/services/org.jboss.arquillian.spi.TestEnricher
Modified:

 
openejb/trunk/arquillian-tomee/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java
   openejb/trunk/arquillian-tomee/arquillian-tomee-remote/pom.xml

 
openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/main/java/org/apache/openejb/arquillian/remote/RemoteTomEEContainer.java

 
openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/main/java/org/apache/openejb/arquillian/remote/RemoteTomEEEnricher.java

 
openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/main/java/org/apache/openejb/arquillian/remote/RemoteTomEEExtension.java

 
openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/test/java/org/apache/openejb/arquillian/TomEEContainerTest.java
   openejb/trunk/arquillian-tomee/pom.xml

Modified:
openejb/trunk/arquillian-tomee/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/arquillian-tomee/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java?rev=1189526&r1=1189525&r2=1189526&view=diff
==============================================================================
---
openejb/trunk/arquillian-tomee/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java
(original)
+++
openejb/trunk/arquillian-tomee/arquillian-tomee-common/src/main/java/org/apache/openejb/arquillian/common/TomEEContainer.java
Wed Oct 26 23:08:05 2011
@@ -36,6 +36,7 @@ import org.jboss.arquillian.container.sp
 import org.jboss.arquillian.container.spi.client.protocol.metadata.Servlet;
 import org.jboss.shrinkwrap.api.Archive;
 import org.jboss.shrinkwrap.api.exporter.ZipExporter;
+import org.jboss.shrinkwrap.api.spec.WebArchive;
 import org.jboss.shrinkwrap.descriptor.api.Descriptor;

 public abstract class TomEEContainer implements
DeployableContainer<TomEEConfiguration> {
@@ -86,7 +87,7 @@ public abstract class TomEEContainer imp
    }

    public ProtocolDescription getDefaultProtocol() {
-        return new ProtocolDescription("Servlet 3.0");
+        return new ProtocolDescription("Servlet 2.5");
    }

    public ProtocolMetaData deploy(Archive<?> archive) throws
DeploymentException {
@@ -107,7 +108,12 @@ public abstract class TomEEContainer imp
            moduleIds.put(archive.getName(), file.getAbsolutePath());

            HTTPContext httpContext = new HTTPContext("0.0.0.0",
configuration.getHttpPort());
-            httpContext.add(new Servlet("ArquillianServletRunner", "/" +
getArchiveNameWithoutExtension(archive)));
+            if (archive instanceof WebArchive) {
+               httpContext.add(new Servlet("ArquillianServletRunner", "/" +
getArchiveNameWithoutExtension(archive)));
+            } else {
+               httpContext.add(new Servlet("ArquillianServletRunner",
"/arquillian-protocol"));
+            }
+
            // we should probably get all servlets and add them to the
context
            return new ProtocolMetaData().addContext(httpContext);
        } catch (Exception e) {

Modified: openejb/trunk/arquillian-tomee/arquillian-tomee-remote/pom.xml
URL:
http://svn.apache.org/viewvc/openejb/trunk/arquillian-tomee/arquillian-tomee-remote/pom.xml?rev=1189526&r1=1189525&r2=1189526&view=diff
==============================================================================
--- openejb/trunk/arquillian-tomee/arquillian-tomee-remote/pom.xml
(original)
+++ openejb/trunk/arquillian-tomee/arquillian-tomee-remote/pom.xml Wed Oct
26 23:08:05 2011
@@ -333,5 +333,12 @@
       <artifactId>swizzle-stream</artifactId>
       <version>1.0.2</version>
    </dependency>
+    <dependency>
+       <groupId>org.jboss.shrinkwrap.descriptors</groupId>
+       <artifactId>shrinkwrap-descriptors-impl</artifactId>
+       <version>1.1.0-alpha-2</version>
+       <type>jar</type>
+       <scope>compile</scope>
+    </dependency>
  </dependencies>
 </project>

Modified:
openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/main/java/org/apache/openejb/arquillian/remote/RemoteTomEEContainer.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/main/java/org/apache/openejb/arquillian/remote/RemoteTomEEContainer.java?rev=1189526&r1=1189525&r2=1189526&view=diff
==============================================================================
---
openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/main/java/org/apache/openejb/arquillian/remote/RemoteTomEEContainer.java
(original)
+++
openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/main/java/org/apache/openejb/arquillian/remote/RemoteTomEEContainer.java
Wed Oct 26 23:08:05 2011
@@ -77,6 +77,7 @@ public class RemoteTomEEContainer extend

                   System.setProperty("catalina.home",
openejbHome.getAbsolutePath());
                           System.setProperty("catalina.base",
openejbHome.getAbsolutePath());
+
System.setProperty("openejb.deploymentId.format","{appId}/{ejbJarId}/{ejbName}");
                           Paths paths = new Paths(new
File(openejbHome.getAbsolutePath(), "/webapps/openejb"));
                           Installer installer = new Installer(paths, true);
                           installer.installAll();

Added:
openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/main/java/org/apache/openejb/arquillian/remote/RemoteTomEEEJBEnricherArchiveAppender.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/main/java/org/apache/openejb/arquillian/remote/RemoteTomEEEJBEnricherArchiveAppender.java?rev=1189526&view=auto
==============================================================================
---
openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/main/java/org/apache/openejb/arquillian/remote/RemoteTomEEEJBEnricherArchiveAppender.java
(added)
+++
openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/main/java/org/apache/openejb/arquillian/remote/RemoteTomEEEJBEnricherArchiveAppender.java
Wed Oct 26 23:08:05 2011
@@ -0,0 +1,18 @@
+package org.apache.openejb.arquillian.remote;
+
+import org.jboss.arquillian.container.test.spi.RemoteLoadableExtension;
+import
org.jboss.arquillian.container.test.spi.client.deployment.AuxiliaryArchiveAppender;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+
+public class RemoteTomEEEJBEnricherArchiveAppender implements
AuxiliaryArchiveAppender
+{
+          @Override
+          public Archive<?> createAuxiliaryArchive()
+          {
+             return ShrinkWrap.create(JavaArchive.class,
"arquillian-tomee-testenricher-ejb.jar")
+                         .addClasses(RemoteTomEEEnricher.class,
RemoteTomEEEJBEnricherExtension.class, SecurityActions.class)
+
.addAsServiceProvider(RemoteLoadableExtension.class,
RemoteTomEEEJBEnricherExtension.class);
+          }
+       }
\ No newline at end of file

Added:
openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/main/java/org/apache/openejb/arquillian/remote/RemoteTomEEEJBEnricherExtension.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/main/java/org/apache/openejb/arquillian/remote/RemoteTomEEEJBEnricherExtension.java?rev=1189526&view=auto
==============================================================================
---
openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/main/java/org/apache/openejb/arquillian/remote/RemoteTomEEEJBEnricherExtension.java
(added)
+++
openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/main/java/org/apache/openejb/arquillian/remote/RemoteTomEEEJBEnricherExtension.java
Wed Oct 26 23:08:05 2011
@@ -0,0 +1,13 @@
+package org.apache.openejb.arquillian.remote;
+
+import org.jboss.arquillian.container.test.spi.RemoteLoadableExtension;
+import org.jboss.arquillian.test.spi.TestEnricher;
+
+public class RemoteTomEEEJBEnricherExtension implements
RemoteLoadableExtension {
+    @Override public void register(ExtensionBuilder builder) {
+       // only load if EJB is on ClassPath
+        if(Validate.classExists("javax.ejb.EJB")) {
+           builder.service(TestEnricher.class,
org.apache.openejb.arquillian.remote.RemoteTomEEEnricher.class);
+        }
+    }
+}

Modified:
openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/main/java/org/apache/openejb/arquillian/remote/RemoteTomEEEnricher.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/main/java/org/apache/openejb/arquillian/remote/RemoteTomEEEnricher.java?rev=1189526&r1=1189525&r2=1189526&view=diff
==============================================================================
---
openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/main/java/org/apache/openejb/arquillian/remote/RemoteTomEEEnricher.java
(original)
+++
openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/main/java/org/apache/openejb/arquillian/remote/RemoteTomEEEnricher.java
Wed Oct 26 23:08:05 2011
@@ -3,45 +3,122 @@ package org.apache.openejb.arquillian.re
 import org.apache.openejb.cdi.ThreadSingletonServiceImpl;
 import org.jboss.arquillian.test.spi.TestEnricher;

+import javax.ejb.EJB;
 import javax.enterprise.context.spi.CreationalContext;
 import javax.enterprise.inject.spi.AnnotatedType;
 import javax.enterprise.inject.spi.BeanManager;
 import javax.enterprise.inject.spi.InjectionTarget;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
 import java.lang.reflect.Method;
+import java.util.List;

 public class RemoteTomEEEnricher implements TestEnricher {
-    @Override public void enrich(Object testCase) {
-//        BeanManager mgr = getBeanManager();
-//        if (mgr != null) {
-//            AnnotatedType<?> type =  mgr.createAnnotatedType(getClass());
-//            InjectionTarget<Object> injectionTarget =
(InjectionTarget<Object>) mgr.createInjectionTarget(type);
-//            CreationalContext<Object> context =
mgr.createCreationalContext(null);
-//
-//            injectionTarget.inject(testCase, context);
-//            injectionTarget.postConstruct(this);
-//        } else {
-//            throw new NullPointerException("bean manager is null");
-//        }
-
-        /* TODO: see if this code could be called after tests
-                *
-                * if (injectionTarget != null) {
-                *        injectionTarget.preDestroy(this);
-                *    }
-                *   if (context != null) {
-                *        context.release();
-                *    }
-                *
-                *   injectionTarget = null;
-                *   context = null;
-                */
-    }
-
-    @Override public Object[] resolve(Method method) {
-        return new Object[method.getParameterTypes().length];
-    }
-
-    public BeanManager getBeanManager() {
-        return ThreadSingletonServiceImpl.get().getBeanManagerImpl();
-    }
+
+       private static final String ANNOTATION_NAME = "javax.ejb.EJB";
+
+       public void enrich(Object testCase) {
+               BeanManager mgr = getBeanManager();
+               if (mgr != null) {
+                       AnnotatedType<?> type =
mgr.createAnnotatedType(getClass());
+                       InjectionTarget<Object> injectionTarget =
(InjectionTarget<Object>) mgr.createInjectionTarget(type);
+                       CreationalContext<Object> context =
mgr.createCreationalContext(null);
+
+                       injectionTarget.inject(testCase, context);
+                       injectionTarget.postConstruct(this);
+               }
+
+               try {
+                       if (SecurityActions.isClassPresent(ANNOTATION_NAME))
{
+                               @SuppressWarnings("unchecked")
+                               Class<? extends Annotation> ejbAnnotation =
(Class<? extends Annotation>)
SecurityActions.getThreadContextClassLoader().loadClass(ANNOTATION_NAME);
+
+                               List<Field> annotatedFields =
SecurityActions.getFieldsWithAnnotation(testCase.getClass(), ejbAnnotation);
+
+                               for (Field field : annotatedFields) {
+                                       if (field.get(testCase) == null) {
+                                               EJB fieldAnnotation = (EJB)
field.getAnnotation(ejbAnnotation);
+                                               Object ejb =
lookupEJB(field.getType(), fieldAnnotation.mappedName());
+                                               field.set(testCase, ejb);
+                                       }
+                               }
+
+                               List<Method> methods =
SecurityActions.getMethodsWithAnnotation(testCase.getClass(),
ejbAnnotation);
+
+                               for (Method method : methods) {
+                                       if
(method.getParameterTypes().length != 1) {
+                                               throw new
RuntimeException("@EJB only allowed on single argument methods");
+                                       }
+                                       if
(!method.getName().startsWith("set")) {
+                                               throw new
RuntimeException("@EJB only allowed on 'set' methods");
+                                       }
+                                       EJB parameterAnnotation = null; //
method.getParameterAnnotations()[0]
+                                       for (Annotation annotation :
method.getParameterAnnotations()[0]) {
+                                               if
(EJB.class.isAssignableFrom(annotation.annotationType())) {
+                                                       parameterAnnotation
= (EJB) annotation;
+                                               }
+                                       }
+                                       String mappedName =
parameterAnnotation == null ? null : parameterAnnotation.mappedName();
+                                       Object ejb =
lookupEJB(method.getParameterTypes()[0], mappedName);
+                                       method.invoke(testCase, ejb);
+                               }
+
+                       }
+               } catch (Exception e) {
+
+               }
+
+       }
+
+       protected Object lookupEJB(Class<?> fieldType, String mappedName)
throws Exception {
+               // TODO: figure out test context ?
+               Context initcontext = new InitialContext();
+
+               // TODO: These names are not spec compliant; fieldType needs
to be a
+               // bean type here,
+               // but usually is just an interface of a bean. These seldom
work.
+               String[] jndiNames = {
"openejb:global/global/test/test.jar/" + fieldType.getSimpleName() + "Bean",
+                               "openejb:global/global/test/test.jar/" +
fieldType.getSimpleName(),
+                               "java:global/test/test.jar/" +
fieldType.getSimpleName() + "Bean",
+                               "java:global/test/test.jar/" +
fieldType.getSimpleName(),
+                               "java:global/test.ear/test/" +
fieldType.getSimpleName() + "Bean",
+                               "java:global/test.ear/test/" +
fieldType.getSimpleName(),
+                               "java:global/test/" +
fieldType.getSimpleName(),
+                               "java:global/test/" +
fieldType.getSimpleName() + "Bean",
+                               "java:global/test/" +
fieldType.getSimpleName() + "/no-interface",
+                               "test/" + fieldType.getSimpleName() +
"Bean/local",
+                               "test/" + fieldType.getSimpleName() +
"Bean/remote",
+                               "test/" + fieldType.getSimpleName() +
"/no-interface",
+                               fieldType.getSimpleName() + "Bean/local",
+                               fieldType.getSimpleName() + "Bean/remote",
+                               fieldType.getSimpleName() + "/no-interface",
+                               "ejblocal:" + fieldType.getCanonicalName(),
+                               fieldType.getCanonicalName() };
+               if ((mappedName != null) && (!mappedName.equals(""))) {
+                       // Use only the mapped name to lookup this EJB
+                       jndiNames = new String[] { mappedName };
+               }
+
+               for (String jndiName : jndiNames) {
+                       try {
+                               return initcontext.lookup(jndiName);
+                       } catch (NamingException e) {
+                               // no-op, try next
+                       }
+               }
+               throw new NamingException("No EJB found in JNDI");
+       }
+
+       @Override
+       public Object[] resolve(Method method) {
+               return new Object[method.getParameterTypes().length];
+       }
+
+       public BeanManager getBeanManager() {
+               return
ThreadSingletonServiceImpl.get().getBeanManagerImpl();
+       }
 }

Modified:
openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/main/java/org/apache/openejb/arquillian/remote/RemoteTomEEExtension.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/main/java/org/apache/openejb/arquillian/remote/RemoteTomEEExtension.java?rev=1189526&r1=1189525&r2=1189526&view=diff
==============================================================================
---
openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/main/java/org/apache/openejb/arquillian/remote/RemoteTomEEExtension.java
(original)
+++
openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/main/java/org/apache/openejb/arquillian/remote/RemoteTomEEExtension.java
Wed Oct 26 23:08:05 2011
@@ -1,12 +1,12 @@
 package org.apache.openejb.arquillian.remote;

 import
org.jboss.arquillian.container.spi.client.container.DeployableContainer;
+import
org.jboss.arquillian.container.test.spi.client.deployment.AuxiliaryArchiveAppender;
 import org.jboss.arquillian.core.spi.LoadableExtension;
-import org.jboss.arquillian.test.spi.TestEnricher;

 public class RemoteTomEEExtension implements LoadableExtension {
    @Override public void register(ExtensionBuilder builder) {
        builder.service(DeployableContainer.class,
RemoteTomEEContainer.class)
-            .service(TestEnricher.class, RemoteTomEEEnricher.class);
+            .service(AuxiliaryArchiveAppender.class,
RemoteTomEEEJBEnricherArchiveAppender.class);
    }
 }

Added:
openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/main/java/org/apache/openejb/arquillian/remote/SecurityActions.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/main/java/org/apache/openejb/arquillian/remote/SecurityActions.java?rev=1189526&view=auto
==============================================================================
---
openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/main/java/org/apache/openejb/arquillian/remote/SecurityActions.java
(added)
+++
openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/main/java/org/apache/openejb/arquillian/remote/SecurityActions.java
Wed Oct 26 23:08:05 2011
@@ -0,0 +1,249 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, 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.apache.openejb.arquillian.remote;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * SecurityActions
+ *
+ * A set of privileged actions that are not to leak out
+ * of this package
+ *
+ * @author <a href="mailto:[email protected]";>ALR</a>
+ * @version $Revision: $
+ */
+final class SecurityActions
+{
+
+
//-------------------------------------------------------------------------------||
+   // Constructor
------------------------------------------------------------------||
+
//-------------------------------------------------------------------------------||
+
+   /**
+    * No instantiation
+    */
+   private SecurityActions()
+   {
+      throw new UnsupportedOperationException("No instantiation");
+   }
+
+
//-------------------------------------------------------------------------------||
+   // Utility Methods
--------------------------------------------------------------||
+
//-------------------------------------------------------------------------------||
+
+   /**
+    * Obtains the Thread Context ClassLoader
+    */
+   static ClassLoader getThreadContextClassLoader()
+   {
+      return AccessController.doPrivileged(GetTcclAction.INSTANCE);
+   }
+
+   /**
+    * Obtains the Constructor specified from the given Class and argument
types
+    * @param clazz
+    * @param argumentTypes
+    * @return
+    * @throws NoSuchMethodException
+    */
+   static Constructor<?> getConstructor(final Class<?> clazz, final
Class<?>... argumentTypes)
+         throws NoSuchMethodException
+   {
+      try
+      {
+         return AccessController.doPrivileged(new
PrivilegedExceptionAction<Constructor<?>>()
+         {
+            public Constructor<?> run() throws NoSuchMethodException
+            {
+               return clazz.getConstructor(argumentTypes);
+            }
+         });
+      }
+      // Unwrap
+      catch (final PrivilegedActionException pae)
+      {
+         final Throwable t = pae.getCause();
+         // Rethrow
+         if (t instanceof NoSuchMethodException)
+         {
+            throw (NoSuchMethodException) t;
+         }
+         else
+         {
+            // No other checked Exception thrown by Class.getConstructor
+            try
+            {
+               throw (RuntimeException) t;
+            }
+            // Just in case we've really messed up
+            catch (final ClassCastException cce)
+            {
+               throw new RuntimeException("Obtained unchecked Exception;
this code should never be reached", t);
+            }
+         }
+      }
+   }
+
+   /**
+    * Create a new instance by finding a constructor that matches the
argumentTypes signature
+    * using the arguments for instantiation.
+    *
+    * @param className Full classname of class to create
+    * @param argumentTypes The constructor argument types
+    * @param arguments The constructor arguments
+    * @return a new instance
+    * @throws IllegalArgumentException if className, argumentTypes, or
arguments are null
+    * @throws RuntimeException if any exceptions during creation
+    * @author <a href="mailto:[email protected]";>Aslak Knutsen</a>
+    * @author <a href="mailto:[email protected]";>ALR</a>
+    */
+   static <T> T newInstance(final String className, final Class<?>[]
argumentTypes, final Object[] arguments,
+         final Class<T> expectedType)
+   {
+      if (className == null)
+      {
+         throw new IllegalArgumentException("ClassName must be specified");
+      }
+      if (argumentTypes == null)
+      {
+         throw new IllegalArgumentException("ArgumentTypes must be
specified. Use empty array if no arguments");
+      }
+      if (arguments == null)
+      {
+         throw new IllegalArgumentException("Arguments must be specified.
Use empty array if no arguments");
+      }
+      final Object obj;
+      try
+      {
+         final ClassLoader tccl = getThreadContextClassLoader();
+         final Class<?> implClass = Class.forName(className, false, tccl);
+         Constructor<?> constructor = getConstructor(implClass,
argumentTypes);
+         obj = constructor.newInstance(arguments);
+      }
+      catch (Exception e)
+      {
+         throw new RuntimeException("Could not create new instance of " +
className
+               + ", missing package from classpath?", e);
+      }
+
+      // Cast
+      try
+      {
+         return expectedType.cast(obj);
+      }
+      catch (final ClassCastException cce)
+      {
+         // Reconstruct so we get some useful information
+         throw new ClassCastException("Incorrect expected type, " +
expectedType.getName() + ", defined for "
+               + obj.getClass().getName());
+      }
+   }
+
+   public static boolean isClassPresent(String name)
+   {
+      try
+      {
+         ClassLoader classLoader = getThreadContextClassLoader();
+         classLoader.loadClass(name);
+         return true;
+      }
+      catch (ClassNotFoundException e)
+      {
+         return false;
+      }
+   }
+
+   public static List<Field> getFieldsWithAnnotation(final Class<?> source,
final Class<? extends Annotation> annotationClass)
+   {
+      List<Field> declaredAccessableFields =
AccessController.doPrivileged(new PrivilegedAction<List<Field>>()
+      {
+         public List<Field> run()
+         {
+            List<Field> foundFields = new ArrayList<Field>();
+            Class<?> nextSource = source;
+            while (nextSource != Object.class) {
+               for(Field field : nextSource.getDeclaredFields())
+               {
+                  if(field.isAnnotationPresent(annotationClass))
+                  {
+                     if(!field.isAccessible())
+                     {
+                        field.setAccessible(true);
+                     }
+                     foundFields.add(field);
+                  }
+               }
+               nextSource = nextSource.getSuperclass();
+            }
+            return foundFields;
+         }
+      });
+      return declaredAccessableFields;
+   }
+
+   public static List<Method> getMethodsWithAnnotation(final Class<?>
source, final Class<? extends Annotation> annotationClass)
+   {
+      List<Method> declaredAccessableMethods =
AccessController.doPrivileged(new PrivilegedAction<List<Method>>()
+      {
+         public List<Method> run()
+         {
+            List<Method> foundMethods = new ArrayList<Method>();
+            for(Method method : source.getDeclaredMethods())
+            {
+               if(method.isAnnotationPresent(annotationClass))
+               {
+                  if(!method.isAccessible())
+                  {
+                     method.setAccessible(true);
+                  }
+                  foundMethods.add(method);
+               }
+            }
+            return foundMethods;
+         }
+      });
+      return declaredAccessableMethods;
+   }
+
+
//-------------------------------------------------------------------------------||
+   // Inner Classes
----------------------------------------------------------------||
+
//-------------------------------------------------------------------------------||
+
+   /**
+    * Single instance to get the TCCL
+    */
+   private enum GetTcclAction implements PrivilegedAction<ClassLoader> {
+      INSTANCE;
+
+      public ClassLoader run()
+      {
+         return Thread.currentThread().getContextClassLoader();
+      }
+
+   }
+
+}

Modified:
openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/test/java/org/apache/openejb/arquillian/TomEEContainerTest.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/test/java/org/apache/openejb/arquillian/TomEEContainerTest.java?rev=1189526&r1=1189525&r2=1189526&view=diff
==============================================================================
---
openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/test/java/org/apache/openejb/arquillian/TomEEContainerTest.java
(original)
+++
openejb/trunk/arquillian-tomee/arquillian-tomee-remote/src/test/java/org/apache/openejb/arquillian/TomEEContainerTest.java
Wed Oct 26 23:08:05 2011
@@ -20,6 +20,8 @@ import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
 import java.net.URL;

+import javax.ejb.EJB;
+
 import junit.framework.Assert;

 import org.jboss.arquillian.container.test.api.Deployment;
@@ -35,15 +37,21 @@ import org.junit.runner.RunWith;
 @RunWith(Arquillian.class)
 public class TomEEContainerTest {

-    @Deployment(testable = false)
+    @Deployment
    public static WebArchive createDeployment() {
-        return ShrinkWrap.create(WebArchive.class,
"test.war").addClass(TestServlet.class).addClass(TestEjb.class)
+        return ShrinkWrap.create(WebArchive.class,
"test.war").addClass(TestServlet.class).addClass(TestEjb.class).addClass(TomEEContainerTest.class)
                .setWebXML(new
StringAsset(Descriptors.create(WebAppDescriptor.class).version("3.0").servlet(TestServlet.class,
"/Test").exportAsString()));
    }

-    @Test
-    public void nothing(){}
+    @EJB
+    private TestEjb ejb;
+
+    @Test
+    public void testEjbIsNotNull() throws Exception {
+       Assert.assertNotNull(ejb);
+    }

+    @Test
    public void testShouldBeAbleToAccessServletAndEjb() throws Exception {
        InputStream is = new URL("http://localhost:9080/test/Test
").openStream();
        ByteArrayOutputStream os = new ByteArrayOutputStream();

Modified: openejb/trunk/arquillian-tomee/pom.xml
URL:
http://svn.apache.org/viewvc/openejb/trunk/arquillian-tomee/pom.xml?rev=1189526&r1=1189525&r2=1189526&view=diff
==============================================================================
--- openejb/trunk/arquillian-tomee/pom.xml (original)
+++ openejb/trunk/arquillian-tomee/pom.xml Wed Oct 26 23:08:05 2011
@@ -49,7 +49,7 @@

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <version.arquillian>1.0.0.CR1</version.arquillian>
+    <version.arquillian>1.0.0.CR4</version.arquillian>
    <version.cdi-api>1.0</version.cdi-api>
    <version.openejb>4.0.0-beta-2-SNAPSHOT</version.openejb>
    <version.org.apache.tomcat>7.0.21</version.org.apache.tomcat>

Reply via email to