Author: rmannibucau
Date: Mon May 13 08:25:40 2013
New Revision: 1481729
URL: http://svn.apache.org/r1481729
Log:
OWB-861 better decorator inheritance/generic handling
Added:
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/tests/DecoratorInheritanceTest.java
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/DecoratorBeanBuilder.java
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/DecoratorBeanBuilder.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/DecoratorBeanBuilder.java?rev=1481729&r1=1481728&r2=1481729&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/DecoratorBeanBuilder.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/DecoratorBeanBuilder.java
Mon May 13 08:25:40 2013
@@ -165,35 +165,46 @@ public class DecoratorBeanBuilder<T>
private void defineDecoratedTypes()
{
- Class<T> beanClass = annotatedType.getJavaClass();
+ // remove them first to avoid to loop over them
+ decoratedTypes.remove(Object.class);
+ decoratedTypes.remove(java.io.Serializable.class); /* 8.1 */
- // determine a safe Type for for a later BeanManager.getReference(...)
- if (ClassUtil.isDefinitionContainsTypeVariables(beanClass))
+ Type beanClass = annotatedType.getJavaClass();
+ do
{
- OwbParametrizedTypeImpl pt = new
OwbParametrizedTypeImpl(beanClass.getDeclaringClass(),beanClass);
- TypeVariable<?>[] tvs = beanClass.getTypeParameters();
- for(TypeVariable<?> tv : tvs)
+ final Class<?> clazz = ClassUtil.getClass(beanClass);
+ final Type toRemove;
+ if (ClassUtil.isDefinitionContainsTypeVariables(beanClass))
+ {
+ final OwbParametrizedTypeImpl pt = new
OwbParametrizedTypeImpl(clazz.getDeclaringClass(), clazz);
+ final TypeVariable<?>[] tvs = clazz.getTypeParameters();
+ for(TypeVariable<?> tv : tvs)
+ {
+ pt.addTypeArgument(tv);
+ }
+ toRemove = pt;
+ //X TODO generic support setDecoratorGenericType(pt);
+ }
+ else
{
- pt.addTypeArgument(tv);
+ toRemove = beanClass;
+ //X TODO generic support setDecoratorGenericType(beanClass);
}
- decoratedTypes.remove(pt);
- //X TODO generic support setDecoratorGenericType(pt);
- }
- else
- {
- decoratedTypes.remove(beanClass);
- //X TODO generic support setDecoratorGenericType(beanClass);
- }
- /* drop any non-interface bean types */
- Type superClass = beanClass.getGenericSuperclass();
- while (superClass != Object.class)
- {
- decoratedTypes.remove(superClass);
- superClass = superClass.getClass().getGenericSuperclass();
- }
- decoratedTypes.remove(Object.class);
- decoratedTypes.remove(java.io.Serializable.class); /* 8.1 */
+ final Iterator<Type> iterator = decoratedTypes.iterator();
+ while (iterator.hasNext())
+ {
+ final Type next = iterator.next();
+
+ // if raw class is the same and is assignable (generics
handling)
+ if (ClassUtil.getClass(next) == clazz &&
ClassUtil.isAssignable(toRemove, next))
+ {
+ iterator.remove();
+ }
+ }
+
+ beanClass = clazz.getGenericSuperclass();
+ } while (beanClass != Object.class);
for (Iterator<Type> i = decoratedTypes.iterator(); i.hasNext(); )
Added:
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/tests/DecoratorInheritanceTest.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/tests/DecoratorInheritanceTest.java?rev=1481729&view=auto
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/tests/DecoratorInheritanceTest.java
(added)
+++
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/decorators/tests/DecoratorInheritanceTest.java
Mon May 13 08:25:40 2013
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.webbeans.newtests.decorators.tests;
+
+import org.apache.webbeans.newtests.AbstractUnitTest;
+import org.junit.Test;
+
+import javax.decorator.Decorator;
+import javax.decorator.Delegate;
+import javax.inject.Inject;
+
+import static org.junit.Assert.assertEquals;
+
+// OWB-861
+public class DecoratorInheritanceTest extends AbstractUnitTest
+{
+ @Test
+ public void checkItWorks()
+ {
+ addDecorator(ServiceDecorator.class);
+ startContainer(BaseDecorator.class, BaseModuleDecorator.class,
ServiceDecorator.class, TheService.class);
+
+ assertEquals("the decorator", getInstance(TheService.class).name());
+ shutDownContainer();
+ }
+
+ @Test
+ public void checkItWorksWithGenerics()
+ {
+ addDecorator(GServiceDecorator.class);
+ startContainer(GBaseDecorator.class, GBaseModuleDecorator.class,
GServiceDecorator.class, TheService.class);
+
+ assertEquals("the decorator 1", getInstance(TheService.class).name());
+ shutDownContainer();
+ }
+
+ public static abstract class BaseDecorator implements AService
+ {
+
+ }
+
+ public static abstract class BaseModuleDecorator extends BaseDecorator
+ {
+
+ }
+
+ @Decorator
+ public static class ServiceDecorator extends BaseModuleDecorator
+ {
+ @Delegate
+ @Inject
+ private AService service;
+
+ @Override
+ public String name()
+ {
+ return service.name() + "decorator";
+ }
+ }
+
+ public static class TheService implements AService
+ {
+ @Override
+ public String name()
+ {
+ return "the ";
+ }
+ }
+
+ public static interface AService
+ {
+ String name();
+ }
+
+ public static abstract class GBaseDecorator<T> implements AService
+ {
+ abstract T generateT();
+ }
+
+ public static abstract class GBaseModuleDecorator<T> extends
GBaseDecorator<T>
+ {
+
+ }
+
+ @Decorator
+ public static class GServiceDecorator extends GBaseModuleDecorator<Integer>
+ {
+ @Delegate
+ @Inject
+ private AService service;
+
+ @Override
+ public String name()
+ {
+ return service.name() + "decorator " + generateT();
+ }
+
+ @Override
+ Integer generateT() {
+ return 1;
+ }
+ }
+}