Example #1
0
        public IEnumerable <SupermarketQueryResult> EndQuery(IAsyncResult result)
        {
            if (!result.IsCompleted)
            {
                result.AsyncWaitHandle.WaitOne();
            }

            SupermarketResult supermarketResult = result as SupermarketResult;

            if (supermarketResult == null)
            {
                throw new ArgumentException(InvalidAsyncResult, "result");
            }

            WebRequest req = supermarketResult.InnerResult.AsyncState as WebRequest;

            if (req == null)
            {
                throw new ArgumentException(InvalidAsyncResult, "result");
            }

            XElement            root;
            XmlNamespaceManager nsmgr;

            using (WebResponse resp = req.EndGetResponse(supermarketResult.InnerResult))
                using (Stream stream = resp.GetResponseStream())
                {
                    XmlReader reader = XmlReader.Create(stream);
                    root  = XElement.Load(reader);
                    nsmgr = new XmlNamespaceManager(reader.NameTable);
                }

            // Extend the namespace manager with some prefixes needed for processing results.
            nsmgr.AddNamespace(SupermarketPrefix, SupermarketNS);

            /* TODO: add error handling
             * var errors = root.XPathSelectElements(SearchErrorXPath, nsmgr);
             * if (errors.Count() > 0)
             *  // TODO:  Probably want to report these somewhere.
             *  throw new ApplicationException("Search service errors were returned.");
             */

            var searchProductResults = root.XPathSelectElements(SearchProductResultXPath, nsmgr);

            foreach (var webResult in searchProductResults)
            {
                var itemName    = webResult.XPathSelectElement(SearchProductResultItemname, nsmgr);
                var description = webResult.XPathSelectElement(SearchProductResultItemDescription, nsmgr);
                var category    = webResult.XPathSelectElement(SearchProductResultItemCategory, nsmgr);
                var id          = webResult.XPathSelectElement(SearchProductResultItemID, nsmgr);
                var image       = webResult.XPathSelectElement(SearchProductResultItemImage, nsmgr);
                var aisle       = webResult.XPathSelectElement(SearchProductResultAisleNumber, nsmgr);
                var retval      = new SupermarketQueryResult();
                retval[SupermarketQueryResult.Name]        = itemName != null ? itemName.Value : null;
                retval[SupermarketQueryResult.Description] = description != null ? description.Value : null;
                retval[SupermarketQueryResult.Category]    = category != null ? category.Value : null;
                retval[SupermarketQueryResult.ID]          = id != null ? id.Value : null;
                retval[SupermarketQueryResult.Image]       = image != null ? image.Value : null;
                retval[SupermarketQueryResult.Aisle]       = aisle != null ? aisle.Value : null;
                yield return(retval);
            }
        }
Example #2
0
        public IEnumerable<SupermarketQueryResult> EndQuery(IAsyncResult result)
        {
            if (!result.IsCompleted)
                result.AsyncWaitHandle.WaitOne();

            SupermarketResult supermarketResult = result as SupermarketResult;
            if (supermarketResult == null)
                throw new ArgumentException(InvalidAsyncResult, "result");

            WebRequest req = supermarketResult.InnerResult.AsyncState as WebRequest;
            if (req == null)
                throw new ArgumentException(InvalidAsyncResult, "result");

            XElement root;
            XmlNamespaceManager nsmgr;

            using (WebResponse resp = req.EndGetResponse(supermarketResult.InnerResult))
            using (Stream stream = resp.GetResponseStream())
            {
                XmlReader reader = XmlReader.Create(stream);
                root = XElement.Load(reader);
                nsmgr = new XmlNamespaceManager(reader.NameTable);
            }

            // Extend the namespace manager with some prefixes needed for processing results.
            nsmgr.AddNamespace(SupermarketPrefix, SupermarketNS);

            /* TODO: add error handling
            var errors = root.XPathSelectElements(SearchErrorXPath, nsmgr);
            if (errors.Count() > 0)
                // TODO:  Probably want to report these somewhere.
                throw new ApplicationException("Search service errors were returned.");
             */

            var searchProductResults = root.XPathSelectElements(SearchProductResultXPath, nsmgr);
            foreach (var webResult in searchProductResults)
            {
                var itemName = webResult.XPathSelectElement(SearchProductResultItemname, nsmgr);
                var description = webResult.XPathSelectElement(SearchProductResultItemDescription, nsmgr);
                var category = webResult.XPathSelectElement(SearchProductResultItemCategory, nsmgr);
                var id = webResult.XPathSelectElement(SearchProductResultItemID, nsmgr);
                var image = webResult.XPathSelectElement(SearchProductResultItemImage, nsmgr);
                var aisle = webResult.XPathSelectElement(SearchProductResultAisleNumber, nsmgr);
                var retval = new SupermarketQueryResult();
                retval[SupermarketQueryResult.Name] = itemName != null ? itemName.Value : null;
                retval[SupermarketQueryResult.Description] = description != null ? description.Value : null;
                retval[SupermarketQueryResult.Category] = category != null ? category.Value : null;
                retval[SupermarketQueryResult.ID] = id != null ? id.Value : null;
                retval[SupermarketQueryResult.Image] = image != null ? image.Value : null;
                retval[SupermarketQueryResult.Aisle] = aisle != null ? aisle.Value : null;
                yield return retval;
            }
        }