Пример #1
0
        public bool Pass(string message)
        {
            if (type == "not")
            {
                // Return the opposite of the internally evaluated  expression/filter

                if (singleExpression != null)
                {
                    return(!singleExpression.Pass(message));
                }
                else if (singleFilter != null)
                {
                    return(!singleFilter.Pass(message));
                }
            }
            else if (type == "and")
            {
                //If anyhting false, then return false;

                foreach (Expression exp in expressions)
                {
                    if (!exp.Pass(message))
                    {
                        return(false);
                    }
                }
                foreach (IQueueFilter filter in filters)
                {
                    if (!filter.Pass(message))
                    {
                        return(false);
                    }
                }
                return(true);
            }
            else if (type == "or")
            {
                // Or processing

                bool result = false;

                foreach (Expression exp in expressions)
                {
                    result = result || exp.Pass(message);
                    if (result)
                    {
                        return(result);
                    }
                }
                foreach (IQueueFilter filter in filters)
                {
                    result = result || filter.Pass(message);
                    if (result)
                    {
                        return(result);
                    }
                }

                return(result);
            }
            else if (type == "xor")
            {
                // Or processing

                int count = 0;

                foreach (Expression exp in expressions)
                {
                    count = exp.Pass(message) ? count + 1 : count;
                }
                foreach (IQueueFilter filter in filters)
                {
                    count = filter.Pass(message) ? count + 1 : count;
                }

                return(count == 1);
            }
            else if (type == "single")
            {
                return(singleFilter.Pass(message));
            }

            return(false);
        }
        public void PrepareFlights(List <FlightNode> flights, List <FlightNode> arrflights, List <FlightNode> depflights)
        {
            // Flights for AMS data driven lines are set in the superclass
            if (node.Name == "amsdatadriven" || flttype == FlightType.None || dataSourceType == "PULSAR")
            {
                return;
            }

            List <FlightNode> poolSource = new List <FlightNode>();

            switch (flttype)
            {
            case FlightType.Arrival:
                poolSource = arrflights;
                break;

            case FlightType.Departure:
                poolSource = depflights;
                break;

            case FlightType.Both:
                poolSource = flights;
                break;
            }

            //Filter according to STO requirements
            try {
                DateTime now      = DateTime.Now;
                DateTime earliest = now.AddMinutes(flightSetFrom);
                DateTime latest   = now.AddMinutes(flightSetTo);

                foreach (FlightNode fl in poolSource)
                {
                    if (earliest < fl.dateTime && fl.dateTime < latest)
                    {
                        //Apply any pre filtering

                        if (filterTime == "pre" && expression != null)
                        {
                            bool pass = expression.Pass(fl.FightXML);
                            if (!pass)
                            {
                                sourceLogger.Warn("Pre Filtering: Flight did not pass filter");
                                continue;
                            }
                        }
                        if (filterTime == "pre" && topLevelFilter != null)
                        {
                            bool pass = topLevelFilter.Pass(fl.FightXML);
                            if (!pass)
                            {
                                sourceLogger.Warn("Pre Filtering: Flight did not pass filter");
                                continue;
                            }
                        }

                        fltRecords.Add(fl);
                    }
                }
            } catch (Exception ex) {
                sourceLogger.Error(ex);
            }
        }
Пример #3
0
        public ExchangeMessage PreAndPostProcess(ExchangeMessage xm)
        {
            QXLog(xm?.uuid, "Output Node: Message Recieved From Pipe", null, "PROGRESS");


            // payload is the actual content of the message to be send
            string message = xm.payload;

            // After the delivery or prior to sending a message, it can be filtered or
            // transformed according to the configuration for each queue

            // The Expression object manages the evaluation of all the filters
            if (expression != null)
            {
                bool pass = expression.Pass(message);

                logger.Info($"Top Expression Evaluated {pass}");
                if (!pass)
                {
                    if (altQueue != null)
                    {
                        logger.Info($"Sending to Alt Queue {altQueue.name}");
                        QXLog(xm?.uuid, "Message did not pass filter", "Sending to Alt Queue", "PROGRESS");
                        Task.Run(async() => { _ = await altQueue.Send(xm); });
                    }
                    else
                    {
                        QXLog(xm?.uuid, "Message did not pass filter", "No Alt Queue Configured", "WARNING");
                    }
                    xm.pass = false;
                    return(xm);
                }
                else
                {
                    xm.pass = true;
                }
            }

            if (topLevelFilter != null)
            {
                bool pass = topLevelFilter.Pass(message);

                logger.Info($"Top Filter Evaluated {pass}");
                if (!pass)
                {
                    if (altQueue != null)
                    {
                        logger.Info($"Sending to Alt Queue {altQueue.name}");
                        QXLog(xm?.uuid, "Message did not pass filter", "Sending to Alt Queue", "PROGRESS");
                        _ = altQueue.Send(xm);
                    }
                    else
                    {
                        QXLog(xm?.uuid, "Message did not pass filter", "No Alt Queue Configured", "WARNING");
                    }
                    xm.pass = false;
                    return(xm);
                }
                else
                {
                    xm.pass = true;
                }
            }


            // If a XSLT transform has been specified
            if (bTransform)
            {
                QXLog(xm?.uuid, "Starting Message Transformation", null, "PROGRESS");
                message = Transform(message, xslVersion);
                QXLog(xm?.uuid, "Message Transformation Complete", null, "PROGRESS");

                xm.transformed = true;
            }
            else
            {
                xm.transformed = false;
            }

            if (message == null || message.Length == 0)
            {
                logger.Info("Message blocked by XSL Transform of Zero Length");
                xm.payload = null;
                xm.status  = "Message blocked by XSL Transform. Null or Zero Length";

                QXLog(xm?.uuid, "Messaage Transformation", "Transformation resulted in a message of zero length", "WARNING");

                return(xm);
            }

            xm.payload = message;
            QXLog(xm?.uuid, "Output Node: Post Processing Complete", null, "PROGRESS");
            return(xm);
        }