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>
