You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomee.apache.org by Jonathan Gallimore <jo...@gmail.com> on 2011/10/27 08:23:50 UTC

Re: Fwd: 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/ ar

Hmm. I'll check that again... something wasn't working right for me.
On Oct 27, 2011 5:30 AM, "Romain Manni-Bucau" <rm...@gmail.com> wrote:

> Hi,
>
> Why beanmanager stuff is not enough?
>
> - Romain
>
> ---------- Message transféré ----------
> De : <jg...@apache.org>
> 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...
> À : <co...@openejb.apache.org>
>
> 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:andrew.rubinger@jboss.org">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:aslak@conduct.no">Aslak Knutsen</a>
> +    * @author <a href="mailto:andrew.rubinger@jboss.org">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>
>