Skip to content

Commit

Permalink
Support primitive/boxed type equality
Browse files Browse the repository at this point in the history
git-svn-id: http://anonsvn.jboss.org/repos/weld/ri/trunk@266 1c488680-804c-0410-94cd-c6b725194a0e
  • Loading branch information
pmuir committed Nov 6, 2008
1 parent a7a91a9 commit b3e2017
Show file tree
Hide file tree
Showing 13 changed files with 186 additions and 24 deletions.
Expand Up @@ -10,6 +10,7 @@
import java.util.SortedSet;
import java.util.TreeSet;

import javax.webbeans.NullableDependencyException;
import javax.webbeans.manager.Bean;

import org.jboss.webbeans.injectable.Injectable;
Expand Down Expand Up @@ -69,7 +70,18 @@ public void addInjectionPoint(Injectable<?, ?> injectable)

private void registerInjectionPoint(Injectable<?, ?> injectable)
{
resolvedInjectionPoints.put(injectable, retainHighestPrecedenceBeans(injectable.getMatchingBeans(manager.getBeans(), manager.getModelManager()), manager.getEnabledDeploymentTypes()));
Set<Bean<?>> beans = retainHighestPrecedenceBeans(injectable.getMatchingBeans(manager.getBeans(), manager.getModelManager()), manager.getEnabledDeploymentTypes());
if (injectable.getType().isPrimitive())
{
for (Bean<?> bean : beans)
{
if (bean.isNullable())
{
throw new NullableDependencyException("Primitive injection points resolves to nullable web bean");
}
}
}
resolvedInjectionPoints.put(injectable, beans);
}

public void clear()
Expand Down
Expand Up @@ -13,6 +13,7 @@
import org.jboss.webbeans.exceptions.TypesafeResolutionLocation;
import org.jboss.webbeans.introspector.AnnotatedItem;
import org.jboss.webbeans.util.Reflections;
import org.jboss.webbeans.util.Types;

public abstract class AbstractAnnotatedItem<T, S> implements AnnotatedItem<T, S>
{
Expand Down Expand Up @@ -149,9 +150,7 @@ public boolean isAssignableFrom(Set<Class<?>> types)

private boolean isAssignableFrom(Class<?> type, Type[] actualTypeArguments)
{
//TODO: primitive types and wrapper types should be considered equal
//TODO: array types should be considered equal only if the element type matches
return getType().isAssignableFrom(type) && Arrays.equals(getActualTypeArguments(), actualTypeArguments);
return Types.boxedType(getType()).isAssignableFrom(Types.boxedType(type)) && Arrays.equals(getActualTypeArguments(), actualTypeArguments);
}

@Override
Expand Down
53 changes: 53 additions & 0 deletions webbeans-ri/src/main/java/org/jboss/webbeans/util/Types.java
@@ -0,0 +1,53 @@
package org.jboss.webbeans.util;

public class Types
{

public static Class<?> boxedType(Class<?> type)
{
if (type.isPrimitive())
{
if (type.equals(Boolean.TYPE))
{
return Boolean.class;
}
else if (type.equals(Character.TYPE))
{
return Character.class;
}
else if (type.equals(Byte.TYPE))
{
return Byte.class;
}
else if (type.equals(Short.TYPE))
{
return Short.class;
}
else if (type.equals(Integer.TYPE))
{
return Integer.class;
}
else if (type.equals(Long.TYPE))
{
return Long.class;
}
else if (type.equals(Float.TYPE))
{
return Float.class;
}
else if (type.equals(Double.TYPE))
{
return Double.class;
}
else
{
throw new IllegalStateException("Some weird type!!!");
}
}
else
{
return type;
}
}

}
@@ -1,14 +1,19 @@
package org.jboss.webbeans.test;

import static org.jboss.webbeans.test.util.Util.createProducerMethodBean;
import static org.jboss.webbeans.test.util.Util.createSimpleModel;
import static org.jboss.webbeans.test.util.Util.createSimpleWebBean;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

import javax.webbeans.AnnotationLiteral;
import javax.webbeans.Current;

import org.jboss.webbeans.bean.ProducerMethodBean;
import org.jboss.webbeans.bean.SimpleBean;
import org.jboss.webbeans.bindings.CurrentAnnotationLiteral;
import org.jboss.webbeans.introspector.AnnotatedClass;
import org.jboss.webbeans.introspector.impl.SimpleAnnotatedClass;
Expand All @@ -17,9 +22,14 @@
import org.jboss.webbeans.test.annotations.Asynchronous;
import org.jboss.webbeans.test.annotations.Synchronous;
import org.jboss.webbeans.test.beans.Antelope;
import org.jboss.webbeans.test.beans.Barn;
import org.jboss.webbeans.test.beans.Cat;
import org.jboss.webbeans.test.beans.Cod;
import org.jboss.webbeans.test.beans.DefangedTarantula;
import org.jboss.webbeans.test.beans.Order;
import org.jboss.webbeans.test.beans.Spider;
import org.jboss.webbeans.test.beans.SpiderProducer;
import org.jboss.webbeans.test.beans.Tarantula;
import org.jboss.webbeans.test.beans.Tuna;
import org.jboss.webbeans.test.bindings.AsynchronousAnnotationLiteral;
import org.jboss.webbeans.util.Reflections;
Expand All @@ -38,12 +48,6 @@ public void testDefaultBindingTypeDeclaredInJava()
order.getBindingTypes().iterator().next().annotationType().equals(Current.class);
}

@Test(groups={"injection", "producerMethod"}) @SpecAssertion(section="2.3.1")
public void testDefaultBindingTypeAssumedAtInjectionPoint() throws Exception
{
assert false;
}

@Test(groups="annotationDefinition") @SpecAssertion(section="2.3.2")
public void testBindingTypeHasCorrectTarget()
{
Expand Down Expand Up @@ -124,9 +128,15 @@ public void testDefaultBindingTypeDeclaredInXml()


@Test(groups={"injection", "producerMethod"}) @SpecAssertion(section="2.3.5")
public void testFieldInjectedFromProducerMethod()
public void testFieldInjectedFromProducerMethod() throws Exception
{
assert false;
SimpleBean<SpiderProducer> spiderProducer = createSimpleWebBean(SpiderProducer.class, manager);
manager.addBean(spiderProducer);
Method method = SpiderProducer.class.getMethod("produceTameTarantula");
manager.addBean(createProducerMethodBean(Tarantula.class, method, manager, spiderProducer));
Barn barn = createSimpleWebBean(Barn.class, manager).create();
assert barn.petSpider != null;
assert barn.petSpider instanceof DefangedTarantula;
}

@Test(groups={"injection", "webbeansxml"}) @SpecAssertion(section="2.3.5")
Expand All @@ -142,9 +152,17 @@ public void testFieldWithBindingTypeInXmlIgnoresAnnotations()
}

@Test(groups={"injection", "producerMethod"})
public void testMethodWithBindingAnnotationsOnParametersAreInjected()
{
assert false;
public void testMethodWithBindingAnnotationsOnParametersAreInjected() throws Exception
{
SimpleBean<SpiderProducer> spiderProducer = createSimpleWebBean(SpiderProducer.class, manager);
manager.addBean(spiderProducer);
Method method = SpiderProducer.class.getMethod("produceTameTarantula");
manager.addBean(createProducerMethodBean(Tarantula.class, method, manager, spiderProducer));
method = SpiderProducer.class.getMethod("produceSpiderFromInjection", Tarantula.class);
ProducerMethodBean<Spider> spiderBean = createProducerMethodBean(Spider.class, method, manager, spiderProducer);
Spider spider = spiderBean.create();
assert spider != null;
assert spider instanceof DefangedTarantula;
}

@Test(groups={"injection", "webbeansxml"}) @SpecAssertion(section="2.3.6")
Expand Down
@@ -1,12 +1,20 @@
package org.jboss.webbeans.test;

import static org.jboss.webbeans.test.util.Util.createProducerMethodBean;
import static org.jboss.webbeans.test.util.Util.createSimpleModel;
import static org.jboss.webbeans.test.util.Util.createSimpleWebBean;

import java.lang.reflect.Method;

import javax.webbeans.Production;
import javax.webbeans.RequestScoped;
import javax.webbeans.manager.Bean;

import org.jboss.webbeans.bean.SimpleBean;
import org.jboss.webbeans.model.bean.BeanModel;
import org.jboss.webbeans.test.beans.RedSnapper;
import org.jboss.webbeans.test.beans.Spider;
import org.jboss.webbeans.test.beans.SpiderProducer;
import org.testng.annotations.Test;

/**
Expand Down Expand Up @@ -49,9 +57,16 @@ public void testHasDeploymentType()
}

@Test(groups="producerMethod") @SpecAssertion(section="4.2")
public void testIsNullable()
public void testIsNullable() throws Exception
{
assert false;
SimpleBean<SpiderProducer> spiderProducerBean = createSimpleWebBean(SpiderProducer.class, manager);
manager.addBean(spiderProducerBean);
Method method = SpiderProducer.class.getMethod("getWolfSpiderSize");
Bean<Integer> bean = createProducerMethodBean(int.class, method, manager);
assert !bean.isNullable();
method = SpiderProducer.class.getMethod("makeASpider");
Bean<Spider> spiderBean = createProducerMethodBean(Spider.class, method, manager);
assert spiderBean.isNullable();
}

}
@@ -1,6 +1,7 @@
package org.jboss.webbeans.test;


import static org.jboss.webbeans.test.util.Util.createProducerMethodBean;
import static org.jboss.webbeans.test.util.Util.createSimpleWebBean;

import javax.webbeans.ContextNotActiveException;
Expand All @@ -15,6 +16,8 @@
import org.jboss.webbeans.test.beans.Tuna;
import org.jboss.webbeans.test.beans.broken.BeanWithFinalBoundField;
import org.jboss.webbeans.test.beans.broken.BeanWithStaticBoundField;
import org.jboss.webbeans.test.beans.broken.FarmHouse;
import org.jboss.webbeans.test.beans.broken.FarmHouseProducer;
import org.testng.annotations.Test;

@SpecVersion("PDR")
Expand All @@ -40,15 +43,17 @@ public void testInjectionPerformsUnboxingIfNecessary()
}

@Test(groups={"injection", "producerMethod"}, expectedExceptions=NullableDependencyException.class) @SpecAssertion(section="4.2")
public void testPrimitiveInjectionPointResolvesToNullableWebBean()
public void testPrimitiveInjectionPointResolvesToNullableWebBean() throws Exception
{
assert false;
Bean<FarmHouse> farmHouseBean = createSimpleWebBean(FarmHouse.class, manager);
manager.addBean(createProducerMethodBean(Integer.class, FarmHouseProducer.class.getMethod("getNumberOfBedrooms"), manager));
FarmHouse farmHouse = farmHouseBean.create();
}

@Test(groups={"injection", "clientProxy"}, expectedExceptions=ContextNotActiveException.class) @SpecAssertion(section="4.3")
public void testInvokeNormalInjectedWebBeanWhenContextNotActive()
{

}

@Test(groups="injection") @SpecAssertion(section="4.3")
Expand Down
Expand Up @@ -89,7 +89,7 @@ public void testBeanDeclaresMultipleProducerMethods()
assert false;
}

@Test(groups="producerMethod") @SpecAssertion(section="3.4")
@Test(groups="producerMethod") @SpecAssertion(section={"3.4", "2.3.1"})
public void testDefaultBindingType() throws Exception
{
SimpleBeanModel<SpiderProducer> model = createSimpleModel(SpiderProducer.class, manager);
Expand Down
@@ -1,7 +1,9 @@
package org.jboss.webbeans.test;

import static org.jboss.webbeans.test.util.Util.createProducerMethodBean;
import static org.jboss.webbeans.test.util.Util.createSimpleWebBean;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
Expand All @@ -13,6 +15,7 @@
import javax.webbeans.manager.Bean;

import org.jboss.webbeans.ResolutionManager;
import org.jboss.webbeans.bean.SimpleBean;
import org.jboss.webbeans.bindings.CurrentAnnotationLiteral;
import org.jboss.webbeans.injectable.InjectableField;
import org.jboss.webbeans.test.annotations.Expensive;
Expand All @@ -31,6 +34,8 @@
import org.jboss.webbeans.test.beans.ScottishFishFarmer;
import org.jboss.webbeans.test.beans.SeaBass;
import org.jboss.webbeans.test.beans.Sole;
import org.jboss.webbeans.test.beans.Spider;
import org.jboss.webbeans.test.beans.SpiderProducer;
import org.jboss.webbeans.test.beans.Tuna;
import org.jboss.webbeans.test.bindings.AnotherDeploymentTypeAnnotationLiteral;
import org.jboss.webbeans.test.bindings.BindingTypeWithBindingAnnotationMemberAnnotationLiteral;
Expand Down Expand Up @@ -206,9 +211,18 @@ public void testResolveByTypeWithTypeParameter() throws Exception
}

@Test(groups={"resolution", "producerMethod"}) @SpecAssertion(section="4.9.2")
public void testResolveByTypeWithArray()
public void testResolveByTypeWithArray() throws Exception
{
assert false;
SimpleBean<SpiderProducer> spiderProducerBean = createSimpleWebBean(SpiderProducer.class, manager);
manager.addBean(spiderProducerBean);
Method method = SpiderProducer.class.getMethod("getSpiders");
Bean<Spider[]> spidersModel = createProducerMethodBean(Spider[].class, method, manager);
manager.addBean(spidersModel);
method = SpiderProducer.class.getMethod("getStrings");
Bean<String[]> stringModel = createProducerMethodBean(String[].class, method, manager);
manager.addBean(stringModel);

assert manager.resolveByType(Spider[].class).size() == 1;
}

@Test @SpecAssertion(section="4.9.2")
Expand Down
@@ -1,5 +1,6 @@
package org.jboss.webbeans.test.annotations;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.TYPE;
Expand All @@ -11,7 +12,7 @@

import javax.webbeans.BindingType;

@Target( { TYPE, METHOD, PARAMETER })
@Target( { TYPE, METHOD, PARAMETER, FIELD })
@Retention(RUNTIME)
@Documented
@BindingType
Expand Down
11 changes: 11 additions & 0 deletions webbeans-ri/src/test/java/org/jboss/webbeans/test/beans/Barn.java
@@ -0,0 +1,11 @@
package org.jboss.webbeans.test.beans;

import org.jboss.webbeans.test.annotations.Tame;

public class Barn
{

@Tame
public Tarantula petSpider;

}
Expand Up @@ -70,6 +70,11 @@ public class SpiderProducer
return ALL_SPIDERS;
}

@Produces public String[] getStrings()
{
return new String[0];
}

@Produces public <T> FunnelWeaver<T> getFunnelWeaver()
{
return new FunnelWeaver<T>();
Expand All @@ -89,5 +94,10 @@ public class SpiderProducer
{
return null;
}

@Produces public Spider produceSpiderFromInjection(@Tame Tarantula tarantula)
{
return tarantula;
}

}
@@ -0,0 +1,11 @@
package org.jboss.webbeans.test.beans.broken;

import javax.webbeans.Current;

public class FarmHouse
{

@Current
public int noOfBedrooms;

}
@@ -0,0 +1,13 @@
package org.jboss.webbeans.test.beans.broken;

import javax.webbeans.Produces;

public class FarmHouseProducer
{

@Produces public Integer getNumberOfBedrooms()
{
return null;
}

}

0 comments on commit b3e2017

Please sign in to comment.