On Tue, Apr 22, 2008 at 10:42 PM, Jean-Sebastien Delfino <
[EMAIL PROTECTED]> wrote:

> Simon Laws wrote:
>
> > On Mon, Apr 21, 2008 at 4:49 PM, Simon Laws <[EMAIL PROTECTED]>
> > wrote:
> >
> >
> > > On Tue, Apr 15, 2008 at 6:10 PM, Yang Lei <[EMAIL PROTECTED]> wrote:
> > >
> > >  I agree with Simon's emphases on the point of view. I understand
> > > > Tuscany may prefer one solution over the other. However from
> > > > extensibility perspective, there need some extension points to
> > > > enable
> > > > Tuscany adapters to overwrite the default behavior. I think the
> > > > thread
> > > > discussion on reference target and the comparing of 1 and 2 showcase
> > > > one of the extensibility area :  how to resolve reference target for
> > > > different bindings.
> > > >
> > > > I am actually looking beyond just reference target, I see the
> > > > extensibility in the following areas:
> > > >
> > > > 1. When/How to enable a binding to resolve the target endpoint .
> > > > This
> > > > include the case to support reference target, and beyond, such as
> > > > supporting wireByImpl or autoWire. This also include distributed
> > > > support in case adapters have different ways to support distributed
> > > > contributions for a given virtual domain.
> > > >
> > > > I understand Tuscany has workspace discussions. It may potentially
> > > > be
> > > > a solution.I am still waiting to see how workspace is intending to
> > > > support distributed scenarios or how it can enable late binding on
> > > > resolving target endpoint. Regardless workspace is the solution or
> > > > not, we need the flexibility and extensibility to overwrite
> > > > Tuscany's
> > > > default behavior on binding end point resolving.
> > > >
> > > > 2. When/How the binding resolvable is in used,
> > > >
> > > > Some part of the Tuscany code is using binding resolved or not to
> > > > have
> > > > different process  (see point 3). I think if certain logic outside
> > > > binding needs to understand if a binding is resolvable, we should
> > > > make
> > > > it clear which method achieve it so binding implementations know
> > > > what
> > > > to expect.
> > > >
> > > > I can see Tuscany code uses binding's URI and targetComponentService
> > > > today, I think it should be limited to one method only, I am not
> > > > sure
> > > > overloading URI is  good .
> > > >
> > > > 3. When/How to make binding selections on the reference side.
> > > >
> > > > I can see Tuscany is trying to remove the unresolvable bindings
> > > > first
> > > > from the reference side , then use some algorithm to either pick the
> > > > default binding if it exists or pick the first on the list.
> > > >
> > > > I think we need some plug in point in Tuscany to enable different
> > > > algorithm from the above default behavior. And the plugin point need
> > > > to enable late binding so during reference's execution time we can
> > > > determine a binding is resolvable or not and then use some own
> > > > prioritizing rules to select the right bindings.
> > > >
> > > >
> > > > I would like to see these discussions concluded with a set of API
> > > > and
> > > > some form of API interaction diagrams in the end.
> > > >
> > > > Thanks.
> > > >
> > > > Yang
> > > >
> > > >
> > > >
> > > > I can see a couple of scenarios:
> > > >
> > > >
> > > >
> > > > I thinkand binding selection that we need to enable some extension
> > > > points for others using other algorism or other
> > > >
> > > >
> > > > ---------------------------------------------------------------------
> > > > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > > For additional commands, e-mail: [EMAIL PROTECTED]
> > > >
> > > >
> > > >  I've been thinking about this issue for a few days on and off and
> > > it seems
> > > to me that the key to this is in the way that we store bindings that
> > > have
> > > been read in from a composite file.
> > >
> > > The assembly model starts out with each reference holding all the
> > > bindings
> > > it is configured with in the composite file.
> > >
> > > During model build the set of bindings is matched with targets and the
> > > resulting list represents the set of resolved bindings complete with
> > > URIs
> > > identifying target services. These bindings represent the runtime
> > > configuration and are used to generate wires.
> > >
> > > To do late binding we have to maintain the original set of bindings as
> > > well as any bindings that have been fully resolved. In this way the
> > > reference can resolve targets at runtime with all the information that
> > > is
> > > used to resolve them at build time.
> > >
> > > During the first domain implementation I ran across this problem and
> > > stored the original list of bindings on the dummy target service that
> > > is
> > > created for each target. However this is less than satisfactory as
> > > this list
> > > is not persisted by the processors should the composite be written out
> > > again.
> > >
> > > If we reorganize the bindings such that we have a notion of candidate
> > > bindings and resolved bindings then candidate bindings can be used at
> > > a
> > > later point to create resolved bindings.
> > >
> > > Much of the builder processing can be done early to associate policy
> > > with
> > > bindings etc. But the wiring processing needs a bit of thinking about.
> > > Anyhow this is not a fully formed thought but I'm throwing this out
> > > there as
> > > I want to spend some time on this over the next few days and welcome
> > > any
> > > input.
> > >
> > > Regards
> > >
> > > Simon
> > >
> > >
> > I've given this some more thought. It's a long post, sorry about that,
> > but
> > just diving in and changing code is going to complicate matters on this
> > one.
> >
> >
> > Requirements
> > ------------
> >
> > A - late target service location
> > B - late binding selection
> > C - late autowire
> >
> > A and B could be achieved at the time when a proxy is first called on
> > the
> > understanding that an empty proxy can be first generated to represent
> > these
> > unresolved wires.This is different from the case where no proxy is
> > provided
> > for an unwired reference.
> >
> > C is more difficult as it involves the injection of one or more new
> > proxies
> > depending on what the autowire process discovers. I suggest
> > we defer this requirement.
> >
> > Inputs and Outputs
> > ------------------
> >
> > Currently the list of bindings that remain on a reference after the
> > assembly
> > model is "built" is what is used to drive the creation of the runtime.
> > The
> > following is a little strange but what I'm trying to show is the general
> > configuration of a reference, e.g. "Target = set" means that the
> > reference
> > has one or more targets and "binding uri = set" means that the reference
> > has
> > bindings where the binding URI is set.
> >
> > Input from .composite file:
> >
> > Target = null, binding uri = null
> > Target = null, binding uri = set
> > Target = set,  binding uri = null
> > Target = set,  binding uri = set  - this is an error case
> >
> > Output from build phase
> >
> > Target = null, binding uri = null - unwired reference, i.e. autowire
> > hasn't
> > matched up the reference
> > Target = null, binding uri = set  - the binding is used to generate a
> > provider and a wire
> > Target = set,  binding uri = null - A candidate for late binding (this
> > is
> > currently represented by storing bindings on the dummy target service)
> > Target = set,  binding uri = set  - this is an error case but
> > interestingly
> > our workspace will generate these now
> >
> > Current Binding Lifecycle
> > -------------------------
> >
> > Binding lifecycles depending on input. Note. These stages are not
> > represented explicitly in the binding model.
> >
> > Wired Reference (Target = set,  binding uri = null)
> >  Unresolved - not associated with service and a candidate for resolution
> > against a service binding
> >     (All candiate/unresolved bindings are removed from the
> > reference.bindings list after the build phase)
> >  Resolved - associated with service  - make better use of the resolved
> > flag
> > on binding
> >  Activated - binding provider created
> >  Started - wire created and provider started
> >
> > Unwired reference (Target = null, binding uri = set)
> >  Resolved - assumed resolved due to user input
> >  Activated - binding provider created
> >  Started - wire created and provider started
> >
> > Unwired reference (Target = null, binding uri = null)
> >  Unresolved - no proxy should be injected unless autowire matches them
> >  Resolved - autowire has matched the reference
> >  Activated - binding provider created
> >  Started - wire created and provider started
> >
> > Once past the resolved point point the final set of bindings are known
> > (the
> > reference.bindings list) and the runtime is constructed from this list.
> >
> > Suggested Changes
> > -----------------
> >
> > Tidy the binding model
> >
> > A) remove the concept of Optimizable binding
> >     Bindings will not have access directly to the target service that
> > they
> > refer to through this route
> >
> > B) add a direct reference between a binding and the target service model
> > that the binding is configured to represent
> >     We can tell which binding is related to which target
> >     we can tell which bindings are candidate bindings as they are not
> > already associated with a target model
> >
> > C) make clear use of the binding.unresolved flag to indicate true = not
> > pointing at a service in the domain
> >
> > Maintain candidate bindings
> >
> > D) retain the allocation of all bindings to unresolved services
> >     These bindings should all be fully configured in terms of available
> > policy
> >     There is potentially a gap here if we don't feel the full policy set
> > is
> > available in the domain when these bindings are configured
> >
> > OR (not sure which one is best without doing the code but the first is
> > there
> > already)
> >
> > E) retain all candidate bindings on the bindings list but with URI=null
> > and
> > marked as unresolved
> >
> > OR
> >
> > F) create two lists, candidate and resolved
> >
> > Propogate unresolved targets to later processing stages
> >
> > G) Allow wires to be created for unresolved services (this is different
> > from
> > unwired references)
> >     This will allow proxies to be generated in this case
> >     Proxies must have access to the unresolved binding list through the
> > dummy target service (or whatever storage is chosen for this)
> >     Not clear how this will work but will have to allow it to happen
> > without selecting a binding
> >
> > Late resolution
> >
> > H)  When the proxy is called.
> >    If the wire target is unresolved then call out to a binding resolver,
> > which could be pluggable, in order to:
> >       Find target service by look up in some registry, for example
> >       Find a binding in common with the target service - as in builder
> >       Configure the binding with the target URI and copy it into the
> > reference
> >       Create a provide for the binding - as in activate
> >       Create a wire for the binding - as in start
> >       Start the binding provider
> >
> >    If successful send the message down the wire
> >
> >    If not successful throw a service not found exception
> >
> >
> > Any comments gratefully accepted
> >
> > Simon
> >
> >
> So if I understand correctly:
>
> - You want your binding invoker code to resolve a target and pick a
> suitable binding at invoke time, as for example that target was not
> resolvable at build time.
>
> - The composite builder currently keeps unresolved targets as Service
> proxies in the reference.target list, with each proxy holding a list of the
> candidate bindings initially specified on the reference
>
> - But unresolved targets are not properly kept in the reference.bindings
> list used by the composite activator and the binding providers at runtime,
> making difficult to work with these unresolved targets then.
>
> I'd like suggest the following, a simple non-breaking change:
>
> - For each unresolved target, store an instance of SCABinding in the
> reference.bindings list with targetComponentService pointing to the target.
>
> - In your SCABinding invoker implementation, access the
> targetComponentService, resolve its location using whatever smart resolution
> mechanism you want to use, pick the candidate binding that suits it, create
> that binding's invoker and dispatch to it.
>
> Or with a twist, if you don't want to do that in SCABinding, create a new
> SuperSmartBindingThatResolvesThingsAtInvocationTime to handle that smart
> last-second resolution logic
>
> Makes sense? Simple enough?
> --
> Jean-Sebastien
>

Hi Sebastien

Thanks for the thought. Sounds good to me. Simpler than my suggestion. The
basis of this is actually what the code used to do in the old domain
implementation :-) So not difficult to move back to that. I like your twist
that binding.sca has make use of the candidate binding list for binding
matching. Nice one. I'll give it a go and report back.

Thanks for the input.

Simon

Reply via email to