<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions 
    xmlns:seisml="urn:xml:seisml:orfeus:neries:org"
	xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
	xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
	xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"	
	xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
	xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
	xmlns:xs="http://www.w3.org/2001/XMLSchema" name="seisml"
	targetNamespace="urn:xml:seisml:orfeus:neries:org">
	
<wsdl:types>
 <xs:schema elementFormDefault="qualified" version="1.0"
	targetNamespace="urn:xml:seisml:orfeus:neries:org"
	xmlns:seisml="urn:xml:seisml:orfeus:neries:org"
	xmlns:xs="http://www.w3.org/2001/XMLSchema"
	xmlns:ogc="http://www.opengis.net/ogc"
	xmlns:gml="http://www.opengis.net/gml"
	xmlns:inv="http://geofon.gfz-potsdam.de/ns/inventory/0.2/"
	xmlns:qml="http://www.quakeml.ethz.ch/core"
	>
	
	<xs:import namespace="http://www.opengis.net/gml"
		schemaLocation="./gml/3.1.1/base/feature.xsd">
	</xs:import>
	<xs:import namespace="http://www.opengis.net/ogc"
		schemaLocation="./filter/1.1.0/filter.xsd">
	</xs:import>
		<xs:import namespace="http://geofon.gfz-potsdam.de/ns/inventory/0.2/"
		schemaLocation="./arclink/0.4/inventory/0.2/inventory.xsd">
	</xs:import>
	
	<xs:element name="dataRequest"  type="seisml:DataRequestType" />
    
    <xs:element name="dataResponse"  type="seisml:DataStatusResponseType" />
    
    <xs:element name="dataRetrieve"  type="seisml:TokenRequestType" />
	
	<xs:element name="dataRetrieveResponse"	type="seisml:DataResponseType" />
	
	<xs:element name="getInventory"	type="seisml:InventoryRequestType" />

	<xs:element name="getInventoryResponse"	type="seisml:InventoryResponseType" />
	
	<xs:element name="checkStatus" type="seisml:TokenRequestType" />
	
	<xs:element name="checkDataStatusResponse" type="seisml:DataStatusResponseType" />
	
	<xs:element name="purgeData"  type="seisml:TokenRequestType" />
	
	<xs:element name="purgeDataResponse"  type="seisml:PurgeResponseType" />
	

	<xs:complexType name="AbstractRequestType" abstract="true">
		<xs:sequence>
			<xs:element name="UserToken" type="seisml:UserTokenType"
				minOccurs="1" maxOccurs="1" />
			<xs:element name="StationIdentifierFilter"
				type="seisml:StationIdentifierType" minOccurs="1" maxOccurs="unbounded" />
		</xs:sequence>
	</xs:complexType>
	 
	<xs:complexType name="DataRequestType">
		<xs:complexContent>
			<xs:extension base="seisml:AbstractRequestType">
			  	<!-- supported format MiniSeed (MSEED) and FullSeed(FSEED) default -->
			  <xs:attribute name="DataFormat" type="xs:string"/>
			    <!-- supported compression bzip2 or none default (not implemented at the moment)-->
			  <xs:attribute name="DataCompression" type="xs:string" />
			</xs:extension>	
		</xs:complexContent>	
	</xs:complexType>
	
	<xs:complexType name="InventoryRequestType">
		<xs:annotation>
			<xs:documentation>
			    Use of wildcard "*" is allowed on all field except of timespan 
			    Station, channel and locId are optional. If station or channel are not specified the respective elements are not added to the XML tree
			    If locId is missing or blank, only streams with empty location ID are included 
				Compression format can be bzip2 or none (not implemented yet)
				Instruments (default false) indicates whether instrument data should be added to XML
				ModifiedAfter(ISO dateTime) if set, only entries after given time will be returned   
			</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="seisml:AbstractRequestType">	
				<xs:sequence>
				 <xs:element name="SpatialBounds" type="seisml:SpatialBoundsType" minOccurs="0" maxOccurs="1" />	
			  </xs:sequence>
			   <xs:attribute name="Instruments" type="xs:string"/>
                           <!-- supported 1.0 or 0.2 (default)-->
			   <xs:attribute name="Version" type="xs:string"/>
			 <!--  gml:TimeInstantType -->
			 <xs:attribute name="ModifiedAfter" type="xs:string"/>
		    </xs:extension>
		</xs:complexContent>		
	</xs:complexType>
	
	 <xs:complexType name="ErrorType">
	 	<xs:annotation>
            <xs:documentation>
             This type models the error in a way to be uniform for both soap and rest invocations               
            </xs:documentation>
        </xs:annotation>
		<xs:sequence>
		  <xs:element name="ExceptionType" type="xs:string"/>
		  <xs:element name="ExceptionMessage" type="xs:string"/>
		  <xs:element name="ExceptionTrace" type="xs:string"/>
		</xs:sequence>	     
	    <xs:attribute name="Code" type="xs:string" />
		<xs:attribute name="Msg" type="xs:string" />
	 </xs:complexType> 
	
	<xs:complexType name="DataResponseType">
	<xs:annotation>
			<xs:documentation>
				
			</xs:documentation>
		</xs:annotation>
		<xs:choice>
		 <xs:sequence>
			<xs:element name="DataItem" type="seisml:DataItemType"
				maxOccurs="unbounded" minOccurs="0">
			</xs:element>
			<xs:element name="DataSet"
				type="seisml:DataItemCollectionType" maxOccurs="unbounded"
				minOccurs="0">
			</xs:element>
		 </xs:sequence>
		 <xs:element name="Error" type="seisml:ErrorType"/>
		</xs:choice>
	</xs:complexType>
	
	<xs:complexType name="InventoryResponseType">
	<xs:choice>
		<xs:sequence>
			<xs:element name="ArclinkInventory"
				type="seisml:InventoryType"  maxOccurs="1" minOccurs="1">
			</xs:element>
		</xs:sequence>
		<xs:element name="Error" type="seisml:ErrorType"/>
	</xs:choice>	
	</xs:complexType>
	
	<!-- supported formats: beginPosition - endPosition or begin - end -->
	<xs:complexType name="TemporalBoundsType">
		<xs:sequence>
			<xs:element name="TimePeriod" type="gml:TimePeriodType"
				minOccurs="1" maxOccurs="1" />
		</xs:sequence>
	</xs:complexType>
	<!-- supported formats:  lowCorner - upperCorner or coord (but deprecated)-->
	<xs:complexType name="SpatialBoundsType">
		<xs:sequence>
			<xs:element name="BoundingBox" type="ogc:BBOXType"
				minOccurs="0" maxOccurs="1" />
		</xs:sequence>
	</xs:complexType>
	
	<xs:complexType name="InventoryType">
	<xs:annotation>
			<xs:documentation>
			This is a general type describing all kind of available instrumentation, our instances are obtained extending this with inventory.xsd features.
			i.e.: it could implement station, network etc...   
			</xs:documentation>
		</xs:annotation>
		<xs:complexContent>
			<xs:extension base="gml:AbstractFeatureType">
				<xs:sequence>				
                    <xs:any namespace="http://geofon.gfz-potsdam.de/ns/inventory/0.2/" minOccurs="1" />
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	
	<xs:complexType name="UserTokenType">
		<xs:sequence>
			<xs:element name="email" type="xs:string" minOccurs="1" maxOccurs="1"/>
			<!-- used to access restricted data -->
			<xs:element name="password" type="xs:string" minOccurs="0" maxOccurs="1"/>
			<!-- optional should be populated by the applications i.e.:DATA_PORTAL -->
			<xs:element name="label" type="xs:string" minOccurs="0" maxOccurs="1"/>
			<xs:element name="locale" type="xs:string" minOccurs="0" maxOccurs="1"/>
		</xs:sequence>
	</xs:complexType>
	
	<xs:complexType name="DownloadTokenType">
		<xs:sequence>
		
			<xs:element name="DownloadURL" type="xs:anyURI" maxOccurs="1"
				minOccurs="0"/> 
			<xs:element name="DownloadTokenId" type="xs:anyURI" maxOccurs="1"
				minOccurs="1"/> 
			<!--  id (url) of the resource linked to the Arclink job ID -->
		</xs:sequence>
	</xs:complexType>
	
	<xs:complexType name="DataItemType">
		<xs:sequence>
			<xs:element name="EstimatedSizeKB" type="xs:double" />
			<xs:element name="DisplayTitle" type="xs:string" />			
			<xs:element name="DownloadToken" type="seisml:DownloadTokenType"/> 		   
		</xs:sequence>
	</xs:complexType>
	
	<xs:complexType name="DataItemCollectionType">
		<xs:complexContent>
			<xs:extension base="seisml:DataItemType">
				<xs:sequence>
					<xs:element name="DataItem" type="seisml:DataItemType"
						maxOccurs="unbounded" minOccurs="0">
					</xs:element>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>

	</xs:complexType>
	
	<xs:complexType name="StationIdentifierType">
	<xs:sequence>
	    
	    <xs:element name="TimeSpan" type="seisml:TemporalBoundsType" minOccurs="1" maxOccurs="1" />
		<!-- mandatory, it can be * in Inventory -->
		<xs:element name="NetworkCode" type="xs:string" minOccurs="1" maxOccurs="1"/>
		<!-- mandatory in Waveform requests, optional in Inventory  -->
		<xs:element name="StationCode" type="xs:string" minOccurs="0" maxOccurs="1" />
		<!-- if missing in Waveform requests it assumes * by default  -->
		<xs:element name="ChannelCode" type="xs:string" minOccurs="0" maxOccurs="1" />
		<!-- if missing or blank in Waveform requests only streams with empty location ID are requested  -->
		<xs:element name="LocId" type="xs:string" minOccurs="0" maxOccurs="1" />
	</xs:sequence>
	</xs:complexType>
 	
 	<xs:complexType name="AbstractTokenRequestType" abstract="true">
		<xs:sequence>
			<xs:element name="UserToken" type="seisml:UserTokenType"
				minOccurs="1" maxOccurs="1" />
				
		    <xs:element name="RequestID" type="xs:anyURI"
				minOccurs="1" maxOccurs="unbounded" />
		</xs:sequence>
	</xs:complexType>
 	
 	
	<xs:complexType name="TokenRequestType">
		<xs:complexContent>
			<xs:extension base="seisml:AbstractTokenRequestType">				
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>


	<xs:complexType name="RoutedRequestType">
	       
	<xs:sequence>
	 <xs:element name="ReqDescription" type="seisml:StationIdentifierType" 
	     minOccurs="1" maxOccurs="unbounded"/>
	 <xs:element name="StatusDescription" type="xs:string"
				minOccurs="1" maxOccurs="1"/>
			<!-- volume ID defined for future use -->	
	<xs:element name="PackageVolumeID" type="xs:anyURI"
				minOccurs="0" maxOccurs="1"/>	
	<xs:element name="ReadyFlag" type="xs:string"
				minOccurs="1" maxOccurs="1"/>
	<xs:element name="Fulfillment" type="xs:int"
				minOccurs="0" maxOccurs="1"/>    
	</xs:sequence>
	<xs:attribute name="Id" type="xs:anyURI"/>
	</xs:complexType>
	
	<xs:complexType name="DataStatusResponseType">
	<xs:annotation>
		<xs:documentation>
			
		</xs:documentation>
	</xs:annotation>
	<xs:choice>
	<xs:sequence>
	 <xs:element name="RoutedRequest" type="seisml:RoutedRequestType"
	  minOccurs="1" maxOccurs="unbounded"/>
	</xs:sequence>
	<xs:element name="Error" type="seisml:ErrorType"/>
	</xs:choice>
	</xs:complexType>
  
  <xs:complexType name="PurgeStatusResponseType">
      <xs:sequence>	 		
	  <xs:element name="RequestID" type="xs:anyURI"
				minOccurs="1" maxOccurs="1"/>
	  <xs:element name="StatusDescription" type="xs:string"
				minOccurs="1" maxOccurs="1"/>	 
    </xs:sequence>
  </xs:complexType>
  
  <xs:complexType name="PurgeResponseType">
	<xs:annotation>
		<xs:documentation>
			
		</xs:documentation>
	</xs:annotation>
	<xs:choice>
	 <xs:sequence>	 		
	  <xs:element name="Request" type="seisml:PurgeStatusResponseType"
				minOccurs="1" maxOccurs="unbounded"/>	  
    </xs:sequence>
	<xs:element name="Error" type="seisml:ErrorType"/>
  </xs:choice>
 </xs:complexType>
	

</xs:schema>
</wsdl:types>
    
    <wsdl:message name="getInventoryRequest">
		<wsdl:part element="seisml:getInventory" name="parameters" />
	</wsdl:message>
	<wsdl:message name="getInventoryResponse">
		<wsdl:part element="seisml:getInventoryResponse" name="return" />
	</wsdl:message>	
	<wsdl:message name="dataRequest">
		<wsdl:part name="parameters" element="seisml:dataRequest"></wsdl:part>
	</wsdl:message>
	<wsdl:message name="dataResponse">
		<wsdl:part name="return" element="seisml:dataResponse"></wsdl:part>
	</wsdl:message>
	<wsdl:message name="dataRetrieve">
		<wsdl:part name="parameters" element="seisml:dataRetrieve"></wsdl:part>
	</wsdl:message>
	<wsdl:message name="dataRetrieveResponse">
		<wsdl:part name="return" element="seisml:dataRetrieveResponse"></wsdl:part>
	</wsdl:message>
	<wsdl:message name="checkStatus">
		<wsdl:part name="parameters" element="seisml:checkStatus"></wsdl:part>
	</wsdl:message>
	<wsdl:message name="checkStatusResponse">
		<wsdl:part name="return" element="seisml:checkDataStatusResponse"></wsdl:part>
	</wsdl:message>
	<wsdl:message name="purgeRequest">
		<wsdl:part name="parameters" element="seisml:purgeData"></wsdl:part>
	</wsdl:message>
	<wsdl:message name="purgeResponse">
		<wsdl:part name="return" element="seisml:purgeDataResponse"></wsdl:part>
	</wsdl:message>
	
	
	<wsdl:portType name="seismolink">
		<wsdl:operation name="getInventory">
			<wsdl:input message="seisml:getInventoryRequest" />
			<wsdl:output message="seisml:getInventoryResponse" />
		</wsdl:operation>
		<wsdl:operation name="dataRequest">
			<wsdl:input message="seisml:dataRequest" />
			<wsdl:output message="seisml:dataResponse" />
		</wsdl:operation>
			<wsdl:operation name="dataRetrieve">
			<wsdl:input message="seisml:dataRetrieve" />
			<wsdl:output message="seisml:dataRetrieveResponse" />
		</wsdl:operation>
		<wsdl:operation name="checkStatus">
			<wsdl:input message="seisml:checkStatus" />
			<wsdl:output message="seisml:checkStatusResponse" />
		</wsdl:operation>
		<wsdl:operation name="purgeData">
			<wsdl:input message="seisml:purgeRequest" />
			<wsdl:output message="seisml:purgeResponse" />
		</wsdl:operation>
	</wsdl:portType>
	
	<wsdl:binding name="seismolinkSOAP11Binding"
		type="seisml:seismolink">
		<soap:binding transport="http://schemas.xmlsoap.org/soap/http"
			style="document" />
		<wsdl:operation name="getInventory">
			<soap:operation soapAction="urn:getInventory" style="document" />
			<wsdl:input>
				<soap:body use="literal" />
			</wsdl:input>
			<wsdl:output>
				<soap:body use="literal" />
			</wsdl:output>
		</wsdl:operation>
		<wsdl:operation name="dataRequest">
			<soap:operation soapAction="urn:dataRequest" style="document" />
			<wsdl:input>
				<soap:body use="literal" />
			</wsdl:input>
			<wsdl:output>
				<soap:body use="literal" />
			</wsdl:output>
		</wsdl:operation>
		<wsdl:operation name="dataRetrieve">
			<soap:operation soapAction="urn:dataRetrieve" style="document" />
			<wsdl:input>
				<soap:body use="literal" />
			</wsdl:input>
			<wsdl:output>
				<soap:body use="literal" />
			</wsdl:output>
		</wsdl:operation>
		<wsdl:operation name="checkStatus">
			<soap:operation soapAction="urn:checkStatus" style="document" />
			<wsdl:input>
				<soap:body use="literal" />
			</wsdl:input>
			<wsdl:output>
				<soap:body use="literal" />
			</wsdl:output>
		</wsdl:operation>
		<wsdl:operation name="purgeData">
			<soap:operation soapAction="urn:purgeData" style="document" />
			<wsdl:input>
				<soap:body use="literal" />
			</wsdl:input>
			<wsdl:output>
				<soap:body use="literal" />
			</wsdl:output>
		</wsdl:operation>
	</wsdl:binding>
	
	<wsdl:binding name="seismolinkSOAP12Binding"
		type="seisml:seismolink">
		<soap12:binding transport="http://schemas.xmlsoap.org/soap/http"
			style="document" />
		<wsdl:operation name="getInventory">
			<soap12:operation soapAction="urn:getInventory" style="document" />
			<wsdl:input>
				<soap12:body use="literal" />
			</wsdl:input>
			<wsdl:output>
				<soap12:body use="literal" />
			</wsdl:output>
		</wsdl:operation>
		<wsdl:operation name="dataRequest">
			<soap12:operation soapAction="urn:dataRequest" style="document" />
			<wsdl:input>
				<soap12:body use="literal" />
			</wsdl:input>
			<wsdl:output>
				<soap12:body use="literal" />
			</wsdl:output>
		</wsdl:operation>
		<wsdl:operation name="dataRetrieve">
			<soap12:operation soapAction="urn:dataRetrieve" style="document" />
			<wsdl:input>
				<soap12:body use="literal" />
			</wsdl:input>
			<wsdl:output>
				<soap12:body use="literal" />
			</wsdl:output>
		</wsdl:operation>
		<wsdl:operation name="checkStatus">
			<soap12:operation soapAction="urn:checkStatus" style="document" />
			<wsdl:input>
				<soap12:body use="literal" />
			</wsdl:input>
			<wsdl:output>
				<soap12:body use="literal" />
			</wsdl:output>
		</wsdl:operation>
		<wsdl:operation name="purgeData">
			<soap12:operation soapAction="urn:purgeData" style="document" />
			<wsdl:input>
				<soap12:body use="literal" />
			</wsdl:input>
			<wsdl:output>
				<soap12:body use="literal" />
			</wsdl:output>
		</wsdl:operation>
	</wsdl:binding>
	
	<wsdl:binding name="seismolinkHttpBinding"
		type="seisml:seismolink">
		<http:binding verb="POST" />
		<wsdl:operation name="getInventory">
			<http:operation location="getInventory" />
			<wsdl:input>
				<mime:content type="text/xml" />
			</wsdl:input>
			<wsdl:output>
				<mime:content type="text/xml" />
			</wsdl:output>
		</wsdl:operation>
		<wsdl:operation name="dataRequest">
			<http:operation location="dataRequest" />
			<wsdl:input>
				<mime:content type="text/xml" />
			</wsdl:input>
			<wsdl:output>
				<mime:content type="text/xml" />
			</wsdl:output>
		</wsdl:operation>	
		<wsdl:operation name="dataRetrieve">
			<http:operation location="dataRetrieve" />
			<wsdl:input>
				<mime:content type="text/xml" />
			</wsdl:input>
			<wsdl:output>
				<mime:content type="text/xml" />
			</wsdl:output>
		</wsdl:operation>
		<wsdl:operation name="checkStatus">
			<http:operation location="checkStatus" />
			<wsdl:input>
				<mime:content type="text/xml" />
			</wsdl:input>
			<wsdl:output>
				<mime:content type="text/xml" />
			</wsdl:output>
		</wsdl:operation>		
		<wsdl:operation name="purgeData">
			<http:operation location="purgeData" />
			<wsdl:input>
				<mime:content type="text/xml" />
			</wsdl:input>
			<wsdl:output>
				<mime:content type="text/xml" />
			</wsdl:output>
		</wsdl:operation>				
	</wsdl:binding>
	
	<wsdl:service name="seismolink">
		<wsdl:port binding="seisml:seismolinkSOAP11Binding" name="seismolinkSOAP11Binding">
			<soap:address
				location="http://www.orfeus-eu.org/axis2/services/Seismolink" />
		</wsdl:port>
		<wsdl:port binding="seisml:seismolinkSOAP12Binding" name="seismolinkSOAP12Binding">
			<soap:address
				location="http://www.orfeus-eu.org/axis2/services/Seismolink" />
		</wsdl:port>
		<wsdl:port binding="seisml:seismolinkHttpBinding" name="seismolinkHttpBinding">
			<soap:address
				location="http://www.orfeus-eu.org/axis2/services/Seismolink" />
		</wsdl:port>
	</wsdl:service>
	
</wsdl:definitions>	

