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]

Reply via email to