Пример #1
0
        protected virtual bool CheckReset()
        {
            var anyChange = CheckRemove();

            if (!FReset.IsAnyInvalid() && FReset[0])
            {
                Keep.Clear();
                anyChange = true;

                FCountOut.FlushItem <int>(Keep.Count);
            }
            return(anyChange);
        }
        // copy and paste from AbstractMessageKeepNode.cs
        protected virtual bool UpKeep(bool force = false)
        {
            if (!force && !Keep.IsChanged)
            {
                if (!Keep.QuickMode && FChangeOut.SliceCount != 0)
                {
                    FChangeOut.FlushNil();
                    FChangeIndexOut.FlushNil();
                }

                var recentCommits = from message in Keep
                                    where message.HasRecentCommit()
                                    select message;

                foreach (var message in recentCommits)
                {
                    message.Commit(Keep);
                }
                return(false);
            }

            if (Keep.QuickMode)
            {
                Keep.Sync();
            }
            else
            {
                IEnumerable <int> indexes;
                var changes = Keep.Sync(out indexes);

                FChangeIndexOut.FlushResult(indexes);
                FChangeOut.FlushResult(changes);
            }

            FOutput.FlushResult(Keep);
            FCountOut.FlushItem <int>(Keep.Count);
            return(true);
        }
Пример #3
0
        public void Evaluate(int SpreadMax)
        {
            var flow = FFlowControl[0];

            FChange.SliceCount = 0;

            SpreadMax = FInput.SliceCount;

            if (FForce[0])
            {
                flow = FlowControlEnum.Force;
            }

            switch (flow)
            {
            case FlowControlEnum.Default:
                if (FInput.IsChanged && !FInput.IsAnyInvalid())
                {
                    FOutput.FlushResult(FInput);
                    FChange.FlushItem(true);
                }
                else
                {
                    FChange.FlushItem(false);
                }
                break;

            case FlowControlEnum.Inspect:
                if (FInput.IsAnyInvalid())
                {
                    FChange.FlushItem(false);
                    break;
                }

                var change = FInput.Select(message => message.IsChanged);
                if (FInput.IsChanged || change.Any())
                {
                    if (FFilter[0])
                    {
                        FOutput.FlushResult(FInput.Where(message => message.IsChanged));
                    }
                    else
                    {
                        FOutput.FlushResult(FInput);
                    }
                    FChange.FlushResult(change);
                }
                else
                {
                    FChange.FlushResult(Enumerable.Repeat(false, SpreadMax));
                }
                break;

            case FlowControlEnum.SinceLastFrame:
                if (FInput.IsAnyInvalid())
                {
                    FChange.FlushItem(false);
                    break;
                }

                var changed = FInput.Select(message => message.HasRecentCommit());
                if (FInput.IsChanged || changed.Any())
                {
                    if (FFilter[0])
                    {
                        FOutput.FlushResult(FInput.Where(message => message.HasRecentCommit()));
                    }
                    else
                    {
                        FOutput.FlushResult(FInput);
                    }
                    FChange.FlushResult(changed);
                }
                else
                {
                    FChange.FlushResult(Enumerable.Repeat(false, SpreadMax));
                }
                break;

            case FlowControlEnum.Block:
                FChange.FlushItem(false);
                break;

            case FlowControlEnum.Force:
                FOutput.FlushResult(FInput);
                FChange.FlushResult(Enumerable.Repeat(true, SpreadMax));
                break;

            default:     // all bases covered?
                FChange.FlushItem <bool>(false);
                break;
            }
        }
        public void Evaluate(int SpreadMax)
        {
            if (FConfiguration.IsAnyInvalid() || FName.IsAnyInvalid())
            {
                return;
            }

            ForceUpdate |= !FUpdate.IsAnyInvalid() && FUpdate[0];
            var change = ForceUpdate || FInherits.IsChanged || FName.IsChanged || FConfiguration.IsChanged;


            if (!ForceUpdate && !change)
            {
                if (_lastException != null)
                {
                    FError.FlushItem(_lastException.ToString());
                    throw _lastException;
                }
            }

            // untoggle exception.
            if (_lastException != null)
            {
                var tmp = _lastException;
                FError.FlushItem(_lastException.ToString());
                _lastException = null; // assume innocence
                throw tmp;
            }

            if (!change && !ForceUpdate)
            {
                return;
            }

            FOutput.SliceCount = SpreadMax = FName.SliceCount;

            var id  = this.PluginHost.GetNodePath(false);
            var reg = MessageFormularRegistry.Context;

            for (int i = 0; i < SpreadMax; i++)
            {
                if (string.IsNullOrWhiteSpace(FName[i]))
                {
                    _lastException = new ParseFormularException("A Formular cannot have an empty Name.");
                    return;
                }

                var config = string.Join(", ", FConfiguration[i]).Split(',');

                var fields = new List <FormularFieldDescriptor>();
                foreach (var def in config)
                {
                    FormularFieldDescriptor field;
                    try
                    {
                        field = new FormularFieldDescriptor(def.Trim(), true);
                    }
                    catch (ParseFormularException e)
                    {
                        _lastException = e;
                        return;
                    }

                    var match = (
                        from f in fields
                        where f.Name == field.Name
                        select f
                        ).FirstOrDefault();

                    if (match != null)
                    {
                        _lastException = new DuplicateFieldException("Cannot add \"" + def + "\" in Formular for [" + FName[i] + "]. Field with the same name already defined.", match, field);
                        return;
                    }
                    else
                    {
                        fields.Add(field);
                    }
                }


                var formular = new MessageFormular(FName[i], fields);

                if (!FInherits.IsAnyInvalid())
                {
                    // flatten
                    var allFields = (
                        from form in FInherits
                        from field in form.FieldDescriptors
                        select field
                        ).Distinct();

                    foreach (var field in allFields)
                    {
                        if (!formular.CanAppend(field))
                        {
                            var duplicate = formular[field.Name];
                            _lastException = new DuplicateFieldException("Cannot add new Field \"" + field.ToString() + "\" to Formular [" + formular.Name + "]. Field is already defined as \"" + duplicate.ToString() + "\".", field, duplicate);
                            return;
                        }
                        else
                        {
                            try
                            {
                                formular.Append(field, true);
                            }
                            catch (DuplicateFieldException e)
                            {
                                _lastException = e;
                                return;
                            }
                        }
                    }
                }

                // only register, when update has been hit!
                if (ForceUpdate)
                {
                    try
                    {
                        var defined = reg.Define(id, formular); // will raise Change events to inform all formularable nodes
                        if (defined)
                        {
                            FOutput[i] = formular;
                        }
                    }
                    catch (RegistryException e)
                    {
                        _lastException = e;
                        return;
                    }
                }