Merge branch 'master' into bug5311

This commit is contained in:
Axel Uhl committed 2021-09-21 15:28:50 +02:00
commit b6e147f4fb
154 files changed
+1301 -591

No files matched your search

@@ -101,7 +101,6 @@ public class RaceOfCompetitorWithContext implements HasRaceOfCompetitorContext {
if (competitorStartTime == null) {
return null;
}
Double distance = trackedRace.getDistanceFromStarboardSideOfStartLine(getCompetitor(), competitorStartTime).getMeters();
Double length = trackedRace.getStartLine(competitorStartTime).getLength().getMeters();
return distance / length;
@@ -63,6 +63,9 @@ public enum BoatClassMasterdata {
HOBIE_TIGER ("Hobie Tiger", true, 5.51, 2.60, BoatHullType.CATAMARAN, true),
HOBIE_WILD_CAT ("Hobie Wild Cat", true, 5.49, 2.59, BoatHullType.CATAMARAN, true, "Hobie Wild Cat F18"),
INTERNATIONAL_14("International 14", true, 4.27, 1.83, BoatHullType.MONOHULL, true, "I14", "Int.14", "Int14"),
IQFOIL_MEN("iQFOil Men", true, 2.20, 0.95, BoatHullType.SURFERBOARD, false, "iQFOil 95 Men"),
IQFOIL_WOMEN("iQFOil Women", true, 2.20, 0.95, BoatHullType.SURFERBOARD, false, "iQFOil 95 Women"),
IQFOIL_YOUTH("iQFOil Youth", true, 2.15, 0.85, BoatHullType.SURFERBOARD, false, "iQFOil 85 Youth"),
J22 ("J/22", true, 6.86, 2.44, BoatHullType.MONOHULL, true, "J22", "J-22"),
J24 ("J/24", true, 7.32, 2.67, BoatHullType.MONOHULL, true, "J24", "J-24"),
J70 ("J/70", true, 6.93, 2.25, BoatHullType.MONOHULL, true, "J70", "J-70"),
@@ -76,9 +79,9 @@ public enum BoatClassMasterdata {
KIELZUGVOGEL ("Kielzugvogel", true, 5.80, 1.88, BoatHullType.MONOHULL, false, "KZV"),
FORMULA_KITE ("Kite", true, 3.35, 1.52, BoatHullType.MONOHULL, false, "Formula Kite"),
LASER_2 ("Laser 2", true, 4.39, 1.42, BoatHullType.MONOHULL, false, "Laser II", "Laser2", "Laser-2", "Laser-II"),
LASER_4_7 ("Laser 4.7", true, 4.20, 1.39, BoatHullType.MONOHULL, false, "L4.7"),
LASER_RADIAL ("Laser Radial", true, 4.19, 1.41, BoatHullType.MONOHULL, false, "LAR", "Laser RAD", "RAD", "Radial"),
LASER_INT ("Laser Int.", true, 4.19, 1.39, BoatHullType.MONOHULL, false, "Laser", "LSR", "Laser Standard"),
LASER_4_7 ("Laser 4.7", true, 4.20, 1.39, BoatHullType.MONOHULL, false, "L4.7", "ILCA 4", "ILCA4"),
LASER_RADIAL ("Laser Radial", true, 4.19, 1.41, BoatHullType.MONOHULL, false, "LAR", "Laser RAD", "RAD", "Radial", "ILCA 6", "ILCA6"),
LASER_INT ("Laser Int.", true, 4.19, 1.39, BoatHullType.MONOHULL, false, "Laser", "LSR", "Laser Standard", "ILCA 7", "ILCA7"),
LASER_SB3 ("Laser SB3", true, 6.15, 2.15, BoatHullType.MONOHULL, false, "LSB3", "SB20"),
LAGO_26 ("Lago 26", true, 7.95, 2.50, BoatHullType.MONOHULL, true, "Lago26"),
LONGTZE ("Longtze", true, 6.85, 2.57, BoatHullType.MONOHULL, true, "Swiss Longtze Class"),
@@ -123,7 +123,8 @@ public class BoatDTO extends NamedSecuredObjectDTO implements WithID, Serializab
@Override
public String toString() {
return getName() == null ? (getBoatClass().getName() + " / " + getSailId()) : getName();
return "BoatDTO [idAsString=" + idAsString + ", boatClass=" + boatClass + ", sailId=" + sailId + ", color="
+ color + "]";
}
@Override
@@ -7,7 +7,9 @@ Bundle-Version: 1.0.0.qualifier
Bundle-Vendor: SAP
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Require-Bundle: com.sap.sse.mongodb,
org.mongodb.mongo-java-driver;bundle-version="3.6.4"
org.mongodb.bson;bundle-version="4.3.1",
org.mongodb.driver-core;bundle-version="4.3.1",
org.mongodb.driver-sync;bundle-version="4.3.1"
Export-Package: com.sap.sailing.domain.igtimiadapter.persistence
Import-Package: com.sap.sailing.domain.common.security,
com.sap.sse.security,
@@ -4,7 +4,7 @@ import org.bson.Document;
import com.mongodb.WriteConcern;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.UpdateOptions;
import com.mongodb.client.model.ReplaceOptions;
import com.sap.sailing.domain.igtimiadapter.persistence.MongoObjectFactory;
public class MongoObjectFactoryImpl implements MongoObjectFactory {
@@ -23,7 +23,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
@Override
public void storeAccessToken(String creatorName, String accessToken) {
final Document basicDBObject = getAccessTokenDBQuery(creatorName, accessToken);
db.getCollection(CollectionNames.IGTIMI_ACCESS_TOKENS.name()).withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(basicDBObject, basicDBObject, new UpdateOptions().upsert(true));
db.getCollection(CollectionNames.IGTIMI_ACCESS_TOKENS.name()).withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(basicDBObject, basicDBObject, new ReplaceOptions().upsert(true));
}
private Document getAccessTokenDBQuery(String creatorName, String accessToken) {
@@ -26,6 +26,7 @@ import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
@@ -58,6 +59,10 @@ import com.sap.sse.util.LaxRedirectStrategyForAllRedirectResponseCodes;
public class IgtimiConnectionFactoryImpl implements IgtimiConnectionFactory {
private static final Logger logger = Logger.getLogger(IgtimiConnectionFactoryImpl.class.getName());
private static final int CONNECTION_REQUEST_TIMEOUT_MILLIS = 10000;
private static final int CONNECTION_TIMEOUT_MILLIS = 10000;
private final Map<Account, String> accessTokensByAccount;
private final Map<String, Account> accountsByEmail;
private final Map<Account, IgtimiConnection> connectionsByAccount;
@@ -518,7 +523,12 @@ public class IgtimiConnectionFactoryImpl implements IgtimiConnectionFactory {
}
public HttpClient getHttpClient() {
HttpClient client = HttpClientBuilder.create().setRedirectStrategy(new LaxRedirectStrategyForAllRedirectResponseCodes()).build();
HttpClient client = HttpClientBuilder.create()
.setDefaultRequestConfig(RequestConfig.custom()
.setConnectionRequestTimeout(CONNECTION_REQUEST_TIMEOUT_MILLIS)
.setConnectTimeout(CONNECTION_TIMEOUT_MILLIS)
.build())
.setRedirectStrategy(new LaxRedirectStrategyForAllRedirectResponseCodes()).build();
return client;
}
@@ -15,7 +15,9 @@ Require-Bundle: com.sap.sse.mongodb,
com.sap.sse,
com.sap.sailing.server.gateway.serialization.shared.android,
com.sap.sse.shared.android,
org.mongodb.mongo-java-driver;bundle-version="3.6.4",
org.mongodb.bson;bundle-version="4.3.1",
org.mongodb.driver-core;bundle-version="4.3.1",
org.mongodb.driver-sync;bundle-version="4.3.1",
com.sap.sse.security.common,
com.sap.sailing.shared.persistence
Export-Package: com.sap.sailing.domain.persistence,
@@ -1013,7 +1013,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
windFixesToMigrate.add(new MongoObjectFactoryImpl(database).storeWindTrackEntry(race, regattaName,
wind.getB(), wind.getA()));
}
final long size = windTracks.count(queryByName);
final long size = windTracks.countDocuments(queryByName);
logger.info("Migrating " + size + " wind fixes of regatta " + regattaName
+ " and race " + race.getName() + " to ID-based keys");
windTracks.insertMany(windFixesToMigrate);
@@ -2719,7 +2719,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
// there is a corner case where tests can create just one competitor without boat
// before we migrate we need to check if this case
if (competitorsCollectionExist && !boatsCollectionCollectionExist) {
long competitorCount = orginalCompetitorCollection.count();
long competitorCount = orginalCompetitorCollection.countDocuments();
if (competitorCount > 0) {
Document oneCompetitorDbObject = orginalCompetitorCollection.find().first();
Object boatObject = oneCompetitorDbObject.get(CompetitorJsonConstants.FIELD_BOAT);
@@ -3016,7 +3016,7 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory {
final MongoCollection<Document> collection = database
.getCollection(CollectionNames.CONNECTIVITY_PARAMS_FOR_RACES_TO_BE_RESTORED.name());
final FindIterable<Document> cursor = collection.find();
final long count = collection.count();
final long count = collection.countDocuments();
logger.info("Restoring " + count + " races");
final List<Document> restoreParameters = new ArrayList<>();
// consume all elements quickly to avoid cursor/DB timeouts while restoring many races;
@@ -30,6 +30,7 @@ import com.mongodb.WriteConcern;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.IndexOptions;
import com.mongodb.client.model.ReplaceOptions;
import com.mongodb.client.model.UpdateOptions;
import com.mongodb.client.result.DeleteResult;
import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor;
@@ -373,7 +374,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
storeColumnFactors(leaderboard, dbLeaderboard);
storeLeaderboardCorrectionsAndDiscards(leaderboard, dbLeaderboard);
}
leaderboardCollection.replaceOne(query, dbLeaderboard, new UpdateOptions().upsert(true));
leaderboardCollection.replaceOne(query, dbLeaderboard, new ReplaceOptions().upsert(true));
}
private void storeColumnFactors(Leaderboard leaderboard, Document dbLeaderboard) {
@@ -544,7 +545,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
dbLeaderboardIds.add(dbLeaderboardId);
}
dbLeaderboardGroup.put(FieldNames.LEADERBOARD_GROUP_LEADERBOARDS.name(), dbLeaderboardIds);
leaderboardGroupCollection.withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(query, dbLeaderboardGroup, new UpdateOptions().upsert(true));
leaderboardGroupCollection.withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(query, dbLeaderboardGroup, new ReplaceOptions().upsert(true));
}
@Override
@@ -570,7 +571,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
Document currentServerConfig = serverCollection.find().first();
if (currentServerConfig != null) {
serverCollection.withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(
currentServerConfig, newServerConfig, new UpdateOptions().upsert(true));
currentServerConfig, newServerConfig, new ReplaceOptions().upsert(true));
} else {
serverCollection.insertOne(newServerConfig);
}
@@ -587,7 +588,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
serverDBObject.put(FieldNames.SERVER_URL.name(), server.getURL().toExternalForm());
serverDBObject.put(FieldNames.INCLUDE.name(), server.isInclude());
serverDBObject.put(FieldNames.SELECTED_EVENT_IDS.name(), server.getSelectedEventIds());
serverCollection.withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(query, serverDBObject, new UpdateOptions().upsert(true));
serverCollection.withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(query, serverDBObject, new ReplaceOptions().upsert(true));
}
@Override
@@ -600,7 +601,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
serverDBObject.put(FieldNames.INCLUDE.name(), include);
serverDBObject.put(FieldNames.SELECTED_EVENT_IDS.name(), selectedEventIds);
serverCollection.withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(query, serverDBObject,
new UpdateOptions().upsert(true));
new ReplaceOptions().upsert(true));
}
@Override
@@ -653,7 +654,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
sailorsInfoWebsiteURLs.add(sailorsInfoWebsiteObject);
}
eventDBObject.put(FieldNames.EVENT_SAILORS_INFO_WEBSITES.name(), sailorsInfoWebsiteURLs);
eventCollection.withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(query, eventDBObject, new UpdateOptions().upsert(true));
eventCollection.withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(query, eventDBObject, new ReplaceOptions().upsert(true));
// now store the links to the leaderboard groups
MongoCollection<Document> linksCollection = database.getCollection(CollectionNames.LEADERBOARD_GROUP_LINKS_FOR_EVENTS.name());
linksCollection.createIndex(new Document(FieldNames.EVENT_ID.name(), 1));
@@ -664,7 +665,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
Document dbLinks = new Document();
dbLinks.put(FieldNames.EVENT_ID.name(), event.getId());
dbLinks.put(FieldNames.LEADERBOARD_GROUP_UUID.name(), lgUUIDs);
linksCollection.withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(query, dbLinks, new UpdateOptions().upsert(true));
linksCollection.withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(query, dbLinks, new ReplaceOptions().upsert(true));
}
@Override
@@ -747,7 +748,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
final int MAX_TRIES = 3;
for (int i=0; i<MAX_TRIES && !success; i++) {
try {
regattasCollection.withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(query, dbRegatta, new UpdateOptions().upsert(true));
regattasCollection.withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(query, dbRegatta, new ReplaceOptions().upsert(true));
success = true;
} catch (DuplicateKeyException e) {
if (i+1==MAX_TRIES) {
@@ -826,7 +827,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
Document query = new Document(FieldNames.RACE_ID_AS_STRING.name(), raceIDAsString);
Document entry = new Document(FieldNames.RACE_ID_AS_STRING.name(), raceIDAsString);
entry.put(FieldNames.REGATTA_NAME.name(), regatta.getName());
regattaForRaceIDCollection.withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(query, entry, new UpdateOptions().upsert(true));
regattaForRaceIDCollection.withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(query, entry, new ReplaceOptions().upsert(true));
}
@Override
@@ -1495,7 +1496,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
JSONObject json = competitorSerializer.serialize(competitor);
Document query = Document.parse(CompetitorJsonSerializer.getCompetitorIdQuery(competitor).toJSONString());
Document entry = Document.parse(json.toJSONString());
collection.withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(query, entry, new UpdateOptions().upsert(true));
collection.withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(query, entry, new ReplaceOptions().upsert(true));
}
private void storeCompetitorWithBoat(CompetitorWithBoat competitor) {
@@ -1503,7 +1504,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
JSONObject json = competitorWithBoatRefSerializer.serialize(competitor);
Document query = Document.parse(CompetitorJsonSerializer.getCompetitorIdQuery(competitor).toString());
Document entry = Document.parse(json.toString());
collection.withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(query, entry, new UpdateOptions().upsert(true));
collection.withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(query, entry, new ReplaceOptions().upsert(true));
}
@Override
@@ -1570,7 +1571,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
JSONObject json = boatSerializer.serialize(boat);
Document query = Document.parse(BoatJsonSerializer.getBoatIdQuery(boat).toString());
Document entry = Document.parse(json.toString());
collection.withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(query, entry, new UpdateOptions().upsert(true));
collection.withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(query, entry, new ReplaceOptions().upsert(true));
}
@Override
@@ -1614,7 +1615,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
configDocument.put(FieldNames.CONFIGURATION_ID_AS_STRING.name(), configuration.getId().toString());
Document query = new Document();
query.put(FieldNames.CONFIGURATION_ID_AS_STRING.name(), configuration.getId().toString());
configurationsCollections.withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(query, configDocument, new UpdateOptions().upsert(true));
configurationsCollections.withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(query, configDocument, new ReplaceOptions().upsert(true));
}
private Document createDeviceConfigurationObject(DeviceConfiguration configuration) {
@@ -1665,7 +1666,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
Document query = new Document(FieldNames.RESULT_PROVIDERNAME.name(), resultProviderName);
Document entry = new Document(FieldNames.RESULT_PROVIDERNAME.name(), resultProviderName);
entry.put(FieldNames.RESULT_URL.name(), url.toString());
resultUrlsCollection.withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(query, entry, new UpdateOptions().upsert(true));
resultUrlsCollection.withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(query, entry, new ReplaceOptions().upsert(true));
}
@Override
@@ -1889,7 +1890,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
key.putAll(paramsPersistenceService.getKey(params));
Document dbObject = new Document();
dbObject.putAll(paramsPersistenceService.mapFrom(params));
collection.withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(key, dbObject, new UpdateOptions().upsert(true));
collection.withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(key, dbObject, new ReplaceOptions().upsert(true));
} catch (NoCorrespondingServiceRegisteredException e) {
logger.log(Level.WARNING, "Couldn't find a persistence service for connectivity parameters of type "+typeIdentifier+
". Couldn't store race "+params.getTrackerID()+" for restoring.", e);
@@ -1928,7 +1929,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
final URL remoteUrl = raceInfo.getRemoteUrl();
newValue.append(FieldNames.REMOTE_URL.name(), remoteUrl == null ? null : remoteUrl.toExternalForm());
newValue.append(FieldNames.ANNIVERSARY_TYPE.name(), anniversary.getValue().getB().toString());
anniversarysStored.replaceOne(currentProxy, newValue, new UpdateOptions().upsert(true));
anniversarysStored.replaceOne(currentProxy, newValue, new ReplaceOptions().upsert(true));
}
} catch (Exception e) {
e.printStackTrace();
@@ -141,7 +141,7 @@ public class MediaDBImpl implements MediaDB {
@Override
public List<MediaTrack> loadAllMediaTracks() {
MongoCursor<Document> cursor = getVideoCollection().find().sort(sortByStartTimeAndTitle).iterator();
List<MediaTrack> result = new ArrayList<>((int) getVideoCollection().count());
List<MediaTrack> result = new ArrayList<>((int) getVideoCollection().estimatedDocumentCount());
while (cursor.hasNext()) {
result.add(createMediaTrackFromDb(cursor.next()));
}
@@ -17,7 +17,9 @@ Require-Bundle: com.sap.sailing.domain.shared.android,
org.junit;bundle-version="4.8.2",
com.sap.sse.common,
com.sap.sailing.server.gateway.serialization.shared.android,
org.mongodb.mongo-java-driver;bundle-version="3.6.4",
org.mongodb.bson;bundle-version="4.3.1",
org.mongodb.driver-core;bundle-version="4.3.1",
org.mongodb.driver-sync;bundle-version="4.3.1",
com.sap.sse.shared.android
Export-Package: com.sap.sailing.domain.racelog.tracking.test.mock
Automatic-Module-Name: com.sap.sailing.domain.racelogtrackingadapter.testsupport
@@ -19,7 +19,9 @@ Require-Bundle: com.sap.sailing.domain,
com.sap.sse,
com.sap.sailing.server.gateway.serialization.shared.android,
com.sap.sse.mail,
org.mongodb.mongo-java-driver;bundle-version="3.6.4",
org.mongodb.bson;bundle-version="4.3.1",
org.mongodb.driver-core;bundle-version="4.3.1",
org.mongodb.driver-sync;bundle-version="4.3.1",
com.sap.sailing.shared.persistence;bundle-version="1.0.0",
com.sap.sse.shared.android
Import-Package: com.google.zxing;version="3.1.0",
@@ -302,7 +302,7 @@ public class TransientCompetitorAndBoatStoreImpl implements CompetitorAndBoatSto
LockUtil.lockForRead(lock);
try {
List<Competitor> competitors = new ArrayList<>();
for (Competitor c: competitorCache.values()) {
for (Competitor c : competitorCache.values()) {
if (!c.hasBoat()) {
competitors.add(c);
}
@@ -13,7 +13,9 @@ Require-Bundle: com.sap.sailing.domain.swisstimingadapter,
com.sap.sse.common,
com.sap.sailing.domain.persistence,
com.sap.sse,
org.mongodb.mongo-java-driver;bundle-version="3.6.4",
org.mongodb.bson;bundle-version="4.3.1",
org.mongodb.driver-core;bundle-version="4.3.1",
org.mongodb.driver-sync;bundle-version="4.3.1",
com.sap.sse.security.common,
com.sap.sse.replication.interfaces
Export-Package: com.sap.sailing.domain.swisstimingadapter.persistence,
@@ -10,7 +10,7 @@ import org.bson.Document;
import com.mongodb.WriteConcern;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.UpdateOptions;
import com.mongodb.client.model.ReplaceOptions;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingArchiveConfiguration;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingConfiguration;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingFactory;
@@ -152,7 +152,7 @@ public class SwissTimingAdapterPersistenceImpl implements SwissTimingAdapterPers
.getCollection(CollectionNames.SWISSTIMING_ARCHIVE_CONFIGURATIONS.name());
Document result = storeSwissTimingArchiveConfiguration(config);
stArchiveConfigCollection.withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(result, result,
new UpdateOptions().upsert(true));
new ReplaceOptions().upsert(true));
}
private Document storeSwissTimingArchiveConfiguration(SwissTimingArchiveConfiguration config) {
@@ -185,11 +185,9 @@ public class SwissTimingAdapterPersistenceImpl implements SwissTimingAdapterPers
MongoCollection<org.bson.Document> stConfigCollection = database
.getCollection(CollectionNames.SWISSTIMING_CONFIGURATIONS.name());
Document result = storeSwissTimingConfiguration(config);
Document updateQuery = new Document(FieldNames.ST_CONFIG_JSON_URL.name(), config.getJsonURL());
updateQuery.put(FieldNames.ST_CONFIG_CREATOR_NAME.name(), config.getCreatorName());
stConfigCollection.withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(updateQuery, result,
new UpdateOptions().upsert(true));
new ReplaceOptions().upsert(true));
}
}
@@ -20,7 +20,9 @@ Require-Bundle: com.sap.sailing.domain,
org.hamcrest.core;bundle-version="1.1.0",
com.sap.sse,
com.sap.sse.common,
org.mongodb.mongo-java-driver;bundle-version="3.6.4",
org.mongodb.bson;bundle-version="4.3.1",
org.mongodb.driver-core;bundle-version="4.3.1",
org.mongodb.driver-sync;bundle-version="4.3.1",
com.sap.sailing.domain.shared.android,
com.sap.sse.replication.interfaces
Bundle-ClassPath: resources/,
@@ -30,7 +30,9 @@ Require-Bundle: com.sap.sailing.domain,
com.sap.sse.security,
com.sap.sse.security.userstore.mongodb,
com.sap.sse.security.common,
org.mongodb.mongo-java-driver;bundle-version="3.6.4",
org.mongodb.bson;bundle-version="4.3.1",
org.mongodb.driver-core;bundle-version="4.3.1",
org.mongodb.driver-sync;bundle-version="4.3.1",
org.apache.commons.math3;bundle-version="3.5.0",
org.apache.shiro.core;bundle-version="1.2.2"
Export-Package: com.sap.sailing.domain.test,
@@ -13,7 +13,9 @@ Require-Bundle: com.sap.sse.mongodb,
com.sap.sse.common,
com.sap.sailing.domain.persistence,
com.sap.sse,
org.mongodb.mongo-java-driver;bundle-version="3.6.4",
org.mongodb.bson;bundle-version="4.3.1",
org.mongodb.driver-core;bundle-version="4.3.1",
org.mongodb.driver-sync;bundle-version="4.3.1",
com.sap.sse.security.common,
com.sap.sse.replication.interfaces,
com.tractrac.clientmodule;bundle-version="3.13.1",
@@ -5,7 +5,7 @@ import org.bson.Document;
import com.mongodb.WriteConcern;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.UpdateOptions;
import com.mongodb.client.model.ReplaceOptions;
import com.sap.sailing.domain.tractracadapter.TracTracConfiguration;
import com.sap.sailing.domain.tractracadapter.persistence.MongoObjectFactory;
@@ -40,7 +40,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
tracTracConfiguration.getJSONURL());
updateQuery.put(FieldNames.TT_CONFIG_CREATOR_NAME.name(), tracTracConfiguration.getCreatorName());
ttConfigCollection.withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(updateQuery, result,
new UpdateOptions().upsert(true));
new ReplaceOptions().upsert(true));
}
private Document storeTracTracConfiguration(TracTracConfiguration tracTracConfiguration) {
@@ -927,7 +927,6 @@ public interface TrackedRace
* At the given timepoint and for the competitor, this method returns the distance to the starboard end of the start line
* or---if the start waypoint was a single mark---the distance to the single start mark at the timepoint.
* If the competitor hasn't started yet, <code>null</code> is returned.
*
*/
Distance getDistanceFromStarboardSideOfStartLine(Competitor competitor, TimePoint timePoint);
@@ -16,6 +16,8 @@ Require-Bundle: com.sap.sailing.domain.persistence,
com.sap.sailing.expeditionconnector.common,
com.sap.sailing.server.gateway.serialization.shared.android,
com.sap.sse,
org.mongodb.mongo-java-driver;bundle-version="3.6.4"
org.mongodb.bson;bundle-version="4.3.1",
org.mongodb.driver-core;bundle-version="4.3.1",
org.mongodb.driver-sync;bundle-version="4.3.1"
Export-Package: com.sap.sailing.expeditionconnector.persistence
Automatic-Module-Name: com.sap.sailing.expeditionconnector.persistence
@@ -11,7 +11,7 @@ import com.mongodb.WriteConcern;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.IndexOptions;
import com.mongodb.client.model.UpdateOptions;
import com.mongodb.client.model.ReplaceOptions;
import com.sap.sailing.expeditionconnector.ExpeditionDeviceConfiguration;
import com.sap.sailing.expeditionconnector.persistence.MongoObjectFactory;
@@ -43,7 +43,7 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory {
Exception lastException = null;
while (attempt < 5 && !success) {
try {
expeditionDeviceConfigurationsCollection.withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(key, expeditionDeviceConfigurationDBObject, new UpdateOptions().upsert(true));
expeditionDeviceConfigurationsCollection.withWriteConcern(WriteConcern.ACKNOWLEDGED).replaceOne(key, expeditionDeviceConfigurationDBObject, new ReplaceOptions().upsert(true));
success = true;
attempt++;
} catch (Exception e) {
@@ -61,7 +61,9 @@ Require-Bundle: com.sap.sailing.domain,
com.sap.sailing.expeditionconnector.common,
org.mp4parser.isoparser;bundle-version="1.9.37",
com.sap.sse.datamining.ui,
org.mongodb.mongo-java-driver;bundle-version="3.6.4",
org.mongodb.bson;bundle-version="4.3.1",
org.mongodb.driver-core;bundle-version="4.3.1",
org.mongodb.driver-sync;bundle-version="4.3.1",
com.sap.sailing.server.gateway.serialization.shared.android,
com.sap.sailing.shared.server,
org.apache.commons.math;bundle-version="2.1.0",
@@ -77,6 +77,9 @@ public class BoatClassImageResolver {
boatClassIconsMap.put(BoatClassMasterdata.HOBIE_TIGER.getDisplayName(), imageResources.HobieTigerIcon());
boatClassIconsMap.put(BoatClassMasterdata.HOBIE_WILD_CAT.getDisplayName(), imageResources.HobieWildCatIcon());
boatClassIconsMap.put(BoatClassMasterdata.INTERNATIONAL_14.getDisplayName(), imageResources.International14Icon());
boatClassIconsMap.put(BoatClassMasterdata.IQFOIL_MEN.getDisplayName(), imageResources.IQFOilMenIcon());
boatClassIconsMap.put(BoatClassMasterdata.IQFOIL_WOMEN.getDisplayName(), imageResources.IQFOilWoenIcon());
boatClassIconsMap.put(BoatClassMasterdata.IQFOIL_YOUTH.getDisplayName(), imageResources.IQFOilYouthIcon());
boatClassIconsMap.put(BoatClassMasterdata.J22.getDisplayName(), imageResources.J22Icon());
boatClassIconsMap.put(BoatClassMasterdata.J24.getDisplayName(), imageResources.J24Icon());
boatClassIconsMap.put(BoatClassMasterdata.J70.getDisplayName(), imageResources.J70Icon());
@@ -396,6 +396,18 @@ public interface BoatClassImageResources extends ClientBundle {
@ImageOptions(preventInlining = true)
ImageResource International14Icon();
@Source("com/sap/sailing/gwt/ui/client/images/boatclass/IQFOIL_MEN.png")
@ImageOptions(preventInlining = true)
ImageResource IQFOilMenIcon();
@Source("com/sap/sailing/gwt/ui/client/images/boatclass/IQFOIL_WOMEN.png")
@ImageOptions(preventInlining = true)
ImageResource IQFOilWoenIcon();
@Source("com/sap/sailing/gwt/ui/client/images/boatclass/IQFOIL_YOUTH.png")
@ImageOptions(preventInlining = true)
ImageResource IQFOilYouthIcon();
@Source("com/sap/sailing/gwt/ui/client/images/boatclass/OPEN_BIC.png")
@ImageOptions(preventInlining = true)
ImageResource OpenBicIcon();
@@ -6,26 +6,30 @@ import java.util.function.Consumer;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.dto.BoatDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.Refresher;
import com.sap.sailing.gwt.ui.client.SailingServiceWriteAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.common.Util.Pair;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
import com.sap.sse.security.ui.client.UserService;
public abstract class AbstractCompetitorRegistrationDialog extends DataEntryDialog<Set<CompetitorDTO>> {
protected final ErrorReporter errorReporter;
protected final SailingServiceAsync sailingService;
protected final SailingServiceWriteAsync sailingService;
protected final StringMessages stringMessages;
protected final String leaderboardName;
protected final CompetitorRegistrationsPanel competitorRegistrationsPanel;
public AbstractCompetitorRegistrationDialog(SailingServiceWriteAsync sailingServiceWrite,
final UserService userService, StringMessages stringMessages, ErrorReporter errorReporter, boolean editable,
com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback<Set<CompetitorDTO>> callback,
final UserService userService, Refresher<CompetitorDTO> competitorsRefresher,
Refresher<BoatDTO> boatsRefresher, StringMessages stringMessages, ErrorReporter errorReporter,
boolean editable, com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback<Set<CompetitorDTO>> callback,
String leaderboardName, boolean canBoatsOfCompetitorsChangePerRace, String boatClass,
String okButtonMessage, Validator<Set<CompetitorDTO>> validator) {
String okButtonMessage, Validator<Set<CompetitorDTO>> validator,
Consumer<Pair<CompetitorRegistrationsPanel, AsyncCallback<Collection<CompetitorDTO>>>> registeredCompetitorsRetriever) {
super(stringMessages.registerCompetitors(), /* messsage */null, okButtonMessage, stringMessages.cancel(),
validator, callback);
this.errorReporter = errorReporter;
@@ -33,8 +37,9 @@ public abstract class AbstractCompetitorRegistrationDialog extends DataEntryDial
this.sailingService = sailingServiceWrite;
this.leaderboardName = leaderboardName;
this.competitorRegistrationsPanel = new CompetitorRegistrationsPanel(sailingServiceWrite, userService,
stringMessages, errorReporter, editable, leaderboardName, canBoatsOfCompetitorsChangePerRace, boatClass,
() -> validateAndUpdate(), getRegisteredCompetitorsRetriever(), /* restrictPoolToLeaderboard */ false,
competitorsRefresher, boatsRefresher, stringMessages, errorReporter, editable, leaderboardName,
canBoatsOfCompetitorsChangePerRace, boatClass, () -> validateAndUpdate(),
registeredCompetitorsRetriever, /* restrictPoolToLeaderboard */ false,
getAdditionalWidgetsToInsertAboveCompetitorTables(stringMessages));
}
@@ -48,7 +53,5 @@ public abstract class AbstractCompetitorRegistrationDialog extends DataEntryDial
return competitorRegistrationsPanel.getResult();
}
protected abstract Consumer<AsyncCallback<Collection<CompetitorDTO>>> getRegisteredCompetitorsRetriever();
protected abstract Widget[] getAdditionalWidgetsToInsertAboveCompetitorTables(StringMessages stringMessages);
}
@@ -45,9 +45,9 @@ public class AbstractRegattaLogFixesAddMappingsDialog extends DataEntryDialog<Co
private BoatDTO boatToSelect;
private boolean inInstableTransitionState = false;
public AbstractRegattaLogFixesAddMappingsDialog(SailingServiceWriteAsync sailingServiceWrite, UserService userService,
final ErrorReporter errorReporter, final StringMessages stringMessages, String leaderboardName,
DialogCallback<Collection<DeviceMappingDTO>> callback) {
public AbstractRegattaLogFixesAddMappingsDialog(SailingServiceWriteAsync sailingServiceWrite,
UserService userService, final ErrorReporter errorReporter, final StringMessages stringMessages,
String leaderboardName, DialogCallback<Collection<DeviceMappingDTO>> callback) {
super(stringMessages.add(stringMessages.deviceMappings()), stringMessages.add(stringMessages.deviceMappings()),
stringMessages.add(), stringMessages.cancel(),
new DataEntryDialog.Validator<Collection<DeviceMappingDTO>>() {
@@ -65,12 +65,17 @@ public class AbstractRegattaLogFixesAddMappingsDialog extends DataEntryDialog<Co
importWidgetHolder = new SimplePanel();
deviceIdTable = new TrackFileImportDeviceIdentifierTableWrapper(sailingServiceWrite, stringMessages, errorReporter);
registerSelectionChangeHandler(deviceIdTable.getSelectionModel(), this::deviceSelectionChanged);
competitorTable = new CompetitorTableWrapper<>(sailingServiceWrite, userService, stringMessages, errorReporter,
/* multiSelection */ false, /* enable pager */ true, /* filterCompetitorWithBoat */ false, /* filterCompetitorsWithoutBoat */ false);
markTable = new MarkTableWrapper<RefreshableSingleSelectionModel<MarkDTO>>(
/* multiSelection */ false, sailingServiceWrite, stringMessages, errorReporter);
boatTable = new BoatTableWrapper<RefreshableSingleSelectionModel<BoatDTO>>(sailingServiceWrite, userService, stringMessages,
errorReporter, /* multiSelection */ false, /* enable Pager */ true, /* allowActions */ false);
competitorTable = new CompetitorTableWrapper<>(sailingServiceWrite, userService,
/* competitorsRefresher not needed; fetching competitors from registrations */ null,
/* boatsRefresher not needed; fetching competitors from registrations */ null, stringMessages,
errorReporter, /* multiSelection */ false, /* enable pager */ true,
/* filterCompetitorWithBoat */ false, /* filterCompetitorsWithoutBoat */ false);
markTable = new MarkTableWrapper<RefreshableSingleSelectionModel<MarkDTO>>(/* multiSelection */ false,
sailingServiceWrite, stringMessages, errorReporter);
boatTable = new BoatTableWrapper<RefreshableSingleSelectionModel<BoatDTO>>(sailingServiceWrite, userService,
/* boatsRefresher not needed; registered boats taken from regatta log */ null,
/* competitorsRefresher not needed */ null, stringMessages, errorReporter, /* multiSelection */ false,
/* enable Pager */ true, /* allowActions */ false);
registerSelectionChangeHandler(competitorTable.getSelectionModel(), this::mappedToSelectionChanged);
registerSelectionChangeHandler(markTable.getSelectionModel(), this::mappedToSelectionChanged);
@@ -55,16 +55,18 @@ public abstract class AbstractRegattaLogSensorDataAddMappingsDialog extends Data
this.stringMessages = stringMessages;
deviceIdTable = new TrackFileImportDeviceIdentifierTableWrapper(sailingServiceWrite, stringMessages, errorReporter);
deviceIdTable.removeTrackNameColumn();
importWidgetHolder = new SimplePanel();
deviceIdTable.getSelectionModel().addSelectionChangeHandler(
event -> deviceSelectionChanged(deviceIdTable.getSelectionModel().getSelectedObject()));
boatTable = new BoatTableWrapper<RefreshableSingleSelectionModel<BoatDTO>>(sailingServiceWrite, userService, stringMessages,
errorReporter, /* multiSelection */ false, /* enable Pager */ true, /* allowActions */ false);
competitorTable = new CompetitorTableWrapper<>(sailingServiceWrite, userService, stringMessages, errorReporter,
/* multiSelection */ false, /* enablePager */ true, /* filterCompetitorWithBoat */ false, /* filterCompetitorsWithoutBoat */ false);
boatTable = new BoatTableWrapper<RefreshableSingleSelectionModel<BoatDTO>>(sailingServiceWrite, userService,
/* boatsRefresher not needed; registrations are fetched for the leaderboard specifically */ null,
/* competitorsRefresher not needed */ null,
stringMessages, errorReporter, /* multiSelection */ false, /* enable Pager */ true, /* allowActions */ false);
competitorTable = new CompetitorTableWrapper<>(sailingServiceWrite, userService,
/* competitorsRefresher not needed; registrations are fetched for the leaderboard specifically */ null,
/* boatsRefresher not needed; fetching competitors from registrations */ null,
stringMessages, errorReporter, /* multiSelection */ false, /* enablePager */ true,
/* filterCompetitorWithBoat */ false, /* filterCompetitorsWithoutBoat */ false);
boatTable.getSelectionModel().addSelectionChangeHandler(event -> {
this.mappedToSelectionChanged(boatTable.getSelectionModel().getSelectedObject());
validateAndUpdate();
@@ -73,7 +75,6 @@ public abstract class AbstractRegattaLogSensorDataAddMappingsDialog extends Data
this.mappedToSelectionChanged(competitorTable.getSelectionModel().getSelectedObject());
validateAndUpdate();
});
this.leaderboardName = leaderboardName;
getBoatRegistrations(sailingServiceWrite, errorReporter);
getCompetitorRegistrations(sailingServiceWrite, errorReporter);
@@ -103,6 +103,8 @@ public abstract class AbstractTrackedRacesListComposite extends AbstractComposit
private ListBox listBoxRegattas;
protected final UserService userService;
private final Displayer<RegattaDTO> regattasDisplayer;
public static class AnchorCell extends AbstractCell<SafeHtml> {
@Override
@@ -114,6 +116,7 @@ public abstract class AbstractTrackedRacesListComposite extends AbstractComposit
public AbstractTrackedRacesListComposite(Component<?> parent, ComponentContext<?> context,
final Presenter presenter, final StringMessages stringMessages, boolean hasMultiSelection) {
super(parent, context);
this.regattasDisplayer = result->fillRegattas(result);
this.raceIsTrackedRaceChangeListener = new HashSet<TrackedRaceChangedListener>();
this.sailingService = presenter.getSailingService();
this.errorReporter = presenter.getErrorReporter();
@@ -564,17 +567,8 @@ public abstract class AbstractTrackedRacesListComposite extends AbstractComposit
refreshableSelectionModel.clear();
}
private final Displayer<RegattaDTO> RegattasDisplayer = new Displayer<RegattaDTO>() {
@Override
public void fill(Iterable<RegattaDTO> result) {
fillRegattas(result);
}
};
public Displayer<RegattaDTO> getRegattasDisplayer() {
return RegattasDisplayer;
return regattasDisplayer;
}
/**
@@ -9,6 +9,7 @@ import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SelectionChangeEvent.Handler;
import com.sap.sailing.domain.common.dto.BoatDTO;
import com.sap.sailing.gwt.ui.adminconsole.places.AdminConsoleView.Presenter;
import com.sap.sailing.gwt.ui.client.Displayer;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.gwt.adminconsole.FilterablePanelProvider;
import com.sap.sse.gwt.client.celltable.RefreshableMultiSelectionModel;
@@ -26,18 +27,21 @@ public class BoatPanel extends SimplePanel implements FilterablePanelProvider<Bo
private final BoatTableWrapper<RefreshableMultiSelectionModel<BoatDTO>> boatTable;
private final RefreshableMultiSelectionModel<BoatDTO> refreshableBoatSelectionModel;
private Button allowReloadButton;
private final Displayer<BoatDTO> boatsDisplayer;
public BoatPanel(final Presenter presenter, final StringMessages stringMessages) {
super();
this.boatTable = new BoatTableWrapper<>(presenter.getSailingService(), presenter.getUserService(), stringMessages, presenter.getErrorReporter(),
/* multiSelection */ true, /* enablePager */ true, 100, true);
this.boatsDisplayer = result -> refreshBoatList();
this.boatTable = new BoatTableWrapper<>(presenter.getSailingService(), presenter.getUserService(),
presenter.getBoatsRefresher(), presenter.getCompetitorsRefresher(), stringMessages,
presenter.getErrorReporter(), /* multiSelection */ true, /* enablePager */ true, 100, true);
this.refreshableBoatSelectionModel = (RefreshableMultiSelectionModel<BoatDTO>) boatTable.getSelectionModel();
VerticalPanel mainPanel = new VerticalPanel();
this.setWidget(mainPanel);
mainPanel.setWidth("100%");
final AccessControlledButtonPanel buttonPanel = new AccessControlledButtonPanel(presenter.getUserService(), BOAT);
mainPanel.add(buttonPanel);
final Button refreshButton = buttonPanel.addUnsecuredAction(stringMessages.refresh(), this::refreshBoatList);
final Button refreshButton = buttonPanel.addUnsecuredAction(stringMessages.refresh(), presenter.getBoatsRefresher()::reloadAndCallFillAll);
refreshButton.ensureDebugId("RefreshButton");
allowReloadButton = buttonPanel.addUnsecuredAction(stringMessages.allowReload(),
() -> boatTable.allowUpdate(refreshableBoatSelectionModel.getSelectedSet()));
@@ -64,6 +68,10 @@ public class BoatPanel extends SimplePanel implements FilterablePanelProvider<Bo
});
mainPanel.add(boatTable);
}
public Displayer<BoatDTO> getBoatsDisplayer() {
return boatsDisplayer;
}
private void openAddBoatDialog() {
boatTable.openEditBoatDialog(new BoatDTO(), null);
@@ -21,7 +21,7 @@ public class BoatPanelSupplier extends AdminConsolePanelSupplier<BoatPanel> {
public BoatPanel init() {
final BoatPanel boatPanel = new BoatPanel(presenter, stringMessages);
boatPanel.ensureDebugId("BoatPanel");
boatPanel.refreshBoatList();
presenter.getBoatsRefresher().addDisplayerAndCallFillOnInit(boatPanel.getBoatsDisplayer());
return boatPanel;
}
@@ -19,6 +19,8 @@ import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.sap.sailing.domain.common.dto.BoatDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.gwt.ui.client.Refresher;
import com.sap.sailing.gwt.ui.client.SailingServiceWriteAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.common.Util;
@@ -67,10 +69,10 @@ public class BoatRegistrationsPanel extends FlowPanel implements BusyDisplay {
* to all boats in the server's boat store
*/
protected BoatRegistrationsPanel(final SailingServiceWriteAsync sailingServiceWrite, final UserService userService,
Refresher<BoatDTO> boatsRefresher, Refresher<CompetitorDTO> competitorsRefresher,
final StringMessages stringMessages, final ErrorReporter errorReporter, boolean editable,
String leaderboardName, boolean canBoatsOfCompetitorsChangePerRace, String boatClass, Runnable validator,
Consumer<AsyncCallback<Collection<BoatDTO>>> registeredBoatsRetriever,
boolean restrictPoolToLeaderboard) {
Consumer<AsyncCallback<Collection<BoatDTO>>> registeredBoatsRetriever, boolean restrictPoolToLeaderboard) {
this.errorReporter = errorReporter;
this.validator = validator;
this.busyIndicator = new SimpleBusyIndicator();
@@ -88,10 +90,13 @@ public class BoatRegistrationsPanel extends FlowPanel implements BusyDisplay {
final HorizontalPanel boatRegistrationPanel = new HorizontalPanel();
final CaptionPanel allBoatsPanel = new CaptionPanel(stringMessages.boatPool());
final CaptionPanel registeredBoatsPanel = new CaptionPanel(stringMessages.registeredBoats());
allBoatsTable = new BoatTableWrapper<>(sailingServiceWrite, userService, stringMessages, errorReporter, /* multiSelection */
true, /* enablePager */true, 20, false);
registeredBoatsTable = new BoatTableWrapper<>(sailingServiceWrite, userService, stringMessages, errorReporter, /* multiSelection */
true, /* enablePager */false, 20, false);
allBoatsTable = new BoatTableWrapper<>(sailingServiceWrite, userService, boatsRefresher, competitorsRefresher,
stringMessages, /* multiSelection */
errorReporter, true, /* enablePager */true, 20, false);
registeredBoatsTable = new BoatTableWrapper<>(sailingServiceWrite, userService,
/* boatsRefresher not needed; boats fetched for registrations */ null,
/* competiorsRefresher not needed */ null, stringMessages, errorReporter, /* multiSelection */ true,
/* enablePager */ false, /* paging size */ 20, /* allowActions */ false);
allBoatsPanel.add(allBoatsTable);
registeredBoatsPanel.add(registeredBoatsTable);
VerticalPanel movePanel = new VerticalPanel();
@@ -164,7 +169,7 @@ public class BoatRegistrationsPanel extends FlowPanel implements BusyDisplay {
}
private void setRegisterableBoatsAndRegisteredBoats() {
allBoatsTable.refreshBoatList(true, new Callback<Iterable<BoatDTO>, Throwable>() {
allBoatsTable.refreshBoatList(/* loadOnlyStandaloneBoats */ true, new Callback<Iterable<BoatDTO>, Throwable>() {
@Override
public void onSuccess(Iterable<BoatDTO> result) {
registeredBoatsRetriever.accept(new AsyncCallback<Collection<BoatDTO>>() {
@@ -19,8 +19,10 @@ import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Label;
import com.sap.sailing.domain.common.dto.BoatDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.security.SecuredDomainType;
import com.sap.sailing.gwt.ui.adminconsole.ColorColumn.ColorRetriever;
import com.sap.sailing.gwt.ui.client.Refresher;
import com.sap.sailing.gwt.ui.client.SailingServiceWriteAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.common.Color;
@@ -45,15 +47,21 @@ import com.sap.sse.security.ui.client.component.editacl.EditACLDialog;
public class BoatTableWrapper<S extends RefreshableSelectionModel<BoatDTO>> extends TableWrapper<BoatDTO, S> {
private final LabeledAbstractFilterablePanel<BoatDTO> filterField;
private final SailingServiceWriteAsync sailingServiceWrite;
public BoatTableWrapper(SailingServiceWriteAsync sailingServiceWrite, final UserService userService, StringMessages stringMessages,
ErrorReporter errorReporter, boolean multiSelection, boolean enablePager, boolean allowActions) {
this(sailingServiceWrite, userService, stringMessages, errorReporter, multiSelection, enablePager, DEFAULT_PAGING_SIZE,
allowActions);
private final Refresher<BoatDTO> boatsRefresher;
private final Refresher<CompetitorDTO> competitorsRefresher;
public BoatTableWrapper(SailingServiceWriteAsync sailingServiceWrite, final UserService userService,
Refresher<BoatDTO> boatsRefresher, Refresher<CompetitorDTO> competitorsRefresher,
StringMessages stringMessages, ErrorReporter errorReporter, boolean multiSelection, boolean enablePager,
boolean allowActions) {
this(sailingServiceWrite, userService, boatsRefresher, competitorsRefresher, stringMessages, errorReporter,
multiSelection, enablePager, DEFAULT_PAGING_SIZE, allowActions);
}
public BoatTableWrapper(SailingServiceWriteAsync sailingServiceWrite, final UserService userService, StringMessages stringMessages, ErrorReporter errorReporter,
boolean multiSelection, boolean enablePager, int pagingSize, boolean allowActions) {
public BoatTableWrapper(SailingServiceWriteAsync sailingServiceWrite, final UserService userService,
Refresher<BoatDTO> boatsRefresher, Refresher<CompetitorDTO> competitorsRefresher,
StringMessages stringMessages, ErrorReporter errorReporter, boolean multiSelection, boolean enablePager,
int pagingSize, boolean allowActions) {
super(sailingServiceWrite, stringMessages, errorReporter, multiSelection, enablePager, pagingSize,
new EntityIdentityComparator<BoatDTO>() {
@Override
@@ -65,6 +73,8 @@ public class BoatTableWrapper<S extends RefreshableSelectionModel<BoatDTO>> exte
return t.getIdAsString().hashCode();
}
});
this.boatsRefresher = boatsRefresher;
this.competitorsRefresher = competitorsRefresher;
this.sailingServiceWrite = sailingServiceWrite;
ListHandler<BoatDTO> boatColumnListHandler = getColumnSortHandler();
// boats table
@@ -163,7 +173,10 @@ public class BoatTableWrapper<S extends RefreshableSelectionModel<BoatDTO>> exte
return table;
}
};
filterField.setUpdatePermissionFilterForCheckbox(boat -> userService.hasPermission(boat, DefaultActions.UPDATE));
filterField.setUpdatePermissionFilterForCheckbox(boat -> {
return boat != null && boat.getIdAsString() != null && userService.hasPermission(boat, DefaultActions.UPDATE);
});
registerSelectionModelOnNewDataProvider(filterField.getAllListDataProvider());
// BoatTable edit features
final HasPermissions type = SecuredDomainType.BOAT;
@@ -203,7 +216,7 @@ public class BoatTableWrapper<S extends RefreshableSelectionModel<BoatDTO>> exte
}
public void filterBoats(Iterable<BoatDTO> boats) {
getFilteredBoats(boats);
filterField.updateAll(boats);
}
public void refreshBoatList(boolean loadOnlyStandaloneBoats, final Callback<Iterable<BoatDTO>, Throwable> callback) {
@@ -219,7 +232,6 @@ public class BoatTableWrapper<S extends RefreshableSelectionModel<BoatDTO>> exte
@Override
public void onSuccess(Iterable<BoatDTO> result) {
getFilteredBoats(result);
filterBoats(result);
if (callback != null) {
callback.onSuccess(result);
@@ -227,31 +239,37 @@ public class BoatTableWrapper<S extends RefreshableSelectionModel<BoatDTO>> exte
}
});
} else {
sailingServiceWrite.getAllBoats(new AsyncCallback<Iterable<BoatDTO>>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Remote Procedure Call getBoats() - Failure: " + caught.getMessage());
if (boatsRefresher != null) {
// Don't fetch from server but ask our unified data model to deliver the boats without forcing server
// round-trip unless the boats haven't been loaded at all so far
boatsRefresher.callFillAndReloadInitially(boats -> {
filterBoats(boats);
if (callback != null) {
callback.onFailure(caught);
callback.onSuccess(boats);
}
}
@Override
public void onSuccess(Iterable<BoatDTO> result) {
getFilteredBoats(result);
filterBoats(result);
if (callback != null) {
callback.onSuccess(result);
});
} else {
sailingServiceWrite.getAllBoats(new AsyncCallback<Iterable<BoatDTO>>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Remote Procedure Call getBoats() - Failure: " + caught.getMessage());
if (callback != null) {
callback.onFailure(caught);
}
}
}
});
@Override
public void onSuccess(Iterable<BoatDTO> result) {
filterBoats(result);
if (callback != null) {
callback.onSuccess(result);
}
}
});
}
}
}
private void getFilteredBoats(Iterable<BoatDTO> result) {
filterField.updateAll(result);
}
void openEditBoatDialog(final BoatDTO originalBoat, String boatClassName) {
final BoatEditDialog dialog = new BoatEditDialog(getStringMessages(), originalBoat, boatClassName, new DialogCallback<BoatDTO>() {
@Override
@@ -264,6 +282,21 @@ public class BoatTableWrapper<S extends RefreshableSelectionModel<BoatDTO>> exte
@Override
public void onSuccess(BoatDTO updatedBoat) {
if (boatsRefresher != null) {
boatsRefresher.addIfNotContainedElseReplace(updatedBoat, new EntityIdentityComparator<BoatDTO>() {
@Override
public boolean representSameEntity(BoatDTO dto1, BoatDTO dto2) {
return dto1.getIdAsString().equals(dto2.getIdAsString());
}
@Override
public int hashCode(BoatDTO t) {
return t.getIdAsString().hashCode();
}
});
}
if (competitorsRefresher != null) {
competitorsRefresher.reloadAndCallFillAll();
}
int editedBoatIndex = getFilterField().indexOf(originalBoat);
getFilterField().remove(originalBoat);
if (editedBoatIndex >= 0){
@@ -16,6 +16,8 @@ import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.dto.CompetitorWithBoatDTOImpl;
import com.sap.sailing.gwt.ui.adminconsole.CompetitorImportProviderSelectionDialog.MatchImportedCompetitorsDialogFactory;
import com.sap.sailing.gwt.ui.adminconsole.places.AdminConsoleView.Presenter;
import com.sap.sailing.gwt.ui.client.Displayer;
import com.sap.sailing.gwt.ui.client.Refresher;
import com.sap.sailing.gwt.ui.client.SailingServiceWriteAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.common.Util.Pair;
@@ -41,19 +43,30 @@ public class CompetitorPanel extends SimplePanel implements BusyDisplay, Filtera
private final String leaderboardName;
private final String boatClassName;
private final BusyIndicator busyIndicator;
private final Displayer<CompetitorDTO> competitorsDisplayer;
public CompetitorPanel(final Presenter presenter, final StringMessages stringMessages) {
this(presenter.getSailingService(), presenter.getUserService(), /* leaderboardName */ null, /* boatClassName */ null, /* createWithBoatByDefault */ true,
stringMessages, presenter.getErrorReporter());
this(presenter.getSailingService(), presenter.getUserService(), presenter.getCompetitorsRefresher(),
presenter.getBoatsRefresher(), /* leaderboardName */ null, /* boatClassName */ null,
/* createWithBoatByDefault */ true, stringMessages, presenter.getErrorReporter());
}
public CompetitorPanel(final SailingServiceWriteAsync sailingServiceWrite, final UserService userService, final String leaderboardName,
String boatClassName, boolean createWithBoatByDefault, final StringMessages stringMessages, final ErrorReporter errorReporter) {
public CompetitorPanel(final SailingServiceWriteAsync sailingServiceWrite, final UserService userService,
Refresher<CompetitorDTO> competitorsRefresher, Refresher<BoatDTO> boatsRefresher,
final String leaderboardName, String boatClassName, boolean createWithBoatByDefault,
final StringMessages stringMessages, final ErrorReporter errorReporter) {
super();
this.competitorsDisplayer = new Displayer<CompetitorDTO>() {
@Override
public void fill(Iterable<CompetitorDTO> result) {
competitorTable.refreshCompetitorList(result);
}
};
this.leaderboardName = leaderboardName;
this.boatClassName = boatClassName;
this.competitorTable = new CompetitorTableWrapper<>(sailingServiceWrite, userService, stringMessages, errorReporter, /* multiSelection */ true, /* enablePager */ true,
/* filterCompetitorWithBoat */ false, /* filterCompetitorsWithoutBoat */ false);
this.competitorTable = new CompetitorTableWrapper<>(sailingServiceWrite, userService, competitorsRefresher, boatsRefresher,
stringMessages, errorReporter, /* multiSelection */ true,
/* enablePager */ true, /* filterCompetitorWithBoat */ false, /* filterCompetitorsWithoutBoat */ false);
this.refreshableCompetitorSelectionModel = (RefreshableMultiSelectionModel<CompetitorDTO>) competitorTable.getSelectionModel();
busyIndicator = new SimpleBusyIndicator(false, 0.8f);
VerticalPanel mainPanel = new VerticalPanel();
@@ -61,8 +74,7 @@ public class CompetitorPanel extends SimplePanel implements BusyDisplay, Filtera
this.setWidget(mainPanel);
final AccessControlledButtonPanel buttonPanel = new AccessControlledButtonPanel(userService, COMPETITOR);
mainPanel.add(buttonPanel);
final Button refreshButton = buttonPanel.addUnsecuredAction(stringMessages.refresh(),
this::refreshCompetitorList);
final Button refreshButton = buttonPanel.addUnsecuredAction(stringMessages.refresh(), competitorsRefresher::reloadAndCallFillAll);
refreshButton.ensureDebugId("RefreshButton");
final Button allowReloadButton = buttonPanel.addUnsecuredAction(stringMessages.allowReload(),
() -> competitorTable.allowUpdate(refreshableCompetitorSelectionModel.getSelectedSet()));
@@ -82,7 +94,8 @@ public class CompetitorPanel extends SimplePanel implements BusyDisplay, Filtera
@Override
public void onSuccess(Iterable<String> providerNames) {
MatchImportedCompetitorsDialogFactory matchCompetitorsDialogFactory = getMatchCompetitorsDialogFactory(
sailingServiceWrite, userService, stringMessages, errorReporter);
sailingServiceWrite, userService, competitorsRefresher, boatsRefresher, stringMessages,
errorReporter);
CompetitorImportProviderSelectionDialog dialog = new CompetitorImportProviderSelectionDialog(
matchCompetitorsDialogFactory, CompetitorPanel.this, providerNames, sailingServiceWrite,
stringMessages, errorReporter);
@@ -111,24 +124,31 @@ public class CompetitorPanel extends SimplePanel implements BusyDisplay, Filtera
refreshCompetitorList();
}
}
public Displayer<CompetitorDTO> getCompetitorsDisplayer() {
return competitorsDisplayer;
}
private MatchImportedCompetitorsDialogFactory getMatchCompetitorsDialogFactory(
final SailingServiceWriteAsync sailingServiceWrite, final UserService userService, final StringMessages stringMessages,
final ErrorReporter errorReporter) {
final SailingServiceWriteAsync sailingServiceWrite, final UserService userService,
Refresher<CompetitorDTO> competitorsRefresher, Refresher<BoatDTO> boatsRefresher,
final StringMessages stringMessages, final ErrorReporter errorReporter) {
return new MatchImportedCompetitorsDialogFactory() {
@Override
public MatchImportedCompetitorsDialog createMatchImportedCompetitorsDialog(
final Pair<List<CompetitorDescriptor>, String> competitorDescriptorsAndHint,
final Iterable<CompetitorDTO> competitors) {
ImportCompetitorCallback importCompetitorCallback = new ImportCompetitorCallback(sailingServiceWrite, errorReporter, stringMessages) {
ImportCompetitorCallback importCompetitorCallback = new ImportCompetitorCallback(sailingServiceWrite,
errorReporter, stringMessages) {
@Override
public void registerCompetitors(Set<CompetitorDTO> competitorDTOs) {
super.registerCompetitors(competitorDTOs);
refreshCompetitorList();
}
};
return new MatchImportedCompetitorsDialog(competitorDescriptorsAndHint.getA(), competitors, competitorDescriptorsAndHint.getB(),
stringMessages, sailingServiceWrite, userService, errorReporter, importCompetitorCallback);
return new MatchImportedCompetitorsDialog(competitorDescriptorsAndHint.getA(), competitors,
competitorDescriptorsAndHint.getB(), stringMessages, sailingServiceWrite, userService,
competitorsRefresher, boatsRefresher, errorReporter, importCompetitorCallback);
}
};
}
@@ -21,7 +21,7 @@ public class CompetitorPanelSupplier extends AdminConsolePanelSupplier<Competito
public CompetitorPanel init() {
final CompetitorPanel competitorPanel = new CompetitorPanel(presenter, stringMessages);
competitorPanel.ensureDebugId("CompetitorPanel");
competitorPanel.refreshCompetitorList();
presenter.getCompetitorsRefresher().addDisplayerAndCallFillOnInit(competitorPanel.getCompetitorsDisplayer());
return competitorPanel;
}
@@ -20,10 +20,12 @@ import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.CompetitorDescriptor;
import com.sap.sailing.domain.common.dto.BoatDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.dto.CompetitorWithBoatDTOImpl;
import com.sap.sailing.domain.common.dto.CompetitorWithToolTipDTO;
import com.sap.sailing.gwt.ui.adminconsole.CompetitorImportProviderSelectionDialog.MatchImportedCompetitorsDialogFactory;
import com.sap.sailing.gwt.ui.client.Refresher;
import com.sap.sailing.gwt.ui.client.SailingServiceWriteAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.common.Util;
@@ -57,7 +59,7 @@ public class CompetitorRegistrationsPanel extends FlowPanel implements BusyDispl
private final BusyIndicator busyIndicator;
private final ImportCompetitorCallback importCompetitorCallback;
private final Runnable validator;
private final Consumer<AsyncCallback<Collection<CompetitorDTO>>> registeredCompetitorsRetriever;
private final Consumer<Pair<CompetitorRegistrationsPanel, AsyncCallback<Collection<CompetitorDTO>>>> registeredCompetitorsRetriever;
private final boolean restrictPoolToLeaderboard;
/**
@@ -71,16 +73,25 @@ public class CompetitorRegistrationsPanel extends FlowPanel implements BusyDispl
* @param registeredCompetitorsRetriever
* although declared as a consumer, this is a provider of the set of competitors to be shown in the
* "registered" competitors table. Technically, it "consumes" a callback to which to pass the competitors
* retrieved as the "registered" ones.
* retrieved as the "registered" ones. This panel passes itself ({@code this}) as the pair's first element
* to work around the initialization order problem (see also https://bugzilla.sapsailing.com/bugzilla/show_bug.cgi?id=5419#c14):
* When the competitors are already loaded in their {@link Refresher} then the panel tries to initialize its table
* contents synchronously, filling data in straight from the refresher. Objects initializing this registration panel
* in their constructor and assigning it to a field won't have finished the field assignment while this constructor
* is running. Therefore, if the retriever callback needs to access this panel, e.g., to query its {@link #showOnlyCompetitorsOfLog()}
* result, they wouldn't be able to find the panel through the field. That's why the retriever is passed a pair with the
* actual callback as the second and this instance as the first element.
* @param restrictPoolToLeaderboard
* whether the pool of "all" competitors is to be restricted to those obtained from the leaderboard, or
* to all competitors in the server's competitor store
* @param additionalWidgetsBeforeTables widgets to be inserted above / before the competitor tables; may be {@code null} or empty
*/
protected CompetitorRegistrationsPanel(final SailingServiceWriteAsync sailingServiceWrite, final UserService userService,
final StringMessages stringMessages, final ErrorReporter errorReporter, boolean editable,
String leaderboardName, boolean canBoatsOfCompetitorsChangePerRace, String boatClass, Runnable validator,
Consumer<AsyncCallback<Collection<CompetitorDTO>>> registeredCompetitorsRetriever,
protected CompetitorRegistrationsPanel(final SailingServiceWriteAsync sailingServiceWrite,
final UserService userService, Refresher<CompetitorDTO> competitorsRefresher,
Refresher<BoatDTO> boatsRefresher, final StringMessages stringMessages, final ErrorReporter errorReporter,
boolean editable, String leaderboardName, boolean canBoatsOfCompetitorsChangePerRace, String boatClass,
Runnable validator,
Consumer<Pair<CompetitorRegistrationsPanel, AsyncCallback<Collection<CompetitorDTO>>>> registeredCompetitorsRetriever,
boolean restrictPoolToLeaderboard, Widget... additionalWidgetsBeforeTables) {
this.errorReporter = errorReporter;
this.restrictPoolToLeaderboard = restrictPoolToLeaderboard;
@@ -107,7 +118,6 @@ public class CompetitorRegistrationsPanel extends FlowPanel implements BusyDispl
registeredCompetitorsTable.openEditCompetitorWithBoatDialog(competitorDTO, boatClass);
}
});
final Button inviteCompetitorsButton = new Button(stringMessages.inviteSelectedCompetitors());
inviteCompetitorsButton.addClickHandler(new ClickHandler() {
@Override
@@ -126,10 +136,11 @@ public class CompetitorRegistrationsPanel extends FlowPanel implements BusyDispl
@Override
public void onSuccess(Iterable<String> providerNames) {
MatchImportedCompetitorsDialogFactory matchCompetitorsDialogFactory = getMatchCompetitorsDialogFactory(
sailingServiceWrite, userService, stringMessages, errorReporter);
sailingServiceWrite, userService, competitorsRefresher, boatsRefresher, stringMessages,
errorReporter);
CompetitorImportProviderSelectionDialog dialog = new CompetitorImportProviderSelectionDialog(
matchCompetitorsDialogFactory, CompetitorRegistrationsPanel.this, providerNames, sailingServiceWrite,
stringMessages, errorReporter);
matchCompetitorsDialogFactory, CompetitorRegistrationsPanel.this, providerNames,
sailingServiceWrite, stringMessages, errorReporter);
dialog.show();
}
@@ -144,10 +155,12 @@ public class CompetitorRegistrationsPanel extends FlowPanel implements BusyDispl
final HorizontalPanel competitorRegistrationPanel = new HorizontalPanel();
final CaptionPanel allCompetitorsPanel = new CaptionPanel(stringMessages.competitorPool());
final CaptionPanel registeredCompetitorsPanel = new CaptionPanel(stringMessages.registeredCompetitors());
allCompetitorsTable = new CompetitorTableWrapper<>(sailingServiceWrite, userService, stringMessages,
errorReporter, /* multiSelection */ true, /* enablePager */ true, /* filterCompetitorWithBoat */ false,
/* filterCompetitorsWithoutBoat */ !canBoatsOfCompetitorsChangePerRace);
registeredCompetitorsTable = new CompetitorTableWrapper<>(sailingServiceWrite, userService, stringMessages,
allCompetitorsTable = new CompetitorTableWrapper<>(sailingServiceWrite, userService, competitorsRefresher, boatsRefresher,
stringMessages, errorReporter, /* multiSelection */ true, /* enablePager */ true,
/* filterCompetitorWithBoat */ false, /* filterCompetitorsWithoutBoat */ !canBoatsOfCompetitorsChangePerRace);
registeredCompetitorsTable = new CompetitorTableWrapper<>(sailingServiceWrite, userService,
/* competitorsRefresher not needed; filled based on registrations */ null,
/* boatsRefresher not needed */ null, stringMessages,
errorReporter, /* multiSelection */ true, /* enablePager */ false, /* filterCompetitorWithBoat */ false,
/* filterCompetitorsWithoutBoat */ false);
registeredCompetitorsTable.getSelectionModel().addSelectionChangeHandler(event -> validateAndUpdate());
@@ -208,15 +221,17 @@ public class CompetitorRegistrationsPanel extends FlowPanel implements BusyDispl
}
private MatchImportedCompetitorsDialogFactory getMatchCompetitorsDialogFactory(
final SailingServiceWriteAsync sailingServiceWrite, final UserService userService, final StringMessages stringMessages,
final ErrorReporter errorReporter) {
final SailingServiceWriteAsync sailingServiceWrite, final UserService userService,
Refresher<CompetitorDTO> competitorsRefresher, Refresher<BoatDTO> boatsRefresher,
final StringMessages stringMessages, final ErrorReporter errorReporter) {
return new MatchImportedCompetitorsDialogFactory() {
@Override
public MatchImportedCompetitorsDialog createMatchImportedCompetitorsDialog(
final Pair<List<CompetitorDescriptor>, String> competitorDescriptorsAndHint,
final Iterable<CompetitorDTO> competitors) {
return new MatchImportedCompetitorsDialog(competitorDescriptorsAndHint.getA(), competitors, competitorDescriptorsAndHint.getB(),
stringMessages, sailingServiceWrite, userService, errorReporter, importCompetitorCallback);
return new MatchImportedCompetitorsDialog(competitorDescriptorsAndHint.getA(), competitors,
competitorDescriptorsAndHint.getB(), stringMessages, sailingServiceWrite, userService,
competitorsRefresher, boatsRefresher, errorReporter, importCompetitorCallback);
}
};
}
@@ -257,7 +272,7 @@ public class CompetitorRegistrationsPanel extends FlowPanel implements BusyDispl
allCompetitorsTable.refreshCompetitorList(this.restrictPoolToLeaderboard ? leaderboardName : null, new Callback<Iterable<CompetitorDTO>, Throwable>() {
@Override
public void onSuccess(Iterable<CompetitorDTO> result) {
registeredCompetitorsRetriever.accept(new AsyncCallback<Collection<CompetitorDTO>>() {
registeredCompetitorsRetriever.accept(new Pair<>(CompetitorRegistrationsPanel.this, new AsyncCallback<Collection<CompetitorDTO>>() {
@Override
public void onSuccess(Collection<CompetitorDTO> registeredCompetitors) {
moveFromPoolToRegistered(registeredCompetitors);
@@ -268,7 +283,7 @@ public class CompetitorRegistrationsPanel extends FlowPanel implements BusyDispl
public void onFailure(Throwable reason) {
errorReporter.reportError("Could not load already registered competitors: " + reason.getMessage());
}
});
}));
}
@Override
@@ -38,9 +38,10 @@ public class CompetitorSelectionDialog extends DataEntryDialog<CompetitorDTO> {
CompetitorDTO initialSelection,
DialogCallback<CompetitorDTO> callback) {
super(title, message, stringMessages.ok(), stringMessages.cancel(), /* validator */ null, callback);
competitorTable = new CompetitorTableWrapper<>(sailingServiceWrite, userService, stringMessages, errorReporter,
/* multiSelection */ false, /* enablePager */ true, /* filter with boat */ false,
/* filter without boat */ false);
competitorTable = new CompetitorTableWrapper<>(sailingServiceWrite, userService,
/* competitorsRefresher not needed; using competitorProvider */ null,
/* boatsRefresher not needed */ null, stringMessages, errorReporter, /* multiSelection */ false,
/* enablePager */ true, /* filter with boat */ false, /* filter without boat */ false);
competitorProvider.accept(new AsyncCallback<Iterable<? extends CompetitorDTO>>() {
@Override
public void onFailure(Throwable caught) {
@@ -29,6 +29,7 @@ import com.sap.sailing.domain.common.security.SecuredDomainType;
import com.sap.sailing.gwt.ui.adminconsole.ColorColumn.ColorRetriever;
import com.sap.sailing.gwt.ui.client.FlagImageRenderer;
import com.sap.sailing.gwt.ui.client.FlagImageResolverImpl;
import com.sap.sailing.gwt.ui.client.Refresher;
import com.sap.sailing.gwt.ui.client.SailingServiceWriteAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.common.Color;
@@ -69,6 +70,8 @@ public class CompetitorTableWrapper<S extends RefreshableSelectionModel<Competit
private final LabeledAbstractFilterablePanel<CompetitorDTO> filterField;
private final boolean filterCompetitorsWithBoat;
private final boolean filterCompetitorsWithoutBoat;
private final Refresher<CompetitorDTO> competitorsRefresher;
private final Refresher<BoatDTO> boatsRefresher;
/**
* @param filterCompetitorsWithBoat
@@ -82,8 +85,10 @@ public class CompetitorTableWrapper<S extends RefreshableSelectionModel<Competit
* to be loaded. In this case, competitors without boat will be fetched only if this flag is
* {@code false}.
*/
public CompetitorTableWrapper(SailingServiceWriteAsync sailingServiceWrite, UserService userService, StringMessages stringMessages, ErrorReporter errorReporter,
boolean multiSelection, boolean enablePager, boolean filterCompetitorsWithBoat, boolean filterCompetitorsWithoutBoat) {
public CompetitorTableWrapper(SailingServiceWriteAsync sailingServiceWrite, UserService userService,
Refresher<CompetitorDTO> competitorsRefresher, Refresher<BoatDTO> boatsRefresher,
StringMessages stringMessages, ErrorReporter errorReporter, boolean multiSelection, boolean enablePager,
boolean filterCompetitorsWithBoat, boolean filterCompetitorsWithoutBoat) {
super(sailingServiceWrite, stringMessages, errorReporter, multiSelection, enablePager,
new EntityIdentityComparator<CompetitorDTO>() {
@Override
@@ -95,6 +100,8 @@ public class CompetitorTableWrapper<S extends RefreshableSelectionModel<Competit
return t.getIdAsString().hashCode();
}
});
this.competitorsRefresher = competitorsRefresher;
this.boatsRefresher = boatsRefresher;
this.filterCompetitorsWithBoat = filterCompetitorsWithBoat;
this.filterCompetitorsWithoutBoat = filterCompetitorsWithoutBoat;
ListHandler<CompetitorDTO> competitorColumnListHandler = getColumnSortHandler();
@@ -130,7 +137,10 @@ public class CompetitorTableWrapper<S extends RefreshableSelectionModel<Competit
TextColumn<CompetitorDTO> boatClassColumn = new TextColumn<CompetitorDTO>() {
@Override
public String getValue(CompetitorDTO competitor) {
return competitor.hasBoat() && ((CompetitorWithBoatDTO) competitor).getBoatClass() != null ? ((CompetitorWithBoatDTO) competitor).getBoatClass().getName() : "";
return competitor.hasBoat()
&& ((CompetitorWithBoatDTO) competitor).getBoatClass() != null
? ((CompetitorWithBoatDTO) competitor).getBoatClass().getName()
: "";
}
};
boatClassColumn.setSortable(true);
@@ -365,8 +375,12 @@ public class CompetitorTableWrapper<S extends RefreshableSelectionModel<Competit
return filterField;
}
/**
* Updates the table's data model by filtering the {@code competitors} based on the settings in the fields
* {@link #filterCompetitorsWithBoat} and {@link #filterCompetitorsWithoutBoat}.
*/
public void refreshCompetitorList(Iterable<? extends CompetitorDTO> competitors) {
getFilteredCompetitors(competitors);
getFilteredCompetitors(Util.filter(competitors, c->(!c.hasBoat() || !filterCompetitorsWithBoat) && (c.hasBoat() || !filterCompetitorsWithoutBoat)));
}
public void refreshCompetitorList(String leaderboardName) {
@@ -402,7 +416,13 @@ public class CompetitorTableWrapper<S extends RefreshableSelectionModel<Competit
if (leaderboardName != null) {
sailingServiceWrite.getCompetitorsOfLeaderboard(leaderboardName, myCallback);
} else {
sailingServiceWrite.getCompetitors(filterCompetitorsWithBoat, filterCompetitorsWithoutBoat, myCallback);
if (competitorsRefresher != null) {
// Don't fetch from server but ask our unified data model to deliver the competitors without forcing server
// round-trip unless the competitors haven't been loaded at all so far
competitorsRefresher.callFillAndReloadInitially(competitors->myCallback.onSuccess(competitors));
} else {
sailingServiceWrite.getCompetitors(filterCompetitorsWithBoat, filterCompetitorsWithoutBoat, myCallback);
}
}
}
@@ -438,6 +458,32 @@ public class CompetitorTableWrapper<S extends RefreshableSelectionModel<Competit
@Override
public void onSuccess(CompetitorWithBoatDTO updatedCompetitor) {
if (competitorsRefresher != null) {
competitorsRefresher.addIfNotContainedElseReplace(updatedCompetitor, new EntityIdentityComparator<CompetitorDTO>() {
@Override
public boolean representSameEntity(CompetitorDTO dto1, CompetitorDTO dto2) {
return dto1.getIdAsString().equals(dto2.getIdAsString());
}
@Override
public int hashCode(CompetitorDTO t) {
return t.getIdAsString().hashCode();
}
});
if (boatsRefresher != null) {
boatsRefresher.addIfNotContainedElseReplace(updatedCompetitor.getBoat(), new EntityIdentityComparator<BoatDTO>() {
@Override
public boolean representSameEntity(BoatDTO dto1, BoatDTO dto2) {
return dto1.getIdAsString().equals(dto2.getIdAsString());
}
@Override
public int hashCode(BoatDTO t) {
return t.getIdAsString().hashCode();
}
});
boatsRefresher.callAllFill();
}
}
//only reload selected competitors reloading with refreshCompetitorList(leaderboardName)
//would not work in case the list is not based on a leaderboard e.g. AbstractCompetitorRegistrationDialog
int editedCompetitorIndex = getFilterField().indexOf(originalCompetitor);
@@ -492,6 +538,18 @@ public class CompetitorTableWrapper<S extends RefreshableSelectionModel<Competit
@Override
public void onSuccess(CompetitorDTO updatedCompetitor) {
if (competitorsRefresher != null) {
competitorsRefresher.addIfNotContainedElseReplace(updatedCompetitor, new EntityIdentityComparator<CompetitorDTO>() {
@Override
public boolean representSameEntity(CompetitorDTO dto1, CompetitorDTO dto2) {
return dto1.getIdAsString().equals(dto2.getIdAsString());
}
@Override
public int hashCode(CompetitorDTO t) {
return t.getIdAsString().hashCode();
}
});
}
//only reload selected competitors reloading with refreshCompetitorList(leaderboardName)
//would not work in case the list is not based on a leaderboard e.g. AbstractCompetitorRegistrationDialog
int editedCompetitorIndex = getFilterField().indexOf(originalCompetitor);
@@ -565,6 +623,14 @@ public class CompetitorTableWrapper<S extends RefreshableSelectionModel<Competit
@Override
public void onSuccess(T addedCompetitor) {
if (competitorsRefresher != null) {
competitorsRefresher.add(addedCompetitor);
}
if (boatsRefresher != null && addedCompetitor instanceof CompetitorWithBoatDTO) {
CompetitorWithBoatDTO competitorWithBoatDTO = (CompetitorWithBoatDTO) addedCompetitor;
boatsRefresher.add(competitorWithBoatDTO.getBoat());
boatsRefresher.callAllFill();
}
getFilterField().add(addedCompetitor);
getDataProvider().refresh();
}
@@ -13,7 +13,9 @@ import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.sap.sailing.domain.common.dto.BoatClassDTO;
import com.sap.sailing.domain.common.dto.BoatDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.dto.CompetitorWithBoatDTO;
import com.sap.sailing.gwt.ui.client.Refresher;
import com.sap.sailing.gwt.ui.client.SailingServiceWriteAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.common.Color;
@@ -36,15 +38,15 @@ public class CompetitorWithBoatCreateDialog extends AbstractCompetitorWithBoatDi
/**
* The class creates the UI-dialog to type in the Data about a competitor.
*
* @param competitorToEdit
* The 'competitorToEdit' parameter contains the competitor which should be changed or initialized.
* @param boatClass
* The boat class is the default shown boat class for new boats. Set <code>null</code> if your boat is
* already initialized or you don't want a default boat class.
*/
public CompetitorWithBoatCreateDialog(SailingServiceWriteAsync sailingServiceWrite, final UserService userService, StringMessages stringMessages, ErrorReporter errorReporter, CompetitorWithBoatDTO competitorToEdit,
DialogCallback<CompetitorWithBoatDTO> callback, String boatClass) {
public CompetitorWithBoatCreateDialog(SailingServiceWriteAsync sailingServiceWrite, final UserService userService,
Refresher<BoatDTO> boatsRefresher, Refresher<CompetitorDTO> competitorsRefresher, StringMessages stringMessages, ErrorReporter errorReporter,
CompetitorWithBoatDTO competitorToEdit, DialogCallback<CompetitorWithBoatDTO> callback, String boatClass) {
super("Add competitor with boat", stringMessages, competitorToEdit, callback, boatClass);
this.ensureDebugId("CompetitorWithBoatCreateDialog");
this.useNewBoatRadioButton = this.createRadioButton("BoatCreationSelection", "Create new boat");
@@ -64,9 +66,9 @@ public class CompetitorWithBoatCreateDialog extends AbstractCompetitorWithBoatDi
});
newBoatPanel = new VerticalPanel();
existingBoatPanel = new VerticalPanel();
this.existingBoatsTable = new BoatTableWrapper<>(sailingServiceWrite, userService, stringMessages, errorReporter, /* multiSelection */ false,
/* enablePager */ true, /* pagingSize*/ 10, false);
existingBoatsTable.refreshBoatList(true, /* callback */ null);
this.existingBoatsTable = new BoatTableWrapper<>(sailingServiceWrite, userService, boatsRefresher, competitorsRefresher, stringMessages, errorReporter,
/* multiSelection */ false, /* enablePager */ true, /* pagingSize*/ 10, false);
existingBoatsTable.refreshBoatList(/* loadOnlyStandaloneBoats */ true, /* callback */ null);
this.existingBoatsTable.getSelectionModel().addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
@Override
public void onSelectionChange(SelectionChangeEvent event) {
@@ -3,7 +3,10 @@ package com.sap.sailing.gwt.ui.adminconsole;
import java.util.List;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.dto.BoatDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.dto.CompetitorWithBoatDTO;
import com.sap.sailing.gwt.ui.client.Refresher;
import com.sap.sailing.gwt.ui.client.SailingServiceWriteAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.gwt.client.ErrorReporter;
@@ -18,6 +21,8 @@ public class EditCompetitorsDialog extends DataEntryDialog<List<CompetitorWithBo
private final String leaderboardName;
private final String boatClassName;
private final boolean createWithBoatByDefault;
private final Refresher<CompetitorDTO> competitorsRefresher;
private final Refresher<BoatDTO> boatsRefresher;
protected static class CompetitorsValidator implements Validator<List<CompetitorWithBoatDTO>> {
public CompetitorsValidator() {
@@ -31,8 +36,10 @@ public class EditCompetitorsDialog extends DataEntryDialog<List<CompetitorWithBo
}
public EditCompetitorsDialog(final SailingServiceWriteAsync sailingServiceWrite, final UserService userService,
Refresher<CompetitorDTO> competitorsRefresher, Refresher<BoatDTO> boatsRefresher,
final String leaderboardName, final String boatClassName, boolean createWithBoatByDefault,
final StringMessages stringMessages, final ErrorReporter errorReporter, DialogCallback<List<CompetitorWithBoatDTO>> callback) {
final StringMessages stringMessages, final ErrorReporter errorReporter,
DialogCallback<List<CompetitorWithBoatDTO>> callback) {
super(stringMessages.actionEditCompetitors(), null, stringMessages.ok(), stringMessages.cancel(),
new CompetitorsValidator(), callback);
this.sailingServiceWrite = sailingServiceWrite;
@@ -42,6 +49,8 @@ public class EditCompetitorsDialog extends DataEntryDialog<List<CompetitorWithBo
this.leaderboardName = leaderboardName;
this.boatClassName = boatClassName;
this.createWithBoatByDefault = createWithBoatByDefault;
this.competitorsRefresher = competitorsRefresher;
this.boatsRefresher = boatsRefresher;
}
@Override
@@ -51,8 +60,8 @@ public class EditCompetitorsDialog extends DataEntryDialog<List<CompetitorWithBo
@Override
protected Widget getAdditionalWidget() {
CompetitorPanel competitorPanel = new CompetitorPanel(sailingServiceWrite, userService, leaderboardName,
boatClassName, createWithBoatByDefault, stringMessages, errorReporter);
final CompetitorPanel competitorPanel = new CompetitorPanel(sailingServiceWrite, userService, competitorsRefresher, boatsRefresher,
leaderboardName, boatClassName, createWithBoatByDefault, stringMessages, errorReporter);
return competitorPanel;
}
}
@@ -9,13 +9,18 @@ import java.util.UUID;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.sap.sailing.domain.common.RegattaNameAndRaceName;
import com.sap.sailing.domain.common.dto.BoatDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.gwt.ui.client.Displayer;
import com.sap.sailing.gwt.ui.client.Refresher;
import com.sap.sailing.gwt.ui.client.SailingServiceWriteAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.DeviceMappingDTO;
import com.sap.sailing.gwt.ui.shared.EventDTO;
import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO;
import com.sap.sailing.gwt.ui.shared.RegattaDTO;
import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO;
import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTOWithSecurity;
import com.sap.sailing.gwt.ui.shared.TrackFileImportDeviceIdentifierDTO;
import com.sap.sailing.gwt.ui.shared.TypedDeviceMappingDTO;
import com.sap.sse.common.TimePoint;
@@ -25,6 +30,7 @@ import com.sap.sse.common.Util.Triple;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.Notification;
import com.sap.sse.gwt.client.Notification.NotificationType;
import com.sap.sse.gwt.client.celltable.EntityIdentityComparator;
import com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback;
import com.sap.sse.gwt.client.dialog.DataEntryDialog.Validator;
import com.sap.sse.security.ui.client.UserService;
@@ -59,10 +65,14 @@ public class ExpeditionAllInOneAfterImportHandler {
private Iterable<TimePoint> startTimes;
public ExpeditionAllInOneAfterImportHandler(UUID eventId, String regattaName, String leaderboardName,
String leaderboardGroupName, UUID leaderboardGroupId, List<Triple<String, String, String>> raceEntries,
String leaderboardGroupName, UUID leaderboardGroupId, List<Triple<String, String, String>> raceEntries,
List<String> gpsDeviceIds, List<String> sensorDeviceIds, String sensorImporterType,
Iterable<TimePoint> startTimes, final SailingServiceWriteAsync sailingServiceWrite, final UserService userService, final ErrorReporter errorReporter,
final StringMessages stringMessages) {
Iterable<TimePoint> startTimes, final SailingServiceWriteAsync sailingServiceWrite,
final UserService userService, Refresher<CompetitorDTO> competitorsRefresher,
Refresher<BoatDTO> boatsRefresher, Refresher<RegattaDTO> regattasRefresher,
Refresher<EventDTO> eventsRefresher, Refresher<StrippedLeaderboardDTOWithSecurity> leaderboardsRefresher,
Refresher<LeaderboardGroupDTO> leaderboardGroupsRefresher, final ErrorReporter errorReporter,
final StringMessages stringMessages, Displayer<RegattaDTO> regattaOracleToRefresh) {
this.leaderboardGroupName = leaderboardGroupName;
this.leaderboardGroupId = leaderboardGroupId;
this.sensorImporterType = sensorImporterType;
@@ -78,15 +88,46 @@ public class ExpeditionAllInOneAfterImportHandler {
@Override
public void onSuccess(EventDTO result) {
event = result;
eventsRefresher.addIfNotContainedElseReplace(result, new EntityIdentityComparator<EventDTO>() {
@Override
public boolean representSameEntity(EventDTO dto1, EventDTO dto2) {
return dto1.id.equals(dto2.id);
}
@Override
public int hashCode(EventDTO t) {
return t.id.hashCode();
}
});
sailingServiceWrite.getRegattaByName(regattaName, new DataLoadingCallback<RegattaDTO>() {
@Override
public void onSuccess(RegattaDTO result) {
regatta = result;
sailingServiceWrite.getLeaderboard(leaderboardName,
new DataLoadingCallback<StrippedLeaderboardDTO>() {
regattasRefresher.addIfNotContainedElseReplace(result, new EntityIdentityComparator<RegattaDTO>() {
@Override
public void onSuccess(StrippedLeaderboardDTO result) {
public boolean representSameEntity(RegattaDTO dto1, RegattaDTO dto2) {
return dto1.getRegattaIdentifier().equals(dto2.getRegattaIdentifier());
}
@Override
public int hashCode(RegattaDTO t) {
return t.getRegattaIdentifier().hashCode();
}
});
regattasRefresher.callFillAndReloadInitially(regattaOracleToRefresh);
sailingServiceWrite.getLeaderboardWithSecurity(leaderboardName,
new DataLoadingCallback<StrippedLeaderboardDTOWithSecurity>() {
@Override
public void onSuccess(StrippedLeaderboardDTOWithSecurity result) {
leaderboard = result;
leaderboardsRefresher.addIfNotContainedElseReplace(result, new EntityIdentityComparator<StrippedLeaderboardDTOWithSecurity>() {
@Override
public boolean representSameEntity(StrippedLeaderboardDTOWithSecurity dto1, StrippedLeaderboardDTOWithSecurity dto2) {
return dto1.getName().equals(dto2.getName());
}
@Override
public int hashCode(StrippedLeaderboardDTOWithSecurity t) {
return t.getName().hashCode();
}
});
sailingServiceWrite.getTrackFileImportDeviceIds(gpsDeviceIds,
new DataLoadingCallback<List<TrackFileImportDeviceIdentifierDTO>>() {
@Override
@@ -97,7 +138,7 @@ public class ExpeditionAllInOneAfterImportHandler {
@Override
public void onSuccess(List<TrackFileImportDeviceIdentifierDTO> result) {
sensorFixesDeviceIDs = result;
showCompetitorRegistration();
showCompetitorRegistration(competitorsRefresher, boatsRefresher);
}
});
}
@@ -111,20 +152,25 @@ public class ExpeditionAllInOneAfterImportHandler {
}
private class RegattaLogCompetitorRegistrationAndSelectionDialog extends RegattaLogCompetitorRegistrationDialog {
public RegattaLogCompetitorRegistrationAndSelectionDialog(String boatClass, SailingServiceWriteAsync sailingServiceWrite, final UserService userService,
public RegattaLogCompetitorRegistrationAndSelectionDialog(String boatClass,
SailingServiceWriteAsync sailingServiceWrite, final UserService userService,
Refresher<CompetitorDTO> competitorsRefresher, Refresher<BoatDTO> boatsRefresher,
StringMessages stringMessages, ErrorReporter errorReporter, boolean editable, String leaderboardName,
boolean canBoatsOfCompetitorsChangePerRace) {
this(boatClass, sailingServiceWrite, userService, stringMessages, errorReporter, editable, leaderboardName,
canBoatsOfCompetitorsChangePerRace, new ValidatorForCompetitorRegistrationDialog(stringMessages),
this(boatClass, sailingServiceWrite, userService, competitorsRefresher, boatsRefresher, stringMessages,
errorReporter, editable, leaderboardName, canBoatsOfCompetitorsChangePerRace,
new ValidatorForCompetitorRegistrationDialog(stringMessages),
new CallbackForCompetitorRegistrationDialog());
}
public RegattaLogCompetitorRegistrationAndSelectionDialog(String boatClass, SailingServiceWriteAsync sailingServiceWrite, final UserService userService,
public RegattaLogCompetitorRegistrationAndSelectionDialog(String boatClass,
SailingServiceWriteAsync sailingServiceWrite, final UserService userService,
Refresher<CompetitorDTO> competitorsRefresher, Refresher<BoatDTO> boatsRefresher,
StringMessages stringMessages, ErrorReporter errorReporter, boolean editable, String leaderboardName,
boolean canBoatsOfCompetitorsChangePerRace, ValidatorForCompetitorRegistrationDialog validator,
CallbackForCompetitorRegistrationDialog callback) {
super(boatClass, sailingServiceWrite, userService, stringMessages, errorReporter, editable, leaderboardName,
canBoatsOfCompetitorsChangePerRace, validator, callback);
super(boatClass, sailingServiceWrite, userService, competitorsRefresher, boatsRefresher, stringMessages,
errorReporter, editable, leaderboardName, canBoatsOfCompetitorsChangePerRace, validator, callback);
validator.setCompetitorRegistrationsPanel(competitorRegistrationsPanel);
callback.setCompetitorRegistrationsPanel(competitorRegistrationsPanel);
}
@@ -176,10 +222,10 @@ public class ExpeditionAllInOneAfterImportHandler {
}
}
private void showCompetitorRegistration() {
private void showCompetitorRegistration(Refresher<CompetitorDTO> competitorsRefresher, Refresher<BoatDTO> boatsRefresher) {
new RegattaLogCompetitorRegistrationAndSelectionDialog(regatta.boatClass == null ? null : regatta.boatClass.getName(),
sailingServiceWrite, userService, stringMessages, errorReporter, true, leaderboard.getName(),
leaderboard.canBoatsOfCompetitorsChangePerRace).show();
sailingServiceWrite, userService, competitorsRefresher, boatsRefresher, stringMessages, errorReporter, true,
leaderboard.getName(), leaderboard.canBoatsOfCompetitorsChangePerRace).show();
}
private void mapCompetitorsToGPSFixDeviceIds(final Set<CompetitorDTO> mappedCompetitors) {
@@ -332,7 +378,6 @@ public class ExpeditionAllInOneAfterImportHandler {
}
private abstract class DataLoadingCallback<T> implements AsyncCallback<T> {
@Override
public final void onFailure(Throwable caught) {
errorReporter.reportError("Failed loading importer data from server!");
@@ -340,7 +385,6 @@ public class ExpeditionAllInOneAfterImportHandler {
}
private abstract class CancelImportDialogCallback<T> implements DialogCallback<T> {
@Override
public final void cancel() {
Notification.notify(stringMessages.importCanceledByUser(), NotificationType.WARNING);
@@ -45,8 +45,10 @@ public class ExpeditionAllInOneImportPanel extends Composite {
private static final String URL_SAILINGSERVER_EXPEDITION_FULL_IMPORT = "/../../sailingserver/expedition/import";
private final RegattaSuggestOracle regattaOracle;
private final Displayer<RegattaDTO> regattasDisplayer;
public ExpeditionAllInOneImportPanel(final StringMessages stringMessages, final Presenter presenter) {
regattasDisplayer = result->fillRegattas(result);
final FormPanel formPanel = new FormPanel();
final BusyIndicator busyIndicator = new SimpleBusyIndicator();
final Button uploadButton = new Button(stringMessages.upload());
@@ -66,7 +68,6 @@ public class ExpeditionAllInOneImportPanel extends Composite {
final FileUpload fileUpload = new FileUpload();
fileUpload.setName("upload");
contentPanel.add(fileUpload);
final FlowPanel importModePanel = new FlowPanel();
contentPanel.add(importModePanel);
final HorizontalPanel regattaNamePanel = new HorizontalPanel();
@@ -108,7 +109,6 @@ public class ExpeditionAllInOneImportPanel extends Composite {
regattaNamePanel.setCellVerticalAlignment(regattaNameLabel, HasVerticalAlignment.ALIGN_MIDDLE);
final TextBox regattaName = new TextBox();
regattaName.setName(ExpeditionAllInOneConstants.REQUEST_PARAMETER_REGATTA_NAME);
regattaOracle = new RegattaSuggestOracle();
final SuggestBox regattaSuggestBox = new SuggestBox(regattaOracle, regattaName);
regattaSuggestBox.getValueBox().getElement().getStyle().setProperty("minWidth", 30, Unit.EM);
@@ -154,10 +154,13 @@ public class ExpeditionAllInOneImportPanel extends Composite {
Notification.notify(StringMessages.INSTANCE.unexpectedErrorDuringFileImport(), NotificationType.ERROR);
} else if (response.hasEventId()) {
new ExpeditionAllInOneAfterImportHandler(response.getEventId(), response.getRegattaName(),
response.getLeaderboardName(), response.getLeaderboardGroupName(), response.getLeaderboardGroupId(),
response.getRaceEntries(), response.getGpsDeviceIds(), response.getSensorDeviceIds(),
response.getSensorFixImporterType(), response.getStartTimes(), presenter.getSailingService(),
presenter.getUserService(), presenter.getErrorReporter(), stringMessages);
response.getLeaderboardName(), response.getLeaderboardGroupName(),
response.getLeaderboardGroupId(), response.getRaceEntries(), response.getGpsDeviceIds(),
response.getSensorDeviceIds(), response.getSensorFixImporterType(), response.getStartTimes(),
presenter.getSailingService(), presenter.getUserService(), presenter.getCompetitorsRefresher(),
presenter.getBoatsRefresher(), presenter.getRegattasRefresher(), presenter.getEventsRefresher(),
presenter.getLeaderboardsRefresher(), presenter.getLeaderboardGroupsRefresher(),
presenter.getErrorReporter(), stringMessages, getRegattasDisplayer());
} else {
ExpeditionDataImportResultsDialog.showResults(response);
}
@@ -189,14 +192,6 @@ public class ExpeditionAllInOneImportPanel extends Composite {
initWidget(formPanel);
}
private final Displayer<RegattaDTO> regattasDisplayer = new Displayer<RegattaDTO>() {
@Override
public void fill(Iterable<RegattaDTO> result) {
fillRegattas(result);
}
};
public Displayer<RegattaDTO> getRegattasDisplayer() {
return regattasDisplayer;
}
@@ -34,13 +34,20 @@ public class ItemToMapToDeviceSelectionPanel implements IsWidget {
void onSelectionChange(MarkDTO mark);
}
public ItemToMapToDeviceSelectionPanel(SailingServiceWriteAsync sailingServiceWrite, final UserService userService, StringMessages stringMessages,
ErrorReporter errorReporter, final SelectionChangedHandler handler, MappableToDevice selected) {
public ItemToMapToDeviceSelectionPanel(SailingServiceWriteAsync sailingServiceWrite, final UserService userService,
StringMessages stringMessages, ErrorReporter errorReporter, final SelectionChangedHandler handler,
MappableToDevice selected) {
this.selected = selected;
this.errorReporter = errorReporter;
competitorTable = new CompetitorTableWrapper<>(sailingServiceWrite, userService, stringMessages, errorReporter, /* multiSelection */ false,
competitorTable = new CompetitorTableWrapper<>(sailingServiceWrite, userService,
/* competitorsRefresher not needed; competitors are obtained from the regatta log registrations */ null,
/* boatsRefresher not needed */ null, stringMessages, errorReporter, /* multiSelection */ false,
/* enablePager */ true, /* filterCompetitorWithBoat */ false, /* filterCompetitorsWithoutBoat */ false);
boatTable = new BoatTableWrapper<>(sailingServiceWrite, userService, stringMessages, errorReporter, /* multiSelection */ false, /* enablePager */ true, /* allowActions */ false);
boatTable = new BoatTableWrapper<>(sailingServiceWrite, userService,
/* boatsRefresher not needed; boats are obtained from the regatta log registrations */ null,
/* competitorsRefresher not needed */ null,
stringMessages, errorReporter, /* multiSelection */ false, /* enablePager */ true,
/* allowActions */ false);
markTable = new MarkTableWrapper<RefreshableSingleSelectionModel<MarkDTO>>(/* multiSelection */ false, sailingServiceWrite,
stringMessages, errorReporter);
competitorTable.getSelectionModel().addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
@@ -57,6 +57,8 @@ import com.sap.sailing.domain.common.LeaderboardNameConstants;
import com.sap.sailing.domain.common.RegattaName;
import com.sap.sailing.domain.common.ScoringSchemeType;
import com.sap.sailing.domain.common.dto.AbstractLeaderboardDTO;
import com.sap.sailing.domain.common.dto.BoatDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.dto.CompetitorWithBoatDTO;
import com.sap.sailing.domain.common.dto.CourseAreaDTO;
import com.sap.sailing.domain.common.dto.FleetDTO;
@@ -74,6 +76,7 @@ import com.sap.sailing.gwt.settings.client.leaderboard.MetaLeaderboardPerspectiv
import com.sap.sailing.gwt.ui.adminconsole.DisablableCheckboxCell.IsEnabled;
import com.sap.sailing.gwt.ui.adminconsole.places.AdminConsoleView.Presenter;
import com.sap.sailing.gwt.ui.client.EntryPointLinkFactory;
import com.sap.sailing.gwt.ui.client.Refresher;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.leaderboard.LeaderboardEntryPoint;
import com.sap.sailing.gwt.ui.leaderboard.ScoringSchemeTypeFormatter;
@@ -118,6 +121,8 @@ public class LeaderboardConfigPanel extends AbstractLeaderboardConfigPanel
private Button addRaceColumnsButton;
private Button columnMoveUpButton;
private Button columnMoveDownButton;
private final Refresher<CompetitorDTO> competitorsRefresher;
private final Refresher<BoatDTO> boatsRefresher;
public static class AnchorCell extends AbstractCell<SafeHtml> {
@Override
@@ -135,6 +140,8 @@ public class LeaderboardConfigPanel extends AbstractLeaderboardConfigPanel
super(presenter, theStringConstants, /* multi-selection */ false);
this.showRaceDetails = showRaceDetails;
leaderboardTable.ensureDebugId("LeaderboardsCellTable");
competitorsRefresher = presenter.getCompetitorsRefresher();
boatsRefresher = presenter.getBoatsRefresher();
}
@Override
@@ -304,9 +311,9 @@ public class LeaderboardConfigPanel extends AbstractLeaderboardConfigPanel
leaderboardActionColumn.addAction(LeaderboardConfigImagesBarCell.ACTION_EDIT_COMPETITORS, UPDATE,
leaderboardDTO -> {
EditCompetitorsDialog editCompetitorsDialog = new EditCompetitorsDialog(sailingServiceWrite, userService,
leaderboardDTO.getName(), leaderboardDTO.boatClassName,
/* createWithBoatByDefault */ !leaderboardDTO.canBoatsOfCompetitorsChangePerRace,
stringMessages, errorReporter, new DialogCallback<List<CompetitorWithBoatDTO>>() {
competitorsRefresher, boatsRefresher, leaderboardDTO.getName(),
leaderboardDTO.boatClassName,
/* createWithBoatByDefault */ !leaderboardDTO.canBoatsOfCompetitorsChangePerRace, stringMessages, errorReporter, new DialogCallback<List<CompetitorWithBoatDTO>>() {
@Override
public void cancel() {
}
@@ -15,9 +15,11 @@ import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SelectionChangeEvent.Handler;
import com.sap.sailing.domain.common.CompetitorDescriptor;
import com.sap.sailing.domain.common.dto.BoatDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.dto.CompetitorWithBoatDTO;
import com.sap.sailing.gwt.ui.adminconsole.CompetitorDescriptorTableWrapper.CompetitorsToImportToExistingLinking;
import com.sap.sailing.gwt.ui.client.Refresher;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.SailingServiceWriteAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
@@ -68,15 +70,19 @@ public class MatchImportedCompetitorsDialog extends DataEntryDialog<Pair<Map<Com
private final UserService userService;
private final ErrorReporter errorReporter;
private final Iterable<CompetitorDescriptor> CompetitorDescriptors;
private final Iterable<CompetitorDescriptor> competitorDescriptors;
private final CompetitorImportMatcher competitorImportMatcher;
private final Map<CompetitorDescriptor, CompetitorDTO> existingCompetitorsByImported = new HashMap<>();
private final Refresher<CompetitorDTO> competitorsRefresher;
private final Refresher<BoatDTO> boatsRefresher;
public MatchImportedCompetitorsDialog(final Iterable<CompetitorDescriptor> CompetitorDescriptors,
final Iterable<CompetitorDTO> existingCompetitor, String localizedHint,
StringMessages stringMessages, SailingServiceWriteAsync sailingServiceWrite, final UserService userService,
ErrorReporter errorReporter, DialogCallback<Pair<Map<CompetitorDescriptor, CompetitorDTO>, String>> callback) {
public MatchImportedCompetitorsDialog(final Iterable<CompetitorDescriptor> competitorDescriptors,
final Iterable<CompetitorDTO> existingCompetitor, String localizedHint, StringMessages stringMessages,
SailingServiceWriteAsync sailingServiceWrite, final UserService userService,
Refresher<CompetitorDTO> competitorsRefresher, Refresher<BoatDTO> boatsRefresher,
ErrorReporter errorReporter,
DialogCallback<Pair<Map<CompetitorDescriptor, CompetitorDTO>, String>> callback) {
super(stringMessages.importCompetitors(),
String.join("\n", stringMessages.chooseWhichCompetitorsShouldBeImported(), localizedHint),
stringMessages.ok(), stringMessages.cancel(), /* validator */ null, callback);
@@ -84,7 +90,9 @@ public class MatchImportedCompetitorsDialog extends DataEntryDialog<Pair<Map<Com
this.sailingServiceWrite = sailingServiceWrite;
this.userService = userService;
this.errorReporter = errorReporter;
this.CompetitorDescriptors = CompetitorDescriptors;
this.competitorDescriptors = competitorDescriptors;
this.competitorsRefresher = competitorsRefresher;
this.boatsRefresher = boatsRefresher;
competitorImportMatcher = new CompetitorImportMatcher(existingCompetitor);
}
@@ -95,9 +103,9 @@ public class MatchImportedCompetitorsDialog extends DataEntryDialog<Pair<Map<Com
@Override
protected Widget getAdditionalWidget() {
existingCompetitorsTable = new CompetitorTableWrapper<>(sailingServiceWrite, userService, stringMessages,
errorReporter, /* multiSelection */
false, /* enablePager */true, /* filterCompetitorWithBoat */ false, /* filterCompetitorsWithoutBoat */ false);
existingCompetitorsTable = new CompetitorTableWrapper<>(sailingServiceWrite, userService, competitorsRefresher, boatsRefresher,
stringMessages, /* multiSelection */
errorReporter, false, /* enablePager */true, /* filterCompetitorWithBoat */ false, /* filterCompetitorsWithoutBoat */ false);
final CompetitorsToImportToExistingLinking linker = new CompetitorsToImportToExistingLinking() {
@Override
public void unlinkCompetitor(CompetitorDescriptor competitor) {
@@ -115,7 +123,7 @@ public class MatchImportedCompetitorsDialog extends DataEntryDialog<Pair<Map<Com
};
importedCompetitorsTable = new CompetitorDescriptorTableWrapper<>(competitorImportMatcher, sailingServiceWrite,
stringMessages, errorReporter, /* multiSelection */ true, /* enablePager */false, /* unlinkCallback */ linker);
importedCompetitorsTable.refreshCompetitorDescriptorList(CompetitorDescriptors);
importedCompetitorsTable.refreshCompetitorDescriptorList(competitorDescriptors);
final RefreshableMultiSelectionModel<CompetitorDescriptor> importedCompetitorSelectionModel = importedCompetitorsTable.getSelectionModel();
importedCompetitorSelectionModel.addSelectionChangeHandler(getHandlerForImportedCompetitorsModel(importedCompetitorSelectionModel));
final RefreshableSingleSelectionModel<CompetitorDTO> existingCompetitorSelectionModel = existingCompetitorsTable.getSelectionModel();
@@ -10,7 +10,6 @@ import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import com.google.gwt.event.dom.client.ClickEvent;
@@ -18,12 +17,15 @@ import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.dto.BoatDTO;
import com.sap.sailing.domain.common.dto.CompetitorAndBoatDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.dto.CompetitorWithToolTipDTO;
import com.sap.sailing.domain.common.dto.FleetDTO;
import com.sap.sailing.gwt.ui.client.Refresher;
import com.sap.sailing.gwt.ui.client.SailingServiceWriteAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.common.Util.Pair;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.async.ParallelExecutionCallback;
import com.sap.sse.gwt.client.async.ParallelExecutionHolder;
@@ -37,7 +39,6 @@ public class RaceLogCompetitorRegistrationDialog extends AbstractCompetitorRegis
private CheckBox competitorRegistrationInRaceLogCheckBox;
private final Map<String, Set<CompetitorDTO>> fleetNameWithCompetitors;
private final ErrorReporter errorReporter;
private final SailingServiceWriteAsync sailingServiceWrite;
private final StringMessages stringMessages;
private static class Validator implements com.sap.sse.gwt.client.dialog.DataEntryDialog.Validator<Set<CompetitorDTO>> {
@@ -96,28 +97,36 @@ public class RaceLogCompetitorRegistrationDialog extends AbstractCompetitorRegis
}
}
public RaceLogCompetitorRegistrationDialog(String boatClass, SailingServiceWriteAsync sailingServiceWrite, final UserService userService,
StringMessages stringMessages, ErrorReporter errorReporter, boolean editable, String leaderboardName, boolean canBoatsOfCompetitorsChangePerRace,
String raceColumnName, String fleetName, List<FleetDTO> fleets,
public RaceLogCompetitorRegistrationDialog(String boatClass, SailingServiceWriteAsync sailingService,
final UserService userService, Refresher<CompetitorDTO> competitorsRefresher,
Refresher<BoatDTO> boatsRefresher, StringMessages stringMessages, ErrorReporter errorReporter,
boolean editable, String leaderboardName, boolean canBoatsOfCompetitorsChangePerRace, String raceColumnName,
String fleetName, List<FleetDTO> fleets,
com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback<Set<CompetitorDTO>> callback) {
this(sailingServiceWrite, userService, stringMessages, errorReporter, editable, callback, leaderboardName, canBoatsOfCompetitorsChangePerRace, boatClass,
raceColumnName, fleetName, fleets, new Validator(stringMessages));
this(sailingService, userService, competitorsRefresher, boatsRefresher, stringMessages, errorReporter, editable,
callback, leaderboardName, canBoatsOfCompetitorsChangePerRace, boatClass, raceColumnName, fleetName,
fleets, new Validator(stringMessages));
}
public RaceLogCompetitorRegistrationDialog(SailingServiceWriteAsync sailingServiceWrite, final UserService userService, StringMessages stringMessages,
ErrorReporter errorReporter, boolean editable,
public RaceLogCompetitorRegistrationDialog(SailingServiceWriteAsync sailingService, final UserService userService,
Refresher<CompetitorDTO> competitorsRefresher, Refresher<BoatDTO> boatsRefresher,
StringMessages stringMessages, ErrorReporter errorReporter, boolean editable,
com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback<Set<CompetitorDTO>> callback,
String leaderboardName, boolean canBoatsOfCompetitorsChangePerRace, String boatClass, String raceColumnName, String fleetName, List<FleetDTO> fleets, Validator validator) {
super(sailingServiceWrite, userService, stringMessages, errorReporter, editable, callback, leaderboardName,
canBoatsOfCompetitorsChangePerRace, boatClass,
canBoatsOfCompetitorsChangePerRace ? stringMessages.actionContinueToBoatAssignment() : stringMessages.save(), validator);
String leaderboardName, boolean canBoatsOfCompetitorsChangePerRace, String boatClass, String raceColumnName,
String fleetName, List<FleetDTO> fleets, Validator validator) {
super(sailingService, userService, competitorsRefresher, boatsRefresher, stringMessages, errorReporter,
editable, callback, leaderboardName, canBoatsOfCompetitorsChangePerRace, boatClass,
canBoatsOfCompetitorsChangePerRace ? stringMessages.actionContinueToBoatAssignment()
: stringMessages.save(),
validator,
cb -> getRegisteredCompetitors(sailingService, leaderboardName, raceColumnName, fleetName, cb));
this.errorReporter = errorReporter;
this.stringMessages = stringMessages;
this.sailingServiceWrite = sailingServiceWrite;
this.raceColumnName = raceColumnName;
this.fleetName = fleetName;
fleetNameWithCompetitors = findCompetitorsFromTheSameRaceColumn(fleets);
validator.setCompetitorRegistrationInRaceLogCheckBox(getOrCreateCompetitorRegistrationInRaceLogCheckBox(stringMessages));
validator.setCompetitorRegistrationInRaceLogCheckBox(
getOrCreateCompetitorRegistrationInRaceLogCheckBox(stringMessages));
validator.setFleetWithCompetitors(fleetNameWithCompetitors);
setupCompetitorRegistationsOnRaceCheckbox();
}
@@ -134,11 +143,6 @@ public class RaceLogCompetitorRegistrationDialog extends AbstractCompetitorRegis
return competitorRegistrationInRaceLogCheckBox;
}
@Override
protected Consumer<AsyncCallback<Collection<CompetitorDTO>>> getRegisteredCompetitorsRetriever() {
return (callback)->getRegisteredCompetitors(callback);
}
/**
* For all {@code fleets} passed and not equal to {@link #fleetName} retrieves the competitor-per-race registrations
* for the {@link #raceColumnName}.
@@ -177,7 +181,7 @@ public class RaceLogCompetitorRegistrationDialog extends AbstractCompetitorRegis
};
for (final Entry<String, ParallelExecutionCallback<Collection<CompetitorAndBoatDTO>>> fleetNameAndCallback : callbacksForFleetNames
.entrySet()) {
sailingServiceWrite.getCompetitorRegistrationsForRace(leaderboardName, raceColumnName,
sailingService.getCompetitorRegistrationsForRace(leaderboardName, raceColumnName,
fleetNameAndCallback.getKey(), fleetNameAndCallback.getValue());
}
}
@@ -201,15 +205,19 @@ public class RaceLogCompetitorRegistrationDialog extends AbstractCompetitorRegis
competitorRegistrationsPanel.grayOutCompetitorsFromRegistered(competitors);
}
private void getRegisteredCompetitors(AsyncCallback<Collection<CompetitorDTO>> callback) {
if (competitorRegistrationsPanel.showOnlyCompetitorsOfLog()) {
sailingServiceWrite.getCompetitorRegistrationsInRaceLog(leaderboardName, raceColumnName, fleetName, extractCompetitorDTOFromCompetitorAndBoatDTO(callback));
private static void getRegisteredCompetitors(SailingServiceWriteAsync sailingService, String leaderboardName,
String raceColumnName, String fleetName,
Pair<CompetitorRegistrationsPanel, AsyncCallback<Collection<CompetitorDTO>>> callback) {
// take the competitorRegistrationPanel from callback's A component because the field "competitorRegistrationsPanel" may
// not be initialized yet; see also https://bugzilla.sapsailing.com/bugzilla/show_bug.cgi?id=5419#c14
if (callback.getA().showOnlyCompetitorsOfLog()) {
sailingService.getCompetitorRegistrationsInRaceLog(leaderboardName, raceColumnName, fleetName, extractCompetitorDTOFromCompetitorAndBoatDTO(callback.getB()));
} else {
sailingServiceWrite.getCompetitorRegistrationsForRace(leaderboardName, raceColumnName, fleetName, extractCompetitorDTOFromCompetitorAndBoatDTO(callback));
sailingService.getCompetitorRegistrationsForRace(leaderboardName, raceColumnName, fleetName, extractCompetitorDTOFromCompetitorAndBoatDTO(callback.getB()));
}
}
private AsyncCallback<Collection<CompetitorAndBoatDTO>> extractCompetitorDTOFromCompetitorAndBoatDTO(final AsyncCallback<Collection<CompetitorDTO>> callback) {
private static AsyncCallback<Collection<CompetitorAndBoatDTO>> extractCompetitorDTOFromCompetitorAndBoatDTO(final AsyncCallback<Collection<CompetitorDTO>> callback) {
return new AsyncCallback<Collection<CompetitorAndBoatDTO>>() {
@Override
public void onFailure(Throwable caught) {
@@ -224,7 +232,7 @@ public class RaceLogCompetitorRegistrationDialog extends AbstractCompetitorRegis
}
private void setupCompetitorRegistationsOnRaceCheckbox() {
sailingServiceWrite.areCompetitorRegistrationsEnabledForRace(leaderboardName, raceColumnName, fleetName,
sailingService.areCompetitorRegistrationsEnabledForRace(leaderboardName, raceColumnName, fleetName,
new AsyncCallback<Boolean>() {
@Override
public void onSuccess(Boolean isEnabled) {
@@ -259,7 +267,7 @@ public class RaceLogCompetitorRegistrationDialog extends AbstractCompetitorRegis
@Override
public void ok(Void editedObject) {
if (getOrCreateCompetitorRegistrationInRaceLogCheckBox(stringMessages).getValue()) {
sailingServiceWrite.enableCompetitorRegistrationsForRace(leaderboardName,
sailingService.enableCompetitorRegistrationsForRace(leaderboardName,
raceColumnName, fleetName, new AsyncCallback<Void>() {
@Override
public void onSuccess(Void isEnabled) {
@@ -277,7 +285,7 @@ public class RaceLogCompetitorRegistrationDialog extends AbstractCompetitorRegis
});
} else {
sailingServiceWrite.disableCompetitorRegistrationsForRace(leaderboardName,
sailingService.disableCompetitorRegistrationsForRace(leaderboardName,
raceColumnName, fleetName, new AsyncCallback<Void>() {
@Override
public void onSuccess(Void isEnabled) {
@@ -11,6 +11,7 @@ import com.sap.sailing.gwt.ui.client.SailingServiceWriteAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.RegattaDTO;
import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO;
import com.sap.sse.common.Util.Pair;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.security.ui.client.UserService;
@@ -27,8 +28,8 @@ public class RegattaLeaderboardWithEliminationsCreateDialog extends RegattaLeade
}
@Override
protected Consumer<AsyncCallback<Collection<CompetitorDTO>>> getEliminatedCompetitorsRetriever() {
protected Consumer<Pair<CompetitorRegistrationsPanel, AsyncCallback<Collection<CompetitorDTO>>>> getEliminatedCompetitorsRetriever() {
eliminatedCompetitors = new HashSet<>();
return callback->callback.onSuccess(eliminatedCompetitors);
return callback->callback.getB().onSuccess(eliminatedCompetitors);
}
}
@@ -21,6 +21,7 @@ import com.sap.sailing.gwt.ui.client.SailingServiceWriteAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.RegattaDTO;
import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO;
import com.sap.sse.common.Util.Pair;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.security.ui.client.UserService;
@@ -122,12 +123,15 @@ public abstract class RegattaLeaderboardWithEliminationsDialog extends AbstractL
competitorEliminationPanelHolder.clear();
StrippedLeaderboardDTO selectedRegattaLeaderboard = getSelectedLeaderboard();
final CompetitorRegistrationsPanel[] competitorEliminationPanel = new CompetitorRegistrationsPanel[1];
competitorEliminationPanel[0] = new CompetitorRegistrationsPanel(sailingServiceWrite, userService, stringMessages,
errorReporter, /* editable */ true, regattaLeaderboardsListBox.getValue(regattaLeaderboardsListBox.getSelectedIndex()),
competitorEliminationPanel[0] = new CompetitorRegistrationsPanel(sailingServiceWrite, userService,
/* competitorsRefresher not required; competitor set is limited to those in leaderboard */ null,
/* boatsRefresher not needed */ null, stringMessages, errorReporter, /* editable */ true,
regattaLeaderboardsListBox.getValue(regattaLeaderboardsListBox.getSelectedIndex()),
selectedRegattaLeaderboard.canBoatsOfCompetitorsChangePerRace, selectedRegattaLeaderboard.boatClassName,
/* "validator" updates eliminatedCompetitors */ ()->eliminatedCompetitors = competitorEliminationPanel[0].getResult(),
getEliminatedCompetitorsRetriever(),
/* restrictPoolToLeaderboard */ true, /* additionalWidgetsBeforeTables */ new Label(stringMessages.selectCompetitorsToEliminate()));
/* "validator" updates eliminatedCompetitors */ () -> eliminatedCompetitors = competitorEliminationPanel[0]
.getResult(),
getEliminatedCompetitorsRetriever(), /* restrictPoolToLeaderboard */ true,
/* additionalWidgetsBeforeTables */ new Label(stringMessages.selectCompetitorsToEliminate()));
competitorEliminationPanelHolder.add(competitorEliminationPanel[0]);
}
@@ -139,7 +143,7 @@ public abstract class RegattaLeaderboardWithEliminationsDialog extends AbstractL
* this hasn't happened before, and the result is cached locally. In the {@link #getResult()} implementation the
* eliminations are then taken from the local state.
*/
protected abstract Consumer<AsyncCallback<Collection<CompetitorDTO>>> getEliminatedCompetitorsRetriever();
protected abstract Consumer<Pair<CompetitorRegistrationsPanel, AsyncCallback<Collection<CompetitorDTO>>>> getEliminatedCompetitorsRetriever();
/**
* Based on the contents of {@link #regattaLeaderboardsListBox} obtains the leaderboard from
@@ -10,6 +10,7 @@ import com.sap.sailing.gwt.ui.client.SailingServiceWriteAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.RegattaDTO;
import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO;
import com.sap.sse.common.Util.Pair;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.security.ui.client.UserService;
@@ -46,22 +47,22 @@ public class RegattaLeaderboardWithEliminationsEditDialog extends RegattaLeaderb
}
@Override
protected Consumer<AsyncCallback<Collection<CompetitorDTO>>> getEliminatedCompetitorsRetriever() {
protected Consumer<Pair<CompetitorRegistrationsPanel, AsyncCallback<Collection<CompetitorDTO>>>> getEliminatedCompetitorsRetriever() {
eliminatedCompetitors = null;
return callback->{
if (eliminatedCompetitors != null) {
callback.onSuccess(eliminatedCompetitors);
callback.getB().onSuccess(eliminatedCompetitors);
} else {
sailingServiceWrite.getEliminatedCompetitors(nameTextBox.getValue(), new AsyncCallback<Collection<CompetitorDTO>>() {
@Override
public void onFailure(Throwable caught) {
callback.onFailure(caught);
callback.getB().onFailure(caught);
}
@Override
public void onSuccess(Collection<CompetitorDTO> result) {
eliminatedCompetitors = new HashSet<>(result);
callback.onSuccess(eliminatedCompetitors);
callback.getB().onSuccess(eliminatedCompetitors);
}
});
}
@@ -7,6 +7,8 @@ import java.util.function.Consumer;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.dto.BoatDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.gwt.ui.client.Refresher;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.SailingServiceWriteAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
@@ -22,8 +24,10 @@ public class RegattaLogBoatRegistrationDialog extends DataEntryDialog<Set<BoatDT
protected final boolean canBoatsOfCompetitorsChangePerRace;
protected final BoatRegistrationsPanel boatRegistrationsPanel;
public RegattaLogBoatRegistrationDialog(String boatClass, SailingServiceWriteAsync sailingServiceWrite, final UserService userService,
StringMessages stringMessages, ErrorReporter errorReporter, boolean editable, String leaderboardName, boolean canBoatsOfCompetitorsChangePerRace,
public RegattaLogBoatRegistrationDialog(String boatClass, SailingServiceWriteAsync sailingServiceWrite,
final UserService userService, Refresher<BoatDTO> boatsRefresher,
Refresher<CompetitorDTO> competitorsRefresher, StringMessages stringMessages, ErrorReporter errorReporter,
boolean editable, String leaderboardName, boolean canBoatsOfCompetitorsChangePerRace,
com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback<Set<BoatDTO>> callback) {
super(stringMessages.registerBoats(), /* messsage */null, stringMessages.save(), stringMessages.cancel(),
/* validator */ null, callback);
@@ -32,8 +36,10 @@ public class RegattaLogBoatRegistrationDialog extends DataEntryDialog<Set<BoatDT
this.sailingService = sailingServiceWrite;
this.leaderboardName = leaderboardName;
this.canBoatsOfCompetitorsChangePerRace = canBoatsOfCompetitorsChangePerRace;
this.boatRegistrationsPanel = new BoatRegistrationsPanel(sailingServiceWrite, userService, stringMessages, errorReporter, editable, leaderboardName,
canBoatsOfCompetitorsChangePerRace, boatClass, ()->validateAndUpdate(), getRegisteredBoatsRetriever(), /* restrictPoolToLeaderboard */ false);
this.boatRegistrationsPanel = new BoatRegistrationsPanel(sailingServiceWrite, userService, boatsRefresher,
competitorsRefresher, stringMessages, errorReporter, editable, leaderboardName,
canBoatsOfCompetitorsChangePerRace, boatClass, () -> validateAndUpdate(), getRegisteredBoatsRetriever(),
/* restrictPoolToLeaderboard */ false);
}
protected Consumer<AsyncCallback<Collection<BoatDTO>>> getRegisteredBoatsRetriever() {
@@ -2,43 +2,48 @@ package com.sap.sailing.gwt.ui.adminconsole;
import java.util.Collection;
import java.util.Set;
import java.util.function.Consumer;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.dto.BoatDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.gwt.ui.client.Refresher;
import com.sap.sailing.gwt.ui.client.SailingServiceWriteAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.common.Util.Pair;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.security.ui.client.UserService;
public class RegattaLogCompetitorRegistrationDialog extends AbstractCompetitorRegistrationDialog {
public RegattaLogCompetitorRegistrationDialog(String boatClass, SailingServiceWriteAsync sailingServiceWrite, final UserService userService,
StringMessages stringMessages, ErrorReporter errorReporter, boolean editable, String leaderboardName, boolean canBoatsOfCompetitorsChangePerRace,
public RegattaLogCompetitorRegistrationDialog(String boatClass, SailingServiceWriteAsync sailingServiceWrite,
final UserService userService, Refresher<CompetitorDTO> competitorsRefresher,
Refresher<BoatDTO> boatsRefresher, StringMessages stringMessages, ErrorReporter errorReporter,
boolean editable, String leaderboardName, boolean canBoatsOfCompetitorsChangePerRace,
com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback<Set<CompetitorDTO>> callback) {
this(boatClass, sailingServiceWrite, userService, stringMessages, errorReporter, editable, leaderboardName,
canBoatsOfCompetitorsChangePerRace, /* validator */ null, callback);
}
public RegattaLogCompetitorRegistrationDialog(String boatClass, SailingServiceWriteAsync sailingServiceWrite, final UserService userService,
StringMessages stringMessages, ErrorReporter errorReporter, boolean editable, String leaderboardName,
boolean canBoatsOfCompetitorsChangePerRace, Validator<Set<CompetitorDTO>> validator,
com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback<Set<CompetitorDTO>> callback) {
super(sailingServiceWrite, userService, stringMessages, errorReporter, editable, callback, leaderboardName,
canBoatsOfCompetitorsChangePerRace, boatClass, stringMessages.save(), validator);
this(boatClass, sailingServiceWrite, userService, competitorsRefresher, boatsRefresher, stringMessages,
errorReporter, editable, leaderboardName, canBoatsOfCompetitorsChangePerRace, /* validator */ null,
callback);
}
@Override
protected Consumer<AsyncCallback<Collection<CompetitorDTO>>> getRegisteredCompetitorsRetriever() {
return (callback)->getRegisteredCompetitors(callback);
public RegattaLogCompetitorRegistrationDialog(String boatClass, SailingServiceWriteAsync sailingServiceWrite,
final UserService userService, Refresher<CompetitorDTO> competitorsRefresher,
Refresher<BoatDTO> boatsRefresher, StringMessages stringMessages, ErrorReporter errorReporter,
boolean editable, String leaderboardName, boolean canBoatsOfCompetitorsChangePerRace,
Validator<Set<CompetitorDTO>> validator,
com.sap.sse.gwt.client.dialog.DataEntryDialog.DialogCallback<Set<CompetitorDTO>> callback) {
super(sailingServiceWrite, userService, competitorsRefresher, boatsRefresher, stringMessages, errorReporter,
editable, callback, leaderboardName, canBoatsOfCompetitorsChangePerRace, boatClass,
stringMessages.save(), validator,
cb -> getRegisteredCompetitors(sailingServiceWrite, leaderboardName, cb));
}
private void getRegisteredCompetitors(AsyncCallback<Collection<CompetitorDTO>> callback) {
if (competitorRegistrationsPanel.showOnlyCompetitorsOfLog()) {
sailingService.getCompetitorRegistrationsInRegattaLog(leaderboardName, callback);
private static void getRegisteredCompetitors(SailingServiceWriteAsync sailingService, String leaderboardName,
Pair<CompetitorRegistrationsPanel, AsyncCallback<Collection<CompetitorDTO>>> callback) {
if (callback.getA().showOnlyCompetitorsOfLog()) {
sailingService.getCompetitorRegistrationsInRegattaLog(leaderboardName, callback.getB());
} else {
sailingService.getCompetitorRegistrationsForLeaderboard(leaderboardName, callback);
sailingService.getCompetitorRegistrationsForLeaderboard(leaderboardName, callback.getB());
}
}
@@ -50,6 +50,7 @@ import com.sap.sailing.domain.common.dto.RaceDTO;
import com.sap.sailing.domain.common.racelog.tracking.RaceLogTrackingState;
import com.sap.sailing.domain.common.security.SecuredDomainType;
import com.sap.sailing.gwt.ui.adminconsole.places.AdminConsoleView.Presenter;
import com.sap.sailing.gwt.ui.client.Refresher;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.shared.racemap.RaceMapSettings;
import com.sap.sailing.gwt.ui.shared.DeviceConfigurationDTO;
@@ -87,8 +88,7 @@ import com.sap.sse.security.ui.client.component.editacl.EditACLDialog;
/**
* Allows the user to start and stop tracking of races using the RaceLog-tracking connector.
*/
public class SmartphoneTrackingEventManagementPanel
extends AbstractLeaderboardConfigPanel {
public class SmartphoneTrackingEventManagementPanel extends AbstractLeaderboardConfigPanel {
private ToggleButton startStopTrackingButton;
private TrackFileImportDeviceIdentifierTableWrapper deviceIdentifierTable;
private CheckBox correctWindDirectionForDeclination;
@@ -96,9 +96,13 @@ public class SmartphoneTrackingEventManagementPanel
protected boolean regattaHasCompetitors = false;
private Map<Triple<String, String, String>, Pair<TimePointSpecificationFoundInLog, TimePointSpecificationFoundInLog>> raceWithStartAndEndOfTrackingTime = new HashMap<>();
private CaptionPanel importPanel;
private final Refresher<CompetitorDTO> competitorsRefresher;
private final Refresher<BoatDTO> boatsRefresher;
public SmartphoneTrackingEventManagementPanel(final Presenter presenter, StringMessages stringMessages) {
super(presenter, stringMessages, /* multiSelection */ true);
this.competitorsRefresher = presenter.getCompetitorsRefresher();
this.boatsRefresher = presenter.getBoatsRefresher();
// add upload panel
importPanel = new CaptionPanel(stringMessages.importFixes());
importPanel.setVisible(false);
@@ -406,9 +410,10 @@ public class SmartphoneTrackingEventManagementPanel
RaceColumnDTOAndFleetDTOWithNameBasedEquality raceColumnDTOAndFleetDTO) {
RegattaDTO regatta = getSelectedRegatta();
String boatClassName = regatta.boatClass.getName();
RaceLogCompetitorRegistrationDialog dialog = new RaceLogCompetitorRegistrationDialog(boatClassName, sailingServiceWrite, userService, stringMessages,
errorReporter, editable, leaderboardName, canBoatsOfCompetitorsChangePerRace, raceColumnName, fleetName,
raceColumnDTOAndFleetDTO.getA().getFleets(), new DialogCallback<Set<CompetitorDTO>>() {
RaceLogCompetitorRegistrationDialog dialog = new RaceLogCompetitorRegistrationDialog(boatClassName,
sailingServiceWrite, userService, competitorsRefresher, boatsRefresher, stringMessages, errorReporter,
editable, leaderboardName, canBoatsOfCompetitorsChangePerRace, raceColumnName, fleetName,
raceColumnDTOAndFleetDTO.getA().getFleets(), new DialogCallback<Set<CompetitorDTO>>() {
@Override
public void ok(final Set<CompetitorDTO> registeredCompetitors) {
if (canBoatsOfCompetitorsChangePerRace) {
@@ -966,10 +971,9 @@ public class SmartphoneTrackingEventManagementPanel
private void handleCompetitorRegistration(StrippedLeaderboardDTOWithSecurity t) {
RegattaDTO regatta = getSelectedRegatta();
String boatClassName = regatta.boatClass.getName();
new RegattaLogCompetitorRegistrationDialog(boatClassName, sailingServiceWrite, userService, stringMessages,
errorReporter, /* editable */true, t.getName(), t.canBoatsOfCompetitorsChangePerRace,
new DialogCallback<Set<CompetitorDTO>>() {
new RegattaLogCompetitorRegistrationDialog(boatClassName, sailingServiceWrite, userService,
competitorsRefresher, boatsRefresher, stringMessages, errorReporter, /* editable */true, t.getName(),
t.canBoatsOfCompetitorsChangePerRace, new DialogCallback<Set<CompetitorDTO>>() {
@Override
public void ok(Set<CompetitorDTO> registeredCompetitors) {
sailingServiceWrite.setCompetitorRegistrationsInRegattaLog(t.getName(), registeredCompetitors,
@@ -998,9 +1002,9 @@ public class SmartphoneTrackingEventManagementPanel
RegattaDTO regatta = getSelectedRegatta();
String boatClassName = regatta.boatClass.getName();
new RegattaLogBoatRegistrationDialog(boatClassName, sailingServiceWrite, userService, stringMessages,
errorReporter, /* editable */true, t.getName(), t.canBoatsOfCompetitorsChangePerRace,
new DialogCallback<Set<BoatDTO>>() {
new RegattaLogBoatRegistrationDialog(boatClassName, sailingServiceWrite, userService, boatsRefresher,
competitorsRefresher, stringMessages, errorReporter, /* editable */true, t.getName(),
t.canBoatsOfCompetitorsChangePerRace, new DialogCallback<Set<BoatDTO>>() {
@Override
public void ok(Set<BoatDTO> registeredBoats) {
sailingServiceWrite.setBoatRegistrationsInRegattaLog(t.getName(), registeredBoats,
@@ -116,6 +116,7 @@ public class WindPanel extends FormPanel implements FilterablePanelProvider<Race
private final CellTable<WindDTO> rawWindFixesTable;
private final VerticalPanel windFixPanel;
private final Predicate<RaceDTO> userPermission;
private final Displayer<RegattaDTO> regattasDisplayer;
/**
* Composite pattern over the {@link RegattasDisplayer} interface. Calls to {@link #fillRegattas(Iterable)}
@@ -131,6 +132,7 @@ public class WindPanel extends FormPanel implements FilterablePanelProvider<Race
public WindPanel(final Presenter presenter, final StringMessages stringMessages) {
this.ensureDebugId("WindPanel");
this.regattasDisplayer = result->fillRegattas(result);
this.userPermission = race -> presenter.getUserService().hasPermission(race, UPDATE);
this.sailingServiceWrite = presenter.getSailingService();
this.userService = presenter.getUserService();
@@ -619,13 +621,6 @@ public class WindPanel extends FormPanel implements FilterablePanelProvider<Race
});
}
private final Displayer<RegattaDTO> regattasDisplayer = new Displayer<RegattaDTO>() {
@Override
public void fill(Iterable<RegattaDTO> result) {
fillRegattas(result);
}
};
public Displayer<RegattaDTO> getRegattasDisplayer() {
return regattasDisplayer;
}
@@ -28,7 +28,6 @@ public class WindPanelSupplier extends AdminConsolePanelSupplier<WindPanel> {
@Override
public void getAsync(RunAsyncCallback callback) {
GWT.runAsync(new RunAsyncCallback() {
@Override
public void onSuccess() {
widget = init();
@@ -41,5 +40,4 @@ public class WindPanelSupplier extends AdminConsolePanelSupplier<WindPanel> {
}
});
}
}
@@ -11,6 +11,8 @@ import com.google.gwt.place.shared.PlaceController;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.sap.sailing.domain.common.dto.BoatDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.media.MediaTrackWithSecurityDTO;
import com.sap.sailing.gwt.ui.adminconsole.AdminConsoleClientFactory;
import com.sap.sailing.gwt.ui.adminconsole.places.refresher.AbstractRefresher;
@@ -44,6 +46,8 @@ public class AdminConsoleActivity extends AbstractActivity implements AdminConso
private final Refresher<RegattaDTO> regattasRefresher;
private final Refresher<EventDTO> eventsRefresher;
private final Refresher<MediaTrackWithSecurityDTO> mediaTracksRefresher;
private final Refresher<CompetitorDTO> competitorsRefresher;
private final Refresher<BoatDTO> boatsRefresher;
public AdminConsoleActivity(final AdminConsoleClientFactory clientFactory) {
this.clientFactory = clientFactory;
@@ -146,6 +150,45 @@ public class AdminConsoleActivity extends AbstractActivity implements AdminConso
});
}
};
competitorsRefresher = new AbstractRefresher<CompetitorDTO>() {
@Override
public void reload(AsyncCallback<Iterable<CompetitorDTO>> callback) {
sailingService.getCompetitors(/* ignoreCompetitorsWithBoat */ false,
/* ignoreCompetitorsWithoutBoat */ false, new MarkedAsyncCallback<Iterable<CompetitorDTO>>(
new AsyncCallback<Iterable<CompetitorDTO>>() {
@Override
public void onSuccess(Iterable<CompetitorDTO> result) {
logger.log(Level.FINE, "reload CompetitorDTO - success");
callback.onSuccess(result);
}
@Override
public void onFailure(Throwable t) {
getErrorReporter().reportError("Error trying to obtain list of leaderboards from server " + t.getMessage());
logger.log(Level.SEVERE, "Error trying to obtain list of leaderboards from server.", t);
callback.onFailure(t);
}
}));
}
};
boatsRefresher = new AbstractRefresher<BoatDTO>() {
@Override
public void reload(AsyncCallback<Iterable<BoatDTO>> callback) {
sailingService.getAllBoats(new MarkedAsyncCallback<Iterable<BoatDTO>>(
new AsyncCallback<Iterable<BoatDTO>>() {
@Override
public void onSuccess(Iterable<BoatDTO> result) {
logger.log(Level.FINE, "reload BoatDTO - success");
callback.onSuccess(result);
}
@Override
public void onFailure(Throwable t) {
getErrorReporter().reportError("Error trying to obtain list of leaderboards from server " + t.getMessage());
logger.log(Level.SEVERE, "Error trying to obtain list of leaderboards from server.", t);
callback.onFailure(t);
}
}));
}
};
}
@Override
@@ -173,6 +216,16 @@ public class AdminConsoleActivity extends AbstractActivity implements AdminConso
return mediaTracksRefresher;
}
@Override
public Refresher<CompetitorDTO> getCompetitorsRefresher() {
return competitorsRefresher;
}
@Override
public Refresher<BoatDTO> getBoatsRefresher() {
return boatsRefresher;
}
public AdminConsoleActivity(final AdminConsolePlace place, final AdminConsoleClientFactory clientFactory) {
this(clientFactory);
}
@@ -3,6 +3,8 @@ package com.sap.sailing.gwt.ui.adminconsole.places;
import com.google.gwt.place.shared.PlaceController;
import com.google.gwt.user.client.ui.HeaderPanel;
import com.google.gwt.user.client.ui.IsWidget;
import com.sap.sailing.domain.common.dto.BoatDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.media.MediaTrackWithSecurityDTO;
import com.sap.sailing.gwt.ui.client.MediaServiceWriteAsync;
import com.sap.sailing.gwt.ui.client.Refresher;
@@ -35,5 +37,7 @@ public interface AdminConsoleView extends IsWidget {
Refresher<RegattaDTO> getRegattasRefresher();
Refresher<EventDTO> getEventsRefresher();
Refresher<MediaTrackWithSecurityDTO> getMediaTracksRefresher();
Refresher<CompetitorDTO> getCompetitorsRefresher();
Refresher<BoatDTO> getBoatsRefresher();
}
}
@@ -244,7 +244,7 @@ public class AdminConsoleViewImpl extends Composite implements AdminConsoleView
@Override
public void refreshAfterBecomingVisible() {
if (getWidget() != null) {
getWidget().refreshCompetitorList();
presenter.getCompetitorsRefresher().callFillAndReloadInitially(getWidget().getCompetitorsDisplayer());
}
}
}, stringMessages.competitors(), new CompetitorsPlace(null),
@@ -255,7 +255,7 @@ public class AdminConsoleViewImpl extends Composite implements AdminConsoleView
@Override
public void refreshAfterBecomingVisible() {
if (getWidget() != null) {
getWidget().refreshBoatList();
presenter.getBoatsRefresher().callFillAndReloadInitially(getWidget().getBoatsDisplayer());
}
}
}, stringMessages.boats(), new BoatsPlace((String) null /* no place token */),
@@ -5,6 +5,7 @@ import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.function.Predicate;
import java.util.logging.Logger;
@@ -12,6 +13,7 @@ import java.util.logging.Logger;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.sap.sailing.gwt.ui.client.Displayer;
import com.sap.sailing.gwt.ui.client.Refresher;
import com.sap.sse.gwt.client.celltable.EntityIdentityComparator;
public abstract class AbstractRefresher<T> implements Refresher<T> {
private Logger logger = Logger.getLogger(getClass().getName());
@@ -116,28 +118,46 @@ public abstract class AbstractRefresher<T> implements Refresher<T> {
public abstract void reload(AsyncCallback<Iterable<T>> callback);
public void fill(Iterable<T> dtos, Displayer<T> displayer) {
protected void fill(Iterable<T> dtos, Displayer<T> displayer) {
displayer.fill(dtos);
}
@Override
public void addIfNotContainedElseReplace(T dto, EntityIdentityComparator<T> comp) {
if (dto != null && dtos != null) {
Optional<T> existingDtoOption = dtos.stream().filter(listDto -> comp.representSameEntity(listDto, dto))
.findFirst();
if (existingDtoOption.isPresent()) {
int index = dtos.indexOf(existingDtoOption.get());
dtos.set(index, dto);
} else {
add(dto);
}
}
}
@Override
public void add(T dto) {
if (dto != null) {
if (dto != null && dtos != null) {
dtos.add(dto);
}
}
@Override
public void remove(T dto) {
if (dto != null) {
if (dto != null && dtos != null) {
dtos.remove(dto);
}
}
@Override
public void removeAll(Predicate<T> filter) {
for (final Iterator<T> i=dtos.iterator(); i.hasNext(); ) {
final T dto = i.next();
if (filter.test(dto)) {
i.remove();
if (dtos != null) {
for (final Iterator<T> i=dtos.iterator(); i.hasNext(); ) {
final T dto = i.next();
if (filter.test(dto)) {
i.remove();
}
}
}
}
@@ -82,8 +82,7 @@ public class ExpeditionDataImportResponse extends AbstractDataImportResponse {
};
public final boolean hasEventId() {
final String stringValue = getString("eventId");
return stringValue != null && !stringValue.isEmpty();
return getEventId() != null;
}
}
@@ -14,6 +14,7 @@ public abstract class AbstractRegattaPanel extends FormPanel {
protected DateTimeFormatRenderer dateFormatter = new DateTimeFormatRenderer(DateTimeFormat.getFormat(PredefinedFormat.DATE_SHORT));
protected DateTimeFormatRenderer timeFormatter = new DateTimeFormatRenderer(DateTimeFormat.getFormat(PredefinedFormat.TIME_LONG));
protected final Presenter presenter;
private final Displayer<RegattaDTO> regattasDisplayer;
protected ErrorReporter errorReporter;
protected StringMessages stringMessages;
@@ -23,17 +24,14 @@ public abstract class AbstractRegattaPanel extends FormPanel {
this.presenter = presenter;
this.errorReporter = presenter.getErrorReporter();
this.stringMessages = stringMessages;
this.regattasDisplayer = new Displayer<RegattaDTO>() {
@Override
public void fill(Iterable<RegattaDTO> result) {
fillRegattas(result);
}
};
}
private final Displayer<RegattaDTO> regattasDisplayer = new Displayer<RegattaDTO>() {
@Override
public void fill(Iterable<RegattaDTO> result) {
fillRegattas(result);
}
};
public Displayer<RegattaDTO> getRegattasDisplayer() {
return regattasDisplayer;
}
@@ -2,6 +2,8 @@ package com.sap.sailing.gwt.ui.client;
import java.util.function.Predicate;
import com.sap.sse.gwt.client.celltable.EntityIdentityComparator;
/**
* A {@link Refresher} offers methods to register a displayer of a specific DTO type, force reloads and give the
* possibility to update the centrally managed data. The displayer will be informed asynchronously after data changes
@@ -35,13 +37,13 @@ public interface Refresher<T> {
void reloadAndCallFillOnly(Displayer<T> fillOnlyDisplayer);
/**
* Force a reload of the data from server and call afterwards asynchronously the fill method of all registered
* {@link Displayer}.
* Force a reload of the data from server and afterwards call the fill method of all registered {@link Displayer}s
* asynchronously.
*/
void reloadAndCallFillAll();
/**
* Updates the list of DTOs and call asynchronously the fill method of all registered {@link Displayer} except an
* Updates the list of DTOs and call the fill method of all registered {@link Displayer}s asynchronously, except an
* optional origin {@link Displayer} if set.
*
* @param dtos
@@ -52,12 +54,12 @@ public interface Refresher<T> {
void updateAndCallFillForAll(Iterable<T> dtos, Displayer<T> origin);
/**
* Call fill method of given {@link Displayer} even if he is not registered. If data was not loaded before, do an
* Call fill method of given {@link Displayer} even if it is not registered. If data was not loaded before, do an
* initial load and call fill method of all registered {@link Displayer} asynchronously and if not registered of the
* given {@link Displayer}, too.
*
* @param displayer
* the {@link Displayer} on which the fill method should be called.
* the {@link Displayer} on which the fill method shall be called.
*/
void callFillAndReloadInitially(Displayer<T> displayer);
@@ -67,19 +69,27 @@ public interface Refresher<T> {
void callAllFill();
/**
* Adds a DTO to DTO list to prevent loading all data after adding single object to context.
* Adds a DTO to the DTO list to prevent loading all data after adding single object to context. This will
* only take place if the DTO list already exists, indicating that it has been requested before.
*
* @param dto DTO
* @param dto the DTO to add
*/
void add(T dto);
/**
* Removes a DTO from DTO list to prevent loading all data after deleting single object to context.
*
* @param dto DTO
* @param dto the DTO to add
*/
void remove(T dto);
/**
* Like {@link #add(Object)}, but an existing DTO will be replaced by {@code dto} if
* found in the list of DTOs known to this refresher, identified by {@link EntityIdentityComparator#equals(Object) equal}. This will only take place if the DTO list already exists,
* indicating that it has been requested before.
*/
void addIfNotContainedElseReplace(T dto, EntityIdentityComparator<T> comp);
/**
* {@link #remove(Object) Removes} all objects from this refresher that {@link Predicate#test(Object) are matched) by the
* {@code filter} passed.
File mode changed.
File mode changed.
@@ -31,6 +31,7 @@ public class BoatClassVectorGraphicsResolver {
BoatClassMasterdata.FINN, BoatClassMasterdata.MUSTO_SKIFF, BoatClassMasterdata.OPEN_BIC,
BoatClassMasterdata.OPTIMIST, BoatClassMasterdata.PWA,
BoatClassMasterdata.RS_AERO, BoatClassMasterdata.RS_X,
BoatClassMasterdata.IQFOIL_MEN, BoatClassMasterdata.IQFOIL_WOMEN, BoatClassMasterdata.IQFOIL_YOUTH,
BoatClassMasterdata.SPLASH_BLUE, BoatClassMasterdata.SPLASH_RED, BoatClassMasterdata.SPLASH_GREEN,
BoatClassMasterdata.STAR, BoatClassMasterdata.TECHNO_293, BoatClassMasterdata.TECHNO_293_PLUS);
BoatClassVectorGraphics _49er = new _49erVectorGraphics(BoatClassMasterdata._49ER, BoatClassMasterdata._49ERFX,
@@ -2385,30 +2385,36 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet
@Override
public StrippedLeaderboardDTOWithSecurity getLeaderboardWithSecurity(String leaderboardName) {
Map<String, Leaderboard> leaderboards = getService().getLeaderboards();
StrippedLeaderboardDTOWithSecurity result = null;
Leaderboard leaderboard = leaderboards.get(leaderboardName);
Leaderboard leaderboard = getLeaderboardAndCheckReadPermission(leaderboardName);
final StrippedLeaderboardDTOWithSecurity result;
if (leaderboard != null) {
if (leaderboard instanceof RegattaLeaderboard) {
getSecurityService().checkCurrentUserReadPermission(((RegattaLeaderboard) leaderboard).getRegatta());
}
getSecurityService().checkCurrentUserReadPermission(leaderboard);
result = createStrippedLeaderboardDTOWithSecurity(leaderboard, false, false);
} else {
result = null;
}
return result;
}
@Override
public StrippedLeaderboardDTO getLeaderboard(String leaderboardName) {
Map<String, Leaderboard> leaderboards = getService().getLeaderboards();
StrippedLeaderboardDTO result = null;
Leaderboard leaderboard = leaderboards.get(leaderboardName);
private Leaderboard getLeaderboardAndCheckReadPermission(String leaderboardName) {
final Map<String, Leaderboard> leaderboards = getService().getLeaderboards();
final Leaderboard leaderboard = leaderboards.get(leaderboardName);
if (leaderboard != null) {
if (leaderboard instanceof RegattaLeaderboard) {
getSecurityService().checkCurrentUserReadPermission(((RegattaLeaderboard) leaderboard).getRegatta());
}
getSecurityService().checkCurrentUserReadPermission(leaderboard);
}
return leaderboard;
}
@Override
public StrippedLeaderboardDTO getLeaderboard(String leaderboardName) {
Leaderboard leaderboard = getLeaderboardAndCheckReadPermission(leaderboardName);
final StrippedLeaderboardDTO result;
if (leaderboard != null) {
result = createStrippedLeaderboardDTO(leaderboard, false, false);
} else {
result = null;
}
return result;
}
@@ -4447,8 +4453,7 @@ public class SailingServiceImpl extends ResultCachingProxiedRemoteServiceServlet
}
@Override
public Iterable<CompetitorDTO> getCompetitors(boolean ignoreCompetitorsWithBoat,
boolean ignoreCompetitorsWithoutBoat) {
public Iterable<CompetitorDTO> getCompetitors(boolean ignoreCompetitorsWithBoat, boolean ignoreCompetitorsWithoutBoat) {
CompetitorAndBoatStore competitorStore = getService().getBaseDomainFactory().getCompetitorAndBoatStore();
final HasPermissions.Action[] requiredActionsForRead = SecuredSecurityTypes.PublicReadableActions.READ_AND_READ_PUBLIC_ACTIONS;
final Iterable<? extends Competitor> filteredCompetitors;
Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

@@ -36,15 +36,17 @@ CREATE COLUMN TABLE SAILING."Regatta" (
FOREIGN KEY ("scoringScheme") REFERENCES SAILING."ScoringScheme" ("id")
);
CREATE COLUMN TABLE SAILING."Race" (
"name" NVARCHAR(255) NOT NULL,
"regatta" NVARCHAR(255) NOT NULL,
"raceColumn" NVARCHAR(255) NOT NULL,
"fleet" NVARCHAR(255) NOT NULL,
"startOfTracking" TIMESTAMP,
"startOfRace" TIMESTAMP,
"endOfTracking" TIMESTAMP,
"endOfRace" TIMESTAMP,
"avgWindSpeedInKnots" DOUBLE,
"name" NVARCHAR(255) NOT NULL,
"regatta" NVARCHAR(255) NOT NULL,
"raceColumn" NVARCHAR(255) NOT NULL,
"fleet" NVARCHAR(255) NOT NULL,
"startOfTracking" TIMESTAMP,
"startOfRace" TIMESTAMP,
"endOfTracking" TIMESTAMP,
"endOfRace" TIMESTAMP,
"avgWindSpeedInKnots" DOUBLE,
"raceColumnIndexZeroBased" INTEGER,
"gateStart" BOOLEAN,
PRIMARY KEY ("name", "regatta"),
FOREIGN KEY ("regatta") REFERENCES SAILING."Regatta" ("name")
);
@@ -82,13 +84,11 @@ CREATE TABLE SAILING."RaceStats" (
"elapsedTimeInSeconds" DOUBLE,
"avgCrossTrackErrorInMeters" DOUBLE,
"absoluteAvgCrossTrackErrorInMeters" DOUBLE,
"numberOfTacks" INTEGER,
"numberOfGybes" INTEGER,
"numberOfPenaltyCircles" INTEGER,
"startDelayInSeconds" DOUBLE,
"distanceFromStartLineInMetersAtStart" DOUBLE,
"speedWhenCrossingStartLineInKnots" DOUBLE,
"startTack" NVARCHAR(20),
"rank90sAfterStart" INTEGER,
PRIMARY KEY ("race", "regatta", "competitorId"),
FOREIGN KEY ("competitorId") REFERENCES SAILING."Competitor" ("id"),
FOREIGN KEY ("race", "regatta") REFERENCES SAILING."Race" ("name", "regatta")
@@ -11,7 +11,7 @@ public class InsertEventStatement extends AbstractPreparedInsertStatement<Event>
protected InsertEventStatement(Connection connection) throws SQLException {
super(connection.prepareStatement(
"INSERT INTO SAILING.\"Event\" (\"id\", \"name\", \"startDate\", \"endDate\", \"venue\", \"isListed\", \"description\", \"location\") "+
"VALUES (?, ?, ?, ?, ?, ?, ?, NEW ST_POINT(?, 3857));"));
"VALUES (?, ?, ?, ?, ?, ?, ?, new ST_GEOMETRY('POINT('|| ? || ' ' || ? ||')', 4326).ST_Transform(3857));"));
}
@Override
@@ -24,6 +24,7 @@ public class InsertEventStatement extends AbstractPreparedInsertStatement<Event>
getPreparedStatement().setBoolean(6, event.isPublic());
getPreparedStatement().setString(7, event.getDescription());
final Position location = event.getLocation();
getPreparedStatement().setString(8, location != null ? String.format("POINT(%1.8f %1.8f)", location.getLngDeg(), location.getLatDeg()) : null);
getPreparedStatement().setString(8, location != null ? String.format("%1.8f", location.getLngDeg()) : null);
getPreparedStatement().setString(9, location != null ? String.format("%1.8f", location.getLatDeg()) : null);
}
}
@@ -10,6 +10,7 @@ import com.sap.sailing.domain.base.SpeedWithConfidence;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.hanaexport.jaxrs.api.InsertRaceStatement.TrackedRaceWithRaceColumnAndFleet;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.Util;
public class InsertRaceStatement extends AbstractPreparedInsertStatement<TrackedRaceWithRaceColumnAndFleet> {
static class TrackedRaceWithRaceColumnAndFleet {
@@ -36,8 +37,9 @@ public class InsertRaceStatement extends AbstractPreparedInsertStatement<Tracked
protected InsertRaceStatement(Connection connection) throws SQLException {
super(connection.prepareStatement(
"INSERT INTO SAILING.\"Race\" (\"name\", \"regatta\", \"raceColumn\", \"fleet\", \"startOfTracking\", "+
"\"startOfRace\", \"endOfTracking\", \"endOfRace\", \"avgWindSpeedInKnots\") "+
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);"));
"\"startOfRace\", \"endOfTracking\", \"endOfRace\", \"avgWindSpeedInKnots\", \"raceColumnIndexZeroBased\""+
"\"gateStart\") "+
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"));
}
@Override
@@ -73,5 +75,7 @@ public class InsertRaceStatement extends AbstractPreparedInsertStatement<Tracked
} else {
setDouble(9, 0.0);
}
getPreparedStatement().setInt(10, Util.indexOf(trackedRace.getTrackedRegatta().getRegatta().getRaceColumns(), raceColumnFleetAndTrackedRace.getRaceColumn()));
getPreparedStatement().setBoolean(11, trackedRace.isGateStart());
}
}
@@ -6,18 +6,19 @@ import java.util.NavigableSet;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.common.ManeuverType;
import com.sap.sailing.domain.common.NoWindException;
import com.sap.sailing.domain.common.Tack;
import com.sap.sailing.domain.tracking.Maneuver;
import com.sap.sailing.domain.tracking.MarkPassing;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.hanaexport.jaxrs.api.InsertRaceStatsStatement.TrackedRaceWithCompetitorAndStartWaypoint;
import com.sap.sse.common.Duration;
import com.sap.sse.common.Speed;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.Util;
public class InsertRaceStatsStatement extends AbstractPreparedInsertStatement<TrackedRaceWithCompetitorAndStartWaypoint> {
private static final Duration DURATION_AFTER_START_TO_DECIDE_START_WINNER = Duration.ONE_SECOND.times(90);
static class TrackedRaceWithCompetitorAndStartWaypoint {
private final TimePoint now;
private final Waypoint startWaypoint;
@@ -44,14 +45,13 @@ public class InsertRaceStatsStatement extends AbstractPreparedInsertStatement<Tr
return trackedRace;
}
}
protected InsertRaceStatsStatement(Connection connection) throws SQLException {
super(connection.prepareStatement(
"INSERT INTO SAILING.\"RaceStats\" (\"race\", \"regatta\", \"competitorId\", \"rankOneBased\", \"distanceSailedInMeters\", \"elapsedTimeInSeconds\", "+
"\"avgCrossTrackErrorInMeters\", \"absoluteAvgCrossTrackErrorInMeters\", \"numberOfTacks\", "+
"\"numberOfGybes\", \"numberOfPenaltyCircles\", \"startDelayInSeconds\", \"distanceFromStartLineInMetersAtStart\", "+
"\"speedWhenCrossingStartLineInKnots\", \"startTack\") "+
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"));
"\"avgCrossTrackErrorInMeters\", \"absoluteAvgCrossTrackErrorInMeters\", \"startDelayInSeconds\", \"distanceFromStartLineInMetersAtStart\", "+
"\"speedWhenCrossingStartLineInKnots\", \"startTack\", \"rank90sAfterStart\") "+
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"));
}
@Override
@@ -67,13 +67,10 @@ public class InsertRaceStatsStatement extends AbstractPreparedInsertStatement<Tr
setDouble(6, secondsOr0ForNull(trackedRace.getTimeSailedSinceRaceStart(competitor, now)));
setDouble(7, metersOr0ForNull(trackedRace.getAverageSignedCrossTrackError(competitor, now, /* waitForLatest */ false)));
setDouble(8, metersOr0ForNull(trackedRace.getAverageAbsoluteCrossTrackError(competitor, now, /* waitForLatest */ false)));
final Iterable<Maneuver> maneuvers = trackedRace.getManeuvers(competitor, /* waitForLatest */ false);
getPreparedStatement().setInt(9, Util.size(Util.filter(maneuvers, m->m.getType() == ManeuverType.TACK)));
getPreparedStatement().setInt(10, Util.size(Util.filter(maneuvers, m->m.getType() == ManeuverType.JIBE)));
getPreparedStatement().setInt(11, Util.size(Util.filter(maneuvers, m->m.getType() == ManeuverType.PENALTY_CIRCLE)));
final TimePoint startOfRace = trackedRace.getStartOfRace();
final double startDelay;
final double startDelayInSeconds;
Tack startTack;
final boolean didCompetitorStart;
if (raceColumnFleetAndTrackedRace.getStartWaypoint() != null && startOfRace != null) {
NavigableSet<MarkPassing> competitorMarkPassings = trackedRace.getMarkPassings(competitor);
trackedRace.lockForRead(competitorMarkPassings);
@@ -81,32 +78,36 @@ public class InsertRaceStatsStatement extends AbstractPreparedInsertStatement<Tr
if (!Util.isEmpty(competitorMarkPassings)) {
final MarkPassing competitorStartMarkPassing = competitorMarkPassings.iterator().next();
final TimePoint competitorStartTime = competitorStartMarkPassing.getTimePoint();
startDelay = secondsOr0ForNull(startOfRace.until(competitorStartTime));
didCompetitorStart = competitorStartTime != null;
startDelayInSeconds = secondsOr0ForNull(startOfRace.until(competitorStartTime));
try {
startTack = trackedRace.getTack(competitor, competitorStartTime);
} catch (NoWindException e) {
startTack = null;
}
} else {
startDelay = 0;
startDelayInSeconds = 0;
startTack = null;
didCompetitorStart = false;
}
} finally {
trackedRace.unlockAfterRead(competitorMarkPassings);
}
} else {
startDelay = 0;
startDelayInSeconds = 0;
startTack = null;
didCompetitorStart = false;
}
setDouble(12, startDelay);
if (startOfRace != null) {
setDouble(13, metersOr0ForNull(trackedRace.getDistanceToStartLine(competitor, startOfRace)));
setDouble(9, startDelayInSeconds);
if (startOfRace != null && didCompetitorStart) {
setDouble(10, metersOr0ForNull(trackedRace.getDistanceToStartLine(competitor, startOfRace)));
final Speed speedWhenCrossingStartLine = trackedRace.getSpeedWhenCrossingStartLine(competitor);
setDouble(14, speedWhenCrossingStartLine==null?0:speedWhenCrossingStartLine.getKnots());
getPreparedStatement().setString(15, startTack==null?null:startTack.name());
setDouble(11, speedWhenCrossingStartLine==null?0:speedWhenCrossingStartLine.getKnots());
getPreparedStatement().setString(12, startTack==null?null:startTack.name());
getPreparedStatement().setInt(13, trackedRace.getRank(competitor, startOfRace.plus(DURATION_AFTER_START_TO_DECIDE_START_WINNER)));
} else {
setDouble(13, 0);
setDouble(14, 0);
setDouble(10, 0);
setDouble(11, 0);
}
}
}
@@ -8,4 +8,6 @@ Fragment-Host: com.sap.sailing.landscape
Automatic-Module-Name: com.sap.sailing.landscape.test
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Require-Bundle: org.junit,
org.mongodb.mongo-java-driver
org.mongodb.bson;bundle-version="4.3.1",
org.mongodb.driver-core;bundle-version="4.3.1",
org.mongodb.driver-sync;bundle-version="4.3.1"
@@ -14,5 +14,7 @@ Require-Bundle: com.sap.sse.mongodb,
com.sap.sailing.domain.common;bundle-version="1.0.0",
org.hamcrest;bundle-version="1.1.0",
com.sap.sse.common,
org.mongodb.mongo-java-driver;bundle-version="3.6.4"
org.mongodb.bson;bundle-version="4.3.1",
org.mongodb.driver-core;bundle-version="4.3.1",
org.mongodb.driver-sync;bundle-version="4.3.1"
Automatic-Module-Name: com.sap.sailing.media.persistence.test
@@ -3,18 +3,21 @@ package com.sap.sailing.media.persistence.test;
import static org.junit.Assert.assertNotNull;
import java.net.UnknownHostException;
import java.util.Arrays;
import org.junit.Before;
import com.mongodb.Mongo;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientSettings;
import com.mongodb.MongoException;
import com.mongodb.ServerAddress;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoDatabase;
import com.sap.sse.mongodb.MongoDBConfiguration;
import com.sap.sse.mongodb.MongoDBService;
public abstract class AbstractMongoDBTest {
protected final Mongo mongo;
protected final MongoClient mongo;
protected final MongoDatabase db;
private final MongoDBConfiguration dbConfiguration;
private MongoDBService service;
@@ -30,8 +33,10 @@ public abstract class AbstractMongoDBTest {
return dbConfiguration;
}
protected Mongo newMongo() throws UnknownHostException, MongoException {
return new MongoClient(System.getProperty("mongo.host", "127.0.0.1"), dbConfiguration.getPort());
protected MongoClient newMongo() throws UnknownHostException, MongoException {
return MongoClients.create(MongoClientSettings.builder().applyToClusterSettings(
clusterSettings->clusterSettings.hosts(Arrays.asList(
new ServerAddress(System.getProperty("mongo.host", "127.0.0.1"), dbConfiguration.getPort())))).build());
}
@Before
@@ -7,15 +7,15 @@ import java.net.UnknownHostException;
import org.junit.After;
import org.junit.Before;
import com.mongodb.Mongo;
import com.mongodb.MongoClient;
import com.mongodb.MongoException;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoDatabase;
import com.sap.sse.mongodb.MongoDBConfiguration;
import com.sap.sse.mongodb.MongoDBService;
public abstract class AbstractMongoDBTest {
protected Mongo mongo;
protected MongoClient mongo;
protected MongoDatabase db;
private final MongoDBConfiguration dbConfiguration;
private MongoDBService mongoDBService;
@@ -31,8 +31,8 @@ public abstract class AbstractMongoDBTest {
return dbConfiguration;
}
protected Mongo newMongo() throws UnknownHostException, MongoException {
return new MongoClient(dbConfiguration.getMongoClientURI());
protected MongoClient newMongo() throws UnknownHostException, MongoException {
return MongoClients.create(dbConfiguration.getMongoClientURI());
}
@Before
@@ -11,11 +11,11 @@ import com.sap.sse.mongodb.MongoDBConfiguration;
public class MongoClientURITest {
@Test
public void testDefaultConnectionOptions() {
MongoDBConfiguration config = new MongoDBConfiguration("mongodb://humba:12345/mydb");
MongoDBConfiguration config = new MongoDBConfiguration("mongodb://humba:12345/mydb?readPreference=primaryPreferred");
assertEquals("humba", config.getHostname());
assertEquals(12345, config.getPort());
assertEquals("mydb", config.getDatabaseName());
assertSame(ReadPreference.primaryPreferred(), config.getMongoClientURI().getOptions().getReadPreference());
assertSame(ReadPreference.primaryPreferred(), config.getMongoClientURI().getReadPreference());
}
@Test
@@ -24,7 +24,7 @@ public class MongoClientURITest {
assertEquals("humba", config.getHostname());
assertEquals(12345, config.getPort());
assertEquals("mydb", config.getDatabaseName());
assertSame(ReadPreference.primary(), config.getMongoClientURI().getOptions().getReadPreference());
assertEquals("rs0", config.getMongoClientURI().getOptions().getRequiredReplicaSetName());
assertSame(ReadPreference.primary(), config.getMongoClientURI().getReadPreference());
assertEquals("rs0", config.getMongoClientURI().getRequiredReplicaSetName());
}
}
@@ -14,8 +14,9 @@ import java.util.Optional;
import org.junit.Before;
import org.junit.Test;
import com.mongodb.MongoClient;
import com.mongodb.MongoException;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoDatabase;
import com.sap.sailing.domain.base.RaceDefinition;
import com.sap.sailing.domain.base.Regatta;
@@ -66,14 +67,14 @@ public class TestStoringAndRetrievingWindTracksTest extends AbstractTracTracLive
}
private MongoClient newMongo() throws UnknownHostException, MongoException {
return new MongoClient(dbConfiguration.getMongoClientURI());
return MongoClients.create(dbConfiguration.getMongoClientURI());
}
@Before
public void dropTestDB() throws UnknownHostException, MongoException {
mongo = newMongo();
assertNotNull(mongo);
mongo.dropDatabase(dbConfiguration.getMongoClientURI().getDatabase());
mongo.getDatabase(dbConfiguration.getMongoClientURI().getDatabase()).drop();
db = mongo.getDatabase(dbConfiguration.getMongoClientURI().getDatabase());
assertNotNull(db);
}
@@ -13,7 +13,9 @@ Require-Bundle: org.hamcrest;bundle-version="1.1.0",
com.sap.sse.common,
jcl.over.slf4j;bundle-version="1.6.4";resolution:=optional,
slf4j.api;bundle-version="1.6.4";resolution:=optional,
org.mongodb.mongo-java-driver;bundle-version="3.6.4",
org.mongodb.bson;bundle-version="4.3.1",
org.mongodb.driver-core;bundle-version="4.3.1",
org.mongodb.driver-sync;bundle-version="4.3.1",
com.sun.jersey;bundle-version="1.17.0",
com.sap.sse.security
Bundle-ClassPath: lib/cglib-nodep-2.2.3.jar,
@@ -1,18 +1,17 @@
package com.sap.sailing.selenium.pages.adminconsole.tracking;
import org.openqa.selenium.By.ByName;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import com.sap.sailing.selenium.core.FindBy;
import com.sap.sailing.selenium.pages.adminconsole.tracking.TrackedRacesBoatTablePO.BoatEntry;
import com.sap.sailing.selenium.pages.gwt.CellTablePO;
import com.sap.sailing.selenium.pages.gwt.DataEntryPO;
import com.sap.sailing.selenium.core.BySeleniumId;
import com.sap.sailing.selenium.core.FindBy;
import com.sap.sailing.selenium.pages.adminconsole.ActionsHelper;
import com.sap.sailing.selenium.pages.adminconsole.tracking.TrackedRacesBoatTablePO.BoatEntry;
public class TrackedRacesBoatTablePO extends CellTablePO<BoatEntry> {
public static class BoatEntry extends DataEntryPO {
@FindBy(how = BySeleniumId.class, using = "ACTION_EDIT")
@FindBy(how = ByName.class, using = "UPDATE")
private WebElement editButton;
private static final String NAME_COLUMN = "Name";
@@ -45,11 +44,10 @@ public class TrackedRacesBoatTablePO extends CellTablePO<BoatEntry> {
return getColumnContent(BOATCLASSNAME_COLUMN);
}
public TrackedRacesCompetitorEditDialogPO clickEditButton() {
WebElement action = ActionsHelper.findEditAction(getWebElement());
action.click();
public TrackedRacesBoatEditDialogPO clickEditButton() {
editButton.click();
WebElement dialog = findElementBySeleniumId(this.driver, "BoatEditDialog");
return new TrackedRacesCompetitorEditDialogPO(this.driver, dialog);
return new TrackedRacesBoatEditDialogPO(this.driver, dialog);
}
}
@@ -2,6 +2,9 @@ package com.sap.sailing.selenium.pages.adminconsole.tracking;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.List;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
@@ -43,13 +46,15 @@ public class TrackedRacesBoatsPanelPO extends PageArea {
return new TrackedRacesBoatTablePO(this.driver, this.boatsTable);
}
public void waitForBoatEntry(String name, String sailId, String boatClassName) {
public BoatEntry waitForBoatEntry(String name, String sailId, String boatClassName) {
final List<BoatEntry> findings = new ArrayList<TrackedRacesBoatTablePO.BoatEntry>();
waitUntil(() -> {
boolean boatFound = false;
for (final BoatEntry it : getBoatsTable().getEntries()) {
String itName = it.getName();
if (itName.equals(name)) {
boatFound = true;
findings.add(it);
// found a candidate:
assertEquals(sailId, it.getSailId());
assertEquals(boatClassName, it.getBoatClassName());
@@ -57,5 +62,10 @@ public class TrackedRacesBoatsPanelPO extends PageArea {
}
return boatFound;
});
BoatEntry result = null;
if (findings.size() > 0) {
result = findings.get(0);
}
return result;
}
}
@@ -16,6 +16,15 @@ public class TrackedRacesCompetitorEditDialogPO extends DataEntryDialogPO {
@FindBy(how = BySeleniumId.class, using = "ShortNameTextBox")
private WebElement shortNameTextBox;
@FindBy(how = BySeleniumId.class, using = "BoatNameTextBox")
private WebElement boatNameTextBox;
@FindBy(how = BySeleniumId.class, using = "SailIdTextBox")
private WebElement sailIdTextBox;
@FindBy(how = BySeleniumId.class, using = "BoatClassNameSuggestBox")
private WebElement boatClassNameSuggestBox;
@FindBy(how = BySeleniumId.class, using = "OkButton")
private WebElement okButton;
@@ -47,4 +56,30 @@ public class TrackedRacesCompetitorEditDialogPO extends DataEntryDialogPO {
this.withBoatCheckBox.setSelected(withBoat);
}
}
public void setBoatNameText(String boatNameText) {
if (this.boatNameTextBox != null) {
this.boatNameTextBox.clear();;
this.boatNameTextBox.sendKeys(boatNameText);
}
}
public String getBoatNameText() {
return this.boatNameTextBox.getAttribute("value");
}
public void setBoatSailIdText(String sailIdText) {
if (this.sailIdTextBox != null) {
this.sailIdTextBox.clear();;
this.sailIdTextBox.sendKeys(sailIdText);
}
}
public void setBoatClassNameSuggest(String boatClassNameSuggest) {
if (this.boatClassNameSuggestBox != null) {
this.boatClassNameSuggestBox.clear();
this.boatClassNameSuggestBox.sendKeys(boatClassNameSuggest);
}
}
}
@@ -11,6 +11,9 @@ import org.junit.Test;
import org.openqa.selenium.support.ui.FluentWait;
import com.sap.sailing.selenium.pages.adminconsole.AdminConsolePage;
import com.sap.sailing.selenium.pages.adminconsole.tracking.TrackedRacesBoatEditDialogPO;
import com.sap.sailing.selenium.pages.adminconsole.tracking.TrackedRacesBoatTablePO.BoatEntry;
import com.sap.sailing.selenium.pages.adminconsole.tracking.TrackedRacesBoatsPanelPO;
import com.sap.sailing.selenium.pages.adminconsole.tracking.TrackedRacesCompetitorEditDialogPO;
import com.sap.sailing.selenium.pages.adminconsole.tracking.TrackedRacesCompetitorTablePO.CompetitorEntry;
import com.sap.sailing.selenium.pages.adminconsole.tracking.TrackedRacesCompetitorsPanelPO;
@@ -36,7 +39,7 @@ public class TestCompetitorCreation extends AbstractSeleniumTest {
final TrackedRacesCompetitorsPanelPO competitorsPanel = adminConsole.goToTrackedRacesCompetitors();
return competitorsPanel;
}
@Test
public void testCompetitorCreation() {
final TrackedRacesCompetitorsPanelPO competitorsPanel = goToCompetitorsPanel();
@@ -62,5 +65,69 @@ public class TestCompetitorCreation extends AbstractSeleniumTest {
return found;
});
}
@Test
public void testCompetitorCreationWithBoat() {
AdminConsolePage adminConsole = createBoatAndReturnAdminConsolePage();
final TrackedRacesCompetitorsPanelPO competitorsPanel = adminConsole.goToTrackedRacesCompetitors();
final TrackedRacesCompetitorEditDialogPO dialog = competitorsPanel.pushAddCompetitorButton();
final String name = "" + System.currentTimeMillis();
final String shortName = "NRV";
dialog.setNameTextBox(name);
dialog.setShortNameTextBox(shortName);
dialog.setWithBoat(true);
final String boatName = "boat" + System.currentTimeMillis();
dialog.setBoatNameText(boatName);
String boadSailId = "boat" + System.currentTimeMillis();
dialog.setBoatSailIdText(boadSailId);
final String boatClassName = "49er";
dialog.setBoatClassNameSuggest(boatClassName);
dialog.pressOk();
FluentWait<TrackedRacesCompetitorsPanelPO> wait = createFluentWait(competitorsPanel, DEFAULT_WAIT_TIMEOUT_SECONDS,
DEFAULT_POLLING_INTERVAL);
wait.until(trackedRaceCompetitorsPanel -> {
boolean found = false;
for (final CompetitorEntry it : trackedRaceCompetitorsPanel.getCompetitorTable().getEntries()) {
String itName = it.getName();
if (itName.equals(name)) {
found = true;
// found a candidate:
assertEquals(shortName, it.getShortName());
}
}
return found;
});
// test refresh boat data on boats page
final TrackedRacesBoatsPanelPO boatsPanel = adminConsole.goToTrackedRacesBoats();
BoatEntry boatEntry = boatsPanel.waitForBoatEntry(boatName, boadSailId, boatClassName);
TrackedRacesBoatEditDialogPO boatEditDialog = boatEntry.clickEditButton();
final String newBoatName = "newBoat" + System.currentTimeMillis();
boatEditDialog.setNameTextBox(newBoatName);
boatEditDialog.clickOkButtonOrThrow();
boatsPanel.waitForBoatEntry(newBoatName, boadSailId, boatClassName);
final TrackedRacesCompetitorsPanelPO competitorsPanelPO = adminConsole.goToTrackedRacesCompetitors();
CompetitorEntry competitorEntry = competitorsPanelPO.getCompetitorTable().getEntries().get(0);
TrackedRacesCompetitorEditDialogPO competitorEditDialog = competitorEntry.clickEditWithBoatButton();
assertEquals(newBoatName, competitorEditDialog.getBoatNameText());
}
public AdminConsolePage createBoatAndReturnAdminConsolePage() {
final AdminConsolePage adminConsole = AdminConsolePage.goToPage(getWebDriver(), getContextRoot());
final TrackedRacesBoatsPanelPO boatsPanel = adminConsole.goToTrackedRacesBoats();
final TrackedRacesBoatEditDialogPO dialog = boatsPanel.pushAddButton();
final String name = "" + System.currentTimeMillis();
dialog.setNameTextBox(name);
String sailId = "" + System.currentTimeMillis();
dialog.setSailIdTextBox(sailId);
final String boatClassName = "49er";
dialog.setBoatClassNameSuggestBox(boatClassName);
dialog.pressOk();
boatsPanel.waitForBoatEntry(name, sailId, boatClassName);
return adminConsole;
}
}
@@ -12,7 +12,9 @@ Require-Bundle: org.eclipse.jetty.osgi-servlet-api;bundle-version="3.1.0",
com.sap.sse.mongodb,
com.sap.sse.common,
com.sap.sse,
org.mongodb.mongo-java-driver;bundle-version="3.6.4",
org.mongodb.bson;bundle-version="4.3.1",
org.mongodb.driver-core;bundle-version="4.3.1",
org.mongodb.driver-sync;bundle-version="4.3.1",
org.apache.shiro.core;bundle-version="1.2.2",
org.apache.shiro.ehcache;bundle-version="1.2.3",
org.apache.shiro.web;bundle-version="1.2.2",
@@ -62,7 +62,9 @@ Require-Bundle: com.sap.sailing.domain,
com.googlecode.java-diff-utils,
com.sun.xml.bind.jaxb-impl;bundle-version="2.3.0",
com.sap.sailing.server.interface;bundle-version="1.0.0",
org.mongodb.mongo-java-driver;bundle-version="3.6.4",
org.mongodb.bson;bundle-version="4.3.1",
org.mongodb.driver-core;bundle-version="4.3.1",
org.mongodb.driver-sync;bundle-version="4.3.1",
com.sap.sailing.shared.server,
com.sap.sailing.shared.server.gateway,
org.apache.httpcomponents.httpclient,
@@ -31,7 +31,9 @@ Require-Bundle: com.sap.sailing.server,
com.sap.sailing.server.gateway,
javax.ws.rs,
com.sap.sailing.server.testsupport,
org.mongodb.mongo-java-driver;bundle-version="3.6.4",
org.mongodb.bson;bundle-version="4.3.1",
org.mongodb.driver-core;bundle-version="4.3.1",
org.mongodb.driver-sync;bundle-version="4.3.1",
com.sap.sse.security,
com.sap.sse.security.common,
com.sun.jersey;bundle-version="1.17.0",
@@ -29,8 +29,7 @@ import org.junit.Test;
import org.mockito.Matchers;
import org.mockito.Mockito;
import com.mongodb.MongoClientOptions;
import com.mongodb.MongoClientURI;
import com.mongodb.ConnectionString;
import com.sap.sailing.domain.base.CompetitorAndBoatStore;
import com.sap.sailing.domain.base.DomainFactory;
import com.sap.sailing.domain.base.Regatta;
@@ -84,17 +83,13 @@ public class MediaReplicationTest extends AbstractServerReplicationTest {
@Override
public RacingEventServiceImpl createNewReplica() {
final MongoDBConfiguration masterMongoDBConfig = mongoDBService.getConfiguration();
final MongoClientURI masterMongoDbUri = masterMongoDBConfig.getMongoClientURI();
final MongoClientOptions masterMongoDbOptions = masterMongoDbUri.getOptions();
final ConnectionString masterMongoDbUri = masterMongoDBConfig.getMongoClientURI();
final MongoDBConfiguration proxyReplicaMongoDBConfig = new MongoDBConfiguration(
masterMongoDBConfig.getHostname(), masterMongoDBConfig.getPort(),
masterMongoDBConfig.getDatabaseName() + "-replica"); // use to construct basic MongoDB URI for replica DB name
final MongoClientURI replicaMongoDbUri = new MongoClientURI(proxyReplicaMongoDBConfig.getMongoClientURI().toString()) {
@Override
public MongoClientOptions getOptions() {
return masterMongoDbOptions;
}
};
final ConnectionString replicaMongoDbUri = new ConnectionString(proxyReplicaMongoDBConfig.getMongoClientURI().toString()+
(proxyReplicaMongoDBConfig.getMongoClientURI().getConnectionString().indexOf("?") < 0 ? "?" : "&") +
masterMongoDbUri.getConnectionString().substring(masterMongoDbUri.getConnectionString().indexOf("?")+1));
final MongoDBService replicaMongoDBService = new MongoDBConfiguration(replicaMongoDbUri).getService();
final RacingEventServiceImpl result = new RacingEventServiceImpl(
(final RaceLogAndTrackedRaceResolver raceLogResolver) -> {
@@ -35,7 +35,9 @@ Require-Bundle: com.sap.sailing.server,
org.apache.shiro.core;bundle-version="1.2.2",
org.eclipse.jetty.osgi-servlet-api;bundle-version="3.1.0",
com.sap.sailing.server.interface,
org.mongodb.mongo-java-driver;bundle-version="3.6.4",
org.mongodb.bson;bundle-version="4.3.1",
org.mongodb.driver-core;bundle-version="4.3.1",
org.mongodb.driver-sync;bundle-version="4.3.1",
com.sap.sse.security.common,
com.sap.sse.mail
Automatic-Module-Name: com.sap.sailing.server.testsupport
@@ -40,7 +40,9 @@ Require-Bundle: com.sap.sailing.domain,
org.eclipse.jetty.osgi-servlet-api;bundle-version="3.1.0",
com.sap.sse.mail,
com.sap.sailing.server.interface,
org.mongodb.mongo-java-driver;bundle-version="3.6.4",
org.mongodb.bson;bundle-version="4.3.1",
org.mongodb.driver-core;bundle-version="4.3.1",
org.mongodb.driver-sync;bundle-version="4.3.1",
com.sap.sse.security.common,
com.sap.sailing.resultimport,
com.sap.sailing.shared.server
@@ -51,8 +51,12 @@
<setEntry value="org.jdom@default:default"/>
<setEntry value="org.jvnet.mimepull@default:default"/>
<setEntry value="org.apache.commons.math3@default:default"/>
<setEntry value="org.mongodb.mongo-java-driver@default:default"/>
<setEntry value="org.mongodb.mongo-java-driver.source@default:default"/>
<setEntry value="org.mongodb.driver-core@default:default"/>
<setEntry value="org.mongodb.driver-core.source@default:default"/>
<setEntry value="org.mongodb.bson@default:default"/>
<setEntry value="org.mongodb.bson.source@default:default"/>
<setEntry value="org.mongodb.driver-sync@default:default"/>
<setEntry value="org.mongodb.driver-sync@default:default"/>
<setEntry value="org.eclipse.jetty.osgi.boot@3:true"/>
<setEntry value="org.eclipse.jetty.osgi.boot.warurl@default:default"/>
<setEntry value="org.hyperic.sigar@default:default"/>
@@ -57,8 +57,12 @@
<setEntry value="org.jdom@default:default"/>
<setEntry value="org.jvnet.mimepull@default:default"/>
<setEntry value="org.apache.commons.math3@default:default"/>
<setEntry value="org.mongodb.mongo-java-driver@default:default"/>
<setEntry value="org.mongodb.mongo-java-driver.source@default:default"/>
<setEntry value="org.mongodb.driver-core@default:default"/>
<setEntry value="org.mongodb.driver-core.source@default:default"/>
<setEntry value="org.mongodb.bson@default:default"/>
<setEntry value="org.mongodb.bson.source@default:default"/>
<setEntry value="org.mongodb.driver-sync@default:default"/>
<setEntry value="org.mongodb.driver-sync@default:default"/>
<setEntry value="org.eclipse.jetty.osgi.boot@3:true"/>
<setEntry value="org.eclipse.jetty.osgi.boot.warurl@default:default"/>
<setEntry value="org.hyperic.sigar@default:default"/>
@@ -53,8 +53,12 @@
<setEntry value="org.jdom@default:default"/>
<setEntry value="org.jvnet.mimepull@default:default"/>
<setEntry value="org.apache.commons.math3@default:default"/>
<setEntry value="org.mongodb.mongo-java-driver@default:default"/>
<setEntry value="org.mongodb.mongo-java-driver.source@default:default"/>
<setEntry value="org.mongodb.driver-core@default:default"/>
<setEntry value="org.mongodb.driver-core.source@default:default"/>
<setEntry value="org.mongodb.bson@default:default"/>
<setEntry value="org.mongodb.bson.source@default:default"/>
<setEntry value="org.mongodb.driver-sync@default:default"/>
<setEntry value="org.mongodb.driver-sync@default:default"/>
<setEntry value="org.eclipse.jetty.osgi.boot@3:true"/>
<setEntry value="org.eclipse.jetty.osgi.boot.warurl@default:default"/>
<setEntry value="org.hyperic.sigar@default:default"/>
@@ -50,8 +50,12 @@
<setEntry value="org.jdom@default:default"/>
<setEntry value="org.jvnet.mimepull@default:default"/>
<setEntry value="org.apache.commons.math3@default:default"/>
<setEntry value="org.mongodb.mongo-java-driver@default:default"/>
<setEntry value="org.mongodb.mongo-java-driver.source@default:default"/>
<setEntry value="org.mongodb.driver-core@default:default"/>
<setEntry value="org.mongodb.driver-core.source@default:default"/>
<setEntry value="org.mongodb.bson@default:default"/>
<setEntry value="org.mongodb.bson.source@default:default"/>
<setEntry value="org.mongodb.driver-sync@default:default"/>
<setEntry value="org.mongodb.driver-sync@default:default"/>
<setEntry value="org.eclipse.jetty.osgi.boot@3:true"/>
<setEntry value="org.eclipse.jetty.osgi.boot.warurl@default:default"/>
<setEntry value="org.hyperic.sigar@default:default"/>
@@ -53,8 +53,12 @@
<setEntry value="org.jdom@default:default"/>
<setEntry value="org.jvnet.mimepull@default:default"/>
<setEntry value="org.apache.commons.math3@default:default"/>
<setEntry value="org.mongodb.mongo-java-driver@default:default"/>
<setEntry value="org.mongodb.mongo-java-driver.source@default:default"/>
<setEntry value="org.mongodb.driver-core@default:default"/>
<setEntry value="org.mongodb.driver-core.source@default:default"/>
<setEntry value="org.mongodb.bson@default:default"/>
<setEntry value="org.mongodb.bson.source@default:default"/>
<setEntry value="org.mongodb.driver-sync@default:default"/>
<setEntry value="org.mongodb.driver-sync@default:default"/>
<setEntry value="org.eclipse.jetty.osgi.boot@3:true"/>
<setEntry value="org.eclipse.jetty.osgi.boot.warurl@default:default"/>
<setEntry value="org.hyperic.sigar@default:default"/>
@@ -53,8 +53,12 @@
<setEntry value="org.jdom@default:default"/>
<setEntry value="org.jvnet.mimepull@default:default"/>
<setEntry value="org.apache.commons.math3@default:default"/>
<setEntry value="org.mongodb.mongo-java-driver@default:default"/>
<setEntry value="org.mongodb.mongo-java-driver.source@default:default"/>
<setEntry value="org.mongodb.driver-core@default:default"/>
<setEntry value="org.mongodb.driver-core.source@default:default"/>
<setEntry value="org.mongodb.bson@default:default"/>
<setEntry value="org.mongodb.bson.source@default:default"/>
<setEntry value="org.mongodb.driver-sync@default:default"/>
<setEntry value="org.mongodb.driver-sync@default:default"/>
<setEntry value="org.eclipse.jetty.osgi.boot@3:true"/>
<setEntry value="org.eclipse.jetty.osgi.boot.warurl@default:default"/>
<setEntry value="org.hyperic.sigar@default:default"/>
@@ -53,8 +53,12 @@
<setEntry value="org.jdom@default:default"/>
<setEntry value="org.jvnet.mimepull@default:default"/>
<setEntry value="org.apache.commons.math3@default:default"/>
<setEntry value="org.mongodb.mongo-java-driver@default:default"/>
<setEntry value="org.mongodb.mongo-java-driver.source@default:default"/>
<setEntry value="org.mongodb.driver-core@default:default"/>
<setEntry value="org.mongodb.driver-core.source@default:default"/>
<setEntry value="org.mongodb.bson@default:default"/>
<setEntry value="org.mongodb.bson.source@default:default"/>
<setEntry value="org.mongodb.driver-sync@default:default"/>
<setEntry value="org.mongodb.driver-sync@default:default"/>
<setEntry value="org.eclipse.jetty.osgi.boot@3:true"/>
<setEntry value="org.eclipse.jetty.osgi.boot.warurl@default:default"/>
<setEntry value="org.hyperic.sigar@default:default"/>
@@ -53,8 +53,12 @@
<setEntry value="org.jdom@default:default"/>
<setEntry value="org.jvnet.mimepull@default:default"/>
<setEntry value="org.apache.commons.math3@default:default"/>
<setEntry value="org.mongodb.mongo-java-driver@default:default"/>
<setEntry value="org.mongodb.mongo-java-driver.source@default:default"/>
<setEntry value="org.mongodb.driver-core@default:default"/>
<setEntry value="org.mongodb.driver-core.source@default:default"/>
<setEntry value="org.mongodb.bson@default:default"/>
<setEntry value="org.mongodb.bson.source@default:default"/>
<setEntry value="org.mongodb.driver-sync@default:default"/>
<setEntry value="org.mongodb.driver-sync@default:default"/>
<setEntry value="org.eclipse.jetty.osgi.boot@3:true"/>
<setEntry value="org.eclipse.jetty.osgi.boot.warurl@default:default"/>
<setEntry value="org.hyperic.sigar@default:default"/>
@@ -48,8 +48,12 @@
<setEntry value="org.jdom@default:default"/>
<setEntry value="org.jvnet.mimepull@default:default"/>
<setEntry value="org.apache.commons.math3@default:default"/>
<setEntry value="org.mongodb.mongo-java-driver@default:default"/>
<setEntry value="org.mongodb.mongo-java-driver.source@default:default"/>
<setEntry value="org.mongodb.driver-core@default:default"/>
<setEntry value="org.mongodb.driver-core.source@default:default"/>
<setEntry value="org.mongodb.bson@default:default"/>
<setEntry value="org.mongodb.bson.source@default:default"/>
<setEntry value="org.mongodb.driver-sync@default:default"/>
<setEntry value="org.mongodb.driver-sync@default:default"/>
<setEntry value="org.eclipse.jetty.osgi.boot@3:true"/>
<setEntry value="org.eclipse.jetty.osgi.boot.warurl@default:default"/>
<setEntry value="org.hyperic.sigar@default:default"/>
@@ -44,8 +44,12 @@
<setEntry value="org.jdom@default:default"/>
<setEntry value="org.jvnet.mimepull@default:default"/>
<setEntry value="org.apache.commons.math3@default:default"/>
<setEntry value="org.mongodb.mongo-java-driver@default:default"/>
<setEntry value="org.mongodb.mongo-java-driver.source@default:default"/>
<setEntry value="org.mongodb.driver-core@default:default"/>
<setEntry value="org.mongodb.driver-core.source@default:default"/>
<setEntry value="org.mongodb.bson@default:default"/>
<setEntry value="org.mongodb.bson.source@default:default"/>
<setEntry value="org.mongodb.driver-sync@default:default"/>
<setEntry value="org.mongodb.driver-sync@default:default"/>
<setEntry value="org.eclipse.jetty.osgi.boot@3:true"/>
<setEntry value="org.eclipse.jetty.osgi.boot.warurl@default:default"/>
<setEntry value="org.hyperic.sigar@default:default"/>
@@ -50,8 +50,12 @@
<setEntry value="org.jdom@default:default"/>
<setEntry value="org.jvnet.mimepull@default:default"/>
<setEntry value="org.apache.commons.math3@default:default"/>
<setEntry value="org.mongodb.mongo-java-driver@default:default"/>
<setEntry value="org.mongodb.mongo-java-driver.source@default:default"/>
<setEntry value="org.mongodb.driver-core@default:default"/>
<setEntry value="org.mongodb.driver-core.source@default:default"/>
<setEntry value="org.mongodb.bson@default:default"/>
<setEntry value="org.mongodb.bson.source@default:default"/>
<setEntry value="org.mongodb.driver-sync@default:default"/>
<setEntry value="org.mongodb.driver-sync@default:default"/>
<setEntry value="org.eclipse.jetty.osgi.boot@3:true"/>
<setEntry value="org.eclipse.jetty.osgi.boot.warurl@default:default"/>
<setEntry value="org.hyperic.sigar@default:default"/>
Loaded 100 of 154 files, more files were not shown because too many files have changed in this diff. Show more