Merge branch 'master' into bug4370

This commit is contained in:
Axel Uhl committed 2017-11-22 09:52:14 +01:00
commit 35b2d6220c
12 files changed
+62 -20

No files matched your search

@@ -269,7 +269,7 @@ public interface Leaderboard extends LeaderboardBase, HasRaceColumns {
* competitor doesn't appear in any of the race column's attached tracked races. A 0.0 score is returned
* if the competitor's result for <code>race</code> is discarded.
*/
Double getNetPoints(Competitor competitor, RaceColumn race, TimePoint timePoint) throws NoWindException;
Double getNetPoints(Competitor competitor, RaceColumn race, TimePoint timePoint);
/**
* Tells whether the contribution of <code>raceColumn</code> is discarded in the current leaderboard's standings for
@@ -588,4 +588,10 @@ public interface Leaderboard extends LeaderboardBase, HasRaceColumns {
BoatClass getBoatClass();
LeaderboardType getLeaderboardType();
/**
* Tells if there is at least one non-{@code null} score for the given {@code competitor} in the
* leaderboard.
*/
boolean hasScores(Competitor competitor, TimePoint timePoint);
}
@@ -1148,4 +1148,13 @@ public abstract class AbstractLeaderboardWithCache implements Leaderboard {
}
}
@Override
public boolean hasScores(Competitor competitor, TimePoint timePoint) {
for (final RaceColumn raceColumn : getRaceColumns()) {
if (getTotalPoints(competitor, raceColumn, timePoint) != null) {
return true;
}
}
return false;
}
}
@@ -425,13 +425,13 @@ public abstract class AbstractSimpleLeaderboardImpl extends AbstractLeaderboardW
}
@Override
public Double getNetPoints(Competitor competitor, RaceColumn raceColumn, TimePoint timePoint) throws NoWindException {
public Double getNetPoints(Competitor competitor, RaceColumn raceColumn, TimePoint timePoint) {
return getNetPoints(competitor, raceColumn, getRaceColumns(), timePoint);
}
@Override
public Double getNetPoints(Competitor competitor, RaceColumn raceColumn,
Iterable<RaceColumn> raceColumnsToConsider, TimePoint timePoint) throws NoWindException {
Iterable<RaceColumn> raceColumnsToConsider, TimePoint timePoint) {
final Set<RaceColumn> discardedRaceColumns = getResultDiscardingRule()
.getDiscardedRaceColumns(competitor, this, raceColumnsToConsider, timePoint);
return getNetPoints(competitor, raceColumn, timePoint, discardedRaceColumns);
@@ -280,7 +280,7 @@ public class DelegatingRegattaLeaderboardWithCompetitorElimination extends Abstr
return getFullLeaderboard().getMaxPointsReason(competitor, race, timePoint);
}
public Double getNetPoints(Competitor competitor, RaceColumn race, TimePoint timePoint) throws NoWindException {
public Double getNetPoints(Competitor competitor, RaceColumn race, TimePoint timePoint) {
return getFullLeaderboard().getNetPoints(competitor, race, timePoint);
}
@@ -171,9 +171,16 @@ public abstract class AbstractMetaLeaderboard extends AbstractSimpleLeaderboardI
@Override
public int getTrackedRank(Competitor competitor, RaceColumn race, TimePoint timePoint) {
final List<Competitor> competitorsFromBestToWorst = ((MetaLeaderboardColumn) race).getLeaderboard().getCompetitorsFromBestToWorst(timePoint);
Util.removeAll(getSuppressedCompetitors(), competitorsFromBestToWorst);
return competitorsFromBestToWorst.indexOf(competitor)+1;
final Leaderboard leaderboard = ((MetaLeaderboardColumn) race).getLeaderboard();
final int result;
if (leaderboard.hasScores(competitor, timePoint)) {
final List<Competitor> competitorsFromBestToWorst = leaderboard.getCompetitorsFromBestToWorst(timePoint);
Util.removeAll(getSuppressedCompetitors(), competitorsFromBestToWorst);
result = competitorsFromBestToWorst.indexOf(competitor)+1;
} else {
result = 0;
}
return result;
}
@Override
@@ -18,6 +18,12 @@
figures which are so important for any foiling boat class. Note, that this feature is also available
on overall leaderboards, providing foiling stats across an entire season or event series.
</li>
<li>When a leaderboard belongs to a leaderboard group with an overall (series) leaderboard and the
leaderboard has no scores at all yet for a competitor, that competitor won't be assigned a score
in the overall (series) leaderboard either. This way, when an act or event has its leaderboard already
linked to the series leaderboard group, no scores will show in the series leaderboard before the
act/event starts producing scores for the competitors.
</li>
</ul>
<h5 class="articleSubheadline">October 2017</h5>
@@ -12,6 +12,7 @@ import com.google.gwt.uibinder.client.UiHandler;
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.CheckBox;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FileUpload;
import com.google.gwt.user.client.ui.FormPanel;
@@ -35,6 +36,8 @@ public abstract class AbstractFileImportWidget extends Composite {
@UiField FileUpload fileUploadUi;
@UiField ListBox preferredImporterUi;
@UiField Button importButtonUi;
@UiField
CheckBox downsampleUi;
@UiField Image loadingImageUi;
@UiField FormPanel formPanelUi;
private final TrackFileImportDeviceIdentifierTableWrapper table;
@@ -72,6 +75,10 @@ public abstract class AbstractFileImportWidget extends Composite {
formPanelUi.submit();
}
protected void setDownsampleOptionVisible(boolean visible) {
downsampleUi.setVisible(visible);
}
@UiHandler("formPanelUi")
void onFileImportComplete(SubmitCompleteEvent event) {
if (shouldClearListOnNewUploadComplete) {
@@ -22,6 +22,7 @@
<g:HTMLPanel addStyleNames="{style.formPanelContent}">
<g:FileUpload name="file" ui:field="fileUploadUi"/>
<g:ListBox name="preferredImporter" ui:field="preferredImporterUi" height="21px"/>
<g:CheckBox name="downsample" checked="true" ui:field="downsampleUi">Downsample</g:CheckBox>
<g:Button styleName="" ui:field="importButtonUi"/>
<g:Image resource="{res.transparentGif}" addStyleNames="{style.loadingImage}" ui:field="loadingImageUi"/>
</g:HTMLPanel>
@@ -15,6 +15,7 @@ public class SensorDataImportWidget extends AbstractFileImportWidget implements
super("/sailingserver/sensordata/import", stringMessages, table, sailingService, errorReporter);
setMultipleFileUploadEnabled(true);
setShouldClearListOnNewUploadComplete(false);
setDownsampleOptionVisible(true);
}
@Override
@@ -14,6 +14,7 @@ public class TrackFileImportWidget extends AbstractFileImportWidget implements I
public TrackFileImportWidget(TrackFileImportDeviceIdentifierTableWrapper table, StringMessages stringMessages,
final SailingServiceAsync sailingService, final ErrorReporter errorReporter) {
super("/sailingserver/trackfiles/import", stringMessages, table, sailingService, errorReporter);
setDownsampleOptionVisible(false);
}
@Override
@@ -473,7 +473,6 @@ import com.sap.sse.common.Util;
import com.sap.sse.common.Util.Pair;
import com.sap.sse.common.Util.Triple;
import com.sap.sse.common.WithID;
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;
@@ -3097,7 +3096,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
TimePoint newestEvent = trackedRace.getTimePointOfNewestEvent();
final TimePoint startTime = from == null ? trackedRace.getStartOfTracking() : new MillisecondsTimePoint(from);
final TimePoint endTime = (to == null || to.after(newestEvent.asDate())) ? newestEvent : new MillisecondsTimePoint(to);
final long adjustedStepSizeInMillis = (long) Math.max((double) stepSizeInMillis, startTime.until(endTime).divide(new MillisecondsDurationImpl(stepSizeInMillis)));
final long adjustedStepSizeInMillis = (long) Math.max((double) stepSizeInMillis, startTime.until(endTime).divide(SailingServiceConstants.MAX_NUMBER_OF_FIXES_TO_QUERY).asMillis());
result = new CompetitorsRaceDataDTO(detailType, startTime==null?null:startTime.asDate(), endTime==null?null:endTime.asDate());
final int MAX_CACHE_SIZE = SailingServiceConstants.MAX_NUMBER_OF_FIXES_TO_QUERY;
final ConcurrentHashMap<TimePoint, WindLegTypeAndLegBearingCache> cachesByTimePoint = new ConcurrentHashMap<>();
@@ -52,14 +52,14 @@ public class SensorDataImportServlet extends AbstractFileUploadServlet {
*
* @param files
* the file items together with the names of the importer to use for importing the respective file's
* contents; the importer names are matched against {@link DoubleVectorFixImporter#getType()} for
* all importers found registered in the OSGi registry. The first matching importer is used for the
* file. The importer is selected on a per-file basis.
* contents; the importer names are matched against {@link DoubleVectorFixImporter#getType()} for all
* importers found registered in the OSGi registry. The first matching importer is used for the file. The
* importer is selected on a per-file basis.
*
* @throws IOException
*/
private Iterable<TrackFileImportDeviceIdentifier> importFiles(Iterable<Pair<String, FileItem>> files)
throws IOException {
private Iterable<TrackFileImportDeviceIdentifier> importFiles(boolean enableDownsampler,
Iterable<Pair<String, FileItem>> files) throws IOException {
final Set<TrackFileImportDeviceIdentifier> deviceIds = new HashSet<>();
final Map<DeviceIdentifier, TimePoint> from = new HashMap<>();
final Map<DeviceIdentifier, TimePoint> to = new HashMap<>();
@@ -102,7 +102,7 @@ public class SensorDataImportServlet extends AbstractFileUploadServlet {
}
}
}
}, fi.getName(), requestedImporterName, /* downsample */ true);
}, fi.getName(), requestedImporterName, enableDownsampler);
logger.log(Level.INFO, "Successfully imported file " + requestedImporterName);
} catch (FormatNotSupportedException e) {
logger.log(Level.INFO, "Failed to import file " + requestedImporterName);
@@ -119,10 +119,14 @@ public class SensorDataImportServlet extends AbstractFileUploadServlet {
protected void process(List<FileItem> fileItems, HttpServletRequest req, HttpServletResponse resp)
throws IOException {
String importerName = null;
searchForPreferredImporter: for (FileItem fi : fileItems) {
if ("preferredImporter".equalsIgnoreCase(fi.getFieldName())) {
importerName = fi.getString();
break searchForPreferredImporter;
boolean enableDownsampler = false;
for (FileItem fi : fileItems) {
if (fi.isFormField()) {
if ("preferredImporter".equalsIgnoreCase(fi.getFieldName())) {
importerName = fi.getString();
} else if ("downsample".equalsIgnoreCase(fi.getFieldName())) {
enableDownsampler = "on".equalsIgnoreCase(fi.getString());
}
}
}
if (importerName == null) {
@@ -134,7 +138,8 @@ public class SensorDataImportServlet extends AbstractFileUploadServlet {
filesAndImporterNames.add(new Pair<>(importerName, fi));
}
}
final Iterable<TrackFileImportDeviceIdentifier> mappingList = importFiles(filesAndImporterNames);
final Iterable<TrackFileImportDeviceIdentifier> mappingList = importFiles(enableDownsampler,
filesAndImporterNames);
resp.setContentType("text/html");
for (TrackFileImportDeviceIdentifier mapping : mappingList) {
String stringRep = mapping.getId().toString();