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); } }
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); }