示例#1
0
        /// <summary>
        /// Loads the catalog details from configuration file.
        /// </summary>
        /// <remarks>
        /// The catalog details are loaded in the collection.
        /// Duplicate or invalid catalog are ignored.
        /// Invalid catalog includes catalogs with profiles information
        /// not present in profiles collection.
        /// </remarks>
        /// <param name="param1">the catalog configuration file</param>
        /// <param name="param2">the profiles collection</param>
        public void loadCatalogfromConfig(string filename, CswProfiles profileList)
        {
            try {
                XmlDocument doc = new XmlDocument();
                doc.Load(filename);
                XmlNodeList xmlnodes = doc.GetElementsByTagName("CSWCatalog");

                foreach (XmlNode xmlnode in xmlnodes)
                {
                    String url       = XmlDatatoString(xmlnode.SelectSingleNode("URL").InnerText);
                    String name      = XmlDatatoString(xmlnode.SelectSingleNode("Name").InnerText);
                    String profileID = xmlnode.SelectSingleNode("CSWProfile").InnerText;
                    if (profileList.ContainsKey(profileID))
                    {
                        CswProfile profile = (CswProfile)profileList[profileID];
                        CswCatalog catalog = new CswCatalog(url, name, profile);
                        this.AddCatalog(catalog.ID, catalog);
                    }
                }
            }
            catch (Exception ex) {
                throw ex;
            }
        }
示例#2
0
        /// <summary>
        /// Add a key value pair to profile collection.
        /// </summary>
        /// <remarks>
        /// Add to profile collection.
        /// </remarks>
        /// <param name="param1">The key which is the url hashcode for the profile</param>
        /// <param name="param2">The profile object</param>

        public void AddProfile(object key, CswProfile profile)
        {
            base.Add(key, profile);
        }
示例#3
0
        public void SetServiceProps(DcList references)
        {
            // determine the service url, name and type
            LinkedList <String> schemeVals = references.get(DcList.getScheme(DcList.Scheme.SERVER));

            if (schemeVals.Count > 0)
            {
                mapServerURL = chkStr(schemeVals.First.Value);
            }
            if (mapServerURL == null)
            {
                mapServerURL = String.Empty;
            }
            ;

            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)
            {
                this.Protocol = (schemeVals.First.Value);
            }
            if ((mapServerURL.Length > 0) && (this.Protocol == null))
            {
                this.Protocol = CswProfile.DeduceProtocolFromURL(mapServerURL);
            }

            // handle the case where an ArcIMS service has been specified with
            // server/service/this.Protocol parameters
            if ((mapServerURL.Length > 0) &&
                (this.Protocol.Equals("image", StringComparison.CurrentCultureIgnoreCase) ||
                 this.Protocol.Equals("feature") ||
                 this.Protocol.Equals("metadata")))
            {
                if ((serviceName.Length > 0))
                {
                    String esrimap = "servlet/com.esri.esrimap.Esrimap";
                    if (mapServerURL.IndexOf("esrimap") == -1)
                    {
                        if (mapServerURL.IndexOf("?") == -1)
                        {
                            if (!mapServerURL.EndsWith("/"))
                            {
                                mapServerURL += "/";
                            }
                            mapServerURL = mapServerURL + esrimap + "?ServiceName=" + serviceName;
                        }
                    }
                    else
                    {
                        if (mapServerURL.IndexOf("?") == -1)
                        {
                            mapServerURL = mapServerURL + "?ServiceName=" + serviceName;
                        }
                        else if (mapServerURL.IndexOf("ServiceName=") == -1)
                        {
                            mapServerURL = mapServerURL + "&ServiceName=" + serviceName;
                        }
                    }
                }

                if (this.Protocol.Equals("image"))
                {
                    this.Protocol = "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 (mapServerURL.Length == 0)
            {
                foreach (DcList.Value reference in references)
                {
                    if (reference != null)
                    {
                        String url  = reference.getValue();
                        String type = CswProfile.DeduceProtocolFromURL(url);
                        if (type.Length > 0)
                        {
                            mapServerURL  = url;
                            this.Protocol = type;
                            break;
                        }
                    }
                }
            }
        }
示例#4
0
        /// <summary>
        /// Update the name of an exsisting Catalog. 
        /// </summary>
        /// <remarks>
        /// The catalog name is updated from the collection.
        /// The catalog name is also updated from the configuration file.
        /// </remarks>
        /// <param name="catalog">CswCatalog</param>
        /// <param name="name">The string display name</param>
        /// <param name="url">The string url</param>
        /// <param name="name">The profile</param>
        public void updateCatalog(CswCatalog catalog, String displayname, String url, CswProfile profile)
        {

            if (!isUserCatalogExists())
            {
                createUserCatalogFile();

            }

            catalogList.updateCatalogNameinConfig(catalog, displayname, url, profile, USER_CATALOGFILE);

        }
示例#5
0
        /// <summary>
        /// Search CSW catalog using the provided criteria. Search result can be accessed by calling GetResponse().
        /// </summary>
        public void Search()
        {
            try
            {
                _response = new CswSearchResponse();
                StringBuilder sb = new StringBuilder();

                if (_criteria == null)
                {
                    sb.AppendLine(DateTime.Now + " Criteria not specified.");
                    throw new NullReferenceException("Criteria not specified.");
                }
                if (_catalog == null)
                {
                    sb.AppendLine(DateTime.Now + " Catalog not specified.");
                    throw new NullReferenceException("Catalog not specified.");
                }
                if (_catalog.URL == null || _catalog.URL.Length == 0)
                {
                    sb.AppendLine(DateTime.Now + " Catalog URL not specified.");
                    throw new NullReferenceException("Catalog URL not specified.");
                }
                if (_catalog.Profile == null)
                {
                    sb.AppendLine(DateTime.Now + " Catalog profile not specified.");
                    throw new NullReferenceException("Catalog profile not specified.");
                }

                CswProfile profile = _catalog.Profile;

                // generate getRecords query
                string requestUrl = _catalog.Capabilities.GetRecords_PostURL;
                //Set Breakpoint to see transformed request (use xml viewer on tooltip variable)
                string requestQuery = profile.GenerateCSWGetRecordsRequest(_criteria);

                sb.AppendLine("Untransformed Request Query : " + profile.LastUntransformedGetRecordsRequest.InnerXml);

                //   requestQuery = "<csw:GetCapabilities xmlns:csw=\"http://www.opengis.net/cat/csw/2.0.2\" request=\"GetCapabilities\" service=\"CSW\" version=\"2.0.2\"/>";

                requestQuery = requestQuery.Replace("utf-16", "utf-8");
                requestQuery = requestQuery.Replace("UTF-16", "UTF-8");

                // submit search query
                if (_cswClient == null)
                {
                    _cswClient = new CswClient();
                }

                string responseText;
                sb.AppendLine(DateTime.Now + " Sending CSW GetRecords request to endpoint : " + requestUrl);
                sb.AppendLine("Request Query : " + requestQuery);
                if (!_catalog.Capabilities.GetRecords_IsSoapEndPoint)
                {
                    responseText = _cswClient.SubmitHttpRequest("POST", requestUrl, requestQuery);
                }
                else
                {
                    responseText = _cswClient.SubmitHttpRequest("SOAP", requestUrl, requestQuery);
                }

                // parse out csw search records
                CswRecords records = new CswRecords();
                sb.AppendLine(DateTime.Now + " Response received : " + responseText);
                profile.ReadCSWGetRecordsResponse(responseText, records);
                sb.AppendLine(DateTime.Now + " Parsed GetRecords response.");

                // populate CSW response
                _response.ResponseXML = responseText;
                _response.Records     = records;

                writeLogMessage(sb.ToString());
            }
            catch (Exception e)
            {
                writeLogMessage(DateTime.Now + " " + e.ToString());
            }
        }
示例#6
0
        // Get Add to map information
        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());
        }
示例#7
0
        /// <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;

            // 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);
        }
示例#8
0
  /// <summary>
  /// Update the name of an exsisting Catalog. 
  /// The name is also updated in the configuration file.
  /// </summary>
  /// <remarks>
  /// The catalog name is updated from the collection.
  /// The catalog name is also updated from the configuration file.
  /// </remarks>
  /// <param name="param1">CswCatalog</param>
  /// <param name="param2">The string name</param>
  /// <param name="param2">The string updated url</param>
  ///  <param name="param2">The string name</param>
  /// <param name="param3">the catalog configuration file</param>
 public void updateCatalogNameinConfig(CswCatalog catalog, string displayname, string surl,CswProfile profile,string filename) {
     try {
         CswCatalog updatedcatalog = (CswCatalog)this[catalog.ID.ToString()];
         updatedcatalog.Name = displayname;
         updatedcatalog.URL =surl;
         updatedcatalog.Profile = profile;
         updatetoFile(filename);
     }
     catch (Exception ex) {
         throw ex;
     }
 }
示例#9
0
 public CswCatalog(String surl, String sname, CswProfile oprofile) {
     id = "catalog" + IDCounter.ToString();
     IDCounter++;
     URL = surl;
     Profile = oprofile;
     Name = sname;
     Locking = false;
             
 }
示例#10
0
        /// <summary>
        /// Add a key value pair to profile collection. 
        /// </summary>
        /// <remarks>
        /// Add to profile collection.
        /// </remarks>
        /// <param name="param1">The key which is the url hashcode for the profile</param>
        /// <param name="param2">The profile object</param>

        public void AddProfile(object key, CswProfile profile) {
            base.Add(key,profile);
        }
示例#11
0
 /// <summary>
 /// Update the name of an exsisting Catalog.
 /// The name is also updated in the configuration file.
 /// </summary>
 /// <remarks>
 /// The catalog name is updated from the collection.
 /// The catalog name is also updated from the configuration file.
 /// </remarks>
 /// <param name="param1">CswCatalog</param>
 /// <param name="param2">The string name</param>
 /// <param name="param2">The string updated url</param>
 ///  <param name="param2">The string name</param>
 /// <param name="param3">the catalog configuration file</param>
 public void updateCatalogNameinConfig(CswCatalog catalog, string displayname, string surl, CswProfile profile, string filename)
 {
     try {
         CswCatalog updatedcatalog = (CswCatalog)this[catalog.ID.ToString()];
         updatedcatalog.Name    = displayname;
         updatedcatalog.URL     = surl;
         updatedcatalog.Profile = profile;
         updatetoFile(filename);
     }
     catch (Exception ex) {
         throw ex;
     }
 }