public Resource PutAddOrUpdateResource(string key, Resource resourceToPut)
        {
            // Validate arguments
            ValidateArguments(key, resourceToPut);

            var resource = resourceRepository.AddOrUpdate(
                ParseResourceKey(key),
                resourceToPut,
                // Delegate invoked when adding
                (resourceKey) => Response.SetStatusAsCreated(CreateUri(resourceKey)),
                // Delegate invoked when updating
                (version) =>
            {
                // Check conditional update if If-Match header values provided
                if (Request.IfMatch != null)
                {
                    Request.CheckConditionalUpdate(version);
                }
            }
                );

            // Return with an ETag to enable client caching
            Response.SetETag(resource.Version);

            return(resource);
        }