/// <summary> /// Initializes a new instance of the <see cref="SObjectLink"/> class. /// </summary> /// <param name="x"> /// The x. /// </param> /// <param name="source"> /// The source. /// </param> public SObjectLink(XElement x, SNode source) { // _Definition.Id = x.Name; Source = source; _targetId = SNode.Coding(x.Attribute(SNames.rdfresource).Value); System.DateTime tt1 = System.DateTime.Now; if (source._rDataModel is SOntologyModel) { Definition = ROntologyPropertyDefinition.Abstract(x.Name); } else { var def = source._rDataModel.OntologyModel.GetOntologyNode(x.Name.ToString()) as SGraph.ROntologyObjectPropertyDefinition; if (def != null) { Definition = def; } else { Definition = source.Definition.DirectPropertyDefinitions <ROntologyObjectPropertyDefinition>() .FirstOrDefault(propDef => propDef.Id == x.Name.ToString()) ?? source._rDataModel .OntologyModel .InsertNew <ROntologyObjectPropertyDefinition>(x.Name, source.Definition.Id, Target != null ? Target.Definition.Id : XName.Get("entity"), false); } } //Definition = source._rDataModel is SOntologyModel // ? ROntologyPropertyDefinition.Abstract(x.Name) // : source.Definition.DirectPropertyDefinitions<ROntologyObjectPropertyDefinition>() // .FirstOrDefault(propDef => propDef.Id == x.Name.ToString()) // ?? source._rDataModel // .OntologyModel // .InsertNew<ROntologyObjectPropertyDefinition>(x.Name, // source.Definition.Id, // Target != null // ? Target.Definition.Id // : "entity", // false); }
/// <summary> /// Подготовка ресурса для того, чтобы образовать запись. Если ресурс занят, то он освобождается /// </summary> /// <param name="x"> /// The x. /// </param> /// <returns> /// </returns> protected SResource PrepareResource(XElement x) { XName item_id = SNode.Coding(x.Attribute(SNames.rdfabout).Value); SResource resource; if (this.resources.ContainsKey(item_id)) { resource = this.resources[item_id]; // Если уничтоженный, то возвращается null //if (resource.Deleted) return null; // Если есть контент, то он освобождается if (resource._content != null) { FreeContent(resource); } } else { resource = new SResource(item_id); resources.Add(item_id, resource); } return(resource); }
/// <summary> /// Добавление записи формата rdf или оператора удаления или замены в модель. /// </summary> /// <param name="xOperator"> /// xml представление записи. /// </param> public void Include(XElement xOperator) { XName rname = xOperator.Name; XAttribute userDocumentId = xOperator.Attribute(SNames.AttUsersWorkRDFDocumentId); if (userDocumentId != null) { // var docUri = GetItemById(userDocumentId.Value).Uri(); userDocumentId.Remove(); AddToUserWorkDoc(xOperator, userDocumentId.Value); // LOG.WriteLine("\n\n" + DateTime.Now.ToString() + " " + userDocumentId.Value + "\n" + xOperator.ToString()); } if (rname == SNames.TagDelete) { if (!string.IsNullOrEmpty(xOperator.Attribute(SNames.AttItem_id).Value)) { XName id = SNode.Coding(xOperator.Attribute(SNames.AttItem_id).Value); this.DeleteItem(id); } } else if (rname == SNames.TagSubstitute) { if (!string.IsNullOrEmpty(xOperator.Attribute(SNames.AttOld_id).Value) && !string.IsNullOrEmpty(xOperator.Attribute(SNames.AttNew_id).Value)) { XName old_id = SNode.Coding(xOperator.Attribute(SNames.AttOld_id).Value); XName new_id = SNode.Coding(xOperator.Attribute(SNames.AttNew_id).Value); this.SubstituteItem(old_id, new_id); } } else { if (string.IsNullOrEmpty(xOperator.Attribute(SNames.rdfabout.ToString()).Value)) { return; } XName element_id = SNode.Coding(xOperator.Attribute(SNames.rdfabout.ToString()).Value); // Если этот идентификатор неопределен, то ничего не делаем // если нет ресурса, то вставляем айтем if (!this.resources.ContainsKey(element_id)) { this.IncludeItem(xOperator); return; } SResource resource = this.resources[element_id]; // если ресурс уничтожен, то элемент не вставляем if (resource.Deleted) { return; } // смотрим контент ресурса SNode node = resource._content; // если контента нет, то вставляем элемент if (node == null) { this.IncludeItem(xOperator); return; } // если (контент есть)& // определяемый ид не совпадает с идентификатором узла, // НО определяемый совпадает с последним, ТО меняем контент на новый if (element_id != node.Id) { // Здесь должно осуществиться и другое условие if (element_id == resource._lastId) { this.IncludeItem(xOperator); } // иначе данные устаревшие и не фиксируются } else { // Здесь замена осуществится только если временная отметка нового определения позже старой // выявляем временную отметку у элемента DateTime modificationTime = DateTime.MinValue; XAttribute mt = xOperator.Attribute(SNames.AttModificationTime); if (mt != null && DateTime.TryParse(mt.Value, out modificationTime) && modificationTime > node.modificationTime) { this.IncludeItem(xOperator); } } } }