It's also possible in XINS to defined a group of
input
or output
parameters. There
are 4 kinds of group:
inclusive-or
If a group is inclusive-or
then at least
one of the parameters defined in the param-ref
should have a value.
exclusive-or
If a group is exclusive-or
then one and
only one of the parameters defined in the
param-ref
should have a value.
all-or-none
If a group is all-or-none
then either none
of the of the parameters defined in the param-ref
should have a value or all.
not-all
If a group is not-all
then at least one of
the parameters defined in the param-ref
should
not have a value.
Example:
<input> <param name="birthYear" required="false" type="_int32"> <description>The birth date's year.</description> </param> <param name="birthMonth" required="false" type="_int32"> <description>The birth date's month.</description> </param> <param name="birthDay" required="false" type="_int32"> <description>The birth date's day.</description> </param> <param name="birthCountry" required="false" type="_text"> <description>The country where the person is born.</description> </param> <param name="birthCity" required="false" type="_text"> <description>The city where the person is born.</description> </param> <param name="age" required="false" type="Age"> <description>An example of input for a int8 type with a minimum and maximum.</description> </param> <!-- One of the two parameters must be filled but not both --> <param-combo type="exclusive-or"> <param-ref name="birthYear" /> <param-ref name="age" /> </param-combo> <!-- At least one of the two parameters must be filled --> <param-combo type="inclusive-or"> <param-ref name="birthCountry" /> <param-ref name="birthCity" /> </param-combo> <!-- These parameters must be filled together or not filled at all --> <param-combo type="all-or-none"> <param-ref name="birthYear" /> <param-ref name="birthMonth" /> <param-ref name="birthDay" /> </param-combo> </input>
If the condition is not met, XINS will return a result with an
_InvalidRequest
error code if the request does not
match the input param-combo
or an
_InvalidReponse
error code if the result does not
match the output param-combo
.
You can find an example using the groups in the function
demo\xins-project\apis\allinone\spec\ParamCombo.fnc
.
It is also possible to defined similar constraint on attributes of
elements defined in the data section (See next chapter). This is done
using the attribute-combo
and the
attribute-ref
elements.
Example:
<data> <contains> <contained element="person" /> </contains> <element name="person"> <description>A person</description> <attribute name="birthCountry" required="false" type="_text"> <description>The country where the person is borned.</description> </attribute> <attribute name="birth-city" required="false" type="_text"> <description>The city where the person is borned.</description> </attribute> <attribute name="age" required="false" type="Age"> <description>An example of input for a int8 type with a minimum and maximum.</description> </attribute> <!-- At least one of the two attributes must be filled --> <attribute-combo type="inclusive-or"> <attribute-ref name="birthCountry" /> <attribute-ref name="birth-city" /> </attribute-combo> </element> </data>
It is also possible to define constraints based on the value of one parameter (and not only on whether the parameter is set or not). This is done by added the value attribute to the param-ref element or attribute-ref element for attribute-combo.
Example:
<input> <param name="salutation" required="true" type="Salutation"> <description>The gender of the person.</description> </param> <param name="maidenName" required="false" type="_text"> <description>The maiden name.</description> </param> <!-- If the salutation is Madam, the maiden name is required --> <param-combo type="inclusive-or"> <param-ref name="salutation" value="Madam" /> <param-ref name="maidenName" /> </param-combo> </input>
The description of the type associated with the param-combo is then a bit different:
inclusive-or
If the parameter has the defined value then the second parameter is required.
exclusive-or
If the parameter has the value then the other parameter should not be filled, otherwise the second parameter is required.
all-or-none
If the parameter has the value then the others parameters are required, otherwise the other parameters should not be set.
not-all
If the parameter has the value then the other parameters should not be set.
For a better understanding, look at the
ParamComboValue.fnc
function provided in the
allinone
API.
It is also possible to have more than one
param-ref
with a value in the same
param-combo
.