Exemplo n.º 1
0
        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; // Это на случай, если будет второй оригинал, он обрабатываться не будет.
            }
        }
Exemplo n.º 2
0
        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);
                    }

                }
            }
        }
Exemplo n.º 3
0
        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);
                    }
                }
            }
        }