Merge remote-tracking branch 'server/master'

This commit is contained in:
Axel Uhl committed 2017-11-22 09:47:19 +01:00
commit 962f55de64
10 files changed
+55 -18

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
@@ -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
@@ -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();