From 308dd2a96dac68e3399d948193a4c1386289809d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Fuch=C3=9F?= Date: Tue, 5 Aug 2025 12:43:20 +0200 Subject: [PATCH 1/4] Cleanup repository Remove old versions. Unify naming. Move diagrams to text. --- README.md | 12 +- bigbluebutton/diagrams_2015/README.md | 1 - .../diagrams_2015/bbb-arch-overview.png | Bin 32898 -> 0 bytes bigbluebutton/diagrams_2021/README.md | 1 - .../goldstandard_sad_2015-sam_2021.csv | 35 - .../goldstandard_sad_2015-sam_2021_UME.csv | 5 - ...son => goldstandard_sad_diagram_2021.json} | 0 .../goldstandard_sad_id_2015.json | 453 ------ bigbluebutton/text_2015/README.md | 22 - .../text_2015/bigbluebutton_2015.txt | 71 - bigbluebutton/text_2021/README.md | 4 + .../bbb-arch-overview.png | Bin bigbluebutton/text_2021/bigbluebutton.txt | 68 +- .../text_2021/bigbluebutton_1SentPerLine.txt | 85 -- .../goldstandard_sad_2016-sam_2021.csv | 10 - .../goldstandard_sad_2016-sam_2021_UME.csv | 4 - jabref/text_2016/README.md | 16 - jabref/text_2016/jabref_2016.txt | 10 - ...son => goldstandard_sad_diagram_2016.json} | 0 .../ArchitectureWithCache.png | Bin teammates/diagrams_2015/README.md | 3 - .../diagrams_2015/highlevelArchitecture.png | Bin 32613 -> 0 bytes teammates/diagrams_2015/packageDiagram.png | Bin 33672 -> 0 bytes teammates/diagrams_2023/README.md | 5 - .../goldstandard_sad_2015-sam_2021.csv | 47 - .../goldstandard_sad_2015-sam_2021_UME.csv | 2 - ...son => goldstandard_sad_diagram_2021.json} | 0 .../goldstandard_sad_id_2015.json | 1316 ----------------- teammates/text_2015/README.md | 43 - teammates/text_2015/teammates_2015.txt | 185 --- teammates/text_2021/README.md | 9 + .../highlevelArchitecture.png | Bin .../packageDiagram.png | Bin teastore/diagrams_2018/README.md | 2 - .../goldstandard_sad_2018-sam_2020_A.csv | 31 - .../goldstandard_sad_2018-sam_2020_AB.csv | 61 - .../goldstandard_sad_2018-sam_2020_AB_UME.csv | 7 - .../goldstandard_sad_2018-sam_2020_B.csv | 31 - .../goldstandard_sad_2018-sam_2020_III.csv | 6 - ...son => goldstandard_sad_diagram_2018.json} | 0 teastore/text_2018/README.md | 22 - teastore/text_2018/teastore_2018_A.txt | 38 - teastore/text_2018/teastore_2018_AB.txt | 89 -- teastore/text_2018/teastore_2018_B.txt | 51 - teastore/text_2018/teastore_2018_III.txt | 23 - .../{diagrams_2018 => text_2020}/Overview.jpg | Bin teastore/text_2020/README.md | 5 + 47 files changed, 44 insertions(+), 2729 deletions(-) delete mode 100644 bigbluebutton/diagrams_2015/README.md delete mode 100644 bigbluebutton/diagrams_2015/bbb-arch-overview.png delete mode 100644 bigbluebutton/diagrams_2021/README.md delete mode 100644 bigbluebutton/goldstandards/goldstandard_sad_2015-sam_2021.csv delete mode 100644 bigbluebutton/goldstandards/goldstandard_sad_2015-sam_2021_UME.csv rename bigbluebutton/goldstandards/{goldstandard_sad_id_2021.json => goldstandard_sad_diagram_2021.json} (100%) delete mode 100644 bigbluebutton/goldstandards/goldstandard_sad_id_2015.json delete mode 100644 bigbluebutton/text_2015/README.md delete mode 100644 bigbluebutton/text_2015/bigbluebutton_2015.txt rename bigbluebutton/{diagrams_2021 => text_2021}/bbb-arch-overview.png (100%) delete mode 100644 bigbluebutton/text_2021/bigbluebutton_1SentPerLine.txt delete mode 100644 jabref/goldstandards/goldstandard_sad_2016-sam_2021.csv delete mode 100644 jabref/goldstandards/goldstandard_sad_2016-sam_2021_UME.csv delete mode 100644 jabref/text_2016/README.md delete mode 100644 jabref/text_2016/jabref_2016.txt rename mediastore/goldstandards/{goldstandard_sad_id_2016.json => goldstandard_sad_diagram_2016.json} (100%) rename mediastore/{diagrams_2016 => text_2016}/ArchitectureWithCache.png (100%) delete mode 100644 teammates/diagrams_2015/README.md delete mode 100644 teammates/diagrams_2015/highlevelArchitecture.png delete mode 100644 teammates/diagrams_2015/packageDiagram.png delete mode 100644 teammates/diagrams_2023/README.md delete mode 100644 teammates/goldstandards/goldstandard_sad_2015-sam_2021.csv delete mode 100644 teammates/goldstandards/goldstandard_sad_2015-sam_2021_UME.csv rename teammates/goldstandards/{goldstandard_sad_id_2023.json => goldstandard_sad_diagram_2021.json} (100%) delete mode 100644 teammates/goldstandards/goldstandard_sad_id_2015.json delete mode 100644 teammates/text_2015/README.md delete mode 100644 teammates/text_2015/teammates_2015.txt rename teammates/{diagrams_2023 => text_2021}/highlevelArchitecture.png (100%) rename teammates/{diagrams_2023 => text_2021}/packageDiagram.png (100%) delete mode 100644 teastore/diagrams_2018/README.md delete mode 100644 teastore/goldstandards/goldstandard_sad_2018-sam_2020_A.csv delete mode 100644 teastore/goldstandards/goldstandard_sad_2018-sam_2020_AB.csv delete mode 100644 teastore/goldstandards/goldstandard_sad_2018-sam_2020_AB_UME.csv delete mode 100644 teastore/goldstandards/goldstandard_sad_2018-sam_2020_B.csv delete mode 100644 teastore/goldstandards/goldstandard_sad_2018-sam_2020_III.csv rename teastore/goldstandards/{goldstandard_sad_id_2018.json => goldstandard_sad_diagram_2018.json} (100%) delete mode 100644 teastore/text_2018/README.md delete mode 100644 teastore/text_2018/teastore_2018_A.txt delete mode 100644 teastore/text_2018/teastore_2018_AB.txt delete mode 100644 teastore/text_2018/teastore_2018_B.txt delete mode 100644 teastore/text_2018/teastore_2018_III.txt rename teastore/{diagrams_2018 => text_2020}/Overview.jpg (100%) diff --git a/README.md b/README.md index 1b7ead9761..5bc3b81b1c 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,9 @@ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.6966831.svg)](https://doi.org/10.5281/zenodo.6966831) +> [!TIP] +> **This is not the version of the benchmark from the original ECSA 2022 paper. The original version is located at: https://doi.org/10.5281/zenodo.6966832** +> We also removed a lot of files that were not used anymore. See [#20](https://github.com/ardoco/benchmark/pull/20). + # Benchmark This repository contains a benchmark for traceability link recovery (TLR) between textual Software Architecture Documentation (SAD) and Software Architecture Models (SAM). It was initially published in the paper [Establishing a Benchmark Dataset for Traceability Link Recovery Between Software Architecture Documentation and Models](https://doi.org/10.1007/978-3-031-36889-9_30). @@ -13,19 +17,21 @@ Each project of the benchmark is structured as follows: * The folder `code` contains a code model. The version of the code is stated in a README.md next to the model. The model is an `ArDoCo Code Model`. The model can be loaded using the [ArDoCo Code Extractor](https://github.com/ArDoCo/Core/blob/main/stages/model-provider/src/main/java/edu/kit/kastel/mcse/ardoco/core/models/connectors/generators/code/CodeExtractor.java#L47). * The folder `text_` contains a documentation of the project. * The text file(s) in the project folder contains the SAD of the projects as plain text. -* The folder `diagrams_` contains the informal diagrams of the project. + * If available: contains the informal diagrams of the project. * The folder `goldstandards` contains all gold standards for the project. In the following, the `` refers to the year of the artifact. Additional classifiers are added to the end of the file names. You will find more information about these classifiers in the README of the respective project artifacts. * The file `goldstandard_sad_-sam_.csv` contains the traceability links between SAD and SAM. It links the model elements by id with the sentences by their number * The file `goldstandard_sad_-sam__UME.csv` contains all IDs of model elements that are contained in the model but not described in the text. * The file `goldstandard_sad__code_.csv` contains the traceability links between SAD and code models. * The file `goldstandard_sam_-code_.csv` is a gold standard for mapping the architecture elements and code elements. - * The file `goldstandard_sad_id_.json` contains the traceability links between SAD and informal diagrams. The JSON schema is specified in the [DiagramSchema](DiagramSchema.json) file. + * The file `goldstandard_sad_diagram_.json` contains the traceability links between SAD and informal diagrams. The JSON schema is specified in the [DiagramSchema](DiagramSchema.json) file. ## Using the benchmark In order to provide an easy approach to use the benchmark, we provide an example TLR approach called [Simple Tracelink Discovery (STD)](https://github.com/ArDoCo/SimpleTracelinkDiscovery/) that uses this benchmark in its [evaluation](https://github.com/ArDoCo/SimpleTracelinkDiscovery/tree/main/src/test/java/io/github/ardoco/simpletracelinkdiscovery/eval). -Therefore, the benchmark is linked to the STD repository via a [git subtree](https://github.com/ArDoCo/SimpleTracelinkDiscovery/tree/main/src/test/resources/benchmark). + +We suggest using *git subtree* to include the benchmark in your project: +`git subtree add --prefix destination-folder git@github.com:ardoco/benchmark.git <>` ## Projects diff --git a/bigbluebutton/diagrams_2015/README.md b/bigbluebutton/diagrams_2015/README.md deleted file mode 100644 index 919535ec59..0000000000 --- a/bigbluebutton/diagrams_2015/README.md +++ /dev/null @@ -1 +0,0 @@ -[Source](https://github.com/bigbluebutton/bigbluebutton.github.io/blob/25582d381a27557d5e308f30a6e94a603b7438ba/_posts/2015-04-04-09architecture.md) diff --git a/bigbluebutton/diagrams_2015/bbb-arch-overview.png b/bigbluebutton/diagrams_2015/bbb-arch-overview.png deleted file mode 100644 index 343384fe1b5af2f496b69e754e203a54dacfdeb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32898 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 remove all HTML5 Clients -* note 3: if webrtc !~ webrtc-sfu -> remove all webrtc-sfu - - -## Text Adaptation - -* Images were removed -* Captions were kept. A finalizing dot were added. - -## License -The [documentation of BBB](https://github.com/bigbluebutton/bigbluebutton.github.io/blob/25582d381a27557d5e308f30a6e94a603b7438ba/_posts/2015-04-04-09architecture.md) is licensed under LGPL. -Therefore, the text we extracted from their documentation is licensed according to the [license of BBB](https://bigbluebutton.org/open-source-project/open-source-license/) under LGPL. \ No newline at end of file diff --git a/bigbluebutton/text_2015/bigbluebutton_2015.txt b/bigbluebutton/text_2015/bigbluebutton_2015.txt deleted file mode 100644 index eea53cb5dd..0000000000 --- a/bigbluebutton/text_2015/bigbluebutton_2015.txt +++ /dev/null @@ -1,71 +0,0 @@ -High-level Architecture Overview. -The following diagram provides a high-level overview of the BigBlueButton architecture. -We'll break down each component below. -Client. -The Client is a Flash application which runs inside the browser. -The client connects to Red5 using RTMP (port 1935) or RTMPT (port 80) if needs to tunnel. -When it needs to connect using RTMPT, it connects through Nginx which proxies the connection to Red5. -The Client also uploads presentations to Web API. -Third-party Applications. -Every access to BigBlueButton comes through a front-end portal (we refer to as a third-party application). -BigBlueButton integrates Moodle, Wordpress, Canvas, Sakai, and others (see third-party integrations). -From a learning management system (LMS) such as Moodle, teachers can setup BigBlueButton rooms within their course and students can access the rooms and their recordings. -The BigBlueButton comes with some simple API demos, but you really want to use an existing front-end or develop your own using the BigBlueButton API. -Nginx. -Nginx proxies calls to different server side applications through port 80. -Nginx also allows Flash client to connect using RTMPT for users behind a firewall that prevents their client from connecting directly to Red5 on port 1935. -It also front-ends the Web API which runs on Tomcat7 listening on port 8080. -For users joining the voice conference using WebRTC, nginx proxies the WebRTC connection to FreeSWITCH. -Web API. -The Web API provides the integration endpoint for third-party applications -- such as Moodle, Wordpress, Canvas, Sakai, etc. -- to control the BigBlueButton server. -Presentation Conversion. -Uploaded presentations undergoes conversion process in order to be displayed in the Flash client. -If the uploaded file is an Office document, it gets converted into PDF using LibreOffice and then converted to SWF using SWFTools. -The conversion process is described later in this page. -Redis PubSub. -Redis PubSub provides a communication channel between different server side applications. -Redis DB. -When a meeting is recorded, all events are stored in Redis DB. -When the meeting ends, the Recording Processor will take all the recorded events as well as the different raw (PDF, WAV, FLV) files for processing. -Red5 Apps (Deskshare, Apps, Voice, Video). -We think Red5 rocks, and we use it as the core server for handling all the real-time interaction with the client. -The Apps is the main BigBlueButton application that handles users, chat, whiteboard, presentation information shared by all users in a meeting. -The Deskshare application allows the presenter to share the desktop. -The Voice application allows the user to call into the voice conference using a headset or join listen-only. -The Video application provides a user to share his/her webcam to the users in the meeting. -FreeSWITCH. -FreeSWITCH provides the voice conferencing capability in BigBlueButton. -Users are able to join the voice conference through the headset. -Users joining through Google Chrome or Mozilla Firefox are able to take advantage of higher quality audio by connecting using WebRTC. -FreeSWITCH can also be integrated with VOIP providers so that users who are not able to join using the headset will be able to call in using their phone. -BigBlueButton Apps. -BigBlueButton Apps is the main application that pulls together the different applications to provide real-time collaboration in the meeting. -It provides the list of users, chat, whiteboard, presentations in a meeting. -Below is a diagram of the different components of BigBlueButton Apps. -BigBlueButton Apps has several components for it to communicate externally. -It has components to receive (Red5ClientMessageReceiver) and send (Red5ClientMessageSender) to the Flash client. -It subscribes to messages from the Redis PubSub as well as publishes events to Redis. -The VoiceService components allows it to communicate to FreeSWITCH. -When a meeting is recorded, events are stored into the Redis DB. -The meeting business logic is in the MeetingActor. -This is where information about the meeting is stored and where all messages for a meeting is processed. -Joining a Voice Conference. -In BigBlueButton, a user can join the voice conference in several ways. -Users can join using Flash, WebRTC, or phone. -When joining through Flash, the user can choose to join listen-only or listen-and-talk. -Users joined with Chrome and Firefox are able to join using WebRTC. -WebRTC provides higher-quality and lower delay. -If FreeSWITCH is integrated with a VOIP provider, users are able to call in using their phone by dialing a number and pressing the conference number on their keypad. -Uploading a Presentation. -Uploaded presentations go through a conversion process in order to be displayed inside the Flash client. -When the uploaded presentation is an Office document, it needs to be converted into PDF using LibreOffice. -The PDF document is then converted in SWF using SWFTools. -There are times when a PDF page fails to convert to SWF. -In this case, an image snapshot of the page is taken using ImageMagick/GhostScript and the image is converted to PDF then to SWF. -The conversion process sends progress messages to the client through the Redis pubsub. -BigBlueButton Client. -BigBlueButton client runs inside the browser. -The main application is in Flash. -There are Javascript libraries that provides connection to FreeSWITCH, launch the desktop sharing applet, etc. -The Flash client connects to BigBlueButton App to send and receive messages. -The client internally uses a event bus for the components to talk to each other. \ No newline at end of file diff --git a/bigbluebutton/text_2021/README.md b/bigbluebutton/text_2021/README.md index 124d72aa4c..9fa642ef65 100644 --- a/bigbluebutton/text_2021/README.md +++ b/bigbluebutton/text_2021/README.md @@ -8,6 +8,10 @@ The text was taken from [https://docs.bigbluebutton.org/2.4/architecture.html (W * Images were removed * Captions were kept. A finalizing dot were added. +## Diagram + +[Source](http://web.archive.org/web/20230315102607/https://docs.bigbluebutton.org/2.4/architecture.html) + ## License The [documentation of BBB](https://docs.bigbluebutton.org/2.4/architecture.html) is licensed under LGPL. Therefore, the text we extracted from their documentation is licensed according to the [license of BBB](https://bigbluebutton.org/open-source-project/open-source-license/) under LGPL. diff --git a/bigbluebutton/diagrams_2021/bbb-arch-overview.png b/bigbluebutton/text_2021/bbb-arch-overview.png similarity index 100% rename from bigbluebutton/diagrams_2021/bbb-arch-overview.png rename to bigbluebutton/text_2021/bbb-arch-overview.png diff --git a/bigbluebutton/text_2021/bigbluebutton.txt b/bigbluebutton/text_2021/bigbluebutton.txt index d2411c272b..3859b385c4 100644 --- a/bigbluebutton/text_2021/bigbluebutton.txt +++ b/bigbluebutton/text_2021/bigbluebutton.txt @@ -1,23 +1,18 @@ High-level architecture. The following diagram provides a high-level view of how BigBlueButton's components work together. We'll break down each component in more detail below. - - HTML5 client. - -The HTML5 client is a single page, responsive web application that is built upon the following components: -React.js for rendering the user interface in an efficient manner, WebRTC for sending/receiving audio and video. -The HTML5 client connects directly with the BigBlueButton server over port 443 (SSL), from loading the BigBlueButton client to making a web socket connection. These connections are all handled by nginx. +The HTML5 client is a single page, responsive web application that is built upon the following components: React.js for rendering the user interface in an efficient manner, WebRTC for sending/receiving audio and video. +The HTML5 client connects directly with the BigBlueButton server over port 443 (SSL), from loading the BigBlueButton client to making a web socket connection. +These connections are all handled by nginx. The HTML5 server sits behind nginx. The HTML5 server is built upon Meteor.js in ECMA2015 for communication between client and server and upon MongoDB for keeping the state of each BigBlueButton client consistent with the BigBlueButton server. The MongoDB database contains information about all meetings on the server and, in turn, each client connected to a meeting. -Each user's client is only aware of the their meeting's state, such the user's public and private chat messages sent and received. The client side subscribes to the published collections on the server side. +Each user's client is only aware of the their meeting's state, such the user's public and private chat messages sent and received. +The client side subscribes to the published collections on the server side. Updates to MongoDB on the server side are automatically pushed to MiniMongo on the client side. The following diagram gives an overview of the architecture of the HTML5 client and its communications with the other components in BigBlueButton. - - Scalability of HTML5 server component. - BigBlueButton 2.2 used a single nodejs process for all client-side communication. This process would start to bottleneck (the nodejs process, running on a single CPU core, started to use 100% of the core). Because nodejs was running on a single CPU core, having a 16 or 32 CPU core server for BigBlueButton 2.2 failed to yield much additional scalability. @@ -25,10 +20,10 @@ BigBlueButton 2.3 moves away from a single nodejs process for bbb-html5 towards This means that bbb-html5 could use multiple CPU cores for processing messages and handling browser sessions (each nodejs process runs on a single CPU core). As of 2.3-alpha-7, bbb-html5 uses 2 "frontend" and two "backend" processes (this value is configurable in bbb-html5-with-roles.conf, see Configuration Files). A restart of BigBlueButton is required if you make changes to these files. -The breakdown of functionality between front-end and back-end is as follows: +The breakdown of functionality between front-end and back-end is as follows. Frontends receive the ValidateAuthTokenResp event to complete authentication. -Frontends collection subscription and publishing. -Frontends other DDP events including method calls to send events to akka-apps +Frontends collect subscriptions and publishers. +Frontends receive other DDP events including method calls to send events to akka-apps. Frontends handle completely the Streamer redis events: Cursor, Annotations, External video share. Frontends still require MeetingStarted and MeetingEnded events to create/destroy per-meeting event processing queues. Backends handle all the non-streamer events. @@ -38,84 +33,55 @@ ValidateAuthTokenResp is passed to backends as well, which is needed for the cas When you use sudo bbb-conf --setip or sudo bbb-conf --restart, bbb-conf will run /etc/bigbluebutton/bbb-conf/apply-config.sh between shutdown and restart of the BigBlueButton processes. In this way, you can change configuration values of BigBlueButton, or use some of the helper functions in apply-lib.sh. See "Automatically apply configuration changes on restart". - - BBB web. - -BigBlueButton web application is a Java-based application written in Scala. It implements the BigBlueButton API and holds a copy of the meeting state. +BigBlueButton web application is a Java-based application written in Scala. +It implements the BigBlueButton API and holds a copy of the meeting state. The BigBlueButton API provides a third-party integration (such as the BigBlueButtonBN plugin for Moodle) with an endpoint to control the BigBlueButton server. Every access to BigBlueButton comes through a front-end portal (we refer to as a third-party application). BigBlueButton integrates Moodle, Wordpress, Canvas, Sakai, and others (see third-party integrations). BigBlueButton comes with its own front-end called Greenlight. When using a learning management system (LMS) such as Moodle, teachers can setup BigBlueButton rooms within their course and students can access the rooms and their recordings. - -The BigBlueButton comes with some simple API demos. Regardless of which front-end you use, they all use the API under the hood. - - +The BigBlueButton comes with some simple API demos. +Regardless of which front-end you use, they all use the API under the hood. Redis PubSub. - Redis PubSub provides a communication channel between different applications running on the BigBlueButton server. - - Redis DB. - When a meeting is recorded, all events are stored in Redis DB. When the meeting ends, the Recording Processor will take all the recorded events as well as the different raw (PDF, WAV, FLV) files for processing. - - Apps akka. - BigBlueButton Apps is the main application that pulls together the different applications to provide real-time collaboration in the meeting. It provides the list of users, chat, whiteboard, presentations in a meeting. Below is a diagram of the different components of Apps Akka. The meeting business logic is in the MeetingActor. This is where information about the meeting is stored and where all messages for a meeting is processed. - - FSESL akka. - -We have extracted out the component that integrates with FreeSWITCH into it’s own application. This allows others who are using voice conference systems other than FreeSWITCH to easily create their own integration. Communication between apps and FreeSWITCH Event Socket Layer (fsels) uses messages through redis pubsub. - - +We have extracted out the component that integrates with FreeSWITCH into it’s own application. +This allows others who are using voice conference systems other than FreeSWITCH to easily create their own integration. +Communication between apps and FreeSWITCH Event Socket Layer (fsels) uses messages through redis pubsub. FreeSWITCH. - We think FreeSWITCH is an amazing piece of software for handling audio. FreeSWITCH provides the voice conferencing capability in BigBlueButton. Users are able to join the voice conference through the headset. Users joining through Google Chrome or Mozilla Firefox are able to take advantage of higher quality audio by connecting using WebRTC. FreeSWITCH can also be integrated with VOIP providers so that users who are not able to join using the headset will be able to call in using their phone. - - Kurento and WebRTC-SFU. - Kurento Media Server KMS is a media server that implements both SFU and MCU models. KMS is responsible for streaming of webcams, listen-only audio, and screensharing. The WebRTC-SFU acts as the media controller handling negotiations and to manage the media streams. - - Joining a voice conference. - A user can join the voice conference (running in FreeSWITCH) from the BigBlueButton HTML5 client or through the phone. When joining through the client, the user can choose to join Microphone or Listen Only, and the BigBlueButton client will make an audio connection to the server via WebRTC. WebRTC provides the user with high-quality audio with lower delay. - - Uploading a presentation. - Uploaded presentations go through a conversion process in order to be displayed inside the client. When the uploaded presentation is an Office document, it needs to be converted into PDF using LibreOffice. The PDF document is then converted into scalable vector graphics (SVG) via bbb-web. The conversion process sends progress messages to the client through the Redis pubsub. - - Presentation conversion flow. - The diagram below describes the flow of the presentation conversion. We take in consideration the configuration for enabling and disabling SWF, SVG and PNG conversion. -Then below the SVG conversion flow. It covers the conversion fallback. +Then below the SVG conversion flow. +It covers the conversion fallback. Sometimes we detect that the generated SVG file is heavy to load by the browser, we use the fallback to put a rasterized image inside the SVG file and make its loading light for the browser. - - Internal network connections. - The following diagram shows how the various components of BigBlueButton connect to each other via sockets. \ No newline at end of file diff --git a/bigbluebutton/text_2021/bigbluebutton_1SentPerLine.txt b/bigbluebutton/text_2021/bigbluebutton_1SentPerLine.txt deleted file mode 100644 index 024f78701d..0000000000 --- a/bigbluebutton/text_2021/bigbluebutton_1SentPerLine.txt +++ /dev/null @@ -1,85 +0,0 @@ -High-level architecture. -The following diagram provides a high-level view of how BigBlueButton's components work together. -We'll break down each component in more detail below. -HTML5 client. -The HTML5 client is a single page, responsive web application that is built upon the following components: React.js for rendering the user interface in an efficient manner, WebRTC for sending/receiving audio and video. -The HTML5 client connects directly with the BigBlueButton server over port 443 (SSL), from loading the BigBlueButton client to making a web socket connection. -These connections are all handled by nginx. -The HTML5 server sits behind nginx. -The HTML5 server is built upon Meteor.js in ECMA2015 for communication between client and server and upon MongoDB for keeping the state of each BigBlueButton client consistent with the BigBlueButton server. -The MongoDB database contains information about all meetings on the server and, in turn, each client connected to a meeting. -Each user's client is only aware of the their meeting's state, such the user's public and private chat messages sent and received. -The client side subscribes to the published collections on the server side. -Updates to MongoDB on the server side are automatically pushed to MiniMongo on the client side. -The following diagram gives an overview of the architecture of the HTML5 client and its communications with the other components in BigBlueButton. -Scalability of HTML5 server component. -BigBlueButton 2.2 used a single nodejs process for all client-side communication. -This process would start to bottleneck (the nodejs process, running on a single CPU core, started to use 100% of the core). -Because nodejs was running on a single CPU core, having a 16 or 32 CPU core server for BigBlueButton 2.2 failed to yield much additional scalability. -BigBlueButton 2.3 moves away from a single nodejs process for bbb-html5 towards multiple nodejs processes handling incoming messages from clients. -This means that bbb-html5 could use multiple CPU cores for processing messages and handling browser sessions (each nodejs process runs on a single CPU core). -As of 2.3-alpha-7, bbb-html5 uses 2 "frontend" and two "backend" processes (this value is configurable in bbb-html5-with-roles.conf, see Configuration Files). -A restart of BigBlueButton is required if you make changes to these files. -The breakdown of functionality between front-end and back-end is as follows: Frontends receive the ValidateAuthTokenResp event to complete authentication. -Frontends collection subscription and publishing. -Frontends other DDP events including method calls to send events to akka-apps Frontends handle completely the Streamer redis events: Cursor, Annotations, External video share. -Frontends still require MeetingStarted and MeetingEnded events to create/destroy per-meeting event processing queues. -Backends handle all the non-streamer events. -If more than one backend is running, bbb-web splits the load in round-robin fashion by assigning an instanceId. -So individual backends only process redis events for the meetings matching the associated instanceId. -ValidateAuthTokenResp is passed to backends as well, which is needed for the cases where you only have a backend, no frontends - for example dev environments that do not need to care about scaling. -When you use sudo bbb-conf --setip or sudo bbb-conf --restart, bbb-conf will run /etc/bigbluebutton/bbb-conf/apply-config.sh between shutdown and restart of the BigBlueButton processes. -In this way, you can change configuration values of BigBlueButton, or use some of the helper functions in apply-lib.sh. -See "Automatically apply configuration changes on restart". -BBB web. -BigBlueButton web application is a Java-based application written in Scala. -It implements the BigBlueButton API and holds a copy of the meeting state. -The BigBlueButton API provides a third-party integration (such as the BigBlueButtonBN plugin for Moodle) with an endpoint to control the BigBlueButton server. -Every access to BigBlueButton comes through a front-end portal (we refer to as a third-party application). -BigBlueButton integrates Moodle, Wordpress, Canvas, Sakai, and others (see third-party integrations). -BigBlueButton comes with its own front-end called Greenlight. -When using a learning management system (LMS) such as Moodle, teachers can setup BigBlueButton rooms within their course and students can access the rooms and their recordings. -The BigBlueButton comes with some simple API demos. -Regardless of which front-end you use, they all use the API under the hood. -Redis PubSub. -Redis PubSub provides a communication channel between different applications running on the BigBlueButton server. -Redis DB. -When a meeting is recorded, all events are stored in Redis DB. -When the meeting ends, the Recording Processor will take all the recorded events as well as the different raw (PDF, WAV, FLV) files for processing. -Apps akka. -BigBlueButton Apps is the main application that pulls together the different applications to provide real-time collaboration in the meeting. -It provides the list of users, chat, whiteboard, presentations in a meeting. -Below is a diagram of the different components of Apps Akka. -The meeting business logic is in the MeetingActor. -This is where information about the meeting is stored and where all messages for a meeting is processed. -FSESL akka. -We have extracted out the component that integrates with FreeSWITCH into it’s own application. -This allows others who are using voice conference systems other than FreeSWITCH to easily create their own integration. -Communication between apps and FreeSWITCH Event Socket Layer (fsels) uses messages through redis pubsub. -FreeSWITCH. -We think FreeSWITCH is an amazing piece of software for handling audio. -FreeSWITCH provides the voice conferencing capability in BigBlueButton. -Users are able to join the voice conference through the headset. -Users joining through Google Chrome or Mozilla Firefox are able to take advantage of higher quality audio by connecting using WebRTC. -FreeSWITCH can also be integrated with VOIP providers so that users who are not able to join using the headset will be able to call in using their phone. -Kurento and WebRTC-SFU. -Kurento Media Server KMS is a media server that implements both SFU and MCU models. -KMS is responsible for streaming of webcams, listen-only audio, and screensharing. -The WebRTC-SFU acts as the media controller handling negotiations and to manage the media streams. -Joining a voice conference. -A user can join the voice conference (running in FreeSWITCH) from the BigBlueButton HTML5 client or through the phone. -When joining through the client, the user can choose to join Microphone or Listen Only, and the BigBlueButton client will make an audio connection to the server via WebRTC. -WebRTC provides the user with high-quality audio with lower delay. -Uploading a presentation. -Uploaded presentations go through a conversion process in order to be displayed inside the client. -When the uploaded presentation is an Office document, it needs to be converted into PDF using LibreOffice. -The PDF document is then converted into scalable vector graphics (SVG) via bbb-web. -The conversion process sends progress messages to the client through the Redis pubsub. -Presentation conversion flow. -The diagram below describes the flow of the presentation conversion. -We take in consideration the configuration for enabling and disabling SWF, SVG and PNG conversion. -Then below the SVG conversion flow. -It covers the conversion fallback. -Sometimes we detect that the generated SVG file is heavy to load by the browser, we use the fallback to put a rasterized image inside the SVG file and make its loading light for the browser. -Internal network connections. -The following diagram shows how the various components of BigBlueButton connect to each other via sockets. \ No newline at end of file diff --git a/jabref/goldstandards/goldstandard_sad_2016-sam_2021.csv b/jabref/goldstandards/goldstandard_sad_2016-sam_2021.csv deleted file mode 100644 index caa166ec41..0000000000 --- a/jabref/goldstandards/goldstandard_sad_2016-sam_2021.csv +++ /dev/null @@ -1,10 +0,0 @@ -modelElementID,sentence -_MFIzMEl4Ee243f2e4VWs6w,2 -_He3LoEl4Ee243f2e4VWs6w,2 -_Coy0kEl4Ee243f2e4VWs6w,2 -_MFIzMEl4Ee243f2e4VWs6w,5 -_He3LoEl4Ee243f2e4VWs6w,6 -_MFIzMEl4Ee243f2e4VWs6w,6 -_Coy0kEl4Ee243f2e4VWs6w,6 -_Coy0kEl4Ee243f2e4VWs6w,7 -_MFIzMEl4Ee243f2e4VWs6w,9 diff --git a/jabref/goldstandards/goldstandard_sad_2016-sam_2021_UME.csv b/jabref/goldstandards/goldstandard_sad_2016-sam_2021_UME.csv deleted file mode 100644 index ea3a6b8218..0000000000 --- a/jabref/goldstandards/goldstandard_sad_2016-sam_2021_UME.csv +++ /dev/null @@ -1,4 +0,0 @@ -missingModelElementID -_EBiwMEl4Ee243f2e4VWs6w -_KsOfgEl4Ee243f2e4VWs6w -_NUdtEEl4Ee243f2e4VWs6w diff --git a/jabref/text_2016/README.md b/jabref/text_2016/README.md deleted file mode 100644 index 78ad72cc49..0000000000 --- a/jabref/text_2016/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# JabRef 2016 - -The text was taken from https://github.com/JabRef/jabref/blob/7c26856a492243a6a8d272dfb4a9054c47018bda/docs/high-level-documentation.md - -## Assumptions - -* For the goldstandard it was assumed, that the text still fits to the model from 2021. - -## Text Adaptation - - - - -## License - -The [documentation](https://github.com/JabRef/jabref/blob/7c26856a492243a6a8d272dfb4a9054c47018bda/docs/high-level-documentation.md) of JabRef is part of their [repository](https://github.com/JabRef/jabref/). -Therefore, the text we extracted from their documentation is licensed according to the [license of JabRef](https://github.com/JabRef/jabref/blob/main/LICENSE.md), i.e., MIT. \ No newline at end of file diff --git a/jabref/text_2016/jabref_2016.txt b/jabref/text_2016/jabref_2016.txt deleted file mode 100644 index b1ef7e296d..0000000000 --- a/jabref/text_2016/jabref_2016.txt +++ /dev/null @@ -1,10 +0,0 @@ -Describes relevant information about the code structure of JabRef in a very precise and succinct way. -We are currently transitioning from a spaghetti to an onion architecture with the model in the center, and the logic as an intermediate layer towards the gui which is the outer shell. -The dependencies are only directed towards the center. -We have JUnit tests to detect violations, and the build will fail automatically in these cases. -The model can only represent the most important data structures and has only a little bit of logic attached. -The logic is responsible for reading/writing/importing/exporting and manipulating the model, and it is structured often as an API the gui can call and use. -Only the gui knows the user and his preferences, and can interact with him to help him solve tasks. -For each onion layer, we form packages according to their responsibility, i.e., vertical structuring. -We use an event bus to publish events from the model to the other onion layers. -This allows us to keep the onion architecture but still react upon changes within the core in the outer layers. \ No newline at end of file diff --git a/mediastore/goldstandards/goldstandard_sad_id_2016.json b/mediastore/goldstandards/goldstandard_sad_diagram_2016.json similarity index 100% rename from mediastore/goldstandards/goldstandard_sad_id_2016.json rename to mediastore/goldstandards/goldstandard_sad_diagram_2016.json diff --git a/mediastore/diagrams_2016/ArchitectureWithCache.png b/mediastore/text_2016/ArchitectureWithCache.png similarity index 100% rename from mediastore/diagrams_2016/ArchitectureWithCache.png rename to mediastore/text_2016/ArchitectureWithCache.png diff --git a/teammates/diagrams_2015/README.md b/teammates/diagrams_2015/README.md deleted file mode 100644 index 51d37a52ea..0000000000 --- a/teammates/diagrams_2015/README.md +++ /dev/null @@ -1,3 +0,0 @@ -All images that were removed from the benchmark texts. Taken directly from [TEAMMATES Github Repo](https://github.com/TEAMMATES/teammates/tree/afb4b74677f4bf3d1e805fe59ad72a8d71a4ec34/src/main/webapp/dev/images) - -For the tracelinks subtext like "HTML, CSS.." in highlevelArchitecture.png was ignored. "UI (browser)" and "UI (server)" were grouped diff --git a/teammates/diagrams_2015/highlevelArchitecture.png b/teammates/diagrams_2015/highlevelArchitecture.png deleted file mode 100644 index 153eee5788aebb9085589d963ef6ac071ba385f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32613 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�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 I4dlcB2g43S<^TWy diff --git a/teammates/diagrams_2015/packageDiagram.png b/teammates/diagrams_2015/packageDiagram.png deleted file mode 100644 index f7835351a6401a216ec12d60e5f39a0969e3e89c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33672 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 is represented by the classes" -* "General: " was built in the text as introduction to the next sentence "In general, " -* "Access control: ", "API for creating entities:", "API for retrieving entitites:", "API for updating entities:", and "API for deleting entities:" were replaced by "To API for the following information are presented." -* "handles these:", "these:" were replaced by "the following." -* If packages began with a dot, an x was inserted before -* Tables like, "Normal: |---------acceptance tests----|---system tests----|-----integration tests-----|------unit tests---------| TEAMMATES: |---------manual testing-------------| ----automated UI tests----|---automated component tests---|" were removed. -* Sentences were added at the end of sentences, where necessary. -* Dots that should be commas (esp. in ".e.g., <...>") were replaced. -* quotation marks were removed. -* Stars were removed -* { were removed -* At "Protecting persistable objects:" the colon was replaced with a comma -* At "Note:" in floating text, the next sentence was introduced with "Note that [...]" -* If it would not lead to a semantic change, colons in sentences were removed. Otherwise there were replaced by "are"/ "is"/ "is that"/ ... -* In case of "##TestDriver This component [..]", the "This" was replaced with "The TestDriver". - -## License - -The documentation of TEAMMATES is part of their [repository](https://github.com/TEAMMATES/teammates). -Therefore, the text we extracted from their documentation is licensed according to the [license of TEAMMATES](https://github.com/TEAMMATES/teammates/blob/master/LICENSE) under GPL-2.0. - diff --git a/teammates/text_2015/teammates_2015.txt b/teammates/text_2015/teammates_2015.txt deleted file mode 100644 index 0558979118..0000000000 --- a/teammates/text_2015/teammates_2015.txt +++ /dev/null @@ -1,185 +0,0 @@ -TEAMMATES is a Web app that runs on Google App Engine (GAE) cloud platform. -Given above is an overview of the main components. -The UI seen by users consists of Web pages containing HTML, CSS (for styling) and JavaScripts (for client-side interactions such as sorting, input validation etc.). -This UI is generated by Java Server Pages (JSP) and Java Servlets residing on the server. -Requests are sent to the server over normal HTTP. -In future, AJAX may be used sparingly to fetch data from the server asynchronously. -The main logic of the app is in Java POJOs (Plain Old Java Objects). -Some automated tasks are implemented as Servlets. -Storage uses the persistence framework provided by GAE datastore, a noSQL database. -TEAMMATES makes heavy use of automated regression testing. -TestNG is used for Java unit testing and QUnit for JavaScript unit testing. -We use Selenium Web Driver to automate UI testing. -Test Driver can access the application directly to set up test data. -We use JSON format to transmit such data to the application. -The Client component can connect to the back end directly without using a Browser. -It is used for administrative purposes, e.g., migrating data to a new schema. -The Common component contains utility code used across the application. -The diagram below shows how the code is organized into packages inside each component and dependencies among them. -There are some things to note. -logic, ui.view, ui.controller represent an application of Model-View-Controller pattern. -ui.view and ui.website packages are not Java packages. -They consist of jsp, html, js and css files. -The diagram below shows the object structure of the UI component. -Request from the Browser for a specific page will go through following steps. -First, request received by the GAE server. -Second, custom filters are applied according to the order specified in web.xml. -In our case this would be DatastoreFilter and LoginFilter. -For example, the LoginFilter will forward any request from not-logged-in users to the login page. -If the request is from logged in user, then it will proceed according to the URL, e.g. /page/instructorHomePage. -Third, request forwarded to the ControllerServlet. -Fourth, controllerServlet uses the ActionFactory to generate the matching Action object, e.g., InstructorHomePageAction. -Fifth, controllerServlet executes the action. -Sixth, the Action object checks the access rights of the user. -If the action is allowed, it interacts with the Logic component to perform the action. -Seventh, assuming the action was loading a page, the Action gathers the data required for the page into a PageData object, e.g. InstructorHomePageData, creates a ShowPageResult object by enclosing the PageData object created previously, and returns it to the ControllerServlet. -Eighth, controllerServlet sends the result. -In the case of a ShowPageResult, this is equivalent to forwarding to the matching JSP page. -Ninth, the JSP page uses the data in the given PageData object to generate the HTML page. -Tenth, the response will then be sent back to the Browser, which will render the page. -There are some things to note. -After performing certain actions, the Browser should load another page, possibly with the status of the previous action. -For example, if the action is delete course, the Browser should load the courses page after the server performed the action. -In such cases, the result generated for the action will be of type RedirectResult which simply instructs the Browser to send a fresh request for the specified page. -In such cases, we do not create a PageData object for the original request. -For example, a browser request for delete course action. -Server performs the action (creates a RedirectResult object but no PageData object) and instructs the Browser to load the courses page. -As instructed, the Browser requests for the courses page. -Server processes the request separately (creates a ShowPageResult object but no PageData object) and returns the courses page. -The result of some actions is downloading of a file (e.g. an evaluation report). -In such cases, the result type will be FileDownloadResult and no PageData object will be generated. -Since the high-level workflow of processing a request is same for any request, we use the, the Template Method pattern to abstract the process folow into the Action class. -The list of actions and corresponding URIs are listed in the ActionURIs nested class of the Const class. -The list of pages and corresponding URIs are listed in the ViewURIs nested class of the Const class. -The UI consist of product pages (functional), product pages (peripheral), website pages, project pages. -Product pages (functional), e.g., courses page. -These require login. -Product pages (peripheral), e.g., help pages, error pages, etc. -Website pages are the static pages of the product website, e.g., contact.html. -Project pages meant for developers, such as this page. -The Logic component handles the business logic of TEAMMATES. -It is accessible via a thin facade class called Logic which makes use of several Logic classes to handle the logic related to various types of data and to access data from the Storage component. -In particular, Logic is responsible for the following. -Managing relationships between entities, e.g., cascade logic for create/update/delete. -Managing transactions, e.g., to ensure atomicity of a transaction. -Sanitizing input values recevied from the UI component. -Providing a mechanims for checking access control rights. -Package overview contains logic.api, logic.backdoor, logic.core, logic.automated. -logic.api provides the normal API of the component. -logic.backdoor provides a mechanism for the test driver to access data. -logic.core contains the core logic of the system. -logic.automated contains the logic of automated tasks. -Logic API is represented by the classes Logic, GateKeeper, BackDoorLogic. -Logic is used for the use of the UI. -Logic class acts as a facade between UI (servlets) and the backend of the app. -GateKeeper is used for the use of the UI. -To check the access rights of a user for a given action. -BackDoorLogic is used for the use of TestDriver (via BackDoorServlet). -In general, null values should not be used as parameters to this API, except when following the KeepExisting policy (explained later). -To access control the following information are presented. -Although this component provides methods to perform access control, it API itself is not access controlled. -The UI is expected to check access control (using GateKeeper class) before calling a method in the Logic. -However, calls received by BackDoorServlet are authenticated using the backdoor key. -Backdoor key is a string known only to the person who deployed the app (typically, the administrator). -To API for creating entities the following information are presented. -Null parameters causes an assertion failure. -Invalid parameters throws InvalidParametersException. -Entity already exists throws EntityAlreadyExists exception (escalated from Storage level). -When creating Evaluations, Submission entities are automatically created at the time of creating an evaluation or changing the team structure of a course. -To API for retrieving entities the following information are presented. -Attempting to retrieve objects using null parameters causes an assertion failure. -Entity not found returns null if the target entity not found. -This way, read operations can be used easily for checking the existence of an entity. -Throws EntityDoesNotExistsExeption if a parent entity of a target entity is not found e.g., trying to list students of a non-existent course. -To API for updating entities the following information are presented. -Primary keys cannot be edited except Student.email. -KeepExistingPolicy is that the new value of an optional attribute is specified as null or set to Uninitialized, the existing value will prevail. -This is not a good policy. -To be reconsidered. -Null parameters throws an assertion error if that parameter cannot be null. -Optional attributes follow KeepExistingPolicy. -Entity not found throws EntityDoesNotExistException exception. -Invalid parameters throws InvalidParametersException. -To API for deleting entities the following information are presented. -Null parameters are not expected. -Results in assertion failure. -The following explains the FailDeleteSilentlyPolicy. -In general, delete operation do not throw exceptions if the target entity does not exist. -Instead, it logs a warning. -This is because if it does not exist, it is as good as deleted. -The following explains the Cascade policy. -When a parent entity is deleted, entities that have referential integrity with the deleted entity should also be deleted. -Refer to the API for the cascade logic. -The Storage component performs CRUD (Create, Read, Update, Delete) operations on data entities individually. -Package overview contains storage.api, storage.entity, storage.datastore. -storage.api provides the normal API of the component. -storage.entity classes that represent persistable entities. -storage.datastore classes for dealing with the datastore. -Storage contains minimal logic beyond what is directly relevant to CRUD operations. -In particular, it handles the following. -Validating data inside entities before creating/updating them, to ensure they are in a valid state. -Hiding the complexities of datastore from the Logic component. -All GQL queries are to be contained inside the Storage component. -Protecting persitable objects, classes in the storage.entity package are not visible outside this component to prevent accidental modification to the entity's attributes. -(Since these classes have been marked as persistence capable, and changes to their attributes are automatically persisted to the datastore by default). -Instead, a corresponding non-persistent data transfer object named Attributes (e.g., CourseAttributes is the data transfer object for Course entities) object is returned, where values can be modified easily without any impact on the persistent data copy. -These datatransfer classes are in common.datatransfer package explained later. -Note that this decision was taken before GAE started supporting the ability to detach entities to prevent accidental modifications to persistable data. -The decision to use data transfer objects is to be reconsidered in the future. -The Storage component will not perform any cascade delete/create operations. -Cascade logic is currently handled by the Logic component. -Note that the navigability of the association links between entity objects appear to be in the reverse direction of what we see in a normal OOP design. -This is because we want to keep the data scheme flexible so that new entity types can be added later with minimal modifications to existing elements. -Add and Delete operations try to wait until data is persisted in the datastore before returning. -This is not enough to compensate for eventual consistency involving multiple servers in the GAE production enviornment. -However, it is expected to avoid test failures caused by eventual consistency in dev server and reduce such problems in the live server. -Note that Eventual consistency here means it takes some time for a database operation to propagate across all serves of the Google's distributed datastore. -As a result, the data may be in an inconsistent states for short periods of time although things should become consistent eventually. -For example, an object we deleted may appear to still exist for a short while. -Implementation of Transaction Control has been decided against due to limitations of GAE environment and the nature of our data schema. -Please see TEAMMATES Decision Analysis document for more information. -In general, if Null is passed as a parameter, the corresponding value is NOT modified, as per the KeepExistingPolicy that was previously mentioned. -To API for creating the following information are presented. -Attempt to create an entity that already exists throws EntityAlreadyExists exception. -Attempt to create an entity with invalid data throws InvalidParametersException. -To API for retrieving the following information are presented. -Attempt to retrieve an entity that does not exist returns null. -To API for updating the following information are presented. -Attempt to update an entity that does not exist throws EntityDoesNotExistException. -Attempt to update an entity with invalid data throws InvalidParametersException. -To API for deleting the following information are presented. -Attempt to delete an entity that does not exist fails silently. -The Common component contains common utilities used across TEAMMATES. -Package overview contains common.util, common.exceptions, common.datatransfer. -common.util contains utility classes. -common.exceptions contains custom exceptions. -common.datatransfer containts data transfer objects. -Given below are some more information about this package. -common.datatransfer package contains lightweight data transfer object classes for transferring data among components. -They can be combined in various ways to transfer structured data between components. -Given below are three examples. -Test Driver can use the DataBundle in this manner to send an arbitrary number of objects to be persisted in the database. -This structure can be used to transfer data of a course (e.g., when constructing the home page for an instructor). -This structure can be used to send results of an evaluation (e.g., when showing an evaluation report to an instructor). -For convenience, these classes use public variables for data. -This is not a good practice as it contravenes OO principle of information hiding and increases the risk of inconsistent data. -This strategy is to be reconsidered at a later date. -The TestDriver component automates the testing of TEAMMATES. -Package overview contains test.driver, test.pageobjects, test.cases, and subpackages. -test.driver contains infrastructure need for running the test driver. -test.pageobjects contains abstractions of the pages as the appear on a Browser (i.e. SUTs). -test.cases contains test cases. -Sub packages contains x.cases.testdriver, x.cases.browsertests, x.cases.common, x.cases.logic, x.cases.storage. -x.cases.driver contains component test cases for testing test driver infrastructure. -x.cases.browsertests contains system test cases for testing the UI. -x.cases.common contains component test cases for testing the Common component. -x.cases.logic contains component test cases for testing the Logic component. -x.cases.storage contains component test cases for testing the Storage component. -There are some things to note. -Some component tests are pure unit tests (i.e., test one component in isolation) while others are integration tests that tests units as well as integration of units with each other. -AllJsTests.java (implemented as a UI test) is for unit testing JavaScript code. -This is how TEAMMATES testing maps to standard types of testing. -The Client component contains scripts that can connect to the application backend for things such as migrating data and calculating statistics. -Package overview contains client.remoteapi, client.scripts. -client.remoteapi contains classes needed to connect to the backend directly. -client.scripts contains scripts that do things with the back end data. \ No newline at end of file diff --git a/teammates/text_2021/README.md b/teammates/text_2021/README.md index 515e7096f5..3ace34af97 100644 --- a/teammates/text_2021/README.md +++ b/teammates/text_2021/README.md @@ -33,6 +33,15 @@ Thereby, the text became more readable and easier to understand. * If it would not lead to a semantic change, colons in sentences were removed. Otherwise there were replaced by "are"/ "is"/ "is that"/ ... * In case of "##TestDriver This component [..]", the "This" was replaced with "The TestDriver". +## Diagram (originally taken from 2023) + +Taken directly from [TEAMMATES Design Page](https://teammates.github.io/teammates/design.html) + +This is traced to the 2021 text fragment. + +For the tracelinks subtext like "HTML, CSS.." in highlevelArchitecture.png was ignored. "UI (browser)" and "UI (server)" were grouped + + ## License diff --git a/teammates/diagrams_2023/highlevelArchitecture.png b/teammates/text_2021/highlevelArchitecture.png similarity index 100% rename from teammates/diagrams_2023/highlevelArchitecture.png rename to teammates/text_2021/highlevelArchitecture.png diff --git a/teammates/diagrams_2023/packageDiagram.png b/teammates/text_2021/packageDiagram.png similarity index 100% rename from teammates/diagrams_2023/packageDiagram.png rename to teammates/text_2021/packageDiagram.png diff --git a/teastore/diagrams_2018/README.md b/teastore/diagrams_2018/README.md deleted file mode 100644 index 18a5f941eb..0000000000 --- a/teastore/diagrams_2018/README.md +++ /dev/null @@ -1,2 +0,0 @@ -1. Extracted with PDF24 from the teastore paper as 300 DPI 100% quality pdf -2. Cropped with Windows Photo Viewer diff --git a/teastore/goldstandards/goldstandard_sad_2018-sam_2020_A.csv b/teastore/goldstandards/goldstandard_sad_2018-sam_2020_A.csv deleted file mode 100644 index 60be1e04c6..0000000000 --- a/teastore/goldstandards/goldstandard_sad_2018-sam_2020_A.csv +++ /dev/null @@ -1,31 +0,0 @@ -modelElementID,sentence -_dhM6oDVXEeqPG_FgW3bi6Q,1 -_dhM6oDVXEeqPG_FgW3bi6Q,2 -_bC13QDVWEeqPG_FgW3bi6Q,3 -_yA04AKTKEeqKjI323B3R3w,3 -_AiuxcDVdEeqPG_FgW3bi6Q,3 -_lnx1oDVWEeqPG_FgW3bi6Q,3 -_m3fxEDVWEeqPG_FgW3bi6Q,3 -_yA04AKTKEeqKjI323B3R3w,4 -_m3fxEDVWEeqPG_FgW3bi6Q,4 -_lnx1oDVWEeqPG_FgW3bi6Q,4 -_yA04AKTKEeqKjI323B3R3w,6 -_m3fxEDVWEeqPG_FgW3bi6Q,6 -_AiuxcDVdEeqPG_FgW3bi6Q,7 -_bC13QDVWEeqPG_FgW3bi6Q,7 -_lnx1oDVWEeqPG_FgW3bi6Q,7 -_dhM6oDVXEeqPG_FgW3bi6Q,15 -_dhM6oDVXEeqPG_FgW3bi6Q,16 -_dhM6oDVXEeqPG_FgW3bi6Q,18 -_bC13QDVWEeqPG_FgW3bi6Q,26 -_bC13QDVWEeqPG_FgW3bi6Q,27 -_lnx1oDVWEeqPG_FgW3bi6Q,27 -_yA04AKTKEeqKjI323B3R3w,28 -_bC13QDVWEeqPG_FgW3bi6Q,32 -_AiuxcDVdEeqPG_FgW3bi6Q,32 -_lnx1oDVWEeqPG_FgW3bi6Q,33 -_bC13QDVWEeqPG_FgW3bi6Q,34 -_m3fxEDVWEeqPG_FgW3bi6Q,34 -_m3fxEDVWEeqPG_FgW3bi6Q,35 -_bC13QDVWEeqPG_FgW3bi6Q,37 -_yA04AKTKEeqKjI323B3R3w,37 diff --git a/teastore/goldstandards/goldstandard_sad_2018-sam_2020_AB.csv b/teastore/goldstandards/goldstandard_sad_2018-sam_2020_AB.csv deleted file mode 100644 index bdd05aa5db..0000000000 --- a/teastore/goldstandards/goldstandard_sad_2018-sam_2020_AB.csv +++ /dev/null @@ -1,61 +0,0 @@ -modelElementID,sentence -_dhM6oDVXEeqPG_FgW3bi6Q,1 -_dhM6oDVXEeqPG_FgW3bi6Q,2 -_bC13QDVWEeqPG_FgW3bi6Q,3 -_yA04AKTKEeqKjI323B3R3w,3 -_AiuxcDVdEeqPG_FgW3bi6Q,3 -_lnx1oDVWEeqPG_FgW3bi6Q,3 -_m3fxEDVWEeqPG_FgW3bi6Q,3 -_yA04AKTKEeqKjI323B3R3w,4 -_m3fxEDVWEeqPG_FgW3bi6Q,4 -_lnx1oDVWEeqPG_FgW3bi6Q,4 -_yA04AKTKEeqKjI323B3R3w,6 -_m3fxEDVWEeqPG_FgW3bi6Q,6 -_AiuxcDVdEeqPG_FgW3bi6Q,7 -_bC13QDVWEeqPG_FgW3bi6Q,7 -_lnx1oDVWEeqPG_FgW3bi6Q,7 -_dhM6oDVXEeqPG_FgW3bi6Q,15 -_dhM6oDVXEeqPG_FgW3bi6Q,16 -_dhM6oDVXEeqPG_FgW3bi6Q,18 -_bC13QDVWEeqPG_FgW3bi6Q,26 -_bC13QDVWEeqPG_FgW3bi6Q,27 -_lnx1oDVWEeqPG_FgW3bi6Q,27 -_yA04AKTKEeqKjI323B3R3w,28 -_bC13QDVWEeqPG_FgW3bi6Q,32 -_AiuxcDVdEeqPG_FgW3bi6Q,32 -_lnx1oDVWEeqPG_FgW3bi6Q,33 -_bC13QDVWEeqPG_FgW3bi6Q,34 -_m3fxEDVWEeqPG_FgW3bi6Q,34 -_m3fxEDVWEeqPG_FgW3bi6Q,35 -_bC13QDVWEeqPG_FgW3bi6Q,37 -_yA04AKTKEeqKjI323B3R3w,37 -_dhM6oDVXEeqPG_FgW3bi6Q,39 -_bC13QDVWEeqPG_FgW3bi6Q,41 -_yA04AKTKEeqKjI323B3R3w,42 -_lnx1oDVWEeqPG_FgW3bi6Q,42 -_bC13QDVWEeqPG_FgW3bi6Q,43 -_lnx1oDVWEeqPG_FgW3bi6Q,43 -_bC13QDVWEeqPG_FgW3bi6Q,44 -_bC13QDVWEeqPG_FgW3bi6Q,45 -_yA04AKTKEeqKjI323B3R3w,46 -_bC13QDVWEeqPG_FgW3bi6Q,46 -_yA04AKTKEeqKjI323B3R3w,48 -_yA04AKTKEeqKjI323B3R3w,49 -_lnx1oDVWEeqPG_FgW3bi6Q,52 -_AiuxcDVdEeqPG_FgW3bi6Q,53 -_AiuxcDVdEeqPG_FgW3bi6Q,58 -_m3fxEDVWEeqPG_FgW3bi6Q,59 -_m3fxEDVWEeqPG_FgW3bi6Q,61 -_lnx1oDVWEeqPG_FgW3bi6Q,61 -_m3fxEDVWEeqPG_FgW3bi6Q,62 -_m3fxEDVWEeqPG_FgW3bi6Q,63 -_m3fxEDVWEeqPG_FgW3bi6Q,64 -_m3fxEDVWEeqPG_FgW3bi6Q,65 -_lnx1oDVWEeqPG_FgW3bi6Q,65 -_lnx1oDVWEeqPG_FgW3bi6Q,69 -_lnx1oDVWEeqPG_FgW3bi6Q,71 -_lnx1oDVWEeqPG_FgW3bi6Q,72 -_lnx1oDVWEeqPG_FgW3bi6Q,74 -_lnx1oDVWEeqPG_FgW3bi6Q,75 -_dhM6oDVXEeqPG_FgW3bi6Q,77 -_dhM6oDVXEeqPG_FgW3bi6Q,79 diff --git a/teastore/goldstandards/goldstandard_sad_2018-sam_2020_AB_UME.csv b/teastore/goldstandards/goldstandard_sad_2018-sam_2020_AB_UME.csv deleted file mode 100644 index b767de6eb3..0000000000 --- a/teastore/goldstandards/goldstandard_sad_2018-sam_2020_AB_UME.csv +++ /dev/null @@ -1,7 +0,0 @@ -missingModelElementID -_YkXeIDVgEeqPG_FgW3bi6Q -_kgbngDVgEeqPG_FgW3bi6Q -_ouzFYDVgEeqPG_FgW3bi6Q -_raxjcDVgEeqPG_FgW3bi6Q -_iaElgKpwEeqHXcsU55mirw - diff --git a/teastore/goldstandards/goldstandard_sad_2018-sam_2020_B.csv b/teastore/goldstandards/goldstandard_sad_2018-sam_2020_B.csv deleted file mode 100644 index 11451329c8..0000000000 --- a/teastore/goldstandards/goldstandard_sad_2018-sam_2020_B.csv +++ /dev/null @@ -1,31 +0,0 @@ -modelElementID,sentence -_dhM6oDVXEeqPG_FgW3bi6Q,1 -_bC13QDVWEeqPG_FgW3bi6Q,3 -_yA04AKTKEeqKjI323B3R3w,4 -_lnx1oDVWEeqPG_FgW3bi6Q,4 -_bC13QDVWEeqPG_FgW3bi6Q,5 -_lnx1oDVWEeqPG_FgW3bi6Q,5 -_bC13QDVWEeqPG_FgW3bi6Q,6 -_bC13QDVWEeqPG_FgW3bi6Q,7 -_yA04AKTKEeqKjI323B3R3w,8 -_bC13QDVWEeqPG_FgW3bi6Q,8 -_yA04AKTKEeqKjI323B3R3w,10 -_yA04AKTKEeqKjI323B3R3w,11 -_lnx1oDVWEeqPG_FgW3bi6Q,14 -_AiuxcDVdEeqPG_FgW3bi6Q,15 -_AiuxcDVdEeqPG_FgW3bi6Q,20 -_m3fxEDVWEeqPG_FgW3bi6Q,21 -_m3fxEDVWEeqPG_FgW3bi6Q,23 -_lnx1oDVWEeqPG_FgW3bi6Q,23 -_m3fxEDVWEeqPG_FgW3bi6Q,24 -_m3fxEDVWEeqPG_FgW3bi6Q,25 -_m3fxEDVWEeqPG_FgW3bi6Q,26 -_m3fxEDVWEeqPG_FgW3bi6Q,27 -_lnx1oDVWEeqPG_FgW3bi6Q,27 -_lnx1oDVWEeqPG_FgW3bi6Q,31 -_lnx1oDVWEeqPG_FgW3bi6Q,33 -_lnx1oDVWEeqPG_FgW3bi6Q,34 -_lnx1oDVWEeqPG_FgW3bi6Q,36 -_lnx1oDVWEeqPG_FgW3bi6Q,37 -_dhM6oDVXEeqPG_FgW3bi6Q,39 -_dhM6oDVXEeqPG_FgW3bi6Q,41 diff --git a/teastore/goldstandards/goldstandard_sad_2018-sam_2020_III.csv b/teastore/goldstandards/goldstandard_sad_2018-sam_2020_III.csv deleted file mode 100644 index 5bc9a16f8d..0000000000 --- a/teastore/goldstandards/goldstandard_sad_2018-sam_2020_III.csv +++ /dev/null @@ -1,6 +0,0 @@ -modelElementID,sentence -_yA04AKTKEeqKjI323B3R3w,8 -_m3fxEDVWEeqPG_FgW3bi6Q,10 -_m3fxEDVWEeqPG_FgW3bi6Q,14 -_lnx1oDVWEeqPG_FgW3bi6Q,16 -_dhM6oDVXEeqPG_FgW3bi6Q,23 diff --git a/teastore/goldstandards/goldstandard_sad_id_2018.json b/teastore/goldstandards/goldstandard_sad_diagram_2018.json similarity index 100% rename from teastore/goldstandards/goldstandard_sad_id_2018.json rename to teastore/goldstandards/goldstandard_sad_diagram_2018.json diff --git a/teastore/text_2018/README.md b/teastore/text_2018/README.md deleted file mode 100644 index 104c003f09..0000000000 --- a/teastore/text_2018/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# TeaStore 2018 - -The text was extracted from https://ieeexplore.ieee.org/document/8526888 - -## Assumption -* It is assumed that the ":" are not understood as a line break. -* For the goldstandard it was assumed, that the text still fits to the model from 2020. - -## Text Adaptation - -We built for several parts goldstandards. - -### Files - -* *_III.{txt|csv} refer to introduction in section III (before A. Architecture). -* *_A.{txt|csv} refer to section III. A. Architecture -* *_B.{txt|csv} refer to section III. B. Services -* *_AB.{txt|csv} refer to section III. A. Architecture and III. B. Services - -## License - -The text we extracted from their documentation originates from the publication [TeaStore: A Micro-Service Reference Application for Benchmarking, Modeling and Resource Management Research](https://ieeexplore.ieee.org/document/8526888). \ No newline at end of file diff --git a/teastore/text_2018/teastore_2018_A.txt b/teastore/text_2018/teastore_2018_A.txt deleted file mode 100644 index b35b235581..0000000000 --- a/teastore/text_2018/teastore_2018_A.txt +++ /dev/null @@ -1,38 +0,0 @@ -The TeaStore consists of five distinct services and a Registry service as shown in Figure 1. -All services communicate with the Registry. -Additionally, the WebUI service issues calls to the Image-Provider, Authentication, Persistence and Recommender services. -The Image provider and Recommender both connect to a provided interface at the Persistence service. -However, this is only necessary on startup (dashed lines). -The Image provider must generate an image for each product, whereas the Recommender needs the current order history as training data. -Once running, only the Authentication and the WebUI access, modify, and create data using the Persistence. -All services communicate via representational state transfer (REST) calls, as REST has established itself as the de-facto industry standard in the micro-service domain. -The services are deployed as web-services on Apache Tomcat. -Yet, the services can be deployed on any Java application server able to run web-services packaged as war files. -As an alternative to deploying the war files, we provide convenient Docker images, containing the entire Tomcat stack. -Each service is packaged in its own war file or Docker image. -The TeaStore uses the client-side load balancer Ribbon, to allow replication of instances of one service type. -Ribbon distributes REST calls among running instances of a service. -Instead of using Netflix Eureka, the TeaStore uses its own registry that supplies service instances with target instances of a specified target specific service type. -To enable this, all running instances register and unregister at the registry, which can be queried for all running instances of a service. -This allows for dynamic addition and removal of service instances during run-time. -Each service also sends heartbeats to the registry. -In case a service is overloaded or crashed and therefore fails to send heartbeat messages, it is removed from the list of available instances. -Subsequently, it will not receive further requests from other services. -This mechanism ensures good error recovery and minimizes the amount of requests sent to unavailable service instances that would otherwise generate request timeouts. -As the TeaStore is primarily a benchmarking and testing application, it is open source and available to instrumentation using available monitoring solutions. -Pre-instrumented Docker images for each service that include the Kieker monitoring application [31], [32] as well as a central trace repository service, are already available. -We choose Kieker, as it requires no source code instrumentation and the instrumentation can be adapated at runtime. -However, as the TeaStore is open source, other monitoring solutions, such as Prometheus or Logstash can also be utilized. -Generally, all requests to the WebUI by a user or load generator are handled in a similar fashion. -The WebUI always retrieves information from the Persistence service. -If all information is available, images for presentation are fetched from the Image provider and embedded into the page. -Finally a Java Server Page (JSP) is compiled and returned. -This behavior ensures that even non-graphical browsers and simple load generators that otherwise would not fetch images from a regular site cause image I/O in the TeaStore, ensuring comparability regardless of the load generation method. -Figure 2 shows the service calls for a user request for a product information page. -After receiving the HTTP request, the WebUI checks the user’s login status by calling the Auth service. -Next, it queries the Persistence for the corresponding product information, based on a unique identifier. -Afterwards, the WebUI requests advertisement options for the current product from the Recommender, which generates a recommendation based on the learned historical order data. -The call to the Recommender takes the current login status into account. -Specifically, a logged in user receives personalized recommendations, whereas an anonymous user is served recommendations based on general item popularity. -Having received all product information, the WebUI queries the image provider to supply a full size image of the product shown in detail and preview images for the recommendations. -The image data is embedded in the HTML response as base-64 encoded strings. diff --git a/teastore/text_2018/teastore_2018_AB.txt b/teastore/text_2018/teastore_2018_AB.txt deleted file mode 100644 index cb06e6cfde..0000000000 --- a/teastore/text_2018/teastore_2018_AB.txt +++ /dev/null @@ -1,89 +0,0 @@ -The TeaStore consists of five distinct services and a Registry service as shown in Figure 1. -All services communicate with the Registry. -Additionally, the WebUI service issues calls to the Image-Provider, Authentication, Persistence and Recommender services. -The Image provider and Recommender both connect to a provided interface at the Persistence service. -However, this is only necessary on startup (dashed lines). -The Image provider must generate an image for each product, whereas the Recommender needs the current order history as training data. -Once running, only the Authentication and the WebUI access, modify, and create data using the Persistence. -All services communicate via representational state transfer (REST) calls, as REST has established itself as the de-facto industry standard in the micro-service domain. -The services are deployed as web-services on Apache Tomcat. -Yet, the services can be deployed on any Java application server able to run web-services packaged as war files. -As an alternative to deploying the war files, we provide convenient Docker images, containing the entire Tomcat stack. -Each service is packaged in its own war file or Docker image. -The TeaStore uses the client-side load balancer Ribbon, to allow replication of instances of one service type. -Ribbon distributes REST calls among running instances of a service. -Instead of using Netflix Eureka, the TeaStore uses its own registry that supplies service instances with target instances of a specified target specific service type. -To enable this, all running instances register and unregister at the registry, which can be queried for all running instances of a service. -This allows for dynamic addition and removal of service instances during run-time. -Each service also sends heartbeats to the registry. -In case a service is overloaded or crashed and therefore fails to send heartbeat messages, it is removed from the list of available instances. -Subsequently, it will not receive further requests from other services. -This mechanism ensures good error recovery and minimizes the amount of requests sent to unavailable service instances that would otherwise generate request timeouts. -As the TeaStore is primarily a benchmarking and testing application, it is open source and available to instrumentation using available monitoring solutions. -Pre-instrumented Docker images for each service that include the Kieker monitoring application [31], [32] as well as a central trace repository service, are already available. -We choose Kieker, as it requires no source code instrumentation and the instrumentation can be adapated at runtime. -However, as the TeaStore is open source, other monitoring solutions, such as Prometheus or Logstash can also be utilized. -Generally, all requests to the WebUI by a user or load generator are handled in a similar fashion. -The WebUI always retrieves information from the Persistence service. -If all information is available, images for presentation are fetched from the Image provider and embedded into the page. -Finally a Java Server Page (JSP) is compiled and returned. -This behavior ensures that even non-graphical browsers and simple load generators that otherwise would not fetch images from a regular site cause image I/O in the TeaStore, ensuring comparability regardless of the load generation method. -Figure 2 shows the service calls for a user request for a product information page. -After receiving the HTTP request, the WebUI checks the user’s login status by calling the Auth service. -Next, it queries the Persistence for the corresponding product information, based on a unique identifier. -Afterwards, the WebUI requests advertisement options for the current product from the Recommender, which generates a recommendation based on the learned historical order data. -The call to the Recommender takes the current login status into account. -Specifically, a logged in user receives personalized recommendations, whereas an anonymous user is served recommendations based on general item popularity. -Having received all product information, the WebUI queries the image provider to supply a full size image of the product shown in detail and preview images for the recommendations. -The image data is embedded in the HTML response as base-64 encoded strings. -The TeaStore consists of five services, in addition to a registry necessary for service discovery and load balancing. -In case monitoring is enabled, a trace repository service can be used to collect the monitoring traces centrally. -1) WebUI: This service provides the user interface, compiling and serving Java Server Pages (JSPs). -All data, available categories, their products, product recommendations and images, are retrieved from the Image provider and Persistence service instances. -The WebUI service performs preliminary validity checking on user inputs before passing the inputs to the Persistence service. -The WebUI focuses purely on presentation and web front-end operations. -However, the performance of the WebUI depends on the page that has to be rendered as each page contains at least one picture in different formats. -2) Image Provider: The Image provider serves images of different image sizes to the WebUI when being queried. -It optimizes image sizes depending on the target size in the presentation view. -The Image provider uses an internal cache and returns the image with the target size from the cache if available. -If the image is not available for this size, the image provider uses the largest available image for the category or product, scales it to the target size, and enters it into the cache. -It uses a least frequently used cache, reducing resource demand on frequently accessed data. -Through the caching, the response time for an image depends on whether this image is in the cache or not. -This service queries the Persistence service once on start-up to generate all product images with a fixed random seed. -3) Authentication: This service is responsible for the verification of both the login and the session data of a user. -The session data is validated using SHA-512 hashes. -For login verification, the BCrypt algorithm is used. -The session data includes information about the current shopping cart content, the user’s login status and old orders. -Thus, the performance of the hashing for the session data depends on number of articles in the cart and number of old orders. -Furthermore, as all session data is passed to the client, the Authentication itself manages to remain stateless and does not need additional information on startup. -4) Recommender: The Recommender service uses a rating algorithm to recommend products for the user to purchase. -The recommendations are based on items other customers bought, on the products in a user’s current shopping cart, and on the product the user is viewing at the time. -The initial Recommender instance usually uses the automatically generated data-set, as provided by the persistence service at initial startup, for training. -Any additional Recommender instance queries existing Recommender service instances for their training data-set and uses only those purchases for training. -This way, all Recommenders stay coherent, recommending identical products for the same input. -In addition, using identical training input also ensures that different instances of the Recommender service exhibit the same performance characteristics, which is important for many benchmarking and modeling contexts. -The Recommender service queries the Persistence service only once on startup. -For recommending, different algorithm implementations exhibiting different performance behaviors are available. -Next to a fallback algorithm based on overall item-popularity, two variants of Slope One [33] and one order-based nearest-neighbor approach are currently implemented. -One variant of Slope One calculates the predicted rating matrix beforehand and keeps it in the memory (memory-intensive), wheras the other one calculates every row if needed, but discards all results after each recommendation step (CPU-intensive). -5) Persistence: The Persistence service provides access and caching for the store’s relational database. -Products, their categories, purchases, and registered store users are stored in a relational SQL database. -The Persistence service uses caching to decrease response times and to reduce the load on the database itself for improved scalability. -The cache is kept coherent across multiple Persistence service instances. -We use the EclipseLink JPA implementation as a black-box cache. -All data inside the database itself is generated at the first start of the initial persistence instance. -By using a persistence service in separation from the actual database, we improve scalability by providing a replicable caching service. -However, the performance of the database accesses depends on the content in the database that is changed or can be repopulated during the operation of the store. -6) Registry: The registry is not part of the TeaStore application under test but is a necessary support service. -It keeps track of all running service instances, their IP addresses or host names and port numbers under which the services are available. -All service instances send keep-alive messages to the registry after registration. -If a service unregisters or no keep-alive message is received within a fixed time frame, the service is removed from the list of available service instances. -All services can query the list of service instances for a specified service type in order to distribute their outgoing requests between running target instances. -7) TraceRepository: The services are configured with optional Kieker monitoring [31], [32]. -With monitoring enabled, each service instance collects information about utilization, response times and call paths. -Collecting these monitoring traces manually is only feasible for small deployments. -Therefore, we offer a central trace repository, which consists of an AMQP server coupled with a graphical web interface. -All service instances send their logs to the AMQP server. -The web interface collects them and makes them available for download. -The trace repository does not only reduce the effort required to acquire the monitoring traces, but also enables online analysis such as online resource demand estimation [34]. -Kieker traces are also available for use with tools other than Kieker’s own tooling, as they can be automatically transformed to Open Execution Trace Exchange (OPEN.xtrace) traces, an open source trace format enabling interoperability between software performance engineering approaches [35]. diff --git a/teastore/text_2018/teastore_2018_B.txt b/teastore/text_2018/teastore_2018_B.txt deleted file mode 100644 index de313e194f..0000000000 --- a/teastore/text_2018/teastore_2018_B.txt +++ /dev/null @@ -1,51 +0,0 @@ -The TeaStore consists of five services, in addition to a registry necessary for service discovery and load balancing. -In case monitoring is enabled, a trace repository service can be used to collect the monitoring traces centrally. -1) WebUI: This service provides the user interface, compiling and serving Java Server Pages (JSPs). -All data, available categories, their products, product recommendations and images, are retrieved from the Image provider and Persistence service instances. -The WebUI service performs preliminary validity checking on user inputs before passing the inputs to the Persistence service. -The WebUI focuses purely on presentation and web front-end operations. -However, the performance of the WebUI depends on the page that has to be rendered as each page contains at least one picture in different formats. -2) Image Provider: The Image provider serves images of different image sizes to the WebUI when being queried. -It optimizes image sizes depending on the target size in the presentation view. -The Image provider uses an internal cache and returns the image with the target size from the cache if available. -If the image is not available for this size, the image provider uses the largest available image for the category or product, scales it to the target size, and enters it into the cache. -It uses a least frequently used cache, reducing resource demand on frequently accessed data. -Through the caching, the response time for an image depends on whether this image is in the cache or not. -This service queries the Persistence service once on start-up to generate all product images with a fixed random seed. -3) Authentication: This service is responsible for the verification of both the login and the session data of a user. -The session data is validated using SHA-512 hashes. -For login verification, the BCrypt algorithm is used. -The session data includes information about the current shopping cart content, the user’s login status and old orders. -Thus, the performance of the hashing for the session data depends on number of articles in the cart and number of old orders. -Furthermore, as all session data is passed to the client, the Authentication itself manages to remain stateless and does not need additional information on startup. -4) Recommender: The Recommender service uses a rating algorithm to recommend products for the user to purchase. -The recommendations are based on items other customers bought, on the products in a user’s current shopping cart, and on the product the user is viewing at the time. -The initial Recommender instance usually uses the automatically generated data-set, as provided by the persistence service at initial startup, for training. -Any additional Recommender instance queries existing Recommender service instances for their training data-set and uses only those purchases for training. -This way, all Recommenders stay coherent, recommending identical products for the same input. -In addition, using identical training input also ensures that different instances of the Recommender service exhibit the same performance characteristics, which is important for many benchmarking and modeling contexts. -The Recommender service queries the Persistence service only once on startup. -For recommending, different algorithm implementations exhibiting different performance behaviors are available. -Next to a fallback algorithm based on overall item-popularity, two variants of Slope One [33] and one order-based nearest-neighbor approach are currently implemented. -One variant of Slope One calculates the predicted rating matrix beforehand and keeps it in the memory (memory-intensive), wheras the other one calculates every row if needed, but discards all results after each recommendation step (CPU-intensive). -5) Persistence: The Persistence service provides access and caching for the store’s relational database. -Products, their categories, purchases, and registered store users are stored in a relational SQL database. -The Persistence service uses caching to decrease response times and to reduce the load on the database itself for improved scalability. -The cache is kept coherent across multiple Persistence service instances. -We use the EclipseLink JPA implementation as a black-box cache. -All data inside the database itself is generated at the first start of the initial persistence instance. -By using a persistence service in separation from the actual database, we improve scalability by providing a replicable caching service. -However, the performance of the database accesses depends on the content in the database that is changed or can be repopulated during the operation of the store. -6) Registry: The registry is not part of the TeaStore application under test but is a necessary support service. -It keeps track of all running service instances, their IP addresses or host names and port numbers under which the services are available. -All service instances send keep-alive messages to the registry after registration. -If a service unregisters or no keep-alive message is received within a fixed time frame, the service is removed from the list of available service instances. -All services can query the list of service instances for a specified service type in order to distribute their outgoing requests between running target instances. -7) TraceRepository: The services are configured with optional Kieker monitoring [31], [32]. -With monitoring enabled, each service instance collects information about utilization, response times and call paths. -Collecting these monitoring traces manually is only feasible for small deployments. -Therefore, we offer a central trace repository, which consists of an AMQP server coupled with a graphical web interface. -All service instances send their logs to the AMQP server. -The web interface collects them and makes them available for download. -The trace repository does not only reduce the effort required to acquire the monitoring traces, but also enables online analysis such as online resource demand estimation [34]. -Kieker traces are also available for use with tools other than Kieker’s own tooling, as they can be automatically transformed to Open Execution Trace Exchange (OPEN.xtrace) traces, an open source trace format enabling interoperability between software performance engineering approaches [35]. \ No newline at end of file diff --git a/teastore/text_2018/teastore_2018_III.txt b/teastore/text_2018/teastore_2018_III.txt deleted file mode 100644 index 846b76c4e5..0000000000 --- a/teastore/text_2018/teastore_2018_III.txt +++ /dev/null @@ -1,23 +0,0 @@ -The TeaStore is an online store for tea and tea related utilities. -Its products are sorted into categories. -For online shopping, the store supports an overview of products including preview images for each category and featuring a configurable number of products per page. -All pages of the TeaStore show an overview header bar and include the category menu and page footer. -As main content, it shows the products for the selected category, including shortened product information and the preview image. -Depending on the number of products shown per page, the user has the option to cycle through multiple pages of the category view. -Each product can be viewed on a separate product page containing detailed information, a large image, and advertisements for other store items. -Besides the regular header, footer, and category list, this page includes a detailed image of the product (provided by the Image Provider Service), a description, and price. -The page also contains an advertisement panel suggesting three products that the user might be interested in. -The advertised products are provided by the Recommender Service and are selected depending on the viewed product. -All products can be placed in a shopping cart and users can proceed to order the current shopping cart. -The user can choose to modify the shopping cart at any time. -The shopping cart page lists all products currently included in the cart together with some product information and the quantity. -The shopping cart view also displays product advertisements, which are, again, provided by the separate Recommender service and selected depending on the shopping cart’s contents. -To order, the user must supply personal information about the billing address and payment details. -After confirmation by the user, the current shopping cart is stored in the order history database through the Persistence service -The store also supports user authentication and login. -Registered users can view their order history after login. -In addition to regular operations, the TeaStore’s user interface provides an overview of all running service instances and an option to regenerate the database. -In case a specific database setup or size is necessary, it can be regenerated with user defined parameters. -These include the number of categories, number of products per category, number of users, and maximum orders per user history. -The service overview and database regeneration are not intended to be run during an experiment run, but separately on experiment setup. -All functionality is contained within the five primary microservices and the Registry service. \ No newline at end of file diff --git a/teastore/diagrams_2018/Overview.jpg b/teastore/text_2020/Overview.jpg similarity index 100% rename from teastore/diagrams_2018/Overview.jpg rename to teastore/text_2020/Overview.jpg diff --git a/teastore/text_2020/README.md b/teastore/text_2020/README.md index 0c6c952a6a..a084ee60a6 100644 --- a/teastore/text_2020/README.md +++ b/teastore/text_2020/README.md @@ -7,6 +7,11 @@ The text was extracted from https://web.archive.org/web/20201102180945/https:// * Captions were removed * explicit links were replaced with "link" +## Diagram + +1. Extracted with PDF24 from the teastore paper as 300 DPI 100% quality pdf +2. Cropped with Windows Photo Viewer + ## License The [documentation](https://web.archive.org/web/20201102180945/https://github.com/DescartesResearch/teastore/wiki/Services) of Teastore was part of their [repository](https://github.com/DescartesResearch/teastore). From 10f0c552ae25564377c0f740ccc66ede93564c7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Fuch=C3=9F?= Date: Tue, 5 Aug 2025 13:58:08 +0200 Subject: [PATCH 2/4] Remove diagram GS for BBB --- .../goldstandard_sad_diagram_2021.json | 421 ------------------ 1 file changed, 421 deletions(-) delete mode 100644 bigbluebutton/goldstandards/goldstandard_sad_diagram_2021.json diff --git a/bigbluebutton/goldstandards/goldstandard_sad_diagram_2021.json b/bigbluebutton/goldstandards/goldstandard_sad_diagram_2021.json deleted file mode 100644 index 7cd0eb23e5..0000000000 --- a/bigbluebutton/goldstandards/goldstandard_sad_diagram_2021.json +++ /dev/null @@ -1,421 +0,0 @@ -{ - "$schema": "../../DiagramSchema.json", - "diagrams": [ - { - "path": "/benchmark/bigbluebutton/diagrams_2021/bbb-arch-overview.png", - "boxes": [ - { - "boundingBox": { - "x": 634, - "y": 26, - "w": 78, - "h": 40 - }, - "textBoxes": [ - { - "text": "html5 client", - "boundingBox": { - "x": 643, - "y": 42, - "w": 61, - "h": 9 - } - } - ], - "subBoxes": [], - "tracelinks": [ - { - "name": "text_2021/bigbluebutton.txt", - "sentences": [ - 4, - 5, - 6, - 11, - 12, - 13, - 14, - 70, - 71, - 74, - 77 - ] - } - ] - }, - { - "boundingBox": { - "x": 613, - "y": 109, - "w": 122, - "h": 40 - }, - "textBoxes": [ - { - "text": "html5 server", - "boundingBox": { - "x": 641, - "y": 125, - "w": 66, - "h": 9 - } - } - ], - "subBoxes": [], - "tracelinks": [ - { - "name": "text_2021/bigbluebutton.txt", - "sentences": [ - 6, - 8, - 9, - 10, - 12, - 13, - 15, - 18, - 37, - 45, - 71 - ] - } - ] - }, - { - "boundingBox": { - "x": 34, - "y": 180, - "w": 103, - "h": 61 - }, - "textBoxes": [ - { - "text": "kurento", - "boundingBox": { - "x": 66, - "y": 206, - "w": 40, - "h": 9 - } - } - ], - "subBoxes": [], - "tracelinks": [ - { - "name": "text_2021/bigbluebutton.txt", - "sentences": [ - 65, - 66, - 67 - ] - } - ] - }, - { - "boundingBox": { - "x": 179, - "y": 180, - "w": 104, - "h": 61 - }, - "textBoxes": [ - { - "text": "webrtc-sfu", - "boundingBox": { - "x": 203, - "y": 206, - "w": 56, - "h": 9 - } - } - ], - "subBoxes": [], - "tracelinks": [ - { - "name": "text_2021/bigbluebutton.txt", - "sentences": [ - 5, - 63, - 65, - 68, - 71, - 72 - ] - } - ] - }, - { - "boundingBox": { - "x": 340, - "y": 189, - "w": 422, - "h": 43 - }, - "textBoxes": [ - { - "text": "redis pubsub", - "boundingBox": { - "x": 516, - "y": 206, - "w": 69, - "h": 11 - } - } - ], - "subBoxes": [], - "tracelinks": [ - { - "name": "text_2021/bigbluebutton.txt", - "sentences": [ - 44, - 45, - 58, - 77 - ] - } - ] - }, - { - "boundingBox": { - "x": 798, - "y": 182, - "w": 145, - "h": 61 - }, - "textBoxes": [ - { - "text": "presentation conversion", - "boundingBox": { - "x": 807, - "y": 208, - "w": 127, - "h": 11 - } - } - ], - "subBoxes": [], - "tracelinks": [ - { - "name": "text_2021/bigbluebutton.txt", - "sentences": [ - 78, - 79 - ] - } - ] - }, - { - "boundingBox": { - "x": 339, - "y": 291, - "w": 122, - "h": 34 - }, - "textBoxes": [ - { - "text": "apps", - "boundingBox": { - "x": 387, - "y": 306, - "w": 26, - "h": 9 - } - } - ], - "subBoxes": [], - "tracelinks": [ - { - "name": "text_2021/bigbluebutton.txt", - "sentences": [ - 25, - 49, - 50, - 52, - 58 - ] - } - ] - }, - { - "boundingBox": { - "x": 490, - "y": 291, - "w": 122, - "h": 34 - }, - "textBoxes": [ - { - "text": "fsesl", - "boundingBox": { - "x": 538, - "y": 304, - "w": 25, - "h": 9 - } - } - ], - "subBoxes": [], - "tracelinks": [ - { - "name": "text_2021/bigbluebutton.txt", - "sentences": [ - 55, - 58 - ] - } - ] - }, - { - "boundingBox": { - "x": 652, - "y": 296, - "w": 122, - "h": 34 - }, - "textBoxes": [ - { - "text": "bbb-web", - "boundingBox": { - "x": 690, - "y": 309, - "w": 46, - "h": 9 - } - } - ], - "subBoxes": [], - "tracelinks": [ - { - "name": "text_2021/bigbluebutton.txt", - "sentences": [ - 28, - 34, - 35, - 76 - ] - } - ] - }, - { - "boundingBox": { - "x": 159, - "y": 357, - "w": 145, - "h": 61 - }, - "textBoxes": [ - { - "text": "recording service", - "boundingBox": { - "x": 186, - "y": 383, - "w": 91, - "h": 11 - } - } - ], - "subBoxes": [], - "tracelinks": [ - { - "name": "text_2021/bigbluebutton.txt", - "sentences": [] - } - ] - }, - { - "boundingBox": { - "x": 339, - "y": 370, - "w": 122, - "h": 34 - }, - "textBoxes": [ - { - "text": "redis db", - "boundingBox": { - "x": 378, - "y": 383, - "w": 43, - "h": 9 - } - } - ], - "subBoxes": [], - "tracelinks": [ - { - "name": "text_2021/bigbluebutton.txt", - "sentences": [ - 46, - 47 - ] - } - ] - }, - { - "boundingBox": { - "x": 490, - "y": 370, - "w": 122, - "h": 34 - }, - "textBoxes": [ - { - "text": "freeswitch", - "boundingBox": { - "x": 523, - "y": 383, - "w": 54, - "h": 9 - } - } - ], - "subBoxes": [], - "tracelinks": [ - { - "name": "text_2021/bigbluebutton.txt", - "sentences": [ - 56, - 57, - 58, - 59, - 60, - 61, - 64, - 70 - ] - } - ] - }, - { - "boundingBox": { - "x": 674, - "y": 367, - "w": 78, - "h": 40 - }, - "textBoxes": [ - { - "text": "3rd party", - "boundingBox": { - "x": 689, - "y": 383, - "w": 47, - "h": 11 - } - } - ], - "subBoxes": [], - "tracelinks": [ - { - "name": "text_2021/bigbluebutton.txt", - "sentences": [ - 37, - 38, - 39 - ] - } - ] - } - ] - } - ] -} From 4fb58c19b143c14d5b2672848e1c740b993266fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Fuch=C3=9F?= Date: Tue, 5 Aug 2025 14:02:32 +0200 Subject: [PATCH 3/4] Remove ":" from text --- bigbluebutton/text_2021/bigbluebutton.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bigbluebutton/text_2021/bigbluebutton.txt b/bigbluebutton/text_2021/bigbluebutton.txt index 3859b385c4..6b321a0cef 100644 --- a/bigbluebutton/text_2021/bigbluebutton.txt +++ b/bigbluebutton/text_2021/bigbluebutton.txt @@ -2,7 +2,7 @@ High-level architecture. The following diagram provides a high-level view of how BigBlueButton's components work together. We'll break down each component in more detail below. HTML5 client. -The HTML5 client is a single page, responsive web application that is built upon the following components: React.js for rendering the user interface in an efficient manner, WebRTC for sending/receiving audio and video. +The HTML5 client is a single page, responsive web application that is built upon the following components, React.js for rendering the user interface in an efficient manner, WebRTC for sending/receiving audio and video. The HTML5 client connects directly with the BigBlueButton server over port 443 (SSL), from loading the BigBlueButton client to making a web socket connection. These connections are all handled by nginx. The HTML5 server sits behind nginx. @@ -24,7 +24,7 @@ The breakdown of functionality between front-end and back-end is as follows. Frontends receive the ValidateAuthTokenResp event to complete authentication. Frontends collect subscriptions and publishers. Frontends receive other DDP events including method calls to send events to akka-apps. -Frontends handle completely the Streamer redis events: Cursor, Annotations, External video share. +Frontends handle completely the Streamer redis events, i.e., Cursor, Annotations, External video share. Frontends still require MeetingStarted and MeetingEnded events to create/destroy per-meeting event processing queues. Backends handle all the non-streamer events. If more than one backend is running, bbb-web splits the load in round-robin fashion by assigning an instanceId. From 74289b3c77032766d8f4efea2c4b6b8d5de20cac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Fuch=C3=9F?= Date: Tue, 5 Aug 2025 15:05:19 +0200 Subject: [PATCH 4/4] Align gold standard with bigbluebutton.txt --- .../goldstandard_sad_2021-code_2023.csv | 178 +++++++++--------- .../goldstandard_sad_2021-sam_2021.csv | 71 ++++--- 2 files changed, 121 insertions(+), 128 deletions(-) diff --git a/bigbluebutton/goldstandards/goldstandard_sad_2021-code_2023.csv b/bigbluebutton/goldstandards/goldstandard_sad_2021-code_2023.csv index 6e04586b46..fa09a16254 100644 --- a/bigbluebutton/goldstandards/goldstandard_sad_2021-code_2023.csv +++ b/bigbluebutton/goldstandards/goldstandard_sad_2021-code_2023.csv @@ -27,113 +27,107 @@ sentenceID,codeID 20,build/packages-template/bbb-html5/ 21,bigbluebutton-html5/ 21,build/packages-template/bbb-html5/ -25,akka-bbb-apps/ -25,build/packages-template/bbb-apps-akka/ -28,bbb-common-web/src/main/java/org/bigbluebutton/web/ -28,bigbluebutton-web/ -28,build/packages-template/bbb-web/ -34,bbb-common-web/src/main/java/org/bigbluebutton/web/ -34,bigbluebutton-web/ -34,build/packages-template/bbb-web/ -35,bbb-common-web/src/main/java/org/bigbluebutton/web/ -35,bigbluebutton-web/ -35,build/packages-template/bbb-web/ +26,akka-bbb-apps/ +26,build/packages-template/bbb-apps-akka/ +30,bbb-common-web/src/main/java/org/bigbluebutton/web/ +30,bigbluebutton-web/ +30,build/packages-template/bbb-web/ 36,bbb-common-web/src/main/java/org/bigbluebutton/web/ 36,bigbluebutton-web/ 36,build/packages-template/bbb-web/ -37,bigbluebutton-html5/ -37,build/packages-template/bbb-html5/ -44,bbb-common-message/src/main/java/org/bigbluebutton/common2/redis/pubsub/ -45,bbb-common-message/src/main/java/org/bigbluebutton/common2/redis/pubsub/ -45,bigbluebutton-html5/ -45,build/packages-template/bbb-html5/ -46,bbb-common-message/src/main/java/org/bigbluebutton/common2/redis/Keys.java -46,bbb-common-message/src/main/java/org/bigbluebutton/common2/redis/RedisAwareCommunicator.java -46,bbb-common-message/src/main/java/org/bigbluebutton/common2/redis/RedisStorageService.java -47,bbb-common-message/src/main/java/org/bigbluebutton/common2/redis/Keys.java -47,bbb-common-message/src/main/java/org/bigbluebutton/common2/redis/RedisAwareCommunicator.java -47,bbb-common-message/src/main/java/org/bigbluebutton/common2/redis/RedisStorageService.java -49,akka-bbb-apps/ -49,build/packages-template/bbb-apps-akka/ -50,akka-bbb-apps/ -50,build/packages-template/bbb-apps-akka/ +37,bbb-common-web/src/main/java/org/bigbluebutton/web/ +37,bigbluebutton-web/ +37,build/packages-template/bbb-web/ +38,bbb-common-web/src/main/java/org/bigbluebutton/web/ +38,bigbluebutton-web/ +38,build/packages-template/bbb-web/ +39,bigbluebutton-html5/ +39,build/packages-template/bbb-html5/ +46,bbb-common-message/src/main/java/org/bigbluebutton/common2/redis/pubsub/ +47,bbb-common-message/src/main/java/org/bigbluebutton/common2/redis/pubsub/ +47,bigbluebutton-html5/ +47,build/packages-template/bbb-html5/ +48,bbb-common-message/src/main/java/org/bigbluebutton/common2/redis/Keys.java +48,bbb-common-message/src/main/java/org/bigbluebutton/common2/redis/RedisAwareCommunicator.java +48,bbb-common-message/src/main/java/org/bigbluebutton/common2/redis/RedisStorageService.java +49,bbb-common-message/src/main/java/org/bigbluebutton/common2/redis/Keys.java +49,bbb-common-message/src/main/java/org/bigbluebutton/common2/redis/RedisAwareCommunicator.java +49,bbb-common-message/src/main/java/org/bigbluebutton/common2/redis/RedisStorageService.java 51,akka-bbb-apps/ 51,build/packages-template/bbb-apps-akka/ 52,akka-bbb-apps/ 52,build/packages-template/bbb-apps-akka/ -55,akka-bbb-fsesl/ -55,akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/ -55,bbb-fsesl-client/ -55,bbb-fsesl-client/src/main/java/org/freeswitch/ -55,bbb-fsesl-client/src/test/java/org/freeswitch/ -55,build/packages-template/bbb-freeswitch-core/ -55,build/packages-template/bbb-freeswitch-sounds/ -55,build/packages-template/bbb-fsesl-akka/ -55,freeswitch.placeholder.sh -56,akka-bbb-fsesl/ -56,akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/ -56,bbb-fsesl-client/ -56,bbb-fsesl-client/src/main/java/org/freeswitch/ -56,bbb-fsesl-client/src/test/java/org/freeswitch/ -56,build/packages-template/bbb-freeswitch-core/ -56,build/packages-template/bbb-freeswitch-sounds/ -56,build/packages-template/bbb-fsesl-akka/ -56,freeswitch.placeholder.sh -58,akka-bbb-apps/ +53,akka-bbb-apps/ +53,build/packages-template/bbb-apps-akka/ +54,akka-bbb-apps/ +54,build/packages-template/bbb-apps-akka/ +57,akka-bbb-fsesl/ +57,bbb-fsesl-client/ +57,build/packages-template/bbb-fsesl-akka/ 58,akka-bbb-fsesl/ -58,bbb-common-message/src/main/java/org/bigbluebutton/common2/redis/pubsub/ +58,akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/ 58,bbb-fsesl-client/ -58,build/packages-template/bbb-apps-akka/ +58,bbb-fsesl-client/src/main/java/org/freeswitch/ +58,bbb-fsesl-client/src/test/java/org/freeswitch/ +58,build/packages-template/bbb-freeswitch-core/ +58,build/packages-template/bbb-freeswitch-sounds/ 58,build/packages-template/bbb-fsesl-akka/ -59,akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/ -59,bbb-fsesl-client/src/main/java/org/freeswitch/ -59,bbb-fsesl-client/src/test/java/org/freeswitch/ -59,build/packages-template/bbb-freeswitch-core/ -59,build/packages-template/bbb-freeswitch-sounds/ -59,freeswitch.placeholder.sh -60,akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/ -60,bbb-fsesl-client/src/main/java/org/freeswitch/ -60,bbb-fsesl-client/src/test/java/org/freeswitch/ -60,build/packages-template/bbb-freeswitch-core/ -60,build/packages-template/bbb-freeswitch-sounds/ -60,freeswitch.placeholder.sh +58,freeswitch.placeholder.sh +60,akka-bbb-apps/ +60,akka-bbb-fsesl/ +60,bbb-common-message/src/main/java/org/bigbluebutton/common2/redis/pubsub/ +60,bbb-fsesl-client/ +60,build/packages-template/bbb-apps-akka/ +60,build/packages-template/bbb-fsesl-akka/ 61,akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/ 61,bbb-fsesl-client/src/main/java/org/freeswitch/ 61,bbb-fsesl-client/src/test/java/org/freeswitch/ 61,build/packages-template/bbb-freeswitch-core/ 61,build/packages-template/bbb-freeswitch-sounds/ 61,freeswitch.placeholder.sh -63,bbb-webrtc-sfu.placeholder.sh -63,build/packages-template/bbb-webrtc-sfu/ -64,akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/ -64,bbb-fsesl-client/src/main/java/org/freeswitch/ -64,bbb-fsesl-client/src/test/java/org/freeswitch/ -64,build/packages-template/bbb-freeswitch-core/ -64,build/packages-template/bbb-freeswitch-sounds/ -64,freeswitch.placeholder.sh +62,akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/ +62,bbb-fsesl-client/src/main/java/org/freeswitch/ +62,bbb-fsesl-client/src/test/java/org/freeswitch/ +62,build/packages-template/bbb-freeswitch-core/ +62,build/packages-template/bbb-freeswitch-sounds/ +62,freeswitch.placeholder.sh +63,akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/ +63,bbb-fsesl-client/src/main/java/org/freeswitch/ +63,bbb-fsesl-client/src/test/java/org/freeswitch/ +63,build/packages-template/bbb-freeswitch-core/ +63,build/packages-template/bbb-freeswitch-sounds/ +63,freeswitch.placeholder.sh 65,bbb-webrtc-sfu.placeholder.sh 65,build/packages-template/bbb-webrtc-sfu/ -68,bbb-webrtc-sfu.placeholder.sh -68,build/packages-template/bbb-webrtc-sfu/ -70,akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/ -70,bbb-fsesl-client/src/main/java/org/freeswitch/ -70,bbb-fsesl-client/src/test/java/org/freeswitch/ -70,bigbluebutton-html5/ -70,build/packages-template/bbb-freeswitch-core/ -70,build/packages-template/bbb-freeswitch-sounds/ -70,build/packages-template/bbb-html5/ -70,freeswitch.placeholder.sh -71,bbb-webrtc-sfu.placeholder.sh -71,bigbluebutton-html5/ -71,build/packages-template/bbb-html5/ -71,build/packages-template/bbb-webrtc-sfu/ -74,bigbluebutton-html5/ -74,build/packages-template/bbb-html5/ -76,bbb-common-web/src/main/java/org/bigbluebutton/web/ -76,bigbluebutton-web/ -76,build/packages-template/bbb-web/ -77,bbb-common-message/src/main/java/org/bigbluebutton/common2/redis/pubsub/ -77,bigbluebutton-html5/ -77,build/packages-template/bbb-html5/ -78,bbb-common-web/src/main/java/org/bigbluebutton/presentation/ -79,bbb-common-web/src/main/java/org/bigbluebutton/presentation/ +66,akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/ +66,bbb-fsesl-client/src/main/java/org/freeswitch/ +66,bbb-fsesl-client/src/test/java/org/freeswitch/ +66,build/packages-template/bbb-freeswitch-core/ +66,build/packages-template/bbb-freeswitch-sounds/ +66,freeswitch.placeholder.sh +67,bbb-webrtc-sfu.placeholder.sh +67,build/packages-template/bbb-webrtc-sfu/ +70,bbb-webrtc-sfu.placeholder.sh +70,build/packages-template/bbb-webrtc-sfu/ +72,akka-bbb-fsesl/src/main/java/org/bigbluebutton/freeswitch/ +72,bbb-fsesl-client/src/main/java/org/freeswitch/ +72,bbb-fsesl-client/src/test/java/org/freeswitch/ +72,bigbluebutton-html5/ +72,build/packages-template/bbb-freeswitch-core/ +72,build/packages-template/bbb-freeswitch-sounds/ +72,build/packages-template/bbb-html5/ +72,freeswitch.placeholder.sh +73,bbb-webrtc-sfu.placeholder.sh +73,bigbluebutton-html5/ +73,build/packages-template/bbb-html5/ +73,build/packages-template/bbb-webrtc-sfu/ +76,bigbluebutton-html5/ +76,build/packages-template/bbb-html5/ +78,bbb-common-web/src/main/java/org/bigbluebutton/web/ +78,bigbluebutton-web/ +78,build/packages-template/bbb-web/ +79,bbb-common-message/src/main/java/org/bigbluebutton/common2/redis/pubsub/ +79,bigbluebutton-html5/ +79,build/packages-template/bbb-html5/ +80,bbb-common-web/src/main/java/org/bigbluebutton/presentation/ +81,bbb-common-web/src/main/java/org/bigbluebutton/presentation/ diff --git a/bigbluebutton/goldstandards/goldstandard_sad_2021-sam_2021.csv b/bigbluebutton/goldstandards/goldstandard_sad_2021-sam_2021.csv index 761ff286b5..dbed3d2309 100644 --- a/bigbluebutton/goldstandards/goldstandard_sad_2021-sam_2021.csv +++ b/bigbluebutton/goldstandards/goldstandard_sad_2021-sam_2021.csv @@ -19,46 +19,45 @@ _yGgUMFkHEeyewPSmlgszyA,19 _0e5u8FkHEeyewPSmlgszyA,19 _yGgUMFkHEeyewPSmlgszyA,20 _yGgUMFkHEeyewPSmlgszyA,21 -_XuNf4FkJEeyewPSmlgszyA,25 -_4yx-8FkHEeyewPSmlgszyA,28 -_4yx-8FkHEeyewPSmlgszyA,34 -_4yx-8FkHEeyewPSmlgszyA,35 +_XuNf4FkJEeyewPSmlgszyA,26 +_4yx-8FkHEeyewPSmlgszyA,30 _4yx-8FkHEeyewPSmlgszyA,36 -_yGgUMFkHEeyewPSmlgszyA,37 -_6sergFkHEeyewPSmlgszyA,44 -_6sergFkHEeyewPSmlgszyA,45 -_yGgUMFkHEeyewPSmlgszyA,45 -_RDHFIFwPEeyiuNx_RO7j-Q,46 -_RDHFIFwPEeyiuNx_RO7j-Q,47 -_XuNf4FkJEeyewPSmlgszyA,49 -_XuNf4FkJEeyewPSmlgszyA,50 +_4yx-8FkHEeyewPSmlgszyA,37 +_4yx-8FkHEeyewPSmlgszyA,38 +_yGgUMFkHEeyewPSmlgszyA,39 +_6sergFkHEeyewPSmlgszyA,46 +_6sergFkHEeyewPSmlgszyA,47 +_yGgUMFkHEeyewPSmlgszyA,47 +_RDHFIFwPEeyiuNx_RO7j-Q,48 +_RDHFIFwPEeyiuNx_RO7j-Q,49 _XuNf4FkJEeyewPSmlgszyA,51 _XuNf4FkJEeyewPSmlgszyA,52 -_9wZIcFkHEeyewPSmlgszyA,55 -_nwrCMFwPEeyiuNx_RO7j-Q,55 -_nwrCMFwPEeyiuNx_RO7j-Q,56 -_9wZIcFkHEeyewPSmlgszyA,56 -_9wZIcFkHEeyewPSmlgszyA,58 -_XuNf4FkJEeyewPSmlgszyA,58 -_6sergFkHEeyewPSmlgszyA,58 +_XuNf4FkJEeyewPSmlgszyA,53 +_XuNf4FkJEeyewPSmlgszyA,54 +_9wZIcFkHEeyewPSmlgszyA,57 +_nwrCMFwPEeyiuNx_RO7j-Q,58 _nwrCMFwPEeyiuNx_RO7j-Q,59 -_nwrCMFwPEeyiuNx_RO7j-Q,60 +_9wZIcFkHEeyewPSmlgszyA,60 +_XuNf4FkJEeyewPSmlgszyA,60 +_6sergFkHEeyewPSmlgszyA,60 _nwrCMFwPEeyiuNx_RO7j-Q,61 -_s0aIcFkHEeyewPSmlgszyA,63 -_nwrCMFwPEeyiuNx_RO7j-Q,64 +_nwrCMFwPEeyiuNx_RO7j-Q,62 +_nwrCMFwPEeyiuNx_RO7j-Q,63 _s0aIcFkHEeyewPSmlgszyA,65 -_oN4CMFkHEeyewPSmlgszyA,65 -_oN4CMFkHEeyewPSmlgszyA,66 +_nwrCMFwPEeyiuNx_RO7j-Q,66 +_s0aIcFkHEeyewPSmlgszyA,67 _oN4CMFkHEeyewPSmlgszyA,67 -_s0aIcFkHEeyewPSmlgszyA,68 -_0e5u8FkHEeyewPSmlgszyA,70 -_nwrCMFwPEeyiuNx_RO7j-Q,70 -_0e5u8FkHEeyewPSmlgszyA,71 -_yGgUMFkHEeyewPSmlgszyA,71 -_s0aIcFkHEeyewPSmlgszyA,71 -_0e5u8FkHEeyewPSmlgszyA,74 -_4yx-8FkHEeyewPSmlgszyA,76 -_6sergFkHEeyewPSmlgszyA,77 -_0e5u8FkHEeyewPSmlgszyA,77 -_2BgxMFkHEeyewPSmlgszyA,78 -_2BgxMFkHEeyewPSmlgszyA,79 +_oN4CMFkHEeyewPSmlgszyA,68 +_oN4CMFkHEeyewPSmlgszyA,69 +_s0aIcFkHEeyewPSmlgszyA,70 +_0e5u8FkHEeyewPSmlgszyA,72 +_nwrCMFwPEeyiuNx_RO7j-Q,72 +_0e5u8FkHEeyewPSmlgszyA,73 +_yGgUMFkHEeyewPSmlgszyA,73 +_s0aIcFkHEeyewPSmlgszyA,73 +_0e5u8FkHEeyewPSmlgszyA,76 +_4yx-8FkHEeyewPSmlgszyA,78 +_6sergFkHEeyewPSmlgszyA,79 +_0e5u8FkHEeyewPSmlgszyA,79 +_2BgxMFkHEeyewPSmlgszyA,80 +_2BgxMFkHEeyewPSmlgszyA,81