/// <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); } }
/// <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); } }
/// <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); }
/// <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(); }