Neither the arquillian-showcase-ejb example, nor my own test in the moviefun example for testing ejbs work with the embedded adapter as it stands either - the ejb isn't getting injected.
I'd be grateful if you could give it a try with the latest code. I'm afraid I don't understand your last point about @DeploymentScoped. Where does that need to go? Do I have to change the showcase code beyond referencing the adapters in the pom? I'm not sure I like that. There does seem to be an issue where the default ejbenricher with arquillian would work, except 1. it can't lookup Java:global. I've created an ear and confirmed I can't look it up from a servlet either, and 2. the global individual names it uses are slightly different to ours: Java:global/test.ear/test vs Java:global/test/test.jar. The first issue really doesn't seem right to me and I think we'll need to solve that. Jon On Oct 27, 2011 11:45 PM, "Romain Manni-Bucau" <[email protected]> wrote: > i don't get why it doesn't work since everything is in the same webapp? > > Note: the ejbenricher needs the context to use to lookup, it can be set > using @Inject @DeployementScoped private Instance<Context> context; then > context.set(new InitialContext()) (in the container) > > - Romain > > > 2011/10/27 Romain Manni-Bucau <[email protected]> > > > Weird, it seems to work in embedded case. > > > > Le 27 oct. 2011 13:29, "Jonathan Gallimore" < > [email protected]> > > a écrit : > > > > When I first saw your email, I did wonder whether the bean manager code > >> would be enough, and maybe I was just missing the ArchiveAppender stuff > to > >> get the Enricher over to the server side. I've retested with the EJB > >> lookup > >> commented out, and unfortunately, It didn't work without my change for > the > >> test case I was using (arquillian-showcase-ejb). > >> > >> Jon > >> > >> On Thu, Oct 27, 2011 at 5:29 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> > >> > > >> > > >
