public override void LoadXFlowUsingRiTable(IEnumerable <XElement> xflow) { foreach (XElement xel in xflow) { if (xel.Name == "{http://fogid.net/o/}delete" || xel.Name == "{http://fogid.net/o/}substitute") { continue; } var aboutatt = xel.Attribute(Fogid.Cassettes.ONames.rdfabout); if (aboutatt == null) { continue; } string id = aboutatt.Value; // выявим Resource Info ResInfo ri = null; if (!table_ri.TryGetValue(id, out ri)) { continue; // если нет, то отбрасываем вариант (это на всякий случай) } if (ri.removed) { continue; // пропускаем уничтоженные } if (ri.id != id || ri.processed) { continue; // это не оригинал или запись уже обрабатывалась } // Выявляем временную отметку DateTime modificationTime_new = DateTime.MinValue; XAttribute mt = xel.Attribute("mT"); if (mt != null) { DateTime.TryParse(mt.Value, out modificationTime_new); } modificationTime_new = modificationTime_new.ToUniversalTime(); if (modificationTime_new != ri.timestamp) { continue; // отметка времени не совпала } db.Add(xel); ri.processed = true; // Это на случай, если будет второй оригинал, он обрабатываться не будет. } }
public void AppendXflowToRiTable(IEnumerable<XElement> xflow, string ff, Action<string> err) { foreach (XElement xelement in xflow) { if (xelement.Name == fogi + "delete") { XAttribute att = xelement.Attribute("id"); if (att == null) continue; string id = att.Value; if (id == "") continue; if (table_ri.ContainsKey(id)) { var ri = table_ri[id]; if (!ri.removed) // Если признак уже есть, то действия уже произведены { // проверим, что уничтожается оригинал цепочки if (!(id == ri.id)) { err("Уничтожается не оригинал цепочки. fog=" + ff + " id=" + id); } else ri.removed = true; } } else { table_ri.Add(id, new ResInfo(id) { removed = true }); } } else if (xelement.Name == fogi + "substitute") { XAttribute att_old = xelement.Attribute("old-id"); XAttribute att_new = xelement.Attribute("new-id"); if (att_old == null || att_new == null) continue; string id_old = att_old.Value; string id_new = att_new.Value; if (id_old == "" || id_new == "") continue; // Добудем старый и новый ресурсы ResInfo old_res, new_res; if (!table_ri.TryGetValue(id_old, out old_res)) { old_res = new ResInfo(id_old); table_ri.Add(id_old, old_res); } if (!table_ri.TryGetValue(id_new, out new_res)) { new_res = new ResInfo(id_new); table_ri.Add(id_new, new_res); } // Проверим, что old-id совпадает с оригиналом локальной цепочки if (id_old != old_res.id) { //LogFile.WriteLine("Разветвление на идентификаторе: " + id_old); } // Перенесем тип из старой цепочки в новый ресурс if (new_res.typeid == null) new_res.typeid = old_res.typeid; else { // Проверим, что цепочки одинакового типа if (old_res.typeid != null && old_res.typeid != new_res.typeid) { err("Err: сливаются цепочки разных типов"); } } // добавляем список слитых старых идентификаторов в новый ресурс new_res.merged_ids.AddRange(old_res.merged_ids); // пробегаем по списку старых идентификаторов и перекидываем ссылку на новый ресурс foreach (string oid in old_res.merged_ids) table_ri[oid] = new_res; // перекидываем признак removed из старого ресурса, если он там true. if (old_res.removed) { // Похоже, следующий оператор ошибка. Мы "протягиваем" условие removed //new_res.removed = true; err("Протяжка удаления по цепочке. id=" + id_old); } } else { XAttribute idAtt = xelement.Attribute(ONames.rdfabout); if (idAtt == null) continue; string id = idAtt.Value; if (id == "") continue; // if (table_ri.ContainsKey(id)) { var ri = table_ri[id]; DateTime modificationTime = DateTime.MinValue; XAttribute mt = xelement.Attribute("mT"); if (mt != null && DateTime.TryParse(mt.Value, out modificationTime) && modificationTime.ToUniversalTime() > ri.timestamp) { // Установим эту временную отметку ri.timestamp = modificationTime.ToUniversalTime(); } //if (xelement.Name != sema2012m.ONames.rdfdescription) // rdf:Description не несет информации о типе записи //{ if (ri.typeid == null) ri.typeid = xelement.Name.NamespaceName + xelement.Name.LocalName; else { // проверка на одинаковость типов if (xelement.Name.NamespaceName + xelement.Name.LocalName != ri.typeid) { err("Err: тип " + xelement.Name + " для ресурса " + idAtt + " не соответствует ранее определенному типу"); } } //} } else { // Это вариант, когда входа еще нет в таблице DateTime modificationTime = DateTime.MinValue; XAttribute mt = xelement.Attribute("mT"); if (mt != null) DateTime.TryParse(mt.Value, out modificationTime); var n_resinfo = new ResInfo(id) { removed = false, timestamp = modificationTime.ToUniversalTime() //, typeid = xelement.Name.NamespaceName + xelement.Name.LocalName }; //if (xelement.Name != sema2012m.ONames.rdfdescription) n_resinfo.typeid = xelement.Name.NamespaceName + xelement.Name.LocalName; table_ri.Add(id, n_resinfo); } } } }
public void AppendXflowToRiTable(IEnumerable <XElement> xflow, string ff, Action <string> err) { foreach (XElement xelement in xflow) { if (xelement.Name == fogi + "delete") { XAttribute att = xelement.Attribute("id"); if (att == null) { continue; } string id = att.Value; if (id == "") { continue; } if (table_ri.ContainsKey(id)) { var ri = table_ri[id]; if (!ri.removed) // Если признак уже есть, то действия уже произведены { // проверим, что уничтожается оригинал цепочки if (!(id == ri.id)) { err("Уничтожается не оригинал цепочки. fog=" + ff + " id=" + id); } else { ri.removed = true; } } } else { table_ri.Add(id, new ResInfo(id) { removed = true }); } } else if (xelement.Name == fogi + "substitute") { XAttribute att_old = xelement.Attribute("old-id"); XAttribute att_new = xelement.Attribute("new-id"); if (att_old == null || att_new == null) { continue; } string id_old = att_old.Value; string id_new = att_new.Value; if (id_old == "" || id_new == "") { continue; } // Добудем старый и новый ресурсы ResInfo old_res, new_res; if (!table_ri.TryGetValue(id_old, out old_res)) { old_res = new ResInfo(id_old); table_ri.Add(id_old, old_res); } if (!table_ri.TryGetValue(id_new, out new_res)) { new_res = new ResInfo(id_new); table_ri.Add(id_new, new_res); } // Проверим, что old-id совпадает с оригиналом локальной цепочки if (id_old != old_res.id) { //LogFile.WriteLine("Разветвление на идентификаторе: " + id_old); } // Перенесем тип из старой цепочки в новый ресурс if (new_res.typeid == null) { new_res.typeid = old_res.typeid; } else { // Проверим, что цепочки одинакового типа if (old_res.typeid != null && old_res.typeid != new_res.typeid) { err("Err: сливаются цепочки разных типов"); } } // добавляем список слитых старых идентификаторов в новый ресурс new_res.merged_ids.AddRange(old_res.merged_ids); // пробегаем по списку старых идентификаторов и перекидываем ссылку на новый ресурс foreach (string oid in old_res.merged_ids) { table_ri[oid] = new_res; } // перекидываем признак removed из старого ресурса, если он там true. if (old_res.removed) { // Похоже, следующий оператор ошибка. Мы "протягиваем" условие removed //new_res.removed = true; err("Протяжка удаления по цепочке. id=" + id_old); } } else { XAttribute idAtt = xelement.Attribute(ONames.rdfabout); if (idAtt == null) { continue; } string id = idAtt.Value; if (id == "") { continue; } // if (table_ri.ContainsKey(id)) { var ri = table_ri[id]; DateTime modificationTime = DateTime.MinValue; XAttribute mt = xelement.Attribute("mT"); if (mt != null && DateTime.TryParse(mt.Value, out modificationTime) && modificationTime.ToUniversalTime() > ri.timestamp) { // Установим эту временную отметку ri.timestamp = modificationTime.ToUniversalTime(); } //if (xelement.Name != sema2012m.ONames.rdfdescription) // rdf:Description не несет информации о типе записи //{ if (ri.typeid == null) { ri.typeid = xelement.Name.NamespaceName + xelement.Name.LocalName; } else { // проверка на одинаковость типов if (xelement.Name.NamespaceName + xelement.Name.LocalName != ri.typeid) { err("Err: тип " + xelement.Name + " для ресурса " + idAtt + " не соответствует ранее определенному типу"); } } //} } else { // Это вариант, когда входа еще нет в таблице DateTime modificationTime = DateTime.MinValue; XAttribute mt = xelement.Attribute("mT"); if (mt != null) { DateTime.TryParse(mt.Value, out modificationTime); } var n_resinfo = new ResInfo(id) { removed = false, timestamp = modificationTime.ToUniversalTime() //, typeid = xelement.Name.NamespaceName + xelement.Name.LocalName }; //if (xelement.Name != sema2012m.ONames.rdfdescription) n_resinfo.typeid = xelement.Name.NamespaceName + xelement.Name.LocalName; table_ri.Add(id, n_resinfo); } } } }