예제 #1
0
        /// <summary>
        /// Removes a resource from the syndication data source.
        /// </summary>
        /// <param name="request">The request from the syndication data source for the resource to be removed.</param>
        /// <param name="entry">the resource that is being deleted</param>
        /// <returns><b>true</b> if the syndication resource was successfully deleted; otherwise, <b>false</b>.</returns>
        public virtual bool DeleteEntry(SDataBaseRequest request, AtomEntry entry)
        {
            Guard.ArgumentNotNull(request, "request");

            try
            {
                var url  = request.ToString();
                var eTag = entry != null?entry.GetSDataHttpETag() : null;

                var batchItem = new SDataBatchRequestItem
                {
                    Url    = url,
                    Method = HttpMethod.Delete,
                    ETag   = eTag
                };

                if (BatchProcess.Instance.AddToBatch(batchItem))
                {
                    return(true);
                }

                var operation = new RequestOperation(HttpMethod.Delete)
                {
                    ETag = eTag
                };
                var response = ExecuteRequest(url, operation, MediaType.AtomEntry, MediaType.Xml);
                return(response.StatusCode == HttpStatusCode.OK);
            }
            catch (Exception ex)
            {
                throw new SDataClientException(ex.Message, ex);
            }
        }
        /// <summary>
        /// Adds a url to the batch for processing
        /// </summary>
        /// <param name="item">url for batch item</param>
        public void AddToBatch(SDataBatchRequestItem item)
        {
            Guard.ArgumentNotNull(item, "item");

            var uri = new SDataUri(item.Url)
                      {
                          CollectionPredicate = null,
                          Query = null
                      };

            if (uri.PathSegments.Length > 3)
            {
                uri.PathSegments = uri.PathSegments.Take(3).ToArray();
            }

            var baseUri = uri.ToString();
            var request = _requests.LastOrDefault(x => x.ToString() == baseUri);

            if (request == null)
            {
                throw new InvalidOperationException("Unable to find an appropriate batch request in progress");
            }

            request.Requests.Add(item);
        }
        /// <summary>
        /// Adds a url to the batch for processing
        /// </summary>
        /// <param name="item">url for batch item</param>
        /// <returns>True if an appropriate pending batch operation was found</returns>
        public bool AddToBatch(SDataBatchRequestItem item)
        {
            Guard.ArgumentNotNull(item, "item");

            var uri = new SDataUri(item.Url)
                      {
                          CollectionPredicate = null,
                          Query = null
                      };

            if (uri.PathSegments.Length > 4)
            {
                uri.TrimRange(4, uri.PathSegments.Length - 4);
            }

            uri.AppendPath("$batch");
            var baseUri = uri.ToString();
            var request = _requests.LastOrDefault(x => string.Equals(x.ToString(), baseUri, StringComparison.InvariantCultureIgnoreCase));

            if (request != null)
            {
                request.Items.Add(item);
                return true;
            }

            return false;
        }
예제 #4
0
        /// <summary>
        /// Adds a new syndication resource to the data source.
        /// </summary>
        /// <param name="request">The request that identifies the resource within the syndication data source.</param>
        /// <param name="entry">The entry that should be created.</param>
        public virtual AtomEntry CreateEntry(SDataBaseRequest request, AtomEntry entry)
        {
            Guard.ArgumentNotNull(request, "request");
            Guard.ArgumentNotNull(entry, "entry");

            try
            {
                var url       = request.ToString();
                var batchItem = new SDataBatchRequestItem
                {
                    Url    = url,
                    Method = HttpMethod.Post,
                    Entry  = entry
                };

                if (BatchProcess.Instance.AddToBatch(batchItem))
                {
                    return(null);
                }

                var operation = new RequestOperation(HttpMethod.Post, entry);
                return(ExecuteEntryRequest(url, operation));
            }
            catch (SDataClientException)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new SDataClientException(ex.Message, ex);
            }
        }
예제 #5
0
        /// <summary>
        /// Adds a url to the batch for processing
        /// </summary>
        /// <param name="item">url for batch item</param>
        /// <returns>True if an appropriate pending batch operation was found</returns>
        public bool AddToBatch(SDataBatchRequestItem item)
        {
            Guard.ArgumentNotNull(item, "item");

            var uri = new SDataUri(item.Url)
            {
                CollectionPredicate = null,
                Query = null
            };

            if (uri.PathSegments.Length > 4)
            {
                uri.TrimRange(4, uri.PathSegments.Length - 4);
            }

            uri.AppendPath("$batch");
            var baseUri = uri.ToString();
            var request = _requests.LastOrDefault(x => string.Equals(x.ToString(), baseUri, StringComparison.InvariantCultureIgnoreCase));

            if (request != null)
            {
                request.Items.Add(item);
                return(true);
            }

            return(false);
        }
        /// <summary>
        /// Adds a url to the batch for processing
        /// </summary>
        /// <param name="item">url for batch item</param>
        /// <returns>True if an appropriate pending batch operation was found</returns>
        public bool AddToBatch(SDataBatchRequestItem item)
        {
            Guard.ArgumentNotNull(item, "item");

            var id      = GetBatchKey(item.Url, "$batch");
            var request = _requests.LastOrDefault(x => string.Equals(GetBatchKey(x.ToString()), id, StringComparison.InvariantCultureIgnoreCase));

            if (request != null)
            {
                request.Items.Add(item);
                return(true);
            }

            return(false);
        }
        /// <summary>
        /// Adds a url to the batch for processing
        /// </summary>
        /// <param name="item">url for batch item</param>
        /// <returns>True if an appropriate pending batch operation was found</returns>
        public bool AddToBatch(SDataBatchRequestItem item)
        {
            Guard.ArgumentNotNull(item, "item");

            var id = GetBatchKey(item.Url, "$batch");
            var request = _requests.LastOrDefault(x => string.Equals(GetBatchKey(x.ToString()), id, StringComparison.InvariantCultureIgnoreCase));

            if (request != null)
            {
                request.Items.Add(item);
                return true;
            }

            return false;
        }
        public void BatchProcess_AddItemWithUnsuitableRequest()
        {
            var service = new SDataService("http://localhost:59213/sdata/aw/dynamic/-/");

            using (var request = new SDataBatchRequest(service) {ResourceKind = "employees"})
            {
                var item = new SDataBatchRequestItem
                           {
                               Url = "http://localhost:59213/sdata/aw/dynamic/-/contacts"
                           };
                var added = BatchProcess.Instance.AddToBatch(item);
                Assert.That(added, Is.False);
                Assert.That(request.Items, Is.Empty);
            }
        }
예제 #9
0
        private AtomEntry CreateEntry(string url, AtomEntry entry)
        {
            Guard.ArgumentNotNull(entry, "entry");

            try
            {
                var batchItem = new SDataBatchRequestItem
                {
                    Url    = url,
                    Method = HttpMethod.Post,
                    Entry  = entry
                };

                if (BatchProcess.Instance.AddToBatch(batchItem))
                {
                    return(null);
                }

                var operation = new RequestOperation(HttpMethod.Post, entry);
                var response  = ExecuteRequest(url, operation, MediaType.AtomEntry, MediaType.Xml);
                var result    = response.Content as AtomEntry;

                if (result == null)
                {
                    var feedResult = response.Content as AtomFeed;
                    if (feedResult != null)
                    {
                        result = feedResult.Entries.FirstOrDefault();
                    }
                }

                if (!string.IsNullOrEmpty(response.ETag) && result != null)
                {
                    result.SetSDataHttpETag(response.ETag);
                }

                return(result);
            }
            catch (Exception ex)
            {
                throw new SDataClientException(ex.Message, ex);
            }
        }
예제 #10
0
        /// <summary>
        /// Reads resource information from the data source based on the URL and the ETag of the specified entry.
        /// </summary>
        /// <param name="request"></param>
        /// <param name="entry"></param>
        /// <returns></returns>
        public virtual AtomEntry ReadEntry(SDataBaseRequest request, AtomEntry entry)
        {
            Guard.ArgumentNotNull(request, "request");

            try
            {
                var requestUrl = request.ToString();
                var eTag       = entry != null?entry.GetSDataHttpETag() : null;

                var batchItem = new SDataBatchRequestItem
                {
                    Url    = requestUrl,
                    Method = HttpMethod.Get,
                    ETag   = eTag
                };

                if (BatchProcess.Instance.AddToBatch(batchItem))
                {
                    return(null);
                }

                var operation = new RequestOperation(HttpMethod.Get)
                {
                    ETag = eTag
                };
                var response = ExecuteRequest(requestUrl, operation, MediaType.AtomEntry, MediaType.Xml);
                entry = (AtomEntry)response.Content;

                if (!string.IsNullOrEmpty(response.ETag))
                {
                    entry.SetSDataHttpETag(response.ETag);
                }

                return(entry);
            }
            catch (Exception ex)
            {
                throw new SDataClientException(ex.Message, ex);
            }
        }
예제 #11
0
        private AtomEntry UpdateEntry(string url, AtomEntry entry)
        {
            Guard.ArgumentNotNull(entry, "entry");

            try
            {
                var eTag      = entry.GetSDataHttpETag();
                var batchItem = new SDataBatchRequestItem
                {
                    Url    = url,
                    Method = HttpMethod.Put,
                    Entry  = entry,
                    ETag   = eTag
                };

                if (BatchProcess.Instance.AddToBatch(batchItem))
                {
                    return(null);
                }

                var operation = new RequestOperation(HttpMethod.Put, entry)
                {
                    ETag = eTag
                };
                var response = ExecuteRequest(url, operation, MediaType.AtomEntry, MediaType.Xml);
                entry = (AtomEntry)response.Content;

                if (!string.IsNullOrEmpty(response.ETag))
                {
                    entry.SetSDataHttpETag(response.ETag);
                }

                return(entry);
            }
            catch (Exception ex)
            {
                throw new SDataClientException(ex.Message, ex);
            }
        }
예제 #12
0
        /// <summary>
        /// Reads resource information from the data source based on the URL and the ETag of the specified entry.
        /// </summary>
        /// <param name="request"></param>
        /// <param name="entry"></param>
        /// <returns></returns>
        public virtual AtomEntry ReadEntry(SDataBaseRequest request, AtomEntry entry)
        {
            Guard.ArgumentNotNull(request, "request");

            try
            {
                var url  = request.ToString();
                var eTag = entry != null?entry.GetSDataHttpETag() : null;

                var batchItem = new SDataBatchRequestItem
                {
                    Url    = url,
                    Method = HttpMethod.Get,
                    ETag   = eTag
                };

                if (BatchProcess.Instance.AddToBatch(batchItem))
                {
                    return(null);
                }

                var operation = new RequestOperation(HttpMethod.Get)
                {
                    ETag = eTag
                };
                return(ExecuteEntryRequest(url, operation));
            }
            catch (SDataClientException)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new SDataClientException(ex.Message, ex);
            }
        }
        /// <summary>
        /// Removes a resource from the syndication data source.
        /// </summary>
        /// <param name="request">The request from the syndication data source for the resource to be removed.</param>
        /// <param name="entry">the resource that is being deleted</param>
        /// <returns><b>true</b> if the syndication resource was successfully deleted; otherwise, <b>false</b>.</returns>
        public virtual bool DeleteEntry(SDataBaseRequest request, AtomEntry entry)
        {
            Guard.ArgumentNotNull(request, "request");

            try
            {
                var url = request.ToString();
                var eTag = entry != null ? entry.GetSDataHttpETag() : null;
                var batchItem = new SDataBatchRequestItem
                                {
                                    Url = url,
                                    Method = HttpMethod.Delete,
                                    ETag = eTag
                                };

                if (BatchProcess.Instance.AddToBatch(batchItem))
                {
                    return true;
                }

                var operation = new RequestOperation(HttpMethod.Delete) {ETag = eTag};
                var response = ExecuteRequest(url, operation, MediaType.AtomEntry, MediaType.Xml);
                return response.StatusCode == HttpStatusCode.OK;
            }
            catch (Exception ex)
            {
                throw new SDataClientException(ex.Message, ex);
            }
        }
예제 #14
0
        private AtomEntry UpdateEntry(string url, AtomEntry entry)
        {
            Guard.ArgumentNotNull(entry, "entry");

            try
            {
                var eTag = entry.GetSDataHttpETag();
                var batchItem = new SDataBatchRequestItem
                                {
                                    Url = url,
                                    Method = HttpMethod.Put,
                                    Entry = entry,
                                    ETag = eTag
                                };

                if (BatchProcess.Instance.AddToBatch(batchItem))
                {
                    return null;
                }

                var operation = new RequestOperation(HttpMethod.Put, entry) {ETag = eTag};
                var response = ExecuteRequest(url, operation, MediaType.AtomEntry, MediaType.Xml);
                entry = (AtomEntry) response.Content;

                if (!string.IsNullOrEmpty(response.ETag))
                {
                    entry.SetSDataHttpETag(response.ETag);
                }

                return entry;
            }
            catch (Exception ex)
            {
                throw new SDataClientException(ex.Message, ex);
            }
        }
예제 #15
0
        private bool DeleteEntry(string url, AtomEntry entry)
        {
            try
            {
                var eTag = entry != null ? entry.GetSDataHttpETag() : null;
                var batchItem = new SDataBatchRequestItem
                                {
                                    Url = url,
                                    Method = HttpMethod.Delete,
                                    ETag = eTag
                                };

                if (BatchProcess.Instance.AddToBatch(batchItem))
                {
                    return true;
                }

                var operation = new RequestOperation(HttpMethod.Delete) {ETag = eTag};
                var response = ExecuteRequest(url, operation, MediaType.AtomEntry, MediaType.Xml);
                return response.StatusCode == HttpStatusCode.OK;
            }
            catch (Exception ex)
            {
                throw new SDataClientException(ex.Message, ex);
            }
        }
예제 #16
0
        private AtomEntry CreateEntry(string url, AtomEntry entry)
        {
            Guard.ArgumentNotNull(entry, "entry");

            try
            {
                var batchItem = new SDataBatchRequestItem
                                {
                                    Url = url,
                                    Method = HttpMethod.Post,
                                    Entry = entry
                                };

                if (BatchProcess.Instance.AddToBatch(batchItem))
                {
                    return null;
                }

                var operation = new RequestOperation(HttpMethod.Post, entry);
                var response = ExecuteRequest(url, operation, MediaType.AtomEntry, MediaType.Xml);
                var result = response.Content as AtomEntry;

                if (result == null)
                {
                    var feedResult = response.Content as AtomFeed;
                    if (feedResult != null)
                    {
                        result = feedResult.Entries.FirstOrDefault();
                    }
                }

                if (!string.IsNullOrEmpty(response.ETag) && result != null)
                {
                    result.SetSDataHttpETag(response.ETag);
                }

                return result;
            }
            catch (Exception ex)
            {
                throw new SDataClientException(ex.Message, ex);
            }
        }
예제 #17
0
        /// <summary>
        /// Reads resource information from the data source based on the URL and the ETag of the specified entry.
        /// </summary>
        /// <param name="request"></param>
        /// <param name="entry"></param>
        /// <returns></returns>
        public virtual AtomEntry ReadEntry(SDataBaseRequest request, AtomEntry entry)
        {
            Guard.ArgumentNotNull(request, "request");

            try
            {
                var requestUrl = request.ToString();
                var eTag = entry != null ? entry.GetSDataHttpETag() : null;
                var batchItem = new SDataBatchRequestItem
                                {
                                    Url = requestUrl,
                                    Method = HttpMethod.Get,
                                    ETag = eTag
                                };

                if (BatchProcess.Instance.AddToBatch(batchItem))
                {
                    return null;
                }

                var operation = new RequestOperation(HttpMethod.Get) {ETag = eTag};
                var response = ExecuteRequest(requestUrl, operation, MediaType.AtomEntry, MediaType.Xml);
                entry = (AtomEntry) response.Content;

                if (!string.IsNullOrEmpty(response.ETag))
                {
                    entry.SetSDataHttpETag(response.ETag);
                }

                return entry;
            }
            catch (Exception ex)
            {
                throw new SDataClientException(ex.Message, ex);
            }
        }
 public void BatchProcess_AddItemWithoutRequest()
 {
     var item = new SDataBatchRequestItem();
     var added = BatchProcess.Instance.AddToBatch(item);
     Assert.That(added, Is.False);
 }
        /// <summary>
        /// Updates information about a syndication resource in the data source.
        /// </summary>
        /// <param name="request">The url from the syndication data source for the resource to be updated.</param>
        /// <param name="entry">
        ///     An object that implements the <see cref="ISyndicationResource"/> interface that represents the updated information for the resource.
        /// </param>
        public virtual AtomEntry UpdateEntry(SDataBaseRequest request, AtomEntry entry)
        {
            Guard.ArgumentNotNull(request, "request");
            Guard.ArgumentNotNull(entry, "entry");

            try
            {
                var url = request.ToString();
                var eTag = entry.GetSDataHttpETag();
                var batchItem = new SDataBatchRequestItem
                                {
                                    Url = url,
                                    Method = HttpMethod.Put,
                                    Entry = entry,
                                    ETag = eTag
                                };

                if (BatchProcess.Instance.AddToBatch(batchItem))
                {
                    return null;
                }

                var operation = new RequestOperation(HttpMethod.Put, entry) {ETag = eTag};
                return ExecuteEntryRequest(url, operation);
            }
            catch (SDataClientException)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new SDataClientException(ex.Message, ex);
            }
        }