public void OnEvent(object sender, CommitEventArgs args)
 {
     if (!shallListen.value)
     {
         return;
     }
     Assert.IsFalse(gotEvent.value);
     gotEvent.value = true;
     ownEvent.value = args.IsOwnCommit();
     lockObject.Run(new _IClosure4_161(lockObject));
 }
Beispiel #2
0
        public virtual void ClientCommit(object sender, CommitEventArgs e)
        {
            if (e.IsOwnCommit())
            {
                return;
            }

            var clientContainer = e.ObjectContainer();
            var items           = new List <Tuple <TItem, GraphEventType> > ();
            var edges           = new List <Tuple <TEdge, GraphEventType> > ();

            Action <IObjectInfoCollection, GraphEventType> selectCommit = (col, eventType) => {
                foreach (var objectInfo in col.OfType <IObjectInfo> ())
                {
                    var obj = objectInfo.GetObject();

                    if (eventType == GraphEventType.Remove)
                    {
                        obj = Session.Ext().GetByID(objectInfo.GetInternalID());
                    }
                    else if (eventType == GraphEventType.Update || eventType == GraphEventType.Add)
                    {
                        clientContainer.Ext().Refresh(obj, 1);
                    }

                    if (obj is TEdge)
                    {
                        edges.Add(Tuple.Create((TEdge)obj, eventType));
                    }
                    else if (obj is TItem)
                    {
                        items.Add(Tuple.Create((TItem)obj, eventType));
                    }
                }
            };

            selectCommit(e.Deleted, GraphEventType.Remove);
            selectCommit(e.Updated, GraphEventType.Update);
            selectCommit(e.Added, GraphEventType.Add);

            if (items.Count == 0 && edges.Count == 0)
            {
                return;
            }

            // commit makes a roundup back to sender, dont do it
            //if (!Gateway.Iori.AccessMode.HasFlag (IoMode.Server))
            //    clientContainer.Commit ();

            Action <Tuple <TEdge, GraphEventType> > forEdge = tuple => {
                var edge      = tuple.Item1;
                var eventType = tuple.Item2;
                var item      = (TItem)(object)edge;
                if (eventType == GraphEventType.Update || eventType == GraphEventType.Add)
                {
                    // this is done by commit:
                    // Add (edge);
                }
                try {
                    this.OnGraphChange(item, eventType);
                } catch (Exception ex) {
                    Trace.TraceError(ex.Message);
                }
                if (eventType == GraphEventType.Remove || eventType == GraphEventType.Add)
                {
                    // this is done by commit:
                    //Remove (edge);
                    RemoveCached(edge);
                }
            };

            Action <Tuple <TItem, GraphEventType> > forItem = tuple => {
                var item      = tuple.Item1;
                var eventType = tuple.Item2;
                if (eventType == GraphEventType.Update || eventType == GraphEventType.Add)
                {
                    // Session.Ext ().Refresh (item, 1);
                    // this is done by commit:
                    //Add (item);
                }
                try {
                    this.OnGraphChange(item, eventType);
                } catch (Exception ex) {
                    Trace.TraceError(ex.Message);
                }

                if (eventType == GraphEventType.Remove)
                {
                    // this is done by commit:
                    // Remove (item);
                    SetCached(item, null);
                }
            };

            var tokenSource = new CancellationTokenSource();
            var token       = tokenSource.Token;

            Action afterCommit = () => {
                token.WaitHandle.WaitOne(500);
                token.ThrowIfCancellationRequested();

                items.Where(t => t.Item2 == GraphEventType.Update || t.Item2 == GraphEventType.Add)
                .ForEach(forItem);
                edges.Where(t => t.Item2 == GraphEventType.Update || t.Item2 == GraphEventType.Add)
                .ForEach(forEdge);

                var removeEdges = edges.Where(t => t.Item2 == GraphEventType.Remove);
                var removeItems = items.Where(t => t.Item2 == GraphEventType.Remove);

                removeEdges.ForEach(forEdge);
                removeItems.ForEach(forItem);


                // commit makes a roundtrip back to sender, so use it only on server
                // annoyance: it triggers back the changes to the client
                // bug: if changes are made on the server/client, client changes are lost
                // so currently only changing in client-only-mode is supported!!!
                if (Gateway.Iori.AccessMode.HasFlag(IoMode.Server))
                {
                    Flush();
                }
            };

            var thread = Task.Factory.StartNew(afterCommit);
            //tokenSource.Cancel ();
        }