Author: struberg
Date: Mon May 29 17:25:35 2017
New Revision: 1796668
URL: http://svn.apache.org/viewvc?rev=1796668&view=rev
Log:
OWB-1182 improve Instance handling
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/OpenWebBeansConfiguration.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/InjectableBeanManager.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/OwbCDI.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/instance/InstanceImpl.java
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/component/third/ThirdPartyExtension.java
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/instance/InstanceQualifierInjectionPointTest.java
openwebbeans/trunk/webbeans-tck/src/main/resources/META-INF/openwebbeans/openwebbeans.properties
openwebbeans/trunk/webbeans-tck/standalone-suite.xml
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/OpenWebBeansConfiguration.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/OpenWebBeansConfiguration.java?rev=1796668&r1=1796667&r2=1796668&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/OpenWebBeansConfiguration.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/OpenWebBeansConfiguration.java
Mon May 29 17:25:35 2017
@@ -77,6 +77,12 @@ public class OpenWebBeansConfiguration
*/
public static final String INTERCEPTOR_FORCE_NO_CHECKED_EXCEPTIONS =
"org.apache.webbeans.forceNoCheckedExceptions";
+ /**
+ * Enable that calls to various methods get strictly validated.
+ * Defaults to 'false' for more performance.
+ */
+ public static final String STRICT_DYNAMIC_VALIDATION =
"org.apache.webbeans.strictDynamicValidation";
+
/**Use EJB Discovery or not*/
public static final String USE_EJB_DISCOVERY =
"org.apache.webbeans.spi.deployer.useEjbMetaDataDiscoveryService";
@@ -375,6 +381,18 @@ public class OpenWebBeansConfiguration
return "true".equalsIgnoreCase(value);
}
+ /**
+ * Flag which indicates that programmatic invocations to vaious
BeanManager methods
+ * should get strictly validated.
+ * E.g. whether qualifier parameters are really qualifiers, etc.
+ * Default is {@code false}
+ */
+ public boolean strictDynamicValidation()
+ {
+ String value = getProperty(STRICT_DYNAMIC_VALIDATION);
+ return "true".equalsIgnoreCase(value);
+ }
+
public synchronized Set<String> getIgnoredInterfaces()
{
if (ignoredInterfaces == null)
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java?rev=1796668&r1=1796667&r2=1796668&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
Mon May 29 17:25:35 2017
@@ -56,6 +56,7 @@ import javax.naming.Reference;
import javax.naming.Referenceable;
import javax.naming.StringRefAddr;
+import org.apache.webbeans.annotation.DefaultLiteral;
import org.apache.webbeans.component.AbstractOwbBean;
import org.apache.webbeans.component.AbstractProducerBean;
import org.apache.webbeans.component.CdiInterceptorBean;
@@ -341,11 +342,10 @@ public class BeanManagerImpl implements
return found;
}
- //X TODO OWB-1182 CDI 2.0
@Override
public Instance<Object> createInstance()
{
- throw new UnsupportedOperationException("CDI 2.0 not yet implemented");
+ return OwbCDI.current().select(DefaultLiteral.INSTANCE);
}
/**
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/InjectableBeanManager.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/InjectableBeanManager.java?rev=1796668&r1=1796667&r2=1796668&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/InjectableBeanManager.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/InjectableBeanManager.java
Mon May 29 17:25:35 2017
@@ -139,11 +139,10 @@ public class InjectableBeanManager imple
return bm.getContext(scope);
}
- //X TODO OWB-1182 CDI 2.0
@Override
public Instance<Object> createInstance()
{
- throw new UnsupportedOperationException("CDI 2.0 not yet imlemented");
+ return bm.createInstance();
}
@Override
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/OwbCDI.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/OwbCDI.java?rev=1796668&r1=1796667&r2=1796668&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/OwbCDI.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/OwbCDI.java
Mon May 29 17:25:35 2017
@@ -18,6 +18,7 @@
*/
package org.apache.webbeans.container;
+import org.apache.webbeans.annotation.DefaultLiteral;
import org.apache.webbeans.component.InstanceBean;
import org.apache.webbeans.config.WebBeansContext;
import org.apache.webbeans.context.creational.CreationalContextImpl;
@@ -42,7 +43,7 @@ public class OwbCDI extends CDI<Object>
final WebBeansContext webBeansContext = getWebBeansContext();
final BeanManagerImpl bm = webBeansContext.getBeanManagerImpl();
final CreationalContextImpl<Instance<Object>> creationalContext =
bm.createCreationalContext(null);
- return new
InstanceBean<Object>(webBeansContext).create(creationalContext);
+ return new
InstanceBean<Object>(webBeansContext).create(creationalContext).select(DefaultLiteral.INSTANCE);
}
@Override
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/instance/InstanceImpl.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/instance/InstanceImpl.java?rev=1796668&r1=1796667&r2=1796668&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/instance/InstanceImpl.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/instance/InstanceImpl.java
Mon May 29 17:25:35 2017
@@ -37,16 +37,13 @@ import java.util.Set;
import javax.enterprise.context.spi.AlterableContext;
import javax.enterprise.context.spi.Context;
-import javax.enterprise.inject.Default;
import javax.enterprise.inject.Instance;
-import javax.enterprise.inject.New;
import javax.enterprise.inject.spi.Annotated;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.enterprise.util.TypeLiteral;
import javax.inject.Provider;
-import org.apache.webbeans.annotation.DefaultLiteral;
import org.apache.webbeans.config.WebBeansContext;
import org.apache.webbeans.container.BeanManagerImpl;
import org.apache.webbeans.container.InjectionResolver;
@@ -83,6 +80,8 @@ public class InstanceImpl<T> implements
private Map<Object, CreationalContextImpl<?>> creationalContexts;
private CreationalContextImpl<?> parentCreationalContext;
+ private boolean strictValidation;
+
/**
* Creates new instance.
*
@@ -90,20 +89,27 @@ public class InstanceImpl<T> implements
* @param injectionPoint null or injection point
* @param webBeansContext
* @param creationalContext will get used for creating @Dependent
beans
- * @param annotations qualifier annotations
+ * @param qualifiers qualifier annotations
*/
public InstanceImpl(Type injectionClazz, InjectionPoint injectionPoint,
WebBeansContext webBeansContext,
- CreationalContextImpl<?> creationalContext, Annotation...
annotations)
+ CreationalContextImpl<?> creationalContext, Annotation...
qualifiers)
{
this.injectionClazz = injectionClazz;
this.injectionPoint = injectionPoint;
parentCreationalContext = creationalContext;
- for (Annotation ann : annotations)
+ this.webBeansContext = webBeansContext;
+ strictValidation =
webBeansContext.getOpenWebBeansConfiguration().strictDynamicValidation();
+
+ if (strictValidation)
+ {
+
webBeansContext.getAnnotationManager().checkQualifierConditions(qualifiers);
+ }
+
+ for (Annotation ann : qualifiers)
{
qualifierAnnotations.add(ann);
}
- this.webBeansContext = webBeansContext;
}
/**
@@ -114,8 +120,6 @@ public class InstanceImpl<T> implements
@Override
public T get()
{
- Annotation[] anns = new Annotation[qualifierAnnotations.size()];
- anns = qualifierAnnotations.toArray(anns);
Set<Bean<?>> beans = resolveBeans();
@@ -123,6 +127,8 @@ public class InstanceImpl<T> implements
if (bean == null)
{
+ Annotation[] anns = new Annotation[qualifierAnnotations.size()];
+ anns = qualifierAnnotations.toArray(anns);
InjectionExceptionUtil.throwUnsatisfiedResolutionException(ClassUtil.getClazz(injectionClazz),
injectionPoint, anns);
}
@@ -180,66 +186,27 @@ public class InstanceImpl<T> implements
@Override
public Instance<T> select(Annotation... qualifiers)
{
- Annotation[] newQualifiersArray = getAdditionalQualifiers(qualifiers);
+ if (strictValidation)
+ {
+
webBeansContext.getAnnotationManager().checkQualifierConditions(qualifiers);
+ }
+
+ Annotation[] newQualifiersArray = qualifiers;
return new InstanceImpl<T>(
injectionClazz, injectionPoint == null ? null : new
InstanceInjectionPoint(injectionPoint, newQualifiersArray),
webBeansContext, parentCreationalContext, newQualifiersArray);
}
/**
- * Returns total qualifiers array
- *
- * @param qualifiers additional qualifiers
- * @return total qualifiers array
- */
- private Annotation[] getAdditionalQualifiers(Annotation[] qualifiers)
- {
-
webBeansContext.getAnnotationManager().checkQualifierConditions(qualifiers);
-
- Set<Annotation> newQualifiers = new
HashSet<Annotation>(qualifierAnnotations);
-
- final Set<Class<?>> types = new HashSet<>(newQualifiers.size() +
(qualifiers != null ? qualifiers.length : 0));
- for (final Annotation a : newQualifiers)
- {
- types.add(a.annotationType());
- }
-
- boolean addsDefault = false;
- if (qualifiers != null && qualifiers.length > 0)
- {
- for (int i = 0; i < qualifiers.length; i++)
- {
- newQualifiers.add(qualifiers[i]);
- final Class<? extends Annotation> type =
qualifiers[i].annotationType();
- if (type == Default.class)
- {
- addsDefault = true;
- }
- else if (!types.add(type))
- {
- throw new IllegalArgumentException("Duplicated qualifier "
+ qualifiers[i].annotationType());
- }
- }
- }
-
- if (!addsDefault && !types.contains(New.class)) // easy way to ensure
@New will not resolve, not yet perfect though
- {
- newQualifiers.remove(DefaultLiteral.INSTANCE);
- }
-
- Annotation[] newQualifiersArray = new Annotation[newQualifiers.size()];
- newQualifiersArray = newQualifiers.toArray(newQualifiersArray);
-
- return newQualifiersArray;
- }
-
- /**
* {@inheritDoc}
*/
@Override
public <U extends T> Instance<U> select(Class<U> subtype, Annotation...
qualifiers)
{
-
webBeansContext.getAnnotationManager().checkQualifierConditions(qualifiers);
+ if (strictValidation)
+ {
+
webBeansContext.getAnnotationManager().checkQualifierConditions(qualifiers);
+ }
Type sub = subtype;
@@ -248,9 +215,9 @@ public class InstanceImpl<T> implements
sub = injectionClazz;
}
- Annotation[] newQualifiers = getAdditionalQualifiers(qualifiers);
-
- return new InstanceImpl<U>(sub, injectionPoint, webBeansContext,
parentCreationalContext, newQualifiers);
+ //X Annotation[] newQualifiers = getAdditionalQualifiers(qualifiers);
+
+ return new InstanceImpl<U>(sub, injectionPoint, webBeansContext,
parentCreationalContext, qualifiers);
}
/**
Modified:
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/component/third/ThirdPartyExtension.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/component/third/ThirdPartyExtension.java?rev=1796668&r1=1796667&r2=1796668&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/component/third/ThirdPartyExtension.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/component/third/ThirdPartyExtension.java
Mon May 29 17:25:35 2017
@@ -27,9 +27,12 @@ import javax.enterprise.inject.spi.Exten
import javax.enterprise.inject.spi.InjectionPoint;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
+import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
+import org.apache.webbeans.annotation.DefaultLiteral;
+
import static java.util.Collections.emptySet;
public class ThirdPartyExtension implements Extension
@@ -50,7 +53,7 @@ public class ThirdPartyExtension impleme
@Override
public Set<Annotation> getQualifiers()
{
- return emptySet();
+ return new HashSet<>(Arrays.asList(DefaultLiteral.INSTANCE));
}
@Override
Modified:
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/instance/InstanceQualifierInjectionPointTest.java
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/instance/InstanceQualifierInjectionPointTest.java?rev=1796668&r1=1796667&r2=1796668&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/instance/InstanceQualifierInjectionPointTest.java
(original)
+++
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/instance/InstanceQualifierInjectionPointTest.java
Mon May 29 17:25:35 2017
@@ -18,11 +18,13 @@
*/
package org.apache.webbeans.test.instance;
+import org.apache.webbeans.annotation.AnyLiteral;
import org.apache.webbeans.test.AbstractUnitTest;
import org.junit.Test;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Any;
+import javax.enterprise.inject.Default;
import javax.enterprise.inject.Instance;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
@@ -48,7 +50,11 @@ public class InstanceQualifierInjectionP
@Inject
@Any
- private Instance<ShardContract> instance;
+ private Instance<ShardContract> instance1;
+
+ @Inject
+ private Instance<ShardContract> instance2;
+
@Test
public void checkQualfiers() {
@@ -57,8 +63,20 @@ public class InstanceQualifierInjectionP
QualifiersHolder.class,
Factory.class), Collections.<String>emptyList(), true);
- assertNotNull(instance.select(new AnnotationLiteral<Qualifier1>()
{}).get());
- assertEquals(2, holder.getQualifiers().size());
+ assertNotNull(instance1.select(new AnnotationLiteral<Qualifier1>()
{}).get());
+ assertEquals(1, holder.getQualifiers().size());
+ assertEquals(Qualifier1.class,
holder.getQualifiers().iterator().next().annotationType());
+
+ assertNotNull(instance2.select(AnyLiteral.INSTANCE).get());
+ assertEquals(1, holder.getQualifiers().size());
+ assertEquals(Any.class,
holder.getQualifiers().iterator().next().annotationType());
+
+ assertNotNull(instance2.get());
+ assertEquals(1, holder.getQualifiers().size());
+ assertEquals(Default.class,
holder.getQualifiers().iterator().next().annotationType());
+
+
+
}
@@ -73,6 +91,7 @@ public class InstanceQualifierInjectionP
@Produces
@Qualifier1
+ @Default
public ShardContract produces(final InjectionPoint ip)
{
holder.setQualifiers(ip.getQualifiers());
Modified:
openwebbeans/trunk/webbeans-tck/src/main/resources/META-INF/openwebbeans/openwebbeans.properties
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-tck/src/main/resources/META-INF/openwebbeans/openwebbeans.properties?rev=1796668&r1=1796667&r2=1796668&view=diff
==============================================================================
---
openwebbeans/trunk/webbeans-tck/src/main/resources/META-INF/openwebbeans/openwebbeans.properties
(original)
+++
openwebbeans/trunk/webbeans-tck/src/main/resources/META-INF/openwebbeans/openwebbeans.properties
Mon May 29 17:25:35 2017
@@ -29,9 +29,13 @@ configuration.ordinal=150
org.apache.webbeans.application.supportsProducerInterception = false
+# enable verification of programmatic qualifiers
+org.apache.webbeans.strictDynamicValidation = true
+
org.apache.webbeans.spi.ConversationService =
org.apache.openwebbeans.tck.conversation.TckConversationService
org.apache.webbeans.application.supportsConversation=true
# we have to switch back to the un-cached version of the normal scoping handler
org.apache.webbeans.proxy.mapping.javax.enterprise.context.ApplicationScoped=org.apache.webbeans.intercept.NormalScopedBeanInterceptorHandler
+
Modified: openwebbeans/trunk/webbeans-tck/standalone-suite.xml
URL:
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-tck/standalone-suite.xml?rev=1796668&r1=1796667&r2=1796668&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-tck/standalone-suite.xml (original)
+++ openwebbeans/trunk/webbeans-tck/standalone-suite.xml Mon May 29 17:25:35
2017
@@ -101,6 +101,10 @@
<methods><exclude
name="testBeanNameWithSeparatedListOfELIdentifiers"/></methods>
</class>
+ <!-- OWB provides a bit more for @New than CDI requires -->
+ <class
name="org.jboss.cdi.tck.tests.lookup.dynamic.DynamicLookupTest">
+ <methods><exclude
name="testNewBeanNotEnabledWithouInjectionPoint"/></methods>
+ </class>
<!--