示例#1
0
        /// <summary>
        /// Creates the process trigger.
        /// </summary>
        /// <param name="processName">Name of the process.</param>
        /// <param name="triggerDefinition">The trigger definition.</param>
        /// <returns>DataTrigger.</returns>
        private DataTrigger CreateProcessTrigger(string processName, DataTriggerDefinition triggerDefinition)
        {
            var trigger = ProcessTriggerFactory.CreateExport().Value;
            trigger.Initialize(processName, triggerDefinition);

            return trigger;
        }
示例#2
0
        public void InitializeTest()
        {
            // Arrange.
            const string ProcessName = "TestProcess";
            const string TriggerName = "Test Trigger";
            var triggerGuid = new Guid("{A05F4E80-E1C6-4115-8582-0A823081BB19}");
            const string ProcessToModify = "DestinationProcess";
            const string FilterDefinition = "Test Filter";
            const DataTriggerModificationType ModificationType = DataTriggerModificationType.Update;

            var fieldMapping1 = new DataTriggerFieldMapping("Field1", false, (s, d) => null);
            var fieldMapping2 = new DataTriggerFieldMapping("Field2", false, (s, d) => null);

            var listMapping1 = new DataTriggerListFieldMapping(
                Enumerable.Empty<FieldMappingDataSourceDefinition>(),
                "Field3",
                DataTriggerModificationType.Insert,
                Enumerable.Empty<DataTriggerFieldMapping>());

            var listMapping2 = new DataTriggerListFieldMapping(
                Enumerable.Empty<FieldMappingDataSourceDefinition>(),
                "Field4",
                DataTriggerModificationType.Insert,
                Enumerable.Empty<DataTriggerFieldMapping>());

            var triggerMap = new DataTriggerMap(new[] { fieldMapping1, fieldMapping2 }, new[] { listMapping1, listMapping2 });

            var triggerDefinition = new DataTriggerDefinition(TriggerName, triggerGuid, ProcessToModify, FilterDefinition, ModificationType, Enumerable.Empty<IActionRule>(), triggerMap);

            var fieldUpdater1 = Mock.Create<IFieldUpdater>();
            var fieldUpdater2 = Mock.Create<IFieldUpdater>();
            var fieldUpdaterFactory = Mock.Create<IFieldUpdaterFactory>();
            Mock.Arrange(() => fieldUpdaterFactory.CreateFieldUpdater(ProcessToModify, fieldMapping1)).Returns(fieldUpdater1);
            Mock.Arrange(() => fieldUpdaterFactory.CreateFieldUpdater(ProcessToModify, fieldMapping2)).Returns(fieldUpdater2);

            var listUpdater1 = Mock.Create<IListFieldUpdater>();
            var listUpdater2 = Mock.Create<IListFieldUpdater>();
            var listUpdaterFactory = Mock.Create<IListFieldUpdaterFactory>();
            Mock.Arrange(() => listUpdaterFactory.CreateFieldUpdater(ProcessToModify, listMapping1)).Returns(listUpdater1);
            Mock.Arrange(() => listUpdaterFactory.CreateFieldUpdater(ProcessToModify, listMapping2)).Returns(listUpdater2);

            var trigger = new DataTrigger { FieldUpdaterFactory = fieldUpdaterFactory, ListFieldUpdaterFactory = listUpdaterFactory };

            // Act.
            trigger.Initialize(ProcessName, triggerDefinition);

            // Assert.
            Assert.AreEqual(TriggerName, trigger.Name);
            Assert.AreEqual(triggerGuid, trigger.Guid);
            Assert.AreEqual(ModificationType, trigger.ModificationType);
            Assert.AreEqual(ProcessToModify, trigger.DestinationProcess);
            Assert.AreEqual(FilterDefinition, trigger.FilterDefinition);
            Assert.AreEqual(2, trigger.FieldUpdaters.Count);
            Assert.IsTrue(trigger.FieldUpdaters.Contains(fieldUpdater1));
            Assert.IsTrue(trigger.FieldUpdaters.Contains(fieldUpdater2));
            Assert.AreEqual(2, trigger.ListFieldUpdaters.Count);
            Assert.IsTrue(trigger.ListFieldUpdaters.Contains(listUpdater1));
            Assert.IsTrue(trigger.ListFieldUpdaters.Contains(listUpdater2));
        }
        public void CreateProcessTriggerTest()
        {
            const string TriggerName = "Test Trigger";
            var triggerGuid = Guid.Parse("{A7B2AF5F-5444-479D-A700-29123F8748A9}");
            const string DestinationProcess = "TestProcess";
            const string FilterDefinition = "Test Filter";
            const DataTriggerModificationType ModificationType = DataTriggerModificationType.Insert;
            var map = new DataTriggerMap(Enumerable.Empty<DataTriggerFieldMapping>(), Enumerable.Empty<DataTriggerListFieldMapping>());

            var trigger = new DataTriggerDefinition(TriggerName, triggerGuid, DestinationProcess, FilterDefinition, ModificationType, Enumerable.Empty<IActionRule>(), map);

            Assert.AreEqual(TriggerName, trigger.Name);
            Assert.AreEqual(triggerGuid, trigger.Guid);
            Assert.AreEqual(DestinationProcess, trigger.ProcessToModifySystemName);
            Assert.AreEqual(FilterDefinition, trigger.FilterDefinition);
            Assert.AreEqual(ModificationType, trigger.ModificationType);
            Assert.AreSame(map, trigger.Map);
            Assert.AreEqual(DataTriggerTypes.Process, trigger.TriggerType);
        }
示例#4
0
        /// <summary>
        /// Create data trigger.
        /// </summary>
        /// <param name="processName">The process name.</param>
        /// <param name="triggerDefinition">The trigger definition.</param>
        /// <returns>New instance of <see cref="IDataTrigger" />.</returns>
        /// <exception cref="System.ArgumentNullException">
        /// processName
        /// or
        /// triggerDefinition
        /// </exception>
        /// <exception cref="System.ArgumentException">Process name cannot be empty.;processName</exception>
        /// <exception cref="System.NotSupportedException"></exception>
        public IDataTrigger CreateDataTrigger(string processName, DataTriggerDefinition triggerDefinition)
        {
            if (processName == null)
                throw new ArgumentNullException("processName");

            if (string.IsNullOrWhiteSpace(processName))
                throw new ArgumentException("Process name cannot be empty.", "processName");

            if (triggerDefinition == null)
                throw new ArgumentNullException("triggerDefinition");

            switch (triggerDefinition.TriggerType)
            {
                case DataTriggerTypes.Process:
                    return CreateProcessTrigger(processName, triggerDefinition);

                case DataTriggerTypes.StoredProcedure:
                    return CreateStoredProcedureTrigger(triggerDefinition);

                default:
                    throw new NotSupportedException(
                        string.Format(CultureInfo.InvariantCulture, "Trigger type \"{0}\" is not supported.", triggerDefinition.TriggerType));
            }
        }
        public void CreateStoredProcedureTriggerTest()
        {
            // Arrange.
            const string TriggerName = "Test Trigger";
            var triggerGuid = new Guid("{DDFF0047-D3B9-43B7-A4EF-5E8D58044EF6}");
            const string StoredProcedureName = "TestProcedure";

            var rule1 = Mock.Create<IActionRule>(Behavior.Loose);
            var rule2 = Mock.Create<IActionRule>(Behavior.Loose);
            var parameter1 = Mock.Create<StoredProcedureParameterDefinition>();
            var parameter2 = Mock.Create<StoredProcedureParameterDefinition>();

            // Act.
            var triggerDefinition = new DataTriggerDefinition(TriggerName, triggerGuid, StoredProcedureName, new[] { rule1, rule2 }, new[] { parameter1, parameter2 });

            // Assert.
            Assert.AreEqual(TriggerName, triggerDefinition.Name);
            Assert.AreEqual(triggerGuid, triggerDefinition.Guid);
            Assert.AreEqual(StoredProcedureName, triggerDefinition.StoredProcedureName);
            Assert.AreEqual(2, triggerDefinition.StoredProcedureParameters.Count);
            Assert.IsTrue(triggerDefinition.StoredProcedureParameters.Contains(parameter1));
            Assert.IsTrue(triggerDefinition.StoredProcedureParameters.Contains(parameter2));
            Assert.AreEqual(DataTriggerTypes.StoredProcedure, triggerDefinition.TriggerType);
        }
示例#6
0
        /// <summary>
        /// Creates the stored procedure trigger.
        /// </summary>
        /// <param name="triggerDefinition">The trigger definition.</param>
        /// <returns>StoredProcedureTrigger.</returns>
        private StoredProcedureTrigger CreateStoredProcedureTrigger(DataTriggerDefinition triggerDefinition)
        {
            var trigger = StoredProcedureTriggerFactory.CreateExport().Value;

            trigger.Name = triggerDefinition.Name;
            trigger.Guid = triggerDefinition.Guid;
            trigger.ProcedureName = triggerDefinition.StoredProcedureName;
            trigger.ParameterDefinitions.AddRange(triggerDefinition.StoredProcedureParameters);

            return trigger;
        }
        /// <summary>
        /// Generates the stored procedure data trigger.
        /// </summary>
        /// <param name="assemblyCode">The assembly code.</param>
        /// <param name="process">The process.</param>
        /// <param name="trigger">The trigger.</param>
        private void GenerateStoredProcedureDataTrigger(StringBuilder assemblyCode, IProcessDefinition process, DataTriggerDefinition trigger)
        {
            assemblyCode.AppendFormat(@"
                storedProcedureParameters = new System.Collections.Generic.List<Cebos.Veyron.SharedTypes.DataTriggers.StoredProcedureParameterDefinition>();
");

            foreach (var parameter in trigger.StoredProcedureParameters)
            {
                var parameterValue = "null";
                if (!string.IsNullOrEmpty(parameter.Expression))
                {
                    parameterValue = string.Format(@"item => {{ return {0}; }}", ExpressionService.PrepareScriptFromXml(parameter.Expression));
                }

                assemblyCode.AppendFormat(@"
                storedProcedureParameters.Add(new Cebos.Veyron.SharedTypes.DataTriggers.StoredProcedureParameterDefinition({0}, Cebos.Veyron.SharedTypes.DbDataType.{1}, {2}));
", parameter.Name.ToLiteral(), parameter.DataType.ToString(), parameterValue);
            }

            assemblyCode.AppendLine(@"
                rules = new System.Collections.Generic.List<Cebos.Veyron.SharedTypes.IActionRule>();
");
            foreach (var rule in trigger.Rules.Where(r=>r.IsActive))
            {
                assemblyCode.AppendFormat(CultureInfo.InvariantCulture, @"
                rules.Add({0}Metadata.RuleManager.GetRule(new System.Guid(""{1}"")));", process.Name, rule.Guid);
            }

            assemblyCode.AppendFormat(@"
                dataTriggers.Add(new Cebos.Veyron.SharedTypes.DataTriggerDefinition(
                    {0},
                    System.Guid.Parse(""{1}""),
                    {2},
                    rules,
                    storedProcedureParameters));
", trigger.Name.ToLiteral(), trigger.Guid, trigger.StoredProcedureName.ToLiteral());
        }
        /// <summary>
        /// Generates the process data trigger.
        /// </summary>
        /// <param name="assemblyCode">
        /// The assembly code.
        /// </param>
        /// <param name="process">
        /// The process.
        /// </param>
        /// <param name="trigger">
        /// The trigger.
        /// </param>
        /// <param name="variableIndex">
        /// The variable index.
        /// </param>
        private void GenerateProcessDataTrigger(StringBuilder assemblyCode, IProcessDefinition process, DataTriggerDefinition trigger, ref int variableIndex)
        {

            assemblyCode.AppendLine(@"
                fields = new System.Collections.Generic.List<Cebos.Veyron.SharedTypes.DataTriggerFieldMapping>();
");

            if (!string.IsNullOrWhiteSpace(trigger.ModificationMapping))
            {
                var expressionScripts = ExpressionService.PrepareScriptForMultipleDestinations(trigger.ModificationMapping, new object());

                foreach (var fieldMapping in trigger.FieldMappings)
                {
                    var variableName = AddDataTriggerFieldMapping(assemblyCode, fieldMapping, expressionScripts, ref variableIndex);
                    assemblyCode.AppendFormat(@"
                fields.Add({0});", variableName);
                }
            }

            assemblyCode.AppendLine(@"
                listFields = new System.Collections.Generic.List<Cebos.Veyron.SharedTypes.DataTriggerListFieldMapping>();
");
            foreach (var fieldMapping in trigger.ListFieldMappings.Where(IsValid))
            {
                assemblyCode.AppendLine(@"
                subfields = new System.Collections.Generic.List<Cebos.Veyron.SharedTypes.DataTriggerFieldMapping>();");

                if (!string.IsNullOrEmpty(fieldMapping.ModificationMapping))
                {
                    var expressionScripts = ExpressionService.PrepareScriptForMultipleDestinations(fieldMapping.ModificationMapping, new object());

                    foreach (var childMapping in fieldMapping.FieldMappings)
                    {
                        var variableName = AddDataTriggerFieldMapping(assemblyCode, childMapping, expressionScripts, ref variableIndex);
                        assemblyCode.AppendFormat(@"
                subfields.Add({0});", variableName);
                    }
                }

                if (IsLinkOrUnlink(fieldMapping.ModificationType))
                {
                    var sourceDataProcessName = fieldMapping.SourceDataProcessName;
                    var sourceDataFilterDefinition = fieldMapping.SourceDataFilterDefinition;

                    if (!string.IsNullOrEmpty(sourceDataFilterDefinition) && sourceDataProcessName == process.Name)
                    {
                        sourceDataFilterDefinition = TranslateFilterDefinition(sourceDataFilterDefinition, process);
                    }

                    assemblyCode.AppendFormat(
                        @"
                listFields.Add(new Cebos.Veyron.SharedTypes.DataTriggerListFieldMapping({0}, {1}, {2}, Cebos.Veyron.SharedTypes.DataTriggerModificationType.{3}, subfields));",
                        sourceDataProcessName.ToLiteral(),
                        sourceDataFilterDefinition.ToLiteral(),
                        fieldMapping.DestinationFieldSystemName.ToLiteral(),
                        fieldMapping.ModificationType);
                }
                else
                {
                    assemblyCode.AppendLine(@"
                dataSources = new System.Collections.Generic.List<Cebos.Veyron.SharedTypes.DataTriggers.FieldMappingDataSourceDefinition>();");

                    foreach (var dataSource in fieldMapping.DataSources)
                    {
                        assemblyCode.AppendFormat(
                            @"
                dataSources.Add(new Cebos.Veyron.SharedTypes.DataTriggers.FieldMappingDataSourceDefinition({0}, {1}, {2}, {3}, {4}, {5}));",
                            dataSource.Name.ToLiteral(),
                            process.Name.ToLiteral(),
                            dataSource.PropertyPath.ToLiteral(),
                            dataSource.IncludeNewItems.ToLiteral(),
                            dataSource.IncludeOldItems.ToLiteral(),
                            dataSource.IncludeRemovedItems.ToLiteral());
                    }

                    assemblyCode.AppendFormat(
                        @"
                listFields.Add(new Cebos.Veyron.SharedTypes.DataTriggerListFieldMapping(dataSources, {0}, Cebos.Veyron.SharedTypes.DataTriggerModificationType.{1}, subfields));",
                        fieldMapping.DestinationFieldSystemName.ToLiteral(),
                        fieldMapping.ModificationType);
                }
            }

            assemblyCode.AppendLine(@"
                rules = new System.Collections.Generic.List<Cebos.Veyron.SharedTypes.IActionRule>();
");
            foreach (var rule in trigger.Rules.Where(r => r.IsActive))
            {
                assemblyCode.AppendFormat(CultureInfo.InvariantCulture, @"
                rules.Add({0}Metadata.RuleManager.GetRule(new System.Guid(""{1}"")));", process.Name, rule.Guid);
            }

            var filterDefinition = trigger.FilterDefinition;

            if (!string.IsNullOrEmpty(filterDefinition) && trigger.ProcessToModifySystemName == process.Name)
                filterDefinition = TranslateFilterDefinition(filterDefinition, process);

            assemblyCode.AppendFormat(
                @"
                dataTriggers.Add(new Cebos.Veyron.SharedTypes.DataTriggerDefinition(
                    {0},
                    System.Guid.Parse(""{1}""),
                    {2},
                    {3},
                    Cebos.Veyron.SharedTypes.DataTriggerModificationType.{4},
                    rules,
                    new Cebos.Veyron.SharedTypes.DataTriggerMap(fields, listFields)));
",
                trigger.Name.ToLiteral(),
                trigger.Guid,
                trigger.ProcessToModifySystemName.ToLiteral(),
                filterDefinition.ToLiteral(),
                trigger.ModificationType);
        }
        public void CanExecuteTest()
        {
            const string TriggerName = "Test Trigger";
            var triggerGuid = Guid.Parse("{A7B2AF5F-5444-479D-A700-29123F8748A9}");
            const string DestinationProcess = "TestProcess";
            const string FilterDefinition = "Test Filter";
            const DataTriggerModificationType ModificationType = DataTriggerModificationType.Insert;
            var map = new DataTriggerMap(Enumerable.Empty<DataTriggerFieldMapping>(), Enumerable.Empty<DataTriggerListFieldMapping>());

            var item = Mock.Create<IEditableRoot>();
            var oldItem = Mock.Create<IEditableRoot>();

            var trigger = new DataTriggerDefinition(TriggerName, triggerGuid, DestinationProcess, FilterDefinition, ModificationType, Enumerable.Empty<IActionRule>(), map);

            Assert.IsFalse(trigger.CanExecute(item, oldItem));

            var rule1 = Mock.Create<IActionRule>();
            Mock.Arrange(() => rule1.CanExecute(item, oldItem)).Returns(false);

            var rule2 = Mock.Create<IActionRule>();
            Mock.Arrange(() => rule2.CanExecute(item, oldItem)).Returns(true);

            trigger = new DataTriggerDefinition(TriggerName, triggerGuid, DestinationProcess, FilterDefinition, ModificationType, new[] { rule1 }, map);

            Assert.IsFalse(trigger.CanExecute(item, oldItem));

            trigger = new DataTriggerDefinition(TriggerName, triggerGuid, DestinationProcess, FilterDefinition, ModificationType, new[] { rule1, rule2 }, map);

            Assert.IsTrue(trigger.CanExecute(item, oldItem));
        }
        public void FactoryCreateExportShouldReturnNewDataTrigger()
        {
            var trigger = new DataTrigger();
            var factory = new DataTriggerFactory();
            var triggerDefinition = new DataTriggerDefinition(
                "test",
                Guid.Empty,
                "test",
                "test",
                DataTriggerModificationType.Insert,
                Enumerable.Empty<IActionRule>(),
                new DataTriggerMap(Enumerable.Empty<DataTriggerFieldMapping>(), Enumerable.Empty<DataTriggerListFieldMapping>()));

            factory.ProcessTriggerFactory = new ExportFactory<DataTrigger>(() => new Tuple<DataTrigger, Action>(trigger, () => { }));

            Assert.AreSame(trigger, factory.CreateDataTrigger("test", triggerDefinition));
        }
示例#11
0
        /// <summary>
        /// Initializes the data trigger.
        /// </summary>
        /// <param name="processName">The declaring process name.</param>
        /// <param name="triggerDefinition">The trigger definition.</param>
        /// <exception cref="ArgumentNullException">The processName parameter is null or empty.</exception>
        /// <exception cref="ArgumentNullException">The triggerDefinition parameter is null.</exception>
        public void Initialize(string processName, DataTriggerDefinition triggerDefinition)
        {
            if (string.IsNullOrEmpty(processName))
                throw new ArgumentNullException("processName");

            if (triggerDefinition == null)
                throw new ArgumentNullException("triggerDefinition");

            try
            {
                _stopwatch.Restart();

                Name = triggerDefinition.Name;
                Guid = triggerDefinition.Guid;
                ModificationType = triggerDefinition.ModificationType;
                DestinationProcess = triggerDefinition.ProcessToModifySystemName;
                FilterDefinition = triggerDefinition.FilterDefinition;

                var sampleFieldUpdaters = new List<IFieldUpdater>();

                FieldUpdaters.Clear();
                foreach (var fieldMapping in triggerDefinition.Map.Fields)
                {
                    var updater = FieldUpdaterFactory.CreateFieldUpdater(triggerDefinition.ProcessToModifySystemName, fieldMapping);

                    if (updater is SampleFieldUpdater)
                    {
                        // Sample field updaters should execute after SampleType, SampleSize and SamplingTechnique were updated, therefore we'll add them at the end.
                        sampleFieldUpdaters.Add(updater);
                    }
                    else
                    {
                        FieldUpdaters.Add(updater);
                    }
                }

                FieldUpdaters.AddRange(sampleFieldUpdaters);

                ListFieldUpdaters.Clear();
                foreach (var fieldMapping in triggerDefinition.Map.ListFields)
                    ListFieldUpdaters.Add(ListFieldUpdaterFactory.CreateFieldUpdater(triggerDefinition.ProcessToModifySystemName, fieldMapping));
            }
            finally
            {
                _stopwatch.Stop();
            }
        }