コード例 #1
0
        public string Encode(IResumptionToken resumptionToken)
        {
            IList <string> properties = new List <string>();

            if (!string.IsNullOrWhiteSpace(resumptionToken.MetadataPrefix))
            {
                properties.Add(EncodeOne("metadataPrefix", resumptionToken.MetadataPrefix));
            }
            if (resumptionToken.From.HasValue)
            {
                properties.Add(EncodeOne("from", _dateConverter.Encode(_configuration.Granularity, resumptionToken.From)));
            }
            if (resumptionToken.Until.HasValue)
            {
                properties.Add(EncodeOne("until", _dateConverter.Encode(_configuration.Granularity, resumptionToken.Until)));
            }
            if (!string.IsNullOrWhiteSpace(resumptionToken.Set))
            {
                properties.Add(EncodeOne("set", resumptionToken.Set));
            }

            foreach (var custom in resumptionToken.Custom)
            {
                if (_configuration.ResumptionTokenCustomParameterNames.Contains(custom.Key))
                {
                    properties.Add(EncodeOne(custom.Key, custom.Value));
                }
            }

            return(HttpUtility.UrlEncode(string.Join("&", properties.ToArray())));
        }
コード例 #2
0
        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"));
        }
コード例 #3
0
        /// <summary>
        /// Obtiene los records del repositorio en función de los argumentos pasados
        /// </summary>
        /// <param name="arguments">Parámetros de la consulta</param>
        /// <param name="resumptionToken">Token de reanudación</param>
        /// <returns></returns>
        public RecordContainer GetRecords(ArgumentContainer arguments, IResumptionToken resumptionToken = null)
        {
            RecordContainer container = new RecordContainer();
            DateTime        inicio    = DateTime.MinValue;

            if (_dateConverter.TryDecode(arguments.From, out DateTime from))
            {
                inicio = from;
            }

            HashSet <string> ids     = GetCurriculumsIDs(inicio, _configOAI_PMH_CVN.GetXML_CVN_Repository());
            List <CVN>       listCVN = new List <CVN>();

            foreach (string id in ids)
            {
                DateTime date = DateTime.UtcNow.AddDays(-100 + int.Parse(id));
                if (date > inicio)
                {
                    listCVN.Add(GetCurriculum(id, arguments.Verb == OaiVerb.ListIdentifiers.ToString(), _configOAI_PMH_CVN.GetXML_CVN_Repository()));
                }
            }
            if (arguments.Verb == OaiVerb.ListIdentifiers.ToString())
            {
                container.Records = listCVN.Select(r => ToIdentifiersRecord(r));
            }
            else
            {
                container.Records = listCVN.Select(r => ToRecord(r, arguments.MetadataPrefix));
            }
            container.Records = container.Records.Where(x => x.Header.Datestamp > inicio).ToList();
            return(container);
        }
コード例 #4
0
 /// <summary>
 /// Obtiene los sets del repositorio en función de los argumentos pasados
 /// </summary>
 /// <param name="arguments">Parámetros de la consulta</param>        
 /// <param name="resumptionToken">Token de reanudación</param>
 /// <returns></returns>
 public SetContainer GetSets(ArgumentContainer arguments, IResumptionToken resumptionToken = null)
 {
     SetContainer container = new SetContainer();
     IQueryable<Set> sets = _sets.AsQueryable().OrderBy(s => s.Name);
     int totalCount = sets.Count();
     container.Sets = sets.Take(_configuration.PageSize);
     return container;
 }
コード例 #5
0
        /// <summary>
        /// Obtiene los records del repositorio en función de los argumentos pasados
        /// </summary>
        /// <param name="arguments">Parámetros de la consulta</param>
        /// <param name="resumptionToken">Token de reanudación</param>
        /// <returns></returns>
        public RecordContainer GetRecords(ArgumentContainer arguments, IResumptionToken resumptionToken = null)
        {
            RecordContainer container = new RecordContainer();
            DateTime        inicio    = DateTime.MinValue;

            if (_dateConverter.TryDecode(arguments.From, out DateTime from))
            {
                inicio = from;
            }

            List <XML> listxml = new List <XML>();

            Random r = new Random();

            if (arguments.Verb == OaiVerb.ListIdentifiers.ToString())
            {
                //ListIdentifiers
                HashSet <string> files = GetXMLFiles(arguments.Set);
                foreach (string file in files)
                {
                    //Cogemos aleatoriamente el 50% de los ficheros encontrados
                    if (r.Next(100) < 50)
                    {
                        listxml.Add(GetXML(file));
                    }
                }
                container.Records = listxml.Select(r => ToIdentifiersRecord(r));
            }
            else
            {
                //ListRecords
                HashSet <string> files = GetXMLFiles(arguments.Set);
                foreach (string file in files)
                {
                    //Cogemos aleatoriamente el 50% de los ficheros encontrados
                    if (r.Next(100) < 50)
                    {
                        listxml.Add(GetXML(file));
                    }
                }
                container.Records = listxml.Select(r => ToRecord(r, arguments.MetadataPrefix));
            }
            container.Records = container.Records.Where(x => x.Header.Datestamp > inicio).ToList();
            return(container);
        }
コード例 #6
0
        public XElement ToXElement(IResumptionToken resumptionToken)
        {
            XElement root = new XElement("resumptionToken", Encode(resumptionToken));

            if (resumptionToken.ExpirationDate.HasValue)
            {
                root.Add(new XAttribute("expirationDate", _dateConverter.Encode(_configuration.Granularity, resumptionToken.ExpirationDate)));
            }
            if (resumptionToken.CompleteListSize.HasValue)
            {
                root.Add(new XAttribute("completeListSize", resumptionToken.CompleteListSize.Value));
            }
            if (resumptionToken.Cursor.HasValue)
            {
                root.Add(new XAttribute("cursor", resumptionToken.Cursor.Value));
            }

            return(root);
        }
コード例 #7
0
ファイル: DataProvider.cs プロジェクト: artezhar/OaiPmhNet
        private XDocument CreateListSets(DateTime date, ArgumentContainer arguments, IResumptionToken resumptionToken = null)
        {
            OaiVerb verb = OaiVerb.ListSets;

            OaiArgument allowedArguments = OaiArgument.ResumptionToken;

            if (!OaiErrors.ValidateArguments(arguments, allowedArguments, out XElement errorElement))
            {
                return(CreateErrorDocument(date, verb, arguments, errorElement));
            }

            // Set
            if (!_configuration.SupportSets)
            {
                return(CreateErrorDocument(date, verb, arguments, OaiErrors.NoSetHierarchy));
            }

            // Decode ResumptionToken
            if (resumptionToken == null && !string.IsNullOrWhiteSpace(arguments.ResumptionToken))
            {
                if (!OaiErrors.ValidateArguments(arguments, OaiArgument.ResumptionToken))
                {
                    return(CreateErrorDocument(date, verb, arguments, OaiErrors.BadArgumentExclusiveResumptionToken));
                }

                IResumptionToken decodedResumptionToken = _resumptionTokenConverter.Decode(arguments.ResumptionToken);
                if (decodedResumptionToken.ExpirationDate >= DateTime.UtcNow)
                {
                    return(CreateErrorDocument(date, verb, arguments, OaiErrors.BadResumptionToken));
                }

                ArgumentContainer resumptionTokenArguments = new ArgumentContainer(
                    verb.ToString(), decodedResumptionToken.MetadataPrefix, arguments.ResumptionToken, null,
                    _dateConverter.Encode(_configuration.Granularity, decodedResumptionToken.From),
                    _dateConverter.Encode(_configuration.Granularity, decodedResumptionToken.Until),
                    decodedResumptionToken.Set);

                return(CreateListSets(date, resumptionTokenArguments, decodedResumptionToken));
            }

            var setContainer = _setRepository.GetSets(arguments, resumptionToken);

            IList <XElement> root = new List <XElement>();

            root.Add(CreateRequest(verb, arguments));

            XElement content = new XElement(verb.ToString());

            root.Add(content);

            if (setContainer != null)
            {
                foreach (var set in setContainer.Sets)
                {
                    XElement setElement = new XElement("set");
                    content.Add(setElement);
                    TryAddXElement(setElement, "setSpec", set.Spec);
                    TryAddXElement(setElement, "setName", set.Name);
                    TryAddXElement(setElement, "setDescription", set.Description);
                    foreach (var additionalDescription in set.AdditionalDescriptions)
                    {
                        setElement.Add(new XElement("setDescription", additionalDescription));
                    }
                }

                if (setContainer.ResumptionToken != null)
                {
                    content.Add(_resumptionTokenConverter.ToXElement(setContainer.ResumptionToken));
                }
            }

            return(CreateXml(date, root.ToArray()));
        }
コード例 #8
0
ファイル: DataProvider.cs プロジェクト: artezhar/OaiPmhNet
        private XDocument CreateListIdentifiersOrRecords(DateTime date, ArgumentContainer arguments, OaiVerb verb, IResumptionToken resumptionToken = null)
        {
            OaiArgument allowedArguments = OaiArgument.MetadataPrefix | OaiArgument.ResumptionToken |
                                           OaiArgument.From | OaiArgument.Until | OaiArgument.Set;

            if (!OaiErrors.ValidateArguments(arguments, allowedArguments, out XElement errorElement))
            {
                return(CreateErrorDocument(date, verb, arguments, errorElement));
            }

            // Set
            if (!string.IsNullOrWhiteSpace(arguments.Set) && !_configuration.SupportSets)
            {
                return(CreateErrorDocument(date, verb, arguments, OaiErrors.NoSetHierarchy));
            }

            // From
            DateTime fromDate = DateTime.MinValue;

            if (!string.IsNullOrWhiteSpace(arguments.From) && !_dateConverter.TryDecode(arguments.From, out fromDate))
            {
                return(CreateErrorDocument(date, verb, arguments, OaiErrors.BadFromArgument));
            }

            // Until
            DateTime untilDate = DateTime.MinValue;

            if (!string.IsNullOrWhiteSpace(arguments.Until) && !_dateConverter.TryDecode(arguments.Until, out untilDate))
            {
                return(CreateErrorDocument(date, verb, arguments, OaiErrors.BadUntilArgument));
            }

            // The from argument must be less than or equal to the until argument.
            if (fromDate > untilDate)
            {
                return(CreateErrorDocument(date, verb, arguments, OaiErrors.BadFromUntilCombinationArgument));
            }

            // Decode ResumptionToken
            if (resumptionToken == null && !string.IsNullOrWhiteSpace(arguments.ResumptionToken))
            {
                if (!OaiErrors.ValidateArguments(arguments, OaiArgument.ResumptionToken))
                {
                    return(CreateErrorDocument(date, verb, arguments, OaiErrors.BadArgumentExclusiveResumptionToken));
                }

                try
                {
                    IResumptionToken decodedResumptionToken = _resumptionTokenConverter.Decode(arguments.ResumptionToken);
                    if (decodedResumptionToken.ExpirationDate >= DateTime.UtcNow)
                    {
                        return(CreateErrorDocument(date, verb, arguments, OaiErrors.BadResumptionToken));
                    }

                    ArgumentContainer resumptionTokenArguments = new ArgumentContainer(
                        verb.ToString(), decodedResumptionToken.MetadataPrefix, arguments.ResumptionToken, null,
                        _dateConverter.Encode(_configuration.Granularity, decodedResumptionToken.From),
                        _dateConverter.Encode(_configuration.Granularity, decodedResumptionToken.Until),
                        decodedResumptionToken.Set);

                    return(CreateListIdentifiersOrRecords(date, resumptionTokenArguments, verb, decodedResumptionToken));
                }
                catch (Exception)
                {
                    return(CreateErrorDocument(date, verb, arguments, OaiErrors.BadResumptionToken));
                }
            }

            // Check if required metadata prefix is included in the request
            if (string.IsNullOrWhiteSpace(arguments.MetadataPrefix))
            {
                return(CreateErrorDocument(date, verb, arguments, OaiErrors.BadMetadataArgument));
            }

            // Check if metadata prefix is supported
            var metadataPrefix = _metadataFormatRepository.GetMetadataFormat(arguments.MetadataPrefix);

            if (metadataPrefix == null)
            {
                return(CreateErrorDocument(date, verb, arguments, OaiErrors.CannotDisseminateFormat));
            }

            var recordContainer = new RecordContainer();

            if (verb == OaiVerb.ListRecords)
            {
                recordContainer = _recordRepository.GetRecords(arguments, resumptionToken);
            }
            else
            {
                recordContainer = _recordRepository.GetIdentifiers(arguments, resumptionToken);
            }

            if (recordContainer == null || recordContainer.Records.Count() <= 0)
            {
                return(CreateErrorDocument(date, verb, arguments, OaiErrors.NoRecordsMatch));
            }

            IList <XElement> root = new List <XElement>();

            root.Add(CreateRequest(verb, arguments));

            XElement content = new XElement(verb.ToString());

            root.Add(content);

            foreach (var record in recordContainer.Records)
            {
                XElement recordElement = content;

                if (verb == OaiVerb.ListRecords)
                {
                    recordElement = new XElement("record");
                    content.Add(recordElement);
                }

                // Header
                if (record.Header != null)
                {
                    recordElement.Add(CreateHeaderXElement(record.Header));
                }
                // Metadata
                if (record.Metadata != null && verb == OaiVerb.ListRecords)
                {
                    recordElement.Add(CreateMetadataXElement(record.Metadata));
                }
            }

            if (recordContainer.ResumptionToken != null)
            {
                content.Add(_resumptionTokenConverter.ToXElement(recordContainer.ResumptionToken));
            }

            return(CreateXml(date, root.ToArray()));
        }
コード例 #9
0
 /// <summary>
 /// Obtiene los identificadores del repositorio en función de los argumentos pasados
 /// </summary>
 /// <param name="arguments">Parámetros de la consulta</param>
 /// <param name="resumptionToken">Token de reanudación</param>
 /// <returns></returns>
 public RecordContainer GetIdentifiers(ArgumentContainer arguments, IResumptionToken resumptionToken = null)
 {
     return(GetRecords(arguments, resumptionToken));
 }
コード例 #10
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);
        }