i looked testenricher implementation from jboss and...the cdi one is almost the same than mine so i guess mine is useless
i made the ejb injection for the embedded case working. i think it is just a bit more complicated for the remote case but almost the same philosophy. you can have a look, i added a test case to make it work. - Romain 2011/10/28 Jonathan Gallimore <[email protected]> > 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> > > >> > > > >> > > > > > >
