You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomee.apache.org by Jonathan Gallimore <jo...@gmail.com> on 2011/10/27 08:23:50 UTC
Re: Fwd: 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/
ar
Hmm. I'll check that again... something wasn't working right for me.
On Oct 27, 2011 5:30 AM, "Romain Manni-Bucau" <rm...@gmail.com> wrote:
> Hi,
>
> Why beanmanager stuff is not enough?
>
> - Romain
>
> ---------- Message transféré ----------
> De : <jg...@apache.org>
> 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...
> À : <co...@openejb.apache.org>
>
> 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:andrew.rubinger@jboss.org">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:aslak@conduct.no">Aslak Knutsen</a>
> + * @author <a href="mailto:andrew.rubinger@jboss.org">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>
>