/// <summary>
        /// Obtiene una lista de identificadores
        /// </summary>
        /// <param name="identifierRepo">Identificador del repositorio</param>
        /// <param name="fechaFrom">fecha a partir de la cual se debe actualizar</param>
        /// <param name="set">tipo del objeto, usado para filtrar por agrupaciones</param>
        /// <returns>Lista de identificadores</returns>
        public List <IdentifierOAIPMH> CallListIdentifier(Guid identifierRepo, string set = null, DateTime?fechaFrom = null)
        {
            string uri = $"etl/ListIdentifiers/{identifierRepo}?metadataPrefix=rdf";

            if (set != null)
            {
                uri += $"&set={set}";
            }
            if (fechaFrom != null)
            {
                DateTime until = DateTime.Now.AddYears(1);
                uri += $"&from={fechaFrom.Value.ToString("u",CultureInfo.InvariantCulture)}&until={until.ToString("u", CultureInfo.InvariantCulture)}";
            }
            List <IdentifierOAIPMH> listIdentifier       = new List <IdentifierOAIPMH>();
            string                 xml                   = _publishData.CallGetApi(uri);
            XDocument              respuestaXML          = XDocument.Load(new StringReader(xml));
            XNamespace             nameSpace             = respuestaXML.Root.GetDefaultNamespace();
            XElement               listIdentifierElement = respuestaXML.Root.Element(nameSpace + "ListIdentifiers");
            IEnumerable <XElement> listHeader            = listIdentifierElement.Descendants(nameSpace + "header");

            foreach (var header in listHeader)
            {
                string           identifier       = header.Element(nameSpace + "identifier").Value;
                string           fecha            = header.Element(nameSpace + "datestamp").Value;
                DateTime         fechaSincro      = DateTime.Parse(fecha).ToUniversalTime();
                IdentifierOAIPMH identifierOAIPMH = new IdentifierOAIPMH()
                {
                    Fecha      = fechaSincro,
                    Identifier = identifier
                };
                listIdentifier.Add(identifierOAIPMH);
            }
            return(listIdentifier);
        }
 /// <summary>
 /// Añade un objeto de sincronización en base de datos
 /// </summary>
 /// <param name="lastSyncro">Objeto identificador de OAIPMH que contiene la fecha</param>
 /// <param name="repositoryId">fIdentificador del repositorio</param>
 /// <param name="set">tipo del objeto, usado para filtrar por agrupaciones</param>
 private void AddSyncro(IdentifierOAIPMH lastSyncro, string set, Guid repositoryId)
 {
     if (_context.RepositorySync.Any(item => item.RepositoryId.Equals(repositoryId)))
     {
         if (!string.IsNullOrEmpty(set))
         {
             RepositorySync repoSync = _context.RepositorySync.FirstOrDefault(item => item.RepositoryId.Equals(repositoryId) && item.Set == null);
             repoSync.UltimaFechaDeSincronizacion = lastSyncro.Fecha;
         }
         else
         {
             RepositorySync repoSync = _context.RepositorySync.FirstOrDefault(item => item.RepositoryId.Equals(repositoryId) && item.Set.Equals(set));
             if (repoSync == null)
             {
                 repoSync.UltimaFechaDeSincronizacion = lastSyncro.Fecha;
             }
             else
             {
                 RepositorySync repoSyncAdd = new RepositorySync()
                 {
                     Id           = Guid.NewGuid(),
                     RepositoryId = repositoryId,
                     Set          = set,
                     UltimaFechaDeSincronizacion = lastSyncro.Fecha
                 };
                 _context.RepositorySync.Add(repoSyncAdd);
             }
         }
     }
     else
     {
         RepositorySync repoSyncAdd = new RepositorySync()
         {
             Id           = Guid.NewGuid(),
             RepositoryId = repositoryId,
             Set          = null,
             UltimaFechaDeSincronizacion = lastSyncro.Fecha
         };
         _context.RepositorySync.Add(repoSyncAdd);
     }
     _context.SaveChanges();
 }
        /// <summary>
        /// Hace la sincronización del repositorio
        /// </summary>
        /// <param name="identifier">fIdentificador del repositorio</param>
        /// <param name="fechaFrom">fecha a partir de la cual se debe actualizar</param>
        /// <param name="set">tipo del objeto, usado para filtrar por agrupaciones</param>
        /// <param name="codigoObjeto">codigo del objeto a sincronizar, es necesario pasar el parametro set si se quiere pasar este parámetro</param>
        public void PublishRepositories(Guid identifier, DateTime?fechaFrom = null, string set = null, string codigoObjeto = null)
        {
            List <IdentifierOAIPMH> listIdentifier = new List <IdentifierOAIPMH>();

            if (codigoObjeto == null)
            {
                listIdentifier = CallListIdentifier(identifier, set, fechaFrom);
            }
            IdentifierOAIPMH lastSyncro = null;

            try
            {
                if (codigoObjeto == null)
                {
                    foreach (IdentifierOAIPMH identifierOAIPMH in listIdentifier)
                    {
                        string rdf = CallGetRecord(identifier, identifierOAIPMH.Identifier);
                        _publishData.CallDataValidate(rdf, identifier);
                        _publishData.CallDataPublish(rdf);
                        lastSyncro = identifierOAIPMH;
                    }
                    if (lastSyncro != null)
                    {
                        AddSyncro(lastSyncro, set, identifier);
                    }
                }
                else
                {
                    string rdf = CallGetRecord(identifier, codigoObjeto);
                    _publishData.CallDataValidate(rdf, identifier);
                    _publishData.CallDataPublish(rdf);
                }
            }
            catch (Exception ex)
            {
                if (string.IsNullOrEmpty(codigoObjeto) && lastSyncro != null)
                {
                    AddSyncro(lastSyncro, set, identifier);
                }
                throw new Exception(ex.Message);
            }
        }
Example #4
0
        /// <summary>
        /// Hace la sincronización del repositorio
        /// </summary>
        /// <param name="identifier">fIdentificador del repositorio</param>
        /// <param name="fechaFrom">fecha a partir de la cual se debe actualizar</param>
        /// <param name="set">tipo del objeto, usado para filtrar por agrupaciones</param>
        /// <param name="codigoObjeto">codigo del objeto a sincronizar, es necesario pasar el parametro set si se quiere pasar este parámetro</param>
        /// <param name="jobId">En el caso de que haya sido una tarea la que ha lanzado la acción representa el identificador de la tarea</param>
        ///<param name="jobCreatedDate">En el caso de que haya sido una tarea la que ha lanzado la acción representa la fecha de creación de dicha tarea</param>
        public void PublishRepositories(Guid identifier, DateTime?fechaFrom = null, string set = null, string codigoObjeto = null, string jobId = null, DateTime?jobCreatedDate = null)
        {
            bool          validationException = false;
            StringBuilder exception           = new StringBuilder();

            IdentifierOAIPMH lastSyncro = null;

            try
            {
                //Obtenemos los metadataformat del repositorio
                List <string> metadataformats = CallListMetadataFormats(identifier);
                string        granularity     = CallGranularity(identifier);

                //SI los metadataformat contienen "rdf" trtabajamos con el
                string metadataformat = "";
                if (metadataformats.Contains("rdf"))
                {
                    metadataformat = "rdf";
                }
                else
                {
                    //Si no, hacemos una peticion al servicio conversor para que nos liste los tipos disponible
                    List <string> types      = JsonConvert.DeserializeObject <List <string> >(CallGetConfigurationsFiles());
                    bool          ismetadata = false;
                    foreach (string format in metadataformats)
                    {
                        if (types.Contains(format))
                        {
                            //En caso de que si haya alguno procedemos a llamar al metodo de conversion con ese formato
                            metadataformat = format;
                            ismetadata     = true;
                        }
                    }
                    if (!ismetadata)
                    {
                        //Si en el conversor no hay ningún tipo de los que vienen del OAI-PMH lanzamos exception
                        throw new Exception("Los metadataformat " + string.Join(",", metadataformats) + " no son válidos.");
                    }
                }
                if (codigoObjeto == null)
                {
                    string fechaFromString = null;
                    if (fechaFrom.HasValue)
                    {
                        if (granularity.ToUpper() == "YYYY-MM-DD")
                        {
                            fechaFromString = $"{fechaFrom.Value.ToString("yyyy-MM-dd")}";
                        }
                        else
                        {
                            fechaFromString = $"{fechaFrom.Value.ToString("u", CultureInfo.InvariantCulture).Replace(" ", "T")}";
                        }
                    }

                    List <IdentifierOAIPMH> listIdentifier = CallListIdentifier(identifier, metadataformat, set, fechaFromString);
                    int totalCount = listIdentifier.Count();

                    foreach (IdentifierOAIPMH identifierOAIPMH in listIdentifier)
                    {
                        int  numExceptions = 0;
                        bool ok            = false;
                        while (!ok)
                        {
                            try
                            {
                                if (!string.IsNullOrEmpty(jobId))
                                {
                                    AddProcessingState(identifierOAIPMH.Identifier, identifier, jobId, listIdentifier.IndexOf(identifierOAIPMH), totalCount);
                                }
                                if (set == "openaire_cris_orgunits" && !identifierOAIPMH.Identifier.Contains("OrgUnits/"))
                                {
                                    identifierOAIPMH.Identifier = identifierOAIPMH.Identifier.Replace("oai:metis.ru.nl:", "oai:metis.ru.nl:OrgUnits/");
                                }
                                else if (set == "openaire_cris_publications" && !identifierOAIPMH.Identifier.Contains("Publications/"))
                                {
                                    identifierOAIPMH.Identifier = identifierOAIPMH.Identifier.Replace("oai:metis.ru.nl:", "oai:metis.ru.nl:Publications/");
                                }
                                else if (set == "openaire_cris_projects" && !identifierOAIPMH.Identifier.Contains("Projects/"))
                                {
                                    identifierOAIPMH.Identifier = identifierOAIPMH.Identifier.Replace("oai:metis.ru.nl:", "oai:metis.ru.nl:Projects/");
                                }
                                else if (set == "openaire_cris_products" && !identifierOAIPMH.Identifier.Contains("Products/"))
                                {
                                    identifierOAIPMH.Identifier = identifierOAIPMH.Identifier.Replace("oai:metis.ru.nl:", "oai:metis.ru.nl:Products/");
                                }
                                else if (set == "openaire_cris_persons" && !identifierOAIPMH.Identifier.Contains("Persons/"))
                                {
                                    identifierOAIPMH.Identifier = identifierOAIPMH.Identifier.Replace("oai:metis.ru.nl:", "oai:metis.ru.nl:Persons/");
                                }

                                string record = CallGetRecord(identifier, metadataformat, identifierOAIPMH.Identifier);
                                string rdf    = "";
                                if (metadataformat == "rdf")
                                {
                                    rdf = record;
                                }
                                else
                                {
                                    rdf = CallXMLConverter(record, metadataformat);
                                }
                                //TODO descomentar
                                //_publishData.CallDataValidate(rdf, identifier, _token);
                                _publishData.CallDataPublish(rdf, jobId, true, _token);


                                lastSyncro = identifierOAIPMH;
                                if (!string.IsNullOrEmpty(jobId))
                                {
                                    AddSyncro(lastSyncro, set, identifier);
                                }
                                ok = true;
                            }
                            catch (Exception ex)
                            {
                                ok = false;
                                numExceptions++;
                                if (numExceptions >= 10)
                                {
                                    break;
                                    throw ex;
                                }
                            }
                        }
                    }
                }
                else
                {
                    string record = CallGetRecord(identifier, metadataformat, codigoObjeto);
                    string rdf    = "";
                    if (metadataformat == "rdf")
                    {
                        rdf = record;
                    }
                    else
                    {
                        rdf = CallXMLConverter(record, metadataformat);
                    }
                    _publishData.CallDataValidate(rdf, identifier, _token);
                    _publishData.CallDataPublish(rdf, jobId, false, _token);
                }
                if (validationException)
                {
                    throw new Exception(exception.ToString());
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
Example #5
0
        /// <summary>
        /// Obtiene una lista de identificadores
        /// </summary>
        /// <param name="identifierRepo">Identificador del repositorio</param>
        /// <param name="metadataPrefix">metadataPrefix</param>
        /// <param name="fechaFrom">fecha a partir de la cual se debe actualizar</param>
        /// <param name="set">tipo del objeto, usado para filtrar por agrupaciones</param>
        /// <returns>Lista de identificadores</returns>
        public List <IdentifierOAIPMH> CallListIdentifier(Guid identifierRepo, string metadataPrefix, string set = null, string fechaFrom = null)
        {
            string uri = $"etl/ListIdentifiers/{identifierRepo}?metadataPrefix={metadataPrefix}";

            if (set != null)
            {
                uri += $"&set={set}";
            }
            if (fechaFrom != null)
            {
                uri += $"&from={fechaFrom}";
            }
            List <IdentifierOAIPMH> listIdentifier = new List <IdentifierOAIPMH>();

            string resumptionToken = "";

            while (resumptionToken != null)
            {
                string xml;
                if (resumptionToken == "")
                {
                    xml = _publishData.CallGetApi(uri, _token);
                }
                else
                {
                    xml = _publishData.CallGetApi($"etl/ListIdentifiers/{identifierRepo}?resumptionToken={resumptionToken}", _token);
                }
                XDocument              respuestaXML          = XDocument.Load(new StringReader(xml));
                XNamespace             nameSpace             = respuestaXML.Root.GetDefaultNamespace();
                XElement               listIdentifierElement = respuestaXML.Root.Element(nameSpace + "ListIdentifiers");
                IEnumerable <XElement> listHeader            = listIdentifierElement.Descendants(nameSpace + "header");
                foreach (var header in listHeader)
                {
                    if (header.Attribute("status") == null || header.Attribute("status").Value != "deleted")
                    {
                        header.Attribute(nameSpace + "status");
                        string           identifier       = header.Element(nameSpace + "identifier").Value;
                        string           fecha            = header.Element(nameSpace + "datestamp").Value;
                        DateTime         fechaSincro      = DateTime.Parse(fecha);
                        IdentifierOAIPMH identifierOAIPMH = new IdentifierOAIPMH()
                        {
                            Fecha      = fechaSincro,
                            Identifier = identifier
                        };
                        listIdentifier.Add(identifierOAIPMH);
                    }
                }
                resumptionToken = null;
                XElement resumptionTokenElement = listIdentifierElement.Element(nameSpace + "resumptionToken");
                if (resumptionTokenElement != null && resumptionTokenElement.Value != "")
                {
                    resumptionToken = resumptionTokenElement.Value;
                }
            }
            listIdentifier = listIdentifier.OrderBy(x => x.Fecha).ToList();
            if (!string.IsNullOrEmpty(fechaFrom))
            {
                listIdentifier.RemoveAll(x => x.Fecha < DateTime.Parse(fechaFrom));
            }
            return(listIdentifier);
        }
Example #6
0
        /// <summary>
        /// Añade un objeto de sincronización en base de datos
        /// </summary>
        /// <param name="lastSyncro">Objeto identificador de OAIPMH que contiene la fecha</param>
        /// <param name="repositoryId">Identificador del repositorio</param>
        /// <param name="set">tipo del objeto, usado para filtrar por agrupaciones</param>
        private void AddSyncro(IdentifierOAIPMH lastSyncro, string set, Guid repositoryId)
        {
            //Actualizamos la fecha de la última sincronización
            RepositoryConfig repositoryConfig = _context.RepositoryConfig.Include(item => item.RepositoryConfigSet).FirstOrDefault(x => x.RepositoryConfigID == repositoryId);

            if (set != null)
            {
                //En caso de que venga el set
                if (repositoryConfig.RepositoryConfigSet.FirstOrDefault(x => x.Set == set) != null)
                {
                    //actualizamos la fila de la tabla RepositoryConfigSet con la fecha
                    repositoryConfig.RepositoryConfigSet.FirstOrDefault(x => x.Set == set).LastUpdate = lastSyncro.Fecha;
                }
                else
                {
                    //Creamos la fila de la tabla RepositoryConfigSet con la fecha
                    _context.RepositoryConfigSet.Add(new RepositoryConfigSet()
                    {
                        RepositoryConfigSetID = Guid.NewGuid(),
                        LastUpdate            = lastSyncro.Fecha,
                        RepositoryID          = repositoryId,
                        Set = set
                    });
                }
            }
            else
            {
                //En caso de que no venga el set
                if (repositoryConfig != null && repositoryConfig.RepositoryConfigSet.FirstOrDefault(x => x.Set == "-") != null)
                {
                    //Actualizamos la fila de la tabla RepositoryConfigSet(con el campo set '-') con la fecha
                    repositoryConfig.RepositoryConfigSet.FirstOrDefault(x => x.Set == "-").LastUpdate = lastSyncro.Fecha;
                }
                else
                {
                    //Creamos la fila de la tabla RepositoryConfigSet con la fecha
                    _context.RepositoryConfigSet.Add(new RepositoryConfigSet()
                    {
                        RepositoryConfigSetID = Guid.NewGuid(),
                        LastUpdate            = lastSyncro.Fecha,
                        RepositoryID          = repositoryId,
                        Set = "-"
                    });
                }
            }


            if (_context.RepositorySync.Any(item => item.RepositoryId.Equals(repositoryId)))
            {
                if (!string.IsNullOrEmpty(set))
                {
                    RepositorySync repoSync = _context.RepositorySync.FirstOrDefault(item => item.RepositoryId.Equals(repositoryId) && item.Set == null);
                    repoSync.UltimaFechaDeSincronizacion = lastSyncro.Fecha;
                }
                else
                {
                    RepositorySync repoSync = _context.RepositorySync.FirstOrDefault(item => item.RepositoryId.Equals(repositoryId) && item.Set.Equals(set));
                    if (repoSync == null)
                    {
                        repoSync.UltimaFechaDeSincronizacion = lastSyncro.Fecha;
                    }
                    else
                    {
                        RepositorySync repoSyncAdd = new RepositorySync()
                        {
                            Id           = Guid.NewGuid(),
                            RepositoryId = repositoryId,
                            Set          = set,
                            UltimaFechaDeSincronizacion = lastSyncro.Fecha
                        };
                        _context.RepositorySync.Add(repoSyncAdd);
                    }
                }
            }
            else
            {
                RepositorySync repoSyncAdd = new RepositorySync()
                {
                    Id           = Guid.NewGuid(),
                    RepositoryId = repositoryId,
                    Set          = null,
                    UltimaFechaDeSincronizacion = lastSyncro.Fecha
                };
                _context.RepositorySync.Add(repoSyncAdd);
            }
            _context.SaveChanges();
        }