/// <summary> /// Makes footprint envelope for a metadata record /// </summary> /// <param name="record">CswRecord object</param> /// <returns>envelope polygon</returns> private AGXG.Polygon makeFootPrint(CswRecord record) { AGXG.Envelope envelope = new AGXG.Envelope(); try { envelope.XMax = record.BoundingBox.Maxx; envelope.YMax = record.BoundingBox.Maxy; envelope.XMin = record.BoundingBox.Minx; envelope.YMin = record.BoundingBox.Miny; } catch (System.ArgumentException e) { try { envelope.XMax = record.BoundingBox.Minx; envelope.YMax = record.BoundingBox.Maxy; envelope.XMin = record.BoundingBox.Maxx; envelope.YMin = record.BoundingBox.Miny; } catch (System.ArgumentException e1) { try { envelope.XMax = record.BoundingBox.Minx; envelope.YMax = record.BoundingBox.Miny; envelope.XMin = record.BoundingBox.Maxx; envelope.YMin = record.BoundingBox.Maxy; } catch (System.ArgumentException e2) { envelope.XMax = record.BoundingBox.Maxx; envelope.YMax = record.BoundingBox.Miny; envelope.XMin = record.BoundingBox.Minx; envelope.YMin = record.BoundingBox.Maxy; } } } AGXG.Point p1 = new AGXG.Point(); p1.SetCoordinates(record.BoundingBox.Maxx, record.BoundingBox.Maxy); AGXG.Point p2 = new AGXG.Point(); p2.SetCoordinates(record.BoundingBox.Maxx, record.BoundingBox.Miny); AGXG.Point p3 = new AGXG.Point(); p3.SetCoordinates(record.BoundingBox.Minx, record.BoundingBox.Miny); AGXG.Point p4 = new AGXG.Point(); p4.SetCoordinates(record.BoundingBox.Minx, record.BoundingBox.Maxy); AGXG.Polygon footPrint = new AGXG.Polygon(); footPrint.AddPoint(p1); footPrint.AddPoint(p2); footPrint.AddPoint(p3); footPrint.AddPoint(p4); footPrint.AddPoint(p1); return footPrint; }
/// <summary> /// Makes graphic to display footprint /// </summary> /// <param name="record"></param> /// <returns></returns> private AGXM.Graphic makeFootPrintGraphic(CswRecord record) { AGXG.Polygon footPrint = makeFootPrint(record); //Turn the Polygon in to a Graphic AGXM.Graphic graphic = new AGXM.Graphic(footPrint); //Set the Graphic's symbol // graphic.Symbol = AGXM.Symbol.Fill.Outline.Yellow; graphic.Symbol.OutlineColor = Color.Yellow; graphic.Symbol.Color = Color.Transparent; // graphic.Symbol.Size = 100; return graphic; }
/// <summary> /// Transform a CSW metadata response. /// </summary> /// <remarks> /// The CSW metadata response is read. /// The CSw record is updated with the metadata /// </remarks> /// <param name="param1">The metadata response string</param> /// <param name="param2">The CSW record for the record</param> public bool TransformCSWGetMetadataByIDResponse(string response, CswRecord record) { if (displayResponseXslt == null || displayResponseXslt.Equals("")) { record.FullMetadata = response; record.MetadataResourceURL = ""; return false; } else { //create the output stream StringWriter writer = new StringWriter(); TextReader textreader = new StringReader(response); XmlTextReader xmltextreader = new XmlTextReader(textreader); //load the Xml doc XPathDocument xpathDoc = new XPathDocument(xmltextreader); if (displayResponseXsltObj == null) { displayResponseXsltObj = new XslCompiledTransform(); //enable document() support XsltSettings settings = new XsltSettings(true, true); displayResponseXsltObj.Load(displayResponseXslt, settings, new XmlUrlResolver()); } //do the actual transform of Xml displayResponseXsltObj.Transform(xpathDoc, null, writer); writer.Close(); // full metadata or resource url String outputStr = writer.ToString(); record.MapServerURL = ""; record.MetadataResourceURL = ""; record.FullMetadata = outputStr; return true; } }
/// <summary> /// Determins resource urls /// </summary> /// <param name="cswRecord">CswRecord object</param> /// <param name="references">List of references</param> private void determineResourceUrl(CswRecord cswRecord, DcList references) { // initialize String resourceUrl = ""; String serviceType = ""; String serviceName = ""; // determine the service url, name and type LinkedList<String> schemeVals = references.get(DcList.getScheme(DcList.Scheme.SERVER)); if (schemeVals.Count > 0) { resourceUrl = chkStr(schemeVals.First.Value); } schemeVals = references.get(DcList.getScheme(DcList.Scheme.SERVICE)); if (schemeVals.Count > 0) { serviceName = chkStr((schemeVals.First.Value)); } schemeVals = references.get(DcList.getScheme(DcList.Scheme.SERVICE_TYPE)); if (schemeVals.Count > 0) { serviceType = (schemeVals.First.Value); } if ((resourceUrl.Length > 0) && (serviceType.Length == 0)) { serviceType = getServiceType(resourceUrl); } // handle the case where an ArcIMS service has been specified with // server/service/serviceType parameters if ((resourceUrl.Length > 0) && (serviceType.Equals("image", StringComparison.CurrentCultureIgnoreCase) || serviceType.Equals("feature") || serviceType.Equals("metadata"))) { if ((serviceName.Length > 0)) { String esrimap = "servlet/com.esri.esrimap.Esrimap"; if (resourceUrl.IndexOf("esrimap") == -1) { if (resourceUrl.IndexOf("?") == -1) { if (!resourceUrl.EndsWith("/")) resourceUrl += "/"; resourceUrl = resourceUrl + esrimap + "?ServiceName=" + serviceName; } } else { if (resourceUrl.IndexOf("?") == -1) { resourceUrl = resourceUrl + "?ServiceName=" + serviceName; } else if (resourceUrl.IndexOf("ServiceName=") == -1) { resourceUrl = resourceUrl + "&ServiceName=" + serviceName; } } } if (serviceType.Equals("image")) { serviceType = "aims"; } } // if the resource url has not been directly specified through a "scheme" attribute, // then attempt to pick the best fit for the collection of references if (resourceUrl.Length == 0) { foreach (DcList.Value reference in references) { if (reference != null) { String url = reference.getValue(); String type = getServiceType(url); if (type.Length > 0) { resourceUrl = url; serviceType = type; break; } } } } // update the record cswRecord.MapServerURL = resourceUrl; cswRecord.ServiceName = serviceName; cswRecord.ServiceType = serviceType; }
/// <summary> /// Read a CSW metadata response. /// </summary> /// <remarks> /// The CSW metadata response is read. /// The CSw record is updated with the metadata /// </remarks> /// <param name="param1">The metadata response string</param> /// <param name="param2">The CSW record for the record</param> public void ReadCSWGetMetadataByIDResponse(string response, CswRecord record) { if (metadataxslt == null || metadataxslt.Equals("")) { record.FullMetadata = response; record.MetadataResourceURL = ""; } else { //create the output stream StringWriter writer = new StringWriter(); TextReader textreader = new StringReader(response); XmlTextReader xmltextreader = new XmlTextReader(textreader); //load the Xml doc XPathDocument xpathDoc = new XPathDocument(xmltextreader); if (metadataxsltobj == null) { metadataxsltobj = new XslCompiledTransform(); //enable document() support XsltSettings settings = new XsltSettings(true, true); metadataxsltobj.Load(metadataxslt, settings, new XmlUrlResolver()); } //do the actual transform of Xml metadataxsltobj.Transform(xpathDoc, null, writer); writer.Close(); // full metadata or resource url String outputStr = writer.ToString(); if (IsUrl(outputStr)) { if (outputStr.Contains("\u2715")) { DcList list = new DcList(); list.add(outputStr); LinkedList<String> serverList = list.get(DcList.getScheme(DcList.Scheme.SERVER)); LinkedList<String> documentList = list.get(DcList.getScheme(DcList.Scheme.METADATA_DOCUMENT)); if (serverList.Count > 0) { String serviceType = getServiceType(serverList.First.Value); if (serviceType.Equals("aims") || serviceType.Equals("ags") || serviceType.Equals("wms") || serviceType.Equals("wcs")) { record.MapServerURL = serverList.First.Value; } } else record.MapServerURL = ""; if (documentList.Count > 0) record.MetadataResourceURL = documentList.First.Value; } else { if (getServiceType(response).Equals("ags")) { outputStr = outputStr.Replace("http", "|http"); string[] s = outputStr.Split('|'); for (int i = 0; i < s.Length; i++) { if (s[i].ToString().Contains("MapServer")) record.MapServerURL = s[i]; else record.MetadataResourceURL = s[i]; } } else { record.MapServerURL = ""; record.MetadataResourceURL = outputStr; } } record.FullMetadata = ""; } else { record.MapServerURL = ""; record.MetadataResourceURL = ""; record.FullMetadata = outputStr; } } }
/// <summary> /// Parse a CSW response. /// </summary> /// <remarks> /// The CSW response is parsed and the records collection is populated /// with the result.The reponse is parsed based on the response xslt. /// </remarks> /// <param name="param1">The string response</param> /// <param name="param2">The recordlist which needs to be populated</param> public void ReadCSWGetRecordsResponse(string responsestring, CswRecords recordslist) { try { TextReader textreader = new StringReader(responsestring); XmlTextReader xmltextreader = new XmlTextReader(textreader); //load the Xml doc XPathDocument xPathDoc = new XPathDocument(xmltextreader); if (responsexsltobj == null) { responsexsltobj = new XslCompiledTransform(); XsltSettings settings = new XsltSettings(true, true); responsexsltobj.Load(responsexslt, settings, new XmlUrlResolver()); } //create the output stream StringWriter writer = new StringWriter(); //do the actual transform of Xml responsexsltobj.Transform(xPathDoc, null, writer); writer.Close(); //populate CswRecords XmlDocument doc = new XmlDocument(); doc.LoadXml(writer.ToString()); XmlNodeList xmlnodes = doc.GetElementsByTagName("Record"); foreach (XmlNode xmlnode in xmlnodes) { CswRecord record = new CswRecord(); record.ID = xmlnode.SelectSingleNode("ID").InnerText; record.Title = xmlnode.SelectSingleNode("Title").InnerText; record.Abstract = xmlnode.SelectSingleNode("Abstract").InnerText; String lowercorner = ""; if (this.SupportSpatialBoundary) { lowercorner = xmlnode.SelectSingleNode("LowerCorner").InnerText; } String uppercorner = ""; if (this.SupportSpatialBoundary) { uppercorner = xmlnode.SelectSingleNode("UpperCorner").InnerText; } if ((lowercorner.Length > 0 && uppercorner.Length > 0)) { /* record.BoundingBox.Maxx = Double.Parse(lowercorner.Substring(0, lowercorner.IndexOf(' '))); record.BoundingBox.Miny = Double.Parse(lowercorner.Substring(lowercorner.IndexOf(' ') + 1)); record.BoundingBox.Minx = Double.Parse(uppercorner.Substring(0, uppercorner.IndexOf(' '))); record.BoundingBox.Maxy = Double.Parse(uppercorner.Substring(uppercorner.IndexOf(' ') + 1));*/ Boolean parseFlag = false; CultureInfo cultureInfo = new CultureInfo("en-us"); double pareseResult = 0.0; parseFlag = Double.TryParse(lowercorner.Substring(0, lowercorner.IndexOf(' ')), NumberStyles.Number, cultureInfo, out pareseResult); record.BoundingBox.Minx = pareseResult; parseFlag = Double.TryParse(lowercorner.Substring(lowercorner.IndexOf(' ') + 1), NumberStyles.Number, cultureInfo, out pareseResult); record.BoundingBox.Miny = pareseResult; parseFlag = Double.TryParse(uppercorner.Substring(0, uppercorner.IndexOf(' ')), NumberStyles.Number, cultureInfo, out pareseResult); record.BoundingBox.Maxx = pareseResult; parseFlag = Double.TryParse(uppercorner.Substring(uppercorner.IndexOf(' ') + 1), NumberStyles.Number, cultureInfo, out pareseResult); record.BoundingBox.Maxy = pareseResult; if (parseFlag == false) { throw new Exception("Number format error"); } } else { record.BoundingBox.Maxx = 500.00; record.BoundingBox.Miny = 500.00; record.BoundingBox.Minx = 500.00; record.BoundingBox.Maxy = 500.00; } XmlNode node = xmlnode.SelectSingleNode("Type"); if (node != null) { record.IsLiveDataOrMap = node.InnerText.Equals("liveData", StringComparison.OrdinalIgnoreCase); if (!record.IsLiveDataOrMap) { record.IsLiveDataOrMap = node.InnerText.Equals("downloadableData", StringComparison.OrdinalIgnoreCase); } } else { record.IsLiveDataOrMap = false; } XmlNode referencesNode = xmlnode.SelectSingleNode("References"); if (referencesNode != null) { String references = referencesNode.InnerText; DcList list = new DcList(); list.add(references); determineResourceUrl(record, list); /* LinkedList<String> serverList = list.get(DcList.getScheme(DcList.Scheme.SERVER)); if (serverList.Count > 0) { String serviceType = getServiceType(serverList.First.Value); if (serviceType.Equals("aims") || serviceType.Equals("ags") || serviceType.Equals("wms") || serviceType.Equals("wcs")) { record.MapServerURL = serverList.First.Value; } }*/ } else record.MapServerURL = ""; recordslist.AddRecord(record.ID.GetHashCode(), record); } } catch (Exception e) { throw e; } //return recordslist; }
/// <summary> /// Get Add to map information /// </summary> /// <param name="DocID">document identifier</param> public void GetAddToMapInfoByID(string DocID) { _response = new CswSearchResponse(); StringBuilder sb = new StringBuilder(); if (DocID == null || DocID == "") { throw new ArgumentNullException(); } if (_catalog == null) { throw new NullReferenceException("Catalog not specified."); } if (_catalog.Capabilities == null) { throw new NullReferenceException("Catalog capabilities not initialized."); } if (_catalog.Profile == null) { throw new NullReferenceException("Catalog profile not specified."); } if (_catalog.Capabilities.GetRecordByID_GetURL == null || _catalog.Capabilities.GetRecordByID_GetURL.Length == 0) { sb.AppendLine(DateTime.Now + " GetRecordByID URL not specified for the catalog capabilities."); throw new NullReferenceException("GetRecordByID URL not specified for the catalog capabilities."); } CswProfile profile = _catalog.Profile; // generate request url string getRecordByIDBaseUrl = _catalog.Capabilities.GetRecordByID_GetURL; string requestUrl = profile.GenerateCSWGetMetadataByIDRequestURL(getRecordByIDBaseUrl, DocID); sb.AppendLine(DateTime.Now + " GetRecordsById request URL : " + requestUrl); if (_cswClient == null) { _cswClient = new CswClient(); } string responseText = _cswClient.SubmitHttpRequest("GET", requestUrl, ""); _response.ResponseXML = responseText; sb.AppendLine(DateTime.Now + " GetRecordsById response xml : " + responseText); CswRecord record = new CswRecord(DocID); profile.ReadCSWGetMetadataByIDResponse(responseText, record); if (record.MetadataResourceURL != null && record.MetadataResourceURL.Equals("") && profile.Name.Equals("terra catalog CSW 2.0.2 AP ISO")) { record.FullMetadata = responseText; } if (record == null) { throw new NullReferenceException("Record not populated."); } // check if full metadata or resourceURL has been returned bool hasFullMetadata = !(record.FullMetadata == null || record.FullMetadata == ""); bool hasResourceUrl = !(record.MetadataResourceURL == null || record.MetadataResourceURL == ""); if (!hasFullMetadata && !hasResourceUrl) { // throw new InvalidOperationException("Neither full metadata nor metadata resource URL was found for the CSW record."); } else if (!hasFullMetadata && record.MetadataResourceURL != null) { // need to load metadata from resource URL responseText = _cswClient.SubmitHttpRequest("GET", record.MetadataResourceURL, "", "", ""); record.FullMetadata = responseText; } // add record to the response CswRecords records = new CswRecords(); if (record != null) { records.Add(record.ID, record); } _response.Records = records; _mapServerUrl = record.MapServerURL; if (_mapServerUrl != null) { sb.AppendLine(DateTime.Now + " Map Server Url : " + _mapServerUrl); } writeLogMessage(sb.ToString()); }
/// <summary> /// draw footprints on the map /// </summary> /// <param name="record">Record for which the footprint needs to be drwan</param> /// <param name="refreshview">Indicates if the view is refreshed or not after the element is drawn</param> /// <param name="deleteelements">Indicates if the element can be deleted or not</param> private void drawfootprint(CswRecord record, bool refreshview, bool deleteelements) { //create the triangle outline symbol ISimpleLineSymbol lineSymbol = new SimpleLineSymbolClass(); lineSymbol.Style = esriSimpleLineStyle.esriSLSSolid; lineSymbol.Width = 2.0; //create the triangle's fill symbol ISimpleFillSymbol simpleFillSymbol = new SimpleFillSymbolClass(); simpleFillSymbol.Outline = (ILineSymbol)lineSymbol; simpleFillSymbol.Style = esriSimpleFillStyle.esriSFSDiagonalCross; IMxDocument mxDoc; mxDoc = (IMxDocument)m_application.Document; //the original projection system ISpatialReference spatialReference; IGeographicCoordinateSystem geographicCoordinateSystem; SpatialReferenceEnvironmentClass spatialReferenceEnviorment = new SpatialReferenceEnvironmentClass(); geographicCoordinateSystem = spatialReferenceEnviorment.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_WGS1984); spatialReference = (ISpatialReference)geographicCoordinateSystem; //set the geometry of the element IPoint point = new ESRI.ArcGIS.Geometry.PointClass(); point.SpatialReference = spatialReference; point.PutCoords(record.BoundingBox.Minx, record.BoundingBox.Miny); IPoint point1 = new ESRI.ArcGIS.Geometry.PointClass(); point1.SpatialReference = spatialReference; point1.PutCoords(record.BoundingBox.Minx, record.BoundingBox.Maxy); IPoint point2 = new ESRI.ArcGIS.Geometry.PointClass(); point2.SpatialReference = spatialReference; point2.PutCoords(record.BoundingBox.Maxx, record.BoundingBox.Maxy); IPoint point3 = new ESRI.ArcGIS.Geometry.PointClass(); point3.SpatialReference = spatialReference; point3.PutCoords(record.BoundingBox.Maxx, record.BoundingBox.Miny); IPointCollection pointCollection; pointCollection = new ESRI.ArcGIS.Geometry.PolygonClass(); object x = Type.Missing; object y = Type.Missing; pointCollection.AddPoint(point, ref x, ref y); pointCollection.AddPoint(point1, ref x, ref y); pointCollection.AddPoint(point2, ref x, ref y); pointCollection.AddPoint(point3, ref x, ref y); PolygonElementClass element = new PolygonElementClass(); element.Symbol = simpleFillSymbol; element.SpatialReference = spatialReference; element.Geometry.SpatialReference = spatialReference; element.Geometry = (IGeometry)pointCollection; element.Geometry.Project(mxDoc.ActiveView.Extent.SpatialReference); //add the graphics element to the map IGraphicsContainer graphicsContainer; graphicsContainer = (IGraphicsContainer)mxDoc.FocusMap; if (deleteelements) { graphicsContainer.DeleteAllElements(); } graphicsContainer.AddElement(element, 0); if (refreshview) { mxDoc.ActiveView.Extent = element.Geometry.Envelope; mxDoc.ActiveView.Refresh(); } }
/// <summary> /// Retrieve metadata from CSW service by its ID /// </summary> /// <param name="DocID">Metadata document ID</param> public bool GetMetadataByID(string DocID, bool bApplyTransform) { _response = new CswSearchResponse(); StringBuilder sb = new StringBuilder(); if (DocID == null || DocID == "") { throw new ArgumentNullException(); } if (_catalog == null) { throw new NullReferenceException("Catalog not specified."); } if (_catalog.Capabilities == null) { throw new NullReferenceException("Catalog capabilities not initialized."); } if (_catalog.Profile == null) { throw new NullReferenceException("Catalog profile not specified."); } if (_catalog.Capabilities.GetRecordByID_GetURL == null || _catalog.Capabilities.GetRecordByID_GetURL.Length == 0) { throw new NullReferenceException("GetRecordByID URL not specified for the catalog capabilities."); } CswProfile profile = _catalog.Profile; writeLogMessage(" Csw profile used : " + profile.Name); // generate request url string getRecordByIDBaseUrl = _catalog.Capabilities.GetRecordByID_GetURL; string requestUrl = profile.GenerateCSWGetMetadataByIDRequestURL(getRecordByIDBaseUrl, DocID); sb.AppendLine(DateTime.Now + " GetRecordsById request URL : " + requestUrl); if (_cswClient == null) { _cswClient = new CswClient(); } string responseText = _cswClient.SubmitHttpRequest("GET", requestUrl, ""); _response.ResponseXML = responseText; sb.AppendLine(DateTime.Now + " GetRecordsById response xml : " + responseText); CswRecord record = new CswRecord(DocID); bool isTransformed = false; if (bApplyTransform) { isTransformed = profile.TransformCSWGetMetadataByIDResponse(responseText, record); if (isTransformed) { sb.AppendLine(DateTime.Now + " Transformed xml : " + record.FullMetadata); } } else { record.FullMetadata = responseText; } /*if (!isTransformed) * { * XmlDocument responseXml = new XmlDocument(); * try { responseXml.LoadXml(responseText); } * catch (XmlException xmlEx) * { * throw new XmlException("Error occurred \r\n" + xmlEx.Message); * } * record.FullMetadata = responseXml.FirstChild.InnerText ; * }*/ // add record to the response CswRecords records = new CswRecords(); if (record != null) { records.Add(record.ID, record); } _response.Records = records; _mapServerUrl = record.MapServerURL; if (_mapServerUrl != null) { sb.AppendLine(DateTime.Now + " Map Server Url : " + _mapServerUrl); } writeLogMessage(sb.ToString()); return(isTransformed); }
/// <summary> /// Added record to records object collection /// </summary> /// <param name="key"></param> /// <param name="record"></param> public void AddRecord(object key, CswRecord record) { base.Add(key, record); }
/// <summary> /// Get Add to map information /// </summary> /// <param name="DocID">document identifier</param> public void GetAddToMapInfoByID(string DocID) { _response = new CswSearchResponse(); StringBuilder sb = new StringBuilder(); if (DocID == null || DocID == "") { throw new ArgumentNullException(); } if (_catalog == null) { throw new NullReferenceException("Catalog not specified."); } if (_catalog.Capabilities == null) { throw new NullReferenceException("Catalog capabilities not initialized."); } if (_catalog.Profile == null) { throw new NullReferenceException("Catalog profile not specified."); } if (_catalog.Capabilities.GetRecordByID_GetURL == null || _catalog.Capabilities.GetRecordByID_GetURL.Length == 0) { sb.AppendLine(DateTime.Now + " GetRecordByID URL not specified for the catalog capabilities."); throw new NullReferenceException("GetRecordByID URL not specified for the catalog capabilities."); } CswProfile profile = _catalog.Profile; // generate request url string getRecordByIDBaseUrl = _catalog.Capabilities.GetRecordByID_GetURL; string requestUrl = profile.GenerateCSWGetMetadataByIDRequestURL(getRecordByIDBaseUrl, DocID); sb.AppendLine(DateTime.Now + " GetRecordsById request URL : " + requestUrl); if (_cswClient == null) { _cswClient = new CswClient(); } string responseText = _cswClient.SubmitHttpRequest("GET", requestUrl, ""); _response.ResponseXML = responseText; sb.AppendLine(DateTime.Now + " GetRecordsById response xml : " + responseText); CswRecord record = new CswRecord(DocID); profile.ReadCSWGetMetadataByIDResponse(responseText, record); if (record.MetadataResourceURL != null && record.MetadataResourceURL.Equals("") && profile.Name.Equals("terra catalog CSW 2.0.2 AP ISO")) { record.FullMetadata = responseText; } if (record == null) { throw new NullReferenceException("Record not populated."); } // check if full metadata or resourceURL has been returned bool hasFullMetadata = !(record.FullMetadata == null || record.FullMetadata == ""); bool hasResourceUrl = !(record.MetadataResourceURL == null || record.MetadataResourceURL == ""); if (!hasFullMetadata && !hasResourceUrl) { // throw new InvalidOperationException("Neither full metadata nor metadata resource URL was found for the CSW record."); } else if (!hasFullMetadata && record.MetadataResourceURL != null) { // need to load metadata from resource URL responseText = _cswClient.SubmitHttpRequest("GET", record.MetadataResourceURL, "", "", ""); record.FullMetadata = responseText; } // add record to the response CswRecords records = new CswRecords(); if (record != null) { records.Add(record.ID, record); } _response.Records = records; _mapServerUrl = record.MapServerURL; if (_mapServerUrl != null) sb.AppendLine(DateTime.Now + " Map Server Url : " + _mapServerUrl); writeLogMessage(sb.ToString()); }
/// <summary> /// Retrieve metadata from CSW service by its ID /// </summary> /// <param name="DocID">Metadata document ID</param> public bool GetMetadataByID(string DocID, bool bApplyTransform) { _response = new CswSearchResponse(); StringBuilder sb = new StringBuilder(); if (DocID == null || DocID == "") { throw new ArgumentNullException(); } if (_catalog == null) { throw new NullReferenceException("Catalog not specified."); } if (_catalog.Capabilities == null) { throw new NullReferenceException("Catalog capabilities not initialized."); } if (_catalog.Profile == null) { throw new NullReferenceException("Catalog profile not specified."); } if (_catalog.Capabilities.GetRecordByID_GetURL == null || _catalog.Capabilities.GetRecordByID_GetURL.Length == 0) { throw new NullReferenceException("GetRecordByID URL not specified for the catalog capabilities."); } CswProfile profile = _catalog.Profile; writeLogMessage(" Csw profile used : " + profile.Name); // generate request url string getRecordByIDBaseUrl = _catalog.Capabilities.GetRecordByID_GetURL; string requestUrl = profile.GenerateCSWGetMetadataByIDRequestURL(getRecordByIDBaseUrl, DocID); sb.AppendLine(DateTime.Now + " GetRecordsById request URL : " + requestUrl); if (_cswClient == null) { _cswClient = new CswClient(); } string responseText = _cswClient.SubmitHttpRequest("GET", requestUrl, ""); _response.ResponseXML = responseText; sb.AppendLine(DateTime.Now + " GetRecordsById response xml : " + responseText); CswRecord record = new CswRecord(DocID); bool isTransformed = false; if (bApplyTransform) { isTransformed = profile.TransformCSWGetMetadataByIDResponse(responseText, record); if(isTransformed) sb.AppendLine(DateTime.Now + " Transformed xml : " + record.FullMetadata); } else { record.FullMetadata = responseText; } /*if (!isTransformed) { XmlDocument responseXml = new XmlDocument(); try { responseXml.LoadXml(responseText); } catch (XmlException xmlEx) { throw new XmlException("Error occurred \r\n" + xmlEx.Message); } record.FullMetadata = responseXml.FirstChild.InnerText ; }*/ // add record to the response CswRecords records = new CswRecords(); if (record != null) { records.Add(record.ID, record); } _response.Records = records; _mapServerUrl = record.MapServerURL; if (_mapServerUrl != null) sb.AppendLine(DateTime.Now + " Map Server Url : " + _mapServerUrl); writeLogMessage(sb.ToString()); return isTransformed; }