Greg,
I'll try to address this with some inline replies, but I get the feeling that maybe a conf call will
be needed to interactively work on your concerns.
Yours, Mike.
On 05/08/2011 16:12, Greg Dritschler wrote:
Simon,
You seem to be saying there's an equivalence between binding.sca @uri and
reference target in terms
of promotion behavior. I cannot find anything in the spec that supports that.
Here is the description of nonOverridable:
876 nonOverridable : boolean (0..1) - a boolean value, "false" by default,
which indicates
whether this
877 component reference can have its targets overridden by a composite
reference which promotes the
878 component reference.
879 If @nonOverridable==false, if any target(s) are configured onto the
composite references which
880 promote the component reference, then those targets replace all the
targets explicitly
declared on the
881 component reference for any value of @multiplicity on the component
reference. If no targets are
882 defined on any of the composite references which promote the component
reference, then any
883 targets explicitly declared on the component reference are used. This
means in effect that
any targets
declared on the component reference act as default targets for that reference.
This description explicitly talks about reference targets. There is nothing
here that mentions
bindings. This description also doesn't explain how nonOverridable applies to
higher-level
composites that reuse this composite. It only describes the interaction
between the composite
reference and the component reference within the composite itself. If targets
are specified on both
an 'outer' component reference and its promoted 'inner' component reference,
what is supposed to
happen? Is it dependent on the setting of nonOverridable? I can't find
anything that addresses this.
There are a lot of bones to pick out of here - let me see if I can disentangle
them.
1) This section talks about "targets" of a reference in the sense implied by section 4.3.1 of the
specification. There are 7 ways described in there for specifying a target service for a reference,
which includes binding specific stuff like binding @uri values. So it is intended to cover bindings
as well as the other ways of specifying a target service.
2) How does nonOverridable apply to a higher level COMPONENT (not composite) that reuse this
composite? The answer is that it does not. ie the setting has no effect on the configuration of
the higher level component - if it did, there would be a description in the spec - there isn't any.
What effect nonOverridable has is on the reference that has nonOverridable on it. It basically says
whether a promotion obliterates any other targets the reference may have or whether the promotion
simply adds targets. The DEFAULT is obliteration. ie if you promote a reference then the target
identified by the higher level component is what actually gets used. Only if nothing is supplied at
the higher level could a target on the lower level get used (and that is the purpose of this bit
complexity - it gives a default (local) target in the case the higher level component does not
configure one.
The relation between the higher level component reference and the lower level component reference
that is promoted is essentially captured in this statement in section 4.3.1:
"6. Through the promotion of a component reference by a composite reference of the composite
containing the component (the target service is then identified by the configuration of the
composite reference)"
and "configuration" here means the configuration supplied by the component using the composite as an
implementation (there is other material that covers the generalalities of how a component
configuration configures ANY implementation - and that applies equally to composite implementations
as it does to Java or any other type.
If targets are specified on the outer level and the inner level, then what is supposed to happen is
described in the section that deals with nonOverridable - and there are 2 cases:
1) "If @nonOverridable==false, if any target(s) are configured onto the composite references which
promote the component reference, then those targets replace all the targets explicitly declared on
the component reference for any value of @multiplicity on the component reference. If no targets are
defined on any of the composite references which promote the component reference, then any targets
explicitly declared on the component reference are used. This means in effect that any targets
declared on the component reference act as default targets for that reference."
2) "If @nonOverridable==true, and the component reference @multiplicity is 0..n or 1..n, any targets
configured onto the composite references which promote the component reference are added to any
references declared on the component reference - that is, the targets are additive."
...now here note that "targets" are meant in the sense implied in 4.3.1 - a target service specified
by any means - @target, binding @uri, <wire/> element (note: autowire is excluded by definition
since it can only come into play where there is NO other way of establishing a target).
So - this would mean for example that if the lower level reference had <binding.ws
uri="foobar"/>,
but was promoted and the higher level component configured the (higher level) reference with
@target="SomeComponent/SomeService", then there would be one and only one target for the lower level
reference - the SomeComponent/SomeService service as configured by the higher level, assuming
nonOveridable=false (the default).
Here is the description of how bindings are overridden.
900 binding : Binding (0..n) - A reference element has zero or more binding
elements as
children.If no
901 binding elements are specified for the reference, then the bindings
specified for the equivalent
902 reference in the componentType of the implementation MUST be used. If
binding elements are
903 specified for the reference, then those bindings MUST be used and they
override any bindings
904 specified for the equivalent reference in the componentType of the
implementation. [ASM50012]
There is nothing in those lines talking about nonOverridable having any effect
on binding override.
But this only applies to the bindings on the COMPONENT reference and whether any bindings are picked
up (by defaulting) from the implementation of the COMPONENT.
Whether ANY of these bindings get used to identify target services depends on the OTHER
configuration of the reference - and in particular on whether the reference is promoted. If its
promoted, then in the default case, all the "local" configuration of the reference like the bindings
is obliterated. (If nonOverridable is set true, then this is not the case, since everything then is
additive)
So where is this equivalence between binding uri and reference target stated?
Does it apply just to
binding.sca or to all bindings?
In my opinion, this equivalence is defined in section 4.3.1, which declares 7 ways in which a target
service can be configured for a reference. @target is one way. A binding with some resolved target
is another. @uri is ONE way for a binding to have a resolved target (only way for binding.sca, but
other ways are available for other bindings, such as a pointer to some WSDL service element for
binding.ws).
PS I agree that this is complex. I tried to keep nonOverridable out of the
spec but I lost.