Beispiel #1
0
        public override void HandleUpdate(bool isBaseEventType,
                                          RevisionStateMerge revisionState,
                                          RevisionEventBeanMerge revisionEvent,
                                          RevisionTypeDesc typesDesc)
        {
            EventBean underlyingEvent = revisionEvent.UnderlyingFullOrDelta;

            NullableObject <Object>[] changeSetValues = revisionState.Overlays;
            if (changeSetValues == null)    // optimization - the full event sets it to null, deltas all get a new one
            {
                changeSetValues = new NullableObject <Object> [spec.ChangesetPropertyNames.Length];
            }
            else
            {
                changeSetValues = ArrayCopy(changeSetValues);   // preserve the last revisions
            }

            // apply all properties of the delta event
            int[] indexes = typesDesc.ChangesetPropertyIndex;
            EventPropertyGetter[] getters = typesDesc.ChangesetPropertyGetters;
            for (int i = 0; i < indexes.Length; i++)
            {
                int index = indexes[i];

                if (!getters[i].IsExistsProperty(underlyingEvent))
                {
                    continue;
                }

                Object value = getters[i].Get(underlyingEvent);
                changeSetValues[index] = new NullableObject <Object>(value);
            }

            revisionState.Overlays = changeSetValues;
        }
Beispiel #2
0
 /// <summary>Merge properties. </summary>
 /// <param name="isBaseEventType">true if the event is a base event type</param>
 /// <param name="revisionState">the current state, to be updated.</param>
 /// <param name="revisionEvent">the new event to merge</param>
 /// <param name="typesDesc">descriptor for event type of the new event to merge</param>
 public abstract void HandleUpdate(bool isBaseEventType,
                                   RevisionStateMerge revisionState,
                                   RevisionEventBeanMerge revisionEvent,
                                   RevisionTypeDesc typesDesc);
        public override void OnUpdate(EventBean[] newData, EventBean[] oldData, NamedWindowRootViewInstance namedWindowRootView, EventTableIndexRepository indexRepository)
        {
            // If new data is filled, it is not a delete
            RevisionEventBeanMerge revisionEvent;
            Object key;

            if ((newData == null) || (newData.Length == 0))
            {
                // we are removing an event
                revisionEvent = (RevisionEventBeanMerge)oldData[0];
                key           = revisionEvent.Key;
                _statePerKey.Remove(key);

                // Insert into indexes for fast deletion, if there are any
                foreach (EventTable table in indexRepository.GetTables())
                {
                    table.Remove(oldData);
                }

                // make as not the latest event since its due for removal
                revisionEvent.IsLatest = false;

                namedWindowRootView.UpdateChildren(null, oldData);
                return;
            }

            revisionEvent = (RevisionEventBeanMerge)newData[0];
            EventBean underlyingEvent    = revisionEvent.UnderlyingFullOrDelta;
            EventType underyingEventType = underlyingEvent.EventType;

            // obtain key values
            key = null;
            RevisionTypeDesc typesDesc;
            Boolean          isBaseEventType = false;

            if (underyingEventType == RevisionSpec.BaseEventType)
            {
                typesDesc       = _infoFullType;
                key             = PropertyUtility.GetKeys(underlyingEvent, _infoFullType.KeyPropertyGetters);
                isBaseEventType = true;
            }
            else
            {
                typesDesc = TypeDescriptors.Get(underyingEventType);

                // if this type cannot be found, check all supertypes, if any
                if (typesDesc == null)
                {
                    EventType[] superTypes = underyingEventType.DeepSuperTypes;
                    if (superTypes != null)
                    {
                        foreach (var superType in superTypes)
                        {
                            if (superType == RevisionSpec.BaseEventType)
                            {
                                typesDesc       = _infoFullType;
                                key             = PropertyUtility.GetKeys(underlyingEvent, _infoFullType.KeyPropertyGetters);
                                isBaseEventType = true;
                                break;
                            }
                            typesDesc = TypeDescriptors.Get(superType);
                            if (typesDesc != null)
                            {
                                TypeDescriptors.Put(underyingEventType, typesDesc);
                                key = PropertyUtility.GetKeys(underlyingEvent, typesDesc.KeyPropertyGetters);
                                break;
                            }
                        }
                    }
                }
                else
                {
                    key = PropertyUtility.GetKeys(underlyingEvent, typesDesc.KeyPropertyGetters);
                }
            }

            // get the state for this key value
            RevisionStateMerge revisionState = _statePerKey.Get(key);

            // Delta event and no full
            if ((!isBaseEventType) && (revisionState == null))
            {
                return; // Ignore the event, its a delta and we don't currently have a full event for it
            }

            // New full event
            if (revisionState == null)
            {
                revisionState = new RevisionStateMerge(underlyingEvent, null, null);
                _statePerKey.Put(key, revisionState);

                // prepare revison event
                revisionEvent.LastBaseEvent = underlyingEvent;
                revisionEvent.Key           = key;
                revisionEvent.Overlay       = null;
                revisionEvent.IsLatest      = true;

                // Insert into indexes for fast deletion, if there are any
                foreach (EventTable table in indexRepository.GetTables())
                {
                    table.Add(newData);
                }

                // post to data window
                revisionState.LastEvent = revisionEvent;
                namedWindowRootView.UpdateChildren(new EventBean[] { revisionEvent }, null);
                return;
            }

            // handle Update, changing revision state and event as required
            _updateStrategy.HandleUpdate(isBaseEventType, revisionState, revisionEvent, typesDesc);

            // prepare revision event
            revisionEvent.LastBaseEvent = revisionState.BaseEventUnderlying;
            revisionEvent.Overlay       = revisionState.Overlays;
            revisionEvent.Key           = key;
            revisionEvent.IsLatest      = true;

            // get prior event
            RevisionEventBeanMerge lastEvent = revisionState.LastEvent;

            lastEvent.IsLatest = false;

            // data to post
            var newDataPost = new EventBean[] { revisionEvent };
            var oldDataPost = new EventBean[] { lastEvent };

            // Update indexes
            foreach (EventTable table in indexRepository.GetTables())
            {
                table.Remove(oldDataPost);
                table.Add(newDataPost);
            }

            // keep reference to last event
            revisionState.LastEvent = revisionEvent;

            namedWindowRootView.UpdateChildren(newDataPost, oldDataPost);
        }
        public override void HandleUpdate(bool isBaseEventType,
                                          RevisionStateMerge revisionState,
                                          RevisionEventBeanMerge revisionEvent,
                                          RevisionTypeDesc typesDesc)
        {
            EventBean underlyingEvent = revisionEvent.UnderlyingFullOrDelta;

            // Previously-seen full event
            if (isBaseEventType)
            {
                // If delta types don't add properties, simply set the overlay to null
                NullableObject <Object>[] changeSetValues;
                if (!spec.IsDeltaTypesAddProperties)
                {
                    changeSetValues = null;
                }
                // If delta types do add properties, set a new overlay
                else
                {
                    changeSetValues = revisionState.Overlays;
                    if (changeSetValues == null)    // optimization - the full event sets it to null, deltas all get a new one
                    {
                        changeSetValues = new NullableObject <Object> [spec.ChangesetPropertyNames.Length];
                    }
                    else
                    {
                        changeSetValues = ArrayCopy(changeSetValues);   // preserve the last revisions
                    }

                    // reset properties not contributed by any delta, leaving all delta-contributed properties in place
                    bool[] changesetPropertyDeltaContributed = spec.ChangesetPropertyDeltaContributed;
                    for (int i = 0; i < changesetPropertyDeltaContributed.Length; i++)
                    {
                        // if contributed then leave the value, else override
                        if (!changesetPropertyDeltaContributed[i])
                        {
                            changeSetValues[i] = null;
                        }
                    }
                }
                revisionState.Overlays            = changeSetValues;
                revisionState.BaseEventUnderlying = underlyingEvent;
            }
            // Delta event to existing full event merge
            else
            {
                NullableObject <Object>[] changeSetValues = revisionState.Overlays;

                if (changeSetValues == null)    // optimization - the full event sets it to null, deltas all get a new one
                {
                    changeSetValues = new NullableObject <Object> [spec.ChangesetPropertyNames.Length];
                }
                else
                {
                    changeSetValues = ArrayCopy(changeSetValues);   // preserve the last revisions
                }

                // apply all properties of the delta event
                int[] indexes = typesDesc.ChangesetPropertyIndex;
                EventPropertyGetter[] getters = typesDesc.ChangesetPropertyGetters;
                for (int i = 0; i < indexes.Length; i++)
                {
                    int    index = indexes[i];
                    Object value = getters[i].Get(underlyingEvent);
                    changeSetValues[index] = new NullableObject <Object>(value);
                }

                revisionState.Overlays = changeSetValues;
            }
        }