bug6288: use Iterable in live check DTOs

This commit is contained in:
Axel Uhl committed 2026-09-14 23:30:20 +02:00
1 parent 8b26a148af
commit b12bd7f49d
12 files changed
+41 -31

No files matched your search

+6 -1
View File
@@ -10,7 +10,9 @@ Make sure to research the topic/question well and thoroughly instead of just ans
## Java Coding Style Preferences
### When using any form of auto-formatting, keep it to the actual change and make sure not to apply any auto-formatting to otherwise unchanged code. This would make reviewing a pain.
### Auto-Formatting
When using any form of auto-formatting, keep it to the actual change and make sure not to apply any auto-formatting to otherwise unchanged code. This would make reviewing a pain.
### Variable Declarations
- **Always use `final` where possible** for local variables, parameters, and fields
@@ -52,6 +54,9 @@ generate the value only after the first combination of fields and methods has be
so that at least for an initial version of the type the serialVersionUID is a true, matching
ID.
However, once a non-trivial serialVersionUID has been generated, committed and pushed, don't
change it anymore.
## i18n Patterns
Our primary development language is English (en_US). However, we also have to maintain German (de_DE) ourselves.
@@ -12,7 +12,7 @@ public final class EventLiveContent implements Serializable {
private final String eventName;
private final Long eventStartMillis;
private final Long eventEndMillis;
private final List<RaceLiveContent> racesWithLiveContent;
private final Iterable<RaceLiveContent> racesWithLiveContent;
public EventLiveContent(final String eventId, final String eventName, final Long eventStartMillis,
final Long eventEndMillis, final Iterable<RaceLiveContent> racesWithLiveContent) {
@@ -41,7 +41,7 @@ public final class EventLiveContent implements Serializable {
return eventEndMillis;
}
public List<RaceLiveContent> getRacesWithLiveContent() {
public Iterable<RaceLiveContent> getRacesWithLiveContent() {
return racesWithLiveContent;
}
}
@@ -19,8 +19,8 @@ import com.sap.sse.common.TimePoint;
public final class LiveContentCheckResult implements Serializable {
private static final long serialVersionUID = -6357657054503530857L;
private final TimePoint checkedAt;
private final List<ReplicaSetLiveContent> replicaSetsWithLiveContent;
private final List<String> undeterminedReplicaSetNames;
private final Iterable<ReplicaSetLiveContent> replicaSetsWithLiveContent;
private final Iterable<String> undeterminedReplicaSetNames;
public LiveContentCheckResult(final TimePoint checkedAt,
final Iterable<ReplicaSetLiveContent> replicaSetsWithLiveContent) {
@@ -43,7 +43,7 @@ public final class LiveContentCheckResult implements Serializable {
return checkedAt;
}
public List<ReplicaSetLiveContent> getReplicaSetsWithLiveContent() {
public Iterable<ReplicaSetLiveContent> getReplicaSetsWithLiveContent() {
return replicaSetsWithLiveContent;
}
@@ -52,15 +52,15 @@ public final class LiveContentCheckResult implements Serializable {
* the live-content query yet). Callers that block operations on live content should treat these as potentially
* serving live content rather than as verified to be idle.
*/
public List<String> getUndeterminedReplicaSetNames() {
public Iterable<String> getUndeterminedReplicaSetNames() {
return undeterminedReplicaSetNames;
}
public boolean hasLiveContent() {
return !replicaSetsWithLiveContent.isEmpty();
return replicaSetsWithLiveContent.iterator().hasNext();
}
public boolean hasUndeterminedReplicaSets() {
return !undeterminedReplicaSetNames.isEmpty();
return undeterminedReplicaSetNames.iterator().hasNext();
}
}
@@ -9,7 +9,7 @@ import java.util.List;
public final class ReplicaSetLiveContent implements Serializable {
private static final long serialVersionUID = -8106650879852011910L;
private final String replicaSetName;
private final List<EventLiveContent> eventsWithLiveContent;
private final Iterable<EventLiveContent> eventsWithLiveContent;
public ReplicaSetLiveContent(final String replicaSetName,
final Iterable<EventLiveContent> eventsWithLiveContent) {
@@ -23,7 +23,7 @@ public final class ReplicaSetLiveContent implements Serializable {
return replicaSetName;
}
public List<EventLiveContent> getEventsWithLiveContent() {
public Iterable<EventLiveContent> getEventsWithLiveContent() {
return eventsWithLiveContent;
}
}
@@ -16,6 +16,7 @@ import com.sap.sailing.landscape.common.LiveContentCheckResult;
import com.sap.sailing.landscape.common.RaceLiveContent;
import com.sap.sailing.landscape.common.ReplicaSetLiveContent;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.Util;
public class TestLiveContentValueTypes {
private static final TimePoint CHECKED_AT = TimePoint.of(42L);
@@ -36,8 +37,8 @@ public class TestLiveContentValueTypes {
Collections.singleton(event));
final LiveContentCheckResult result = new LiveContentCheckResult(CHECKED_AT, Collections.singleton(replicaSet));
assertTrue(result.hasLiveContent());
assertEquals("race", result.getReplicaSetsWithLiveContent().get(0).getEventsWithLiveContent().get(0)
.getRacesWithLiveContent().get(0).getRaceName());
assertEquals("race", Util.get(Util.get(Util.get(result.getReplicaSetsWithLiveContent(), 0)
.getEventsWithLiveContent(), 0).getRacesWithLiveContent(), 0).getRaceName());
assertNull(race.getTrackingEnd());
}
@@ -54,11 +55,12 @@ public class TestLiveContentValueTypes {
final LiveContentCheckResult withoutUndetermined = new LiveContentCheckResult(CHECKED_AT,
Collections.emptyList());
assertFalse(withoutUndetermined.hasUndeterminedReplicaSets());
assertTrue(withoutUndetermined.getUndeterminedReplicaSetNames().isEmpty());
assertFalse(withoutUndetermined.getUndeterminedReplicaSetNames().iterator().hasNext());
final LiveContentCheckResult withUndetermined = new LiveContentCheckResult(CHECKED_AT, Collections.emptyList(),
Collections.singleton("old-server"));
assertFalse(withUndetermined.hasLiveContent());
assertTrue(withUndetermined.hasUndeterminedReplicaSets());
assertEquals(Collections.singletonList("old-server"), withUndetermined.getUndeterminedReplicaSetNames());
assertEquals(Collections.singletonList("old-server"),
Util.asList(withUndetermined.getUndeterminedReplicaSetNames()));
}
}
@@ -9,6 +9,7 @@ import com.google.gwt.user.client.rpc.SerializationStreamReader;
import com.google.gwt.user.client.rpc.SerializationStreamWriter;
import com.sap.sailing.landscape.common.EventLiveContent;
import com.sap.sailing.landscape.common.RaceLiveContent;
import com.sap.sse.common.Util;
public final class EventLiveContent_CustomFieldSerializer extends CustomFieldSerializer<EventLiveContent> {
public static void serialize(final SerializationStreamWriter writer, final EventLiveContent instance)
@@ -17,7 +18,7 @@ public final class EventLiveContent_CustomFieldSerializer extends CustomFieldSer
writer.writeString(instance.getEventName());
writer.writeObject(instance.getEventStartMillis());
writer.writeObject(instance.getEventEndMillis());
writer.writeInt(instance.getRacesWithLiveContent().size());
writer.writeInt(Util.size(instance.getRacesWithLiveContent()));
for (final RaceLiveContent race : instance.getRacesWithLiveContent()) {
writer.writeObject(race);
}
@@ -10,16 +10,17 @@ import com.google.gwt.user.client.rpc.SerializationStreamWriter;
import com.sap.sailing.landscape.common.LiveContentCheckResult;
import com.sap.sailing.landscape.common.ReplicaSetLiveContent;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.Util;
public final class LiveContentCheckResult_CustomFieldSerializer extends CustomFieldSerializer<LiveContentCheckResult> {
public static void serialize(final SerializationStreamWriter writer, final LiveContentCheckResult instance)
throws SerializationException {
writer.writeObject(instance.getCheckedAt());
writer.writeInt(instance.getReplicaSetsWithLiveContent().size());
writer.writeInt(Util.size(instance.getReplicaSetsWithLiveContent()));
for (final ReplicaSetLiveContent replicaSet : instance.getReplicaSetsWithLiveContent()) {
writer.writeObject(replicaSet);
}
writer.writeInt(instance.getUndeterminedReplicaSetNames().size());
writer.writeInt(Util.size(instance.getUndeterminedReplicaSetNames()));
for (final String undeterminedReplicaSetName : instance.getUndeterminedReplicaSetNames()) {
writer.writeString(undeterminedReplicaSetName);
}
@@ -9,12 +9,13 @@ import com.google.gwt.user.client.rpc.SerializationStreamReader;
import com.google.gwt.user.client.rpc.SerializationStreamWriter;
import com.sap.sailing.landscape.common.EventLiveContent;
import com.sap.sailing.landscape.common.ReplicaSetLiveContent;
import com.sap.sse.common.Util;
public final class ReplicaSetLiveContent_CustomFieldSerializer extends CustomFieldSerializer<ReplicaSetLiveContent> {
public static void serialize(final SerializationStreamWriter writer, final ReplicaSetLiveContent instance)
throws SerializationException {
writer.writeString(instance.getReplicaSetName());
writer.writeInt(instance.getEventsWithLiveContent().size());
writer.writeInt(Util.size(instance.getEventsWithLiveContent()));
for (final EventLiveContent event : instance.getEventsWithLiveContent()) {
writer.writeObject(event);
}
@@ -1013,10 +1013,8 @@ public class LandscapeManagementPanel extends SimplePanel {
private Set<String> getConflictingReplicaSetNames(final LiveContentCheckResult liveContentCheckResult) {
final Set<String> result = new HashSet<>();
for (final ReplicaSetLiveContent replicaSet : liveContentCheckResult.getReplicaSetsWithLiveContent()) {
result.add(replicaSet.getReplicaSetName());
}
result.addAll(liveContentCheckResult.getUndeterminedReplicaSetNames());
Util.addAll(Util.map(liveContentCheckResult.getReplicaSetsWithLiveContent(), ReplicaSetLiveContent::getReplicaSetName), result);
Util.addAll(liveContentCheckResult.getUndeterminedReplicaSetNames(), result);
return result;
}
@@ -1,6 +1,7 @@
package com.sap.sailing.landscape;
import com.sap.sailing.landscape.common.LiveContentCheckResult;
import com.sap.sse.common.Util;
/** Raised before a landscape operation would affect a replica set containing live tracked races. */
public final class LiveContentConflictException extends Exception {
@@ -8,9 +9,9 @@ public final class LiveContentConflictException extends Exception {
private final LiveContentCheckResult liveContentCheckResult;
public LiveContentConflictException(final LiveContentCheckResult liveContentCheckResult) {
super("The operation would affect " + liveContentCheckResult.getReplicaSetsWithLiveContent().size()
super("The operation would affect " + Util.size(liveContentCheckResult.getReplicaSetsWithLiveContent())
+ " application replica set(s) containing live tracked races and "
+ liveContentCheckResult.getUndeterminedReplicaSetNames().size()
+ Util.size(liveContentCheckResult.getUndeterminedReplicaSetNames())
+ " application replica set(s) whose live-content state could not be determined");
this.liveContentCheckResult = liveContentCheckResult;
}
@@ -604,8 +604,8 @@ public class LandscapeServiceImpl implements LandscapeService {
final SailingServer server = sailingServerFactoryTracker.getService().getSailingServer(new URL("https", replicaSet.getHostname(), "/"), effectiveBearerToken);
try {
final LiveContentCheckResult replicaSetResult = server.getLiveContent(checkedAt);
replicaSetsWithLiveContent.addAll(replicaSetResult.getReplicaSetsWithLiveContent());
undeterminedReplicaSetNames.addAll(replicaSetResult.getUndeterminedReplicaSetNames());
Util.addAll(replicaSetResult.getReplicaSetsWithLiveContent(), replicaSetsWithLiveContent);
Util.addAll(replicaSetResult.getUndeterminedReplicaSetNames(), undeterminedReplicaSetNames);
} catch (final LiveContentCheckUnsupportedException e) {
// The server could not answer the live-content query (e.g., it predates the endpoint). Record it as
// undetermined and continue so that one un-upgraded server does not abort checking the remaining ones.
@@ -17,6 +17,7 @@ import com.sap.sailing.landscape.common.ReplicaSetLiveContent;
import com.sap.sailing.server.gateway.deserialization.impl.LiveContentCheckResultJsonDeserializer;
import com.sap.sailing.server.gateway.serialization.impl.LiveContentCheckResultJsonSerializer;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.Util;
import com.sap.sse.shared.json.JsonDeserializationException;
public class LiveContentCheckResultJsonSerializerTest {
@@ -34,10 +35,10 @@ public class LiveContentCheckResultJsonSerializerTest {
final LiveContentCheckResult roundTripped = new LiveContentCheckResultJsonDeserializer().deserialize(serialized);
assertEquals(CHECKED_AT, roundTripped.getCheckedAt());
assertTrue(roundTripped.hasLiveContent());
assertEquals("R1", roundTripped.getReplicaSetsWithLiveContent().get(0).getEventsWithLiveContent().get(0)
.getRacesWithLiveContent().get(0).getRaceName());
assertEquals("R1", Util.get(Util.get(Util.get(roundTripped.getReplicaSetsWithLiveContent(), 0)
.getEventsWithLiveContent(), 0).getRacesWithLiveContent(), 0).getRaceName());
assertTrue(roundTripped.hasUndeterminedReplicaSets());
assertEquals(Arrays.asList("beta", "gamma"), roundTripped.getUndeterminedReplicaSetNames());
assertEquals(Arrays.asList("beta", "gamma"), Util.asList(roundTripped.getUndeterminedReplicaSetNames()));
}
@Test
@@ -50,6 +51,6 @@ public class LiveContentCheckResultJsonSerializerTest {
final LiveContentCheckResult roundTripped = new LiveContentCheckResultJsonDeserializer().deserialize(serialized);
assertFalse(roundTripped.hasLiveContent());
assertFalse(roundTripped.hasUndeterminedReplicaSets());
assertTrue(roundTripped.getUndeterminedReplicaSetNames().isEmpty());
assertFalse(roundTripped.getUndeterminedReplicaSetNames().iterator().hasNext());
}
}