The OASIS spec allows extension types such as bindings and
implementations to describe what intents they allwaysProvide and
mayProvide. There is a wrinkle here that there isn't a way to describe
which mayProvides intents are provided by default if no further
configuration is provided. For example, consider the bindingType
element from the definitions.xml file for binding.ws

    <sca:bindingType type="sca:binding.ws"
                     mayProvide="sca:SOAP sca:SOAP.v1_1 sca:SOAP.v1_2
tuscany:MTOM sca:asyncInvocation"
                     alwaysProvides=""/>

SOAP.v1_1 and SOAP.v1_2 are mayProvides because it is either/or.
However with no configuration binding.ws will use SOAP.v1_1. So
SOAP.v1_1 is effectively the default.

I seem to feel that this has come up before but it came up this time
because I added function to read <requires> attributes in WSDL files.
Otest POL_4032 defines a reference with a WSDL with

<sca:requires intents="sca:SOAP.v1_1"/>

The reference targets a service that defines no intends but specified
binding.ws. New code that I added to address
https://issues.apache.org/jira/browse/TUSCANY-3959, where we need to
take mayProvides intents into account when matching references with
services fails because the reference has the SOAP.v1_1 intent but the
service doesn't. The service binding implements SOAP.v1_1 by default
but is not explicit about the fact.

I've been toying with adding a new defaultIntents operation to the
interface but in the first instance I've change the binding.ws binding
builder to added the default intent as follows...

        boolean addDefaultSOAPIntent = true;

        for(Intent intent : ((PolicySubject)binding).getRequiredIntents()){
            if (intent.getName().getLocalPart().equals("SOAP.v1_1")){
                addDefaultSOAPIntent = false;
                break;
            }
            if (intent.getName().getLocalPart().equals("SOAP.v1_2")){
                addDefaultSOAPIntent = false;
                break;
            }
        }

        if (addDefaultSOAPIntent){
            Definitions systemDefinitions = context.getDefinitions();
            if (systemDefinitions != null){
                BindingType bindingType =
systemDefinitions.getBindingType(binding.getType());
                Intent defaultIntent = null;
                for (Intent intent : bindingType.getMayProvidedIntents()){
                    if (intent.getName().getLocalPart().equals("SOAP.v1_1")){
                        defaultIntent = intent;
                    }
                }

                if (defaultIntent != null){

((PolicySubject)binding).getRequiredIntents().add(0, defaultIntent);
                }
            }
        }

This seemed like a more flexibly way of achieving the required result.
In theory and set of default intents or policy sets can be added in a
bindings builder.

Anyhow I felt the need to at least document the the progress of this
rather contrived change and invite comments.

Simon

-- 
Apache Tuscany committer: tuscany.apache.org
Co-author of a book about Tuscany and SCA: tuscanyinaction.com

Reply via email to