For our current project we've done this, extending the concept a bit
further given experience from how good ol' Oracle Headstart for Forms
did it.
We've created the following layers:
a) An organisation wide custom set of ADF BC Impl's (call it common)
stored in it's own Jar
b) For each application they also get their own custom ADF BC Impl
layer which inherits from the organisation level - these are contained
within the application's ADF BC model project under their own package
c) And finally the application itself, the EOs/VOs/etc inherit from
the application level Impl's
The general intent is, the organisation wide level Impl (a) is for
common code to be shared for all applications, but not bug fixes and
workarounds. Instead the application level custom Impl's (b) are
intended for fixes to get around ADF BC framework bugs, and any common
code specific to the application at hand only. Our reasoning for not
putting bug fixes/workarounds in (a) is that eventually (hopefully?)
that the org level libraries will be used by all sorts of ADF
applications potentially running on different versions of ADF. For
some applications bug fixes/workarounds will apply, but not all, as
the bug fix may only be applicable to certain versions of ADF. As
such it is up to each application to provide a fix for the ADF
framework in it's own custom ADF BC Impl layer (b). This may result
in duplicate code across applications, but something we're willing to
wear. The alternative is keeping all applications up to date which
creates a large regression testing burden and an unwanted versioning
dependency between disparate applications. I'm vary wary of this last
scenario, I've seen organisations get into huge knots when you create
these disparate system dependencies.
In answering one of John's question, while we've set this structure up
in our 11g application, in specifically considering bug fixes/
workaround we've yet to encounter any where overriding the base
functionality is required. In my experience from a number of ADF
applications, there has only been once in a 10.1.2 application (or was
that 9.0.4, I forget?) where I made use of this structure for a bug
workaround. That may sound minimal, but I bet I would have been
screaming with the mess I would have gotten into if I hadn't had the
custom Impl's already setup.
Alternatively if we consider common code, in our current project we
have created custom passivateState and activateState functions (as per
section 39-7 of the Fusion dev guide
http://download.oracle.com/docs/cd/E12839_01/web.1111/b31974/bcstatemgmt.htm#sm0495)
at the org wide level AppModuleImpl which we can see being reused by a
number of our applications in the future.
Cheers,
CM.