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