Skip to content

Commit

Permalink
WELD-507
Browse files Browse the repository at this point in the history
  • Loading branch information
pmuir committed Aug 18, 2010
1 parent 69eff52 commit 6a3a9cc
Show file tree
Hide file tree
Showing 12 changed files with 339 additions and 2 deletions.
4 changes: 2 additions & 2 deletions impl/src/main/java/org/jboss/weld/bootstrap/Validator.java
Expand Up @@ -473,7 +473,7 @@ public Set<Bean<?>> get()
private void validateEnabledInterceptorClasses(BeanManagerImpl beanManager)
{
Set<Class<?>> interceptorBeanClasses = new HashSet<Class<?>>();
for (Interceptor<?> interceptor : beanManager.getInterceptors())
for (Interceptor<?> interceptor : beanManager.getAccessibleInterceptors())
{
interceptorBeanClasses.add(interceptor.getBeanClass());
}
Expand All @@ -494,7 +494,7 @@ private void validateEnabledDecoratorClasses(BeanManagerImpl beanManager)
{
// TODO Move building this list to the boot or sth
Set<Class<?>> decoratorBeanClasses = new HashSet<Class<?>>();
for (Decorator<?> bean : beanManager.getDecorators())
for (Decorator<?> bean : beanManager.getAccessibleDecorators())
{
decoratorBeanClasses.add(bean.getBeanClass());
}
Expand Down
10 changes: 10 additions & 0 deletions impl/src/main/java/org/jboss/weld/manager/BeanManagerImpl.java
Expand Up @@ -547,6 +547,16 @@ public Iterable<Bean<?>> getAccessibleBeans()
{
return createDynamicAccessibleIterable(new BeanTransform(this));
}

public Iterable<Interceptor<?>> getAccessibleInterceptors()
{
return createDynamicAccessibleIterable(new InterceptorTransform());
}

public Iterable<Decorator<?>> getAccessibleDecorators()
{
return createDynamicAccessibleIterable(new DecoratorTransform());
}

public void addContext(Context context)
{
Expand Down
@@ -0,0 +1,17 @@
package org.jboss.weld.tests.unit.deployment.structure.nonTransitiveResolution;

import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import javax.interceptor.InterceptorBinding;

@InterceptorBinding
@Target({METHOD, TYPE})
@Retention(RUNTIME)
public @interface Basic {

}
@@ -0,0 +1,31 @@
package org.jboss.weld.tests.unit.deployment.structure.nonTransitiveResolution;

import javax.interceptor.AroundInvoke;
import javax.interceptor.Interceptor;
import javax.interceptor.InvocationContext;

@Interceptor
@Basic
public class BasicInterceptor
{

private static Object target;

public static Object getTarget()
{
return target;
}

public static void reset()
{
target = null;
}

@AroundInvoke
public Object classInterceptor(InvocationContext ctx) throws Exception
{
target = ctx.getTarget();
return ctx.proceed();
}

}
@@ -0,0 +1,17 @@
package org.jboss.weld.tests.unit.deployment.structure.nonTransitiveResolution;

import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import javax.inject.Qualifier;

@Qualifier
@Target({METHOD, TYPE})
@Retention(RUNTIME)
public @interface Baz {

}
@@ -0,0 +1,10 @@
package org.jboss.weld.tests.unit.deployment.structure.nonTransitiveResolution;

public interface Blah
{

public void ping(int i);

public int getI();

}
@@ -0,0 +1,20 @@
package org.jboss.weld.tests.unit.deployment.structure.nonTransitiveResolution;

import javax.decorator.Decorator;
import javax.decorator.Delegate;
import javax.enterprise.inject.Any;
import javax.inject.Inject;

@Decorator
public abstract class BlahDecorator implements Blah
{

@Inject @Delegate @Any
private Blah blah;

public void ping(int i)
{
blah.ping(i + 1);
}

}
@@ -0,0 +1,18 @@
package org.jboss.weld.tests.unit.deployment.structure.nonTransitiveResolution;

public class BlahImpl implements Blah
{

private int i;

public int getI()
{
return i;
}

public void ping(int i)
{
this.i = i;
}

}
@@ -0,0 +1,19 @@
package org.jboss.weld.tests.unit.deployment.structure.nonTransitiveResolution;

@Baz
public class BlahImpl2 implements Blah
{

private int i;

public int getI()
{
return i;
}

public void ping(int i)
{
this.i = i;
}

}
@@ -0,0 +1,19 @@
package org.jboss.weld.tests.unit.deployment.structure.nonTransitiveResolution;

@Basic
public class Complex
{

private String id;

public void ping(String id)
{
this.id = id;
}

public String getId()
{
return id;
}

}
@@ -0,0 +1,18 @@
package org.jboss.weld.tests.unit.deployment.structure.nonTransitiveResolution;

public class Simple
{

private String id;

public void ping(String id)
{
this.id = id;
}

public String getId()
{
return id;
}

}
Expand Up @@ -16,10 +16,22 @@
*/
package org.jboss.weld.tests.unit.deployment.structure.nonTransitiveResolution;

import static java.util.Arrays.asList;
import static java.util.Collections.emptyList;
import static org.jboss.weld.test.Utils.getReference;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import javax.enterprise.util.AnnotationLiteral;

import org.jboss.weld.bootstrap.spi.BeanDeploymentArchive;
import org.jboss.weld.bootstrap.spi.BeansXml;
import org.jboss.weld.bootstrap.spi.Deployment;
import org.jboss.weld.manager.BeanManagerImpl;
import org.jboss.weld.mock.AbstractMockDeployment;
Expand Down Expand Up @@ -152,5 +164,151 @@ public BeanDeploymentArchive loadBeanDeploymentArchive(Class<?> beanClass)
Assert.assertEquals(warBeanManager, bar.getBeanManager());
Assert.assertEquals(ejbJarBeanManager, bar.getFoo().getBeanManager());
}

/*
* WELD-507
*/
@Test
public void testInterceptorEnabledInWarButPackagedInEjbJar()
{

// Create the BDA in which we will deploy Foo. This is equivalent to a ejb
// jar
final MockBeanDeploymentArchive ejbJar = new MockBeanDeploymentArchive("ejb-jar", Basic.class, BasicInterceptor.class, Simple.class);

// Create the BDA in which we will deploy Bar. This is equivalent to a war
MockBeanDeploymentArchive war = new MockBeanDeploymentArchive("war", Complex.class);
war.setBeansXml(new BeansXml()
{

public List<String> getEnabledInterceptors()
{
return asList(BasicInterceptor.class.getName());
}

public List<String> getEnabledDecorators()
{
return emptyList();
}

public List<String> getEnabledAlternativeStereotypes()
{
return emptyList();
}

public List<String> getEnabledAlternativeClasses()
{
return emptyList();
}
});

// The war can access the ejb jar
war.getBeanDeploymentArchives().add(ejbJar);

// Create a deployment, any other classes are put into the ejb-jar (not
// relevant to test)
Deployment deployment = new AbstractMockDeployment(war, ejbJar)
{

public BeanDeploymentArchive loadBeanDeploymentArchive(Class<?> beanClass)
{
return ejbJar;
}

};

TestContainer container = new TestContainer(new MockServletLifecycle(deployment, war));
container.startContainer();
container.ensureRequestActive();

// Get the bean manager for war and ejb jar
BeanManagerImpl warBeanManager = container.getBeanManager();
BeanManagerImpl ejbJarBeanManager = container.getLifecycle().getBootstrap().getManager(ejbJar);


BasicInterceptor.reset();
Simple simple = getReference(ejbJarBeanManager, Simple.class);
simple.ping("14");
assertNull(BasicInterceptor.getTarget());

BasicInterceptor.reset();
Complex complex = getReference(warBeanManager, Complex.class);
complex.ping("14");
assertNotNull(BasicInterceptor.getTarget());
assertTrue(BasicInterceptor.getTarget() instanceof Complex);
assertEquals("14", ((Complex) BasicInterceptor.getTarget()).getId());
}

/*
* WELD-507
*/
@Test
public void testDecoratorEnabledInWarButPackagedInEjbJar()
{

// Create the BDA in which we will deploy Foo. This is equivalent to a ejb
// jar
final MockBeanDeploymentArchive ejbJar = new MockBeanDeploymentArchive("ejb-jar", Blah.class, BlahDecorator.class, BlahImpl.class);

// Create the BDA in which we will deploy Bar. This is equivalent to a war
MockBeanDeploymentArchive war = new MockBeanDeploymentArchive("war", BlahImpl2.class);
war.setBeansXml(new BeansXml()
{

public List<String> getEnabledInterceptors()
{
return emptyList();
}

public List<String> getEnabledDecorators()
{
return asList(BlahDecorator.class.getName());
}

public List<String> getEnabledAlternativeStereotypes()
{
return emptyList();
}

public List<String> getEnabledAlternativeClasses()
{
return emptyList();
}
});

// The war can access the ejb jar
war.getBeanDeploymentArchives().add(ejbJar);

// Create a deployment, any other classes are put into the ejb-jar (not
// relevant to test)
Deployment deployment = new AbstractMockDeployment(war, ejbJar)
{

public BeanDeploymentArchive loadBeanDeploymentArchive(Class<?> beanClass)
{
return ejbJar;
}

};

TestContainer container = new TestContainer(new MockServletLifecycle(deployment, war));
container.startContainer();
container.ensureRequestActive();

// Get the bean manager for war and ejb jar
BeanManagerImpl warBeanManager = container.getBeanManager();
BeanManagerImpl ejbJarBeanManager = container.getLifecycle().getBootstrap().getManager(ejbJar);


BasicInterceptor.reset();
Blah blah = getReference(ejbJarBeanManager, Blah.class);
blah.ping(10);
assertEquals(10, blah.getI());

BasicInterceptor.reset();
blah = getReference(warBeanManager, Blah.class, new AnnotationLiteral<Baz>() {});
blah.ping(10);
assertEquals(11, blah.getI());
}

}

0 comments on commit 6a3a9cc

Please sign in to comment.