/// <summary>Transforms the current request in a collection of corresponding key-value pairs.</summary> /// <returns>The collection of key-value pairs.</returns> NameValueCollection Ows.IRequest.ToKeyValuePairs() { var ret = new NameValueCollection(); ret.Add( "request", "GetRecords" ); ret.Add( "service", HttpUtility.UrlEncode(this.Content.service) ); ret.Add( "version", HttpUtility.UrlEncode(this.Content.version) ); // namespace var namespaceManager = new XmlNamespaceManager( new NameTable() ); XNamespace dn = this.Untyped.GetDefaultNamespace(); if( dn != XNamespace.None ) namespaceManager.AddNamespace( string.Empty, dn.NamespaceName ); var namespaces = from at in this.Untyped.Attributes() where at.IsNamespaceDeclaration select new { Prefix = at.Parent.GetPrefixOfNamespace( at.Value ), Uri = at.Value }; namespaces.ToList().ForEach( n => namespaceManager.AddNamespace( n.Prefix, n.Uri ) ); ret.Add( "namespace", string.Join( ",", namespaceManager.Cast<string>() .Where( s => !string.IsNullOrEmpty(namespaceManager.LookupNamespace( s ?? string.Empty ))) .Select( s => string.Concat( "xmlns(", !string.IsNullOrEmpty(s) ? string.Concat( s, "=" ) : string.Empty, HttpUtility.UrlEncode(namespaceManager.LookupNamespace( s ?? string.Empty )), ")" ) ) ) ); if( !string.IsNullOrEmpty( this.resultType) ) ret.Add( "resulttype", HttpUtility.UrlEncode(this.resultType) ); if( this.requestId != null ) ret.Add( "requestid", HttpUtility.UrlEncode(this.requestId.ToString()) ); if( !string.IsNullOrEmpty( this.outputFormat ) ) ret.Add( "outputformat", HttpUtility.UrlEncode(this.outputFormat) ); if( outputSchema != null ) ret.Add( "outputschema", HttpUtility.UrlEncode(outputSchema.ToString()) ); if (startPosition!=1) ret.Add( "startposition", this.startPosition.ToString( "F0", CultureInfo.InvariantCulture ) ); if (maxRecords!=10) ret.Add( "maxrecords", this.maxRecords.ToString( "F0", CultureInfo.InvariantCulture ) ); var query=this.AbstractQuery as Query; if( query != null ) { var tnElement=Content.AbstractQuery.Untyped.Attribute("typeNames"); if (tnElement!=null) ret.Add("typenames", string.Join(",", tnElement.Value.Split(' ').Select( s => HttpUtility.UrlEncode(s)))); if ( query.Untyped.Elements("{http://www.opengis.net/cat/csw/2.0.2}ElementSetName").Any<XElement>() && !string.IsNullOrEmpty(query.ElementSetName.TypedValue)) ret.Add( "elementsetname", HttpUtility.UrlEncode(query.ElementSetName.TypedValue) ); if ((query.ElementName!=null) && (query.ElementName.Count>0)) { var elementNames=from el in query.Untyped.Descendants() where el.Name=="{http://www.opengis.net/cat/csw/2.0.2}ElementName" select HttpUtility.UrlEncode(el.Value); ret.Add("elementname", string.Join(",", elementNames)); } if (query.Untyped.Element("{http://www.opengis.net/cat/csw/2.0.2}Constraint")!=null) { if (query.Constraint.Untyped.Element("{http://www.opengis.net/ogc}Filter")!=null) { ret.Add( "constraintlanguage", "FILTER" ); ret.Add( "constraint", HttpUtility.UrlEncode(query.Constraint.Filter.Untyped.ToString(SaveOptions.OmitDuplicateNamespaces))); } else if (!string.IsNullOrWhiteSpace(query.Constraint.CqlText)) { ret.Add( "constraintlanguage", "CQL_TEXT" ); ret.Add( "constraint", string.Concat("\"", HttpUtility.UrlEncode(query.Constraint.CqlText), "\"" )); } if (!string.IsNullOrEmpty(query.Constraint.version)) ret.Add("constraint_language_version", query.Constraint.version); } } return ret; }