Merge branch '3.3.x'

Closes gh-43356
This commit is contained in:
Phillip Webb 2024-12-02 13:59:53 -08:00
commit dd64b0648f
4 changed files with 56 additions and 19 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2020 the original author or authors. * Copyright 2012-2024 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -22,6 +22,7 @@ import com.fasterxml.jackson.annotation.JsonCreator;
* An {@link UpdateEvent} that includes progress information. * An {@link UpdateEvent} that includes progress information.
* *
* @author Phillip Webb * @author Phillip Webb
* @author Wolfgang Kronberg
* @since 2.3.0 * @since 2.3.0
*/ */
public abstract class ProgressUpdateEvent extends UpdateEvent { public abstract class ProgressUpdateEvent extends UpdateEvent {
@ -67,12 +68,12 @@ public abstract class ProgressUpdateEvent extends UpdateEvent {
*/ */
public static class ProgressDetail { public static class ProgressDetail {
private final Integer current; private final Long current;
private final Integer total; private final Long total;
@JsonCreator @JsonCreator
public ProgressDetail(Integer current, Integer total) { public ProgressDetail(Long current, Long total) {
this.current = current; this.current = current;
this.total = total; this.total = total;
} }
@ -80,19 +81,42 @@ public abstract class ProgressUpdateEvent extends UpdateEvent {
/** /**
* Return the current progress value. * Return the current progress value.
* @return the current progress * @return the current progress
* @deprecated since 3.3.7 for removal in 3.5.0 in favor of
* {@link #asPercentage()}
*/ */
@Deprecated(since = "3.3.7", forRemoval = true)
public int getCurrent() { public int getCurrent() {
return this.current; return (int) Long.min(this.current, Integer.MAX_VALUE);
} }
/** /**
* Return the total progress possible value. * Return the total progress possible value.
* @return the total progress possible * @return the total progress possible
* @deprecated since 3.3.7 for removal in 3.5.0 in favor of
* {@link #asPercentage()}
*/ */
@Deprecated(since = "3.3.7", forRemoval = true)
public int getTotal() { public int getTotal() {
return this.total; return (int) Long.min(this.total, Integer.MAX_VALUE);
} }
/**
* Return the progress as a percentage.
* @return the progress percentage
* @since 3.3.7
*/
public int asPercentage() {
int percentage = (int) ((100.0 / this.total) * this.current);
return (percentage < 0) ? 0 : Math.min(percentage, 100);
}
/**
* Return if the progress detail is considered empty.
* @param progressDetail the progress detail to check
* @return if the progress detail is empty
* @deprecated since 3.3.7 for removal in 3.5.0
*/
@Deprecated(since = "3.3.7", forRemoval = true)
public static boolean isEmpty(ProgressDetail progressDetail) { public static boolean isEmpty(ProgressDetail progressDetail) {
return progressDetail == null || progressDetail.current == null || progressDetail.total == null; return progressDetail == null || progressDetail.current == null || progressDetail.total == null;
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2020 the original author or authors. * Copyright 2012-2024 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -89,10 +89,7 @@ public abstract class TotalProgressListener<E extends ImageProgressUpdateEvent>
} }
private static int withinPercentageBounds(int value) { private static int withinPercentageBounds(int value) {
if (value < 0) { return (value < 0) ? 0 : Math.min(value, 100);
return 0;
}
return Math.min(value, 100);
} }
/** /**
@ -115,8 +112,7 @@ public abstract class TotalProgressListener<E extends ImageProgressUpdateEvent>
} }
private int updateProgress(int current, ProgressDetail detail) { private int updateProgress(int current, ProgressDetail detail) {
int result = withinPercentageBounds((int) ((100.0 / detail.getTotal()) * detail.getCurrent())); return Math.max(detail.asPercentage(), current);
return Math.max(result, current);
} }
void finish() { void finish() {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2023 the original author or authors. * Copyright 2012-2024 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -28,6 +28,7 @@ import static org.assertj.core.api.Assertions.assertThat;
* @param <E> The event type * @param <E> The event type
* @author Phillip Webb * @author Phillip Webb
* @author Scott Frederick * @author Scott Frederick
* @author Wolfgang Kronberg
*/ */
abstract class ProgressUpdateEventTests<E extends ProgressUpdateEvent> { abstract class ProgressUpdateEventTests<E extends ProgressUpdateEvent> {
@ -38,10 +39,21 @@ abstract class ProgressUpdateEventTests<E extends ProgressUpdateEvent> {
} }
@Test @Test
@SuppressWarnings("removal")
void getProgressDetailsReturnsProgressDetails() { void getProgressDetailsReturnsProgressDetails() {
ProgressUpdateEvent event = createEvent(); ProgressUpdateEvent event = createEvent();
assertThat(event.getProgressDetail().getCurrent()).isOne(); assertThat(event.getProgressDetail().getCurrent()).isOne();
assertThat(event.getProgressDetail().getTotal()).isEqualTo(2); assertThat(event.getProgressDetail().getTotal()).isEqualTo(2);
assertThat(event.getProgressDetail().asPercentage()).isEqualTo(50);
}
@Test
@SuppressWarnings("removal")
void getProgressDetailsReturnsProgressDetailsForLongNumbers() {
ProgressUpdateEvent event = createEvent("status", new ProgressDetail(4000000000L, 8000000000L), "progress");
assertThat(event.getProgressDetail().getCurrent()).isEqualTo(Integer.MAX_VALUE);
assertThat(event.getProgressDetail().getTotal()).isEqualTo(Integer.MAX_VALUE);
assertThat(event.getProgressDetail().asPercentage()).isEqualTo(50);
} }
@Test @Test
@ -51,25 +63,28 @@ abstract class ProgressUpdateEventTests<E extends ProgressUpdateEvent> {
} }
@Test @Test
@SuppressWarnings("removal")
void progressDetailIsEmptyWhenCurrentIsNullReturnsTrue() { void progressDetailIsEmptyWhenCurrentIsNullReturnsTrue() {
ProgressDetail detail = new ProgressDetail(null, 2); ProgressDetail detail = new ProgressDetail(null, 2L);
assertThat(ProgressDetail.isEmpty(detail)).isTrue(); assertThat(ProgressDetail.isEmpty(detail)).isTrue();
} }
@Test @Test
@SuppressWarnings("removal")
void progressDetailIsEmptyWhenTotalIsNullReturnsTrue() { void progressDetailIsEmptyWhenTotalIsNullReturnsTrue() {
ProgressDetail detail = new ProgressDetail(1, null); ProgressDetail detail = new ProgressDetail(1L, null);
assertThat(ProgressDetail.isEmpty(detail)).isTrue(); assertThat(ProgressDetail.isEmpty(detail)).isTrue();
} }
@Test @Test
@SuppressWarnings("removal")
void progressDetailIsEmptyWhenTotalAndCurrentAreNotNullReturnsFalse() { void progressDetailIsEmptyWhenTotalAndCurrentAreNotNullReturnsFalse() {
ProgressDetail detail = new ProgressDetail(1, 2); ProgressDetail detail = new ProgressDetail(1L, 2L);
assertThat(ProgressDetail.isEmpty(detail)).isFalse(); assertThat(ProgressDetail.isEmpty(detail)).isFalse();
} }
protected E createEvent() { protected E createEvent() {
return createEvent("status", new ProgressDetail(1, 2), "progress"); return createEvent("status", new ProgressDetail(1L, 2L), "progress");
} }
protected abstract E createEvent(String status, ProgressDetail progressDetail, String progress); protected abstract E createEvent(String status, ProgressDetail progressDetail, String progress);

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2020 the original author or authors. * Copyright 2012-2024 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -30,6 +30,7 @@ import static org.assertj.core.api.Assertions.assertThat;
class PullUpdateEventTests extends AbstractJsonTests { class PullUpdateEventTests extends AbstractJsonTests {
@Test @Test
@SuppressWarnings("removal")
void readValueWhenFullDeserializesJson() throws Exception { void readValueWhenFullDeserializesJson() throws Exception {
PullImageUpdateEvent event = getObjectMapper().readValue(getContent("pull-update-full.json"), PullImageUpdateEvent event = getObjectMapper().readValue(getContent("pull-update-full.json"),
PullImageUpdateEvent.class); PullImageUpdateEvent.class);
@ -37,6 +38,7 @@ class PullUpdateEventTests extends AbstractJsonTests {
assertThat(event.getStatus()).isEqualTo("Extracting"); assertThat(event.getStatus()).isEqualTo("Extracting");
assertThat(event.getProgressDetail().getCurrent()).isEqualTo(16); assertThat(event.getProgressDetail().getCurrent()).isEqualTo(16);
assertThat(event.getProgressDetail().getTotal()).isEqualTo(32); assertThat(event.getProgressDetail().getTotal()).isEqualTo(32);
assertThat(event.getProgressDetail().asPercentage()).isEqualTo(50);
assertThat(event.getProgress()).isEqualTo("[==================================================>] 32B/32B"); assertThat(event.getProgress()).isEqualTo("[==================================================>] 32B/32B");
} }