示例#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;
        }
示例#2
0
 /// <summary>Array copy. </summary>
 /// <param name="array">to copy</param>
 /// <returns>copied array</returns>
 internal static NullableObject <T>[] ArrayCopy <T>(NullableObject <T>[] array)
 {
     if (array == null)
     {
         return(null);
     }
     NullableObject <T>[] result = new NullableObject <T> [array.Length];
     Array.Copy(array, 0, result, 0, array.Length);
     return(result);
 }
示例#3
0
        private EventBean GetPreprocessedEvent(EventBean theEvent, ExprEvaluatorContext exprEvaluatorContext)
        {
            NullableObject <InternalEventRouterPreprocessor> processor = _preprocessors.Get(theEvent.EventType);

            if (processor == null)
            {
                lock (this)
                {
                    processor = Initialize(theEvent.EventType);
                    _preprocessors.Put(theEvent.EventType, processor);
                }
            }

            if (processor.Value == null)
            {
                return(theEvent);
            }
            else
            {
                return(processor.Value.Process(theEvent, exprEvaluatorContext));
            }
        }
 public static object GetNullableValue(this FieldInfo field, object target)
 {
     return NullableObject.GetField(target, field);
 }
        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;
            }
        }
示例#6
0
        protected ResponseOut(Toutput result)
        {
            this.Error = NullableObject <ErrorOut> .EmptyResult();

            this.Result = result;
        }
示例#7
0
 protected ResponseOut(ErrorOut error)
 {
     this.Error = NullableObject <ErrorOut> .FromResult(error);
 }
        public void AllocateVariableState(
            string deploymentId,
            string variableName,
            int agentInstanceId,
            bool recovery,
            NullableObject<object> initialValue,
            EventBeanTypedEventFactory eventBeanTypedEventFactory)
        {
            var entry = DeploymentsWithVariables.Get(deploymentId);
            if (entry == null) {
                throw new ArgumentException("Failed to find variable deployment id '" + deploymentId + "'");
            }

            var variable = entry.GetVariable(variableName);
            if (variable == null) {
                throw new ArgumentException("Failed to find variable '" + variableName + "'");
            }

            // Check current state - see if the variable exists in the state handler
            object initialState;
            if (initialValue != null) {
                initialState = initialValue.Value;
            }
            else {
                initialState = variable.MetaData.ValueWhenAvailable;
            }

            if (variable.MetaData.EventType != null && initialState != null && !(initialState is EventBean)) {
                initialState = eventBeanTypedEventFactory.AdapterForTypedObject(
                    initialState,
                    variable.MetaData.EventType);
            }

            if (OptionalStateHandler != null && !variable.MetaData.IsConstant) {
                var priorValue = OptionalStateHandler.GetHasState(variable, agentInstanceId);
                if (recovery) {
                    if (priorValue != null) {
                        initialState = priorValue.Value;
                    }
                }
                else {
                    if (priorValue == null) { // we do not already have a value
                        OptionalStateHandler.SetState(variable, agentInstanceId, initialState);
                    }
                    else {
                        initialState = priorValue.Value;
                    }
                }
            }

            // create new holder for versions
            var timestamp = timeProvider.Time;
            var valuePerVersion = new VersionedValueList<object>(
                variableName,
                currentVersionNumber,
                initialState,
                timestamp,
                millisecondLifetimeOldVersions,
                ReadWriteLock.ReadLock,
                HIGH_WATERMARK_VERSIONS,
                false);
            IDictionary<int, VariableReader> cps = variableVersionsPerCP[variable.VariableNumber];
            var reader = new VariableReader(variable, versionThreadLocal, valuePerVersion);
            cps.Put(agentInstanceId, reader);
        }
示例#9
0
 protected ValidationResult()
 {
     this.Error = NullableObject <ErrorOut> .EmptyResult();
 }
示例#10
0
 protected ValidationResult(ErrorOut error)
 {
     this.Error = NullableObject <ErrorOut> .FromResult(error);
 }