/// <summary>
        /// Update node view to display and/or cache the IpcEvent
        /// </summary>
        /// <param name="evt"></param>
        private void UpdateNodeView(ITreeModelEvent evt)
        {
            try
            {
                _treeModel.AcquireLock("UpdateNodeView");

                //pass update to the view
                if (_treeModel.DoesNodeExist(evt.NodeID))
                {
                    _treeModel.GetNode(evt.NodeID).NodeView.UpdateView(evt);
                }
                else
                    throw new InvalidOperationException("Error updating node view: NodeID " + evt.NodeID + " does not exist");

            }
            catch (Exception ex)
            {
                throw new InvalidOperationException("Failed to Update Node View: " + ex.Message);
            }
            finally
            {
                _treeModel.ReleaseLock();
            }
        }
 /// <summary>
 /// Add event to event queue
 /// </summary>
 /// <param name="evt"></param>
 public void AddEventToQueue(ITreeModelEvent evt)
 {
     _eventQueue.Enqueue(evt);
 }
        /// <summary>
        /// Refresh tree model with any changes present in the IpcEvent
        /// </summary>
        /// <param name="evt"></param>
        private void RefreshTreeModel(ITreeModelEvent evt)
        {
            try
            {
                _treeModel.AcquireLock("RefreshTreeModel");

                //check if node exists
                if (_treeModel.DoesNodeExist(evt.NodeID))
                {
                    //  check if node text has changed
                    if (_treeModel.HasNodeTextChanged(evt.NodeID, evt.NodeText))
                    {
                        TreeModelNode node = _treeModel.GetNode(evt.NodeID);
                        logger.Info("Node [" + evt.NodeID + "] [" + node.NodeText + "] text changed to: " + evt.NodeText);

                        //update text
                        _treeModel.UpdateNodeText(evt.NodeID, evt.NodeText);
                    }

                }
                else
                {
                    //adding new node
                    logger.Info("Adding node [" + evt.NodeID + "]: " + evt.NodeText);

                    //create a new node view
                    ITreeModelNodeView nodeView = _nodeViewFactory.CreateNodeView(_callerSessionID);

                    bool isRoot = false;
                    if (evt.ParentNodeID.Trim().Length == 0)
                        isRoot = true;
                    else
                        isRoot = false;

                    if (evt.NodeID.Trim().Length == 0)
                        throw new InvalidOperationException("Failed to add node ID [" + evt.NodeID + "] text [" + evt.NodeText + "]: NodeID is a required field to create a tree model node.");
                    //create a new node
                    TreeModelNode node = new TreeModelNode(evt.NodeID, evt.NodeText, evt.ParentNodeID, isRoot, nodeView, _treeModel);

                    //add
                    _treeModel.AddNode(node);

                }

            }
            catch (Exception ex)
            {
                throw new InvalidOperationException("Failed to Refresh Tree Model: " + ex.Message);
            }
            finally
            {
                _treeModel.ReleaseLock();
            }
        }