﻿<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="GatewayConfiguration"
           targetNamespace="http://waher.se/Schema/GatewayConfiguration.xsd"
           elementFormDefault="qualified"
           xmlns="http://waher.se/Schema/GatewayConfiguration.xsd"
           xmlns:mstns="http://waher.se/Schema/GatewayConfiguration.xsd"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">

	<xs:element name="GatewayConfiguration">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="ApplicationName" type="xs:string">
					<xs:annotation>
						<xs:documentation>Name of application.</xs:documentation>
					</xs:annotation>
				</xs:element>
				<xs:element name="DefaultPage" minOccurs="1" maxOccurs="unbounded">
					<xs:annotation>
						<xs:documentation>Default web page.</xs:documentation>
					</xs:annotation>
					<xs:complexType>
						<xs:simpleContent>
							<xs:extension base="xs:string">
								<xs:attribute name="host" type="xs:string" use="optional">
									<xs:annotation>
										<xs:documentation>To which host name the default page relates to.</xs:documentation>
									</xs:annotation>
								</xs:attribute>
							</xs:extension>
						</xs:simpleContent>
					</xs:complexType>
				</xs:element>
				<xs:element name="MutualTls" minOccurs="0" maxOccurs="1">
					<xs:annotation>
						<xs:documentation>Specifies configuration for Mutual TLS (or mTLS) for the Web Servier.</xs:documentation>
						<xs:documentation>Any settings affect all domains.</xs:documentation>
					</xs:annotation>
					<xs:complexType>
						<xs:sequence>
							<xs:element name="Port" minOccurs="0" maxOccurs="unbounded">
								<xs:complexType>
									<xs:simpleContent>
										<xs:extension base="PortNumber">
											<xs:attribute name="clientCertificates" type="ClientCertificates" use="optional" default="NotUsed">
												<xs:annotation>
													<xs:documentation>Port specific override, if client certificates are requested during TLS handshake.</xs:documentation>
												</xs:annotation>
											</xs:attribute>
											<xs:attribute name="trustCertificates" type="xs:boolean" use="optional" default="true">
												<xs:annotation>
													<xs:documentation>Port specific override, if certificates should be trusted, even if they don't validate.</xs:documentation>
												</xs:annotation>
											</xs:attribute>
										</xs:extension>
									</xs:simpleContent>
								</xs:complexType>
							</xs:element>
						</xs:sequence>
						<xs:attribute name="clientCertificates" type="ClientCertificates" use="optional" default="NotUsed">
							<xs:annotation>
								<xs:documentation>If client certificates are requested during TLS handshake, by default.</xs:documentation>
							</xs:annotation>
						</xs:attribute>
						<xs:attribute name="trustCertificates" type="xs:boolean" use="optional" default="true">
							<xs:annotation>
								<xs:documentation>If certificates should be trusted, even if they don't validate, by default.</xs:documentation>
							</xs:annotation>
						</xs:attribute>
					</xs:complexType>
				</xs:element>
				<xs:element name="ContentEncodings" minOccurs="0" maxOccurs="1">
					<xs:annotation>
						<xs:documentation>Specifies rules for content-encoding (compression) via the web server.</xs:documentation>
					</xs:annotation>
					<xs:complexType>
						<xs:sequence>
							<xs:element name="ContentEncoding" minOccurs="0" maxOccurs="unbounded">
								<xs:complexType>
									<xs:attribute name="method" type="xs:string" use="required"/>
									<xs:attribute name="dynamic" type="xs:boolean" use="optional" default="true"/>
									<xs:attribute name="static" type="xs:boolean" use="optional" default="true"/>
								</xs:complexType>
							</xs:element>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
				<xs:element name="Http2Settings" minOccurs="0" maxOccurs="1">
					<xs:annotation>
						<xs:documentation>Specifies HTTP/2-specific settings for the web server.</xs:documentation>
					</xs:annotation>
					<xs:complexType>
						<xs:attribute name="enabled" type="xs:boolean" use="optional" default="true">
							<xs:annotation>
								<xs:documentation>If HTTP/2 is enabled or not.</xs:documentation>
							</xs:annotation>
						</xs:attribute>
						<xs:attribute name="initialWindowSize" type="xs:int" use="optional" default="2500000">
							<xs:annotation>
								<xs:documentation>Initial Stream Window Size, in bytes.</xs:documentation>
							</xs:annotation>
						</xs:attribute>
						<xs:attribute name="initialConnectionWindowSize" type="xs:int" use="optional" default="5000000">
							<xs:annotation>
								<xs:documentation>Initial Connection Window Size, in bytes.</xs:documentation>
							</xs:annotation>
						</xs:attribute>
						<xs:attribute name="maxFrameSize" type="xs:int" use="optional" default="16384">
							<xs:annotation>
								<xs:documentation>Maximum Frame Size, in bytes.</xs:documentation>
							</xs:annotation>
						</xs:attribute>
						<xs:attribute name="maxConcurrentStreams" type="xs:int" use="optional" default="100">
							<xs:annotation>
								<xs:documentation>Maximum number of concurrent streams.</xs:documentation>
							</xs:annotation>
						</xs:attribute>
						<xs:attribute name="headerTableSize" type="xs:int" use="optional" default="8192">
							<xs:annotation>
								<xs:documentation>Dynamic Header Table Size, in bytes.</xs:documentation>
							</xs:annotation>
						</xs:attribute>
						<xs:attribute name="noRfc7540Priorities" type="xs:boolean" use="optional" default="false">
							<xs:annotation>
								<xs:documentation>If stream priorities, as defined in HTTP/2 RFC 7540, should not be used, in favour of priorities, as defined in RFC 9218 (used in HTTP/3).</xs:documentation>
							</xs:annotation>
						</xs:attribute>
						<xs:attribute name="profiling" type="xs:boolean" use="optional" default="false">
							<xs:annotation>
								<xs:documentation>If profiling should be enabled to analyse HTTP/2 performance.</xs:documentation>
							</xs:annotation>
						</xs:attribute>
						<xs:attribute name="sniffersPerEndpoint" type="xs:boolean" use="optional" default="false">
							<xs:annotation>
								<xs:documentation>If sniffers should be recorded in separate sub-folders based on the remote endpoint.</xs:documentation>
							</xs:annotation>
						</xs:attribute>
					</xs:complexType>
				</xs:element>
				<xs:element name="Database">
					<xs:annotation>
						<xs:documentation>Defines the use of a local file-based object database.</xs:documentation>
					</xs:annotation>
					<xs:complexType>
						<xs:attribute name="folder" type="xs:string" use="required">
							<xs:annotation>
								<xs:documentation>Folder, relative to the application data folder, where object database files will be stored.</xs:documentation>
							</xs:annotation>
						</xs:attribute>
						<xs:attribute name="defaultCollectionName" type="xs:string" use="required">
							<xs:annotation>
								<xs:documentation>Name of the collection to use, if the class definition lacks a collection definition.</xs:documentation>
							</xs:annotation>
						</xs:attribute>
						<xs:attribute name="blockSize" type="BlockSize" use="required">
							<xs:annotation>
								<xs:documentation>Number of bytes of each B-Tree block in the database.</xs:documentation>
							</xs:annotation>
						</xs:attribute>
						<xs:attribute name="blocksInCache" type="xs:positiveInteger" use="required">
							<xs:annotation>
								<xs:documentation>Number of blocks to maintain in internal memory.</xs:documentation>
							</xs:annotation>
						</xs:attribute>
						<xs:attribute name="blobBlockSize" type="BlockSize" use="required">
							<xs:annotation>
								<xs:documentation>Number of bytes of each BLOB block in the database.</xs:documentation>
							</xs:annotation>
						</xs:attribute>
						<xs:attribute name="timeoutMs" type="xs:positiveInteger" use="required">
							<xs:annotation>
								<xs:documentation>Timeout of database operations, in milliseconds.</xs:documentation>
							</xs:annotation>
						</xs:attribute>
						<xs:attribute name="encrypted" type="xs:boolean" use="required">
							<xs:annotation>
								<xs:documentation>If the database is encrypted.</xs:documentation>
							</xs:annotation>
						</xs:attribute>
						<xs:attribute name="compiled" type="xs:boolean" use="optional" default="true">
							<xs:annotation>
								<xs:documentation>If object serializers should be compiled or not.</xs:documentation>
							</xs:annotation>
						</xs:attribute>
					</xs:complexType>
				</xs:element>
				<xs:element name="Ports">
					<xs:complexType>
						<xs:sequence>
							<xs:element name="Port" minOccurs="0" maxOccurs="unbounded">
								<xs:complexType>
									<xs:simpleContent>
										<xs:extension base="PortNumber">
											<xs:attribute name="protocol" type="xs:string" use="required"/>
										</xs:extension>
									</xs:simpleContent>
								</xs:complexType>
							</xs:element>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
				<xs:element name="DefaultHttpResponseHeaders" minOccurs="0" maxOccurs="1" type="DefaultHttpResponseHeaders"/>
				<xs:element name="FileFolders" minOccurs="0" maxOccurs="1">
					<xs:complexType>
						<xs:sequence>
							<xs:element name="FileFolder" minOccurs="0" maxOccurs="unbounded">
								<xs:complexType>
									<xs:complexContent>
										<xs:extension base="DefaultHttpResponseHeaders">
											<xs:attribute name="webFolder" type="xs:string" use="required"/>
											<xs:attribute name="folderPath" type="xs:string" use="required"/>
										</xs:extension>
									</xs:complexContent>
								</xs:complexType>
							</xs:element>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
				<xs:element name="VanityResources" minOccurs="0" maxOccurs="1">
					<xs:complexType>
						<xs:sequence>
							<xs:element name="VanityResource" minOccurs="0" maxOccurs="unbounded">
								<xs:complexType>
									<xs:attribute name="regex" type="xs:string" use="required"/>
									<xs:attribute name="url" type="xs:string" use="required"/>
								</xs:complexType>
							</xs:element>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
				<xs:element name="Redirections" minOccurs="0" maxOccurs="1">
					<xs:complexType>
						<xs:sequence minOccurs="0" maxOccurs="unbounded">
							<xs:element name="Redirection">
								<xs:complexType>
									<xs:attribute name="resource" type="xs:string" use="required"/>
									<xs:attribute name="location" type="xs:string" use="required"/>
									<xs:attribute name="includeSubPaths" type="xs:boolean" use="optional" default="false"/>
									<xs:attribute name="permanent" type="xs:boolean" use="optional" default="false"/>
								</xs:complexType>
							</xs:element>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
				<xs:element name="ReverseProxy" minOccurs="0" maxOccurs="1">
					<xs:complexType>
						<xs:choice minOccurs="0" maxOccurs="unbounded">
							<xs:element name="ProxyResource">
								<xs:complexType>
									<xs:attribute name="localResource" type="xs:string" use="required"/>
									<xs:attribute name="remoteDomain" type="xs:string" use="required"/>
									<xs:attribute name="remoteFolder" type="xs:string" use="required"/>
									<xs:attribute name="remotePort" type="PortNumber" use="optional"/>
									<xs:attribute name="encrypted" type="xs:boolean" use="optional" default="false"/>
									<xs:attribute name="useSession" type="xs:boolean" use="optional" default="false"/>
									<xs:attribute name="timeoutMs" type="xs:positiveInteger" use="optional" default="10000"/>
									<xs:attribute name="privilege" type="xs:string" use="optional"/>
								</xs:complexType>
							</xs:element>
							<xs:element name="ProxyDomain">
								<xs:complexType>
									<xs:attribute name="localDomain" type="xs:string" use="required"/>
									<xs:attribute name="remoteDomain" type="xs:string" use="required"/>
									<xs:attribute name="remoteFolder" type="xs:string" use="required"/>
									<xs:attribute name="remotePort" type="PortNumber" use="optional"/>
									<xs:attribute name="encrypted" type="xs:boolean" use="optional" default="false"/>
									<xs:attribute name="useSession" type="xs:boolean" use="optional" default="false"/>
									<xs:attribute name="timeoutMs" type="xs:positiveInteger" use="optional" default="10000"/>
									<xs:attribute name="privilege" type="xs:string" use="optional"/>
								</xs:complexType>
							</xs:element>
						</xs:choice>
					</xs:complexType>
				</xs:element>
				<xs:element name="ExportExceptions" minOccurs="0" maxOccurs="1">
					<xs:complexType>
						<xs:attribute name="folder" type="xs:string" use="required"/>
					</xs:complexType>
				</xs:element>
				<xs:element name="LoginAuditor" minOccurs="0" maxOccurs="1">
					<xs:complexType>
						<xs:choice minOccurs="1" maxOccurs="unbounded">
							<xs:element name="Interval">
								<xs:complexType>
									<xs:attribute name="nrAttempts" type="xs:positiveInteger" use="required"/>
									<xs:attribute name="interval" type="PositiveDuration" use="optional"/>
								</xs:complexType>
							</xs:element>
							<xs:element name="Exception">
								<xs:complexType>
									<xs:sequence minOccurs="1" maxOccurs="unbounded">
										<xs:element name="Interval">
											<xs:complexType>
												<xs:attribute name="nrAttempts" type="xs:positiveInteger" use="required"/>
												<xs:attribute name="interval" type="PositiveDuration" use="optional"/>
											</xs:complexType>
										</xs:element>
									</xs:sequence>
									<xs:attribute name="endpoint" type="xs:string" use="required"/>
								</xs:complexType>
							</xs:element>
						</xs:choice>
					</xs:complexType>
				</xs:element>
				<xs:element name="EventSinks" minOccurs="0" maxOccurs="unbounded">
					<xs:complexType>
						<xs:choice minOccurs="0" maxOccurs="unbounded">
							<xs:group ref="EventSinks"/>
						</xs:choice>
					</xs:complexType>
				</xs:element>
			</xs:sequence>
		</xs:complexType>
	</xs:element>

	<xs:group name="EventSinks">
		<xs:choice>
			<xs:element name="TextFileEventSink">
				<xs:complexType>
					<xs:attribute name="id" type="xs:string" use="required"/>
					<xs:attribute name="fileName" type="xs:string" use="required"/>
					<xs:attribute name="deleteAfterDays" type="xs:positiveInteger" use="optional" default="7"/>
				</xs:complexType>
			</xs:element>
			<xs:element name="XmlFileEventSink">
				<xs:complexType>
					<xs:attribute name="id" type="xs:string" use="required"/>
					<xs:attribute name="fileName" type="xs:string" use="required"/>
					<xs:attribute name="transformFileName" type="xs:string" use="optional"/>
					<xs:attribute name="deleteAfterDays" type="xs:positiveInteger" use="optional" default="7"/>
				</xs:complexType>
			</xs:element>
			<xs:element name="MqttEventSink">
				<xs:complexType>
					<xs:attribute name="id" type="xs:string" use="required"/>
					<xs:attribute name="broker" type="xs:string" use="required"/>
					<xs:attribute name="port" type="PortNumber" use="optional" default="1883"/>
					<xs:attribute name="tls" type="xs:boolean" use="optional" default="false"/>
					<xs:attribute name="userName" type="xs:string" use="optional"/>
					<xs:attribute name="password" type="xs:string" use="optional"/>
					<xs:attribute name="topic" type="xs:string" use="required"/>
				</xs:complexType>
			</xs:element>
			<xs:element name="PipeEventSink">
				<xs:complexType>
					<xs:attribute name="id" type="xs:string" use="required"/>
					<xs:attribute name="pipeName" type="xs:string" use="required"/>
				</xs:complexType>
			</xs:element>
			<xs:element name="SocketEventSink">
				<xs:complexType>
					<xs:attribute name="id" type="xs:string" use="required"/>
					<xs:attribute name="host" type="xs:string" use="required"/>
					<xs:attribute name="port" type="PortNumber" use="required"/>
					<xs:attribute name="tls" type="xs:boolean" use="optional" default="false"/>
				</xs:complexType>
			</xs:element>
			<xs:element name="SyslogEventSink">
				<xs:complexType>
					<xs:attribute name="id" type="xs:string" use="required"/>
					<xs:attribute name="name" type="xs:string" use="required"/>
					<xs:attribute name="host" type="xs:string" use="required"/>
					<xs:attribute name="port" type="PortNumber" use="optional" default="514"/>
					<xs:attribute name="tls" type="xs:boolean" use="optional" default="false"/>
					<xs:attribute name="separation" use="optional" default="OctetCounting">
						<xs:simpleType>
							<xs:restriction base="xs:string">
								<xs:enumeration value="OctetCounting"/>
								<xs:enumeration value="CrLf"/>
								<xs:enumeration value="Lf"/>
								<xs:enumeration value="Null"/>
							</xs:restriction>
						</xs:simpleType>
					</xs:attribute>
				</xs:complexType>
			</xs:element>
			<xs:element name="WebHookEventSink">
				<xs:complexType>
					<xs:attribute name="id" type="xs:string" use="required"/>
					<xs:attribute name="url" type="xs:string" use="required"/>
					<xs:attribute name="maxSecondsUsed" type="xs:nonNegativeInteger" use="optional" default="0"/>
					<xs:attribute name="maxSecondsUnused" type="xs:nonNegativeInteger" use="optional" default="0"/>
					<xs:attribute name="collectOnType" type="xs:boolean" use="optional" default="false"/>
					<xs:attribute name="collectOnLevel" type="xs:boolean" use="optional" default="false"/>
					<xs:attribute name="collectOnEventId" type="xs:boolean" use="optional" default="false"/>
					<xs:attribute name="collectOnObject" type="xs:boolean" use="optional" default="false"/>
					<xs:attribute name="collectOnActor" type="xs:boolean" use="optional" default="false"/>
					<xs:attribute name="collectOnFacility" type="xs:boolean" use="optional" default="false"/>
					<xs:attribute name="collectOnModule" type="xs:boolean" use="optional" default="false"/>
				</xs:complexType>
			</xs:element>
			<xs:element name="XmppEventSink">
				<xs:complexType>
					<xs:attribute name="id" type="xs:string" use="required"/>
					<xs:attribute name="jid" type="xs:string" use="required"/>
				</xs:complexType>
			</xs:element>
			<xs:element name="EventFilter">
				<xs:complexType>
					<xs:choice minOccurs="0" maxOccurs="unbounded">
						<xs:group ref="EventSinks"/>
					</xs:choice>
					<xs:attribute name="id" type="xs:string" use="required"/>
					<xs:attribute name="debug" type="FromEventLevel" use="optional" default="None"/>
					<xs:attribute name="informational" type="FromEventLevel" use="optional" default="None"/>
					<xs:attribute name="notice" type="FromEventLevel" use="optional" default="None"/>
					<xs:attribute name="warning" type="FromEventLevel" use="optional" default="None"/>
					<xs:attribute name="error" type="FromEventLevel" use="optional" default="None"/>
					<xs:attribute name="critical" type="FromEventLevel" use="optional" default="None"/>
					<xs:attribute name="alert" type="FromEventLevel" use="optional" default="None"/>
					<xs:attribute name="emergency" type="FromEventLevel" use="optional" default="None"/>
					<xs:attribute name="eventIds" type="xs:string" use="optional"/>
				</xs:complexType>
			</xs:element>
			<xs:element name="EventQueue">
				<xs:complexType>
					<xs:attribute name="id" type="xs:string" use="required"/>
					<xs:attribute name="name" type="xs:string" use="required"/>
					<xs:attribute name="deleteAfterDays" type="xs:positiveInteger" use="optional" default="7"/>
				</xs:complexType>
			</xs:element>
		</xs:choice>
	</xs:group>

	<xs:simpleType name="FromEventLevel">
		<xs:restriction base="xs:string">
			<xs:enumeration value="Minor"/>
			<xs:enumeration value="Medium"/>
			<xs:enumeration value="Major"/>
			<xs:enumeration value="None"/>
		</xs:restriction>
	</xs:simpleType>

	<xs:complexType name="DefaultHttpResponseHeaders">
		<xs:sequence>
			<xs:element name="DefaultHttpResponseHeader" minOccurs="0" maxOccurs="unbounded">
				<xs:complexType>
					<xs:attribute name="key" type="xs:string" use="required"/>
					<xs:attribute name="value" type="xs:string" use="required"/>
				</xs:complexType>
			</xs:element>
		</xs:sequence>
	</xs:complexType>

	<xs:simpleType name="PortNumber">
		<xs:restriction base="xs:int">
			<xs:minInclusive value="1"/>
			<xs:maxInclusive value="65535"/>
		</xs:restriction>
	</xs:simpleType>

	<xs:simpleType name="BlockSize">
		<xs:restriction base="xs:int">
			<xs:enumeration value="1024"/>
			<xs:enumeration value="2048"/>
			<xs:enumeration value="4096"/>
			<xs:enumeration value="8192"/>
			<xs:enumeration value="16384"/>
			<xs:enumeration value="32768"/>
			<xs:enumeration value="65536"/>
		</xs:restriction>
	</xs:simpleType>

	<xs:simpleType name="ClientCertificates">
		<xs:restriction base="xs:string">
			<xs:enumeration value="NotUsed"/>
			<xs:enumeration value="Optional"/>
			<xs:enumeration value="Required"/>
		</xs:restriction>
	</xs:simpleType>

	<xs:simpleType name="PositiveDuration">
		<xs:restriction base="xs:duration">
			<xs:minExclusive value="PT0S"/>
		</xs:restriction>
	</xs:simpleType>

</xs:schema>
