On 15/04/13 22:54, Henning Andersen wrote:
> The main reason an interface would change from consumer to provider is
> if the fact that it is a consumer interface is a bug that needs
> correction. Since the current proposal is to make consumer type the
> default, it is likely that developers will forget to add the
> @ProviderType annotation. There is no build failure and the code works
> perfectly when tested, so the code might be released with the bug present.
>
> Suppose we have
>
> public interface Model {
> public String getSomeField();
> }
>
> out in version 1.0. With the current default applied, clients
> implementing the interface would have imports saying
> version:="[1.0;2.0)". Now we realize this was a mistake (perhaps we want
> to add another method). Changing Model to a @ProviderType cannot be done
> in version 1.1, since if there were any old clients implementing it,
> they would break when a method is added.
So?
You just remove this one and use a different name with the proper
annotation.
>
> Now consider
>
> public interface Listener {
> public String handle();
> }
>
> out in version 1.0. For a moment, assume that provider type is default,
> ie. the Listener has a bug in that it was not declared @ConsumerType.
> Clients implementing the interface would get imports saying
> version:="[1.0,1.1)". Adding the missing @ConsumerType annotation can be
> safely done in version 1.1 (at least relative to versions). It could
> even be done in version 1.0.1, since the API did not change.
Same as above
>
> So it is easier to go from provider type to consumer type than from
> consumer type to provider type.
>
> Best regards,
>
> Henning
>
>
>
> On Mon, Apr 15, 2013 at 10:30 PM, Neil Bartlett <[email protected]
> <mailto:[email protected]>> wrote:
>
> Predictably, I disagree.
>
> On Mon, Apr 15, 2013 at 8:46 PM, Henning Andersen
> <[email protected] <mailto:[email protected]>> wrote:
>
> Regarding 2 and 3 below, my point is that a client bundle should
> declare whether it is consumer or provider of an imported
> package (default consumer). With that knowledge, building a
> bundle that consumes a package from another bundle should fail
> if the client contains any implementations of provider-type
> interfaces.
>
> If the client cannot declare consumer or provider role/policy, a
> build cannot fail when a (consumer) client (by mistake)
> implements both consumer and provider types.
>
> Switching between consumer and provider policy automatically
> based on whether the client implements provider type interfaces
> is too much automation in my view. Getting a provider policy
> instead of a consumer policy unnoticed will introduce major
> problems later due to not being able to upgrade bundles
> individually.
>
>
> My experience is the opposite. Developers of component bundles will
> probably not stop to consider whether they are a consumer or a
> provider of a particular API, so there will be nothing to check.
>
> The philosophy of bnd to extract as much information as possible out
> of the code itself; hence generating Import-Package from classfile
> analysis and so on. The same applies to the consumer/provider
> relationship: it can be derived from the code using a simple check
> to see whether it implements a provider type. Although a hint is
> needed in the form of the annotation, this only needs to be done
> once in the API and is then consistently applied to all importers.
> Hence there is a greater chance of it being applied widely and
> consistently.
>
> If this is too much automation in your view, you are of course free
> to use an alternative tool.
>
>
>
> Given the above, provider type becomes the obvious default,
> since it really is the more restrictive one, clients can only
> implement a provider type interface if they are declared as
> providers of the containing package.
>
>
> Since I disagree with the premise, I cannot agree with the
> conclusion :-)
>
>
> Notice that changing an interface from provider to consumer type
> is safe in a minor version (regardless of the above), since
> clients build against the type when it was a provider type will
> be incompatible (if they implement the type). The reverse is not
> true, going from consumer to provider type will require a major
> version update of the package. This again favors that provider
> type is the default.
>
>
> I don't understand this at all. How can an interface change from
> provider to consumer type or vice versa? This is an intrinsic
> characteristic of the interface; if it changes then it just isn't
> the same interface. It would be a major change in all cases.
>
>
> Regarding the annotation indirection, defining the ability to
> use a different annotation scheme in the spec could free us from
> problems getting the consumer/provider type annotation right
> (plus this would be the only osgi-dependency for most of our
> code). In our case, we do have a hard rule that certain
> annotations dictate consumer type. The easiest way to enforce
> this would be to declare it on our annotation(s) so that
> developers only need to apply the one annotation, not both. The
> other way we have is to add a compilation check ourselves that
> validates that the rule is not broken.
>
>
> Sounds like a case of "everything can be solved with one more level
> of indirection". Again, why go down the rabbit hole of
> meta-annotations when you can already apply your tool's own
> interpretation to the existing (proposed) annotations?
>
> Neil
>
>
>
> Thanks,
>
> Henning
>
>
>
> On Mon, Apr 15, 2013 at 9:46 AM, Peter Kriens
> <[email protected] <mailto:[email protected]>> wrote:
>
> There are a number of issues with this opinion:
>
> 1) The whiteboard pattern in general requires a consumer
> type. So it is absolutely NOT the normal case to be a
> Provider Type, look at the OSGi compendium. I do not think
> there is any package without a Consumer Type.
>
> 2) The frequency of Consumer type/Provider type is
> irrelevant since they're aggregated in the package. Assuming
> everything is a Provider Type will break any client when one
> of the Consumer type changes, regardless of their ratio.
>
> 3) The package level provide: directive was a hack to make
> some of this stuff work when there are no Consumer/Provider
> Type annotations. In the future bnd should detect this
> information from the annotations because that is less error
> prone. And though it might be useful on imports, its primary
> intention is on the export.
>
> 4) It is another example, pervasive in enterprise software,
> of being 'nice' by trying to hide reality (Damping anyone?)
> because it is 'easier'. You first make it right, then make
> it easier. The other way around usually ends up in trading
> development time for lots of debug time. In general it is
> good to be lazy as a developer but it should never cause
> solutions that are not correct all the time. In the embedded
> world, these kind of suggestions would be considered, well,
> eh, flabbergasting :-)
>
> About the indirection of annotated annotations, this seems
> like things become a lot harder to read. I also expect that
> it will result in the proposed effect of 'well most of the
> time this existing annotation is ...', having the same
> problems as sketched before. I would suggest to keep it
> highly cohesive and simple.
>
> Kind regards,
>
> Peter Kriens
>
>
>
> On 14 apr. 2013, at 21:26, Henning Andersen wrote:
>
>> I certainly agree with Emily that having a default of
>> @ProviderType is sensible, since the normal case for most
>> APIs is to call methods on it, not to implement interfaces
>> of it.
>>
>> bnd already has a similar default regarding its imports,
>> where clients should specify provide:=true when the client
>> is a provider of the API.
>>
>> I think this makes perfect sense also from a tooling
>> standpoint, in that a tool could break the build if a
>> client tries to implement a @ProviderType interface
>> without having declared provide:=true on the corresponding
>> import statement. That way, there is no unsafety (except
>> naturally purely semantic changes to implementation).
>>
>> A sidenote on the RFC 197: I think naming these
>> annotations more explicitly like "ProviderImplemented" and
>> "ConsumerImplemented" would reduce confusion on which to
>> use when. Also, it would be really nice if the RFC would
>> allow specifying other annotations as having the same
>> semantics, for instance by again annotating those
>> annotations. Allowing us to write:
>>
>> @MyCustomAnnotation
>> public interface Xyz {}
>>
>> and giving provider or consumer role to the interface with
>> the annotation. We certainly have cases where this would
>> allow us to not add yet another annotation to all our
>> consumer implemented interface.
>>
>> Best Regards,
>>
>> Henning
>>
>>
>>
>> On Sun, Apr 14, 2013 at 4:17 PM, Neil Bartlett
>> <[email protected] <mailto:[email protected]>> wrote:
>>
>>
>> On Sun, Apr 14, 2013 at 2:38 PM, BJ Hargrave
>> <[email protected] <mailto:[email protected]>> wrote:
>>
>> > And even that guess is not really safe. I always
>> use the following
>> > example to explain. If you have an interface A:
>> >
>> > /* version 1.0 */
>> > interface A {
>> > /* returns true in a certain condition */
>> > boolean check();
>> > }
>> >
>> > And in a new version, this interface has been
>> changed like this:
>> >
>> > /* version ??? */
>> > interface A {
>> > /* returns false in a certain condition */
>> > boolean check();
>> > }
>> >
>> > Then, even though the method signature has not
>> changed in any way,
>> > the semantics of this interface have changed in
>> an incompatible way
>> > and a major bump in versioning is required.
>> There is just no way
>> > tools are going to pick up on this as long as
>> they're just based on
>> > Java (byte)code, you actually need to understand
>> the documentation
>> > to understand this. So this is another instance
>> where you might be
>> > in for some unpleasant surprises if you blindly
>> use the output of
>> > such versioning tools.
>>
>> Yes. Tools can only analyze syntactic changes to
>> find semantic differences. Other (non-syntactic)
>> semantic changes need humans to participate in the
>> version change decision.
>>
>>
>> The conclusion seems to be that tools will differ in
>> their approach to interpreting defaults. Tools in the
>> future could even attempt to go further and analyze
>> actual method behaviour in addition to signatures.
>> This is fine because RFC 197 does not place any
>> constraints on tool developers, it merely defines the
>> existence and meaning of the @Consumer/ProviderType
>> annotations.
>>
>>
>>
>> --
>>
>> *BJ Hargrave*
>>
>> Senior Technical Staff Member, IBM
>> OSGi Fellow and CTO of the _OSGi Alliance_
>> <http://www.osgi.org/>_
>> [email protected]_ <mailto:[email protected]>
>>
>> office: +1 386 848 1781 <tel:%2B1%20386%20848%201781>
>> mobile: +1 386 848 3788 <tel:%2B1%20386%20848%203788>
>>
>>
>>
>>
>> _______________________________________________
>> OSGi Developer Mail List
>> [email protected] <mailto:[email protected]>
>> https://mail.osgi.org/mailman/listinfo/osgi-dev
>>
>>
>>
>> _______________________________________________
>> OSGi Developer Mail List
>> [email protected] <mailto:[email protected]>
>> https://mail.osgi.org/mailman/listinfo/osgi-dev
>>
>>
>> _______________________________________________
>> OSGi Developer Mail List
>> [email protected] <mailto:[email protected]>
>> https://mail.osgi.org/mailman/listinfo/osgi-dev
>
>
> _______________________________________________
> OSGi Developer Mail List
> [email protected] <mailto:[email protected]>
> https://mail.osgi.org/mailman/listinfo/osgi-dev
>
>
>
> _______________________________________________
> OSGi Developer Mail List
> [email protected] <mailto:[email protected]>
> https://mail.osgi.org/mailman/listinfo/osgi-dev
>
>
>
> _______________________________________________
> OSGi Developer Mail List
> [email protected] <mailto:[email protected]>
> https://mail.osgi.org/mailman/listinfo/osgi-dev
>
>
>
>
> _______________________________________________
> OSGi Developer Mail List
> [email protected]
> https://mail.osgi.org/mailman/listinfo/osgi-dev
>
--
Ferry Huberts
_______________________________________________
OSGi Developer Mail List
[email protected]
https://mail.osgi.org/mailman/listinfo/osgi-dev