diff --git a/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/main/java/org/springframework/boot/buildpack/platform/docker/ProgressUpdateEvent.java b/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/main/java/org/springframework/boot/buildpack/platform/docker/ProgressUpdateEvent.java index 271b6c19a2bd..6ac289436341 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/main/java/org/springframework/boot/buildpack/platform/docker/ProgressUpdateEvent.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/main/java/org/springframework/boot/buildpack/platform/docker/ProgressUpdateEvent.java @@ -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"); * you may not use this file except in compliance with the License. @@ -22,6 +22,7 @@ * An {@link UpdateEvent} that includes progress information. * * @author Phillip Webb + * @author Wolfgang Kronberg * @since 2.3.0 */ public abstract class ProgressUpdateEvent extends UpdateEvent { @@ -67,12 +68,12 @@ public String getProgress() { */ public static class ProgressDetail { - private final Integer current; + private final Long current; - private final Integer total; + private final Long total; @JsonCreator - public ProgressDetail(Integer current, Integer total) { + public ProgressDetail(Long current, Long total) { this.current = current; this.total = total; } @@ -80,19 +81,42 @@ public ProgressDetail(Integer current, Integer total) { /** * Return the current progress value. * @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() { - return this.current; + return (int) Long.min(this.current, Integer.MAX_VALUE); } /** * Return the total progress possible value. * @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() { - 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) { return progressDetail == null || progressDetail.current == null || progressDetail.total == null; } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/main/java/org/springframework/boot/buildpack/platform/docker/TotalProgressListener.java b/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/main/java/org/springframework/boot/buildpack/platform/docker/TotalProgressListener.java index fa397c611f57..b81cfb85a364 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/main/java/org/springframework/boot/buildpack/platform/docker/TotalProgressListener.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/main/java/org/springframework/boot/buildpack/platform/docker/TotalProgressListener.java @@ -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"); * you may not use this file except in compliance with the License. @@ -89,10 +89,7 @@ private void publish(int fallback) { } private static int withinPercentageBounds(int value) { - if (value < 0) { - return 0; - } - return Math.min(value, 100); + return (value < 0) ? 0 : Math.min(value, 100); } /** @@ -115,8 +112,7 @@ void update(ImageProgressUpdateEvent event) { } private int updateProgress(int current, ProgressDetail detail) { - int result = withinPercentageBounds((int) ((100.0 / detail.getTotal()) * detail.getCurrent())); - return Math.max(result, current); + return Math.max(detail.asPercentage(), current); } void finish() { diff --git a/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/test/java/org/springframework/boot/buildpack/platform/docker/ProgressUpdateEventTests.java b/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/test/java/org/springframework/boot/buildpack/platform/docker/ProgressUpdateEventTests.java index d6e2c0ace472..dd43af828992 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/test/java/org/springframework/boot/buildpack/platform/docker/ProgressUpdateEventTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/test/java/org/springframework/boot/buildpack/platform/docker/ProgressUpdateEventTests.java @@ -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"); * you may not use this file except in compliance with the License. @@ -28,6 +28,7 @@ * @param The event type * @author Phillip Webb * @author Scott Frederick + * @author Wolfgang Kronberg */ abstract class ProgressUpdateEventTests { @@ -38,10 +39,21 @@ void getStatusReturnsStatus() { } @Test + @SuppressWarnings("removal") void getProgressDetailsReturnsProgressDetails() { ProgressUpdateEvent event = createEvent(); assertThat(event.getProgressDetail().getCurrent()).isOne(); 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 @@ -51,25 +63,28 @@ void getProgressReturnsProgress() { } @Test + @SuppressWarnings("removal") void progressDetailIsEmptyWhenCurrentIsNullReturnsTrue() { - ProgressDetail detail = new ProgressDetail(null, 2); + ProgressDetail detail = new ProgressDetail(null, 2L); assertThat(ProgressDetail.isEmpty(detail)).isTrue(); } @Test + @SuppressWarnings("removal") void progressDetailIsEmptyWhenTotalIsNullReturnsTrue() { - ProgressDetail detail = new ProgressDetail(1, null); + ProgressDetail detail = new ProgressDetail(1L, null); assertThat(ProgressDetail.isEmpty(detail)).isTrue(); } @Test + @SuppressWarnings("removal") void progressDetailIsEmptyWhenTotalAndCurrentAreNotNullReturnsFalse() { - ProgressDetail detail = new ProgressDetail(1, 2); + ProgressDetail detail = new ProgressDetail(1L, 2L); assertThat(ProgressDetail.isEmpty(detail)).isFalse(); } 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); diff --git a/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/test/java/org/springframework/boot/buildpack/platform/docker/PullUpdateEventTests.java b/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/test/java/org/springframework/boot/buildpack/platform/docker/PullUpdateEventTests.java index 79bb5fd97bd6..7c95f9bcbd0f 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/test/java/org/springframework/boot/buildpack/platform/docker/PullUpdateEventTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-buildpack-platform/src/test/java/org/springframework/boot/buildpack/platform/docker/PullUpdateEventTests.java @@ -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"); * you may not use this file except in compliance with the License. @@ -30,6 +30,7 @@ class PullUpdateEventTests extends AbstractJsonTests { @Test + @SuppressWarnings("removal") void readValueWhenFullDeserializesJson() throws Exception { PullImageUpdateEvent event = getObjectMapper().readValue(getContent("pull-update-full.json"), PullImageUpdateEvent.class); @@ -37,6 +38,7 @@ void readValueWhenFullDeserializesJson() throws Exception { assertThat(event.getStatus()).isEqualTo("Extracting"); assertThat(event.getProgressDetail().getCurrent()).isEqualTo(16); assertThat(event.getProgressDetail().getTotal()).isEqualTo(32); + assertThat(event.getProgressDetail().asPercentage()).isEqualTo(50); assertThat(event.getProgress()).isEqualTo("[==================================================>] 32B/32B"); }