Before I post this on the Wiki or proceed any further, I would like your
comments on the following..:
The problem is around the existing language syntax which does not allow
us to properly validate a configuration through a schema. Let me take
the filter mediator as an example, and our configuration language states
the following :
<filter (source="xpath" regex="string") | xpath="xpath"> mediator+
</filter>
Shall we change this to
<filter xpath="xpath" [regex="string"]> mediator+ </filter> instead, so
that the schema provided for this mediator could be used to validate a
config using it?
The same goes for a few mediators as shown in the attached schema, and a
sample file which shows some examples with the proposed syntax.
asankha
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:synapse="http://ws.apache.org/ns/synapse" targetNamespace="http://ws.apache.org/ns/synapse" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:complexType name="mediator_sequence">
<xs:choice maxOccurs="unbounded">
<xs:element ref="synapse:send"/>
<xs:element ref="synapse:drop"/>
<xs:element ref="synapse:log"/>
<xs:element ref="synapse:makefault"/>
<xs:element ref="synapse:transform"/>
<xs:element ref="synapse:header"/>
<xs:element ref="synapse:filter"/>
<xs:element ref="synapse:switch"/>
<xs:element ref="synapse:validate"/>
<xs:element ref="synapse:set-property"/>
<xs:element ref="synapse:class"/>
<xs:element ref="synapse:in"/>
<xs:element ref="synapse:out"/>
<xs:element ref="synapse:sequenceref"/>
</xs:choice>
</xs:complexType>
<xs:element name="synapse">
<xs:complexType>
<xs:sequence>
<xs:element name="definitions" minOccurs="0">
<xs:complexType>
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:choice>
<xs:element name="sequence">
<xs:complexType>
<xs:complexContent>
<xs:extension base="synapse:mediator_sequence">
<xs:attribute name="name" use="required"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element ref="synapse:endpoint"/>
<xs:element name="set-property">
<xs:complexType>
<xs:attribute name="name" use="required"/>
<xs:attribute name="value" use="required"/>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="rules" type="synapse:mediator_sequence"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="send">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="endpointref">
<xs:complexType>
<xs:attribute name="ref" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="endpoint">
<xs:complexType>
<xs:attribute name="address" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
<xs:element name="drop"/>
<xs:element name="log">
<xs:complexType>
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="property" type="synapse:property_type"/>
</xs:sequence>
<xs:attribute name="level">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="simple"/>
<xs:enumeration value="headers"/>
<xs:enumeration value="full"/>
<xs:enumeration value="custom"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="seperator" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element name="makefault">
<xs:complexType>
<xs:sequence>
<xs:element name="code">
<xs:complexType>
<xs:attribute name="value" type="xs:string" use="required"/>
<xs:attribute name="isexpression">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="true"/>
<xs:enumeration value="false"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
<xs:element name="reason">
<xs:complexType>
<xs:attribute name="value" type="xs:string" use="required"/>
<xs:attribute name="isexpression">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="true"/>
<xs:enumeration value="false"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
<xs:element name="node" type="xs:string" minOccurs="0"/>
<xs:element name="role" type="xs:string" minOccurs="0"/>
<xs:element name="detail" type="xs:anyType" minOccurs="0"/>
</xs:sequence>
<xs:attribute name="version">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="soap11"/>
<xs:enumeration value="soap12"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
<xs:element name="transform">
<xs:complexType>
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="property" type="synapse:property_type"/>
</xs:sequence>
<xs:attribute name="xslt" type="xs:anyURI"/>
<xs:attribute name="xquery" type="xs:anyURI"/>
</xs:complexType>
</xs:element>
<xs:element name="header">
<xs:complexType>
<xs:attribute name="name" type="xs:QName" use="required"/>
<xs:attribute name="action">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="add"/>
<xs:enumeration value="remove"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
<xs:element name="filter">
<xs:complexType>
<xs:complexContent>
<xs:extension base="synapse:mediator_sequence">
<xs:attribute name="xpath" type="xs:string" use="required"/>
<xs:attribute name="regex" type="xs:string" use="optional"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element name="switch">
<xs:complexType>
<xs:sequence>
<xs:sequence maxOccurs="unbounded">
<xs:element name="case">
<xs:complexType>
<xs:complexContent>
<xs:extension base="synapse:mediator_sequence">
<xs:attribute name="regex" type="xs:string" use="required"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:element name="default" type="synapse:mediator_sequence" minOccurs="0"/>
</xs:sequence>
<xs:attribute name="source" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="validate">
<xs:complexType>
<xs:sequence>
<xs:element name="on-fail" type="synapse:mediator_sequence"/>
</xs:sequence>
<xs:attribute name="schema" type="xs:string" use="required"/>
<xs:attribute name="source" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element name="set-property" type="synapse:property_type"/>
<xs:element name="class">
<xs:complexType>
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="property" type="synapse:property_type"/>
</xs:sequence>
<xs:attribute name="name"/>
</xs:complexType>
</xs:element>
<xs:element name="sequence">
<xs:complexType>
<xs:complexContent>
<xs:extension base="synapse:mediator_sequence"/>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element name="in">
<xs:complexType>
<xs:complexContent>
<xs:extension base="synapse:mediator_sequence"/>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element name="out">
<xs:complexType>
<xs:complexContent>
<xs:extension base="synapse:mediator_sequence"/>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:complexType name="property_type">
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="value" type="xs:string" use="required"/>
<xs:attribute name="isexpression">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="true"/>
<xs:enumeration value="false"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
<xs:element name="endpoint">
<xs:complexType>
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="address" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element name="sequenceref">
<xs:complexType>
<xs:attribute name="ref" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<synapse xmlns="http://ws.apache.org/ns/synapse" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ws.apache.org/ns/synapse suggested-synapse.xsd">
<definitions>
<endpoint name="e1" address="a"/>
<sequence name="s1">
<send/>
</sequence>
<endpoint name="e2"/>
<set-property value="v" name="p1"/>
<sequence name="b">
<send/>
<log/>
</sequence>
<set-property value="v" name="p2"/>
</definitions>
<rules>
<send/>
<send>
<endpointref ref="e1"></endpointref>
</send>
<send>
<endpoint address="a"/>
</send>
<log/>
<log level="custom">
<property value="v" name="n1"/>
<property value="v" name="n2" isexpression="true"/>
</log>
<filter xpath="x">
<log/>
</filter>
<filter xpath="x" regex="xx">
<log/>
<send/>
</filter>
<drop/>
<header name="h1"/>
<header name="h2" action="remove"/>
<makefault>
<code value="v"/>
<reason value="v"/>
</makefault>
<makefault version="soap11">
<code value="v" isexpression="true"/>
<reason value="v"/>
<node>xx</node>
<role>xx</role>
<detail>xxx</detail>
</makefault>
<set-property value="v" name="p1"/>
<set-property value="v" name="p2" isexpression="true"/>
<in>
<send/>
<log/>
</in>
<out>
<send/>
<log/>
</out>
<switch source="xx">
<case regex="x">
<send/>
</case>
<case regex="xxx">
<log/>
</case>
</switch>
<switch source="xx">
<case regex="x">
<send/>
</case>
<case regex="xxx">
<log/>
</case>
<default>
<log/>
</default>
</switch>
<sequenceref ref="s1"/>
<sequenceref ref="s2"/>
</rules>
</synapse>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]