Hmm. I'll check that again... something wasn't working right for me. On Oct 27, 2011 5:30 AM, "Romain Manni-Bucau" <[email protected]> wrote:
> 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> >
