Tuscany
  1. Tuscany
  2. TUSCANY-3998

Provide a way to override Tuscany "system" definition.xml documents

    Details

    • Type: Improvement Improvement
    • Status: Closed
    • Priority: Minor Minor
    • Resolution: Fixed
    • Affects Version/s: Java-SCA-2.0
    • Fix Version/s: None
    • Component/s: None
    • Labels:
      None
    • Patch Info:
      Patch Available

      Description

      A Tuscany embedder may need to change certain system definitions, e.g. a bindingType or an implementationType.

      System definitions are found using the ServiceDiscovery mechanism. DefaultDefinitionsExtensionPoint looks for jars/bundles that have a META-INF/services/org.apache.tuscany.sca.definitions.xml.Definitions file.

      definitionsDeclarations = registry.getServiceDiscovery().getServiceDeclarations(DEFINITIONS_FILE);

      This collects all definitions documents in the runtime. There is no way to override one definitions document with another.

      I am attaching a patch to address this. It changes the getServiceDeclarations() call to get declarations in ranked order. When processing the returned declarations, it now processes only the first resource with a given path.

      The embedder's service declaration must use the same resource name as the Tuscany definition it replaces and it must have a higher ranking attribute.

        Activity

        Hide
        ant elder added a comment -

        Patch applied, thanks for the code Greg.

        Show
        ant elder added a comment - Patch applied, thanks for the code Greg.
        Hide
        Greg Dritschler added a comment -

        I discovered a problem with the original patch.
        EquinoxServiceDiscover$ServiceDeclarationImpl.getResource() uses Bundle.getResource() to find a resource. This looks at imported packages first. Since it is likely the embedder's jar is importing the Tuscany package, this will get the Tuscany version of the resource which is exactly what we don't want.

        I have updated the patch with a change to EquinoxServiceDiscover$ServiceDeclarationImpl.getResource() to use Bundle.getEntry() which looks in the bundle only. If that fails, then it tries Bundle.getResource() for compatibility.

        Show
        Greg Dritschler added a comment - I discovered a problem with the original patch. EquinoxServiceDiscover$ServiceDeclarationImpl.getResource() uses Bundle.getResource() to find a resource. This looks at imported packages first. Since it is likely the embedder's jar is importing the Tuscany package, this will get the Tuscany version of the resource which is exactly what we don't want. I have updated the patch with a change to EquinoxServiceDiscover$ServiceDeclarationImpl.getResource() to use Bundle.getEntry() which looks in the bundle only. If that fails, then it tries Bundle.getResource() for compatibility.
        Hide
        ant elder added a comment -

        Patches applied, thanks for the fix Greg.

        Show
        ant elder added a comment - Patches applied, thanks for the fix Greg.

          People

          • Assignee:
            ant elder
            Reporter:
            Greg Dritschler
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development