/// <summary> /// Subscribe to data changes /// </summary> /// <param name="subscriberId">client id from signalR</param> /// <param name="mapping">mapping to subscribe</param> /// <param name="vars">variables to detect</param> /// <returns></returns> public bool SubscribeChanges(string subscriberId, string mapping, params string[] vars) { if (DataChanged == null) { throw new NullReferenceException("DataChanged"); } var enumerable = new List <List <string> >(); foreach (var variable in vars) { enumerable.Add(variable.Split('.').ToList()); } SubscriptionTree item; if (!_subscritions.TryGetValue(mapping, out item)) { item = new SubscriptionTree(mapping, DataChanged); if (!_subscritions.TryAdd(mapping, item)) { item = _subscritions[mapping]; } } return(item.AddSubscribtion(subscriberId, enumerable) == vars.Length); }
public void CreateSubscriptionTree_SimplePropertyAccess_TreeHasAllItems() { InitializeTargetJustAgeAccess(); SubscriptionTree subscriptionTree = _target.CreateSubscriptionTree(_person); Assert.AreEqual(1, subscriptionTree.Children.Count); SubscriptionNode root = subscriptionTree.Children[0]; Assert.AreEqual(_person, root.Subject); Assert.IsNull(root.Children); }
public void CreateSubscriptionTreeChangePropertyOnParameter_PropertyNotBeingMonitored_PropertyChanges() { InitializeTargetJustAgeAccess(); SubscriptionTree subscriptionTree = _target.CreateSubscriptionTree(_person); int callCount = 0; subscriptionTree.PropertyChanged += (sender) => callCount++; _person.Name = "Foooadf"; Assert.AreEqual(0, callCount); }
public void CreateSubscriptionTreeChangePropertyOnParameter_TwoLevelPropertyBeingMonitored_PropertyChanges() { InitializeTargetBrothersAgeAccess(); SubscriptionTree subscriptionTree = _target.CreateSubscriptionTree(_person); int callCount = 0; subscriptionTree.PropertyChanged += (sender) => callCount++; _person.Brother = new Person(); Assert.AreEqual(1, callCount); }
public ShowSubscriptionsForm(SynchronizationTree tree, Action <bool> startSyncThread, VaultCommunication vaultCom) { this.tree = tree; this.startSyncThread = startSyncThread; this.vaultCom = vaultCom; InitializeComponent(); SubscriptionTree.Nodes.Clear(); removeToolStripMenuItem.ShortcutKeys = Keys.Delete; RedrawTree(); SubscriptionTree.ExpandAll(); }
public void Setup() { _person = new Person(); _ageAccessNode = new PropertyAccessNode(typeof(Person).GetProperty("Age")); _brotherAccessNode = new PropertyAccessNode(typeof(Person).GetProperty("Brother")) { Children = new List<PropertyAccessTreeNode>() { _ageAccessNode } }; _parameterAccessNode = new ParameterNode(typeof(Person), "person") { Children = new List<PropertyAccessTreeNode>() { _brotherAccessNode } }; _brotherNode = new SubscriptionNode() { AccessNode = _brotherAccessNode }; _parameterNode = new SubscriptionNode() { AccessNode = _parameterAccessNode, Children = new List<SubscriptionNode>() { _brotherNode } }; _parameterNode.Subject = _person; List<SubscriptionNode> nodes = new List<SubscriptionNode>() { _parameterNode }; _target = new SubscriptionTree(_person, nodes); }
public void CreateSubscriptionTree_TwoLevelPropertyAccess_TreeHasAllItems() { InitializeTargetBrothersAgeAccess(); SubscriptionTree subscriptionTree = _target.CreateSubscriptionTree(_person); Assert.AreEqual(1, subscriptionTree.Children.Count); SubscriptionNode root = subscriptionTree.Children[0]; Assert.AreEqual(_person, root.Subject); Assert.AreEqual(1, root.Children.Count); SubscriptionNode brotherSubscriptionNode = root.Children[0]; Assert.AreEqual(_brotherPropertyAccessNode, brotherSubscriptionNode.AccessNode); Assert.IsNull(brotherSubscriptionNode.Children); }
private bool UpdateSubscribtion(string id, IEnumerable <string> variablePath, bool remove, ref int subscriptions) { if (variablePath.Any()) { var key = variablePath.First(); SubscriptionTree entry; if (!Childs.TryGetValue(key, out entry) && !remove) { entry = new SubscriptionTree { Name = key, Parent = this }; if (!Childs.TryAdd(key, entry)) { entry = Childs[key]; } } return(entry != null?entry.UpdateSubscribtion(id, variablePath.Skip(1), remove, ref subscriptions) : false); } else { if (remove) { object o; if (Subscribers.TryRemove(id, out o)) { Interlocked.Decrement(ref subscriptions); return(true); } return(false); } else { if (Subscribers.TryAdd(id, null)) { Interlocked.Increment(ref subscriptions); return(true); } return(false); } } }
public void CreateSubscriptionTreeChangeSecondLevelPropertyOnParameterAndThenModifyOldProperty_TwoLevelPropertyBeingMonitored_PropertyDoesNotChange() { InitializeTargetBrothersAgeAccess(); Person brother = new Person(); _person.Brother = brother; SubscriptionTree subscriptionTree = _target.CreateSubscriptionTree(_person); int callCount = 0; subscriptionTree.PropertyChanged += (sender) => callCount++; _person.Brother = null; brother.Age = 1000022; Assert.AreEqual(1, callCount); }
/// <summary> /// Subscribe to raw data changes /// </summary> /// <param name="subscriberId">client id from signalR</param> /// <param name="mapping">mapping to subscribe</param> /// <param name="vars">variables to detect</param> /// <returns></returns> public bool SubscribeRawChanges(string subscriberId, string area, params string[] adresses) { if (DataChanged == null) { throw new NullReferenceException("DataChanged"); } SubscriptionTree item; var key = $"{ADDRESS_PREFIX}{area}"; if (!_subscritions.TryGetValue(key, out item)) { item = new SubscriptionTree(area, DataChanged, true); if (!_subscritions.TryAdd(key, item)) { item = _subscritions[key]; } } return(item.AddRawSubscription(subscriberId, adresses) == adresses.Length); }
public void Setup() { _person = new Person(); _ageAccessNode = new PropertyAccessNode(typeof(Person).GetProperty("Age")); _brotherAccessNode = new PropertyAccessNode(typeof(Person).GetProperty("Brother")) { Children = new List <PropertyAccessTreeNode>() { _ageAccessNode } }; _parameterAccessNode = new ParameterNode(typeof(Person), "person") { Children = new List <PropertyAccessTreeNode>() { _brotherAccessNode } }; _brotherNode = new SubscriptionNode() { AccessNode = _brotherAccessNode }; _parameterNode = new SubscriptionNode() { AccessNode = _parameterAccessNode, Children = new List <SubscriptionNode>() { _brotherNode } }; _parameterNode.Subject = _person; List <SubscriptionNode> nodes = new List <SubscriptionNode>() { _parameterNode }; _target = new SubscriptionTree(_person, nodes); }
private void SubscriptionTree_MouseUp(object sender, MouseEventArgs e) { var folderToolStripMenuItems = new[] { new { state = SyncState.Include, menuItem = includeAllToolStripMenuItem }, new { state = SyncState.IncludeOnlyFiles, menuItem = includeFilesToolStripMenuItem }, new { state = SyncState.IncludeOnlyDirectChildFolders, menuItem = includeDirectSubfoldersToolStripMenuItem }, new { state = SyncState.IncludeOnlyFolders, menuItem = includeFoldersToolStripMenuItem }, new { state = SyncState.IncludeSingleFolder, menuItem = onlyThisFolderToolStripMenuItem } }; var toolStripMenuItems = new[] { new { state = SyncState.Include, menuItem = includeToolStripMenuItem }, new { state = SyncState.Exclude, menuItem = excludeToolStripMenuItem }, }; foreach (var x in folderToolStripMenuItems.Concat(toolStripMenuItems)) { x.menuItem.Tag = x.state; } if (e.Button == MouseButtons.Right) { SubscriptionTree.SelectedNode = SubscriptionTree.GetNodeAt(e.X, e.Y); var n = SubscriptionTree.SelectedNode; if (n != null) { foreach (var item in toolStripMenuItems .Concat(folderToolStripMenuItems) .Select(x => x.menuItem) .Concat(treeContextMenuStrip.Items.OfType <ToolStripMenuItem>())) { item.Checked = false; item.Enabled = true; } var isFolder = tree.IsFolder(GetPath(n)); includeToolStripMenuItem.DropDownItems.Clear(); if (isFolder) // show dropdown { foreach (var item in folderToolStripMenuItems) { includeToolStripMenuItem.DropDownItems.Add(item.menuItem); } } var state = tree.GetExplicitStateOfPath(GetPath(n)); if (state == null) { inheritedToolStripMenuItem.Checked = true; } else { foreach (var item in toolStripMenuItems.Concat(folderToolStripMenuItems)) { if (item.menuItem.Tag != null && state == item.menuItem.Tag as SyncState?) { item.menuItem.Checked = true; } } if (folderToolStripMenuItems.Any(x => x.menuItem.Checked)) { includeToolStripMenuItem.Checked = true; } } } else { foreach (var item in treeContextMenuStrip.Items.OfType <ToolStripMenuItem>()) { item.Enabled = false; item.Checked = false; } } treeContextMenuStrip.Show(SubscriptionTree, e.Location); } }