Merge remote-tracking branch 'origin/master' into leaderboardView2

This commit is contained in:
fmittag committed 2013-09-04 11:50:52 +02:00
commit b0d4cca151
114 files changed
+2667 -890

No files matched your search

-2
View File
@@ -2,8 +2,6 @@
<classpath>
<classpathentry exported="true" kind="lib" path="lib/gwt-dev.jar"/>
<classpathentry exported="true" kind="lib" path="lib/gwt-user.jar"/>
<classpathentry exported="true" kind="lib" path="lib/validation-api-1.0.0.GA-sources.jar"/>
<classpathentry exported="true" kind="lib" path="lib/validation-api-1.0.0.GA.jar"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
<classpathentry kind="output" path="bin"/>
@@ -7,10 +7,7 @@ Bundle-Vendor: GOOGLE
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Bundle-ClassPath: lib/gwt-dev.jar,
lib/gwt-user.jar,
lib/validation-api-1.0.0.GA-sources.jar,
lib/validation-api-1.0.0.GA.jar,
.
Eclipse-BuddyPolicy: registered
Export-Package: com.gargoylesoftware.htmlunit,
com.gargoylesoftware.htmlunit.attachment,
com.gargoylesoftware.htmlunit.gae,
@@ -601,4 +598,6 @@ Export-Package: com.gargoylesoftware.htmlunit,
org.mortbay.util,
org.mortbay.util.ajax,
org.mortbay.xml
Require-Bundle: javax.servlet;bundle-version="2.5.0";visibility:=reexport
Require-Bundle: javax.validation;bundle-version="1.0.0"
Import-Package: javax.servlet;version="2.5.0",
javax.servlet.http;version="2.5.0"
+1 -3
View File
@@ -1,6 +1,4 @@
bin.includes = META-INF/,\
.,\
lib/gwt-dev.jar,\
lib/gwt-user.jar,\
lib/validation-api-1.0.0.GA-sources.jar,\
lib/validation-api-1.0.0.GA.jar
lib/gwt-user.jar
+28
View File
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>com.google.gwt.user.osgi</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.ManifestBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.SchemaBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.pde.PluginNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>
@@ -6,8 +6,7 @@ Bundle-Version: 1.0.0.qualifier
Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Fragment-Host: com.sap.sailing.declination
Require-Bundle: org.junit4;bundle-version="4.8.2"
Import-Package: com.sap.sailing.domain.common,
com.sap.sailing.domain.common.impl,
com.sap.sailing.domain.common.quadtree,
junit.framework;version="4.8.1",
org.junit;version="4.8.1"
com.sap.sailing.domain.common.quadtree
@@ -1,6 +1,5 @@
package com.sap.sailing.domain.common.impl;
import java.text.SimpleDateFormat;
import java.util.Comparator;
import java.util.Date;
@@ -9,8 +8,6 @@ import com.sap.sailing.domain.common.TimePoint;
public abstract class AbstractTimePoint implements TimePoint {
private static final long serialVersionUID = 8825508619301420378L;
public static SimpleDateFormat TIMEPOINT_FORMATTER = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
public static Comparator<TimePoint> TIMEPOINT_COMPARATOR = new SerializableComparator<TimePoint>() {
private static final long serialVersionUID = 7644726881387366025L;
@@ -68,7 +65,7 @@ public abstract class AbstractTimePoint implements TimePoint {
@Override
public String toString() {
return TIMEPOINT_FORMATTER.format(asDate());
return asDate().toString();
}
/**
@@ -16,9 +16,8 @@ Require-Bundle: com.sap.sailing.domain,
com.sap.sailing.domain.persistence,
com.sap.sailing.domain.tractracadapter,
com.sap.sailing.domain.swisstimingadapter.persistence;bundle-version="1.0.0",
org.junit4;bundle-version="4.8.2",
org.hamcrest.core;bundle-version="1.1.0"
Bundle-ClassPath: resources/,
.
Import-Package: com.sap.sailing.server,
junit.framework;version="4.8.1",
org.junit;version="4.8.1"
Import-Package: com.sap.sailing.server
@@ -47,14 +47,6 @@ public class DomainFactoryTest {
assertThat(raceType.getRaceCode(), is(OlympicRaceCode._470_WOMEN));
}
@Test
public void testGet470WomenBoatClass2() throws Exception {
String raceID = "SAW005_xxx";
RaceType raceType = swissTimingDomainFactory.getRaceTypeFromRaceID(raceID );
assertThat(raceType, is(notNullValue()));
assertThat(raceType.getRaceCode(), is(OlympicRaceCode._470_WOMEN));
}
@Test
public void testDontGetWrongBoatClass() throws Exception {
String raceID = "ABC";
@@ -45,7 +45,7 @@ public class SimpleDomainFactoryTest {
@Test
public void testExtractBoatClassFromRaceIDWithEventID() {
String raceID = "QINSWC12013;SAW005901";
String raceID = "QINSWC12013_SAW005901";
RaceType raceType = DomainFactory.INSTANCE.getRaceTypeFromRaceID(raceID);
assertEquals("470", raceType.getBoatClass().getName());
}
@@ -206,7 +206,7 @@ public class DomainFactoryImpl implements DomainFactory {
public RaceType getRaceTypeFromRaceID(String raceID) {
final RaceType result;
if (raceID != null && raceID.length() >= 6) {
final String[] optionalEventIDAndMandatoryRaceID = raceID.split(";");
final String[] optionalEventIDAndMandatoryRaceID = raceID.split("_");
final String swissTimingRaceCode = optionalEventIDAndMandatoryRaceID[optionalEventIDAndMandatoryRaceID.length-1].substring(0, 6).toUpperCase();
RaceType raceType = raceTypeByID.get(swissTimingRaceCode);
if (raceType == null) {
@@ -7,6 +7,6 @@ Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Fragment-Host: com.sap.sailing.domain.swisstimingreplayadapter
Import-Package: org.json.simple,
org.json.simple.parser,
org.junit;version="4.8.2"
Require-Bundle: com.sap.sailing.domain.test
org.json.simple.parser
Require-Bundle: com.sap.sailing.domain.test,
org.junit4;bundle-version="4.8.2"
@@ -14,10 +14,8 @@ Require-Bundle: com.sap.sailing.domain,
org.mockito.mockito-core;bundle-version="1.9.5",
com.sap.sailing.domain.test,
org.hamcrest;bundle-version="1.1.0",
org.objenesis;bundle-version="1.3.0"
org.objenesis;bundle-version="1.3.0",
org.junit4;bundle-version="4.8.2",
org.json.simple;bundle-version="1.1.0"
Export-Package: com.sap.sailing.domain.test,
com.sap.sailing.domain.test.mock
Import-Package: junit.framework;version="4.8.1",
org.json.simple,
org.json.simple.parser,
org.junit;version="4.8.1"
@@ -8,7 +8,5 @@ Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Fragment-Host: com.sap.sailing.expeditionconnector
Require-Bundle: com.sap.sailing.server,
com.sap.sailing.domain.test,
com.sap.sailing.udpconnector
Import-Package: junit.framework;version="4.8.1",
org.junit;version="4.8.1",
org.osgi.framework;version="1.6.0"
com.sap.sailing.udpconnector,
org.junit4;bundle-version="4.8.2"
@@ -34,10 +34,10 @@
<plugin id="com.sap.sailing.barbados.resultimport" autoStart="true" startLevel="3" />
<plugin id="com.sap.sailing.ess40.resultimport" autoStart="true" startLevel="3" />
<plugin id="com.sap.sailing.freg.resultimport" autoStart="true" startLevel="3" />
<plugin id="com.sap.sailing.gwt.ui" autoStart="true" startLevel="4" />
<plugin id="com.sap.sailing.gwt.ui" autoStart="true" startLevel="5" />
<plugin id="com.sap.sailing.kiworesultimport" autoStart="true" startLevel="3" />
<plugin id="com.sap.sailing.manage2sail.resultimport" autoStart="true" startLevel="3" />
<plugin id="com.sap.sailing.monitoring" autoStart="true" startLevel="5" />
<plugin id="com.sap.sailing.monitoring" autoStart="true" startLevel="6" />
<plugin id="com.sap.sailing.resultimport" autoStart="true" startLevel="3" />
<plugin id="com.sap.sailing.sailwave.resultimport" autoStart="true" startLevel="3" />
<plugin id="com.sap.sailing.server" autoStart="true" startLevel="4" />
@@ -27,17 +27,15 @@
<import plugin="org.eclipse.osgi"/>
<import plugin="org.eclipse.osgi.services"/>
<import plugin="slf4j.api"/>
<import plugin="javax.el"/>
<import plugin="javax.servlet.jsp"/>
<import plugin="javax.servlet.jsp.jstl"/>
<import plugin="org.apache.jasper.glassfish"/>
<import plugin="org.apache.taglibs.standard.glassfish"/>
<import plugin="org.eclipse.jetty.osgi.boot"/>
<import plugin="org.eclipse.jetty.websocket.api"/>
<import plugin="org.eclipse.jetty.websocket.client"/>
<import plugin="org.eclipse.jetty.websocket.common"/>
<import plugin="org.eclipse.jetty.websocket.server"/>
<import plugin="org.eclipse.jetty.websocket.servlet"/>
<import plugin="org.apache.felix.gogo.command"/>
<import plugin="org.apache.felix.gogo.runtime"/>
<import plugin="org.apache.felix.gogo.shell"/>
</requires>
<plugin
@@ -47,14 +45,6 @@
version="9.0.4.v20130625"
unpack="false"/>
<plugin
id="org.eclipse.jetty.osgi.boot.jsp"
download-size="0"
install-size="0"
version="9.0.4.v20130625"
fragment="true"
unpack="false"/>
<plugin
id="jul.to.slf4j"
download-size="0"
@@ -98,4 +88,11 @@
version="0.0.0"
unpack="false"/>
<plugin
id="org.eclipse.equinox.console"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
</feature>
+23 -33
View File
@@ -22,20 +22,38 @@ Computes leaderboard information for sailing races and offers RESTful APIs to al
<requires>
<import plugin="com.googlecode.java-diff-utils" version="1.3.0" match="greaterOrEqual"/>
<import plugin="org.eclipse.osgi"/>
<import plugin="org.eclipse.osgi" version="3.9.0" match="greaterOrEqual"/>
<import plugin="javax.servlet" version="2.6.0" match="greaterOrEqual"/>
<import plugin="com.mongodb.driver" version="2.6.2" match="greaterOrEqual"/>
<import plugin="com.google.gwt.osgi" version="2.4.0" match="greaterOrEqual"/>
<import plugin="com.sap.sailing.domain.common"/>
<import plugin="com.google.gwt.osgi" version="2.5.1" match="greaterOrEqual"/>
<import plugin="org.json.simple" version="1.1.0" match="greaterOrEqual"/>
<import plugin="com.sap.sailing.operationaltransformation"/>
<import plugin="org.moxieapps.gwt.highcharts" version="1.1.4" match="greaterOrEqual"/>
<import plugin="com.sap.sailing.geocoding"/>
<import plugin="org.apache.geronimo.specs.geronimo-jms_1.1_spec"/>
<import plugin="com.rabbitmq.client"/>
<import plugin="org.apache.geronimo.specs.geronimo-j2ee-management_1.1_spec"/>
</requires>
<plugin
id="com.sap.sailing.geocoding"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.operationaltransformation"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.domain.common"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.domain"
download-size="0"
@@ -85,13 +103,6 @@ Computes leaderboard information for sailing races and offers RESTful APIs to al
version="0.0.0"
unpack="false"/>
<plugin
id="org.json.simple"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.declination"
download-size="0"
@@ -99,13 +110,6 @@ Computes leaderboard information for sailing races and offers RESTful APIs to al
version="0.0.0"
unpack="false"/>
<plugin
id="com.mongodb.driver"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.mongodb"
download-size="0"
@@ -176,20 +180,6 @@ Computes leaderboard information for sailing races and offers RESTful APIs to al
version="0.0.0"
unpack="false"/>
<plugin
id="com.google.gwt.osgi"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.googlecode.java-diff-utils"
download-size="0"
install-size="0"
version="0.0.0"
unpack="false"/>
<plugin
id="com.sap.sailing.www"
download-size="0"
@@ -6,6 +6,5 @@ Bundle-Version: 1.0.0.qualifier
Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Fragment-Host: com.sap.sailing.geocoding
Import-Package: junit.framework;version="4.8.2",
org.json.simple.parser,
org.junit;version="4.8.2"
Require-Bundle: org.junit4;bundle-version="4.8.2"
Import-Package: org.json.simple.parser
+1 -1
View File
@@ -3,8 +3,8 @@
<classpathentry kind="src" path="src/main/resources"/>
<classpathentry kind="src" path="src/main/java"/>
<classpathentry exported="true" kind="lib" path="WEB-INF/classes/"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
<classpathentry kind="lib" path="WEB-INF/lib/gwt-servlet.jar" sourcepath="/com.google.gwt.osgi/lib/gwt-user.jar"/>
<classpathentry kind="lib" path="WEB-INF/lib/gwt-maps.jar"/>
<classpathentry kind="output" path="bin"/>
@@ -16,7 +16,6 @@ Require-Bundle: com.sap.sailing.domain,
com.sap.sailing.domain.persistence,
com.sap.sailing.domain.swisstimingadapter.persistence,
com.sap.sailing.domain.tractracadapter.persistence,
com.google.gwt.osgi;bundle-version="2.4.0",
com.sap.sailing.domain.common,
com.sap.sailing.resultimport,
org.moxieapps.gwt.highcharts;bundle-version="1.5.0",
@@ -27,12 +26,14 @@ Require-Bundle: com.sap.sailing.domain,
com.sap.sailing.domain.swisstimingreplayadapter,
com.sap.sailing.simulator;bundle-version="1.0.0",
com.sap.sailing.server.gateway.serialization;bundle-version="1.0.0",
de.csenk.gwt.ws
de.csenk.gwt.ws,
com.google.gwt.osgi;bundle-version="2.5.1"
Bundle-Activator: com.sap.sailing.gwt.ui.server.Activator
Bundle-ActivationPolicy: lazy
Import-Package: javax.jms;version="1.1.0",
javax.servlet;version="2.6.0",
javax.servlet.http;version="2.6.0",
javax.servlet.descriptor;version="2.6.0",
org.json.simple,
org.json.simple.parser,
org.osgi.framework,
@@ -17,9 +17,8 @@ Require-Bundle: com.sap.sailing.domain,
org.json.simple;bundle-version="1.1.0",
com.sap.sailing.domain.swisstimingadapter,
org.objenesis;bundle-version="1.3.0",
org.junit4;bundle-version="4.8.2",
org.hamcrest;bundle-version="1.1.0",
org.mockito.mockito-core;bundle-version="1.9.5"
Import-Package: com.sap.sailing.domain.common.impl,
junit.framework;version="4.8.2",
org.junit;version="4.8.2"
Import-Package: com.sap.sailing.domain.common.impl
@@ -5,5 +5,5 @@ Bundle-SymbolicName: com.sap.sailing.operationaltransformation.test
Bundle-Version: 1.0.0.qualifier
Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Require-Bundle: org.junit4;bundle-version="4.8.2"
Fragment-Host: com.sap.sailing.operationaltransformation
Import-Package: org.junit;version="4.8.2"
@@ -24,6 +24,12 @@ import com.sap.sailing.selenium.test.PageArea;
public class TracTracEventManagementPanel extends PageArea {
@FindBy(how = BySeleniumId.class, using = "JSONURL")
private WebElement jsonURLField;
@FindBy(how = BySeleniumId.class, using = "LiveURI")
private WebElement liveURIField;
@FindBy(how = BySeleniumId.class, using = "StoredURI")
private WebElement storedURIField;
@FindBy(how = BySeleniumId.class, using = "ListRaces")
private WebElement listRacesButton;
@@ -55,9 +61,11 @@ public class TracTracEventManagementPanel extends PageArea {
* The URL for which the races are to list.
*/
public void listRaces(String url) {
this.jsonURLField.clear();
this.jsonURLField.sendKeys(url);
this.listRacesButton.click();
liveURIField.clear();
storedURIField.clear();
jsonURLField.clear();
jsonURLField.sendKeys(url);
listRacesButton.click();
waitForAjaxRequests();
}
@@ -5,8 +5,7 @@ Bundle-SymbolicName: com.sap.sailing.server.gateway.ess40
Bundle-Version: 1.0.0.qualifier
Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Import-Package: org.apache.jasper.servlet,
org.osgi.framework;version="1.3.0",
Import-Package: org.osgi.framework;version="1.3.0",
org.osgi.util.tracker;version="1.3.1",
com.sap.sailing.server
Bundle-ActivationPolicy: lazy
@@ -17,9 +16,6 @@ Require-Bundle: com.sap.sailing.domain,
com.mongodb.driver;bundle-version="2.6.2",
javax.servlet;bundle-version="2.6.0",
com.sap.sailing.domain.common,
javax.servlet.jsp.jstl;bundle-version="1.2.0",
javax.servlet.jsp;bundle-version="2.2.0",
javax.el;bundle-version="2.2.0",
com.sap.sailing.server.gateway
Bundle-ClassPath: .
Web-ContextPath: /gateway-ess40
@@ -1,120 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ page import="java.util.*" %>
<%@ page import="java.text.*" %>
<%@ page import="com.sap.sailing.domain.leaderboard.Leaderboard" %>
<%@ page import="com.sap.sailing.domain.base.*" %>
<%@ page import="com.sap.sailing.domain.base.impl.*" %>
<%@ page import="com.sap.sailing.domain.common.*" %>
<%@ page import="com.sap.sailing.domain.tracking.*" %>
<%@ page pageEncoding="UTF-8" %>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title>SAP Sailing Analytics Leaderboard</title>
<link rel="stylesheet" href="<%= request.getContextPath() %>/css/leaderboard.css" type="text/css"></link>
<link rel="stylesheet" href="<%= request.getContextPath() %>/css/tablesorter.css" type="text/css"></link>
<script type="text/javascript" src="<%= request.getContextPath() %>/js/jquery-latest.js"></script>
<script type="text/javascript" src="<%= request.getContextPath() %>/js/jquery.tablesorter.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$("#leaderboardTable").tablesorter();
});
</script>
</head>
<body>
<%
TimePoint timePoint = MillisecondsTimePoint.now();
Leaderboard leaderboard = (Leaderboard) request.getAttribute("leaderboard");
// competitors are ordered according to total rank
List<Competitor> competitorsFromBestToWorst = leaderboard.getCompetitorsFromBestToWorst(timePoint);
Map<RaceColumn, List<Competitor>> rankedCompetitorsPerColumn = new HashMap<RaceColumn, List<Competitor>>();
Iterable<RaceColumn> raceColumns = leaderboard.getRaceColumns();
NumberFormat scoreFormat = NumberFormat.getNumberInstance();
int digitPresicion = 1;
scoreFormat.setMinimumFractionDigits(digitPresicion);
scoreFormat.setMaximumFractionDigits(digitPresicion);
String imgFlagPath = "/gwt/images/flags/";
%>
<h3>Leaderboard: <%= leaderboard.getName() %></h3>
<table id="leaderboardTable" class="tablesorter">
<thead>
<tr>
<th>Rank</th>
<th>Team</th>
<% for (RaceColumn raceColumn : raceColumns) { %>
<th><%= raceColumn.getName() %></th>
<% } %>
<th>Points</th>
</tr>
</thead>
<tbody>
<%
for (Competitor competitor : competitorsFromBestToWorst) {
int totalRank = competitorsFromBestToWorst.indexOf(competitor) + 1;
Nationality nationality = competitor.getTeam().getNationality();
Double totalPoints = leaderboard.getTotalPoints(competitor, timePoint);
if(leaderboard.hasCarriedPoints(competitor)) {
Double carriedPoints = leaderboard.getCarriedPoints(competitor);
if(carriedPoints != null) {
totalPoints = totalPoints != null ? totalPoints += carriedPoints : carriedPoints;
}
}
%>
<tr>
<td><%= totalRank %></td>
<td style="white-space:nowrap;"><img src="<%= imgFlagPath + nationality.getCountryCode().getTwoLetterISOCode().toLowerCase() + ".png"%>" />&nbsp;&nbsp;<%= competitor.getName() %></td>
<% for (RaceColumn raceColumn : raceColumns) {
List<Competitor> rankedCompetitorsForColumn = rankedCompetitorsPerColumn.get(raceColumn);
if (rankedCompetitorsForColumn == null) {
rankedCompetitorsForColumn = leaderboard.getCompetitorsFromBestToWorst(raceColumn, timePoint);
rankedCompetitorsPerColumn.put(raceColumn, rankedCompetitorsForColumn);
}
Double netRacePoints = leaderboard.getNetPoints(competitor, raceColumn, timePoint);
Double totalRacePoints = leaderboard.getTotalPoints(competitor, raceColumn, timePoint);
MaxPointsReason maxPointsReason = leaderboard.getMaxPointsReason(competitor, raceColumn, timePoint);
int rank = rankedCompetitorsForColumn.indexOf(competitor)+1;
TrackedRace trackedRace = raceColumn.getTrackedRace(competitor);
if (trackedRace != null) {
int raceRank = trackedRace.getRank(competitor, timePoint);
}
boolean isDiscarded = leaderboard.isDiscarded(competitor, raceColumn, timePoint);
boolean isCorrected = leaderboard.getScoreCorrection().isScoreCorrected(competitor, raceColumn);
String racePointsStyleClasses = "";
String racePoints = "&nbsp;";
if (maxPointsReason == null || maxPointsReason == MaxPointsReason.NONE) {
if (!isDiscarded) {
racePointsStyleClasses = "leaderboard-points-TotalPoints-NotDiscarded";
if(totalRacePoints != null) {
racePoints = scoreFormat.format(totalRacePoints);
}
} else {
racePointsStyleClasses = "leaderboard-points-TotalPoints-Discarded";
if(netRacePoints != null) {
racePoints = scoreFormat.format(netRacePoints);
}
}
} else {
if (!isDiscarded) {
racePointsStyleClasses = "leaderboard-points-MaxPoints-NotDiscarded";
} else {
racePointsStyleClasses = "leaderboard-points-MaxPoints-Discarded";
}
racePoints = maxPointsReason.name();
}
%>
<td class="<%= racePointsStyleClasses %>"><%= racePoints %></td>
<% } %>
<td><%= totalPoints %></td>
</tr>
<% } %>
</tbody>
</table>
</body>
</html>
@@ -1,135 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ page import="java.util.*" %>
<%@ page import="java.text.*" %>
<%@ page import="com.sap.sailing.domain.leaderboard.*" %>
<%@ page import="com.sap.sailing.domain.leaderboard.meta.*" %>
<%@ page import="com.sap.sailing.domain.base.*" %>
<%@ page import="com.sap.sailing.domain.base.impl.*" %>
<%@ page import="com.sap.sailing.domain.common.*" %>
<%@ page import="com.sap.sailing.domain.tracking.*" %>
<%@ page pageEncoding="UTF-8" %>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title>SAP Sailing Analytics Leaderboard</title>
<link rel="stylesheet" href="<%= request.getContextPath() %>/css/leaderboard.css" type="text/css"></link>
<link rel="stylesheet" href="<%= request.getContextPath() %>/css/tablesorter.css" type="text/css"></link>
<script type="text/javascript" src="<%= request.getContextPath() %>/js/jquery-latest.js"></script>
<script type="text/javascript" src="<%= request.getContextPath() %>/js/jquery.tablesorter.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$("#leaderboardTable").tablesorter();
});
</script>
</head>
<body>
<%
TimePoint timePoint = MillisecondsTimePoint.now();
LeaderboardGroupMetaLeaderboard leaderboard = (LeaderboardGroupMetaLeaderboard) request.getAttribute("leaderboard");
Boolean showRaceDetails = (Boolean) request.getAttribute("showRaceDetails");
// competitors are ordered according to total rank
List<Competitor> competitorsFromBestToWorst = leaderboard.getCompetitorsFromBestToWorst(timePoint);
Map<RaceColumn, List<Competitor>> rankedCompetitorsPerColumn = new HashMap<RaceColumn, List<Competitor>>();
Iterable<RaceColumn> raceColumns = leaderboard.getRaceColumns();
List<Competitor> suppressedCompetitors = new ArrayList<Competitor>();
for(Competitor c: leaderboard.getSuppressedCompetitors()) {
suppressedCompetitors.add(c);
}
NumberFormat scoreFormat = NumberFormat.getNumberInstance();
int digitPresicion = 1;
scoreFormat.setMinimumFractionDigits(digitPresicion);
scoreFormat.setMaximumFractionDigits(digitPresicion);
String imgFlagPath = "/gwt/images/flags/";
%>
<h3>Overall Leaderboard: <%= leaderboard.getName() %></h3>
<table id="leaderboardTable" class="tablesorter">
<thead>
<tr>
<th>Rank</th>
<th>Team</th>
<% if(showRaceDetails) {
for (RaceColumn raceColumn : raceColumns) { %>
<th><%
String raceColumnName = raceColumn.getName();
String prefixToCut = "Extreme 40 ";
if(raceColumnName.startsWith(prefixToCut)) {
raceColumnName = raceColumnName.substring(prefixToCut.length(), raceColumnName.length());
}
%><%= raceColumnName %></th>
<% } } %>
<th>Points</th>
</tr>
</thead>
<tbody>
<%
for (Competitor competitor : competitorsFromBestToWorst) {
int totalRank = competitorsFromBestToWorst.indexOf(competitor) + 1;
Nationality nationality = competitor.getTeam().getNationality();
Double totalPoints = leaderboard.getTotalPoints(competitor, timePoint);
if(leaderboard.hasCarriedPoints(competitor)) {
Double carriedPoints = leaderboard.getCarriedPoints(competitor);
if(carriedPoints != null) {
totalPoints = totalPoints != null ? totalPoints += carriedPoints : carriedPoints;
}
}
if(!suppressedCompetitors.contains(competitor)) {
%>
<tr>
<td><%= totalRank %></td>
<td style="white-space:nowrap;"><img src="<%= imgFlagPath + nationality.getCountryCode().getTwoLetterISOCode().toLowerCase() + ".png"%>" />&nbsp;&nbsp;<%= competitor.getName() %></td>
<% if(showRaceDetails) {
for (RaceColumn raceColumn : raceColumns) {
List<Competitor> rankedCompetitorsForColumn = rankedCompetitorsPerColumn.get(raceColumn);
if (rankedCompetitorsForColumn == null) {
rankedCompetitorsForColumn = leaderboard.getCompetitorsFromBestToWorst(raceColumn, timePoint);
rankedCompetitorsPerColumn.put(raceColumn, rankedCompetitorsForColumn);
}
Double netRacePoints = leaderboard.getNetPoints(competitor, raceColumn, timePoint);
Double totalRacePoints = leaderboard.getTotalPoints(competitor, raceColumn, timePoint);
MaxPointsReason maxPointsReason = leaderboard.getMaxPointsReason(competitor, raceColumn, timePoint);
int rank = rankedCompetitorsForColumn.indexOf(competitor)+1;
TrackedRace trackedRace = raceColumn.getTrackedRace(competitor);
if (trackedRace != null) {
int raceRank = trackedRace.getRank(competitor, timePoint);
}
boolean isDiscarded = leaderboard.isDiscarded(competitor, raceColumn, timePoint);
boolean isCorrected = leaderboard.getScoreCorrection().isScoreCorrected(competitor, raceColumn);
String racePointsStyleClasses = "";
String racePoints = "&nbsp;";
if (maxPointsReason == null || maxPointsReason == MaxPointsReason.NONE) {
if (!isDiscarded) {
racePointsStyleClasses = "leaderboard-points-TotalPoints-NotDiscarded";
if(totalRacePoints != null) {
racePoints = scoreFormat.format(totalRacePoints);
}
} else {
racePointsStyleClasses = "leaderboard-points-TotalPoints-Discarded";
if(netRacePoints != null) {
racePoints = scoreFormat.format(netRacePoints);
}
}
} else {
if (!isDiscarded) {
racePointsStyleClasses = "leaderboard-points-MaxPoints-NotDiscarded";
} else {
racePointsStyleClasses = "leaderboard-points-MaxPoints-Discarded";
}
racePoints = maxPointsReason.name();
}
%>
<td class="<%= racePointsStyleClasses %>"><%= racePoints %></td>
<% } } %>
<td><%= totalPoints %></td>
</tr>
<% } } %>
</tbody>
</table>
</body>
</html>
@@ -4,39 +4,6 @@
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<servlet id="jsp">
<servlet-name>jspServlet</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>logVerbosityLevel</param-name>
<param-value>DEBUG</param-value>
</init-param>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>keepgenerated</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jspServlet</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ESS40JspForwardServlet</servlet-name>
<servlet-class>com.sap.sailing.server.gateway.ess40.ESS40JspForwardServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ESS40JspForwardServlet</servlet-name>
<url-pattern>/html/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ESS40ResultsAsCSVServlet</servlet-name>
@@ -1,58 +0,0 @@
package com.sap.sailing.server.gateway.ess40;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.meta.LeaderboardGroupMetaLeaderboard;
import com.sap.sailing.server.RacingEventService;
import com.sap.sailing.server.gateway.SailingServerHttpServlet;
public class ESS40JspForwardServlet extends SailingServerHttpServlet {
private static final long serialVersionUID = -1017961881555515288L;
private static final String PARAM_NAME_LEADERBOARDNAME = "leaderboardName";
private static final String PARAM_NAME_SHOWDETAILS = "showDetails";
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
RacingEventService racingEventService = getService();
String pathInfo = request.getPathInfo();
String jspPath = "/WEB-INF/jsp";
String leaderboardNameParam = request.getParameter(PARAM_NAME_LEADERBOARDNAME);
String showDetailsParam = request.getParameter(PARAM_NAME_SHOWDETAILS);
Boolean showRaceDetails = showDetailsParam != null && showDetailsParam.equalsIgnoreCase("true");
if (leaderboardNameParam == null) {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "You need to specify a leaderboard name using the "+
PARAM_NAME_LEADERBOARDNAME+" parameter");
return;
}
Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardNameParam);
if(pathInfo.equals("/leaderboard") && racingEventService != null && leaderboard != null) {
String jspFile = null;
if(leaderboard instanceof LeaderboardGroupMetaLeaderboard) {
jspFile = "overallLeaderboard.jsp";
} else {
jspFile = "leaderboard.jsp";
}
request.setAttribute("showRaceDetails", showRaceDetails);
request.setAttribute("leaderboard", leaderboard);
request.setAttribute("racingEventService", racingEventService);
ServletContext sc = getServletContext();
RequestDispatcher requestDispatcher = sc.getRequestDispatcher(jspPath + "/" + jspFile);
requestDispatcher.forward(request, response);
} else {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Error during leaderboard export.");
}
}
}
@@ -5,8 +5,8 @@ Bundle-SymbolicName: com.sap.sailing.server.gateway.serialization.test
Bundle-Version: 1.0.0.qualifier
Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Require-Bundle: com.sap.sailing.server.gateway.serialization;bundle-version="1.0.0",
com.sap.sailing.domain;bundle-version="1.0.0",
Fragment-Host: com.sap.sailing.server.gateway.serialization
Require-Bundle: com.sap.sailing.domain;bundle-version="1.0.0",
com.sap.sailing.domain.common;bundle-version="1.0.0",
org.junit4;bundle-version="4.8.2",
com.sap.sailing.domain.shared.android,
@@ -14,5 +14,3 @@ Require-Bundle: com.sap.sailing.server.gateway.serialization;bundle-version="1.0
org.mockito.mockito-core;bundle-version="1.9.5",
org.hamcrest;bundle-version="1.1.0",
org.objenesis;bundle-version="1.3.0"
Import-Package: org.json.simple
Bundle-ClassPath: .
@@ -13,7 +13,7 @@ import com.sap.sailing.server.gateway.serialization.JsonSerializer;
public class SeriesJsonSerializer implements JsonSerializer<Series> {
public static final String FIELD_NAME = "name";
public static final String FIELD_FLEETS = "fleets";
public static final String FIELD_RACES = "races";
public static final String FIELD_RACES = "races"; // TODO: 'races' is wrong here... it's actually 'raceColumns'
public static final String FIELD_TRACKED_RACES = "trackedRaces";
public static final String FIELD_STARTS_WITH_ZERO_SCORE = "startsWithZeroScore";
public static final String FIELD_IS_MEDAL_SERIES = "isMedalSeries";
@@ -9,6 +9,6 @@ Fragment-Host: com.sap.sailing.server.gateway
Require-Bundle: org.mockito.mockito-core;bundle-version="1.9.5",
com.sap.sailing.domain.test,
org.hamcrest;bundle-version="1.1.0",
org.objenesis;bundle-version="1.3.0"
Import-Package: com.sap.sailing.server.impl,
org.junit;version="4.8.2"
org.objenesis;bundle-version="1.3.0",
org.junit4;bundle-version="4.8.2"
Import-Package: com.sap.sailing.server.impl
@@ -8,6 +8,7 @@ import static org.mockito.Mockito.when;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
@@ -26,7 +27,6 @@ import com.sap.sailing.domain.base.impl.NationalityImpl;
import com.sap.sailing.domain.base.impl.PersonImpl;
import com.sap.sailing.domain.base.impl.TeamImpl;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.impl.AbstractTimePoint;
import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
import com.sap.sailing.mongodb.MongoDBConfiguration;
import com.sap.sailing.mongodb.MongoDBService;
@@ -37,6 +37,8 @@ import com.sap.sailing.server.impl.RacingEventServiceImpl;
public abstract class AbstractJsonExportTest {
protected RacingEventService racingEventService;
protected MongoDBService service;
protected static SimpleDateFormat TIMEPOINT_FORMATTER = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
public void setUp() {
service = MongoDBService.INSTANCE;
@@ -75,7 +77,7 @@ public abstract class AbstractJsonExportTest {
protected TimePoint parseTimepointFromJsonString(String timePointAsJsonString) throws ParseException {
TimePoint result = null;
if(timePointAsJsonString != null && !timePointAsJsonString.isEmpty()) {
Date date = AbstractTimePoint.TIMEPOINT_FORMATTER.parse(timePointAsJsonString);
Date date = TIMEPOINT_FORMATTER.parse(timePointAsJsonString);
result = new MillisecondsTimePoint(date);
}
return result;
@@ -0,0 +1,83 @@
package com.sap.sailing.server.gateway.test.jaxrs;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import java.io.UnsupportedEncodingException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import javax.ws.rs.core.Response;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.impl.BoatClassImpl;
import com.sap.sailing.domain.base.impl.BoatImpl;
import com.sap.sailing.domain.base.impl.CompetitorImpl;
import com.sap.sailing.domain.base.impl.NationalityImpl;
import com.sap.sailing.domain.base.impl.PersonImpl;
import com.sap.sailing.domain.base.impl.TeamImpl;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
import com.sap.sailing.mongodb.MongoDBConfiguration;
import com.sap.sailing.mongodb.MongoDBService;
import com.sap.sailing.server.RacingEventService;
import com.sap.sailing.server.gateway.jaxrs.AbstractSailingServerResource;
import com.sap.sailing.server.impl.RacingEventServiceImpl;
public abstract class AbstractJaxRsApiTest {
protected RacingEventService racingEventService;
protected MongoDBService service;
protected static SimpleDateFormat TIMEPOINT_FORMATTER = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
public void setUp() {
service = MongoDBService.INSTANCE;
service.setConfiguration(MongoDBConfiguration.getDefaultTestConfiguration());
service.getDB().dropDatabase();
racingEventService = new RacingEventServiceImpl();
}
protected <T extends AbstractSailingServerResource> T spyResource(T resource) {
T spyResource = spy(resource);
doReturn(racingEventService).when(spyResource).getService();
return spyResource;
}
protected String decodeResponseFromByteArray(Response response) throws UnsupportedEncodingException {
byte[] entity = (byte[]) response.getEntity();
return new String(entity, "UTF-8");
}
protected TimePoint parseTimepointFromJsonString(String timePointAsJsonString) throws ParseException {
TimePoint result = null;
if(timePointAsJsonString != null && !timePointAsJsonString.isEmpty()) {
Date date = TIMEPOINT_FORMATTER.parse(timePointAsJsonString);
result = new MillisecondsTimePoint(date);
}
return result;
}
protected List<Competitor> createCompetitors(int numberOfCompetitorsToCreate) {
List<Competitor> result = new ArrayList<Competitor>();
BoatClass boatClass = new BoatClassImpl("505", /* typicallyStartsUpwind */ true);
for (int i = 1; i <= numberOfCompetitorsToCreate; i++) {
String competitorName = "C" + i;
Competitor competitor = new CompetitorImpl(123, competitorName, new TeamImpl("STG", Collections.singleton(
new PersonImpl(competitorName, new NationalityImpl("GER"),
/* dateOfBirth */ null, "This is famous "+competitorName)),
new PersonImpl("Rigo van Maas", new NationalityImpl("NED"),
/* dateOfBirth */null, "This is Rigo, the coach")), new BoatImpl(competitorName + "'s boat",
boatClass, null));
result.add(competitor);
}
return result;
}
}
@@ -0,0 +1,68 @@
package com.sap.sailing.server.gateway.test.jaxrs;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import javax.ws.rs.core.Response;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;
import org.junit.Before;
import org.junit.Test;
import com.sap.sailing.domain.base.DomainFactory;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.Series;
import com.sap.sailing.domain.base.impl.FleetImpl;
import com.sap.sailing.domain.base.impl.RegattaImpl;
import com.sap.sailing.domain.base.impl.SeriesImpl;
import com.sap.sailing.domain.common.ScoringSchemeType;
import com.sap.sailing.server.gateway.jaxrs.api.RegattasResource;
public class RegattasResourceTest extends AbstractJaxRsApiTest {
private String boatClassName = "49er";
private String regattaName = "TestRegatta";
@Before
public void setUp() {
super.setUp();
List<Series> series = new ArrayList<Series>();
List<Fleet> fleets = new ArrayList<Fleet>();
List<String> raceColumnNames = new ArrayList<String>();
fleets.add(new FleetImpl("Fleet1"));
fleets.add(new FleetImpl("Fleet2"));
Series testSeries = new SeriesImpl("TestSeries", /* isMedal */false, fleets,
raceColumnNames, /* trackedRegattaRegistry */null);
series.add(testSeries);
racingEventService.createRegatta(regattaName, boatClassName, UUID.randomUUID(), series, /*persistent*/ true,
DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null);
testSeries.addRaceColumn("R1", /* trackedRegattaRegistry */ null);
testSeries.addRaceColumn("R2", /* trackedRegattaRegistry */ null);
}
@Test
public void testGetRegattas() throws Exception {
RegattasResource resource = new RegattasResource();
RegattasResource spyResource = spyResource(resource);
Response regattasResponse = spyResource.getRegattas();
String jsonString = decodeResponseFromByteArray(regattasResponse);
Object obj= JSONValue.parse(jsonString);
JSONArray array= (JSONArray) obj;
assertTrue(array.size() == 1);
JSONObject firstElement = (JSONObject) array.get(0);
String jsonName = (String) firstElement.get("name");
String jsonBoatClass = (String) firstElement.get("boatclass");
assertTrue(RegattaImpl.getDefaultName(regattaName, boatClassName).equals(jsonName));
assertTrue(boatClassName.equals(jsonBoatClass));
}
}
@@ -7,7 +7,9 @@ Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Import-Package: com.sap.sailing.server,
com.sap.sailing.server.operationaltransformation,
org.apache.jasper.servlet,
javax.ws.rs;version="1.1.1",
javax.ws.rs.core;version="1.1.1",
javax.ws.rs.ext;version="1.1.1",
org.json.simple,
org.json.simple.parser,
org.osgi.framework;version="1.3.0",
@@ -25,17 +27,16 @@ Require-Bundle: com.sap.sailing.domain,
com.sap.sailing.udpconnector,
org.jdom;bundle-version="1.0.0",
com.sap.sailing.server.gateway.serialization;bundle-version="1.0.0",
javax.servlet.jsp.jstl;bundle-version="1.2.0",
javax.servlet.jsp;bundle-version="2.2.0",
javax.el;bundle-version="2.1.0",
rome;bundle-version="1.0.0",
com.sap.sailing.domain.shared.android;bundle-version="1.0.0",
com.sap.sailing.server.trackfiles;bundle-version="1.0.0",
org.eclipse.jetty.websocket.api;bundle-version="9.0.4",
org.eclipse.jetty.websocket.server;bundle-version="9.0.4",
org.eclipse.jetty.websocket.servlet;bundle-version="9.0.4",
org.eclipse.jetty.websocket.client;bundle-version="9.0.4",
org.eclipse.jetty.websocket.common;bundle-version="9.0.4"
org.eclipse.jetty.websocket.common;bundle-version="9.0.4",
javax.validation;bundle-version="1.0.0",
com.sun.jersey;bundle-version="1.17.0",
org.objectweb.asm;bundle-version="3.3.1"
Bundle-ClassPath: .
Web-ContextPath: /sailingserver
Export-Package: com.sap.sailing.server.gateway
@@ -177,15 +177,6 @@
<url-pattern>/expeditionWindStatus</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>LiveRaceRankingRssGetServlet</servlet-name>
<servlet-class>com.sap.sailing.server.gateway.impl.LiveRaceRankingRssGetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LiveRaceRankingRssGetServlet</servlet-name>
<url-pattern>/rss/liveRaceRanking</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>MasterDataByLeaderboardGroupJsonGetServlet</servlet-name>
<servlet-class>com.sap.sailing.server.gateway.impl.MasterDataByLeaderboardGroupJsonGetServlet</servlet-class>
@@ -203,26 +194,6 @@
<servlet-name>TrackFilesExportPostServlet</servlet-name>
<url-pattern>/trackfiles</url-pattern>
</servlet-mapping>
<servlet id="jsp">
<servlet-name>jspServet</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>logVerbosityLevel</param-name>
<param-value>DEBUG</param-value>
</init-param>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>keepgenerated</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet>
<servlet-name>websockettest</servlet-name>
@@ -234,10 +205,32 @@
<url-pattern>/websockettest</url-pattern>
</servlet-mapping>
<!--
<servlet-mapping>
<servlet-name>jspServet</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
-->
<servlet>
<servlet-name>Jersey REST API</servlet-name>
<servlet-class>com.sap.sailing.server.gateway.jaxrs.RestServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.sap.sailing.server.gateway.jaxrs.api.RestApiApplication</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST API</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Jersey REST SPI</servlet-name>
<servlet-class>com.sap.sailing.server.gateway.jaxrs.RestServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.sap.sailing.server.gateway.jaxrs.spi.RestSpiApplication</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST SPI</servlet-name>
<url-pattern>/spi/*</url-pattern>
</servlet-mapping>
</web-app>
Whitespace-only changes.
+1 -1
View File
@@ -26,7 +26,7 @@ body {
font-size: 14px;
font-family: OpenSansRegular, Arial, Verdana, sans-serif;
font-weight: normal;
margin: 0px;
margin: 10px;
padding: 0px;
line-height: 18px;
}
@@ -2,6 +2,7 @@ package com.sap.sailing.server.gateway.impl;
import java.io.IOException;
import java.io.StringWriter;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
@@ -59,6 +60,7 @@ public class LeaderboardJsonGetServlet extends AbstractJsonHttpServlet implement
// for backward compatibility the default result state is live
private final ResultStates DEFAULT_RESULT_STATE = ResultStates.Live;
private static SimpleDateFormat TIMEPOINT_FORMATTER = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
private static final int MAX_TOTAL_NUMBER_OF_CACHE_ENTRIES = 1000;
@@ -220,7 +222,7 @@ public class LeaderboardJsonGetServlet extends AbstractJsonHttpServlet implement
setJsonResponseHeader(resp);
synchronized (jsonLeaderboardAsString) {
int indexOfFirstOpeningBrace = jsonLeaderboardAsString.indexOf("{");
final String requestTimePointAsJson = "\"requestTimepoint\": \""+requestTimePoint.toString()+"\", ";
final String requestTimePointAsJson = "\"requestTimepoint\": \"" + formatTimePoint(requestTimePoint) + "\", ";
if (indexOfFirstOpeningBrace >= 0) {
jsonLeaderboardAsString.insert(indexOfFirstOpeningBrace+1, requestTimePointAsJson);
}
@@ -319,6 +321,10 @@ public class LeaderboardJsonGetServlet extends AbstractJsonHttpServlet implement
return jsonLeaderboard;
}
private String formatTimePoint(TimePoint timepoint) {
return timepoint == null ? null : TIMEPOINT_FORMATTER.format(timepoint.asDate());
}
private JSONObject createEmptyLeaderboardJson(Leaderboard leaderboard,
ResultStates resultState, TimePoint requestTimePoint, Integer maxCompetitorsCount) throws NoWindException {
JSONObject jsonLeaderboard = new JSONObject();
@@ -365,9 +371,9 @@ public class LeaderboardJsonGetServlet extends AbstractJsonHttpServlet implement
jsonLeaderboard.put("name", leaderboard.getName());
// for backward compatibility
jsonLeaderboard.put("timepoint", resultTimePoint != null ? resultTimePoint.toString() : null);
jsonLeaderboard.put("timepoint", formatTimePoint(resultTimePoint));
jsonLeaderboard.put("resultTimepoint", resultTimePoint != null ? resultTimePoint.toString() : null);
jsonLeaderboard.put("resultTimepoint", formatTimePoint(resultTimePoint));
jsonLeaderboard.put("resultState", resultState.name());
jsonLeaderboard.put("maxCompetitorsCount", maxCompetitorsCount);
@@ -375,7 +381,7 @@ public class LeaderboardJsonGetServlet extends AbstractJsonHttpServlet implement
if (scoreCorrection != null) {
jsonLeaderboard.put("scoringComment", scoreCorrection.getComment());
TimePoint lastUpdateTimepoint = scoreCorrection.getTimePointOfLastCorrectionsValidity();
jsonLeaderboard.put("lastScoringUpdate", lastUpdateTimepoint != null ? lastUpdateTimepoint.asDate().toString(): null);
jsonLeaderboard.put("lastScoringUpdate", formatTimePoint(lastUpdateTimepoint));
} else {
jsonLeaderboard.put("scoringComment", null);
jsonLeaderboard.put("lastScoringUpdate", null);
@@ -1,158 +0,0 @@
package com.sap.sailing.server.gateway.impl;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.server.gateway.SailingServerHttpServlet;
import com.sun.syndication.feed.synd.SyndContent;
import com.sun.syndication.feed.synd.SyndContentImpl;
import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndEntryImpl;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.feed.synd.SyndFeedImpl;
import com.sun.syndication.io.SyndFeedOutput;
public class LiveRaceRankingRssGetServlet extends SailingServerHttpServlet {
private static final long serialVersionUID = -508373964426868319L;
private static final String PARAM_NAME_LEADERBOARDNAME = "leaderboardName";
private static final String PARAM_MAX_COMPETITORS = "max";
private String charEncoding = "UTF-8";
private int maxCompetitorsToShow = 1000;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// to allow access to the rss feed directly from a client side javascript
resp.setHeader("Access-Control-Allow-Origin", "*");
resp.setContentType("application/rss+xml");
resp.setCharacterEncoding(charEncoding);
TimePoint timePoint = MillisecondsTimePoint.now();
String leaderboardName = req.getParameter(PARAM_NAME_LEADERBOARDNAME);
String maxCompetitorsParam = req.getParameter(PARAM_MAX_COMPETITORS);
if(maxCompetitorsParam != null) {
try {
maxCompetitorsToShow = Integer.parseInt(maxCompetitorsParam);
} catch (NumberFormatException e) {
}
}
if (leaderboardName == null) {
resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Need to specify a leaderboard name using the "+
PARAM_NAME_LEADERBOARDNAME+" parameter");
} else {
Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName);
if (leaderboard == null) {
resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Leaderboard "+leaderboardName+" not found");
} else {
try {
RaceColumn raceColumnToShow = null;
TrackedRace liveTrackedRace = null;
// find a live race in the leaderboard
Iterable<RaceColumn> races = leaderboard.getRaceColumns();
for (RaceColumn raceInLeaderboard : races) {
for (Fleet fleet : raceInLeaderboard.getFleets()) {
TrackedRace trackedRaceOfFleet = raceInLeaderboard.getTrackedRace(fleet);
if(trackedRaceOfFleet != null && isLive(trackedRaceOfFleet)) {
raceColumnToShow = raceInLeaderboard;
liveTrackedRace = trackedRaceOfFleet;
break;
}
}
}
SyndFeed feed = new SyndFeedImpl();
String title = leaderboard.getName();
feed.setTitle(title);
feed.setFeedType("rss_2.0");
feed.setLink("http://www.sapsaling.com");
feed.setDescription("SAP Sailing Analytics");
feed.setPublishedDate(new Date());
feed.setEncoding(charEncoding);
List<SyndEntry> entries = new ArrayList<SyndEntry>();
SyndContent description = new SyndContentImpl();
SyndEntry entry = new SyndEntryImpl();
entry.setLink("http://www.sapsailing.com");
description.setType("text/plain");
if(raceColumnToShow != null && liveTrackedRace != null) {
String entryTitle = "Live ranking of race '" + raceColumnToShow.getName() + "'";
entry.setTitle(entryTitle);
List<Competitor> competitorsFromBestToWorst = leaderboard.getCompetitorsFromBestToWorst(raceColumnToShow, timePoint);
int currentCompetitorCounter = 0;
String feedText = "";
for (Competitor competitor : competitorsFromBestToWorst) {
if(currentCompetitorCounter == maxCompetitorsToShow) {
break;
}
currentCompetitorCounter++;
String sailID = competitor.getBoat().getSailID();
feedText += currentCompetitorCounter + ". " + sailID + "\n";
// String competitorName = competitor.getName();
// final String displayName = leaderboard.getDisplayName(competitor);
// String id = competitor.getId().toString();
// Nationality nationality = competitor.getTeam().getNationality();
// String nat = nationality != null ? nationality.getThreeLetterIOCAcronym(): null;
// String countryCode = nationality != null ? nationality.getCountryCode().getTwoLetterISOCode(): null;
// String totalRank = "" +competitorsFromBestToWorst.indexOf(competitor) + 1;
// String totalPoints = "" + leaderboard.getTotalPoints(competitor, timePoint);
// String raceColumnName = raceColumnToShow.getName();
// final Fleet fleetOfCompetitor = raceColumnToShow.getFleetOfCompetitor(competitor);
// String fleet = fleetOfCompetitor==null?"":fleetOfCompetitor.getName();
// String netpoints = String.valueOf(leaderboard.getNetPoints(competitor, raceColumnToShow, timePoint));
// String totalPointsRaceColumn = String.valueOf(leaderboard.getTotalPoints(competitor, raceColumnToShow, timePoint));
// MaxPointsReason maxPointsReason = leaderboard.getMaxPointsReason(competitor, raceColumnToShow, timePoint);
// String maxPoints = maxPointsReason != null ? maxPointsReason.toString(): null;
// String isDiscarded = String.valueOf(leaderboard.isDiscarded(competitor, raceColumnToShow, timePoint));
// String isCorrected = String.valueOf(leaderboard.getScoreCorrection().isScoreCorrected(competitor, raceColumnToShow));
}
description.setValue(feedText);
} else {
String entryTitle = "No live race right now";
entry.setTitle(entryTitle);
description.setValue("");
}
entry.setDescription(description);
entries.add(entry);
feed.setEntries(entries);
PrintWriter writer = resp.getWriter();
SyndFeedOutput feedOutput = new SyndFeedOutput();
feedOutput.output(feed, writer);
} catch (Exception e) {
resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
}
}
}
}
/**
* @return <code>true</code> if the startOfTracking is after the current date and there's no end of the race
*/
private boolean isLive(TrackedRace trackedRace) {
return trackedRace.getEndOfRace() == null && (trackedRace.getStartOfTracking() != null ? new Date().after(trackedRace.getStartOfTracking().asDate()) : false);
}
}
@@ -0,0 +1,66 @@
package com.sap.sailing.server.gateway.jaxrs;
import javax.servlet.ServletContext;
import javax.ws.rs.core.Context;
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.common.TimePoint;
import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
import com.sap.sailing.domain.tracking.DynamicTrackedRegatta;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.server.RacingEventService;
import com.sap.sailing.util.DateParser;
import com.sap.sailing.util.InvalidDateException;
public abstract class AbstractSailingServerResource {
@Context ServletContext servletContext;
public RacingEventService getService() {
@SuppressWarnings("unchecked")
ServiceTracker<RacingEventService, RacingEventService> tracker = (ServiceTracker<RacingEventService, RacingEventService>) servletContext.getAttribute(RestServletContainer.RACING_EVENT_SERVICE_TRACKER_NAME);
return tracker.getService();
}
protected Regatta findRegattaByName(String regattaName) {
return getService().getRegattaByName(regattaName);
}
protected RaceDefinition findRaceByName(Regatta regatta, String raceName) {
RaceDefinition result = null;
if(regatta != null) {
for (RaceDefinition race : regatta.getAllRaces()) {
if (race.getName().equals(raceName)) {
result = race;
break;
}
}
}
return result;
}
protected TimePoint parseTimePoint(String isoTime, Long timeAsMillis, TimePoint defaultTime) throws InvalidDateException {
TimePoint timePoint;
if (isoTime != null && isoTime.length() > 0) {
timePoint = new MillisecondsTimePoint(DateParser.parse(isoTime).getTime());
} else {
timePoint = timeAsMillis != null ? new MillisecondsTimePoint(timeAsMillis) : defaultTime;
}
return timePoint;
}
protected TrackedRace findTrackedRace(String regattaName, String raceName) {
Regatta regatta = findRegattaByName(regattaName);
RaceDefinition race = findRaceByName(regatta, raceName);
TrackedRace trackedRace = null;
if (regatta != null && race != null) {
DynamicTrackedRegatta trackedRegatta = getService().getTrackedRegatta(regatta);
if(trackedRegatta != null) {
trackedRace = trackedRegatta.getTrackedRace(race);
}
}
return trackedRace;
}
}
@@ -0,0 +1,57 @@
package com.sap.sailing.server.gateway.jaxrs;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.ws.rs.core.Application;
import org.osgi.framework.BundleContext;
import org.osgi.util.tracker.ServiceTracker;
import com.sap.sailing.server.RacingEventService;
import com.sun.jersey.spi.container.servlet.ServletContainer;
public class RestServletContainer extends ServletContainer {
private static final long serialVersionUID = -3132655822281021061L;
private static final String OSGI_RFC66_WEBBUNDLE_BUNDLECONTEXT_NAME = "osgi-bundlecontext";
public static final String RACING_EVENT_SERVICE_TRACKER_NAME = "racingEventServiceTracker";
private ServiceTracker<RacingEventService, RacingEventService> racingEventServiceTracker;
public RestServletContainer() {
super();
}
public RestServletContainer(Application app) {
super(app);
}
public RestServletContainer(Class<? extends Application> appClass) {
super(appClass);
}
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
BundleContext context = (BundleContext) config.getServletContext().getAttribute(OSGI_RFC66_WEBBUNDLE_BUNDLECONTEXT_NAME);
racingEventServiceTracker = new ServiceTracker<RacingEventService, RacingEventService>(context, RacingEventService.class.getName(), null);
racingEventServiceTracker.open();
config.getServletContext().setAttribute(RACING_EVENT_SERVICE_TRACKER_NAME, racingEventServiceTracker);
}
@Override
public void destroy() {
super.destroy();
if(racingEventServiceTracker != null) {
racingEventServiceTracker.close();
}
}
public RacingEventService getService() {
return racingEventServiceTracker.getService();
}
}
@@ -0,0 +1,79 @@
package com.sap.sailing.server.gateway.jaxrs.api;
import java.util.ArrayList;
import java.util.Iterator;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.WindSource;
import com.sap.sailing.domain.tracking.Wind;
import com.sap.sailing.domain.tracking.WindTrack;
public class DefaultWindTrackJsonSerializer implements WindTrackJsonSerializer {
public static final String FIELD_ID = "id";
public static final String FIELD_NAME = "name";
public static final String FIELD_PUBLICATION_URL = "publicationUrl";
public static final String FIELD_VENUE = "venue";
private TimePoint fromTime;
private TimePoint toTime;
private WindSource windSource;
public JSONObject serialize(WindTrack windTrack) {
JSONObject result = new JSONObject();
JSONArray jsonWindFixes = new JSONArray();
// quickly extract relevant fixes to hold locks as shortly as possible; process later
ArrayList<Wind> fixes = new ArrayList<>();
windTrack.lockForRead();
try {
Iterator<Wind> windIter = windTrack.getFixesIterator(fromTime, /* inclusive */true);
while (windIter.hasNext()) {
Wind wind = windIter.next();
if (wind.getTimePoint().compareTo(toTime) > 0) {
break;
} else {
fixes.add(wind);
}
}
} finally {
windTrack.unlockAfterRead();
}
for (Wind wind : fixes) {
JSONObject jsonWind = new JSONObject();
jsonWind.put("trueBearing-deg", UnitSerializationUtil.bearingDecimalFormatter.format(wind.getBearing().getDegrees()));
jsonWind.put("speed-kts", UnitSerializationUtil.speedDecimalFormatter.format(wind.getKnots()));
jsonWind.put("speed-m/s", UnitSerializationUtil.speedDecimalFormatter.format(wind.getMetersPerSecond()));
if (wind.getTimePoint() != null) {
jsonWind.put("timepoint-ms", wind.getTimePoint().asMillis());
final Wind averagedWind = windTrack.getAveragedWind(wind.getPosition(), wind.getTimePoint());
jsonWind.put("dampenedTrueBearing-deg", UnitSerializationUtil.bearingDecimalFormatter.format(averagedWind.getBearing().getDegrees()));
jsonWind.put("dampenedSpeed-kts", UnitSerializationUtil.speedDecimalFormatter.format(averagedWind.getKnots()));
jsonWind.put("dampenedSpeed-m/s", UnitSerializationUtil.speedDecimalFormatter.format(averagedWind.getMetersPerSecond()));
}
if (wind.getPosition() != null) {
jsonWind.put("lat-deg", UnitSerializationUtil.latLngDecimalFormatter.format(wind.getPosition().getLatDeg()));
jsonWind.put("lng-deg", UnitSerializationUtil.latLngDecimalFormatter.format(wind.getPosition().getLngDeg()));
}
jsonWindFixes.add(jsonWind);
}
result.put(windSource.name(), jsonWindFixes);
return result;
}
public void setFromTime(TimePoint fromTime) {
this.fromTime = fromTime;
}
public void setToTime(TimePoint toTime) {
this.toTime = toTime;
}
public void setWindSource(WindSource windSource) {
this.windSource = windSource;
}
}
@@ -0,0 +1,47 @@
package com.sap.sailing.server.gateway.jaxrs.api;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
import org.json.simple.JSONArray;
import com.sap.sailing.domain.base.EventBase;
import com.sap.sailing.server.gateway.jaxrs.AbstractSailingServerResource;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.CourseAreaJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.EventJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.VenueJsonSerializer;
@Path("/v1/events")
public class EventsResource extends AbstractSailingServerResource {
@GET
@Produces("application/json;charset=UTF-8")
public Response getEvents() {
JsonSerializer<EventBase> eventSerializer = new EventJsonSerializer(new VenueJsonSerializer(new CourseAreaJsonSerializer()));
JSONArray result = new JSONArray();
for (EventBase event : getService().getAllEvents()) {
result.add(eventSerializer.serialize(event));
}
byte[] json = result.toJSONString().getBytes();
return Response.ok(json).build();
}
@GET
@Produces("application/json;charset=UTF-8")
@Path("{eventId}")
public Response getEvent(@PathParam("eventId") String eventId) {
return Response.noContent().build();
}
@GET
@Produces("application/json;charset=UTF-8")
@Path("{eventId}/racestates")
public Response getRaceStates(@PathParam("eventId") String eventId) {
return Response.noContent().build();
}
}
@@ -0,0 +1,138 @@
package com.sap.sailing.server.gateway.jaxrs.api;
import java.util.Map;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.common.LeaderboardNameConstants;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
import com.sap.sailing.domain.leaderboard.MetaLeaderboard;
import com.sap.sailing.domain.leaderboard.RegattaLeaderboard;
import com.sap.sailing.domain.leaderboard.SettableScoreCorrection;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.server.gateway.jaxrs.AbstractSailingServerResource;
@Path("/v1/leaderboardgroups")
public class LeaderboardGroupsResource extends AbstractSailingServerResource {
@GET
@Produces("application/json;charset=UTF-8")
public Response getLeaderboardGroups() {
JSONArray jsonLeaderboardGroups = new JSONArray();
Map<String, LeaderboardGroup> leaderboardGroups = getService().getLeaderboardGroups();
for (String leaderboardGroupName : leaderboardGroups.keySet()) {
jsonLeaderboardGroups.add(leaderboardGroupName);
}
byte[] json = jsonLeaderboardGroups.toJSONString().getBytes();
return Response.ok(json).build();
}
@GET
@Produces("application/json;charset=UTF-8")
@Path("{name}")
public Response getLeaderboardGroup(@PathParam("name") String leaderboardGroupName) {
Response response;
LeaderboardGroup leaderboardGroup = getService().getLeaderboardGroupByName(leaderboardGroupName);
if (leaderboardGroup == null) {
response = Response.status(Status.NOT_FOUND).entity("Could not find a leaderboard group with name '"+leaderboardGroupName+"'.").type(MediaType.TEXT_PLAIN).build();
} else {
TimePoint timePoint = MillisecondsTimePoint.now();
JSONObject jsonLeaderboardGroup = new JSONObject();
jsonLeaderboardGroup.put("name", leaderboardGroup.getName());
jsonLeaderboardGroup.put("description", leaderboardGroup.getDescription());
jsonLeaderboardGroup.put("timepoint", timePoint.toString());
JSONArray jsonLeaderboardEntries = new JSONArray();
jsonLeaderboardGroup.put("leaderboards", jsonLeaderboardEntries);
for (Leaderboard leaderboard: leaderboardGroup.getLeaderboards()) {
boolean isMetaLeaderboard = leaderboard instanceof MetaLeaderboard ? true : false;
boolean isRegattaLeaderboard = leaderboard instanceof RegattaLeaderboard ? true : false;
JSONObject jsonLeaderboard = new JSONObject();
jsonLeaderboard.put("name", leaderboard.getName());
jsonLeaderboard.put("displayName", leaderboard.getDisplayName());
jsonLeaderboard.put("isMetaLeaderboard", isMetaLeaderboard);
jsonLeaderboard.put("isRegattaLeaderboard", isRegattaLeaderboard);
jsonLeaderboardEntries.add(jsonLeaderboard);
SettableScoreCorrection scoreCorrection = leaderboard.getScoreCorrection();
if (scoreCorrection != null) {
jsonLeaderboard.put("scoringComment", scoreCorrection.getComment());
TimePoint lastUpdateTimepoint = scoreCorrection.getTimePointOfLastCorrectionsValidity();
jsonLeaderboard.put("lastScoringUpdate", lastUpdateTimepoint != null ? lastUpdateTimepoint.asDate().toString(): null);
} else {
jsonLeaderboard.put("scoringComment", null);
jsonLeaderboard.put("lastScoringUpdate", null);
}
if (isRegattaLeaderboard) {
RegattaLeaderboard regattaLeaderboard = (RegattaLeaderboard) leaderboard;
Regatta regatta = regattaLeaderboard.getRegatta();
jsonLeaderboard.put("scoringScheme", leaderboard.getScoringScheme().getType());
jsonLeaderboard.put("regattaName", regatta.getName());
} else {
jsonLeaderboard.put("scoringScheme", leaderboard.getScoringScheme().getType());
jsonLeaderboard.put("regattaName", null);
JSONArray jsonSeriesEntries = new JSONArray();
jsonLeaderboard.put("series", jsonSeriesEntries);
// write a 'default' series to be conform with our common regatta structure
JSONObject jsonSeries = new JSONObject();
jsonSeriesEntries.add(jsonSeries);
jsonSeries.put("name", LeaderboardNameConstants.DEFAULT_SERIES_NAME);
jsonSeries.put("isMedalSeries", null);
JSONArray jsonFleetsEntries = new JSONArray();
jsonSeries.put("fleets", jsonFleetsEntries);
Fleet fleet = leaderboard.getFleet(LeaderboardNameConstants.DEFAULT_FLEET_NAME);
if (fleet != null) {
JSONObject jsonFleet = new JSONObject();
jsonFleet.put("name", fleet.getName());
jsonFleet.put("color", fleet.getColor() != null ? fleet.getColor().getAsHtml() : null);
jsonFleet.put("ordering", fleet.getOrdering());
jsonFleetsEntries.add(jsonFleet);
JSONArray jsonRacesEntries = new JSONArray();
jsonFleet.put("races", jsonRacesEntries);
for (RaceColumn raceColumn: leaderboard.getRaceColumns()) {
JSONObject jsonRaceColumn = new JSONObject();
jsonRaceColumn.put("name", raceColumn.getName());
jsonRaceColumn.put("isMedalRace" , raceColumn.isMedalRace());
TrackedRace trackedRace = raceColumn.getTrackedRace(fleet);
if (trackedRace != null) {
jsonRaceColumn.put("isTracked", true);
jsonRaceColumn.put("regattaName", trackedRace.getTrackedRegatta().getRegatta().getName());
jsonRaceColumn.put("trackedRaceName", trackedRace.getRace().getName());
jsonRaceColumn.put("hasGpsData", trackedRace.hasGPSData());
jsonRaceColumn.put("hasWindData", trackedRace.hasWindData());
} else {
jsonRaceColumn.put("isTracked", false);
jsonRaceColumn.put("trackedRaceName", null);
jsonRaceColumn.put("hasGpsData", false);
jsonRaceColumn.put("hasWindData", false);
}
jsonRacesEntries.add(jsonRaceColumn);
}
}
}
}
byte[] json = jsonLeaderboardGroup.toJSONString().getBytes();
response = Response.ok(json).build();
}
return response;
}
}
@@ -0,0 +1,299 @@
package com.sap.sailing.server.gateway.jaxrs.api;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.Nationality;
import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.common.LeaderboardNameConstants;
import com.sap.sailing.domain.common.MaxPointsReason;
import com.sap.sailing.domain.common.NoWindException;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.dto.FleetDTO;
import com.sap.sailing.domain.common.dto.LeaderboardDTO;
import com.sap.sailing.domain.common.dto.LeaderboardEntryDTO;
import com.sap.sailing.domain.common.dto.LeaderboardRowDTO;
import com.sap.sailing.domain.common.dto.RaceColumnDTO;
import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
import com.sap.sailing.domain.common.impl.Util.Triple;
import com.sap.sailing.domain.leaderboard.Leaderboard;
import com.sap.sailing.domain.leaderboard.SettableScoreCorrection;
import com.sap.sailing.domain.tracking.MarkPassing;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.server.gateway.jaxrs.AbstractSailingServerResource;
@Path("/v1/leaderboards")
public class LeaderboardsResource extends AbstractSailingServerResource {
public enum ResultStates { Live, Preliminary, Final };
@GET
@Produces("application/json;charset=UTF-8")
public Response getLeaderboards() {
JSONArray jsonLeaderboards = new JSONArray();
Map<String, Leaderboard> leaderboards = getService().getLeaderboards();
for (String leaderboardName : leaderboards.keySet()) {
if(!leaderboardName.equals(LeaderboardNameConstants.DEFAULT_LEADERBOARD_NAME))
jsonLeaderboards.add(leaderboardName);
}
byte[] json = jsonLeaderboards.toJSONString().getBytes();
return Response.ok(json).build();
}
@GET
@Produces("application/json;charset=UTF-8")
@Path("{name}")
public Response getLeaderboard(@PathParam("name") String leaderboardName,
@DefaultValue("Live") @QueryParam("resultState") ResultStates resultState,
@DefaultValue("true") @QueryParam("useCache") boolean useCache,
@DefaultValue("1000") @QueryParam("maxCompetitorsCount") int maxCompetitorsCount) {
Response response;
TimePoint requestTimePoint = MillisecondsTimePoint.now();
Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName);
if (leaderboard == null) {
response = Response.status(Status.NOT_FOUND).entity("Could not find a leaderboard with name '" + leaderboardName + "'.").type(MediaType.TEXT_PLAIN).build();
} else {
try {
TimePoint resultTimePoint = calculateTimePointForResultState(leaderboard, resultState);
JSONObject jsonLeaderboard;
if (resultTimePoint != null) {
Triple<TimePoint, ResultStates, Integer> resultStateAndTimePoint = new Triple<>(resultTimePoint, resultState, maxCompetitorsCount);
jsonLeaderboard = getLeaderboardJson(leaderboard, resultStateAndTimePoint);
} else {
jsonLeaderboard = createEmptyLeaderboardJson(leaderboard, resultState, requestTimePoint, maxCompetitorsCount);
}
StringWriter sw = new StringWriter();
jsonLeaderboard.writeJSONString(sw);
byte[] json = sw.getBuffer().toString().getBytes();
response = Response.ok(json).build();
} catch (NoWindException | InterruptedException | ExecutionException | IOException e) {
response = Response.status(Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).type(MediaType.TEXT_PLAIN).build();
}
}
return response;
}
private JSONObject getLeaderboardJson(Leaderboard leaderboard, Triple<TimePoint, ResultStates, Integer> timePointAndResultStateAndMaxCompetitorsCount)
throws NoWindException, InterruptedException, ExecutionException {
LeaderboardDTO leaderboardDTO = leaderboard.getLeaderboardDTO(timePointAndResultStateAndMaxCompetitorsCount.getA(),
Collections.<String> emptyList(), getService(), getService().getBaseDomainFactory());
TimePoint resultTimePoint = timePointAndResultStateAndMaxCompetitorsCount.getA();
ResultStates resultState = timePointAndResultStateAndMaxCompetitorsCount.getB();
Integer maxCompetitorsCount = timePointAndResultStateAndMaxCompetitorsCount.getC();
JSONObject jsonLeaderboard = new JSONObject();
writeCommonLeaderboardData(jsonLeaderboard, leaderboardDTO, resultState, resultTimePoint, maxCompetitorsCount);
JSONArray jsonCompetitorEntries = new JSONArray();
jsonLeaderboard.put("competitors", jsonCompetitorEntries);
int counter = 1;
for (CompetitorDTO competitor : leaderboardDTO.competitors) {
LeaderboardRowDTO leaderboardRowDTO = leaderboardDTO.rows.get(competitor);
if(maxCompetitorsCount != null && counter > maxCompetitorsCount) {
break;
}
JSONObject jsonCompetitor = new JSONObject();
jsonCompetitor.put("name", competitor.getName());
final String displayName = leaderboardDTO.getDisplayName(competitor);
jsonCompetitor.put("displayName", displayName==null?competitor.getName():displayName);
jsonCompetitor.put("id", competitor.getIdAsString());
jsonCompetitor.put("sailID", competitor.getSailID());
jsonCompetitor.put("nationality", competitor.getThreeLetterIocCountryCode());
jsonCompetitor.put("countryCode", competitor.getTwoLetterIsoCountryCode());
jsonCompetitor.put("rank", counter);
jsonCompetitor.put("carriedPoints", leaderboardRowDTO.carriedPoints);
jsonCompetitor.put("totalPoints", leaderboardRowDTO.totalPoints);
jsonCompetitorEntries.add(jsonCompetitor);
JSONObject jsonRaceColumns = new JSONObject();
jsonCompetitor.put("raceScores", jsonRaceColumns);
for (RaceColumnDTO raceColumn : leaderboardDTO.getRaceList()) {
List<CompetitorDTO> rankedCompetitorsForColumn = leaderboardDTO.getCompetitorOrderingPerRaceColumnName().get(raceColumn.getName());
JSONObject jsonEntry = new JSONObject();
jsonRaceColumns.put(raceColumn.getName(), jsonEntry);
LeaderboardEntryDTO leaderboardEntry = leaderboardRowDTO.fieldsByRaceColumnName.get(raceColumn.getName());
final FleetDTO fleetOfCompetitor = leaderboardEntry.fleet;
jsonEntry.put("fleet", fleetOfCompetitor==null?"":fleetOfCompetitor.getName());
jsonEntry.put("netPoints", leaderboardEntry.netPointsCorrected);
jsonEntry.put("uncorrectedNetPoints", leaderboardEntry.netPoints);
jsonEntry.put("totalPoints", leaderboardEntry.totalPoints);
MaxPointsReason maxPointsReason = leaderboardEntry.reasonForMaxPoints;
jsonEntry.put("maxPointsReason", maxPointsReason != null ? maxPointsReason.toString(): null);
jsonEntry.put("rank", rankedCompetitorsForColumn.indexOf(competitor)+1);
// final TrackedRace trackedRace = raceColumn.getTrackedRace(competitor);
// if (trackedRace != null) {
// jsonEntry.put("raceRank", trackedRace.getRank(competitor, resultTimePoint));
// }
jsonEntry.put("isDiscarded", leaderboardEntry.discarded);
jsonEntry.put("isCorrected", leaderboardEntry.hasScoreCorrection());
}
counter++;
}
return jsonLeaderboard;
}
private JSONObject createEmptyLeaderboardJson(Leaderboard leaderboard,
ResultStates resultState, TimePoint requestTimePoint, Integer maxCompetitorsCount) throws NoWindException {
JSONObject jsonLeaderboard = new JSONObject();
writeCommonLeaderboardData(jsonLeaderboard, leaderboard, resultState, null, maxCompetitorsCount);
JSONArray jsonCompetitorEntries = new JSONArray();
jsonLeaderboard.put("competitors", jsonCompetitorEntries);
for (Competitor competitor : leaderboard.getCompetitors()) {
JSONObject jsonCompetitor = new JSONObject();
jsonCompetitor.put("name", competitor.getName());
final String displayName = leaderboard.getDisplayName(competitor);
jsonCompetitor.put("displayName", displayName==null?competitor.getName():displayName);
jsonCompetitor.put("id", competitor.getId().toString());
jsonCompetitor.put("sailID", competitor.getBoat().getSailID());
Nationality nationality = competitor.getTeam().getNationality();
jsonCompetitor.put("nationality", nationality != null ? nationality.getThreeLetterIOCAcronym(): null);
jsonCompetitor.put("countryCode", nationality != null ? (nationality.getCountryCode() != null ? nationality.getCountryCode().getTwoLetterISOCode(): null) : null);
jsonCompetitor.put("rank", 0);
jsonCompetitor.put("carriedPoints", null);
jsonCompetitor.put("totalPoints", null);
jsonCompetitorEntries.add(jsonCompetitor);
JSONObject jsonRaceColumns = new JSONObject();
jsonCompetitor.put("raceScores", jsonRaceColumns);
for (RaceColumn raceColumn : leaderboard.getRaceColumns()) {
JSONObject jsonEntry = new JSONObject();
jsonRaceColumns.put(raceColumn.getName(), jsonEntry);
final Fleet fleetOfCompetitor = raceColumn.getFleetOfCompetitor(competitor);
jsonEntry.put("fleet", fleetOfCompetitor==null?"":fleetOfCompetitor.getName());
jsonEntry.put("netPoints", null);
jsonEntry.put("totalPoints", null);
jsonEntry.put("maxPointsReason", "");
jsonEntry.put("rank", 0);
jsonEntry.put("isDiscarded", false);
jsonEntry.put("isCorrected", false);
}
}
return jsonLeaderboard;
}
private void writeCommonLeaderboardData(JSONObject jsonLeaderboard, LeaderboardDTO leaderboard, ResultStates resultState,
TimePoint resultTimePoint, Integer maxCompetitorsCount) {
jsonLeaderboard.put("name", leaderboard.name);
jsonLeaderboard.put("resultTimepoint", resultTimePoint != null ? resultTimePoint.asMillis() : null);
jsonLeaderboard.put("resultState", resultState.name());
jsonLeaderboard.put("maxCompetitorsCount", maxCompetitorsCount);
jsonLeaderboard.put("scoringComment", leaderboard.getComment());
Date lastUpdateTimepoint = leaderboard.getTimePointOfLastCorrectionsValidity();
jsonLeaderboard.put("lastScoringUpdate", lastUpdateTimepoint != null ? lastUpdateTimepoint.getTime(): null);
JSONArray jsonColumnNames = new JSONArray();
jsonLeaderboard.put("columnNames", jsonColumnNames);
for (RaceColumnDTO raceColumn : leaderboard.getRaceList()) {
jsonColumnNames.add(raceColumn.getName());
}
}
private void writeCommonLeaderboardData(JSONObject jsonLeaderboard, Leaderboard leaderboard, ResultStates resultState,
TimePoint resultTimePoint, Integer maxCompetitorsCount) {
jsonLeaderboard.put("name", leaderboard.getName());
jsonLeaderboard.put("resultTimepoint", resultTimePoint != null ? resultTimePoint.asMillis() : null);
jsonLeaderboard.put("resultState", resultState.name());
jsonLeaderboard.put("maxCompetitorsCount", maxCompetitorsCount);
SettableScoreCorrection scoreCorrection = leaderboard.getScoreCorrection();
if (scoreCorrection != null) {
jsonLeaderboard.put("scoringComment", scoreCorrection.getComment());
TimePoint lastUpdateTimepoint = scoreCorrection.getTimePointOfLastCorrectionsValidity();
jsonLeaderboard.put("lastScoringUpdate", lastUpdateTimepoint != null ? lastUpdateTimepoint.asMillis(): null);
} else {
jsonLeaderboard.put("scoringComment", null);
jsonLeaderboard.put("lastScoringUpdate", null);
}
JSONArray jsonColumnNames = new JSONArray();
jsonLeaderboard.put("columnNames", jsonColumnNames);
for (RaceColumn raceColumn : leaderboard.getRaceColumns()) {
jsonColumnNames.add(raceColumn.getName());
}
}
private TimePoint calculateTimePointForResultState(Leaderboard leaderboard, ResultStates resultState) {
TimePoint result = null;
switch (resultState) {
case Live:
result = leaderboard.getTimePointOfLatestModification();
if (result == null) {
result = MillisecondsTimePoint.now();
}
break;
case Preliminary:
case Final:
if (leaderboard.getScoreCorrection() != null && leaderboard.getScoreCorrection().getTimePointOfLastCorrectionsValidity() != null) {
result = leaderboard.getScoreCorrection().getTimePointOfLastCorrectionsValidity();
// As we don't have implemented bug 1246 (Define a clear result state for races and leaderboards) so far
// we need to make sure that the timpoint for the final state is not determined in the middle of a running race,
// because this would deliver not only final results but also some "mixed-in" live results.
// Therefore, if there is a race that hasn't finished yet and whose first start mark passing is before
// the current result, move result to before the start mark passing.
for (TrackedRace trackedRace : leaderboard.getTrackedRaces()) {
TimePoint endOfRace = trackedRace.getEndOfRace();
if (endOfRace == null) {
Waypoint firstWaypoint = trackedRace.getRace().getCourse().getFirstWaypoint();
if (firstWaypoint != null) {
Iterable<MarkPassing> markPassingsForFirstWaypoint = trackedRace.getMarkPassingsInOrder(firstWaypoint);
if (markPassingsForFirstWaypoint != null) {
trackedRace.lockForRead(markPassingsForFirstWaypoint);
try {
Iterator<MarkPassing> i = markPassingsForFirstWaypoint.iterator();
if (i.hasNext()) {
TimePoint earliestMarkPassingTimePoint = i.next().getTimePoint();
if (result == null || earliestMarkPassingTimePoint.before(result)) {
result = earliestMarkPassingTimePoint.minus(1);
}
}
} finally {
trackedRace.unlockAfterRead(markPassingsForFirstWaypoint);
}
}
}
}
}
}
break;
}
return result;
}
}
@@ -0,0 +1,510 @@
package com.sap.sailing.server.gateway.jaxrs.api;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Course;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.common.NoWindException;
import com.sap.sailing.domain.common.RegattaName;
import com.sap.sailing.domain.common.Tack;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.impl.MillisecondsTimePoint;
import com.sap.sailing.domain.common.impl.Util;
import com.sap.sailing.domain.common.impl.Util.Pair;
import com.sap.sailing.domain.tracking.GPSFix;
import com.sap.sailing.domain.tracking.GPSFixMoving;
import com.sap.sailing.domain.tracking.GPSFixTrack;
import com.sap.sailing.domain.tracking.TrackedLeg;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.server.gateway.jaxrs.AbstractSailingServerResource;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
import com.sap.sailing.server.gateway.serialization.coursedata.impl.ControlPointJsonSerializer;
import com.sap.sailing.server.gateway.serialization.coursedata.impl.CourseBaseJsonSerializer;
import com.sap.sailing.server.gateway.serialization.coursedata.impl.GateJsonSerializer;
import com.sap.sailing.server.gateway.serialization.coursedata.impl.MarkJsonSerializer;
import com.sap.sailing.server.gateway.serialization.coursedata.impl.WaypointJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.ColorJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.CompetitorJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.FleetJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.NationalityJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.PersonJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.RegattaJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.SeriesJsonSerializer;
import com.sap.sailing.server.gateway.serialization.impl.TeamJsonSerializer;
import com.sap.sailing.util.InvalidDateException;
@Path("/v1/regattas")
public class RegattasResource extends AbstractSailingServerResource {
private Response getBadRegattaErrorResponse(String regattaName) {
return Response.status(Status.NOT_FOUND).entity("Could not find a regatta with name '" + regattaName + "'.").type(MediaType.TEXT_PLAIN).build();
}
private Response getBadRaceErrorResponse(String regattaName, String raceName) {
return Response.status(Status.NOT_FOUND).entity("Could not find a race with name '" + raceName + "' in regatta '" + regattaName + "'.").type(MediaType.TEXT_PLAIN).build();
}
@GET
@Produces("application/json;charset=UTF-8")
public Response getRegattas() {
RegattaJsonSerializer regattaJsonSerializer = new RegattaJsonSerializer();
JSONArray regattasJson = new JSONArray();
for (Regatta regatta : getService().getAllRegattas()) {
regattasJson.add(regattaJsonSerializer.serialize(regatta));
}
byte[] json = regattasJson.toJSONString().getBytes();
return Response.ok(json).build();
}
@GET
@Produces("application/json;charset=UTF-8")
@Path("{regattaname}")
public Response getRegatta(@PathParam("regattaname") String regattaName) {
Response response;
Regatta regatta = getService().getRegatta(new RegattaName(regattaName));
if (regatta == null) {
response = getBadRegattaErrorResponse(regattaName);
} else {
SeriesJsonSerializer seriesJsonSerializer = new SeriesJsonSerializer(new FleetJsonSerializer(new ColorJsonSerializer()));
JsonSerializer<Regatta> regattaSerializer = new RegattaJsonSerializer(seriesJsonSerializer, null);
JSONObject serializedRegatta = regattaSerializer.serialize(regatta);
byte[] json = serializedRegatta.toJSONString().getBytes();
response = Response.ok(json).build();
}
return response;
}
/**
* Gets all entries for a regatta.
* @param regattaName the name of the regatta
* @return
*/
@GET
@Produces("application/json;charset=UTF-8")
@Path("{regattaname}/entries")
public Response getEntries(@PathParam("regattaname") String regattaName) {
Response response;
Regatta regatta = getService().getRegatta(new RegattaName(regattaName));
if (regatta == null) {
response = getBadRegattaErrorResponse(regattaName);
} else {
NationalityJsonSerializer nationalityJsonSerializer = new NationalityJsonSerializer();
CompetitorJsonSerializer competitorJsonSerializer = new CompetitorJsonSerializer(
new TeamJsonSerializer(new PersonJsonSerializer(nationalityJsonSerializer)));
JsonSerializer<Regatta> regattaSerializer = new RegattaJsonSerializer(null, competitorJsonSerializer);
JSONObject serializedRegatta = regattaSerializer.serialize(regatta);
byte[] json = serializedRegatta.toJSONString().getBytes();
response = Response.ok(json).build();
}
return response;
}
/**
* Gets all GPS positions of the competitors for a given race.
* @param regattaName the name of the regatta
* @return
*/
@GET
@Produces("application/json;charset=UTF-8")
@Path("{regattaname}/races/{racename}/competitors/positions")
public Response getCompetitorPositions(@PathParam("regattaname") String regattaName, @PathParam("racename") String raceName,
@QueryParam("fromtime") String fromtime, @QueryParam("fromtimeasmillis") Long fromtimeasmillis,
@QueryParam("totime") String totime, @QueryParam("totimeasmillis") Long totimeasmillis) {
Response response;
Regatta regatta = findRegattaByName(regattaName);
if (regatta == null) {
response = getBadRegattaErrorResponse(regattaName);
} else {
RaceDefinition race = findRaceByName(regatta, raceName);
if (race == null) {
response = getBadRaceErrorResponse(regattaName, raceName);
} else {
TrackedRace trackedRace = findTrackedRace(regattaName, raceName);
TimePoint from;
TimePoint to;
try {
from = parseTimePoint(fromtime, fromtimeasmillis,
trackedRace.getStartOfRace() == null ? new MillisecondsTimePoint(0) :
/* 24h before race start */ new MillisecondsTimePoint(trackedRace.getStartOfRace().asMillis()-24*3600*1000));
} catch (InvalidDateException e1) {
return Response.status(Status.INTERNAL_SERVER_ERROR).entity("Could not parse the 'from' time.").type(MediaType.TEXT_PLAIN).build();
}
try {
to = parseTimePoint(totime, totimeasmillis, MillisecondsTimePoint.now());
} catch (InvalidDateException e1) {
return Response.status(Status.INTERNAL_SERVER_ERROR).entity("Could not parse the 'to' time.").type(MediaType.TEXT_PLAIN).build();
}
JSONObject jsonRace = new JSONObject();
jsonRace.put("name", trackedRace.getRace().getName());
jsonRace.put("regatta", regatta.getName());
JSONArray jsonCompetitors = new JSONArray();
for (Competitor competitor : trackedRace.getRace().getCompetitors()) {
JSONObject jsonCompetitor = new JSONObject();
jsonCompetitor.put("name", competitor.getName());
jsonCompetitor.put("id", competitor.getId() != null ? competitor.getId().toString() : null);
GPSFixTrack<Competitor, GPSFixMoving> track = trackedRace.getTrack(competitor);
JSONArray jsonFixes = new JSONArray();
track.lockForRead();
try {
Iterator<GPSFixMoving> fixIter;
if (from == null) {
fixIter = track.getFixes().iterator();
} else {
fixIter = track.getFixesIterator(from, /* inclusive */true);
}
while (fixIter.hasNext()) {
GPSFixMoving fix = fixIter.next();
if (to != null && fix.getTimePoint() != null && to.compareTo(fix.getTimePoint()) < 0) {
break;
}
JSONObject jsonFix = new JSONObject();
jsonFix.put("timepoint-ms", fix.getTimePoint().asMillis());
jsonFix.put("lat-deg", UnitSerializationUtil.latLngDecimalFormatter.format(fix.getPosition().getLatDeg()));
jsonFix.put("lng-deg", UnitSerializationUtil.latLngDecimalFormatter.format(fix.getPosition().getLngDeg()));
jsonFix.put("truebearing-deg", fix.getSpeed().getBearing().getDegrees());
jsonFix.put("speed-kts", UnitSerializationUtil.knotsDecimalFormatter.format(fix.getSpeed().getKnots()));
String tackName;
try {
final Tack tack = trackedRace.getTack(competitor, fix.getTimePoint());
if (tack != null) {
tackName = tack.name();
jsonFix.put("tack", tackName);
}
} catch (NoWindException e) {
// don't output tack
}
jsonFixes.add(jsonFix);
}
} finally {
track.unlockAfterRead();
}
jsonCompetitor.put("track", jsonFixes);
jsonCompetitors.add(jsonCompetitor);
}
jsonRace.put("competitors", jsonCompetitors);
byte[] json = jsonRace.toJSONString().getBytes();
response = Response.ok(json).build();
}
}
return response;
}
/**
* Gets all GPS positions of the course marks for a given race.
* @param regattaName the name of the regatta
* @return
*/
@GET
@Produces("application/json;charset=UTF-8")
@Path("{regattaname}/races/{racename}/marks/positions")
public Response getMarkPositions(@PathParam("regattaname") String regattaName, @PathParam("racename") String raceName,
@QueryParam("fromtime") String fromtime, @QueryParam("fromtimeasmillis") Long fromtimeasmillis,
@QueryParam("totime") String totime, @QueryParam("totimeasmillis") Long totimeasmillis) {
Response response;
Regatta regatta = findRegattaByName(regattaName);
if (regatta == null) {
response = getBadRegattaErrorResponse(regattaName);
} else {
RaceDefinition race = findRaceByName(regatta, raceName);
if (race == null) {
response = getBadRaceErrorResponse(regattaName, raceName);
} else {
TrackedRace trackedRace = findTrackedRace(regattaName, raceName);
TimePoint from;
TimePoint to;
try {
from = parseTimePoint(fromtime, fromtimeasmillis,
trackedRace.getStartOfRace() == null ? new MillisecondsTimePoint(0) :
/* 24h before race start */ new MillisecondsTimePoint(trackedRace.getStartOfRace().asMillis()-24*3600*1000));
} catch (InvalidDateException e1) {
return Response.status(Status.INTERNAL_SERVER_ERROR).entity("Could not parse the 'from' time.").type(MediaType.TEXT_PLAIN).build();
}
try {
to = parseTimePoint(totime, totimeasmillis, MillisecondsTimePoint.now());
} catch (InvalidDateException e1) {
return Response.status(Status.INTERNAL_SERVER_ERROR).entity("Could not parse the 'to' time.").type(MediaType.TEXT_PLAIN).build();
}
JSONObject jsonRace = new JSONObject();
jsonRace.put("name", trackedRace.getRace().getName());
jsonRace.put("regatta", regatta.getName());
JSONArray jsonMarks = new JSONArray();
Set<Mark> marks = new HashSet<Mark>();
Course course = trackedRace.getRace().getCourse();
for (Waypoint waypoint : course.getWaypoints()) {
for (Mark mark : waypoint.getMarks()) {
marks.add(mark);
}
}
for (Mark mark : marks) {
JSONObject jsonMark = new JSONObject();
jsonMark.put("name", mark.getName());
jsonMark.put("id", mark.getId() != null ? mark.getId().toString() : null);
GPSFixTrack<Mark, GPSFix> track = trackedRace.getOrCreateTrack(mark);
JSONArray jsonFixes = new JSONArray();
track.lockForRead();
try {
Iterator<GPSFix> fixIter;
if (from == null) {
fixIter = track.getFixes().iterator();
} else {
fixIter = track.getFixesIterator(from, /* inclusive */true);
}
while (fixIter.hasNext()) {
GPSFix fix = fixIter.next();
if (to != null && fix.getTimePoint() != null && to.compareTo(fix.getTimePoint()) < 0) {
break;
}
JSONObject jsonFix = new JSONObject();
jsonFix.put("timepoint-ms", fix.getTimePoint().asMillis());
jsonFix.put("lat-deg", UnitSerializationUtil.latLngDecimalFormatter.format(fix.getPosition().getLatDeg()));
jsonFix.put("lng-deg", UnitSerializationUtil.latLngDecimalFormatter.format(fix.getPosition().getLngDeg()));
jsonFixes.add(jsonFix);
}
} finally {
track.unlockAfterRead();
}
jsonMark.put("track", jsonFixes);
jsonMarks.add(jsonMark);
}
jsonRace.put("marks", jsonMarks);
byte[] json = jsonRace.toJSONString().getBytes();
response = Response.ok(json).build();
}
}
return response;
}
/**
* Gets the course of the race.
* @param regattaName the name of the regatta
* @return
*/
@GET
@Produces("application/json;charset=UTF-8")
@Path("{regattaname}/races/{racename}/course")
public Response getCourse(@PathParam("regattaname") String regattaName, @PathParam("racename") String raceName) {
Response response;
Regatta regatta = findRegattaByName(regattaName);
if (regatta == null) {
response = getBadRegattaErrorResponse(regattaName);
} else {
RaceDefinition race = findRaceByName(regatta, raceName);
if (race == null) {
response = getBadRaceErrorResponse(regattaName, raceName);
} else {
Course course = race.getCourse();
CourseBaseJsonSerializer serializer = new CourseBaseJsonSerializer(
new WaypointJsonSerializer(
new ControlPointJsonSerializer(
new MarkJsonSerializer(),
new GateJsonSerializer(new MarkJsonSerializer()))));
JSONObject jsonCourse = serializer.serialize(course);
byte[] json = jsonCourse.toJSONString().getBytes();
response = Response.ok(json).build();
}
}
return response;
}
/**
* Gets the relevant times of the race.
* @param regattaName the name of the regatta
* @return
*/
@GET
@Produces("application/json;charset=UTF-8")
@Path("{regattaname}/races/{racename}/times")
public Response getTimes(@PathParam("regattaname") String regattaName, @PathParam("racename") String raceName) {
Response response = null;
Regatta regatta = findRegattaByName(regattaName);
if (regatta == null) {
response = getBadRegattaErrorResponse(regattaName);
} else {
RaceDefinition race = findRaceByName(regatta, raceName);
if (race == null) {
response = getBadRaceErrorResponse(regattaName, raceName);
} else {
TrackedRace trackedRace = findTrackedRace(regattaName, raceName);
JSONObject jsonRaceTimes = new JSONObject();
jsonRaceTimes.put("name", trackedRace.getRace().getName());
jsonRaceTimes.put("regatta", regatta.getName());
jsonRaceTimes.put("startOfRace-ms", trackedRace.getStartOfRace() == null ? null : trackedRace.getStartOfRace().asMillis());
jsonRaceTimes.put("startOfTracking-ms", trackedRace.getStartOfTracking() == null ? null : trackedRace.getStartOfTracking().asMillis());
jsonRaceTimes.put("newestTrackingEvent-ms", trackedRace.getTimePointOfNewestEvent() == null ? null : trackedRace.getTimePointOfNewestEvent().asMillis());
jsonRaceTimes.put("endOfTracking-ms", trackedRace.getEndOfTracking() == null ? null : trackedRace.getEndOfTracking().asMillis());
jsonRaceTimes.put("endOfRace-ms", trackedRace.getEndOfRace() == null ? null : trackedRace.getEndOfRace().asMillis());
jsonRaceTimes.put("delayToLive-ms", trackedRace.getDelayToLiveInMillis());
JSONArray jsonMarkPassingTimes = new JSONArray();
List<TimePoint> firstPassingTimepoints = new ArrayList<>();
Iterable<Pair<Waypoint, Pair<TimePoint, TimePoint>>> markPassingsTimes = trackedRace.getMarkPassingsTimes();
synchronized (markPassingsTimes) {
int numberOfWaypoints = Util.size(markPassingsTimes);
int wayPointNumber = 1;
for (Pair<Waypoint, Pair<TimePoint, TimePoint>> markPassingTimes : markPassingsTimes) {
JSONObject jsonMarkPassing = new JSONObject();
String name = "M" + (wayPointNumber - 1);
if (wayPointNumber == numberOfWaypoints) {
name = "F";
}
jsonMarkPassing.put("name", name);
Pair<TimePoint, TimePoint> timesPair = markPassingTimes.getB();
TimePoint firstPassingTime = timesPair.getA();
TimePoint lastPassingTime = timesPair.getB();
jsonMarkPassing.put("firstPassing-ms", firstPassingTime == null ? null : firstPassingTime.asMillis());
jsonMarkPassing.put("lastPassing-ms", lastPassingTime == null ? null : lastPassingTime.asMillis());
firstPassingTimepoints.add(firstPassingTime);
jsonMarkPassingTimes.add(jsonMarkPassing);
wayPointNumber++;
}
}
jsonRaceTimes.put("markPassings", jsonMarkPassingTimes);
JSONArray jsonLegInfos = new JSONArray();
trackedRace.getRace().getCourse().lockForRead();
try {
Iterable<TrackedLeg> trackedLegs = trackedRace.getTrackedLegs();
int legNumber = 1;
for (TrackedLeg trackedLeg : trackedLegs) {
JSONObject jsonLegInfo = new JSONObject();
jsonLegInfo.put("name", "L" + legNumber);
try {
TimePoint firstPassingTime = firstPassingTimepoints.get(legNumber - 1);
if (firstPassingTime != null) {
jsonLegInfo.put("type", trackedLeg.getLegType(firstPassingTime));
jsonLegInfo.put("bearing-deg", UnitSerializationUtil.bearingDecimalFormatter.format(trackedLeg.getLegBearing(firstPassingTime).getDegrees()));
}
} catch (NoWindException e) {
// do nothing
}
jsonLegInfos.add(jsonLegInfo);
legNumber++;
}
} finally {
trackedRace.getRace().getCourse().unlockAfterRead();
}
jsonRaceTimes.put("legs", jsonLegInfos);
Date now = new Date();
jsonRaceTimes.put("currentServerTime-ms", now.getTime());
byte[] json = jsonRaceTimes.toJSONString().getBytes();
response = Response.ok(json).build();
}
}
return response;
}
@GET
@Produces("application/json;charset=UTF-8")
@Path("{regattaname}/races/{racename}/wind")
public Response getWind(@PathParam("regattaname") String regattaName, @PathParam("racename") String raceName,
@DefaultValue("COMBINED") @QueryParam("windsource") String windSource,
@QueryParam("fromtime") String fromtime, @QueryParam("fromtimeasmillis") Long fromtimeasmillis,
@QueryParam("totime") String totime, @QueryParam("totimeasmillis") Long totimeasmillis) {
Response response;
Regatta regatta = findRegattaByName(regattaName);
if (regatta == null) {
response = Response.status(Status.NOT_FOUND).entity("Could not find a regatta with name '" + regattaName + "'.").type(MediaType.TEXT_PLAIN).build();
} else {
RaceDefinition race = findRaceByName(regatta, raceName);
if (race == null) {
response = Response.status(Status.NOT_FOUND).entity("Could not find a race with name '" + raceName + "'.").type(MediaType.TEXT_PLAIN).build();
} else {
TrackedRace trackedRace = findTrackedRace(regattaName, raceName);
TimePoint from;
TimePoint to;
try {
from = parseTimePoint(fromtime, fromtimeasmillis,
trackedRace.getStartOfRace() == null ? new MillisecondsTimePoint(0) :
/* 24h before race start */ new MillisecondsTimePoint(trackedRace.getStartOfRace().asMillis()-24*3600*1000));
} catch (InvalidDateException e1) {
return Response.status(Status.INTERNAL_SERVER_ERROR).entity("Could not parse the 'from' time.").type(MediaType.TEXT_PLAIN).build();
}
try {
to = parseTimePoint(totime, totimeasmillis, MillisecondsTimePoint.now());
} catch (InvalidDateException e1) {
return Response.status(Status.INTERNAL_SERVER_ERROR).entity("Could not parse the 'to' time.").type(MediaType.TEXT_PLAIN).build();
}
TrackedRaceJsonSerializer serializer = new TrackedRaceJsonSerializer(new DefaultWindTrackJsonSerializer());
serializer.setWindSource(windSource);
serializer.setFromTime(from);
serializer.setToTime(to);
JSONObject jsonWindTracks = serializer.serialize(trackedRace);
byte[] json = jsonWindTracks.toJSONString().getBytes();
return Response.ok(json).build();
}
}
return response;
}
@GET
@Produces("application/json;charset=UTF-8")
@Path("{regattaname}/races/{racename}/competitors/ranks")
public Response getCompetitorRanks(@PathParam("regattaname") String regattaName, @PathParam("racename") String raceName) {
Response response;
Regatta regatta = findRegattaByName(regattaName);
if (regatta == null) {
response = Response.status(Status.NOT_FOUND).entity("Could not find a regatta with name '" + regattaName + "'.").type(MediaType.TEXT_PLAIN).build();
} else {
RaceDefinition race = findRaceByName(regatta, raceName);
if (race == null) {
response = Response.status(Status.NOT_FOUND).entity("Could not find a race with name '" + raceName + "'.").type(MediaType.TEXT_PLAIN).build();
} else {
// TrackedRace trackedRace = findTrackedRace(regattaName, raceName);
//
// for (Competitor competitor : race.getCompetitors()) {
// int rank = trackedRace.getRank(competitor, dateAsTimePoint);
// }
JSONObject json = new JSONObject();
return Response.ok(json).build();
}
}
return response;
}
}
@@ -0,0 +1,20 @@
package com.sap.sailing.server.gateway.jaxrs.api;
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.core.Application;
public class RestApiApplication extends Application {
public Set<Class<?>> getClasses() {
HashSet<Class<?>> classes = new HashSet<>();
classes.add(LeaderboardGroupsResource.class);
classes.add(EventsResource.class);
classes.add(RegattasResource.class);
classes.add(LeaderboardsResource.class);
// classes.add(WindResource.class);
return classes;
}
}
@@ -0,0 +1,85 @@
package com.sap.sailing.server.gateway.jaxrs.api;
import java.util.ArrayList;
import java.util.List;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.WindSource;
import com.sap.sailing.domain.common.WindSourceType;
import com.sap.sailing.domain.common.impl.WindSourceImpl;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.domain.tracking.WindTrack;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
public class TrackedRaceJsonSerializer implements JsonSerializer<TrackedRace> {
public static final String FIELD_ID = "id";
public static final String FIELD_NAME = "name";
public static final String FIELD_REGATTA = "regatta";
public static final String FIELD_WINDSOURCES = "windSources";
public static final String ALL_WINDSOURCES = "ALL";
private String windSourceToSerialize;
private TimePoint fromTime;
private TimePoint toTime;
private final WindTrackJsonSerializer windTrackSerializer;
public TrackedRaceJsonSerializer(WindTrackJsonSerializer windTrackSerializer) {
this.windTrackSerializer = windTrackSerializer;
windSourceToSerialize = WindSourceType.COMBINED.name();
}
public JSONObject serialize(TrackedRace trackedRace) {
JSONObject jsonRace = new JSONObject();
jsonRace.put(FIELD_NAME, trackedRace.getRace().getName());
jsonRace.put(FIELD_REGATTA, trackedRace.getRaceIdentifier().getRegattaName());
if(windTrackSerializer != null) {
JSONArray windTracks = new JSONArray();
List<WindSource> windSources = getAvailableWindSources(trackedRace);
for (WindSource windSource : windSources) {
if (ALL_WINDSOURCES.equals(windSourceToSerialize) || windSource.getType().name().equalsIgnoreCase(windSourceToSerialize)) {
windTrackSerializer.setFromTime(fromTime);
windTrackSerializer.setToTime(toTime);
windTrackSerializer.setWindSource(windSource);
WindTrack windTrack = trackedRace.getOrCreateWindTrack(windSource);
JSONObject jsonWindTrack = windTrackSerializer.serialize(windTrack);
windTracks.add(jsonWindTrack);
}
}
jsonRace.put(FIELD_WINDSOURCES, windTracks);
}
return jsonRace;
}
public void setWindSource(String windSourceToSerialize) {
this.windSourceToSerialize = windSourceToSerialize;
}
public void setFromTime(TimePoint fromTime) {
this.fromTime = fromTime;
}
public void setToTime(TimePoint toTime) {
this.toTime = toTime;
}
private List<WindSource> getAvailableWindSources(TrackedRace trackedRace) {
List<WindSource> windSources = new ArrayList<WindSource>();
for (WindSource windSource : trackedRace.getWindSources()) {
windSources.add(windSource);
}
for (WindSource windSourceToExclude : trackedRace.getWindSourcesToExclude()) {
windSources.remove(windSourceToExclude);
}
windSources.add(new WindSourceImpl(WindSourceType.COMBINED));
return windSources;
}
}
@@ -0,0 +1,20 @@
package com.sap.sailing.server.gateway.jaxrs.api;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
public class UnitSerializationUtil {
public static final DecimalFormat knotsDecimalFormatter = new DecimalFormat("#.##");
public static final DecimalFormat bearingDecimalFormatter = new DecimalFormat("#.#");
public static final DecimalFormat speedDecimalFormatter = new DecimalFormat("#.#");
public static final DecimalFormat latLngDecimalFormatter = new DecimalFormat("#.######");
static {
DecimalFormatSymbols symbol = DecimalFormatSymbols.getInstance();
symbol.setDecimalSeparator('.');
knotsDecimalFormatter.setDecimalFormatSymbols(symbol);
bearingDecimalFormatter.setDecimalFormatSymbols(symbol);
speedDecimalFormatter.setDecimalFormatSymbols(symbol);
latLngDecimalFormatter.setDecimalFormatSymbols(symbol);
}
}
@@ -0,0 +1,12 @@
package com.sap.sailing.server.gateway.jaxrs.api;
import com.sap.sailing.domain.common.TimePoint;
import com.sap.sailing.domain.common.WindSource;
import com.sap.sailing.domain.tracking.WindTrack;
import com.sap.sailing.server.gateway.serialization.JsonSerializer;
public interface WindTrackJsonSerializer extends JsonSerializer<WindTrack> {
void setFromTime(TimePoint fromTime);
void setToTime(TimePoint toTime);
void setWindSource(WindSource windSource);
}
@@ -0,0 +1,45 @@
package com.sap.sailing.server.gateway.jaxrs.spi;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Response;
import org.json.simple.JSONObject;
import com.sap.sailing.domain.leaderboard.LeaderboardGroup;
import com.sap.sailing.server.gateway.jaxrs.AbstractSailingServerResource;
import com.sap.sailing.server.gateway.serialization.masterdata.impl.TopLevelMasterDataSerializer;
@Path("/v1/leaderboardgroups/structure")
public class LeaderboardGroupsStructureResource extends AbstractSailingServerResource {
@GET
@Produces("application/json;charset=UTF-8")
public Response getStructureOfLeaderboardGroups(@QueryParam("names") List<String> leaderboardGroupNames) {
Map<String, LeaderboardGroup> leaderboardGroups = getService().getLeaderboardGroups();
Set<String> requestedLeaderboardGroupNames = new HashSet<String>();
if (leaderboardGroupNames != null && !leaderboardGroupNames.isEmpty()) {
requestedLeaderboardGroupNames.addAll(leaderboardGroupNames);
} else {
// No range supplied. Export all for now
requestedLeaderboardGroupNames.addAll(leaderboardGroups.keySet());
}
TopLevelMasterDataSerializer masterSerializer = new TopLevelMasterDataSerializer(leaderboardGroups,
getService().getAllEvents(), getService().getPersistentRegattasForRaceIDs(), getService().getAllMediaTracks());
JSONObject masterData = masterSerializer.serialize(requestedLeaderboardGroupNames);
byte[] json = masterData.toJSONString().getBytes();
return Response.ok(json).build();
}
}
@@ -0,0 +1,16 @@
package com.sap.sailing.server.gateway.jaxrs.spi;
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.core.Application;
public class RestSpiApplication extends Application {
public Set<Class<?>> getClasses() {
HashSet<Class<?>> classes = new HashSet<>();
classes.add(LeaderboardGroupsStructureResource.class);
return classes;
}
}
@@ -2,10 +2,10 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link href='../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../sap.ico' type='image/x-icon'>
<title>Gateway services</title>
<link href='../../../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../../../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../../../sap.ico' type='image/x-icon'>
<title>Deprecated Web Services API</title>
</head>
<body>
<h1>SAP Sailing Analytics - Web Services</h1>
@@ -0,0 +1,110 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link href='../../../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../../../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../../../sap.ico' type='image/x-icon'>
<title>Deprecated Web Services API</title>
</head>
<body>
<h1>SAP Sailing Analytics Deprecated Web Services API - Overview</h1>
<p>
The best entry point to navigating the contents of a server is usually the <b>leaderboardgroups</b> service,
listing the leaderboard groups offered by the server. For example,
<a href="http://www.sapsailing.com/sailingserver/leaderboardgroups">http://www.sapsailing.com/sailingserver/leaderboardgroups</a>
lists the names of the leaderboard groups that the server instance knows. The names returned in the list can then be used
as parameter for the <b>leaderboardgroup</b> service, e.g., as follows:
<a href="http://www.sapsailing.com/sailingserver/leaderboardgroup?leaderboardGroupName=Star%20IDM%202013">http://www.sapsailing.com/sailingserver/leaderboardgroup?leaderboardGroupName=Star%20IDM%202013</a>.
Note, of course, that the name needs to be URL-encoded with special characters and white spaces correctly
translated into URL format.
</p>
<div style="height: 1em;"></div>
<p>
The leaderboard group service list the leaderboards in the group. There are essentially two types of leaderboard:
flexible leaderboards and regatta leaderboards. For flexible leaderboards, the service tells the list of races
in the leaderboard, and for each race in particular the regatta name and the tracked race name. These two attributes
can, in turn, be used as parameters for further services to identify the race for which information shall be retrieved and
to fetch information about the regatta with its structure such as series and fleets.
Again, note that those names need to be URL-encoded accordingly when used as parameter to a service call.
</p>
<div style="height: 1em;"></div>
<p>
When a service takes a time point as a parameter, there are usually two ways of specifying it: either as an
ISO time stamp, e.g., 2013-05-08T10:12:59Z or as Unix time stamp (milliseconds since 1970-01-01T00:00:00Z). The parameters
in the latter format are usually called <b>...asmillis</b>.
</p>
<div style="height: 1em;"></div>
<table>
<thead>
<tr>
<td>Web Service</td>
<td>Description</td>
<td>Supported formats</td>
</trh>
</thead>
<tbody>
<tr>
<td><a href="eventsExportDoc.html">/events</a></td>
<td>Gets all events</td>
<td><a href="eventsExportSample.json">Json</a></td>
</tr>
<tr>
<td><a href="regattasExportDoc.html">/regattas</a></td>
<td>Gets all regattas</td>
<td><a href="regattasExportSample.json">Json</a></td>
</tr>
<tr>
<td><a href="regattaExportDoc.html">/regatta</a></td>
<td>Gets a regatta</td>
<td><a href="regattaExportSample.json">Json</a></td>
</tr>
<tr>
<td><a href="leaderboardGroupsExportDoc.html">/leaderboardgroups</a></td>
<td>Gets all leaderboard groups</td>
<td><a href="leaderboardGroupsExportSample.json">Json</a></td>
</tr>
<tr>
<td><a href="leaderboardGroupExportDoc.html">/leaderboardgroup</a></td>
<td>Gets a group of leaderboards</td>
<td><a href="leaderboardGroupExportSample.json">Json</a></td>
</tr>
<tr>
<td><a href="leaderboardsExportDoc.html">/leaderboards</a></td>
<td>Gets all leaderboards</td>
<td><a href="leaderboardsExportSample.json">Json</a></td>
</tr>
<tr>
<td><a href="leaderboardExportDoc.html">/leaderboard</a></td>
<td>Gets a leaderboard</td>
<td><a href="leaderboardExportSample.json">Json</a></td>
</tr>
<tr>
<td><a href="windExportDoc.html">/wind</a></td>
<td>Gets wind data for a race</td>
<td><a href="windExportSample.json">Json</a></td>
</tr>
<!--
<tr>
<td><a href="showraceDoc.html">showrace</a></td>
<td>Gets general time-dependent data for a race and the competitors</td>
<td><a href="showraceSample.json">Json</a></td>
</tr>
<tr>
<td><a href="showwaypointsDoc.html">showwaypoints</a></td>
<td>Gets course and waypoint data for a race</td>
<td><a href="showwaypointsSample.json">Json</a></td>
</tr>
<tr>
<td><a href="showboatpositionsDoc.html">showboatpositions</a></td>
<td>Gets boat GPS data for a race</td>
<td><a href="showboatpositionsSample.json">Json</a></td>
</tr>
-->
</tbody>
</table>
<div style="height: 1em;"></div>
<a href="../../index.html">Back to Web Services Home</a>
</body>
</html>
@@ -2,10 +2,10 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link href='../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../sap.ico' type='image/x-icon'>
<title>Gateway services</title>
<link href='../../../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../../../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../../../sap.ico' type='image/x-icon'>
<title>Deprecated Web Services API</title>
</head>
<body>
<h1>SAP Sailing Analytics - Web Services</h1>
@@ -2,10 +2,10 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link href='../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../sap.ico' type='image/x-icon'>
<title>Gateway services</title>
<link href='../../../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../../../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../../../sap.ico' type='image/x-icon'>
<title>Deprecated Web Services API</title>
</head>
<body>
<h1>SAP Sailing Analytics - Web Services</h1>
@@ -2,10 +2,10 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link href='../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../sap.ico' type='image/x-icon'>
<title>Gateway services</title>
<link href='../../../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../../../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../../../sap.ico' type='image/x-icon'>
<title>Deprecated Web Services API</title>
</head>
<body>
<h1>SAP Sailing Analytics - Web Services</h1>
@@ -2,10 +2,10 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link href='../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../sap.ico' type='image/x-icon'>
<title>Gateway services</title>
<link href='../../../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../../../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../../../sap.ico' type='image/x-icon'>
<title>Deprecated Web Services API</title>
</head>
<body>
<h1>SAP Sailing Analytics - Web Services</h1>
@@ -2,10 +2,10 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link href='../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../sap.ico' type='image/x-icon'>
<title>Gateway services</title>
<link href='../../../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../../../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../../../sap.ico' type='image/x-icon'>
<title>Deprecated Web Services API</title>
</head>
<body>
<h1>SAP Sailing Analytics - Web Services</h1>
@@ -2,10 +2,10 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link href='../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../sap.ico' type='image/x-icon'>
<title>Gateway services</title>
<link href='../../../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../../../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../../../sap.ico' type='image/x-icon'>
<title>Deprecated Web Services API</title>
</head>
<body>
<h1>SAP Sailing Analytics - Web Services</h1>
@@ -2,10 +2,10 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link href='../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../sap.ico' type='image/x-icon'>
<title>Gateway services</title>
<link href='../../../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../../../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../../../sap.ico' type='image/x-icon'>
<title>Deprecated Web Services API</title>
</head>
<body>
<h1>SAP Sailing Analytics - Web Services</h1>
@@ -2,10 +2,10 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link href='../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../sap.ico' type='image/x-icon'>
<title>Gateway services</title>
<link href='../../../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../../../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../../../sap.ico' type='image/x-icon'>
<title>Deprecated Web Services API</title>
</head>
<body>
<h1>SAP Sailing Analytics - Web Services</h1>
@@ -2,10 +2,10 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link href='../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../sap.ico' type='image/x-icon'>
<title>Gateway services</title>
<link href='../../../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../../../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../../../sap.ico' type='image/x-icon'>
<title>Deprecated Web Services API</title>
</head>
<body>
<h1>SAP Sailing Analytics - Web Services</h1>
@@ -2,10 +2,10 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link href='../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../sap.ico' type='image/x-icon'>
<title>Gateway services</title>
<link href='../../../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../../../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../../../sap.ico' type='image/x-icon'>
<title>Deprecated Web Services API</title>
</head>
<body>
<h1>SAP Sailing Analytics - Web Services</h1>
@@ -0,0 +1,46 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link href='../../../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../../../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../../../sap.ico' type='image/x-icon'>
<title>SAP Sailing Analytics Webservices API Version 1.0 Beta</title>
</head>
<body>
<h1>SAP Sailing Analytics Webservices API Version 1.0 Beta</h1>
<h2>URL: /api/v1/events</h2>
<b>Description:</b>
<p>The service gets all existing events with their venues and course areas</p>
<br/>
<table>
<tr>
<td>Webservice Type:</td>
<td>REST</td>
</tr>
<tr>
<td>Output format:</td>
<td>Json</td>
</tr>
<tr>
<td>Mandatory parameters:</td>
<td>None</td>
</tr>
<tr>
<td>Optional parameters:</td>
<td>None</td>
</tr>
<tr>
<td>Request method:</td>
<td>GET</td>
</tr>
<tr>
<td>Example:</td>
<td><a href="http://www.sapsailing.com/sailingserver/api/v1/events">http://www.sapsailing.com/sailingserver/api/v1/events</a></td>
</tr>
</table>
<div style="height: 1em;"></div>
<a href="index.html">Back to Web Service Overview</a>
</body>
</html>
@@ -0,0 +1,84 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link href='../../../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../../../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../../../sap.ico' type='image/x-icon'>
<title>SAP Sailing Analytics Webservices API Version 1.0 Beta</title>
</head>
<body>
<h1>SAP Sailing Analytics Webservices API Version 1.0 Beta - Overview</h1>
<p>
A number of web services are available to query the state of a SAP Sailing Analytics server instance.
Note that different server instances exist, and not all servers hold the same data. Usually, events get
their own URL which is then made sure to point to a server instance holding the data for that event.
We use an Apache reverse proxy to map URLs (and in particular the sub-domain) to a particular server instance.
So, <a href="http://www.sapsailing.com">www.sapsailing.com</a> may end up on a different server instance than
<a href="http://tw2013.sapsailing.com">tw2013.sapsailing.com</a>
or <a href="http://ess40-2013.sapsailing.com">ess40-2013.sapsailing.com</a>. Usually, we hand out a per-event
or per-series URL, such as the ones above (except www.sapsailing.com which is the general landing page),
and you would only fetch the content for the event you're interested in, even if the server instance has more.
In all subsequent explanations, you may replace the "www.sapsailing.com" hostname by an according per-event host
name to make sure you get to the event you're interested in.
</p>
<div style="height: 1em;"></div>
<table>
<thead>
<tr>
<td>Webservice URL</td>
<td>Description</td>
</tr>
</thead>
<tbody>
<tr>
<td><a href="eventsGetDoc.html">/api/v1/events</a></td>
<td>Gets all events</td>
</tr>
<tr>
<td><a href="regattasGetDoc.html">/api/v1/regattas</a></td>
<td>Gets all regattas</td>
</tr>
<tr>
<td><a href="regattaGetDoc.html">/api/v1/regattas/{name}</a></td>
<td>Gets the details of a regatta</td>
</tr>
<tr>
<td><a href="raceCompetitorPositionsGetDoc.html">/api/v1/regattas/{regattaname}/races/{racename}/competitors/positions</a></td>
<td>Gets all GPS positions of the competitors of a race</td>
</tr>
<tr>
<td><a href="raceMarkPositionsGetDoc.html">/api/v1/regattas/{regattaname}/races/{racename}/marks/positions</a></td>
<td>Gets all GPS positions of the course marks of a race</td>
</tr>
<tr>
<td><a href="raceCourseGetDoc.html">/api/v1/regattas/{regattaname}/races/{racename}/course</a></td>
<td>Gets the course of a race</td>
</tr>
<tr>
<td><a href="raceWindGetDoc.html">/api/v1/regattas/{regattaname}/races/{racename}/wind</a></td>
<td>Gets all GPS positions and data values for the wind of a race</td>
</tr>
<tr>
<td><a href="leaderboardgroupsGetDoc.html">/api/v1/leaderboardgroups</a></td>
<td>Gets all leaderboard groups</td>
</tr>
<tr>
<td><a href="leaderboardgroupGetDoc.html">/api/v1/leaderboardgroups/{name}</a></td>
<td>Gets the details of a group of leaderboards</td>
</tr>
<tr>
<td><a href="leaderboardsGetDoc.html">/api/v1/leaderboards</a></td>
<td>Gets all leaderboards</td>
</tr>
<tr>
<td><a href="leaderboardGetDoc.html">/api/v1/leaderboards/{name}</a></td>
<td>Gets the details of a leaderboard</td>
</tr>
</tbody>
</table>
<div style="height: 1em;"></div>
<a href="../../index.html">Back to Web Services Home</a>
</body>
</html>
@@ -0,0 +1,46 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link href='../../../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../../../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../../../sap.ico' type='image/x-icon'>
<title>SAP Sailing Analytics Webservices API Version 1.0 Beta</title>
</head>
<body>
<h1>SAP Sailing Analytics Webservices API Version 1.0 Beta</h1>
<h2>URL: /api/v1/leaderboards/{name}</h2>
<b>Description:</b>
<p>The service gets the details of a leaderboard</p>
<br/>
<table>
<tr>
<td>Webservice Type:</td>
<td>REST</td>
</tr>
<tr>
<td>Output format:</td>
<td>Json</td>
</tr>
<tr>
<td>Mandatory parameters:</td>
<td>None</td>
</tr>
<tr>
<td>Optional parameters:</td>
<td>None</td>
</tr>
<tr>
<td>Request method:</td>
<td>GET</td>
</tr>
<tr>
<td>Example:</td>
<td><a href="http://www.sapsailing.com/sailingserver/api/v1/leaderboards/505 Worlds 2013">http://www.sapsailing.com/sailingserver/api/v1/leaderboards/505 Worlds 2013</a></td>
</tr>
</table>
<div style="height: 1em;"></div>
<a href="index.html">Back to Web Service Overview</a>
</body>
</html>
@@ -0,0 +1,46 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link href='../../../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../../../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../../../sap.ico' type='image/x-icon'>
<title>SAP Sailing Analytics Webservices API Version 1.0 Beta</title>
</head>
<body>
<h1>SAP Sailing Analytics Webservices API Version 1.0 Beta</h1>
<h2>URL: /api/v1/leaderboardgroups/{name}</h2>
<b>Description:</b>
<p>The service gets the details of a group of leaderboards</p>
<br/>
<table>
<tr>
<td>Webservice Type:</td>
<td>REST</td>
</tr>
<tr>
<td>Output format:</td>
<td>Json</td>
</tr>
<tr>
<td>Mandatory parameters:</td>
<td>None</td>
</tr>
<tr>
<td>Optional parameters:</td>
<td>None</td>
</tr>
<tr>
<td>Request method:</td>
<td>GET</td>
</tr>
<tr>
<td>Example:</td>
<td><a href="http://www.sapsailing.com/sailingserver/api/v1/leaderboardgroups/505 Worlds 2013">http://www.sapsailing.com/sailingserver/api/v1/leaderboardgroups/505 Worlds 2013</a></td>
</tr>
</table>
<div style="height: 1em;"></div>
<a href="index.html">Back to Web Service Overview</a>
</body>
</html>
@@ -0,0 +1,46 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link href='../../../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../../../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../../../sap.ico' type='image/x-icon'>
<title>SAP Sailing Analytics Webservices API Version 1.0 Beta</title>
</head>
<body>
<h1>SAP Sailing Analytics Webservices API Version 1.0 Beta</h1>
<h2>URL: /api/v1/leaderboardgroups</h2>
<b>Description:</b>
<p>The service gets the names of all existing leaderboard groups</p>
<br/>
<table>
<tr>
<td>Webservice Type:</td>
<td>REST</td>
</tr>
<tr>
<td>Output format:</td>
<td>Json</td>
</tr>
<tr>
<td>Mandatory parameters:</td>
<td>None</td>
</tr>
<tr>
<td>Optional parameters:</td>
<td>None</td>
</tr>
<tr>
<td>Request method:</td>
<td>GET</td>
</tr>
<tr>
<td>Example:</td>
<td><a href="http://www.sapsailing.com/sailingserver/api/v1/leaderboardgroups">http://www.sapsailing.com/sailingserver/api/v1/leaderboardgroups</a></td>
</tr>
</table>
<div style="height: 1em;"></div>
<a href="index.html">Back to Web Service Overview</a>
</body>
</html>
@@ -0,0 +1,46 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link href='../../../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../../../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../../../sap.ico' type='image/x-icon'>
<title>SAP Sailing Analytics Webservices API Version 1.0 Beta</title>
</head>
<body>
<h1>SAP Sailing Analytics Webservices API Version 1.0 Beta</h1>
<h2>URL: /api/v1/leaderboards</h2>
<b>Description:</b>
<p>The service gets the names of all existing leaderboards</p>
<br/>
<table>
<tr>
<td>Webservice Type:</td>
<td>REST</td>
</tr>
<tr>
<td>Output format:</td>
<td>Json</td>
</tr>
<tr>
<td>Mandatory parameters:</td>
<td>None</td>
</tr>
<tr>
<td>Optional parameters:</td>
<td>None</td>
</tr>
<tr>
<td>Request method:</td>
<td>GET</td>
</tr>
<tr>
<td>Example:</td>
<td><a href="http://www.sapsailing.com/sailingserver/api/v1/leaderboards">http://www.sapsailing.com/sailingserver/api/v1/leaderboards</a></td>
</tr>
</table>
<div style="height: 1em;"></div>
<a href="index.html">Back to Web Service Overview</a>
</body>
</html>
@@ -0,0 +1,46 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link href='../../../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../../../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../../../sap.ico' type='image/x-icon'>
<title>SAP Sailing Analytics Webservices API Version 1.0 Beta</title>
</head>
<body>
<h1>SAP Sailing Analytics Webservices API Version 1.0 Beta</h1>
<h2>URL: /api/v1/regattas/{regattaname}/races/{racename}/competitors/positions</h2>
<b>Description:</b>
<p>Gets all GPS positions of the competitors of a race</p>
<br/>
<table>
<tr>
<td>Webservice Type:</td>
<td>REST</td>
</tr>
<tr>
<td>Output format:</td>
<td>Json</td>
</tr>
<tr>
<td>Mandatory parameters:</td>
<td>None</td>
</tr>
<tr>
<td>Optional parameters:</td>
<td>None</td>
</tr>
<tr>
<td>Request method:</td>
<td>GET</td>
</tr>
<tr>
<td>Example:</td>
<td><a href="http://www.sapsailing.com/sailingserver/api/v1/regattas/{regattaname}/races/{racename}/competitors/positions">http://www.sapsailing.com/sailingserver/api/v1/regattas/{regattaname}/races/{racename}/competitors/positions</a></td>
</tr>
</table>
<div style="height: 1em;"></div>
<a href="index.html">Back to Web Service Overview</a>
</body>
</html>
@@ -0,0 +1,46 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link href='../../../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../../../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../../../sap.ico' type='image/x-icon'>
<title>SAP Sailing Analytics Webservices API Version 1.0 Beta</title>
</head>
<body>
<h1>SAP Sailing Analytics Webservices API Version 1.0 Beta</h1>
<h2>URL: /api/v1/regattas/{regattaname}/races/{racename}/course</h2>
<b>Description:</b>
<p>Gets the course of a race</p>
<br/>
<table>
<tr>
<td>Webservice Type:</td>
<td>REST</td>
</tr>
<tr>
<td>Output format:</td>
<td>Json</td>
</tr>
<tr>
<td>Mandatory parameters:</td>
<td>None</td>
</tr>
<tr>
<td>Optional parameters:</td>
<td>None</td>
</tr>
<tr>
<td>Request method:</td>
<td>GET</td>
</tr>
<tr>
<td>Example:</td>
<td><a href="http://www.sapsailing.com/sailingserver/api/v1/regattas/{regattaname}/races/{racename}/course">http://www.sapsailing.com/sailingserver/api/v1/regattas/{regattaname}/races/{racename}/course</a></td>
</tr>
</table>
<div style="height: 1em;"></div>
<a href="index.html">Back to Web Service Overview</a>
</body>
</html>
@@ -0,0 +1,46 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link href='../../../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../../../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../../../sap.ico' type='image/x-icon'>
<title>SAP Sailing Analytics Webservices API Version 1.0 Beta</title>
</head>
<body>
<h1>SAP Sailing Analytics Webservices API Version 1.0 Beta</h1>
<h2>URL: /api/v1/regattas/{regattaname}/races/{racename}/marks/positions</h2>
<b>Description:</b>
<p>Gets all GPS positions of the course marks of a race</p>
<br/>
<table>
<tr>
<td>Webservice Type:</td>
<td>REST</td>
</tr>
<tr>
<td>Output format:</td>
<td>Json</td>
</tr>
<tr>
<td>Mandatory parameters:</td>
<td>None</td>
</tr>
<tr>
<td>Optional parameters:</td>
<td>None</td>
</tr>
<tr>
<td>Request method:</td>
<td>GET</td>
</tr>
<tr>
<td>Example:</td>
<td><a href="http://www.sapsailing.com/sailingserver/api/v1/regattas/{regattaname}/races/{racename}/marks/positions">http://www.sapsailing.com/sailingserver/api/v1/regattas/{regattaname}/races/{racename}/marks/positions</a></td>
</tr>
</table>
<div style="height: 1em;"></div>
<a href="index.html">Back to Web Service Overview</a>
</body>
</html>
@@ -0,0 +1,55 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link href='../../../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../../../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../../../sap.ico' type='image/x-icon'>
<title>SAP Sailing Analytics Webservices API Version 1.0 Beta</title>
</head>
<body>
<h1>SAP Sailing Analytics Webservices API Version 1.0 Beta</h1>
<h2>URL: /api/v1/regattas/{regattaname}/races/{racename}/wind</h2>
<b>Description:</b>
<p>Gets all GPS positions and data values for the wind of a race</p>
<br/>
<table>
<tr>
<td>Webservice Type:</td>
<td>REST</td>
</tr>
<tr>
<td>Output format:</td>
<td>Json</td>
</tr>
<tr>
<td>Mandatory parameters:</td>
<td>
<div>regattaname</div>
<div>racename</div>
</td>
</tr>
<tr>
<td>Optional parameters:</td>
<td>
<div>windsource</div>
<div>fromtime</div>
<div>fromtimeasmillis</div>
<div>totime</div>
<div>totimeasmillis</div>
</td>
</tr>
<tr>
<td>Request method:</td>
<td>GET</td>
</tr>
<tr>
<td>Example:</td>
<td><a href="http://www.sapsailing.com/sailingserver/api/v1/regattas/{regattaname}/races/{racename}/wind">http://www.sapsailing.com/sailingserver/api/v1/regattas/{regattaname}/races/{racename}/wind</a></td>
</tr>
</table>
<div style="height: 1em;"></div>
<a href="index.html">Back to Web Service Overview</a>
</body>
</html>
@@ -0,0 +1,46 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link href='../../../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../../../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../../../sap.ico' type='image/x-icon'>
<title>SAP Sailing Analytics Webservices API Version 1.0 Beta</title>
</head>
<body>
<h1>SAP Sailing Analytics Webservices API Version 1.0 Beta</h1>
<h2>URL: /api/v1/regattas/{name}</h2>
<b>Description:</b>
<p>The service gets the details of a regatta</p>
<br/>
<table>
<tr>
<td>Webservice Type:</td>
<td>REST</td>
</tr>
<tr>
<td>Output format:</td>
<td>Json</td>
</tr>
<tr>
<td>Mandatory parameters:</td>
<td>None</td>
</tr>
<tr>
<td>Optional parameters:</td>
<td>None</td>
</tr>
<tr>
<td>Request method:</td>
<td>GET</td>
</tr>
<tr>
<td>Example:</td>
<td><a href="http://www.sapsailing.com/sailingserver/api/v1/regatta/Kieler Woche (5o5)">http://www.sapsailing.com/sailingserver/api/v1/regatta/Kieler Woche (5o5)</a></td>
</tr>
</table>
<div style="height: 1em;"></div>
<a href="index.html">Back to Web Service Overview</a>
</body>
</html>
@@ -0,0 +1,46 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link href='../../../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../../../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../../../sap.ico' type='image/x-icon'>
<title>SAP Sailing Analytics Webservices API Version 1.0 Beta</title>
</head>
<body>
<h1>SAP Sailing Analytics Webservices API Version 1.0 Beta</h1>
<h2>URL: /api/v1/regattas</h2>
<b>Description:</b>
<p>The service gets the names of all existing regattas</p>
<br/>
<table>
<tr>
<td>Webservice Type:</td>
<td>REST</td>
</tr>
<tr>
<td>Output format:</td>
<td>Json</td>
</tr>
<tr>
<td>Mandatory parameters:</td>
<td>None</td>
</tr>
<tr>
<td>Optional parameters:</td>
<td>None</td>
</tr>
<tr>
<td>Request method:</td>
<td>GET</td>
</tr>
<tr>
<td>Example:</td>
<td><a href="http://www.sapsailing.com/sailingserver/api/v1/regattas">http://www.sapsailing.com/sailingserver/api/v1/regattas</a></td>
</tr>
</table>
<div style="height: 1em;"></div>
<a href="index.html">Back to Web Service Overview</a>
</body>
</html>
@@ -23,97 +23,16 @@ and you would only fetch the content for the event you're interested in, even if
In all subsequent explanations, you may replace the "www.sapsailing.com" hostname by an according per-event host
name to make sure you get to the event you're interested in.
</p>
<p>
The best entry point to navigating the contents of a server is usually the <b>leaderboardgroups</b> service,
listing the leaderboard groups offered by the server. For example,
<a href="http://www.sapsailing.com/sailingserver/leaderboardgroups">http://www.sapsailing.com/sailingserver/leaderboardgroups</a>
lists the names of the leaderboard groups that the server instance knows. The names returned in the list can then be used
as parameter for the <b>leaderboardgroup</b> service, e.g., as follows:
<a href="http://www.sapsailing.com/sailingserver/leaderboardgroup?leaderboardGroupName=Star%20IDM%202013">http://www.sapsailing.com/sailingserver/leaderboardgroup?leaderboardGroupName=Star%20IDM%202013</a>.
Note, of course, that the name needs to be URL-encoded with special characters and white spaces correctly
translated into URL format.
<div style="height: 1em;"></div>
<p style="font-weight:bold;">
Attention:
We are going to introduce a new and more managed WebServices API. The old API is marked as deprecated but will continue to work for some time.
</p>
<p>
The leaderboard group service list the leaderboards in the group. There are essentially two types of leaderboard:
flexible leaderboards and regatta leaderboards. For flexible leaderboards, the service tells the list of races
in the leaderboard, and for each race in particular the regatta name and the tracked race name. These two attributes
can, in turn, be used as parameters for further services to identify the race for which information shall be retrieved and
to fetch information about the regatta with its structure such as series and fleets.
Again, note that those names need to be URL-encoded accordingly when used as parameter to a service call.
</p>
<p>
When a service takes a time point as a parameter, there are usually two ways of specifying it: either as an
ISO time stamp, e.g., 2013-05-08T10:12:59Z or as Unix time stamp (milliseconds since 1970-01-01T00:00:00Z). The parameters
in the latter format are usually called <b>...asmillis</b>.
</p>
<table>
<thead>
<tr>
<td>Web Service</td>
<td>Description</td>
<td>Supported formats</td>
</trh>
</thead>
<tbody>
<tr>
<td><a href="eventsExportDoc.html">events</a></td>
<td>Gets all events</td>
<td><a href="eventsExportSample.json">Json</a></td>
</tr>
<tr>
<td><a href="regattasExportDoc.html">regattas</a></td>
<td>Gets all regattas</td>
<td><a href="regattasExportSample.json">Json</a></td>
</tr>
<tr>
<td><a href="regattaExportDoc.html">regatta</a></td>
<td>Gets a regatta</td>
<td><a href="regattaExportSample.json">Json</a></td>
</tr>
<tr>
<td><a href="leaderboardGroupsExportDoc.html">leaderboardgroups</a></td>
<td>Gets all leaderboard groups</td>
<td><a href="leaderboardGroupsExportSample.json">Json</a></td>
</tr>
<tr>
<td><a href="leaderboardGroupExportDoc.html">leaderboardgroup</a></td>
<td>Gets a group of leaderboards</td>
<td><a href="leaderboardGroupExportSample.json">Json</a></td>
</tr>
<tr>
<td><a href="leaderboardsExportDoc.html">leaderboards</a></td>
<td>Gets all leaderboards</td>
<td><a href="leaderboardsExportSample.json">Json</a></td>
</tr>
<tr>
<td><a href="leaderboardExportDoc.html">leaderboard</a></td>
<td>Gets a leaderboard</td>
<td><a href="leaderboardExportSample.json">Json</a></td>
</tr>
<tr>
<td><a href="windExportDoc.html">wind</a></td>
<td>Gets wind data for a race</td>
<td><a href="windExportSample.json">Json</a></td>
</tr>
<tr>
<td><a href="showraceDoc.html">showrace</a></td>
<td>Gets general time-dependent data for a race and the competitors</td>
<td><a href="showraceSample.json">Json</a></td>
</tr>
<tr>
<td><a href="showwaypointsDoc.html">showwaypoints</a></td>
<td>Gets course and waypoint data for a race</td>
<td><a href="showwaypointsSample.json">Json</a></td>
</tr>
<tr>
<td><a href="showboatpositionsDoc.html">showboatpositions</a></td>
<td>Gets boat GPS data for a race</td>
<td><a href="showboatpositionsSample.json">Json</a></td>
</tr>
</tbody>
</table>
<br/>
<b>Webservices API-Documention:</b><br/>
<ul style="margin-left: 20px;">
<li><a href="api/v1/index.html">SAP Sailing Analytics Webservices Version 1.0 Beta</a></li>
<li><a href="api/deprecated/index.html">SAP Sailing Analytics Webservices API (soon replaced with v1)</a></li>
</ul>
</body>
</html>
@@ -0,0 +1,30 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link href='../../../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../../../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../../../sap.ico' type='image/x-icon'>
<title>SAP-Sailing Analytics Webservices SPI Version 1.0</title>
</head>
<body>
<h1>SAP-Sailing Analytics Webservices SPI Version 1.0 - Overview</h1>
<table>
<thead>
<tr>
<td>Webservice URL</td>
<td>Description</td>
</trh>
</thead>
<tbody>
<tr>
<td><a href="leaderboardgroupsStructureGetDoc.html">/spi/v1/leaderboardgroups/structure</a></td>
<td>Gets the internal structure of a list of leaderboard groups</td>
</tr>
</tbody>
</table>
<div style="height: 1em;"></div>
<a href="index.html">Back to Web Service Home</a>
</body>
</html>
@@ -0,0 +1,46 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link href='../../../../fontface.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link href='../../../main.css' media='screen' rel='stylesheet' title='Default stylesheet' type='text/css' />
<link rel='icon' href='../../../../sap.ico' type='image/x-icon'>
<title>SAP Sailing Analytics Webservices API Version 1.0 Beta</title>
</head>
<body>
<h1>SAP Sailing Analytics Webservices API Version 1.0 Beta</h1>
<h2>URL: /spi/v1/leaderboardgroups/structure</h2>
<b>Description:</b>
<p>The service gets the wind data of a race</p>
<br/>
<table>
<tr>
<td>Webservice Type:</td>
<td>REST</td>
</tr>
<tr>
<td>Output format:</td>
<td>Json</td>
</tr>
<tr>
<td>Mandatory parameters:</td>
<td>None</td>
</tr>
<tr>
<td>Optional parameters:</td>
<td>names</td>
</tr>
<tr>
<td>Request method:</td>
<td>GET</td>
</tr>
<tr>
<td>Example:</td>
<td><a href="http://www.sapsailing.com/sailingserver/spi/v1/leaderboardgroups/structure">http://www.sapsailing.com/sailingserver/spi/v1/leaderboardgroups/structure</a></td>
</tr>
</table>
<div style="height: 1em;"></div>
<a href="index.html">Back to Web Service Overview</a>
</body>
</html>
@@ -6,9 +6,7 @@ Bundle-Version: 1.0.0.qualifier
Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Fragment-Host: com.sap.sailing.server.replication
Import-Package: com.rabbitmq.client;version="2.8.4",
junit.framework;version="4.8.1",
org.junit;version="4.8.1"
Import-Package: com.rabbitmq.client;version="2.8.4"
Require-Bundle: com.sap.sailing.server,
com.sap.sailing.domain.common,
com.sap.sailing.domain,
@@ -21,4 +19,5 @@ Require-Bundle: com.sap.sailing.server,
com.sap.sailing.expeditionconnector,
com.sap.sailing.domain.swisstimingadapter,
org.json.simple;bundle-version="1.1.0",
org.junit4;bundle-version="4.8.2",
org.hamcrest;bundle-version="1.1.0"
@@ -15,10 +15,9 @@ Require-Bundle: com.sap.sailing.domain,
com.sap.sailing.mongodb,
com.tractrac.clientmodule;bundle-version="2.0.0",
com.mongodb.driver;bundle-version="2.6.2",
org.junit4;bundle-version="4.8.2",
com.sap.sailing.domain.test,
org.hamcrest;bundle-version="1.1.0",
com.sap.sailing.server.gateway.serialization;bundle-version="1.0.0"
Import-Package: junit.framework;version="4.8.1",
org.junit;version="4.8.1",
org.json.simple
Import-Package: org.json.simple
Export-Package: com.sap.sailing.server.impl
@@ -5,15 +5,14 @@ Bundle-SymbolicName: com.sap.sailing.server.trackfiles.test
Bundle-Version: 1.0.0.qualifier
Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Require-Bundle: com.sap.sailing.server.trackfiles,
com.tractrac.clientmodule;bundle-version="2.0.0",
Fragment-Host: com.sap.sailing.server.trackfiles
Require-Bundle: com.tractrac.clientmodule;bundle-version="2.0.0",
com.sap.sailing.domain.tractracadapter,
com.googlecode.java-diff-utils;bundle-version="1.3.0",
com.sap.sailing.domain.common,
com.sap.sailing.domain.test;bundle-version="1.0.0",
com.sap.sailing.domain;bundle-version="1.0.0",
com.sap.sailing.server;bundle-version="1.0.0"
Import-Package: junit.framework;version="4.8.1",
org.json.simple,
org.json.simple.parser,
org.junit;version="4.8.1"
com.sap.sailing.server;bundle-version="1.0.0",
org.junit4;bundle-version="4.8.2"
Import-Package: org.json.simple,
org.json.simple.parser
@@ -18,7 +18,7 @@
<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog -console -clean"/>
<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-ea -Declipse.ignoreApp=true -Dosgi.noShutdown=true&#13;&#10;-Dexpedition.udp.port=2010 -Xmx4096m -Djetty.home=${project_loc:com.sap.sailing.server}/../target/configuration/jetty -Djava.util.logging.config.file=${project_loc:com.sap.sailing.server}/../target/configuration/logging_debug.properties -Dkiwo.results=${project_loc:com.sap.sailing.kiworesultimport.test}/resources -XX:+UseMembar"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-ea -Declipse.ignoreApp=true -Dosgi.noShutdown=true -Dexpedition.udp.port=2010 -Xmx4096m -Djetty.home=${project_loc:com.sap.sailing.server}/../target/configuration/jetty -Djava.util.logging.config.file=${project_loc:com.sap.sailing.server}/../target/configuration/logging_debug.properties -Dkiwo.results=${project_loc:com.sap.sailing.kiworesultimport.test}/resources -XX:+UseMembar"/>
<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${workspace_loc}"/>
<stringAttribute key="pde.version" value="3.3"/>
<stringAttribute key="profilingTraceType-ALLOCATION_TRACE" value="KEY_SESSION_FILTER%CTX_KEY%*%CTX_ENTRY%INCREASE_COUNT%CTX_KEY%8192%CTX_ENTRY%KEY_USER_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_ADAPTIVE%CTX_KEY%false%CTX_ENTRY%KEY_MIN_SIZE%CTX_KEY%32%CTX_ENTRY%KEY_REQUEST_FILTER%CTX_KEY%*%CTX_ENTRY%CLASS_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_MAX_SIZE%CTX_KEY%65536%CTX_ENTRY%KEY_INC_LINE_NRS%CTX_KEY%true%CTX_ENTRY%KEY_APPLICATION_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_ENABLEMENT%CTX_KEY%false%CTX_ENTRY%"/>
@@ -28,9 +28,9 @@
<stringAttribute key="profilingTraceType-PERFORMANCE_HOTSPOT_TRACE" value="KEY_SESSION_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_USER_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_REQUEST_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_IGNORE_SLEEPING_THREADS%CTX_KEY%true%CTX_ENTRY%KEY_APPLICATION_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_ENABLEMENT%CTX_KEY%false%CTX_ENTRY%"/>
<stringAttribute key="profilingTraceType-SYNCHRONIZATION_TRACE" value="KEY_SESSION_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_USER_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_REQUEST_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_APPLICATION_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_ENABLEMENT%CTX_KEY%false%CTX_ENTRY%"/>
<booleanAttribute key="show_selected_only" value="false"/>
<stringAttribute key="target_bundles" value="com.rabbitmq.client@default:default,com.sun.mail.javax.mail@default:default,javax.el*2.1.0.v201105211819@default:default,javax.el*2.2.0.v201303151357@default:default,javax.servlet*2.5.0.v201103041518@default:default,javax.servlet*3.0.0.v201112011016@default:default,javax.servlet.jsp*2.1.0.v201105211820@default:default,javax.servlet.jsp*2.2.0.v201112011158@default:default,javax.servlet.jsp.jstl@default:default,jcl.over.slf4j@default:default,org.apache.activemq.activeio-core@default:default,org.apache.activemq.activemq-core@default:default,org.apache.activemq.kahadb@default:default,org.apache.commons.codec@default:default,org.apache.commons.fileupload@default:default,org.apache.commons.io@default:default,org.apache.geronimo.specs.geronimo-annotation_1.0_spec@default:default,org.apache.geronimo.specs.geronimo-j2ee-management_1.1_spec@default:default,org.apache.geronimo.specs.geronimo-jms_1.1_spec@default:default,org.apache.jasper.glassfish@default:default,org.apache.taglibs.standard.glassfish@default:default,org.eclipse.equinox.transforms.hook@default:false,org.eclipse.jetty.continuation@default:default,org.eclipse.jetty.deploy@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.jmx@default:default,org.eclipse.jetty.osgi.boot.jsp@default:false,org.eclipse.jetty.osgi.boot.warurl@default:default,org.eclipse.jetty.osgi.boot@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.jetty.webapp@default:default,org.eclipse.jetty.websocket.api@default:default,org.eclipse.jetty.websocket.client@default:default,org.eclipse.jetty.websocket.common@default:default,org.eclipse.jetty.websocket.server@default:default,org.eclipse.jetty.websocket.servlet@default:default,org.eclipse.jetty.xml@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.jdom@default:default,rome@default:default,routeconverter@default:default,slf4j.api@default:default,slf4j.jdk14@default:false"/>
<stringAttribute key="target_bundles" value="com.rabbitmq.client@default:default,com.sun.jersey@default:default,com.sun.mail.javax.mail@default:default,javax.servlet*3.0.0.v201112011016@default:default,javax.validation@default:default,javax.ws.rs@default:default,jcl.over.slf4j@default:default,org.apache.activemq.activeio-core@default:default,org.apache.activemq.activemq-core@default:default,org.apache.activemq.kahadb@default:default,org.apache.commons.codec@default:default,org.apache.commons.fileupload@default:default,org.apache.commons.io@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.apache.geronimo.specs.geronimo-annotation_1.0_spec@default:default,org.apache.geronimo.specs.geronimo-j2ee-management_1.1_spec@default:default,org.apache.geronimo.specs.geronimo-jms_1.1_spec@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.console@default:default,org.eclipse.jetty.continuation@default:default,org.eclipse.jetty.deploy@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.jmx@default:default,org.eclipse.jetty.osgi.boot@3:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.jetty.webapp@default:default,org.eclipse.jetty.websocket.api@default:default,org.eclipse.jetty.websocket.client@default:default,org.eclipse.jetty.websocket.common@default:default,org.eclipse.jetty.websocket.server@default:default,org.eclipse.jetty.websocket.servlet@default:default,org.eclipse.jetty.xml@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.jdom@default:default,org.objectweb.asm@default:default,rome@default:default,routeconverter@default:default,slf4j.api@default:default,slf4j.jdk14@default:false"/>
<booleanAttribute key="tracing" value="false"/>
<booleanAttribute key="useCustomFeatures" value="false"/>
<booleanAttribute key="useDefaultConfigArea" value="false"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.osgi@default:default,com.googlecode.java-diff-utils@default:default,com.mongodb.driver@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@default:default,com.sap.sailing.domain.swisstimingreplayadapter@default:default,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@default:default,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.gwt.ui@default:default,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.mongodb@default:default,com.sap.sailing.nmeaconnector@default:default,com.sap.sailing.operationaltransformation@default:default,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.ess40@default:default,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway@default:default,com.sap.sailing.server.replication@default:default,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www.events@default:default,com.sap.sailing.www@default:default,com.sap.sailing.xcelsiusadapter@default:default,com.sap.sailing.xrr.resultimport@1:default,com.tractrac.clientmodule@default:default,de.csenk.gwt.ws@default:default,net.sf.marineapi@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.osgi@default:default,com.googlecode.java-diff-utils@default:default,com.mongodb.driver@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@default:default,com.sap.sailing.domain.swisstimingreplayadapter@default:default,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@default:default,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.gwt.ui@4:true,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.mongodb@default:default,com.sap.sailing.nmeaconnector@default:default,com.sap.sailing.operationaltransformation@default:default,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.ess40@4:true,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway@5:true,com.sap.sailing.server.replication@4:true,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www.events@4:true,com.sap.sailing.www@4:true,com.sap.sailing.xcelsiusadapter@4:true,com.sap.sailing.xrr.resultimport@default:default,com.tractrac.clientmodule@default:default,de.csenk.gwt.ws@default:default,net.sf.marineapi@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
</launchConfiguration>
@@ -22,10 +22,10 @@
<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${workspace_loc}"/>
<stringAttribute key="pde.version" value="3.3"/>
<booleanAttribute key="show_selected_only" value="false"/>
<stringAttribute key="target_bundles" value="com.rabbitmq.client@default:default,com.sun.mail.javax.mail@default:default,javax.el*2.1.0.v201105211819@default:default,javax.el*2.2.0.v201303151357@default:default,javax.servlet*2.5.0.v201103041518@default:default,javax.servlet*3.0.0.v201112011016@default:default,javax.servlet.jsp*2.1.0.v201105211820@default:default,javax.servlet.jsp*2.2.0.v201112011158@default:default,javax.servlet.jsp.jstl@default:default,jcl.over.slf4j@default:default,org.apache.activemq.activeio-core@default:default,org.apache.activemq.activemq-core@default:default,org.apache.activemq.kahadb@default:default,org.apache.commons.codec@default:default,org.apache.commons.fileupload@default:default,org.apache.commons.io@default:default,org.apache.geronimo.specs.geronimo-annotation_1.0_spec@default:default,org.apache.geronimo.specs.geronimo-j2ee-management_1.1_spec@default:default,org.apache.geronimo.specs.geronimo-jms_1.1_spec@default:default,org.apache.jasper.glassfish@default:default,org.apache.taglibs.standard.glassfish@default:default,org.eclipse.equinox.transforms.hook@default:false,org.eclipse.jetty.continuation@default:default,org.eclipse.jetty.deploy@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.jmx@default:default,org.eclipse.jetty.osgi.boot.jsp@default:false,org.eclipse.jetty.osgi.boot@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.jetty.webapp@default:default,org.eclipse.jetty.websocket.api@default:default,org.eclipse.jetty.websocket.client@default:default,org.eclipse.jetty.websocket.common@default:default,org.eclipse.jetty.websocket.server@default:default,org.eclipse.jetty.websocket.servlet@default:default,org.eclipse.jetty.xml@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.hamcrest.core@default:default,org.hamcrest.integration@default:default,org.hamcrest.library@default:default,org.hamcrest.text@default:default,org.hamcrest@default:default,org.jdom@default:default,org.junit4@default:default,org.mockito.mockito-core@default:default,org.objenesis@default:default,rome@default:default,routeconverter@default:default,slf4j.api@default:default,slf4j.jdk14@default:false"/>
<stringAttribute key="target_bundles" value="com.rabbitmq.client@default:default,com.sun.jersey@default:default,com.sun.mail.javax.mail@default:default,javax.servlet*3.0.0.v201112011016@default:default,javax.validation@default:default,javax.ws.rs@default:default,jcl.over.slf4j@default:default,org.apache.activemq.activeio-core@default:default,org.apache.activemq.activemq-core@default:default,org.apache.activemq.kahadb@default:default,org.apache.commons.codec*1.4.0.v201209201156@default:default,org.apache.commons.codec*1.6.0@default:default,org.apache.commons.fileupload@default:default,org.apache.commons.io@default:default,org.apache.geronimo.specs.geronimo-annotation_1.0_spec@default:default,org.apache.geronimo.specs.geronimo-j2ee-management_1.1_spec@default:default,org.apache.geronimo.specs.geronimo-jms_1.1_spec@default:default,org.apache.jasper.glassfish@default:default,org.eclipse.equinox.transforms.hook@default:false,org.eclipse.jetty.continuation*8.1.10.v20130312@default:default,org.eclipse.jetty.continuation*9.0.4.v20130625@default:default,org.eclipse.jetty.deploy@default:default,org.eclipse.jetty.http*8.1.10.v20130312@default:default,org.eclipse.jetty.http*9.0.4.v20130625@default:default,org.eclipse.jetty.io*8.1.10.v20130312@default:default,org.eclipse.jetty.io*9.0.4.v20130625@default:default,org.eclipse.jetty.jmx@default:default,org.eclipse.jetty.osgi.boot@default:default,org.eclipse.jetty.security*8.1.10.v20130312@default:default,org.eclipse.jetty.security*9.0.4.v20130625@default:default,org.eclipse.jetty.server*8.1.10.v20130312@default:default,org.eclipse.jetty.server*9.0.4.v20130625@default:default,org.eclipse.jetty.servlet*8.1.10.v20130312@default:default,org.eclipse.jetty.servlet*9.0.4.v20130625@default:default,org.eclipse.jetty.util*8.1.10.v20130312@default:default,org.eclipse.jetty.util*9.0.4.v20130625@default:default,org.eclipse.jetty.webapp@default:default,org.eclipse.jetty.websocket.api@default:default,org.eclipse.jetty.websocket.client@default:default,org.eclipse.jetty.websocket.common@default:default,org.eclipse.jetty.websocket.server@default:default,org.eclipse.jetty.websocket.servlet@default:default,org.eclipse.jetty.xml@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.hamcrest.core@default:default,org.hamcrest.integration@default:default,org.hamcrest.library@default:default,org.hamcrest.text@default:default,org.hamcrest@default:default,org.jdom@default:default,org.junit4@default:default,org.mockito.mockito-core@default:default,org.objectweb.asm@default:default,org.objenesis@default:default,rome@default:default,routeconverter@default:default,slf4j.api@default:default,slf4j.jdk14@default:false"/>
<booleanAttribute key="tracing" value="false"/>
<booleanAttribute key="useCustomFeatures" value="false"/>
<booleanAttribute key="useDefaultConfigArea" value="false"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.osgi@default:default,com.googlecode.java-diff-utils.test@default:false,com.googlecode.java-diff-utils@default:default,com.mongodb.driver@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.declination.test@default:false,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter.test@default:false,com.sap.sailing.domain.swisstimingadapter@default:default,com.sap.sailing.domain.swisstimingreplayadapter.test@default:false,com.sap.sailing.domain.swisstimingreplayadapter@default:default,com.sap.sailing.domain.test@default:default,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter.test@default:false,com.sap.sailing.domain.tractracadapter@default:default,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport.test@default:false,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector.test@default:false,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport.test@default:false,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding.test@default:false,com.sap.sailing.geocoding@default:default,com.sap.sailing.gwt.ui.test@default:false,com.sap.sailing.gwt.ui@default:default,com.sap.sailing.kiworesultimport.test@default:false,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.mongodb.test@default:false,com.sap.sailing.mongodb@default:default,com.sap.sailing.operationaltransformation.test@default:false,com.sap.sailing.operationaltransformation@default:default,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.ess40@default:default,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway.test@default:false,com.sap.sailing.server.gateway@default:default,com.sap.sailing.server.replication.test@default:false,com.sap.sailing.server.replication@default:default,com.sap.sailing.server.test@default:false,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www.events@default:default,com.sap.sailing.www@default:default,com.sap.sailing.xcelsiusadapter@default:default,com.sap.sailing.xrr.resultimport.test@default:false,com.sap.sailing.xrr.resultimport@default:default,com.tractrac.clientmodule@default:default,de.csenk.gwt.ws@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.osgi*2.5.1.qualifier@default:default,com.googlecode.java-diff-utils.test@default:false,com.googlecode.java-diff-utils@default:default,com.mongodb.driver@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.declination.test@default:false,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter.test@default:false,com.sap.sailing.domain.swisstimingadapter@default:default,com.sap.sailing.domain.swisstimingreplayadapter.test@default:false,com.sap.sailing.domain.swisstimingreplayadapter@default:default,com.sap.sailing.domain.test@default:default,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter.test@default:false,com.sap.sailing.domain.tractracadapter@default:default,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport.test@default:false,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector.test@default:false,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport.test@default:false,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding.test@default:false,com.sap.sailing.geocoding@default:default,com.sap.sailing.gwt.ui.test@default:false,com.sap.sailing.gwt.ui@default:default,com.sap.sailing.kiworesultimport.test@default:false,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.mongodb.test@default:false,com.sap.sailing.mongodb@default:default,com.sap.sailing.operationaltransformation.test@default:false,com.sap.sailing.operationaltransformation@default:default,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.ess40@default:default,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway.test@default:false,com.sap.sailing.server.gateway@default:default,com.sap.sailing.server.replication.test@default:false,com.sap.sailing.server.replication@default:default,com.sap.sailing.server.test@default:false,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www.events@default:default,com.sap.sailing.www@default:default,com.sap.sailing.xcelsiusadapter@default:default,com.sap.sailing.xrr.resultimport.test@default:false,com.sap.sailing.xrr.resultimport@default:default,com.tractrac.clientmodule@default:default,de.csenk.gwt.ws@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
<stringAttribute key="yk-options" value="&#13;&#10;additional-options2=onexit\=snapshot&#13;&#10;"/>
</launchConfiguration>
@@ -22,10 +22,10 @@
<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${workspace_loc}"/>
<stringAttribute key="pde.version" value="3.3"/>
<booleanAttribute key="show_selected_only" value="false"/>
<stringAttribute key="target_bundles" value="com.rabbitmq.client@default:default,com.sun.mail.javax.mail@default:default,javax.el*2.1.0.v201105211819@default:default,javax.el*2.2.0.v201303151357@default:default,javax.servlet*2.5.0.v201103041518@default:default,javax.servlet*3.0.0.v201112011016@default:default,javax.servlet.jsp*2.1.0.v201105211820@default:default,javax.servlet.jsp*2.2.0.v201112011158@default:default,javax.servlet.jsp.jstl@default:default,jcl.over.slf4j@default:default,org.apache.activemq.activeio-core@default:default,org.apache.activemq.activemq-core@default:default,org.apache.activemq.kahadb@default:default,org.apache.commons.codec@default:default,org.apache.commons.fileupload@default:default,org.apache.commons.io@default:default,org.apache.geronimo.specs.geronimo-annotation_1.0_spec@default:default,org.apache.geronimo.specs.geronimo-j2ee-management_1.1_spec@default:default,org.apache.geronimo.specs.geronimo-jms_1.1_spec@default:default,org.apache.jasper.glassfish@default:default,org.apache.taglibs.standard.glassfish@default:default,org.eclipse.equinox.transforms.hook@default:false,org.eclipse.jetty.continuation@default:default,org.eclipse.jetty.deploy@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.jmx@default:default,org.eclipse.jetty.osgi.boot.jsp@default:false,org.eclipse.jetty.osgi.boot@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.jetty.webapp@default:default,org.eclipse.jetty.websocket.api@default:default,org.eclipse.jetty.websocket.client@default:default,org.eclipse.jetty.websocket.common@default:default,org.eclipse.jetty.websocket.server@default:default,org.eclipse.jetty.websocket.servlet@default:default,org.eclipse.jetty.xml@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.hamcrest.core@default:default,org.hyperic.sigar@default:default,org.jdom@default:default,org.junit4@default:default,rome@default:default,routeconverter@default:default,slf4j.api@default:default,slf4j.jdk14@default:false"/>
<stringAttribute key="target_bundles" value="com.rabbitmq.client@default:default,com.sun.jersey@default:default,com.sun.mail.javax.mail@default:default,javax.servlet*3.0.0.v201112011016@default:default,javax.validation@default:default,javax.ws.rs@default:default,jcl.over.slf4j@default:default,org.apache.activemq.activeio-core@default:default,org.apache.activemq.activemq-core@default:default,org.apache.activemq.kahadb@default:default,org.apache.commons.codec*1.4.0.v201209201156@default:default,org.apache.commons.codec*1.6.0@default:default,org.apache.commons.fileupload@default:default,org.apache.commons.io@default:default,org.apache.geronimo.specs.geronimo-annotation_1.0_spec@default:default,org.apache.geronimo.specs.geronimo-j2ee-management_1.1_spec@default:default,org.apache.geronimo.specs.geronimo-jms_1.1_spec@default:default,org.apache.jasper.glassfish@default:default,org.eclipse.equinox.transforms.hook@default:false,org.eclipse.jetty.continuation*8.1.10.v20130312@default:default,org.eclipse.jetty.continuation*9.0.4.v20130625@default:default,org.eclipse.jetty.deploy@default:default,org.eclipse.jetty.http*8.1.10.v20130312@default:default,org.eclipse.jetty.http*9.0.4.v20130625@default:default,org.eclipse.jetty.io*8.1.10.v20130312@default:default,org.eclipse.jetty.io*9.0.4.v20130625@default:default,org.eclipse.jetty.jmx@default:default,org.eclipse.jetty.osgi.boot@default:default,org.eclipse.jetty.security*8.1.10.v20130312@default:default,org.eclipse.jetty.security*9.0.4.v20130625@default:default,org.eclipse.jetty.server*8.1.10.v20130312@default:default,org.eclipse.jetty.server*9.0.4.v20130625@default:default,org.eclipse.jetty.servlet*8.1.10.v20130312@default:default,org.eclipse.jetty.servlet*9.0.4.v20130625@default:default,org.eclipse.jetty.util*8.1.10.v20130312@default:default,org.eclipse.jetty.util*9.0.4.v20130625@default:default,org.eclipse.jetty.webapp@default:default,org.eclipse.jetty.websocket.api@default:default,org.eclipse.jetty.websocket.client@default:default,org.eclipse.jetty.websocket.common@default:default,org.eclipse.jetty.websocket.server@default:default,org.eclipse.jetty.websocket.servlet@default:default,org.eclipse.jetty.xml@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.hamcrest.core@default:default,org.hyperic.sigar@default:default,org.jdom@default:default,org.junit4@default:default,org.objectweb.asm@default:default,rome@default:default,routeconverter@default:default,slf4j.api@default:default,slf4j.jdk14@default:false"/>
<booleanAttribute key="tracing" value="false"/>
<booleanAttribute key="useCustomFeatures" value="false"/>
<booleanAttribute key="useDefaultConfigArea" value="false"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.osgi@default:default,com.googlecode.java-diff-utils@default:default,com.mongodb.driver@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@default:default,com.sap.sailing.domain.swisstimingreplayadapter@default:default,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@default:default,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.gwt.ui@default:default,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.mongodb@default:default,com.sap.sailing.monitoring@5:true,com.sap.sailing.operationaltransformation@default:default,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.ess40@default:default,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway@default:default,com.sap.sailing.server.replication@default:default,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www.events@default:default,com.sap.sailing.www@default:default,com.sap.sailing.xcelsiusadapter@default:default,com.sap.sailing.xrr.resultimport@default:default,com.tractrac.clientmodule@default:default,de.csenk.gwt.ws@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.osgi*2.5.1.qualifier@default:default,com.googlecode.java-diff-utils@default:default,com.mongodb.driver@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@default:default,com.sap.sailing.domain.swisstimingreplayadapter@default:default,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@default:default,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.gwt.ui@default:default,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.mongodb@default:default,com.sap.sailing.monitoring@5:true,com.sap.sailing.operationaltransformation@default:default,com.sap.sailing.resultimport@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.ess40@default:default,com.sap.sailing.server.gateway.serialization@default:default,com.sap.sailing.server.gateway@default:default,com.sap.sailing.server.replication@default:default,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www.events@default:default,com.sap.sailing.www@default:default,com.sap.sailing.xcelsiusadapter@default:default,com.sap.sailing.xrr.resultimport@default:default,com.tractrac.clientmodule@default:default,de.csenk.gwt.ws@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
<stringAttribute key="yk-options" value="&#13;&#10;additional-options2=onexit\=snapshot&#13;&#10;"/>
</launchConfiguration>
@@ -21,9 +21,9 @@
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Declipse.ignoreApp=true -Dosgi.noShutdown=true&#13;&#10;-Dexpedition.udp.port=2010 -Xmx1024m -Djetty.home=${project_loc:com.sap.sailing.server}/../target/configuration/jetty -Djava.util.logging.config.file=${project_loc:com.sap.sailing.server}/../target/configuration/logging_debug.properties -XX:+UseMembar"/>
<stringAttribute key="pde.version" value="3.3"/>
<booleanAttribute key="show_selected_only" value="false"/>
<stringAttribute key="target_bundles" value="com.rabbitmq.client@default:default,javax.el*2.1.0.v201105211819@default:default,javax.el*2.2.0.v201303151357@default:default,javax.servlet*2.5.0.v201103041518@default:default,javax.servlet*3.0.0.v201112011016@default:default,javax.servlet.jsp*2.1.0.v201105211820@default:default,javax.servlet.jsp*2.2.0.v201112011158@default:default,javax.servlet.jsp.jstl@default:default,org.apache.commons.codec@default:default,org.apache.commons.fileupload@default:default,org.apache.commons.io@default:default,org.apache.geronimo.specs.geronimo-j2ee-management_1.1_spec@default:default,org.apache.geronimo.specs.geronimo-jms_1.1_spec@default:default,org.apache.jasper.glassfish@default:default,org.eclipse.equinox.transforms.hook@default:false,org.eclipse.jetty.websocket.api@default:default,org.eclipse.jetty.websocket.client@default:default,org.eclipse.jetty.websocket.common@default:default,org.eclipse.jetty.websocket.server@default:default,org.eclipse.jetty.websocket.servlet@default:default,org.eclipse.osgi@-1:true,org.jdom@default:default,rome@default:default,routeconverter@default:default"/>
<stringAttribute key="target_bundles" value="com.rabbitmq.client@default:default,com.sun.jersey@default:default,com.sun.mail.javax.mail@default:default,javax.servlet*3.0.0.v201112011016@default:default,javax.validation@default:default,javax.ws.rs@default:default,org.apache.commons.codec*1.4.0.v201209201156@default:default,org.apache.commons.codec*1.6.0@default:default,org.apache.commons.fileupload@default:default,org.apache.commons.io@default:default,org.apache.geronimo.specs.geronimo-j2ee-management_1.1_spec@default:default,org.apache.geronimo.specs.geronimo-jms_1.1_spec@default:default,org.apache.jasper.glassfish@default:default,org.eclipse.equinox.transforms.hook@default:false,org.eclipse.jetty.websocket.api@default:default,org.eclipse.jetty.websocket.client@default:default,org.eclipse.jetty.websocket.common@default:default,org.eclipse.jetty.websocket.server@default:default,org.eclipse.jetty.websocket.servlet@default:default,org.eclipse.osgi@-1:true,org.jdom@default:default,org.objectweb.asm@default:default,rome@default:default,routeconverter@default:default"/>
<booleanAttribute key="tracing" value="false"/>
<booleanAttribute key="useCustomFeatures" value="false"/>
<booleanAttribute key="useDefaultConfigArea" value="false"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.osgi@default:default,com.googlecode.java-diff-utils@default:default,com.mongodb.driver@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@default:default,com.sap.sailing.domain.swisstimingreplayadapter@default:default,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@default:default,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.gwt.ui@default:default,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.mongodb@default:default,com.sap.sailing.operationaltransformation@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.ess40@default:default,com.sap.sailing.server.gateway@default:default,com.sap.sailing.server.replication@default:default,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www.events@default:default,com.sap.sailing.www@default:default,com.sap.sailing.xcelsiusadapter@default:default,com.sap.sailing.xrr.resultimport@default:default,com.tractrac.clientmodule@default:default,de.csenk.gwt.ws@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.osgi*2.5.1.qualifier@default:default,com.googlecode.java-diff-utils@default:default,com.mongodb.driver@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@default:default,com.sap.sailing.domain.swisstimingreplayadapter@default:default,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@default:default,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.gwt.ui@default:default,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.mongodb@default:default,com.sap.sailing.operationaltransformation@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.ess40@default:default,com.sap.sailing.server.gateway@default:default,com.sap.sailing.server.replication@default:default,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www.events@default:default,com.sap.sailing.www@default:default,com.sap.sailing.xcelsiusadapter@default:default,com.sap.sailing.xrr.resultimport@default:default,com.tractrac.clientmodule@default:default,de.csenk.gwt.ws@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
</launchConfiguration>
@@ -21,9 +21,9 @@
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y -Declipse.ignoreApp=true -Dosgi.noShutdown=true -Xmx2048m -Djetty.home=${project_loc:com.sap.sailing.server}/../target/configuration/jetty -Djava.util.logging.config.file=${project_loc:com.sap.sailing.server}/../target/configuration/logging_debug.properties -Dkiwo.results=${project_loc:com.sap.sailing.kiworesultimport.test}/resources -XX:+UseMembar"/>
<stringAttribute key="pde.version" value="3.3"/>
<booleanAttribute key="show_selected_only" value="false"/>
<stringAttribute key="target_bundles" value="com.rabbitmq.client@default:default,com.sun.mail.javax.mail@default:default,javax.el*2.1.0.v201105211819@default:default,javax.el*2.2.0.v201303151357@default:default,javax.servlet*2.5.0.v201103041518@default:default,javax.servlet*3.0.0.v201112011016@default:default,javax.servlet.jsp*2.1.0.v201105211820@default:default,javax.servlet.jsp*2.2.0.v201112011158@default:default,javax.servlet.jsp.jstl@default:default,jcl.over.slf4j@default:default,org.apache.activemq.activeio-core@default:default,org.apache.activemq.activemq-core@default:default,org.apache.activemq.kahadb@default:default,org.apache.commons.codec@default:default,org.apache.commons.fileupload@default:default,org.apache.commons.io@default:default,org.apache.geronimo.specs.geronimo-annotation_1.0_spec@default:default,org.apache.geronimo.specs.geronimo-j2ee-management_1.1_spec@default:default,org.apache.geronimo.specs.geronimo-jms_1.1_spec@default:default,org.apache.jasper.glassfish@default:default,org.apache.taglibs.standard.glassfish@default:default,org.eclipse.equinox.transforms.hook@default:false,org.eclipse.jetty.continuation@default:default,org.eclipse.jetty.deploy@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.jmx@default:default,org.eclipse.jetty.osgi.boot.jsp@default:false,org.eclipse.jetty.osgi.boot@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.jetty.webapp@default:default,org.eclipse.jetty.websocket.api@default:default,org.eclipse.jetty.websocket.client@default:default,org.eclipse.jetty.websocket.common@default:default,org.eclipse.jetty.websocket.server@default:default,org.eclipse.jetty.websocket.servlet@default:default,org.eclipse.jetty.xml@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.hyperic.sigar@default:default,org.jdom@default:default,rome@default:default,routeconverter@default:default,slf4j.api@default:default,slf4j.jdk14@default:false"/>
<stringAttribute key="target_bundles" value="com.rabbitmq.client@default:default,com.sun.jersey@default:default,com.sun.mail.javax.mail@default:default,javax.servlet*3.0.0.v201112011016@default:default,javax.validation@default:default,javax.ws.rs@default:default,jcl.over.slf4j@default:default,org.apache.activemq.activeio-core@default:default,org.apache.activemq.activemq-core@default:default,org.apache.activemq.kahadb@default:default,org.apache.commons.codec*1.4.0.v201209201156@default:default,org.apache.commons.codec*1.6.0@default:default,org.apache.commons.fileupload@default:default,org.apache.commons.io@default:default,org.apache.geronimo.specs.geronimo-annotation_1.0_spec@default:default,org.apache.geronimo.specs.geronimo-j2ee-management_1.1_spec@default:default,org.apache.geronimo.specs.geronimo-jms_1.1_spec@default:default,org.apache.jasper.glassfish@default:default,org.eclipse.equinox.transforms.hook@default:false,org.eclipse.jetty.continuation*8.1.10.v20130312@default:default,org.eclipse.jetty.continuation*9.0.4.v20130625@default:default,org.eclipse.jetty.deploy@default:default,org.eclipse.jetty.http*8.1.10.v20130312@default:default,org.eclipse.jetty.http*9.0.4.v20130625@default:default,org.eclipse.jetty.io*8.1.10.v20130312@default:default,org.eclipse.jetty.io*9.0.4.v20130625@default:default,org.eclipse.jetty.jmx@default:default,org.eclipse.jetty.osgi.boot@default:default,org.eclipse.jetty.security*8.1.10.v20130312@default:default,org.eclipse.jetty.security*9.0.4.v20130625@default:default,org.eclipse.jetty.server*8.1.10.v20130312@default:default,org.eclipse.jetty.server*9.0.4.v20130625@default:default,org.eclipse.jetty.servlet*8.1.10.v20130312@default:default,org.eclipse.jetty.servlet*9.0.4.v20130625@default:default,org.eclipse.jetty.util*8.1.10.v20130312@default:default,org.eclipse.jetty.util*9.0.4.v20130625@default:default,org.eclipse.jetty.webapp@default:default,org.eclipse.jetty.websocket.api@default:default,org.eclipse.jetty.websocket.client@default:default,org.eclipse.jetty.websocket.common@default:default,org.eclipse.jetty.websocket.server@default:default,org.eclipse.jetty.websocket.servlet@default:default,org.eclipse.jetty.xml@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.hyperic.sigar@default:default,org.jdom@default:default,org.objectweb.asm@default:default,rome@default:default,routeconverter@default:default,slf4j.api@default:default,slf4j.jdk14@default:false"/>
<booleanAttribute key="tracing" value="false"/>
<booleanAttribute key="useCustomFeatures" value="false"/>
<booleanAttribute key="useDefaultConfigArea" value="false"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.osgi@default:default,com.googlecode.java-diff-utils@default:default,com.mongodb.driver@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@default:default,com.sap.sailing.domain.swisstimingreplayadapter@default:default,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@default:default,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.gwt.ui@default:default,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.mongodb@default:default,com.sap.sailing.monitoring@default:default,com.sap.sailing.nmeaconnector@default:default,com.sap.sailing.operationaltransformation@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.ess40@default:default,com.sap.sailing.server.gateway@default:default,com.sap.sailing.server.replication@default:default,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www.events@default:default,com.sap.sailing.www@default:default,com.sap.sailing.xcelsiusadapter@default:default,com.sap.sailing.xrr.resultimport@default:default,com.tractrac.clientmodule@default:default,de.csenk.gwt.ws@default:default,net.sf.marineapi@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
<stringAttribute key="workspace_bundles" value="com.google.gwt.osgi*2.5.1.qualifier@default:default,com.googlecode.java-diff-utils@default:default,com.mongodb.driver@default:default,com.sap.sailing.barbados.resultimport@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.shared.android@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@default:default,com.sap.sailing.domain.swisstimingreplayadapter@default:default,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@default:default,com.sap.sailing.domain@default:default,com.sap.sailing.ess40.resultimport@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.freg.resultimport@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.gwt.ui@default:default,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.manage2sail.resultimport@default:default,com.sap.sailing.mongodb@default:default,com.sap.sailing.monitoring@default:default,com.sap.sailing.nmeaconnector@default:default,com.sap.sailing.operationaltransformation@default:default,com.sap.sailing.sailwave.resultimport@default:default,com.sap.sailing.server.gateway.ess40@default:default,com.sap.sailing.server.gateway@default:default,com.sap.sailing.server.replication@default:default,com.sap.sailing.server.trackfiles@default:default,com.sap.sailing.server@default:default,com.sap.sailing.simulator@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.velum.resultimport@default:default,com.sap.sailing.www.events@default:default,com.sap.sailing.www@default:default,com.sap.sailing.xcelsiusadapter@default:default,com.sap.sailing.xrr.resultimport@default:default,com.tractrac.clientmodule@default:default,de.csenk.gwt.ws@default:default,net.sf.marineapi@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
</launchConfiguration>
Loaded 100 of 114 files, more files were not shown because too many files have changed in this diff. Show more