public GraphNodePath GetPath(IContentNode node) { GraphNodePath path; var graphNode = node as IGraphNode; if (graphNode == null) return null; registeredNodes.TryGetValue(graphNode, out path); return path; }
public ExpressionIssue TryEvaluate(IContentNode input, out IContentNode result) { result = Constant; return(null); }
/// <summary> /// 在流中读取字节后转换为对象 /// </summary> /// <param name="setting">配置项</param> /// <param name="reader">字符读取器</param> /// <param name="node">节点流内容</param> /// <param name="checkNullValue">是否检查空值</param> /// <returns></returns> public override Type Parse(IDeserializerReader reader, JsonDeserializeSetting setting, IContentNode node, bool checkNullValue) { if (node == null) { return(null); } var value = node.GetValue(); if (value.IsNullOrEmpty) { return(null); } try { if (checkNullValue && this.IsNullValue(value)) { return(null); } return(Type.GetType(value.ToString())); } catch (OverflowException) { throw new ArgumentOutOfRangeException(node.Key, string.Format("数值溢出,在字符{0}至{1}处", node.Segment.Offset.ToString(), (node.Segment.Offset + node.Segment.Count).ToString())); } catch { throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处", node.Segment.Offset.ToString(), (node.Segment.Offset + node.Segment.Count).ToString())); } }
private static GraphNodeViewModel DefaultCreateNode(GraphViewModel viewModel, string baseName, bool isPrimitive, IContentNode modelNode, GraphNodePath graphNodePath, Type contentType, Index index) { return(GraphNodeViewModel.Create(viewModel, baseName, isPrimitive, modelNode, graphNodePath, contentType, index)); }
/// <summary> /// 在流中读取字节后转换为对象 /// </summary> /// <param name="setting">配置项</param> /// <param name="reader">字符读取器</param> /// <param name="node">节点流内容</param> /// <param name="checkNullValue">是否检查空值</param> /// <returns></returns> /// <exception cref="System.ArgumentNullException"> /// </exception> /// <exception cref="System.ArgumentOutOfRangeException"></exception> public override DateTime Parse(IDeserializerReader reader, JsonDeserializeSetting setting, IContentNode node, bool checkNullValue) { if (node == null) { return(new DateTime()); } var value = node.GetValue(); try { double ret = 0d; for (var i = 7; i <= 19; i++) { switch (value[i]) { case '0': { } break; case '1': { ret += GetInteger(20 - i); } break; case '2': { ret += 2 * GetInteger(20 - i); } break; case '3': { ret += 3 * GetInteger(20 - i); } break; case '4': { ret += 4 * GetInteger(20 - i); } break; case '5': { ret += 5 * GetInteger(20 - i); } break; case '6': { ret += 6 * GetInteger(20 - i); } break; case '7': { ret += 7 * GetInteger(20 - i); } break; case '8': { ret += 8 * GetInteger(20 - i); } break; case '9': { ret += 9 * GetInteger(20 - i); } break; default: throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处,取值只能在[0,9]范围内", (node.Segment.Offset).ToString(), (node.Segment.Offset + node.Segment.Count).ToString())); } } return(_1970.AddMilliseconds(ret)); } catch (OverflowException) { throw new ArgumentOutOfRangeException(node.Key, string.Format("数值溢出,在字符{0}至{1}处", node.Segment.Offset.ToString(), (node.Segment.Offset + node.Segment.Count).ToString())); } catch { throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处,取值只能在[0-9]范围内", node.Segment.Offset.ToString(), (node.Segment.Offset + node.Segment.Count).ToString())); } }
/// <summary> /// 在流中读取字节后转换为对象 /// </summary> /// <param name="setting">配置项</param> /// <param name="reader">字符读取器</param> /// <param name="node">节点流内容</param> /// <param name="checkNullValue">是否检查空值</param> /// <returns></returns> public override decimal?Parse(IDeserializerReader reader, JsonDeserializeSetting setting, IContentNode node, bool checkNullValue) { if (node == null) { return(null); } var value = node.GetValue(); if (value.IsNullOrEmpty) { return(null); } if (checkNullValue && this.IsNullValue(value)) { return(null); } return(MethodProviders.DecimalMethodProvider.Default.Parse(reader, setting, node, false)); }
protected override void LinkNodes(IContentNode sourceNode, IContentNode targetNode) { LinkedNodes.Add(sourceNode, targetNode); base.LinkNodes(sourceNode, targetNode); }
protected override ObjectReference FindTargetReference(IContentNode sourceNode, IContentNode targetNode, ObjectReference sourceReference) { if (sourceReference.Index.IsEmpty) { return(base.FindTargetReference(sourceNode, targetNode, sourceReference)); } var matchValue = 0; if (sourceReference.TargetNode != null) { matchValue = (int)sourceReference.TargetNode[nameof(SimpleClass.Member1)].Value; } var targetReference = targetNode.ItemReferences; return(targetReference?.FirstOrDefault(x => (int)x.TargetNode[nameof(SimpleClass.Member1)].Value == matchValue)); }
public static IContentNode Root(this IContentNode node) { return(node.RootInternal()); }
public static bool IsNullOrEmpty(this IContentNode node) { return(node == null || node.IsEmpty()); }
public static IEnumerable <IContentNode <T> > Descendants <T>(this IContentNode <T> node) where T : IContent { return(node.DescendantsInternal()); }
public static IEnumerable <IContentNode> Descendants(this IContentNode node) { return(node.DescendantsInternal()); }
public static IEnumerable <IContentNode <T> > Ancestors <T>(this IContentNode <T> node) where T : IContent { return(node.AncestorsInternal()); }
public static IContentNode <T> Root <T>(this IContentNode <T> node) where T : IContent { return(node.RootInternal()); }
public static IEnumerable <IContentNode> Ancestors(this IContentNode node) { return(node.AncestorsInternal()); }
public override IEnumerable <SchemaIssue> FindIssues(IContentNode node) { var issues = base.FindIssues(node); if (issues.Any()) { foreach (var i in issues) { yield return(i); } } else { var list = node as ContentList; var itemCount = list.Count(); if ((MinItemCount != null && MinItemCount.Value > itemCount) || (MaxItemCount != null && MaxItemCount.Value < itemCount)) { var sb = new StringBuilder(); sb.Append("Must have item count "); if (MinItemCount != null) { sb.Append(">= "); sb.Append(MinItemCount); } if (MaxItemCount != null) { if (MinItemCount != null) { sb.Append("and "); } sb.Append("<= "); sb.Append(MaxItemCount); } sb.Append(", found "); sb.Append(itemCount); sb.Append(" items"); } else { var idx = 0; foreach (var item in list) { var index = ContentPath.Root.Append(idx); issues = Item.FindIssues(item); foreach (var issue in issues) { yield return(new SchemaIssue( index.Append(issue.SubjectPath), issue.Error)); } ++idx; } } } }
public override bool IsMatch(IContentNode document) { return(false); }
/// <summary> /// 在流中读取字节后转换为对象 /// </summary> /// <param name="setting">配置项</param> /// <param name="reader">字符读取器</param> /// <param name="node">节点流内容</param> /// <param name="checkNullValue">是否检查空值</param> /// <returns></returns> public override bool Parse(IDeserializerReader reader, JsonDeserializeSetting setting, IContentNode node, bool checkNullValue) { if (node == null) { return(false); } var value = node.GetValue(); if (value.IsNullOrEmpty) { return(false); } if (value.Length == 1) { return(value[0] == '1'); } if (IsNullValue(value)) { return(false); } if (value.Length != 4) { return(false); } return((value[0] == 't' || value[0] == 'T') & (value[1] == 'r' || value[1] == 'R') & (value[2] == 'u' || value[2] == 'U') & (value[3] == 'e' || value[3] == 'e')); }
public void TestCustomFindTargetReference() { var nodeContainer = new NodeContainer(); var instance1 = new ObjectListClass { Member1 = 3, Member2 = new List <SimpleClass> { new SimpleClass { Member1 = 1 }, new SimpleClass { Member1 = 2 }, new SimpleClass { Member1 = 3 } } }; var instance2 = new ObjectListClass { Member1 = 3, Member2 = new List <SimpleClass> { new SimpleClass { Member1 = 2 }, new SimpleClass { Member1 = 4 }, new SimpleClass { Member1 = 1 } } }; var source = nodeContainer.GetOrCreateNode(instance1); var target = nodeContainer.GetOrCreateNode(instance2); var linker = new CustomFindTargetReferenceLinker(); linker.LinkGraph(source, target); // Expected links by index: 0 -> 2, 1 -> 0, 2 -> null Index index = new Index(0); IContentNode tempQualifier = source[nameof(SimpleClass.Member2)]; Index index1 = new Index(2); IContentNode tempQualifier1 = target[nameof(SimpleClass.Member2)]; Index index2 = new Index(0); IContentNode tempQualifier2 = source[nameof(SimpleClass.Member2)]; Index index3 = new Index(2); IContentNode tempQualifier3 = target[nameof(SimpleClass.Member2)]; Index index4 = new Index(0); IContentNode tempQualifier4 = source[nameof(SimpleClass.Member2)]; Index index5 = new Index(2); IContentNode tempQualifier5 = target[nameof(SimpleClass.Member2)]; Index index6 = new Index(1); IContentNode tempQualifier6 = source[nameof(SimpleClass.Member2)]; Index index7 = new Index(0); IContentNode tempQualifier7 = target[nameof(SimpleClass.Member2)]; Index index8 = new Index(1); IContentNode tempQualifier8 = source[nameof(SimpleClass.Member2)]; Index index9 = new Index(0); IContentNode tempQualifier9 = target[nameof(SimpleClass.Member2)]; Index index10 = new Index(1); IContentNode tempQualifier10 = source[nameof(SimpleClass.Member2)]; Index index11 = new Index(0); IContentNode tempQualifier11 = target[nameof(SimpleClass.Member2)]; Index index12 = new Index(2); IContentNode tempQualifier12 = source[nameof(SimpleClass.Member2)]; Index index13 = new Index(2); IContentNode tempQualifier13 = source[nameof(SimpleClass.Member2)]; Index index14 = new Index(2); IContentNode tempQualifier14 = source[nameof(SimpleClass.Member2)]; var expectedLinks = new Dictionary <IContentNode, IContentNode> { { source, target }, { source[nameof(SimpleClass.Member1)], target[nameof(SimpleClass.Member1)] }, { source[nameof(SimpleClass.Member2)], target[nameof(SimpleClass.Member2)] }, { tempQualifier.IndexedTarget(index), tempQualifier1.IndexedTarget(index1) }, { tempQualifier2.IndexedTarget(index2)[nameof(SimpleClass.Member1)], tempQualifier3.IndexedTarget(index3)[nameof(SimpleClass.Member1)] }, { tempQualifier4.IndexedTarget(index4)[nameof(SimpleClass.Member2)], tempQualifier5.IndexedTarget(index5)[nameof(SimpleClass.Member2)] }, { tempQualifier6.IndexedTarget(index6), tempQualifier7.IndexedTarget(index7) }, { tempQualifier8.IndexedTarget(index8)[nameof(SimpleClass.Member1)], tempQualifier9.IndexedTarget(index9)[nameof(SimpleClass.Member1)] }, { tempQualifier10.IndexedTarget(index10)[nameof(SimpleClass.Member2)], tempQualifier11.IndexedTarget(index11)[nameof(SimpleClass.Member2)] }, { tempQualifier12.IndexedTarget(index12), null }, { tempQualifier13.IndexedTarget(index13)[nameof(SimpleClass.Member1)], null }, { tempQualifier14.IndexedTarget(index14)[nameof(SimpleClass.Member2)], null }, }; VerifyLinks(expectedLinks, linker); }
/// <summary> /// Initializes a new instance of the <see cref="GraphNodeChangeListener"/> class. /// </summary> /// <param name="rootNode">The root node for which to track referenced node changes.</param> /// <param name="shouldRegisterNode">A method that can indicate whether a node of the hierarchy should be registered to the listener.</param> public GraphNodeChangeListener(IContentNode rootNode, Func <IMemberNode, IContentNode, bool> shouldRegisterNode = null) { this.rootNode = rootNode; this.shouldRegisterNode = shouldRegisterNode; RegisterAllNodes(); }
public VirtualNodeCommandWrapper(IViewModelServiceProvider serviceProvider, INodeCommand nodeCommand, IContentNode node, Index index) : base(serviceProvider) { if (nodeCommand == null) { throw new ArgumentNullException(nameof(nodeCommand)); } if (node == null) { throw new ArgumentNullException(nameof(node)); } this.node = node; this.index = index; NodeCommand = nodeCommand; Service = serviceProvider.Get <GraphViewModelService>(); }
/// <summary> /// 在流中读取字节后转换为对象 /// </summary> /// <param name="setting">配置项</param> /// <param name="node">节点流内容</param> /// <param name="reader">字符读取器</param> /// <param name="checkNullValue">是否检查空值</param> /// <returns></returns> /// <exception cref="System.ArgumentOutOfRangeException"></exception> /// <exception cref="System.ArgumentNullException"></exception> public override DateTime Parse(IDeserializerReader reader, JsonDeserializeSetting setting, IContentNode node, bool checkNullValue) { if (node == null) { return(new DateTime()); } var value = node.GetValue(); try { int year = 0, month = 0, day = 0, hour = 0, minute = 0, second = 0, mill = 0; if (value.Length > 22) { year = GetGigitInZeroToNightChar(value[0]) * 1000 + GetGigitInZeroToNightChar(value[1]) * 100 + GetGigitInZeroToNightChar(value[2]) * 10 + GetGigitInZeroToNightChar(value[3]); month = GetGigitInZeroToNightChar(value[5]) * 10 + GetGigitInZeroToNightChar(value[6]); day = GetGigitInZeroToNightChar(value[8]) * 10 + GetGigitInZeroToNightChar(value[9]); hour = GetGigitInZeroToNightChar(value[11]) * 10 + GetGigitInZeroToNightChar(value[12]); minute = GetGigitInZeroToNightChar(value[14]) * 10 + GetGigitInZeroToNightChar(value[15]); second = GetGigitInZeroToNightChar(value[17]) * 10 + GetGigitInZeroToNightChar(value[18]); mill = GetGigitInZeroToNightChar(value[20]) * 100 + GetGigitInZeroToNightChar(value[21]) * 10 + GetGigitInZeroToNightChar(value[22]); } else if (value.Length > 18) { year = GetGigitInZeroToNightChar(value[0]) * 1000 + GetGigitInZeroToNightChar(value[1]) * 100 + GetGigitInZeroToNightChar(value[2]) * 10 + GetGigitInZeroToNightChar(value[3]); month = GetGigitInZeroToNightChar(value[5]) * 10 + GetGigitInZeroToNightChar(value[6]); day = GetGigitInZeroToNightChar(value[8]) * 10 + GetGigitInZeroToNightChar(value[9]); hour = GetGigitInZeroToNightChar(value[11]) * 10 + GetGigitInZeroToNightChar(value[12]); minute = GetGigitInZeroToNightChar(value[14]) * 10 + GetGigitInZeroToNightChar(value[15]); second = GetGigitInZeroToNightChar(value[17]) * 10 + GetGigitInZeroToNightChar(value[18]); } else if (value.Length > 15) { year = GetGigitInZeroToNightChar(value[0]) * 1000 + GetGigitInZeroToNightChar(value[1]) * 100 + GetGigitInZeroToNightChar(value[2]) * 10 + GetGigitInZeroToNightChar(value[3]); month = GetGigitInZeroToNightChar(value[5]) * 10 + GetGigitInZeroToNightChar(value[6]); day = GetGigitInZeroToNightChar(value[8]) * 10 + GetGigitInZeroToNightChar(value[9]); hour = GetGigitInZeroToNightChar(value[11]) * 10 + GetGigitInZeroToNightChar(value[12]); minute = GetGigitInZeroToNightChar(value[14]) * 10 + GetGigitInZeroToNightChar(value[15]); } else if (value.Length > 12) { year = GetGigitInZeroToNightChar(value[0]) * 1000 + GetGigitInZeroToNightChar(value[1]) * 100 + GetGigitInZeroToNightChar(value[2]) * 10 + GetGigitInZeroToNightChar(value[3]); month = GetGigitInZeroToNightChar(value[5]) * 10 + GetGigitInZeroToNightChar(value[6]); day = GetGigitInZeroToNightChar(value[8]) * 10 + GetGigitInZeroToNightChar(value[9]); hour = GetGigitInZeroToNightChar(value[11]) * 10 + GetGigitInZeroToNightChar(value[12]); } else if (value.Length > 9) { year = GetGigitInZeroToNightChar(value[0]) * 1000 + GetGigitInZeroToNightChar(value[1]) * 100 + GetGigitInZeroToNightChar(value[2]) * 10 + GetGigitInZeroToNightChar(value[3]); month = GetGigitInZeroToNightChar(value[5]) * 10 + GetGigitInZeroToNightChar(value[6]); day = GetGigitInZeroToNightChar(value[8]) * 10 + GetGigitInZeroToNightChar(value[9]); } else if (value.Length > 6) { year = GetGigitInZeroToNightChar(value[0]) * 1000 + GetGigitInZeroToNightChar(value[1]) * 100 + GetGigitInZeroToNightChar(value[2]) * 10 + GetGigitInZeroToNightChar(value[3]); month = GetGigitInZeroToNightChar(value[5]) * 10 + GetGigitInZeroToNightChar(value[6]); } else { year = GetGigitInZeroToNightChar(value[0]) * 1000 + GetGigitInZeroToNightChar(value[1]) * 100 + GetGigitInZeroToNightChar(value[2]) * 10 + GetGigitInZeroToNightChar(value[3]); } //year = GetGigitInZeroToNightChar(node.Value[0]) * 1000 + GetGigitInZeroToNightChar(node.Value[1]) * 100 + GetGigitInZeroToNightChar(node.Value[2]) * 10 + GetGigitInZeroToNightChar(node.Value[3]); //month = GetGigitInZeroToNightChar(node.Value[5]) * 10 + GetGigitInZeroToNightChar(node.Value[6]); //day = GetGigitInZeroToNightChar(node.Value[8]) * 10 + GetGigitInZeroToNightChar(node.Value[9]); //hour = GetGigitInZeroToNightChar(node.Value[11]) * 10 + GetGigitInZeroToNightChar(node.Value[12]); //minute = GetGigitInZeroToNightChar(node.Value[14]) * 10 + GetGigitInZeroToNightChar(node.Value[15]); //second = GetGigitInZeroToNightChar(node.Value[17]) * 10 + GetGigitInZeroToNightChar(node.Value[18]); //if (node.Value.Length > 22) // mill = GetGigitInZeroToNightChar(node.Value[20]) * 100 + GetGigitInZeroToNightChar(node.Value[21]) * 10 + GetGigitInZeroToNightChar(node.Value[22]); return(new DateTime(year, month, day, hour, minute, second, mill)); } catch (OverflowException) { throw new ArgumentOutOfRangeException(node.Key, string.Format("数值溢出,在字符{0}至{1}处", node.Segment.Offset.ToString(), (node.Segment.Offset + node.Segment.Count).ToString())); } catch { throw new ArgumentNullException(string.Format("读取发现错误,在{0}至{1}字符处", node.Segment.Offset.ToString(), (node.Segment.Offset + node.Segment.Count).ToString())); } }
protected override bool ShouldVisitNode(IMemberNode memberContent, IContentNode targetNode) { // Make sure it's actually a target (not a member) node. return(!propertyGraph.IsReferencedPart(memberContent, targetNode) && base.ShouldVisitNode(memberContent, targetNode)); }
public ExpandingEventArgs(IContentNode node, ITreeSettings settings) { this.Node = node ?? throw new ArgumentNullException(nameof(node)); this.Settings = settings ?? throw new ArgumentNullException(nameof(settings)); }
public IEnumerable <SchemaIssue> FindIssues(IContentNode node) { yield break; }
protected override bool ShouldVisitSourceNode(IMemberNode memberContent, IContentNode targetNode) { return((ShouldVisit?.Invoke(memberContent, targetNode) ?? true) && base.ShouldVisitSourceNode(memberContent, targetNode)); }
/// <summary> /// Initializes a new instance of the <see cref="GraphViewModel"/> class. /// </summary> /// <param name="serviceProvider">A service provider that can provide a <see cref="IDispatcherService"/> and an <see cref="GraphViewModelService"/> to use for this view model.</param> /// <param name="propertyProvider">The object providing properties to display</param> /// <param name="graphNode">The root node of the view model to generate.</param> private GraphViewModel(IViewModelServiceProvider serviceProvider, IPropertiesProviderViewModel propertyProvider, IContentNode graphNode) : this(serviceProvider) { if (graphNode == null) { throw new ArgumentNullException(nameof(graphNode)); } PropertiesProvider = propertyProvider; var node = GraphViewModelService.GraphNodeViewModelFactory(this, "Root", graphNode.IsPrimitive, graphNode, new GraphNodePath(graphNode), graphNode.Type, Index.Empty); RootNode = node; node.Initialize(); node.FinalizeInitialization(); node.CheckConsistency(); }
protected override IContentNode FindTarget(IContentNode sourceNode) { var defaultTarget = base.FindTarget(sourceNode); return(propertyGraph.FindTarget(sourceNode, defaultTarget)); }
public ConstantExpression(IContentNode constant) { Constant = constant ?? throw new ArgumentNullException(nameof(constant)); }
protected override ObjectReference FindTargetReference(IContentNode sourceNode, IContentNode targetNode, ObjectReference sourceReference) { if (sourceReference.Index.IsEmpty) { return(targetNode.TargetReference); } // Special case for objects that are identifiable: the object must be linked to the base only if it has the same id if (sourceReference.ObjectValue != null) { if (sourceReference.Index.IsEmpty) { return(targetNode.TargetReference); } var sourceAssetNode = (IAssetNode)sourceNode; if ((sourceAssetNode as AssetMemberNode)?.IsNonIdentifiableCollectionContent ?? false) { return(null); } // Enumerable reference: we look for an object with the same id var targetReference = targetNode.ItemReferences; var sourceIds = CollectionItemIdHelper.GetCollectionItemIds(sourceNode.Retrieve()); var targetIds = CollectionItemIdHelper.GetCollectionItemIds(targetNode.Retrieve()); var itemId = sourceIds[sourceReference.Index.Value]; var targetKey = targetIds.GetKey(itemId); return(targetReference.FirstOrDefault(x => Equals(x.Index.Value, targetKey))); } // Not identifiable - default applies return(base.FindTargetReference(sourceNode, targetNode, sourceReference)); }
internal void RegisterOwner(IContentNode node) { if (node == null) throw new ArgumentNullException(nameof(node)); if (OwnerNode != null) throw new InvalidOperationException("An owner node has already been registered for this content."); OwnerNode = node; }
/// <summary> /// 在流中读取字节后转换为对象 /// </summary> /// <param name="setting">配置项</param> /// <param name="reader">字符读取器</param> /// <param name="node">节点流内容</param> /// <param name="checkNullValue">是否检查空值</param> /// <returns></returns> public abstract T Parse(IDeserializerReader reader, JsonDeserializeSetting setting, IContentNode node, bool checkNullValue);