├── .gitattributes ├── .gitignore ├── README.md ├── build.sbt ├── config ├── examples │ ├── waypoints-order-all.conf │ └── waypoints-order-ltl.conf └── nextgen │ ├── rnav │ └── rnav-star-adherence-demo.conf │ ├── sfdps-archive-reader.conf │ └── sfdps-archive-writer.conf ├── data └── tracks.txt.gz ├── lib └── macoshelper.jar ├── license.pdf ├── mesa ├── mesa-core └── src │ ├── main │ └── scala │ │ └── gov │ │ └── nasa │ │ └── mesa │ │ ├── core │ │ ├── MesaActor.scala │ │ ├── MesaMainBase.scala │ │ ├── MesaMasterActor.scala │ │ └── Monitors.scala │ │ ├── dataAcquisition │ │ ├── InstantReplayActor.scala │ │ └── TimedReplayActor.scala │ │ ├── dataProcessing │ │ ├── MesaFilterActor.scala │ │ ├── MessageCounterActor.scala │ │ └── filters │ │ │ └── SubscriptionFilter.scala │ │ ├── examples │ │ ├── TraceGenerator.scala │ │ └── waypoints │ │ │ ├── TraceContractExample.scala │ │ │ └── WaypointTraceGenerator.scala │ │ ├── monitoring │ │ ├── actors │ │ │ └── MonitorActor.scala │ │ └── dispatchers │ │ │ ├── ConcurrentDispatcher.scala │ │ │ ├── DispatcherActor.scala │ │ │ ├── IndexingDispatcher.scala │ │ │ └── TerminateMonitorChildActor.scala │ │ └── reporting │ │ ├── DisplayActor.scala │ │ ├── MsgCounter.scala │ │ └── stats │ │ ├── ActorStatCollector.scala │ │ ├── GlobalStatsProfiler.scala │ │ ├── InstrumentedReceive.scala │ │ ├── ProfiledMonitorActor.scala │ │ ├── StatsCollectorMailboxImp.scala │ │ ├── StatsMessages.scala │ │ └── printers │ │ ├── ActorStatsPrinters.scala │ │ └── GlobalProfilerPrinters.scala │ └── test │ ├── resources │ └── application.conf │ └── scala │ └── gov │ └── nasa │ └── mesa │ └── core │ ├── ConcurrentDispatcherSpec.scala │ ├── StatCollectorMailboxSpec.scala │ └── StatCollectorMonitorActorSpec.scala ├── mesa-manual.pdf ├── mesa-nextgen └── src │ ├── main │ └── scala │ │ └── gov │ │ └── nasa │ │ └── mesa │ │ └── nextgen │ │ ├── core │ │ ├── Airport.scala │ │ ├── ArchiveHandlers.scala │ │ ├── ExtendedSfdpsTrack.scala │ │ ├── FlightPlan.scala │ │ ├── FlightState.scala │ │ ├── Geo.scala │ │ └── rnav │ │ │ ├── AirportRNavStars.scala │ │ │ ├── KSFORNavStars.scala │ │ │ └── RnavStar.scala │ │ ├── dataAcquisition │ │ └── FlightStateSbsReplayActor.scala │ │ ├── dataProcessing │ │ ├── Configurable_RNAV_STAR_TraceGenerator.scala │ │ ├── Dynamic_RNAV_STAR_TraceGenerator.scala │ │ ├── SfdpsCSCounterActor.scala │ │ ├── filters │ │ │ ├── FilteredFlightStateGenerator.scala │ │ │ ├── FlightStateAndTrackMapFilter.scala │ │ │ └── FlightTrackFilter.scala │ │ └── translators │ │ │ ├── AdsbTranslator.scala │ │ │ ├── ExtendedSfdpsTrackGenerator.scala │ │ │ ├── SfdpsParser.scala │ │ │ └── SfdpsTranslators.scala │ │ ├── verification │ │ ├── SelfTerminatingFlightMonitorActor.scala │ │ ├── dispatchers │ │ │ ├── FlightConcurrentDispatcher.scala │ │ │ ├── FlightIndexingDispatcher.scala │ │ │ └── FlightMonitorIndexing.scala │ │ └── monitors │ │ │ ├── daut │ │ │ ├── FlightHeading_Monitor.scala │ │ │ ├── FlightMsgOrder_Monitor.scala │ │ │ ├── FlightMsg_DautMonitor_Indx.scala │ │ │ └── SingleFlightMsgOrder_Monitor.scala │ │ │ ├── rnav │ │ │ └── RNAV_STAR_Adherence.scala │ │ │ └── tracecontract │ │ │ ├── FlightMsgOrder_Monitor.scala │ │ │ └── SingleFlightMsgOrder_Monitor.scala │ │ └── ww │ │ ├── MESAFlightStateViewerLayer.scala │ │ └── StarLayer.scala │ └── test │ ├── resources │ ├── fixm.xml │ └── tracks-spec.txt │ └── scala │ └── gov │ └── nasa │ └── mesa │ └── nextgen │ ├── AirportSpec.scala │ ├── ExtendedFlightStateFilterSpec.scala │ ├── FlightPlanSpec.scala │ ├── FlightStateArchiveReaderSpec.scala │ ├── RnavStarSpec.scala │ ├── SfdpsExtendedFlightStateParserSpec.scala │ └── monitors │ ├── RNAV_STAR_AdherenceSpec.scala │ ├── SfdpsOrderDautMonitorSpec.scala │ └── SfdpsOrderTCMonitorSpec.scala ├── papers ├── mesa-nasa-report-2020.pdf ├── mesa-rv-2020.pdf └── sttt-mesa-2023.pdf ├── project ├── Commands.scala ├── Dependencies.scala ├── build.properties └── plugins.sbt └── script └── mesa /.gitattributes: -------------------------------------------------------------------------------- 1 | *.gz filter=lfs diff=lfs merge=lfs -text 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | target/ 3 | .DS_Store 4 | conf.crypt 5 | archive/ 6 | adsb-exp/ 7 | results/ 8 | tmp/ 9 | conf 10 | .bsp/ 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## MESA: MEssage-based System Analysis 2 | 3 | MESA is a framework that provides runtime verification of distributed systems in a nonintrusive manner. It checks a trace of the system under test against properties of interest, expressed in state machines and linear temporal logic formulas, where the trace is a sequence of messages entailing information about the run of the system. MESA is written in Scala, and employs the actor programming model, as implemented in the Akka framework. Finally, using asynchronous communicating actors to capture properties, it allows for decentralized monitoring of the system. 4 | 5 | ### User Manual 6 | 7 | Further information about MESA and the installation guide can be found in the file [mesa-manual.pdf](mesa-manual.pdf). 8 | 9 | ### Contact 10 | 11 | For questions and further information on MESA, please contact [Nastaran 12 | Shafiei](https://ti.arc.nasa.gov/profile/nshafiei/) at . 13 | 14 | ### Publications 15 | - ***Concurrent Runtime Verification of Data Rich Events ([pdf](papers/sttt-mesa-2023.pdf))***. 16 | *Nastaran Shafiei, Klaus Havelund, and Peter Mehlitz*. 17 | International Journal on Software Tools for Technology Transfer (STTT), Springer-Verlag. 2023 - to appear. Journal version of RV 2020 paper. 18 | 19 | - ***[Actor-based Runtime Verification with MESA](https://link.springer.com/chapter/10.1007%2F978-3-030-60508-7_12) ([pdf](papers/mesa-rv-2020.pdf))***. 20 | *Nastaran Shafiei, Klaus Havelund, and Peter Mehlitz*. 21 | In: Jyotirmoy Deshmukh and Dejan Nickovic (eds) Runtime Verification. RV 2020. Lecture Notes in Computer Science, vol 12399. Springer, Cham. 22 | 23 | - ***[Empirical Study of Actor-based Runtime Verification](https://ntrs.nasa.gov/) ([pdf](papers/mesa-nasa-report-2020.pdf))***. 24 | *Nastaran Shafiei, Klaus Havelund, and Peter Mehlitz*. 25 | NASA Technical Report: NASA/TM-2020-5004331. June 2020. 26 | 27 | ### License 28 | 29 | This software is released under the [NASA Open Source Agreement Version 1.3](license.pdf). 30 | 31 | ### Notices: 32 | 33 | Copyright © 2020 United States Government as represented by the 34 | Administrator of the National Aeronautics and Space Administration. All 35 | Rights Reserved. 36 | 37 | ### Disclaimers 38 | 39 | No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY 40 | OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT 41 | LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM TO 42 | SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 43 | PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 44 | SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, IF 45 | PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES NOT, IN 46 | ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY PRIOR 47 | RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE PRODUCTS OR 48 | ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT SOFTWARE. FURTHER, 49 | GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND LIABILITIES REGARDING 50 | THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL SOFTWARE, AND DISTRIBUTES 51 | IT "AS IS." 52 | 53 | Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS AGAINST 54 | THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, AS WELL AS 55 | ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT SOFTWARE RESULTS IN 56 | ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES ARISING FROM SUCH USE, 57 | INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR RESULTING FROM, RECIPIENT'S 58 | USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL INDEMNIFY AND HOLD HARMLESS THE 59 | UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, AS WELL AS ANY 60 | PRIOR RECIPIENT, TO THE EXTENT PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY 61 | FOR ANY SUCH MATTER SHALL BE THE IMMEDIATE, UNILATERAL TERMINATION OF THIS 62 | AGREEMENT. 63 | 64 | 65 | -------------------------------------------------------------------------------- /build.sbt: -------------------------------------------------------------------------------- 1 | import sbt.Keys._ 2 | import Dependencies._ 3 | 4 | name := "mesa" 5 | 6 | Compile / doc / scalacOptions += "-no-java-comments" 7 | 8 | // factor out common settings across the sub-projects 9 | lazy val commonSettings = Seq( 10 | organization := "gov.nasa", 11 | version := "1.1", 12 | scalaVersion := "2.13.8", 13 | Compile / mainClass := Some("gov.nasa.mesa.core.MesaMain"), 14 | Compile / doc / scalacOptions += "-no-java-comments", 15 | // uncomment to get the full stack trace for failed tests 16 | //testOptions in Test += Tests.Argument(TestFrameworks.ScalaTest, "-oF"), 17 | libraryDependencies ++= 18 | Seq( 19 | typesafeConfig, 20 | akkaActor, 21 | akkaTestkit, 22 | scalaTest, 23 | flexmarkAll, 24 | scalaTestPlus, 25 | scalaCheck, 26 | jodaTime, 27 | raceCore, 28 | raceNetJms, 29 | raceAir, 30 | raceWw, 31 | raceWwAir, 32 | raceTestKit 33 | ), 34 | commands ++= Commands.stagingCmds 35 | ) 36 | 37 | lazy val subProjectSettings = commonSettings ++ Seq( 38 | unmanagedBase := (unmanagedBase in LocalRootProject).value 39 | ) 40 | 41 | lazy val dautProject = 42 | RootProject(uri(sys.props.getOrElse("daut_uri", daut))) 43 | lazy val tracecontractProject = 44 | RootProject(uri(sys.props.getOrElse("tracecontract_uri", tracecontract))) 45 | 46 | // root project aggregates the sub-projects 47 | lazy val root = Project("mesa", file(".")) 48 | .aggregate(mesaCore, mesaNextgen) 49 | .dependsOn(mesaCore, mesaNextgen) 50 | .enablePlugins(JavaAppPackaging) 51 | .settings(commonSettings) 52 | 53 | lazy val mesaCore = Project("mesa-core", file("mesa-core")) 54 | .dependsOn(dautProject, tracecontractProject) 55 | .settings(subProjectSettings) 56 | 57 | // mesa-nas provides runtime verification for national airspace system properties 58 | lazy val mesaNextgen = Project("mesa-nextgen", file("mesa-nextgen")) 59 | .dependsOn(mesaCore) 60 | .settings(subProjectSettings) 61 | -------------------------------------------------------------------------------- /config/examples/waypoints-order-all.conf: -------------------------------------------------------------------------------- 1 | # This configuration is provided to run TraceContract examples presented in the 2 | # file gov.nasa.mesa.examples.waypoints.TraceContractExample (mesa-core). 3 | 4 | name = "waypoints-order-all-example" 5 | 6 | show-exceptions = true 7 | loglevel = "warning" 8 | self-termination = true 9 | 10 | actors = [ 11 | { 12 | name = "WaypointsOrderMonitor_strong" 13 | class = "gov.nasa.mesa.examples.waypoints.WaypointTraceGenerator" 14 | trace = [408, 411, 417] 15 | monitor { 16 | class = "gov.nasa.mesa.examples.waypoints.WaypointsOrderMonitor_strong" 17 | waypoints = [408, 411, 417] 18 | tracecontract { 19 | print-error = "true" 20 | debug-option = "false" 21 | print-success = "true" 22 | } 23 | } 24 | }, 25 | 26 | { 27 | name = "WaypointsOrderMonitor_ltl" 28 | class = "gov.nasa.mesa.examples.waypoints.WaypointTraceGenerator" 29 | trace = [408, 408, 411, 411, 417] 30 | monitor { 31 | class = "gov.nasa.mesa.examples.waypoints.WaypointsOrderMonitor_ltl" 32 | waypoints = [408, 411, 417] 33 | tracecontract { 34 | print-error = "true" 35 | debug-option = "false" 36 | print-success = "true" 37 | } 38 | } 39 | }, 40 | 41 | { 42 | name = "WaypointsOrderMonitor_statelogic" 43 | class = "gov.nasa.mesa.examples.waypoints.WaypointTraceGenerator" 44 | trace = [408, 411, 417] 45 | monitor { 46 | class = "gov.nasa.mesa.examples.waypoints.WaypointsOrderMonitor_statelogic" 47 | waypoints = [408, 411, 417] 48 | tracecontract { 49 | print-error = "true" 50 | debug-option = "false" 51 | print-success = "true" 52 | } 53 | } 54 | }, 55 | 56 | { 57 | name = "WaypointsOrderMonitor_variable_1" 58 | class = "gov.nasa.mesa.examples.waypoints.WaypointTraceGenerator" 59 | trace = [408, 411, 417] 60 | monitor { 61 | class = "gov.nasa.mesa.examples.waypoints.WaypointsOrderMonitor_variable_1" 62 | waypoints = [408, 411, 417] 63 | tracecontract { 64 | print-error = "true" 65 | debug-option = "false" 66 | print-success = "true" 67 | } 68 | } 69 | }, 70 | 71 | { 72 | name = "WaypointsOrderMonitor_variable" 73 | class = "gov.nasa.mesa.examples.waypoints.WaypointTraceGenerator" 74 | trace = [408, 417, 417, 411, 417] 75 | monitor { 76 | class = "gov.nasa.mesa.examples.waypoints.WaypointsOrderMonitor_variable" 77 | waypoints = [408, 411, 417] 78 | tracecontract { 79 | print-error = "true" 80 | debug-option = "false" 81 | print-success = "true" 82 | } 83 | } 84 | }, 85 | 86 | { 87 | name = "WaypointsOrderMonitor_dup_1" 88 | class = "gov.nasa.mesa.examples.waypoints.WaypointTraceGenerator" 89 | trace = [408, 408, 411, 411, 411, 417] 90 | monitor { 91 | class = "gov.nasa.mesa.examples.waypoints.WaypointsOrderMonitor_dup_1" 92 | waypoints = [408, 411, 417] 93 | tracecontract { 94 | print-error = "true" 95 | debug-option = "false" 96 | print-success = "true" 97 | } 98 | } 99 | }, 100 | 101 | { 102 | name = "WaypointsOrderMonitor_dup_2" 103 | class = "gov.nasa.mesa.examples.waypoints.WaypointTraceGenerator" 104 | trace = [408, 417, 411] 105 | monitor { 106 | class = "gov.nasa.mesa.examples.waypoints.WaypointsOrderMonitor_dup_2" 107 | waypoints = [408, 411, 417] 108 | tracecontract { 109 | print-error = "true" 110 | debug-option = "false" 111 | print-success = "true" 112 | } 113 | } 114 | }, 115 | ] 116 | -------------------------------------------------------------------------------- /config/examples/waypoints-order-ltl.conf: -------------------------------------------------------------------------------- 1 | # This configuration is provided to run the TraceContract LTL example presented 2 | # in gov.nasa.mesa.examples.waypoints.WaypointsOrderMonitor_ltl (mesa-core). 3 | 4 | name = "waypoints-order-ltl-example" 5 | 6 | show-exceptions = true 7 | loglevel = "warning" 8 | self-termination = true 9 | 10 | actors = [ 11 | { 12 | name = "WaypointsMonitor_success" 13 | class = "gov.nasa.mesa.examples.waypoints.WaypointTraceGenerator" 14 | trace = [408, 411, 411, 411, 417] 15 | monitor { 16 | class = "gov.nasa.mesa.examples.waypoints.WaypointsOrderMonitor_ltl" 17 | waypoints = [408, 411, 417] 18 | tracecontract { 19 | print-error = "true" 20 | debug-option = "false" 21 | print-success = "true" 22 | } 23 | } 24 | }, 25 | 26 | { 27 | name = "WaypointsMonitor_failure" 28 | class = "gov.nasa.mesa.examples.waypoints.WaypointTraceGenerator" 29 | trace = [408, 408, 417, 411, 417] 30 | monitor { 31 | class = "gov.nasa.mesa.examples.waypoints.WaypointsOrderMonitor_ltl" 32 | waypoints = [408, 411, 417] 33 | tracecontract { 34 | print-error = "true" 35 | debug-option = "false" 36 | print-success = "true" 37 | } 38 | } 39 | }, 40 | ] 41 | -------------------------------------------------------------------------------- /config/nextgen/rnav/rnav-star-adherence-demo.conf: -------------------------------------------------------------------------------- 1 | # This is an actor-based system which performs runtime verification for the rnav 2 | # star adherence property for three arrival procedures at SFO (BDEGA2, DYAMD3 and 3 | # SERFR3). 4 | 5 | name = "rnav-star-adherence-demo" 6 | 7 | loglevel = "warning" 8 | self-termination = true 9 | show-exceptions = true 10 | 11 | actors = [ 12 | # replaying recorded data as ExtendedFlightState objects 13 | { 14 | name = "sfdps-replay" 15 | class = "gov.nasa.mesa.dataAcquisition.TimedReplayActor" 16 | write-to = "fstate" 17 | can-reset-clock = true 18 | reader = { 19 | class = "gov.nasa.mesa.nextgen.core.FlightStateArchiveReader" 20 | pathname = "data/tracks.txt.gz" 21 | buffer-size = 32768 22 | } 23 | }, 24 | 25 | # filtering flight messages based on the criteria specified in this actor 26 | { 27 | name = "filteredflightInfoGenerator" 28 | class = "gov.nasa.mesa.nextgen.dataProcessing.filters.FilteredFlightStateGenerator" 29 | read-from = "fstate" 30 | write-to = "ffstate" 31 | equipment-qualifier = ["L","G","Z","I"] 32 | arrival-point = ["KSFO"] 33 | }, 34 | 35 | # converting the ExtendedFlightState objects into WaypointVisit objects which are 36 | # understandable by the monitors 37 | { 38 | name = "waypointTraceGenerator" 39 | class = "gov.nasa.mesa.nextgen.dataProcessing.Dynamic_RNAV_STAR_TraceGenerator" 40 | read-from = "ffstate" 41 | write-to = "waypoint" 42 | deviation = 1.0 43 | }, 44 | 45 | # a monitor that checks for the RNAV STAR Adherence for the KSFO.BDEGA2 arrival procedure 46 | { 47 | name = "rnav-bdega2-monitor" 48 | class = "gov.nasa.mesa.monitoring.actors.MonitorActor" 49 | read-from = "waypoint" 50 | monitor { 51 | class = "gov.nasa.mesa.nextgen.verification.monitors.rnav.RNAV_STAR_Adherence" 52 | airport = "KSFO" 53 | star = "BDEGA2" 54 | daut { 55 | print-error = "false" 56 | debug-option = "false" 57 | } 58 | } 59 | }, 60 | 61 | # a monitor that checks for the RNAV STAR Adherence for the KSFO.DYAMD3 arrival procedure 62 | { 63 | name = "rnav-dyamd3-monitor" 64 | class = "gov.nasa.mesa.monitoring.actors.MonitorActor" 65 | read-from = "waypoint" 66 | monitor { 67 | class = "gov.nasa.mesa.nextgen.verification.monitors.rnav.RNAV_STAR_Adherence" 68 | airport = "KSFO" 69 | star = "DYAMD3" 70 | daut { 71 | print-error = "false" 72 | debug-option = "false" 73 | } 74 | } 75 | }, 76 | 77 | # a monitor that checks for the RNAV STAR Adherence for the KSFO.SERFR3 arrival procedure 78 | { 79 | name = "rnav-serfr3-monitor" 80 | class = "gov.nasa.mesa.monitoring.actors.MonitorActor" 81 | read-from = "waypoint" 82 | monitor { 83 | class = "gov.nasa.mesa.nextgen.verification.monitors.rnav.RNAV_STAR_Adherence" 84 | airport = "KSFO" 85 | star = "SERFR3" 86 | daut { 87 | print-error = "false" 88 | debug-option = "false" 89 | } 90 | } 91 | }, 92 | 93 | # a world wind actor which provides visualization for flights 94 | { 95 | name = "GeoViewer" 96 | class = ".ww.RaceViewerActor" 97 | 98 | run-control = true 99 | collapse-panels = ["sync"] 100 | layer-categories = ["data"] 101 | 102 | layers = [ 103 | { name = "livePos" 104 | class = "gov.nasa.mesa.nextgen.ww.MESAFlightStateViewerLayer" 105 | read-from = "ffstate" 106 | description = "SWIM sfdps flight positions" 107 | trackinfo-base = "/trackinfo" 108 | color = "red" 109 | }, 110 | { name = "KSFO.BDEGA2" 111 | airport = "KSFO" 112 | star = "BDEGA2" 113 | class = "gov.nasa.mesa.nextgen.ww.StarLayer" 114 | description = "Star waypoints" 115 | categories = ["data"] 116 | enable = true 117 | waypoint-color = "blue" 118 | goto-altitude = 1500000d 119 | }, 120 | { name = "KSFO.DYAMD3" 121 | airport = "KSFO" 122 | star = "DYAMD3" 123 | class = "gov.nasa.mesa.nextgen.ww.StarLayer" 124 | description = "Star Waypoints tracks" 125 | categories = ["data"] 126 | enable = true 127 | waypoint-color = "yellow" 128 | goto-altitude = 1500000d 129 | }, 130 | { name = "KSFO.SERFR3" 131 | airport = "KSFO" 132 | star = "SERFR3" 133 | class = "gov.nasa.mesa.nextgen.ww.StarLayer" 134 | description = "Star Waypoints tracks" 135 | categories = ["data"] 136 | enable = true 137 | waypoint-color = "green" 138 | goto-altitude = 1500000d 139 | } 140 | ] 141 | 142 | size = [1600, 1200] 143 | 144 | eye { 145 | lat = 37.618889 146 | lon = -122.375 147 | altitude-ft = 8000000d 148 | } 149 | 150 | cache-dir = ${user.home}"/.WorldWind" 151 | } 152 | ] 153 | 154 | include classpath("config/logging-race.conf") 155 | -------------------------------------------------------------------------------- /config/nextgen/sfdps-archive-reader.conf: -------------------------------------------------------------------------------- 1 | # An actor-based system that reads an archive including ExtendedSfdpsFlightTrack 2 | # fields as ExtendedFlightState objects, and display them. 3 | 4 | name = "sfdps-archive-reader" 5 | 6 | loglevel = "warning" 7 | self-termination = true 8 | show-exceptions = true 9 | 10 | actors = [ 11 | 12 | # replaying sfdps archived data 13 | { 14 | name = "sfdps-replay" 15 | class = "gov.nasa.mesa.dataAcquisition.InstantReplayActor" 16 | write-to = "fstate" 17 | reader = { 18 | class = "gov.nasa.mesa.nextgen.core.FlightStateArchiveReader" 19 | pathname = "data/tracks.txt.gz" 20 | buffer-size = 32768 21 | } 22 | }, 23 | 24 | # displaying ExtendedFlightState generated from archived messages 25 | { 26 | name = "probe" 27 | class = ".actor.ProbeActor" 28 | read-from = "fstate" 29 | } 30 | ] 31 | 32 | include classpath("config/logging-race.conf") 33 | -------------------------------------------------------------------------------- /config/nextgen/sfdps-archive-writer.conf: -------------------------------------------------------------------------------- 1 | # An actor-based system that reads raw SFDPS xml messages, archive them as 2 | # ExtendedSfdpsFlightTrack fields in a text file, and finally, displays 3 | # ExtendedSfdpsFlightTrack objects. 4 | 5 | name = "sfdps-archive-writer" 6 | 7 | loglevel = "warning" 8 | self-termination = true 9 | show-exceptions = true 10 | 11 | actors = [ 12 | 13 | # replaying recorded sfdps data 14 | { 15 | name = "sfdps-replay" 16 | class = "gov.nasa.mesa.dataAcquisition.InstantReplayActor" 17 | write-to = "sfdps" 18 | delay-millis = 1 # in milliseconds 19 | reader = { 20 | class = ".archive.TextArchiveReader" 21 | pathname = "path/to/sfdps/raw/messages" 22 | buffer-size = 32768 23 | } 24 | }, 25 | 26 | # generating ExtendedSfdpsFlightTrack objects from raw sfdps xml messages 27 | { 28 | name = "flight-track-gen" 29 | class = ".actor.TranslatorActor" 30 | read-from = "sfdps" 31 | write-to = "track" 32 | translator = { 33 | class = "gov.nasa.mesa.nextgen.dataProcessing.translators.ExtendedSfdpsTrackGenerator" 34 | } 35 | }, 36 | 37 | # archiving the sfdps track field into a text file 38 | { 39 | name = "fposArchiver" 40 | class = "gov.nasa.race.actor.ArchiveActor" 41 | read-from = "track" 42 | 43 | writer = { 44 | class = "gov.nasa.mesa.nextgen.core.ExtendedSfdpsTrackArchiveWriter" 45 | pathname = "path/to/archive" 46 | append = "false" 47 | manipulateData = "false" 48 | } 49 | }, 50 | 51 | # displaying ExtendedSfdpsFlightTrack generated from raw sfdps messages 52 | { 53 | name = "probe" 54 | class = ".actor.ProbeActor" 55 | read-from = "track" 56 | } 57 | ] 58 | 59 | include classpath("config/logging-race.conf") -------------------------------------------------------------------------------- /data/tracks.txt.gz: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:c7538049066747185ab5dbb37f27a81f411fe42baf6fe805bb23751d08a20eef 3 | size 106058366 4 | -------------------------------------------------------------------------------- /lib/macoshelper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NASA-SW-VnV/mesa/c06bf89de9427a376eb355f1be3ebc4a519add35/lib/macoshelper.jar -------------------------------------------------------------------------------- /license.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NASA-SW-VnV/mesa/c06bf89de9427a376eb355f1be3ebc4a519add35/license.pdf -------------------------------------------------------------------------------- /mesa: -------------------------------------------------------------------------------- 1 | ./script/mesa -------------------------------------------------------------------------------- /mesa-core/src/main/scala/gov/nasa/mesa/core/MesaMainBase.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.core 32 | 33 | import java.io.File 34 | 35 | import akka.actor.{Actor, ActorRef} 36 | import com.typesafe.config.Config 37 | import gov.nasa.mesa.reporting.stats.GlobalStatsProfiler 38 | import gov.nasa.race.core.RaceTerminateRequest 39 | import gov.nasa.race.core.RaceActorSystem 40 | import gov.nasa.race.main.ConsoleMainBase 41 | import gov.nasa.race.util.{ConsoleIO, ThreadUtils} 42 | 43 | import scala.collection.Seq 44 | 45 | /** This is a singleton object that provides an entry point to MESA execution. 46 | */ 47 | object MesaMain extends ConsoleMainBase { 48 | 49 | /** Overriding this so it instantiates MesaActorSystem for RaceActorSystem 50 | * instances. 51 | * 52 | * @param configFiles the actor system(s) configuration file(s) 53 | * @param logLevel the log level which specifies the level information about 54 | * the actor system execution printed on the console. It 55 | * can be set to "info", "warning", or "off" 56 | * @return a list of MESA actor system(s) corresponding to the list of 57 | * configuration file(s). 58 | */ 59 | override def instantiateRaceActorSystems(configFiles: Seq[File], 60 | logLevel: Option[String]) 61 | : Seq[RaceActorSystem] = { 62 | try { 63 | getUniverseConfigs(configFiles, logLevel).map(new MesaActorSystem(_)) 64 | } catch { 65 | case t: Throwable => 66 | ConsoleIO.printlnErr(t.getMessage) 67 | Seq.empty[MesaActorSystem] 68 | } 69 | } 70 | } 71 | 72 | /** An instance of this class represents an Akka actor system which is extended 73 | * by RACE. 74 | * 75 | * Inherited from RACE, The MESA actor system includes one master actor that 76 | * oversees all other actors in the system. 77 | * 78 | * @param config the actor system configuration 79 | */ 80 | class MesaActorSystem(override val config: Config) extends 81 | RaceActorSystem(config: Config) { 82 | 83 | // initializing Profiler which keeps tracks of number of messages, and 84 | // monitors. 85 | GlobalStatsProfiler.initialize(config, () => { 86 | master ! RaceTerminateRequest 87 | }) 88 | 89 | /** Returns the type for the master actor. 90 | * 91 | * @return an instance of Class presenting the type MesaMasterActor. 92 | */ 93 | override def getMasterClass: Class[_ <: Actor] = classOf[MesaMasterActor] 94 | 95 | /** Sends a request to terminate the entire actor system. Note that Unlike 96 | * RACE, in MESA, any actor can send termination request to the master actor. 97 | * 98 | * @param actorRef the reference of an actor that is sending the 99 | * termination request 100 | */ 101 | override def requestTermination(actorRef: ActorRef): Unit = { 102 | if (!isTerminating) // avoid recursive termination 103 | if (allowSelfTermination || 104 | (allowRemoteTermination && isRemoteActor(actorRef))) { 105 | // make sure we don't hang if this is called from a receive method 106 | ThreadUtils.execAsync(terminateActors) 107 | } 108 | } 109 | 110 | /** Terminates all the actors in the actor system. First, it tries graceful 111 | * shutdown, and if that fails, if enforces shutdown by terminating the 112 | * currently running JVM. 113 | * 114 | * @return always true indicating a successful shutdown, since it uses 115 | * forced shutdown. 116 | */ 117 | override def terminateActors: Boolean = { 118 | val status = super.terminateActors 119 | // force shutdown 120 | if (!status) System.exit(1) 121 | true 122 | } 123 | } 124 | -------------------------------------------------------------------------------- /mesa-core/src/main/scala/gov/nasa/mesa/core/Monitors.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.core 32 | 33 | import com.typesafe.config.Config 34 | import gov.nasa.race.config.ConfigUtils.ConfigWrapper 35 | import daut.DautOptions 36 | import gov.nasa.mesa.reporting.stats.GlobalStatsProfiler 37 | 38 | /** The root type for all MESA monitors which is used as a mixin by the classes 39 | * with property specification capabilities. 40 | */ 41 | trait MesaMonitor { 42 | def verifyEvent(event: Any): Unit 43 | } 44 | 45 | object MesaMonitor { 46 | val confPrefix = "monitor" 47 | } 48 | 49 | /** This class is used to integrate the TraceContract DSL into MESA. 50 | * 51 | * tracecontract.Monitor is the key class in TraceContract which provides the 52 | * capabilities for specifying properties. 53 | * 54 | * TraceContract: https://github.com/havelund/tracecontract 55 | * 56 | * @param config the configuration 57 | */ 58 | class TraceContractMonitor(val config: Config) extends 59 | tracecontract.Monitor[Any] with MesaMonitor { 60 | 61 | val tcPrefix = s"${MesaMonitor.confPrefix}.tracecontract" 62 | 63 | setPrint(config.getBooleanOrElse(s"$tcPrefix.print-error", true)) 64 | setDebug(config.getBooleanOrElse(s"$tcPrefix.debug-option", false)) 65 | setSuccess(config.getBooleanOrElse(s"$tcPrefix.print-success", false)) 66 | 67 | def verifyEvent(event: Any): Unit = { 68 | val before = getMonitorResult.numberOfErrors 69 | verify(event) 70 | val after = getMonitorResult.numberOfErrors 71 | if (after > before) GlobalStatsProfiler.incErrorCounter 72 | } 73 | } 74 | 75 | /** This class is used to integrate the Daut DSL into MESA. 76 | * 77 | * daut.Monitor is the key class in Daut which provides the capabilities for 78 | * specifying properties. 79 | * 80 | * Daut: https://github.com/havelund/daut 81 | * 82 | * @param config the configuration 83 | */ 84 | class DautMonitor(val config: Config) extends daut.Monitor[Any] 85 | with MesaMonitor { 86 | 87 | val dautPrefix = s"${MesaMonitor.confPrefix}.daut" 88 | 89 | DautOptions.DEBUG = config.getBooleanOrElse(s"$dautPrefix.debug-option", false) 90 | DautOptions.PRINT_ERROR_BANNER = config.getBooleanOrElse(s"$dautPrefix.print-error", true) 91 | 92 | def verifyEvent(event: Any): Unit = { 93 | val before = getErrorCount 94 | verify(event) 95 | val after = getErrorCount 96 | if (after > before) GlobalStatsProfiler.incErrorCounter 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /mesa-core/src/main/scala/gov/nasa/mesa/dataAcquisition/TimedReplayActor.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.dataAcquisition 32 | 33 | import akka.actor.ActorRef 34 | import com.typesafe.config.Config 35 | import gov.nasa.race.actor.ReplayActor 36 | import gov.nasa.race.uom.DateTime 37 | 38 | import akka.actor.ActorRef 39 | import com.typesafe.config.Config 40 | import gov.nasa.race.archive.{ArchiveEntry, ArchiveReader} 41 | import gov.nasa.race.common.Counter 42 | import gov.nasa.race.config.ConfigUtils._ 43 | import gov.nasa.race.core.{ClockAdjuster, ContinuousTimeRaceActor} 44 | import gov.nasa.race.uom.DateTime 45 | 46 | import scala.annotation.tailrec 47 | import scala.collection.mutable.ListBuffer 48 | import scala.concurrent.ExecutionContext.Implicits.global 49 | import scala.concurrent.duration._ 50 | import scala.language.postfixOps 51 | 52 | /** 53 | * This class extends gov.nasa.race.core.ReplayActor with functionality that 54 | * measures the time took to replay the data. 55 | * 56 | * ReplayActor is an actor that reads time-stamped ArchiveEntry objects from 57 | * an archive with a path specified in the given config (as 'reader 58 | * .pathname'), and writes them in a channel specified in the given config 59 | * (as 'write-to'). 60 | * 61 | * @param config the actor configuration 62 | */ 63 | class TimedReplayActor(override val config: Config) 64 | extends ReplayActor(config: Config) { 65 | 66 | /** Used to measure the elapsed time used to replay the archive. */ 67 | var start: DateTime = _ 68 | 69 | override def onStartRaceActor(originator: ActorRef): Boolean = { 70 | val result = super.onStartRaceActor(originator) 71 | start = DateTime.now 72 | result 73 | } 74 | 75 | /** It is supposed to be invoked when the end of archive is reached. It 76 | * closes the archive and prints the time took to replay the archive entries. 77 | */ 78 | override def reachedEndOfArchive: Unit = { 79 | var end = DateTime.now 80 | super.reachedEndOfArchive 81 | val period = DateTime.timeBetween(start,end).toHMSms 82 | println(s"ReplayActor elapsed time: $period") 83 | } 84 | } -------------------------------------------------------------------------------- /mesa-core/src/main/scala/gov/nasa/mesa/dataProcessing/MesaFilterActor.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.dataProcessing 32 | 33 | import com.typesafe.config.Config 34 | import gov.nasa.mesa.core.MesaActor 35 | import gov.nasa.race.actor.FilteringPublisher 36 | import gov.nasa.race.core.BusEvent 37 | 38 | /** This actor is a filter actor that using a specified filter object, can 39 | * filter out incoming messages. The filter object(s) are specified under 40 | * the key "filters" in the actor config file. 41 | * 42 | * An instance of gov.nasa.mesa.dataProcessing.filters.SubscriptionFilter is 43 | * an example of a filter object that one can use along with this actor to 44 | * filter out unsubscribed messages. 45 | * 46 | * @param config the actor configuration 47 | */ 48 | class MesaFilterActor(val config: Config) extends FilteringPublisher 49 | with MesaActor 50 | { 51 | 52 | /** It publishes filtered messages. It uses all the filters specified in the 53 | * configuration file using the key "filters". 54 | * 55 | * @return a partial function with the actor logic. 56 | */ 57 | override def handleMessage: Receive = { 58 | case BusEvent(_, msg, _) => 59 | publishFiltered(msg) 60 | } 61 | } 62 | 63 | 64 | -------------------------------------------------------------------------------- /mesa-core/src/main/scala/gov/nasa/mesa/dataProcessing/MessageCounterActor.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.dataProcessing 32 | 33 | import akka.actor.ActorRef 34 | import com.typesafe.config.Config 35 | import gov.nasa.mesa.core.MesaActor 36 | import gov.nasa.race.core.BusEvent 37 | 38 | /** This simply counts the messages received from the given channel. 39 | * 40 | * @param config the actor configuration 41 | */ 42 | class MessageCounterActor(val config: Config) extends MesaActor { 43 | 44 | var counter = 0 45 | 46 | /** Simply increases the value of 'counter' by one upon receiving each 47 | * message. 48 | * 49 | * @return a partial function with the actor logic. 50 | */ 51 | override def handleMessage: Receive = { 52 | case BusEvent(_, msg, _) => { 53 | counter = counter + 1 54 | } 55 | } 56 | 57 | /** Called when terminating this actor. 58 | * 59 | * @param originator the actor sending the termination request 60 | * @return true if the termination is successful, otherwise returns false. 61 | */ 62 | override def onTerminateRaceActor(originator: ActorRef) = { 63 | println(s"number messages: $counter") 64 | super.onTerminateRaceActor(originator) 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /mesa-core/src/main/scala/gov/nasa/mesa/dataProcessing/filters/SubscriptionFilter.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.dataProcessing.filters 32 | 33 | import com.typesafe.config.Config 34 | import gov.nasa.race.config.ConfigurableFilter 35 | 36 | import scala.jdk.CollectionConverters._ 37 | 38 | /** This class represents a filter that filters out messages based on their 39 | * types, fully qualified names, specified in the actor's configuration file. 40 | * 41 | * @param config the filter configuration 42 | */ 43 | class SubscriptionFilter(val config: Config) extends ConfigurableFilter { 44 | 45 | val subs: Seq[String] = config.getStringList("subscriptions").asScala.toList 46 | 47 | /** Checks if the type of the given message is among the types specified in 48 | * the configuration file using the key "subscriptions". 49 | * 50 | * @param msg a message 51 | * @return true if the message type is susbscribed in the configuration 52 | * file, otherwise returns true. 53 | */ 54 | override def pass(msg: Any): Boolean = { 55 | subs.foreach(s => { 56 | if (msg.getClass.getName.equals(s)) return true 57 | }) 58 | false 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /mesa-core/src/main/scala/gov/nasa/mesa/examples/TraceGenerator.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2023 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.examples 32 | 33 | import akka.actor.ActorRef 34 | import gov.nasa.mesa.core.MesaActor 35 | import gov.nasa.race.core.BusEvent 36 | 37 | /** This trait represents an actor that generates a trace and feeds the 38 | * trace to itself upon start. It is mainly introduced to allow for 39 | * running monitor examples as an actor-system. 40 | * 41 | * The method generateTrace is application specific and the class 42 | * that implement this trait needs to override generateTrace with 43 | * a trace of choice 44 | * 45 | * @tparam Event the type of objects from which the trace is composed 46 | * of. 47 | */ 48 | trait TraceGenerator[Event] extends MesaActor { 49 | 50 | override def onStartRaceActor(originator: ActorRef): Boolean = { 51 | super.onStartRaceActor(originator) && start 52 | } 53 | 54 | def start = { 55 | feedTrace(generateTrace) 56 | true 57 | } 58 | 59 | def feedTrace(trace: List[Event]): Unit = { 60 | trace.foreach { event => 61 | self ! BusEvent("incoming", event, self) 62 | } 63 | } 64 | 65 | def generateTrace: List[Event] 66 | } 67 | -------------------------------------------------------------------------------- /mesa-core/src/main/scala/gov/nasa/mesa/examples/waypoints/WaypointTraceGenerator.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2023 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.examples.waypoints 32 | 33 | import com.typesafe.config.Config 34 | import gov.nasa.mesa.examples.TraceGenerator 35 | import gov.nasa.mesa.monitoring.actors.MonitorActor 36 | 37 | import scala.collection.mutable.ListBuffer 38 | 39 | /** This class represents a monitor actor that generates a trace consisting 40 | * of Waypoint objects. The trace is generated from the sequence of points 41 | * specified in the actor config. It then sends the trace back to itself to 42 | * feed it to the underlying monitor object. 43 | * 44 | * @param config the actor configuration 45 | */ 46 | class WaypointTraceGenerator(config: Config) extends MonitorActor(config: Config) 47 | with TraceGenerator[Waypoint]{ 48 | 49 | override def generateTrace: List[Waypoint] = { 50 | val waypoints = config.getLongList("trace") 51 | val trace = ListBuffer[Waypoint]() 52 | 53 | waypoints.forEach{e => trace.addOne(Waypoint(e))} 54 | 55 | trace.toList 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /mesa-core/src/main/scala/gov/nasa/mesa/monitoring/actors/MonitorActor.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.monitoring.actors 32 | 33 | import com.typesafe.config.Config 34 | import gov.nasa.mesa.core.{MesaActor, MesaMonitor} 35 | import gov.nasa.race.core.BusEvent 36 | 37 | /** This is one of the key classes in MESA and it represents monitoring actors. 38 | * 39 | * It has a field of type MesaMonitor which is set to a monitor object during 40 | * the actor initialization. The concrete type for the underlying monitor 41 | * object is specified in the given config object. 42 | * 43 | * For each incoming message, this actor invokes the method verifyEvent on its 44 | * underlying monitor object to verify the event against the properties 45 | * captured by the monitor. 46 | * 47 | * @param config the actor configuration 48 | */ 49 | class MonitorActor(val config: Config) extends MesaActor { 50 | 51 | /** Stores the underlying monitor object. */ 52 | val monitor: MesaMonitor = createMonitor(config) 53 | 54 | /** Creates an instance of a monitor using a concrete type specified in the 55 | * given config object (by "monitor.class") 56 | * 57 | * @param config the configuration 58 | * @return a new instance of MesaMonitor. 59 | */ 60 | def createMonitor (config: Config): MesaMonitor = { 61 | val monitor = newInstance[MesaMonitor]( 62 | config.getString(s"${MesaMonitor.confPrefix}.class"), 63 | Array(classOf[Config]), Array(config)).get 64 | info(s"instantiated monitor $name") 65 | monitor 66 | } 67 | 68 | /** Invokes the verifyEvent on the underlying monitor object which checks 69 | * the property against the incoming trace. 70 | * 71 | * @return a partial function with the actor logic. 72 | */ 73 | override def handleMessage: Receive = { 74 | case BusEvent(_,msg,_) => 75 | monitor.verifyEvent(msg) 76 | publish(msg) 77 | } 78 | } -------------------------------------------------------------------------------- /mesa-core/src/main/scala/gov/nasa/mesa/monitoring/dispatchers/DispatcherActor.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.monitoring.dispatchers 32 | 33 | import gov.nasa.mesa.core.MesaActor 34 | 35 | /** This trait represents a root type for all dispatcher actors in MESA. 36 | */ 37 | trait DispatcherActor extends MesaActor -------------------------------------------------------------------------------- /mesa-core/src/main/scala/gov/nasa/mesa/monitoring/dispatchers/IndexingDispatcher.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.monitoring.dispatchers 32 | 33 | import akka.actor.ActorRef 34 | import com.typesafe.config.{Config, ConfigValueFactory} 35 | import gov.nasa.mesa.core.MesaMonitor 36 | import gov.nasa.mesa.reporting.stats.GlobalStatsProfiler 37 | 38 | import scala.collection.mutable 39 | 40 | /** Dispatchers in MESA are actors that are used to specify how the monitoring 41 | * step of the runtime verification is distributed. 42 | * 43 | * This trait implements a core functionality for a dispatcher referred to as 44 | * indexing dispatcher which is used to create monitor objects on-the-fly. It 45 | * supports indexing at the dispatcher level by storing monitor instances in a 46 | * hash map. It slices the trace up into sub-traces according to selected data 47 | * in the trace events, and feeds each resulting sub-trace to the associated 48 | * monitor object. 49 | * 50 | * The type for the monitors created by the dispatcher is specified in the 51 | * dispatcher actor's config using the key "monitor". 52 | * 53 | * To use this functionality, one needs to extend the trait with the 54 | * handleMessage method implementation which is a partial function that 55 | * specifies how the actor handles incoming messages. 56 | */ 57 | trait IndexingDispatcher extends DispatcherActor { 58 | 59 | /** A map from unique ids (slicing criteria) to monitor objects generated 60 | * on-the-fly. 61 | */ 62 | val monitors: mutable.Map[Any, MesaMonitor] = mutable.Map[Any, MesaMonitor]() 63 | 64 | /** Adds a monitor and its associated id to the map. 65 | * 66 | * @param id an id used as a slicing criteria 67 | * @param monitor a mesa monitor object 68 | */ 69 | def addMonitor(id: Any, monitor: MesaMonitor): Unit = { 70 | monitors += (id -> monitor) 71 | } 72 | 73 | /** Removes the entry with given key from the map 74 | * 75 | * @param id an id associated to a mesa monitor 76 | * @return a mesa monitor with the given id removed from the map. 77 | */ 78 | def removeMonitor(id: Any): MesaMonitor = { 79 | monitors.remove(id).get 80 | } 81 | 82 | /** Instantiates a new monitor by invoking 'instantiateMonitor' and adds it 83 | * to the map 84 | * 85 | * @param config the configuration 86 | * @param id an id associated to the monitor, used as a slicing criteria 87 | * as well 88 | * @return a new instance of a MesaMonitor 89 | */ 90 | def createMonitor(config: Config, id: Any): MesaMonitor = { 91 | val actorName = s"${config.getString("name")}-${ 92 | GlobalStatsProfiler 93 | .incMonitorCounter 94 | }" 95 | // A configuration based on the given config, but the "name" is set to 96 | // "actorName" 97 | val actorConf = config.withValue("name", 98 | ConfigValueFactory.fromAnyRef(actorName)) 99 | info(s"instantiating monitor object $actorName") 100 | val monitor = instantiateMonitor(actorConf) 101 | addMonitor(id, monitor) 102 | monitor 103 | } 104 | 105 | /** Instantiates a new monitor within the actor system 106 | * 107 | * @param config the configuration 108 | * @return a new instance of a MesaMonitor 109 | */ 110 | def instantiateMonitor(config: Config): MesaMonitor = { 111 | val monitor = newInstance[MesaMonitor](config.getString("monitor.class"), 112 | Array(classOf[Config]), Array(config)).get 113 | info(s"instantiated monitor $name") 114 | monitor 115 | } 116 | 117 | /** Called when terminating this dispatcher actor. 118 | * 119 | * @param originator the actor sending the termination request 120 | * @return true if the termination is successful, otherwise returns false. 121 | */ 122 | override def onTerminateRaceActor(originator: ActorRef): Boolean = { 123 | super.onTerminateRaceActor(originator) 124 | } 125 | } 126 | -------------------------------------------------------------------------------- /mesa-core/src/main/scala/gov/nasa/mesa/monitoring/dispatchers/TerminateMonitorChildActor.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.monitoring.dispatchers 32 | 33 | import akka.actor.ActorRef 34 | 35 | /** A message used by a child actor (monitor actor dispatched by the 36 | * dispatcher) to request self-termination from its parent (a dispatcher). 37 | * 38 | * @param originator the actor sending the termination request 39 | */ 40 | case class TerminateMonitorChildActor(originator: ActorRef) 41 | -------------------------------------------------------------------------------- /mesa-core/src/main/scala/gov/nasa/mesa/reporting/DisplayActor.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.reporting 32 | 33 | import com.typesafe.config.Config 34 | import gov.nasa.mesa.core.MesaActor 35 | import gov.nasa.race.core.BusEvent 36 | 37 | /** It simply displays the incoming message and its corresponding channel. 38 | * One could display the result of the runtime verification using this actor. 39 | * 40 | * @param config the actor configuration 41 | */ 42 | class DisplayActor(val config: Config) extends MesaActor { 43 | 44 | /** It simply displays the message by delegating to 'display'. 45 | * 46 | * @return a partial function with the actor logic. 47 | */ 48 | override def handleMessage: Receive = { 49 | case BusEvent(channel, msg, _) => display(channel, msg) 50 | } 51 | 52 | /** Prints the message and the channel from which the message received on 53 | * the console. 54 | * 55 | * @param channel the communication channel from which the message received 56 | * @param msg the message to be displayed 57 | */ 58 | def display(channel: String, msg: Any): Unit = { 59 | println(s"On channel: $channel --- $msg") 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /mesa-core/src/main/scala/gov/nasa/mesa/reporting/MsgCounter.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.reporting 32 | 33 | import com.typesafe.config.Config 34 | 35 | /** It counts the number of incoming messages and prints it on the console. 36 | * 37 | * @param config the actor configuration 38 | */ 39 | class MsgCounter(config: Config) extends DisplayActor(config: Config) { 40 | var n = 0 41 | val printFrequency = 100 42 | 43 | /** It prints the number of incoming messages. 44 | * 45 | * @param channel the communication channel from which the message received 46 | * @param msg the message to be displayed 47 | */ 48 | override def display(channel: String, msg: Any): Unit = { 49 | n = n + 1 50 | if (n % printFrequency == 0) println(s"number og msgs: $n") 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /mesa-core/src/main/scala/gov/nasa/mesa/reporting/stats/InstrumentedReceive.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.reporting.stats 32 | 33 | import java.util.concurrent.TimeUnit 34 | 35 | import gov.nasa.mesa.core.MesaActor 36 | import gov.nasa.race.core.RaceSystemMessage 37 | 38 | /** To measure service time, an instance of this class replaces the default 39 | * actor behavior, recieveLive, by an implementation that for each incoming 40 | * message, invokes delegtee (recieveLive) on the message, records the 41 | * time before and after the invocation, and publishes a data container with 42 | * the recorded times to this actor system bus accessed by stat-collector 43 | * (ActorStatCollector). 44 | * 45 | * @param delegatee a partial function that captures the specified behavior 46 | * of the actor 47 | * @param actor a mesa actor 48 | */ 49 | class InstrumentedReceive(val delegatee: PartialFunction[Any, Unit], 50 | val actor: MesaActor) 51 | extends PartialFunction[Any, Unit] { 52 | override def apply(msg: Any): Unit = { 53 | if (msg.isInstanceOf[RaceSystemMessage]) delegatee(msg) 54 | else { 55 | val start = TimeUnit.NANOSECONDS.toMillis(System.nanoTime) 56 | delegatee(msg) 57 | val end = TimeUnit.NANOSECONDS.toMillis(System.nanoTime) 58 | val stats = MsgProcessingStats(actor.self, start, end) 59 | actor.forwardStats(stats) 60 | } 61 | } 62 | 63 | def isDefinedAt(x: Any): Boolean = delegatee.isDefinedAt(x) 64 | } -------------------------------------------------------------------------------- /mesa-core/src/main/scala/gov/nasa/mesa/reporting/stats/ProfiledMonitorActor.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.reporting.stats 32 | 33 | import com.typesafe.config.Config 34 | import gov.nasa.mesa.monitoring.actors.MonitorActor 35 | import gov.nasa.race.core.BusEvent 36 | 37 | /** When using GlobalStatsProfiler, this can be used instead of MonitorActor. 38 | * 39 | * @param config the actor configuration 40 | */ 41 | class ProfiledMonitorActor(config: Config) extends MonitorActor(config) { 42 | 43 | override def handleMessage: Receive = { 44 | case BusEvent(_,msg,_) => { 45 | if(!GlobalStatsProfiler.processedAllMsgs) { 46 | monitor.verifyEvent(msg) 47 | publish(msg) 48 | } 49 | } 50 | } 51 | } -------------------------------------------------------------------------------- /mesa-core/src/main/scala/gov/nasa/mesa/reporting/stats/StatsMessages.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.reporting.stats 32 | 33 | import akka.actor.ActorRef 34 | import akka.dispatch.Envelope 35 | 36 | // Data containers used to store mailbox statistics 37 | 38 | /** This class represents a data container which is used from the time that a 39 | * message is enqueued into the queue until it is dequeued to be processed. It 40 | * stores actor mailbox information and the message. 41 | * 42 | * @param queueSize the number of messages in the queue 43 | * @param receiver the actor that owns the mailbox queue 44 | * @param entryTime the enqueue time of the message 45 | * @param envelope the message sent to the actor mailbox 46 | */ 47 | case class MsgEntryStats(queueSize: Int, 48 | receiver: ActorRef, 49 | entryTime: Long, 50 | envelope: Envelope) 51 | 52 | /** This class represents a data container which is generated by 53 | * StatsMailboxType and captures information about the actor mailbox queue, 54 | * such as the queue size, and message wait time in the queue. 55 | * 56 | * @param queueSize the number of messages in the queue 57 | * @param receiver the actor that owns the mailbox queue 58 | * @param sender the actor that sent the message 59 | * @param entryTime the enqueue time of the message 60 | * @param exitTime the dequeue time of the message 61 | */ 62 | case class MailboxStats(queueSize: Int, 63 | receiver: ActorRef, 64 | sender: ActorRef, 65 | entryTime: Long, 66 | exitTime: Long) 67 | 68 | // Data container used to store message processing statistics 69 | 70 | /** 71 | * This class represents a data container which is generated by the actor and 72 | * captures the service time used to process the message. 73 | * 74 | * @param self the actor 75 | * @param entryTime the dequeue time of the message 76 | * @param exitTime the time at which the actor completed the processing of 77 | * the message 78 | */ 79 | case class MsgProcessingStats(self: ActorRef, 80 | entryTime: Long, 81 | exitTime: Long) { 82 | override def toString: String = { 83 | s"${self.path.name} - entry:${entryTime} exit:${exitTime} " + 84 | s"elapsed:${entryTime - exitTime}" 85 | } 86 | } -------------------------------------------------------------------------------- /mesa-core/src/main/scala/gov/nasa/mesa/reporting/stats/printers/ActorStatsPrinters.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.reporting.stats.printers 32 | 33 | import java.io.PrintWriter 34 | 35 | import akka.actor.ActorRef 36 | import gov.nasa.mesa.reporting.stats.ActorStats 37 | 38 | import scala.collection.mutable.Map 39 | 40 | /** 41 | * This class represents a csv printer for writing individual actor statistics 42 | * in the comma-separated values (csv) format. 43 | * 44 | * @param pw a printer for formatted representations of objects to a 45 | * text-output stream 46 | */ 47 | class ActorStatsCSVPrinter(pw: PrintWriter) { 48 | /** Prints the header in the csv format for individual actor statistics. 49 | */ 50 | def printHeader = { 51 | pw.println("actor name," + 52 | "ave queue wait,var queue wait," + 53 | "ave queue size,var queue size," + 54 | "queued msg#," + 55 | "ave service time,var service time," + 56 | "processed msg#") 57 | } 58 | 59 | /** Prints actor statistics collected so far in the csv format. 60 | * 61 | * @param actorStats a map from actor references to objects storing their 62 | * corresponding statistics 63 | */ 64 | def printStats(actorStats: Map[ActorRef, ActorStats]) = { 65 | actorStats.values.foreach(e => pw.println( 66 | s"${e.actorName}," + 67 | s"${e.aveQueueWait},${e.varQueueWait}," + 68 | s"${e.aveQueueSize},${e.varQueueSize}," + 69 | s"${e.numMsgQueued}," + 70 | s"${e.aveServiceTime},${e.varServiceTime}," + 71 | s"${e.numMsgProcessed}")) 72 | } 73 | 74 | /** Closes the stream and its associated resources. 75 | */ 76 | def close = { 77 | pw.close 78 | } 79 | } 80 | 81 | /** This class represents a tabular printer for writing individual actor 82 | * statistics in a tabular format. 83 | * 84 | * @param pw a printer for formatted representations of objects to a 85 | * text-output stream 86 | */ 87 | class ActorStatsTabularPrinter(val pw: PrintWriter) { 88 | /** Prints the header in a tabular format for individual actor statistics. 89 | */ 90 | def printHeader = { 91 | pw.println(" actor name " + 92 | "ave queue wait var queue wait " + 93 | "ave queue size var queue size " + 94 | "queued msg# " + 95 | "ave service time var service time " + 96 | "processed msg#") 97 | pw.println("---------------------------- " + 98 | "-------------- -------------- " + 99 | "-------------- -------------- " + 100 | "------------- " + 101 | "---------------- ---------------- " + 102 | "--------------") 103 | } 104 | 105 | /** Prints actor statistics collected so far in a tabular format. 106 | * 107 | * @param actorStats a map from actor references to objects storing their 108 | * corresponding statistics 109 | */ 110 | def printStats(actorStats: Map[ActorRef, ActorStats]) = { 111 | actorStats.values.foreach(e => pw.println( 112 | f"${e.actorName}%-28s " + 113 | f"${e.aveQueueWait}%14.3f ${e.varQueueWait}%14.3f " + 114 | f"${e.aveQueueSize}%14.3f ${e.varQueueSize}%14.3f " + 115 | f"${e.numMsgQueued}%13d " + 116 | f"${e.aveServiceTime}%16.3f ${e.varServiceTime}%16.3f " + 117 | f"${e.numMsgProcessed}%14d")) 118 | } 119 | 120 | /** Closes the stream and its associated resources. 121 | */ 122 | def close = { 123 | pw.close 124 | } 125 | } -------------------------------------------------------------------------------- /mesa-core/src/main/scala/gov/nasa/mesa/reporting/stats/printers/GlobalProfilerPrinters.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.reporting.stats.printers 32 | 33 | import java.io.PrintWriter 34 | 35 | import gov.nasa.mesa.reporting.stats.GlobalStatsProfiler._ 36 | import gov.nasa.race.uom.DateTime 37 | 38 | /** 39 | * This class represents a csv printer for the global profiler. It is used 40 | * to write the statistics collected by the profiler in the comma-separated 41 | * values (csv) format. 42 | * 43 | * @param pw a printer for formatted representations of objects to a 44 | * text-output stream 45 | */ 46 | class GlobalProfilerCSVPrinter(var pw: PrintWriter) { 47 | /** Prints the header in the csv format for statistics captured by the global 48 | * profiler. 49 | */ 50 | def printHeader: Unit = { 51 | pw.println("dispatched monitor#,monitored msg#,error#,dispatched msg#," + 52 | "elapsed time") 53 | } 54 | 55 | /** Prints statistics captured by the global profiler in the csv format. 56 | */ 57 | def printStats: Unit = { 58 | pw.println(s"${dispatchedMonitorCount.get}," + 59 | s"${monitoredMsgCount.get}," + 60 | s"${errorCount.get}," + 61 | s"${dispatchedMsgCount.get}," + 62 | s"${DateTime.timeBetween(start, end).toMillis}") 63 | } 64 | 65 | /** Closes the stream and its associated resources. 66 | */ 67 | def close: Unit = { 68 | pw.close 69 | } 70 | } 71 | 72 | /** 73 | * This class represents a tabular printer for the global profiler. It is used 74 | * to write the statistics collected by the profiler in a tabular format. 75 | * 76 | * @param pw a printer for formatted representations of objects to a 77 | * text-output stream 78 | */ 79 | class GlobalProfilerTabularPrinter(var pw: PrintWriter) { 80 | 81 | /** Prints the header in a tabular format for statistics captured by the 82 | * global profiler. 83 | */ 84 | def printHeader: Unit = { 85 | pw.print(s"\n${Console.YELLOW}") 86 | pw.println(" dispatched monitor# monitored msg# error# " + 87 | "dispatched msg# elapsed time ") 88 | pw.println(" ------------------- -------------- ---------- " + 89 | "--------------- --------------") 90 | pw.println(s"${Console.RESET}") 91 | } 92 | 93 | /** Prints statistics captured by the global profiler in a tabular format. 94 | */ 95 | def printStats: Unit = { 96 | pw.println(f"${dispatchedMonitorCount.get}%21d " + 97 | f"${monitoredMsgCount.get}%14d " + 98 | f"${errorCount.get}%10d " + 99 | f"${dispatchedMsgCount.get}%15d " + 100 | f"${DateTime.timeBetween(start, end).toHMSms}") 101 | } 102 | 103 | /** Closes the stream and its associated resources. 104 | */ 105 | def close: Unit = { 106 | pw.close 107 | } 108 | } 109 | -------------------------------------------------------------------------------- /mesa-core/src/test/resources/application.conf: -------------------------------------------------------------------------------- 1 | stats-collector-mailbox { 2 | mailbox-type = "gov.nasa.mesa.reporting.stats.StatsMailboxType" 3 | } 4 | -------------------------------------------------------------------------------- /mesa-core/src/test/scala/gov/nasa/mesa/core/StatCollectorMailboxSpec.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.core 32 | 33 | import akka.actor.{Actor, ActorSystem, Props} 34 | import akka.testkit.{TestKit, TestProbe} 35 | import gov.nasa.mesa.reporting.stats.MailboxStats 36 | import org.scalatest.matchers.must.Matchers 37 | import org.scalatest.wordspec.AnyWordSpecLike 38 | 39 | /** 40 | * A test suite for gov.nasa.mesa.reporting.stats.StatsMailboxType 41 | */ 42 | class StatsCollectorMailboxSpec extends TestKit(ActorSystem("test-system")) 43 | with AnyWordSpecLike with Matchers { 44 | 45 | "StatsCollectorMailbox" must { 46 | "collect stats from messages placed in the actor's mailbox" in { 47 | 48 | val statProbe = TestProbe() 49 | system.eventStream.subscribe(statProbe.ref, classOf[MailboxStats]) 50 | 51 | val actor = system.actorOf( 52 | Props[MailboxTestActor]withMailbox "stats-collector-mailbox") 53 | 54 | statProbe.send(actor, "msg-1") 55 | statProbe.send(actor, "msg-2") 56 | statProbe.send(actor, "msg-3") 57 | 58 | val stat = statProbe.expectMsgType[MailboxStats] 59 | stat.queueSize must be(1) 60 | 61 | 62 | val stat2 = statProbe.expectMsgType[MailboxStats] 63 | stat2.queueSize must (be(1) or be(2)) 64 | 65 | val stat3 = statProbe.expectMsgType[MailboxStats] 66 | stat3.queueSize must (be(2) or be(3)) 67 | } 68 | } 69 | } 70 | 71 | class MailboxTestActor extends Actor { 72 | override def receive: Receive = { 73 | case _ => Thread.sleep(1000) 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /mesa-core/src/test/scala/gov/nasa/mesa/core/StatCollectorMonitorActorSpec.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.core 32 | 33 | import akka.event.Logging 34 | import com.typesafe.config.Config 35 | import gov.nasa.mesa.core.MesaActor 36 | import gov.nasa.mesa.reporting.stats.MsgProcessingStats 37 | import gov.nasa.race.test.RaceActorSpec 38 | import gov.nasa.race.uom.DateTime 39 | import org.scalatest.wordspec.AnyWordSpecLike 40 | 41 | /** 42 | * A test suite for gov.nasa.mesa.reporting.stats.InstrumentedReceive 43 | */ 44 | class StatsCollectorMonitorActorSpec extends RaceActorSpec 45 | with AnyWordSpecLike { 46 | 47 | val conf: Config = createConfig( 48 | """ 49 | |name = "service-stats-actor" 50 | |class = "gov.nasa.mesa.core.TestServiceStatsActor" 51 | |stats { 52 | | service = true 53 | |} 54 | """.stripMargin) 55 | 56 | "StatsCollectorActorReceive" must { 57 | "measure the service time for each message processed by the actor" in { 58 | runRaceActorSystem(Logging.WarningLevel) { 59 | val actor = addTestActor[TestServiceStatsActor]("service-stats-actor", 60 | conf) 61 | val actorRef = actor.self 62 | 63 | val statCollector = addTestActor[MesaTestProbe]("stat-collector", 64 | createConfig("")) 65 | val statCollectorRef = statCollector.self 66 | system.eventStream.subscribe(statCollectorRef, 67 | classOf[MsgProcessingStats]) 68 | 69 | printTestActors 70 | initializeTestActors 71 | startTestActors(DateTime.now) 72 | 73 | // sending the TestServiceStatsActor a message 74 | actorRef ! TestMessage 75 | 76 | terminateTestActors 77 | } 78 | } 79 | } 80 | } 81 | 82 | class MesaTestProbe(val config: Config) extends MesaActor { 83 | override def handleMessage: Receive = { 84 | case MsgProcessingStats(_, entry, exit) => { 85 | assert(exit - entry >= 800) 86 | println(s"TestProbe received - elapsed time: ${exit - entry}") 87 | } 88 | } 89 | } 90 | 91 | case class TestMessage() 92 | 93 | class TestServiceStatsActor(val config: Config) extends MesaActor { 94 | override def handleMessage: Receive = { 95 | case TestMessage => Thread.sleep(800) 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /mesa-manual.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NASA-SW-VnV/mesa/c06bf89de9427a376eb355f1be3ebc4a519add35/mesa-manual.pdf -------------------------------------------------------------------------------- /mesa-nextgen/src/main/scala/gov/nasa/mesa/nextgen/core/Geo.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.nextgen.core 32 | 33 | import gov.nasa.race.geo.{Datum, GeoPosition} 34 | import gov.nasa.race.uom.Area.√ 35 | import gov.nasa.race.uom.Length.Meters 36 | import gov.nasa.race.uom.{Angle, Length} 37 | 38 | import scala.collection.mutable.ListBuffer 39 | 40 | /** Supports geospatial computation. 41 | */ 42 | object Geo { 43 | 44 | /** Returns a list of the waypoints within the given lateral proximity. 45 | * 46 | * @param state an event that captures the state of the flight 47 | * @param proximity a lateral proximity around the flight position 48 | * @param waypoints a list of waypoints 49 | * @return a list of waypoints from the given list which are within the 50 | * given proximity from the flight position. 51 | */ 52 | def getWaypointsInProximity(state: FlightState, proximity: Length, 53 | waypoints: Seq[Waypoint]): ListBuffer[Waypoint] = { 54 | 55 | var proximitylist = new ListBuffer[Waypoint]() 56 | 57 | for (w <- waypoints) 58 | if (isInProximity(state, w, proximity)) proximitylist += w 59 | 60 | proximitylist 61 | } 62 | 63 | /** Returns the closest waypoint, from the given list of waypoints, which in 64 | * the proximity of the given position. 65 | * 66 | * @param state an event that captures the state of the flight 67 | * @param proximity a lateral proximity around the flight position 68 | * @param waypoints a list of waypoints 69 | * @return Some[Waypoint] capturing a waypoint, from the given list of 70 | * waypoints and within the given lateral proximity of the flight, 71 | * which is closest to the flight position, or None if there is no 72 | * waypoint within the given proximity. 73 | */ 74 | def getWaypointInProximity(state: ExtendedFlightState, proximity: Length, 75 | waypoints: Seq[Waypoint]): Option[Waypoint] = { 76 | 77 | var minDev = Meters(Integer.MAX_VALUE) 78 | var minDevWaypoint: Option[Waypoint] = None 79 | 80 | for (w <- waypoints) { 81 | val distance = getEuclideanDistance(GeoPosition(state.position.φ, state.position.λ, 82 | Meters(0)), GeoPosition(w.position.φ, w.position.λ, Meters(0))) 83 | 84 | if (distance <= proximity && distance < minDev) { 85 | minDevWaypoint = Some(w) 86 | } 87 | } 88 | 89 | minDevWaypoint 90 | } 91 | 92 | /** Checks if the given waypoint is in the given lateral proximity of the 93 | * specified flight position. 94 | * 95 | * @param state an event that captures the state of the flight 96 | * @param wp a waypoint 97 | * @param proximity a lateral proximity around the flight position 98 | * @return true if the given waypoint is within the given lateral proximity 99 | * of the flight position, otherwise, returns false. 100 | */ 101 | def isInProximity(state: FlightState, wp: Waypoint, proximity: Length) 102 | : Boolean = { 103 | val alt1 = Meters(0) 104 | val alt2 = Meters(0) 105 | getEuclideanDistance(GeoPosition(state.position.φ, state.position.λ, alt1), 106 | GeoPosition(wp.position.φ, wp.position.λ, alt2)) <= proximity 107 | } 108 | 109 | /** Returns the Euclidean distance between the two given geographic 110 | * coordinates. 111 | */ 112 | def getEuclideanDistance(pos1: GeoPosition, pos2: GeoPosition): Length = { 113 | val p1 = Datum.wgs84ToECEF(pos1) 114 | val p2 = Datum.wgs84ToECEF(pos2) 115 | √((p1.x - p2.x).`²` + (p1.y - p2.y).`²` + (p1.z - p2.z).`²`) 116 | } 117 | } -------------------------------------------------------------------------------- /mesa-nextgen/src/main/scala/gov/nasa/mesa/nextgen/core/rnav/AirportRNavStars.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.nextgen.core.rnav 32 | 33 | import gov.nasa.mesa.nextgen.core.Waypoint 34 | 35 | /** The root for the types that encapsulates the set of RNAV STARs that belong 36 | * to the corresponding airport. 37 | */ 38 | abstract class AirportRNavStars { 39 | 40 | /** The list of all waypoints for the airport. */ 41 | val waypointList: Seq[Waypoint] 42 | 43 | /** The list of all RNAV STAR objects belong to the airport. */ 44 | val rnavStarList: Seq[RnavStar] 45 | 46 | /** A list including the names of all RNAV STARs for the airport. */ 47 | val rnavStarNames: Seq[String] 48 | 49 | /** Given the name of a RNAV STAR, it returns the corresponding RNAV STAR, 50 | * if any. 51 | * 52 | * @param name a RNAV STAR names 53 | * @return Some[RnavStar] including the RNAV STAR with the given name, or 54 | * None if there no RNAV STAR with the specified name. 55 | */ 56 | def getRnavStar(name: String): Option[RnavStar] = 57 | rnavStarList.find(p => p.name.equalsIgnoreCase(name)) 58 | 59 | /** Checks if the RNAV STAR with a given name is defined for the airport. 60 | * 61 | * @param name a RNAV STAR names 62 | * @return true if the RNAV STAR with the given name is defined. 63 | */ 64 | def isRnavStar(name: String): Boolean = rnavStarNames.contains(name) 65 | } -------------------------------------------------------------------------------- /mesa-nextgen/src/main/scala/gov/nasa/mesa/nextgen/dataAcquisition/FlightStateSbsReplayActor.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.nextgen.dataAcquisition 32 | 33 | import com.typesafe.config.Config 34 | import gov.nasa.mesa.nextgen.core.FlightState 35 | import gov.nasa.race.actor.Replayer 36 | import gov.nasa.race.air.SbsUpdater 37 | import gov.nasa.race.air.actor.{SBSReader, SbsImporter} 38 | import gov.nasa.race.common.ConfigurableStreamCreator.{configuredPathName, createInputStream} 39 | import gov.nasa.race.config.ConfigUtils._ 40 | import gov.nasa.race.core.PeriodicRaceActor 41 | import gov.nasa.race.track.{TrackDropped, TrackedObject} 42 | import gov.nasa.race.uom.Time._ 43 | import gov.nasa.race.uom.{DateTime, Time} 44 | import scala.concurrent.duration._ 45 | 46 | import java.io.InputStream 47 | import java.time.ZoneId 48 | import scala.concurrent.duration.Duration 49 | 50 | /** Similar to SbsReplayActor in RACE, this class is a ReplayActor for SBS 51 | * text archives. The only difference is it uses FlightStateSbsReader 52 | * instead of SBSReader to replay the data as FlightState objects instead of 53 | * FlightPos. 54 | * 55 | * @param config the actor configuration 56 | */ 57 | class FlightStateSbsReplayActor(val config: Config) 58 | extends Replayer with PeriodicRaceActor 59 | with SbsImporter { 60 | type R = FlightStateSbsReader 61 | 62 | class DropCheckSBSReader (conf: Config) 63 | extends FlightStateSbsReader(config) { 64 | override def dropTrack (id: String, cs: String, date: DateTime, 65 | inactive: Time): Unit = { 66 | publish(TrackDropped(id,cs,date,Some(stationId))) 67 | info(s"dropping $id ($cs) at $date after $inactive") 68 | } 69 | } 70 | 71 | override def createReader = new DropCheckSBSReader(config) 72 | 73 | val dropAfter = Milliseconds(config.getFiniteDurationOrElse("drop-after", 74 | Duration.Zero).toMillis.toInt) 75 | override def startScheduler = if (dropAfter.nonZero) super.startScheduler 76 | override def defaultTickInterval = 30.seconds // wall clock time 77 | override def onRaceTick(): Unit = reader.dropStale(updatedSimTime,dropAfter) 78 | } 79 | 80 | /** This class is an archive reader (gov.nasa.race.archive.ArchiveReader) for 81 | * SBS text archives. 82 | */ 83 | class FlightStateSbsReader(iStream: InputStream, pathName: String="", 84 | bufLen: Int, defaultZone: ZoneId) 85 | extends SBSReader(iStream, pathName, bufLen, defaultZone) { 86 | 87 | def this(conf: Config) = this(createInputStream(conf), 88 | configuredPathName(conf), 89 | conf.getIntOrElse("buffer-size",4096), 90 | conf.getMappedStringOrElse("default-zone", ZoneId.of, ZoneId.systemDefault) 91 | ) 92 | 93 | override val updater: SbsUpdater = new SbsUpdater( Some(this), defaultZone) 94 | 95 | // class FstateSbsArchiveUpdater extends SbsUpdater(updateTrack,dropTrack, 96 | // Some(this), defaultZone) { 97 | // override protected def acquireMoreData: Boolean = refillBuf 98 | // } 99 | 100 | // override def updateTrack (track: TrackedObject): Boolean = { 101 | // val fstate = new FlightState(track.id, track.cs, track.position, 102 | // track.speed, track.heading, track.vr, track.date, track.status) 103 | // next = someEntry(fstate.date, fstate) 104 | // false 105 | // } 106 | } -------------------------------------------------------------------------------- /mesa-nextgen/src/main/scala/gov/nasa/mesa/nextgen/dataProcessing/Configurable_RNAV_STAR_TraceGenerator.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.nextgen.dataProcessing 32 | 33 | import com.typesafe.config.Config 34 | import gov.nasa.mesa.core.MesaActor 35 | import gov.nasa.mesa.nextgen.core._ 36 | import gov.nasa.race.config.ConfigUtils._ 37 | import gov.nasa.race.core.BusEvent 38 | import gov.nasa.race.uom.Length 39 | import gov.nasa.race.uom.Length.NauticalMiles 40 | 41 | /** This class represents a MESA actor that generates traces composed of a 42 | * sequence of waypoints which belong to the STARs specified in the given 43 | * config (using the key "star") and are "visited" by the flight with a lateral 44 | * deviation specified in the given config (using the key "deviation"). 45 | * 46 | * @param config the actor configuration 47 | */ 48 | class Configurable_RNAV_STAR_TraceGenerator(val config: Config) 49 | extends MesaActor { 50 | 51 | // Airport airportId 52 | val airportId: String = config.getString("airport") 53 | 54 | // List of RNAV STARs 55 | val stars: Seq[String] = config.getStringListOrElse("star", Seq.empty[String]) 56 | 57 | // Lateral deviation specified in config 58 | val dev: Length = NauticalMiles(config.getDoubleOrElse("deviation", 1.0)) 59 | 60 | // A list of waypoints that belong to 'stars' 61 | var waypointList: Seq[Waypoint] = getWaypointList 62 | 63 | /** Receives BusEvent objects including FlightState events, and if the 64 | * flight position is within the given radius from one of the specified 65 | * waypoints, it publishes a pair of (FlightState, Waypoint) to the 66 | * specified channel. 67 | * 68 | * @return a partial function with the Configurable_RNAV_STAR_TraceGenerator 69 | * actor logic. 70 | */ 71 | override def handleMessage: Receive = { 72 | case BusEvent(_, state: ExtendedFlightState, _) => 73 | val proximityWaypoint = Geo.getWaypointInProximity(state, dev, 74 | waypointList) 75 | if (proximityWaypoint.isDefined) publish((state, proximityWaypoint.get)) 76 | } 77 | 78 | /** Returns a list of all waypoints that belong to the RNAR STARs specified in 79 | * the given config. 80 | * 81 | * @return a list of all waypoints that belong to the RNAR STARs specified in 82 | * the config. 83 | */ 84 | def getWaypointList: Seq[Waypoint] = { 85 | var wpList = Seq[Waypoint]() 86 | if (stars.isEmpty) 87 | wpList = Airport.getAirport(airportId).get.stars.waypointList 88 | else stars.foreach( 89 | starName => { 90 | val star = Airport.getRnavStar(airportId, starName) 91 | if (star.isDefined) wpList ++= star.get.waypoints 92 | else sys.error(s"The STAR $starName for the airport $airportId is not" + 93 | s" supported.") 94 | }) 95 | wpList 96 | } 97 | } -------------------------------------------------------------------------------- /mesa-nextgen/src/main/scala/gov/nasa/mesa/nextgen/dataProcessing/Dynamic_RNAV_STAR_TraceGenerator.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.nextgen.dataProcessing 32 | 33 | import com.typesafe.config.Config 34 | import gov.nasa.mesa.core.MesaActor 35 | import gov.nasa.mesa.nextgen.core._ 36 | import gov.nasa.race.config.ConfigUtils._ 37 | import gov.nasa.race.core.BusEvent 38 | import gov.nasa.race.uom.Length 39 | import gov.nasa.race.uom.Length.NauticalMiles 40 | 41 | /** 42 | * This class represents a MESA actor that generates traces composed of a 43 | * sequence of waypoints which belong to the STAR assigned to the flight and 44 | * are "visited" by the flight with a lateral deviation specified in the given 45 | * config (using the key "deviation"). The traces also include StarChange 46 | * and FlightCompleted events. Note that the STAR assigned to the flight is 47 | * obtained on-the-fly from the flight plan captured by ExtendedFlightState 48 | * instances. 49 | */ 50 | class Dynamic_RNAV_STAR_TraceGenerator(val config: Config) extends MesaActor { 51 | 52 | /** Lateral deviation specified in config. */ 53 | val dev: Length = NauticalMiles(config.getDoubleOrElse("deviation", 1.0)) 54 | 55 | /** Receives BusEvent objects representing the messages ExtendedFlightState, 56 | * StarChanged, FlightCompleted. 57 | * 58 | * For ExtendedFlightState objects, if the flight position is within the 59 | * given radius from one of the STAR's waypoints, it publishes the event 60 | * WaypointVisit to the specified channel. For StarChanged and 61 | * FlightCompleted, it just publishes the message event on the channel. 62 | * 63 | * @return a partial function with the Dynamic_RNAV_STAR_TraceGenerator 64 | * actor logic. 65 | */ 66 | override def handleMessage: Receive = { 67 | case BusEvent(_, state: ExtendedFlightState, _) => 68 | // if the star is not rnav, the message is ignored 69 | if (state.position.isDefined && Airport.isRnavStar(state.arrivalPoint, 70 | state.getArrivalProcedure.fold("")(_.name))) { 71 | Geo.getWaypointInProximity(state, dev, getWaypointList(state)) foreach 72 | { wp => publish(WaypointVisit(state, wp)) } 73 | } 74 | case BusEvent(_, msg@StarChanged(_), _) => publish(msg) 75 | case BusEvent(_, msg@FlightCompleted(_, _), _) => publish(msg) 76 | } 77 | 78 | /** Obtains the waypoints of the star for the given ExtendedFlightState. 79 | * 80 | * @param state an object storing the flight track information 81 | * @return a list of the waypoints specified in the given ExtendedFlightState arrival 82 | * procedure. 83 | */ 84 | def getWaypointList(state: ExtendedFlightState): Seq[Waypoint] = { 85 | 86 | val star = state.getArrivalProcedure flatMap { 87 | arr => Airport.getRnavStar(state.arrivalPoint, arr.name) 88 | } 89 | 90 | val wpList = star.fold(Seq.empty[Waypoint]) { 91 | _.waypoints 92 | } 93 | 94 | if (wpList.isEmpty && state.getArrivalProcedure.isDefined) 95 | println(s"${Console.MAGENTA}WARNING: ${state.cs} re-assigned to unknown " + 96 | s"STAR ${state.getArrivalProcedure}") 97 | 98 | wpList 99 | } 100 | } -------------------------------------------------------------------------------- /mesa-nextgen/src/main/scala/gov/nasa/mesa/nextgen/dataProcessing/SfdpsCSCounterActor.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.nextgen.dataProcessing 32 | 33 | import akka.actor.ActorRef 34 | import com.typesafe.config.Config 35 | import gov.nasa.mesa.core.MesaActor 36 | import gov.nasa.mesa.nextgen.core.{FlightState, FlightStateCompleted} 37 | import gov.nasa.mesa.reporting.stats.GlobalStatsProfiler 38 | import gov.nasa.race.core.BusEvent 39 | 40 | import scala.collection.immutable.List 41 | 42 | /** This class represents a MESA actor which simply counts the number of 43 | * different call signs in the incoming trace composed of FlightState and 44 | * FlightStateCompleted objects. 45 | * 46 | * @param config the actor configuration 47 | */ 48 | class SfdpsCSCounterActor(val config: Config) extends MesaActor { 49 | 50 | var count = List.empty[String] 51 | val printFrequency = 200 52 | 53 | /** Receives FlightState and FlightStateCompleted messages and counts the 54 | * number of different call sign, stored in 'count'. 55 | * 56 | * @return a partial function with the Dynamic_RNAV_STAR_TraceGenerator 57 | * actor logic. 58 | */ 59 | override def handleMessage: Receive = { 60 | case e@BusEvent(_, FlightState(_, cs, _, _, _, _, _, _), _) => 61 | if (!GlobalStatsProfiler.processedAllMsgs) { 62 | GlobalStatsProfiler.incMsgCounter 63 | if (!count.contains(cs)) { 64 | count = cs :: count 65 | if (count.size % printFrequency == 0) 66 | println(s"cs count: ${count.size}") 67 | } 68 | } 69 | case e@BusEvent(_, FlightStateCompleted(_, cs, _, _, _, _, _, _), _) => 70 | if (!GlobalStatsProfiler.processedAllMsgs) { 71 | GlobalStatsProfiler.incMsgCounter 72 | } 73 | } 74 | 75 | /** Called when terminating this actor. 76 | * 77 | * @param originator the actor sending the termination request 78 | * @return true if the termination is successful, otherwise returns false. 79 | */ 80 | override def onTerminateRaceActor(originator: ActorRef): Boolean = { 81 | println(s"number of call signs: ${count.size}") 82 | super.onTerminateRaceActor(originator) 83 | } 84 | } -------------------------------------------------------------------------------- /mesa-nextgen/src/main/scala/gov/nasa/mesa/nextgen/dataProcessing/filters/FilteredFlightStateGenerator.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.nextgen.dataProcessing.filters 32 | 33 | import com.typesafe.config.Config 34 | import gov.nasa.mesa.core.MesaActor 35 | import gov.nasa.mesa.nextgen.core._ 36 | import gov.nasa.race.config.ConfigurableFilter 37 | import gov.nasa.race.core.BusEvent 38 | 39 | import scala.collection.immutable.HashMap 40 | 41 | /** This class represents a MESA actor used to filter out flight state objects 42 | * including ExtendedFlightState and FlightStateCompleted. It received a trace 43 | * including these objects and publishes ExtendedFlightState and FlightCompleted 44 | * objects. 45 | * 46 | * It includes a built-in filter of type FlightTrackFilter which filters out 47 | * data based on the given track information specified in the actor 48 | * configuration. 49 | * 50 | * @param config the actor configuration 51 | */ 52 | class FilteredFlightStateGenerator(val config: Config) extends MesaActor { 53 | 54 | var qualifiedStates = HashMap.empty[String, ExtendedFlightState] 55 | 56 | val flightTrackFilter: ConfigurableFilter = new FlightTrackFilter(config) 57 | 58 | /** This defines the actor behavior specified as a partial function with the 59 | * FilteredFlightStateGenerator actor logic. 60 | * 61 | * @return a partial function with the FilteredFlightStateGenerator actor 62 | * logic. 63 | */ 64 | override def handleMessage: Receive = { 65 | case BusEvent(_, state@ExtendedFlightState(_, cs, _, _, _, _, _, _, _, _, _, _), _) => 66 | val fstate = qualifiedStates.get(cs) 67 | if (fstate.isEmpty) { 68 | if (flightTrackFilter.pass(state)) { 69 | // started monitoring cs 70 | qualifiedStates += (cs -> state) 71 | publish(state) 72 | } 73 | } else if(state.hasflightPlan) { 74 | // check to see if the arrival procedure has changed 75 | val arr1 = fstate.get.getArrivalProcedure.getOrElse(None) 76 | val arr2 = state.getArrivalProcedure.getOrElse(None) 77 | if (!arr1.equals(arr2)) { 78 | println(s"${Console.YELLOW}$cs STAR CHANGED: ${arr1} -> " + 79 | s"${arr2}${Console.RESET}") 80 | publish(StarChanged(state)) 81 | 82 | if (flightTrackFilter.pass(state)) { 83 | // updating 84 | qualifiedStates += (cs -> state) 85 | publish(state) 86 | } else { 87 | println(s"${Console.MAGENTA}WARNING: new $cs STAR is out of scope:" + 88 | s"\n ${fstate.get.fplan.route} -> ${state.fplan.route}${Console.RESET}") 89 | // updating 90 | qualifiedStates -= cs 91 | } 92 | } else { 93 | publish(state) 94 | } 95 | } else { // !tInfo.isEmpty && !ft.hasflightPlan 96 | // as long as the last recorded flight plan is in the list, we still publish 97 | publish(ExtendedFlightState(state.id, state.cs, state.position, state.speed, state.heading, state.vr, state.date, state.status, state.src, 98 | state.departurePoint, state.departureDate, state.arrivalPoint, state.arrivalDate, fstate.get.fplan, 99 | state.equipmentQualifier)) 100 | } 101 | case BusEvent(_, FlightStateCompleted(_, cs, _, _, _, _, _, _), _) => 102 | if (qualifiedStates.contains(cs)) { 103 | // remove the flight from the list 104 | val fstate = qualifiedStates.get(cs) 105 | qualifiedStates -= cs 106 | publish(FlightCompleted(cs, 107 | fstate.get.getArrivalProcedure.getOrElse(Procedure.NotAssigned))) 108 | } 109 | } 110 | } 111 | 112 | -------------------------------------------------------------------------------- /mesa-nextgen/src/main/scala/gov/nasa/mesa/nextgen/dataProcessing/filters/FlightStateAndTrackMapFilter.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.nextgen.dataProcessing.filters 32 | 33 | import com.typesafe.config.Config 34 | import gov.nasa.mesa.nextgen.core.{FlightState, ExtendedFlightState} 35 | import gov.nasa.race.config.ConfigurableFilter 36 | 37 | import scala.collection.mutable.HashSet 38 | 39 | /** This class represents a filter object used to filter FlightState objects 40 | * by mapping them into to the list of received ExtendedFlightState objects. It 41 | * maintains a list of flight call signs that their track has been received, 42 | * and filters out any FlightState whose call sign does not match the call 43 | * sign of any ExtendedFlightState object in the list. 44 | * 45 | * @param config the actor configuration 46 | */ 47 | class FlightStateAndTrackMapFilter(val config: Config) 48 | extends ConfigurableFilter { 49 | 50 | val csList = new HashSet[String] 51 | 52 | /** Filters out those FlightStates whose track info has not been received 53 | * so far. 54 | * 55 | * @param o a message 56 | * @return true if the message is of type of FlightState and its ExtendedFlightState 57 | * objects has been received, otherwise, returns false. 58 | */ 59 | override def pass(o: Any): Boolean = { 60 | o match { 61 | case extendedState: ExtendedFlightState => 62 | if (csList.add(extendedState.cs)) { 63 | } 64 | false 65 | case state: FlightState => 66 | if (csList.contains(state.cs)) { 67 | true 68 | } else false 69 | case other => false 70 | } 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /mesa-nextgen/src/main/scala/gov/nasa/mesa/nextgen/dataProcessing/translators/AdsbTranslator.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2021 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.nextgen.dataProcessing.translators 32 | 33 | import gov.nasa.mesa.nextgen.core.{FlightState, FlightStateCompleted} 34 | import gov.nasa.race.air.FlightPos 35 | import gov.nasa.race.air.translator.SBS2FlightPos 36 | import gov.nasa.race.track.TrackedObject 37 | 38 | /** This class represents a RACE ConfigurableTranslator that translates ADS-B 39 | * to FlightState and FlightStateCompleted events. 40 | */ 41 | class AdsbTranslator extends SBS2FlightPos { 42 | override def translate(src: Any): Option[Any] = { 43 | val res = super.translate(src) 44 | if(res.isDefined) { 45 | val fpos = res.get.asInstanceOf[FlightPos] 46 | if((fpos.status & TrackedObject.CompletedFlag) != 0) { 47 | return Some(FlightStateCompleted(fpos.id, fpos.cs, fpos.position, fpos 48 | .speed, fpos.heading, fpos.vr, fpos.date, fpos.status, fpos.source 49 | .getOrElse("?"))) 50 | } else { 51 | return Some(FlightState(fpos.id, fpos.cs, fpos.position, fpos.speed, 52 | fpos.heading, fpos.vr, fpos.date, fpos.status, fpos.source 53 | .getOrElse("?"))) 54 | } 55 | } 56 | None 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /mesa-nextgen/src/main/scala/gov/nasa/mesa/nextgen/dataProcessing/translators/ExtendedSfdpsTrackGenerator.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2023 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.nextgen.dataProcessing.translators 32 | 33 | import gov.nasa.mesa.nextgen.core.ExtendedSfdpsTrack 34 | import gov.nasa.race.air.SfdpsTrack 35 | import gov.nasa.race.geo.GeoPosition 36 | import gov.nasa.race.uom.Angle.Degrees 37 | import gov.nasa.race.uom.{DateTime, Length, Speed} 38 | 39 | /** This class represents a translator that translates SFDPS MessageCollection 40 | * messages obtained from SWIM to ExtendedSfdpsTrack objects. 41 | */ 42 | class ExtendedSfdpsTrackGenerator extends SfdpsParser { 43 | 44 | /** Creates an instance of an ExtendedSfdpsTrack object. 45 | * 46 | * @param id the flight id 47 | * @param cs the flight call sign 48 | * @param lat latitude for the flight position 49 | * @param lon longitude for the flight position 50 | * @param vx the ordinate coordinate 51 | * @param vy the abscissa coordinate 52 | * @param alt altitude for the flight position 53 | * @param spd the speed of the flight 54 | * @param vr the vertical speed which is the climb rate 55 | * @param date the timestamp of the message 56 | * @param arrivalPoint the arrival airport 57 | * @param departurePoint the departure airport 58 | * @param arrivalDate the arrival time 59 | * @param departureDate the departure time 60 | * @param status the statue of the flight 61 | * @param src originating ARTCC 62 | * @param route the route 63 | * @param flightRules flight rules 64 | * @param equipmentQualifier the equipment qualifier 65 | * @return an instance of a FlightState or FlightStateCompleted object. 66 | */ 67 | override def createSfdpsObject(id: String, cs: String, lat: Double, 68 | lon: Double, vx: Double, vy: Double, 69 | alt: Length, spd: Speed, vr: Speed, 70 | date: DateTime, arrivalPoint: String, 71 | departurePoint: String, arrivalDate: DateTime, 72 | departureDate: DateTime, status: Int, 73 | src: String, route: String, flightRules: String, 74 | equipmentQualifier: String): SfdpsTrack = { 75 | ExtendedSfdpsTrack(id, cs, GeoPosition(Degrees(lat), Degrees(lon), alt), spd, 76 | Degrees(Math.atan2(vx, vy).toDegrees), vr, date, status, src, 77 | departurePoint, departureDate, arrivalPoint, arrivalDate, route, 78 | flightRules, equipmentQualifier) 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /mesa-nextgen/src/main/scala/gov/nasa/mesa/nextgen/verification/SelfTerminatingFlightMonitorActor.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.nextgen.verification 32 | 33 | import com.typesafe.config.Config 34 | import gov.nasa.mesa.monitoring.actors.MonitorActor 35 | import gov.nasa.mesa.monitoring.dispatchers.TerminateMonitorChildActor 36 | import gov.nasa.mesa.nextgen.core.FlightStateCompleted 37 | import gov.nasa.race.core.BusEvent 38 | 39 | /** A monitor actor that terminates itself upon receiving the TrackCompleted 40 | * message. 41 | * 42 | * TODO: turn this into a generic monitor actor that terminates upon receiving 43 | * a specified message. 44 | * 45 | * @param config the monitor actor configuration 46 | */ 47 | class SelfTerminatingFlightMonitorActor(override val config: Config) 48 | extends MonitorActor(config) { 49 | 50 | /** Implements the main behavior of SelfTerminatingFlightMonitorActor. 51 | * 52 | * @return a partial function 53 | */ 54 | override def handleMessage: Receive = { 55 | case BusEvent(_, msg, _) => 56 | monitor.verifyEvent(msg) 57 | publish(msg) 58 | checkForTermination(msg) 59 | } 60 | 61 | /** Checks if the given message is of type of FlightStateCompleted, and if 62 | * so it terminates itself by having the parent actor (master) send it 63 | * the TerminateMonitorChildActor message. 64 | * 65 | * @param msg a message 66 | */ 67 | def checkForTermination(msg: Any): Unit = { 68 | msg match { 69 | case msg: FlightStateCompleted => 70 | context.parent ! TerminateMonitorChildActor(self) 71 | case _ => //ignore 72 | } 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /mesa-nextgen/src/main/scala/gov/nasa/mesa/nextgen/verification/dispatchers/FlightConcurrentDispatcher.scala: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Copyright © 2020 United States Government as represented by the 4 | * Administrator of the National Aeronautics and Space Administration. All 5 | * Rights Reserved. 6 | * 7 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 8 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 9 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 10 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 11 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 12 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 13 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 14 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 15 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 16 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 17 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 18 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 19 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 20 | * 21 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 22 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 23 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 24 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 25 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 26 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 27 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 28 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 29 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 30 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 31 | */ 32 | package gov.nasa.mesa.nextgen.verification.dispatchers 33 | 34 | import com.typesafe.config.Config 35 | import gov.nasa.mesa.monitoring.dispatchers.ConcurrentDispatcher 36 | import gov.nasa.mesa.nextgen.core.{FlightState, FlightStateCompleted} 37 | import gov.nasa.mesa.reporting.stats.GlobalStatsProfiler 38 | import gov.nasa.race.core.BusEvent 39 | 40 | /** This class extends the concurrent dispatcher towards the NextGen 41 | * applications. This dispatcher can be used in two settings, unbounded 42 | * where there is one monitor per call sign, or bounded where the maximum 43 | * number of monitors is specified in the config using the key 44 | * "actor-monitor-count". 45 | * 46 | * See gov.nasa.mesa.monitoring.dispatchers.ConcurrentDispatcher for more 47 | * details. 48 | * 49 | * @param config the dispatcher actor configuration 50 | */ 51 | class FlightConcurrentDispatcher(val config: Config) 52 | extends ConcurrentDispatcher { 53 | 54 | override val monitorConfig: Config = config.getConfig("monitor") 55 | 56 | /** Implements the concurrent dispatcher actor for flight messages. It creates 57 | * monitor actors on-the-fly, and it supports supports indexing at the 58 | * dispatcher level by storing call signs in a hash map. It also updates the 59 | * GlobalStatsProfiler object as it processes the input trace. 60 | * 61 | * @return a partial function with the FlightConcurrentDispatcher logic. 62 | */ 63 | override def handleMessage: Receive = { 64 | case e@BusEvent(_, FlightState(_, cs, _, _, _, _, _, _), _) => 65 | // Process the message, only if the termination condition has not been 66 | // reached. 67 | if (!GlobalStatsProfiler.dispatchedAllMsgs) { 68 | if (!monitorActors.contains(cs)) createMonitorActor(monitorConfig, cs) 69 | GlobalStatsProfiler.incDispatchedMsgCount 70 | monitorActors(cs) ! e 71 | } 72 | case e@BusEvent(_, FlightStateCompleted(_, cs, _, _, _, _, _, _), _) => 73 | if (!GlobalStatsProfiler.dispatchedAllMsgs) { 74 | GlobalStatsProfiler.incDispatchedMsgCount 75 | if (monitorActors.contains(cs)) { 76 | val actorRef = monitorActors(cs) 77 | actorRef ! e 78 | terminateMonitorActor(actorRef) 79 | } 80 | // dumping the msg 81 | else GlobalStatsProfiler.incMsgCounter 82 | } 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /mesa-nextgen/src/main/scala/gov/nasa/mesa/nextgen/verification/dispatchers/FlightIndexingDispatcher.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.nextgen.verification.dispatchers 32 | 33 | import com.typesafe.config.Config 34 | import gov.nasa.mesa.monitoring.dispatchers.IndexingDispatcher 35 | import gov.nasa.mesa.nextgen.core.{FlightState, FlightStateCompleted} 36 | import gov.nasa.mesa.reporting.stats.GlobalStatsProfiler 37 | import gov.nasa.race.core.BusEvent 38 | 39 | /** This class extends the indexing dispatcher towards the NextGen applications 40 | * It is a dispatcher actor that creates monitor objects on-the-fly. For each 41 | * flight call sign, creates a monitor object, and maintains a map from unique 42 | * call signs to monitor objects. 43 | * 44 | * It uses flight call signs as slicing criteria. For each received FlightState 45 | * message, it invokes verifyEvent on the associated monitor object with the 46 | * same call sign as the one stored in the message. For each received 47 | * FlightCompleted message, it removes the corresponding 48 | * monitor object from the map. 49 | * 50 | * @param config the dispatcher actor configuration 51 | */ 52 | class FlightIndexingDispatcher(val config: Config) extends IndexingDispatcher { 53 | 54 | /** A config object for the monitors */ 55 | val monitorConfig: Config = config.getConfig("monitor") 56 | 57 | /** Implements the indexing dispatcher actor for flight messages. It creates 58 | * monitor objects on-the-fly, and it supports indexing at the dispatcher 59 | * level by storing monitor instances in a hash map. It also updates the 60 | * GlobalStatsProfiler object as it processes the input trace. 61 | * 62 | * @return a partial function with the FlightIndexingDispatcher logic. 63 | */ 64 | override def handleMessage: Receive = { 65 | case BusEvent(_, state@FlightState(_, cs, _, _, _, _, _, _), _) => 66 | // Process the message, only if the termination condition has not been 67 | // reached. 68 | if (!GlobalStatsProfiler.dispatchedAllMsgs) { 69 | GlobalStatsProfiler.incDispatchedMsgCount 70 | if (!monitors.contains(cs)) createMonitor(monitorConfig, cs) 71 | monitors(cs).verifyEvent(state) 72 | } 73 | case BusEvent(_, t@FlightStateCompleted(_, cs, _, _, _, _, _, _), _) => 74 | if (!GlobalStatsProfiler.dispatchedAllMsgs) { 75 | GlobalStatsProfiler.incDispatchedMsgCount 76 | if (monitors.contains(cs)) { 77 | val monitor = removeMonitor(cs) 78 | monitor.verifyEvent(t) 79 | } 80 | // dumping the msg 81 | else GlobalStatsProfiler.incMsgCounter 82 | } 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /mesa-nextgen/src/main/scala/gov/nasa/mesa/nextgen/verification/dispatchers/FlightMonitorIndexing.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.nextgen.verification.dispatchers 32 | 33 | import com.typesafe.config.Config 34 | import gov.nasa.mesa.monitoring.actors.MonitorActor 35 | import gov.nasa.mesa.nextgen.core.{FlightState, FlightStateCompleted} 36 | import gov.nasa.mesa.reporting.stats.GlobalStatsProfiler 37 | import gov.nasa.race.core.BusEvent 38 | 39 | /** This class represents a MESA monitor actor which uses one monitor object 40 | * for all the flights in the input event trace. In a way, the monitoring step 41 | * of this configuration is equivalent to directly using the Daut (or 42 | * TraceContract) tool to process the trace sequentially. 43 | * 44 | * @param config the actor configuration 45 | */ 46 | class FlightMonitorIndexing(config: Config) extends MonitorActor(config) { 47 | 48 | GlobalStatsProfiler.incMonitorCounter 49 | 50 | /** Implements a MESA monitor actor for flight messages. It also updates 51 | * the GlobalStatsProfiler object as it processes the input trace. 52 | * 53 | * @return a partial function. 54 | */ 55 | override def handleMessage: Receive = { 56 | case BusEvent(_, msg@FlightState(_, cs, _, _, _, _, _, _), _) => 57 | if (!GlobalStatsProfiler.dispatchedAllMsgs) { 58 | GlobalStatsProfiler.incDispatchedMsgCount 59 | monitor.verifyEvent(msg) 60 | // publish(msg) 61 | } 62 | case BusEvent(_, msg@FlightStateCompleted(_, cs, _, _, _, _, _, _), _) => 63 | if (!GlobalStatsProfiler.dispatchedAllMsgs) { 64 | GlobalStatsProfiler.incDispatchedMsgCount 65 | monitor.verifyEvent(msg) 66 | // publish(msg) 67 | } 68 | } 69 | } -------------------------------------------------------------------------------- /mesa-nextgen/src/main/scala/gov/nasa/mesa/nextgen/verification/monitors/daut/FlightHeading_Monitor.scala: -------------------------------------------------------------------------------- 1 | package gov.nasa.mesa.nextgen.verification.monitors.daut 2 | 3 | import com.typesafe.config.Config 4 | import gov.nasa.mesa.core.DautMonitor 5 | import gov.nasa.mesa.nextgen.core.FlightState 6 | import gov.nasa.race.air.FlightPosHeadingChecker 7 | import gov.nasa.race.config.ConfigUtils.ConfigWrapper 8 | import gov.nasa.race.track.TrackedObject.TrackProblem 9 | import gov.nasa.race.uom.Angle.Degrees 10 | 11 | 12 | class FlightHeading_Monitor(config: Config) extends DautMonitor(config) { 13 | val maxHeadingChange = Degrees(config.getDoubleOrElse("max-heading-change", 45.0)) 14 | 15 | 16 | /** A RACE checker that checks for inconsistencies in ADS-B data */ 17 | val checker = new FlightPosHeadingChecker(config) 18 | 19 | always { 20 | case prevState@FlightState(_, cs, _, _, _, _, _, _) => 21 | watch { 22 | case currState@FlightState(_, `cs`, _, _, _, _, _, _) => 23 | checkForSbsInconsistency(currState, prevState) 24 | } 25 | } 26 | 27 | def checkForSbsInconsistency(currState: FlightState, 28 | prevState: FlightState): Boolean = { 29 | val inconsistency = checker.checkPair(currState, prevState) 30 | if(inconsistency.isDefined) { 31 | error(reportViolation(inconsistency)) 32 | } 33 | inconsistency.isEmpty 34 | } 35 | 36 | def reportViolation(inconsistency: Option[TrackProblem]): String = { 37 | val res = inconsistency.get 38 | val msg = new StringBuilder 39 | msg.append(s"--- ADS-B position inconsistency: ${res.problem}\n") 40 | msg.append(s"current: ${res.fpos}\n") 41 | msg.append(s"previous: ${res.lastFpos}\n") 42 | msg.toString 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /mesa-nextgen/src/main/scala/gov/nasa/mesa/nextgen/verification/monitors/daut/FlightMsgOrder_Monitor.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.nextgen.verification.monitors.daut 32 | 33 | import com.typesafe.config.Config 34 | import gov.nasa.mesa.core.DautMonitor 35 | import gov.nasa.mesa.nextgen.core.{FlightState, FlightStateCompleted} 36 | import gov.nasa.mesa.reporting.stats.GlobalStatsProfiler 37 | 38 | /** This class represents a Daut monitor that captures a property that checks 39 | * if messages for each flight are received in a chronological order. 40 | * 41 | * @param config the configuration 42 | */ 43 | class FlightMsgOrder_Monitor(config: Config) extends DautMonitor(config) { 44 | always { 45 | case FlightState(_, cs, _, _, _, _, date1, _) => 46 | watch { 47 | case FlightState(_, `cs`, _, _, _, _, date2, _) => 48 | date2.isAfter(date1) 49 | } 50 | } 51 | } 52 | 53 | /** This class maintains a list of FlightMsgOrder_Monitor instances as its 54 | * sub-monitors. 55 | * 56 | * It uses a feature of Daut that allows for defining sub-monitors within 57 | * one monitor object. This is used in our empirical studies to mitigate issues 58 | * associated with micro-benchmarking. 59 | * 60 | * The number of sub-monitors is specified in the monitor config using the key 61 | * "sub-monitor-count". 62 | * 63 | * @param config the configuration 64 | */ 65 | class FlightMsgOrder_MultiMonitor(config: Config) extends DautMonitor(config) { 66 | val size: Int = config.getInt("sub-monitor-count") - 1 67 | 68 | val m: Seq[FlightMsgOrder_Monitor] = 69 | for (i <- 0 to size) yield new FlightMsgOrder_Monitor(config) 70 | 71 | monitor(m: _*) 72 | 73 | /** This method overrides the method daut.Monitor.verifyBeforeEvent which is 74 | * always invoked before invoking 'verify' on the message. 75 | * 76 | * @param msg a message 77 | */ 78 | override def verifyAfterEvent(msg: Any): Unit = { 79 | msg match { 80 | case FlightState(_, _, _, _, _, _, _, _) => 81 | GlobalStatsProfiler.incMsgCounter 82 | case FlightStateCompleted(_, _, _, _, _, _, _, _) => 83 | GlobalStatsProfiler.incMsgCounter 84 | } 85 | } 86 | } 87 | 88 | /** 89 | * This class maintains a list of FlightMsgOrder_Monitor instances combined 90 | * with the mixin FlightMsg_DautMonitor_Indx as its sub-monitors. The 91 | * sub-monitors allow for daut indexing. 92 | * 93 | * It uses a feature of Daut that allows for defining sub-monitors within 94 | * one monitor object. This is used in our empirical studies to mitigate issues 95 | * associated with micro-benchmarking. 96 | * 97 | * The number of sub-monitors is specified in the monitor config using the key 98 | * "sub-monitor-count". 99 | */ 100 | class FlightMsgOrder_MultiMonitor_Indx(config: Config) extends DautMonitor(config) { 101 | val size: Int = config.getInt("sub-monitor-count") - 1 102 | 103 | val m = for(i <- 0 to size) 104 | // combining the monitor with indexing capabilities using the mixin 105 | // FlightMsg_DautMonitor_Indx. 106 | yield new FlightMsgOrder_Monitor(config) with FlightMsg_DautMonitor_Indx 107 | 108 | monitor(m: _*) 109 | 110 | override def verifyAfterEvent(msg: Any): Unit = { 111 | msg match { 112 | case FlightState(_, _, _, _, _, _, _, _) => 113 | GlobalStatsProfiler.incMsgCounter 114 | case FlightStateCompleted(_, _, _, _, _, _, _, _) => 115 | GlobalStatsProfiler.incMsgCounter 116 | } 117 | } 118 | } -------------------------------------------------------------------------------- /mesa-nextgen/src/main/scala/gov/nasa/mesa/nextgen/verification/monitors/daut/FlightMsg_DautMonitor_Indx.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.nextgen.verification.monitors.daut 32 | 33 | import gov.nasa.mesa.core.DautMonitor 34 | import gov.nasa.mesa.nextgen.core.{FlightState, FlightStateCompleted} 35 | 36 | /** This is a mixin that represents a Daut monitor with indexing capability. 37 | * 38 | * Daut provides an indexing capability within monitors to improve their 39 | * performance. It allows for defining the function 'keyOf' from events to 40 | * keys where keys are used as entries in a hash map to obtain those states 41 | * which are relevant to the event. 42 | */ 43 | trait FlightMsg_DautMonitor_Indx extends DautMonitor { 44 | 45 | /** Given an event of type FlightState or FlightStateCompleted, it returns 46 | * the flight call sign as a key to obtain those states which are relevant 47 | * to the event. 48 | * 49 | * @param event the event 50 | * @return a Some[String] object storing the flight call sign as a key. 51 | */ 52 | override protected def keyOf(event: Any): Option[String] = { 53 | event match { 54 | case FlightState(_, cs, _, _, _, _, _, _) => Some(cs) 55 | case FlightStateCompleted(_, cs, _, _, _, _, _, _) => Some(cs) 56 | } 57 | } 58 | } -------------------------------------------------------------------------------- /mesa-nextgen/src/main/scala/gov/nasa/mesa/nextgen/verification/monitors/daut/SingleFlightMsgOrder_Monitor.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.nextgen.verification.monitors.daut 32 | 33 | import com.typesafe.config.Config 34 | import gov.nasa.mesa.core.DautMonitor 35 | import gov.nasa.mesa.nextgen.core.{FlightState, FlightStateCompleted} 36 | import gov.nasa.mesa.reporting.stats.GlobalStatsProfiler 37 | 38 | /** This class represents a Daut monitor that captures a property that checks 39 | * if messages for the flight with the call sign 'cs' are received in a 40 | * chronological order. 41 | * 42 | * @param config the configuration 43 | */ 44 | class SingleFlightMsgOrder_Monitor(config: Config) extends DautMonitor(config){ 45 | 46 | val cs = config.getString("cs") 47 | 48 | always { 49 | case FlightState(_, `cs`, _, _, _, _, date1, _) => 50 | watch { 51 | case FlightState(_, `cs`, _, _, _, _, date2, _) => { 52 | date2.isAfter(date1) 53 | } 54 | } 55 | } 56 | } 57 | 58 | /** This class maintains a list of SingleFlightMsgOrder_Monitor instances as its 59 | * sub-monitors. 60 | * 61 | * It uses a feature of Daut that allows for defining sub-monitors within 62 | * one monitor object. This is meant to be used in our empirical studies to 63 | * mitigate issues associated with micro-benchmarking. 64 | * 65 | * The number of sub-monitors is specified in the monitor config using the key 66 | * "sub-monitor-count". 67 | * 68 | * @param config the configuration 69 | */ 70 | class SingleFlightMsgOrder_MultiMonitor(config: Config) extends DautMonitor(config) { 71 | val size = config.getInt("sub-monitor-count") - 1 72 | val cs = config.getString("cs"); 73 | 74 | val m = for(i <- 0 to size) yield new SingleFlightMsgOrder_Monitor(config) 75 | monitor(m: _*) 76 | 77 | /** This method overrides the method daut.Monitor.verifyBeforeEvent which is 78 | * always invoked before invoking 'verify' on the message. 79 | * 80 | * @param msg a message 81 | */ 82 | override def verifyAfterEvent(msg: Any): Unit = { 83 | msg match { 84 | case FlightState(_, `cs`, _, _, _, _, _, _) => GlobalStatsProfiler.incMsgCounter 85 | case FlightStateCompleted(_,`cs`,_,_,_,_,_,_) => { 86 | GlobalStatsProfiler.incMsgCounter 87 | } 88 | case _ => // ignore 89 | } 90 | } 91 | } 92 | 93 | -------------------------------------------------------------------------------- /mesa-nextgen/src/main/scala/gov/nasa/mesa/nextgen/verification/monitors/tracecontract/FlightMsgOrder_Monitor.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.nextgen.verification.monitors.tracecontract 32 | 33 | import com.typesafe.config.Config 34 | import gov.nasa.mesa.core.TraceContractMonitor 35 | import gov.nasa.mesa.nextgen.core.{FlightState, FlightStateCompleted} 36 | import gov.nasa.mesa.reporting.stats.GlobalStatsProfiler 37 | 38 | /** This class represents a TraceContract monitor that captures a property that 39 | * checks if messages for each flight are received in a chronological order. 40 | * 41 | * @param config the configuration 42 | */ 43 | class FlightMsgOrder_Monitor(config: Config) extends TraceContractMonitor(config) { 44 | 45 | property('flight_seq_order) { 46 | always { 47 | case FlightState(_, cs, _, _, _, _, date1, _) => state { 48 | case FlightState(_, `cs`, _, _, _, _, date2, _) => { 49 | !date2.isBefore(date1) 50 | } 51 | } 52 | } 53 | } 54 | 55 | /** This method overrides the method tracecontract.Monitor.verifyBeforeEvent 56 | * which is always invoked before invoking 'verify' on the message. 57 | * 58 | * @param msg a message 59 | */ 60 | override def verifyAfterEvent(msg: Any): Unit = { 61 | msg match { 62 | case FlightState(_, _, _, _, _, _, _, _) => 63 | GlobalStatsProfiler.incMsgCounter 64 | case FlightStateCompleted(_, _, _, _, _,_,_,_) => 65 | GlobalStatsProfiler.incMsgCounter 66 | //case _ => //do nothing 67 | } 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /mesa-nextgen/src/main/scala/gov/nasa/mesa/nextgen/verification/monitors/tracecontract/SingleFlightMsgOrder_Monitor.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.nextgen.verification.monitors.tracecontract 32 | 33 | import com.typesafe.config.Config 34 | import gov.nasa.mesa.core.TraceContractMonitor 35 | import gov.nasa.mesa.nextgen.core.{FlightState, FlightStateCompleted} 36 | import gov.nasa.mesa.reporting.stats.GlobalStatsProfiler 37 | 38 | /** This class represents a TraceContract monitor that captures a property that 39 | * checks if messages for the flight with the call sign 'cs' are received in a 40 | * chronological order. 41 | * 42 | * @param config the configuration 43 | */ 44 | class SingleFlightMsgOrder_Monitor(config: Config) 45 | extends TraceContractMonitor(config) { 46 | 47 | val cs: String = config.getString("cs") 48 | 49 | property(Symbol("flight_seq_order")) { 50 | always { 51 | case FlightState(_, `cs`, _, _, _, _, date1, _) => state { 52 | case FlightState(_, `cs`, _, _, _, _, date2, _) => date2.isAfter(date1) 53 | } 54 | } 55 | } 56 | 57 | /** This method overrides the method tracecontract.Monitor.verifyBeforeEvent 58 | * which is always invoked before invoking 'verify' on the message. 59 | * 60 | * @param msg a message 61 | */ 62 | override def verifyAfterEvent(msg: Any): Unit = { 63 | msg match { 64 | case FlightState(_, `cs`, _, _, _, _, _, _) => 65 | GlobalStatsProfiler.incMsgCounter 66 | case FlightStateCompleted(_, `cs`, _, _, _, _, _, _) => 67 | GlobalStatsProfiler.incMsgCounter 68 | case _ => // do nothing 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /mesa-nextgen/src/main/scala/gov/nasa/mesa/nextgen/ww/MESAFlightStateViewerLayer.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.nextgen.ww 32 | 33 | import akka.actor.Actor.Receive 34 | import com.typesafe.config.Config 35 | import gov.nasa.mesa.nextgen.core._ 36 | import gov.nasa.race.core.BusEvent 37 | import gov.nasa.race.track.TrackTerminationMessage 38 | import gov.nasa.race.ww.RaceViewer 39 | import gov.nasa.race.ww.air.SfdpsTracksLayer 40 | 41 | /** This class represents a WorldWind layer that displays flights. 42 | * 43 | * @param raceViewer a viewer state facade implemented in RACE which is 44 | * executing in the UI thread 45 | * @param config the configuration 46 | */ 47 | class MESAFlightStateViewerLayer(override val raceViewer: RaceViewer, 48 | override val config: Config) 49 | extends SfdpsTracksLayer(raceViewer: RaceViewer, config: Config) { 50 | 51 | /** Handles the input trace events. 52 | * 53 | * @return a partial function with the handleSFDPSMessage logic 54 | */ 55 | override def handleSFDPSMessage: Receive = { 56 | case BusEvent(_, ft@ExtendedFlightState(_, _, _, _, _, _, _, _, _, _, _, _), _) => 57 | if(ft.position.isDefined) 58 | handleTrack(ft) 59 | case BusEvent(_, state@FlightState(_, _, _, _, _, _, _, _), _) => 60 | handleTrack(state) 61 | case BusEvent(_, msg: StarChanged, _) => // ignore 62 | case BusEvent(_, msg: FlightCompleted, _) => // ignore 63 | case BusEvent(_, msg: TrackTerminationMessage, _) => 64 | handleTermination(msg) 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /mesa-nextgen/src/test/resources/tracks-spec.txt: -------------------------------------------------------------------------------- 1 | 1678919363891,553,N88337,NaN,NaN,NaN,NaN,NaN,NaN,-9007199254740991,0,ZBW,LICC,1676333740000,KTEB,-9007199254740991,LICC./.CAM094024..ALB.V489.COATE..KTEB,IFR,G 2 | 1678919363889,469,N712330,48.199167,-122.238333,NaN,113.92716535433073,NaN,NaN,-9007199254740991,0,ZSE,KPAE,1676333760000,KBLI,-9007199254740991,?,?,? 3 | -------------------------------------------------------------------------------- /mesa-nextgen/src/test/scala/gov/nasa/mesa/nextgen/AirportSpec.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.nextgen 32 | 33 | import gov.nasa.mesa.nextgen.core.Airport 34 | import gov.nasa.race.test.RaceActorSpec 35 | import org.scalatest.wordspec.AnyWordSpecLike 36 | 37 | /** 38 | * A test suite for gov.nasa.mesa.nextgen.core.Airport. 39 | */ 40 | class AirportSpec extends RaceActorSpec with AnyWordSpecLike { 41 | 42 | "Airport object" must { 43 | "retrieve the airport with the given airport airportId" in { 44 | Airport.getAirport("uknown") should be(None) 45 | Airport.getAirport("KSFO").get should be(Airport.KSFO) 46 | } 47 | } 48 | 49 | "Airport object" must { 50 | "retrieve an RNAV STAR with the given airport airportId and name" in { 51 | Airport.getRnavStar("KSFO", "unknown") should be(None) 52 | Airport.getRnavStar("KSFO", "BDEGA2").get.name should be("BDEGA2") 53 | } 54 | } 55 | 56 | "Airport object" must { 57 | "retrieve the airport with the given RNAV STAR name" in { 58 | Airport.getStarAirport("uknown") should be(None) 59 | Airport.getStarAirport("BDEGA2").get should be(Airport.KSFO) 60 | } 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /mesa-nextgen/src/test/scala/gov/nasa/mesa/nextgen/ExtendedFlightStateFilterSpec.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.nextgen 32 | 33 | import com.typesafe.config.ConfigFactory 34 | import gov.nasa.mesa.nextgen.core.{FlightPlan, ExtendedFlightState} 35 | import gov.nasa.mesa.nextgen.dataProcessing.filters.FlightTrackFilter 36 | import gov.nasa.race.test.RaceActorSpec 37 | import org.scalatest.wordspec.AnyWordSpecLike 38 | 39 | /** 40 | * A test suite for gov.nasa.mesa.nextgen.dataProcessing.filters. 41 | * FlightTrackFilter. 42 | */ 43 | class ExtendedFlightStateFilterSpec extends RaceActorSpec with AnyWordSpecLike { 44 | 45 | // ExtendedFlightState definition 46 | val id = "253" 47 | val cs = "SWA3651" 48 | val route = "KBWI.TERPZ6.MAULS.Q40.AEX.WAPPL4.KHOU/0209" 49 | val departureAirport = "KBWI" 50 | val arrivalAirport = "KHOU" 51 | val departure = FlightPlan.getDepartureProcedure(route) 52 | val arrival = FlightPlan.getArrivalProcedure(route) 53 | val flightRules = "IFR" 54 | val equipmentQualifier = "I" 55 | val ti = ExtendedFlightState(id, cs, departureAirport, arrivalAirport, 56 | new FlightPlan(cs, route, departure, arrival, flightRules), 57 | equipmentQualifier) 58 | 59 | "FlightTrackFilter" must { 60 | "match FlightTracks using the given setting in the config" in { 61 | val config = ConfigFactory.parseString( 62 | """ 63 | arrival-point = ["KHOU"] 64 | """) 65 | val filter = new FlightTrackFilter(config) 66 | assert(filter.pass(ti)) 67 | } 68 | } 69 | 70 | "FlightTrackFilter" must { 71 | "filter out FlightTracks that do not match the given setting in the " + 72 | "config" in { 73 | val config1 = ConfigFactory.parseString( 74 | """ 75 | equipment-qualifier = ["L","G","Z"] 76 | """) 77 | val filter1 = new FlightTrackFilter(config1) 78 | println(s"arrival-point: ${config1}") 79 | assert(!filter1.pass(ti)) 80 | 81 | val config2 = ConfigFactory.parseString( 82 | """ 83 | arrival-point = ["KHOU"] 84 | equipment-qualifier = ["L","G","Z"] 85 | """) 86 | val filter2 = new FlightTrackFilter(config2) 87 | println(s"arrival-point: ${config2}") 88 | assert(!filter2.pass(ti)) 89 | } 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /mesa-nextgen/src/test/scala/gov/nasa/mesa/nextgen/FlightPlanSpec.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.nextgen 32 | 33 | import gov.nasa.mesa.nextgen.core.FlightPlan 34 | import gov.nasa.race.test.RaceActorSpec 35 | import org.scalatest.wordspec.AnyWordSpecLike 36 | 37 | /** 38 | * A test suite for gov.nasa.mesa.nextgen.core.FlightPlan. 39 | */ 40 | class FlightPlanSpec extends RaceActorSpec with AnyWordSpecLike { 41 | 42 | "FlightPlan" must { 43 | "retrieve the departure procedure and the initial transition from the " + 44 | "ICAO route" in { 45 | val route1 = "KBWI.TERPZ6.MAULS.Q40.AEX.WAPPL4.KHOU/0209" 46 | val departure1 = FlightPlan.getDepartureProcedure(route1) 47 | 48 | assert(departure1.isDefined) 49 | assert(departure1.get.transition == "MAULS") 50 | assert(departure1.get.name == "TERPZ6") 51 | 52 | val route2 = "KFLG.FLG1.OATES..NAVHO..DRK..MAIER.BRUSR1.KPHX/0148" 53 | val departure2 = FlightPlan.getDepartureProcedure(route2) 54 | 55 | assert(departure2.isDefined) 56 | assert(departure2.get.transition == "OATES") 57 | assert(departure2.get.name == "FLG1") 58 | 59 | val route3 = "KFLG.FLG1.OATES..NAVHO..DRK..MAIER.BRUSR1.KPHX" 60 | val departure3 = FlightPlan.getDepartureProcedure(route3) 61 | 62 | assert(departure3.isDefined) 63 | assert(departure3.get.transition == "OATES") 64 | assert(departure3.get.name == "FLG1") 65 | } 66 | } 67 | 68 | "FlightPlan" must { 69 | "handle the ICAO flight plan with no departure procedure assigned" in { 70 | val route = "KBWI..Q40.AEX.WAPPL4.KHOU/0209" 71 | val departure = FlightPlan.getDepartureProcedure(route) 72 | assert(departure.isEmpty) 73 | } 74 | } 75 | 76 | "FlightPlan" must { 77 | "retrieve the arrival procedure and the initial transition from the " + 78 | "ICAO route" in { 79 | val route1 = "KBWI.TERPZ6.MAULS.Q40.AEX.WAPPL4.KHOU/0209" 80 | val arrival1 = FlightPlan.getArrivalProcedure(route1) 81 | 82 | assert(arrival1.isDefined) 83 | assert(arrival1.get.transition == "AEX") 84 | assert(arrival1.get.name == "WAPPL4") 85 | 86 | val route2 = "KFLG.FLG1.OATES..NAVHO..DRK..MAIER.BRUSR1.KPHX/0148" 87 | val arrival2 = FlightPlan.getArrivalProcedure(route2) 88 | 89 | assert(arrival2.isDefined) 90 | assert(arrival2.get.transition == "MAIER") 91 | assert(arrival2.get.name == "BRUSR1") 92 | } 93 | } 94 | 95 | "FlightPlan" must { 96 | "handle the ICAO flight plan with no arrival procedure assigned" in { 97 | val route = "KBWI.TERPZ6.MAULS.Q40..KHOU/0209" 98 | val arrival = FlightPlan.getArrivalProcedure(route) 99 | assert(arrival.isEmpty) 100 | } 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /mesa-nextgen/src/test/scala/gov/nasa/mesa/nextgen/FlightStateArchiveReaderSpec.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2023 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.nextgen 32 | 33 | import gov.nasa.mesa.nextgen.core.{ExtendedFlightState, FlightStateArchiveReader} 34 | import gov.nasa.race.test.RaceActorSpec 35 | import gov.nasa.race.uom.DateTime 36 | import org.scalatest.wordspec.AnyWordSpecLike 37 | 38 | import java.io.FileInputStream 39 | 40 | /** 41 | * A test suite for gov.nasa.mesa.nextgen.core.FlightStateArchiveReader 42 | */ 43 | class FlightStateArchiveReaderSpec extends RaceActorSpec with AnyWordSpecLike { 44 | val fileName = "tracks-spec.txt" 45 | val path = getClass.getProtectionDomain.getCodeSource.getLocation.getPath + fileName 46 | 47 | "FlightStateArchiveReader" must { 48 | "generate archive entries encapsulating ExtendedFlightState objects" in { 49 | val fis = new FileInputStream(path) 50 | val reader: FlightStateArchiveReader = new FlightStateArchiveReader(fis, path) 51 | 52 | assert(reader.readNextEntry.get.msg.isInstanceOf[ExtendedFlightState]) 53 | assert(reader.readNextEntry.get.msg.isInstanceOf[ExtendedFlightState]) 54 | 55 | // reaching the end of the archive, so we should get None 56 | assert(reader.readNextEntry.isEmpty) 57 | } 58 | } 59 | 60 | "FlightStateArchiveReader" must { 61 | "generate ExtendedFlightState objects including the archived sfdps fields" in { 62 | val fis = new FileInputStream(path) 63 | val reader: FlightStateArchiveReader = new FlightStateArchiveReader(fis, path) 64 | val fstate = reader.readNextEntry.get.msg 65 | 66 | assert(fstate.isInstanceOf[ExtendedFlightState]) 67 | 68 | assertResult("553") 69 | {fstate.asInstanceOf[ExtendedFlightState].id} 70 | 71 | assertResult(DateTime.ofEpochMillis(1676333740000L)) 72 | {fstate.asInstanceOf[ExtendedFlightState].departureDate} 73 | 74 | assertResult("LICC./.CAM094024..ALB.V489.COATE..KTEB") 75 | {fstate.asInstanceOf[ExtendedFlightState].fplan.route} 76 | } 77 | } 78 | } -------------------------------------------------------------------------------- /mesa-nextgen/src/test/scala/gov/nasa/mesa/nextgen/RnavStarSpec.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.nextgen 32 | 33 | import gov.nasa.mesa.nextgen.core.Waypoint 34 | import gov.nasa.mesa.nextgen.core.rnav.{RnavStar, StarGraph} 35 | import gov.nasa.race.geo.GeoPosition 36 | import gov.nasa.race.test.RaceActorSpec 37 | import gov.nasa.race.uom.Length.Meters 38 | import gov.nasa.race.uom.Speed.MetersPerSecond 39 | import org.scalatest.wordspec.AnyWordSpecLike 40 | 41 | /** 42 | * A test suite for gov.nasa.mesa.nextgen.core.rnav.RnavStar 43 | */ 44 | class RnavStarSpec extends RaceActorSpec with AnyWordSpecLike { 45 | 46 | val WP1 = Waypoint("WP1", GeoPosition.fromDegreesAndMeters(0,0,0), Meters(0), 47 | Meters(0), MetersPerSecond(0)) 48 | val WP2 = Waypoint("WP2", GeoPosition.fromDegreesAndMeters(0,0,0), Meters(0), 49 | Meters(0), MetersPerSecond(0)) 50 | val WP3 = Waypoint("WP3", GeoPosition.fromDegreesAndMeters(0,0,0), Meters(0), 51 | Meters(0), MetersPerSecond(0)) 52 | val WP4 = Waypoint("WP4", GeoPosition.fromDegreesAndMeters(0,0,0), Meters(0), 53 | Meters(0), MetersPerSecond(0)) 54 | val WP5 = Waypoint("WP5", GeoPosition.fromDegreesAndMeters(0,0,0), Meters(0), 55 | Meters(0), MetersPerSecond(0)) 56 | 57 | //-- testing RnavStar.getfinalWaypoint 58 | val testStar = RnavStar("TESTSTAR", StarGraph( 59 | (WP1, WP2), 60 | (WP2, WP3), 61 | (WP4, WP3), 62 | (WP3, WP5))) 63 | 64 | "RnavStar" must { 65 | "find the final waypoint" in { 66 | testStar.getFinalWaypoint should be(WP5) 67 | } 68 | } 69 | 70 | //-- testing RnavStar.getNextWaypoint 71 | "RnavStar" must { 72 | "get the following waypoint" in { 73 | testStar.getNextWaypoint(WP1) should be(WP2) 74 | testStar.getNextWaypoint(WP2) should be(testStar.getNextWaypoint(WP4)) 75 | testStar.getNextWaypoint(WP5) should be(Waypoint.NoWaypoint) 76 | } 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /mesa-nextgen/src/test/scala/gov/nasa/mesa/nextgen/SfdpsExtendedFlightStateParserSpec.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.nextgen 32 | 33 | import java.io.File 34 | 35 | import gov.nasa.mesa.nextgen.core.{FlightState, ExtendedFlightState} 36 | import gov.nasa.mesa.nextgen.dataProcessing.translators 37 | .{Sfdps2FlightStateTranslator, Sfdps2ExtendedFlightStateTranslator, SfdpsFullTranslator} 38 | import gov.nasa.race.air.TrackedAircraft 39 | import gov.nasa.race.test.RaceActorSpec 40 | import gov.nasa.race.util.FileUtils.fileContentsAsUTF8String 41 | import org.scalatest.wordspec.AnyWordSpecLike 42 | 43 | import scala.collection.mutable.ArrayBuffer 44 | 45 | /** 46 | * A test suite for gov.nasa.mesa.nextgen.dataProcessing.translators 47 | * .SfdpsParser. 48 | */ 49 | class SfdpsExtendedFlightStateParserSpec extends RaceActorSpec with AnyWordSpecLike { 50 | 51 | "SfdpsFullTranslator translator" must { 52 | "generate ExtendedFlightState and FlightState objects from MessageCollection" in { 53 | val path = getClass.getProtectionDomain.getCodeSource.getLocation.getPath 54 | val xmlMsg = fileContentsAsUTF8String(new File(path, "fixm.xml")).get 55 | 56 | val flightReg = " 64 | println(it) 65 | assert(it.size == numFlightMsg) 66 | case _ => 67 | fail(s"failed to generate ExtendedFlightState objects from FIXM messages " + 68 | s"- result: $None") 69 | } 70 | } 71 | } 72 | 73 | "Sfdps2ExtendedFlightStateTranslator parser" must { 74 | "retrieve the correct values for the cooresponding fields of " + 75 | "ExtendedFlightState" in { 76 | val path = getClass.getProtectionDomain.getCodeSource.getLocation.getPath 77 | val xmlMsg = fileContentsAsUTF8String(new File(path, "fixm.xml")).get 78 | 79 | val translator = new Sfdps2ExtendedFlightStateTranslator 80 | val flightTrack = translator.translate(xmlMsg).get. 81 | asInstanceOf[ArrayBuffer[ExtendedFlightState]](0) 82 | 83 | val id = "253" 84 | val cs = "SWA3651" 85 | val route = "KBWI.TERPZ6.MAULS.Q40.AEX.WAPPL4.KHOU/0209" 86 | val departureProcedure = "TERPZ6" 87 | val departureTransition = "MAULS" 88 | val arrivalProcedure = "WAPPL4" 89 | val arrivalTranstion = "AEX" 90 | val departureAirport = "KBWI" 91 | val arrivalAirport = "KHOU" 92 | 93 | assert(flightTrack.id == id) 94 | assert(flightTrack.cs == cs) 95 | assert(flightTrack.fplan.route == route) 96 | assert(flightTrack.fplan.departure.get.name == departureProcedure) 97 | assert(flightTrack.fplan.departure.get.transition == departureTransition) 98 | assert(flightTrack.fplan.arrival.get.name == arrivalProcedure) 99 | assert(flightTrack.fplan.arrival.get.transition == arrivalTranstion) 100 | assert(flightTrack.departurePoint == departureAirport) 101 | assert(flightTrack.arrivalPoint == arrivalAirport) 102 | } 103 | } 104 | 105 | "Sfdps2FlightStateTranslator parser" must { 106 | "retrieve the correct values for the cooresponding fields of " + 107 | "FlightState" in { 108 | val path = getClass.getProtectionDomain.getCodeSource.getLocation.getPath 109 | val xmlMsg = fileContentsAsUTF8String(new File(path, "fixm.xml")).get 110 | 111 | val translator = new Sfdps2FlightStateTranslator 112 | val flightTrack = translator.translate(xmlMsg).get. 113 | asInstanceOf[ArrayBuffer[FlightState]](0) 114 | 115 | val id = "760" 116 | val cs = "N925EM" 117 | val status = 0 118 | 119 | assert(flightTrack.id == id) 120 | assert(flightTrack.cs == cs) 121 | assert(flightTrack.status == status) 122 | } 123 | } 124 | } 125 | -------------------------------------------------------------------------------- /mesa-nextgen/src/test/scala/gov/nasa/mesa/nextgen/monitors/SfdpsOrderDautMonitorSpec.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.nextgen.monitors 32 | 33 | import com.typesafe.config.{Config, ConfigFactory} 34 | import gov.nasa.mesa.nextgen.core.FlightState 35 | import gov.nasa.mesa.nextgen.verification.monitors.daut.{FlightMsgOrder_Monitor, SingleFlightMsgOrder_Monitor} 36 | import gov.nasa.race.geo.GeoPosition 37 | import gov.nasa.race.test.RaceActorSpec 38 | import gov.nasa.race.uom.{Angle, DateTime, Speed} 39 | import org.scalatest.wordspec.AnyWordSpecLike 40 | 41 | /** 42 | * A test suite for gov.nasa.mesa.nextgen.verification.monitors.daut. 43 | * FlightMsgOrder_Monitor/SingleFlightMsgOrder_Monitor 44 | */ 45 | class SfdpsOrderDautMonitorSpec extends RaceActorSpec with AnyWordSpecLike { 46 | 47 | val emptyConfig = ConfigFactory.empty 48 | 49 | val cs = "ABC123" 50 | 51 | val t1 = DateTime.now 52 | Thread.sleep(10) 53 | val t2 = DateTime.now 54 | Thread.sleep(10) 55 | val t3 = DateTime.now 56 | 57 | val id = "123" 58 | 59 | val fpos1 = FlightState(id, cs, GeoPosition.undefinedPos, Speed 60 | .UndefinedSpeed, 61 | Angle.UndefinedAngle, Speed.UndefinedSpeed, t1, 0, "?", "?", DateTime.Date0, 62 | "?", DateTime.Date0) 63 | val fpos2 = FlightState(id, cs, GeoPosition.undefinedPos, Speed 64 | .UndefinedSpeed, 65 | Angle.UndefinedAngle, Speed.UndefinedSpeed, t2, 0, "?", "?", DateTime.Date0, 66 | "?", DateTime.Date0) 67 | val fpos3 = FlightState(id, cs, GeoPosition.undefinedPos, Speed 68 | .UndefinedSpeed, 69 | Angle.UndefinedAngle, Speed.UndefinedSpeed, t3, 0, "?", "?", DateTime.Date0, 70 | "?", DateTime.Date0) 71 | 72 | "AllFlightSfdpsOrderDautMonitor" must { 73 | "check if sfdps messages for a flight are received " + 74 | "in the right order" in { 75 | val monitor = new FlightMsgOrder_Monitor(emptyConfig) 76 | 77 | monitor.verify(fpos1) 78 | monitor.verify(fpos2) 79 | monitor.verify(fpos3) 80 | 81 | monitor.getErrorCount should be(0) 82 | } 83 | } 84 | 85 | "AllFlightSfdpsOrderDautMonitor" must { 86 | "report an error when sfdps messages for a flight are not " + 87 | "received in the right order" in { 88 | val monitor = new FlightMsgOrder_Monitor(emptyConfig) 89 | 90 | monitor.verify(fpos2) 91 | monitor.verify(fpos3) 92 | monitor.verify(fpos1) 93 | 94 | monitor.getErrorCount should be(1) 95 | } 96 | } 97 | 98 | val config: Config = ConfigFactory.parseString( 99 | s"""{ 100 | cs = "$cs" 101 | }""") 102 | 103 | "SingleFlightMsgOrder_Monitor" must { 104 | "check if sfdps messages for a flight are received " + 105 | "in the right order" in { 106 | val monitor = new SingleFlightMsgOrder_Monitor(config) 107 | 108 | monitor.verify(fpos1) 109 | monitor.verify(fpos2) 110 | monitor.verify(fpos3) 111 | 112 | monitor.getErrorCount should be(0) 113 | } 114 | } 115 | 116 | "SingleFlightMsgOrder_Monitor" must { 117 | "report an error when sfdps messages for a flight are not " + 118 | "received in the right order" in { 119 | val monitor = new SingleFlightMsgOrder_Monitor(config) 120 | 121 | monitor.verify(fpos2) 122 | monitor.verify(fpos3) 123 | monitor.verify(fpos1) 124 | 125 | monitor.getErrorCount should be(1) 126 | } 127 | } 128 | } 129 | -------------------------------------------------------------------------------- /mesa-nextgen/src/test/scala/gov/nasa/mesa/nextgen/monitors/SfdpsOrderTCMonitorSpec.scala: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright © 2020 United States Government as represented by the 3 | * Administrator of the National Aeronautics and Space Administration. All 4 | * Rights Reserved. 5 | * 6 | * No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY 7 | * WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, 8 | * BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM 9 | * TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR 10 | * A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE 11 | * SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, 12 | * IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES 13 | * NOT, IN ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY 14 | * PRIOR RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE 15 | * PRODUCTS OR ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT 16 | * SOFTWARE. FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND 17 | * LIABILITIES REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL 18 | * SOFTWARE, AND DISTRIBUTES IT "AS IS." 19 | * 20 | * Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS 21 | * AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, 22 | * AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT 23 | * SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES 24 | * ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR 25 | * RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL 26 | * INDEMNIFY AND HOLD HARMLESS THE UNITED STATES GOVERNMENT, ITS CONTRACTORS 27 | * AND SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT, TO THE EXTENT 28 | * PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY FOR ANY SUCH MATTER SHALL BE 29 | * THE IMMEDIATE, UNILATERAL TERMINATION OF THIS AGREEMENT. 30 | */ 31 | package gov.nasa.mesa.nextgen.monitors 32 | 33 | import com.typesafe.config.{Config, ConfigFactory} 34 | import gov.nasa.mesa.nextgen.core.FlightState 35 | import gov.nasa.mesa.nextgen.verification.monitors.tracecontract.{FlightMsgOrder_Monitor, SingleFlightMsgOrder_Monitor} 36 | import gov.nasa.race.geo.GeoPosition 37 | import gov.nasa.race.test.RaceActorSpec 38 | import gov.nasa.race.uom.{Angle, DateTime, Speed} 39 | import org.scalatest.wordspec.AnyWordSpecLike 40 | 41 | /** 42 | * A test suite for gov.nasa.mesa.nextgen.verification.monitors.tracecontract. 43 | * FlightMsgOrder_Monitor/SingleFlightMsgOrder_Monitor 44 | */ 45 | class SfdpsOrderTCMonitorSpec extends RaceActorSpec with AnyWordSpecLike { 46 | 47 | val emptyConfig = ConfigFactory.empty 48 | 49 | val cs = "ABC123" 50 | 51 | val t1 = DateTime.now 52 | Thread.sleep(10) 53 | val t2 = DateTime.now 54 | Thread.sleep(10) 55 | val t3 = DateTime.now 56 | 57 | val id = "123" 58 | 59 | val fpos1 = FlightState(id, cs, GeoPosition.undefinedPos, Speed 60 | .UndefinedSpeed, 61 | Angle.UndefinedAngle, Speed.UndefinedSpeed, t1, 0, "?", "?", DateTime.Date0, 62 | "?", DateTime.Date0) 63 | val fpos2 = FlightState(id, cs, GeoPosition.undefinedPos, Speed 64 | .UndefinedSpeed, 65 | Angle.UndefinedAngle, Speed.UndefinedSpeed, t2, 0, "?", "?", DateTime.Date0, 66 | "?", DateTime.Date0) 67 | val fpos3 = FlightState(id, cs, GeoPosition.undefinedPos, Speed 68 | .UndefinedSpeed, 69 | Angle.UndefinedAngle, Speed.UndefinedSpeed, t3, 0, "?", "?", DateTime.Date0, 70 | "?", DateTime.Date0) 71 | 72 | "AllFlightSfdpsOrderTCMonitor" must { 73 | "check if sfdps messages for a flight are received " + 74 | "in the right order" in { 75 | val monitor = new FlightMsgOrder_Monitor(emptyConfig) 76 | 77 | monitor.verify(fpos1) 78 | monitor.verify(fpos2) 79 | monitor.verify(fpos3) 80 | 81 | monitor.getMonitorResult.numberOfErrors should be(0) 82 | } 83 | } 84 | 85 | "AllFlightSfdpsOrderTCMonitor" must { 86 | "report an error when sfdps messages for a flight are not " + 87 | "received in the right order" in { 88 | val monitor = new FlightMsgOrder_Monitor(emptyConfig) 89 | 90 | monitor.verify(fpos2) 91 | monitor.verify(fpos3) 92 | monitor.verify(fpos1) 93 | 94 | monitor.getMonitorResult.numberOfErrors should be(1) 95 | } 96 | } 97 | 98 | val config: Config = ConfigFactory.parseString( 99 | s"""{ 100 | cs = "$cs" 101 | }""") 102 | 103 | "SingleFlightMsgOrder_Monitor" must { 104 | "check if sfdps messages for a flight are received " + 105 | "in the right order" in { 106 | val monitor = new SingleFlightMsgOrder_Monitor(config) 107 | 108 | monitor.verify(fpos1) 109 | monitor.verify(fpos2) 110 | monitor.verify(fpos3) 111 | 112 | monitor.getMonitorResult.numberOfErrors should be(0) 113 | } 114 | } 115 | 116 | "SingleFlightMsgOrder_Monitor" must { 117 | "report an error when sfdps messages for a flight are not " + 118 | "received in the right order" in { 119 | val monitor = new SingleFlightMsgOrder_Monitor(config) 120 | 121 | monitor.verify(fpos2) 122 | monitor.verify(fpos3) 123 | monitor.verify(fpos1) 124 | 125 | monitor.getMonitorResult.numberOfErrors should be(1) 126 | } 127 | } 128 | } 129 | -------------------------------------------------------------------------------- /papers/mesa-nasa-report-2020.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NASA-SW-VnV/mesa/c06bf89de9427a376eb355f1be3ebc4a519add35/papers/mesa-nasa-report-2020.pdf -------------------------------------------------------------------------------- /papers/mesa-rv-2020.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NASA-SW-VnV/mesa/c06bf89de9427a376eb355f1be3ebc4a519add35/papers/mesa-rv-2020.pdf -------------------------------------------------------------------------------- /papers/sttt-mesa-2023.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NASA-SW-VnV/mesa/c06bf89de9427a376eb355f1be3ebc4a519add35/papers/sttt-mesa-2023.pdf -------------------------------------------------------------------------------- /project/Commands.scala: -------------------------------------------------------------------------------- 1 | import sbt._ 2 | 3 | import org.apache.commons.io.FileUtils 4 | 5 | /** Used to define sbt commands. 6 | * 7 | * TODO - use the value of the sbt property "sbt.global.base" to build "path" 8 | * instead of hardcoding. 9 | */ 10 | object Commands { 11 | 12 | /** Defines the command "staging-clean" used to clean up the content of 13 | * "staging" dir in ~/.sbt. 14 | * 15 | * The Daut and TraceContract are cloned from github and built as part of 16 | * MESA build.sbt. Once they are cloned, they do not get updated in 17 | * subsequent build. To enforce update, one needs to execute this sbt 18 | * command to delete the existing copies which makes build.sbt to re-clone 19 | * them. 20 | */ 21 | def stagingClean = Command.command("staging-clean") { 22 | state => { 23 | val path = sys.env("HOME") + "/.sbt/1.0/staging" 24 | 25 | val dir = new File(path) 26 | for (file <- dir.listFiles) { 27 | if (file.isDirectory) FileUtils.deleteDirectory(file) 28 | else file.delete 29 | } 30 | } 31 | state 32 | } 33 | 34 | val stagingCmds = Seq(stagingClean) 35 | } 36 | -------------------------------------------------------------------------------- /project/Dependencies.scala: -------------------------------------------------------------------------------- 1 | import sbt._ 2 | 3 | object Dependencies { 4 | lazy val latestVersion = "latest.release" 5 | lazy val raceVersion = "1.8.1" 6 | 7 | val typesafeConfig = "com.typesafe" % "config" % "1.4.1" 8 | 9 | val akkaVersion = "2.6.4" //"2.6.9 in race 10 | val akkaOrg = "com.typesafe.akka" 11 | 12 | val akkaActor = akkaOrg %% "akka-actor" % akkaVersion 13 | val akkaTestkit = akkaOrg %% "akka-testkit" % akkaVersion 14 | 15 | //--- scalaTest 16 | val scalaTest = "org.scalatest" %% "scalatest" % "3.3.0-SNAP2" //(?) % "test" ?? % Test //"3.1.0-SNAP13" 17 | val flexmarkAll = "com.vladsch.flexmark" % "flexmark-all" % "0.35.10" // should be a scalaTest dependency but 3.1.0-SNAP13 is missing it 18 | val scalaTestPlus = "org.scalatestplus" %% "scalatestplus-scalacheck" % "3.1.0.0-RC2" //"1.0.0-SNAP8" 19 | 20 | val scalaCheck = "org.scalacheck" %% "scalacheck" % "1.14.3" % Test 21 | 22 | val jodaTime = "joda-time" % "joda-time" % "2.10.1" 23 | 24 | //--- dependencies to RACE sub-projects 25 | val raceCore = "gov.nasa.race" %% "race-core" % raceVersion 26 | val raceNetJms = "gov.nasa.race" %% "race-net-jms" % raceVersion 27 | val raceAir = "gov.nasa.race" %% "race-air" % raceVersion 28 | val raceWwAir = "gov.nasa.race" %% "race-ww-air" % raceVersion 29 | val raceWw = "gov.nasa.race" %% "race-ww" % raceVersion 30 | val raceTestKit = "gov.nasa.race" %% "race-testkit" % raceVersion 31 | 32 | //--- dependencies to DSLs used for specification 33 | val daut = "git://github.com/havelund/daut.git#master" 34 | val tracecontract = "git://github.com/havelund/tracecontract.git#master" 35 | } -------------------------------------------------------------------------------- /project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version = 1.7.1 -------------------------------------------------------------------------------- /project/plugins.sbt: -------------------------------------------------------------------------------- 1 | logLevel := Level.Warn 2 | 3 | // library packaging: https://github.com/sbt/sbt-native-packager 4 | addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.3.10") -------------------------------------------------------------------------------- /script/mesa: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # exit if there is argument provided 4 | if [ $# -eq 0 ]; then 5 | echo "No argument is provided. Please provide a configuration file." 6 | exit 1 7 | fi 8 | 9 | SOURCE="${BASH_SOURCE[0]}" 10 | echo $SOURCE 11 | if [ -h "$SOURCE" ]; then 12 | SOURCE="$(readlink "$SOURCE")" 13 | fi 14 | DIR="$(dirname $SOURCE)" 15 | 16 | # set this to the script generated by sbt-native-packager after staging 17 | SCRIPT=$DIR/../target/universal/stage/bin/mesa 18 | 19 | # workaround for JOGL 20 | export JAVA_OPTS="$JAVA_OPTS --add-opens java.desktop/sun.awt=ALL-UNNAMED" 21 | 22 | # workaround for Java fullscreen support on mac machines 23 | if [[ "$OSTYPE" == darwin* ]]; then 24 | export JAVA_OPTS="$JAVA_OPTS --add-opens java.desktop/com.apple.eawt=ALL-UNNAMED" 25 | fi 26 | 27 | if [ -x $SCRIPT ]; then 28 | $SCRIPT $@ 29 | else 30 | echo "Script $SCRIPT does not exist. Please run sbt stage" 31 | fi 32 | 33 | --------------------------------------------------------------------------------