예제 #1
0
        public static Command NextPageCommand <TItem>() where TItem : VText
        {
            var pagesArgument = new IntegerArgument("pages", Text("The amount of pages you would like to advance"));

            void NextPageAction <TItemInner>(Game game, Command command) where TItemInner : VText
            {
                var element = game.Elements[^ 1] as MultiPageListElement <TItemInner>;
예제 #2
0
        public void WithNotStringArgument_ShouldThrowException()
        {
            var notStringArgument = new IntegerArgument("4");

            var exception = Assert.Throws <ArgumentException>(() => StringArgument.GetValue(notStringArgument));

            Assert.Equal(ErrorMessages.IncorrectArgumentTypeError, exception.Message);
        }
예제 #3
0
        public void WithCorrectArgument_ShouldReturnValue()
        {
            var value           = 5;
            var integerArgument = new IntegerArgument(value.ToString());

            var result = IntegerArgument.GetValue(integerArgument);

            Assert.Equal(value, result);
        }
        public void IntegerArgument_ParseShouldFail_BecauseNumberIsTooLow()
        {
            // Arrange
            IntegerArgument argument = new IntegerArgument(minimum: 0);
            IStringReader   reader   = new StringReader("-10");

            // Act
            ReadResults readResults = argument.Parse(reader, out _);

            // Assert
            Assert.IsFalse(readResults.Successful);
        }
예제 #5
0
        public void WithCorrectNumberValue_ShouldSetValueField()
        {
            var value           = "5";
            var integerArgument = new IntegerArgument(value);

            var field = integerArgument.GetType().GetField("value", BindingFlags.NonPublic | BindingFlags.Instance);

            var expectedValue = int.Parse(value);
            var actualValue   = (int)field.GetValue(integerArgument);

            Assert.Equal(expectedValue, actualValue);
        }
        public void IntegerArgument_ParseShouldFail_BecauseInvalidInteger()
        {
            // Arrange
            IntegerArgument argument = new IntegerArgument();
            IStringReader   reader   = new StringReader("1.5");

            // Act
            ReadResults readResults = argument.Parse(reader, out _);

            // Assert
            Assert.IsFalse(readResults.Successful);
        }
        public void IntegerResult_ShouldHaveCorrectValue()
        {
            // Arrange
            IntegerArgument argument = new IntegerArgument();
            IStringReader   reader   = new StringReader("123");

            // Act
            argument.Parse(reader, out int result);

            // Assert
            Assert.AreEqual(result, 123);
        }
        public void IntegerArgument_ParseShouldSucceed()
        {
            // Arrange
            IntegerArgument argument = new IntegerArgument();
            IStringReader   reader   = new StringReader("123");

            // Act
            ReadResults readResults = argument.Parse(reader, out _);

            // Assert
            Assert.IsTrue(readResults.Successful);
        }
예제 #9
0
        public static CommandBuilder WithStandardListAction <TGame, TItem>(this CommandBuilder commandBuilder,
                                                                           Func <TGame, Command, List <TItem> > source, Action <List <TItem>, TGame, Command> followup,
                                                                           params Func <TItem, bool>[] filters)
            where TGame : Game
            where TItem : VText
        {
            var prefixArgument = new StringArgument("Prefix", Text("the prefix of your search"));
            var suffixArgument = new StringArgument("suffix", Text("the suffix of your search"));
            var suffixTag      = new Tag("-suffix", Text("Allows you to search with a suffix"), new List <Argument> {
                suffixArgument
            });
            var infixArgument = new StringArgument("infix", Text("the infix of your search"));
            var infixTag      = new Tag("-infix", Text("Allows you to search with an infix"), new List <Argument> {
                infixArgument
            });
            var lengthArgument = new IntegerArgument("Length", Text("the length of your search"));
            var lengthTag      = new Tag("-length", Text("Allows your to search with a set length"), new List <Argument> {
                lengthArgument
            });
            var minLengthArgument = new IntegerArgument("Minimum Length", Text("the minimum length of your search"));
            var minLengthTag      = new Tag("-min", Text("Allows your to search with a minimum length"), new List <Argument> {
                minLengthArgument
            });
            var maxLengthArgument = new IntegerArgument("Maximum Length", Text("the maximum length of your search"));
            var maxLengthTag      = new Tag("-max", Text("Allows your to search with a maximum length"), new List <Argument> {
                maxLengthArgument
            });

            commandBuilder.WithOptionalArguments(prefixArgument);
            commandBuilder.WithTags(suffixTag, infixTag, lengthTag, minLengthTag, maxLengthTag);

            bool Filter(TItem item)
            {
                var matchCriteria = new StringMatching.MatchCriteria(
                    prefixArgument.IsFilled() ? prefixArgument.Content : null,
                    suffixArgument.IsFilled() ? suffixArgument.Content : null,
                    infixArgument.IsFilled() ? infixArgument.Content : null,
                    lengthArgument.IsFilled() ? lengthArgument.Content : -1,
                    minLengthArgument.IsFilled() ? minLengthArgument.Content : -1,
                    maxLengthArgument.IsFilled() ? maxLengthArgument.Content : -1,
                    true);

                return(matchCriteria.IsMatch(item.GetContentRaw()));
            }

            var completeFilters = filters.ToList();

            completeFilters.Add(Filter);
            return(WithListAction(commandBuilder, source, followup, completeFilters.ToArray()));
        }
 /// <summary>
 /// Gets the value for an <see cref="IntegerArgument"/>.
 /// </summary>
 /// <param name="argument">The argument.</param>
 /// <returns>The value.</returns>
 public override int? GetValue(IntegerArgument argument)
 {
     string value;
     if (GetCommandLineArgumentValueAsString(argument.Id, _subArgs, out value))
     {
         int retval;
         if (StaticUtils.TryParseValue(value, null, out retval))
         {
             return retval;
         }
         else
         {
             throw new InvalidOperationArgumentException(argument);
         }
     }
     return null;
 }
예제 #11
0
        /// <summary>
        /// Typeds the value from entity.
        /// </summary>
        /// <param name="argument">The argument.</param>
        /// <returns>List{TypedValue}.</returns>
        /// <exception cref="System.Exception">Unhandled expression result type</exception>
        public static List <TypedValue> TypedValueFromEntity(ActivityArgument argument)
        {
            List <TypedValue> typedValues = new List <TypedValue>();
            TypedValue        typedValue  = new TypedValue();

            if (argument == null)
            {
                typedValue.Type = DatabaseType.UnknownType;
                typedValues.Add(typedValue);
            }
            else if (argument.Is <StringArgument>())
            {
                typedValue.Type = DatabaseType.StringType;
                StringArgument stringArgument = argument.As <StringArgument>();
                if (stringArgument.StringParameterValue != null)
                {
                    typedValue.Value = stringArgument.StringParameterValue;
                }
                typedValues.Add(typedValue);
            }
            else if (argument.Is <IntegerArgument>())
            {
                typedValue.Type = DatabaseType.Int32Type;
                IntegerArgument integerArgument = argument.As <IntegerArgument>();
                if (integerArgument.IntParameterValue.HasValue)
                {
                    typedValue.Value = integerArgument.IntParameterValue.Value;
                }
                typedValues.Add(typedValue);
            }
            else if (argument.Is <CurrencyArgument>())
            {
                typedValue.Type = DatabaseType.CurrencyType;
                CurrencyArgument currencyArgument = argument.As <CurrencyArgument>();
                if (currencyArgument.DecimalParameterValue.HasValue)
                {
                    typedValue.Value = currencyArgument.DecimalParameterValue.Value;
                }
                typedValues.Add(typedValue);
            }
            else if (argument.Is <DecimalArgument>())
            {
                typedValue.Type = DatabaseType.DecimalType;
                DecimalArgument decimalArgument = argument.As <DecimalArgument>();
                if (decimalArgument.DecimalParameterValue.HasValue)
                {
                    typedValue.Value = decimalArgument.DecimalParameterValue.Value;
                }
                typedValues.Add(typedValue);
            }
            else if (argument.Is <DateArgument>())
            {
                typedValue.Type = DatabaseType.DateType;
                DateArgument dateArgument = argument.As <DateArgument>();
                if (dateArgument.DateParameterValue.HasValue)
                {
                    typedValue.Value = dateArgument.DateParameterValue.Value;
                }
                typedValues.Add(typedValue);
            }
            else if (argument.Is <TimeArgument>())
            {
                typedValue.Type = DatabaseType.TimeType;
                TimeArgument timeArgument = argument.As <TimeArgument>();
                if (timeArgument.TimeParameterValue.HasValue)
                {
                    typedValue.Value = timeArgument.TimeParameterValue.Value;
                }
                typedValues.Add(typedValue);
            }
            else if (argument.Is <DateTimeArgument>())
            {
                typedValue.Type = DatabaseType.DateTimeType;
                DateTimeArgument dateTimeArgument = argument.As <DateTimeArgument>();
                if (dateTimeArgument.DateTimeParameterValue.HasValue)
                {
                    typedValue.Value = dateTimeArgument.DateTimeParameterValue.Value;
                }
                typedValues.Add(typedValue);
            }
            else if (argument.Is <GuidArgument>())
            {
                typedValue.Type = DatabaseType.GuidType;
                GuidArgument guidArgument = argument.As <GuidArgument>();
                if (guidArgument.GuidParameterValue.HasValue)
                {
                    typedValue.Value = guidArgument.GuidParameterValue.Value;
                }
                typedValues.Add(typedValue);
            }
            else if (argument.Is <BoolArgument>())
            {
                typedValue.Type = DatabaseType.BoolType;
                BoolArgument boolArgument = argument.As <BoolArgument>();
                if (boolArgument.BoolParameterValue.HasValue)
                {
                    typedValue.Value = boolArgument.BoolParameterValue.Value;
                }
                typedValues.Add(typedValue);
            }
            else if (argument.Is <ResourceArgument>())
            {
                TypedArgument typedArgument = argument.As <TypedArgument>();
                if (typedArgument != null && typedArgument.ConformsToType != null)
                {
                    // Interrogate to get it's base type
                    EntityType type     = Entity.Get <EntityType>(typedArgument.ConformsToType.Id);
                    EntityRef  enumType = new EntityRef("core", "enumValue");
                    if (type.GetAncestorsAndSelf().FirstOrDefault(a => a.Id == enumType.Id) != null)
                    {
                        typedValue.Type = DatabaseType.ChoiceRelationshipType;
                    }
                    else
                    {
                        typedValue.Type = DatabaseType.InlineRelationshipType;
                    }
                }

                ResourceArgument resourceArgument = argument.As <ResourceArgument>();
                if (resourceArgument.ResourceParameterValue != null)
                {
                    // Is this an enum type (or are any of it's base types an enum type??
                    var conformsToType = resourceArgument.ConformsToType;
                    typedValue.SourceEntityTypeId = conformsToType != null ? conformsToType.Id : 0;
                    typedValue.Value = resourceArgument.ResourceParameterValue.Id;
                }
                typedValues.Add(typedValue);
            }
            else if (argument.Is <ResourceListArgument>())
            {
                TypedArgument typedArgument = argument.As <TypedArgument>();
                if (typedArgument != null && typedArgument.ConformsToType != null)
                {
                    // Interrogate to get it's base type
                    EntityType type     = Entity.Get <EntityType>(typedArgument.ConformsToType.Id);
                    EntityRef  enumType = new EntityRef("core", "enumValue");
                    if (type.GetAncestorsAndSelf().FirstOrDefault(a => a.Id == enumType.Id) != null)
                    {
                        typedValue.Type = DatabaseType.ChoiceRelationshipType;
                    }
                    else
                    {
                        typedValue.Type = DatabaseType.InlineRelationshipType;
                    }
                }
                ResourceListArgument resourceList = argument.As <ResourceListArgument>();
                if (resourceList.ResourceListParameterValues == null || resourceList.ResourceListParameterValues.Count <= 0)
                {
                    typedValues.Add(typedValue);
                }
                else
                {
                    typedValues.AddRange(resourceList.ResourceListParameterValues.Select(parameterValue => new TypedValue
                    {
                        Type = typedValue.Type, SourceEntityTypeId = resourceList.ConformsToType.Id, Value = parameterValue.Id
                    }));
                }
            }
            else
            {
                // Throw as we cannot convert type:(
                throw new Exception("Unhandled expression result type");
            }

            return(typedValues);
        }
예제 #12
0
        /// <summary>
        /// Method for creating typed values from DatabaseType.
        /// Caller must save.
        /// </summary>
        /// <param name="typedValue"></param>
        /// <param name="forceResourceLists"></param>
        /// <returns></returns>
        public static ActivityArgument CreateTypedValueEntity(TypedValue typedValue, bool forceResourceLists = false)
        {
            DatabaseType dbType = typedValue.Type;
            IEntity      result;

            if (dbType is UnknownType || dbType == null)
            {
                return(null);
            }
            if (dbType is StringType || dbType is XmlType)
            {
                result = new StringArgument {
                    StringParameterValue = (string)typedValue.Value
                };
            }
            else if (dbType is Int32Type) // includes autonumber
            {
                result = new IntegerArgument {
                    IntParameterValue = (int?)typedValue.Value
                };
            }
            else if (dbType is CurrencyType)
            {
                result = new CurrencyArgument {
                    DecimalParameterValue = (decimal?)typedValue.Value
                };
            }
            else if (dbType is DecimalType)
            {
                result = new DecimalArgument {
                    DecimalParameterValue = (decimal?)typedValue.Value
                };
            }
            else if (dbType is DateType)
            {
                result = new DateArgument {
                    DateParameterValue = (DateTime?)typedValue.Value
                };
            }
            else if (dbType is TimeType)
            {
                result = new TimeArgument {
                    TimeParameterValue = (DateTime?)typedValue.Value
                };
            }
            else if (dbType is DateTimeType)
            {
                result = new DateTimeArgument {
                    DateTimeParameterValue = (DateTime?)typedValue.Value
                };
            }
            else if (dbType is GuidType)
            {
                result = new GuidArgument {
                    GuidParameterValue = (Guid?)typedValue.Value
                };
            }
            else if (dbType is BoolType)
            {
                result = new BoolArgument {
                    BoolParameterValue = (bool?)typedValue.Value
                };
            }
            else if (dbType is ChoiceRelationshipType || dbType is InlineRelationshipType || dbType is IdentifierType)
            {
                // Hmm.. not sure if this is a good idea for identifier types..

                long targetId;
                if (typedValue.Value == null || !long.TryParse(typedValue.Value.ToString(), out targetId))
                {
                    targetId = 0;
                }

                IEntity target = targetId > 0 ? Entity.Get(targetId) : null;

                if (forceResourceLists)
                {
                    var resourceListArgument = new ResourceListArgument();
                    if (target != null)
                    {
                        resourceListArgument.ResourceListParameterValues.Add(target.As <Resource>());
                    }
                    result = resourceListArgument;
                }
                else
                {
                    var resourceArgument = new ResourceArgument();
                    if (target != null)
                    {
                        resourceArgument.ResourceParameterValue = target.As <Resource>();
                    }
                    result = resourceArgument;
                }

                TypedArgument tResult = result.As <TypedArgument>();
                if (typedValue.SourceEntityTypeId > 0)
                {
                    var targetType = Entity.Get <EntityType>(typedValue.SourceEntityTypeId);
                    tResult.ConformsToType = targetType;
                }
            }
            else
            {
                // IdentifierType
                // BinaryType
                // StructureLevelsType
                throw new Exception("Unhandled expression result type: " + dbType.GetType().Name);
            }

            // Caller must save
            return(result.As <ActivityArgument>());
        }
예제 #13
0
        /// <summary>
        /// Method for creating typed values from DatabaseType.
        /// Caller must save.
        /// </summary>
        /// <param name="dbType"></param>
        /// <param name="forceResourceLists"></param>
        /// <returns></returns>
        public static ActivityArgument CreateTypedValueEntity(DatabaseType dbType, bool forceResourceLists = false)
        {
            IEntity result;

            if (dbType is UnknownType || dbType == null)
            {
                return(null);
            }
            if (dbType is StringType || dbType is XmlType)
            {
                result = new StringArgument();
            }
            else if (dbType is Int32Type) // includes autonumber
            {
                result = new IntegerArgument();
            }
            else if (dbType is CurrencyType)
            {
                result = new CurrencyArgument();
            }
            else if (dbType is DecimalType)
            {
                result = new DecimalArgument();
            }
            else if (dbType is DateType)
            {
                result = new DateArgument();
            }
            else if (dbType is TimeType)
            {
                result = new TimeArgument();
            }
            else if (dbType is DateTimeType)
            {
                result = new DateTimeArgument();
            }
            else if (dbType is GuidType)
            {
                result = new GuidArgument();
            }
            else if (dbType is BoolType)
            {
                result = new BoolArgument();
            }
            else if (dbType is ChoiceRelationshipType || dbType is InlineRelationshipType || dbType is IdentifierType)
            {
                // Hmm.. not sure if this is a good idea for identifier types..
                if (forceResourceLists)
                {
                    result = new ResourceListArgument();
                }
                else
                {
                    result = new ResourceArgument();
                }
            }
            else
            {
                // IdentifierType
                // BinaryType
                // StructureLevelsType
                throw new Exception("Unhandled expression result type: " + dbType.GetType().Name);
            }

            // Caller must save
            return(result.As <ActivityArgument>());
        }
예제 #14
0
        public void SimpleCountingLoop( )
        {
            using (new WorkflowRunContext {
                RunTriggersInCurrentThread = true
            })
            {
                var wf = new Workflow()
                {
                    Name = "Simple Counting " + DateTime.Now
                };

                wf.AddDefaultExitPoint();

                var input = new ResourceListArgument
                {
                    Name = "in"
                };

                wf.InputArguments.Add(input.As <ActivityArgument>());

                var output = new IntegerArgument
                {
                    Name = "out"
                };

                wf.OutputArguments.Add(output.As <ActivityArgument>());

                var employeeType = Entity.Get <EntityType>(new EntityRef("test", "employee"));

                wf.AddVariable <IntegerArgument>("Count")
                .AddAssignToVar("Assign To Count", "0", "Count")
                .AddForEach("foreach1", "in", "test:employee")
                .AddAssignToVar("Assign To Count 2", "[Count] + 1", "Count", "foreach1", "Loop")
                .AddTransition("Assign To Count 2", "foreach1");

                ActivityTestHelper.AddAssignToVar(wf, "AssignOutput", "Count", "out");

                ActivityTestHelper.AddMissingExpressionParametersToWorkflow(wf);

                wf.Save();

                var createdCount = 15;
                var resources    = Enumerable.Range(0, createdCount).Select(v => new Person()
                {
                    Name = v.ToString()
                }).ToList();
                Entity.Save(resources);

                var wfInput = new Dictionary <string, object>
                {
                    {
                        "in", resources
                    }
                };

                var run = (RunWorkflow(wf, wfInput));

                IDictionary <string, object> outputs = run.GetOutput();

                Assert.AreEqual(1, outputs.Count, "There is one output argument");

                var result = (int)outputs["out"];

                Assert.AreEqual(createdCount, result, "The loop ran the correct number of times");
            }
        }
예제 #15
0
        public void LoopWithinLoop_bug_17651()
        {
            using (new WorkflowRunContext {
                RunTriggersInCurrentThread = true
            })
            {
                var wf = new Workflow()
                {
                    Name = "LoopWithinLoop_bug_17651"
                };
                wf.AddDefaultExitPoint();

                var count = new IntegerArgument()
                {
                    Name = "count"
                };
                ActivityTestHelper.AddVariableToWorkflow(wf, count.As <ActivityArgument>());
                wf.AddExpressionToWorkflowVariable("count", "0");

                var foreachX = new ForEachResource()
                {
                    Name = "ForEachX" + DateTime.Now
                };
                var foreachXAs = foreachX.As <WfActivity>();
                ActivityTestHelper.AddExpressionToActivityArgument(wf, foreachXAs, "List", "all([Workflow Event])");

                wf.FirstActivity = foreachXAs;
                wf.ContainedActivities.Add(foreachXAs);


                var foreachY = new ForEachResource()
                {
                    Name = "ForEachY" + DateTime.Now
                };
                var foreachYAs = foreachY.As <WfActivity>();
                ActivityTestHelper.AddExpressionToActivityArgument(wf, foreachYAs, "List", "all([Event Email Priority Enum])");

                wf.ContainedActivities.Add(foreachYAs);

                ActivityTestHelper.AddTransition(wf, foreachXAs, foreachYAs, "Loop");
                ActivityTestHelper.AddTermination(wf, foreachXAs, "Finished");

                var assign = new AssignToVariable()
                {
                    Name = "Assign"
                };
                var assignAs = assign.As <WfActivity>();
                assign.TargetVariable = count.As <ActivityArgument>();
                ActivityTestHelper.AddExpressionToActivityArgument(wf, assignAs, "Value", "count + 1");

                wf.ContainedActivities.Add(assignAs);

                ActivityTestHelper.AddTransition(wf, foreachYAs, assignAs, "Loop");
                ActivityTestHelper.AddTransition(wf, foreachYAs, foreachXAs, "Finished");

                ActivityTestHelper.AddTransition(wf, assignAs, foreachYAs);

                var output = new IntegerArgument()
                {
                    Name = "out"
                };
                var outputAs = output.As <ActivityArgument>();

                wf.OutputArguments.Add(outputAs);

                ActivityTestHelper.AddAssignToVar(wf, "Set Output", "count", "out");

                ActivityTestHelper.AddMissingExpressionParametersToWorkflow(wf);

                wf.Save();
                ToDelete.Add(wf.Id);

                var run     = (RunWorkflow(wf));
                var outputs = run.GetOutput();

                Assert.AreEqual(1, outputs.Count, "There is one output argument");

                var result = (int)outputs["out"];

                var triggeredOnCount = Entity.GetInstancesOfType <WorkflowEventEnum>(false).Count();
                var runStateCount    = Entity.GetInstancesOfType <EventEmailPriorityEnum>(false).Count();


                Assert.AreEqual(triggeredOnCount * runStateCount, result, "The nested loops ran the correct number of times.");
            }
        }
예제 #16
0
 public int GetIntArgument(string argumentName)
 {
     Validator.ValidateNotNull(argumentName);
     Validator.ValidateArgumentName(argumentName, this.namesArguments);
     return(IntegerArgument.GetValue(namesArguments[argumentName]));
 }
예제 #17
0
 /// <summary>
 /// Gets the value for an <see cref="IntegerArgument"/>.
 /// </summary>
 /// <param name="argument">The argument.</param>
 /// <returns>The value.</returns>
 /// <exception cref="InvalidOperationArgumentException">
 /// May be thrown if the value for the argument cannot be converted to the appropriate type.
 /// </exception>
 public abstract int? GetValue(IntegerArgument argument);
예제 #18
0
 public void WithNullArgument_ShouldThrowException()
 {
     Assert.Throws <ArgumentNullException>(() => IntegerArgument.GetValue(null));
 }
        private static void PopulateValueFromArgument(ActivityArgument argument, ReportAnalyserColumn reportColumn)
        {
            if (argument.Is <StringArgument>())
            {
                StringArgument stringArgument = argument.As <StringArgument>();
                reportColumn.Value = stringArgument.StringParameterValue;
            }
            else if (argument.Is <IntegerArgument>())
            {
                IntegerArgument integerArgument = argument.As <IntegerArgument>();
                if (integerArgument.IntParameterValue != null)
                {
                    reportColumn.Value = integerArgument.IntParameterValue.ToString();
                }
            }
            else if (argument.Is <CurrencyArgument>())
            {
                CurrencyArgument currencyArgument = argument.As <CurrencyArgument>();
                if (currencyArgument.DecimalParameterValue != null)
                {
                    reportColumn.Value = currencyArgument.DecimalParameterValue.ToString();
                }
            }
            else if (argument.Is <DecimalArgument>())
            {
                DecimalArgument decimalArgument = argument.As <DecimalArgument>();
                if (decimalArgument.DecimalParameterValue != null)
                {
                    reportColumn.Value = decimalArgument.DecimalParameterValue.ToString();
                }
            }
            else if (argument.Is <DateArgument>())
            {
                DateArgument dateArgument = argument.As <DateArgument>();

                if (dateArgument.DateParameterValue != null)
                {
                    //convert the date value to YYYY-MM-DD format
                    DateTime dateValue = (DateTime)dateArgument.DateParameterValue;
                    reportColumn.Value = dateValue.ToString("yyyy-MM-dd");
                }
            }
            else if (argument.Is <TimeArgument>())
            {
                TimeArgument timeArgument = argument.As <TimeArgument>();
                if (timeArgument.TimeParameterValue != null)
                {
                    //convert the time value to YYYY-MM-DDTHH:mm:ssZ format
                    DateTime timeValue = (DateTime)timeArgument.TimeParameterValue;
                    reportColumn.Value = timeValue.ToString("yyyy-MM-ddTHH:mm:ssZ");
                }
            }
            else if (argument.Is <DateTimeArgument>())
            {
                DateTimeArgument dateTimeArgument = argument.As <DateTimeArgument>();
                if (dateTimeArgument.DateTimeParameterValue != null)
                {
                    //convert the datetime value to YYYY-MM-DDTHH:mm:ssZ format
                    DateTime dateTimeValue = (DateTime)dateTimeArgument.DateTimeParameterValue;
                    reportColumn.Value = dateTimeValue.ToString("yyyy-MM-ddTHH:mm:ssZ");
                }
            }
            else if (argument.Is <GuidArgument>())
            {
                GuidArgument guidArgument = argument.As <GuidArgument>();
                if (guidArgument.GuidParameterValue != null)
                {
                    reportColumn.Value = guidArgument.GuidParameterValue.ToString();
                }
            }
            else if (argument.Is <BoolArgument>())
            {
                BoolArgument boolArgument = argument.As <BoolArgument>();
                if (boolArgument.BoolParameterValue != null)
                {
                    reportColumn.Value = boolArgument.BoolParameterValue.ToString();
                }
            }
            else if (argument.Is <TypedArgument>())
            {
                TypedArgument typedArgument = argument.As <TypedArgument>();
                EntityType    type          = Entity.Get <EntityType>(typedArgument.ConformsToType);
                if (type.IsOfType.FirstOrDefault(t => t.Alias == "core:enumType") != null)
                {
                    // A choice field
                    reportColumn.Type = new ChoiceRelationshipType();
                }
                else
                {
                    // Is a related resource
                    reportColumn.Type = new InlineRelationshipType();
                }
                ResourceListArgument rla = argument.As <ResourceListArgument>();
                if (rla.ResourceListParameterValues != null && rla.ResourceListParameterValues.Count > 0)
                {
                    Dictionary <long, string> values = new Dictionary <long, string>();
                    foreach (Resource resourceListParameterValue in rla.ResourceListParameterValues)
                    {
                        values[resourceListParameterValue.Id] = resourceListParameterValue.Name;
                    }
                    reportColumn.Values = values;
                }
            }
        }
예제 #20
0
        /// <summary>Given an arg inst and a value create and activityArgument ready for storage.</summary>
        /// <param name="activity">The <see cref="WfActivity"/> being run. This cannot be null.</param>
        /// <param name="arg">The argument for the activity. This cannot be null.</param>
        /// <param name="value">The value of the argument. Its type is determined by <paramref name="arg"/>. This may be null for certain argument types.</param>
        /// <returns>The converted value.</returns>
        /// <exception cref="ArgumentNullException">Neither <paramref name="activity"/> nor <paramref name="arg"/> can be null.</exception>
        /// <exception cref="ArgumentException"><paramref name="arg"/> must be of a supported type.</exception>
        public static ActivityArgument ConvertArgInstValue(WfActivity activity, ActivityArgument arg, object value)
        {
            if (activity == null)
            {
                throw new ArgumentNullException(nameof(activity));
            }
            if (arg == null)
            {
                throw new ArgumentNullException(nameof(arg));
            }

            ActivityArgument result;

            string name = $"{activity.Name ?? "[Unnamed]"}.{arg.Name ?? "[Unnamed]"}";

            if (arg.Is <ResourceListArgument>())
            {
                var list    = (IEnumerable <IEntity>)value;
                var created = new ResourceListArgument {
                    Name = name
                };
                if (list != null)
                {
                    var cleanList = list.Where(e => e != null).Select(e => e.As <Resource>());
                    created.ResourceListParameterValues.AddRange(cleanList);
                }
                result = created.As <ActivityArgument>();
            }
            else if (arg.Is <ResourceArgument>())
            {
                var res     = (IEntity)value;
                var created = new ResourceArgument {
                    Name = name, ResourceParameterValue = res?.As <Resource>()
                };
                result = created.As <ActivityArgument>();
            }
            else if (arg.Is <StringArgument>())
            {
                var created = new StringArgument {
                    Name = name, StringParameterValue = (string)value
                };
                result = created.As <ActivityArgument>();
            }
            else if (arg.Is <BoolArgument>())
            {
                var created = new BoolArgument {
                    Name = name, BoolParameterValue = (bool?)value ?? false
                };
                result = created.As <ActivityArgument>();
            }
            else if (arg.Is <IntegerArgument>())
            {
                var created = new IntegerArgument {
                    Name = name, IntParameterValue = (int?)value ?? 0
                };
                result = created.As <ActivityArgument>();
            }
            else if (arg.Is <DecimalArgument>())
            {
                var created = new DecimalArgument {
                    Name = name, DecimalParameterValue = (decimal?)value ?? 0
                };
                result = created.As <ActivityArgument>();
            }
            else if (arg.Is <CurrencyArgument>())
            {
                var created = new CurrencyArgument {
                    Name = name, DecimalParameterValue = (decimal?)value ?? 0
                };
                result = created.As <ActivityArgument>();
            }
            else if (arg.Is <DateTimeArgument>())
            {
                var created = new DateTimeArgument {
                    Name = name, DateTimeParameterValue = (DateTime?)value
                };
                result = created.As <ActivityArgument>();
            }
            else if (arg.Is <DateArgument>())
            {
                var created = new DateArgument {
                    Name = name, DateParameterValue = (DateTime?)value
                };
                result = created.As <ActivityArgument>();
            }
            else if (arg.Is <TimeArgument>())
            {
                // ensure that timeparametervalue only ever holds a datetime
                var dt = value is TimeSpan?TimeType.NewTime((TimeSpan)value) : (DateTime?)value;

                var created = new TimeArgument {
                    Name = name, TimeParameterValue = dt
                };
                result = created.As <ActivityArgument>();
            }
            else if (arg.Is <GuidArgument>())
            {
                var created = new GuidArgument {
                    Name = name, GuidParameterValue = (Guid?)value ?? Guid.Empty
                };
                result = created.As <ActivityArgument>();
            }
            else
            {
                throw new ArgumentException($"Unsupported ActivityArgument '{arg.IsOfType.First().Name}' in '{name}'", "arg");
            }

            return(result);
        }