public void ResumptionTokenConverter_Decode()
        {
            string token = "from=1987-02-16T00%3a00%3a00Z&until=2018-02-16T00%3a00%3a00Z&metadataPrefix=oai_dc" +
                           "&set=test123&expirationDate=2019-02-16T00%3a00%3a00Z&completeListSize=123&cursor=321&placeholder=123&test=123";

            IResumptionToken actual   = _converter.Decode(token);
            IResumptionToken expected = new ResumptionToken()
            {
                From             = new DateTime(1987, 2, 16, 0, 0, 0, DateTimeKind.Utc),
                Until            = new DateTime(2018, 2, 16, 0, 0, 0, DateTimeKind.Utc),
                MetadataPrefix   = "oai_dc",
                Set              = "test123",
                ExpirationDate   = new DateTime(2019, 2, 16, 0, 0, 0, DateTimeKind.Utc),
                CompleteListSize = 123,
                Cursor           = 321
            };

            expected.Custom["placeholder"] = "123";

            Assert.AreEqual(expected.From.Value.Kind, actual.From.Value.Kind);
            Assert.AreEqual(expected.From, actual.From);
            Assert.AreEqual(expected.Until.Value.Kind, actual.Until.Value.Kind);
            Assert.AreEqual(expected.Until, actual.Until);
            Assert.AreEqual(expected.MetadataPrefix, actual.MetadataPrefix);
            Assert.AreEqual(expected.Set, actual.Set);
            Assert.AreEqual(expected.ExpirationDate.Value.Kind, actual.ExpirationDate.Value.Kind);
            Assert.AreEqual(expected.ExpirationDate, actual.ExpirationDate);
            Assert.AreEqual(expected.CompleteListSize, actual.CompleteListSize);
            Assert.AreEqual(expected.Cursor, actual.Cursor);
            Assert.AreEqual(expected.Custom["placeholder"], actual.Custom["placeholder"]);
            Assert.IsFalse(actual.Custom.ContainsKey("test"));
        }
        public void ResumptionTokenConverter_ToXElement()
        {
            ResumptionToken token = new ResumptionToken()
            {
                From             = new DateTime(1987, 2, 16, 0, 0, 0, DateTimeKind.Utc),
                Until            = new DateTime(2018, 2, 16, 0, 0, 0, DateTimeKind.Utc),
                MetadataPrefix   = "oai_dc",
                Set              = "test123",
                ExpirationDate   = new DateTime(2019, 2, 16, 0, 0, 0, DateTimeKind.Utc),
                CompleteListSize = 123,
                Cursor           = 321
            };

            token.Custom.Add("placeholder", "123");
            token.Custom.Add("test", "123");

            var actual   = _converter.ToXElement(token).ToString();
            var expected = "<resumptionToken expirationDate=\"2019-02-16T00:00:00Z\" completeListSize=\"123\" cursor=\"321\">" +
                           "metadataPrefix%3doai_dc%26from%3d1987-02-16T00%3a00%3a00Z%26until%3d2018-02-16T00%3a00%3a00Z%26set%3dtest123%26placeholder%3d123</resumptionToken>";

            Assert.AreEqual(expected, actual);
        }
        public void ResumptionTokenConverter_Encode()
        {
            ResumptionToken token = new ResumptionToken()
            {
                From             = new DateTime(1987, 2, 16, 0, 0, 0, DateTimeKind.Utc),
                Until            = new DateTime(2018, 2, 16, 0, 0, 0, DateTimeKind.Utc),
                MetadataPrefix   = "oai_dc",
                Set              = "test123",
                ExpirationDate   = new DateTime(2019, 2, 16, 0, 0, 0, DateTimeKind.Utc),
                CompleteListSize = 123,
                Cursor           = 321
            };

            token.Custom.Add("placeholder", "123");
            token.Custom.Add("test", "123");

            string actual   = _converter.Encode(token);
            string expected = "metadataPrefix%3doai_dc%26from%3d1987-02-16T00%3a00%3a00Z%26until%3d2018-02-16T00%3a00%3a00Z%26" +
                              "set%3dtest123%26placeholder%3d123";

            Assert.AreEqual(expected, actual);
        }
Ejemplo n.º 4
0
        public IResumptionToken Decode(string resumptionToken)
        {
            ResumptionToken decoded = new ResumptionToken();

            if (string.IsNullOrWhiteSpace(resumptionToken))
            {
                return(decoded);
            }

            NameValueCollection nvc = HttpUtility.ParseQueryString(HttpUtility.UrlDecode(resumptionToken));

            foreach (string key in nvc)
            {
                switch (key.ToLowerInvariant())
                {
                case "metadataprefix":
                    decoded.MetadataPrefix = nvc[key];
                    break;

                case "from":
                    if (_dateConverter.TryDecode(nvc[key], out DateTime fromDate))
                    {
                        decoded.From = fromDate;
                    }
                    break;

                case "until":
                    if (_dateConverter.TryDecode(nvc[key], out DateTime untilDate))
                    {
                        decoded.Until = untilDate;
                    }
                    break;

                case "set":
                    decoded.Set = nvc[key];
                    break;

                case "expirationdate":
                    if (_dateConverter.TryDecode(nvc[key], out DateTime expirationDate))
                    {
                        decoded.ExpirationDate = expirationDate;
                    }
                    break;

                case "completelistsize":
                    if (int.TryParse(nvc[key], out int completeListSize))
                    {
                        decoded.CompleteListSize = completeListSize;
                    }
                    break;

                case "cursor":
                    if (int.TryParse(nvc[key], out int cursor))
                    {
                        decoded.Cursor = cursor;
                    }
                    break;

                default:
                    if (_configuration.ResumptionTokenCustomParameterNames.Contains(key))
                    {
                        if (decoded.Custom.ContainsKey(key))
                        {
                            decoded.Custom[key] = nvc[key];
                        }
                        else
                        {
                            decoded.Custom.Add(key, nvc[key]);
                        }
                    }
                    break;
                }
            }
            return(decoded);
        }
Ejemplo n.º 5
0
        public static XElement ResumptionToken(ResumptionToken rt, string resumptionToken, bool isCompleted)
        {
            return new XElement("resumptionToken",
                !rt.ExpirationDate.HasValue ? null :
                new XAttribute("expirationDate",
                    rt.ExpirationDate.Value.ToUniversalTime().ToString(Enums.Granularity.DateTime)),

                    rt.CompleteListSize.HasValue ?
                    new XAttribute("completeListSize", rt.CompleteListSize.Value) : null,

                    rt.Cursor.HasValue ?
                    new XAttribute("cursor", rt.Cursor.Value) : null,

                    isCompleted ? null : resumptionToken);
        }
Ejemplo n.º 6
0
        public RecordContainer GetRecords(ArgumentContainer arguments, IResumptionToken resumptionToken = null)
        {
            RecordContainer container = new RecordContainer();

            IQueryable <SampleRecord> records = _records.AsQueryable().OrderBy(r => r.Id);

            int totalCount = records.Count();

            if (resumptionToken != null)
            {
                if (resumptionToken.From.HasValue)
                {
                    records = records.Where(r => r.Date >= resumptionToken.From.Value);
                }
                if (resumptionToken.Until.HasValue)
                {
                    records = records.Where(r => r.Date <= resumptionToken.Until.Value);
                }
                if (resumptionToken.Custom.ContainsKey("offset") && resumptionToken.Custom.TryGetValue("offset", out string offset))
                {
                    if (int.TryParse(offset, out int parsedOffset))
                    {
                        records = records.Where(r => r.Id > parsedOffset);
                    }
                }
            }

            ResumptionToken newResumptionToken = null;

            if (records.Count() > _configuration.PageSize)
            {
                newResumptionToken        = new ResumptionToken();
                container.ResumptionToken = newResumptionToken;

                if (_dateConverter.TryDecode(arguments.From, out DateTime from))
                {
                    newResumptionToken.From = from;
                }
                if (_dateConverter.TryDecode(arguments.Until, out DateTime until))
                {
                    newResumptionToken.Until = until;
                }
                newResumptionToken.MetadataPrefix = arguments.MetadataPrefix;
                newResumptionToken.Set            = arguments.Set;
                if (_configuration.ExpirationTimeSpan.HasValue)
                {
                    newResumptionToken.ExpirationDate = DateTime.UtcNow.Add(_configuration.ExpirationTimeSpan.Value);
                }
                newResumptionToken.CompleteListSize = totalCount;
                newResumptionToken.Cursor           = 0;
            }

            records = records.Take(_configuration.PageSize);

            if (newResumptionToken != null)
            {
                if (resumptionToken != null)
                {
                    // Increase the cursor value
                    newResumptionToken.Cursor = resumptionToken.Cursor.HasValue ?
                                                resumptionToken.Cursor.Value + _configuration.PageSize : _configuration.PageSize;
                }

                // Add custom offset value
                var lastRecord = records.LastOrDefault();
                if (lastRecord != null)
                {
                    newResumptionToken.Custom.Add("offset", lastRecord.Id.ToString());
                }
            }

            container.Records = records.Select(r => ToRecord(r));

            return(container);
        }