diff --git a/configuration/buildAndUpdateProduct.sh b/configuration/buildAndUpdateProduct.sh
index 7c83189a0c6..54bb59bdc36 100755
--- a/configuration/buildAndUpdateProduct.sh
+++ b/configuration/buildAndUpdateProduct.sh
@@ -265,7 +265,7 @@ if [[ "$@" == "release" ]]; then
cp -v $PROJECT_HOME/java/target/configuration/jetty/etc/jetty-deployer.xml configuration/jetty/etc
cp -v $PROJECT_HOME/java/target/configuration/jetty/etc/realm.properties configuration/jetty/etc
cp -v $PROJECT_HOME/java/target/configuration/monitoring.properties configuration/
- cp -v $PROJECT_HOME/java/target/configuration/security.properties configuration/
+ cp -v $PROJECT_HOME/java/target/configuration/mail.properties configuration/
cp -v $PROJECT_HOME/configuration/mongodb.cfg $ACDIR/
cp -v $PROJECT_HOME/java/target/udpmirror $ACDIR/
cp -v $PROJECT_HOME/java/target/http2udpmirror $ACDIR
@@ -772,7 +772,7 @@ if [[ "$@" == "install" ]] || [[ "$@" == "all" ]]; then
if [ ! -f "$ACDIR/env.sh" ]; then
cp -v $PROJECT_HOME/java/target/env.sh $ACDIR/
cp -v $PROJECT_HOME/java/target/configuration/monitoring.properties $ACDIR/configuration/
- cp -v $PROJECT_HOME/java/target/configuration/security.properties $ACDIR/configuration/
+ cp -v $PROJECT_HOME/java/target/configuration/mail.properties $ACDIR/configuration/
cp -v $PROJECT_HOME/java/target/configuration/logging.properties $ACDIR/configuration/
fi
@@ -853,7 +853,7 @@ if [[ "$@" == "remote-deploy" ]]; then
$SCP_CMD $PROJECT_HOME/java/target/configuration/jetty/etc/jetty-deployer.xml $REMOTE_SERVER_LOGIN:$REMOTE_SERVER/configuration/jetty/etc
$SCP_CMD $PROJECT_HOME/java/target/configuration/jetty/etc/realm.properties $REMOTE_SERVER_LOGIN:$REMOTE_SERVER/configuration/jetty/etc
$SCP_CMD $PROJECT_HOME/java/target/configuration/monitoring.properties $REMOTE_SERVER_LOGIN:$REMOTE_SERVER/configuration/
- $SCP_CMD $PROJECT_HOME/java/target/configuration/security.properties $REMOTE_SERVER_LOGIN:$REMOTE_SERVER/configuration/
+ $SCP_CMD $PROJECT_HOME/java/target/configuration/mail.properties $REMOTE_SERVER_LOGIN:$REMOTE_SERVER/configuration/
$SCP_CMD $PROJECT_HOME/java/target/env.sh $REMOTE_SERVER_LOGIN:$REMOTE_SERVER/
$SCP_CMD $PROJECT_HOME/java/target/start $REMOTE_SERVER_LOGIN:$REMOTE_SERVER/
diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/resources/images/compass.png b/java/com.sap.sailing.dashboards.gwt/src/main/resources/com/sap/sailing/dashboards/gwt/client/images/compass.png
similarity index 100%
rename from java/com.sap.sailing.dashboards.gwt/src/main/resources/images/compass.png
rename to java/com.sap.sailing.dashboards.gwt/src/main/resources/com/sap/sailing/dashboards/gwt/client/images/compass.png
diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/resources/images/dashboardicon.png b/java/com.sap.sailing.dashboards.gwt/src/main/resources/com/sap/sailing/dashboards/gwt/client/images/dashboardicon.png
similarity index 100%
rename from java/com.sap.sailing.dashboards.gwt/src/main/resources/images/dashboardicon.png
rename to java/com.sap.sailing.dashboards.gwt/src/main/resources/com/sap/sailing/dashboards/gwt/client/images/dashboardicon.png
diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/resources/images/hourwatch.png b/java/com.sap.sailing.dashboards.gwt/src/main/resources/com/sap/sailing/dashboards/gwt/client/images/hourwatch.png
similarity index 100%
rename from java/com.sap.sailing.dashboards.gwt/src/main/resources/images/hourwatch.png
rename to java/com.sap.sailing.dashboards.gwt/src/main/resources/com/sap/sailing/dashboards/gwt/client/images/hourwatch.png
diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/resources/images/leftarrow.png b/java/com.sap.sailing.dashboards.gwt/src/main/resources/com/sap/sailing/dashboards/gwt/client/images/leftarrow.png
similarity index 100%
rename from java/com.sap.sailing.dashboards.gwt/src/main/resources/images/leftarrow.png
rename to java/com.sap.sailing.dashboards.gwt/src/main/resources/com/sap/sailing/dashboards/gwt/client/images/leftarrow.png
diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/resources/images/leftarrow_disabled.png b/java/com.sap.sailing.dashboards.gwt/src/main/resources/com/sap/sailing/dashboards/gwt/client/images/leftarrow_disabled.png
similarity index 100%
rename from java/com.sap.sailing.dashboards.gwt/src/main/resources/images/leftarrow_disabled.png
rename to java/com.sap.sailing.dashboards.gwt/src/main/resources/com/sap/sailing/dashboards/gwt/client/images/leftarrow_disabled.png
diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/resources/images/logo_sap.png b/java/com.sap.sailing.dashboards.gwt/src/main/resources/com/sap/sailing/dashboards/gwt/client/images/logo_sap.png
similarity index 100%
rename from java/com.sap.sailing.dashboards.gwt/src/main/resources/images/logo_sap.png
rename to java/com.sap.sailing.dashboards.gwt/src/main/resources/com/sap/sailing/dashboards/gwt/client/images/logo_sap.png
diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/resources/images/logoess.png b/java/com.sap.sailing.dashboards.gwt/src/main/resources/com/sap/sailing/dashboards/gwt/client/images/logoess.png
similarity index 100%
rename from java/com.sap.sailing.dashboards.gwt/src/main/resources/images/logoess.png
rename to java/com.sap.sailing.dashboards.gwt/src/main/resources/com/sap/sailing/dashboards/gwt/client/images/logoess.png
diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/resources/images/nointernet.png b/java/com.sap.sailing.dashboards.gwt/src/main/resources/com/sap/sailing/dashboards/gwt/client/images/nointernet.png
similarity index 100%
rename from java/com.sap.sailing.dashboards.gwt/src/main/resources/images/nointernet.png
rename to java/com.sap.sailing.dashboards.gwt/src/main/resources/com/sap/sailing/dashboards/gwt/client/images/nointernet.png
diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/resources/images/rightarrow.png b/java/com.sap.sailing.dashboards.gwt/src/main/resources/com/sap/sailing/dashboards/gwt/client/images/rightarrow.png
similarity index 100%
rename from java/com.sap.sailing.dashboards.gwt/src/main/resources/images/rightarrow.png
rename to java/com.sap.sailing.dashboards.gwt/src/main/resources/com/sap/sailing/dashboards/gwt/client/images/rightarrow.png
diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/resources/images/rightarrow_disabled.png b/java/com.sap.sailing.dashboards.gwt/src/main/resources/com/sap/sailing/dashboards/gwt/client/images/rightarrow_disabled.png
similarity index 100%
rename from java/com.sap.sailing.dashboards.gwt/src/main/resources/images/rightarrow_disabled.png
rename to java/com.sap.sailing.dashboards.gwt/src/main/resources/com/sap/sailing/dashboards/gwt/client/images/rightarrow_disabled.png
diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/resources/images/settings.png b/java/com.sap.sailing.dashboards.gwt/src/main/resources/com/sap/sailing/dashboards/gwt/client/images/settings.png
similarity index 100%
rename from java/com.sap.sailing.dashboards.gwt/src/main/resources/images/settings.png
rename to java/com.sap.sailing.dashboards.gwt/src/main/resources/com/sap/sailing/dashboards/gwt/client/images/settings.png
diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/resources/images/watch.png b/java/com.sap.sailing.dashboards.gwt/src/main/resources/com/sap/sailing/dashboards/gwt/client/images/watch.png
similarity index 100%
rename from java/com.sap.sailing.dashboards.gwt/src/main/resources/images/watch.png
rename to java/com.sap.sailing.dashboards.gwt/src/main/resources/com/sap/sailing/dashboards/gwt/client/images/watch.png
diff --git a/java/com.sap.sailing.dashboards.gwt/src/main/resources/images/windarrow.png b/java/com.sap.sailing.dashboards.gwt/src/main/resources/com/sap/sailing/dashboards/gwt/client/images/windarrow.png
similarity index 100%
rename from java/com.sap.sailing.dashboards.gwt/src/main/resources/images/windarrow.png
rename to java/com.sap.sailing.dashboards.gwt/src/main/resources/com/sap/sailing/dashboards/gwt/client/images/windarrow.png
diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/CompetitorDTO.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/CompetitorDTO.java
index 7691619ac39..e6e2d7c78ca 100755
--- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/CompetitorDTO.java
+++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/CompetitorDTO.java
@@ -22,6 +22,10 @@ public interface CompetitorDTO extends Serializable, MappableToDevice {
String getName();
Color getColor();
+
+ String getEmail();
+
+ boolean hasEmail();
/**
* A regular instance will simply return this object. A compacted version may compute the result by looking it up
diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/CompetitorDTOImpl.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/CompetitorDTOImpl.java
index 96d77c6614a..6c0cee85da9 100755
--- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/CompetitorDTOImpl.java
+++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/CompetitorDTOImpl.java
@@ -19,16 +19,18 @@ public class CompetitorDTOImpl extends NamedDTO implements CompetitorDTO, Serial
private String twoLetterIsoCountryCode;
private String threeLetterIocCountryCode;
private Color color;
+ private String email;
private String sailID;
private String idAsString;
private BoatClassDTO boatClass;
public CompetitorDTOImpl() {}
- public CompetitorDTOImpl(String name, Color color, String twoLetterIsoCountryCode, String threeLetterIocCountryCode,
+ public CompetitorDTOImpl(String name, Color color, String email, String twoLetterIsoCountryCode, String threeLetterIocCountryCode,
String countryName, String sailID, String idAsString, BoatClassDTO boatClass) {
super(name);
this.color = color;
+ this.email = email;
this.twoLetterIsoCountryCode = twoLetterIsoCountryCode;
this.threeLetterIocCountryCode = threeLetterIocCountryCode;
this.countryName = countryName;
@@ -45,6 +47,7 @@ public class CompetitorDTOImpl extends NamedDTO implements CompetitorDTO, Serial
result = prime * result + ((idAsString == null) ? 0 : idAsString.hashCode());
result = prime * result + ((sailID == null) ? 0 : sailID.hashCode());
result = prime * result + ((color == null) ? 0 : color.hashCode());
+ result = prime * result + ((email == null) ? 0 : email.hashCode());
result = prime * result + ((threeLetterIocCountryCode == null) ? 0 : threeLetterIocCountryCode.hashCode());
return result;
}
@@ -83,6 +86,11 @@ public class CompetitorDTOImpl extends NamedDTO implements CompetitorDTO, Serial
return false;
} else if (!color.equals(other.color))
return false;
+ if (email == null) {
+ if (other.email != null)
+ return false;
+ } else if (!email.equals(other.email))
+ return false;
return true;
}
@@ -124,4 +132,17 @@ public class CompetitorDTOImpl extends NamedDTO implements CompetitorDTO, Serial
public Color getColor() {
return color;
}
+
+ public String getEmail() {
+ return email;
+ }
+
+ public String email(){
+ return email;
+ }
+
+ @Override
+ public boolean hasEmail() {
+ return email != null && !email.isEmpty();
+ }
}
diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/PreviousCompetitorDTOImpl.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/PreviousCompetitorDTOImpl.java
index 0cee29c1a92..77ae9538d86 100755
--- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/PreviousCompetitorDTOImpl.java
+++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/PreviousCompetitorDTOImpl.java
@@ -92,9 +92,20 @@ public class PreviousCompetitorDTOImpl implements CompetitorDTO {
throw new RuntimeException("Internal error. Objects of type "+PreviousCompetitorDTOImpl.class.getName()+
" need to be replaced by an object of "+CompetitorDTOImpl.class.getName()+" after deserialization");
}
+
+ @Override
+ public String getEmail() {
+ throw new RuntimeException("Internal error. Objects of type "+PreviousCompetitorDTOImpl.class.getName()+
+ " need to be replaced by an object of "+CompetitorDTOImpl.class.getName()+" after deserialization");
+ }
@Override
public CompetitorDTO getCompetitorFromPrevious(LeaderboardDTO previousVersion) {
return previousVersion.competitors.get(indexInPreviousCompetitorList);
}
+
+ @Override
+ public boolean hasEmail() {
+ return false;
+ }
}
\ No newline at end of file
diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/tracking/DeviceMappingConstants.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/tracking/DeviceMappingConstants.java
index affb0ce5572..5e468744ffb 100644
--- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/tracking/DeviceMappingConstants.java
+++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/tracking/DeviceMappingConstants.java
@@ -1,5 +1,8 @@
package com.sap.sailing.domain.common.racelog.tracking;
+import com.sap.sailing.domain.common.racelog.RaceLogServletConstants;
+import com.sap.sse.common.util.UrlHelper;
+
/**
* Shared between GWT and Android. Used for creating and deciphering the URL encoded by the QRCode, which gives the
* tracking app all necessary information for creating the device mapping of either the race or leaderboard/regatta.
@@ -13,28 +16,50 @@ package com.sap.sailing.domain.common.racelog.tracking;
*
* @author Fredrik Teschke
*/
-public interface DeviceMappingConstants {
+public class DeviceMappingConstants {
// According to the HTTP protocol definition (http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.2.3), only
// schema and host are case insensitive.
// But to adhere to best practices, and due to the deficiencies of some web servers and clients,
// all URL components should be treated as case insensitive, preferring _underscores_ to CamelCase.
- static final String URL_BASE = "/tracking/checkin";
- static final String URL_EVENT_ID = "event_id";
- static final String URL_LEADERBOARD_NAME = "leaderboard_name";
- static final String URL_COMPETITOR_ID_AS_STRING = "competitor_id";
- static final String URL_MARK_ID_AS_STRING = "mark_id";
- static final String URL_FROM_MILLIS = "from_millis";
- static final String URL_TO_MILLIS = "to_millis";
+ public static final String URL_BASE = "/tracking/checkin";
+ public static final String URL_EVENT_ID = "event_id";
+ public static final String URL_LEADERBOARD_NAME = "leaderboard_name";
+ public static final String URL_COMPETITOR_ID_AS_STRING = "competitor_id";
+ public static final String URL_MARK_ID_AS_STRING = "mark_id";
+ public static final String URL_FROM_MILLIS = "from_millis";
+ public static final String URL_TO_MILLIS = "to_millis";
- static final String JSON_COMPETITOR_ID_AS_STRING = "competitorId";
- static final String JSON_MARK_ID_AS_STRING = "markId";
- static final String JSON_DEVICE_UUID = "deviceUuid";
- static final String JSON_DEVICE_TYPE = "deviceType";
- static final String JSON_PUSH_DEVICE_ID = "pushDeviceId";
- static final String JSON_FROM_MILLIS = "fromMillis";
- static final String JSON_TO_MILLIS = "toMillis";
- static final String JSON_TEAM_IMAGE_URI = "teamImageUri";
+ public static final String JSON_COMPETITOR_ID_AS_STRING = "competitorId";
+ public static final String JSON_MARK_ID_AS_STRING = "markId";
+ public static final String JSON_DEVICE_UUID = "deviceUuid";
+ public static final String JSON_DEVICE_TYPE = "deviceType";
+ public static final String JSON_PUSH_DEVICE_ID = "pushDeviceId";
+ public static final String JSON_FROM_MILLIS = "fromMillis";
+ public static final String JSON_TO_MILLIS = "toMillis";
+ public static final String JSON_TEAM_IMAGE_URI = "teamImageUri";
@Deprecated
static final String APK_PATH = "/apps/com.sap.sailing.android.tracking.app.apk";
+
+ public static String getDeviceMappingForRegattaLogUrl(String serverUrlWithoutTrailingSlash, String eventId,
+ String leaderboardName, String mappedItemType, String mappedItemId, UrlHelper helper) {
+ return helper.encodeUrl(serverUrlWithoutTrailingSlash + URL_BASE + "?" + URL_EVENT_ID + "=" + eventId + "&"
+ + URL_LEADERBOARD_NAME + "=" + leaderboardName + "&" + mappedItemType + "="
+ + mappedItemId);
+ }
+
+ @Deprecated
+ public static String getDeviceMappingForRaceLogUrl(String serverUrlWithoutTrailingSlash, String leaderboardName,
+ String raceColumnName, String fleetName, String mappedItemType, String mappedItemId, long fromMillis,
+ long toMillis, UrlHelper helper) throws QRCodeURLCreationException {
+ if (fromMillis > toMillis) {
+ throw new QRCodeURLCreationException("from can't lie after to");
+ }
+ return helper.encodeUrl(serverUrlWithoutTrailingSlash + DeviceMappingConstants.APK_PATH + "?"
+ + RaceLogServletConstants.PARAMS_LEADERBOARD_NAME + "=" + leaderboardName + "&"
+ + RaceLogServletConstants.PARAMS_RACE_COLUMN_NAME + "=" + raceColumnName + "&"
+ + RaceLogServletConstants.PARAMS_RACE_FLEET_NAME + "=" + fleetName + "&" + mappedItemType + "="
+ + mappedItemId + "&" + DeviceMappingConstants.URL_FROM_MILLIS + "=" + fromMillis + "&"
+ + DeviceMappingConstants.URL_TO_MILLIS + "=" + toMillis);
+ }
}
diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/tracking/QRCodeURLCreationException.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/tracking/QRCodeURLCreationException.java
new file mode 100644
index 00000000000..aa2e0847644
--- /dev/null
+++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/racelog/tracking/QRCodeURLCreationException.java
@@ -0,0 +1,9 @@
+package com.sap.sailing.domain.common.racelog.tracking;
+
+public class QRCodeURLCreationException extends Exception {
+ private static final long serialVersionUID = -8243995470804772458L;
+
+ public QRCodeURLCreationException(String message) {
+ super(message);
+ }
+}
diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java
index e15e16f2a28..e6cb2e8c28c 100644
--- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java
+++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/AbstractGPSFixStoreTest.java
@@ -40,7 +40,7 @@ public class AbstractGPSFixStoreTest {
protected final DeviceIdentifier device = new SmartphoneImeiIdentifier("a");
protected RaceLog raceLog;
protected GPSFixStore store;
- protected final Competitor comp = DomainFactory.INSTANCE.getOrCreateCompetitor("comp", "comp", null, null, null);
+ protected final Competitor comp = DomainFactory.INSTANCE.getOrCreateCompetitor("comp", "comp", null, null, null, null);
protected final Mark mark = DomainFactory.INSTANCE.getOrCreateMark("mark");
private final AbstractLogEventAuthor author = new LogEventAuthorImpl("author", 0);
diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java
index bff12901d90..f124610bc27 100644
--- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java
+++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/CreateAndTrackWithRaceLogTest.java
@@ -168,7 +168,7 @@ public class CreateAndTrackWithRaceLogTest {
assertFalse(raceLog.isEmpty());
// add a mapping and one fix in, one out of mapping
- Competitor comp1 = DomainFactory.INSTANCE.getOrCreateCompetitor("comp1", "comp1", null, null, null);
+ Competitor comp1 = DomainFactory.INSTANCE.getOrCreateCompetitor("comp1", "comp1", null, null, null, null);
DeviceIdentifier dev1 = new SmartphoneImeiIdentifier("dev1");
raceLog.add(factory.createDeviceCompetitorMappingEvent(t(), author, dev1, comp1, 0, t(0), t(10)));
addFixes0(dev1);
@@ -202,7 +202,7 @@ public class CreateAndTrackWithRaceLogTest {
adapter.denoteRaceForRaceLogTracking(service, leaderboard, column, fleet, "race");
// add a mapping and one fix in, one out of mapping
- Competitor comp1 = DomainFactory.INSTANCE.getOrCreateCompetitor("comp1", "comp1", null, null, null);
+ Competitor comp1 = DomainFactory.INSTANCE.getOrCreateCompetitor("comp1", "comp1", null, null, null, null);
DeviceIdentifier dev1 = new SmartphoneImeiIdentifier("dev1");
regattaLog.add(new RegattaLogDeviceCompetitorMappingEventImpl(t(), author, t(), UUID.randomUUID(), comp1, dev1,
t(0), t(10)));
diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java
index 0647e02d62a..e4c276dd8ce 100644
--- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java
+++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/TrackedRaceLoadsFixesTest.java
@@ -49,7 +49,7 @@ public class TrackedRaceLoadsFixesTest extends AbstractGPSFixStoreTest {
@Test
public void areFixesStoredInDb() throws TransformationException, NoCorrespondingServiceRegisteredException,
InterruptedException {
- Competitor comp2 = DomainFactory.INSTANCE.getOrCreateCompetitor("comp2", "comp2", null, null, null);
+ Competitor comp2 = DomainFactory.INSTANCE.getOrCreateCompetitor("comp2", "comp2", null, null, null, null);
Mark mark2 = DomainFactory.INSTANCE.getOrCreateMark("mark2");
DeviceIdentifier device2 = new SmartphoneImeiIdentifier("imei2");
DeviceIdentifier device3 = new SmartphoneImeiIdentifier("imei3");
diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/.classpath b/java/com.sap.sailing.domain.racelogtrackingadapter/.classpath
index 4f83b2397ec..03c4ce9fdd8 100644
--- a/java/com.sap.sailing.domain.racelogtrackingadapter/.classpath
+++ b/java/com.sap.sailing.domain.racelogtrackingadapter/.classpath
@@ -2,6 +2,7 @@
+
diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/.settings/org.eclipse.core.resources.prefs b/java/com.sap.sailing.domain.racelogtrackingadapter/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 00000000000..1b6fd8593f0
--- /dev/null
+++ b/java/com.sap.sailing.domain.racelogtrackingadapter/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding//resources/stringmessages/TrackingStringMessages_de.properties=UTF-8
diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/META-INF/MANIFEST.MF b/java/com.sap.sailing.domain.racelogtrackingadapter/META-INF/MANIFEST.MF
index b16960adcc4..5133df9643f 100644
--- a/java/com.sap.sailing.domain.racelogtrackingadapter/META-INF/MANIFEST.MF
+++ b/java/com.sap.sailing.domain.racelogtrackingadapter/META-INF/MANIFEST.MF
@@ -17,8 +17,13 @@ Require-Bundle: com.sap.sailing.domain,
com.sap.sse.common,
com.sap.sse.replication,
com.sap.sse,
- com.sap.sailing.server.gateway.serialization.shared.android
-Import-Package: com.mongodb,
+ com.sap.sailing.server.gateway.serialization.shared.android,
+ com.sap.sse.mail
+Import-Package: com.google.zxing;version="3.1.0",
+ com.mongodb,
+ javax.mail;version="1.4.0",
+ javax.mail.internet;version="1.4.0",
+ javax.mail.util;version="1.4.0",
javax.servlet;version="2.6.0",
org.json.simple,
org.json.simple.parser,
diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/build.properties b/java/com.sap.sailing.domain.racelogtrackingadapter/build.properties
index 34d2e4d2dad..f11210d3f2c 100644
--- a/java/com.sap.sailing.domain.racelogtrackingadapter/build.properties
+++ b/java/com.sap.sailing.domain.racelogtrackingadapter/build.properties
@@ -1,4 +1,5 @@
-source.. = src/
+source.. = src/,\
+ resources/
output.. = bin/
bin.includes = META-INF/,\
.
diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/resources/stringmessages/TrackingStringMessages_de.properties b/java/com.sap.sailing.domain.racelogtrackingadapter/resources/stringmessages/TrackingStringMessages_de.properties
new file mode 100644
index 00000000000..21a7ad3191e
--- /dev/null
+++ b/java/com.sap.sailing.domain.racelogtrackingadapter/resources/stringmessages/TrackingStringMessages_de.properties
@@ -0,0 +1,4 @@
+trackingInvitationFor=Einladung zum Tracken für
+scanQRCodeOrVisitUrlToRegisterAs=Scanne den QRCode oder klicke den Link mit deinem Smartphone an um dich zu registrieren als
+welcomeTo=Willkommen zu
+alternativelyVisitThisLink=Alternativ kannst du diesen Link anklicken
\ No newline at end of file
diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/resources/stringmessages/TrackingStringMessages_en.properties b/java/com.sap.sailing.domain.racelogtrackingadapter/resources/stringmessages/TrackingStringMessages_en.properties
new file mode 100644
index 00000000000..4edebbdcda5
--- /dev/null
+++ b/java/com.sap.sailing.domain.racelogtrackingadapter/resources/stringmessages/TrackingStringMessages_en.properties
@@ -0,0 +1,4 @@
+trackingInvitationFor=Tracking Invitation for
+scanQRCodeOrVisitUrlToRegisterAs=Scan the following QRCode or click the link using your smartphone to register as
+welcomeTo=Welcome to
+alternativelyVisitThisLink=Alternatively, you can click this Link
\ No newline at end of file
diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java
index 56b300f4aca..b6efc960f89 100644
--- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java
+++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/RaceLogTrackingAdapter.java
@@ -1,5 +1,6 @@
package com.sap.sailing.domain.racelogtracking;
+import java.util.Locale;
import java.util.Set;
import com.sap.sailing.domain.abstractlog.race.RaceLog;
@@ -10,6 +11,7 @@ import com.sap.sailing.domain.abstractlog.race.tracking.RaceLogStartTrackingEven
import com.sap.sailing.domain.abstractlog.regatta.RegattaLog;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.ControlPoint;
+import com.sap.sailing.domain.base.Event;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.RaceColumn;
@@ -24,12 +26,14 @@ import com.sap.sailing.domain.racelogtracking.impl.RaceLogRaceTracker;
import com.sap.sailing.domain.tracking.GPSFix;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.server.RacingEventService;
+import com.sap.sse.common.mail.MailException;
-public interface RaceLogTrackingAdapter {
+public interface RaceLogTrackingAdapter {
/**
- * Performs the necessary steps to ensure that the race is tracked (aka that a {@link TrackedRace}
- * is created from the data in this {@code RaceLog}).
- * The following steps are performed to achieve this:
+ * Performs the necessary steps to ensure that the race is tracked (aka that a {@link TrackedRace} is created from
+ * the data in this {@code RaceLog}).
+ *
+ * The following steps are performed to achieve this:
*
*
Is the racelog denoted for tracking? If not, throw exception.
*
Is a {@link RaceLogRaceTracker} already listening for this racelog? If not, add one.
@@ -38,7 +42,7 @@ public interface RaceLogTrackingAdapter {
*/
void startTracking(RacingEventService service, Leaderboard leaderboard, RaceColumn raceColumn, Fleet fleet)
throws NotDenotedForRaceLogTrackingException, Exception;
-
+
RaceLogTrackingState getRaceLogTrackingState(RacingEventService service, RaceColumn raceColumn, Fleet fleet);
/**
@@ -51,16 +55,15 @@ public interface RaceLogTrackingAdapter {
*
* @throws NotDenotableForRaceLogTrackingException
* Fails, if no {@link RaceLog}, or a non-empty {@link RaceLog}, or one with attached
- * {@link TrackedRace} is found already in place.
- * Also fails, if the {@code leaderboard} is not a {@link RegattaLeaderboard}.
+ * {@link TrackedRace} is found already in place. Also fails, if the {@code leaderboard} is not a
+ * {@link RegattaLeaderboard}.
*/
void denoteRaceForRaceLogTracking(RacingEventService service, Leaderboard leaderboard, RaceColumn raceColumn,
Fleet fleet, String raceName) throws NotDenotableForRaceLogTrackingException;
-
+
/**
- * Revoke the {@link RaceLogDenoteForTrackingEvent}, and if it exists the {@link RaceLogStartTrackingEvent}.
- * This does not affect existing an {@link RaceLogRaceTracker}
- * or {@link TrackedRace} for this {@code RaceLog}.
+ * Revoke the {@link RaceLogDenoteForTrackingEvent}, and if it exists the {@link RaceLogStartTrackingEvent}. This
+ * does not affect existing an {@link RaceLogRaceTracker} or {@link TrackedRace} for this {@code RaceLog}.
*/
void removeDenotationForRaceLogTracking(RacingEventService service, RaceLog raceLog);
@@ -71,30 +74,35 @@ public interface RaceLogTrackingAdapter {
*/
void denoteAllRacesForRaceLogTracking(RacingEventService service, Leaderboard leaderboard)
throws NotDenotableForRaceLogTrackingException;
-
+
/**
* Add a fix to the {@link GPSFixStore}, and create a mapping with a virtual device for exactly that timepoint.
*/
void pingMark(RaceLog raceLogToAddTo, Mark mark, GPSFix gpsFix, RacingEventService service);
-
+
/**
- * Duplicate the course and competitor registrations in the newest {@link RaceLogCourseDesignChangedEvent}
- * in {@code from} race log to the {@code to} race logs.
- * The {@link Mark}s and {@link ControlPoint}s are duplicated and not reused. This also inserts the necessary
- * {@link RaceLogDefineMarkEvent}s into the {@code to} race logs.
+ * Duplicate the course and competitor registrations in the newest {@link RaceLogCourseDesignChangedEvent} in
+ * {@code from} race log to the {@code to} race logs. The {@link Mark}s and {@link ControlPoint}s are duplicated and
+ * not reused. This also inserts the necessary {@link RaceLogDefineMarkEvent}s into the {@code to} race logs.
*/
void copyCourseAndCompetitors(RaceLog from, Set to, SharedDomainFactory baseDomainFactory,
RacingEventService service);
-
+
/**
- * If not yet registered, register the competitors in {@code competitors},
- * and unregister all already registered competitors not in {@code competitors}.
+ * If not yet registered, register the competitors in {@code competitors}, and unregister all already registered
+ * competitors not in {@code competitors}.
*/
void registerCompetitors(RacingEventService service, RaceLog raceLog, Set competitors);
-
+
/**
- * If not yet registered, register the competitors in {@code competitors},
- * and unregister all already registered competitors not in {@code competitors}.
+ * If not yet registered, register the competitors in {@code competitors}, and unregister all already registered
+ * competitors not in {@code competitors}.
*/
void registerCompetitors(RacingEventService service, RegattaLog regattaLog, Set competitors);
+
+ /**
+ * Invite competitors for tracking via the Tracking App by sending out emails.
+ */
+ void inviteCompetitorsForTrackingViaEmail(Event event, Leaderboard leaderboard,
+ String serverUrlWithoutTrailingSlash, Set competitors, Locale locale) throws MailException;
}
diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/Activator.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/Activator.java
index c66d80ac9c5..e26a03e2f62 100644
--- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/Activator.java
+++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/Activator.java
@@ -36,6 +36,12 @@ import com.sap.sse.common.TypeBasedServiceFinder;
public class Activator implements BundleActivator {
private static final Logger logger = Logger.getLogger(Activator.class.getName());
+
+ private static BundleContext context;
+
+ public static BundleContext getContext() {
+ return context;
+ }
private Set> registrations = new HashSet<>();
@@ -53,6 +59,8 @@ public class Activator implements BundleActivator {
@Override
public void start(BundleContext context) throws Exception {
+ Activator.context = context;
+
registrations.add(context.registerService(DeviceIdentifierMongoHandler.class, new SmartphoneUUIDMongoHandler(), getDict(SmartphoneUUIDIdentifier.TYPE)));
registrations.add(context.registerService(DeviceIdentifierJsonHandler.class, new SmartphoneUUIDJsonHandler(), getDict(SmartphoneUUIDIdentifier.TYPE)));
registrations.add(context.registerService(DeviceIdentifierStringSerializationHandler.class, new SmartphoneUUIDStringSerializationHandler(), getDict(SmartphoneUUIDIdentifier.TYPE)));
@@ -75,6 +83,8 @@ public class Activator implements BundleActivator {
@Override
public void stop(BundleContext context) throws Exception {
+ Activator.context = null;
+
for (ServiceRegistration> reg : registrations) {
reg.unregister();
}
diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java
index 07317ec94ed..b828c230945 100755
--- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java
+++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java
@@ -1,8 +1,11 @@
package com.sap.sailing.domain.racelogtracking.impl;
+import java.io.IOException;
+import java.io.InputStream;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
@@ -10,6 +13,17 @@ import java.util.function.Function;
import java.util.logging.Level;
import java.util.logging.Logger;
+import javax.activation.DataHandler;
+import javax.activation.DataSource;
+import javax.mail.BodyPart;
+import javax.mail.MessagingException;
+import javax.mail.internet.MimeBodyPart;
+import javax.mail.internet.MimeMultipart;
+import javax.mail.util.ByteArrayDataSource;
+
+import org.osgi.framework.ServiceReference;
+
+import com.google.zxing.WriterException;
import com.sap.sailing.domain.abstractlog.AbstractLog;
import com.sap.sailing.domain.abstractlog.AbstractLogEvent;
import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
@@ -32,6 +46,7 @@ import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.ControlPoint;
import com.sap.sailing.domain.base.CourseBase;
import com.sap.sailing.domain.base.DomainFactory;
+import com.sap.sailing.domain.base.Event;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.RaceColumn;
@@ -42,6 +57,7 @@ import com.sap.sailing.domain.base.impl.CourseDataImpl;
import com.sap.sailing.domain.common.PassingInstruction;
import com.sap.sailing.domain.common.RegattaIdentifier;
import com.sap.sailing.domain.common.abstractlog.NotRevokableException;
+import com.sap.sailing.domain.common.racelog.tracking.DeviceMappingConstants;
import com.sap.sailing.domain.common.racelog.tracking.NotDenotableForRaceLogTrackingException;
import com.sap.sailing.domain.common.racelog.tracking.NotDenotedForRaceLogTrackingException;
import com.sap.sailing.domain.common.racelog.tracking.RaceLogRaceTrackerExistsException;
@@ -61,6 +77,10 @@ import com.sap.sse.common.NoCorrespondingServiceRegisteredException;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.Util;
import com.sap.sse.common.impl.MillisecondsTimePoint;
+import com.sap.sse.common.mail.MailException;
+import com.sap.sse.common.qrcode.QRCodeGenerationUtil;
+import com.sap.sse.mail.MailService;
+import com.sap.sse.util.impl.NonGwtUrlHelper;
public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter {
private static final Logger logger = Logger.getLogger(RaceLogTrackingAdapterImpl.class.getName());
@@ -325,4 +345,66 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter {
c -> new RegattaLogRegisterCompetitorEventImpl(MillisecondsTimePoint.now(), service.getServerAuthor(),
MillisecondsTimePoint.now(), UUID.randomUUID(), c));
}
+
+ private MailService getMailService() {
+ ServiceReference ref = Activator.getContext()
+ .getServiceReference(MailService.class);
+ if (ref == null) {
+ logger.warning("No file storage management service registered");
+ return null;
+ }
+ return Activator.getContext().getService(ref);
+ }
+
+ @Override
+ public void inviteCompetitorsForTrackingViaEmail(Event event, Leaderboard leaderboard,
+ String serverUrlWithoutTrailingSlash, Set competitors, Locale locale) throws MailException {
+ StringBuilder occuredExceptions = new StringBuilder();
+
+ for (Competitor competitor : competitors){
+ final String toAddress = competitor.getEmail();
+ if (toAddress != null) {
+ String leaderboardName = leaderboard.getName();
+ String competitorName = competitor.getName();
+
+ String url = DeviceMappingConstants.getDeviceMappingForRegattaLogUrl(serverUrlWithoutTrailingSlash,
+ event.getId().toString(), leaderboardName, DeviceMappingConstants.URL_COMPETITOR_ID_AS_STRING,
+ competitor.getId().toString(), NonGwtUrlHelper.INSTANCE);
+ String subject = String.format("%s %s",
+ RaceLogTrackingI18n.STRING_MESSAGES.get(locale, "trackingInvitationFor"), competitorName);
+
+ // taken from http://www.tutorialspoint.com/javamail_api/javamail_api_send_inlineimage_in_email.htm
+ BodyPart messageTextPart = new MimeBodyPart();
+ String htmlText = String.format("
%s %s
" + "
%s %s
"
+ + " "
+ + "%s",
+ RaceLogTrackingI18n.STRING_MESSAGES.get(locale, "welcomeTo"), leaderboardName,
+ RaceLogTrackingI18n.STRING_MESSAGES.get(locale, "scanQRCodeOrVisitUrlToRegisterAs"), competitorName,
+ url, url, RaceLogTrackingI18n.STRING_MESSAGES.get(locale, "alternativelyVisitThisLink"));
+
+ try {
+ messageTextPart.setContent(htmlText, "text/html");
+
+ BodyPart messageImagePart = new MimeBodyPart();
+ InputStream imageIs = QRCodeGenerationUtil.create(url, 250);
+ DataSource imageDs = new ByteArrayDataSource(imageIs, "image/png");
+ messageImagePart.setDataHandler(new DataHandler(imageDs));
+ messageImagePart.setHeader("Content-ID", "");
+
+ MimeMultipart multipart = new MimeMultipart();
+ multipart.addBodyPart(messageTextPart);
+ multipart.addBodyPart(messageImagePart);
+
+ getMailService().sendMail(toAddress, subject, multipart);
+ } catch (MessagingException | MailException | WriterException | IOException e) {
+ logger.log(Level.SEVERE, "Error trying to send mail to " + competitor.getName()
+ + " with e-mail address " + toAddress, e);
+ occuredExceptions.append(e.getMessage()+"\r\n");
+ }
+ }
+ }
+ if (!(occuredExceptions.length() == 0)){
+ throw new MailException(occuredExceptions.toString());
+ }
+ }
}
diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingI18n.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingI18n.java
new file mode 100644
index 00000000000..0a3fa3a6876
--- /dev/null
+++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingI18n.java
@@ -0,0 +1,11 @@
+package com.sap.sailing.domain.racelogtracking.impl;
+
+import com.sap.sse.i18n.ResourceBundleStringMessages;
+import com.sap.sse.i18n.impl.ResourceBundleStringMessagesImpl;
+
+public class RaceLogTrackingI18n {
+ private static final String RESOURCE_BASE_NAME = "stringmessages/TrackingStringMessages";
+
+ public static final ResourceBundleStringMessages STRING_MESSAGES = new ResourceBundleStringMessagesImpl(
+ RESOURCE_BASE_NAME, RaceLogTrackingI18n.class.getClassLoader());
+}
diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/MultiLogAnalyzerTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/MultiLogAnalyzerTest.java
index 60dbfaa4d6d..fe618620b4c 100644
--- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/MultiLogAnalyzerTest.java
+++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/analyzing/test/MultiLogAnalyzerTest.java
@@ -52,7 +52,7 @@ public class MultiLogAnalyzerTest {
private AbstractLogEventAuthor author;
private static Competitor createCompetitor(int n) {
- return new CompetitorImpl(n, n + "", null, null, null);
+ return new CompetitorImpl(n, n + "", null, null, null, null);
}
private static DeviceIdentifier createDevice() {
diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/DeviceMappingFinderTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/DeviceMappingFinderTest.java
index b564043ec86..8eb28322665 100644
--- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/DeviceMappingFinderTest.java
+++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/tracking/analyzing/test/DeviceMappingFinderTest.java
@@ -22,8 +22,8 @@ import com.sap.sse.common.TimePoint;
import com.sap.sse.common.impl.MillisecondsTimePoint;
public class DeviceMappingFinderTest extends AbstractRaceLogTrackingTest {
- private final Competitor competitor = new CompetitorImpl("comp", "Comp", null, null, null);
- private final Competitor competitor2 = new CompetitorImpl("comp2", "Comp2", null, null, null);
+ private final Competitor competitor = new CompetitorImpl("comp", "Comp", null, null, null, null);
+ private final Competitor competitor2 = new CompetitorImpl("comp2", "Comp2", null, null, null, null);
private final DeviceIdentifier device = new SmartphoneImeiIdentifier("imei");
private int time = 0;
diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/Competitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/Competitor.java
index fea24c2afea..8d65ec10e49 100644
--- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/Competitor.java
+++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/Competitor.java
@@ -15,6 +15,10 @@ public interface Competitor extends Named, WithID, IsManagedByCache listeners;
+ private String email;
- public CompetitorImpl(Serializable id, String name, Color color, DynamicTeam team, DynamicBoat boat) {
+ public CompetitorImpl(Serializable id, String name, Color color, String email, DynamicTeam team, DynamicBoat boat) {
this.id = id;
this.name = name;
this.team = team;
this.boat = boat;
this.color = color;
+ this.email = email;
this.listeners = new HashSet();
}
@@ -73,7 +75,7 @@ public class CompetitorImpl implements DynamicCompetitor {
@Override
public Competitor resolve(SharedDomainFactory domainFactory) {
- Competitor result = domainFactory.getOrCreateCompetitor(getId(), getName(), getColor(), getTeam(), getBoat());
+ Competitor result = domainFactory.getOrCreateCompetitor(getId(), getName(), getColor(), getEmail(), getTeam(), getBoat());
return result;
}
@@ -114,4 +116,22 @@ public class CompetitorImpl implements DynamicCompetitor {
return new HashSet(listeners);
}
}
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String newEmail) {
+ final String oldEmail = this.email;
+ if (!Util.equalsWithNull(oldEmail, newEmail)) {
+ this.email = newEmail;
+ for (CompetitorChangeListener listener : getListeners()) {
+ listener.emailChanged(oldEmail, newEmail);
+ }
+ }
+ }
+
+ public boolean hasEmail(){
+ return email != null && !email.isEmpty();
+ }
}
diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/DynamicCompetitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/DynamicCompetitor.java
index 768c6f15255..4b6a86578f0 100755
--- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/DynamicCompetitor.java
+++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/DynamicCompetitor.java
@@ -6,7 +6,10 @@ import com.sap.sse.common.Color;
public interface DynamicCompetitor extends Competitor, Renamable {
DynamicBoat getBoat();
+
DynamicTeam getTeam();
-
+
void setColor(Color displayColor);
+
+ void setEmail(String email);
}
diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/SharedDomainFactoryImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/SharedDomainFactoryImpl.java
index 0d6a8cd5f42..3e6a0ecf5d0 100644
--- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/SharedDomainFactoryImpl.java
+++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/SharedDomainFactoryImpl.java
@@ -332,11 +332,11 @@ public class SharedDomainFactoryImpl implements SharedDomainFactory {
}
@Override
- public Competitor getOrCreateCompetitor(Serializable competitorId, String name, Color displayColor, DynamicTeam team, DynamicBoat boat) {
+ public Competitor getOrCreateCompetitor(Serializable competitorId, String name, Color displayColor, String email, DynamicTeam team, DynamicBoat boat) {
if (logger.isLoggable(Level.FINEST)) {
logger.log(Level.FINEST, "getting or creating competitor "+name+" with ID "+competitorId+" in domain factory "+this);
}
- return getCompetitorStore().getOrCreateCompetitor(competitorId, name, displayColor, team, boat);
+ return getCompetitorStore().getOrCreateCompetitor(competitorId, name, displayColor, email, team, boat);
}
@Override
diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TransientCompetitorStoreImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TransientCompetitorStoreImpl.java
index 16051ae3835..7c9f8395f45 100755
--- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TransientCompetitorStoreImpl.java
+++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/TransientCompetitorStoreImpl.java
@@ -68,8 +68,8 @@ public class TransientCompetitorStoreImpl implements CompetitorStore, Serializab
listeners.remove(listener);
}
- private Competitor createCompetitor(Serializable id, String name, Color displayColor, DynamicTeam team, DynamicBoat boat) {
- Competitor result = new CompetitorImpl(id, name, displayColor, team, boat);
+ private Competitor createCompetitor(Serializable id, String name, Color displayColor, String email, DynamicTeam team, DynamicBoat boat) {
+ Competitor result = new CompetitorImpl(id, name, displayColor, email, team, boat);
addNewCompetitor(id, result);
if (logger.isLoggable(Level.FINEST)) {
logger.log(Level.FINEST, "Created competitor "+name+" with ID "+id, new Exception("Here is where it happened"));
@@ -93,20 +93,20 @@ public class TransientCompetitorStoreImpl implements CompetitorStore, Serializab
}
@Override
- public Competitor getOrCreateCompetitor(Serializable competitorId, String name, Color displayColor, DynamicTeam team, DynamicBoat boat) {
+ public Competitor getOrCreateCompetitor(Serializable competitorId, String name, Color displayColor, String email, DynamicTeam team, DynamicBoat boat) {
Competitor result = getExistingCompetitorById(competitorId); // avoid synchronization for successful read access
if (result == null) {
LockUtil.lockForWrite(lock);
try {
result = getExistingCompetitorById(competitorId); // try again, now while holding the write lock
if (result == null) {
- result = createCompetitor(competitorId, name, displayColor, team, boat);
+ result = createCompetitor(competitorId, name, displayColor, email, team, boat);
}
} finally {
LockUtil.unlockAfterWrite(lock);
}
} else if (isCompetitorToUpdateDuringGetOrCreate(result)) {
- updateCompetitor(result.getId().toString(), name, displayColor, boat.getSailID(), team.getNationality(),
+ updateCompetitor(result.getId().toString(), name, displayColor, email, boat.getSailID(), team.getNationality(),
team.getImage());
competitorNoLongerToUpdateDuringGetOrCreate(result);
}
@@ -191,7 +191,7 @@ public class TransientCompetitorStoreImpl implements CompetitorStore, Serializab
}
@Override
- public Competitor updateCompetitor(String idAsString, String newName, Color newDisplayColor, String newSailId,
+ public Competitor updateCompetitor(String idAsString, String newName, Color newDisplayColor, String newEmail, String newSailId,
Nationality newNationality, URI newTeamImageUri) {
DynamicCompetitor competitor = (DynamicCompetitor) getExistingCompetitorByIdAsString(idAsString);
if (competitor != null) {
@@ -199,6 +199,7 @@ public class TransientCompetitorStoreImpl implements CompetitorStore, Serializab
try {
competitor.setName(newName);
competitor.setColor(newDisplayColor);
+ competitor.setEmail(newEmail);
competitor.getBoat().setSailId(newSailId);
competitor.getTeam().setNationality(newNationality);
competitor.getTeam().setImage(newTeamImageUri);
@@ -229,7 +230,7 @@ public class TransientCompetitorStoreImpl implements CompetitorStore, Serializab
if (competitorDTO == null) {
final Nationality nationality = c.getTeam().getNationality();
CountryCode countryCode = nationality == null ? null : nationality.getCountryCode();
- competitorDTO = new CompetitorDTOImpl(c.getName(), c.getColor(), countryCode == null ? ""
+ competitorDTO = new CompetitorDTOImpl(c.getName(), c.getColor(), c.getEmail(), countryCode == null ? ""
: countryCode.getTwoLetterISOCode(), countryCode == null ? ""
: countryCode.getThreeLetterIOCCode(), countryCode == null ? "" : countryCode.getName(), c
.getBoat().getSailID(), c.getId().toString(), new BoatClassDTO(c.getBoat().getBoatClass()
diff --git a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/DomainFactoryImpl.java b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/DomainFactoryImpl.java
index 7f4d7c96c96..673737f2f5b 100755
--- a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/DomainFactoryImpl.java
+++ b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/DomainFactoryImpl.java
@@ -124,7 +124,7 @@ public class DomainFactoryImpl implements DomainFactory {
teamMembers.add(person);
}
DynamicTeam team = new TeamImpl(competitor.getName(), teamMembers, /* coach */ null);
- result = competitorStore.getOrCreateCompetitor(competitor.getID(), competitor.getName(), null /*displayColor*/, team, boat);
+ result = competitorStore.getOrCreateCompetitor(competitor.getID(), competitor.getName(), null /*displayColor*/, null /*email*/, team, boat);
}
return result;
}
@@ -140,7 +140,7 @@ public class DomainFactoryImpl implements DomainFactory {
}
DynamicTeam team = new TeamImpl(competitor.getName(), teamMembers, /* coach */ null);
result = baseDomainFactory.getCompetitorStore().getOrCreateCompetitor(getCompetitorID(competitor.getBoatID(), raceId, boatClass),
- competitor.getName(), null /*displayColor*/, team, boat);
+ competitor.getName(), null /*displayColor*/, null /*email*/, team, boat);
return result;
}
diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/common/test/LeaderboardDTODiffingTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/common/test/LeaderboardDTODiffingTest.java
index dd915231da5..724aac107ce 100755
--- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/common/test/LeaderboardDTODiffingTest.java
+++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/common/test/LeaderboardDTODiffingTest.java
@@ -232,7 +232,7 @@ public class LeaderboardDTODiffingTest {
@Test
public void testCompetitorListChange() {
newVersion.competitors = new ArrayList(newVersion.competitors); // clone competitor list so it's not identical to that of previous version
- CompetitorDTO somebodyNew = new CompetitorDTOImpl("Someone New", Color.RED, "DE", "GER", "Germany", "GER 1234", "912p09871203987",
+ CompetitorDTO somebodyNew = new CompetitorDTOImpl("Someone New", Color.RED, "someone@nobody.de", "DE", "GER", "Germany", "GER 1234", "912p09871203987",
new BoatClassDTO("505", 5.05));
newVersion.competitors.add(13, somebodyNew); // insert a competitor; this should mess up all others' indexes; check if this works
CompetitorDTO wolfgang = getPreviousCompetitorByName("HUNGER +JESS");
@@ -252,7 +252,7 @@ public class LeaderboardDTODiffingTest {
Util.addAll(newVersion.getSuppressedCompetitors(), newSuppressedCompetitors);
newVersion.setSuppressedCompetitors(newSuppressedCompetitors);
newVersion.competitors = new ArrayList(newVersion.competitors); // clone competitor list so it's not identical to that of previous version
- CompetitorDTO somebodyNew = new CompetitorDTOImpl("Someone New", Color.RED, "DE", "GER", "Germany", "GER 1234", "912p09871203987",
+ CompetitorDTO somebodyNew = new CompetitorDTOImpl("Someone New", Color.RED, "someone@nobody.de", "DE", "GER", "Germany", "GER 1234", "912p09871203987",
new BoatClassDTO("505", 5.05));
newVersion.setSuppressed(newVersion.competitors.get(13), true); // suppress an existing competitor; compaction should reduce this to a single number only
newVersion.setSuppressed(somebodyNew, true); // check that mixed mode with existing and new competitors works as well
@@ -274,7 +274,7 @@ public class LeaderboardDTODiffingTest {
@Test
public void testDisplayNameChange() {
newVersion.competitors = new ArrayList(newVersion.competitors); // clone competitor list so it's not identical to that of previous version
- CompetitorDTO somebodyNew = new CompetitorDTOImpl("Someone New", Color.RED, "DE", "GER", "Germany", "GER 1234", "912p09871203987",
+ CompetitorDTO somebodyNew = new CompetitorDTOImpl("Someone New", Color.RED, "someone@nobody.de", "DE", "GER", "Germany", "GER 1234", "912p09871203987",
new BoatClassDTO("505", 5.05));
newVersion.competitors.add(somebodyNew);
newVersion.competitorDisplayNames = new HashMap(newVersion.competitorDisplayNames);
@@ -303,7 +303,7 @@ public class LeaderboardDTODiffingTest {
List newOrdering = new ArrayList(newVersion.getCompetitorsFromBestToWorst(r9));
newVersion.setCompetitorsFromBestToWorst(r9, newOrdering);
newVersion.competitors = new ArrayList(newVersion.competitors); // clone competitor list so it's not identical to that of previous version
- CompetitorDTO somebodyNew = new CompetitorDTOImpl("Someone New", Color.RED, "DE", "GER", "Germany", "GER 1234", "912p09871203987",
+ CompetitorDTO somebodyNew = new CompetitorDTOImpl("Someone New", Color.RED, "someone@nobody.de", "DE", "GER", "Germany", "GER 1234", "912p09871203987",
new BoatClassDTO("505", 5.05));
newVersion.competitors.add(somebodyNew);
newOrdering.add(somebodyNew);
diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/AbstractLeaderboardTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/AbstractLeaderboardTest.java
index 9870f58ac90..65e0817f4ee 100755
--- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/AbstractLeaderboardTest.java
+++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/AbstractLeaderboardTest.java
@@ -15,16 +15,16 @@ import com.sap.sse.common.Color;
public abstract class AbstractLeaderboardTest {
public static CompetitorImpl createCompetitor(String competitorName) {
- return new CompetitorImpl(competitorName, competitorName, Color.RED, 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",
+ return new CompetitorImpl(competitorName, competitorName, Color.RED, null, 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",
new BoatClassImpl("505", /* typicallyStartsUpwind */ true), /* sailID */ null));
}
public static Competitor createCompetitor(String competitorName, CompetitorFactory competitorFactory) {
- return competitorFactory.getOrCreateCompetitor(competitorName, competitorName, Color.RED, new TeamImpl("STG", Collections.singleton(
+ return competitorFactory.getOrCreateCompetitor(competitorName, competitorName, Color.RED, "someone@nobody.de", 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"),
@@ -33,11 +33,11 @@ public abstract class AbstractLeaderboardTest {
}
public static CompetitorImpl createCompetitor(String competitorName, Serializable id) {
- return new CompetitorImpl(id, competitorName, Color.RED, 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",
+ return new CompetitorImpl(id, competitorName, Color.RED, null, 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",
new BoatClassImpl("505", /* typicallyStartsUpwind */ true), /* sailID */ null));
}
}
diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CompetitorListenerTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CompetitorListenerTest.java
index bdef38602ad..ca8acdfaa70 100755
--- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CompetitorListenerTest.java
+++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/CompetitorListenerTest.java
@@ -94,6 +94,11 @@ public class CompetitorListenerTest extends AbstractSerializationTest {
CompetitorListenerTest.this.oldColor = oldColor;
CompetitorListenerTest.this.newColor = newColor;
}
+
+ @Override
+ public void emailChanged(String oldEmail, String newEmail) {
+ //TODO
+ }
};
competitor.addCompetitorChangeListener(listener);
}
diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardCourseChangeTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardCourseChangeTest.java
index c6e4e4711ab..b05c4afee5e 100644
--- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardCourseChangeTest.java
+++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/LeaderboardCourseChangeTest.java
@@ -157,8 +157,8 @@ public class LeaderboardCourseChangeTest {
Set competitors = new HashSet<>();
DynamicBoat mockedBoat = mock(DynamicBoat.class);
when(mockedBoat.getBoatClass()).thenReturn(boatClass);
- competitors.add(new CompetitorImpl(UUID.randomUUID(), "TestCompetitor", Color.BLACK, mock(DynamicTeam.class),
- mockedBoat));
+ competitors.add(new CompetitorImpl(UUID.randomUUID(), "TestCompetitor", Color.BLACK, null,
+ mock(DynamicTeam.class), mockedBoat));
return competitors;
}
diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/OfflineSerializationTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/OfflineSerializationTest.java
index 1e34a56762c..f6d164910e6 100755
--- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/OfflineSerializationTest.java
+++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/OfflineSerializationTest.java
@@ -188,11 +188,11 @@ public class OfflineSerializationTest extends AbstractSerializationTest {
DomainFactory senderDomainFactory = new DomainFactoryImpl();
DomainFactory receiverDomainFactory = new DomainFactoryImpl();
String competitorName = "Tina Maximiliane Lutz";
- Competitor sendersCompetitor1 = new CompetitorImpl(123, competitorName, Color.RED, new TeamImpl("STG", Collections.singleton(
- new PersonImpl(competitorName, senderDomainFactory.getOrCreateNationality("GER"),
- /* dateOfBirth */ null, "This is famous "+competitorName)),
- new PersonImpl("Rigo van Maas", senderDomainFactory.getOrCreateNationality("GER"),
- /* dateOfBirth */null, "This is Rigo, the coach")), new BoatImpl(competitorName + "'s boat",
+ Competitor sendersCompetitor1 = new CompetitorImpl(123, competitorName, Color.RED, null, new TeamImpl("STG", Collections.singleton(
+ new PersonImpl(competitorName, senderDomainFactory.getOrCreateNationality("GER"),
+ /* dateOfBirth */ null, "This is famous "+competitorName)),
+ new PersonImpl("Rigo van Maas", senderDomainFactory.getOrCreateNationality("GER"),
+ /* dateOfBirth */null, "This is Rigo, the coach")), new BoatImpl(competitorName + "'s boat",
senderDomainFactory.getOrCreateBoatClass("470", /* typicallyStartsUpwind */ true), "GER 61"));
Competitor receiversCompetitor1 = cloneBySerialization(sendersCompetitor1, receiverDomainFactory);
Competitor receiversSecondCopyOfCompetitor1 = cloneBySerialization(sendersCompetitor1, receiverDomainFactory);
diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/StoredTrackBasedTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/StoredTrackBasedTest.java
index 9b5bc2dacf6..1ca4fa9f623 100755
--- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/StoredTrackBasedTest.java
+++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/StoredTrackBasedTest.java
@@ -117,7 +117,7 @@ public abstract class StoredTrackBasedTest extends TrackBasedTest {
for (String competitorName : getCompetitorNamesOfStoredTracks(KIELER_WOCHE)) {
DynamicPerson p = new PersonImpl(competitorName, /* nationality */ null, /* dateOfBirth */ null, /* description */ null);
DynamicTeam t = new TeamImpl(competitorName, Collections.singleton(p), /* coach */ null);
- Competitor c = new CompetitorImpl(competitorName, competitorName, Color.RED, t, new BoatImpl(competitorName,
+ Competitor c = new CompetitorImpl(competitorName, competitorName, Color.RED, null, t, new BoatImpl(competitorName,
new BoatClassImpl("505", /* typicallyStartsUpwind */ true), null));
DynamicGPSFixTrack track = readTrack(c, KIELER_WOCHE);
if (track != null) {
diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TackTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TackTest.java
index 414ea94a80f..fc0c6037871 100755
--- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TackTest.java
+++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TackTest.java
@@ -34,11 +34,11 @@ public class TackTest extends StoredTrackBasedTestWithTrackedRace {
@Override
@Before
public void setUp() {
- competitor = new CompetitorImpl(123, "Wolfgang Hunger", Color.RED, new TeamImpl("STG", Collections.singleton(
- new PersonImpl("Wolfgang Hunger", new NationalityImpl("GER"),
- /* dateOfBirth */null, "This is famous Wolfgang Hunger")), new PersonImpl("Rigo van Maas",
- new NationalityImpl("NED"),
- /* dateOfBirth */null, "This is Rigo, the coach")), new BoatImpl("Wolfgang Hunger's boat",
+ competitor = new CompetitorImpl(123, "Wolfgang Hunger", Color.RED, null, new TeamImpl("STG", Collections.singleton(
+ new PersonImpl("Wolfgang Hunger", new NationalityImpl("GER"),
+ /* dateOfBirth */null, "This is famous Wolfgang Hunger")), new PersonImpl("Rigo van Maas",
+ new NationalityImpl("NED"),
+ /* dateOfBirth */null, "This is Rigo, the coach")), new BoatImpl("Wolfgang Hunger's boat",
new BoatClassImpl("505", /* typicallyStartsUpwind */ true), null));
setTrackedRace(createTestTrackedRace("Kieler Woche", "505 Race 2", "505", Collections.singleton(competitor),
new MillisecondsTimePoint(new GregorianCalendar(2011, 05, 23).getTime())));
diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackBasedTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackBasedTest.java
index 99d8ab7bfe9..faeaca23b4e 100755
--- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackBasedTest.java
+++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/TrackBasedTest.java
@@ -60,11 +60,11 @@ public abstract class TrackBasedTest {
}
public static CompetitorImpl createCompetitor(String competitorName) {
- return new CompetitorImpl(UUID.randomUUID(), competitorName, Color.RED, 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",
+ return new CompetitorImpl(UUID.randomUUID(), competitorName, Color.RED, null, 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",
new BoatClassImpl("505", /* typicallyStartsUpwind */true), null));
}
diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/WindTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/WindTest.java
index 73397e43197..64368e6e02e 100755
--- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/WindTest.java
+++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/WindTest.java
@@ -270,11 +270,11 @@ public class WindTest {
Waypoint w1 = domainFactory.createWaypoint(startFinish, /*passingInstruction*/ null);
Waypoint w2 = domainFactory.createWaypoint(top, /*passingInstruction*/ null);
Waypoint w3 = domainFactory.createWaypoint(startFinish, /*passingInstruction*/ null);
- Competitor competitor = new CompetitorImpl(123, "Test Competitor", Color.RED, new TeamImpl("STG", Collections.singleton(
- new PersonImpl("Test Competitor", new NationalityImpl("GER"),
- /* dateOfBirth */null, "This is famous " + "Test Competitor")), new PersonImpl("Rigo van Maas",
- new NationalityImpl("NED"),
- /* dateOfBirth */null, "This is Rigo, the coach")), new BoatImpl("Test Competitor" + "'s boat",
+ Competitor competitor = new CompetitorImpl(123, "Test Competitor", Color.RED, null, new TeamImpl("STG", Collections.singleton(
+ new PersonImpl("Test Competitor", new NationalityImpl("GER"),
+ /* dateOfBirth */null, "This is famous " + "Test Competitor")), new PersonImpl("Rigo van Maas",
+ new NationalityImpl("NED"),
+ /* dateOfBirth */null, "This is Rigo, the coach")), new BoatImpl("Test Competitor" + "'s boat",
new BoatClassImpl("505", /* typicallyStartsUpwind */true), null));
final BoatClass boatClass = domainFactory.getOrCreateBoatClass("ESS40");
DynamicTrackedRace trackedRace = new DynamicTrackedRaceImpl(new DynamicTrackedRegattaImpl(
diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/markpassing/AbstractMockedRaceMarkPassingTest.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/markpassing/AbstractMockedRaceMarkPassingTest.java
index 4e636675bbd..30ce75475d8 100755
--- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/markpassing/AbstractMockedRaceMarkPassingTest.java
+++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/markpassing/AbstractMockedRaceMarkPassingTest.java
@@ -45,9 +45,9 @@ import com.sap.sse.common.Util;
import com.sap.sse.common.impl.MillisecondsTimePoint;
public class AbstractMockedRaceMarkPassingTest {
- protected Competitor bob = new CompetitorImpl("Bob", "Bob", null, null, null);
- protected Competitor joe = new CompetitorImpl("Joe", "Joe", null, null, null);
- protected Competitor mike = new CompetitorImpl("Mike", "Mike", null, null, null);
+ protected Competitor bob = new CompetitorImpl("Bob", "Bob", null, null, null, null);
+ protected Competitor joe = new CompetitorImpl("Joe", "Joe", null, null, null, null);
+ protected Competitor mike = new CompetitorImpl("Mike", "Mike", null, null, null, null);
protected Mark m = new MarkImpl("black");
protected Mark m2 = new MarkImpl("white 1");
diff --git a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java
index c2d57a54820..debb3bdcd57 100755
--- a/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java
+++ b/java/com.sap.sailing.domain.test/src/com/sap/sailing/domain/test/mock/MockedTrackedRace.java
@@ -291,7 +291,7 @@ public class MockedTrackedRace implements DynamicTrackedRace {
}
@Override
- public Iterable getCompetitors() {
+ public Iterable getAllCompetitors() {
return null;
}
diff --git a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java
index 289ecceb33e..650902ae32a 100755
--- a/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java
+++ b/java/com.sap.sailing.domain.tractracadapter/src/com/sap/sailing/domain/tractracadapter/impl/DomainFactoryImpl.java
@@ -259,7 +259,7 @@ public class DomainFactoryImpl implements DomainFactory {
}
DynamicTeam team = getOrCreateTeam(name, nationality, competitorId);
DynamicBoat boat = new BoatImpl(shortName, boatClass, shortName);
- result = competitorStore.getOrCreateCompetitor(competitorId, name, null /*displayColor*/, team, boat);
+ result = competitorStore.getOrCreateCompetitor(competitorId, name, null /*displayColor*/, null /*email*/, team, boat);
}
return result;
}
diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/Regatta.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/Regatta.java
index 1635e492ca4..1dfb3d18d64 100755
--- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/Regatta.java
+++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/Regatta.java
@@ -103,7 +103,7 @@ public interface Regatta extends Named, WithID, IsRegattaLike {
BoatClass getBoatClass();
- Iterable getCompetitors();
+ Iterable getAllCompetitors();
/**
* Will remove the series from this regatta. Will also call {@link RaceColumn#removeRaceIdentifier(Fleet)} to make
diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/DynamicCompetitorStore.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/DynamicCompetitorStore.java
index aafc1d26917..3dffba3a7f5 100755
--- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/DynamicCompetitorStore.java
+++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/DynamicCompetitorStore.java
@@ -10,7 +10,7 @@ public interface DynamicCompetitorStore extends CompetitorStore {
DynamicCompetitor getExistingCompetitorById(Serializable competitorId);
@Override
- DynamicCompetitor getOrCreateCompetitor(Serializable competitorId, String name, Color displayColor, DynamicTeam team, DynamicBoat boat);
+ DynamicCompetitor getOrCreateCompetitor(Serializable competitorId, String name, Color displayColor, String email, DynamicTeam team, DynamicBoat boat);
@Override
Iterable extends DynamicCompetitor> getCompetitors();
diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java
index 2a4244f3444..5170bb3b1b5 100755
--- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java
+++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/RegattaImpl.java
@@ -12,6 +12,7 @@ import java.util.logging.Logger;
import com.sap.sailing.domain.abstractlog.race.RaceLogEvent;
import com.sap.sailing.domain.abstractlog.regatta.RegattaLog;
+import com.sap.sailing.domain.abstractlog.shared.analyzing.RegisteredCompetitorsAnalyzer;
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CourseArea;
@@ -299,13 +300,26 @@ public class RegattaImpl extends NamedImpl implements Regatta, RaceColumnListene
}
@Override
- public Iterable getCompetitors() {
+ public Iterable getAllCompetitors() {
Set result = new HashSet();
for (RaceDefinition race : getAllRaces()) {
for (Competitor c : race.getCompetitors()) {
result.add(c);
}
}
+ for (Series series : getSeries()) {
+ for (RaceColumn rc : series.getRaceColumns()) {
+ for (Fleet fleet : rc.getFleets()) {
+ TrackedRace trackedRace = rc.getTrackedRace(fleet);
+ if (trackedRace != null) {
+ Util.addAll(trackedRace.getRace().getCompetitors(), result);
+ }
+ }
+ }
+ }
+ //consider {@link RegattaLog}
+ Set viaLog = new RegisteredCompetitorsAnalyzer<>(regattaLikeHelper.getRegattaLog()).analyze();
+ result.addAll(viaLog);
return result;
}
diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/Leaderboard.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/Leaderboard.java
index d2f0bcc4713..2f7db478424 100644
--- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/Leaderboard.java
+++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/Leaderboard.java
@@ -88,7 +88,9 @@ public interface Leaderboard extends LeaderboardBase {
* in a regular view of the leaderboard. Editors for leaderboards shall, though, also display the suppressed competitors
* together with a visual indication showing which competitors are currently suppressed. The "suppressed-state" of a
* competitor can change over the life cycle of a leaderboard. A typical use case for suppressing a competitor is
- * removing one-time entries from a series (meta-)leaderboard or suppressing a camera boat in scoring.
+ * removing one-time entries from a series (meta-)leaderboard or suppressing a camera boat in scoring.
+ *
+ * @return all competitors in this leaderboard, including the suppressed ones.
*/
Iterable getAllCompetitors();
diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/LeaderboardCacheManager.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/LeaderboardCacheManager.java
index 481d63b3cc3..6dfe6c5521a 100755
--- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/LeaderboardCacheManager.java
+++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/LeaderboardCacheManager.java
@@ -116,6 +116,11 @@ public class LeaderboardCacheManager {
competitor.removeCompetitorChangeListener(this);
}
}
+
+ @Override
+ public void emailChanged(String oldEmail, String newEmail) {
+ //ignore (email not shown in leaderboard)
+ }
}
diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java
index f68c204399f..1a447be2b5f 100755
--- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java
+++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/AbstractLeaderboardImpl.java
@@ -70,6 +70,10 @@ public abstract class AbstractLeaderboardImpl extends AbstractSimpleLeaderboardI
return Collections.unmodifiableSet(trackedRaces);
}
+ /**
+ * This default implementation collects all competitors by visiting all {@link TrackedRace}s associated with this
+ * leaderboard's columns (see {@link #getTrackedRaces()}).
+ */
@Override
public Iterable getAllCompetitors() {
if (allCompetitorsCache == null) {
diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java
index aee04ead6da..989e468e8b9 100644
--- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java
+++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/FlexibleLeaderboardImpl.java
@@ -6,10 +6,14 @@ import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import java.util.logging.Logger;
import com.sap.sailing.domain.abstractlog.regatta.RegattaLog;
+import com.sap.sailing.domain.abstractlog.shared.analyzing.RegisteredCompetitorsAnalyzer;
+import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CourseArea;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.RaceColumn;
@@ -275,4 +279,16 @@ public class FlexibleLeaderboardImpl extends AbstractLeaderboardImpl implements
public void removeListener(RegattaLikeListener listener) {
regattaLikeHelper.removeListener(listener);
}
+
+ @Override
+ public Iterable getAllCompetitors() {
+ Set result = new HashSet<>();
+ for (Competitor c : super.getAllCompetitors()) {
+ result.add(c);
+ }
+ //consider {@link RegattaLog}
+ Set viaLog = new RegisteredCompetitorsAnalyzer<>(regattaLikeHelper.getRegattaLog()).analyze();
+ result.addAll(viaLog);
+ return result;
+ }
}
diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RegattaLeaderboardImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RegattaLeaderboardImpl.java
index 0301eb7e8a9..a6df854049f 100755
--- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RegattaLeaderboardImpl.java
+++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/impl/RegattaLeaderboardImpl.java
@@ -3,11 +3,14 @@ package com.sap.sailing.domain.leaderboard.impl;
import java.util.ArrayList;
import java.util.List;
+import com.sap.sailing.domain.abstractlog.regatta.RegattaLog;
+import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.CourseArea;
import com.sap.sailing.domain.base.Fleet;
import com.sap.sailing.domain.base.RaceColumn;
import com.sap.sailing.domain.base.RaceColumnInSeries;
import com.sap.sailing.domain.base.RaceColumnListener;
+import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta;
import com.sap.sailing.domain.base.Series;
import com.sap.sailing.domain.base.impl.RaceColumnInSeriesImpl;
@@ -96,6 +99,17 @@ public class RegattaLeaderboardImpl extends AbstractLeaderboardImpl implements R
}
}
+ /**
+ * Delegates to {@link Regatta#getAllCompetitors()} which is expected to deliver all competitors from this
+ * leaderboard's regatta which includes those belonging to {@link RaceDefinition races}
+ * {@link Regatta#getAllRaces() belonging to the regatta} as well as competitors listed on the regatta's
+ * {@link RegattaLog}.
+ */
+ @Override
+ public Iterable getAllCompetitors() {
+ return regatta.getAllCompetitors();
+ }
+
@Override
public IsRegattaLike getRegattaLike() {
return regatta;
diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DummyMarkPassingWithTimePointOnly.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DummyMarkPassingWithTimePointOnly.java
index 41bfb97db8b..a598b10a738 100755
--- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DummyMarkPassingWithTimePointOnly.java
+++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DummyMarkPassingWithTimePointOnly.java
@@ -72,6 +72,16 @@ public class DummyMarkPassingWithTimePointOnly implements MarkPassing {
@Override
public void removeCompetitorChangeListener(CompetitorChangeListener listener) {
}
+
+ @Override
+ public String getEmail() {
+ return null;
+ }
+
+ @Override
+ public boolean hasEmail() {
+ return false;
+ }
};
}
}
diff --git a/java/com.sap.sailing.feature/feature.xml b/java/com.sap.sailing.feature/feature.xml
index b58a6a25057..00b023d577a 100755
--- a/java/com.sap.sailing.feature/feature.xml
+++ b/java/com.sap.sailing.feature/feature.xml
@@ -9,392 +9,392 @@
The SAP Sailing Server.
Provides connectivity to a TracTrac live GPS feed as well as a live feed from an Expedition system.
-Computes leaderboard information for sailing races and offers RESTful APIs to all of this.
-
-
-
- [Enter Copyright Description here.]
-
-
-
- [Enter License Description here.]
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+Computes leaderboard information for sailing races and offers RESTful APIs to all of this.
+
+
+
+ [Enter Copyright Description here.]
+
+
+
+ [Enter License Description here.]
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
diff --git a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java
index a8a8aab3666..15bf4fec23f 100755
--- a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java
+++ b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/MockedTrackedRace.java
@@ -336,7 +336,7 @@ public class MockedTrackedRace implements DynamicTrackedRace {
}
@Override
- public Iterable getCompetitors() {
+ public Iterable getAllCompetitors() {
// TODO Auto-generated method stub
return null;
}
diff --git a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/PolarSheetGenerationServiceTest.java b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/PolarSheetGenerationServiceTest.java
index e9311746a13..f0fc52e1ea1 100755
--- a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/PolarSheetGenerationServiceTest.java
+++ b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/PolarSheetGenerationServiceTest.java
@@ -163,8 +163,8 @@ public class PolarSheetGenerationServiceTest {
waypoints.add(new WaypointImpl(null));
waypoints.add(new WaypointImpl(null));
ArrayList competitors = new ArrayList();
- Competitor competitor = new CompetitorImpl(UUID.randomUUID(), "Hans Frantz", Color.RED, new TeamImpl("SAP", null, null),
- new BoatImpl("Schnelle Forelle", forelle, "GER000"));
+ Competitor competitor = new CompetitorImpl(UUID.randomUUID(), "Hans Frantz", Color.RED, null,
+ new TeamImpl("SAP", null, null), new BoatImpl("Schnelle Forelle", forelle, "GER000"));
competitors.add(competitor);
RaceDefinition race = new RaceDefinitionImpl("Forelle1", new CourseImpl("ForelleCourse", waypoints), forelle, competitors);
return race;
diff --git a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/SailingServiceImplMock.java b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/SailingServiceImplMock.java
index 31bba094c52..7803176ca7c 100755
--- a/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/SailingServiceImplMock.java
+++ b/java/com.sap.sailing.gwt.ui.test/src/com/sap/sailing/gwt/ui/test/SailingServiceImplMock.java
@@ -1,8 +1,5 @@
package com.sap.sailing.gwt.ui.test;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
import java.io.IOException;
import java.net.UnknownHostException;
import java.text.ParseException;
@@ -11,9 +8,6 @@ import java.util.List;
import javax.xml.bind.JAXBException;
-import org.osgi.framework.BundleContext;
-import org.osgi.util.tracker.ServiceTracker;
-
import com.sap.sailing.domain.base.BoatClass;
import com.sap.sailing.domain.base.DomainFactory;
import com.sap.sailing.domain.common.RegattaIdentifier;
@@ -27,7 +21,6 @@ import com.sap.sailing.domain.swisstimingadapter.SwissTimingAdapter;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingAdapterFactory;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingFactory;
import com.sap.sailing.domain.swisstimingreplayadapter.SwissTimingReplayService;
-import com.sap.sailing.domain.swisstimingreplayadapter.SwissTimingReplayServiceFactory;
import com.sap.sailing.domain.tracking.RaceHandle;
import com.sap.sailing.domain.tracking.TrackerManager;
import com.sap.sailing.domain.tractracadapter.TracTracAdapterFactory;
@@ -43,72 +36,37 @@ import com.sap.sse.replication.impl.ReplicationServiceImpl;
public class SailingServiceImplMock extends SailingServiceImpl {
private static final long serialVersionUID = 8564037671550730455L;
- private RacingEventService service;
-
+
+ private final RacingEventService service;
+ private ReplicationService replicationService;
+ private final ScoreCorrectionProvider scoreCorrectionProvider = null;
+ private final TracTracAdapterFactory tracTracAdapterFactory = TracTracAdapterFactory.INSTANCE;
+ private final SwissTimingAdapterFactory swissTimingAdapterFactory;
+ private final SwissTimingReplayService swissTimingReplayService = null;
+ private final RaceLogTrackingAdapterFactory raceLogTrackingAdapterFactory = RaceLogTrackingAdapterFactory.INSTANCE;
+
public SailingServiceImplMock() {
super();
service = new RacingEventServiceImpl(true, new MockSmartphoneImeiServiceFinderFactory());
- }
-
- @Override
- protected ServiceTracker createAndOpenRacingEventServiceTracker(
- BundleContext context) {
- @SuppressWarnings("unchecked")
- ServiceTracker result = mock(ServiceTracker.class);
- when(result.getService()).thenReturn(new RacingEventServiceImpl());
- return result;
- }
-
- @Override
- protected ServiceTracker createAndOpenReplicationServiceTracker(
- BundleContext context) {
- @SuppressWarnings("unchecked")
- ServiceTracker result = mock(ServiceTracker.class);
try {
- final RacingEventService replicable = new RacingEventServiceImpl();
- final ReplicationServiceImpl replicationService =
- new ReplicationServiceImpl("test exchange", "localhost", 0,
- new ReplicationInstancesManager(), new AbstractReplicablesProvider() {
- @Override
- public Iterable> getReplicables() {
- return Collections.>singleton(replicable);
- }
- });
- when(result.getService()).thenReturn(replicationService);
+ replicationService = new ReplicationServiceImpl("test exchange", "localhost", 0,
+ new ReplicationInstancesManager(), new AbstractReplicablesProvider() {
+ @Override
+ public Iterable> getReplicables() {
+ return Collections.> singleton(service);
+ }
+ });
} catch (IOException e) {
- throw new RuntimeException();
+ e.printStackTrace();
}
- return result;
- }
-
- @Override
- protected ServiceTracker createAndOpenScoreCorrectionProviderServiceTracker(
- BundleContext bundleContext) {
- return null;
- }
-
- @Override
- protected ServiceTracker createAndOpenTracTracAdapterTracker(
- BundleContext context) {
- @SuppressWarnings("unchecked")
- ServiceTracker result = mock(ServiceTracker.class);
- when(result.getService()).thenReturn(TracTracAdapterFactory.INSTANCE);
- return result;
- }
-
- @Override
- protected ServiceTracker createAndOpenSwissTimingAdapterTracker(
- BundleContext context) {
- @SuppressWarnings("unchecked")
- ServiceTracker result = mock(ServiceTracker.class);
- when(result.getService()).thenReturn(new SwissTimingAdapterFactory() {
+ swissTimingAdapterFactory = new SwissTimingAdapterFactory() {
@Override
public SwissTimingAdapter getOrCreateSwissTimingAdapter(DomainFactory baseDomainFactory) {
return new SwissTimingAdapter() {
@Override
public List getSwissTimingRaceRecords(
- String hostname, int port) throws InterruptedException,
- UnknownHostException, IOException, ParseException {
+ String hostname, int port) throws InterruptedException, UnknownHostException, IOException,
+ ParseException {
// TODO Auto-generated method stub
return null;
}
@@ -148,45 +106,43 @@ public class SailingServiceImplMock extends SailingServiceImpl {
}
};
}
- });
- return result;
+ };
+ }
+
+ public ScoreCorrectionProvider getScoreCorrectionProvider() {
+ return scoreCorrectionProvider;
}
@Override
- protected ServiceTracker createAndOpenSwissTimingReplayServiceTracker(
- BundleContext context) {
- @SuppressWarnings("unchecked")
- ServiceTracker result = mock(ServiceTracker.class);
- final SwissTimingReplayServiceFactory swissTimingReplayService = new SwissTimingReplayServiceFactory() {
- @Override
- public SwissTimingReplayService createSwissTimingReplayService(
- com.sap.sailing.domain.swisstimingadapter.DomainFactory domainFactory) {
- // TODO Auto-generated method stub
- return null;
- }
- };
- when(result.getService()).thenReturn(swissTimingReplayService);
- return result;
+ protected TracTracAdapterFactory getTracTracAdapterFactory() {
+ return tracTracAdapterFactory;
+ }
+
+ @Override
+ protected SwissTimingAdapterFactory getSwissTimingAdapterFactory() {
+ return swissTimingAdapterFactory;
+ }
+
+ @Override
+ protected SwissTimingReplayService getSwissTimingReplayService() {
+ return swissTimingReplayService;
+ }
+
+ @Override
+ protected RaceLogTrackingAdapterFactory getRaceLogTrackingAdapterFactory() {
+ return raceLogTrackingAdapterFactory;
}
@Override
- protected ServiceTracker createAndOpenRaceLogTrackingAdapterTracker(
- BundleContext context) {
- @SuppressWarnings("unchecked")
- ServiceTracker result = mock(ServiceTracker.class);
- RaceLogTrackingAdapterFactory factory = RaceLogTrackingAdapterFactory.INSTANCE;
- when(result.getService()).thenReturn(factory);
- return result;
+ protected ReplicationService getReplicationService() {
+ return replicationService;
}
@Override
protected RacingEventService getService() {
- if (service == null) {
- service = new RacingEventServiceImpl();
- }
return service;
}
-
+
public RacingEventService getRacingEventService() {
return getService();
}
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AddDeviceMappingToRaceLogDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AddDeviceMappingToRaceLogDialog.java
index 2d14bf984cd..74aa4170a45 100644
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AddDeviceMappingToRaceLogDialog.java
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AddDeviceMappingToRaceLogDialog.java
@@ -18,11 +18,11 @@ import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
-import com.sap.sailing.domain.common.racelog.RaceLogServletConstants;
import com.sap.sailing.domain.common.racelog.tracking.DeviceMappingConstants;
import com.sap.sailing.domain.common.racelog.tracking.MappableToDevice;
-import com.sap.sailing.gwt.ui.adminconsole.DeviceMappingQRCodeWidget.QRCodeURLCreationException;
+import com.sap.sailing.domain.common.racelog.tracking.QRCodeURLCreationException;
import com.sap.sailing.gwt.ui.adminconsole.ItemToMapToDeviceSelectionPanel.SelectionChangedHandler;
+import com.sap.sailing.gwt.ui.client.GwtUrlHelper;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.BetterDateTimeBox;
@@ -103,7 +103,7 @@ public class AddDeviceMappingToRaceLogDialog extends DataEntryDialog toMillis) {
- throw new QRCodeURLCreationException("from cannt lie after to");
+ throw new QRCodeURLCreationException("from can't lie after to");
}
- return baseUrlWithoutTrailingSlash + DeviceMappingConstants.APK_PATH + "?"
- + RaceLogServletConstants.PARAMS_LEADERBOARD_NAME + "=" + DeviceMappingQRCodeWidget.encode(leaderboardName) + "&"
- + RaceLogServletConstants.PARAMS_RACE_COLUMN_NAME + "=" + DeviceMappingQRCodeWidget.encode(raceColumnName)
- + "&" + RaceLogServletConstants.PARAMS_RACE_FLEET_NAME + "=" + DeviceMappingQRCodeWidget.encode(fleetName)
- + "&" + mappedItemQueryParam + "&" + DeviceMappingConstants.URL_FROM_MILLIS + "=" + fromMillis
- + "&" + DeviceMappingConstants.URL_TO_MILLIS + "=" + toMillis;
+ return DeviceMappingConstants.getDeviceMappingForRaceLogUrl(baseUrlWithoutTrailingSlash,
+ leaderboardName, raceColumnName, fleetName, mappedItemType, mappedItemId, fromMillis, toMillis,
+ GwtUrlHelper.INSTANCE);
}
});
qrWidget.generateQRCode();
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AddDeviceMappingToRegattaLogDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AddDeviceMappingToRegattaLogDialog.java
index 44fcd58eaf1..27602739cd7 100644
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AddDeviceMappingToRegattaLogDialog.java
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AddDeviceMappingToRegattaLogDialog.java
@@ -13,15 +13,16 @@ import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.racelog.tracking.DeviceMappingConstants;
-import com.sap.sailing.gwt.ui.adminconsole.DeviceMappingQRCodeWidget.QRCodeURLCreationException;
+import com.sap.sailing.domain.common.racelog.tracking.QRCodeURLCreationException;
import com.sap.sailing.gwt.ui.adminconsole.ItemToMapToDeviceSelectionPanel.SelectionChangedHandler;
+import com.sap.sailing.gwt.ui.client.GwtUrlHelper;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
-import com.sap.sailing.gwt.ui.common.client.GenericListBox;
-import com.sap.sailing.gwt.ui.common.client.GenericListBox.ValueBuilder;
import com.sap.sailing.gwt.ui.shared.EventDTO;
import com.sap.sailing.gwt.ui.shared.MarkDTO;
import com.sap.sse.gwt.client.ErrorReporter;
+import com.sap.sse.gwt.client.controls.GenericListBox;
+import com.sap.sse.gwt.client.controls.GenericListBox.ValueBuilder;
public class AddDeviceMappingToRegattaLogDialog extends AbstractCancelableDialog {
private DeviceMappingQRCodeWidget qrWidget;
@@ -35,11 +36,11 @@ public class AddDeviceMappingToRegattaLogDialog extends AbstractCancelableDialog
setupUi();
center();
}
-
+
@Override
protected void addMainContent(Panel mainPanel) {
super.addMainContent(mainPanel);
-
+
CaptionPanel inputPanel = new CaptionPanel();
Grid inputGrid = new Grid(1, 2);
inputPanel.add(inputGrid);
@@ -62,13 +63,13 @@ public class AddDeviceMappingToRegattaLogDialog extends AbstractCancelableDialog
public void onSuccess(Collection result) {
events.addItems(result);
}
-
+
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Could not load events: " + caught.getMessage());
}
});
-
+
itemSelectionPanel = new ItemToMapToDeviceSelectionPanel(sailingService, stringMessages, errorReporter,
new SelectionChangedHandler() {
@Override
@@ -85,33 +86,31 @@ public class AddDeviceMappingToRegattaLogDialog extends AbstractCancelableDialog
}
}, null);
- //load table content
+ // load table content
sailingService.getCompetitorRegistrations(leaderboardName, itemSelectionPanel.getSetCompetitorsCallback());
- //TODO marks from RegattaLog also?
+ // TODO marks from RegattaLog also?
qrWidget = new DeviceMappingQRCodeWidget(stringMessages, new DeviceMappingQRCodeWidget.URLFactory() {
@Override
- public String createURL(String baseUrlWithoutTrailingSlash, String mappedItemQueryParam)
+ public String createURL(String baseUrlWithoutTrailingSlash, String mappedItemType, String mappedItemId)
throws QRCodeURLCreationException {
if (events.getValue() == null) {
throw new QRCodeURLCreationException("no event selected");
}
String eventIdAsString = events.getValue().id.toString();
- return baseUrlWithoutTrailingSlash + DeviceMappingConstants.URL_BASE
- + "?" + DeviceMappingConstants.URL_EVENT_ID + "=" + DeviceMappingQRCodeWidget.encode(eventIdAsString)
- + "&" + DeviceMappingConstants.URL_LEADERBOARD_NAME + "=" + DeviceMappingQRCodeWidget.encode(leaderboardName)
- + "&" + mappedItemQueryParam;
+ return DeviceMappingConstants.getDeviceMappingForRegattaLogUrl(baseUrlWithoutTrailingSlash, eventIdAsString,
+ leaderboardName, mappedItemType, mappedItemId, GwtUrlHelper.INSTANCE);
}
});
qrWidget.generateQRCode();
-
+
VerticalPanel leftSidePanel = new VerticalPanel();
leftSidePanel.add(inputPanel);
CaptionPanel qrContentPanel = new CaptionPanel();
leftSidePanel.add(qrContentPanel);
qrContentPanel.add(qrWidget);
-
+
HorizontalPanel panel = new HorizontalPanel();
mainPanel.add(panel);
panel.add(leftSidePanel);
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/BaseQRIdentifierWidget.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/BaseQRIdentifierWidget.java
index 143472a1efe..8f73b604e63 100644
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/BaseQRIdentifierWidget.java
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/BaseQRIdentifierWidget.java
@@ -4,7 +4,6 @@ import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
-import com.google.gwt.http.client.URL;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
@@ -13,7 +12,7 @@ import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
-import com.sap.sailing.gwt.ui.adminconsole.DeviceMappingQRCodeWidget.QRCodeURLCreationException;
+import com.sap.sailing.domain.common.racelog.tracking.QRCodeURLCreationException;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.shared.components.QRCodeComposite;
@@ -91,9 +90,4 @@ public abstract class BaseQRIdentifierWidget implements IsWidget {
protected void setError(String text) {
error.setText(text);
}
-
- public static String encode(String value) {
- //pathSegment instead of queryString, so that ' ' is encoded as '%20'
- return URL.encodePathSegment(value);
- }
}
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorEditDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorEditDialog.java
index f6742beb834..91c37b7bb20 100755
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorEditDialog.java
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorEditDialog.java
@@ -38,6 +38,7 @@ public class CompetitorEditDialog extends DataEntryDialog {
private final TextBox displayColorTextBox;
private final ListBox threeLetterIocCountryCode;
private final TextBox sailId;
+ private final TextBox email;
private final StringMessages stringMessages;
public CompetitorEditDialog(final StringMessages stringMessages, CompetitorDTO competitorToEdit,
@@ -89,6 +90,8 @@ public class CompetitorEditDialog extends DataEntryDialog {
}
this.name = createTextBox(competitorToEdit.getName());
+ this.email = createTextBox(competitorToEdit.getEmail());
+ this.email.getElement().setPropertyString("placeholder", stringMessages.pleaseEnterAnEmail());
this.displayColorTextBox = createTextBox(competitorToEdit.getColor() == null ? "" : competitorToEdit.getColor().getAsHtml());
this.threeLetterIocCountryCode = createListBox(/* isMultipleSelect */ false);
CountryCodeFactory ccf = CountryCodeFactory.INSTANCE;
@@ -170,7 +173,7 @@ public class CompetitorEditDialog extends DataEntryDialog {
}
}
BoatClassDTO boatClass = new BoatClassDTO(boatClassName.getValue(boatClassName.getSelectedIndex()), 0);
- CompetitorDTO result = new CompetitorDTOImpl(name.getText(), color,
+ CompetitorDTO result = new CompetitorDTOImpl(name.getText(), color, email.getText(),
/* twoLetterIsoCountryCode */ null,
threeLetterIocCountryCode.getValue(threeLetterIocCountryCode.getSelectedIndex()),
/* countryName */ null, sailId.getText(), competitorToEdit.getIdAsString(),
@@ -180,7 +183,7 @@ public class CompetitorEditDialog extends DataEntryDialog {
@Override
protected Widget getAdditionalWidget() {
- Grid result = new Grid(5, 2);
+ Grid result = new Grid(6, 2);
result.setWidget(0, 0, new Label(stringMessages.name()));
result.setWidget(0, 1, name);
result.setWidget(1, 0, new Label(stringMessages.sailNumber()));
@@ -189,8 +192,10 @@ public class CompetitorEditDialog extends DataEntryDialog {
result.setWidget(2, 1, threeLetterIocCountryCode);
result.setWidget(3, 0, new Label(stringMessages.color()));
result.setWidget(3, 1, displayColorTextBox);
- result.setWidget(4, 0, new Label(stringMessages.boatClass()));
- result.setWidget(4, 1, boatClassName);
+ result.setWidget(4, 0, new Label(stringMessages.email()));
+ result.setWidget(4, 1, email);
+ result.setWidget(5, 0, new Label(stringMessages.boatClass()));
+ result.setWidget(5, 1, boatClassName);
return result;
}
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorPanel.java
index 4b0dc656446..54f8369f8ad 100755
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorPanel.java
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorPanel.java
@@ -1,18 +1,24 @@
package com.sap.sailing.gwt.ui.adminconsole;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.List;
+import java.util.Set;
import com.google.gwt.cell.client.FieldUpdater;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.i18n.client.LocaleInfo;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
+import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.SimplePanel;
+import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
+import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.MultiSelectionModel;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SelectionChangeEvent.Handler;
@@ -20,8 +26,13 @@ import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTOImpl;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
+import com.sap.sailing.gwt.ui.shared.EventDTO;
import com.sap.sse.common.Util;
+import com.sap.sse.common.Util.Pair;
import com.sap.sse.gwt.client.ErrorReporter;
+import com.sap.sse.gwt.client.controls.GenericListBox;
+import com.sap.sse.gwt.client.controls.GenericListBox.ValueBuilder;
+import com.sap.sse.gwt.client.dialog.DataEntryDialog;
import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback;
/**
@@ -43,8 +54,8 @@ public class CompetitorPanel extends SimplePanel {
this(sailingService, null, stringMessages, errorReporter);
}
- public CompetitorPanel(final SailingServiceAsync sailingService, String leaderboardName, final StringMessages stringMessages,
- final ErrorReporter errorReporter) {
+ public CompetitorPanel(final SailingServiceAsync sailingService, final String leaderboardName,
+ final StringMessages stringMessages, final ErrorReporter errorReporter) {
super();
this.sailingService = sailingService;
this.stringMessages = stringMessages;
@@ -79,16 +90,56 @@ public class CompetitorPanel extends SimplePanel {
buttonPanel.add(allowReloadButton);
Button addCompetitorButton = new Button(stringMessages.add());
addCompetitorButton.addClickHandler(new ClickHandler() {
- @Override
- public void onClick(ClickEvent event) {
- openAddCompetitorDialog();
- }
- });
+ @Override
+ public void onClick(ClickEvent event) {
+ openAddCompetitorDialog();
+ }
+ });
buttonPanel.add(addCompetitorButton);
+
+ Button selectAllButton = new Button(stringMessages.selectAll());
+ selectAllButton.addClickHandler(new ClickHandler() {
+ @Override
+ public void onClick(ClickEvent event) {
+ for (CompetitorDTO c : competitorTable.getDataProvider().getList()) {
+ competitorSelectionModel.setSelected(c, true);
+ }
+ }
+ });
+ buttonPanel.add(selectAllButton);
+
+ //only if this competitor panel is connected to a leaderboard, we want to enable invitations
+ if (leaderboardName != null) {
+ final Button inviteCompetitorsButton = new Button(stringMessages.inviteCompetitors());
+ inviteCompetitorsButton.addClickHandler(new ClickHandler() {
+ @Override
+ public void onClick(ClickEvent event) {
+ Set competitors = competitorSelectionModel.getSelectedSet();
+ boolean emailProvidedForAll = isEmailProvidedForAll(competitors);
+
+ if (emailProvidedForAll) {
+ openChooseEventDialogAndSendMails(competitors);
+ } else {
+ Window.alert(stringMessages.notAllCompetitorsProvideEmail());
+ }
+ }
+
+ private boolean isEmailProvidedForAll(Iterable allCompetitors) {
+ for (CompetitorDTO competitor : allCompetitors) {
+ if (!competitor.hasEmail()) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+ });
+ buttonPanel.add(inviteCompetitorsButton);
+ }
+
competitorsPanel.add(buttonPanel);
-
- //competitor table
+ // competitor table
ImagesBarColumn competitorActionColumn = new ImagesBarColumn(
new CompetitorConfigImagesBarCell(stringMessages));
competitorActionColumn.setFieldUpdater(new FieldUpdater() {
@@ -112,21 +163,24 @@ public class CompetitorPanel extends SimplePanel {
}
});
allowReloadButton.setEnabled(!competitorSelectionModel.getSelectedSet().isEmpty());
-
- if(leaderboardName != null) {
+
+ if (leaderboardName != null) {
refreshCompetitorList();
}
}
-
+
private void allowUpdate(final Iterable competitors) {
List serializableSingletonList = new ArrayList();
Util.addAll(competitors, serializableSingletonList);
sailingService.allowCompetitorResetToDefaults(serializableSingletonList, new AsyncCallback() {
- @Override public void onFailure(Throwable caught) {
- errorReporter.reportError("Error trying to allow resetting competitors "+competitors
- +" to defaults: "+caught.getMessage());
+ @Override
+ public void onFailure(Throwable caught) {
+ errorReporter.reportError("Error trying to allow resetting competitors " + competitors
+ + " to defaults: " + caught.getMessage());
}
- @Override public void onSuccess(Void result) {
+
+ @Override
+ public void onSuccess(Void result) {
Window.alert(stringMessages.successfullyAllowedCompetitorReset(competitors.toString()));
}
});
@@ -143,7 +197,7 @@ public class CompetitorPanel extends SimplePanel {
sailingService.addOrUpdateCompetitor(competitor, new AsyncCallback() {
@Override
public void onFailure(Throwable caught) {
- errorReporter.reportError("Error trying to update competitor: "+caught.getMessage());
+ errorReporter.reportError("Error trying to update competitor: " + caught.getMessage());
}
@Override
@@ -159,6 +213,101 @@ public class CompetitorPanel extends SimplePanel {
}).show();
}
+ private class SelectEventAndHostnameDialog extends DataEntryDialog> {
+ private GenericListBox events;
+ private TextBox serverUrl;
+
+ public SelectEventAndHostnameDialog(DialogCallback> callback) {
+ super(stringMessages.selectEventForInvitation(), null, stringMessages.inviteCompetitors(), stringMessages.cancel(),
+ new Validator>() {
+ @Override
+ public String getErrorMessage(Pair valueToValidate) {
+ if (valueToValidate.getA() == null) {
+ return stringMessages.pleaseSelectAnEvent();
+ } else if (valueToValidate.getB() == null || valueToValidate.getB().isEmpty()) {
+ return stringMessages.pleaseEnterA(stringMessages.hostname());
+ }
+ return null;
+ }
+ }, false, callback);
+ }
+
+ @Override
+ protected Pair getResult() {
+ EventDTO event = events.getValue();
+ String serverUrlString = serverUrl.getValue();
+ if (serverUrlString.endsWith("/")) {
+ serverUrlString = serverUrlString.substring(0, serverUrlString.length() - 1);
+ }
+ return new Pair<>(event, serverUrlString);
+ }
+
+ @Override
+ protected Widget getAdditionalWidget() {
+ Grid grid = new Grid(2, 2);
+ grid.setWidget(0, 0, createLabel(stringMessages.hostname()));
+ serverUrl = createTextBox(Window.Location.getProtocol() + "//" + Window.Location.getHost());
+ grid.setWidget(0, 1, serverUrl);
+
+ grid.setWidget(1, 0, createLabel(stringMessages.event()));
+ events = createGenericListBox(new ValueBuilder() {
+ @Override
+ public String getValue(EventDTO item) {
+ if (item == null) {
+ return "";
+ }
+ return item.getName();
+ }
+ }, false);
+ grid.setWidget(1, 1, events);
+
+ events.addItem((EventDTO) null);
+ sailingService.getEventsForLeaderboard(leaderboardName, new AsyncCallback>() {
+ @Override
+ public void onSuccess(Collection result) {
+ events.addItems(result);
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ errorReporter.reportError("Could not load events: " + caught.getMessage());
+ }
+ });
+ return grid;
+ }
+ }
+
+ private String getLocaleInfo() {
+ return LocaleInfo.getCurrentLocale().getLocaleName();
+ }
+
+ private void openChooseEventDialogAndSendMails(final Set competitors) {
+ new SelectEventAndHostnameDialog(new DialogCallback>() {
+
+ @Override
+ public void ok(Pair result) {
+ sailingService.inviteCompetitorsForTrackingViaEmail(result.getB(), result.getA(), leaderboardName,
+ competitors, getLocaleInfo(), new AsyncCallback() {
+
+ @Override
+ public void onFailure(Throwable caught) {
+ Window.alert(stringMessages.sendingMailsFailed() + caught.getMessage());
+ }
+
+ @Override
+ public void onSuccess(Void result) {
+ Window.alert(stringMessages.sendingMailsSuccessfull());
+ }
+ });
+ }
+
+ @Override
+ public void cancel() {
+
+ }
+ }).show();
+ }
+
public void refreshCompetitorList() {
competitorTable.refreshCompetitorList(leaderboardName);
}
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceMappingQRCodeWidget.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceMappingQRCodeWidget.java
index 4cdc985eac3..20815e78d99 100644
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceMappingQRCodeWidget.java
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/DeviceMappingQRCodeWidget.java
@@ -2,6 +2,7 @@ package com.sap.sailing.gwt.ui.adminconsole;
import com.google.gwt.http.client.URL;
import com.sap.sailing.domain.common.racelog.tracking.DeviceMappingConstants;
+import com.sap.sailing.domain.common.racelog.tracking.QRCodeURLCreationException;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.shared.components.QRCodeComposite;
@@ -13,15 +14,8 @@ public class DeviceMappingQRCodeWidget extends BaseQRIdentifierWidget {
private String mappedItemId;
private String mappedItemType;
- static class QRCodeURLCreationException extends Exception {
- private static final long serialVersionUID = -8243995470804772458L;
- public QRCodeURLCreationException(String message) {
- super(message);
- }
- }
-
static interface URLFactory {
- String createURL(String baseUrlWithoutTrailingSlash, String mappedItemQueryParam)
+ String createURL(String baseUrlWithoutTrailingSlash, String mappedItemType, String mappedItemId)
throws QRCodeURLCreationException;
}
@@ -52,6 +46,6 @@ public class DeviceMappingQRCodeWidget extends BaseQRIdentifierWidget {
throw new QRCodeURLCreationException("No item selected for mapping");
}
- return urlFactory.createURL(serverUrl, mappedItemType + "=" + encode(mappedItemId));
+ return urlFactory.createURL(serverUrl, mappedItemType, mappedItemId);
}
}
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/GwtUrlHelper.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/GwtUrlHelper.java
new file mode 100644
index 00000000000..58c0c4ce99d
--- /dev/null
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/GwtUrlHelper.java
@@ -0,0 +1,22 @@
+package com.sap.sailing.gwt.ui.client;
+
+import com.google.gwt.core.shared.GWT;
+import com.google.gwt.http.client.URL;
+import com.sap.sse.common.util.UrlHelper;
+
+/**
+ * Tycho complains that {@link com.google.gwt} cannot be resolved when placing this in *common projects, where it would ideally
+ * go (then we could also auto-determine if GWT context is present, e.g. through {@link GWT#isClient}).
+ *
+ * @author Fredrik Teschke
+ *
+ */
+public enum GwtUrlHelper implements UrlHelper {
+ INSTANCE;
+
+ @Override
+ public String encodeUrl(String decodedUrlString) {
+ return URL.encode(decodedUrlString);
+ }
+
+}
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java
index 938a6aa1123..a66c90200b5 100755
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingService.java
@@ -87,6 +87,7 @@ import com.sap.sailing.gwt.ui.shared.WindInfoForRaceDTO;
import com.sap.sse.common.NoCorrespondingServiceRegisteredException;
import com.sap.sse.common.Util;
import com.sap.sse.common.Util.Pair;
+import com.sap.sse.common.mail.MailException;
import com.sap.sse.common.search.KeywordQuery;
import com.sap.sse.gwt.client.filestorage.FileStorageManagementGwtService;
@@ -573,4 +574,7 @@ public interface SailingService extends RemoteService, FileStorageManagementGwtS
List getDeviceMappingsFromLogHierarchy(String leaderboardName, String raceColumnName,
String fleetName) throws TransformationException;
+
+ void inviteCompetitorsForTrackingViaEmail(String serverUrlWithoutTrailingSlash, EventDTO event,
+ String leaderboardName, Set competitors, String localeInfo) throws MailException;
}
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java
index 196080e488d..90c914384a3 100755
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/SailingServiceAsync.java
@@ -684,4 +684,8 @@ public interface SailingServiceAsync extends BuildVersionRetriever, FileStorageM
void createRegattaStructure(Iterable regattaNames,
EventDTO newEvent, AsyncCallback asyncCallback);
+ void getActiveFileStorageServiceName(AsyncCallback callback);
+
+ void inviteCompetitorsForTrackingViaEmail(String serverUrlWithoutTrailingSlash, EventDTO event,
+ String leaderboardName, Set competitors, String localeInfo, AsyncCallback callback);
}
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java
index de1844cb017..7c30ad62231 100755
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java
@@ -1142,4 +1142,11 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages {
String scoringSchemeHighPointEssOverallDescription();
String timeBetweenRaceStartAndCompetitorStartInSeconds();
String timeBetweenRaceStartAndCompetitorStartInSecondsTooltip();
+ String email();
+ String pleaseEnterAnEmail();
+ String inviteCompetitors();
+ String notAllCompetitorsProvideEmail();
+ String sendingMailsFailed();
+ String sendingMailsSuccessfull();
+ String selectEventForInvitation();
}
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties
index 5f519f6e1c8..2f7373b6bab 100755
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties
@@ -1122,4 +1122,11 @@ fileStorage=File Storage
active=Active
scoringSchemeHighPointEssOverallDescription=Score in points. Winner of an act scores 10 points, 2nd - 9 points, .... Any tie in the overall Extreme Sailing Series is broken in favour of the competitor with the most Act wins. If that does not break the tie, the result in the last Act will be used.
timeBetweenRaceStartAndCompetitorStartInSeconds=Start delay
-timeBetweenRaceStartAndCompetitorStartInSecondsTooltip=Time between the start of the race and the time the competitor passed the start waypoint. Negative time suggests OCS.
\ No newline at end of file
+timeBetweenRaceStartAndCompetitorStartInSecondsTooltip=Time between the start of the race and the time the competitor passed the start waypoint. Negative time suggests OCS.
+email=E-Mail
+pleaseEnterAnEmail=Please enter an E-Mail.
+inviteCompetitors=Invite competitors
+notAllCompetitorsProvideEmail=Not all competitors provide an E-Mail
+sendingMailsFailed=Sending Mails failed
+sendingMailsSuccessfull=Successfully sent E-Mails
+selectEventForInvitation=Select Event for Invitation
\ No newline at end of file
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties
index e2736b04394..ad69cfd2349 100755
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties
@@ -1112,4 +1112,11 @@ fileStorage=Datei Speicherung
active=Aktiv
scoringSchemeHighPointEssOverallDescription=High Point System, der Gewinner eines Acts erhält 10 Punkte, der Zweite 9 und so weiter.
timeBetweenRaceStartAndCompetitorStartInSeconds=Startverzug
-timeBetweenRaceStartAndCompetitorStartInSecondsTooltip=Zeit seit dem Start der Wettfahrt, nach der der Teilnehmer die Startmarke passiert hat. Negative Werte suggerieren einen Frühstart.
\ No newline at end of file
+timeBetweenRaceStartAndCompetitorStartInSecondsTooltip=Zeit seit dem Start der Wettfahrt, nach der der Teilnehmer die Startmarke passiert hat. Negative Werte suggerieren einen Frühstart.
+email=E-Mail
+pleaseEnterAnEmail=Bitte geben Sie eine E-Mail ein.
+inviteCompetitors=Teilnehmer einladen
+notAllCompetitorsProvideEmail=Nicht alle Teilnehmer haben eine E-Mail angegeben
+sendingMailsFailed=Versenden der E-Mails fehlgeschlagen
+sendingMailsSuccessfull=Versenden der E-Mails war erfolgreich!
+selectEventForInvitation=Event für Einladung auswählen
\ No newline at end of file
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties
index 7bccf80bf6d..2b46014b206 100755
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties
@@ -1061,4 +1061,11 @@ fileStorage=File Storage
active=Active
scoringSchemeHighPointEssOverallDescription=Score in points. Winner of an act scores 10 points, 2nd - 9 points, .... Any tie in the overall Extreme Sailing Series is broken in favour of the competitor with the most Act wins. If that does not break the tie, the result in the last Act will be used.
timeBetweenRaceStartAndCompetitorStartInSeconds=Start delay
-timeBetweenRaceStartAndCompetitorStartInSecondsTooltip=Time between the start of the race and the time the competitor passed the start waypoint. Negative time suggests OCS.
\ No newline at end of file
+timeBetweenRaceStartAndCompetitorStartInSecondsTooltip=Time between the start of the race and the time the competitor passed the start waypoint. Negative time suggests OCS.
+email=эмаль
+pleaseEnterAnEmail=Пожалуйста, введите эмаль
+inviteCompetitors=приглашать Участники
+notAllCompetitorsProvideEmail=Not all competitors provide an E-Mail
+sendingMailsFailed=Sending Mails failed
+sendingMailsSuccessfull=Successfully sent E-Mails
+selectEventForInvitation=Select Event for Invitation
\ No newline at end of file
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java
index 3fc62904e07..efe9616b827 100755
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java
@@ -418,6 +418,7 @@ import com.sap.sse.common.Util.Triple;
import com.sap.sse.common.impl.MillisecondsDurationImpl;
import com.sap.sse.common.impl.MillisecondsTimePoint;
import com.sap.sse.common.impl.TimeRangeImpl;
+import com.sap.sse.common.mail.MailException;
import com.sap.sse.common.search.KeywordQuery;
import com.sap.sse.common.search.Result;
import com.sap.sse.filestorage.FileStorageService;
@@ -431,8 +432,10 @@ import com.sap.sse.replication.ReplicationFactory;
import com.sap.sse.replication.ReplicationMasterDescriptor;
import com.sap.sse.replication.ReplicationService;
import com.sap.sse.replication.impl.ReplicaDescriptor;
+import com.sap.sse.util.ServiceTrackerFactory;
import com.sapsailing.xrr.structureimport.eventimport.RegattaJSON;
+
/**
* The server side implementation of the RPC service.
*/
@@ -496,6 +499,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
private final SwissTimingReplayService swissTimingReplayService;
private final QuickRanksLiveCache quickRanksLiveCache;
+
public SailingServiceImpl() {
BundleContext context = Activator.getDefault();
Activator activator = Activator.getInstance();
@@ -503,21 +507,25 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
activator.setSailingService(this); // register so this service is informed when the bundle shuts down
}
quickRanksLiveCache = new QuickRanksLiveCache(this);
- racingEventServiceTracker = createAndOpenRacingEventServiceTracker(context);
- replicationServiceTracker = createAndOpenReplicationServiceTracker(context);
- resultUrlRegistryServiceTracker = createAndOpenResultUrlRegistryServiceTracker(context);
- swissTimingAdapterTracker = createAndOpenSwissTimingAdapterTracker(context);
- tractracAdapterTracker = createAndOpenTracTracAdapterTracker(context);
- raceLogTrackingAdapterTracker = createAndOpenRaceLogTrackingAdapterTracker(context);
- deviceIdentifierStringSerializationHandlerTracker = createAndOpenDeviceIdentifierStringSerializationHandlerTracker(context);
- igtimiAdapterTracker = createAndOpenIgtimiTracker(context);
+ racingEventServiceTracker = ServiceTrackerFactory.createAndOpen(context, RacingEventService.class);
+ replicationServiceTracker = ServiceTrackerFactory.createAndOpen(context, ReplicationService.class);
+ resultUrlRegistryServiceTracker = ServiceTrackerFactory.createAndOpen(context, ResultUrlRegistry.class);
+ swissTimingAdapterTracker = ServiceTrackerFactory.createAndOpen(context, SwissTimingAdapterFactory.class);
+ tractracAdapterTracker = ServiceTrackerFactory.createAndOpen(context, TracTracAdapterFactory.class);
+ raceLogTrackingAdapterTracker = ServiceTrackerFactory.createAndOpen(context,
+ RaceLogTrackingAdapterFactory.class);
+ deviceIdentifierStringSerializationHandlerTracker = ServiceTrackerFactory.createAndOpen(context,
+ DeviceIdentifierStringSerializationHandler.class);
+ igtimiAdapterTracker = ServiceTrackerFactory.createAndOpen(context, IgtimiConnectionFactory.class);
baseDomainFactory = getService().getBaseDomainFactory();
mongoObjectFactory = getService().getMongoObjectFactory();
domainObjectFactory = getService().getDomainObjectFactory();
// TODO what about passing on the mongo/domain object factory to obtain an according SwissTimingAdapterPersistence instance similar to how the tractracDomainObjectFactory etc. are created below?
swissTimingAdapterPersistence = SwissTimingAdapterPersistence.INSTANCE;
- swissTimingReplayService = getSwissTimingReplayService(context);
- scoreCorrectionProviderServiceTracker = createAndOpenScoreCorrectionProviderServiceTracker(context);
+ swissTimingReplayService = ServiceTrackerFactory.createAndOpen(context, SwissTimingReplayServiceFactory.class)
+ .getService().createSwissTimingReplayService(getSwissTimingAdapter().getSwissTimingDomainFactory());
+ scoreCorrectionProviderServiceTracker = ServiceTrackerFactory.createAndOpen(context,
+ ScoreCorrectionProvider.class);
tractracDomainObjectFactory = com.sap.sailing.domain.tractracadapter.persistence.PersistenceFactory.INSTANCE
.createDomainObjectFactory(mongoObjectFactory.getDatabase(), getTracTracAdapter()
.getTracTracDomainFactory());
@@ -556,89 +564,26 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
quickRanksLiveCache.stop();
}
- protected SwissTimingReplayService getSwissTimingReplayService(BundleContext context) {
- return createAndOpenSwissTimingReplayServiceTracker(context).getService().createSwissTimingReplayService(getSwissTimingAdapter().getSwissTimingDomainFactory());
+ protected SwissTimingAdapterFactory getSwissTimingAdapterFactory() {
+ return swissTimingAdapterTracker.getService();
}
protected SwissTimingAdapter getSwissTimingAdapter() {
- return swissTimingAdapterTracker.getService().getOrCreateSwissTimingAdapter(baseDomainFactory);
+ return getSwissTimingAdapterFactory().getOrCreateSwissTimingAdapter(baseDomainFactory);
+ }
+
+ protected TracTracAdapterFactory getTracTracAdapterFactory() {
+ return tractracAdapterTracker.getService();
}
protected TracTracAdapter getTracTracAdapter() {
- return tractracAdapterTracker.getService().getOrCreateTracTracAdapter(baseDomainFactory);
- }
-
- protected ServiceTracker createAndOpenTracTracAdapterTracker(BundleContext context) {
- ServiceTracker result = new ServiceTracker(
- context, TracTracAdapterFactory.class.getName(), null);
- result.open();
- return result;
- }
-
- protected ServiceTracker createAndOpenIgtimiTracker(BundleContext context) {
- ServiceTracker result = new ServiceTracker(
- context, IgtimiConnectionFactory.class.getName(), null);
- result.open();
- return result;
- }
-
- protected ServiceTracker createAndOpenSwissTimingAdapterTracker(
- BundleContext context) {
- ServiceTracker result = new ServiceTracker(
- context, SwissTimingAdapterFactory.class.getName(), null);
- result.open();
- return result;
- }
-
- protected ServiceTracker createAndOpenSwissTimingReplayServiceTracker(
- BundleContext context) {
- ServiceTracker result = new ServiceTracker(
- context, SwissTimingReplayServiceFactory.class.getName(), null);
- result.open();
- return result;
- }
-
- protected ServiceTracker createAndOpenRaceLogTrackingAdapterTracker(
- BundleContext context) {
- ServiceTracker result =
- new ServiceTracker(
- context, RaceLogTrackingAdapterFactory.class.getName(), null);
- result.open();
- return result;
+ return getTracTracAdapterFactory().getOrCreateTracTracAdapter(baseDomainFactory);
}
private void writeObject(ObjectOutputStream oos) throws IOException {
oos.defaultWriteObject();
}
- protected ServiceTracker createAndOpenRacingEventServiceTracker(
- BundleContext context) {
- ServiceTracker result = new ServiceTracker(
- context, RacingEventService.class.getName(), null);
- result.open();
- return result;
- }
-
- protected ServiceTracker createAndOpenResultUrlRegistryServiceTracker(
- BundleContext context) {
- ServiceTracker result = new ServiceTracker(
- context, ResultUrlRegistry.class.getName(), null);
- result.open();
- return result;
- }
-
- /**
- * Asks the OSGi system for registered score correction provider services
- */
- protected ServiceTracker createAndOpenScoreCorrectionProviderServiceTracker(
- BundleContext bundleContext) {
- ServiceTracker tracker = new ServiceTracker(bundleContext,
- ScoreCorrectionProvider.class.getName(),
- /* customizer */null);
- tracker.open();
- return tracker;
- }
-
@Override
public Iterable getScoreCorrectionProviderNames() {
List result = new ArrayList();
@@ -685,15 +630,6 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
return new ScoreCorrectionProviderDTO(scoreCorrectionProvider.getName(), hasResultsForBoatClassFromDateByEventName);
}
- protected ServiceTracker createAndOpenReplicationServiceTracker(
- BundleContext context) {
- ServiceTracker result =
- new ServiceTracker(
- context, ReplicationService.class.getName(), null);
- result.open();
- return result;
- }
-
/**
* If date is null, the {@link LiveLeaderboardUpdater} for the
* leaderboardName requested is obtained or created if it doesn't exist yet. The request is then passed
@@ -1116,10 +1052,6 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
}
}
- private SwissTimingReplayService getSwissTimingReplayService() {
- return swissTimingReplayService;
- }
-
@Override
public List getPreviousTracTracConfigurations() throws Exception {
Iterable configs = tractracDomainObjectFactory.getTracTracConfigurations();
@@ -2239,7 +2171,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
return racingEventServiceTracker.getService(); // grab the service
}
- private ReplicationService getReplicationService() {
+ protected ReplicationService getReplicationService() {
return replicationServiceTracker.getService();
}
@@ -2699,6 +2631,10 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
}
}
}
+
+ protected SwissTimingReplayService getSwissTimingReplayService() {
+ return swissTimingReplayService;
+ }
@Override
public List listSwissTiminigReplayRaces(String swissTimingUrl) {
@@ -4538,12 +4474,12 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
DynamicBoat boat = new BoatImpl(competitor.getName() + " boat", boatClass, competitor.getSailID());
result = getBaseDomainFactory().convertToCompetitorDTO(
getBaseDomainFactory().getOrCreateCompetitor(UUID.randomUUID(), competitor.getName(),
- competitor.getColor(), team, boat));
+ competitor.getColor(), competitor.getEmail(), team, boat));
} else {
result = getBaseDomainFactory().convertToCompetitorDTO(
getService().apply(
new UpdateCompetitor(competitor.getIdAsString(), competitor.getName(), competitor
- .getColor(), competitor.getSailID(), nationality, existingCompetitor.getTeam().getImage())));
+ .getColor(), competitor.getEmail(), competitor.getSailID(), nationality, existingCompetitor.getTeam().getImage())));
}
return result;
}
@@ -4736,9 +4672,13 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
private IgtimiConnectionFactory getIgtimiConnectionFactory() {
return igtimiAdapterTracker.getService();
}
+
+ protected RaceLogTrackingAdapterFactory getRaceLogTrackingAdapterFactory() {
+ return raceLogTrackingAdapterTracker.getService();
+ }
protected RaceLogTrackingAdapter getRaceLogTrackingAdapter() {
- return raceLogTrackingAdapterTracker.getService().getAdapter(getBaseDomainFactory());
+ return getRaceLogTrackingAdapterFactory().getAdapter(getBaseDomainFactory());
}
@Override
@@ -5180,16 +5120,6 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
raceLog.add(event);
}
- private ServiceTracker
- createAndOpenDeviceIdentifierStringSerializationHandlerTracker(BundleContext context) {
- ServiceTracker tracker =
- new ServiceTracker(
- context, DeviceIdentifierStringSerializationHandler.class, null);
-
- tracker.open();
- return tracker;
- }
-
@Override
public List getDeserializableDeviceIdentifierTypes() {
List result = new ArrayList();
@@ -5436,13 +5366,16 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
}
return getService().getFileStorageManagementService().getFileStorageService(name);
}
+
+ private Locale getLocale(String localeInfoName) {
+ return ResourceBundleStringMessages.Util.getLocaleFor(localeInfoName);
+ }
@Override
public FileStorageServiceDTO[] getAvailableFileStorageServices(String localeInfoName) {
- Locale locale = ResourceBundleStringMessages.Util.getLocaleFor(localeInfoName);
List serviceDtos = new ArrayList<>();
for (FileStorageService s : getService().getFileStorageManagementService().getAvailableFileStorageServices()) {
- serviceDtos.add(FileStorageServiceDTOUtils.convert(s, locale));
+ serviceDtos.add(FileStorageServiceDTOUtils.convert(s, getLocale(localeInfoName)));
}
return serviceDtos.toArray(new FileStorageServiceDTO[0]);
}
@@ -5461,14 +5394,13 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
@Override
public FileStorageServicePropertyErrorsDTO testFileStorageServiceProperties(String serviceName, String localeInfoName) {
- Locale locale = ResourceBundleStringMessages.Util.getLocaleFor(localeInfoName);
try {
FileStorageService service = getFileStorageService(serviceName);
if (service != null) {
service.testProperties();
}
} catch (InvalidPropertiesException e) {
- return FileStorageServiceDTOUtils.convert(e, locale);
+ return FileStorageServiceDTOUtils.convert(e, getLocale(localeInfoName));
}
return null;
}
@@ -5486,4 +5418,17 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
return null;
}
}
+
+ @Override
+ public void inviteCompetitorsForTrackingViaEmail(String serverUrlWithoutTrailingSlash, EventDTO eventDto,
+ String leaderboardName, Set competitorDtos, String localeInfoName) throws MailException {
+ Event event = getService().getEvent(eventDto.id);
+ Set competitors = new HashSet<>();
+ for (CompetitorDTO c : competitorDtos) {
+ competitors.add(getCompetitor(c));
+ }
+ Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName);
+ getRaceLogTrackingAdapter().inviteCompetitorsForTrackingViaEmail(event, leaderboard, serverUrlWithoutTrailingSlash,
+ competitors, getLocale(localeInfoName));
+ }
}
diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadDeviceIdentifierTest.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadDeviceIdentifierTest.java
index 08ece8cbcc0..dad04664a00 100644
--- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadDeviceIdentifierTest.java
+++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadDeviceIdentifierTest.java
@@ -82,7 +82,7 @@ public class StoreAndLoadDeviceIdentifierTest extends AbstractMongoDBTest {
private DeviceIdentifier storeAndLoad(DeviceIdentifier device, TypeBasedServiceFinderFactory forStoring, TypeBasedServiceFinderFactory forLoading) {
createFactories(forStoring);
- Competitor c = new CompetitorImpl("a", "a", null, null, null);
+ Competitor c = new CompetitorImpl("a", "a", null, null, null, null);
raceLog.add(RaceLogEventFactory.INSTANCE.createDeviceCompetitorMappingEvent(now(), author, device,
c, 0, now(), now()));
diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogEventsTest.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogEventsTest.java
index 84b39d90664..d40fac7e98b 100644
--- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogEventsTest.java
+++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreAndLoadRaceLogEventsTest.java
@@ -174,7 +174,7 @@ public class StoreAndLoadRaceLogEventsTest extends AbstractMongoDBTest {
@Test
public void testStoreAndLoadDeviceCompetitorMappingEvent() {
DeviceIdentifier device = new SmartphoneImeiIdentifier("a");
- Competitor mappedTo = DomainFactory.INSTANCE.getOrCreateCompetitor("abc", "abc", null, null, null);
+ Competitor mappedTo = DomainFactory.INSTANCE.getOrCreateCompetitor("abc", "abc", null, null, null, null);
TimePoint from = new MillisecondsTimePoint(20);
TimePoint to = new MillisecondsTimePoint(30);
RaceLogDeviceCompetitorMappingEvent expectedEvent = eventFactory.createDeviceCompetitorMappingEvent(
@@ -251,7 +251,7 @@ public class StoreAndLoadRaceLogEventsTest extends AbstractMongoDBTest {
public void testStoreAndLoadRegisterCompetitorEvent() {
RaceLogRegisterCompetitorEvent expectedEvent = eventFactory.createRegisterCompetitorEvent(
expectedEventTime, author, expectedEventTime, expectedId, expectedPassId,
- DomainFactory.INSTANCE.getOrCreateCompetitor("comp", "comp", null, null, null));
+ DomainFactory.INSTANCE.getOrCreateCompetitor("comp", "comp", null, null, null, null));
DBObject dbObject = mongoFactory.storeRaceLogEntry(logIdentifier, expectedEvent);
RaceLogRegisterCompetitorEvent actualEvent = loadEvent(dbObject);
diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreGPSFixTrackTest.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreGPSFixTrackTest.java
index f1adb9b63e6..078dcfd56fd 100644
--- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreGPSFixTrackTest.java
+++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/StoreGPSFixTrackTest.java
@@ -58,7 +58,7 @@ public class StoreGPSFixTrackTest extends AbstractMongoDBTest {
public void testStoreAndLoadFixes() throws TransformationException, NoCorrespondingServiceRegisteredException {
TypeBasedServiceFinderFactory factory = new MockSmartphoneImeiServiceFinderFactory();
AbstractLogEventAuthor author = new LogEventAuthorImpl("author", 0);
- Competitor comp = DomainFactory.INSTANCE.getOrCreateCompetitor("comp", "comp", null, null, null);
+ Competitor comp = DomainFactory.INSTANCE.getOrCreateCompetitor("comp", "comp", null, null, null, null);
Mark mark = DomainFactory.INSTANCE.getOrCreateMark("mark");
MongoObjectFactory mongoObjectFactory = PersistenceFactory.INSTANCE.getMongoObjectFactory(getMongoService(), factory);
DomainObjectFactory domainObjectFactory = PersistenceFactory.INSTANCE.getDomainObjectFactory(getMongoService(), DomainFactory.INSTANCE, factory);
diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndLoadingEventsAndRegattas.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndLoadingEventsAndRegattas.java
index 720b868c6db..ff13f587b82 100755
--- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndLoadingEventsAndRegattas.java
+++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndLoadingEventsAndRegattas.java
@@ -627,7 +627,7 @@ public class TestStoringAndLoadingEventsAndRegattas extends AbstractMongoDBTest
regattaStartDate, regattaEndDate, /* persistent */ true, DomainFactory.INSTANCE.createScoringScheme(ScoringSchemeType.LOW_POINT), null);
List competitors = new ArrayList();
- competitors.add(new CompetitorImpl("Axel", "Axel Uhl", Color.RED, null, null));
+ competitors.add(new CompetitorImpl("Axel", "Axel Uhl", Color.RED, null, null, null));
Iterable waypoints = Collections.emptyList();
Course course = new CourseImpl("Course", waypoints);
diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboardGroups.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboardGroups.java
index 63f90f5e010..538815fa923 100755
--- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboardGroups.java
+++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboardGroups.java
@@ -113,15 +113,15 @@ public class TestStoringAndRetrievingLeaderboardGroups extends AbstractMongoDBTe
@Test
public void testStoringAndRetrievingLeaderboardGroupWithOverallLeaderboardWithScoreCorrection() throws NoWindException {
RacingEventService racingEventService = new RacingEventServiceImpl();
- Competitor wolfgang = new CompetitorImpl(123, "$$$Dr. Wolfgang+Hunger$$$", Color.RED, new TeamImpl("STG", Collections.singleton(
- new PersonImpl("$$$Dr. Wolfgang+Hunger$$$", new NationalityImpl("GER"),
- /* dateOfBirth */ null, "This is famous Dr. Wolfgang Hunger")), new PersonImpl("Rigo van Maas", new NationalityImpl("NED"),
- /* dateOfBirth */ null, "This is Rigo, the coach")), new BoatImpl("Dr. Wolfgang Hunger's boat", new BoatClassImpl("505", /* typicallyStartsUpwind */ true), null));
- Competitor hasso = new CompetitorImpl(234, "Hasso Plattner", Color.RED, new TeamImpl("STG", Collections.singleton(
- new PersonImpl("Hasso Plattner", new NationalityImpl("GER"),
- /* dateOfBirth */ null, "This is famous Dr. Hasso Plattner")), new PersonImpl("Lutz Patrunky", new NationalityImpl("GER"),
- /* dateOfBirth */ null, "This is Patty, the coach")),
- new BoatImpl("Dr. Hasso Plattner's boat", new BoatClassImpl("505", /* typicallyStartsUpwind */ true), null));
+ Competitor wolfgang = new CompetitorImpl(123, "$$$Dr. Wolfgang+Hunger$$$", Color.RED, null, new TeamImpl("STG", Collections.singleton(
+ new PersonImpl("$$$Dr. Wolfgang+Hunger$$$", new NationalityImpl("GER"),
+ /* dateOfBirth */ null, "This is famous Dr. Wolfgang Hunger")), new PersonImpl("Rigo van Maas", new NationalityImpl("NED"),
+ /* dateOfBirth */ null, "This is Rigo, the coach")), new BoatImpl("Dr. Wolfgang Hunger's boat", new BoatClassImpl("505", /* typicallyStartsUpwind */ true), null));
+ Competitor hasso = new CompetitorImpl(234, "Hasso Plattner", Color.RED, null,
+ new TeamImpl("STG", Collections.singleton(
+ new PersonImpl("Hasso Plattner", new NationalityImpl("GER"),
+ /* dateOfBirth */ null, "This is famous Dr. Hasso Plattner")), new PersonImpl("Lutz Patrunky", new NationalityImpl("GER"),
+ /* dateOfBirth */ null, "This is Patty, the coach")), new BoatImpl("Dr. Hasso Plattner's boat", new BoatClassImpl("505", /* typicallyStartsUpwind */ true), null));
final String raceColumnName1 = "My First Race 1";
MockedTrackedRaceWithFixedRankAndManyCompetitors raceWithTwoCompetitors = new MockedTrackedRaceWithFixedRankAndManyCompetitors(wolfgang, /* rank */ 1, /* started */ true);
raceWithTwoCompetitors.addCompetitor(hasso);
@@ -169,15 +169,15 @@ public class TestStoringAndRetrievingLeaderboardGroups extends AbstractMongoDBTe
@Test
public void testStoringAndRetrievingLeaderboardGroupWithSuppressedCompetitorsInOverallLeaderboard() {
- Competitor wolfgang = new CompetitorImpl(123, "$$$Dr. Wolfgang+Hunger$$$", Color.RED, new TeamImpl("STG", Collections.singleton(
- new PersonImpl("$$$Dr. Wolfgang+Hunger$$$", new NationalityImpl("GER"),
- /* dateOfBirth */ null, "This is famous Dr. Wolfgang Hunger")), new PersonImpl("Rigo van Maas", new NationalityImpl("NED"),
- /* dateOfBirth */ null, "This is Rigo, the coach")), new BoatImpl("Dr. Wolfgang Hunger's boat", new BoatClassImpl("505", /* typicallyStartsUpwind */ true), null));
- Competitor hasso = new CompetitorImpl(234, "Hasso Plattner", Color.RED, new TeamImpl("STG", Collections.singleton(
- new PersonImpl("Hasso Plattner", new NationalityImpl("GER"),
- /* dateOfBirth */ null, "This is famous Dr. Hasso Plattner")), new PersonImpl("Lutz Patrunky", new NationalityImpl("GER"),
- /* dateOfBirth */ null, "This is Patty, the coach")),
- new BoatImpl("Dr. Hasso Plattner's boat", new BoatClassImpl("505", /* typicallyStartsUpwind */ true), null));
+ Competitor wolfgang = new CompetitorImpl(123, "$$$Dr. Wolfgang+Hunger$$$", Color.RED, null, new TeamImpl("STG", Collections.singleton(
+ new PersonImpl("$$$Dr. Wolfgang+Hunger$$$", new NationalityImpl("GER"),
+ /* dateOfBirth */ null, "This is famous Dr. Wolfgang Hunger")), new PersonImpl("Rigo van Maas", new NationalityImpl("NED"),
+ /* dateOfBirth */ null, "This is Rigo, the coach")), new BoatImpl("Dr. Wolfgang Hunger's boat", new BoatClassImpl("505", /* typicallyStartsUpwind */ true), null));
+ Competitor hasso = new CompetitorImpl(234, "Hasso Plattner", Color.RED, null,
+ new TeamImpl("STG", Collections.singleton(
+ new PersonImpl("Hasso Plattner", new NationalityImpl("GER"),
+ /* dateOfBirth */ null, "This is famous Dr. Hasso Plattner")), new PersonImpl("Lutz Patrunky", new NationalityImpl("GER"),
+ /* dateOfBirth */ null, "This is Patty, the coach")), new BoatImpl("Dr. Hasso Plattner's boat", new BoatClassImpl("505", /* typicallyStartsUpwind */ true), null));
final String raceColumnName1 = "My First Race 1";
MockedTrackedRaceWithFixedRankAndManyCompetitors raceWithTwoCompetitors = new MockedTrackedRaceWithFixedRankAndManyCompetitors(wolfgang, /* rank */ 1, /* started */ true);
raceWithTwoCompetitors.addCompetitor(hasso);
@@ -225,15 +225,15 @@ public class TestStoringAndRetrievingLeaderboardGroups extends AbstractMongoDBTe
@Test
public void testStoringAndRetrievingLeaderboardGroupWithTwoSuppressedCompetitorsInOverallLeaderboard() {
- Competitor wolfgang = new CompetitorImpl(123, "$$$Dr. Wolfgang+Hunger$$$", Color.RED, new TeamImpl("STG", Collections.singleton(
- new PersonImpl("$$$Dr. Wolfgang+Hunger$$$", new NationalityImpl("GER"),
- /* dateOfBirth */ null, "This is famous Dr. Wolfgang Hunger")), new PersonImpl("Rigo van Maas", new NationalityImpl("NED"),
- /* dateOfBirth */ null, "This is Rigo, the coach")), new BoatImpl("Dr. Wolfgang Hunger's boat", new BoatClassImpl("505", /* typicallyStartsUpwind */ true), null));
- Competitor hasso = new CompetitorImpl(234, "Hasso Plattner", Color.RED, new TeamImpl("STG", Collections.singleton(
- new PersonImpl("Hasso Plattner", new NationalityImpl("GER"),
- /* dateOfBirth */ null, "This is famous Dr. Hasso Plattner")), new PersonImpl("Lutz Patrunky", new NationalityImpl("GER"),
- /* dateOfBirth */ null, "This is Patty, the coach")),
- new BoatImpl("Dr. Hasso Plattner's boat", new BoatClassImpl("505", /* typicallyStartsUpwind */ true), null));
+ Competitor wolfgang = new CompetitorImpl(123, "$$$Dr. Wolfgang+Hunger$$$", Color.RED, null, new TeamImpl("STG", Collections.singleton(
+ new PersonImpl("$$$Dr. Wolfgang+Hunger$$$", new NationalityImpl("GER"),
+ /* dateOfBirth */ null, "This is famous Dr. Wolfgang Hunger")), new PersonImpl("Rigo van Maas", new NationalityImpl("NED"),
+ /* dateOfBirth */ null, "This is Rigo, the coach")), new BoatImpl("Dr. Wolfgang Hunger's boat", new BoatClassImpl("505", /* typicallyStartsUpwind */ true), null));
+ Competitor hasso = new CompetitorImpl(234, "Hasso Plattner", Color.RED, null,
+ new TeamImpl("STG", Collections.singleton(
+ new PersonImpl("Hasso Plattner", new NationalityImpl("GER"),
+ /* dateOfBirth */ null, "This is famous Dr. Hasso Plattner")), new PersonImpl("Lutz Patrunky", new NationalityImpl("GER"),
+ /* dateOfBirth */ null, "This is Patty, the coach")), new BoatImpl("Dr. Hasso Plattner's boat", new BoatClassImpl("505", /* typicallyStartsUpwind */ true), null));
final String raceColumnName1 = "My First Race 1";
MockedTrackedRaceWithFixedRankAndManyCompetitors raceWithTwoCompetitors = new MockedTrackedRaceWithFixedRankAndManyCompetitors(wolfgang, /* rank */ 1, /* started */ true);
raceWithTwoCompetitors.addCompetitor(hasso);
diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboards.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboards.java
index d9fa5489325..0eae97a4c52 100755
--- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboards.java
+++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingLeaderboards.java
@@ -76,11 +76,11 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest {
FlexibleLeaderboardImpl leaderboard = new FlexibleLeaderboardImpl(leaderboardName, new ThresholdBasedResultDiscardingRuleImpl(discardIndexResultsStartingWithHowManyRaces),
new LowPoint(), null);
Competitor wolfgang = createCompetitor();
- Competitor hasso = new CompetitorImpl(234, "Hasso Plattner", Color.RED, new TeamImpl("STG", Collections.singleton(
- new PersonImpl("Hasso Plattner", new NationalityImpl("GER"),
- /* dateOfBirth */ null, "This is famous Dr. Hasso Plattner")), new PersonImpl("Lutz Patrunky", new NationalityImpl("GER"),
- /* dateOfBirth */ null, "This is Patty, the coach")),
- new BoatImpl("Dr. Hasso Plattner's boat", new BoatClassImpl("505", /* typicallyStartsUpwind */ true), null));
+ Competitor hasso = new CompetitorImpl(234, "Hasso Plattner", Color.RED, null,
+ new TeamImpl("STG", Collections.singleton(
+ new PersonImpl("Hasso Plattner", new NationalityImpl("GER"),
+ /* dateOfBirth */ null, "This is famous Dr. Hasso Plattner")), new PersonImpl("Lutz Patrunky", new NationalityImpl("GER"),
+ /* dateOfBirth */ null, "This is Patty, the coach")), new BoatImpl("Dr. Hasso Plattner's boat", new BoatClassImpl("505", /* typicallyStartsUpwind */ true), null));
final String raceColumnName1 = "My First Race 1";
MockedTrackedRaceWithFixedRankAndManyCompetitors raceWithTwoCompetitors = new MockedTrackedRaceWithFixedRankAndManyCompetitors(wolfgang, /* rank */ 1, /* started */ true);
raceWithTwoCompetitors.addCompetitor(hasso);
@@ -350,7 +350,7 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest {
final DomainFactory domainFactory = new DomainFactoryImpl();
// create the competitor through the competitor store/factory here so that the DomainObjectFactory finds it and
// resolves the score corrections appropriate
- Competitor competitor = domainFactory.getOrCreateCompetitor(123, "$$$Dr. Wolfgang+Hunger$$$", Color.RED, new TeamImpl("STG", Collections.singleton(
+ Competitor competitor = domainFactory.getOrCreateCompetitor(123, "$$$Dr. Wolfgang+Hunger$$$", Color.RED, "someone@nowhere.de", new TeamImpl("STG", Collections.singleton(
new PersonImpl("$$$Dr. Wolfgang+Hunger$$$", new NationalityImpl("GER"),
/* dateOfBirth */ null, "This is famous Dr. Wolfgang Hunger")), new PersonImpl("Rigo van Maas", new NationalityImpl("NED"),
/* dateOfBirth */ null, "This is Rigo, the coach")), new BoatImpl("Dr. Wolfgang Hunger's boat", new BoatClassImpl("505", /* typicallyStartsUpwind */ true), null));
@@ -377,10 +377,10 @@ public class TestStoringAndRetrievingLeaderboards extends AbstractMongoDBTest {
}
private Competitor createCompetitor() {
- Competitor competitor = new CompetitorImpl(123, "$$$Dr. Wolfgang+Hunger$$$", Color.RED, new TeamImpl("STG", Collections.singleton(
- new PersonImpl("$$$Dr. Wolfgang+Hunger$$$", new NationalityImpl("GER"),
- /* dateOfBirth */ null, "This is famous Dr. Wolfgang Hunger")), new PersonImpl("Rigo van Maas", new NationalityImpl("NED"),
- /* dateOfBirth */ null, "This is Rigo, the coach")), new BoatImpl("Dr. Wolfgang Hunger's boat", new BoatClassImpl("505", /* typicallyStartsUpwind */ true), null));
+ Competitor competitor = new CompetitorImpl(123, "$$$Dr. Wolfgang+Hunger$$$", Color.RED, null, new TeamImpl("STG", Collections.singleton(
+ new PersonImpl("$$$Dr. Wolfgang+Hunger$$$", new NationalityImpl("GER"),
+ /* dateOfBirth */ null, "This is famous Dr. Wolfgang Hunger")), new PersonImpl("Rigo van Maas", new NationalityImpl("NED"),
+ /* dateOfBirth */ null, "This is Rigo, the coach")), new BoatImpl("Dr. Wolfgang Hunger's boat", new BoatClassImpl("505", /* typicallyStartsUpwind */ true), null));
return competitor;
}
diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java
index 210c3031b0f..befdd06a53e 100644
--- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java
+++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java
@@ -277,7 +277,7 @@ public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoD
@Test
public void testStoreAndRetrieveSimpleLeaderboardWithRaceLogFinishPositioningConfirmedEvent() {
- Competitor storedCompetitor = DomainFactory.INSTANCE.getOrCreateCompetitor(UUID.randomUUID(), "SAP Extreme Sailing Team", Color.RED, null, null);
+ Competitor storedCompetitor = DomainFactory.INSTANCE.getOrCreateCompetitor(UUID.randomUUID(), "SAP Extreme Sailing Team", Color.RED, "someone@nowhere.de", null, null);
CompetitorResults storedPositioningList = new CompetitorResultsImpl();
storedPositioningList.add(new com.sap.sse.common.Util.Triple(storedCompetitor.getId(), storedCompetitor.getName(), MaxPointsReason.NONE));
@@ -346,7 +346,7 @@ public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoD
@Test
public void testStoreAndRetrieveSimpleLeaderboardWithRaceLogFinishPositioningListChangeEvent() {
- Competitor storedCompetitor = DomainFactory.INSTANCE.getOrCreateCompetitor(UUID.randomUUID(), "SAP Extreme Sailing Team", Color.RED, null, null);
+ Competitor storedCompetitor = DomainFactory.INSTANCE.getOrCreateCompetitor(UUID.randomUUID(), "SAP Extreme Sailing Team", Color.RED, "someone@nowhere.de", null, null);
CompetitorResults storedPositioningList = new CompetitorResultsImpl();
storedPositioningList.add(new com.sap.sse.common.Util.Triple(storedCompetitor.getId(), storedCompetitor.getName(), MaxPointsReason.NONE));
diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java
index ede401bb4a2..31bc1d59e72 100644
--- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java
+++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java
@@ -187,7 +187,7 @@ public class TestStoringAndRetrievingRaceLogInRegatta extends AbstractTestStorin
@Test
public void testStoreAndRetrieveRegattaWithRaceLogFinishPositioningListChangeEvent() {
- Competitor storedCompetitor = DomainFactory.INSTANCE.getOrCreateCompetitor(UUID.randomUUID(), "SAP Extreme Sailing Team", Color.RED, null, null);
+ Competitor storedCompetitor = DomainFactory.INSTANCE.getOrCreateCompetitor(UUID.randomUUID(), "SAP Extreme Sailing Team", Color.RED, "someone@nowhere.de", null, null);
CompetitorResults storedPositioningList = new CompetitorResultsImpl();
storedPositioningList.add(new com.sap.sse.common.Util.Triple(storedCompetitor.getId(), storedCompetitor.getName(), MaxPointsReason.NONE));
@@ -217,7 +217,7 @@ public class TestStoringAndRetrievingRaceLogInRegatta extends AbstractTestStorin
@Test
public void testStoreAndRetrieveRegattaWithRaceLogFinishPositioningConfirmedEvent() {
- Competitor storedCompetitor = DomainFactory.INSTANCE.getOrCreateCompetitor(UUID.randomUUID(), "SAP Extreme Sailing Team", Color.RED, null, null);
+ Competitor storedCompetitor = DomainFactory.INSTANCE.getOrCreateCompetitor(UUID.randomUUID(), "SAP Extreme Sailing Team", Color.RED, "someone@nowhere.de", null, null);
CompetitorResults storedPositioningList = new CompetitorResultsImpl();
storedPositioningList.add(new com.sap.sse.common.Util.Triple(storedCompetitor.getId(), storedCompetitor.getName(), MaxPointsReason.NONE));
diff --git a/java/com.sap.sailing.polars.test/src/com/sap/sailing/polars/test/PolarSheetGenerationTest.java b/java/com.sap.sailing.polars.test/src/com/sap/sailing/polars/test/PolarSheetGenerationTest.java
index 31622df7ab3..42b953c8aa9 100644
--- a/java/com.sap.sailing.polars.test/src/com/sap/sailing/polars/test/PolarSheetGenerationTest.java
+++ b/java/com.sap.sailing.polars.test/src/com/sap/sailing/polars/test/PolarSheetGenerationTest.java
@@ -91,8 +91,8 @@ public class PolarSheetGenerationTest {
settings, executor);
BoatClass forelle = new BoatClassImpl("Forelle", true);
- Competitor competitor = new CompetitorImpl(UUID.randomUUID(), "Hans Frantz", Color.RED, new TeamImpl("SAP", null, null),
- new BoatImpl("Schnelle Forelle", forelle, "GER000"));
+ Competitor competitor = new CompetitorImpl(UUID.randomUUID(), "Hans Frantz", Color.RED, null,
+ new TeamImpl("SAP", null, null), new BoatImpl("Schnelle Forelle", forelle, "GER000"));
PolarFixAggregationWorker task = new PolarFixAggregationWorker(race,
resultContainer, startTime, endTime,
diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/leaderboard/TestLeaderboardConfiguration.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/leaderboard/TestLeaderboardConfiguration.java
index 2e088d57af2..e138920caad 100644
--- a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/leaderboard/TestLeaderboardConfiguration.java
+++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/leaderboard/TestLeaderboardConfiguration.java
@@ -84,8 +84,7 @@ public class TestLeaderboardConfiguration extends AbstractSeleniumTest {
List races = table.getRaceNames();
assertThat(races.size(), equalTo(5));
- assertThat(table.getEntries().size(), equalTo(0));
-
+ assertThat(table.getEntries().size(), equalTo(28)); // the regatta already has the races linked; regatta leaderboard obtains competitors from regatta
adminConsoleWindow.switchToWindow();
AdminConsolePage adminConsole = AdminConsolePage.goToPage(getWebDriver(), getContextRoot());
LeaderboardConfigurationPanelPO leaderboardConfiguration = adminConsole.goToLeaderboardConfiguration();
diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/impl/CompetitorJsonDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/impl/CompetitorJsonDeserializer.java
index dcd7490de68..84c7591ac7e 100644
--- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/impl/CompetitorJsonDeserializer.java
+++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/impl/CompetitorJsonDeserializer.java
@@ -51,6 +51,8 @@ public class CompetitorJsonDeserializer implements JsonDeserializer
}
String name = (String) object.get(CompetitorJsonSerializer.FIELD_NAME);
String displayColorAsString = (String) object.get(CompetitorJsonSerializer.FIELD_DISPLAY_COLOR);
+ String email = (String) object.get(CompetitorJsonSerializer.FIELD_EMAIL);
+
final Color displayColor;
if (displayColorAsString == null || displayColorAsString.isEmpty()) {
displayColor = null;
@@ -67,7 +69,8 @@ public class CompetitorJsonDeserializer implements JsonDeserializer
boat = boatJsonDeserializer.deserialize(Helpers.getNestedObjectSafe(object,
CompetitorJsonSerializer.FIELD_BOAT));
}
- Competitor competitor = competitorStore.getOrCreateCompetitor(competitorId, name, displayColor, team, boat);
+
+ Competitor competitor = competitorStore.getOrCreateCompetitor(competitorId, name, displayColor, email, team, boat);
return competitor;
} catch (Exception e) {
throw new JsonDeserializationException(e);
diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/impl/CompetitorJsonSerializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/impl/CompetitorJsonSerializer.java
index a27faec44a9..04dd097e1c5 100644
--- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/impl/CompetitorJsonSerializer.java
+++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/impl/CompetitorJsonSerializer.java
@@ -31,6 +31,7 @@ public class CompetitorJsonSerializer implements JsonSerializer {
public static final String FIELD_TEAM = "team";
public static final String FIELD_BOAT = "boat";
public static final String FIELD_DISPLAY_COLOR = "displayColor";
+ public static final String FIELD_EMAIL = "email";
private final JsonSerializer teamJsonSerializer;
private final JsonSerializer boatJsonSerializer;
@@ -68,6 +69,7 @@ public class CompetitorJsonSerializer implements JsonSerializer {
}
result.put(FIELD_NAME, competitor.getName());
result.put(FIELD_DISPLAY_COLOR, competitor.getColor() == null ? null : competitor.getColor().getAsHtml());
+ result.put(FIELD_EMAIL, competitor.getEmail());
result.put(FIELD_SAILID, competitor.getBoat() == null ? "" : competitor.getBoat().getSailID());
final Nationality nationality = competitor.getTeam() == null ? null : competitor.getTeam().getNationality();
result.put(FIELD_NATIONALITY, nationality == null ? "" : nationality.getThreeLetterIOCAcronym());
diff --git a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java
index 0e35f55d5bc..1d3f145cbdf 100644
--- a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java
+++ b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java
@@ -237,7 +237,7 @@ public class RaceLogEventSerializerTest {
public void testRegisterCompetitorEventSerializer() {
// we use the real event type here because we do not want to re-implement the dispatching.
RaceLogEvent event = factory.createRegisterCompetitorEvent(null, author, 0,
- DomainFactory.INSTANCE.getOrCreateCompetitor("comp", "comp", null, null, null));
+ DomainFactory.INSTANCE.getOrCreateCompetitor("comp", "comp", null, null, null, null));
serializer.serialize(event);
verify(registerCompetitorEventSerializer).serialize(event);
}
diff --git a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/RegattaJsonSerializer.java b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/RegattaJsonSerializer.java
index 9cb04846da0..b74ad82272b 100644
--- a/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/RegattaJsonSerializer.java
+++ b/java/com.sap.sailing.server.gateway.serialization/src/com/sap/sailing/server/gateway/serialization/impl/RegattaJsonSerializer.java
@@ -49,7 +49,7 @@ public class RegattaJsonSerializer implements JsonSerializer {
if(competitorSerializer != null) {
JSONArray competitorsJson = new JSONArray();
- for (Competitor competitor: regatta.getCompetitors()) {
+ for (Competitor competitor: regatta.getAllCompetitors()) {
competitorsJson.add(competitorSerializer.serialize(competitor));
}
result.put(FIELD_COMPETITORS, competitorsJson);
diff --git a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/AbstractJsonExportTest.java b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/AbstractJsonExportTest.java
index 9cbc93bc25a..bc6cf71f321 100644
--- a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/AbstractJsonExportTest.java
+++ b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/AbstractJsonExportTest.java
@@ -89,11 +89,11 @@ public abstract class AbstractJsonExportTest {
BoatClass boatClass = new BoatClassImpl("505", /* typicallyStartsUpwind */ true);
for (int i = 1; i <= numberOfCompetitorsToCreate; i++) {
String competitorName = "C" + i;
- Competitor competitor = new CompetitorImpl(UUID.randomUUID(), competitorName, Color.RED, 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",
+ Competitor competitor = new CompetitorImpl(UUID.randomUUID(), competitorName, Color.RED, null, 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);
}
diff --git a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/RaceLogSerializationTest.java b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/RaceLogSerializationTest.java
index 27bf9672fff..9df60e2713f 100644
--- a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/RaceLogSerializationTest.java
+++ b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/RaceLogSerializationTest.java
@@ -49,8 +49,8 @@ public class RaceLogSerializationTest {
private JsonDeserializer deserializer;
private final AbstractLogEventAuthor author = new LogEventAuthorImpl("test", 0);
private static final Competitor competitor = new CompetitorImpl("a", "b", null,
- new TeamImpl("a", Collections.singletonList(new PersonImpl("a", new NationalityImpl("GER"), new Date(), "abc")), null),
- new BoatImpl("a", new BoatClassImpl("a", true), "abc"));
+ null,
+ new TeamImpl("a", Collections.singletonList(new PersonImpl("a", new NationalityImpl("GER"), new Date(), "abc")), null), new BoatImpl("a", new BoatClassImpl("a", true), "abc"));
@Before
public void setup() {
diff --git a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/AbstractJaxRsApiTest.java b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/AbstractJaxRsApiTest.java
index 308954f2376..6ec2d9293be 100644
--- a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/AbstractJaxRsApiTest.java
+++ b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/AbstractJaxRsApiTest.java
@@ -70,11 +70,11 @@ public abstract class AbstractJaxRsApiTest {
BoatClass boatClass = new BoatClassImpl("505", /* typicallyStartsUpwind */ true);
for (int i = 1; i <= numberOfCompetitorsToCreate; i++) {
String competitorName = "C" + i;
- Competitor competitor = new CompetitorImpl(123, competitorName, Color.RED, 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",
+ Competitor competitor = new CompetitorImpl(123, competitorName, Color.RED, null, 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);
}
diff --git a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/CompetitorsResourceTest.java b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/CompetitorsResourceTest.java
index 43855aa01f0..4c04bd95597 100644
--- a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/CompetitorsResourceTest.java
+++ b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/CompetitorsResourceTest.java
@@ -34,7 +34,7 @@ public class CompetitorsResourceTest extends AbstractJaxRsApiTest {
super.setUp();
DynamicTeam team = new TeamImpl(null, Collections.singleton(new PersonImpl(null, new NationalityImpl(nationality), null, null)), null);
DynamicBoat boat = new BoatImpl(null, new BoatClassImpl(boatClassName, false), sailID);
- racingEventService.getBaseDomainFactory().getOrCreateCompetitor(id, name, null, team, boat);
+ racingEventService.getBaseDomainFactory().getOrCreateCompetitor(id, name, null, null, team, boat);
}
@Test
diff --git a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardsResourceCheckinAndOutTest.java b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardsResourceCheckinAndOutTest.java
index e5302d47c0a..29a39aed17c 100644
--- a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardsResourceCheckinAndOutTest.java
+++ b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/LeaderboardsResourceCheckinAndOutTest.java
@@ -44,8 +44,8 @@ public class LeaderboardsResourceCheckinAndOutTest extends AbstractJaxRsApiTest
public void setUp() {
super.setUp();
Competitor c = createCompetitors(1).get(0);
- competitor = racingEventService.getBaseDomainFactory().getOrCreateCompetitor(c.getId(), c.getName(), c.getColor(),
- (DynamicTeam) c.getTeam(), (DynamicBoat) c.getBoat());
+ competitor = racingEventService.getBaseDomainFactory().getOrCreateCompetitor(c.getId(), c.getName(),
+ c.getColor(), c.getEmail(), (DynamicTeam) c.getTeam(), (DynamicBoat) c.getBoat());
Regatta regatta = new RegattaImpl("regatta", new BoatClassImpl("49er", false), MillisecondsTimePoint.now(),
MillisecondsTimePoint.now(), Collections.singleton(new SeriesImpl("series", false, Collections
@@ -62,7 +62,7 @@ public class LeaderboardsResourceCheckinAndOutTest extends AbstractJaxRsApiTest
LeaderboardsResource resource = spyResource(new LeaderboardsResource());
UUID deviceUuid = UUID.randomUUID();
- //checkin
+ // checkin
long fromMillis = 500;
JSONObject json = new JSONObject();
json.put(DeviceMappingConstants.JSON_COMPETITOR_ID_AS_STRING, competitor.getId().toString());
@@ -82,22 +82,24 @@ public class LeaderboardsResourceCheckinAndOutTest extends AbstractJaxRsApiTest
DeviceMapping mappingForC = mappingsForC.get(0);
assertThat("that mapping is for the correct device",
((SmartphoneUUIDIdentifier) mappingForC.getDevice()).getUUID(), equalTo(deviceUuid));
- assertThat("that mapping starts at the correct timepoint", mappingForC.getTimeRange().from().asMillis(), equalTo(fromMillis));
+ assertThat("that mapping starts at the correct timepoint", mappingForC.getTimeRange().from().asMillis(),
+ equalTo(fromMillis));
assertThat("that mapping is open-ended", mappingForC.getTimeRange().hasOpenEnd(), equalTo(true));
-
- //checkout
+
+ // checkout
long toMillis = 1000;
json = new JSONObject();
json.put(DeviceMappingConstants.JSON_TO_MILLIS, toMillis);
json.put(DeviceMappingConstants.JSON_COMPETITOR_ID_AS_STRING, competitor.getId().toString());
json.put(DeviceMappingConstants.JSON_DEVICE_UUID, deviceUuid.toString());
-
+
response = resource.postCheckout(json.toString(), leaderboard.getName());
assertThat("checkout returns OK", response.getStatus(), equalTo(Response.Status.OK.getStatusCode()));
-
+
mappings = new DeviceCompetitorMappingFinder<>(log).analyze();
mappingForC = mappings.get(competitor).get(0);
- assertThat("mapping now ends at checkout timepoint", mappingForC.getTimeRange().to().asMillis(), equalTo(toMillis));
+ assertThat("mapping now ends at checkout timepoint", mappingForC.getTimeRange().to().asMillis(),
+ equalTo(toMillis));
}
}
diff --git a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/TeamImageTest.java b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/TeamImageTest.java
index 61576a65b08..0c6b0ccb51f 100644
--- a/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/TeamImageTest.java
+++ b/java/com.sap.sailing.server.gateway.test/src/com/sap/sailing/server/gateway/test/jaxrs/TeamImageTest.java
@@ -54,7 +54,7 @@ public class TeamImageTest extends AbstractJaxRsApiTest {
DynamicTeam team = new TeamImpl(null, Collections.singleton(new PersonImpl(null, new NationalityImpl(
nationality), null, null)), null);
DynamicBoat boat = new BoatImpl(null, new BoatClassImpl(boatClassName, false), sailID);
- racingEventService.getBaseDomainFactory().getOrCreateCompetitor(id, name, null, team, boat);
+ racingEventService.getBaseDomainFactory().getOrCreateCompetitor(id, name, null, null, team, boat);
}
@Test
diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/RegattaAndRaceDataJsonGetServlet.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/RegattaAndRaceDataJsonGetServlet.java
index 6b9ff74828d..cb774ad9a47 100755
--- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/RegattaAndRaceDataJsonGetServlet.java
+++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/RegattaAndRaceDataJsonGetServlet.java
@@ -372,7 +372,7 @@ public class RegattaAndRaceDataJsonGetServlet extends AbstractJsonHttpServlet {
jsonEvent.put("boatclass", regatta.getBoatClass().getName());
}
JSONArray jsonCompetitors = new JSONArray();
- for (Competitor competitor : regatta.getCompetitors()) {
+ for (Competitor competitor : regatta.getAllCompetitors()) {
JSONObject jsonCompetitor = new JSONObject();
jsonCompetitor.put("name", competitor.getName());
jsonCompetitor.put("sailID", competitor.getBoat()==null?"":competitor.getBoat().getSailID());
diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/CompetitorsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/CompetitorsResource.java
index 7b864d75085..e6af41be4fc 100644
--- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/CompetitorsResource.java
+++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/CompetitorsResource.java
@@ -144,7 +144,7 @@ public class CompetitorsResource extends AbstractSailingServerResource {
.entity("Could not store competitor image").type(MediaType.TEXT_PLAIN).build());
}
- getService().getCompetitorStore().updateCompetitor(competitorId, competitor.getName(), competitor.getColor(),
+ getService().getCompetitorStore().updateCompetitor(competitorId, competitor.getName(), competitor.getColor(), competitor.getEmail(),
competitor.getBoat().getSailID(), competitor.getTeam().getNationality(), imageUri);
logger.log(Level.INFO, "Set team image for competitor " + competitor.getName());
diff --git a/java/com.sap.sailing.server.gateway/webservices/api/v1/competitorTeamGetDoc.html b/java/com.sap.sailing.server.gateway/webservices/api/v1/competitorTeamGetDoc.html
new file mode 100644
index 00000000000..8cb27f6a6b8
--- /dev/null
+++ b/java/com.sap.sailing.server.gateway/webservices/api/v1/competitorTeamGetDoc.html
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+ SAP Sailing Analytics Webservices API Version 1.0 Beta
+
+
+
SAP Sailing Analytics Webservices API Version 1.0 Beta
+
+Back to Web Service Overview
+
+
diff --git a/java/com.sap.sailing.server.gateway/webservices/api/v1/index.html b/java/com.sap.sailing.server.gateway/webservices/api/v1/index.html
index 766f399ca1a..ec818730916 100644
--- a/java/com.sap.sailing.server.gateway/webservices/api/v1/index.html
+++ b/java/com.sap.sailing.server.gateway/webservices/api/v1/index.html
@@ -96,6 +96,18 @@ name to make sure you get to the event you're interested in.