← Prev in month
← Prev in thread
Next in thread →
Next in month →
ASSEMBLY-227: Promotion of consumers and producers undermines composability
Folks, In last weeks' TC meeting, Scott said something that finally enabled me to understand the meaning of "promoting a channel" which several previous weeks of discussion had not got through to me. Perhaps I was just being dense (most likely) or the light had not fallen on the right part of the concept. So, if I have it right now, then "promotion of a channel" from a composite is perhaps better described as "the channel has a settable channel resource", in the same way that a composite can have a settable property value that is used by one or more of its containing components. We're not really promoting the channel here, rather we're trying to say "this composite uses a channel as part of its configuration, but the exact channel that is used can be set by the assembler when the composite is used as the implementation of some higher level component" So today: <composite name=.....> <property name="foo" type="xxx"> <value/> </property> <component name="bar"> <implementation ..../> <property name="xxx" source="$foo"/> </component> </composite> This ensures that the composite has a property "foo" in its componentType, which is thus settable when the composite is used as the implementation of some component. However, there is a value declared and so if the using component does not set a value for that property, the composite will use that value as a default. OK, so let's now turn to Event Processing and Channels: <composite name="CompositeX"...> <consumer name="Bar_Handling" promotes="Component2/FooHandling"/> <component name="Component1"> <implementation.java class="org.example.Component1Impl"/> <producer name="Foo_Events" target="ChannelA"/> </component> <component name="Component2"> <implementation.java class="org.example.Component3Impl"/> <consumer name="Foo_Handling" source="ChannelA"/> </component> <channel name="ChannelA" externallySettable="true"/> </composite> Here is a simple composite with 2 components and a channel. I've added a @externallySettable attribute to the channel - what I intend this to mean is something along the lines of "this channel can be configured by the component that uses this composite as an implementation". The using component might look something like this: <component name="HigherComponent"> <implementation.composite name="CompositeX"/> <consumer name="Bar_Handling" source="ChannelZ"/> <configureChannel channelName="ChannelA" useChannel="ChannelW"/> </component> ... <channel name="ChannelW"/> ... <channel name="ChannelZ"/> So, "HigherComponent" does its usual configuration of the <consumer/> exposed by the composite CompositeX, but now in addition it does some configuration of the externallySettable channel that the composite also exposes - setting that channel to "ChannelW", which is declared in the higher composite. In this case "ChannelA" in the lower composite is simply overridden and replaced by "ChannelW". One big problem that I have with this is that it makes implementation.composite not quite the same as implementation.xxx eg implementation.java, since these other types will not have replaceable channels of this type. I don't like non-uniformity of the componentType and lack of replaceability of one implementation with another. Perhaps this calls for an alternative approach which makes it plain that these things are unique to composites, by placing the configuration into the <implementation.composite/> element, like this: <component name="HigherComponent"> <implementation.composite name="CompositeX"> <configureChannel channelName="ChannelA" useChannel="ChannelW"/> <implementation.composite> <consumer name="Bar_Handling" source="ChannelZ"/> </component> Well, enough ramblings of the confused for now - what do you think of this direction? Yours, Mike. Strategist - Emerging Technologies, SCA & SDO. Co Chair OASIS SCA Assembly TC. IBM Hursley Park, Mail Point 146, Winchester, SO21 2JN, Great Britain. Phone & FAX: +44-1962-818014 Mobile: +44-7802-467431 Email: Unless stated otherwise above: IBM United Kingdom Limited - Registered in England and Wales with number 741598. Registered office: PO Box 41, North Harbour, Portsmouth, Hampshire PO6 3AU
← Prev in month
← Prev in thread
Next in thread →
Next in month →