mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-11-07 03:22:23 +00:00
Merge branch 'master' into bug5311
This commit is contained in:
commit
b6e147f4fb
154 files changed
+1301
-591
No files matched your search
-1
@@ -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;
|
||||
|
||||
+6
-3
@@ -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"),
|
||||
|
||||
+2
-1
@@ -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,
|
||||
|
||||
+2
-2
@@ -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) {
|
||||
|
||||
+11
-1
@@ -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,
|
||||
|
||||
+3
-3
@@ -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;
|
||||
|
||||
+17
-16
@@ -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();
|
||||
|
||||
+1
-1
@@ -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",
|
||||
|
||||
+1
-1
@@ -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,
|
||||
|
||||
+3
-5
@@ -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",
|
||||
|
||||
+2
-2
@@ -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
|
||||
+2
-2
@@ -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",
|
||||
|
||||
+3
@@ -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());
|
||||
|
||||
+12
@@ -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();
|
||||
|
||||
+12
-9
@@ -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);
|
||||
}
|
||||
+14
-9
@@ -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);
|
||||
|
||||
+9
-8
@@ -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);
|
||||
|
||||
+4
-10
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+11
-3
@@ -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);
|
||||
|
||||
+1
-1
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+12
-7
@@ -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>>() {
|
||||
|
||||
+62
-29
@@ -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){
|
||||
|
||||
+34
-14
@@ -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);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
+1
-1
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+35
-20
@@ -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
|
||||
|
||||
+4
-3
@@ -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) {
|
||||
|
||||
+71
-5
@@ -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();
|
||||
}
|
||||
|
||||
+8
-6
@@ -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) {
|
||||
|
||||
+12
-3
@@ -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;
|
||||
}
|
||||
}
|
||||
+63
-19
@@ -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);
|
||||
|
||||
+9
-14
@@ -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;
|
||||
}
|
||||
|
||||
+11
-4
@@ -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() {
|
||||
|
||||
+10
-3
@@ -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() {
|
||||
}
|
||||
|
||||
+18
-10
@@ -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();
|
||||
|
||||
+37
-29
@@ -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) {
|
||||
|
||||
+3
-2
@@ -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);
|
||||
}
|
||||
}
|
||||
+10
-6
@@ -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
|
||||
|
||||
+5
-4
@@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
+10
-4
@@ -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() {
|
||||
|
||||
+25
-20
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+16
-12
@@ -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,
|
||||
|
||||
+2
-7
@@ -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;
|
||||
}
|
||||
|
||||
-2
@@ -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> {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
+53
@@ -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);
|
||||
}
|
||||
|
||||
+4
@@ -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();
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -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 */),
|
||||
|
||||
+27
-7
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-2
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
+7
-9
@@ -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;
|
||||
}
|
||||
|
||||
+18
-8
@@ -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.
|
||||
|
||||
Regular → Executable
File mode changed.
Regular → Executable
File mode changed.
+1
@@ -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,
|
||||
|
||||
+19
-14
@@ -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;
|
||||
|
||||
BIN
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
BIN
Binary file not shown.
|
After Width: | Height: | Size: 11 KiB |
BIN
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")
|
||||
|
||||
+3
-2
@@ -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);
|
||||
}
|
||||
}
|
||||
+6
-2
@@ -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());
|
||||
}
|
||||
}
|
||||
+23
-22
@@ -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
|
||||
+10
-5
@@ -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
|
||||
|
||||
+5
-5
@@ -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
|
||||
|
||||
+4
-4
@@ -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());
|
||||
}
|
||||
}
|
||||
+4
-3
@@ -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,
|
||||
|
||||
+7
-9
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+11
-1
@@ -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;
|
||||
}
|
||||
}
|
||||
+35
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
+68
-1
@@ -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",
|
||||
|
||||
+5
-10
@@ -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"/>
|
||||
|
||||
+6
-2
@@ -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"/>
|
||||
|
||||
+6
-2
@@ -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
Reference in new issue
Block a user