team1 has a dependency com.company.resources.spi.Team1Provider which can be in a separate module (say com.company.resources module) and the provider implementation will be in team4.  i.e. team1 and team4 both requires com.company.resources module.

Mandy

On 1/12/18 11:14 PM, Romain Manni-Bucau wrote:
Hi Mandy,

3 is the blocker because it creates a dependency to team4 which shouldnt be visible. It is provided as a container service if you want and other teams have no dependency on it. This means if we need to upgrade team4 code then the operation team does it and team1, 2, 3 are not affected at all.

In terms of costs it must stay the same. I can imagine a light SPI but it already breaks this "container service" rule, plus it requires to define hundreds of new classes.

Using a custom classloader with no named module can be a short term workaround but is broken if modules use module-info only to define a SPI for instance.


Le 13 janv. 2018 00:21, "mandy chung" <mandy.ch...@oracle.com <mailto:mandy.ch...@oracle.com>> a écrit :

    Let me try to see if I understand your situation correctly.


    On 1/12/18 12:59 PM, Romain Manni-Bucau wrote:
    All are com.company.*



    Assuming service packages use a resource bundle.


    team1, team2, team3 all uses a resource bundle. Let's say
    com.company.team1.service calls
    ResourceBundle.getBundle("com.company.resources.Team1").



        Now translations are in http://i18n.company.com/translations
        <http://i18n.company.com/translations> and the team
        providing the key/values is team4 with no access to team1,
        team2 and team3 sources normally.


    team4 provides the key/values of "com.company.resources.Team1". 
    team4 and team1 will agree on the content of this resource bundle
    e.g. key names and the value if any text format.

    I assume your ResourceBundleControlProvider implementation returns
    a Control instance that implements newBundle method to return a
    ResourceBundle for
    "com.company.resources.Team1".

    One migration solution is to use ResourceBundleProvider.  The
    steps it takes are
    (1) define a SPI for each bundle named
    com.company.resources.spi.Team1Provider
    (2) reuse your existing Control.newBundle implementation to implement
    ResourceBundleProvider::getBundle to return the requested
    ResourceBundle. This assumes in team4 module
    (3) when migrating team1.jar to a named module, the module
    definition declares uses com.company.resources.spi.Team1Provider

    team4 module can have one single provider implementation for more
    than one resource bundle.

    Does this help?  I can see it takes some amount of work.  How many
    resource bundles do your application have?  It'd be good if you
    give a try and send us feedback.

    Mandy



Reply via email to