private Filter Convert(Ctrl.FilterGroup group) { FilterGroup newGroup; if (group.Operatror == Ctrl.FilterGroupOperatorEnum.And) { newGroup = new AndFilterGroup(); } else { newGroup = new OrFilterGroup(); } foreach (var filter in group.Filters) { newGroup.FilterItems.Add(ConvertToProviderPluginFilter(filter)); } return(newGroup); }
/// <summary> /// Creates a default subscription filter for a send port. /// </summary> /// <param name="targetApplication">The application in the target.</param> /// <param name="sendPort">The send port containing the filter to replicate.</param> /// <returns>A subscription filter.</returns> private SubscriptionFilter CreateSubscriptionFilter(Application targetApplication, SendPort sendPort) { _logger.LogDebug(TraceMessages.CreatingSendPortSubscription, RuleName, sendPort.Name); // Create an overall OR filter group so that if any sub-group matches a condition var targetFilterGroup = new OrFilterGroup(); // Add default string defaultTargetFilterExpression; if (sendPort.IsStatic) { defaultTargetFilterExpression = $"{ModelConstants.BizTalkSpTransportId} = '{targetApplication.Name.FormatKey()}.{sendPort.Name.FormatKey()}.{sendPort.PrimaryTransport.TransportType.Name}'"; } else { // It's a dynamic port, so won't have a primary transport defaultTargetFilterExpression = $"{ModelConstants.BizTalkSpTransportId} = '{targetApplication.Name.FormatKey()}.{sendPort.Name.FormatKey()}'"; } targetFilterGroup.Groups.Add(new AndFilterGroup() { Filters = { new Filter() { FilterExpression = defaultTargetFilterExpression } } }); // Loop around the filter groups, converting each one to an AND filter group with a list of filter expressions foreach (var sendPortFilterGroup in sendPort.FilterExpression.Group) { var targetFilterSubGroup = new AndFilterGroup(); foreach (var statement in sendPortFilterGroup.Statement) { Filter filter = null; var expressionProperty = MapSubscriptionFilterProperty(statement.Property); switch (statement.Operator) { // Equals case 0: filter = new Filter() { FilterExpression = $"{expressionProperty} = '{statement.Value}'" }; break; // LessThan case 1: filter = new Filter() { FilterExpression = $"{expressionProperty} < '{statement.Value}'" }; break; // LessThanEqualTo case 2: filter = new Filter() { FilterExpression = $"{expressionProperty} <= '{statement.Value}'" }; break; // GreaterThan case 3: filter = new Filter() { FilterExpression = $"{expressionProperty} > '{statement.Value}'" }; break; // GreaterThanEqualTo case 4: filter = new Filter() { FilterExpression = $"{expressionProperty} >= '{statement.Value}'" }; break; // NotEqual case 5: filter = new Filter() { FilterExpression = $"{expressionProperty} != '{statement.Value}'" }; break; // Exists case 6: filter = new Filter() { FilterExpression = $"EXISTS ( {expressionProperty} )" }; break; default: _logger.LogError(ErrorMessages.SubscriptionFilterOperatorNotSupported, statement.Operator); Context.Errors.Add(new ErrorMessage(string.Format(CultureInfo.CurrentCulture, ErrorMessages.SubscriptionFilterOperatorNotSupported, statement.Operator))); continue; } targetFilterSubGroup.Filters.Add(filter); _logger.LogTrace(TraceMessages.CreatedSubscriptionFilterStatement, RuleName, filter.FilterExpression); } _logger.LogTrace(TraceMessages.CreatedSubscriptionFilterSubGroup, RuleName, targetFilterSubGroup.Operation, targetFilterSubGroup.Filters.Count); // Add to filter group targetFilterGroup.Groups.Add(targetFilterSubGroup); } _logger.LogTrace(TraceMessages.CreatedSubscriptionFilterGroupForSendPort, RuleName, targetFilterGroup.Operation, sendPort.Name); // Create filter and return var subscriptionFilter = new SubscriptionFilter(targetFilterGroup); return(subscriptionFilter); }