On May 3, 2012, at 2:47 PM, Marius Dumitru Florea wrote: > On Thu, May 3, 2012 at 10:47 AM, Vincent Massol <[email protected]> wrote: >> Hi devs, >> >> We have recently voted a rule where we said that we will do the following: >> * Always deprecate APIs >> * Always move them to Legacy modules >> * And when there's a technical issue to moving stuff to the Legacy module, >> only then, send a VOTE to remove an API >> (see http://markmail.org/message/tino4ngttflc5i3s). >> >> This means that from now on (starting on 26th of April 2012) we're not >> allowed to put excludes in CLIRR. >> >> However I've seen that we have added some CLIRR excludes after the vote was >> passed. >> >> I believe that the main issue we have is for "young" APIs that are not >> considered stable. >> >> Proposal 1: Internal package >> ========= >> >> * Young APIs must be located in the "internal" package till they become >> stable. I propose "internal" to reuse an existing package that we filter >> when testing for CLIRR. "internal" means that users should not use this API >> because it's considered unstable and can change at any time. >> * When a Young API is considered stable enough and we want to open it to >> public consumption then we move it from "internal" to its target package >> (that's easy to with IDEs). From that point forward any changes to them goes >> through the standard mechanism of deprecation/legacy. > >> * If we want to add a new method to an existing public API then this should >> not be considered a "young" API. It's just an addition to an existing API >> and thus goes directly to the deprecation/legacy cycle. > > It's not clear for me how we can keep backward compatibility when > adding a new method to an interface. What do you put in legacy?
Yep, I have no solution for this except adding a new interface that extends the old one and adds new APIs which means doing an instanceof in code requiring access to the new methods… The other idea but this is a bit science-fiction would to make the xwiki runtime a "polymorphic runtime" (™) ;) This means: * At runtime, use Byteman or a tool that can change bytecode and when loading a Class inject behavior. For example if a Job class had a new method MMM added, loading a class implementing Job would add a default implementation for MMM if such a method doesn't already exist. In short this means bringing our compile time aspects to runtime. That's probably not very easy to do. Ideas anyone? Thanks -Vincent >> * We need to be careful to isolate "young" APIs from public API so that >> users don't inadvertently use "young" unstable APIs by mistake. If not >> possible then directly go through the deprecation/legacy cycle. >> >> The advantage of this proposal is that it doesn't change our current >> practices and is very easy to verify through CLIRR. > > +1 > > Thanks, > Marius > >> >> Proposal 2: Experimental package >> ========= >> >> Another possibility I can think of is to introduce a new "experimental" >> package instead of reusing the "internal" one. It has the advantage of being >> able to follow "young" APIs and ensure they don't stay in that state >> indefinitely, while still allowing the user who uses it to notice it's >> experimental. >> >> Proposal 3: Experimental Annotation >> ========= >> >> Another idea is to just use an @Experimental javadoc tag for experimental >> code. It has the advantage of using the target package but it has drawbacks: >> * It's impossible for users to notice that they're using Experimental APIs >> since when they import a class they won't see anything that'll tell them >> they're using a "young" API >> * It's almost impossible to tell CLIRR to exclude those APIs from its >> checks. The only way to do this is to modify the source code of the CLIRR >> plugin AFAIK. Thus we would need to exclude those manually using CLIRR >> excludes and thus before we release we would need to go over the full list >> of CLIRR excludes to ensure the excludes listed are only for "young" APIs >> marked "experimental". >> >> Note that I mentioned javadoc tag and not annotation because I believe we >> need to add information about when the Experimental API was first introduced >> so that we eventually move it as a proper API by removing the Experimental >> tag. Maybe we would need a rule such as: keep that tag for less or equal to >> 3 full minor releases (i.e. 6 months). >> >> WDYT? Any other idea? >> >> Thanks >> -Vincent _______________________________________________ devs mailing list [email protected] http://lists.xwiki.org/mailman/listinfo/devs

