diff --git a/configuration/convertELBLogToApacheFormat b/configuration/convertELBLogToApacheFormat
index 4563874bf6e..2341923b4dd 100755
--- a/configuration/convertELBLogToApacheFormat
+++ b/configuration/convertELBLogToApacheFormat
@@ -6,7 +6,7 @@ for i in $*; do
gzip -cd $i
else
cat $i
- fi | iconv -f ISO-8859-1 -t UTF8 |
+ fi | recode ISO-8859-1..UTF-8 |
sed -e 's/^\([^T]*\)T\([^.]*\)[^ ]* [^ ]* \([^:]*\):[^ ]* [^ ]* [^ ]* [^ ]* [^ ]* [^ ]* \([^ ]*\) \([^ ]*\) [^ ]* \(\"[^"]*\"\) \(\"[^"]*\"\).*$/'$PREFIX' \3 - - [\1:\2 +0000] \6 \4 \5 "http:\/\/'$PREFIX'" \7/' |
sed -e 's/\[\([0-9]*\)-01-\([0-9]*\):/\[\2\/Jan\/\1:/' |
sed -e 's/\[\([0-9]*\)-02-\([0-9]*\):/\[\2\/Feb\/\1:/' |
diff --git a/configuration/unique_ips_per_referrer b/configuration/unique_ips_per_referrer
index 518f7f27509..612d7b77447 100755
--- a/configuration/unique_ips_per_referrer
+++ b/configuration/unique_ips_per_referrer
@@ -28,7 +28,7 @@ for i in $*; do
gzip -cd $i
else
cat $i
- fi | iconv -f ISO-8859-1 -t UTF8 | sed -e 's/^\([^ ]*\) \([^ ]*\) \([^ ]*\) \([^ ]*\) \[\([^:]*\):\([^]]*\)\] \"[^"]*\" [^ ]* [^ ]* \"[^"]*\" \"\([^"]*\)\"/\1 \2 \5 \7/' | while read referrer hit; do
+ fi | recode ISO-8859-1..UTF-8 | sed -e 's/^\([^ ]*\) \([^ ]*\) \([^ ]*\) \([^ ]*\) \[\([^:]*\):\([^]]*\)\] \"[^"]*\" [^ ]* [^ ]* \"[^"]*\" \"\([^"]*\)\"/\1 \2 \5 \7/' | while read referrer hit; do
echo "$hit" >>${STATS}/${referrer}.ips
done
echo "$i" >>$VISITED_FILES
@@ -49,7 +49,7 @@ for month in `cat $MONTHS`; do
echo -n "`basename $i .ips` "
cat $i | grep "^[^ ]* [0-9]*/$month .*" | sort -u | wc | awk '{ print $1; }'
# TODO consider producing an AWStats configuration file for each virtual host name and splitting all new logs into virtual host name-specific log files
- done | tee $STATS/unique-ips-days-useragents-per-event-$month
- echo "Wrote per-month results to $STATS/unique-ips-days-useragents-per-event-$month"
+ done | tee $STATS/unique-ips-days-useragents-per-event-`echo $month | tr / -`
+ echo "Wrote per-month results to $STATS/unique-ips-days-useragents-per-event-`echo $month | tr / -`"
done
echo "Done at `date`."
diff --git a/configuration/unique_ips_per_referrer_generate_month_results_only b/configuration/unique_ips_per_referrer_generate_month_results_only
index dcea8f54211..d12bddaa7ae 100755
--- a/configuration/unique_ips_per_referrer_generate_month_results_only
+++ b/configuration/unique_ips_per_referrer_generate_month_results_only
@@ -11,6 +11,6 @@ for month in `cat $MONTHS`; do
cat $i | grep "^[^ ]* [0-9]*/$month .*" | sort -u | wc | awk '{ print $1; }'
# TODO consider producing an AWStats configuration file for each virtual host name and splitting all new logs into virtual host name-specific log files
done | tee $STATS/unique-ips-days-useragents-per-event-`echo $month | tr / -`
- echo "Wrote per-month results to $STATS/unique-ips-days-useragents-per-event-$month"
+ echo "Wrote per-month results to $STATS/unique-ips-days-useragents-per-event-`echo $month | tr / -`"
done
echo "Done."
diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogFixedMarkPassingEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogFixedMarkPassingEventImpl.java
index b2c5b0b23b3..cf26be5d2a1 100644
--- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogFixedMarkPassingEventImpl.java
+++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogFixedMarkPassingEventImpl.java
@@ -49,7 +49,8 @@ public class RaceLogFixedMarkPassingEventImpl extends RaceLogEventImpl implement
@Override
public String getShortInfo() {
- return getInvolvedBoats().get(0).getName() + " at mark " + getZeroBasedIndexOfPassedWaypoint() + " at "
+ return (getInvolvedBoats() == null || getInvolvedBoats().get(0) == null ? "Unknown" :
+ getInvolvedBoats().get(0).getName()) + " at mark " + getZeroBasedIndexOfPassedWaypoint() + " at "
+ getTimePointOfFixedPassing();
}
}
diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogDefineMarkEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogDefineMarkEventImpl.java
index b4f919ffc5d..acac6f03b27 100644
--- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogDefineMarkEventImpl.java
+++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/tracking/impl/RaceLogDefineMarkEventImpl.java
@@ -35,4 +35,9 @@ public class RaceLogDefineMarkEventImpl extends RaceLogEventImpl implements Race
return mark;
}
+ @Override
+ public String getShortInfo() {
+ return mark.toString();
+ }
+
}
diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/MarkImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/MarkImpl.java
index 9242bc49b5a..b56db228b72 100644
--- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/MarkImpl.java
+++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/MarkImpl.java
@@ -75,7 +75,4 @@ public class MarkImpl extends NamedImpl implements Mark {
public String toString() {
return getId() + " " + (getColor() == null ? "" : (getColor() + " ")) + super.toString();
}
-
-
-
}
diff --git a/java/com.sap.sailing.feature.p2build/raceanalysis.product b/java/com.sap.sailing.feature.p2build/raceanalysis.product
index 1dead91f56d..df90b607443 100755
--- a/java/com.sap.sailing.feature.p2build/raceanalysis.product
+++ b/java/com.sap.sailing.feature.p2build/raceanalysis.product
@@ -55,8 +55,6 @@
-
-
diff --git a/java/com.sap.sailing.feature/feature.xml b/java/com.sap.sailing.feature/feature.xml
index fc426ce383c..ec021a0fddb 100755
--- a/java/com.sap.sailing.feature/feature.xml
+++ b/java/com.sap.sailing.feature/feature.xml
@@ -87,13 +87,6 @@ Computes leaderboard information for sailing races and offers RESTful APIs to al
version="0.0.0"
unpack="false"/>
-
-
implements D
private DispatchCallStack currentCallstack;
+ private boolean processResultsScheduled;
+
/**
* Creates a batching dispatch service using the given dispatch implementation.
*
@@ -28,7 +30,21 @@ public class AutomaticBatchingDispatch implements D
*
*/
public AutomaticBatchingDispatch(DispatchAsync service) {
+ this(service, false);
+ }
+
+ /**
+ * Creates a batching dispatch service using the given dispatch implementation.
+ *
+ * The underlying dispatch service is responsible for the context propagation.
+ *
+ * @param service
+ * the underlying service implementation to use
+ *
+ */
+ public AutomaticBatchingDispatch(DispatchAsync service, boolean processResultsScheduled) {
this.executionContext = service;
+ this.processResultsScheduled = processResultsScheduled;
}
/**
@@ -73,7 +89,7 @@ public class AutomaticBatchingDispatch implements D
@Override
public void onSuccess(BatchResult result) {
- callStackInExecution.processResult(result);
+ callStackInExecution.processResult(result, processResultsScheduled);
}
});
}
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/dispatch/client/batching/DispatchCallStack.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/dispatch/client/batching/DispatchCallStack.java
index 2bec8747ffb..9f41dd26cf5 100644
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/dispatch/client/batching/DispatchCallStack.java
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/dispatch/client/batching/DispatchCallStack.java
@@ -2,6 +2,7 @@ package com.sap.sailing.gwt.dispatch.client.batching;
import java.util.LinkedList;
+import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.sap.sailing.gwt.dispatch.client.Action;
import com.sap.sailing.gwt.dispatch.client.DispatchContext;
@@ -70,22 +71,44 @@ public final class DispatchCallStack {
*
* @param batchResult
*/
- @SuppressWarnings("unchecked")
- public void processResult(BatchResult batchResult) {
+ public void processResult(BatchResult batchResult, boolean processResultsScheduled) {
assert (batchResult != null);
int loop = 0;
for (@SuppressWarnings("rawtypes")
DispatchCall call : this.actionQueue) {
Result result = batchResult.getResult(loop);
+ Throwable exception = batchResult.getException(loop);
- if (result == null) {
- Throwable exception = batchResult.getException(loop);
- call.getCallback().onFailure(exception);
+ CallbackCommand callbackCommand = new CallbackCommand(call, result, exception);
+ if(processResultsScheduled) {
+ SplitScheduler.get().schedule(callbackCommand);
} else {
- call.getCallback().onSuccess(result);
+ callbackCommand.execute();
}
loop++;
}
}
+
+ @SuppressWarnings({"rawtypes", "unchecked"})
+ private class CallbackCommand implements ScheduledCommand {
+ private final DispatchCall call;
+ private final Result result;
+ private final Throwable exception;
+ public CallbackCommand(DispatchCall call, Result result, Throwable exception) {
+ this.call = call;
+ this.result = result;
+ this.exception = exception;
+ }
+
+ @Override
+ public void execute() {
+ if (result == null) {
+ call.getCallback().onFailure(exception);
+ } else {
+ call.getCallback().onSuccess(result);
+ }
+ }
+
+ }
}
\ No newline at end of file
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/dispatch/client/batching/SplitScheduler.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/dispatch/client/batching/SplitScheduler.java
new file mode 100644
index 00000000000..c92b460b3db
--- /dev/null
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/dispatch/client/batching/SplitScheduler.java
@@ -0,0 +1,52 @@
+package com.sap.sailing.gwt.dispatch.client.batching;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.Scheduler;
+import com.google.gwt.core.client.Scheduler.RepeatingCommand;
+import com.google.gwt.core.client.Scheduler.ScheduledCommand;
+
+public class SplitScheduler {
+
+ private static final SplitScheduler INSTANCE = new SplitScheduler();
+
+ private List pendingCommands = new ArrayList();
+
+ private boolean scheduled = false;
+
+ private final RepeatingCommand repeatingCommand = new RepeatingCommand() {
+ @Override
+ public boolean execute() {
+ ScheduledCommand commandToExecute = pendingCommands.remove(0);
+
+ try {
+ commandToExecute.execute();
+ } catch (Exception e) {
+ if(GWT.getUncaughtExceptionHandler() != null) {
+ GWT.getUncaughtExceptionHandler().onUncaughtException(e);
+ }
+ }
+ scheduled = !pendingCommands.isEmpty();
+ return scheduled;
+ }
+ };
+
+ private SplitScheduler() {
+ }
+
+ public static SplitScheduler get() {
+ return INSTANCE;
+ }
+
+ public void schedule(ScheduledCommand command) {
+ pendingCommands.add(command);
+
+ if(!scheduled) {
+ Scheduler.get().scheduleIncremental(repeatingCommand);
+ scheduled = true;
+ }
+ }
+
+}
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/dispatch/client/impl/DispatchSystemImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/dispatch/client/impl/DispatchSystemImpl.java
index 5bb331f988f..464bf283c52 100644
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/dispatch/client/impl/DispatchSystemImpl.java
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/dispatch/client/impl/DispatchSystemImpl.java
@@ -16,8 +16,16 @@ import com.sap.sailing.gwt.dispatch.client.rpcimpl.SimpleDispatch;
public class DispatchSystemImpl implements DispatchSystem {
private final SimpleDispatch simpleDispatch = new SimpleDispatch(null);
- private final DispatchAsync dispatch = new CachingDispatch(new AutomaticBatchingDispatch(
- simpleDispatch));
+ private final DispatchAsync dispatch;
+
+ public DispatchSystemImpl() {
+ this(false);
+ }
+
+ public DispatchSystemImpl(boolean processResultsScheduled) {
+ dispatch = new CachingDispatch(new AutomaticBatchingDispatch(
+ simpleDispatch, processResultsScheduled));
+ }
@Override
public > void execute(final A action, final AsyncCallback callback) {
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/communication/event/GetRegattasAndLiveRacesForEventAction.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/communication/event/GetRegattasAndLiveRacesForEventAction.java
index e6c9cf92821..b70f6c18a2c 100644
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/communication/event/GetRegattasAndLiveRacesForEventAction.java
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/communication/event/GetRegattasAndLiveRacesForEventAction.java
@@ -43,7 +43,7 @@ public class GetRegattasAndLiveRacesForEventAction implements SailingAction extends DataEn
if (additionalWidget != null) {
panel.add(additionalWidget);
}
- Grid formGrid = new Grid(6, 2);
+ Grid formGrid = new Grid(7, 2);
panel.add(formGrid);
- formGrid.setWidget(0, 0, new Label(stringMessages.startDate() + ":"));
- formGrid.setWidget(0, 1, startDateBox);
- formGrid.setWidget(1, 0, new Label(stringMessages.endDate() + ":"));
- formGrid.setWidget(1, 1, endDateBox);
- formGrid.setWidget(2, 0, new Label(stringMessages.scoringSystem() + ":"));
- formGrid.setWidget(2, 1, scoringSchemeListBox);
- formGrid.setWidget(3, 0, new Label(stringMessages.event() + ":"));
- formGrid.setWidget(3, 1, sailingEventsListBox);
- formGrid.setWidget(4, 0, new Label(stringMessages.courseArea() + ":"));
- formGrid.setWidget(4, 1, courseAreaListBox);
- formGrid.setWidget(5, 0, new Label(stringMessages.useStartTimeInference() + ":"));
- formGrid.setWidget(5, 1, useStartTimeInferenceCheckBox);
+
+ formGrid.setWidget(0, 0, new Label(stringMessages.timeZone() + ":"));
+ formGrid.setWidget(0, 1, new Label(DateAndTimeFormatterUtil.getClientTimeZoneAsGMTString()));
+ formGrid.setWidget(1, 0, new Label(stringMessages.startDate() + ":"));
+ formGrid.setWidget(1, 1, startDateBox);
+ formGrid.setWidget(2, 0, new Label(stringMessages.endDate() + ":"));
+ formGrid.setWidget(2, 1, endDateBox);
+ formGrid.setWidget(3, 0, new Label(stringMessages.scoringSystem() + ":"));
+ formGrid.setWidget(3, 1, scoringSchemeListBox);
+ formGrid.setWidget(4, 0, new Label(stringMessages.event() + ":"));
+ formGrid.setWidget(4, 1, sailingEventsListBox);
+ formGrid.setWidget(5, 0, new Label(stringMessages.courseArea() + ":"));
+ formGrid.setWidget(5, 1, courseAreaListBox);
+ formGrid.setWidget(6, 0, new Label(stringMessages.useStartTimeInference() + ":"));
+ formGrid.setWidget(6, 1, useStartTimeInferenceCheckBox);
setupAdditionalWidgetsOnPanel(panel, formGrid);
return panel;
}
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventDialog.java
index 51bd281f3dd..5c548c58620 100644
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventDialog.java
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EventDialog.java
@@ -24,6 +24,7 @@ import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.gwt.ui.client.DataEntryDialogWithBootstrap;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
+import com.sap.sailing.gwt.ui.common.client.DateAndTimeFormatterUtil;
import com.sap.sailing.gwt.ui.shared.BetterDateTimeBox;
import com.sap.sailing.gwt.ui.shared.CourseAreaDTO;
import com.sap.sailing.gwt.ui.shared.EventDTO;
@@ -195,24 +196,25 @@ public abstract class EventDialog extends DataEntryDialogWithBootstrap
if (additionalWidget != null) {
panel.add(additionalWidget);
}
-
- Grid formGrid = new Grid(8, 2);
+ Grid formGrid = new Grid(9, 2);
formGrid.setWidget(0, 0, new Label(stringMessages.name() + ":"));
formGrid.setWidget(0, 1, nameEntryField);
formGrid.setWidget(1, 0, new Label(stringMessages.description() + ":"));
formGrid.setWidget(1, 1, descriptionEntryField);
formGrid.setWidget(2, 0, new Label(stringMessages.venue() + ":"));
formGrid.setWidget(2, 1, venueEntryField);
- formGrid.setWidget(3, 0, new Label(stringMessages.startDate() + ":"));
- formGrid.setWidget(3, 1, startDateBox);
- formGrid.setWidget(4, 0, new Label(stringMessages.endDate() + ":"));
- formGrid.setWidget(4, 1, endDateBox);
- formGrid.setWidget(5, 0, new Label(stringMessages.isPublic() + ":"));
- formGrid.setWidget(5, 1, isPublicCheckBox);
- formGrid.setWidget(6, 0, new Label(stringMessages.eventOfficialWebsiteURL() + ":"));
- formGrid.setWidget(6, 1, officialWebsiteURLEntryField);
- formGrid.setWidget(7, 0, new Label(stringMessages.eventSailorsInfoWebsiteURL() + ":"));
- formGrid.setWidget(7, 1, sailorsInfoWebsiteURLEntryField);
+ formGrid.setWidget(3, 0, new Label(stringMessages.timeZone() + ":"));
+ formGrid.setWidget(3, 1, new Label(DateAndTimeFormatterUtil.getClientTimeZoneAsGMTString()));
+ formGrid.setWidget(4, 0, new Label(stringMessages.startDate() + ":"));
+ formGrid.setWidget(4, 1, startDateBox);
+ formGrid.setWidget(5, 0, new Label(stringMessages.endDate() + ":"));
+ formGrid.setWidget(5, 1, endDateBox);
+ formGrid.setWidget(6, 0, new Label(stringMessages.isPublic() + ":"));
+ formGrid.setWidget(6, 1, isPublicCheckBox);
+ formGrid.setWidget(7, 0, new Label(stringMessages.eventOfficialWebsiteURL() + ":"));
+ formGrid.setWidget(7, 1, officialWebsiteURLEntryField);
+ formGrid.setWidget(8, 0, new Label(stringMessages.eventSailorsInfoWebsiteURL() + ":"));
+ formGrid.setWidget(8, 1, sailorsInfoWebsiteURLEntryField);
TabLayoutPanel tabPanel = new TabLayoutPanel(30, Unit.PX);
tabPanel.setHeight("500px");
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCourseManagementWidget.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCourseManagementWidget.java
index 623f5cf53f2..d46c306e936 100644
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCourseManagementWidget.java
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCourseManagementWidget.java
@@ -126,7 +126,6 @@ public class RaceLogCourseManagementWidget extends CourseManagementWidget {
@Override
public void onSuccess(RaceCourseDTO result) {
updateWaypointsAndControlPoints(result);
- marks.refresh(result.getMarks());
}
@Override
@@ -134,5 +133,20 @@ public class RaceLogCourseManagementWidget extends CourseManagementWidget {
errorReporter.reportError("Could not load course: " + caught.getMessage());
}
});
+
+ sailingService.getMarksInRaceLog(leaderboardName, raceColumnName, fleetName,
+ new AsyncCallback>() {
+ @Override
+ public void onSuccess(Iterable result) {
+ marks.refresh(result);
+ }
+
+ @Override
+ public void onFailure(Throwable caught) {
+ errorReporter.reportError(
+ stringMessages.errorTryingToObtainTheMarksOfTheRace(
+ caught.getMessage()));
+ }
+ });
}
}
\ No newline at end of file
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/ReplicationPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/ReplicationPanel.java
index 5f0bd5fff7a..71707b47540 100755
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/ReplicationPanel.java
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/ReplicationPanel.java
@@ -273,7 +273,8 @@ public class ReplicationPanel extends FlowPanel {
errorReporter.reportPersistentInformation(stringMessages.warningServerIsReplica());
registeredMasters.insertRow(i);
registeredMasters.setWidget(i, 0, new Label(stringMessages.replicatingFromMaster(replicatingFromMaster.getHostname(),
- replicatingFromMaster.getMessagingPort(), replicatingFromMaster.getServletPort())));
+ replicatingFromMaster.getMessagingPort(), replicatingFromMaster.getServletPort(),
+ replicatingFromMaster.getMessagingHostname(), replicatingFromMaster.getExchangeName())));
i++;
addButton.setEnabled(false);
stopReplicationButton.setEnabled(true);
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 4692ebb8f1a..98758f7b345 100644
--- 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
@@ -327,7 +327,7 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, c
String messagingPortNumber();
String servletPortNumber();
String registeredAt(String string);
- String replicatingFromMaster(String hostname, int jmsPort, int servletPort);
+ String replicatingFromMaster(String hostname, int jmsPort, int servletPort, String messagingHostname, String exchangeName);
String showWindSpeedSeries();
String showWindDirectionSeries();
String fleet();
@@ -1113,6 +1113,7 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, c
String invalidSelection();
String advancePassId();
String pleaseSelectAScoringResult();
+ String timeZone();
String eventOfficialWebsiteURL();
String eventSailorsInfoWebsiteURL();
String eventOverviewURL();
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 122f8d1eeae..9d31e31913d 100644
--- 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
@@ -338,7 +338,7 @@ courseMiddleLine=Course middle line
messagingPortNumber=Messaging port number (0 for default)
servletPortNumber=Servlet port number
registeredAt=Registered at {0}
-replicatingFromMaster=Replicating from master {0}, messaging port {1}, servlet port {2}
+replicatingFromMaster=Replicating from master {0}:{2}, messaging port {3}:{1}, exchange {4}
showWindSpeedSeries=Show wind speed data
showWindDirectionSeries=Show wind directions data
fleet=Fleet
@@ -1084,6 +1084,7 @@ sponsorImageURLs=Sponsor Image URLs
invalidSelection=The current selection isn''t valid.
advancePassId=Advance Pass ID
pleaseSelectAScoringResult=Please select a scoring result...
+timeZone=Time zone
eventOfficialWebsiteURL=Official Website URL
eventSailorsInfoWebsiteURL=Sailors Info Website URL
eventOverviewURL=Event Overview URL
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 34ca0a673b5..effbb7d8212 100644
--- 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
@@ -339,7 +339,7 @@ courseMiddleLine=Kursmittellinie
messagingPortNumber=Messaging-Portnummer (0 für Default)
servletPortNumber=Servlet Portnummer
registeredAt=Registriert {0}
-replicatingFromMaster=Repliziert von master {0}, Messaging Port {1}, Servlet Port {2}
+replicatingFromMaster=Repliziert von master {0}:{2}, Messaging Port {3}:{1}, Exchange {4}
showWindSpeedSeries=Daten für Windgeschwindigkeit zeigen
showWindDirectionSeries=Daten für Windrichtung zeigen
fleet=Flotte
@@ -1079,6 +1079,7 @@ sponsorImageURLs=Sponsorenlogo-URLs
invalidSelection=Die aktuelle Selektion ist nicht gültig.
advancePassId=Pass ID erhöhen
pleaseSelectAScoringResult=Bitte ein Ergebnis auswählen...
+timeZone=Zeitzone
eventOfficialWebsiteURL=URL der offiziellen Veranstaltungswebseite
eventSailorsInfoWebsiteURL=URL zur Webseite mit Seglerinfos
eventOverviewURL=URL der Veranstaltungsübersicht
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 f2499f82174..16a0d4096d2 100644
--- 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
@@ -331,7 +331,7 @@ courseMiddleLine=Средняя линия курса
messagingPortNumber=Номер порта обмена сообщениями ( по умолчанию 0)
servletPortNumber=Номер порта сервлета
registeredAt=Зарегистрирован в {0}
-replicatingFromMaster=Дублирование с основного {0}, порт передачи обмена сообщениями {1}, порт сервлета {2}
+replicatingFromMaster=Replicating from master {0}:{2}, messaging port {3}:{1}, exchange {4}
showWindSpeedSeries=Показать данные о силе ветра
showWindDirectionSeries=Показать данные о направлении ветра
fleet=Флот
@@ -1032,6 +1032,7 @@ imageURLs=Image URLs
videoURLs=Video URLs
sponsorImageURLs=Sponsor Image URLs
pleaseSelectAScoringResult=Please select a scoring result...
+timeZone=Time zone
eventOfficialWebsiteURL=Official Website URL
eventSailorsInfoWebsiteURL=Sailors Info Website URL
eventOverviewURL=Event Overview URL
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties
index 5f720552284..acb7658f706 100644
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties
@@ -328,7 +328,7 @@ setFixedPassing=Set time as mark passing
maximumSpeedOverGroundInKnotsTooltip=比赛中参赛队的最大实际速度
twoMarkControlPoint=2-mark-controlpoint
earlyStarters=Early starters
-replicatingFromMaster=Replicating from master {0}, messaging port {1}, servlet port {2}
+replicatingFromMaster=Replicating from master {0}:{2}, messaging port {3}:{1}, exchange {4}
latitude=Latitude
filterByLeaderboard=Filter by Leaderboard
fromDeg=从 (角度)
@@ -840,6 +840,7 @@ refreshIntervalMustBeGreaterThanXSeconds=刷新间隔必须大于0秒 {0}
authorName=Author name
raceIsInStartphase=开始阶段
pleaseSelectAScoringResult=Please select a scoring result...
+timeZone=Time zone
portSide=左舷
explainReplicationHostname=Hostname where the replication master is running on.
igtimiAccounts=Igtimi Accounts
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapSettings.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapSettings.java
index ef42bc32951..e47cdb01de3 100644
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapSettings.java
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/shared/racemap/RaceMapSettings.java
@@ -20,9 +20,9 @@ public class RaceMapSettings extends AbstractSettings {
private RaceMapHelpLinesSettings helpLinesSettings;
- private boolean transparentHoverlines = true;
+ private boolean transparentHoverlines = false; // as discussed with Stefan on 2015-12-08
- private int hoverlineStrokeWeight = 10;
+ private int hoverlineStrokeWeight = 15; // as discussed with Stefan on 2015-12-08
private long tailLengthInMilliseconds = 100000l;
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/common/client/DateAndTimeFormatterUtil.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/common/client/DateAndTimeFormatterUtil.java
index 3938fc8090b..44b43feb9e6 100644
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/common/client/DateAndTimeFormatterUtil.java
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/common/client/DateAndTimeFormatterUtil.java
@@ -60,4 +60,12 @@ public class DateAndTimeFormatterUtil {
return result;
}
+
+ public static String getClientTimeZoneAsGMTString() {
+ Date now = new Date();
+ @SuppressWarnings("deprecation")
+ int localeTimezoneOffset = now.getTimezoneOffset();
+ TimeZone localeTimeZone = TimeZone.createTimeZone(localeTimezoneOffset);
+ return localeTimeZone.getGMTString(now);
+ }
}
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 6fe3eb5aa90..11cd2e1b1c5 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
@@ -864,8 +864,9 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
private RaceInfoDTO createRaceInfoDTO(String seriesName, RaceColumn raceColumn, Fleet fleet) {
RaceInfoDTO raceInfoDTO = new RaceInfoDTO();
RaceLog raceLog = raceColumn.getRaceLog(fleet);
+ final TrackedRace trackedRace = raceColumn.getTrackedRace(fleet);
+ raceInfoDTO.isTracked = trackedRace != null ? true : false;
if (raceLog != null) {
- raceInfoDTO.isTracked = raceColumn.getTrackedRace(fleet) != null ? true : false;
ReadonlyRaceState state = ReadonlyRaceStateImpl.create(getService(), raceLog);
TimePoint startTime = state.getStartTime();
if (startTime != null) {
@@ -881,13 +882,14 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
} else {
raceInfoDTO.finishedTime = null;
if (raceInfoDTO.isTracked) {
- TimePoint endOfRace = raceColumn.getTrackedRace(fleet).getEndOfRace();
+ TimePoint endOfRace = trackedRace.getEndOfRace();
raceInfoDTO.finishedTime = endOfRace != null ? endOfRace.asDate() : null;
}
}
+ final TimePoint now = MillisecondsTimePoint.now();
if (startTime != null) {
- FlagPoleState activeFlagState = state.getRacingProcedure().getActiveFlags(startTime, MillisecondsTimePoint.now());
+ FlagPoleState activeFlagState = state.getRacingProcedure().getActiveFlags(startTime, now);
List activeFlags = activeFlagState.getCurrentState();
FlagPoleState previousFlagState = activeFlagState.getPreviousState(state.getRacingProcedure(), startTime);
List previousFlags = previousFlagState.getCurrentState();
@@ -919,7 +921,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
CourseBase lastCourse = state.getCourseDesign();
if (lastCourse != null) {
- raceInfoDTO.lastCourseDesign = convertToRaceCourseDTO(lastCourse, /* trackedRace */ null, /* timePoint */ null);
+ raceInfoDTO.lastCourseDesign = convertToRaceCourseDTO(lastCourse, new TrackedRaceMarkPositionFinder(trackedRace), now);
raceInfoDTO.lastCourseName = lastCourse.getName();
}
@@ -937,7 +939,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
Wind wind = state.getWindFix();
if (wind != null) {
- raceInfoDTO.lastWind = createWindDTOFromAlreadyAveraged(wind, MillisecondsTimePoint.now());
+ raceInfoDTO.lastWind = createWindDTOFromAlreadyAveraged(wind, now);
}
fillStartProcedureSpecifics(raceInfoDTO, state);
@@ -947,7 +949,6 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
raceInfoDTO.fleetName = fleet.getName();
raceInfoDTO.fleetOrdering = fleet.getOrdering();
raceInfoDTO.raceIdentifier = raceColumn.getRaceIdentifier(fleet);
- raceInfoDTO.isTracked = raceColumn.getTrackedRace(fleet) != null ? true : false;
return raceInfoDTO;
}
@@ -3292,8 +3293,8 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
if (replicatingFromMaster == null) {
master = null;
} else {
- master = new ReplicationMasterDTO(replicatingFromMaster.getHostname(), replicatingFromMaster.getMessagingPort(),
- replicatingFromMaster.getServletPort());
+ master = new ReplicationMasterDTO(replicatingFromMaster.getHostname(), replicatingFromMaster.getServletPort(),
+ replicatingFromMaster.getMessagingHostname(), replicatingFromMaster.getMessagingPort(), replicatingFromMaster.getExchangeName());
}
return new ReplicationStateDTO(master, replicaDTOs, service.getServerIdentifier().toString());
}
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/ReplicationMasterDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/ReplicationMasterDTO.java
index 76973fdec47..f9a4591133d 100755
--- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/ReplicationMasterDTO.java
+++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/ReplicationMasterDTO.java
@@ -6,12 +6,16 @@ public class ReplicationMasterDTO implements IsSerializable {
private String hostname;
private int messagingPort;
private int servletPort;
+ private String messagingHostname;
+ private String exchangeName;
ReplicationMasterDTO() {}
- public ReplicationMasterDTO(String hostname, int messagingPort, int servletPort) {
+ public ReplicationMasterDTO(String hostname, int servletPort, String messagingHostname, int messagingPort, String exchangeName) {
super();
this.hostname = hostname;
- this.messagingPort = messagingPort;
this.servletPort = servletPort;
+ this.messagingHostname = messagingHostname;
+ this.messagingPort = messagingPort;
+ this.exchangeName = exchangeName;
}
public String getHostname() {
return hostname;
@@ -22,4 +26,10 @@ public class ReplicationMasterDTO implements IsSerializable {
public int getServletPort() {
return servletPort;
}
+ public String getMessagingHostname() {
+ return messagingHostname;
+ }
+ public String getExchangeName() {
+ return exchangeName;
+ }
}
\ No newline at end of file
diff --git a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/home/solutions/SailingAnalyticsNotes.html b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/home/solutions/SailingAnalyticsNotes.html
index e5133b4ddbb..69c32d47aea 100644
--- a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/home/solutions/SailingAnalyticsNotes.html
+++ b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/home/solutions/SailingAnalyticsNotes.html
@@ -8,11 +8,11 @@
New line hover behavior in race map. When the mouse is moved onto a line, for example the start line, a transparent,
- wider line is activated behind it that acts as a buffer for the thin line, where the text displayed by the hover is still shown.
- This makes it easier to hover over the lines. These wider lines can be made semi transparent instead of transparent
- by unticking the corresponding checkbox in the settings of the race map. Furthermore the stroke weight of the wider lines can be
- configured in the same settings dialog.
-
+ wider line is activated behind it that acts as a buffer for the thin line, where the text displayed by the hover is still shown.
+ This makes it easier to hover over the lines. These wider lines can be made semi transparent instead of transparent
+ by unticking the corresponding checkbox in the settings of the race map. Furthermore the stroke weight of the wider lines can be
+ configured in the same settings dialog.
+
The race viewer (RaceBoard.html) now intelligently chooses a layout that suits the screen size.
When only little horizontal space is available, only the sail number and nationality but not the
competitor's long name is displayed by default. When vertical space is scarce, competitor and wind
@@ -22,6 +22,11 @@
With the changes described above, the RaceBoard is now also accessible from the races page on mobile devices.
+
For overall / series leaderboards such as a national sailing league or the Extreme Sailing Series, the
+ live status of the overall leaderboard is now indicated. As long as a live race is ongoing, the respective
+ column in the overall leaderboard is highlighted, and a comment is displayed that indicates which regatta
+ is currently still live.
+