Author: shane.bryzak(a)jboss.com
Date: 2009-06-03 03:36:29 -0400 (Wed, 03 Jun 2009)
New Revision: 2744
Modified:
tck/trunk/impl/src/main/resources/tck-audit.xml
Log:
section 5 assertions updated
Modified: tck/trunk/impl/src/main/resources/tck-audit.xml
===================================================================
--- tck/trunk/impl/src/main/resources/tck-audit.xml 2009-06-02 15:19:20 UTC (rev 2743)
+++ tck/trunk/impl/src/main/resources/tck-audit.xml 2009-06-03 07:36:29 UTC (rev 2744)
@@ -1984,9 +1984,6 @@
</section>
<section id="5" title="Lookup, dependency injection and EL
resolution">
- <assertion id="a">
- <text>The container is required to ensure that any injected reference to a
contextual instance of a bean may be cast to any bean type of the bean.</text>
- </assertion>
<assertion id="b">
<text>The container is required to support circularities in the bean
dependency graph</text>
@@ -1994,630 +1991,534 @@
</assertion>
</section>
- <section id="5.1" title="Unsatisfied and ambiguous
dependencies">
- <assertion id="a">
- <text>The container must validate all injection points of all enabled beans
at deployment time to ensure that there are no unsatisfied or ambiguous dependencies. If
an unsatisfied or ambiguous dependency exists, an |UnsatisfiedDependencyException| or
|AmbiguousDependencyException| is thrown by the container at deployment time, as defined
in Section 5.7.1, "Resolving dependencies".</text>
- <note>These need expanding out - one for each assertion that results in an
exception in 5.7.1</note>
+ <section id="5.1" title="Typesafe resolution algorithm">
+
+ <assertion id="faa">
+ <text>When the container is resolving a bean by type, it identifies the set of
matching enabled beans which have a bean type that matches the required
type.</text>
</assertion>
- </section>
-
- <section id="5.2" title="Primitive types and null values">
-
-
- <assertion id="aa">
- <text>If necessary, the container performs boxing ~or unboxing~ when it
injects a value to a field or parameter of primitive or wrapper type.</text>
+
+ <assertion id="fb">
+ <text>Primitive types are considered to be identical to their corresponding
wrapper types in |java.lang|.</text>
</assertion>
- <assertion id="ab">
- <text>If necessary, the container performs ~boxing or~ unboxing when it
injects a value to a field or parameter of primitive or wrapper type.</text>
- </assertion>
-
- <assertion id="a">
- <text>If an injection point of primitive type resolves to a bean that may be
null, such as a producer method with a nonprimitive return type or a producer field with a
non-primitive type, a |NullableDependencyException| is thrown by the container at
deployment time</text>
+
+ <assertion id="fc">
+ <text>Array types are considered identical only if their element types are
identical.</text>
</assertion>
- <assertion id="b">
- <text>The method |Bean.isNullable()| may be used to detect if a bean has null
values</text>
+ <assertion id="fd">
+ <text>Parameterized types are considered identical only if both the type and
all type parameters are identical.</text>
</assertion>
- </section>
-
- <section id="5.3" title="Injected reference validity">
- <assertion id="a">
- <text>Any reference to a bean with a normal scope is valid as long as the
application maintains a hard reference to it. However, it may only be invoked when the
context associated with the normal scope is active. If it is invoked when the context is
inactive, a |ContextNotActiveException| is thrown by the container</text>
+
+ <assertion id="gaa">
+ <text>_If no bindings were explicitly specified, the container assumes the
binding |@Current|_. </text>
</assertion>
- <assertion id="b">
- <text>Any reference to a bean with a pseudo-scope (such as |@Dependent|) is
valid until the bean instance to which it refers is destroyed. It may be invoked even if
the context associated with the pseudo-scope is not active. If the application invokes a
method of a reference to an instance that has already been destroyed, the behavior is
undefined</text>
+ <assertion id="gba">
+ <text>The container narrows the set of matching beans to just those where for
each required binding, the bean declares a matching binding with _(a) the same type_ and
(b) the same annotation member value for each member which is not annotated
|(a)javax.enterprise.inject.NonBinding|.</text>
</assertion>
+
+ <assertion id="gca">
+ <text>The container narrows the set of matching beans to just those where for
each required binding, the bean declares a matching binding with (a) the same type and
_(b) the same annotation member value for each member_ which is not annotated
|javax.enterprise.inject.(a)NonBinding|.</text>
+ </assertion>
+
+ <assertion id="ha">
+ <text>When the container is resolving a bean by type, it examines the
deployment types of the matching beans, as defined in Section 2.5.6, "Deployment type
precedence", and returns the set of beans with the highest precedence deployment type
that occurs in the set.</text>
+ </assertion>
+
+ <assertion id="hb">
+ <text>When the container is resolving a bean by type, it examines the
deployment types of the matching beans, as defined in Section 2.5.6, "Deployment type
precedence", and returns the set of beans with the highest precedence deployment type
that occurs in the set. _If there are no matching beans, an empty set is
returned_</text>
+ </assertion>
</section>
- <section id="5.4" title="Client proxies">
+ <section id="5.1.1" title="Assignability of raw and parameterized
types">
+
<assertion id="a">
- <text>Client proxies are never required for a bean whose scope is a
pseudo-scope such as |@Dependent|</text>
- </assertion>
+ <text>A parameterized bean type is considered assignable to a raw required
type if the raw types are identical and all type parameters of the bean type are either
unbounded type variables or |java.lang.Object|.</text>
+ </assertion>
<assertion id="b">
- <text>Client proxies are used for normal scoped beans</text>
+ <text>A parameterized bean type is considered assignable to a parameterized
required type if they have identical raw type and for each parameter the required type
parameter and the bean type parameter are actual types with identical raw type, and, if
the type is parameterized, the bean type is assignable to the required type according to
these rules.</text>
</assertion>
<assertion id="c">
- <text>All client proxies must be serializable</text>
+ <text>A parameterized bean type is considered assignable to a parameterized
required type if they have identical raw type and for each parameter the required type
parameter is a wildcard, the bean type parameter is an actual type and the actual type is
a subtype of the upper bound, if any, of the wildcard and a supertype of the upper bound,
if any, or the wildcard.
+ </text>
</assertion>
-
+
<assertion id="d">
- <text>The container must guarantee that when any valid injected reference to
a bean of normal scope is invoked, the invocation is always processed by the current
instance of the injected bean.</text>
+ <text>A parameterized bean type is considered assignable to a parameterized
required type if they have identical raw type and for each parameter the required type
parameter is a wildcard with no lower bound, the bean type parameter is a type variable
and the upper bound of the type variable is aa subtype of the upper bound, if any, of the
wildcard.</text>
</assertion>
- </section>
-
- <section id="5.4.1" title="Unproxyable bean types">
- <assertion id="a">
- <text>Classes without a non-private constructor with no parameters cannot be
proxied by the container. If an injection point whose declared type cannot be proxied by
the container resolves to a bean with a normal scope, an |UnproxyableDependencyException|
is thrown by the container at deployment time.</text>
+
+ <assertion id="e">
+ <text>A parameterized bean type is considered assignable to a parameterized
required type if they have identical raw type and for each parameter the required type
parameter is an actual type, the bean type parameter is a type variable and the actual
type is a subtype of the upper bound, if any, of the type variable.</text>
</assertion>
-
- <assertion id="ba">
- <text>Classes which are declared final ~or have final methods~ cannot be
proxied by the container. If an injection point whose declared type cannot be proxied by
the container resolves to a bean with a normal scope, an |UnproxyableDependencyException|
is thrown by the container at deployment time</text>
+
+ <assertion id="f">
+ <text>A parameterized bean type is considered assignable to a parameterized
required type if they have identical raw type and for each parameter the required type
parameter and the bean type parameter are both type variables and the upper bound of the
required type parameter is a subtype of the upper bound, if any, of the bean type
parameter</text>
</assertion>
- <assertion id="bb">
- <text>Classes which ~are declared final or ~have final methods cannot be
proxied by the container. If an injection point whose declared type cannot be proxied by
the container resolves to a bean with a normal scope, an |UnproxyableDependencyException|
is thrown by the container at deployment time</text>
+ <assertion id="g">
+ <text>If the injection point is declared by a parameterized superclass, and
the type declaration of the injection point contains type parameters declared by the
superclass, the required type is the declared type, after substitution of actual type
arguments declared by subclasses.</text>
</assertion>
-
- <assertion id="c">
- <text>Primitive types cannot be proxied by the container. If an injection
point whose declared type cannot be proxied by the container resolves to a bean with a
normal scope, an |UnproxyableDependencyException| is thrown by the container at deployment
time</text>
- </assertion>
-
- <assertion id="d">
- <text>Array types cannot be proxied by the container. If an injection point
whose declared type cannot be proxied by the container resolves to a bean with a normal
scope, an |UnproxyableDependencyException| is thrown by the container at deployment
time</text>
- </assertion>
+
</section>
- <section id="5.4.2" title="Client proxy invocation">
- <assertion id="a">
- <text>Every time a method of the bean is invoked upon a client proxy, the
client proxy must obtain the context object by calling |Manager.getContext()|, passing the
bean scope, then obtain an instance of the bean by calling |Context.get()|, passing the
Bean instance representing the bean and an instance of |CreationalContext|, and invoke the
method upon the bean</text>
- </assertion>
+ <section id="5.1.2" title="Unsatisfied and ambiguous
dependencies">
+ <assertion id="aa">
+ <text>The container must validate all injection points of all enabled beans
when the application is initialized to ensure that there are no unsatisfied or ambiguous
dependencies. If an unsatisfied or ambiguous dependency exists, the container
automatically detects the problem and treats it as a deployment problem, as defined in
Section 12.4, "Problems detected automatically by the container".</text>
+ <note>These need expanding out - one for each assertion that results in an
exception in 5.7.1</note>
+ </assertion>
<assertion id="b">
- <text>The behavior of all methods declared by |java.lang.Object|, except for
|toString()|, is undefined for a client proxy</text>
+ <text>For a custom implementation of the Bean interface defined in Section
11.1, "The Bean interface", the container calls |getInjectionPoints()| to
determine the injection points of the bean.</text>
</assertion>
-
- </section>
+
+ </section>
- <section id="5.5" title="The default binding at injection
points">
- <assertion id="a">
- <text>If an injection point declares no binding, the default binding
|@Current| is assumed</text>
- </assertion>
- </section>
+ <section id="5.1.3" title="Primitive types and null values">
- <section id="5.6" title="Injection point metadata">
- <assertion id="a">
- <text>The |javax.enterprise.inject.spi.InjectionPoint.getBean()| method
returns the Bean object representing the bean that defines the injection
point</text>
+ <assertion id="aa">
+ <text>If necessary, the container performs boxing ~or unboxing~ when it
injects a value to a field or parameter of primitive or wrapper type.</text>
</assertion>
+ <assertion id="ab">
+ <text>If necessary, the container performs ~boxing or~ unboxing when it
injects a value to a field or parameter of primitive or wrapper type.</text>
+ </assertion>
+
+ <assertion id="aa">
+ <text>If an injection point of primitive type resolves to a bean that may
have null values, such as a producer method with a nonprimitive return type or a producer
field with a non-primitive type, the container automatically detects the problem and
treats it as a deployment problem, as defined in Section 12.4 "Problems detected
automatically by the container".</text>
+ </assertion>
<assertion id="ba">
- <text>The |javax.enterprise.inject.spi.InjectionPoint.getType()| method
returns the declared type of the injection point.</text>
+ <text>For a custom implementation of the Bean interface defined in Section
11.1, "The Bean interface", the container calls |isNullable()| to determine
whether the bean may have null values.</text>
</assertion>
-
- <assertion id="bb">
- <text>An injection point declared in XML has it's type determined
according to Section 9.10, "Specifying bean types and bindings"</text>
+ </section>
+
+ <section id="5.1.4" title="Binding annotations with
members">
+ <assertion id="a" testable="false">
+ <text>Binding types with members are supported</text>
+ <note>A statement of intent</note>
</assertion>
- <assertion id="bc">
- <text>The |javax.enterprise.inject.spi.InjectionPoint.getBindings()| method
returns the declared bindings of the injection point.</text>
+ <assertion id="b">
+ <text>An annotation member may be excluded from consideration using the
|@NonBinding| annotation</text>
</assertion>
<assertion id="ca">
- <text>The |javax.enterprise.inject.spi.InjectionPoint.getMember()| method
returns the |Field| object in the case of field injection</text>
+ <text>Array-valued ~or annotation-valued~ members of a binding type must be
annotated |@NonBinding|. If an array-valued ~or annotation-valued~ member of a binding
type is not annotated |@NonBinding|, the container automatically detects the problem and
treats it as a definition error, as defined in Section 12.4, "Problems detected
automatically by the container".</text>
</assertion>
<assertion id="cb">
- <text>The |javax.enterprise.inject.spi.InjectionPoint.getMember()| method
returns the |Method| object in the case of method parameter injection</text>
+ <text>~Array-valued or ~annotation-valued members of a binding type must be
annotated |@NonBinding|. If an ~array-valued or ~annotation-valued member of a binding
type is not annotated |@NonBinding|, the container automatically detects the problem and
treats it as a definition error, as defined in Section 12.4, "Problems detected
automatically by the container".</text>
</assertion>
-
- <assertion id="cc">
- <text>The |javax.enterprise.inject.spi.InjectionPoint.getMember()| method
returns the |Constructor| object in the case of constructor parameter
injection</text>
+ </section>
+
+ <section id="5.1.5" title="Multiple bindings">
+ <assertion id="a">
+ <text>A bean class may declare multiple bindings</text>
</assertion>
- <assertion id="da">
- <text>The |javax.enterprise.inject.spi.InjectionPoint.getAnnotation()| method
returns annotations of the field in the case of field injection</text>
+ <assertion id="b">
+ <text>A producer method may declare multiple bindings</text>
</assertion>
- <assertion id="db">
- <text>The |javax.enterprise.inject.spi.InjectionPoint.getAnnotation()| method
returns annotations of the parameter in the case of method parameter</text>
- </assertion>
+ <assertion id="c">
+ <text>A producer field may declare multiple bindings</text>
+ </assertion>
- <assertion id="dc">
- <text>The |javax.enterprise.inject.spi.InjectionPoint.getAnnotation()| method
returns annotations annotations of the parameter in the case of constructor parameter
injection.</text>
+ <assertion id="d">
+ <text>A bean must declare all of the bindings that are specified at the
injection point to be considered a candidate for injection</text>
</assertion>
+ </section>
+
+ <section id="5.2" title="EL Name resolution algorithm">
- <assertion id="dd">
- <text>The |javax.enterprise.inject.spi.InjectionPoint.getAnnotations()|
method returns annotations of the field in the case of field injection</text>
+ <assertion id="b">
+ <text>When resolving a bean by name, the container must identify the set of
matching enabled beans which have the given EL name</text>
</assertion>
- <assertion id="de">
- <text>The |javax.enterprise.inject.spi.InjectionPoint.getAnnotations()|
method returns annotations of the parameter in the case of method parameter</text>
+ <assertion id="c">
+ <text>After the container identifies the set of matching beans, it examines
the deployment types of the matching beans, as defined in Section 2.5.6, "Deployment
type precedence", and returns the set of beans with the highest precedence deployment
type that occurs in the set.</text>
</assertion>
- <assertion id="df">
- <text>The |javax.enterprise.inject.spi.InjectionPoint.getAnnotations()|
method returns annotations annotations of the parameter in the case of constructor
parameter injection.</text>
+ <assertion id="d">
+ <text>If there are no matching beans, an empty set is returned.</text>
</assertion>
-
- <assertion id="dg">
- <text>|getAnnotation()| returns a null value if no annotation of the given
type exists at the field injection point</text>
+ </section>
+
+ <section id="5.2.1" title="Ambiguous EL names">
+ <assertion id="a">
+ <text>If, in a particular deployment two enabled beans have the same EL name
and the same deployment type, the container automatically detects the problem and treats
it as a deployment problem, as defined in Section 12.4, "Problems detected
automatically by the container".</text>
</assertion>
- <assertion id="dh">
- <text>|getAnnotation()| returns a null value if no annotation of the given
type exists at the method parameter injection point</text>
+ <assertion id="b">
+ <text>If, in a particular deployment, the EL name of an enabled bean is of
the form |x.y|, where |y| is a valid bean EL name, and |x| is the EL name of some other
enabled bean, the container automatically detects the problem and treats it as a
deployment problem, as defined in Section 12.4, "Problems detected automatically by
the container".</text>
</assertion>
-
- <assertion id="di">
- <text>|getAnnotation()| returns a null value if no annotation of the given
type exists at the constructor injection point</text>
- </assertion>
-
</section>
- <section id="5.6.1" title="Injecting InjectionPoint">
-
- <assertion id="za">
- <text>The container must provide a bean with deployment type
|(a)Standard|.</text>
+ <section id="5.3" title="Client proxies">
+ <assertion id="a">
+ <text>Client proxies are never required for a bean whose scope is a
pseudo-scope such as |@Dependent|</text>
</assertion>
- <assertion id="zb">
- <text>The container must provide a bean with scope
|(a)Dependent|.</text>
+ <assertion id="b">
+ <text>Client proxies are used for normal scoped beans</text>
</assertion>
- <assertion id="zc">
- <text>The container must provide a bean with bean type
|InjectionPoint|.</text>
+ <assertion id="d">
+ <text>The container must guarantee that when any valid injected reference to
a bean of normal scope is invoked, the invocation is always processed by the current
instance of the injected bean.</text>
</assertion>
-
- <assertion id="zd">
- <text>The container must provide a bean with binding
|(a)Current|.</text>
- </assertion>
+ </section>
- <assertion id="a">
- <text>Whenever a |@Dependent| scoped object is instantiated by the container
for injection into a second bean, any injection point of type |InjectionPoint| and binding
|@Current| receives an instance of |InjectionPoint| that represents the injection point of
the second bean</text>
+ <section id="5.3.1" title="Unproxyable bean types">
+ <assertion id="aa">
+ <text>Classes without a non-private constructor with no parameters cannot be
proxied by the container. If an injection point whose declared type cannot be proxied by
the container resolves to a bean with a normal scope, the container automatically detects
the problem and treats it as a deployment problem, as defined in Section 12.4,
"Problems detected automatically by the container".</text>
</assertion>
- <assertion id="b">
- <text>When a |@Dependent| scoped object is instantiated by the container to
receive a producer method, any injection point of type |InjectionPoint| and binding
|@Current| receives a null value</text>
+ <assertion id="baa">
+ <text>Classes which are declared final ~or have final methods~ cannot be
proxied by the container. If an injection point whose declared type cannot be proxied by
the container resolves to a bean with a normal scope, the container automatically detects
the problem and treats it as a deployment problem, as defined in Section 12.4,
"Problems detected automatically by the container".</text>
</assertion>
- <assertion id="c">
- <text>When a |@Dependent| scoped object is instantiated by the container to
receive a producer field, any injection point of type |InjectionPoint| and binding
|@Current| receives a null value</text>
+ <assertion id="bba">
+ <text>Classes which ~are declared final or ~have final methods cannot be
proxied by the container. If an injection point whose declared type cannot be proxied by
the container resolves to a bean with a normal scope, the container automatically detects
the problem and treats it as a deployment problem, as defined in Section 12.4,
"Problems detected automatically by the container".</text>
</assertion>
- <assertion id="d">
- <text>When a |@Dependent| scoped object is instantiated by the container to
receive an observer , any injection point of type |InjectionPoint| and binding |@Current|
receives a null value</text>
+ <assertion id="ca">
+ <text>Primitive types cannot be proxied by the container. If an injection
point whose declared type cannot be proxied by the container resolves to a bean with a
normal scope, the container automatically detects the problem and treats it as a
deployment problem, as defined in Section 12.4, "Problems detected automatically by
the container".</text>
</assertion>
- <assertion id="e">
- <text>When a |@Dependent| scoped object is instantiated by the container to
receive a disposal method invocation, any injection point of type |InjectionPoint| and
binding |@Current| receives a null value</text>
+ <assertion id="da">
+ <text>Array types cannot be proxied by the container. If an injection point
whose declared type cannot be proxied by the container resolves to a bean with a normal
scope, the container automatically detects the problem and treats it as a deployment
problem, as defined in Section 12.4, "Problems detected automatically by the
container".</text>
</assertion>
-
- <assertion id="f">
- <text>When a |@Dependent| scoped object is instantiated by the container
during EL expression evaluation, any injection point of type |InjectionPoint| and binding
|@Current| receives a null value</text>
+ </section>
+
+ <section id="5.3.2" title="Client proxy invocation">
+ <assertion id="aa">
+ <text>Every time a method of the bean is invoked upon a client proxy, the client
proxy must obtain a contextual instance of the bean, as defined in Section 6.5.2,
"Contextual instance of a bean", and invoke the method upon this
instance.</text>
</assertion>
- <assertion id="g">
- <text>When a |@Dependent| scoped object is instantiated by the container as a
result of a direct call to the Manager API, any injection point of type |InjectionPoint|
and binding |@Current| receives a null value</text>
+ <assertion id="b">
+ <text>The behavior of all methods declared by |java.lang.Object|, except for
|toString()|, is undefined for a client proxy</text>
</assertion>
-
- <assertion id="h">
- <text>If a bean that declares any scope other than |@Dependent| has an
injection point of type |InjectionPoint| and binding |@Current|, a |DefinitionException|
is thrown by the container at deployment time</text>
- </assertion>
-
- <assertion id="i">
- <text>If an object that is not a bean has an injection point of type
|InjectionPoint| and binding |@Current|, a |DefinitionException| is thrown by the
container at deployment time</text>
- </assertion>
- </section>
+
+ </section>
- <section id="5.7" title="The Manager object">
-
- </section>
-
- <section id="5.7.1" title="Resolving dependencies">
- <assertion id="a" testable="false">
- <text>Implementations of Bean maintain a reference to an instance of
|Manager|</text>
+ <section id="5.4" title="Dependency injection">
+ <assertion id="a">
+ <text>The container is required to perform dependency injection whenever it
creates a contextual instance of a session bean.</text>
</assertion>
<assertion id="b">
- <text>When the |Bean| implementation performs dependency injection, it must
obtain the contextual instances to inject by calling |Manager.getInstanceToInject()|,
passing an instance of |InjectionPoint| that represents the injection point and the
instance of |CreationalContext| that was passed to |Bean.create()|</text>
+ <text>The container is required to perform dependency injection whenever it
creates a contextual instance of a managed bean.</text>
</assertion>
<assertion id="c">
- <text>|Manager.getInstanceToInject()| returns a contextual instance or client
proxy to be injected to the given injection point</text>
+ <text>The container is required to perform dependency injection whenever it
instantiates non-contextual instances of session beans (for example, session beans
obtained by the application from JNDI or injected using |(a)EJB|).</text>
</assertion>
<assertion id="d">
- <text>The |Manager.getInstanceToInject()| method must Identify the bean by
calling |Manager.resolveByType()|, passing the type and bindings of the injection
point</text>
+ <text>The container is required to perform dependency injection whenever it
instantiates non-contextual instances of managed beans.</text>
</assertion>
-
+
<assertion id="e">
- <text>The |Manager.getInstanceToInject()| method must throw an
|UnsatisfiedDependencyException| if |resolveByType()| did not return a bean</text>
+ <text>The container is required to perform dependency injection whenever it
instantiates instances of any other Java EE component class supporting
injection.</text>
</assertion>
<assertion id="f">
- <text>The |Manager.getInstanceToInject()| method must throw an
|AmbiguousDependencyException| if |resolveByType()| returned more than one
bean</text>
+ <text>In a Java EE 5 environment, the container is not required to support
injection for non-contextual objects.</text>
</assertion>
<assertion id="g">
- <text>The |Manager.getInstanceToInject()| method must throw an
|UnproxyableDependencyException| if the bean has a normal scope and the type cannot be
proxied by the container, as defined in Section 5.4.1, "Unproxyable bean
types"</text>
+ <text>The container interacts with instances of beans and other Java EE
component classes supporting injection by calling methods and getting and setting the
field values.</text>
</assertion>
-
- <assertion id="h">
- <text>The |Manager.getInstanceToInject()| method must obtain an instance of
the bean (or a client proxy) by calling |Manager.getInstance()|, passing the |Bean| object
representing the bean, and return it. Alternatively, return an incompletely initialized
instance of the bean that was registered by calling |CreationalContext.push()|, as defined
in Section 6.1, "The Contextual interface"</text>
- </assertion>
</section>
- <section id="5.7.2" title="Obtaining contextual instances">
+ <section id="5.4.1" title="Injectable references">
<assertion id="a">
- <text>Any bean may obtain an instance of |Manager| by injecting
it</text>
+ <text>To obtain an injectable reference for an injection point, the container
must identify a bean according to the rules defined in Section 5.1, "Typesafe
resolution algorithm".</text>
</assertion>
- <assertion id="aa">
- <text>The container provides a built-in bean with bean type
|Manager|</text>
- </assertion>
-
- <assertion id="ab">
- <text>The container-provided |Manager| bean has a scope type of
|@Dependent|</text>
- </assertion>
-
- <assertion id="ac">
- <text>The container-provided |Manager| bean has a deployment type of
|@Standard|</text>
- </assertion>
-
- <assertion id="ad">
- <text>The container-provided |Manager| bean has a binding of
|(a)Current|.</text>
- </assertion>
-
<assertion id="b">
- <text>The application may obtain the |Manager| object from JNDI. The
container must register an instance of |Manager| with name |java:app/Manager| in JNDI at
deployment time</text>
+ <text>If typesafe resolution resulted in an empty set, throw an
|UnsatisfiedResolutionException|.</text>
</assertion>
<assertion id="c">
- <text>A contextual instance of a bean may be obtained by calling
|Manager.getInstance()|, passing the |Bean| object representing the bean</text>
+ <text>If typesafe resolution resulted in more than one bean, throw an
|AmbiguousResolutionException|.</text>
</assertion>
<assertion id="d">
- <text>|Manager.getInstance()| returns a contextual instance or client proxy
for the given bean</text>
+ <text>Otherwise, obtain a contextual reference for this bean for the type of
the injection point according to Section 6.5.3, "Contextual reference for a
bean".</text>
</assertion>
<assertion id="e">
- <text>If the given Bean instance represents a bean with a normal scope, as
defined in Section 8.2, "Normal scopes and pseudo-scopes",
|Manager.getInstance()| must return a client proxy</text>
+ <text>The container is permitted to directly inject a contextual instance of
the bean, as defined in Section 6.5.2, "Contextual instance of a
bean".</text>
</assertion>
<assertion id="f">
- <text>If the Bean instance represents a bean with a pseudo-scope, as defined
in Section 8.2, "Normal scopes and pseudo-scopes", |Manager.getInstance()| must
obtain the context object by calling |Manager.getContext()|, passing the bean scope, then
obtain an instance of the bean by calling |Context.get()|, passing the Bean instance
representing the bean and an instance of |CreationalContext|</text>
+ <text>If an incompletely initialized instance of the bean is registered with
the current |CreationalContext|, as defined in Section
+6.1, "The Contextual interface", the container is permitted to directly inject
this instance.</text>
</assertion>
- <assertion id="g" testable="false">
- <text>The |Manager.getInstanceByType()| methods obtain a contextual instance
of a bean</text>
- <note>A statement of intent</note>
+ </section>
+
+ <section id="5.4.2" title="Injected reference validity">
+ <assertion id="c">
+ <text>Injected references to a bean are valid until the object into which
they were injected is destroyed. The application should not invoke a method of an invalid
reference. If the application invokes a method of an injected reference after the object
into which it was injected has been destroyed, the behavior is undefined.</text>
</assertion>
-
- <assertion id="h">
- <text>If no bindings are passed to |Manager.getInstanceByType()|, the default
binding |@Current| is assumed</text>
+ </section>
+
+ <section id="5.4.3" title="Injection using the bean
constructor">
+ <assertion id="a">
+ <text>When the container instantiates a managed bean with a constructor
annotated |@Initializer|, the container calls this constructor, passing an injectable
reference to each parameter. If there is no constructor annotated |@Initializer|, the
container calls the constructor with no parameters.</text>
+ </assertion>
+ </section>
+
+ <section id="5.4.4" title="Injection of fields and initializer
methods">
+ <assertion id="a">
+ <text>When the container creates a new instance of a managed bean, session bean,
or of any other Java EE component class supporting injection, the container must
initialize the values of all injected fields after injection of Java EE component
environment resources has been performed and before the |@PostConstruct| callback occurs
and before the servlet |init()| method is called. The container sets the value of each
injected field to an injectable reference.</text>
</assertion>
- <assertion id="ia">
- <text>If a parameterized type with a type parameter ~or wildcard~ is passed
to |resolveByType()|, an |IllegalArgumentException| is thrown</text>
+ <assertion id="b">
+ <text>After the container initializes the values of the injected fields, it
must call all initializer methods, passing an injectable reference to each
parameter.</text>
</assertion>
- <assertion id="ib">
- <text>If a parameterized type with a ~type parameter or~ wildcard is passed
to |resolveByType()|, an |IllegalArgumentException| is thrown</text>
+ <assertion id="c">
+ <text>After the container calls initializer methods, it must build the
interceptor and decorator stacks for the instance (if the component has interceptors or
decorators).</text>
+ </assertion>
+ </section>
+
+ <section id="5.4.5" title="Destruction of dependent
objects">
+ <text>When the container destroys an instance of a bean or of any Java EE
component class supporting injection, the container destroys all dependent objects, as
defined in Section 6.4.3, "Dependent object destruction", after the
|@PreDestroy| callback completes and after the servlet |destroy()| method is
called.</text>
+ </section>
+
+ <section id="5.4.6" title="Invocation of producer or disposal
methods">
+ <assertion id="a">
+ <text>When the container calls a producer method, if the method is static,
the container must invoke the method.</text>
</assertion>
- <assertion id="j">
- <text>If two instances of the same binding type are passed to
|getInstanceByType()|, a |DuplicateBindingTypeException| is thrown</text>
+ <assertion id="b">
+ <text>When the container calls a disposal method, if the method is static,
the container must invoke the method.</text>
</assertion>
- <assertion id="k">
- <text>If an instance of an annotation that is not a binding type is passed to
|getInstanceByType()|, an |IllegalArgumentException| is thrown</text>
+ <assertion id="c">
+ <text>When the container calls a producer method, if the method is non-static
the container must determine the most specialized enabled bean that specializes the bean
which declares the method, as defined in Section 4.3.2 "Most specializaed enabled
bean for a bean", then obtain a contextual instance of the most specialized bean, as
defined by Section 6.5.2 "Contextual instance of a bean", then invoke the method
upon this instance.</text>
</assertion>
- <assertion id="l">
- <text>The |getInstanceByType()| method must identify the bean by calling
|Manager.resolveByType()|, passing the given type and bindings</text>
+ <assertion id="d">
+ <text>When the container calls a disposal method, if the method is non-static
the container must determine the most specialized enabled bean that specializes the bean
which declares the method, as defined in Section 4.3.2 "Most specializaed enabled
bean for a bean", then obtain a contextual instance of the most specialized bean, as
defined by Section 6.5.2 "Contextual instance of a bean", then invoke the method
upon this instance.</text>
</assertion>
- <assertion id="m">
- <text>The |getInstanceByType()| method must throw an
|UnsatisfiedDependencyException| if |resolveByType()| did not return a bean</text>
+ <assertion id="e">
+ <text>The container passes an injectable reference to each injected method
parameter. The container is also responsible for destroying dependent objects created
during this invocation, as defined in Section 6.4.3 "Dependent object
destruction".</text>
+ </assertion>
+ </section>
+
+ <section id="5.4.7" title="Access to producer field values">
+ <assertion id="a">
+ <text>When the container accesses the value of a producer field, if the
producer field is static, the container must access the field value.</text>
</assertion>
- <assertion id="n">
- <text>The |getInstanceByType()| method must throw an
|AmbiguousDependencyException| if |resolveByType()| returned more than one
bean</text>
+ <assertion id="b">
+ <text>When the container accesses the value of a producer field, if the
producer field is non-static, the container must determine the most specialized enabled
bean that specializes the bean which declares the producer field, as defined in Section
4.3.2 "Most specialized enabled bean for a bean", then obtain a contextual
instance of the most specialized bean, as defined by Section 6.5.2 "Contextual
instance of a bean", then access the field value of this instance.</text>
</assertion>
-
- <assertion id="o">
- <text>The |getInstanceByType()| method must obtain an instance of the bean
(or a client proxy) by calling |Manager.getInstance()|, passing the Bean object
representing the bean, and return it</text>
- </assertion>
</section>
- <section id="5.8" title="Dynamic lookup">
-
+ <section id="5.4.8" title="Invocation of observer methods">
<assertion id="a">
- <text>An instance of the |javax.inject.Instance| interface may be injected
via use of the
-|(a)javax.inject.Obtains| binding</text>
+ <text>When the container calls an observer method (defined in Section 10.5
"Observer methods"), if the observer method is static, the container must invoke
the method.</text>
</assertion>
<assertion id="b">
- <text>Additional bindings may be specified at the injection
point</text>
+ <text>When the container calls an observer method (defined in Section 10.5
"Observer methods"), if the observer method is non-static, the container must
determine the most specialized enabled bean that specializes the bean which declares the
observer method, as defined in Section 4.3.2 "Most specialized enabled bean for a
bean", then obtain a contextual instance of the bean according to Section 6.5.2
"Contextual instance of a bean". If this observer method is a conditional
observer method, obtain the contextual instance that already exists, without creating a
new contextual instance. Finally, the container must invoke the observer method on the
resulting instance, if any.</text>
</assertion>
<assertion id="c">
- <text>The |Instance| interface provides a method for obtaining instances of
beans of a specific type</text>
+ <text>The container must pass the event object to the event parameter and an
injectable instance to each injected method parameter.</text>
</assertion>
<assertion id="d">
- <text>If two instances of the same binding type are passed to
|Instance.get()|, a |DuplicateBindingTypeException| is thrown</text>
+ <text>The container is also responsible for destroying dependent objects
created during this invocation, as defined in Section 6.4.3, "Dependent object
destruction".</text>
+ </assertion>
+ </section>
+
+ <section id="5.4.9" title="Injection point metadata">
+ <assertion id="aa">
+ <text>The |javax.enterprise.inject.spi.InjectionPoint.getBean()| method returns
the Bean object representing the bean that defines the injection point. If the injection
point does not belong to a bean, |getBean()| returns a null value.</text>
</assertion>
- <assertion id="e">
- <text>If an instance of an annotation that is not a binding type is passed to
|Instance.get()|, an |IllegalArgumentException| is thrown</text>
+ <assertion id="ba">
+ <text>The |javax.enterprise.inject.spi.InjectionPoint.getType()| method
returns the declared type of the injection point.</text>
</assertion>
- <assertion id="f">
- <text>The |@Obtains| annotation or |<Obtains>| element may be
applied to any injection point of type |Instance| where an actual type parameter is
specified</text>
+ <assertion id="bc">
+ <text>The |javax.enterprise.inject.spi.InjectionPoint.getBindings()| method
returns the declared bindings of the injection point.</text>
</assertion>
- <assertion id="g">
- <text>If the type of the injection point is not of type |Instance| a
|DefinitionException| is thrown by the container at deployment time</text>
+ <assertion id="ca">
+ <text>The |javax.enterprise.inject.spi.InjectionPoint.getMember()| method returns
the |Field| object in the case of field injection.</text>
</assertion>
- <assertion id="h">
- <text>If no actual type parameter is specified a |DefinitionException| is
thrown by the container at deployment time</text>
+ <assertion id="cb">
+ <text>The |javax.enterprise.inject.spi.InjectionPoint.getMember()| method
returns the |Method| object in the case of method parameter injection.</text>
</assertion>
- <assertion id="i">
- <text>If the type parameter contains a type variable a |DefinitionException|
is thrown by the container at deployment time</text>
+ <assertion id="cc">
+ <text>The |javax.enterprise.inject.spi.InjectionPoint.getMember()| method
returns the |Constructor| object in the case of constructor parameter
injection</text>
</assertion>
- <assertion id="j">
- <text>If the type parameter contains a wildcard a |DefinitionException| is
thrown by the container at deployment time</text>
+ <assertion id="daa">
+ <text>The |getAnnotated()| method returns an instance of
|javax.enterprise.inject.spi.AnnotatedField| or
|javax.enterprise.inject.spi.AnnotatedParameter|, depending upon whether the injection
point is an injected field or a constructor/method parameter.</text>
</assertion>
- <assertion id="k" testable="false">
- <text>Whenever the |@Obtains| annotation appears at an injection point, an
implicit bean exists with exactly the bean type and bindings that appear at the injection
point</text>
- <note>As the bean is implicit, it cannot be resolved</note>
+ <assertion id="dba">
+ <text>The |isDelegate()| method returns true if the injection point is a
decorator delegate injection point, and false otherwise.</text>
</assertion>
- <assertion id="l" testable="false">
- <text>Whenever the |@Obtains| annotation appears at an injection point, an
implicit bean exists with deployment type |@Standard|</text>
- <note>As the bean is implicit, it cannot be resolved</note>
+ <assertion id="dca">
+ <text>The |isTransient()| method returns true if the injection point is a
transient field, and false otherwise.</text>
</assertion>
+
+ <assertion id="e">
+ <text>The container must provide a bean with deployment type |@Standard|,
scope |@Dependent|, bean type |InjectionPoint| and binding |@Current|, allowing dependent
objects, as defined in Section 6.4.2, "Dependent objects", to obtain information
about the injection point to which they belong. The built-in implementation must be a
passivation capable dependency, as defined in Section 6.6.2, "Passivation capable
dependencies".</text>
+ </assertion>
- <assertion id="m" testable="false">
- <text>Whenever the |@Obtains| annotation appears at an injection point, an
implicit bean exists with |@Dependent| scope</text>
- <note>As the bean is implicit, it cannot be resolved</note>
+ <assertion id="f">
+ <text>If a bean that declares any scope other than |@Dependent| has an
injection point of type |InjectionPoint| and binding |@Current|, the container
automatically detects the problem and treats it as a definition error, as defined in
Section 12.4, "Problems detected automatically by the container".</text>
</assertion>
- <assertion id="n" testable="false">
- <text>Whenever the |@Obtains| annotation appears at an injection point, an
implicit bean exists with no bean name</text>
- <note>As the bean is implicit, it cannot be resolved</note>
+ <assertion id="g">
+ <text>If an object that is not a bean has an injection point of type
|InjectionPoint| and binding |@Current|, the container automatically detects the problem
and treats it as a definition error, as defined in Section 12.4, "Problems detected
automatically by the container".</text>
+ </assertion>
+ </section>
+
+ <section id="5.5" title="Programmatic lookup">
+ <assertion id="aa">
+ <text>An instance of the |javax.enterprise.inject.Instance| interface may be
injected.</text>
</assertion>
- <assertion id="o" testable="false">
- <text>Whenever the |@Obtains| annotation appears at an injection point, an
implicit bean exists with an implementation provided automatically by the
container</text>
- <note>As the bean is implicit, it cannot be resolved</note>
+ <assertion id="ba">
+ <text>The method |javax.enterprise.inject.Instance.get()| returns a
contextual reference.</text>
</assertion>
- <assertion id="p">
- <text>The |get()| method of the provided implementation of Instance must call
|Manager.getInstanceByType()|, passing all bindings declared at the injection point,
except |@Obtains|, and all bindings passed to |Instance.get()|</text>
+ <assertion id="ca">
+ <text>Any combination of bindings may be specified at the injection
point.</text>
</assertion>
- <assertion id="q">
- <text>The application may obtain a contextual instance by calling the
|Instance.get()| method</text>
+ <assertion id="da">
+ <text>The |@Any| binding may be used to allow the application to specify
bindings dynamically.</text>
</assertion>
+ </section>
- <assertion id="r">
- <text>When the application calls |Instance.get()| to obtain a contextual
instance dynamically, it may need to pass instances of binding annotation
types</text>
- </assertion>
- </section>
-
- <section id="5.9" title="Typesafe resolution algorithm">
+ <section id="5.5.1" title="The Instance interface">
<assertion id="a">
- <text>The |resolveByType()| method of the |Manager| interface returns the
result of the typesafe resolution</text>
- <note>Here we just do a general test that resolveByType() is producing
sensible results</note>
+ <text>The |Instance| interface provides a method for obtaining instances of
beans of a specific type, and inherits the ability to iterate
+beans of a specific type from |java.lang.Iterable|.</text>
</assertion>
<assertion id="b">
- <text>If no bindings are passed to |Manager.resolveByType()|, the default
binding |@Current| is assumed</text>
+ <text>The |select()| method of the provided implementation of |Instance|
returns a child Instance for a subtype of the bean type and additional bindings. If no
subtype is given, the bean type is the same as the parent.</text>
</assertion>
- <assertion id="ca">
- <text>If a parameterized type with a type parameter ~or wildcard~ is passed
to |Manager.resolveByType()|, an |IllegalArgumentException| is thrown</text>
+ <assertion id="c">
+ <text>If a parameterized type with a type parameter or wildcard is passed to
|select()|, an |IllegalArgumentException| is thrown.</text>
</assertion>
- <assertion id="cb">
- <text>If a parameterized type with a ~type parameter or~ wildcard is passed
to |Manager.resolveByType()|, an |IllegalArgumentException| is thrown</text>
- </assertion>
-
<assertion id="d">
- <text>If two instances of the same binding type are passed to
|Manager.resolveByType()|, a |DuplicateBindingTypeException| is thrown</text>
+ <text>If two instances of the same binding type are passed to |select()|, a
|DuplicateBindingTypeException| is thrown.</text>
</assertion>
<assertion id="e">
- <text>If an instance of an annotation that is not a binding type is passed to
|Manager.resolveByType()|, an |IllegalArgumentException| is thrown</text>
+ <text>If an instance of an annotation that is not a binding type is passed to
|select()|, an |IllegalArgumentException| is thrown.</text>
</assertion>
- <assertion id="fa">
- <text>When the container is resolving a bean by type, it identifies the set
of matching enabled beans which have the given bean type.</text>
+ <assertion id="f">
+ <text>The |get()| method of the provided implementation of |Instance| must
identify the bean by calling |BeanManager.getBeans()|, passing the type and bindings
specified at the injection point. A child |Instance| passes the bean subtype and the
additional bindings, along with the bindings of its parent.</text>
</assertion>
- <assertion id="fb">
- <text>When the container is resolving a bean by type~, it identifies the set
of matching enabled beans which have the given bean type~. For this purpose, primitive
types are considered to be identical to their corresponding wrapper types in |java.lang|~,
array types are considered identical only if their element types are identical and
parameterized types are considered identical only if both the type and all type parameters
are identical~</text>
+ <assertion id="g">
+ <text>If |getBeans()| did not return a bean, throw an
|UnsatisfiedResolutionException|.</text>
</assertion>
- <assertion id="fc">
- <text>When the container is resolving a bean by type~, it identifies the set
of matching enabled beans which have the given bean type~. For this purpose, ~primitive
types are considered to be identical to their corresponding wrapper types in |java.lang|,~
array types are considered identical only if their element types are identical~ and
parameterized types are considered identical only if both the type and all type parameters
are identical~</text>
+ <assertion id="h">
+ <text>If |getBeans()| returned more than one bean, throw an
|AmbiguousResolutionException|.</text>
</assertion>
- <assertion id="fd">
- <text>When the container is resolving a bean by type~, it identifies the set
of matching enabled beans which have the given bean type~. For this purpose, ~primitive
types are considered to be identical to their corresponding wrapper types in |java.lang|,
array types are considered identical only if their element types are identical and~
parameterized types are considered identical only if both the type and all type parameters
are identical</text>
+ <assertion id="i">
+ <text>Otherwise, obtain a contextual reference for the bean by calling
|BeanManager.getReference()|, passing the |Bean| object representing the bean and the bean
type or subtype, and return it.</text>
</assertion>
-
- <assertion id="ga">
- <text>When the container is resolving a bean by type, it considers the given
bindings. _If no bindings were passed to |resolveByType()|, the container assumes the
binding |@Current|_. </text>
- </assertion>
- <assertion id="gb">
- <text>When the container is resolving a bean by type, it considers the given
bindings. ~If no bindings were passed to |resolveByType()|, the container assumes the
binding |@Current|~. The container narrows the set of matching beans to just those where
for each given binding, the bean declares a binding with _(a) the same type_ and (b) the
same annotation member value for each member which is not annotated |@NonBinding| (see
Section 5.9.1, "Binding annotations with members")</text>
+ <assertion id="j">
+ <text>The |iterator()| method of the provided implementation of |Instance|
must identify the set of beans by calling |BeanManager.getBeans()|, passing the type and
bindings specified at the injection point. A child Instance passes the subtype, the
bindings specified at the injection point and the additional bindings.</text>
</assertion>
- <assertion id="gc">
- <text>When the container is resolving a bean by type, it considers the given
bindings. ~If no bindings were passed to |resolveByType()|, the container assumes the
binding |@Current|~. The container narrows the set of matching beans to just those where
for each given binding, the bean declares a binding with (a) the same type and _(b) the
same annotation member value for each member_ which is not annotated |@NonBinding| (see
Section 5.9.1, "Binding annotations with members")</text>
- </assertion>
-
- <assertion id="gd">
- <text>When the container is resolving a bean by type, it considers the given
bindings. ~If no bindings were passed to |resolveByType()|, the container assumes the
binding |@Current|~. The container narrows the set of matching beans to just those where
for each given binding, the bean declares a binding with (a) the same type and (b) the
same annotation member value for each member which is _not annotated |@NonBinding|_ (see
Section 5.9.1, "Binding annotations with members")</text>
- </assertion>
-
- <assertion id="ha">
- <text>When the container is resolving a bean by type, it examines the
deployment types of the matching beans, as defined in Section 2.5.7, "Deployment type
precedence", and returns the set of beans with the highest precedence deployment type
that occurs in the set.</text>
- </assertion>
-
- <assertion id="hb">
- <text>When the container is resolving a bean by type, it examines the
deployment types of the matching beans, as defined in Section 2.5.7, "Deployment type
precedence", and returns the set of beans with the highest precedence deployment type
that occurs in the set. _If there are no matching beans, an empty set is
returned_</text>
- </assertion>
-
- </section>
+ <assertion id="k">
+ <text>The |iterator()| method of the provided implementation of |Instance|
must return an |Iterator|, that iterates over the set of contextual references for the
resulting beans by calling |BeanManager.getReference()|, passing the |Bean| object
representing the current bean and the bean type or subtype.</text>
+ </assertion>
+ </section>
- <section id="5.9.1" title="Binding annotations with
members">
- <assertion id="a" testable="false">
- <text>Binding types with members are supported</text>
- <note>A statement of intent</note>
- </assertion>
-
- <assertion id="b">
- <text>An annotation member may be excluded from consideration using the
|@NonBinding| annotation</text>
- </assertion>
-
- <assertion id="ca">
- <text>Array-valued ~or annotation-valued~ members of a binding type must be
annotated |@NonBinding|. If an array-valued ~or annotation-valued~ member of a binding
type is not annotated |@NonBinding|, a |DefinitionException| is thrown by the container at
deployment time</text>
- </assertion>
-
- <assertion id="cb">
- <text>~Array-valued or ~annotation-valued members of a binding type must be
annotated |@NonBinding|. If an ~array-valued or ~annotation-valued member of a binding
type is not annotated |@NonBinding|, a |DefinitionException| is thrown by the container at
deployment time</text>
- </assertion>
- </section>
-
- <section id="5.9.2" title="Multiple bindings">
+ <section id="5.5.2" title="The built-in Instance">
<assertion id="a">
- <text>A bean class may declare multiple bindings</text>
+ <text>The container must provide a built-in bean with |Instance<X>| for
every legal bean type X in its set of bean types</text>
</assertion>
<assertion id="b">
- <text>A producer method may declare multiple bindings</text>
+ <text>The container must provide a built-in bean with every binding type in
its set of binding types.</text>
</assertion>
<assertion id="c">
- <text>A producer field may declare multiple bindings</text>
- </assertion>
-
- <assertion id="d">
- <text>A bean must declare all of the bindings that are specified at the
injection point to be considered a candidate for injection</text>
+ <text>The container must provide a built-in bean with deployment type
@Standard.</text>
</assertion>
- </section>
-
- <section id="5.10" title="EL name resolution">
-
- <assertion id="aa">
- <text>The container must provide a Unified EL ELResolver to the servlet
engine ~and JSF implementation~ that resolves bean names</text>
- <note>This is testable implicitly by trying to resolve using EL from a
servlet</note>
- </assertion>
- <assertion id="ab">
- <text>The container must provide a Unified EL ELResolver to the ~servlet
engine~ and JSF implementation that resolves bean names</text>
- <note>This is testable implicitly by trying to resolve using EL from a JSF
view</note>
- </assertion>
-
- <assertion id="b">
- <text>When this resolver is called with a null base object, it calls the
method |Manager.getInstanceByName()| to obtain an instance of the bean named in the EL
expression</text>
- </assertion>
-
- <assertion id="c">
- <text>The |Manager.getInstanceByName()| method must identify the bean by
calling |Manager.resolveByName()|, passing the name</text>
- </assertion>
-
<assertion id="d">
- <text>The |Manager.getInstanceByName()| method must return a null value, if
|Manager.resolveByName()| returned an empty set</text>
+ <text>The container must provide a built-in bean with scope
@Dependent.</text>
</assertion>
<assertion id="e">
- <text>The |Manager.getInstanceByName()| method must throw an
|AmbiguousDependencyException| if |Manager.resolveByName()| returned more than one
bean</text>
+ <text>The container must provide a built-in bean with no bean EL
name.</text>
</assertion>
<assertion id="f">
- <text>The |Manager.getInstanceByName()| method must obtain an instance of the
bean by calling |Manager.getInstance()|, passing the |Bean| instance representing the bean
if exactly one bean was returned by |Manager.resolveByName()|. For each distinct name that
appears in the EL expression, |getInstanceByName()| must be called at most
once</text>
+ <text>The container must provide a built-in bean with an implementation
provided automatically by the container. </text>
</assertion>
<assertion id="g">
- <text>Even if a name appears more than once in the same expression, the
container may not call |getInstanceByName()| multiple times with that name. This
restriction ensures that there is a unique instance of each bean with scope |@Dependent|
in any EL evaluation</text>
+ <text>The built-in implementation must be a passivation capable dependency, as
defined in Section 6.6.2, "Passivation capable dependencies".</text>
</assertion>
</section>
- <section id="5.11" title="Name resolution algorithm">
+ <section id="5.5.3" title="Using AnnotationLiteral">
<assertion id="a">
- <text>The |resolveByName()| method of the |Manager| interface performs name
resolution</text>
+ <text>When the application calls select(), it may pass instances of binding
annotation types.</text>
</assertion>
-
- <assertion id="b">
- <text>When resolving a bean by name, the container must identify the set of
matching enabled beans which have the given name</text>
- </assertion>
-
- <assertion id="c">
- <text>After the container identifies the set of matching beans, it examines
the deployment types of the matching beans, as defined in Section 2.5.7, "Deployment
type precedence", and returns the set of beans with the highest precedence deployment
type that occurs in the set</text>
- </assertion>
-
- <assertion id="d">
- <text>If there are no matching beans, an empty set is returned</text>
- </assertion>
</section>
- <section id="5.12" title="Injection into non-contextual
objects">
- <assertion id="a" testable="false">
- <text>The container is required to perform dependency injection upon certain
non-contextual objects</text>
- <note>This is a statement of intent</note>
+ <section id="5.6" title="Integration with Unified EL">
+ <assertion id="aaa">
+ <text>The container must provide a Unified EL ELResolver to the servlet engine
~and JSF implementation~ that resolves bean EL names using the name resolution algorithm
defined in Section 5.2 "EL name resolution algorithm".</text>
+ <note>This is testable implicitly by trying to resolve using EL from a
servlet</note>
</assertion>
- </section>
-
- <section id="5.12.1" title="Non-contextual instances of session
beans">
- <assertion id="a">
- <text>The container is required to perform dependency injection for session
bean instances obtained directly from JNDI</text>
- </assertion>
- <assertion id="b">
- <text>The container is required to perform dependency injection for session
bean instances injected using |@EJB|</text>
+ <assertion id="aba">
+ <text>The container must provide a Unified EL |ELResolver| to the ~servlet
engine~ and JSF implementation that resolves bean EL names using the name resolution
algorithm defined in Section 5.2 "EL name resolution algorithm".</text>
+ <note>This is testable implicitly by trying to resolve using EL from a JSF
view</note>
</assertion>
- <assertion id="c">
- <text>The container is required to perform dependency injection for session
bean instances injected using |@Resource|</text>
+ <assertion id="ba">
+ <text>If a name used in an EL expression resolves to more than one bean, the
|ELResolver| must throw an |AmbiguousResolutionException|.</text>
</assertion>
- <assertion id="d">
- <text>The container is required to perform dependency injection for session
bean instances created by the container to receive remote method calls</text>
+ <assertion id="bb">
+ <text>If a name used in an EL expression does not resolve to any bean, the
|ELResolver| must return a null value.</text>
</assertion>
- <assertion id="e">
- <text>The container is required to perform dependency injection for session
bean instances created by the container to receive timeouts</text>
+ <assertion id="bc">
+ <text>Otherwise, if a name used in an EL expression resolves to exactly one
bean, the |ELResolver| must return a contextual instance of the bean, as defined in
Section 6.5.2, "Contextual instance of a bean".</text>
</assertion>
- <assertion id="p">
- <text>For the purposes of dependency injection, the container must treat
non-contextual instances of session beans as instances of the most specialized bean that
specializes the bean with binding |@New| and deployment type |@Standard| defined in
Section 3.3.6, "Session beans with the |@New| binding"</text>
+ <assertion id="c">
+ <text>For each distinct name that appears in the EL expression, the resolver
must be called at most once. Even if a name appears more than once in the same expression,
the container may not call the resolver multiple times with that name. This restriction
ensures that there is a unique instance of each bean with scope |@Dependent| in any EL
evaluation.</text>
</assertion>
-
</section>
-
- <section id="5.12.2" title="Message-driven beans">
-
- <assertion id="a">
- <text>The container performs dependency injection for message-driven bean
instances according to the bean class annotations</text>
- </assertion>
- </section>
-
- <section id="5.12.3" title="Servlets">
- <assertion id="a">
- <text>The container performs dependency injection for servlets according to
the servlet class annotations</text>
- </assertion>
- </section>
-
+
<section id="6" title="Bean lifecycle">
<assertion id="a">
<text>To create a contextual instance of a session bean, the container
creates an EJB local object reference</text>