Author: struberg
Date: Fri Jun 9 14:47:27 2017
New Revision: 1798230
URL: http://svn.apache.org/viewvc?rev=1798230&view=rev
Log:
OWB-1187 implement BeanConfigurator
Not able to finish it since the spec is ambiguous and the TCK is broken :/
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/WebBeansType.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/configurator/BeanConfiguratorImpl.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/discovery/AfterBeanDiscoveryImpl.java
openwebbeans/trunk/webbeans-tck/standalone-suite.xml
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/WebBeansType.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/WebBeansType.java?rev=1798230&r1=1798229&r2=1798230&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/WebBeansType.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/WebBeansType.java
Fri Jun 9 14:47:27 2017
@@ -49,7 +49,8 @@ package org.apache.webbeans.component;
*/
public enum WebBeansType
{
- MANAGED,
+ MANAGED,
+ CONFIGURED,
PRODUCERMETHOD,
PRODUCERFIELD,
RESOURCEBEAN,
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java?rev=1798230&r1=1798229&r2=1798230&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java
Fri Jun 9 14:47:27 2017
@@ -759,6 +759,7 @@ public class BeansDeployer
final AfterBeanDiscoveryImpl event = new
AfterBeanDiscoveryImpl(webBeansContext);
manager.fireLifecycleEvent(event);
+ event.deployConfiguredBeans();
webBeansContext.getWebBeansUtil().inspectDefinitionErrorStack(
"There are errors that are added by AfterBeanDiscovery event
observers. Look at logs for further details");
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/configurator/BeanConfiguratorImpl.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/configurator/BeanConfiguratorImpl.java?rev=1798230&r1=1798229&r2=1798230&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/configurator/BeanConfiguratorImpl.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/configurator/BeanConfiguratorImpl.java
Fri Jun 9 14:47:27 2017
@@ -18,205 +18,546 @@
*/
package org.apache.webbeans.configurator;
+import javax.enterprise.context.Dependent;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.Instance;
import javax.enterprise.inject.spi.AnnotatedType;
+import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanAttributes;
import javax.enterprise.inject.spi.InjectionPoint;
+import javax.enterprise.inject.spi.PassivationCapable;
+import javax.enterprise.inject.spi.Producer;
import javax.enterprise.inject.spi.configurator.BeanConfigurator;
import javax.enterprise.util.TypeLiteral;
import java.lang.annotation.Annotation;
+import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
+import java.util.HashSet;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.Function;
+import org.apache.webbeans.component.OwbBean;
+import org.apache.webbeans.component.WebBeansType;
+import org.apache.webbeans.component.creation.BeanAttributesBuilder;
+import org.apache.webbeans.config.WebBeansContext;
+import org.apache.webbeans.exception.WebBeansConfigurationException;
+import org.apache.webbeans.util.GenericsUtil;
+
+//X TODO finish. Impossible to implement right now as the spec is ambiguous
+//X TODO producer part
public class BeanConfiguratorImpl<T> implements BeanConfigurator<T>
{
+ private final WebBeansContext webBeansContext;
+
+ private Class<?> beanClass = null;
+ private String passivationId = null;
+ private Class<? extends Annotation> scope = Dependent.class;
+ private String name = null;
+ private boolean alternative;
+
+ private Set<Type> typeClosures = new HashSet<>();
+ private Set<InjectionPoint> injectionPoints = new HashSet<>();
+ private Set<Annotation> qualifiers = new HashSet<>();
+ private Set<Class<? extends Annotation>> stereotypes = new HashSet<>();
+
+ private Function<CreationalContext<?>, ?> createWithCallback;
+ private BiConsumer<T, CreationalContext<T>> destroyWithCallback;
+
+ private Function<Instance<Object>, ?> produceWithCallback;
+ private BiConsumer<T, Instance<Object>> disposeWithCallback;
+
+ public BeanConfiguratorImpl(WebBeansContext webBeansContext)
+ {
+ this.webBeansContext = webBeansContext;
+ }
@Override
public BeanConfigurator<T> beanClass(Class<?> beanClass)
{
- throw new UnsupportedOperationException("TODO implement CDI 2.0");
+ this.beanClass = beanClass;
+ return this;
}
@Override
public BeanConfigurator<T> addInjectionPoint(InjectionPoint injectionPoint)
{
- throw new UnsupportedOperationException("TODO implement CDI 2.0");
+ this.injectionPoints.add(injectionPoint);
+ return this;
}
@Override
public BeanConfigurator<T> addInjectionPoints(InjectionPoint...
injectionPoints)
{
- throw new UnsupportedOperationException("TODO implement CDI 2.0");
+ for (InjectionPoint injectionPoint : injectionPoints)
+ {
+ this.injectionPoints.add(injectionPoint);
+ }
+ return this;
}
@Override
public BeanConfigurator<T> addInjectionPoints(Set<InjectionPoint>
injectionPoints)
{
- throw new UnsupportedOperationException("TODO implement CDI 2.0");
+ this.injectionPoints.addAll(injectionPoints);
+ return this;
}
@Override
public BeanConfigurator<T> injectionPoints(InjectionPoint...
injectionPoints)
{
- throw new UnsupportedOperationException("TODO implement CDI 2.0");
+ this.injectionPoints.clear();
+ addInjectionPoints(injectionPoints);
+ return this;
}
@Override
public BeanConfigurator<T> injectionPoints(Set<InjectionPoint>
injectionPoints)
{
- throw new UnsupportedOperationException("TODO implement CDI 2.0");
+ this.injectionPoints.clear();
+ addInjectionPoints(injectionPoints);
+ return this;
}
@Override
public BeanConfigurator<T> id(String id)
{
- throw new UnsupportedOperationException("TODO implement CDI 2.0");
+ this.passivationId = id;
+ return this;
}
@Override
public <U extends T> BeanConfigurator<U>
createWith(Function<CreationalContext<U>, U> callback)
{
- throw new UnsupportedOperationException("TODO implement CDI 2.0");
+ this.createWithCallback = (Function) callback;
+ return (BeanConfigurator) this;
}
@Override
public <U extends T> BeanConfigurator<U>
produceWith(Function<Instance<Object>, U> callback)
{
- throw new UnsupportedOperationException("TODO implement CDI 2.0");
+ this.produceWithCallback = callback;
+ return (BeanConfigurator) this;
}
@Override
public BeanConfigurator<T> destroyWith(BiConsumer<T, CreationalContext<T>>
callback)
{
- throw new UnsupportedOperationException("TODO implement CDI 2.0");
+ this.destroyWithCallback = callback;
+ return this;
}
@Override
public BeanConfigurator<T> disposeWith(BiConsumer<T, Instance<Object>>
callback)
{
- throw new UnsupportedOperationException("TODO implement CDI 2.0");
+ this.disposeWithCallback = callback;
+ return this;
}
@Override
public <U extends T> BeanConfigurator<U> read(AnnotatedType<U> type)
{
- throw new UnsupportedOperationException("TODO implement CDI 2.0");
+
read(BeanAttributesBuilder.forContext(webBeansContext).newBeanAttibutes(type).build());
+ return (BeanConfigurator<U>) this;
}
@Override
public BeanConfigurator<T> read(BeanAttributes<?> beanAttributes)
{
- throw new UnsupportedOperationException("TODO implement CDI 2.0");
+ this.stereotypes.addAll(beanAttributes.getStereotypes());
+ this.scope = beanAttributes.getScope();
+ this.name = beanAttributes.getName();
+ this.alternative = beanAttributes.isAlternative();
+ types(beanAttributes.getTypes());
+ qualifiers(beanAttributes.getQualifiers());
+ stereotypes(beanAttributes.getStereotypes());
+
+ return this;
}
@Override
public BeanConfigurator<T> addType(Type type)
{
- throw new UnsupportedOperationException("TODO implement CDI 2.0");
+ this.typeClosures.add(type);
+ return this;
}
@Override
public BeanConfigurator<T> addType(TypeLiteral<?> typeLiteral)
{
- throw new UnsupportedOperationException("TODO implement CDI 2.0");
+ this.typeClosures.add(typeLiteral.getType());
+ return this;
}
@Override
public BeanConfigurator<T> addTypes(Type... types)
{
- throw new UnsupportedOperationException("TODO implement CDI 2.0");
+ for (Type type : types)
+ {
+ addType(type);
+ }
+ return this;
}
@Override
public BeanConfigurator<T> addTypes(Set<Type> types)
{
- throw new UnsupportedOperationException("TODO implement CDI 2.0");
+ for (Type type : types)
+ {
+ addType(type);
+
+ }
+ return this;
}
@Override
public BeanConfigurator<T> addTransitiveTypeClosure(Type type)
{
- throw new UnsupportedOperationException("TODO implement CDI 2.0");
+ Set<Type> typeClosure = GenericsUtil.getTypeClosure(type, type);
+ addTypes(typeClosure);
+ return this;
}
@Override
public BeanConfigurator<T> types(Type... types)
{
- throw new UnsupportedOperationException("TODO implement CDI 2.0");
+ this.typeClosures.clear();
+ addTypes(types);
+ return this;
}
@Override
public BeanConfigurator<T> types(Set<Type> types)
{
- throw new UnsupportedOperationException("TODO implement CDI 2.0");
+ this.typeClosures.clear();
+ addTypes(types);
+ return this;
}
@Override
public BeanConfigurator<T> scope(Class<? extends Annotation> scope)
{
- throw new UnsupportedOperationException("TODO implement CDI 2.0");
+ this.scope = scope;
+ return this;
}
@Override
public BeanConfigurator<T> addQualifier(Annotation qualifier)
{
- throw new UnsupportedOperationException("TODO implement CDI 2.0");
+ this.qualifiers.add(qualifier);
+ return this;
}
@Override
public BeanConfigurator<T> addQualifiers(Annotation... qualifiers)
{
- throw new UnsupportedOperationException("TODO implement CDI 2.0");
+ for (Annotation qualifier : qualifiers)
+ {
+ this.qualifiers.add(qualifier);
+ }
+ return this;
}
@Override
public BeanConfigurator<T> addQualifiers(Set<Annotation> qualifiers)
{
- throw new UnsupportedOperationException("TODO implement CDI 2.0");
+ this.qualifiers.addAll(qualifiers);
+ return this;
}
@Override
public BeanConfigurator<T> qualifiers(Annotation... qualifiers)
{
- throw new UnsupportedOperationException("TODO implement CDI 2.0");
+ this.qualifiers.clear();
+ addQualifiers(qualifiers);
+ return this;
}
@Override
public BeanConfigurator<T> qualifiers(Set<Annotation> qualifiers)
{
- throw new UnsupportedOperationException("TODO implement CDI 2.0");
+ this.qualifiers.clear();
+ addQualifiers(qualifiers);
+ return this;
}
@Override
public BeanConfigurator<T> addStereotype(Class<? extends Annotation>
stereotype)
{
- throw new UnsupportedOperationException("TODO implement CDI 2.0");
+ this.stereotypes.add(stereotype);
+ return this;
}
@Override
public BeanConfigurator<T> addStereotypes(Set<Class<? extends Annotation>>
stereotypes)
{
- throw new UnsupportedOperationException("TODO implement CDI 2.0");
+ for (Class<? extends Annotation> stereotype : stereotypes)
+ {
+ this.stereotypes.add(stereotype);
+ }
+ return this;
}
@Override
public BeanConfigurator<T> stereotypes(Set<Class<? extends Annotation>>
stereotypes)
{
- throw new UnsupportedOperationException("TODO implement CDI 2.0");
+ this.stereotypes.clear();
+ addStereotypes(stereotypes);
+ return this;
}
@Override
public BeanConfigurator<T> name(String name)
{
- throw new UnsupportedOperationException("TODO implement CDI 2.0");
+ this.name = name;
+ return this;
}
@Override
- public BeanConfigurator<T> alternative(boolean value)
+ public BeanConfigurator<T> alternative(boolean alternative)
{
- throw new UnsupportedOperationException("TODO implement CDI 2.0");
+ this.alternative = alternative;
+ return this;
+ }
+
+ public Bean<?> getBean()
+ {
+ return new ConstructedBean();
+ }
+
+ /**
+ * 1:1 with the BeanConfigurator.
+ */
+ public class ConstructedBean implements OwbBean<T>, PassivationCapable
+ {
+ private final Class<T> returnType;
+ private final boolean dependent;
+ private boolean specialized = false;
+ private boolean enabled = true;
+
+ public ConstructedBean()
+ {
+ this.returnType = null; //X TODO calculate return type from the
typeClosures
+
+ dependent =
!webBeansContext.getBeanManagerImpl().isNormalScope(scope);
+
+ if (createWithCallback == null && produceWithCallback == null)
+ {
+ WebBeansConfigurationException e = new
WebBeansConfigurationException("Either a createCallback or a produceCallback
must be set " + toString());
+
webBeansContext.getBeanManagerImpl().getErrorStack().pushError(e);
+ }
+ if (createWithCallback != null && produceWithCallback != null)
+ {
+ WebBeansConfigurationException e = new
WebBeansConfigurationException("Only exactly one of createCallback and
produceCallback must be set " + toString());
+
webBeansContext.getBeanManagerImpl().getErrorStack().pushError(e);
+ }
+ }
+
+ @Override
+ public Set<Type> getTypes()
+ {
+ return typeClosures;
+ }
+
+ @Override
+ public Set<InjectionPoint> getInjectionPoints()
+ {
+ return injectionPoints;
+ }
+
+ @Override
+ public Set<Annotation> getQualifiers()
+ {
+ return qualifiers;
+ }
+
+ @Override
+ public Producer<T> getProducer()
+ {
+ //X TODO
+ return null;
+ }
+
+ @Override
+ public Class<?> getBeanClass()
+ {
+ return beanClass;
+ }
+
+ @Override
+ public Class<? extends Annotation> getScope()
+ {
+ return scope;
+ }
+
+ @Override
+ public WebBeansType getWebBeansType()
+ {
+ return WebBeansType.CONFIGURED;
+ }
+
+ @Override
+ public String getName()
+ {
+ return name;
+ }
+
+ @Override
+ public Class<T> getReturnType()
+ {
+ return (Class<T>) beanClass;
+ }
+
+ @Override
+ public T create(CreationalContext<T> context)
+ {
+ return (T) createWithCallback.apply(context);
+ }
+
+ @Override
+ public Set<Class<? extends Annotation>> getStereotypes()
+ {
+ return stereotypes;
+ }
+
+ @Override
+ public void setSpecializedBean(boolean specialized)
+ {
+ this.specialized = specialized;
+ }
+
+ @Override
+ public boolean isAlternative()
+ {
+ return alternative;
+ }
+
+ @Override
+ public boolean isNullable()
+ {
+ return false;
+ }
+
+ @Override
+ public void destroy(T instance, CreationalContext<T> context)
+ {
+ destroyWithCallback.accept(instance, context);
+ }
+
+ @Override
+ public boolean isSpecializedBean()
+ {
+ return specialized;
+ }
+
+ @Override
+ public void setEnabled(boolean enabled)
+ {
+ this.enabled = enabled;
+ }
+
+ @Override
+ public boolean isEnabled()
+ {
+ return enabled;
+ }
+
+ @Override
+ public String getId()
+ {
+ return passivationId;
+ }
+
+ @Override
+ public boolean isPassivationCapable()
+ {
+ return passivationId != null;
+ }
+
+ @Override
+ public boolean isDependent()
+ {
+ return dependent;
+ }
+
+ @Override
+ public WebBeansContext getWebBeansContext()
+ {
+ return webBeansContext;
+ }
+
+ public String toString()
+ {
+ StringBuilder builder = new StringBuilder();
+ final String simpleName = getReturnType().getSimpleName();
+ builder.append(simpleName);
+ builder.append(",
WebBeansType:").append(getWebBeansType()).append(", Name:").append(getName());
+ builder.append(", API Types:[");
+
+ int size = getTypes().size();
+ int index = 1;
+ for(Type clazz : getTypes())
+ {
+ if(clazz instanceof Class)
+ {
+ builder.append(((Class<?>)clazz).getName());
+ }
+ else
+ {
+ ParameterizedType parameterizedType = (ParameterizedType)
clazz;
+ Class<?> rawType = (Class<?>)
parameterizedType.getRawType();
+ builder.append(rawType.getName());
+ builder.append("<");
+ Type[] actualTypeArguments =
parameterizedType.getActualTypeArguments();
+ if (actualTypeArguments.length > 0)
+ {
+ for (Type actualType : actualTypeArguments)
+ {
+ if (Class.class.isInstance(actualType))
+ {
+
builder.append(Class.class.cast(actualType).getName().replace("java.lang.",
""));
+ }
+ else
+ {
+ builder.append(actualType);
+ }
+ builder.append(",");
+ }
+ }
+ builder.delete(builder.length() - 1, builder.length());
+ builder.append(">");
+
+ }
+
+ if(index < size)
+ {
+ builder.append(",");
+ }
+
+ index++;
+ }
+
+ builder.append("], ");
+ builder.append("Qualifiers:[");
+
+ size = getQualifiers().size();
+ index = 1;
+ for(Annotation ann : getQualifiers())
+ {
+ builder.append(ann.annotationType().getName());
+
+ if(index < size)
+ {
+ builder.append(",");
+ }
+
+ index++;
+ }
+
+ builder.append("]");
+
+ return builder.toString();
+
+ }
}
}
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/discovery/AfterBeanDiscoveryImpl.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/discovery/AfterBeanDiscoveryImpl.java?rev=1798230&r1=1798229&r2=1798230&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/discovery/AfterBeanDiscoveryImpl.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/discovery/AfterBeanDiscoveryImpl.java
Fri Jun 9 14:47:27 2017
@@ -35,6 +35,7 @@ import javax.enterprise.inject.spi.confi
import org.apache.webbeans.component.ManagedBean;
import org.apache.webbeans.config.OWBLogConst;
import org.apache.webbeans.config.WebBeansContext;
+import org.apache.webbeans.configurator.BeanConfiguratorImpl;
import org.apache.webbeans.container.BeanManagerImpl;
import org.apache.webbeans.exception.WebBeansConfigurationException;
import org.apache.webbeans.intercept.InterceptorsManager;
@@ -44,6 +45,8 @@ import org.apache.webbeans.portable.even
import
org.apache.webbeans.portable.events.generics.GProcessSyntheticObserverMethod;
import org.apache.webbeans.util.AnnotationUtil;
+import java.util.HashSet;
+import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -59,6 +62,7 @@ public class AfterBeanDiscoveryImpl exte
private static final Logger logger =
WebBeansLoggerFacade.getLogger(AfterBeanDiscoveryImpl.class);
private final WebBeansContext webBeansContext;
+ private Set<BeanConfiguratorImpl<?>> beanConfigurators = new HashSet<>();
private Extension extension;
@@ -232,12 +236,14 @@ public class AfterBeanDiscoveryImpl exte
return beanManager.getAnnotatedTypes(type);
}
- //X TODO OWB-1182 CDI 2.0
@Override
public <T> BeanConfigurator<T> addBean()
{
checkState();
- throw new UnsupportedOperationException("CDI 2.0 not yet imlemented");
+ BeanConfiguratorImpl<T> beanConfigurator = new
BeanConfiguratorImpl<>(webBeansContext);
+ beanConfigurators.add(beanConfigurator);
+
+ return beanConfigurator;
}
//X TODO OWB-1182 CDI 2.0
@@ -248,4 +254,8 @@ public class AfterBeanDiscoveryImpl exte
throw new UnsupportedOperationException("CDI 2.0 not yet imlemented");
}
+ public void deployConfiguredBeans()
+ {
+ beanConfigurators.forEach(bc -> addBean(bc.getBean()));
+ }
}
Modified: openwebbeans/trunk/webbeans-tck/standalone-suite.xml
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-tck/standalone-suite.xml?rev=1798230&r1=1798229&r2=1798230&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-tck/standalone-suite.xml (original)
+++ openwebbeans/trunk/webbeans-tck/standalone-suite.xml Fri Jun 9 14:47:27
2017
@@ -121,6 +121,17 @@
<methods><exclude
name="testAsyncObserversCalledInDifferentThread"/></methods>
</class>
+ <!-- https://issues.jboss.org/browse/CDITCK-588 equals on
AnnotatedType -->
+ <!-- https://issues.jboss.org/browse/CDITCK-589 because the ct
predicate ends up randomly removing from the wrong ct -->
+ <class
name="org.jboss.cdi.tck.tests.extensions.configurators.annotatedTypeConfigurator.AnnotatedTypeConfiguratorTest">
+ <methods><exclude name=".*"/></methods>
+ </class>
+
+ <!-- https://issues.jboss.org/browse/CDITCK-573 should be solved
with tck 2.0.1.Final -->
+ <class
name="org.jboss.cdi.tck.tests.extensions.configurators.bean.BeanConfiguratorTest">
+ <methods><exclude name=".*"/></methods>
+ </class>
+
<!--
Tests broken in the CDI-1.2 TCK: