Merge branch 'master' of ssh://sapsailing.com/home/trac/git into bug5979

This commit is contained in:
Thomas Stokes
2024-03-20 14:24:51 +01:00
99 changed files with 1382 additions and 1161 deletions
@@ -1,25 +0,0 @@
<VirtualHost *:80>
ServerName git.sapsailing.com
SetEnv GIT_PROJECT_ROOT /home/trac/git
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/
ScriptAlias /hooks/ /var/www/cgi-bin/
<Location /git/ >
Options +ExecCGI
AuthType Basic
AuthName 'Git'
AuthUserFile '/etc/httpd/conf/passwd.git'
Require valid-user
</Location>
<Directory "/var/www/cgi-bin">
AllowOverride None
Options FollowSymLinks
Order allow,deny
Allow from all
</Directory>
SetEnvIf User-Agent ".*MSIE.*" \
downgrade-1.0 force-response-1.0
</VirtualHost>
@@ -1,39 +0,0 @@
<VirtualHost *:80>
ServerName docker.sapsailing.com
ProxyPreserveHost on
ProxyPass / http://127.0.0.1:5000/
ProxyPassReverse / http://127.0.0.1:5000/
<Location />
Order deny,allow
Allow from all
AuthName "Docker Registry Authentication"
AuthType basic
AuthUserFile '/etc/httpd/conf/passwd.git'
Require valid-user
</Location>
# Use separate log files for the SSL virtual host; note that LogLevel
# is not inherited from httpd.conf.
ErrorLog logs/docker_error_log
TransferLog logs/docker_access_log
LogLevel warn
</VirtualHost>
<VirtualHost *:80>
ServerName docker-registry.sapsailing.com
ProxyPreserveHost on
ProxyPass /v2 http://127.0.0.1:5001/v2
ProxyPassReverse /v2 http://127.0.0.1:5001/v2
<Location />
Order deny,allow
Allow from all
AuthName "Docker Registry Authentication"
AuthType basic
AuthUserFile '/etc/httpd/conf/passwd.git'
Require valid-user
</Location>
# Use separate log files for the SSL virtual host; note that LogLevel
# is not inherited from httpd.conf.
ErrorLog logs/docker_error_log
TransferLog logs/docker_access_log
LogLevel warn
</VirtualHost>
@@ -1,14 +0,0 @@
# sail-insight.com
<VirtualHost *:80>
ServerName sail-insight.com
ServerAlias www.sail-insight.com
CustomLog logs/services_log combined env=!original_client_ip
CustomLog logs/services_log first_forwarded_for_ip env=original_client_ip
Alias / /home/trac/sail-insight-website/
<Directory /home/trac/sail-insight-website>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
</VirtualHost>
@@ -1,56 +0,0 @@
#
# Content of this file, with correct values, can be automatically added to
# your Apache server by using the AWStats configure.pl tool.
#
# If using Windows and Perl ActiveStat, this is to enable Perl script as CGI.
#ScriptInterpreterSource registry
#
# Directives to add to your Apache conf file to allow use of AWStats as a CGI.
# Note that path "/usr/share/awstats/" must reflect your AWStats install path.
#
Alias /awstatsclasses "/usr/share/awstats/wwwroot/classes/"
Alias /awstatscss "/usr/share/awstats/wwwroot/css/"
Alias /awstatsicons "/usr/share/awstats/wwwroot/icon/"
ScriptAlias /awstats/ "/usr/share/awstats/wwwroot/cgi-bin/"
# Adding access to /var/log/old/cache/unique-ips-per-referrer/stats:
Alias /unique-visitors/ "/var/log/old/cache/unique-ips-per-referrer/stats/"
#
# This is to permit URL access to scripts/files in AWStats directory.
#
<VirtualHost *:80>
ServerName awstats.sapsailing.com
CustomLog logs/awstats_access_log combined
ErrorLog logs/awstats_error_log
<Directory "/usr/share/awstats/wwwroot">
Options None
# AllowOverride None
# Order allow,deny
# Allow from 127.0.0.1
AuthType Basic
AuthName 'awstats'
AuthUserFile /etc/httpd/conf/passwd.awstats
Require valid-user
</Directory>
<Directory "/var/log/old/cache/unique-ips-per-referrer/stats/">
Options Indexes
# AllowOverride None
# Order allow,deny
# Allow from 127.0.0.1
AuthType Basic
AuthName 'awstats'
AuthUserFile /etc/httpd/conf/passwd.awstats
Require valid-user
</Directory>
# Additional Perl modules
<IfModule mod_env.c>
SetEnv PERL5LIB /usr/share/awstats/lib:/usr/share/awstats/plugins:/root/perl5/lib/perl5
</IfModule>
</VirtualHost>
@@ -1,78 +0,0 @@
<VirtualHost *:80>
ServerName jobs.sapsailing.com
CustomLog logs/jobs_log combined env=!original_client_ip
CustomLog logs/jobs_log first_forwarded_for_ip env=original_client_ip
DocumentRoot /home/trac/static/jobs
<Directory /home/trac/static/jobs>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
</VirtualHost>
# P2 repository
<VirtualHost *:80>
ServerName p2.sapsailing.com
CustomLog logs/services_log combined env=!original_client_ip
CustomLog logs/services_log first_forwarded_for_ip env=original_client_ip
Alias /p2 /home/trac/p2-repositories
<Directory /home/trac/p2-repositories>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName bugzilla.sapsailing.com
RewriteEngine On
RewriteRule ^/?$ http://bugzilla.sapsailing.com/bugzilla [L]
CustomLog logs/services_log combined env=!original_client_ip
CustomLog logs/services_log first_forwarded_for_ip env=original_client_ip
Alias /bugzilla /usr/share/bugzilla
<Directory /usr/share/bugzilla>
AddHandler cgi-script .cgi
Options +Indexes +ExecCGI +FollowSymLinks
DirectoryIndex index.cgi
AllowOverride Limit Options FileInfo Indexes AuthConfig
</Directory>
# Additional Perl modules
<IfModule mod_env.c>
SetEnv PERL5LIB /root/perl5/lib/perl5:/root/perl5/lib/perl5/x86_64-linux-thread-multi
</IfModule>
</VirtualHost>
# Wiki -->
<VirtualHost *:80>
ServerName wiki.sapsailing.com
RewriteEngine on
RewriteRule ^/(.*) http://localhost:4567/$1 [P,L]
ProxyPassReverse / http://localhost:4567/
CustomLog logs/services_log combined env=!original_client_ip
CustomLog logs/services_log first_forwarded_for_ip env=original_client_ip
</VirtualHost>
<VirtualHost *:80>
ServerName releases.sapsailing.com
DocumentRoot /home/trac/releases
<Directory /home/trac/releases>
Options +Indexes +FollowSymLinks
</Directory>
CustomLog logs/services_log combined env=!original_client_ip
CustomLog logs/services_log first_forwarded_for_ip env=original_client_ip
</VirtualHost>
<VirtualHost *:80>
ServerName static.sapsailing.com
DocumentRoot /var/www/static
<Directory /var/www/static>
Order Deny,Allow
Allow from all
Options -Indexes +FollowSymLinks -ExecCGI
AllowOverride All
</Directory>
CustomLog logs/services_log combined env=!original_client_ip
CustomLog logs/services_log first_forwarded_for_ip env=original_client_ip
</VirtualHost>
@@ -1 +0,0 @@
LoadModule php7_module modules/libphp-7.1.so
@@ -1,48 +0,0 @@
#
# Mod_perl incorporates a Perl interpreter into the Apache web server,
# so that the Apache web server can directly execute Perl code.
# Mod_perl links the Perl runtime library into the Apache web server
# and provides an object-oriented Perl interface for Apache's C
# language API. The end result is a quicker CGI script turnaround
# process, since no external Perl interpreter has to be started.
#
# Uncomment this line to globally enable warnings, which will be
# written to the server's error log. Warnings should be enabled
# during the development process, but should be disabled on a
# production server as they affect performance.
#
#PerlSwitches -w
# Uncomment this line to enable taint checking globally. When Perl is
# running in taint mode various checks are performed to reduce the
# risk of insecure data being passed to a subshell or being used to
# modify the filesystem. Unfortunately many Perl modules are not
# taint-safe, so you should exercise care before enabling it on a
# production server.
#
#PerlSwitches -T
# This will allow execution of mod_perl to compile your scripts to
# subroutines which it will execute directly, avoiding the costly
# compile process for most requests.
#
#Alias /perl /var/www/perl
#<Directory /var/www/perl>
# SetHandler perl-script
# PerlResponseHandler ModPerl::Registry
# PerlOptions +ParseHeaders
# Options +ExecCGI
#</Directory>
# This will allow remote server configuration reports, with the URL of
# http://servername/perl-status
# Change the ".example.com" to match your domain to enable.
#
#<Location /perl-status>
# SetHandler perl-script
# PerlResponseHandler Apache2::Status
# Order deny,allow
# Deny from all
# Allow from .example.com
#</Location>
@@ -1,57 +0,0 @@
#
# The following lines prevent .user.ini files from being viewed by Web clients.
#
<Files ".user.ini">
Require all denied
</Files>
#
# Allow php to handle Multiviews
#
AddType text/html .php
#
# Add index.php to the list of files that will be served as directory
# indexes.
#
DirectoryIndex index.php
# mod_php options
<IfModule mod_php7.c>
#
# Cause the PHP interpreter to handle files with a .php extension.
#
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
#
# Uncomment the following lines to allow PHP to pretty-print .phps
# files as PHP source code:
#
#<FilesMatch \.phps$>
# SetHandler application/x-httpd-php-source
#</FilesMatch>
#
# Apache specific PHP configuration options
# those can be override in each configured vhost
#
php_value session.save_handler "files"
php_value session.save_path "/var/lib/php/7.1/session"
php_value soap.wsdl_cache_dir "/var/lib/php/7.1/wsdlcache"
#php_value opcache.file_cache "/var/lib/php/7.1/opcache"
</IfModule>
# Redirect to local php-fpm if mod_php is not available
<IfModule !mod_php5.c>
<IfModule !mod_php7.c>
# Enable http authorization headers
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"
</FilesMatch>
</IfModule>
</IfModule>
@@ -1,57 +0,0 @@
#
# The following lines prevent .user.ini files from being viewed by Web clients.
#
<Files ".user.ini">
Require all denied
</Files>
#
# Allow php to handle Multiviews
#
AddType text/html .php
#
# Add index.php to the list of files that will be served as directory
# indexes.
#
DirectoryIndex index.php
# mod_php options
<IfModule mod_php7.c>
#
# Cause the PHP interpreter to handle files with a .php extension.
#
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
#
# Uncomment the following lines to allow PHP to pretty-print .phps
# files as PHP source code:
#
#<FilesMatch \.phps$>
# SetHandler application/x-httpd-php-source
#</FilesMatch>
#
# Apache specific PHP configuration options
# those can be override in each configured vhost
#
php_value session.save_handler "files"
php_value session.save_path "/var/lib/php/7.1/session"
php_value soap.wsdl_cache_dir "/var/lib/php/7.1/wsdlcache"
#php_value opcache.file_cache "/var/lib/php/7.1/opcache"
</IfModule>
# Redirect to local php-fpm if mod_php is not available
<IfModule !mod_php5.c>
<IfModule !mod_php7.c>
# Enable http authorization headers
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"
</FilesMatch>
</IfModule>
</IfModule>
@@ -5,22 +5,55 @@
# after the merge completes. The user, in which the bare repo and hook are installed, must have aws credentials, that
# don't need mfa. (These may need to be installed manually -- within the correct user -- if starting from a clean instance.)
TAG="ReverseProxy"
DISPOSABLE_TAG="DisposableProxy"
CENTRAL_TAG="CentralReverseProxy"
DIR="/etc/httpd"
COMMAND="sudo service httpd reload"
MAIN_BRANCH_NAME="main"
DISPOSABLE_BRANCH_NAME="disposable"
CENTRAL_BRANCH_NAME="central"
CHECKED_OUT_WORKSPACE_NAME="checked-out" # Assumes it is in the root user.
sync_repo() {
#$1 tag key to use
#$2 branch to check out
# Gets all public ips for the instances with the chosen tag and iterates over the IPs.
for IP in $(aws ec2 describe-instances --filters Name=tag-key,Values="${1}" | jq -r '.Reservations[].Instances[].PublicIpAddress'); do
# strictHostKey... means no authenticity check. The sync-repo... script must be installed in the root user's home.
echo $IP
ssh -o "StrictHostKeyChecking=no" -o "ConnectTimeout=10" root@${IP} "cd ~ && sync-repo-and-execute-cmd.sh '${DIR}' '${COMMAND}' '${2}'";
done;
}
merge_main_into_branch() {
#$1 branch name. Assumes you are in the git repo.
git checkout "${1}"
git pull
echo "merging ${MAIN_BRANCH_NAME} into ${1}"
git merge ${MAIN_BRANCH_NAME}
git push
}
while read oldrev newrev refname; do # These vars are passed on stdin to this hook.
# Check if the update is on a branch
if [[ $refname == "refs/heads/"* ]]; then
branch_name=$(echo $refname | sed "s|refs/heads/\(.*\)$|\1|")
echo "Update on branch: $branch_name"
if [[ "$branch_name" == "$MAIN_BRANCH_NAME" ]]; then
# Gets all public ips for the instances with the chosen tag and iterates over the IPs.
for IP in $(aws ec2 describe-instances --filters Name=tag-key,Values="${TAG}" | jq -r '.Reservations[].Instances[].PublicIpAddress'); do
# strictHostKey... means no authenticity check. The sync-repo... script must be installed in the root user's home.
echo "Connecting to $IP"
ssh -o "StrictHostKeyChecking=no" root@${IP} "cd ~ && /usr/local/bin/sync-repo-and-execute-cmd.sh '${DIR}' '${COMMAND}' ";
done
if [[ "$branch_name" == "$DISPOSABLE_BRANCH_NAME" ]]; then
echo "All the disposables pull the disposable branch"
sync_repo "${DISPOSABLE_TAG}" "${DISPOSABLE_BRANCH_NAME}"
elif [[ "$branch_name" == "$CENTRAL_BRANCH_NAME" ]]; then
echo "The central pulls the central branch"
sync_repo "${CENTRAL_TAG}" "${CENTRAL_BRANCH_NAME}"
elif [[ "$branch_name" == "$MAIN_BRANCH_NAME" ]]; then
cd ~
unset GIT_DIR
cd ${CHECKED_OUT_WORKSPACE_NAME}
# get the latest main
git checkout ${MAIN_BRANCH_NAME}
git pull
# get the latest diposable branch and merge in changes
merge_main_into_branch "$DISPOSABLE_BRANCH_NAME"
# get the latest central branch and merge in changes
merge_main_into_branch "$CENTRAL_BRANCH_NAME"
git checkout ${MAIN_BRANCH_NAME}
fi
fi
done
@@ -1,20 +1,27 @@
#!/bin/bash
# Purpose: This script goes to a given git dir (eg. httpd); fetches any new commits to
# the repo; and - if new commits are found - merges them into the branch and runs a command.
# Purpose: This script goes to a given git dir (eg. httpd); checks out a given branch; fetches any new commits to
# that given branch; and - if new commits are found - merges them into the branch and runs a command.
if [ $# -eq 0 ]; then
echo "$0 PATH_TO_GIT_REPO COMMAND_TO_RUN_ON_COMPLETION_IN_REPO"
echo "$0 PATH_TO_GIT_REPO COMMAND_TO_RUN_ON_COMPLETION_IN_REPO BRANCH_TO_CHECK_OUT"
echo ""
echo "EXAMPLE: sync-repo-and-execute-cmd.sh \"/etc/httpd\" \"sudo service httpd reload\""
echo "This script is used to automatically fetch from a git repo and, if there are new commits, merge the changes."
echo "And then run a command, passed as an argument."
echo "This script is used to automatically fetch the latest changes to a given branch of a git repo and,"
echo "if there are new commits, merge the changes into that branch."
echo "And then run a command, passed as an argument. This leaves the repo checked out to the branch in the argument."
exit 2
fi
GIT_PATH=$1
COMMAND_ON_COMPLETION=$2
GIT_BRANCH=$3
cd ${GIT_PATH}
git checkout ${GIT_BRANCH} >/dev/null 2>&1
if [[ "$?" -ne 0 ]]; then
echo "Error encountered: issue checking out branch"
exit 1
fi
# Rev-parse gets the commit hash of given reference.
CURRENT_HEAD=$(git rev-parse HEAD)
GIT_SSH_COMMAND="ssh -o StrictHostKeyChecking=no" git fetch
@@ -22,17 +29,17 @@ if [[ "$?" -ne 0 ]]; then
echo "Error encountered: issue with fetching or there is no repo."
exit 1
fi
if [[ $CURRENT_HEAD != $(git rev-parse origin/main) ]] # Checks if there are new commits
if [[ $CURRENT_HEAD != "$(git rev-parse origin/${GIT_BRANCH})" ]] # Checks if there are new commits
then
logger -t httpd "Changes found; merging now"
cd ${GIT_PATH} && git merge origin/main
cd ${GIT_PATH} && git merge origin/${GIT_BRANCH}
if [[ $? -eq 0 ]]; then
logger -t httpdMerge "Merge succeeded: different files edited."
else
logger -t httpdMerge "First merge unsuccessful: same file modified."
git merge --abort # Returns to pre-merge state.
git stash
git merge origin/main # This should be a fast-forward merge.
git merge origin/${GIT_BRANCH} # This should be a fast-forward merge.
git stash apply # Keeps stash on top of stack, in case the apply fails.
if [[ $? -eq 0 ]]; then
logger -t httpdMerge "Second merge success: merge of httpd remote to local successful, and previous working directory changes restored."
@@ -47,6 +54,9 @@ then
fi
fi
sleep 2
${COMMAND_ON_COMPLETION}
fi
if httpd -t ; then
${COMMAND_ON_COMPLETION}
else
logger -t httpdMerge "Config error"
fi
fi
@@ -11,4 +11,4 @@ WantedBy=httpd.service
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/usr/local/bin/sync-repo-and-execute-cmd.sh "/etc/httpd" "echo synced"
ExecStart=/usr/local/bin/sync-repo-and-execute-cmd.sh "/etc/httpd" "echo synced" disposable
@@ -12,7 +12,7 @@ if ! git status; then
git init
git remote add origin "${REMOTE}"
GIT_SSH_COMMAND="ssh -A -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" git fetch
git checkout main
git checkout disposable
fi
echo "Use Status ${SELF_IP} internal-server-status" > /etc/httpd/conf.d/${STATUS_DEFINITION_FILE}
cd /etc/httpd
@@ -10,7 +10,8 @@ if [[ -z "$selfIp" || -z "$availabilityZone" ]]; then
availabilityZone=$(cat /var/cache/availability-zone)
fi
nlbName="HTTP-to-sapsailing-dot-com"
targetGroupArn=$(aws elbv2 describe-target-groups --name "${nlbName}" | jq -r ".TargetGroups[].TargetGroupArn")
# First we describe the target groups which are served by a load balancer, which has an ARN containing the substring "loadbalancer/net". Then, we get the tags of these target groups and iterate over the tag descriptions (a list of resourceArns paired with tags), selecting those resources which have a key "allReverseProxies". Finally we extract the resource ARN. Note: .[] means to iterate over an array.
targetGroupArn=$(aws elbv2 describe-tags --resource-arns $(aws elbv2 describe-target-groups | jq -r '.TargetGroups | .[] | select(.LoadBalancerArns | .[] | contains("loadbalancer/net") ) | .TargetGroupArn') | jq -r '.TagDescriptions | .[] | select(.Tags | any(.Key=="allReverseProxies") ) | .ResourceArn')
if [[ "$#" -eq 0 ]];then
echo "Use add-to-nlb OR remove-from-nlb as the first and only argument."
exit 2
@@ -1,6 +1,6 @@
#!/bin/bash
PRIMARY_MASTER=https://paris2024-master.sapsailing.com:9443
SECONDARY_MASTER=https://paris2024-secondary-master.sapsailing.com:9443
PRIMARY_MASTER=https://palma2024-master.sailing.omegatiming.com:9443
SECONDARY_MASTER=https://palma2024-secondary-master.sailing.omegatiming.com:9443
COMPARE_OUTPUT=$( /home/sailing/code/java/target/compareServers -ael ${SECONDARY_MASTER} ${PRIMARY_MASTER} )
if [ "$?" != "0" ]; then
echo "Comparing ${SECONDARY_MASTER} with ${PRIMARY_MASTER} showed differences:
@@ -0,0 +1,34 @@
#!/bin/bash
# Probe for valid AWS MFA token
EXPIRY_MARKER_FILE=/tmp/aws-mfa-token-expired
aws ec2 describe-instances >/dev/null 2>/dev/null
EXIT_CODE=$?
if [ "${EXIT_CODE}" = "255" ]; then
if [ ! -f "${EXPIRY_MARKER_FILE}" ]; then
message="AWS MFA token seems to have expired. aws ec2 describe-instances exited with code ${EXIT_CODE}. Not messaging you again. Try another awsmfa as root@sapsailing.com's tmux."
echo "${message}" | notify-operators "AWS MFA token expired"
touch "${EXPIRY_MARKER_FILE}"
else
echo "AWS MFA token expired, but we had sent e-mail already."
fi
else
# Discover replicas
IPs=""
for i in $( cat `dirname $0`/regions.txt ); do
IPs="$( aws --region $i ec2 describe-instances --filters Name=instance-state-name,Values=running Name=tag:sailing-analytics-server,Values=paris2024 | jq .Reservations[].Instances[].PublicIpAddress -r )"
if [ -z "${IPs}" ]; then
echo "Couldn't find a running replica in region $i" >&2
message="Couldn't find a running replica in region $i"
echo "${message}" | notify-operators "${message}"
else
read first others <<<"${IPs}"
if ! ssh -o StrictHostKeyChecking=no root@${first} "curl https://palma2024.sailing.omegatiming.com/gwt/status 2>/dev/null >/dev/null"; then
echo "Problem reaching palma2024.sailing.omegatiming.com from instance ${first} in region ${i}" >&2
message="Problem reaching palma2024.sailing.omegatiming.com from instance ${first} in region ${i}"
echo "${message}" | notify-operators "${message}"
else
echo "Access from region ${i}, IP ${first} OK." >&2
fi
fi
done
fi
@@ -1,5 +1,5 @@
#!/bin/bash
#OPERATORS="axel.uhl@sap.com jan.hamann@sapsailing.com alessandro.stoltenberg@sap.com alstolten@gmail.com"
OPERATORS="axel.uhl@sap.com jan.hamann@sapsailing.com heather.allard@sap.com finn.huelsbusch@sap.com fabian.kallenbach@sap.com"
OPERATORS="axel.uhl@sap.com"
logger -t sailing "Sending notification e-mail with subject $1 to ${OPERATORS}"
mail -s "$1" ${OPERATORS}
@@ -1,9 +1,9 @@
#!/bin/bash
# Upgrades the entire landscape of servers to a new release ${RELEASE}
# The procedure works in the following steps:
# - patch *.conf files in sap-p1-1:servers/[master|security_service] and sap-p1-2:servers/[secondary_master|replica|master|security_service] so
# - patch *.conf files in sap-p1-1:servers/[master|security_service] and sap-p1-2:servers/[secondary_master|master|security_service] so
# their INSTALL_FROM_RELEASE points to the new ${RELEASE}
# - Install new releases to sap-p1-1:servers/[master|security_service] and sap-p1-2:servers/[secondary_master|replica|master|security_service]
# - Install new releases to sap-p1-1:servers/[master|security_service] and sap-p1-2:servers/[secondary_master|master|security_service]
# - Update all launch configurations and auto-scaling groups in the cloud (update-launch-configuration.sh)
# - Tell all replicas in the cloud to stop replicating (stop-all-cloud-replicas.sh)
# - Tell sap-p1-2 secondary_master to restart (./stop; ./start)
@@ -29,9 +29,9 @@ if [ $# -eq 0 ]; then
echo "Example: $0 -R build-202106041327 -k Jan"
echo "The procedure works in the following steps:"
echo " - patch *.conf files in sap-p1-1:servers/[master|security_service] and sap-p1-2:servers/[secondary_master|replica|master|security_service] so"
echo " - patch *.conf files in sap-p1-1:servers/[master|security_service] and sap-p1-2:servers/[secondary_master|master|security_service] so"
echo " their INSTALL_FROM_RELEASE points to the new ${RELEASE}"
echo " - Install new releases to sap-p1-1:servers/[master|security_service] and sap-p1-2:servers/[secondary_master|replica|master|security_service]"
echo " - Install new releases to sap-p1-1:servers/[master|security_service] and sap-p1-2:servers/[secondary_master|master|security_service]"
echo " - Update all launch configurations and auto-scaling groups in the cloud (update-launch-configuration.sh)"
echo " - Tell all replicas in the cloud to stop replicating (stop-all-cloud-replicas.sh)"
echo " - Tell sap-p1-2 secondary_master to restart (./stop; ./start)"
@@ -76,7 +76,6 @@ echo " * Patching configurations on sap-p1-1 and sap-p1-2 to new release ${RELEA
patch_conf_and_install sap-p1-1 master
patch_conf_and_install sap-p1-1 security_service
patch_conf_and_install sap-p1-2 secondary_master
patch_conf_and_install sap-p1-2 replica
patch_conf_and_install sap-p1-2 master
patch_conf_and_install sap-p1-2 security_service
echo " * Updating launch configurations and auto-scaling groups"
@@ -2,21 +2,21 @@
<feature
id="com.amazon.aws.aws-java-api"
label="AWS API"
version="2.20.59"
version="2.25.11"
provider-name="Amazon">
<plugin
id="com.amazon.aws.aws-java-api"
download-size="0"
install-size="0"
version="2.20.59"
version="2.25.11"
unpack="false"/>
<plugin
id="com.amazon.aws.aws-java-api.source"
download-size="0"
install-size="0"
version="2.20.59"
version="2.25.11"
unpack="false"/>
</feature>
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<site>
<feature url="features/aws-sdk/com.amazon.aws.aws-java-api_2.20.59.jar" id="com.amazon.aws.aws-java-api" version="2.20.59">
<feature url="features/aws-sdk/com.amazon.aws.aws-java-api_2.25.11.jar" id="com.amazon.aws.aws-java-api" version="2.25.11">
<category name="aws-java-api"/>
</feature>
<category-def name="com.amazon.aws.aws-java-api" label="aws-java-api"/>
@@ -5,7 +5,7 @@ repositories {
}
dependencies {
implementation platform('software.amazon.awssdk:bom:2.20.59')
implementation platform('software.amazon.awssdk:bom:2.25.11')
implementation 'software.amazon.awssdk:s3'
implementation 'software.amazon.awssdk:lambda'
implementation 'software.amazon.awssdk:ec2'
+1 -1
View File
@@ -16,7 +16,7 @@
</properties>
<groupId>com.amazon.aws</groupId>
<artifactId>com.amazon.aws.aws-java-api</artifactId>
<version>2.20.59</version>
<version>2.25.11</version>
<packaging>eclipse-plugin</packaging>
<build>
<plugins>
@@ -8,6 +8,8 @@ public interface RaceFetcher {
/**
* Not for execution on the client; on the server, returns a <code>TrackedRace</code> object.
* The method will not block or wait for the tracked race to appear. If it isn't found (see also
* bug 5982) then {@code null} is returned.
*/
Object getTrackedRace(RegattaAndRaceIdentifier regattaNameAndRaceName);
@@ -9,11 +9,6 @@ public interface RaceIdentifier extends Serializable {
Object getRace(RaceFetcher raceFetcher);
/**
* Blocks and waits if the tracked race for this race identifier doesn't exist yet.
*/
Object getTrackedRace(RaceFetcher raceFetcher);
/**
* Immediately returns <code>null</code> if the tracked race for this race identifier doesn't exist yet.
*/
@@ -24,10 +24,6 @@ public class RegattaNameAndRaceName extends RegattaName implements RegattaAndRac
return raceFetcher.getRace(this);
}
@Override
public Object getTrackedRace(RaceFetcher raceFetcher) {
return raceFetcher.getTrackedRace(this);
}
@Override
public Object getExistingTrackedRace(RaceFetcher raceFetcher) {
return raceFetcher.getExistingTrackedRace(this);
}
@@ -154,6 +154,7 @@ public class TracTracConnectivityParamsHandler extends AbstractRaceTrackingConne
} else {
final String creatorName = SessionUtils.getPrincipal().toString();
final TracTracConfigurationImpl tracTracConfiguration = new TracTracConfigurationImpl(creatorName, tractracRace.getEvent().getName(), jsonURL,
// FIXME bug5983: stored/live URIs should be captured in the configuration only if they were specified explicitly when the parameters were created
(params.getLiveURI() == null ? null : params.getLiveURI().toString()),
/* stored URI */ params.isReplayRace(tractracRace) ? null // we mainly want to enable the user to list the event's races again in case they are removed;
: (params.getStoredURI() == null ? null : params.getStoredURI().toString()), // live/stored stuff comes from the tracking params
@@ -219,12 +219,16 @@ public abstract class TrackedRegattaImpl implements TrackedRegatta {
public void raceAdded(TrackedRace trackedRace) {
synchronized (mutex) { // TODO possible improvement: only notify if trackedRace.getRace() == race; otherwise it cannot have made a difference for getExistingTrackedRace(race)...
mutex.notifyAll();
} // TODO can't we remove the listener again here?
}
}
};
addRaceListener(listener, Optional.empty(), /* synchronous */ false);
try {
synchronized (mutex) {
if (getRegatta().getRaceByName(race.getName()) == null) {
throw new IllegalStateException("Race "+race.getName()+" not in regatta "+getRegatta().getName()+
"; not blocking for it to appear. It most likely won't");
}
result = getExistingTrackedRace(race);
while (!interrupted && result == null) {
try {
@@ -55,19 +55,19 @@ public class GetSixtyInchStatisticAction implements SailingAction<GetSixtyInchSt
final RaceDefinition race = context.getRacingEventService().getRace(identifier);
int competitors = com.sap.sse.common.Util.size(race.getCompetitors());
legs = race.getCourse().getLegs().size();
final DynamicTrackedRace trace = context.getRacingEventService().getTrackedRace(identifier);
final DynamicTrackedRace trackedRace = context.getRacingEventService().getTrackedRace(identifier);
Duration duration = null;
Distance distance = null;
TimePoint timePoint;
if (trace.getEndOfRace() == null) {
if (trackedRace.getEndOfRace() == null) {
timePoint = MillisecondsTimePoint.now();
duration = estimateDuration(trace, duration, timePoint);
distance = estimateDistance(trace, distance, timePoint);
duration = estimateDuration(trackedRace, duration, timePoint);
distance = estimateDistance(trackedRace, distance, timePoint);
} else {
final Iterator<Competitor> competitorIterator = trace.getCompetitorsFromBestToWorst(trace.getEndOfRace()).iterator();
final Iterator<Competitor> competitorIterator = trackedRace.getCompetitorsFromBestToWorst(trackedRace.getEndOfRace()).iterator();
if (competitorIterator.hasNext()) {
distance = trace.getDistanceTraveled(competitorIterator.next(), trace.getEndOfRace());
duration = trace.getStartOfRace().until(trace.getEndOfRace());
distance = trackedRace.getDistanceTraveled(competitorIterator.next(), trackedRace.getEndOfRace());
duration = trackedRace.getStartOfRace().until(trackedRace.getEndOfRace());
}
}
return new GetSixtyInchStatisticDTO(competitors, legs, duration, distance);
@@ -128,7 +128,7 @@ public class QuickRanksLiveCache {
public QuickRanksDTO get(RegattaAndRaceIdentifier raceIdentifier) {
QuickRanksDTO result = cache.get(raceIdentifier, false);
if (result == null) {
TrackedRace trackedRace = service.getExistingTrackedRace(raceIdentifier);
final TrackedRace trackedRace = service.getExistingTrackedRace(raceIdentifier);
if (trackedRace != null) {
trackedRace.addListener(new Listener(raceIdentifier)); // register for all changes that may affect the quick ranks
cache.triggerUpdate(raceIdentifier, CalculateOrPurge.CALCULATE);
@@ -662,7 +662,6 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet
* Stops this service and frees its resources. In particular, caching services and threads owned by this service will be
* notified to stop their jobs.
*/
//UNCLEAR
public void stop() {
quickRanksLiveCache.stop();
}
@@ -1632,7 +1631,7 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet
@Override
public SimulatorResultsDTO getSimulatorResults(LegIdentifier legIdentifier) {
DynamicTrackedRace trackedRace = getService().getTrackedRace(legIdentifier.getRaceIdentifier());
final DynamicTrackedRace trackedRace = getService().getTrackedRace(legIdentifier.getRaceIdentifier());
if (trackedRace == null) {
throw new IllegalArgumentException("Race for leg " + legIdentifier + " not found!");
}
@@ -3346,10 +3345,12 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet
@Override
public DynamicTrackedRace getTrackedRace(RegattaAndRaceIdentifier regattaNameAndRaceName) {
Regatta regatta = getService().getRegattaByName(regattaNameAndRaceName.getRegattaName());
RaceDefinition race = getRaceByName(regatta, regattaNameAndRaceName.getRaceName());
DynamicTrackedRace trackedRace = getService().getOrCreateTrackedRegatta(regatta).getTrackedRace(race);
getSecurityService().checkCurrentUserReadPermission(trackedRace);
final Regatta regatta = getService().getRegattaByName(regattaNameAndRaceName.getRegattaName());
final RaceDefinition race = getRaceByName(regatta, regattaNameAndRaceName.getRaceName());
final DynamicTrackedRace trackedRace = getService().getOrCreateTrackedRegatta(regatta).getExistingTrackedRace(race);
if (trackedRace != null) {
getSecurityService().checkCurrentUserReadPermission(trackedRace);
}
return trackedRace;
}
@@ -5637,9 +5638,9 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet
public Boolean checkIfRaceIsTracking(RegattaAndRaceIdentifier race) {
getSecurityService().checkCurrentUserReadPermission(race);
boolean result = false;
DynamicTrackedRace trace = getService().getTrackedRace(race);
if (trace != null) {
final TrackedRaceStatusEnum status = trace.getStatus().getStatus();
DynamicTrackedRace trackedRace = getService().getTrackedRace(race);
if (trackedRace != null) {
final TrackedRaceStatusEnum status = trackedRace.getStatus().getStatus();
if (status == TrackedRaceStatusEnum.LOADING || status == TrackedRaceStatusEnum.TRACKING) {
result = true;
}
@@ -6387,22 +6388,25 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet
@Override
public boolean canSliceRace(RegattaAndRaceIdentifier raceIdentifier) {
final boolean result;
final Regatta regatta = getService().getRegattaByName(raceIdentifier.getRegattaName());
final Leaderboard regattaLeaderboard = getService().getLeaderboardByName(raceIdentifier.getRegattaName());
final DynamicTrackedRace trackedRace = getService().getTrackedRace(raceIdentifier);
getSecurityService().checkCurrentUserUpdatePermission(raceIdentifier);
getSecurityService().checkCurrentUserUpdatePermission(regattaLeaderboard);
getSecurityService().checkCurrentUserUpdatePermission(regatta);
final boolean result;
if (regatta == null || !(regattaLeaderboard instanceof RegattaLeaderboard) || trackedRace == null
|| trackedRace.getStartOfTracking() == null || !isSmartphoneTrackingEnabled(trackedRace)) {
if (trackedRace == null ) {
result = false;
} else {
final Pair<RaceColumn, Fleet> raceColumnAndFleetOfRaceToSlice = regattaLeaderboard
.getRaceColumnAndFleet(trackedRace);
result = (raceColumnAndFleetOfRaceToSlice != null); // is the TrackedRace associated to the given
// RegattaLeaderboard?
getSecurityService().checkCurrentUserUpdatePermission(raceIdentifier);
getSecurityService().checkCurrentUserUpdatePermission(regattaLeaderboard);
getSecurityService().checkCurrentUserUpdatePermission(regatta);
if (regatta == null || !(regattaLeaderboard instanceof RegattaLeaderboard) || trackedRace == null
|| trackedRace.getStartOfTracking() == null || !isSmartphoneTrackingEnabled(trackedRace)) {
result = false;
} else {
final Pair<RaceColumn, Fleet> raceColumnAndFleetOfRaceToSlice = regattaLeaderboard
.getRaceColumnAndFleet(trackedRace);
result = (raceColumnAndFleetOfRaceToSlice != null); // is the TrackedRace associated to the given
// RegattaLeaderboard?
}
}
return result;
}
@@ -2105,11 +2105,13 @@ public class SailingServiceWriteImpl extends SailingServiceImpl implements Saili
final List<DynamicTrackedRace> trackedRaces = new ArrayList<>();
if (selectedRaces != null && !selectedRaces.isEmpty()) {
for (RaceDTO raceDTO : selectedRaces) {
DynamicTrackedRace trackedRace = getTrackedRace(raceDTO.getRaceIdentifier());
// In case the user selected a distinct set of races, we want the call to completely fail if
// tracking wind isn't allowed for at least one race
getSecurityService().checkCurrentUserUpdatePermission(trackedRace);
trackedRaces.add(trackedRace);
final DynamicTrackedRace trackedRace = getTrackedRace(raceDTO.getRaceIdentifier());
if (trackedRace != null) {
// In case the user selected a distinct set of races, we want the call to completely fail if
// tracking wind isn't allowed for at least one race
getSecurityService().checkCurrentUserUpdatePermission(trackedRace);
trackedRaces.add(trackedRace);
}
}
} else {
for (DynamicTrackedRace race : getAllTrackedRaces()) {
@@ -2601,11 +2603,13 @@ public class SailingServiceWriteImpl extends SailingServiceImpl implements Saili
public RaceDTO setStartTimeReceivedForRace(RaceIdentifier raceIdentifier, Date newStartTimeReceived) {
RegattaNameAndRaceName regattaAndRaceIdentifier = new RegattaNameAndRaceName(raceIdentifier.getRegattaName(),
raceIdentifier.getRaceName());
DynamicTrackedRace trackedRace = getService().getTrackedRace(regattaAndRaceIdentifier);
getSecurityService().checkCurrentUserUpdatePermission(trackedRace);
trackedRace.setStartTimeReceived(
newStartTimeReceived == null ? null : new MillisecondsTimePoint(newStartTimeReceived));
return baseDomainFactory.createRaceDTO(getService(), false, regattaAndRaceIdentifier, trackedRace);
final DynamicTrackedRace trackedRace = getService().getTrackedRace(regattaAndRaceIdentifier);
if (trackedRace != null) {
getSecurityService().checkCurrentUserUpdatePermission(trackedRace);
trackedRace.setStartTimeReceived(
newStartTimeReceived == null ? null : new MillisecondsTimePoint(newStartTimeReceived));
}
return trackedRace == null ? null : baseDomainFactory.createRaceDTO(getService(), false, regattaAndRaceIdentifier, trackedRace);
}
@Override
@@ -2958,6 +2962,8 @@ public class SailingServiceWriteImpl extends SailingServiceImpl implements Saili
throw new ServiceException(serverStringMessages.get(locale, "slicingRaceColumnAlreadyUsedThe"));
}
final DynamicTrackedRace trackedRaceToSlice = getService().getTrackedRace(raceIdentifier);
// If tracked race isn't found, a NullPointerException will be thrown next, and that's okay because
// it's a bit unusual to not find a race that is just about to be sliced. We couldn't continue anyway.
final TimePoint startOfTrackingOfRaceToSlice = trackedRaceToSlice.getStartOfTracking();
final TimePoint endOfTrackingOfRaceToSlice = trackedRaceToSlice.getEndOfTracking();
if (sliceFrom == null || sliceTo == null || startOfTrackingOfRaceToSlice.after(sliceFrom)
@@ -2997,7 +3003,6 @@ public class SailingServiceWriteImpl extends SailingServiceImpl implements Saili
hasFinishingTime = false;
hasFinishedTime = false;
}
// Only wind fixes in the new tracking interval as well as the best fallback fixes are added to the new RaceLog
final LogEventTimeRangeWithFallbackFilter<RaceLogWindFixEvent> windFixEvents = new LogEventTimeRangeWithFallbackFilter<>(
timeRange);
@@ -8,7 +8,7 @@ Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Require-Bundle: com.sap.sailing.domain.common,
org.junit;bundle-version="4.8.2",
com.amazon.aws.aws-java-api;bundle-version="2.17.124",
redisson;bundle-version="3.17.7",
redisson;bundle-version="3.27.1",
com.amazonaws.aws-lambda-java-core;bundle-version="1.2.1"
Bundle-ActivationPolicy: lazy
Import-Package: javax.servlet;version="3.1.0"
+1 -1
View File
@@ -64,7 +64,7 @@
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.14.0</version>
<version>3.27.1</version>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
@@ -7,11 +7,11 @@ public interface Configuration {
* This host is only reachable through VPC and therefore one needs to ensure that the Lambda has all relevant
* permissions
*/
String[] REDIS_ENDPOINTS = { "redis://fixingestionrediscache-serverless-cvoblp.serverless.euw2.cache.amazonaws.com:6379" };
String[] REDIS_ENDPOINTS = { "rediss://fixingestionrediscache-serverless-cvoblp.serverless.euw2.cache.amazonaws.com:6379" };
String REDIS_MAP_NAME = "endpoints";
Region S3_REGION = Region.EU_WEST_2;
String S3_BUCKET_NAME = "sapsailing-gps-fixes";
int TIMEOUT_IN_SECONDS_WHEN_DISPATCHING_TO_ENDPOINT = 3;
int TIMEOUT_IN_SECONDS_WHEN_DISPATCHING_TO_ENDPOINT = 30;
}
@@ -82,7 +82,7 @@ public class EndpointRegistrationLambda implements RequestStreamHandler {
outputAsStream.write(successResponse.getBytes());
} catch (ParseException | JsonDeserializationException e) {
context.getLogger().log("Exception trying to deserialize JSON input: " + e.getMessage());
} catch (IOException ex) {
} catch (Exception ex) {
context.getLogger().log(ex.getMessage());
} finally {
try {
@@ -70,20 +70,19 @@ public class FixIngestionLambda implements RequestStreamHandler {
});
final List<EndpointDTO> listOfEndpointsToTrigger = cacheMap.get(deviceIdentifier.getStringRepresentation());
if (listOfEndpointsToTrigger != null) {
final List<EndpointDTO> endpointsToTrigger = listOfEndpointsToTrigger;
for (final EndpointDTO endpoint : endpointsToTrigger) {
for (final EndpointDTO endpoint : listOfEndpointsToTrigger) {
dispatchToSubscribersTask.submit(() -> {
dispatchToSubscribers(endpoint, bodyAsBytes);
});
}
// wait for tasks to complete for <number of end-points>*<timeout for connection>+<ramp-up time>
dispatchToSubscribersTask.awaitQuiescence(
(endpointsToTrigger.size() * Configuration.TIMEOUT_IN_SECONDS_WHEN_DISPATCHING_TO_ENDPOINT) + 2,
TimeUnit.SECONDS);
} else {
logger.info("No endpoint has been configured for Identifier " + deviceIdentifier.getStringRepresentation());
logger.info("No endpoint has been configured for identifier " + deviceIdentifier.getStringRepresentation());
}
String successResponse = awsInOut.createJsonResponse(deviceIdentifier.getStringRepresentation()).toJSONString();
// wait for tasks to complete for <number of end-points>*<timeout for connection>+<ramp-up time>
dispatchToSubscribersTask.awaitQuiescence(
(listOfEndpointsToTrigger==null?0:listOfEndpointsToTrigger.size() * Configuration.TIMEOUT_IN_SECONDS_WHEN_DISPATCHING_TO_ENDPOINT) + 2,
TimeUnit.SECONDS);
final String successResponse = awsInOut.createJsonResponse(deviceIdentifier.getStringRepresentation()).toJSONString();
logger.info(successResponse);
outputAsStream.write(successResponse.getBytes());
} catch (ParseException | JsonDeserializationException e) {
@@ -106,9 +105,8 @@ public class FixIngestionLambda implements RequestStreamHandler {
private void dispatchToSubscribers(final EndpointDTO endpoint, final byte[] jsonAsBytes) {
logger.info("Connecting to endpoint " + endpoint.getEndpointCallbackUrl() + " with ID " + endpoint.getEndpointUuid());
URL endpointUrl;
try {
endpointUrl = new URL(endpoint.getEndpointCallbackUrl());
final URL endpointUrl = new URL(endpoint.getEndpointCallbackUrl());
try {
final HttpURLConnection connectionToEndpoint = (HttpURLConnection) endpointUrl.openConnection();
connectionToEndpoint.setRequestMethod("POST");
@@ -134,16 +132,21 @@ public class FixIngestionLambda implements RequestStreamHandler {
private void storeFixFileToS3(final DeviceIdentifier deviceIdentifier, final List<GPSFixMoving> newFixes)
throws IOException {
final String dataAsString = newFixes.toString();
logger.info("Data to write: " + dataAsString);
for (GPSFixMoving fix : newFixes) {
final String destinationKey = s3FixStorageStructure.generateKeyForSingleFix(deviceIdentifier, fix.getTimePoint());
logger.info("Location: " + destinationKey);
final PutObjectRequest putObjectRequest = PutObjectRequest.builder().bucket(Configuration.S3_BUCKET_NAME)
.key(destinationKey).contentType("application/json").build();
final JSONObject serializedFix = gpsFixSerializer.serialize(fix);
s3Client.putObject(putObjectRequest, RequestBody.fromString(serializedFix.toJSONString()));
try {
final String dataAsString = newFixes.toString();
logger.info("Data to write: " + dataAsString);
for (GPSFixMoving fix : newFixes) {
final String destinationKey = s3FixStorageStructure.generateKeyForSingleFix(deviceIdentifier, fix.getTimePoint());
logger.info("Location: " + destinationKey);
final PutObjectRequest putObjectRequest = PutObjectRequest.builder().bucket(Configuration.S3_BUCKET_NAME)
.key(destinationKey).contentType("application/json").build();
final JSONObject serializedFix = gpsFixSerializer.serialize(fix);
s3Client.putObject(putObjectRequest, RequestBody.fromString(serializedFix.toJSONString()));
}
logger.info("Finished putting object into S3");
} catch (Throwable e) {
logger.log(Level.SEVERE, "Error writing GPS fix to S3: "+e.getMessage(), e);
throw e;
}
logger.info("Finished putting object into S3");
}
}
@@ -1,5 +1,6 @@
package com.sap.sailing.ingestion;
import java.util.Arrays;
import java.util.List;
import org.redisson.Redisson;
@@ -14,7 +15,7 @@ public class RedisUtils {
static {
final Config redisConfiguration = new Config();
redisConfiguration.useReplicatedServers().addNodeAddress(Configuration.REDIS_ENDPOINTS);
redisConfiguration.useClusterServers().setNodeAddresses(Arrays.asList(Configuration.REDIS_ENDPOINTS));
redisClient = Redisson.create(redisConfiguration);
}
@@ -10,9 +10,10 @@ import com.sap.sailing.domain.racelogtracking.impl.SmartphoneUUIDIdentifierImpl;
import com.sap.sse.common.Duration;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.TimeRange;
import com.sap.sse.common.impl.MillisecondsDurationImpl;
import com.sap.sse.common.impl.TimeRangeImpl;
import software.amazon.awssdk.services.s3.model.ListObjectsV2Request;
/**
* This class defines the organization structure of fixes on the S3 storage and is the foundation for all the AWS Lambda
* operations. The basic structure distinguishes single fixes which are inserted by the {@link FixIngestionLambda} and
@@ -35,7 +36,7 @@ public class S3FixStorageStructure {
private static final String SINGLE_FIX_PREFIX = "ingestion";
private static final String COLLECTION_PREFIX = "collection";
private static final String S3_DELIMITER = "/";
private static final Duration COLLECTION_DURATION = new MillisecondsDurationImpl(600_000);
private static final Duration COLLECTION_DURATION = Duration.ONE_MINUTE.times(10l);
private static final int SINGLE_FIX_BATCH_SIZE = 10;
/**
@@ -205,7 +206,7 @@ public class S3FixStorageStructure {
final String collectionName = String.format("%02d:%02d:%02d.%03d-UTC.json", calendar.get(Calendar.HOUR_OF_DAY),
calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND), calendar.get(Calendar.MILLISECOND));
final String year = String.format("%04d", calendar.get(Calendar.YEAR));
final String month = String.format("%02d", calendar.get(Calendar.MONTH));
final String month = String.format("%02d", calendar.get(Calendar.MONTH)+1);
final String dayOfMonth = String.format("%02d", calendar.get(Calendar.DATE));
final String generatedKey = combineElementsToKey(prefix, deviceIdentifier.getStringRepresentation(), year,
month, dayOfMonth, collectionName);
@@ -480,7 +480,7 @@ public class LandscapeServiceImpl implements LandscapeService {
Util.addAll(eids, eventIDs);
}
final ReverseProxy<String, SailingAnalyticsMetrics, SailingAnalyticsProcess<String>, RotatingFileBasedLog> reverseProxyCluster =
getLandscape().getReverseProxyCluster(region);
getLandscape().getCentralReverseProxy(region);
// TODO bug5311: when refactoring this for general scope migration, moving to a dedicated replica set will not require this
// TODO bug5311: when refactoring this for general scope migration, moving into a cold storage server other than ARCHIVE will require ALBToReverseProxyRedirectMapper instead
logger.info("Adding reverse proxy rules for migrated content pointing to ARCHIVE");
@@ -10,7 +10,6 @@ import org.osgi.util.tracker.ServiceTracker;
import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.domain.tractracadapter.TracTracAdapterFactory;
import com.sap.sailing.server.interfaces.RacingEventService;
import com.sap.sse.InvalidDateException;
@@ -135,16 +134,6 @@ public abstract class SailingServerHttpServlet extends HttpServlet {
return timePoint;
}
protected TrackedRace getTrackedRace(HttpServletRequest req) {
Regatta regatta = getRegatta(req);
RaceDefinition race = getRaceDefinition(req);
TrackedRace trackedRace = null;
if (regatta != null && race != null) {
trackedRace = getService().getOrCreateTrackedRegatta(regatta).getTrackedRace(race);
}
return trackedRace;
}
protected TypeBasedServiceFinderFactory getServiceFinderFactory() {
return serviceFinderFactory;
}
@@ -1429,7 +1429,7 @@ public class RegattasResource extends AbstractSailingServerResource {
if (race == null) {
response = getBadRaceErrorResponse(regattaName, raceName);
} else {
DynamicTrackedRace trackedRace = getService().getTrackedRace(regatta, race);
final DynamicTrackedRace trackedRace = getService().getTrackedRace(regatta, race);
if (trackedRace != null) {
TargetTimeInfo targetTime;
try {
@@ -107,7 +107,10 @@ public class WindResource extends AbstractSailingServerResource {
RegattaNameAndRaceName identifier = new RegattaNameAndRaceName(regattaName, raceName);
// add wind only to those races the subject is permitted to update
if (getSecurityService().hasCurrentUserUpdatePermission(identifier)) {
result.add(new RaceIdentifierAndTrackedRace(identifier, getService().getTrackedRace(identifier)));
final DynamicTrackedRace trackedRace = getService().getTrackedRace(identifier);
if (trackedRace != null) {
result.add(new RaceIdentifierAndTrackedRace(identifier, trackedRace));
}
}
}
} else {
@@ -365,31 +365,34 @@ public class ExpeditionAllInOneImporter {
securityService.checkCurrentUserExplicitPermissions(service.getRegatta(new RegattaName(regattaNameAndleaderboardName)), DefaultActions.UPDATE);
securityService.checkCurrentUserExplicitPermissions(service.getLeaderboardByName(regattaNameAndleaderboardName), DefaultActions.UPDATE);
if (importMode == ImportMode.NEW_COMPETITOR) {
securityService.checkCurrentUserExplicitPermissions(service.getTrackedRace(new RegattaNameAndRaceName(regattaNameAndleaderboardName, trackedRaceName)), DefaultActions.UPDATE);
final TimePointsOfFirstAndLastFix firstAndLastFixAt = importFixes(filenameWithSuffix, fileItem, jsonHolderForGpsFixImport, jsonHolderForSensorFixImport, errors);
ensureEventLongEnough(firstAndLastFixAt.getFirstFixAt(), firstAndLastFixAt.getLastFixAt(), eventId);
final Iterable<RaceColumn> raceColumns = regattaLeaderboard.getRaceColumns();
if (Util.isEmpty(raceColumns)) {
return new ImporterResult(serverStringMessages.get(uiLocale, "allInOneErrorInvalidRace"));
}
try {
for (RaceColumn raceColumn : raceColumns) {
final Iterable<? extends Fleet> fleets = raceColumn.getFleets();
if (Util.size(fleets) != 1) {
return new ImporterResult(serverStringMessages.get(uiLocale, "allInOneErrorSplitFleetNotSupported"));
final DynamicTrackedRace trackedRace = service.getTrackedRace(new RegattaNameAndRaceName(regattaNameAndleaderboardName, trackedRaceName));
if (trackedRace != null) {
securityService.checkCurrentUserExplicitPermissions(trackedRace, DefaultActions.UPDATE);
final TimePointsOfFirstAndLastFix firstAndLastFixAt = importFixes(filenameWithSuffix, fileItem, jsonHolderForGpsFixImport, jsonHolderForSensorFixImport, errors);
ensureEventLongEnough(firstAndLastFixAt.getFirstFixAt(), firstAndLastFixAt.getLastFixAt(), eventId);
final Iterable<RaceColumn> raceColumns = regattaLeaderboard.getRaceColumns();
if (Util.isEmpty(raceColumns)) {
return new ImporterResult(serverStringMessages.get(uiLocale, "allInOneErrorInvalidRace"));
}
try {
for (RaceColumn raceColumn : raceColumns) {
final Iterable<? extends Fleet> fleets = raceColumn.getFleets();
if (Util.size(fleets) != 1) {
return new ImporterResult(serverStringMessages.get(uiLocale, "allInOneErrorSplitFleetNotSupported"));
}
final Fleet fleet = fleets.iterator().next();
DynamicTrackedRace trackedRaceForColumn = (DynamicTrackedRace) raceColumn.getTrackedRace(fleet);
if (trackedRaceForColumn == null) {
trackedRaceForColumn = trackRace(regattaLeaderboard, raceColumn, fleet);
}
trackedRaces.add(trackedRaceForColumn);
raceNameRaceColumnNameFleetnameList
.add(new Triple<>(trackedRaceForColumn.getRaceIdentifier().getRaceName(),
raceColumn.getName(), fleet.getName()));
}
final Fleet fleet = fleets.iterator().next();
DynamicTrackedRace trackedRaceForColumn = (DynamicTrackedRace) raceColumn.getTrackedRace(fleet);
if (trackedRaceForColumn == null) {
trackedRaceForColumn = trackRace(regattaLeaderboard, raceColumn, fleet);
}
trackedRaces.add(trackedRaceForColumn);
raceNameRaceColumnNameFleetnameList
.add(new Triple<>(trackedRaceForColumn.getRaceIdentifier().getRaceName(),
raceColumn.getName(), fleet.getName()));
} catch (Exception e) {
throw new AllInOneImportException(e, errors);
}
} catch (Exception e) {
throw new AllInOneImportException(e, errors);
}
} else if (importMode == ImportMode.NEW_RACE) {
// When uploading files with identical name, the second RaceColumn will be named with the upload time in its name
@@ -28,32 +28,34 @@ public class TrackFilesExportPostServlet extends SailingServerHttpServlet {
private static final Logger log = Logger.getLogger(TrackFilesExportPostServlet.class.toString());
private TrackedRace getTrackedRace(String regattaString, String raceString) {
Regatta regatta = getService().getRegattaByName(regattaString);
if (regatta == null)
return null;
RaceDefinition race = regatta.getRaceByName(raceString);
if (race == null)
return null;
return getService().getTrackedRace(regatta, race);
final TrackedRace result;
final Regatta regatta = getService().getRegattaByName(regattaString);
if (regatta == null) {
result = null;
} else {
final RaceDefinition race = regatta.getRaceByName(raceString);
if (race == null) {
result = null;
} else {
result = getService().getTrackedRace(regatta, race);
}
}
return result;
}
private List<TrackedRace> getTrackedRaces(String[] regattaRaces) {
List<TrackedRace> races = new ArrayList<TrackedRace>();
final List<TrackedRace> races = new ArrayList<TrackedRace>();
for (String regattaRace : regattaRaces) {
String[] split = regattaRace.split(":");
if (split.length == 0)
continue;
String regattaString = split[0];
String raceString = split[1];
TrackedRace trackedRace = getTrackedRace(regattaString, raceString);
if (trackedRace == null)
continue;
races.add(trackedRace);
final String[] split = regattaRace.split(":");
if (split.length != 0) {
final String regattaString = split[0];
final String raceString = split[1];
final TrackedRace trackedRace = getTrackedRace(regattaString, raceString);
if (trackedRace != null) {
races.add(trackedRace);
}
}
}
return races;
}
@@ -144,17 +144,17 @@ public abstract class AbstractWindImporter {
if (uploadRequest.races.size() > 0) {
for (RegattaAndRaceIdentifier raceEntry : uploadRequest.races) {
DynamicTrackedRace trackedRace = service.getTrackedRace(raceEntry);
SecurityUtils.getSubject()
.checkPermission(trackedRace.getIdentifier().getStringPermission(DefaultActions.UPDATE));
if (trackedRace != null) {
SecurityUtils.getSubject()
.checkPermission(trackedRace.getIdentifier().getStringPermission(DefaultActions.UPDATE));
trackedRaces.add(trackedRace);
}
}
} else {
for (Regatta regatta : service.getAllRegattas()) {
for (RaceDefinition raceDefinition : regatta.getAllRaces()) {
final DynamicTrackedRace trackedRace = service.getTrackedRegatta(regatta).getTrackedRace(raceDefinition);
if (SecurityUtils.getSubject()
final DynamicTrackedRace trackedRace = service.getTrackedRegatta(regatta).getExistingTrackedRace(raceDefinition);
if (trackedRace != null && SecurityUtils.getSubject()
.isPermitted(trackedRace.getIdentifier().getStringPermission(DefaultActions.UPDATE))) {
trackedRaces.add(trackedRace);
}
@@ -161,11 +161,18 @@ public interface RacingEventService extends TrackedRegattaRegistry, RegattaFetch
@Override
RaceDefinition getRace(RegattaAndRaceIdentifier raceIdentifier);
/**
* Looks for a {@link DynamicTrackedRace} inside the {@link TrackedRegatta} identified by {@code regatta},
* keyed by the race definition {@code race}. If no such race is found, e.g., because it is still in its "loading"
* phase and the {@link TrackedRace} hasn't been created and added to the {@link TrackedRegatta} yet, or because
* it is in the process of being removed, with the {@link TrackedRace} already gone but the {@link RaceDefinition}
* still available (see also bug 5982), this method will return {@code null} without any waiting or blocking.
*/
DynamicTrackedRace getTrackedRace(Regatta regatta, RaceDefinition race);
/**
* When the regatta, tracked regatta and race definition are found, this method waits for the
* tracked race to appear.
* This method does not for the tracked race to appear. If any of regatta, race definition or tracked race are not
* found, {@code null} is returned.
*/
DynamicTrackedRace getTrackedRace(RegattaAndRaceIdentifier raceIdentifier);
@@ -475,6 +475,8 @@ public class ImportMasterDataOperation extends
DynamicTrackedRace trackedRace = toState
.getTrackedRace((RegattaAndRaceIdentifier) raceIdentifier);
raceColumn.setTrackedRace(fleet, trackedRace);
// in case the TrackedRace wasn't found (see also bug 5982), at least record the race identifier
raceColumn.setRaceIdentifier(fleet, raceIdentifier);
}
}
}
@@ -708,7 +710,7 @@ public class ImportMasterDataOperation extends
RaceHandle raceHandle = toState.addRace(/* default */ null, paramToStartTracking, /* do not wait */ -1);
final RaceDefinition race = raceHandle.getRace(RaceTracker.TIMEOUT_FOR_RECEIVING_RACE_DEFINITION_IN_MILLISECONDS);
if (race != null) {
final DynamicTrackedRace trackedRace = raceHandle.getTrackedRegatta().getTrackedRace(race);
final DynamicTrackedRace trackedRace = raceHandle.getTrackedRegatta().getTrackedRace(race); // wait/block for tracked race to show up
result.add(trackedRace);
ensureOwnership(trackedRace.getIdentifier(), securityService);
creationCount.addOneTrackedRace(race.getId().toString());
@@ -34,295 +34,291 @@
<stringAttribute key="profilingTraceType-PERFORMANCE_HOTSPOT_TRACE" value="KEY_IGNORE_SLEEPING_THREADS%CTX_KEY%false%CTX_ENTRY%KEY_APPLICATION_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_SESSION_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_ENABLEMENT%CTX_KEY%true%CTX_ENTRY%KEY_USER_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_REQUEST_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_TENANT_FILTER%CTX_KEY%*%CTX_ENTRY%"/>
<stringAttribute key="profilingTraceType-SYNCHRONIZATION_TRACE" value="KEY_APPLICATION_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_SESSION_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_ENABLEMENT%CTX_KEY%false%CTX_ENTRY%KEY_USER_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_REQUEST_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_TENANT_FILTER%CTX_KEY%*%CTX_ENTRY%"/>
<setAttribute key="selected_target_bundles">
<setEntry value="routeconverter@default:default"/>
<setEntry value="org.apache.commons.codec@default:default"/>
<setEntry value="org.apache.poi@default:default"/>
<setEntry value="org.apache.poi.ooxml@default:default"/>
<setEntry value="org.apache.poi.ooxml.schemas@default:default"/>
<setEntry value="org.apache.commons.collections4@default:default"/>
<setEntry value="org.apache.commons.compress@default:default"/>
<setEntry value="org.apache.poi.source@default:default"/>
<setEntry value="org.apache.poi.ooxml.source@default:default"/>
<setEntry value="org.apache.commons.collections4.source@default:default"/>
<setEntry value="org.apache.commons.compress.source@default:default"/>
<setEntry value="org.dom4j@default:default"/>
<setEntry value="org.apache.xmlbeans@default:default"/>
<setEntry value="org.apache.commons.math@default:default"/>
<setEntry value="org.apache.httpcomponents.httpclient@default:default"/>
<setEntry value="org.apache.httpcomponents.httpcore@default:default"/>
<setEntry value="org.hyperic.sigar@default:default"/>
<setEntry value="com.sun.jersey.contribs.jersey-multipart@default:default"/>
<setEntry value="javax.validation@default:default"/>
<setEntry value="org.apache.commons.fileupload@default:default"/>
<setEntry value="org.jvnet.mimepull@default:default"/>
<setEntry value="org.apache.commons.math3@default:default"/>
<setEntry value="org.mongodb.driver-core@default:default"/>
<setEntry value="org.mongodb.driver-core.source@default:default"/>
<setEntry value="org.mongodb.bson@default:default"/>
<setEntry value="org.mongodb.bson.source@default:default"/>
<setEntry value="org.mongodb.driver-sync@default:default"/>
<setEntry value="org.mongodb.driver-sync@default:default"/>
<setEntry value="org.eclipse.jetty.osgi.boot@3:true"/>
<setEntry value="org.eclipse.jetty.osgi.boot.warurl@default:default"/>
<setEntry value="org.hyperic.sigar@default:default"/>
<setEntry value="slf4j.jdk14@default:default"/>
<setEntry value="lz4-java@default:default"/>
<setEntry value="org.apache.felix.gogo.command@default:default"/>
<setEntry value="org.apache.felix.gogo.runtime@default:default"/>
<setEntry value="org.apache.felix.gogo.shell@default:default"/>
<setEntry value="org.eclipse.jetty.deploy@default:default"/>
<setEntry value="org.eclipse.jetty.deploy.source@default:default"/>
<setEntry value="org.eclipse.jetty.http@3:true"/>
<setEntry value="org.eclipse.jetty.http.source@default:default"/>
<setEntry value="org.eclipse.jetty.io@default:default"/>
<setEntry value="org.eclipse.jetty.io.source@default:default"/>
<setEntry value="org.eclipse.jetty.jmx@default:default"/>
<setEntry value="org.eclipse.jetty.jmx.source@default:default"/>
<setEntry value="org.eclipse.jetty.security@default:default"/>
<setEntry value="org.eclipse.jetty.security.source@default:default"/>
<setEntry value="org.eclipse.jetty.server@default:default"/>
<setEntry value="org.eclipse.jetty.server.source@default:default"/>
<setEntry value="org.eclipse.jetty.servlet@default:default"/>
<setEntry value="org.eclipse.jetty.servlet.source@default:default"/>
<setEntry value="org.eclipse.jetty.util@default:default"/>
<setEntry value="org.eclipse.jetty.util.source@default:default"/>
<setEntry value="org.eclipse.jetty.util.ajax@default:default"/>
<setEntry value="org.eclipse.jetty.util.ajax.source@default:default"/>
<setEntry value="org.eclipse.jetty.webapp@default:default"/>
<setEntry value="org.eclipse.jetty.webapp.source@default:default"/>
<setEntry value="org.eclipse.jetty.websocket.api@default:default"/>
<setEntry value="org.eclipse.jetty.websocket.api.source@default:default"/>
<setEntry value="org.eclipse.jetty.websocket.client@default:default"/>
<setEntry value="org.eclipse.jetty.websocket.client.source@default:default"/>
<setEntry value="org.eclipse.jetty.websocket.common@default:default"/>
<setEntry value="org.eclipse.jetty.websocket.common.source@default:default"/>
<setEntry value="org.eclipse.jetty.xml@default:default"/>
<setEntry value="org.eclipse.jetty.xml.source@default:default"/>
<setEntry value="slf4j.api@default:default"/>
<setEntry value="org.apache.servicemix.bundles.zxing@default:default"/>
<setEntry value="org.apache.commons.io@default:default"/>
<setEntry value="jcl.over.slf4j@default:default"/>
<setEntry value="com.sun.mail.javax.mail@default:default"/>
<setEntry value="com.rabbitmq.client@default:default"/>
<setEntry value="com.rabbitmq.client.source@default:default"/>
<setEntry value="org.apache.commons.lang@default:default"/>
<setEntry value="org.apache.commons.logging@default:default"/>
<setEntry value="jackson-jaxrs@default:default"/>
<setEntry value="com.sun.jersey@default:default"/>
<setEntry value="javax.ws.rs@default:default"/>
<setEntry value="org.apache.commons.beanutils@default:default"/>
<setEntry value="org.apache.commons.beanutils.source@default:default"/>
<setEntry value="org.apache.servicemix.bundles.ehcache@default:default"/>
<setEntry value="org.apache.servicemix.bundles.scribe@default:default"/>
<setEntry value="org.owasp.encoder@default:default"/>
<setEntry value="org.owasp.encoder.source@default:default"/>
<setEntry value="org.apache.shiro.core@default:default"/>
<setEntry value="org.apache.shiro.core.source@default:default"/>
<setEntry value="org.apache.shiro.ehcache@default:default"/>
<setEntry value="org.apache.shiro.ehcache.source@default:default"/>
<setEntry value="org.apache.shiro.web@default:default"/>
<setEntry value="org.apache.shiro.web.source@default:default"/>
<setEntry value="jackson-core-asl@default:default"/>
<setEntry value="jackson-mapper-asl@default:default"/>
<setEntry value="org.apache.commons.collections@default:default"/>
<setEntry value="org.eclipse.jetty.client@default:default"/>
<setEntry value="javax.xml@default:default"/>
<setEntry value="com.sun.activation.javax.activation@default:default"/>
<setEntry value="org.eclipse.equinox.common@2:true"/>
<setEntry value="org.eclipse.equinox.console@default:default"/>
<setEntry value="org.eclipse.equinox.launcher@default:default"/>
<setEntry value="org.eclipse.equinox.simpleconfigurator@2:true"/>
<setEntry value="org.eclipse.osgi@-1:true"/>
<setEntry value="org.eclipse.osgi.source@default:default"/>
<setEntry value="org.osgi.util.promise@default:default"/>
<setEntry value="org.osgi.util.promise.source@default:default"/>
<setEntry value="org.osgi.util.function@default:default"/>
<setEntry value="org.osgi.util.function.source@default:default"/>
<setEntry value="org.osgi.util.measurement@default:default"/>
<setEntry value="org.osgi.util.measurement.source@default:default"/>
<setEntry value="org.osgi.util.position@default:default"/>
<setEntry value="org.osgi.util.position.source@default:default"/>
<setEntry value="org.osgi.util.xml@default:default"/>
<setEntry value="org.osgi.util.xml.source@default:default"/>
<setEntry value="org.eclipse.osgi.services@default:default"/>
<setEntry value="org.eclipse.osgi.services.source@default:default"/>
<setEntry value="org.eclipse.equinox.cm@default:default"/>
<setEntry value="com.sun.istack.commons-runtime@default:default"/>
<setEntry value="com.sun.xml.bind.jaxb-impl@default:default"/>
<setEntry value="javax.xml.stream@default:default"/>
<setEntry value="javax.xml.ws@default:default"/>
<setEntry value="javax.xml.soap@default:default"/>
<setEntry value="org.eclipse.osgi.util@default:default"/>
<setEntry value="org.eclipse.osgi.util.source@default:default"/>
<setEntry value="com.chargebee.chargebee-java@default:default"/>
<setEntry value="com.github.mwiede.jsch@default:default"/>
<setEntry value="com.github.mwiede.jsch.source@default:default"/>
<setEntry value="bcprov-ext@default:default"/>
<setEntry value="com.amazon.aws.aws-java-api@default:default"/>
<setEntry value="com.amazon.aws.aws-java-api.source@default:default"/>
<setEntry value="org.objectweb.asm@default:default"/>
<setEntry value="org.objectweb.asm.commons@default:default"/>
<setEntry value="org.objectweb.asm.analysis@default:default"/>
<setEntry value="org.objectweb.asm.tree@default:default"/>
<setEntry value="org.objectweb.asm.util@default:default"/>
<setEntry value="org.objectweb.asm.source@default:default"/>
<setEntry value="org.objectweb.asm.analysis.source@default:default"/>
<setEntry value="org.objectweb.asm.commons.source@default:default"/>
<setEntry value="org.objectweb.asm.tree.source@default:default"/>
<setEntry value="org.objectweb.asm.util.source@default:default"/>
<setEntry value="org.eclipse.jetty.apache-jsp@4:true"/>
<setEntry value="org.eclipse.jetty.apache-jsp.source@default:default"/>
<setEntry value="org.eclipse.jetty.osgi.boot.jsp@default:default"/>
<setEntry value="org.eclipse.jetty.osgi.boot.jsp.source@default:default"/>
<setEntry value="org.apache.geronimo.specs.geronimo-jta_1.1_spec@default:default"/>
<setEntry value="org.apache.aries.spifly.dynamic.bundle@3:true"/>
<setEntry value="org.apache.aries.spifly.dynamic.bundle.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp@default:default"/>
<setEntry value="org.eclipse.jdt.core.compiler.batch@default:default"/>
<setEntry value="org.apache.taglibs.standard-impl@default:default"/>
<setEntry value="org.apache.taglibs.taglibs-standard-spec@default:default"/>
<setEntry value="javax.annotation@default:default"/>
<setEntry value="org.eclipse.jetty.osgi-servlet-api@default:default"/>
<setEntry value="org.apache.xalan@default:default"/>
<setEntry value="org.apache.xml.serializer@default:default"/>
<setEntry value="org.eclipse.equinox.event@default:default"/>
<setEntry value="org.eclipse.jetty.annotations@4:true"/>
<setEntry value="org.eclipse.jetty.jndi@default:default"/>
<setEntry value="org.eclipse.jetty.plus@default:default"/>
<setEntry value="com.sap.db.jdbc@default:default"/>
<setEntry value="com.sap.db.jdbc.source@default:default"/>
<setEntry value="org.osgi.service.component@default:default"/>
<setEntry value="org.osgi.service.cm@default:default"/>
<setEntry value="org.osgi.util.tracker@default:default"/>
<setEntry value="org.osgi.service.event@default:default"/>
<setEntry value="org.osgi.service.packageadmin@default:default"/>
<setEntry value="org.osgi.service.url@default:default"/>
<setEntry value="com.github.haifengl.smile-core@default:default"/>
<setEntry value="com.github.haifengl.smile-core.source@default:default"/>
<setEntry value="com.github.haifengl.smile-data@default:default"/>
<setEntry value="com.github.haifengl.smile-data.source@default:default"/>
<setEntry value="com.github.haifengl.smile-graph@default:default"/>
<setEntry value="com.github.haifengl.smile-graph.source@default:default"/>
<setEntry value="com.github.haifengl.smile-math@default:default"/>
<setEntry value="com.github.haifengl.smile-math.source@default:default"/>
<setEntry value="com.google.gson@default:default"/>
<setEntry value="com.google.gson.source@default:default"/>
</setAttribute>
<setEntry value="bcprov-ext@default:default"/>
<setEntry value="com.amazon.aws.aws-java-api.source"/>
<setEntry value="com.amazon.aws.aws-java-api@default:default"/>
<setEntry value="com.chargebee.chargebee-java@default:default"/>
<setEntry value="com.github.haifengl.smile-core.source"/>
<setEntry value="com.github.haifengl.smile-core@default:default"/>
<setEntry value="com.github.haifengl.smile-data.source"/>
<setEntry value="com.github.haifengl.smile-data@default:default"/>
<setEntry value="com.github.haifengl.smile-graph.source"/>
<setEntry value="com.github.haifengl.smile-graph@default:default"/>
<setEntry value="com.github.haifengl.smile-math.source"/>
<setEntry value="com.github.haifengl.smile-math@default:default"/>
<setEntry value="com.github.mwiede.jsch.source"/>
<setEntry value="com.github.mwiede.jsch@default:default"/>
<setEntry value="com.google.gson.source"/>
<setEntry value="com.google.gson@default:default"/>
<setEntry value="com.rabbitmq.client.source"/>
<setEntry value="com.rabbitmq.client@default:default"/>
<setEntry value="com.sap.db.jdbc.source"/>
<setEntry value="com.sap.db.jdbc@default:default"/>
<setEntry value="com.sun.activation.javax.activation@default:default"/>
<setEntry value="com.sun.istack.commons-runtime@default:default"/>
<setEntry value="com.sun.jersey.contribs.jersey-multipart@default:default"/>
<setEntry value="com.sun.jersey@default:default"/>
<setEntry value="com.sun.mail.javax.mail@default:default"/>
<setEntry value="com.sun.xml.bind.jaxb-impl@default:default"/>
<setEntry value="jackson-core-asl@default:default"/>
<setEntry value="jackson-jaxrs@default:default"/>
<setEntry value="jackson-mapper-asl@default:default"/>
<setEntry value="javax.annotation@default:default"/>
<setEntry value="javax.validation@default:default"/>
<setEntry value="javax.ws.rs@default:default"/>
<setEntry value="javax.xml.soap@default:default"/>
<setEntry value="javax.xml.stream@default:default"/>
<setEntry value="javax.xml.ws@default:default"/>
<setEntry value="javax.xml@default:default"/>
<setEntry value="jcl.over.slf4j@default:default"/>
<setEntry value="lz4-java@default:default"/>
<setEntry value="org.apache.aries.spifly.dynamic.bundle.source"/>
<setEntry value="org.apache.aries.spifly.dynamic.bundle@3:true"/>
<setEntry value="org.apache.commons.beanutils.source@default:default"/>
<setEntry value="org.apache.commons.beanutils@default:default"/>
<setEntry value="org.apache.commons.codec@default:default"/>
<setEntry value="org.apache.commons.collections4.source"/>
<setEntry value="org.apache.commons.collections4@default:default"/>
<setEntry value="org.apache.commons.collections@default:default"/>
<setEntry value="org.apache.commons.compress.source"/>
<setEntry value="org.apache.commons.compress@default:default"/>
<setEntry value="org.apache.commons.fileupload@default:default"/>
<setEntry value="org.apache.commons.io@default:default"/>
<setEntry value="org.apache.commons.lang@default:default"/>
<setEntry value="org.apache.commons.logging@default:default"/>
<setEntry value="org.apache.commons.math3@default:default"/>
<setEntry value="org.apache.commons.math@default:default"/>
<setEntry value="org.apache.felix.gogo.command@default:default"/>
<setEntry value="org.apache.felix.gogo.runtime@default:default"/>
<setEntry value="org.apache.felix.gogo.shell@default:default"/>
<setEntry value="org.apache.geronimo.specs.geronimo-jta_1.1_spec@default:default"/>
<setEntry value="org.apache.httpcomponents.httpclient@default:default"/>
<setEntry value="org.apache.httpcomponents.httpcore@default:default"/>
<setEntry value="org.apache.poi.ooxml.schemas@default:default"/>
<setEntry value="org.apache.poi.ooxml.source"/>
<setEntry value="org.apache.poi.ooxml@default:default"/>
<setEntry value="org.apache.poi.source"/>
<setEntry value="org.apache.poi@default:default"/>
<setEntry value="org.apache.servicemix.bundles.ehcache@default:default"/>
<setEntry value="org.apache.servicemix.bundles.scribe@default:default"/>
<setEntry value="org.apache.servicemix.bundles.zxing@default:default"/>
<setEntry value="org.apache.shiro.core.source"/>
<setEntry value="org.apache.shiro.core@default:default"/>
<setEntry value="org.apache.shiro.ehcache.source"/>
<setEntry value="org.apache.shiro.ehcache@default:default"/>
<setEntry value="org.apache.shiro.web.source"/>
<setEntry value="org.apache.shiro.web@default:default"/>
<setEntry value="org.apache.taglibs.standard-impl@default:default"/>
<setEntry value="org.apache.taglibs.taglibs-standard-spec@default:default"/>
<setEntry value="org.apache.xalan@default:default"/>
<setEntry value="org.apache.xml.serializer@default:default"/>
<setEntry value="org.apache.xmlbeans@default:default"/>
<setEntry value="org.dom4j@default:default"/>
<setEntry value="org.eclipse.equinox.cm@default:default"/>
<setEntry value="org.eclipse.equinox.common@2:true"/>
<setEntry value="org.eclipse.equinox.console@default:default"/>
<setEntry value="org.eclipse.equinox.event@default:default"/>
<setEntry value="org.eclipse.equinox.launcher@default:default"/>
<setEntry value="org.eclipse.equinox.simpleconfigurator@2:true"/>
<setEntry value="org.eclipse.jdt.core.compiler.batch@default:default"/>
<setEntry value="org.eclipse.jetty.annotations@4:true"/>
<setEntry value="org.eclipse.jetty.apache-jsp.source"/>
<setEntry value="org.eclipse.jetty.apache-jsp@4:true"/>
<setEntry value="org.eclipse.jetty.client@default:default"/>
<setEntry value="org.eclipse.jetty.deploy.source"/>
<setEntry value="org.eclipse.jetty.deploy@default:default"/>
<setEntry value="org.eclipse.jetty.http.source"/>
<setEntry value="org.eclipse.jetty.http@3:true"/>
<setEntry value="org.eclipse.jetty.io.source"/>
<setEntry value="org.eclipse.jetty.io@default:default"/>
<setEntry value="org.eclipse.jetty.jmx.source"/>
<setEntry value="org.eclipse.jetty.jmx@default:default"/>
<setEntry value="org.eclipse.jetty.jndi@default:default"/>
<setEntry value="org.eclipse.jetty.osgi-servlet-api@default:default"/>
<setEntry value="org.eclipse.jetty.osgi.boot.jsp.source"/>
<setEntry value="org.eclipse.jetty.osgi.boot.jsp@default:false"/>
<setEntry value="org.eclipse.jetty.osgi.boot.warurl@default:default"/>
<setEntry value="org.eclipse.jetty.osgi.boot@3:true"/>
<setEntry value="org.eclipse.jetty.plus@default:default"/>
<setEntry value="org.eclipse.jetty.security.source"/>
<setEntry value="org.eclipse.jetty.security@default:default"/>
<setEntry value="org.eclipse.jetty.server.source"/>
<setEntry value="org.eclipse.jetty.server@default:default"/>
<setEntry value="org.eclipse.jetty.servlet.source"/>
<setEntry value="org.eclipse.jetty.servlet@default:default"/>
<setEntry value="org.eclipse.jetty.util.ajax.source"/>
<setEntry value="org.eclipse.jetty.util.ajax@default:default"/>
<setEntry value="org.eclipse.jetty.util.source"/>
<setEntry value="org.eclipse.jetty.util@default:default"/>
<setEntry value="org.eclipse.jetty.webapp.source"/>
<setEntry value="org.eclipse.jetty.webapp@default:default"/>
<setEntry value="org.eclipse.jetty.websocket.api.source"/>
<setEntry value="org.eclipse.jetty.websocket.api@default:default"/>
<setEntry value="org.eclipse.jetty.websocket.client.source"/>
<setEntry value="org.eclipse.jetty.websocket.client@default:default"/>
<setEntry value="org.eclipse.jetty.websocket.common.source"/>
<setEntry value="org.eclipse.jetty.websocket.common@default:default"/>
<setEntry value="org.eclipse.jetty.xml.source"/>
<setEntry value="org.eclipse.jetty.xml@default:default"/>
<setEntry value="org.eclipse.osgi.services.source"/>
<setEntry value="org.eclipse.osgi.services@default:default"/>
<setEntry value="org.eclipse.osgi.source"/>
<setEntry value="org.eclipse.osgi.util.source"/>
<setEntry value="org.eclipse.osgi.util@default:default"/>
<setEntry value="org.eclipse.osgi@-1:true"/>
<setEntry value="org.hyperic.sigar@default:default"/>
<setEntry value="org.jvnet.mimepull@default:default"/>
<setEntry value="org.mongodb.bson.source"/>
<setEntry value="org.mongodb.bson@default:default"/>
<setEntry value="org.mongodb.driver-core.source"/>
<setEntry value="org.mongodb.driver-core@default:default"/>
<setEntry value="org.mongodb.driver-sync@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp@default:default"/>
<setEntry value="org.objectweb.asm.analysis.source"/>
<setEntry value="org.objectweb.asm.analysis@default:default"/>
<setEntry value="org.objectweb.asm.commons.source"/>
<setEntry value="org.objectweb.asm.commons@default:default"/>
<setEntry value="org.objectweb.asm.source"/>
<setEntry value="org.objectweb.asm.tree.source"/>
<setEntry value="org.objectweb.asm.tree@default:default"/>
<setEntry value="org.objectweb.asm.util.source"/>
<setEntry value="org.objectweb.asm.util@default:default"/>
<setEntry value="org.objectweb.asm@default:default"/>
<setEntry value="org.osgi.service.cm@default:default"/>
<setEntry value="org.osgi.service.component@default:default"/>
<setEntry value="org.osgi.service.event@default:default"/>
<setEntry value="org.osgi.service.packageadmin@default:default"/>
<setEntry value="org.osgi.service.url@default:default"/>
<setEntry value="org.osgi.util.function.source"/>
<setEntry value="org.osgi.util.function@default:default"/>
<setEntry value="org.osgi.util.measurement.source"/>
<setEntry value="org.osgi.util.measurement@default:default"/>
<setEntry value="org.osgi.util.position.source"/>
<setEntry value="org.osgi.util.position@default:default"/>
<setEntry value="org.osgi.util.promise.source"/>
<setEntry value="org.osgi.util.promise@default:default"/>
<setEntry value="org.osgi.util.tracker@default:default"/>
<setEntry value="org.osgi.util.xml.source"/>
<setEntry value="org.osgi.util.xml@default:default"/>
<setEntry value="org.owasp.encoder.source"/>
<setEntry value="org.owasp.encoder@default:default"/>
<setEntry value="routeconverter@default:default"/>
<setEntry value="slf4j.api@default:default"/>
<setEntry value="slf4j.jdk14@default:false"/>
</setAttribute>
<setAttribute key="selected_workspace_bundles">
<setEntry value="com.sap.sailing.geocoding@default:default"/>
<setEntry value="com.sap.sailing.domain.common@default:default"/>
<setEntry value="com.sap.sailing.domain@default:default"/>
<setEntry value="com.sap.sailing.news@4:true"/>
<setEntry value="com.sap.sailing.domain.tractracadapter@5:true"/>
<setEntry value="com.sap.sailing.expeditionconnector@default:default"/>
<setEntry value="com.sap.sailing.domain.windfinderadapter@4:true"/>
<setEntry value="com.sap.sailing.server@5:true"/>
<setEntry value="com.sap.sailing.server.gateway@5:true"/>
<setEntry value="com.sap.sailing.server.gateway.interfaces@default:default"/>
<setEntry value="com.tractrac.clientmodule@default:default"/>
<setEntry value="com.sap.sailing.declination@default:default"/>
<setEntry value="com.sap.sailing.domain.persistence@default:default"/>
<setEntry value="com.sap.sailing.domain.swisstimingadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.swisstimingadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.domain.swisstimingreplayadapter@4:true"/>
<setEntry value="com.sap.sailing.domain.tractracadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.gwt.ui@6:true"/>
<setEntry value="com.sap.sailing.udpconnector@default:default"/>
<setEntry value="com.sap.sailing.simulator@default:default"/>
<setEntry value="com.sap.sailing.www@5:true"/>
<setEntry value="com.sap.sailing.resultimport@4:true"/>
<setEntry value="com.sap.sailing.kiworesultimport@4:true"/>
<setEntry value="com.sap.sailing.ess40.resultimport@4:true"/>
<setEntry value="com.sap.sailing.freg.resultimport@4:true"/>
<setEntry value="com.sap.sailing.barbados.resultimport@4:true"/>
<setEntry value="com.sap.sailing.sailwave.resultimport@4:true"/>
<setEntry value="com.sap.sailing.manage2sail.resultimport@4:true"/>
<setEntry value="com.sap.sailing.sailti.resultimport@4:true"/>
<setEntry value="com.sap.sailing.yachtscoring.resultimport@4:true"/>
<setEntry value="com.sap.sailing.velum.resultimport@4:true"/>
<setEntry value="com.sap.sailing.monitoring@7:true"/>
<setEntry value="com.sap.sailing.xrr.resultimport@4:true"/>
<setEntry value="com.sap.sailing.domain.igtimiadapter@4:true"/>
<setEntry value="com.sap.sailing.domain.igtimiadapter.persistence@default:default"/>
<setEntry value="com.sap.sailing.domain.racelogtrackingadapter@4:true"/>
<setEntry value="com.sap.sailing.domain.deckmanadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.oceanraceadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.xrr.structureimport@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization.shared.android@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization@default:default"/>
<setEntry value="com.sap.sailing.dashboards.gwt@6:true"/>
<setEntry value="com.sap.sailing.dashboards.gwt@6:true"/>
<setEntry value="com.sap.sailing.datamining@5:true"/>
<setEntry value="com.sap.sailing.datamining.shared@default:default"/>
<setEntry value="com.sap.sailing.polars@5:true"/>
<setEntry value="com.sap.sailing.windestimation@5:true"/>
<setEntry value="com.sap.sailing.polars.datamining@5:true"/>
<setEntry value="com.sap.sailing.domain.shared.android@default:default"/>
<setEntry value="com.sap.sailing.manage2sail@default:default"/>
<setEntry value="com.sap.sailing.polars.datamining.shared@default:default"/>
<setEntry value="com.sap.sailing.xrr.schema@default:default"/>
<setEntry value="com.sap.sailing.server.trackfiles@default:default"/>
<setEntry value="com.sap.sailing.competitorimport@default:default"/>
<setEntry value="com.sap.sailing.datamining.provider@default:default"/>
<setEntry value="com.sap.sailing.grib@default:default"/>
<setEntry value="com.sap.sailing.nmeaconnector@default:default"/>
<setEntry value="com.sap.sailing.domain.expeditionadapter@5:true"/>
<setEntry value="com.sap.sailing.expeditionconnector.persistence@4:true"/>
<setEntry value="com.sap.sailing.expeditionconnector.common@default:default"/>
<setEntry value="com.sap.sailing.domain.bravoadapter@5:true"/>
<setEntry value="net.sf.marineapi@default:default"/>
<setEntry value="com.sap.sailing.routeconverterjava11extension@default:default"/>
<setEntry value="com.sap.sailing.server.interface@default:default"/>
<setEntry value="com.sap.sse.datamining.ui@default:default"/>
<setEntry value="com.sap.sailing.domain.igtimiadapter.gateway@5:true"/>
<setEntry value="com.sap.sailing.shared.server@5:true"/>
<setEntry value="com.sap.sailing.shared.server.gateway@5:true"/>
<setEntry value="com.sap.sailing.shared.persistence@default:default"/>
<setEntry value="com.sap.sailing.landscape@default:default"/>
<setEntry value="com.sap.sailing.landscape.gateway@5:true"/>
<setEntry value="com.sap.sailing.landscape.common@default:default"/>
<setEntry value="com.sap.sailing.landscape.ui@default:default"/>
<setEntry value="com.sap.sailing.hanaexport@5:true"/>
<setEntry value="com.tractrac.clientmodule@default:default"/>
<setEntry value="com.sap.sse.gwt@default:default"/>
<setEntry value="com.google.gwt.servlet@default:default"/>
<setEntry value="com.sap.sse.security@default:default"/>
<setEntry value="com.sap.sse.security.ui@6:true"/>
<setEntry value="com.sap.sse.security.userstore.mongodb@4:true"/>
<setEntry value="com.sap.sse@default:default"/>
<setEntry value="com.sap.sse.common@default:default"/>
<setEntry value="com.sap.sse.datamining@default:default"/>
<setEntry value="com.sap.sse.datamining.annotations@default:default"/>
<setEntry value="com.sap.sse.datamining.shared@default:default"/>
<setEntry value="com.sap.sse.gwt.adminconsole@default:default"/>
<setEntry value="com.sap.sse.mongodb@default:default"/>
<setEntry value="com.sap.sse.operationaltransformation@default:default"/>
<setEntry value="com.sap.sse.replication@6:true"/>
<setEntry value="com.sap.sse.filestorage@4:true"/>
<setEntry value="com.sap.sse.shared.android@default:default"/>
<setEntry value="com.sap.sse.mail@5:true"/>
<setEntry value="com.sap.sse.threadmanager@default:default"/>
<setEntry value="com.sap.sse.security.common@default:default"/>
<setEntry value="org.json.simple@default:default"/>
<setEntry value="org.moxieapps.gwt.highcharts@default:default"/>
<setEntry value="com.googlecode.java-diff-utils@default:default"/>
<setEntry value="org.mp4parser.isoparser@default:default"/>
<setEntry value="com.sap.sse.replication.interfaces@default:default"/>
<setEntry value="com.sap.sse.security.datamining@5:true"/>
<setEntry value="com.sap.sse.security.persistence@default:default"/>
<setEntry value="com.sap.sse.security.interface@default:default"/>
<setEntry value="com.sap.sse.replication.persistence@default:default"/>
<setEntry value="com.sap.sse.landscape.common@default:default"/>
<setEntry value="com.sap.sse.landscape@default:default"/>
<setEntry value="com.sap.sse.landscape.aws@4:true"/>
<setEntry value="com.sap.sse.landscape.aws.common@default:default"/>
<setEntry value="com.sap.sse.landscape.aws.persistence@default:default"/>
<setEntry value="com.sap.sse.debranding@default:default"/>
<setEntry value="elemental2@default:default"/>
</setAttribute>
<setEntry value="com.google.gwt.servlet@default:default"/>
<setEntry value="com.googlecode.java-diff-utils@default:default"/>
<setEntry value="com.sap.sailing.barbados.resultimport@4:true"/>
<setEntry value="com.sap.sailing.competitorimport@default:default"/>
<setEntry value="com.sap.sailing.dashboards.gwt@6:true"/>
<setEntry value="com.sap.sailing.datamining.provider@default:default"/>
<setEntry value="com.sap.sailing.datamining.shared@default:default"/>
<setEntry value="com.sap.sailing.datamining@5:true"/>
<setEntry value="com.sap.sailing.declination@default:default"/>
<setEntry value="com.sap.sailing.domain.bravoadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.common@default:default"/>
<setEntry value="com.sap.sailing.domain.deckmanadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.expeditionadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.igtimiadapter.gateway@5:true"/>
<setEntry value="com.sap.sailing.domain.igtimiadapter.persistence@default:default"/>
<setEntry value="com.sap.sailing.domain.igtimiadapter@4:true"/>
<setEntry value="com.sap.sailing.domain.oceanraceadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.persistence@default:default"/>
<setEntry value="com.sap.sailing.domain.racelogtrackingadapter@4:true"/>
<setEntry value="com.sap.sailing.domain.shared.android@default:default"/>
<setEntry value="com.sap.sailing.domain.swisstimingadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.domain.swisstimingadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.swisstimingreplayadapter@4:true"/>
<setEntry value="com.sap.sailing.domain.tractracadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.domain.tractracadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.windfinderadapter@4:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter@5:true"/>
<setEntry value="com.sap.sailing.domain@default:default"/>
<setEntry value="com.sap.sailing.ess40.resultimport@4:true"/>
<setEntry value="com.sap.sailing.expeditionconnector.common@default:default"/>
<setEntry value="com.sap.sailing.expeditionconnector.persistence@4:true"/>
<setEntry value="com.sap.sailing.expeditionconnector@default:default"/>
<setEntry value="com.sap.sailing.freg.resultimport@4:true"/>
<setEntry value="com.sap.sailing.geocoding@default:default"/>
<setEntry value="com.sap.sailing.grib@default:default"/>
<setEntry value="com.sap.sailing.gwt.ui@6:true"/>
<setEntry value="com.sap.sailing.hanaexport@5:true"/>
<setEntry value="com.sap.sailing.kiworesultimport@4:true"/>
<setEntry value="com.sap.sailing.landscape.common@default:default"/>
<setEntry value="com.sap.sailing.landscape.gateway@5:true"/>
<setEntry value="com.sap.sailing.landscape.ui@default:default"/>
<setEntry value="com.sap.sailing.landscape@default:default"/>
<setEntry value="com.sap.sailing.manage2sail.resultimport@4:true"/>
<setEntry value="com.sap.sailing.manage2sail@default:default"/>
<setEntry value="com.sap.sailing.monitoring@7:true"/>
<setEntry value="com.sap.sailing.news@4:true"/>
<setEntry value="com.sap.sailing.nmeaconnector@default:default"/>
<setEntry value="com.sap.sailing.polars.datamining.shared@default:default"/>
<setEntry value="com.sap.sailing.polars.datamining@5:true"/>
<setEntry value="com.sap.sailing.polars@5:true"/>
<setEntry value="com.sap.sailing.resultimport@4:true"/>
<setEntry value="com.sap.sailing.routeconverterjava11extension@default:false"/>
<setEntry value="com.sap.sailing.sailti.resultimport@4:true"/>
<setEntry value="com.sap.sailing.sailwave.resultimport@4:true"/>
<setEntry value="com.sap.sailing.server.gateway.interfaces@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization.shared.android@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization@default:default"/>
<setEntry value="com.sap.sailing.server.gateway@5:true"/>
<setEntry value="com.sap.sailing.server.interface@default:default"/>
<setEntry value="com.sap.sailing.server.trackfiles@default:default"/>
<setEntry value="com.sap.sailing.server@5:true"/>
<setEntry value="com.sap.sailing.shared.persistence@default:default"/>
<setEntry value="com.sap.sailing.shared.server.gateway@5:true"/>
<setEntry value="com.sap.sailing.shared.server@5:true"/>
<setEntry value="com.sap.sailing.simulator@default:default"/>
<setEntry value="com.sap.sailing.udpconnector@default:default"/>
<setEntry value="com.sap.sailing.velum.resultimport@4:true"/>
<setEntry value="com.sap.sailing.windestimation@5:true"/>
<setEntry value="com.sap.sailing.www@5:true"/>
<setEntry value="com.sap.sailing.xrr.resultimport@4:true"/>
<setEntry value="com.sap.sailing.xrr.schema@default:default"/>
<setEntry value="com.sap.sailing.xrr.structureimport@default:default"/>
<setEntry value="com.sap.sailing.yachtscoring.resultimport@4:true"/>
<setEntry value="com.sap.sse.common@default:default"/>
<setEntry value="com.sap.sse.datamining.annotations@default:default"/>
<setEntry value="com.sap.sse.datamining.shared@default:default"/>
<setEntry value="com.sap.sse.datamining.ui@default:default"/>
<setEntry value="com.sap.sse.datamining@default:default"/>
<setEntry value="com.sap.sse.debranding@default:default"/>
<setEntry value="com.sap.sse.filestorage@4:true"/>
<setEntry value="com.sap.sse.gwt.adminconsole@default:default"/>
<setEntry value="com.sap.sse.gwt@default:default"/>
<setEntry value="com.sap.sse.landscape.aws.common@default:default"/>
<setEntry value="com.sap.sse.landscape.aws.persistence@default:default"/>
<setEntry value="com.sap.sse.landscape.aws@4:true"/>
<setEntry value="com.sap.sse.landscape.common@default:default"/>
<setEntry value="com.sap.sse.landscape@default:default"/>
<setEntry value="com.sap.sse.mail@5:true"/>
<setEntry value="com.sap.sse.mongodb@default:default"/>
<setEntry value="com.sap.sse.operationaltransformation@default:default"/>
<setEntry value="com.sap.sse.replication.interfaces@default:default"/>
<setEntry value="com.sap.sse.replication.persistence@default:default"/>
<setEntry value="com.sap.sse.replication@6:true"/>
<setEntry value="com.sap.sse.security.common@default:default"/>
<setEntry value="com.sap.sse.security.datamining@5:true"/>
<setEntry value="com.sap.sse.security.interface@default:default"/>
<setEntry value="com.sap.sse.security.persistence@default:default"/>
<setEntry value="com.sap.sse.security.ui@6:true"/>
<setEntry value="com.sap.sse.security.userstore.mongodb@4:true"/>
<setEntry value="com.sap.sse.security@default:default"/>
<setEntry value="com.sap.sse.shared.android@default:default"/>
<setEntry value="com.sap.sse.threadmanager@default:default"/>
<setEntry value="com.sap.sse@default:default"/>
<setEntry value="com.tractrac.clientmodule@default:default"/>
<setEntry value="elemental2@default:default"/>
<setEntry value="net.sf.marineapi@default:default"/>
<setEntry value="org.json.simple@default:default"/>
<setEntry value="org.moxieapps.gwt.highcharts@default:default"/>
<setEntry value="org.mp4parser.isoparser@default:default"/>
</setAttribute>
<booleanAttribute key="show_selected_only" value="false"/>
<booleanAttribute key="tracing" value="false"/>
<booleanAttribute key="useCustomFeatures" value="false"/>
@@ -25,295 +25,291 @@
<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${workspace_loc}"/>
<stringAttribute key="pde.version" value="3.3"/>
<setAttribute key="selected_target_bundles">
<setEntry value="routeconverter@default:default"/>
<setEntry value="org.apache.commons.codec@default:default"/>
<setEntry value="org.apache.poi@default:default"/>
<setEntry value="org.apache.poi.ooxml@default:default"/>
<setEntry value="org.apache.poi.ooxml.schemas@default:default"/>
<setEntry value="org.apache.commons.collections4@default:default"/>
<setEntry value="org.apache.commons.compress@default:default"/>
<setEntry value="org.apache.poi.source@default:default"/>
<setEntry value="org.apache.poi.ooxml.source@default:default"/>
<setEntry value="org.apache.commons.collections4.source@default:default"/>
<setEntry value="org.apache.commons.compress.source@default:default"/>
<setEntry value="org.dom4j@default:default"/>
<setEntry value="org.apache.xmlbeans@default:default"/>
<setEntry value="org.apache.commons.math@default:default"/>
<setEntry value="org.apache.httpcomponents.httpclient@default:default"/>
<setEntry value="org.apache.httpcomponents.httpcore@default:default"/>
<setEntry value="org.hyperic.sigar@default:default"/>
<setEntry value="com.sun.jersey.contribs.jersey-multipart@default:default"/>
<setEntry value="javax.validation@default:default"/>
<setEntry value="org.apache.commons.fileupload@default:default"/>
<setEntry value="org.jvnet.mimepull@default:default"/>
<setEntry value="org.apache.commons.math3@default:default"/>
<setEntry value="org.mongodb.driver-core@default:default"/>
<setEntry value="org.mongodb.driver-core.source@default:default"/>
<setEntry value="org.mongodb.bson@default:default"/>
<setEntry value="org.mongodb.bson.source@default:default"/>
<setEntry value="org.mongodb.driver-sync@default:default"/>
<setEntry value="org.mongodb.driver-sync@default:default"/>
<setEntry value="org.eclipse.jetty.osgi.boot@3:true"/>
<setEntry value="org.eclipse.jetty.osgi.boot.warurl@default:default"/>
<setEntry value="org.hyperic.sigar@default:default"/>
<setEntry value="slf4j.jdk14@default:default"/>
<setEntry value="lz4-java@default:default"/>
<setEntry value="org.apache.felix.gogo.command@default:default"/>
<setEntry value="org.apache.felix.gogo.runtime@default:default"/>
<setEntry value="org.apache.felix.gogo.shell@default:default"/>
<setEntry value="org.eclipse.jetty.deploy@default:default"/>
<setEntry value="org.eclipse.jetty.deploy.source@default:default"/>
<setEntry value="org.eclipse.jetty.http@3:true"/>
<setEntry value="org.eclipse.jetty.http.source@default:default"/>
<setEntry value="org.eclipse.jetty.io@default:default"/>
<setEntry value="org.eclipse.jetty.io.source@default:default"/>
<setEntry value="org.eclipse.jetty.jmx@default:default"/>
<setEntry value="org.eclipse.jetty.jmx.source@default:default"/>
<setEntry value="org.eclipse.jetty.security@default:default"/>
<setEntry value="org.eclipse.jetty.security.source@default:default"/>
<setEntry value="org.eclipse.jetty.server@default:default"/>
<setEntry value="org.eclipse.jetty.server.source@default:default"/>
<setEntry value="org.eclipse.jetty.servlet@default:default"/>
<setEntry value="org.eclipse.jetty.servlet.source@default:default"/>
<setEntry value="org.eclipse.jetty.util@default:default"/>
<setEntry value="org.eclipse.jetty.util.source@default:default"/>
<setEntry value="org.eclipse.jetty.util.ajax@default:default"/>
<setEntry value="org.eclipse.jetty.util.ajax.source@default:default"/>
<setEntry value="org.eclipse.jetty.webapp@default:default"/>
<setEntry value="org.eclipse.jetty.webapp.source@default:default"/>
<setEntry value="org.eclipse.jetty.websocket.api@default:default"/>
<setEntry value="org.eclipse.jetty.websocket.api.source@default:default"/>
<setEntry value="org.eclipse.jetty.websocket.client@default:default"/>
<setEntry value="org.eclipse.jetty.websocket.client.source@default:default"/>
<setEntry value="org.eclipse.jetty.websocket.common@default:default"/>
<setEntry value="org.eclipse.jetty.websocket.common.source@default:default"/>
<setEntry value="org.eclipse.jetty.xml@default:default"/>
<setEntry value="org.eclipse.jetty.xml.source@default:default"/>
<setEntry value="slf4j.api@default:default"/>
<setEntry value="org.apache.servicemix.bundles.zxing@default:default"/>
<setEntry value="org.apache.commons.io@default:default"/>
<setEntry value="jcl.over.slf4j@default:default"/>
<setEntry value="com.sun.mail.javax.mail@default:default"/>
<setEntry value="com.rabbitmq.client@default:default"/>
<setEntry value="com.rabbitmq.client.source@default:default"/>
<setEntry value="org.apache.commons.lang@default:default"/>
<setEntry value="org.apache.commons.logging@default:default"/>
<setEntry value="jackson-jaxrs@default:default"/>
<setEntry value="com.sun.jersey@default:default"/>
<setEntry value="javax.ws.rs@default:default"/>
<setEntry value="org.apache.commons.beanutils@default:default"/>
<setEntry value="org.apache.commons.beanutils.source@default:default"/>
<setEntry value="org.apache.servicemix.bundles.ehcache@default:default"/>
<setEntry value="org.apache.servicemix.bundles.scribe@default:default"/>
<setEntry value="org.owasp.encoder@default:default"/>
<setEntry value="org.owasp.encoder.source@default:default"/>
<setEntry value="org.apache.shiro.core@default:default"/>
<setEntry value="org.apache.shiro.core.source@default:default"/>
<setEntry value="org.apache.shiro.ehcache@default:default"/>
<setEntry value="org.apache.shiro.ehcache.source@default:default"/>
<setEntry value="org.apache.shiro.web@default:default"/>
<setEntry value="org.apache.shiro.web.source@default:default"/>
<setEntry value="jackson-core-asl@default:default"/>
<setEntry value="jackson-mapper-asl@default:default"/>
<setEntry value="org.apache.commons.collections@default:default"/>
<setEntry value="org.eclipse.jetty.client@default:default"/>
<setEntry value="javax.xml@default:default"/>
<setEntry value="com.sun.activation.javax.activation@default:default"/>
<setEntry value="org.eclipse.equinox.common@2:true"/>
<setEntry value="org.eclipse.equinox.console@default:default"/>
<setEntry value="org.eclipse.equinox.launcher@default:default"/>
<setEntry value="org.eclipse.equinox.simpleconfigurator@2:true"/>
<setEntry value="org.eclipse.osgi@-1:true"/>
<setEntry value="org.eclipse.osgi.source@default:default"/>
<setEntry value="org.osgi.util.promise@default:default"/>
<setEntry value="org.osgi.util.promise.source@default:default"/>
<setEntry value="org.osgi.util.function@default:default"/>
<setEntry value="org.osgi.util.function.source@default:default"/>
<setEntry value="org.osgi.util.measurement@default:default"/>
<setEntry value="org.osgi.util.measurement.source@default:default"/>
<setEntry value="org.osgi.util.position@default:default"/>
<setEntry value="org.osgi.util.position.source@default:default"/>
<setEntry value="org.osgi.util.xml@default:default"/>
<setEntry value="org.osgi.util.xml.source@default:default"/>
<setEntry value="org.eclipse.osgi.services@default:default"/>
<setEntry value="org.eclipse.osgi.services.source@default:default"/>
<setEntry value="org.eclipse.equinox.cm@default:default"/>
<setEntry value="com.sun.istack.commons-runtime@default:default"/>
<setEntry value="com.sun.xml.bind.jaxb-impl@default:default"/>
<setEntry value="javax.xml.stream@default:default"/>
<setEntry value="javax.xml.ws@default:default"/>
<setEntry value="javax.xml.soap@default:default"/>
<setEntry value="org.eclipse.osgi.util@default:default"/>
<setEntry value="org.eclipse.osgi.util.source@default:default"/>
<setEntry value="com.chargebee.chargebee-java@default:default"/>
<setEntry value="com.github.mwiede.jsch@default:default"/>
<setEntry value="com.github.mwiede.jsch.source@default:default"/>
<setEntry value="bcprov-ext@default:default"/>
<setEntry value="com.amazon.aws.aws-java-api@default:default"/>
<setEntry value="com.amazon.aws.aws-java-api.source@default:default"/>
<setEntry value="org.objectweb.asm@default:default"/>
<setEntry value="org.objectweb.asm.commons@default:default"/>
<setEntry value="org.objectweb.asm.analysis@default:default"/>
<setEntry value="org.objectweb.asm.tree@default:default"/>
<setEntry value="org.objectweb.asm.util@default:default"/>
<setEntry value="org.objectweb.asm.source@default:default"/>
<setEntry value="org.objectweb.asm.analysis.source@default:default"/>
<setEntry value="org.objectweb.asm.commons.source@default:default"/>
<setEntry value="org.objectweb.asm.tree.source@default:default"/>
<setEntry value="org.objectweb.asm.util.source@default:default"/>
<setEntry value="org.eclipse.jetty.apache-jsp@4:true"/>
<setEntry value="org.eclipse.jetty.apache-jsp.source@default:default"/>
<setEntry value="org.eclipse.jetty.osgi.boot.jsp@default:default"/>
<setEntry value="org.eclipse.jetty.osgi.boot.jsp.source@default:default"/>
<setEntry value="org.apache.geronimo.specs.geronimo-jta_1.1_spec@default:default"/>
<setEntry value="org.apache.aries.spifly.dynamic.bundle@3:true"/>
<setEntry value="org.apache.aries.spifly.dynamic.bundle.source@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp@default:default"/>
<setEntry value="org.eclipse.jdt.core.compiler.batch@default:default"/>
<setEntry value="org.apache.taglibs.standard-impl@default:default"/>
<setEntry value="org.apache.taglibs.taglibs-standard-spec@default:default"/>
<setEntry value="javax.annotation@default:default"/>
<setEntry value="org.eclipse.jetty.osgi-servlet-api@default:default"/>
<setEntry value="org.apache.xalan@default:default"/>
<setEntry value="org.apache.xml.serializer@default:default"/>
<setEntry value="org.eclipse.equinox.event@default:default"/>
<setEntry value="org.eclipse.jetty.annotations@4:true"/>
<setEntry value="org.eclipse.jetty.jndi@default:default"/>
<setEntry value="org.eclipse.jetty.plus@default:default"/>
<setEntry value="com.sap.db.jdbc@default:default"/>
<setEntry value="com.sap.db.jdbc.source@default:default"/>
<setEntry value="org.osgi.service.component@default:default"/>
<setEntry value="org.osgi.service.cm@default:default"/>
<setEntry value="org.osgi.util.tracker@default:default"/>
<setEntry value="org.osgi.service.event@default:default"/>
<setEntry value="org.osgi.service.packageadmin@default:default"/>
<setEntry value="org.osgi.service.url@default:default"/>
<setEntry value="com.github.haifengl.smile-core@default:default"/>
<setEntry value="com.github.haifengl.smile-core.source@default:default"/>
<setEntry value="com.github.haifengl.smile-data@default:default"/>
<setEntry value="com.github.haifengl.smile-data.source@default:default"/>
<setEntry value="com.github.haifengl.smile-graph@default:default"/>
<setEntry value="com.github.haifengl.smile-graph.source@default:default"/>
<setEntry value="com.github.haifengl.smile-math@default:default"/>
<setEntry value="com.github.haifengl.smile-math.source@default:default"/>
<setEntry value="com.google.gson@default:default"/>
<setEntry value="com.google.gson.source@default:default"/>
</setAttribute>
<setEntry value="bcprov-ext@default:default"/>
<setEntry value="com.amazon.aws.aws-java-api.source"/>
<setEntry value="com.amazon.aws.aws-java-api@default:default"/>
<setEntry value="com.chargebee.chargebee-java@default:default"/>
<setEntry value="com.github.haifengl.smile-core.source"/>
<setEntry value="com.github.haifengl.smile-core@default:default"/>
<setEntry value="com.github.haifengl.smile-data.source"/>
<setEntry value="com.github.haifengl.smile-data@default:default"/>
<setEntry value="com.github.haifengl.smile-graph.source"/>
<setEntry value="com.github.haifengl.smile-graph@default:default"/>
<setEntry value="com.github.haifengl.smile-math.source"/>
<setEntry value="com.github.haifengl.smile-math@default:default"/>
<setEntry value="com.github.mwiede.jsch.source"/>
<setEntry value="com.github.mwiede.jsch@default:default"/>
<setEntry value="com.google.gson.source"/>
<setEntry value="com.google.gson@default:default"/>
<setEntry value="com.rabbitmq.client.source"/>
<setEntry value="com.rabbitmq.client@default:default"/>
<setEntry value="com.sap.db.jdbc.source"/>
<setEntry value="com.sap.db.jdbc@default:default"/>
<setEntry value="com.sun.activation.javax.activation@default:default"/>
<setEntry value="com.sun.istack.commons-runtime@default:default"/>
<setEntry value="com.sun.jersey.contribs.jersey-multipart@default:default"/>
<setEntry value="com.sun.jersey@default:default"/>
<setEntry value="com.sun.mail.javax.mail@default:default"/>
<setEntry value="com.sun.xml.bind.jaxb-impl@default:default"/>
<setEntry value="jackson-core-asl@default:default"/>
<setEntry value="jackson-jaxrs@default:default"/>
<setEntry value="jackson-mapper-asl@default:default"/>
<setEntry value="javax.annotation@default:default"/>
<setEntry value="javax.validation@default:default"/>
<setEntry value="javax.ws.rs@default:default"/>
<setEntry value="javax.xml.soap@default:default"/>
<setEntry value="javax.xml.stream@default:default"/>
<setEntry value="javax.xml.ws@default:default"/>
<setEntry value="javax.xml@default:default"/>
<setEntry value="jcl.over.slf4j@default:default"/>
<setEntry value="lz4-java@default:default"/>
<setEntry value="org.apache.aries.spifly.dynamic.bundle.source"/>
<setEntry value="org.apache.aries.spifly.dynamic.bundle@3:true"/>
<setEntry value="org.apache.commons.beanutils.source@default:default"/>
<setEntry value="org.apache.commons.beanutils@default:default"/>
<setEntry value="org.apache.commons.codec@default:default"/>
<setEntry value="org.apache.commons.collections4.source"/>
<setEntry value="org.apache.commons.collections4@default:default"/>
<setEntry value="org.apache.commons.collections@default:default"/>
<setEntry value="org.apache.commons.compress.source"/>
<setEntry value="org.apache.commons.compress@default:default"/>
<setEntry value="org.apache.commons.fileupload@default:default"/>
<setEntry value="org.apache.commons.io@default:default"/>
<setEntry value="org.apache.commons.lang@default:default"/>
<setEntry value="org.apache.commons.logging@default:default"/>
<setEntry value="org.apache.commons.math3@default:default"/>
<setEntry value="org.apache.commons.math@default:default"/>
<setEntry value="org.apache.felix.gogo.command@default:default"/>
<setEntry value="org.apache.felix.gogo.runtime@default:default"/>
<setEntry value="org.apache.felix.gogo.shell@default:default"/>
<setEntry value="org.apache.geronimo.specs.geronimo-jta_1.1_spec@default:default"/>
<setEntry value="org.apache.httpcomponents.httpclient@default:default"/>
<setEntry value="org.apache.httpcomponents.httpcore@default:default"/>
<setEntry value="org.apache.poi.ooxml.schemas@default:default"/>
<setEntry value="org.apache.poi.ooxml.source"/>
<setEntry value="org.apache.poi.ooxml@default:default"/>
<setEntry value="org.apache.poi.source"/>
<setEntry value="org.apache.poi@default:default"/>
<setEntry value="org.apache.servicemix.bundles.ehcache@default:default"/>
<setEntry value="org.apache.servicemix.bundles.scribe@default:default"/>
<setEntry value="org.apache.servicemix.bundles.zxing@default:default"/>
<setEntry value="org.apache.shiro.core.source"/>
<setEntry value="org.apache.shiro.core@default:default"/>
<setEntry value="org.apache.shiro.ehcache.source"/>
<setEntry value="org.apache.shiro.ehcache@default:default"/>
<setEntry value="org.apache.shiro.web.source"/>
<setEntry value="org.apache.shiro.web@default:default"/>
<setEntry value="org.apache.taglibs.standard-impl@default:default"/>
<setEntry value="org.apache.taglibs.taglibs-standard-spec@default:default"/>
<setEntry value="org.apache.xalan@default:default"/>
<setEntry value="org.apache.xml.serializer@default:default"/>
<setEntry value="org.apache.xmlbeans@default:default"/>
<setEntry value="org.dom4j@default:default"/>
<setEntry value="org.eclipse.equinox.cm@default:default"/>
<setEntry value="org.eclipse.equinox.common@2:true"/>
<setEntry value="org.eclipse.equinox.console@default:default"/>
<setEntry value="org.eclipse.equinox.event@default:default"/>
<setEntry value="org.eclipse.equinox.launcher@default:default"/>
<setEntry value="org.eclipse.equinox.simpleconfigurator@2:true"/>
<setEntry value="org.eclipse.jdt.core.compiler.batch@default:default"/>
<setEntry value="org.eclipse.jetty.annotations@4:true"/>
<setEntry value="org.eclipse.jetty.apache-jsp.source"/>
<setEntry value="org.eclipse.jetty.apache-jsp@4:true"/>
<setEntry value="org.eclipse.jetty.client@default:default"/>
<setEntry value="org.eclipse.jetty.deploy.source"/>
<setEntry value="org.eclipse.jetty.deploy@default:default"/>
<setEntry value="org.eclipse.jetty.http.source"/>
<setEntry value="org.eclipse.jetty.http@3:true"/>
<setEntry value="org.eclipse.jetty.io.source"/>
<setEntry value="org.eclipse.jetty.io@default:default"/>
<setEntry value="org.eclipse.jetty.jmx.source"/>
<setEntry value="org.eclipse.jetty.jmx@default:default"/>
<setEntry value="org.eclipse.jetty.jndi@default:default"/>
<setEntry value="org.eclipse.jetty.osgi-servlet-api@default:default"/>
<setEntry value="org.eclipse.jetty.osgi.boot.jsp.source"/>
<setEntry value="org.eclipse.jetty.osgi.boot.jsp@default:false"/>
<setEntry value="org.eclipse.jetty.osgi.boot.warurl@default:default"/>
<setEntry value="org.eclipse.jetty.osgi.boot@3:true"/>
<setEntry value="org.eclipse.jetty.plus@default:default"/>
<setEntry value="org.eclipse.jetty.security.source"/>
<setEntry value="org.eclipse.jetty.security@default:default"/>
<setEntry value="org.eclipse.jetty.server.source"/>
<setEntry value="org.eclipse.jetty.server@default:default"/>
<setEntry value="org.eclipse.jetty.servlet.source"/>
<setEntry value="org.eclipse.jetty.servlet@default:default"/>
<setEntry value="org.eclipse.jetty.util.ajax.source"/>
<setEntry value="org.eclipse.jetty.util.ajax@default:default"/>
<setEntry value="org.eclipse.jetty.util.source"/>
<setEntry value="org.eclipse.jetty.util@default:default"/>
<setEntry value="org.eclipse.jetty.webapp.source"/>
<setEntry value="org.eclipse.jetty.webapp@default:default"/>
<setEntry value="org.eclipse.jetty.websocket.api.source"/>
<setEntry value="org.eclipse.jetty.websocket.api@default:default"/>
<setEntry value="org.eclipse.jetty.websocket.client.source"/>
<setEntry value="org.eclipse.jetty.websocket.client@default:default"/>
<setEntry value="org.eclipse.jetty.websocket.common.source"/>
<setEntry value="org.eclipse.jetty.websocket.common@default:default"/>
<setEntry value="org.eclipse.jetty.xml.source"/>
<setEntry value="org.eclipse.jetty.xml@default:default"/>
<setEntry value="org.eclipse.osgi.services.source"/>
<setEntry value="org.eclipse.osgi.services@default:default"/>
<setEntry value="org.eclipse.osgi.source"/>
<setEntry value="org.eclipse.osgi.util.source"/>
<setEntry value="org.eclipse.osgi.util@default:default"/>
<setEntry value="org.eclipse.osgi@-1:true"/>
<setEntry value="org.hyperic.sigar@default:default"/>
<setEntry value="org.jvnet.mimepull@default:default"/>
<setEntry value="org.mongodb.bson.source"/>
<setEntry value="org.mongodb.bson@default:default"/>
<setEntry value="org.mongodb.driver-core.source"/>
<setEntry value="org.mongodb.driver-core@default:default"/>
<setEntry value="org.mongodb.driver-sync@default:default"/>
<setEntry value="org.mortbay.jasper.apache-el@default:default"/>
<setEntry value="org.mortbay.jasper.apache-jsp@default:default"/>
<setEntry value="org.objectweb.asm.analysis.source"/>
<setEntry value="org.objectweb.asm.analysis@default:default"/>
<setEntry value="org.objectweb.asm.commons.source"/>
<setEntry value="org.objectweb.asm.commons@default:default"/>
<setEntry value="org.objectweb.asm.source"/>
<setEntry value="org.objectweb.asm.tree.source"/>
<setEntry value="org.objectweb.asm.tree@default:default"/>
<setEntry value="org.objectweb.asm.util.source"/>
<setEntry value="org.objectweb.asm.util@default:default"/>
<setEntry value="org.objectweb.asm@default:default"/>
<setEntry value="org.osgi.service.cm@default:default"/>
<setEntry value="org.osgi.service.component@default:default"/>
<setEntry value="org.osgi.service.event@default:default"/>
<setEntry value="org.osgi.service.packageadmin@default:default"/>
<setEntry value="org.osgi.service.url@default:default"/>
<setEntry value="org.osgi.util.function.source"/>
<setEntry value="org.osgi.util.function@default:default"/>
<setEntry value="org.osgi.util.measurement.source"/>
<setEntry value="org.osgi.util.measurement@default:default"/>
<setEntry value="org.osgi.util.position.source"/>
<setEntry value="org.osgi.util.position@default:default"/>
<setEntry value="org.osgi.util.promise.source"/>
<setEntry value="org.osgi.util.promise@default:default"/>
<setEntry value="org.osgi.util.tracker@default:default"/>
<setEntry value="org.osgi.util.xml.source"/>
<setEntry value="org.osgi.util.xml@default:default"/>
<setEntry value="org.owasp.encoder.source"/>
<setEntry value="org.owasp.encoder@default:default"/>
<setEntry value="routeconverter@default:default"/>
<setEntry value="slf4j.api@default:default"/>
<setEntry value="slf4j.jdk14@default:false"/>
</setAttribute>
<setAttribute key="selected_workspace_bundles">
<setEntry value="com.sap.sailing.geocoding@default:default"/>
<setEntry value="com.sap.sailing.domain.common@default:default"/>
<setEntry value="com.sap.sailing.domain@default:default"/>
<setEntry value="com.sap.sailing.news@4:true"/>
<setEntry value="com.sap.sailing.domain.tractracadapter@5:true"/>
<setEntry value="com.sap.sailing.expeditionconnector@default:default"/>
<setEntry value="com.sap.sailing.domain.windfinderadapter@4:true"/>
<setEntry value="com.sap.sailing.server@5:true"/>
<setEntry value="com.sap.sailing.server.gateway@5:true"/>
<setEntry value="com.sap.sailing.server.gateway.interfaces@default:default"/>
<setEntry value="com.tractrac.clientmodule@default:default"/>
<setEntry value="com.sap.sailing.declination@default:default"/>
<setEntry value="com.sap.sailing.domain.persistence@default:default"/>
<setEntry value="com.sap.sailing.domain.swisstimingadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.swisstimingadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.domain.swisstimingreplayadapter@4:true"/>
<setEntry value="com.sap.sailing.domain.tractracadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.gwt.ui@6:true"/>
<setEntry value="com.sap.sailing.udpconnector@default:default"/>
<setEntry value="com.sap.sailing.simulator@default:default"/>
<setEntry value="com.sap.sailing.www@5:true"/>
<setEntry value="com.sap.sailing.resultimport@4:true"/>
<setEntry value="com.sap.sailing.kiworesultimport@4:true"/>
<setEntry value="com.sap.sailing.ess40.resultimport@4:true"/>
<setEntry value="com.sap.sailing.freg.resultimport@4:true"/>
<setEntry value="com.sap.sailing.barbados.resultimport@4:true"/>
<setEntry value="com.sap.sailing.sailwave.resultimport@4:true"/>
<setEntry value="com.sap.sailing.manage2sail.resultimport@4:true"/>
<setEntry value="com.sap.sailing.sailti.resultimport@4:true"/>
<setEntry value="com.sap.sailing.yachtscoring.resultimport@4:true"/>
<setEntry value="com.sap.sailing.velum.resultimport@4:true"/>
<setEntry value="com.sap.sailing.monitoring@7:true"/>
<setEntry value="com.sap.sailing.xrr.resultimport@4:true"/>
<setEntry value="com.sap.sailing.domain.igtimiadapter@4:true"/>
<setEntry value="com.sap.sailing.domain.igtimiadapter.persistence@default:default"/>
<setEntry value="com.sap.sailing.domain.racelogtrackingadapter@4:true"/>
<setEntry value="com.sap.sailing.domain.deckmanadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.oceanraceadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.xrr.structureimport@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization.shared.android@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization@default:default"/>
<setEntry value="com.sap.sailing.dashboards.gwt@6:true"/>
<setEntry value="com.sap.sailing.dashboards.gwt@6:true"/>
<setEntry value="com.sap.sailing.datamining@5:true"/>
<setEntry value="com.sap.sailing.datamining.shared@default:default"/>
<setEntry value="com.sap.sailing.polars@5:true"/>
<setEntry value="com.sap.sailing.windestimation@5:true"/>
<setEntry value="com.sap.sailing.polars.datamining@5:true"/>
<setEntry value="com.sap.sailing.domain.shared.android@default:default"/>
<setEntry value="com.sap.sailing.manage2sail@default:default"/>
<setEntry value="com.sap.sailing.polars.datamining.shared@default:default"/>
<setEntry value="com.sap.sailing.xrr.schema@default:default"/>
<setEntry value="com.sap.sailing.server.trackfiles@default:default"/>
<setEntry value="com.sap.sailing.competitorimport@default:default"/>
<setEntry value="com.sap.sailing.datamining.provider@default:default"/>
<setEntry value="com.sap.sailing.grib@default:default"/>
<setEntry value="com.sap.sailing.nmeaconnector@default:default"/>
<setEntry value="com.sap.sailing.domain.expeditionadapter@5:true"/>
<setEntry value="com.sap.sailing.expeditionconnector.persistence@4:true"/>
<setEntry value="com.sap.sailing.expeditionconnector.common@default:default"/>
<setEntry value="com.sap.sailing.domain.bravoadapter@5:true"/>
<setEntry value="net.sf.marineapi@default:default"/>
<setEntry value="com.sap.sailing.routeconverterjava11extension@default:default"/>
<setEntry value="com.sap.sailing.server.interface@default:default"/>
<setEntry value="com.sap.sse.datamining.ui@default:default"/>
<setEntry value="com.sap.sailing.domain.igtimiadapter.gateway@5:true"/>
<setEntry value="com.sap.sailing.shared.server@5:true"/>
<setEntry value="com.sap.sailing.shared.server.gateway@5:true"/>
<setEntry value="com.sap.sailing.shared.persistence@default:default"/>
<setEntry value="com.sap.sailing.landscape@default:default"/>
<setEntry value="com.sap.sailing.landscape.gateway@5:true"/>
<setEntry value="com.sap.sailing.landscape.common@default:default"/>
<setEntry value="com.sap.sailing.landscape.ui@default:default"/>
<setEntry value="com.sap.sailing.hanaexport@5:true"/>
<setEntry value="com.tractrac.clientmodule@default:default"/>
<setEntry value="com.sap.sse.gwt@default:default"/>
<setEntry value="com.google.gwt.servlet@default:default"/>
<setEntry value="com.sap.sse.security@default:default"/>
<setEntry value="com.sap.sse.security.ui@6:true"/>
<setEntry value="com.sap.sse.security.userstore.mongodb@4:true"/>
<setEntry value="com.sap.sse@default:default"/>
<setEntry value="com.sap.sse.common@default:default"/>
<setEntry value="com.sap.sse.datamining@default:default"/>
<setEntry value="com.sap.sse.datamining.annotations@default:default"/>
<setEntry value="com.sap.sse.datamining.shared@default:default"/>
<setEntry value="com.sap.sse.gwt.adminconsole@default:default"/>
<setEntry value="com.sap.sse.mongodb@default:default"/>
<setEntry value="com.sap.sse.operationaltransformation@default:default"/>
<setEntry value="com.sap.sse.replication@6:true"/>
<setEntry value="com.sap.sse.filestorage@4:true"/>
<setEntry value="com.sap.sse.shared.android@default:default"/>
<setEntry value="com.sap.sse.mail@5:true"/>
<setEntry value="com.sap.sse.threadmanager@default:default"/>
<setEntry value="com.sap.sse.security.common@default:default"/>
<setEntry value="org.json.simple@default:default"/>
<setEntry value="org.moxieapps.gwt.highcharts@default:default"/>
<setEntry value="com.googlecode.java-diff-utils@default:default"/>
<setEntry value="org.mp4parser.isoparser@default:default"/>
<setEntry value="com.sap.sse.replication.interfaces@default:default"/>
<setEntry value="com.sap.sse.security.datamining@5:true"/>
<setEntry value="com.sap.sse.security.persistence@default:default"/>
<setEntry value="com.sap.sse.security.interface@default:default"/>
<setEntry value="com.sap.sse.replication.persistence@default:default"/>
<setEntry value="com.sap.sse.landscape.common@default:default"/>
<setEntry value="com.sap.sse.landscape@default:default"/>
<setEntry value="com.sap.sse.landscape.aws@4:true"/>
<setEntry value="com.sap.sse.landscape.aws.common@default:default"/>
<setEntry value="com.sap.sse.landscape.aws.persistence@default:default"/>
<setEntry value="com.sap.sse.debranding@default:default"/>
<setEntry value="elemental2@default:default"/>
</setAttribute>
<setEntry value="com.google.gwt.servlet@default:default"/>
<setEntry value="com.googlecode.java-diff-utils@default:default"/>
<setEntry value="com.sap.sailing.barbados.resultimport@4:true"/>
<setEntry value="com.sap.sailing.competitorimport@default:default"/>
<setEntry value="com.sap.sailing.dashboards.gwt@6:true"/>
<setEntry value="com.sap.sailing.datamining.provider@default:default"/>
<setEntry value="com.sap.sailing.datamining.shared@default:default"/>
<setEntry value="com.sap.sailing.datamining@5:true"/>
<setEntry value="com.sap.sailing.declination@default:default"/>
<setEntry value="com.sap.sailing.domain.bravoadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.common@default:default"/>
<setEntry value="com.sap.sailing.domain.deckmanadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.expeditionadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.igtimiadapter.gateway@5:true"/>
<setEntry value="com.sap.sailing.domain.igtimiadapter.persistence@default:default"/>
<setEntry value="com.sap.sailing.domain.igtimiadapter@4:true"/>
<setEntry value="com.sap.sailing.domain.oceanraceadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.persistence@default:default"/>
<setEntry value="com.sap.sailing.domain.racelogtrackingadapter@4:true"/>
<setEntry value="com.sap.sailing.domain.shared.android@default:default"/>
<setEntry value="com.sap.sailing.domain.swisstimingadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.domain.swisstimingadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.swisstimingreplayadapter@4:true"/>
<setEntry value="com.sap.sailing.domain.tractracadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.domain.tractracadapter@5:true"/>
<setEntry value="com.sap.sailing.domain.windfinderadapter@4:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter.persistence@4:true"/>
<setEntry value="com.sap.sailing.domain.yellowbrickadapter@5:true"/>
<setEntry value="com.sap.sailing.domain@default:default"/>
<setEntry value="com.sap.sailing.ess40.resultimport@4:true"/>
<setEntry value="com.sap.sailing.expeditionconnector.common@default:default"/>
<setEntry value="com.sap.sailing.expeditionconnector.persistence@4:true"/>
<setEntry value="com.sap.sailing.expeditionconnector@default:default"/>
<setEntry value="com.sap.sailing.freg.resultimport@4:true"/>
<setEntry value="com.sap.sailing.geocoding@default:default"/>
<setEntry value="com.sap.sailing.grib@default:default"/>
<setEntry value="com.sap.sailing.gwt.ui@6:true"/>
<setEntry value="com.sap.sailing.hanaexport@5:true"/>
<setEntry value="com.sap.sailing.kiworesultimport@4:true"/>
<setEntry value="com.sap.sailing.landscape.common@default:default"/>
<setEntry value="com.sap.sailing.landscape.gateway@5:true"/>
<setEntry value="com.sap.sailing.landscape.ui@default:default"/>
<setEntry value="com.sap.sailing.landscape@default:default"/>
<setEntry value="com.sap.sailing.manage2sail.resultimport@4:true"/>
<setEntry value="com.sap.sailing.manage2sail@default:default"/>
<setEntry value="com.sap.sailing.monitoring@7:true"/>
<setEntry value="com.sap.sailing.news@4:true"/>
<setEntry value="com.sap.sailing.nmeaconnector@default:default"/>
<setEntry value="com.sap.sailing.polars.datamining.shared@default:default"/>
<setEntry value="com.sap.sailing.polars.datamining@5:true"/>
<setEntry value="com.sap.sailing.polars@5:true"/>
<setEntry value="com.sap.sailing.resultimport@4:true"/>
<setEntry value="com.sap.sailing.routeconverterjava11extension@default:false"/>
<setEntry value="com.sap.sailing.sailti.resultimport@4:true"/>
<setEntry value="com.sap.sailing.sailwave.resultimport@4:true"/>
<setEntry value="com.sap.sailing.server.gateway.interfaces@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization.shared.android@default:default"/>
<setEntry value="com.sap.sailing.server.gateway.serialization@default:default"/>
<setEntry value="com.sap.sailing.server.gateway@5:true"/>
<setEntry value="com.sap.sailing.server.interface@default:default"/>
<setEntry value="com.sap.sailing.server.trackfiles@default:default"/>
<setEntry value="com.sap.sailing.server@5:true"/>
<setEntry value="com.sap.sailing.shared.persistence@default:default"/>
<setEntry value="com.sap.sailing.shared.server.gateway@5:true"/>
<setEntry value="com.sap.sailing.shared.server@5:true"/>
<setEntry value="com.sap.sailing.simulator@default:default"/>
<setEntry value="com.sap.sailing.udpconnector@default:default"/>
<setEntry value="com.sap.sailing.velum.resultimport@4:true"/>
<setEntry value="com.sap.sailing.windestimation@5:true"/>
<setEntry value="com.sap.sailing.www@5:true"/>
<setEntry value="com.sap.sailing.xrr.resultimport@4:true"/>
<setEntry value="com.sap.sailing.xrr.schema@default:default"/>
<setEntry value="com.sap.sailing.xrr.structureimport@default:default"/>
<setEntry value="com.sap.sailing.yachtscoring.resultimport@4:true"/>
<setEntry value="com.sap.sse.common@default:default"/>
<setEntry value="com.sap.sse.datamining.annotations@default:default"/>
<setEntry value="com.sap.sse.datamining.shared@default:default"/>
<setEntry value="com.sap.sse.datamining.ui@default:default"/>
<setEntry value="com.sap.sse.datamining@default:default"/>
<setEntry value="com.sap.sse.debranding@default:default"/>
<setEntry value="com.sap.sse.filestorage@4:true"/>
<setEntry value="com.sap.sse.gwt.adminconsole@default:default"/>
<setEntry value="com.sap.sse.gwt@default:default"/>
<setEntry value="com.sap.sse.landscape.aws.common@default:default"/>
<setEntry value="com.sap.sse.landscape.aws.persistence@default:default"/>
<setEntry value="com.sap.sse.landscape.aws@4:true"/>
<setEntry value="com.sap.sse.landscape.common@default:default"/>
<setEntry value="com.sap.sse.landscape@default:default"/>
<setEntry value="com.sap.sse.mail@5:true"/>
<setEntry value="com.sap.sse.mongodb@default:default"/>
<setEntry value="com.sap.sse.operationaltransformation@default:default"/>
<setEntry value="com.sap.sse.replication.interfaces@default:default"/>
<setEntry value="com.sap.sse.replication.persistence@default:default"/>
<setEntry value="com.sap.sse.replication@6:true"/>
<setEntry value="com.sap.sse.security.common@default:default"/>
<setEntry value="com.sap.sse.security.datamining@5:true"/>
<setEntry value="com.sap.sse.security.interface@default:default"/>
<setEntry value="com.sap.sse.security.persistence@default:default"/>
<setEntry value="com.sap.sse.security.ui@6:true"/>
<setEntry value="com.sap.sse.security.userstore.mongodb@4:true"/>
<setEntry value="com.sap.sse.security@default:default"/>
<setEntry value="com.sap.sse.shared.android@default:default"/>
<setEntry value="com.sap.sse.threadmanager@default:default"/>
<setEntry value="com.sap.sse@default:default"/>
<setEntry value="com.tractrac.clientmodule@default:default"/>
<setEntry value="elemental2@default:default"/>
<setEntry value="net.sf.marineapi@default:default"/>
<setEntry value="org.json.simple@default:default"/>
<setEntry value="org.moxieapps.gwt.highcharts@default:default"/>
<setEntry value="org.mp4parser.isoparser@default:default"/>
</setAttribute>
<booleanAttribute key="show_selected_only" value="false"/>
<booleanAttribute key="tracing" value="false"/>
<booleanAttribute key="useCustomFeatures" value="false"/>
@@ -3054,7 +3054,7 @@ Replicator {
* already have been removed by the stopAllTrackersForWhichRaceIsLastReachable(...) above; maybe a
* Java memory model idiosyncrasy with the queue thread not "seeing" the change to dataTrackers?).
* We must make sure to not block its execution, e.g., by synchronization, because otherwise
* the the removedTrackedRegatta(regatta) call below may not return, either, as it waits for
* the removedTrackedRegatta(regatta) call below may not return, either, as it waits for
* tasks it may enqueue after the task enqueued here. See bug 5879.
*/
trackedRegatta.removeTrackedRace(trackedRace, Optional.of(
@@ -3104,6 +3104,9 @@ Replicator {
}
}
}
// FIXME bug5982: when the TrackedRace is removed already, queries for the RaceDefinition would still be satisfied up to this point, with a RaceDefinition that is about to disappear;
// FIXME bug5982: no TrackedRace will ever appear again for that RaceDefinition; we should consider introducing a locking pattern around the transaction of removing TrackedRace+RaceDefinition
// FIXME bug5982: and synchronize accordingly with TrackedRegattaImpl.getTrackedRace(RaceDefinition).
// remove the race from the (default) regatta if the regatta is not persistently stored
regatta.removeRace(race);
if (!regatta.isPersistent() && Util.isEmpty(regatta.getAllRaces())) {
@@ -3170,7 +3173,7 @@ Replicator {
@Override
public DynamicTrackedRace getTrackedRace(Regatta regatta, RaceDefinition race) {
return getOrCreateTrackedRegatta(regatta).getTrackedRace(race);
return getOrCreateTrackedRegatta(regatta).getExistingTrackedRace(race);
}
private DynamicTrackedRace getExistingTrackedRace(Regatta regatta, RaceDefinition race) {
@@ -3234,9 +3237,9 @@ Replicator {
if (regatta != null) {
DynamicTrackedRegatta trackedRegatta = regattaTrackingCache.get(regatta);
if (trackedRegatta != null) {
RaceDefinition race = getRace(raceIdentifier);
RaceDefinition race = regatta.getRaceByName(raceIdentifier.getRaceName());
if (race != null) {
result = trackedRegatta.getTrackedRace(race);
result = trackedRegatta.getExistingTrackedRace(race);
}
}
}
@@ -404,7 +404,7 @@ public class SimulationServiceImpl implements SimulationService {
});
}
if (!legListeners.containsKey(legIdentifier.getRaceIdentifier())) {
TrackedRace trackedRace = racingEventService.getTrackedRace(legIdentifier);
final TrackedRace trackedRace = racingEventService.getTrackedRace(legIdentifier);
if (trackedRace != null) {
LegChangeListener listener = new LegChangeListener(trackedRace);
legListeners.put(legIdentifier.getRaceIdentifier(), listener);
@@ -37,28 +37,28 @@
id="slf4j.api"
download-size="0"
install-size="0"
version="1.7.30"
version="2.0.12"
unpack="false"/>
<plugin
id="slf4j.jdk14"
download-size="0"
install-size="0"
version="1.7.30"
version="2.0.12"
unpack="false"/>
<plugin
id="jul.to.slf4j"
download-size="0"
install-size="0"
version="1.7.30"
version="2.0.12"
unpack="false"/>
<plugin
id="jcl.over.slf4j"
download-size="0"
install-size="0"
version="1.7.30"
version="2.0.12"
unpack="false"/>
<plugin
@@ -359,7 +359,35 @@
id="redisson"
download-size="0"
install-size="0"
version="3.17.7"
version="3.27.2"
unpack="false"/>
<plugin
id="com.esotericsoftware.kryo"
download-size="0"
install-size="0"
version="5.6.0"
unpack="false"/>
<plugin
id="com.esotericsoftware.minlog"
download-size="0"
install-size="0"
version="1.3.1"
unpack="false"/>
<plugin
id="com.esotericsoftware.reflectasm"
download-size="0"
install-size="0"
version="1.11.9"
unpack="false"/>
<plugin
id="com.fasterxml.jackson.core.jackson-annotations"
download-size="0"
install-size="0"
version="2.16.1"
unpack="false"/>
<plugin
@@ -397,4 +425,61 @@
version="1.72"
unpack="false"/>
<plugin
id="jodd-bean"
download-size="0"
install-size="0"
version="5.1.6"
unpack="false"/>
<plugin
id="net.bytebuddy.byte-buddy"
download-size="0"
install-size="0"
version="1.14.12"
unpack="false"/>
<plugin
id="net.bytebuddy.byte-buddy.source"
download-size="0"
install-size="0"
version="1.14.12"
unpack="false"/>
<plugin
id="net.bytebuddy.byte-buddy-agent"
download-size="0"
install-size="0"
version="1.14.12"
unpack="false"/>
<plugin
id="net.bytebuddy.byte-buddy-agent.source"
download-size="0"
install-size="0"
version="1.14.12"
unpack="false"/>
<plugin
id="org.jboss.marshalling.jboss-marshalling-osgi"
download-size="0"
install-size="0"
version="2.1.4.SP1"
unpack="false"/>
<plugin
id="io.projectreactor.reactor-core"
download-size="0"
install-size="0"
version="3.6.4.RELEASE"
unpack="false"/>
<plugin
id="com.diffplug.osgi.extension.sun.misc"
feature="true"
download-size="0"
install-size="0"
version="1.0.0"
unpack="false"/>
</feature>
@@ -40,4 +40,137 @@
version="1.9.13"
unpack="false"/>
<plugin
id="com.fasterxml.jackson.core.jackson-core"
download-size="0"
install-size="0"
version="2.16.1"
unpack="false"/>
<plugin
id="com.fasterxml.jackson.core.jackson-databind"
download-size="0"
install-size="0"
version="2.16.1"
unpack="false"/>
<plugin
id="com.fasterxml.jackson.dataformat.jackson-dataformat-yaml"
download-size="0"
install-size="0"
version="2.16.1"
unpack="false"/>
<plugin
id="org.yaml.snakeyaml"
download-size="0"
install-size="0"
version="2.2.0"
unpack="false"/>
<plugin
id="io.netty.transport"
download-size="0"
install-size="0"
version="4.1.107.Final"
unpack="false"/>
<plugin
id="io.netty.buffer"
download-size="0"
install-size="0"
version="4.1.107.Final"
unpack="false"/>
<plugin
id="io.netty.common"
download-size="0"
install-size="0"
version="4.1.107.Final"
unpack="false"/>
<plugin
id="io.netty.resolver"
download-size="0"
install-size="0"
version="4.1.107.Final"
unpack="false"/>
<plugin
id="io.netty.transport-classes-epoll"
download-size="0"
install-size="0"
version="4.1.107.Final"
unpack="false"/>
<plugin
id="io.netty.transport-native-unix-common"
download-size="0"
install-size="0"
version="4.1.107.Final"
unpack="false"/>
<plugin
id="io.netty.transport-classes-kqueue"
download-size="0"
install-size="0"
version="4.1.107.Final"
unpack="false"/>
<plugin
id="io.netty.codec"
download-size="0"
install-size="0"
version="4.1.107.Final"
unpack="false"/>
<plugin
id="io.netty.handler"
download-size="0"
install-size="0"
version="4.1.107.Final"
unpack="false"/>
<plugin
id="io.netty.resolver-dns"
download-size="0"
install-size="0"
version="4.1.107.Final"
unpack="false"/>
<plugin
id="io.netty.codec-dns"
download-size="0"
install-size="0"
version="4.1.107.Final"
unpack="false"/>
<plugin
id="io.netty.incubator.netty-incubator-transport-classes-io_uring"
download-size="0"
install-size="0"
version="0.0.25.Final"
unpack="false"/>
<plugin
id="javax.cache.api"
download-size="0"
install-size="0"
version="1.1.1"
unpack="false"/>
<plugin
id="io.reactivex.rxjava3.rxjava"
download-size="0"
install-size="0"
version="3.1.8"
unpack="false"/>
<plugin
id="reactive-streams"
download-size="0"
install-size="0"
version="1.0.4"
unpack="false"/>
</feature>
@@ -20,10 +20,6 @@
<unit id="org.objectweb.asm.util.source" version="9.4.0.v20221107-1714"/>
<unit id="org.mockito.mockito-core" version="4.8.1.v20221103-2317"/>
<unit id="org.mockito.mockito-core.source" version="4.8.1.v20221103-2317"/>
<unit id="net.bytebuddy.byte-buddy" version="1.12.18.v20221114-2102"/>
<unit id="net.bytebuddy.byte-buddy.source" version="1.12.18.v20221114-2102"/>
<unit id="net.bytebuddy.byte-buddy-agent" version="1.12.18.v20221114-2102"/>
<unit id="net.bytebuddy.byte-buddy-agent.source" version="1.12.18.v20221114-2102"/>
<unit id="com.sun.jna" version="5.12.1.v20221103-2317"/>
<unit id="com.sun.jna.source" version="5.12.1.v20221103-2317"/>
<unit id="com.sun.jna.platform" version="5.12.1.v20221103-2317"/>
@@ -146,7 +142,7 @@
<repository location="https://download.eclipse.org/tools/orbit/downloads/drops/R20210223232630/repository"/>
</location>
<location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="slicer" includeSource="true" type="InstallableUnit">
<unit id="com.amazon.aws.aws-java-api.feature.group" version="2.20.59"/>
<unit id="com.amazon.aws.aws-java-api.feature.group" version="2.25.11"/>
<repository location="https://p2.sapsailing.com/p2/aws-sdk/"/>
</location>
<location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="slicer" includeSource="true" type="InstallableUnit">
@@ -174,6 +170,7 @@
<plugin id="jackson-core-asl"/>
<plugin id="jackson-jaxrs"/>
<plugin id="jackson-mapper-asl"/>
<plugin id="com.fasterxml.jackson.core.jackson-core"/>
<plugin id="javax.security.auth.message"/>
<plugin id="javax.security.auth.message.source"/>
<plugin id="javax.validation"/>
@@ -393,6 +390,31 @@
<plugin id="org.osgi.util.xml"/>
<plugin id="org.osgi.util.xml.source"/>
<plugin id="redisson"/>
<plugin id="com.esotericsoftware.kryo"/>
<plugin id="com.esotericsoftware.minlog"/>
<plugin id="com.esotericsoftware.reflectasm"/>
<plugin id="com.fasterxml.jackson.core.jackson-annotations"/>
<plugin id="com.fasterxml.jackson.core.jackson-databind"/>
<plugin id="com.fasterxml.jackson.dataformat.jackson-dataformat-yaml"/>
<plugin id="org.yaml.snakeyaml"/>
<plugin id="io.netty.transport"/>
<plugin id="io.netty.buffer"/>
<plugin id="io.netty.common"/>
<plugin id="io.netty.resolver"/>
<plugin id="io.netty.transport-classes-epoll"/>
<plugin id="io.netty.transport-native-unix-common"/>
<plugin id="io.netty.transport-classes-kqueue"/>
<plugin id="io.netty.codec"/>
<plugin id="io.netty.handler"/>
<plugin id="io.netty.resolver-dns"/>
<plugin id="io.netty.codec-dns"/>
<plugin id="io.netty.incubator.netty-incubator-transport-classes-io_uring"/>
<plugin id="io.reactivex.rxjava3.rxjava"/>
<plugin id="reactive-streams"/>
<plugin id="jodd-bean"/>
<plugin id="org.jboss.marshalling.jboss-marshalling-osgi"/>
<plugin id="io.projectreactor.reactor-core"/>
<plugin id="com.diffplug.osgi.extension.sun.misc"/>
<plugin id="com.google.gson"/>
<plugin id="com.google.gson.source"/>
<plugin id="com.amazonaws.aws-lambda-java-core"/>
+236 -5
View File
@@ -84,7 +84,7 @@
id="slf4j.jdk14"
download-size="0"
install-size="0"
version="1.7.30"
version="2.0.12"
fragment="true"
unpack="false"/>
@@ -316,7 +316,7 @@
id="slf4j.api"
download-size="0"
install-size="0"
version="1.7.30"
version="2.0.12"
unpack="false"/>
<plugin
@@ -337,7 +337,14 @@
id="jcl.over.slf4j"
download-size="0"
install-size="0"
version="1.7.30"
version="2.0.12"
unpack="false"/>
<plugin
id="jul.to.slf4j"
download-size="0"
install-size="0"
version="2.0.12"
unpack="false"/>
<plugin
@@ -493,6 +500,13 @@
version="1.9.13"
unpack="false"/>
<plugin
id="com.fasterxml.jackson.core.jackson-core"
download-size="0"
install-size="0"
version="2.16.1"
unpack="false"/>
<plugin
id="org.apache.commons.collections"
download-size="0"
@@ -735,14 +749,14 @@
id="com.amazon.aws.aws-java-api"
download-size="0"
install-size="0"
version="2.20.59"
version="2.25.11"
unpack="false"/>
<plugin
id="com.amazon.aws.aws-java-api.source"
download-size="0"
install-size="0"
version="2.20.59"
version="2.25.11"
unpack="false"/>
<plugin
@@ -1012,6 +1026,167 @@
version="1.0.1.202007221806"
unpack="false"/>
<plugin
id="redisson"
download-size="0"
install-size="0"
version="3.27.2"
unpack="false"/>
<plugin
id="com.esotericsoftware.kryo"
download-size="0"
install-size="0"
version="5.6.0"
unpack="false"/>
<plugin
id="com.esotericsoftware.reflectasm"
download-size="0"
install-size="0"
version="1.11.9"
unpack="false"/>
<plugin
id="com.esotericsoftware.minlog"
download-size="0"
install-size="0"
version="1.3.1"
unpack="false"/>
<plugin
id="com.fasterxml.jackson.core.jackson-annotations"
download-size="0"
install-size="0"
version="2.16.1"
unpack="false"/>
<plugin
id="com.fasterxml.jackson.core.jackson-databind"
download-size="0"
install-size="0"
version="2.16.1"
unpack="false"/>
<plugin
id="com.fasterxml.jackson.dataformat.jackson-dataformat-yaml"
download-size="0"
install-size="0"
version="2.16.1"
unpack="false"/>
<plugin
id="org.yaml.snakeyaml"
download-size="0"
install-size="0"
version="2.2.0"
unpack="false"/>
<plugin
id="io.netty.transport"
download-size="0"
install-size="0"
version="4.1.107.Final"
unpack="false"/>
<plugin
id="io.netty.buffer"
download-size="0"
install-size="0"
version="4.1.107.Final"
unpack="false"/>
<plugin
id="io.netty.common"
download-size="0"
install-size="0"
version="4.1.107.Final"
unpack="false"/>
<plugin
id="io.netty.resolver"
download-size="0"
install-size="0"
version="4.1.107.Final"
unpack="false"/>
<plugin
id="io.netty.transport-classes-epoll"
download-size="0"
install-size="0"
version="4.1.107.Final"
unpack="false"/>
<plugin
id="io.netty.transport-native-unix-common"
download-size="0"
install-size="0"
version="4.1.107.Final"
unpack="false"/>
<plugin
id="io.netty.transport-classes-kqueue"
download-size="0"
install-size="0"
version="4.1.107.Final"
unpack="false"/>
<plugin
id="io.netty.codec"
download-size="0"
install-size="0"
version="4.1.107.Final"
unpack="false"/>
<plugin
id="io.netty.handler"
download-size="0"
install-size="0"
version="4.1.107.Final"
unpack="false"/>
<plugin
id="io.netty.resolver-dns"
download-size="0"
install-size="0"
version="4.1.107.Final"
unpack="false"/>
<plugin
id="io.netty.codec-dns"
download-size="0"
install-size="0"
version="4.1.107.Final"
unpack="false"/>
<plugin
id="io.netty.incubator.netty-incubator-transport-classes-io_uring"
download-size="0"
install-size="0"
version="0.0.25.Final"
unpack="false"/>
<plugin
id="io.reactivex.rxjava3.rxjava"
download-size="0"
install-size="0"
version="3.1.8"
unpack="false"/>
<plugin
id="reactive-streams"
download-size="0"
install-size="0"
version="1.0.4"
unpack="false"/>
<plugin
id="javax.cache.api"
download-size="0"
install-size="0"
version="1.1.1"
unpack="false"/>
<plugin
id="com.github.haifengl.smile-core"
download-size="0"
@@ -1082,4 +1257,60 @@
version="2.8.9.v20220111-1409"
unpack="false"/>
<plugin
id="jodd-bean"
download-size="0"
install-size="0"
version="5.1.6"
unpack="false"/>
<plugin
id="net.bytebuddy.byte-buddy"
download-size="0"
install-size="0"
version="1.14.12"
unpack="false"/>
<plugin
id="net.bytebuddy.byte-buddy.source"
download-size="0"
install-size="0"
version="1.14.12"
unpack="false"/>
<plugin
id="net.bytebuddy.byte-buddy-agent"
download-size="0"
install-size="0"
version="1.14.12"
unpack="false"/>
<plugin
id="net.bytebuddy.byte-buddy-agent.source"
download-size="0"
install-size="0"
version="1.14.12"
unpack="false"/>
<plugin
id="org.jboss.marshalling.jboss-marshalling-osgi"
download-size="0"
install-size="0"
version="2.1.4.SP1"
unpack="false"/>
<plugin
id="io.projectreactor.reactor-core"
download-size="0"
install-size="0"
version="3.6.4.RELEASE"
unpack="false"/>
<plugin
id="com.diffplug.osgi.extension.sun.misc"
download-size="0"
install-size="0"
version="1.0.0"
unpack="false"/>
</feature>
@@ -49,10 +49,15 @@ implements com.sap.sse.landscape.Process<RotatingFileBasedLog, MetricsT> {
*/
private static final String RELATIVE_CONFIG_PATH = "conf.d";
/**
* The user which contains the checked-out copy of the httpd configuration git.
*/
private static final String CONFIG_USER = "httpdConf";
/**
* The absolute path to the "httpd config" git repo which stores all httpd configuration files.
*/
private static final String CONFIG_REPO_PATH = "/etc/httpd";
private static final String CONFIG_REPO_PATH = "~" + CONFIG_USER + "/checked-out";
/**
* The branch name that contains the production httpd configuration.
@@ -123,13 +128,14 @@ implements com.sap.sse.landscape.Process<RotatingFileBasedLog, MetricsT> {
private void setRedirect(String configFileNameForHostname, String macroName, String hostname,
Optional<String> optionalKeyName, byte[] privateKeyEncryptionPassphrase, boolean doCommit, boolean doPush, String... macroArguments)
throws Exception {
String command = "echo \"Use " + macroName + " " + hostname + " " + String.join(" ", macroArguments)
+ "\" > " + getAbsoluteConfigFilePath(configFileNameForHostname) + "; service httpd reload" ;
String command = "su - " + CONFIG_USER + " -c 'cd " + CONFIG_REPO_PATH + " && git checkout " + CONFIG_REPO_MAIN_BRANCH_NAME + " && echo \"Use " + macroName + " " + hostname + " " + String.join(" ", macroArguments) + "\" > "
+ getAbsoluteConfigFilePath(configFileNameForHostname);
if (doCommit) {
command = command + " && cd "
+ CONFIG_REPO_PATH + " && " + createCommitAndPushString(configFileNameForHostname,
"Set " + configFileNameForHostname + " redirect", doPush);
}
command = command + "'; service httpd reload"; // Concludes the su. And reloads as the root user.
logger.info("Standard output from setting up the re-direct for " + hostname
+ " and reloading the Apache httpd server: "
+ runCommandAndReturnStdoutAndStderr(command,
@@ -158,7 +164,7 @@ implements com.sap.sse.landscape.Process<RotatingFileBasedLog, MetricsT> {
/**
* Creates a command, that can be ran on an instance to commit, and optionally push, changes to a file (within a git repository). ASSUMES the command is ran from within the repository.
* @param editedFileName The file name edited, created or deleted to commit. This includes the {@link #CONFIG_FILE_EXTENSION}, but not a path.
* @param editedFileName The file name edited, created or deleted to commit. This includes the {@link #CONFIG_FILE_EXTENSION}, but not a path. The method appends the relative path.
* @param commitMsg The commit message, without escaped speech marks.
* @param performPush Boolean indicating whether to push changes or not. True for performing a push.
* @return Returns the created command (in String form) to perform a commit and optional push.
@@ -262,10 +268,19 @@ implements com.sap.sse.landscape.Process<RotatingFileBasedLog, MetricsT> {
*/
private void removeRedirect(String configFileName, String hostname,
Optional<String> optionalKeyName, byte[] privateKeyEncryptionPassphrase) throws Exception {
final String command = "rm " + getAbsoluteConfigFilePath(configFileName) + "; service httpd reload" + " && cd " + CONFIG_REPO_PATH + ";" + createCommitAndPushString(configFileName, "Removed " + hostname, true);
StringBuilder command = new StringBuilder("su - " + CONFIG_USER + " -c '"); // The Git commit must be ran as the CONFIG_USER.
command.append("cd ");
command.append(CONFIG_REPO_PATH);
command.append(" && git checkout ");
command.append(CONFIG_REPO_MAIN_BRANCH_NAME);
command.append(" && rm ");
command.append(getRelativeConfigFilePath(configFileName));
command.append("; ");
command.append(createCommitAndPushString(configFileName, "Removed " + hostname, /* Perform push */ true));
command.append("'; service httpd reload;"); // ' closes the su. The reload must be run as the root user.
logger.info("Standard output from removing the re-direct for " + hostname
+ " and reloading the Apache httpd server: "
+ runCommandAndReturnStdoutAndStderr(command,
+ runCommandAndReturnStdoutAndStderr(command.toString(),
"Standard error from removing the re-direct for " + hostname
+ " and reloading the Apache httpd server: ",
Level.INFO, optionalKeyName, privateKeyEncryptionPassphrase));
+7 -5
View File
@@ -19,9 +19,9 @@ Our default region in AWS EC2 is eu-west-1 (Ireland). Tests are currently run in
In Route53 (the AWS DNS) we have registered the sapsailing.com domain and can manage records for any sub-domains. The "apex" record for sapsailing.com points to a Network Load Balancer (NLB), currently ``NLB-sapsailing-dot-com-f937a5b33246d221.elb.eu-west-1.amazonaws.com``, which does the following things:
* accept SSH connects on port 22; these are forwarded to the internal IP of the web server through the target group ``SSH-to-sapsailing-dot-com``, currently with the internal IP target ``172.31.28.212``
* accept HTTP connections for ``sapsailing.com:80``, forwarding them to the target group ``HTTP-to-sapsailing-dot-com`` which is a TCP target group for port 80 with ip-based targets (instance-based was unfortunately not possible for the old ``m3`` instance type of our web server), again pointing to ``172.31.28.212``, the internal IP of our web server
* accept HTTPS/TLS connections on port 443, using the ACM-managed certificate for ``*.sapsailing.com`` and ``sapsailing.com`` and also forwarding to the ``HTTP-to-sapsailing-dot-com`` target group
* accept SSH connects on port 22; these are forwarded to the internal IP of the web server through the target group ``SSH-to-sapsailing-dot-com-2``, currently with the internal IP target ``172.31.28.212``
* accept HTTP connections for ``sapsailing.com:80``, forwarding them to the target group ``HTTP-to-sapsailing-dot-com-2`` which is a TCP target group for port 80 with ip-based targets (instance-based was unfortunately not possible for the old ``m3`` instance type of our web server), again pointing to ``172.31.28.212``, the internal IP of our web server
* accept HTTPS/TLS connections on port 443, using the ACM-managed certificate for ``*.sapsailing.com`` and ``sapsailing.com`` and also forwarding to the ``HTTP-to-sapsailing-dot-com-2`` target group
* optionally, this NLB could be extended by UDP port mappings in case we see a use case for UDP-based data streams that need forwarding to specific applications, such as the Expedition data typically sent on ports 2010 and following
Additionally, we have created a CNAME record for ``*.sapsailing.com`` pointing at a default application load balancer (ALB) (currently ``DefDynsapsailing-com-1492504005.eu-west-1.elb.amazonaws.com``) in our default region (eu-west-1). Thie default ALB is also called our "dynamic ALB" because it doesn't depend on DNS rules other than the default one for ``*.sapsailing.com``, so other than changes to the DNS which can take minutes to hours to propagate through the world-wide DNS, changes to the default ALB's rule set take effect immediately. Like all ALBs, this one also has a default rule that refers all traffic not matched by other rules to a target group that forwards traffic to an (in the future probably multiple) Apache httpd webserver. All these ALBs handle SSL termination by means of an ACM-managed certificate that AWS automatically renews before it expires. The traffic routed to the target groups is always HTTP only.
@@ -38,6 +38,8 @@ The IPs for all reverse proxies will automatically be added to the `CentralWebSe
and to the `DDNSMapped-x-HTTP` (in all the DDNSMapped servers). These are the target groups for the default rules and it ensures availability to the ARCHIVE especially.
Currently, the new approach tags instances with `disposableProxy` to indicate it hosts no vital services. `ReverseProxy` also identifies any reverse proxies. The health check for the target groups would change to trigger a script which returns different error codes: healthy/200 if in the same AZ as the archive (or if the failover archive is in use), whilst unhealthy/503 if in different AZs. This will reduce cross-AZ, archive traffic costs, but maintain availability and load balancing.
For security groups of the central reverse proxy, we want Webserver, as well as Disposable Reverse Proxy. The diposables just have the latter.
There is hope to also deploy the httpd on already existing instances, which have free resources and a certain tag permitting this
co-deployment.
Most of sapsailing.com no longer cares about SSL and does not need to have an SSL certificate. Sail-insight still does though. The central reverse proxy offers the following services:
@@ -64,8 +66,8 @@ If you see ``Syntax OK`` then reload the configuration using
The webserver is registered as target in various locations:
* As DNS record with its internal IP address (e.g., 172.31.19.129) for the two DNS entries ``logfiles.internal.sapsailing.com`` used by various NFS mounts, and ``smtp.internal.sapsailing.com`` for e-mail traffic sent within the landscape and not requiring the AWS SES
* as IP target with its internal IP address for the ``HTTP-to-sapsailing-dot-com`` target group, accepting the HTTP traffic sent straight to ``sapsailing.com`` (not ``www.sapsailing.com``)
* as IP target with its internal IP address for the ``SSH-to-sapsailing-dot-com`` target group, accepting the SSH traffic for ``sapsailing.com``
* as IP target with its internal IP address for the ``HTTP-to-sapsailing-dot-com-2`` target group, accepting the HTTP traffic sent straight to ``sapsailing.com`` (not ``www.sapsailing.com``)
* as IP target with its internal IP address for the ``SSH-to-sapsailing-dot-com-2`` target group, accepting the SSH traffic for ``sapsailing.com``
* as regular instance target in all load balancers' default rule's target group, such as ``DefDynsapsailing-com``, ``DNSMapped-0``, ``DNSMapped-1``, and so on; the names of the target groups are ``CentralWebServerHTTP-Dyn``, ``DDNSMapped-0-HTTP``, ``DDNSMapped-1-HTTP``, and so on, respectively
* as regular instance target in ``DNSMapped-0``'s target group ``DNSMapped0-Central-HTTP`` to which requests for services available only on the *central* reverse proxy are forwarded to, such as ``releases.sapsailing.com``, ``bugzilla.sapsailing.com``, and so on
* as target of the elastic IP address ``54.229.94.254``
@@ -563,6 +563,12 @@ REPLICATION_HOST=localhost
REPLICATION_PORT=5673
USE_ENVIRONMENT=live-master-server
ADDITIONAL_JAVA_ARGS="${ADDITIONAL_JAVA_ARGS} -Dcom.sap.sse.debranding=true -Dpolardata.source.url=https://www.sapsailing.com:22443 -Dwindestimation.source.url=https://www.sapsailing.com:22443"
ADDITIONAL_JAVA_ARGS="$ADDITIONAL_JAVA_ARGS -Dsecurity.sharedAcrossSubdomainsOf=sailing.omegatiming.com -Dsecurity.baseUrlForCrossDomainStorage=https://security-service.sapsailing.com -Dgwt.acceptableCrossDomainStorageRequestOriginRegexp=https?://(.*\.)?sailing\.omegatiming\.com(:[0-9]*)?$"
# Place additional secrets here, e.g., from root@sapsailing.com:secrets
MANAGE2SAIL_ACCESS_TOKEN=...
IGTIMI_CLIENT_ID=...
IGTIMI_CLIENT_SECRET=...
GOOGLE_MAPS_AUTHENTICATION_PARAMS="..."
```
### Secondary Master
@@ -591,6 +597,12 @@ REPLICATION_HOST=localhost
REPLICATION_PORT=5673
USE_ENVIRONMENT=live-master-server
ADDITIONAL_JAVA_ARGS="${ADDITIONAL_JAVA_ARGS} -Dcom.sap.sse.debranding=true -Dpolardata.source.url=https://www.sapsailing.com:22443 -Dwindestimation.source.url=https://www.sapsailing.com:22443"
ADDITIONAL_JAVA_ARGS="$ADDITIONAL_JAVA_ARGS -Dsecurity.sharedAcrossSubdomainsOf=sailing.omegatiming.com -Dsecurity.baseUrlForCrossDomainStorage=https://security-service.sapsailing.com -Dgwt.acceptableCrossDomainStorageRequestOriginRegexp=https?://(.*\.)?sailing\.omegatiming\.com(:[0-9]*)?$"
# Place additional secrets here, e.g., from root@sapsailing.com:secrets
MANAGE2SAIL_ACCESS_TOKEN=...
IGTIMI_CLIENT_ID=...
IGTIMI_CLIENT_SECRET=...
GOOGLE_MAPS_AUTHENTICATION_PARAMS="..."
```
@@ -622,6 +634,9 @@ REPLICATION_PORT=5672
REPLICATION_CHANNEL=${SERVER_NAME}-replica
USE_ENVIRONMENT=live-replica-server
ADDITIONAL_JAVA_ARGS="${ADDITIONAL_JAVA_ARGS} -Dcom.sap.sse.debranding=true"
ADDITIONAL_JAVA_ARGS="$ADDITIONAL_JAVA_ARGS -Dsecurity.sharedAcrossSubdomainsOf=sailing.omegatiming.com -Dsecurity.baseUrlForCrossDomainStorage=https://security-service.sapsailing.com -Dgwt.acceptableCrossDomainStorageRequestOriginRegexp=https?://(.*\.)?sailing\.omegatiming\.com(:[0-9]*)?$"
# Place additional secrets here, e.g., from root@sapsailing.com:secrets
GOOGLE_MAPS_AUTHENTICATION_PARAMS="..."
```
(Adjust the release accordingly, of course). (NOTE: During the first production days of the event we noticed that it was really a BAD IDEA to have all replicas use the same DB set-up, all writing to the MongoDB PRIMARY of the "live" replica set in eu-west-1. With tens of replicas running concurrently, this led to a massive block-up based on MongoDB not writing fast enough. This gave rise to a new application server AMI which now has a MongoDB set-up included, using "replica" as the MongoDB replica set name. Now, each replica hence can write into its own MongoDB instance, isolated from all others and scaling linearly.)
@@ -641,6 +656,9 @@ REPLICATE_MASTER_EXCHANGE_NAME=paris2024
REPLICATE_MASTER_QUEUE_HOST=rabbit-eu-west-3.sapsailing.com
REPLICATE_MASTER_BEARER_TOKEN="***"
ADDITIONAL_JAVA_ARGS="${ADDITIONAL_JAVA_ARGS} -Dcom.sap.sse.debranding=true"
ADDITIONAL_JAVA_ARGS="$ADDITIONAL_JAVA_ARGS -Dsecurity.sharedAcrossSubdomainsOf=sailing.omegatiming.com -Dsecurity.baseUrlForCrossDomainStorage=https://security-service.sapsailing.com -Dgwt.acceptableCrossDomainStorageRequestOriginRegexp=https?://(.*\.)?sailing\.omegatiming\.com(:[0-9]*)?$"
# Place additional secrets here, e.g., from root@sapsailing.com:secrets
GOOGLE_MAPS_AUTHENTICATION_PARAMS="..."
```
### Application Servers