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> >> > >> >
