Exemplo n.º 1
0
        public DataServiceInfo ReadWaterOneFlowServiceInfo(string portalPageId)
        {
            DataServiceInfo serviceInfo = null;

            // Create the URL to the descriptive info about the registered item on the HydroPortal
            string url = _baseUrl + "/rest/document?id={" + portalPageId + "}";

            // Determine if this is registered using the FGDC standard or Dublin Core standard, or neither
            string response = WebOperations.DownloadASCII(url);
            int    index    = response.IndexOf("<ServiceType>CUAHSIService</ServiceType>");

            if (index > -1)
            {
                // FGDC Standard
                index = response.IndexOf("<metstdn>FGDC Content Standards for Digital Geospatial</metstdn>");
                if (index > -1)
                {
                    index = response.IndexOf("<WaterOneFlowURL>");
                    if (index > -1)
                    {
                        serviceInfo = ParseFgdcPage(url);
                    }
                }
            }
            //else
            //{
            //    index = response.IndexOf ( "<dc:contributor>The Dublin Core Metadata Initiative</dc:contributor>" );
            //    if ( index > -1 )
            //    {
            //        // Dublin Core Standard
            //        string detailsUrl = _baseUrl + "/catalog/search/viewMetadataDetails.page?uuid={" + portalPageId + "}";

            //        response = WebOperations.DownloadASCII ( detailsUrl );
            //        index = response.IndexOf ( "<td class=\"parameterLabel\">WaterOneFlow URL</td>" );

            //        if ( index > -1 )
            //        {
            //            serviceInfo = ParseDublinCorePage ( url );
            //        }
            //    }
            //}

            return(serviceInfo);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Returns the base URL of the HydroPortal.  This is required in order to properly construct REST queries on the portal.
        /// </summary>
        /// <param name="portalUrl">Original HydroPortal URL, e.g., https://hydroportal.crwr.utexas.edu/geoportal/catalog/main/home.page or https://hydroportal.crwr.utexas.edu/geoportal</param>
        /// <returns>Base HydroPortal URL, e.g., https://hydroportal.crwr.utexas.edu/geoportal</returns>
        private string GetBasePortalUrl(string portalUrl)
        {
            // Create a URI object from the given portal URL.  This accounts for possible redirect.
            Uri    uri     = WebOperations.GetUri(portalUrl, true);
            string baseUrl = uri.ToString();

            // Trim the home page fluff
            int index = baseUrl.ToLower().IndexOf("geoportal/catalog");

            if (index > -1)
            {
                baseUrl = portalUrl.Substring(0, index + 9);
            }

            // Trim current searches
            index = baseUrl.IndexOf("geoportal/rest");
            if (index > -1)
            {
                baseUrl = portalUrl.Substring(0, index + 9);
            }

            // Trim parameters
            index = baseUrl.IndexOf("?");
            if (index > -1)
            {
                baseUrl = portalUrl.Substring(0, index);
            }

            // Make sure this is still a valid URL
            if (!WebOperations.IsUrlValid(baseUrl, false))
            {
                baseUrl = uri.ToString();                  // Revert back to the URI that worked
            }

            // Remove trailing backslash
            index = baseUrl.LastIndexOf("/");
            if (index == (baseUrl.Length - 1))
            {
                baseUrl = baseUrl.Substring(0, baseUrl.Length - 1);
            }

            return(baseUrl);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Parses a HydroPortal page for a WaterOneFlow service registered using the FGDC metadata standard.
        /// </summary>
        /// <param name="pageUrl">The URL to the HydroPortal page describing the service</param>
        /// <returns>If the page describes a WaterOneFlow service, a DataServiceInfo object describing the service is returned</returns>
        private DataServiceInfo ParseFgdcPage(string pageUrl)
        {
            DataServiceInfo serviceInfo = new DataServiceInfo();

            try
            {
                using (XmlTextReader reader = new XmlTextReader(pageUrl))
                {
                    while (reader.Read())
                    {
                        if (reader.NodeType == XmlNodeType.Element)
                        {
                            // Abstract
                            if (reader.Name.ToLower() == "abstract")
                            {
                                reader.Read();
                                serviceInfo.Abstract = reader.Value;
                            }

                            // Citation
                            else if (reader.Name.ToLower() == "citation")
                            {
                                string origin   = "(unknown author)";
                                string title    = "(unknown title)";
                                string pubplace = "(unknown organization)";
                                string pubdate  = "unknown date";
                                string link     = "(unknown link)";

                                while (reader.Read())
                                {
                                    if (reader.NodeType == XmlNodeType.Element)
                                    {
                                        if (reader.Name.ToLower() == "origin")
                                        {
                                            reader.Read();
                                            if (reader.Value.Trim() != String.Empty)
                                            {
                                                origin = reader.Value;
                                            }
                                        }
                                        else if (reader.Name.ToLower() == "title")
                                        {
                                            reader.Read();
                                            if (reader.Value.Trim() != String.Empty)
                                            {
                                                title = reader.Value;
                                            }
                                        }
                                        else if (reader.Name.ToLower() == "pubplace")
                                        {
                                            reader.Read();
                                            if (reader.Value.Trim() != String.Empty)
                                            {
                                                pubplace = reader.Value;
                                            }
                                        }
                                        else if (reader.Name.ToLower() == "pubdate")
                                        {
                                            reader.Read();
                                            if (reader.Value.Trim() != String.Empty)
                                            {
                                                pubdate = reader.Value;
                                            }
                                        }
                                        else if (reader.Name.ToLower() == "onlink")
                                        {
                                            reader.Read();
                                            if (reader.Value.Trim() != String.Empty)
                                            {
                                                link = reader.Value;
                                            }
                                        }
                                    }
                                    else if (reader.NodeType == XmlNodeType.EndElement && reader.Name == "citation")
                                    {
                                        break;
                                    }
                                }
                                serviceInfo.Citation = origin + ". " + title + ". " + pubdate + ". " + pubplace + ". <" + link + ">.";
                            }

                            // Contact Name and Email
                            else if (reader.Name.ToLower() == "ptcontac")
                            {
                                string contactName  = "";
                                string contactEmail = "";

                                while (reader.Read())
                                {
                                    if (reader.NodeType == XmlNodeType.Element)
                                    {
                                        if (reader.Name.ToLower() == "cntper")
                                        {
                                            reader.Read();
                                            contactName = reader.Value;
                                        }
                                        else if (reader.Name.ToLower() == "cntemail")
                                        {
                                            reader.Read();
                                            contactEmail = reader.Value;
                                        }
                                    }
                                    else if (reader.NodeType == XmlNodeType.EndElement && reader.Name == "ptcontac")
                                    {
                                        break;
                                    }
                                }

                                serviceInfo.ContactEmail = contactEmail;
                                serviceInfo.ContactName  = contactName;
                            }

                            // Bounding Box
                            else if (reader.Name == "bounding")
                            {
                                double west  = 0;
                                double east  = 0;
                                double north = 0;
                                double south = 0;

                                while (reader.Read())
                                {
                                    if (reader.NodeType == XmlNodeType.Element)
                                    {
                                        if (reader.Name.ToLower() == "westbc")
                                        {
                                            reader.Read();
                                            double.TryParse(reader.Value, out west);
                                        }
                                        else if (reader.Name.ToLower() == "eastbc")
                                        {
                                            reader.Read();
                                            double.TryParse(reader.Value, out east);
                                        }
                                        else if (reader.Name.ToLower() == "northbc")
                                        {
                                            reader.Read();
                                            double.TryParse(reader.Value, out north);
                                        }
                                        else if (reader.Name.ToLower() == "southbc")
                                        {
                                            reader.Read();
                                            double.TryParse(reader.Value, out south);
                                        }
                                    }
                                    else if (reader.NodeType == XmlNodeType.EndElement && reader.Name == "bounding")
                                    {
                                        break;
                                    }
                                }

                                serviceInfo.EastLongitude = east;
                                serviceInfo.WestLongitude = west;
                                serviceInfo.NorthLatitude = north;
                                serviceInfo.SouthLatitude = south;
                            }

                            // Service Code
                            else if (reader.Name == "ServiceCode")
                            {
                                reader.Read();
                                serviceInfo.ServiceCode = reader.Value;
                            }

                            // Service Endpoint URL
                            else if (reader.Name == "WaterOneFlowURL")
                            {
                                reader.Read();
                                serviceInfo.EndpointURL = WebOperations.GetCanonicalUri(reader.Value, true);
                            }

                            // Service Description URL
                            else if (reader.Name == "MapServiceURL")
                            {
                                reader.Read();
                                serviceInfo.DescriptionURL = reader.Value;
                            }

                            // Service Title
                            else if (reader.Name == "ServiceName")
                            {
                                reader.Read();
                                serviceInfo.ServiceTitle = reader.Value;
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw new WebException("Could not read XML response from " + pageUrl + ".\n" + ex.Message);
            }

            return(serviceInfo);
        }
Exemplo n.º 4
0
        /// <summary>
        /// Parses a HydroPortal page for a WaterOneFlow service registered using the Dublin Core metadata standard.
        /// </summary>
        /// <param name="pageUrl">The URL to the HydroPortal page describing the service</param>
        /// <returns>If the page describes a WaterOneFlow service, a DataServiceInfo object describing the service is returned</returns>
        private DataServiceInfo ParseDublinCorePage(string pageUrl)
        {
            DataServiceInfo serviceInfo = new DataServiceInfo();

            try
            {
                using (XmlTextReader reader = new XmlTextReader(pageUrl))
                {
                    while (reader.Read())
                    {
                        if (reader.NodeType == XmlNodeType.Element)
                        {
                            // Abstract
                            if (reader.Name.ToLower() == "dc:description")
                            {
                                reader.Read();
                                serviceInfo.Abstract = reader.Value;
                            }

                            // Bounding Box
                            else if (reader.Name == "ows:WGS84BoundingBox")
                            {
                                double west  = 0;
                                double east  = 0;
                                double north = 0;
                                double south = 0;

                                while (reader.Read())
                                {
                                    if (reader.NodeType == XmlNodeType.Element)
                                    {
                                        if (reader.Name == "ows:LowerCorner")
                                        {
                                            reader.Read();
                                            string[] lowerCorner = reader.Value.Split(' ');
                                            if (lowerCorner.Length == 2)
                                            {
                                                double.TryParse(lowerCorner[0], out west);
                                                double.TryParse(lowerCorner[1], out south);
                                            }
                                        }
                                        else if (reader.Name == "ows:UpperCorner")
                                        {
                                            reader.Read();
                                            string[] upperCorner = reader.Value.Split(' ');
                                            if (upperCorner.Length == 2)
                                            {
                                                double.TryParse(upperCorner[0], out east);
                                                double.TryParse(upperCorner[1], out north);
                                            }
                                        }
                                    }
                                    else if (reader.NodeType == XmlNodeType.EndElement && reader.Name == "ows:WGS84BoundingBox")
                                    {
                                        break;
                                    }
                                }

                                serviceInfo.EastLongitude = east;
                                serviceInfo.WestLongitude = west;
                                serviceInfo.NorthLatitude = north;
                                serviceInfo.SouthLatitude = south;
                            }

                            // Service Code
                            else if (reader.Name.ToLower() == "dc:title")
                            {
                                reader.Read();
                                serviceInfo.ServiceCode = reader.Value;
                            }

                            // Service Endpoint URL
                            else if (reader.Name.ToLower() == "dc:creator")
                            {
                                reader.Read();
                                serviceInfo.EndpointURL = WebOperations.GetCanonicalUri(reader.Value, true);
                            }

                            // Service Description URL
                            else if (reader.Name == "dct:references")
                            {
                                reader.Read();
                                serviceInfo.DescriptionURL = reader.Value;
                            }

                            // Service Title
                            else if (reader.Name.ToLower() == "dct:alternative")
                            {
                                reader.Read();
                                serviceInfo.ServiceTitle = reader.Value;
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw new WebException("Could not read XML response from " + pageUrl + ".\n" + ex.Message);
            }

            return(serviceInfo);
        }